diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b9ef02 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +config/database.yml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7894bca --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,8 @@ + +**Do not send a pull request to this GitHub repository**. + +For more detail, please see [official website] wiki [Contribute]. + +[official website]: http://www.redmine.org +[Contribute]: http://www.redmine.org/projects/redmine/wiki/Contribute + diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a4b3233..0000000 --- a/Dockerfile +++ /dev/null @@ -1,59 +0,0 @@ -# Usar la imagen oficial de Redmine como base -FROM redmine:4.1.7 - -RUN apt-get update && apt-get install -y \ - shared-mime-info \ - git \ - build-essential \ - mariadb-client \ - libxml2-dev \ - libxslt-dev \ - zlib1g-dev \ - libpq-dev \ - libmariadb-dev-compat \ - libmariadb-dev \ - libssl-dev \ - libreadline-dev \ - libffi-dev \ - imagemagick \ - && rm -rf /var/lib/apt/lists/* - -# Definir el directorio de trabajo -WORKDIR /usr/src/redmine - -# Copiar archivos personalizados dentro del contenedor -COPY app/controllers/wiki_controller.rb /usr/src/redmine/app/controllers/wiki_controller.rb -COPY app/helpers/search_helper.rb /usr/src/redmine/app/helpers/search_helper.rb -COPY app/views/account/login.html.erb /usr/src/redmine/app/views/account/login.html.erb -COPY app/views/issues/tabs/_changesets.html.erb /usr/src/redmine/app/views/issues/tabs/_changesets.html.erb -COPY app/views/layouts/base.html.erb /usr/src/redmine/app/views/layouts/base.html.erb -COPY app/views/repositories/_changeset.html.erb /usr/src/redmine/app/views/repositories/_changeset.html.erb -COPY app/views/wiki/show.html.erb /usr/src/redmine/app/views/wiki/show.html.erb - -COPY config/database.yml /usr/src/redmine/config/database.yml -COPY config/secrets.yml /usr/src/redmine/config/secrets.yml -COPY config/locales/en.yml /usr/src/redmine/config/locales/en.yml -COPY config/locales/es.yml /usr/src/redmine/config/locales/es.yml - -COPY plugins /usr/src/redmine/plugins - -COPY public/themes/circlepro /usr/src/redmine/public/themes/circlepro - -# Clonar el plugin "rich" -RUN git clone https://github.com/a-ono/rich.git /usr/src/redmine/vendor/rich - -# Establecer permisos adecuados (opcional) -RUN chown -R redmine:redmine /usr/src/redmine - -# Instalar dependencias de Ruby -RUN bundle install --without development test --path vendor/bundle - -# Copiar el backup de la base de datos -COPY suitepro-backup.sql /suitepro-backup.sql - -# Copiar el script de inicialización -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -# Configurar el punto de entrada -ENTRYPOINT ["/entrypoint.sh"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..68b1b43 --- /dev/null +++ b/Gemfile @@ -0,0 +1,116 @@ +source 'https://rubygems.org' + +gem "bundler", ">= 1.5.0", "< 2.0.0" + +gem "rails", "4.2.11.1" +gem "addressable", "2.4.0" if RUBY_VERSION < "2.0" +if RUBY_VERSION < "2.1" + gem "public_suffix", (RUBY_VERSION < "2.0" ? "~> 1.4" : "~> 2.0.5") +end +gem "jquery-rails", "~> 3.1.4" +gem "coderay", "~> 1.1.1" +gem "request_store", "1.0.5" +gem "mime-types", (RUBY_VERSION >= "2.0" ? "~> 3.0" : "~> 2.99") +gem "protected_attributes" +gem "actionpack-xml_parser" +gem "roadie-rails", "~> 1.1.1" +gem "roadie", "~> 3.2.1" +gem "mimemagic" +gem "mail", "~> 2.6.4" + +gem "nokogiri", (RUBY_VERSION >= "2.1" ? "~> 1.8.1" : "~> 1.6.8") +gem "i18n", "~> 0.7.0" +gem "ffi", "1.9.14", :platforms => :mingw if RUBY_VERSION < "2.0" +gem "xpath", "< 3.2.0" if RUBY_VERSION < "2.3" + +# Request at least rails-html-sanitizer 1.0.3 because of security advisories +gem "rails-html-sanitizer", ">= 1.0.3" + +# TODO: Remove the following line when #32223 is fixed +gem "sprockets", "~> 3.7.2" + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :x64_mingw, :mswin] +gem "rbpdf", "~> 1.19.6" + +# Optional gem for LDAP authentication +group :ldap do + gem "net-ldap", "~> 0.12.0" +end + +# Optional gem for OpenID authentication +group :openid do + gem "ruby-openid", "~> 2.9.2", :require => "openid" + gem "rack-openid" +end + +platforms :mri, :mingw, :x64_mingw do + # Optional gem for exporting the gantt to a PNG file, not supported with jruby + group :rmagick do + gem "rmagick", "~> 2.16.0" + end + + # Optional Markdown support, not for JRuby + group :markdown do + gem "redcarpet", "~> 3.4.0" + end +end + +# Include database gems for the adapters found in the database +# configuration file +require 'erb' +require 'yaml' +database_file = File.join(File.dirname(__FILE__), "config/database.yml") +if File.exist?(database_file) + database_config = YAML::load(ERB.new(IO.read(database_file)).result) + adapters = database_config.values.map {|c| c['adapter']}.compact.uniq + if adapters.any? + adapters.each do |adapter| + case adapter + when 'mysql2' + gem "mysql2", "~> 0.4.6", :platforms => [:mri, :mingw, :x64_mingw] + when /postgresql/ + gem "pg", "~> 0.18.1", :platforms => [:mri, :mingw, :x64_mingw] + when /sqlite3/ + gem "sqlite3", (RUBY_VERSION < "2.0" && RUBY_PLATFORM =~ /mingw/ ? "1.3.12" : "~>1.3.12"), + :platforms => [:mri, :mingw, :x64_mingw] + when /sqlserver/ + gem "tiny_tds", (RUBY_VERSION >= "2.0" ? "~> 1.0.5" : "~> 0.7.0"), :platforms => [:mri, :mingw, :x64_mingw] + gem "activerecord-sqlserver-adapter", :platforms => [:mri, :mingw, :x64_mingw] + else + warn("Unknown database adapter `#{adapter}` found in config/database.yml, use Gemfile.local to load your own database gems") + end + end + else + warn("No adapter found in config/database.yml, please configure it first") + end +else + warn("Please configure your config/database.yml first") +end + +group :development do + gem "rdoc", "~> 4.3" + gem "yard" +end + +group :test do + gem "minitest" + gem "rails-dom-testing" + gem 'mocha', '>= 1.4.0' + gem "simplecov", "~> 0.9.1", :require => false + # TODO: remove this after upgrading to Rails 5 + gem "test_after_commit", "~> 0.4.2" + # For running UI tests + gem "capybara", '~> 2.13' + gem "selenium-webdriver", "~> 2.53.4" +end + +local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") +if File.exists?(local_gemfile) + eval_gemfile local_gemfile +end + +# Load plugins' Gemfiles +Dir.glob File.expand_path("../plugins/*/{Gemfile,PluginGemfile}", __FILE__) do |file| + eval_gemfile file +end diff --git a/README.md b/README.md index 62a5bde..d75d08f 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ En **SuitePro** concurren potencia y sencillez para planificar, compartir conocimiento, prestar soporte a clientes y acelerar la productividad, apremiando la finalización de las tareas y manteniendo la información en un único sitio. -**SuitePro 2.2.1** está instalado y operativo en https://suitepro.cillero.es +**SuitePro** está instalado y operativo en https://suitepro.cillero.es ## SuitePro es software libre @@ -27,45 +27,44 @@ License v2* (GPL). # Código fuente - * Proyecto: https://suitepro.cillero.es/projects/suitepro - * Repositorio: https://git.cillero.es/manuelcillero/suitepro + * Repositorio: https://suitepro.cillero.es/projects/suitepro/repository + * GitLab: https://gitlab.com/manuelcillero/suitepro ## Plugins incluidos ### Redmine Additionals plugin - * additionals 3.0.2-master + * additionals 2.0.20 * https://alphanodes.com/redmine-additionals * https://github.com/alphanodes/additionals.git ### Redmine Checklists plugin (Light version) - * checklists 3.1.18 + * checklists 3.1.10 * https://www.redmine.org/plugins/redmine_checklists * https://www.redmineup.com/pages/plugins/checklists ### Redmine CKEditor plugin - * ckeditor 1.2.3 + * ckeditor 1.1.5 * https://www.redmine.org/plugins/redmine-ckeditor * http://github.com/a-ono/redmine_ckeditor ### Redmine Glossary Plugin - * glossary 1.1.0 + * glossary 0.9.2 * https://www.r-labs.org/projects/rp-glossary/wiki/UsageEn * https://github.com/torutk/redmine_glossary ### Redmine Private Wiki Plugin - * private_wiki 0.2.0 (mistraloz) + * private_wiki 0.2.0 * http://www.redmine.org/plugins/redmine_private_wiki - * https://github.com/mistraloz/redmine_private_wiki (*fork* con ajustes para - Redmine >= 4.0.3) + * https://github.com/BlueXML/redmine_private_wiki ### Redmine Q&A plugin - * questions 1.0.2 + * questions 1.0.0 * https://www.redmine.org/plugins/redmine_questions * http://www.redminecrm.com/projects/questions diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..5fbdf84 --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +#!/usr/bin/env rake +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +RedmineApp::Application.load_tasks diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb new file mode 100644 index 0000000..5070295 --- /dev/null +++ b/app/controllers/account_controller.rb @@ -0,0 +1,375 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class AccountController < ApplicationController + helper :custom_fields + include CustomFieldsHelper + + self.main_menu = false + + # prevents login action to be filtered by check_if_login_required application scope filter + skip_before_action :check_if_login_required, :check_password_change + + # Overrides ApplicationController#verify_authenticity_token to disable + # token verification on openid callbacks + def verify_authenticity_token + unless using_open_id? + super + end + end + + # Login request and validation + def login + if request.post? + authenticate_user + else + if User.current.logged? + redirect_back_or_default home_url, :referer => true + end + end + rescue AuthSourceException => e + logger.error "An error occurred when authenticating #{params[:username]}: #{e.message}" + render_error :message => e.message + end + + # Log out current user and redirect to welcome page + def logout + if User.current.anonymous? + redirect_to home_url + elsif request.post? + logout_user + redirect_to home_url + end + # display the logout form + end + + # Lets user choose a new password + def lost_password + (redirect_to(home_url); return) unless Setting.lost_password? + if prt = (params[:token] || session[:password_recovery_token]) + @token = Token.find_token("recovery", prt.to_s) + if @token.nil? || @token.expired? + redirect_to home_url + return + end + + # redirect to remove the token query parameter from the URL and add it to the session + if request.query_parameters[:token].present? + session[:password_recovery_token] = @token.value + redirect_to lost_password_url + return + end + + @user = @token.user + unless @user && @user.active? + redirect_to home_url + return + end + if request.post? + if @user.must_change_passwd? && @user.check_password?(params[:new_password]) + flash.now[:error] = l(:notice_new_password_must_be_different) + else + @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] + @user.must_change_passwd = false + if @user.save + @token.destroy + Mailer.password_updated(@user, { remote_ip: request.remote_ip }) + flash[:notice] = l(:notice_account_password_updated) + redirect_to signin_path + return + end + end + end + render :template => "account/password_recovery" + return + else + if request.post? + email = params[:mail].to_s.strip + user = User.find_by_mail(email) + # user not found + unless user + flash.now[:error] = l(:notice_account_unknown_email) + return + end + unless user.active? + handle_inactive_user(user, lost_password_path) + return + end + # user cannot change its password + unless user.change_password_allowed? + flash.now[:error] = l(:notice_can_t_change_password) + return + end + # create a new token for password recovery + token = Token.new(:user => user, :action => "recovery") + if token.save + # Don't use the param to send the email + recipent = user.mails.detect {|e| email.casecmp(e) == 0} || user.mail + Mailer.lost_password(token, recipent).deliver + flash[:notice] = l(:notice_account_lost_email_sent) + redirect_to signin_path + return + end + end + end + end + + # User self-registration + def register + (redirect_to(home_url); return) unless Setting.self_registration? || session[:auth_source_registration] + if !request.post? + session[:auth_source_registration] = nil + @user = User.new(:language => current_language.to_s) + else + user_params = params[:user] || {} + @user = User.new + @user.safe_attributes = user_params + @user.pref.safe_attributes = params[:pref] + @user.admin = false + @user.register + if session[:auth_source_registration] + @user.activate + @user.login = session[:auth_source_registration][:login] + @user.auth_source_id = session[:auth_source_registration][:auth_source_id] + if @user.save + session[:auth_source_registration] = nil + self.logged_user = @user + flash[:notice] = l(:notice_account_activated) + redirect_to my_account_path + end + else + unless user_params[:identity_url].present? && user_params[:password].blank? && user_params[:password_confirmation].blank? + @user.password, @user.password_confirmation = user_params[:password], user_params[:password_confirmation] + end + + case Setting.self_registration + when '1' + register_by_email_activation(@user) + when '3' + register_automatically(@user) + else + register_manually_by_administrator(@user) + end + end + end + end + + # Token based account activation + def activate + (redirect_to(home_url); return) unless Setting.self_registration? && params[:token].present? + token = Token.find_token('register', params[:token].to_s) + (redirect_to(home_url); return) unless token and !token.expired? + user = token.user + (redirect_to(home_url); return) unless user.registered? + user.activate + if user.save + token.destroy + flash[:notice] = l(:notice_account_activated) + end + redirect_to signin_path + end + + # Sends a new account activation email + def activation_email + if session[:registered_user_id] && Setting.self_registration == '1' + user_id = session.delete(:registered_user_id).to_i + user = User.find_by_id(user_id) + if user && user.registered? + register_by_email_activation(user) + return + end + end + redirect_to(home_url) + end + + private + + def authenticate_user + if Setting.openid? && using_open_id? + open_id_authenticate(params[:openid_url]) + else + password_authentication + end + end + + def password_authentication + user = User.try_to_login(params[:username], params[:password], false) + + if user.nil? + invalid_credentials + elsif user.new_record? + onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id }) + else + # Valid user + if user.active? + successful_authentication(user) + update_sudo_timestamp! # activate Sudo Mode + else + handle_inactive_user(user) + end + end + end + + def open_id_authenticate(openid_url) + back_url = signin_url(:autologin => params[:autologin]) + authenticate_with_open_id( + openid_url, :required => [:nickname, :fullname, :email], + :return_to => back_url, :method => :post + ) do |result, identity_url, registration| + if result.successful? + user = User.find_or_initialize_by_identity_url(identity_url) + if user.new_record? + # Self-registration off + (redirect_to(home_url); return) unless Setting.self_registration? + # Create on the fly + user.login = registration['nickname'] unless registration['nickname'].nil? + user.mail = registration['email'] unless registration['email'].nil? + user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? + user.random_password + user.register + case Setting.self_registration + when '1' + register_by_email_activation(user) do + onthefly_creation_failed(user) + end + when '3' + register_automatically(user) do + onthefly_creation_failed(user) + end + else + register_manually_by_administrator(user) do + onthefly_creation_failed(user) + end + end + else + # Existing record + if user.active? + successful_authentication(user) + else + handle_inactive_user(user) + end + end + end + end + end + + def successful_authentication(user) + logger.info "Successful authentication for '#{user.login}' from #{request.remote_ip} at #{Time.now.utc}" + # Valid user + self.logged_user = user + # generate a key and set cookie if autologin + if params[:autologin] && Setting.autologin? + set_autologin_cookie(user) + end + call_hook(:controller_account_success_authentication_after, {:user => user }) + redirect_back_or_default my_page_path + end + + def set_autologin_cookie(user) + token = user.generate_autologin_token + secure = Redmine::Configuration['autologin_cookie_secure'] + if secure.nil? + secure = request.ssl? + end + cookie_options = { + :value => token, + :expires => 1.year.from_now, + :path => (Redmine::Configuration['autologin_cookie_path'] || RedmineApp::Application.config.relative_url_root || '/'), + :secure => secure, + :httponly => true + } + cookies[autologin_cookie_name] = cookie_options + end + + # Onthefly creation failed, display the registration form to fill/fix attributes + def onthefly_creation_failed(user, auth_source_options = { }) + @user = user + session[:auth_source_registration] = auth_source_options unless auth_source_options.empty? + render :action => 'register' + end + + def invalid_credentials + logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" + flash.now[:error] = l(:notice_account_invalid_credentials) + end + + # Register a user for email activation. + # + # Pass a block for behavior when a user fails to save + def register_by_email_activation(user, &block) + token = Token.new(:user => user, :action => "register") + if user.save and token.save + Mailer.register(token).deliver + flash[:notice] = l(:notice_account_register_done, :email => ERB::Util.h(user.mail)) + redirect_to signin_path + else + yield if block_given? + end + end + + # Automatically register a user + # + # Pass a block for behavior when a user fails to save + def register_automatically(user, &block) + # Automatic activation + user.activate + user.last_login_on = Time.now + if user.save + self.logged_user = user + flash[:notice] = l(:notice_account_activated) + redirect_to my_account_path + else + yield if block_given? + end + end + + # Manual activation by the administrator + # + # Pass a block for behavior when a user fails to save + def register_manually_by_administrator(user, &block) + if user.save + # Sends an email to the administrators + Mailer.account_activation_request(user).deliver + account_pending(user) + else + yield if block_given? + end + end + + def handle_inactive_user(user, redirect_path=signin_path) + if user.registered? + account_pending(user, redirect_path) + else + account_locked(user, redirect_path) + end + end + + def account_pending(user, redirect_path=signin_path) + if Setting.self_registration == '1' + flash[:error] = l(:notice_account_not_activated_yet, :url => activation_email_path) + session[:registered_user_id] = user.id + else + flash[:error] = l(:notice_account_pending) + end + redirect_to redirect_path + end + + def account_locked(user, redirect_path=signin_path) + flash[:error] = l(:notice_account_locked) + redirect_to redirect_path + end +end diff --git a/app/controllers/activities_controller.rb b/app/controllers/activities_controller.rb new file mode 100644 index 0000000..f82f011 --- /dev/null +++ b/app/controllers/activities_controller.rb @@ -0,0 +1,90 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ActivitiesController < ApplicationController + menu_item :activity + before_action :find_optional_project + accept_rss_auth :index + + def index + @days = Setting.activity_days_default.to_i + + if params[:from] + begin; @date_to = params[:from].to_date + 1; rescue; end + end + + @date_to ||= User.current.today + 1 + @date_from = @date_to - @days + @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') + if params[:user_id].present? + @author = User.active.find(params[:user_id]) + end + + @activity = Redmine::Activity::Fetcher.new(User.current, :project => @project, + :with_subprojects => @with_subprojects, + :author => @author) + pref = User.current.pref + @activity.scope_select {|t| !params["show_#{t}"].nil?} + if @activity.scope.present? + if params[:submit].present? + pref.activity_scope = @activity.scope + pref.save + end + else + if @author.nil? + scope = pref.activity_scope & @activity.event_types + @activity.scope = scope.present? ? scope : :default + else + @activity.scope = :all + end + end + + events = @activity.events(@date_from, @date_to) + + if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, events.size, User.current, current_language]) + respond_to do |format| + format.html { + @events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)} + render :layout => false if request.xhr? + } + format.atom { + title = l(:label_activity) + if @author + title = @author.name + elsif @activity.scope.size == 1 + title = l("label_#{@activity.scope.first.singularize}_plural") + end + render_feed(events, :title => "#{@project || Setting.app_title}: #{title}") + } + end + end + + rescue ActiveRecord::RecordNotFound + render_404 + end + + private + + # TODO: refactor, duplicated in projects_controller + def find_optional_project + return true unless params[:id] + @project = Project.find(params[:id]) + authorize + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb new file mode 100644 index 0000000..dfc73c5 --- /dev/null +++ b/app/controllers/admin_controller.rb @@ -0,0 +1,85 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class AdminController < ApplicationController + layout 'admin' + self.main_menu = false + menu_item :projects, :only => :projects + menu_item :plugins, :only => :plugins + menu_item :info, :only => :info + + before_action :require_admin + + def index + @no_configuration_data = Redmine::DefaultData::Loader::no_data? + end + + def projects + @status = params[:status] || 1 + + scope = Project.status(@status).sorted + scope = scope.like(params[:name]) if params[:name].present? + + @project_count = scope.count + @project_pages = Paginator.new @project_count, per_page_option, params['page'] + @projects = scope.limit(@project_pages.per_page).offset(@project_pages.offset).to_a + + render :action => "projects", :layout => false if request.xhr? + end + + def plugins + @plugins = Redmine::Plugin.all + end + + # Loads the default configuration + # (roles, trackers, statuses, workflow, enumerations) + def default_configuration + if request.post? + begin + Redmine::DefaultData::Loader::load(params[:lang]) + flash[:notice] = l(:notice_default_data_loaded) + rescue Exception => e + flash[:error] = l(:error_can_t_load_default_data, ERB::Util.h(e.message)) + end + end + redirect_to admin_path + end + + def test_email + raise_delivery_errors = ActionMailer::Base.raise_delivery_errors + # Force ActionMailer to raise delivery errors so we can catch it + ActionMailer::Base.raise_delivery_errors = true + begin + @test = Mailer.test_email(User.current).deliver + flash[:notice] = l(:notice_email_sent, ERB::Util.h(User.current.mail)) + rescue Exception => e + flash[:error] = l(:notice_email_error, ERB::Util.h(Redmine::CodesetUtil.replace_invalid_utf8(e.message.dup))) + end + ActionMailer::Base.raise_delivery_errors = raise_delivery_errors + redirect_to settings_path(:tab => 'notifications') + end + + def info + @checklist = [ + [:text_default_administrator_account_changed, User.default_admin_account_changed?], + [:text_file_repository_writable, File.writable?(Attachment.storage_path)], + ["#{l :text_plugin_assets_writable} (./public/plugin_assets)", File.writable?(Redmine::Plugin.public_directory)], + [:text_rmagick_available, Object.const_defined?(:Magick)], + [:text_convert_available, Redmine::Thumbnail.convert_available?] + ] + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000..1d42901 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,679 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'uri' +require 'cgi' + +class Unauthorized < Exception; end + +class ApplicationController < ActionController::Base + include Redmine::I18n + include Redmine::Pagination + include Redmine::Hook::Helper + include RoutesHelper + helper :routes + + class_attribute :accept_api_auth_actions + class_attribute :accept_rss_auth_actions + class_attribute :model_object + + layout 'base' + + protect_from_forgery + + def verify_authenticity_token + unless api_request? + super + end + end + + def handle_unverified_request + unless api_request? + super + cookies.delete(autologin_cookie_name) + self.logged_user = nil + set_localization + render_error :status => 422, :message => "Invalid form authenticity token." + end + end + + before_action :session_expiration, :user_setup, :check_if_login_required, :set_localization, :check_password_change + + rescue_from ::Unauthorized, :with => :deny_access + rescue_from ::ActionView::MissingTemplate, :with => :missing_template + + include Redmine::Search::Controller + include Redmine::MenuManager::MenuController + helper Redmine::MenuManager::MenuHelper + + include Redmine::SudoMode::Controller + + def session_expiration + if session[:user_id] && Rails.application.config.redmine_verify_sessions != false + if session_expired? && !try_to_autologin + set_localization(User.active.find_by_id(session[:user_id])) + self.logged_user = nil + flash[:error] = l(:error_session_expired) + require_login + end + end + end + + def session_expired? + ! User.verify_session_token(session[:user_id], session[:tk]) + end + + def start_user_session(user) + session[:user_id] = user.id + session[:tk] = user.generate_session_token + if user.must_change_password? + session[:pwd] = '1' + end + end + + def user_setup + # Check the settings cache for each request + Setting.check_cache + # Find the current user + User.current = find_current_user + logger.info(" Current user: " + (User.current.logged? ? "#{User.current.login} (id=#{User.current.id})" : "anonymous")) if logger + end + + # Returns the current user or nil if no user is logged in + # and starts a session if needed + def find_current_user + user = nil + unless api_request? + if session[:user_id] + # existing session + user = (User.active.find(session[:user_id]) rescue nil) + elsif autologin_user = try_to_autologin + user = autologin_user + elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth? + # RSS key authentication does not start a session + user = User.find_by_rss_key(params[:key]) + end + end + if user.nil? && Setting.rest_api_enabled? && accept_api_auth? + if (key = api_key_from_request) + # Use API key + user = User.find_by_api_key(key) + elsif request.authorization.to_s =~ /\ABasic /i + # HTTP Basic, either username/password or API key/random + authenticate_with_http_basic do |username, password| + user = User.try_to_login(username, password) || User.find_by_api_key(username) + end + if user && user.must_change_password? + render_error :message => 'You must change your password', :status => 403 + return + end + end + # Switch user if requested by an admin user + if user && user.admin? && (username = api_switch_user_from_request) + su = User.find_by_login(username) + if su && su.active? + logger.info(" User switched by: #{user.login} (id=#{user.id})") if logger + user = su + else + render_error :message => 'Invalid X-Redmine-Switch-User header', :status => 412 + end + end + end + # store current ip address in user object ephemerally + user.remote_ip = request.remote_ip if user + user + end + + def autologin_cookie_name + Redmine::Configuration['autologin_cookie_name'].presence || 'autologin' + end + + def try_to_autologin + if cookies[autologin_cookie_name] && Setting.autologin? + # auto-login feature starts a new session + user = User.try_to_autologin(cookies[autologin_cookie_name]) + if user + reset_session + start_user_session(user) + end + user + end + end + + # Sets the logged in user + def logged_user=(user) + reset_session + if user && user.is_a?(User) + User.current = user + start_user_session(user) + else + User.current = User.anonymous + end + end + + # Logs out current user + def logout_user + if User.current.logged? + if autologin = cookies.delete(autologin_cookie_name) + User.current.delete_autologin_token(autologin) + end + User.current.delete_session_token(session[:tk]) + self.logged_user = nil + end + end + + # check if login is globally required to access the application + def check_if_login_required + # no check needed if user is already logged in + return true if User.current.logged? + require_login if Setting.login_required? + end + + def check_password_change + if session[:pwd] + if User.current.must_change_password? + flash[:error] = l(:error_password_expired) + redirect_to my_password_path + else + session.delete(:pwd) + end + end + end + + def set_localization(user=User.current) + lang = nil + if user && user.logged? + lang = find_language(user.language) + end + if lang.nil? && !Setting.force_default_language_for_anonymous? && request.env['HTTP_ACCEPT_LANGUAGE'] + accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first + if !accept_lang.blank? + accept_lang = accept_lang.downcase + lang = find_language(accept_lang) || find_language(accept_lang.split('-').first) + end + end + lang ||= Setting.default_language + set_language_if_valid(lang) + end + + def require_login + if !User.current.logged? + # Extract only the basic url parameters on non-GET requests + if request.get? + url = request.original_url + else + url = url_for(:controller => params[:controller], :action => params[:action], :id => params[:id], :project_id => params[:project_id]) + end + respond_to do |format| + format.html { + if request.xhr? + head :unauthorized + else + redirect_to signin_path(:back_url => url) + end + } + format.any(:atom, :pdf, :csv) { + redirect_to signin_path(:back_url => url) + } + format.xml { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' } + format.js { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' } + format.json { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' } + format.any { head :unauthorized } + end + return false + end + true + end + + def require_admin + return unless require_login + if !User.current.admin? + render_403 + return false + end + true + end + + def deny_access + User.current.logged? ? render_403 : require_login + end + + # Authorize the user for the requested action + def authorize(ctrl = params[:controller], action = params[:action], global = false) + allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global) + if allowed + true + else + if @project && @project.archived? + render_403 :message => :notice_not_authorized_archived_project + else + deny_access + end + end + end + + # Authorize the user for the requested action outside a project + def authorize_global(ctrl = params[:controller], action = params[:action], global = true) + authorize(ctrl, action, global) + end + + # Find project of id params[:id] + def find_project + @project = Project.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Find project of id params[:project_id] + def find_project_by_project_id + @project = Project.find(params[:project_id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Find a project based on params[:project_id] + # TODO: some subclasses override this, see about merging their logic + def find_optional_project + @project = Project.find(params[:project_id]) unless params[:project_id].blank? + allowed = User.current.allowed_to?({:controller => params[:controller], :action => params[:action]}, @project, :global => true) + allowed ? true : deny_access + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Finds and sets @project based on @object.project + def find_project_from_association + render_404 unless @object.present? + + @project = @object.project + end + + def find_model_object + model = self.class.model_object + if model + @object = model.find(params[:id]) + self.instance_variable_set('@' + controller_name.singularize, @object) if @object + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def self.model_object(model) + self.model_object = model + end + + # Find the issue whose id is the :id parameter + # Raises a Unauthorized exception if the issue is not visible + def find_issue + # Issue.visible.find(...) can not be used to redirect user to the login form + # if the issue actually exists but requires authentication + @issue = Issue.find(params[:id]) + raise Unauthorized unless @issue.visible? + @project = @issue.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Find issues with a single :id param or :ids array param + # Raises a Unauthorized exception if one of the issues is not visible + def find_issues + @issues = Issue. + where(:id => (params[:id] || params[:ids])). + preload(:project, :status, :tracker, :priority, :author, :assigned_to, :relations_to, {:custom_values => :custom_field}). + to_a + raise ActiveRecord::RecordNotFound if @issues.empty? + raise Unauthorized unless @issues.all?(&:visible?) + @projects = @issues.collect(&:project).compact.uniq + @project = @projects.first if @projects.size == 1 + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_attachments + if (attachments = params[:attachments]).present? + att = attachments.values.collect do |attachment| + Attachment.find_by_token( attachment[:token] ) if attachment[:token].present? + end + att.compact! + end + @attachments = att || [] + end + + def parse_params_for_bulk_update(params) + attributes = (params || {}).reject {|k,v| v.blank?} + attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'} + if custom = attributes[:custom_field_values] + custom.reject! {|k,v| v.blank?} + custom.keys.each do |k| + if custom[k].is_a?(Array) + custom[k] << '' if custom[k].delete('__none__') + else + custom[k] = '' if custom[k] == '__none__' + end + end + end + attributes + end + + # make sure that the user is a member of the project (or admin) if project is private + # used as a before_action for actions that do not require any particular permission on the project + def check_project_privacy + if @project && !@project.archived? + if @project.visible? + true + else + deny_access + end + else + @project = nil + render_404 + false + end + end + + def back_url + url = params[:back_url] + if url.nil? && referer = request.env['HTTP_REFERER'] + url = CGI.unescape(referer.to_s) + end + url + end + + def redirect_back_or_default(default, options={}) + back_url = params[:back_url].to_s + if back_url.present? && valid_url = validate_back_url(back_url) + redirect_to(valid_url) + return + elsif options[:referer] + redirect_to_referer_or default + return + end + redirect_to default + false + end + + # Returns a validated URL string if back_url is a valid url for redirection, + # otherwise false + def validate_back_url(back_url) + if CGI.unescape(back_url).include?('..') + return false + end + + begin + uri = URI.parse(back_url) + rescue URI::InvalidURIError + return false + end + + [:scheme, :host, :port].each do |component| + if uri.send(component).present? && uri.send(component) != request.send(component) + return false + end + uri.send(:"#{component}=", nil) + end + # Always ignore basic user:password in the URL + uri.userinfo = nil + + path = uri.to_s + # Ensure that the remaining URL starts with a slash, followed by a + # non-slash character or the end + if path !~ %r{\A/([^/]|\z)} + return false + end + + if path.match(%r{/(login|account/register|account/lost_password)}) + return false + end + + if relative_url_root.present? && !path.starts_with?(relative_url_root) + return false + end + + return path + end + private :validate_back_url + + def valid_back_url?(back_url) + !!validate_back_url(back_url) + end + private :valid_back_url? + + # Redirects to the request referer if present, redirects to args or call block otherwise. + def redirect_to_referer_or(*args, &block) + if referer = request.headers["Referer"] + redirect_to referer + else + if args.any? + redirect_to *args + elsif block_given? + block.call + else + raise "#redirect_to_referer_or takes arguments or a block" + end + end + end + + def render_403(options={}) + @project = nil + render_error({:message => :notice_not_authorized, :status => 403}.merge(options)) + return false + end + + def render_404(options={}) + render_error({:message => :notice_file_not_found, :status => 404}.merge(options)) + return false + end + + # Renders an error response + def render_error(arg) + arg = {:message => arg} unless arg.is_a?(Hash) + + @message = arg[:message] + @message = l(@message) if @message.is_a?(Symbol) + @status = arg[:status] || 500 + + respond_to do |format| + format.html { + render :template => 'common/error', :layout => use_layout, :status => @status + } + format.any { head @status } + end + end + + # Handler for ActionView::MissingTemplate exception + def missing_template + logger.warn "Missing template, responding with 404" + @project = nil + render_404 + end + + # Filter for actions that provide an API response + # but have no HTML representation for non admin users + def require_admin_or_api_request + return true if api_request? + if User.current.admin? + true + elsif User.current.logged? + render_error(:status => 406) + else + deny_access + end + end + + # Picks which layout to use based on the request + # + # @return [boolean, string] name of the layout to use or false for no layout + def use_layout + request.xhr? ? false : 'base' + end + + def render_feed(items, options={}) + @items = (items || []).to_a + @items.sort! {|x,y| y.event_datetime <=> x.event_datetime } + @items = @items.slice(0, Setting.feeds_limit.to_i) + @title = options[:title] || Setting.app_title + render :template => "common/feed", :formats => [:atom], :layout => false, + :content_type => 'application/atom+xml' + end + + def self.accept_rss_auth(*actions) + if actions.any? + self.accept_rss_auth_actions = actions + else + self.accept_rss_auth_actions || [] + end + end + + def accept_rss_auth?(action=action_name) + self.class.accept_rss_auth.include?(action.to_sym) + end + + def self.accept_api_auth(*actions) + if actions.any? + self.accept_api_auth_actions = actions + else + self.accept_api_auth_actions || [] + end + end + + def accept_api_auth?(action=action_name) + self.class.accept_api_auth.include?(action.to_sym) + end + + # Returns the number of objects that should be displayed + # on the paginated list + def per_page_option + per_page = nil + if params[:per_page] && Setting.per_page_options_array.include?(params[:per_page].to_s.to_i) + per_page = params[:per_page].to_s.to_i + session[:per_page] = per_page + elsif session[:per_page] + per_page = session[:per_page] + else + per_page = Setting.per_page_options_array.first || 25 + end + per_page + end + + # Returns offset and limit used to retrieve objects + # for an API response based on offset, limit and page parameters + def api_offset_and_limit(options=params) + if options[:offset].present? + offset = options[:offset].to_i + if offset < 0 + offset = 0 + end + end + limit = options[:limit].to_i + if limit < 1 + limit = 25 + elsif limit > 100 + limit = 100 + end + if offset.nil? && options[:page].present? + offset = (options[:page].to_i - 1) * limit + offset = 0 if offset < 0 + end + offset ||= 0 + + [offset, limit] + end + + # qvalues http header parser + # code taken from webrick + def parse_qvalues(value) + tmp = [] + if value + parts = value.split(/,\s*/) + parts.each {|part| + if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part) + val = m[1] + q = (m[2] or 1).to_f + tmp.push([val, q]) + end + } + tmp = tmp.sort_by{|val, q| -q} + tmp.collect!{|val, q| val} + end + return tmp + rescue + nil + end + + # Returns a string that can be used as filename value in Content-Disposition header + def filename_for_content_disposition(name) + request.env['HTTP_USER_AGENT'] =~ %r{(MSIE|Trident|Edge)} ? ERB::Util.url_encode(name) : name + end + + def api_request? + %w(xml json).include? params[:format] + end + + # Returns the API key present in the request + def api_key_from_request + if params[:key].present? + params[:key].to_s + elsif request.headers["X-Redmine-API-Key"].present? + request.headers["X-Redmine-API-Key"].to_s + end + end + + # Returns the API 'switch user' value if present + def api_switch_user_from_request + request.headers["X-Redmine-Switch-User"].to_s.presence + end + + # Renders a warning flash if obj has unsaved attachments + def render_attachment_warning_if_needed(obj) + flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present? + end + + # Rescues an invalid query statement. Just in case... + def query_statement_invalid(exception) + logger.error "Query::StatementInvalid: #{exception.message}" if logger + session.delete(:issue_query) + render_error "An error occurred while executing the query and has been logged. Please report this error to your Redmine administrator." + end + + # Renders a 200 response for successful updates or deletions via the API + def render_api_ok + render_api_head :ok + end + + # Renders a head API response + def render_api_head(status) + head status + end + + # Renders API response on validation failure + # for an object or an array of objects + def render_validation_errors(objects) + messages = Array.wrap(objects).map {|object| object.errors.full_messages}.flatten + render_api_errors(messages) + end + + def render_api_errors(*messages) + @error_messages = messages.flatten + render :template => 'common/error_messages.api', :status => :unprocessable_entity, :layout => nil + end + + # Overrides #_include_layout? so that #render with no arguments + # doesn't use the layout for api requests + def _include_layout?(*args) + api_request? ? false : super + end +end diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb new file mode 100644 index 0000000..64cb05e --- /dev/null +++ b/app/controllers/attachments_controller.rb @@ -0,0 +1,247 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class AttachmentsController < ApplicationController + before_action :find_attachment, :only => [:show, :download, :thumbnail, :update, :destroy] + before_action :find_editable_attachments, :only => [:edit_all, :update_all] + before_action :file_readable, :read_authorize, :only => [:show, :download, :thumbnail] + before_action :update_authorize, :only => :update + before_action :delete_authorize, :only => :destroy + before_action :authorize_global, :only => :upload + + # Disable check for same origin requests for JS files, i.e. attachments with + # MIME type text/javascript. + skip_after_action :verify_same_origin_request, :only => :download + + accept_api_auth :show, :download, :thumbnail, :upload, :update, :destroy + + def show + respond_to do |format| + format.html { + if @attachment.is_diff? + @diff = File.read(@attachment.diskfile, :mode => "rb") + @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' + @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) + # Save diff type as user preference + if User.current.logged? && @diff_type != User.current.pref[:diff_type] + User.current.pref[:diff_type] = @diff_type + User.current.preference.save + end + render :action => 'diff' + elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte + @content = File.read(@attachment.diskfile, :mode => "rb") + render :action => 'file' + elsif @attachment.is_image? + render :action => 'image' + else + render :action => 'other' + end + } + format.api + end + end + + def download + if @attachment.container.is_a?(Version) || @attachment.container.is_a?(Project) + @attachment.increment_download + end + + if stale?(:etag => @attachment.digest, :template => false) + # images are sent inline + send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename), + :type => detect_content_type(@attachment), + :disposition => disposition(@attachment) + end + end + + def thumbnail + if @attachment.thumbnailable? && tbnail = @attachment.thumbnail(:size => params[:size]) + if stale?(:etag => tbnail, :template => false) + send_file tbnail, + :filename => filename_for_content_disposition(@attachment.filename), + :type => detect_content_type(@attachment), + :disposition => 'inline' + end + else + # No thumbnail for the attachment or thumbnail could not be created + head 404 + end + end + + def upload + # Make sure that API users get used to set this content type + # as it won't trigger Rails' automatic parsing of the request body for parameters + unless request.content_type == 'application/octet-stream' + head 406 + return + end + + @attachment = Attachment.new(:file => request.raw_post) + @attachment.author = User.current + @attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16) + @attachment.content_type = params[:content_type].presence + saved = @attachment.save + + respond_to do |format| + format.js + format.api { + if saved + render :action => 'upload', :status => :created + else + render_validation_errors(@attachment) + end + } + end + end + + # Edit all the attachments of a container + def edit_all + end + + # Update all the attachments of a container + def update_all + if Attachment.update_attachments(@attachments, update_all_params) + redirect_back_or_default home_path + return + end + render :action => 'edit_all' + end + + def update + @attachment.safe_attributes = params[:attachment] + saved = @attachment.save + + respond_to do |format| + format.api { + if saved + render_api_ok + else + render_validation_errors(@attachment) + end + } + end + end + + def destroy + if @attachment.container.respond_to?(:init_journal) + @attachment.container.init_journal(User.current) + end + if @attachment.container + # Make sure association callbacks are called + @attachment.container.attachments.delete(@attachment) + else + @attachment.destroy + end + + respond_to do |format| + format.html { redirect_to_referer_or project_path(@project) } + format.js + format.api { render_api_ok } + end + end + + # Returns the menu item that should be selected when viewing an attachment + def current_menu_item + if @attachment + case @attachment.container + when WikiPage + :wiki + when Message + :boards + when Project, Version + :files + else + @attachment.container.class.name.pluralize.downcase.to_sym + end + end + end + + private + + def find_attachment + @attachment = Attachment.find(params[:id]) + # Show 404 if the filename in the url is wrong + raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename + @project = @attachment.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_editable_attachments + klass = params[:object_type].to_s.singularize.classify.constantize rescue nil + unless klass && klass.reflect_on_association(:attachments) + render_404 + return + end + + @container = klass.find(params[:object_id]) + if @container.respond_to?(:visible?) && !@container.visible? + render_403 + return + end + @attachments = @container.attachments.select(&:editable?) + if @container.respond_to?(:project) + @project = @container.project + end + render_404 if @attachments.empty? + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Checks that the file exists and is readable + def file_readable + if @attachment.readable? + true + else + logger.error "Cannot send attachment, #{@attachment.diskfile} does not exist or is unreadable." + render_404 + end + end + + def read_authorize + @attachment.visible? ? true : deny_access + end + + def update_authorize + @attachment.editable? ? true : deny_access + end + + def delete_authorize + @attachment.deletable? ? true : deny_access + end + + def detect_content_type(attachment) + content_type = attachment.content_type + if content_type.blank? || content_type == "application/octet-stream" + content_type = Redmine::MimeType.of(attachment.filename) + end + content_type.to_s + end + + def disposition(attachment) + if attachment.is_pdf? + 'inline' + else + 'attachment' + end + end + + # Returns attachments param for #update_all + def update_all_params + params.permit(:attachments => [:filename, :description]).require(:attachments) + end +end diff --git a/app/controllers/auth_sources_controller.rb b/app/controllers/auth_sources_controller.rb new file mode 100644 index 0000000..dcbba36 --- /dev/null +++ b/app/controllers/auth_sources_controller.rb @@ -0,0 +1,105 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class AuthSourcesController < ApplicationController + layout 'admin' + self.main_menu = false + menu_item :ldap_authentication + + before_action :require_admin + before_action :build_new_auth_source, :only => [:new, :create] + before_action :find_auth_source, :only => [:edit, :update, :test_connection, :destroy] + require_sudo_mode :update, :destroy + + def index + @auth_source_pages, @auth_sources = paginate AuthSource, :per_page => 25 + end + + def new + end + + def create + if @auth_source.save + flash[:notice] = l(:notice_successful_create) + redirect_to auth_sources_path + else + render :action => 'new' + end + end + + def edit + end + + def update + @auth_source.safe_attributes = params[:auth_source] + if @auth_source.save + flash[:notice] = l(:notice_successful_update) + redirect_to auth_sources_path + else + render :action => 'edit' + end + end + + def test_connection + begin + @auth_source.test_connection + flash[:notice] = l(:notice_successful_connection) + rescue Exception => e + flash[:error] = l(:error_unable_to_connect, e.message) + end + redirect_to auth_sources_path + end + + def destroy + unless @auth_source.users.exists? + @auth_source.destroy + flash[:notice] = l(:notice_successful_delete) + end + redirect_to auth_sources_path + end + + def autocomplete_for_new_user + results = AuthSource.search(params[:term]) + + render :json => results.map {|result| { + 'value' => result[:login], + 'label' => "#{result[:login]} (#{result[:firstname]} #{result[:lastname]})", + 'login' => result[:login].to_s, + 'firstname' => result[:firstname].to_s, + 'lastname' => result[:lastname].to_s, + 'mail' => result[:mail].to_s, + 'auth_source_id' => result[:auth_source_id].to_s + }} + end + + private + + def build_new_auth_source + @auth_source = AuthSource.new_subclass_instance(params[:type] || 'AuthSourceLdap') + if @auth_source + @auth_source.safe_attributes = params[:auth_source] + else + render_404 + end + end + + def find_auth_source + @auth_source = AuthSource.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/auto_completes_controller.rb b/app/controllers/auto_completes_controller.rb new file mode 100644 index 0000000..2d707f9 --- /dev/null +++ b/app/controllers/auto_completes_controller.rb @@ -0,0 +1,63 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class AutoCompletesController < ApplicationController + before_action :find_project + + def issues + issues = [] + q = (params[:q] || params[:term]).to_s.strip + status = params[:status].to_s + issue_id = params[:issue_id].to_s + if q.present? + scope = Issue.cross_project_scope(@project, params[:scope]).visible + if status.present? + scope = scope.open(status == 'o') + end + if issue_id.present? + scope = scope.where.not(:id => issue_id.to_i) + end + if q.match(/\A#?(\d+)\z/) + issues << scope.find_by_id($1.to_i) + end + + issues += scope.like(q).order(:id => :desc).limit(10).to_a + issues.compact! + end + + render :json => format_issues_json(issues) + end + + private + + def find_project + if params[:project_id].present? + @project = Project.find(params[:project_id]) + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def format_issues_json(issues) + issues.map {|issue| { + 'id' => issue.id, + 'label' => "#{issue.tracker} ##{issue.id}: #{issue.subject.to_s.truncate(60)}", + 'value' => issue.id + } + } + end +end diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb new file mode 100644 index 0000000..03ca50c --- /dev/null +++ b/app/controllers/boards_controller.rb @@ -0,0 +1,121 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class BoardsController < ApplicationController + default_search_scope :messages + before_action :find_project_by_project_id, :find_board_if_available, :authorize + accept_rss_auth :index, :show + + helper :sort + include SortHelper + helper :watchers + + def index + @boards = @project.boards.preload(:last_message => :author).to_a + # show the board if there is only one + if @boards.size == 1 + @board = @boards.first + show + end + end + + def show + respond_to do |format| + format.html { + sort_init 'updated_on', 'desc' + sort_update 'created_on' => "#{Message.table_name}.id", + 'replies' => "#{Message.table_name}.replies_count", + 'updated_on' => "COALESCE(#{Message.table_name}.last_reply_id, #{Message.table_name}.id)" + + @topic_count = @board.topics.count + @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] + @topics = @board.topics. + reorder(:sticky => :desc). + limit(@topic_pages.per_page). + offset(@topic_pages.offset). + order(sort_clause). + preload(:author, {:last_reply => :author}). + to_a + @message = Message.new(:board => @board) + render :action => 'show', :layout => !request.xhr? + } + format.atom { + @messages = @board.messages. + reorder(:id => :desc). + includes(:author, :board). + limit(Setting.feeds_limit.to_i). + to_a + render_feed(@messages, :title => "#{@project}: #{@board}") + } + end + end + + def new + @board = @project.boards.build + @board.safe_attributes = params[:board] + end + + def create + @board = @project.boards.build + @board.safe_attributes = params[:board] + if @board.save + flash[:notice] = l(:notice_successful_create) + redirect_to_settings_in_projects + else + render :action => 'new' + end + end + + def edit + end + + def update + @board.safe_attributes = params[:board] + if @board.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to_settings_in_projects + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.js { head 422 } + end + end + end + + def destroy + if @board.destroy + flash[:notice] = l(:notice_successful_delete) + end + redirect_to_settings_in_projects + end + +private + def redirect_to_settings_in_projects + redirect_to settings_project_path(@project, :tab => 'boards') + end + + def find_board_if_available + @board = @project.boards.find(params[:id]) if params[:id] + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/calendars_controller.rb b/app/controllers/calendars_controller.rb new file mode 100644 index 0000000..e07ba2e --- /dev/null +++ b/app/controllers/calendars_controller.rb @@ -0,0 +1,55 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CalendarsController < ApplicationController + menu_item :calendar + before_action :find_optional_project + + rescue_from Query::StatementInvalid, :with => :query_statement_invalid + + helper :issues + helper :projects + helper :queries + include QueriesHelper + + def show + if params[:year] and params[:year].to_i > 1900 + @year = params[:year].to_i + if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13 + @month = params[:month].to_i + end + end + @year ||= User.current.today.year + @month ||= User.current.today.month + + @calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month) + retrieve_query + @query.group_by = nil + @query.sort_criteria = nil + if @query.valid? + events = [] + events += @query.issues(:include => [:tracker, :assigned_to, :priority], + :conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt] + ) + events += @query.versions(:conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt]) + + @calendar.events = events + end + + render :action => 'show', :layout => false if request.xhr? + end +end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 0000000..e7974d4 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,53 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CommentsController < ApplicationController + default_search_scope :news + model_object News + before_action :find_model_object + before_action :find_project_from_association + before_action :authorize + + def create + raise Unauthorized unless @news.commentable? + + @comment = Comment.new + @comment.safe_attributes = params[:comment] + @comment.author = User.current + if @news.comments << @comment + flash[:notice] = l(:label_comment_added) + end + + redirect_to news_path(@news) + end + + def destroy + @news.comments.find(params[:comment_id]).destroy + redirect_to news_path(@news) + end + + private + + # ApplicationController's find_model_object sets it based on the controller + # name so it needs to be overridden and set to @news instead + def find_model_object + super + @news = @object + @comment = nil + @news + end +end diff --git a/app/controllers/context_menus_controller.rb b/app/controllers/context_menus_controller.rb new file mode 100644 index 0000000..bd69775 --- /dev/null +++ b/app/controllers/context_menus_controller.rb @@ -0,0 +1,92 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ContextMenusController < ApplicationController + helper :watchers + helper :issues + + before_action :find_issues, :only => :issues + + def issues + if (@issues.size == 1) + @issue = @issues.first + end + @issue_ids = @issues.map(&:id).sort + + @allowed_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&) + + @can = {:edit => @issues.all?(&:attributes_editable?), + :log_time => (@project && User.current.allowed_to?(:log_time, @project)), + :copy => User.current.allowed_to?(:copy_issues, @projects) && Issue.allowed_target_projects.any?, + :add_watchers => User.current.allowed_to?(:add_issue_watchers, @projects), + :delete => @issues.all?(&:deletable?) + } + + @assignables = @issues.map(&:assignable_users).reduce(:&) + @trackers = @projects.map {|p| Issue.allowed_target_trackers(p) }.reduce(:&) + @versions = @projects.map {|p| p.shared_versions.open}.reduce(:&) + + @priorities = IssuePriority.active.reverse + @back = back_url + + @options_by_custom_field = {} + if @can[:edit] + custom_fields = @issues.map(&:editable_custom_fields).reduce(:&).reject(&:multiple?).select {|field| field.format.bulk_edit_supported} + custom_fields.each do |field| + values = field.possible_values_options(@projects) + if values.present? + @options_by_custom_field[field] = values + end + end + end + + @safe_attributes = @issues.map(&:safe_attribute_names).reduce(:&) + render :layout => false + end + + def time_entries + @time_entries = TimeEntry.where(:id => params[:ids]). + preload(:project => :time_entry_activities). + preload(:user).to_a + + (render_404; return) unless @time_entries.present? + if (@time_entries.size == 1) + @time_entry = @time_entries.first + end + + @projects = @time_entries.collect(&:project).compact.uniq + @project = @projects.first if @projects.size == 1 + @activities = @projects.map(&:activities).reduce(:&) + + edit_allowed = @time_entries.all? {|t| t.editable_by?(User.current)} + @can = {:edit => edit_allowed, :delete => edit_allowed} + @back = back_url + + @options_by_custom_field = {} + if @can[:edit] + custom_fields = @time_entries.map(&:editable_custom_fields).reduce(:&).reject(&:multiple?).select {|field| field.format.bulk_edit_supported} + custom_fields.each do |field| + values = field.possible_values_options(@projects) + if values.present? + @options_by_custom_field[field] = values + end + end + end + + render :layout => false + end +end diff --git a/app/controllers/custom_field_enumerations_controller.rb b/app/controllers/custom_field_enumerations_controller.rb new file mode 100644 index 0000000..fc186b9 --- /dev/null +++ b/app/controllers/custom_field_enumerations_controller.rb @@ -0,0 +1,84 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CustomFieldEnumerationsController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin + before_action :find_custom_field + before_action :find_enumeration, :only => :destroy + + helper :custom_fields + + def index + @values = @custom_field.enumerations.order(:position) + end + + def create + @value = @custom_field.enumerations.build + @value.attributes = enumeration_params + @value.save + respond_to do |format| + format.html { redirect_to custom_field_enumerations_path(@custom_field) } + format.js + end + end + + def update_each + saved = CustomFieldEnumeration.update_each(@custom_field, update_each_params) + if saved + flash[:notice] = l(:notice_successful_update) + end + redirect_to :action => 'index' + end + + def destroy + reassign_to = @custom_field.enumerations.find_by_id(params[:reassign_to_id]) + if reassign_to.nil? && @value.in_use? + @enumerations = @custom_field.enumerations - [@value] + render :action => 'destroy' + return + end + @value.destroy(reassign_to) + redirect_to custom_field_enumerations_path(@custom_field) + end + + private + + def find_custom_field + @custom_field = CustomField.find(params[:custom_field_id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_enumeration + @value = @custom_field.enumerations.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def enumeration_params + params.require(:custom_field_enumeration).permit(:name, :active, :position) + end + + def update_each_params + # params.require(:custom_field_enumerations).permit(:name, :active, :position) does not work here with param like this: + # "custom_field_enumerations":{"0":{"name": ...}, "1":{"name...}} + params.permit(:custom_field_enumerations => [:name, :active, :position]).require(:custom_field_enumerations) + end +end diff --git a/app/controllers/custom_fields_controller.rb b/app/controllers/custom_fields_controller.rb new file mode 100644 index 0000000..41d4a73 --- /dev/null +++ b/app/controllers/custom_fields_controller.rb @@ -0,0 +1,104 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CustomFieldsController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin + before_action :build_new_custom_field, :only => [:new, :create] + before_action :find_custom_field, :only => [:edit, :update, :destroy] + accept_api_auth :index + + def index + respond_to do |format| + format.html { + @custom_fields_by_type = CustomField.all.group_by {|f| f.class.name } + @custom_fields_projects_count = + IssueCustomField.where(is_for_all: false).joins(:projects).group(:custom_field_id).count + } + format.api { + @custom_fields = CustomField.all + } + end + end + + def new + @custom_field.field_format = 'string' if @custom_field.field_format.blank? + @custom_field.default_value = nil + end + + def create + if @custom_field.save + flash[:notice] = l(:notice_successful_create) + call_hook(:controller_custom_fields_new_after_save, :params => params, :custom_field => @custom_field) + redirect_to edit_custom_field_path(@custom_field) + else + render :action => 'new' + end + end + + def edit + end + + def update + @custom_field.safe_attributes = params[:custom_field] + if @custom_field.save + call_hook(:controller_custom_fields_edit_after_save, :params => params, :custom_field => @custom_field) + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_back_or_default edit_custom_field_path(@custom_field) + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.js { head 422 } + end + end + end + + def destroy + begin + if @custom_field.destroy + flash[:notice] = l(:notice_successful_delete) + end + rescue + flash[:error] = l(:error_can_not_delete_custom_field) + end + redirect_to custom_fields_path(:tab => @custom_field.class.name) + end + + private + + def build_new_custom_field + @custom_field = CustomField.new_subclass_instance(params[:type]) + if @custom_field.nil? + render :action => 'select_type' + else + @custom_field.safe_attributes = params[:custom_field] + end + end + + def find_custom_field + @custom_field = CustomField.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/documents_controller.rb b/app/controllers/documents_controller.rb new file mode 100644 index 0000000..dbf0e88 --- /dev/null +++ b/app/controllers/documents_controller.rb @@ -0,0 +1,95 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class DocumentsController < ApplicationController + default_search_scope :documents + model_object Document + before_action :find_project_by_project_id, :only => [:index, :new, :create] + before_action :find_model_object, :except => [:index, :new, :create] + before_action :find_project_from_association, :except => [:index, :new, :create] + before_action :authorize + + helper :attachments + helper :custom_fields + + def index + @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category' + documents = @project.documents.includes(:attachments, :category).to_a + case @sort_by + when 'date' + @grouped = documents.group_by {|d| d.updated_on.to_date } + when 'title' + @grouped = documents.group_by {|d| d.title.first.upcase} + when 'author' + @grouped = documents.select{|d| d.attachments.any?}.group_by {|d| d.attachments.last.author} + else + @grouped = documents.group_by(&:category) + end + @document = @project.documents.build + render :layout => false if request.xhr? + end + + def show + @attachments = @document.attachments.to_a + end + + def new + @document = @project.documents.build + @document.safe_attributes = params[:document] + end + + def create + @document = @project.documents.build + @document.safe_attributes = params[:document] + @document.save_attachments(params[:attachments]) + if @document.save + render_attachment_warning_if_needed(@document) + flash[:notice] = l(:notice_successful_create) + redirect_to project_documents_path(@project) + else + render :action => 'new' + end + end + + def edit + end + + def update + @document.safe_attributes = params[:document] + if @document.save + flash[:notice] = l(:notice_successful_update) + redirect_to document_path(@document) + else + render :action => 'edit' + end + end + + def destroy + @document.destroy if request.delete? + redirect_to project_documents_path(@project) + end + + def add_attachment + attachments = Attachment.attach_files(@document, params[:attachments]) + render_attachment_warning_if_needed(@document) + + if attachments.present? && attachments[:files].present? && Setting.notified_events.include?('document_added') + Mailer.attachments_added(attachments[:files]).deliver + end + redirect_to document_path(@document) + end +end diff --git a/app/controllers/email_addresses_controller.rb b/app/controllers/email_addresses_controller.rb new file mode 100644 index 0000000..2202625 --- /dev/null +++ b/app/controllers/email_addresses_controller.rb @@ -0,0 +1,104 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class EmailAddressesController < ApplicationController + self.main_menu = false + before_action :find_user, :require_admin_or_current_user + before_action :find_email_address, :only => [:update, :destroy] + require_sudo_mode :create, :update, :destroy + + def index + @addresses = @user.email_addresses.order(:id).where(:is_default => false).to_a + @address ||= EmailAddress.new + end + + def create + saved = false + if @user.email_addresses.count <= Setting.max_additional_emails.to_i + @address = EmailAddress.new(:user => @user, :is_default => false) + @address.safe_attributes = params[:email_address] + saved = @address.save + end + + respond_to do |format| + format.html { + if saved + redirect_to user_email_addresses_path(@user) + else + index + render :action => 'index' + end + } + format.js { + @address = nil if saved + index + render :action => 'index' + } + end + end + + def update + if params[:notify].present? + @address.notify = params[:notify].to_s + end + @address.save + + respond_to do |format| + format.html { + redirect_to user_email_addresses_path(@user) + } + format.js { + @address = nil + index + render :action => 'index' + } + end + end + + def destroy + @address.destroy + + respond_to do |format| + format.html { + redirect_to user_email_addresses_path(@user) + } + format.js { + @address = nil + index + render :action => 'index' + } + end + end + + private + + def find_user + @user = User.find(params[:user_id]) + end + + def find_email_address + @address = @user.email_addresses.where(:is_default => false).find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def require_admin_or_current_user + unless @user == User.current + require_admin + end + end +end diff --git a/app/controllers/enumerations_controller.rb b/app/controllers/enumerations_controller.rb new file mode 100644 index 0000000..a04d7b1 --- /dev/null +++ b/app/controllers/enumerations_controller.rb @@ -0,0 +1,113 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class EnumerationsController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin, :except => :index + before_action :require_admin_or_api_request, :only => :index + before_action :build_new_enumeration, :only => [:new, :create] + before_action :find_enumeration, :only => [:edit, :update, :destroy] + accept_api_auth :index + + helper :custom_fields + + def index + respond_to do |format| + format.html + format.api { + @klass = Enumeration.get_subclass(params[:type]) + if @klass + @enumerations = @klass.shared.sorted.to_a + else + render_404 + end + } + end + end + + def new + end + + def create + if request.post? && @enumeration.save + flash[:notice] = l(:notice_successful_create) + redirect_to enumerations_path + else + render :action => 'new' + end + end + + def edit + end + + def update + if @enumeration.update_attributes(enumeration_params) + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to enumerations_path + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.js { head 422 } + end + end + end + + def destroy + if !@enumeration.in_use? + # No associated objects + @enumeration.destroy + redirect_to enumerations_path + return + elsif params[:reassign_to_id].present? && (reassign_to = @enumeration.class.find_by_id(params[:reassign_to_id].to_i)) + @enumeration.destroy(reassign_to) + redirect_to enumerations_path + return + end + @enumerations = @enumeration.class.system.to_a - [@enumeration] + end + + private + + def build_new_enumeration + class_name = params[:enumeration] && params[:enumeration][:type] || params[:type] + @enumeration = Enumeration.new_subclass_instance(class_name) + if @enumeration + @enumeration.attributes = enumeration_params || {} + else + render_404 + end + end + + def find_enumeration + @enumeration = Enumeration.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def enumeration_params + # can't require enumeration on #new action + cf_ids = @enumeration.available_custom_fields.map{|c| c.id.to_s} + params.permit(:enumeration => [:name, :active, :is_default, :position, :custom_field_values => cf_ids])[:enumeration] + end +end diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb new file mode 100644 index 0000000..7c59665 --- /dev/null +++ b/app/controllers/files_controller.rb @@ -0,0 +1,76 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class FilesController < ApplicationController + menu_item :files + + before_action :find_project_by_project_id + before_action :authorize + accept_api_auth :index, :create + + helper :attachments + helper :sort + include SortHelper + + def index + sort_init 'filename', 'asc' + sort_update 'filename' => "#{Attachment.table_name}.filename", + 'created_on' => "#{Attachment.table_name}.created_on", + 'size' => "#{Attachment.table_name}.filesize", + 'downloads' => "#{Attachment.table_name}.downloads" + + @containers = [Project.includes(:attachments). + references(:attachments).reorder(sort_clause).find(@project.id)] + @containers += @project.versions.includes(:attachments). + references(:attachments).reorder(sort_clause).to_a.sort.reverse + respond_to do |format| + format.html { render :layout => !request.xhr? } + format.api + end + end + + def new + @versions = @project.versions.sort + end + + def create + version_id = params[:version_id] || (params[:file] && params[:file][:version_id]) + container = version_id.blank? ? @project : @project.versions.find_by_id(version_id) + attachments = Attachment.attach_files(container, (params[:attachments] || (params[:file] && params[:file][:token] && params))) + render_attachment_warning_if_needed(container) + + if attachments[:files].present? + if Setting.notified_events.include?('file_added') + Mailer.attachments_added(attachments[:files]).deliver + end + respond_to do |format| + format.html { + flash[:notice] = l(:label_file_added) + redirect_to project_files_path(@project) } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { + flash.now[:error] = l(:label_attachment) + " " + l('activerecord.errors.messages.invalid') + new + render :action => 'new' } + format.api { render :status => :bad_request } + end + end + end +end diff --git a/app/controllers/gantts_controller.rb b/app/controllers/gantts_controller.rb new file mode 100644 index 0000000..3283282 --- /dev/null +++ b/app/controllers/gantts_controller.rb @@ -0,0 +1,46 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class GanttsController < ApplicationController + menu_item :gantt + before_action :find_optional_project + + rescue_from Query::StatementInvalid, :with => :query_statement_invalid + + helper :gantt + helper :issues + helper :projects + helper :queries + include QueriesHelper + include Redmine::Export::PDF + + def show + @gantt = Redmine::Helpers::Gantt.new(params) + @gantt.project = @project + retrieve_query + @query.group_by = nil + @gantt.query = @query if @query.valid? + + basename = (@project ? "#{@project.identifier}-" : '') + 'gantt' + + respond_to do |format| + format.html { render :action => "show", :layout => !request.xhr? } + format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image') + format.pdf { send_data(@gantt.to_pdf, :type => 'application/pdf', :filename => "#{basename}.pdf") } + end + end +end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb new file mode 100644 index 0000000..4379ee3 --- /dev/null +++ b/app/controllers/groups_controller.rb @@ -0,0 +1,155 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class GroupsController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin + before_action :find_group, :except => [:index, :new, :create] + accept_api_auth :index, :show, :create, :update, :destroy, :add_users, :remove_user + + require_sudo_mode :add_users, :remove_user, :create, :update, :destroy, :edit_membership, :destroy_membership + + helper :custom_fields + helper :principal_memberships + + def index + respond_to do |format| + format.html { + scope = Group.sorted + scope = scope.like(params[:name]) if params[:name].present? + + @group_count = scope.count + @group_pages = Paginator.new @group_count, per_page_option, params['page'] + @groups = scope.limit(@group_pages.per_page).offset(@group_pages.offset).to_a + @user_count_by_group_id = user_count_by_group_id + } + format.api { + scope = Group.sorted + scope = scope.givable unless params[:builtin] == '1' + @groups = scope.to_a + } + end + end + + def show + respond_to do |format| + format.html + format.api + end + end + + def new + @group = Group.new + end + + def create + @group = Group.new + @group.safe_attributes = params[:group] + + respond_to do |format| + if @group.save + format.html { + flash[:notice] = l(:notice_successful_create) + redirect_to(params[:continue] ? new_group_path : groups_path) + } + format.api { render :action => 'show', :status => :created, :location => group_url(@group) } + else + format.html { render :action => "new" } + format.api { render_validation_errors(@group) } + end + end + end + + def edit + end + + def update + @group.safe_attributes = params[:group] + + respond_to do |format| + if @group.save + flash[:notice] = l(:notice_successful_update) + format.html { redirect_to_referer_or(groups_path) } + format.api { render_api_ok } + else + format.html { render :action => "edit" } + format.api { render_validation_errors(@group) } + end + end + end + + def destroy + @group.destroy + + respond_to do |format| + format.html { redirect_to_referer_or(groups_path) } + format.api { render_api_ok } + end + end + + def new_users + end + + def add_users + @users = User.not_in_group(@group).where(:id => (params[:user_id] || params[:user_ids])).to_a + @group.users << @users + respond_to do |format| + format.html { redirect_to edit_group_path(@group, :tab => 'users') } + format.js + format.api { + if @users.any? + render_api_ok + else + render_api_errors "#{l(:label_user)} #{l('activerecord.errors.messages.invalid')}" + end + } + end + end + + def remove_user + @group.users.delete(User.find(params[:user_id])) if request.delete? + respond_to do |format| + format.html { redirect_to edit_group_path(@group, :tab => 'users') } + format.js + format.api { render_api_ok } + end + end + + def autocomplete_for_user + respond_to do |format| + format.js + end + end + + private + + def find_group + @group = Group.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def user_count_by_group_id + h = User.joins(:groups).group('group_id').count + h.keys.each do |key| + h[key.to_i] = h.delete(key) + end + h + end +end diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb new file mode 100644 index 0000000..96589ac --- /dev/null +++ b/app/controllers/imports_controller.rb @@ -0,0 +1,122 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'csv' + +class ImportsController < ApplicationController + menu_item :issues + + before_action :find_import, :only => [:show, :settings, :mapping, :run] + before_action :authorize_global + + helper :issues + helper :queries + + def new + end + + def create + @import = IssueImport.new + @import.user = User.current + @import.file = params[:file] + @import.set_default_settings + + if @import.save + redirect_to import_settings_path(@import) + else + render :action => 'new' + end + end + + def show + end + + def settings + if request.post? && @import.parse_file + redirect_to import_mapping_path(@import) + end + + rescue CSV::MalformedCSVError => e + flash.now[:error] = l(:error_invalid_csv_file_or_settings) + rescue ArgumentError, EncodingError => e + flash.now[:error] = l(:error_invalid_file_encoding, :encoding => ERB::Util.h(@import.settings['encoding'])) + rescue SystemCallError => e + flash.now[:error] = l(:error_can_not_read_import_file) + end + + def mapping + @custom_fields = @import.mappable_custom_fields + + if request.post? + respond_to do |format| + format.html { + if params[:previous] + redirect_to import_settings_path(@import) + else + redirect_to import_run_path(@import) + end + } + format.js # updates mapping form on project or tracker change + end + end + end + + def run + if request.post? + @current = @import.run( + :max_items => max_items_per_request, + :max_time => 10.seconds + ) + respond_to do |format| + format.html { + if @import.finished? + redirect_to import_path(@import) + else + redirect_to import_run_path(@import) + end + } + format.js + end + end + end + + private + + def find_import + @import = Import.where(:user_id => User.current.id, :filename => params[:id]).first + if @import.nil? + render_404 + return + elsif @import.finished? && action_name != 'show' + redirect_to import_path(@import) + return + end + update_from_params if request.post? + end + + def update_from_params + if params[:import_settings].is_a?(Hash) + @import.settings ||= {} + @import.settings.merge!(params[:import_settings]) + @import.save! + end + end + + def max_items_per_request + 5 + end +end diff --git a/app/controllers/issue_categories_controller.rb b/app/controllers/issue_categories_controller.rb new file mode 100644 index 0000000..d635a28 --- /dev/null +++ b/app/controllers/issue_categories_controller.rb @@ -0,0 +1,122 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueCategoriesController < ApplicationController + menu_item :settings + model_object IssueCategory + before_action :find_model_object, :except => [:index, :new, :create] + before_action :find_project_from_association, :except => [:index, :new, :create] + before_action :find_project_by_project_id, :only => [:index, :new, :create] + before_action :authorize + accept_api_auth :index, :show, :create, :update, :destroy + + def index + respond_to do |format| + format.html { redirect_to_settings_in_projects } + format.api { @categories = @project.issue_categories.to_a } + end + end + + def show + respond_to do |format| + format.html { redirect_to_settings_in_projects } + format.api + end + end + + def new + @category = @project.issue_categories.build + @category.safe_attributes = params[:issue_category] + + respond_to do |format| + format.html + format.js + end + end + + def create + @category = @project.issue_categories.build + @category.safe_attributes = params[:issue_category] + if @category.save + respond_to do |format| + format.html do + flash[:notice] = l(:notice_successful_create) + redirect_to_settings_in_projects + end + format.js + format.api { render :action => 'show', :status => :created, :location => issue_category_path(@category) } + end + else + respond_to do |format| + format.html { render :action => 'new'} + format.js { render :action => 'new'} + format.api { render_validation_errors(@category) } + end + end + end + + def edit + end + + def update + @category.safe_attributes = params[:issue_category] + if @category.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to_settings_in_projects + } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.api { render_validation_errors(@category) } + end + end + end + + def destroy + @issue_count = @category.issues.size + if @issue_count == 0 || params[:todo] || api_request? + reassign_to = nil + if params[:reassign_to_id] && (params[:todo] == 'reassign' || params[:todo].blank?) + reassign_to = @project.issue_categories.find_by_id(params[:reassign_to_id]) + end + @category.destroy(reassign_to) + respond_to do |format| + format.html { redirect_to_settings_in_projects } + format.api { render_api_ok } + end + return + end + @categories = @project.issue_categories - [@category] + end + + private + + def redirect_to_settings_in_projects + redirect_to settings_project_path(@project, :tab => 'categories') + end + + # Wrap ApplicationController's find_model_object method to set + # @category instead of just @issue_category + def find_model_object + super + @category = @object + end +end diff --git a/app/controllers/issue_relations_controller.rb b/app/controllers/issue_relations_controller.rb new file mode 100644 index 0000000..0bcc8c5 --- /dev/null +++ b/app/controllers/issue_relations_controller.rb @@ -0,0 +1,98 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueRelationsController < ApplicationController + helper :issues + + before_action :find_issue, :authorize, :only => [:index, :create] + before_action :find_relation, :only => [:show, :destroy] + + accept_api_auth :index, :show, :create, :destroy + + def index + @relations = @issue.relations + + respond_to do |format| + format.html { head 200 } + format.api + end + end + + def show + raise Unauthorized unless @relation.visible? + + respond_to do |format| + format.html { head 200 } + format.api + end + end + + def create + @relation = IssueRelation.new + @relation.issue_from = @issue + @relation.safe_attributes = params[:relation] + @relation.init_journals(User.current) + + begin + saved = @relation.save + rescue ActiveRecord::RecordNotUnique + saved = false + @relation.errors.add :base, :taken + end + + respond_to do |format| + format.html { redirect_to issue_path(@issue) } + format.js { + @relations = @issue.reload.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? } + } + format.api { + if saved + render :action => 'show', :status => :created, :location => relation_url(@relation) + else + render_validation_errors(@relation) + end + } + end + end + + def destroy + raise Unauthorized unless @relation.deletable? + @relation.init_journals(User.current) + @relation.destroy + + respond_to do |format| + format.html { redirect_to issue_path(@relation.issue_from) } + format.js + format.api { render_api_ok } + end + end + + private + + def find_issue + @issue = Issue.find(params[:issue_id]) + @project = @issue.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_relation + @relation = IssueRelation.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/issue_statuses_controller.rb b/app/controllers/issue_statuses_controller.rb new file mode 100644 index 0000000..92c0337 --- /dev/null +++ b/app/controllers/issue_statuses_controller.rb @@ -0,0 +1,88 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueStatusesController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin, :except => :index + before_action :require_admin_or_api_request, :only => :index + accept_api_auth :index + + def index + @issue_statuses = IssueStatus.sorted.to_a + respond_to do |format| + format.html { render :layout => false if request.xhr? } + format.api + end + end + + def new + @issue_status = IssueStatus.new + end + + def create + @issue_status = IssueStatus.new + @issue_status.safe_attributes = params[:issue_status] + if @issue_status.save + flash[:notice] = l(:notice_successful_create) + redirect_to issue_statuses_path + else + render :action => 'new' + end + end + + def edit + @issue_status = IssueStatus.find(params[:id]) + end + + def update + @issue_status = IssueStatus.find(params[:id]) + @issue_status.safe_attributes = params[:issue_status] + if @issue_status.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to issue_statuses_path(:page => params[:page]) + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.js { head 422 } + end + end + end + + def destroy + IssueStatus.find(params[:id]).destroy + redirect_to issue_statuses_path + rescue + flash[:error] = l(:error_unable_delete_issue_status) + redirect_to issue_statuses_path + end + + def update_issue_done_ratio + if request.post? && IssueStatus.update_issue_done_ratios + flash[:notice] = l(:notice_issue_done_ratios_updated) + else + flash[:error] = l(:error_issue_done_ratios_not_updated) + end + redirect_to issue_statuses_path + end +end diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb new file mode 100644 index 0000000..69a947b --- /dev/null +++ b/app/controllers/issues_controller.rb @@ -0,0 +1,602 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssuesController < ApplicationController + default_search_scope :issues + + before_action :find_issue, :only => [:show, :edit, :update] + before_action :find_issues, :only => [:bulk_edit, :bulk_update, :destroy] + before_action :authorize, :except => [:index, :new, :create] + before_action :find_optional_project, :only => [:index, :new, :create] + before_action :build_new_issue_from_params, :only => [:new, :create] + accept_rss_auth :index, :show + accept_api_auth :index, :show, :create, :update, :destroy + + rescue_from Query::StatementInvalid, :with => :query_statement_invalid + + helper :journals + helper :projects + helper :custom_fields + helper :issue_relations + helper :watchers + helper :attachments + helper :queries + include QueriesHelper + helper :repositories + helper :timelog + + def index + use_session = !request.format.csv? + retrieve_query(IssueQuery, use_session) + + if @query.valid? + respond_to do |format| + format.html { + @issue_count = @query.issue_count + @issue_pages = Paginator.new @issue_count, per_page_option, params['page'] + @issues = @query.issues(:offset => @issue_pages.offset, :limit => @issue_pages.per_page) + render :layout => !request.xhr? + } + format.api { + @offset, @limit = api_offset_and_limit + @query.column_names = %w(author) + @issue_count = @query.issue_count + @issues = @query.issues(:offset => @offset, :limit => @limit) + Issue.load_visible_relations(@issues) if include_in_api_response?('relations') + } + format.atom { + @issues = @query.issues(:limit => Setting.feeds_limit.to_i) + render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") + } + format.csv { + @issues = @query.issues(:limit => Setting.issues_export_limit.to_i) + send_data(query_to_csv(@issues, @query, params[:csv]), :type => 'text/csv; header=present', :filename => 'issues.csv') + } + format.pdf { + @issues = @query.issues(:limit => Setting.issues_export_limit.to_i) + send_file_headers! :type => 'application/pdf', :filename => 'issues.pdf' + } + end + else + respond_to do |format| + format.html { render :layout => !request.xhr? } + format.any(:atom, :csv, :pdf) { head 422 } + format.api { render_validation_errors(@query) } + end + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def show + @journals = @issue.visible_journals_with_index + @changesets = @issue.changesets.visible.preload(:repository, :user).to_a + @relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? } + + if User.current.wants_comments_in_reverse_order? + @journals.reverse! + @changesets.reverse! + end + + if User.current.allowed_to?(:view_time_entries, @project) + Issue.load_visible_spent_hours([@issue]) + Issue.load_visible_total_spent_hours([@issue]) + end + + respond_to do |format| + format.html { + @allowed_statuses = @issue.new_statuses_allowed_to(User.current) + @priorities = IssuePriority.active + @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) + @relation = IssueRelation.new + retrieve_previous_and_next_issue_ids + render :template => 'issues/show' + } + format.api + format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' } + format.pdf { + send_file_headers! :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf" + } + end + end + + def new + respond_to do |format| + format.html { render :action => 'new', :layout => !request.xhr? } + format.js + end + end + + def create + unless User.current.allowed_to?(:add_issues, @issue.project, :global => true) + raise ::Unauthorized + end + call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue }) + @issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads])) + if @issue.save + call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue}) + respond_to do |format| + format.html { + render_attachment_warning_if_needed(@issue) + flash[:notice] = l(:notice_issue_successful_create, :id => view_context.link_to("##{@issue.id}", issue_path(@issue), :title => @issue.subject)) + redirect_after_create + } + format.api { render :action => 'show', :status => :created, :location => issue_url(@issue) } + end + return + else + respond_to do |format| + format.html { + if @issue.project.nil? + render_error :status => 422 + else + render :action => 'new' + end + } + format.api { render_validation_errors(@issue) } + end + end + end + + def edit + return unless update_issue_from_params + + respond_to do |format| + format.html { } + format.js + end + end + + def update + return unless update_issue_from_params + @issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads])) + saved = false + begin + saved = save_issue_with_child_records + rescue ActiveRecord::StaleObjectError + @conflict = true + if params[:last_journal_id] + @conflict_journals = @issue.journals_after(params[:last_journal_id]).to_a + @conflict_journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project) + end + end + + if saved + render_attachment_warning_if_needed(@issue) + flash[:notice] = l(:notice_successful_update) unless @issue.current_journal.new_record? + + respond_to do |format| + format.html { redirect_back_or_default issue_path(@issue, previous_and_next_issue_ids_params) } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.api { render_validation_errors(@issue) } + end + end + end + + # Bulk edit/copy a set of issues + def bulk_edit + @issues.sort! + @copy = params[:copy].present? + @notes = params[:notes] + + if @copy + unless User.current.allowed_to?(:copy_issues, @projects) + raise ::Unauthorized + end + else + unless @issues.all?(&:attributes_editable?) + raise ::Unauthorized + end + end + + edited_issues = Issue.where(:id => @issues.map(&:id)).to_a + + @values_by_custom_field = {} + edited_issues.each do |issue| + issue.custom_field_values.each do |c| + if c.value_present? + @values_by_custom_field[c.custom_field] ||= [] + @values_by_custom_field[c.custom_field] << issue.id + end + end + end + + @allowed_projects = Issue.allowed_target_projects + if params[:issue] + @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:issue][:project_id].to_s} + if @target_project + target_projects = [@target_project] + edited_issues.each {|issue| issue.project = @target_project} + end + end + target_projects ||= @projects + + @trackers = target_projects.map {|p| Issue.allowed_target_trackers(p) }.reduce(:&) + if params[:issue] + @target_tracker = @trackers.detect {|t| t.id.to_s == params[:issue][:tracker_id].to_s} + if @target_tracker + edited_issues.each {|issue| issue.tracker = @target_tracker} + end + end + + if @copy + # Copied issues will get their default statuses + @available_statuses = [] + else + @available_statuses = edited_issues.map(&:new_statuses_allowed_to).reduce(:&) + end + if params[:issue] + @target_status = @available_statuses.detect {|t| t.id.to_s == params[:issue][:status_id].to_s} + if @target_status + edited_issues.each {|issue| issue.status = @target_status} + end + end + + edited_issues.each do |issue| + issue.custom_field_values.each do |c| + if c.value_present? && @values_by_custom_field[c.custom_field] + @values_by_custom_field[c.custom_field].delete(issue.id) + end + end + end + @values_by_custom_field.delete_if {|k,v| v.blank?} + + @custom_fields = edited_issues.map{|i|i.editable_custom_fields}.reduce(:&).select {|field| field.format.bulk_edit_supported} + @assignables = target_projects.map(&:assignable_users).reduce(:&) + @versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&) + @categories = target_projects.map {|p| p.issue_categories}.reduce(:&) + if @copy + @attachments_present = @issues.detect {|i| i.attachments.any?}.present? + @subtasks_present = @issues.detect {|i| !i.leaf?}.present? + @watchers_present = User.current.allowed_to?(:add_issue_watchers, @projects) && Watcher.where(:watchable_type => 'Issue', :watchable_id => @issues.map(&:id)).exists? + end + + @safe_attributes = edited_issues.map(&:safe_attribute_names).reduce(:&) + + @issue_params = params[:issue] || {} + @issue_params[:custom_field_values] ||= {} + end + + def bulk_update + @issues.sort! + @copy = params[:copy].present? + + attributes = parse_params_for_bulk_update(params[:issue]) + copy_subtasks = (params[:copy_subtasks] == '1') + copy_attachments = (params[:copy_attachments] == '1') + copy_watchers = (params[:copy_watchers] == '1') + + if @copy + unless User.current.allowed_to?(:copy_issues, @projects) + raise ::Unauthorized + end + target_projects = @projects + if attributes['project_id'].present? + target_projects = Project.where(:id => attributes['project_id']).to_a + end + unless User.current.allowed_to?(:add_issues, target_projects) + raise ::Unauthorized + end + unless User.current.allowed_to?(:add_issue_watchers, @projects) + copy_watchers = false + end + else + unless @issues.all?(&:attributes_editable?) + raise ::Unauthorized + end + end + + unsaved_issues = [] + saved_issues = [] + + if @copy && copy_subtasks + # Descendant issues will be copied with the parent task + # Don't copy them twice + @issues.reject! {|issue| @issues.detect {|other| issue.is_descendant_of?(other)}} + end + + @issues.each do |orig_issue| + orig_issue.reload + if @copy + issue = orig_issue.copy({}, + :attachments => copy_attachments, + :subtasks => copy_subtasks, + :watchers => copy_watchers, + :link => link_copy?(params[:link_copy]) + ) + else + issue = orig_issue + end + journal = issue.init_journal(User.current, params[:notes]) + issue.safe_attributes = attributes + call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue }) + if issue.save + saved_issues << issue + else + unsaved_issues << orig_issue + end + end + + if unsaved_issues.empty? + flash[:notice] = l(:notice_successful_update) unless saved_issues.empty? + if params[:follow] + if @issues.size == 1 && saved_issues.size == 1 + redirect_to issue_path(saved_issues.first) + elsif saved_issues.map(&:project).uniq.size == 1 + redirect_to project_issues_path(saved_issues.map(&:project).first) + end + else + redirect_back_or_default _project_issues_path(@project) + end + else + @saved_issues = @issues + @unsaved_issues = unsaved_issues + @issues = Issue.visible.where(:id => @unsaved_issues.map(&:id)).to_a + bulk_edit + render :action => 'bulk_edit' + end + end + + def destroy + raise Unauthorized unless @issues.all?(&:deletable?) + + # all issues and their descendants are about to be deleted + issues_and_descendants_ids = Issue.self_and_descendants(@issues).pluck(:id) + time_entries = TimeEntry.where(:issue_id => issues_and_descendants_ids) + @hours = time_entries.sum(:hours).to_f + + if @hours > 0 + case params[:todo] + when 'destroy' + # nothing to do + when 'nullify' + if Setting.timelog_required_fields.include?('issue_id') + flash.now[:error] = l(:field_issue) + " " + ::I18n.t('activerecord.errors.messages.blank') + return + else + time_entries.update_all(:issue_id => nil) + end + when 'reassign' + reassign_to = @project && @project.issues.find_by_id(params[:reassign_to_id]) + if reassign_to.nil? + flash.now[:error] = l(:error_issue_not_found_in_project) + return + elsif issues_and_descendants_ids.include?(reassign_to.id) + flash.now[:error] = l(:error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted) + return + else + time_entries.update_all(:issue_id => reassign_to.id, :project_id => reassign_to.project_id) + end + else + # display the destroy form if it's a user request + return unless api_request? + end + end + @issues.each do |issue| + begin + issue.reload.destroy + rescue ::ActiveRecord::RecordNotFound # raised by #reload if issue no longer exists + # nothing to do, issue was already deleted (eg. by a parent) + end + end + respond_to do |format| + format.html { redirect_back_or_default _project_issues_path(@project) } + format.api { render_api_ok } + end + end + + # Overrides Redmine::MenuManager::MenuController::ClassMethods for + # when the "New issue" tab is enabled + def current_menu_item + if Setting.new_item_menu_tab == '1' && [:new, :create].include?(action_name.to_sym) + :new_issue + else + super + end + end + + private + + def retrieve_previous_and_next_issue_ids + if params[:prev_issue_id].present? || params[:next_issue_id].present? + @prev_issue_id = params[:prev_issue_id].presence.try(:to_i) + @next_issue_id = params[:next_issue_id].presence.try(:to_i) + @issue_position = params[:issue_position].presence.try(:to_i) + @issue_count = params[:issue_count].presence.try(:to_i) + else + retrieve_query_from_session + if @query + @per_page = per_page_option + limit = 500 + issue_ids = @query.issue_ids(:limit => (limit + 1)) + if (idx = issue_ids.index(@issue.id)) && idx < limit + if issue_ids.size < 500 + @issue_position = idx + 1 + @issue_count = issue_ids.size + end + @prev_issue_id = issue_ids[idx - 1] if idx > 0 + @next_issue_id = issue_ids[idx + 1] if idx < (issue_ids.size - 1) + end + query_params = @query.as_params + if @issue_position + query_params = query_params.merge(:page => (@issue_position / per_page_option) + 1, :per_page => per_page_option) + end + @query_path = _project_issues_path(@query.project, query_params) + end + end + end + + def previous_and_next_issue_ids_params + { + :prev_issue_id => params[:prev_issue_id], + :next_issue_id => params[:next_issue_id], + :issue_position => params[:issue_position], + :issue_count => params[:issue_count] + }.reject {|k,v| k.blank?} + end + + # Used by #edit and #update to set some common instance variables + # from the params + def update_issue_from_params + @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) + if params[:time_entry] + @time_entry.safe_attributes = params[:time_entry] + end + + @issue.init_journal(User.current) + + issue_attributes = params[:issue] + if issue_attributes && params[:conflict_resolution] + case params[:conflict_resolution] + when 'overwrite' + issue_attributes = issue_attributes.dup + issue_attributes.delete(:lock_version) + when 'add_notes' + issue_attributes = issue_attributes.slice(:notes, :private_notes) + when 'cancel' + redirect_to issue_path(@issue) + return false + end + end + @issue.safe_attributes = issue_attributes + @priorities = IssuePriority.active + @allowed_statuses = @issue.new_statuses_allowed_to(User.current) + true + end + + # Used by #new and #create to build a new issue from the params + # The new issue will be copied from an existing one if copy_from parameter is given + def build_new_issue_from_params + @issue = Issue.new + if params[:copy_from] + begin + @issue.init_journal(User.current) + @copy_from = Issue.visible.find(params[:copy_from]) + unless User.current.allowed_to?(:copy_issues, @copy_from.project) + raise ::Unauthorized + end + @link_copy = link_copy?(params[:link_copy]) || request.get? + @copy_attachments = params[:copy_attachments].present? || request.get? + @copy_subtasks = params[:copy_subtasks].present? || request.get? + @copy_watchers = User.current.allowed_to?(:add_issue_watchers, @project) + @issue.copy_from(@copy_from, :attachments => @copy_attachments, :subtasks => @copy_subtasks, :watchers => @copy_watchers, :link => @link_copy) + @issue.parent_issue_id = @copy_from.parent_id + rescue ActiveRecord::RecordNotFound + render_404 + return + end + end + @issue.project = @project + if request.get? + @issue.project ||= @issue.allowed_target_projects.first + end + @issue.author ||= User.current + @issue.start_date ||= User.current.today if Setting.default_issue_start_date_to_creation_date? + + attrs = (params[:issue] || {}).deep_dup + if action_name == 'new' && params[:was_default_status] == attrs[:status_id] + attrs.delete(:status_id) + end + if action_name == 'new' && params[:form_update_triggered_by] == 'issue_project_id' + # Discard submitted version when changing the project on the issue form + # so we can use the default version for the new project + attrs.delete(:fixed_version_id) + end + @issue.safe_attributes = attrs + + if @issue.project + @issue.tracker ||= @issue.allowed_target_trackers.first + if @issue.tracker.nil? + if @issue.project.trackers.any? + # None of the project trackers is allowed to the user + render_error :message => l(:error_no_tracker_allowed_for_new_issue_in_project), :status => 403 + else + # Project has no trackers + render_error l(:error_no_tracker_in_project) + end + return false + end + if @issue.status.nil? + render_error l(:error_no_default_issue_status) + return false + end + elsif request.get? + render_error :message => l(:error_no_projects_with_tracker_allowed_for_new_issue), :status => 403 + return false + end + + @priorities = IssuePriority.active + @allowed_statuses = @issue.new_statuses_allowed_to(User.current) + end + + # Saves @issue and a time_entry from the parameters + def save_issue_with_child_records + Issue.transaction do + if params[:time_entry] && (params[:time_entry][:hours].present? || params[:time_entry][:comments].present?) && User.current.allowed_to?(:log_time, @issue.project) + time_entry = @time_entry || TimeEntry.new + time_entry.project = @issue.project + time_entry.issue = @issue + time_entry.user = User.current + time_entry.spent_on = User.current.today + time_entry.safe_attributes = params[:time_entry] + @issue.time_entries << time_entry + end + + call_hook(:controller_issues_edit_before_save, { :params => params, :issue => @issue, :time_entry => time_entry, :journal => @issue.current_journal}) + if @issue.save + call_hook(:controller_issues_edit_after_save, { :params => params, :issue => @issue, :time_entry => time_entry, :journal => @issue.current_journal}) + else + raise ActiveRecord::Rollback + end + end + end + + # Returns true if the issue copy should be linked + # to the original issue + def link_copy?(param) + case Setting.link_copied_issue + when 'yes' + true + when 'no' + false + when 'ask' + param == '1' + end + end + + # Redirects user after a successful issue creation + def redirect_after_create + if params[:continue] + url_params = {} + url_params[:issue] = {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} + url_params[:back_url] = params[:back_url].presence + + if params[:project_id] + redirect_to new_project_issue_path(@issue.project, url_params) + else + url_params[:issue].merge! :project_id => @issue.project_id + redirect_to new_issue_path(url_params) + end + else + redirect_back_or_default issue_path(@issue) + end + end +end diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb new file mode 100644 index 0000000..7f07b38 --- /dev/null +++ b/app/controllers/journals_controller.rb @@ -0,0 +1,107 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class JournalsController < ApplicationController + before_action :find_journal, :only => [:edit, :update, :diff] + before_action :find_issue, :only => [:new] + before_action :find_optional_project, :only => [:index] + before_action :authorize, :only => [:new, :edit, :update, :diff] + accept_rss_auth :index + menu_item :issues + + helper :issues + helper :custom_fields + helper :queries + include QueriesHelper + + def index + retrieve_query + if @query.valid? + @journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC", + :limit => 25) + end + @title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name) + render :layout => false, :content_type => 'application/atom+xml' + rescue ActiveRecord::RecordNotFound + render_404 + end + + def diff + @issue = @journal.issue + if params[:detail_id].present? + @detail = @journal.details.find_by_id(params[:detail_id]) + else + @detail = @journal.details.detect {|d| d.property == 'attr' && d.prop_key == 'description'} + end + unless @issue && @detail + render_404 + return false + end + if @detail.property == 'cf' + unless @detail.custom_field && @detail.custom_field.visible_by?(@issue.project, User.current) + raise ::Unauthorized + end + end + @diff = Redmine::Helpers::Diff.new(@detail.value, @detail.old_value) + end + + def new + @journal = Journal.visible.find(params[:journal_id]) if params[:journal_id] + if @journal + user = @journal.user + text = @journal.notes + else + user = @issue.author + text = @issue.description + end + # Replaces pre blocks with [...] + text = text.to_s.strip.gsub(%r{
(.*?)
}m, '[...]') + @content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> " + @content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" + rescue ActiveRecord::RecordNotFound + render_404 + end + + def edit + (render_403; return false) unless @journal.editable_by?(User.current) + respond_to do |format| + # TODO: implement non-JS journal update + format.js + end + end + + def update + (render_403; return false) unless @journal.editable_by?(User.current) + @journal.safe_attributes = params[:journal] + @journal.save + @journal.destroy if @journal.details.empty? && @journal.notes.blank? + call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params}) + respond_to do |format| + format.html { redirect_to issue_path(@journal.journalized) } + format.js + end + end + + private + + def find_journal + @journal = Journal.visible.find(params[:id]) + @project = @journal.journalized.project + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/mail_handler_controller.rb b/app/controllers/mail_handler_controller.rb new file mode 100644 index 0000000..ccb832e --- /dev/null +++ b/app/controllers/mail_handler_controller.rb @@ -0,0 +1,44 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MailHandlerController < ActionController::Base + before_action :check_credential + + # Displays the email submission form + def new + end + + # Submits an incoming email to MailHandler + def index + options = params.dup + email = options.delete(:email) + if MailHandler.receive(email, options) + head :created + else + head :unprocessable_entity + end + end + + private + + def check_credential + User.current = nil + unless Setting.mail_handler_api_enabled? && params[:key].to_s == Setting.mail_handler_api_key + render :plain => 'Access denied. Incoming emails WS is disabled or key is invalid.', :status => 403 + end + end +end diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb new file mode 100644 index 0000000..1583e9e --- /dev/null +++ b/app/controllers/members_controller.rb @@ -0,0 +1,133 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MembersController < ApplicationController + model_object Member + before_action :find_model_object, :except => [:index, :new, :create, :autocomplete] + before_action :find_project_from_association, :except => [:index, :new, :create, :autocomplete] + before_action :find_project_by_project_id, :only => [:index, :new, :create, :autocomplete] + before_action :authorize + accept_api_auth :index, :show, :create, :update, :destroy + + require_sudo_mode :create, :update, :destroy + + def index + scope = @project.memberships + @offset, @limit = api_offset_and_limit + @member_count = scope.count + @member_pages = Paginator.new @member_count, @limit, params['page'] + @offset ||= @member_pages.offset + @members = scope.order(:id).limit(@limit).offset(@offset).to_a + + respond_to do |format| + format.html { head 406 } + format.api + end + end + + def show + respond_to do |format| + format.html { head 406 } + format.api + end + end + + def new + @member = Member.new + end + + def create + members = [] + if params[:membership] + user_ids = Array.wrap(params[:membership][:user_id] || params[:membership][:user_ids]) + user_ids << nil if user_ids.empty? + user_ids.each do |user_id| + member = Member.new(:project => @project, :user_id => user_id) + member.set_editable_role_ids(params[:membership][:role_ids]) + members << member + end + @project.members << members + end + + respond_to do |format| + format.html { redirect_to_settings_in_projects } + format.js { + @members = members + @member = Member.new + } + format.api { + @member = members.first + if @member.valid? + render :action => 'show', :status => :created, :location => membership_url(@member) + else + render_validation_errors(@member) + end + } + end + end + + def edit + @roles = Role.givable.to_a + end + + def update + if params[:membership] + @member.set_editable_role_ids(params[:membership][:role_ids]) + end + saved = @member.save + respond_to do |format| + format.html { redirect_to_settings_in_projects } + format.js + format.api { + if saved + render_api_ok + else + render_validation_errors(@member) + end + } + end + end + + def destroy + if @member.deletable? + @member.destroy + end + respond_to do |format| + format.html { redirect_to_settings_in_projects } + format.js + format.api { + if @member.destroyed? + render_api_ok + else + head :unprocessable_entity + end + } + end + end + + def autocomplete + respond_to do |format| + format.js + end + end + + private + + def redirect_to_settings_in_projects + redirect_to settings_project_path(@project, :tab => 'members') + end +end diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb new file mode 100644 index 0000000..76bc19c --- /dev/null +++ b/app/controllers/messages_controller.rb @@ -0,0 +1,142 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MessagesController < ApplicationController + menu_item :boards + default_search_scope :messages + before_action :find_board, :only => [:new, :preview] + before_action :find_attachments, :only => [:preview] + before_action :find_message, :except => [:new, :preview] + before_action :authorize, :except => [:preview, :edit, :destroy] + + helper :boards + helper :watchers + helper :attachments + include AttachmentsHelper + + REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE) + + # Show a topic and its replies + def show + page = params[:page] + # Find the page of the requested reply + if params[:r] && page.nil? + offset = @topic.children.where("#{Message.table_name}.id < ?", params[:r].to_i).count + page = 1 + offset / REPLIES_PER_PAGE + end + + @reply_count = @topic.children.count + @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page + @replies = @topic.children. + includes(:author, :attachments, {:board => :project}). + reorder("#{Message.table_name}.created_on ASC, #{Message.table_name}.id ASC"). + limit(@reply_pages.per_page). + offset(@reply_pages.offset). + to_a + + @reply = Message.new(:subject => "RE: #{@message.subject}") + render :action => "show", :layout => false if request.xhr? + end + + # Create a new topic + def new + @message = Message.new + @message.author = User.current + @message.board = @board + @message.safe_attributes = params[:message] + if request.post? + @message.save_attachments(params[:attachments]) + if @message.save + call_hook(:controller_messages_new_after_save, { :params => params, :message => @message}) + render_attachment_warning_if_needed(@message) + redirect_to board_message_path(@board, @message) + end + end + end + + # Reply to a topic + def reply + @reply = Message.new + @reply.author = User.current + @reply.board = @board + @reply.safe_attributes = params[:reply] + @topic.children << @reply + if !@reply.new_record? + call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply}) + attachments = Attachment.attach_files(@reply, params[:attachments]) + render_attachment_warning_if_needed(@reply) + end + redirect_to board_message_path(@board, @topic, :r => @reply) + end + + # Edit a message + def edit + (render_403; return false) unless @message.editable_by?(User.current) + @message.safe_attributes = params[:message] + if request.post? && @message.save + attachments = Attachment.attach_files(@message, params[:attachments]) + render_attachment_warning_if_needed(@message) + flash[:notice] = l(:notice_successful_update) + @message.reload + redirect_to board_message_path(@message.board, @message.root, :r => (@message.parent_id && @message.id)) + end + end + + # Delete a messages + def destroy + (render_403; return false) unless @message.destroyable_by?(User.current) + r = @message.to_param + @message.destroy + if @message.parent + redirect_to board_message_path(@board, @message.parent, :r => r) + else + redirect_to project_board_path(@project, @board) + end + end + + def quote + @subject = @message.subject + @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:') + + @content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> " + @content << @message.content.to_s.strip.gsub(%r{
(.*?)
}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" + end + + def preview + message = @board.messages.find_by_id(params[:id]) + @text = (params[:message] || params[:reply])[:content] + @previewed = message + render :partial => 'common/preview' + end + +private + def find_message + return unless find_board + @message = @board.messages.includes(:parent).find(params[:id]) + @topic = @message.root + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_board + @board = Board.includes(:project).find(params[:board_id]) + @project = @board.project + rescue ActiveRecord::RecordNotFound + render_404 + nil + end +end diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb new file mode 100644 index 0000000..bf04d55 --- /dev/null +++ b/app/controllers/my_controller.rb @@ -0,0 +1,186 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MyController < ApplicationController + self.main_menu = false + before_action :require_login + # let user change user's password when user has to + skip_before_action :check_password_change, :only => :password + + require_sudo_mode :account, only: :post + require_sudo_mode :reset_rss_key, :reset_api_key, :show_api_key, :destroy + + helper :issues + helper :users + helper :custom_fields + helper :queries + + def index + page + render :action => 'page' + end + + # Show user's page + def page + @user = User.current + @groups = @user.pref.my_page_groups + @blocks = @user.pref.my_page_layout + end + + # Edit user's account + def account + @user = User.current + @pref = @user.pref + if request.post? + @user.safe_attributes = params[:user] + @user.pref.safe_attributes = params[:pref] + if @user.save + @user.pref.save + set_language_if_valid @user.language + flash[:notice] = l(:notice_account_updated) + redirect_to my_account_path + return + end + end + end + + # Destroys user's account + def destroy + @user = User.current + unless @user.own_account_deletable? + redirect_to my_account_path + return + end + + if request.post? && params[:confirm] + @user.destroy + if @user.destroyed? + logout_user + flash[:notice] = l(:notice_account_deleted) + end + redirect_to home_path + end + end + + # Manage user's password + def password + @user = User.current + unless @user.change_password_allowed? + flash[:error] = l(:notice_can_t_change_password) + redirect_to my_account_path + return + end + if request.post? + if !@user.check_password?(params[:password]) + flash.now[:error] = l(:notice_account_wrong_password) + elsif params[:password] == params[:new_password] + flash.now[:error] = l(:notice_new_password_must_be_different) + else + @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] + @user.must_change_passwd = false + if @user.save + # The session token was destroyed by the password change, generate a new one + session[:tk] = @user.generate_session_token + Mailer.password_updated(@user) + flash[:notice] = l(:notice_account_password_updated) + redirect_to my_account_path + end + end + end + end + + # Create a new feeds key + def reset_rss_key + if request.post? + if User.current.rss_token + User.current.rss_token.destroy + User.current.reload + end + User.current.rss_key + flash[:notice] = l(:notice_feeds_access_key_reseted) + end + redirect_to my_account_path + end + + def show_api_key + @user = User.current + end + + # Create a new API key + def reset_api_key + if request.post? + if User.current.api_token + User.current.api_token.destroy + User.current.reload + end + User.current.api_key + flash[:notice] = l(:notice_api_access_key_reseted) + end + redirect_to my_account_path + end + + def update_page + @user = User.current + block_settings = params[:settings] || {} + + block_settings.each do |block, settings| + @user.pref.update_block_settings(block, settings) + end + @user.pref.save + @updated_blocks = block_settings.keys + end + + # Add a block to user's page + # The block is added on top of the page + # params[:block] : id of the block to add + def add_block + @user = User.current + @block = params[:block] + if @user.pref.add_block @block + @user.pref.save + respond_to do |format| + format.html { redirect_to my_page_path } + format.js + end + else + render_error :status => 422 + end + end + + # Remove a block to user's page + # params[:block] : id of the block to remove + def remove_block + @user = User.current + @block = params[:block] + @user.pref.remove_block @block + @user.pref.save + respond_to do |format| + format.html { redirect_to my_page_path } + format.js + end + end + + # Change blocks order on user's page + # params[:group] : group to order (top, left or right) + # params[:blocks] : array of block ids of the group + def order_blocks + @user = User.current + @user.pref.order_blocks params[:group], params[:blocks] + @user.pref.save + head 200 + end +end diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb new file mode 100644 index 0000000..3df9e5e --- /dev/null +++ b/app/controllers/news_controller.rb @@ -0,0 +1,101 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class NewsController < ApplicationController + default_search_scope :news + model_object News + before_action :find_model_object, :except => [:new, :create, :index] + before_action :find_project_from_association, :except => [:new, :create, :index] + before_action :find_project_by_project_id, :only => [:new, :create] + before_action :authorize, :except => [:index] + before_action :find_optional_project, :only => :index + accept_rss_auth :index + accept_api_auth :index + + helper :watchers + helper :attachments + + def index + case params[:format] + when 'xml', 'json' + @offset, @limit = api_offset_and_limit + else + @limit = 10 + end + + scope = @project ? @project.news.visible : News.visible + + @news_count = scope.count + @news_pages = Paginator.new @news_count, @limit, params['page'] + @offset ||= @news_pages.offset + @newss = scope.includes([:author, :project]). + order("#{News.table_name}.created_on DESC"). + limit(@limit). + offset(@offset). + to_a + respond_to do |format| + format.html { + @news = News.new # for adding news inline + render :layout => false if request.xhr? + } + format.api + format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") } + end + end + + def show + @comments = @news.comments.to_a + @comments.reverse! if User.current.wants_comments_in_reverse_order? + end + + def new + @news = News.new(:project => @project, :author => User.current) + end + + def create + @news = News.new(:project => @project, :author => User.current) + @news.safe_attributes = params[:news] + @news.save_attachments(params[:attachments]) + if @news.save + render_attachment_warning_if_needed(@news) + flash[:notice] = l(:notice_successful_create) + redirect_to project_news_index_path(@project) + else + render :action => 'new' + end + end + + def edit + end + + def update + @news.safe_attributes = params[:news] + @news.save_attachments(params[:attachments]) + if @news.save + render_attachment_warning_if_needed(@news) + flash[:notice] = l(:notice_successful_update) + redirect_to news_path(@news) + else + render :action => 'edit' + end + end + + def destroy + @news.destroy + redirect_to project_news_index_path(@project) + end +end diff --git a/app/controllers/previews_controller.rb b/app/controllers/previews_controller.rb new file mode 100644 index 0000000..37cdc46 --- /dev/null +++ b/app/controllers/previews_controller.rb @@ -0,0 +1,53 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class PreviewsController < ApplicationController + before_action :find_project, :find_attachments + + def issue + @issue = Issue.visible.find_by_id(params[:id]) unless params[:id].blank? + if @issue + @description = params[:issue] && params[:issue][:description] + if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n") + @description = nil + end + @notes = params[:journal] ? params[:journal][:notes] : nil + @notes ||= params[:issue] ? params[:issue][:notes] : nil + else + @description = (params[:issue] ? params[:issue][:description] : nil) + end + render :layout => false + end + + def news + if params[:id].present? && news = News.visible.find_by_id(params[:id]) + @previewed = news + end + @text = (params[:news] ? params[:news][:description] : nil) + render :partial => 'common/preview' + end + + private + + def find_project + project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] + @project = Project.find(project_id) + rescue ActiveRecord::RecordNotFound + render_404 + end + +end diff --git a/app/controllers/principal_memberships_controller.rb b/app/controllers/principal_memberships_controller.rb new file mode 100644 index 0000000..924ecbd --- /dev/null +++ b/app/controllers/principal_memberships_controller.rb @@ -0,0 +1,85 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class PrincipalMembershipsController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin + before_action :find_principal, :only => [:new, :create] + before_action :find_membership, :only => [:edit, :update, :destroy] + + def new + @projects = Project.active.all + @roles = Role.find_all_givable + respond_to do |format| + format.html + format.js + end + end + + def create + @members = Member.create_principal_memberships(@principal, params[:membership]) + respond_to do |format| + format.html { redirect_to_principal @principal } + format.js + end + end + + def edit + @roles = Role.givable.to_a + end + + def update + @membership.attributes = params.require(:membership).permit(:role_ids => []) + @membership.save + respond_to do |format| + format.html { redirect_to_principal @principal } + format.js + end + end + + def destroy + if @membership.deletable? + @membership.destroy + end + respond_to do |format| + format.html { redirect_to_principal @principal } + format.js + end + end + + private + + def find_principal + principal_id = params[:user_id] || params[:group_id] + @principal = Principal.find(principal_id) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_membership + @membership = Member.find(params[:id]) + @principal = @membership.principal + rescue ActiveRecord::RecordNotFound + render_404 + end + + def redirect_to_principal(principal) + redirect_to edit_polymorphic_path(principal, :tab => 'memberships') + end +end diff --git a/app/controllers/project_enumerations_controller.rb b/app/controllers/project_enumerations_controller.rb new file mode 100644 index 0000000..f68d948 --- /dev/null +++ b/app/controllers/project_enumerations_controller.rb @@ -0,0 +1,44 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ProjectEnumerationsController < ApplicationController + before_action :find_project_by_project_id + before_action :authorize + + def update + if params[:enumerations] + saved = Project.transaction do + params[:enumerations].each do |id, activity| + @project.update_or_create_time_entry_activity(id, activity) + end + end + if saved + flash[:notice] = l(:notice_successful_update) + end + end + + redirect_to settings_project_path(@project, :tab => 'activities') + end + + def destroy + @project.time_entry_activities.each do |time_entry_activity| + time_entry_activity.destroy(time_entry_activity.parent) + end + flash[:notice] = l(:notice_successful_update) + redirect_to settings_project_path(@project, :tab => 'activities') + end +end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb new file mode 100644 index 0000000..3e3fc69 --- /dev/null +++ b/app/controllers/projects_controller.rb @@ -0,0 +1,250 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ProjectsController < ApplicationController + menu_item :overview + menu_item :settings, :only => :settings + menu_item :projects, :only => [:index, :new, :copy, :create] + + before_action :find_project, :except => [ :index, :autocomplete, :list, :new, :create, :copy ] + before_action :authorize, :except => [ :index, :autocomplete, :list, :new, :create, :copy, :archive, :unarchive, :destroy] + before_action :authorize_global, :only => [:new, :create] + before_action :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ] + accept_rss_auth :index + accept_api_auth :index, :show, :create, :update, :destroy + require_sudo_mode :destroy + + helper :custom_fields + helper :issues + helper :queries + helper :repositories + helper :members + + # Lists visible projects + def index + # try to redirect to the requested menu item + if params[:jump] && redirect_to_menu_item(params[:jump]) + return + end + + scope = Project.visible.sorted + + respond_to do |format| + format.html { + unless params[:closed] + scope = scope.active + end + @projects = scope.to_a + } + format.api { + @offset, @limit = api_offset_and_limit + @project_count = scope.count + @projects = scope.offset(@offset).limit(@limit).to_a + } + format.atom { + projects = scope.reorder(:created_on => :desc).limit(Setting.feeds_limit.to_i).to_a + render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}") + } + end + end + + def autocomplete + respond_to do |format| + format.js { + if params[:q].present? + @projects = Project.visible.like(params[:q]).to_a + else + @projects = User.current.projects.to_a + end + } + end + end + + def new + @issue_custom_fields = IssueCustomField.sorted.to_a + @trackers = Tracker.sorted.to_a + @project = Project.new + @project.safe_attributes = params[:project] + end + + def create + @issue_custom_fields = IssueCustomField.sorted.to_a + @trackers = Tracker.sorted.to_a + @project = Project.new + @project.safe_attributes = params[:project] + + if @project.save + unless User.current.admin? + @project.add_default_member(User.current) + end + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_create) + if params[:continue] + attrs = {:parent_id => @project.parent_id}.reject {|k,v| v.nil?} + redirect_to new_project_path(attrs) + else + redirect_to settings_project_path(@project) + end + } + format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) } + end + else + respond_to do |format| + format.html { render :action => 'new' } + format.api { render_validation_errors(@project) } + end + end + end + + def copy + @issue_custom_fields = IssueCustomField.sorted.to_a + @trackers = Tracker.sorted.to_a + @source_project = Project.find(params[:id]) + if request.get? + @project = Project.copy_from(@source_project) + @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers? + else + Mailer.with_deliveries(params[:notifications] == '1') do + @project = Project.new + @project.safe_attributes = params[:project] + if @project.copy(@source_project, :only => params[:only]) + flash[:notice] = l(:notice_successful_create) + redirect_to settings_project_path(@project) + elsif !@project.new_record? + # Project was created + # But some objects were not copied due to validation failures + # (eg. issues from disabled trackers) + # TODO: inform about that + redirect_to settings_project_path(@project) + end + end + end + rescue ActiveRecord::RecordNotFound + # source_project not found + render_404 + end + + # Show @project + def show + # try to redirect to the requested menu item + if params[:jump] && redirect_to_project_menu_item(@project, params[:jump]) + return + end + + @users_by_role = @project.users_by_role + @subprojects = @project.children.visible.to_a + @news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a + @trackers = @project.rolled_up_trackers.visible + + cond = @project.project_condition(Setting.display_subprojects_issues?) + + @open_issues_by_tracker = Issue.visible.open.where(cond).group(:tracker).count + @total_issues_by_tracker = Issue.visible.where(cond).group(:tracker).count + + if User.current.allowed_to_view_all_time_entries?(@project) + @total_hours = TimeEntry.visible.where(cond).sum(:hours).to_f + end + + @key = User.current.rss_key + + respond_to do |format| + format.html + format.api + end + end + + def settings + @issue_custom_fields = IssueCustomField.sorted.to_a + @issue_category ||= IssueCategory.new + @member ||= @project.members.new + @trackers = Tracker.sorted.to_a + + @version_status = params[:version_status] || 'open' + @version_name = params[:version_name] + @versions = @project.shared_versions.status(@version_status).like(@version_name) + @wiki ||= @project.wiki || Wiki.new(:project => @project) + end + + def edit + end + + def update + @project.safe_attributes = params[:project] + if @project.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to settings_project_path(@project) + } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { + settings + render :action => 'settings' + } + format.api { render_validation_errors(@project) } + end + end + end + + def modules + @project.enabled_module_names = params[:enabled_module_names] + flash[:notice] = l(:notice_successful_update) + redirect_to settings_project_path(@project, :tab => 'modules') + end + + def archive + unless @project.archive + flash[:error] = l(:error_can_not_archive_project) + end + redirect_to_referer_or admin_projects_path(:status => params[:status]) + end + + def unarchive + unless @project.active? + @project.unarchive + end + redirect_to_referer_or admin_projects_path(:status => params[:status]) + end + + def close + @project.close + redirect_to project_path(@project) + end + + def reopen + @project.reopen + redirect_to project_path(@project) + end + + # Delete @project + def destroy + @project_to_destroy = @project + if api_request? || params[:confirm] + @project_to_destroy.destroy + respond_to do |format| + format.html { redirect_to admin_projects_path } + format.api { render_api_ok } + end + end + # hide project in layout + @project = nil + end +end diff --git a/app/controllers/queries_controller.rb b/app/controllers/queries_controller.rb new file mode 100644 index 0000000..54f695f --- /dev/null +++ b/app/controllers/queries_controller.rb @@ -0,0 +1,165 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class QueriesController < ApplicationController + menu_item :issues + before_action :find_query, :only => [:edit, :update, :destroy] + before_action :find_optional_project, :only => [:new, :create] + + accept_api_auth :index + + include QueriesHelper + + def index + case params[:format] + when 'xml', 'json' + @offset, @limit = api_offset_and_limit + else + @limit = per_page_option + end + scope = query_class.visible + @query_count = scope.count + @query_pages = Paginator.new @query_count, @limit, params['page'] + @queries = scope. + order("#{Query.table_name}.name"). + limit(@limit). + offset(@offset). + to_a + respond_to do |format| + format.html {render_error :status => 406} + format.api + end + end + + def new + @query = query_class.new + @query.user = User.current + @query.project = @project + @query.build_from_params(params) + end + + def create + @query = query_class.new + @query.user = User.current + @query.project = @project + update_query_from_params + + if @query.save + flash[:notice] = l(:notice_successful_create) + redirect_to_items(:query_id => @query) + else + render :action => 'new', :layout => !request.xhr? + end + end + + def edit + end + + def update + update_query_from_params + + if @query.save + flash[:notice] = l(:notice_successful_update) + redirect_to_items(:query_id => @query) + else + render :action => 'edit' + end + end + + def destroy + @query.destroy + redirect_to_items(:set_filter => 1) + end + + # Returns the values for a query filter + def filter + q = query_class.new + if params[:project_id].present? + q.project = Project.find(params[:project_id]) + end + + unless User.current.allowed_to?(q.class.view_permission, q.project, :global => true) + raise Unauthorized + end + + filter = q.available_filters[params[:name].to_s] + values = filter ? filter.values : [] + + render :json => values + rescue ActiveRecord::RecordNotFound + render_404 + end + + private + + def find_query + @query = Query.find(params[:id]) + @project = @query.project + render_403 unless @query.editable_by?(User.current) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_optional_project + @project = Project.find(params[:project_id]) if params[:project_id] + render_403 unless User.current.allowed_to?(:save_queries, @project, :global => true) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def update_query_from_params + @query.project = params[:query_is_for_all] ? nil : @project + @query.build_from_params(params) + @query.column_names = nil if params[:default_columns] + @query.sort_criteria = params[:query] && params[:query][:sort_criteria] + @query.name = params[:query] && params[:query][:name] + if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin? + @query.visibility = (params[:query] && params[:query][:visibility]) || Query::VISIBILITY_PRIVATE + @query.role_ids = params[:query] && params[:query][:role_ids] + else + @query.visibility = Query::VISIBILITY_PRIVATE + end + @query + end + + def redirect_to_items(options) + method = "redirect_to_#{@query.class.name.underscore}" + send method, options + end + + def redirect_to_issue_query(options) + if params[:gantt] + if @project + redirect_to project_gantt_path(@project, options) + else + redirect_to issues_gantt_path(options) + end + else + redirect_to _project_issues_path(@project, options) + end + end + + def redirect_to_time_entry_query(options) + redirect_to _time_entries_path(@project, nil, options) + end + + # Returns the Query subclass, IssueQuery by default + # for compatibility with previous behaviour + def query_class + Query.get_subclass(params[:type] || 'IssueQuery') + end +end diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb new file mode 100644 index 0000000..08c30ef --- /dev/null +++ b/app/controllers/reports_controller.rb @@ -0,0 +1,89 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ReportsController < ApplicationController + menu_item :issues + before_action :find_project, :authorize, :find_issue_statuses + + def issue_report + @trackers = @project.rolled_up_trackers(false).visible + @versions = @project.shared_versions.sort + @priorities = IssuePriority.all.reverse + @categories = @project.issue_categories + @assignees = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort + @authors = @project.users.sort + @subprojects = @project.descendants.visible + + @issues_by_tracker = Issue.by_tracker(@project) + @issues_by_version = Issue.by_version(@project) + @issues_by_priority = Issue.by_priority(@project) + @issues_by_category = Issue.by_category(@project) + @issues_by_assigned_to = Issue.by_assigned_to(@project) + @issues_by_author = Issue.by_author(@project) + @issues_by_subproject = Issue.by_subproject(@project) || [] + + render :template => "reports/issue_report" + end + + def issue_report_details + case params[:detail] + when "tracker" + @field = "tracker_id" + @rows = @project.rolled_up_trackers(false).visible + @data = Issue.by_tracker(@project) + @report_title = l(:field_tracker) + when "version" + @field = "fixed_version_id" + @rows = @project.shared_versions.sort + @data = Issue.by_version(@project) + @report_title = l(:field_version) + when "priority" + @field = "priority_id" + @rows = IssuePriority.all.reverse + @data = Issue.by_priority(@project) + @report_title = l(:field_priority) + when "category" + @field = "category_id" + @rows = @project.issue_categories + @data = Issue.by_category(@project) + @report_title = l(:field_category) + when "assigned_to" + @field = "assigned_to_id" + @rows = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort + @data = Issue.by_assigned_to(@project) + @report_title = l(:field_assigned_to) + when "author" + @field = "author_id" + @rows = @project.users.sort + @data = Issue.by_author(@project) + @report_title = l(:field_author) + when "subproject" + @field = "project_id" + @rows = @project.descendants.visible + @data = Issue.by_subproject(@project) || [] + @report_title = l(:field_subproject) + else + render_404 + end + end + + private + + def find_issue_statuses + @statuses = IssueStatus.sorted.to_a + end +end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb new file mode 100644 index 0000000..29a3b59 --- /dev/null +++ b/app/controllers/repositories_controller.rb @@ -0,0 +1,439 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'SVG/Graph/Bar' +require 'SVG/Graph/BarHorizontal' +require 'digest/sha1' +require 'redmine/scm/adapters' + +class ChangesetNotFound < Exception; end +class InvalidRevisionParam < Exception; end + +class RepositoriesController < ApplicationController + menu_item :repository + menu_item :settings, :only => [:new, :create, :edit, :update, :destroy, :committers] + default_search_scope :changesets + + before_action :find_project_by_project_id, :only => [:new, :create] + before_action :build_new_repository_from_params, :only => [:new, :create] + before_action :find_repository, :only => [:edit, :update, :destroy, :committers] + before_action :find_project_repository, :except => [:new, :create, :edit, :update, :destroy, :committers] + before_action :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] + before_action :authorize + accept_rss_auth :revisions + + rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed + + def new + @repository.is_default = @project.repository.nil? + end + + def create + if @repository.save + redirect_to settings_project_path(@project, :tab => 'repositories') + else + render :action => 'new' + end + end + + def edit + end + + def update + @repository.safe_attributes = params[:repository] + if @repository.save + redirect_to settings_project_path(@project, :tab => 'repositories') + else + render :action => 'edit' + end + end + + def committers + @committers = @repository.committers + @users = @project.users.to_a + additional_user_ids = @committers.collect(&:last).collect(&:to_i) - @users.collect(&:id) + @users += User.where(:id => additional_user_ids).to_a unless additional_user_ids.empty? + @users.compact! + @users.sort! + if request.post? && params[:committers].present? + # Build a hash with repository usernames as keys and corresponding user ids as values + @repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h} + flash[:notice] = l(:notice_successful_update) + redirect_to settings_project_path(@project, :tab => 'repositories') + end + end + + def destroy + @repository.destroy if request.delete? + redirect_to settings_project_path(@project, :tab => 'repositories') + end + + def show + @repository.fetch_changesets if @project.active? && Setting.autofetch_changesets? && @path.empty? + + @entries = @repository.entries(@path, @rev) + @changeset = @repository.find_changeset_by_name(@rev) + if request.xhr? + @entries ? render(:partial => 'dir_list_content') : head(200) + else + (show_error_not_found; return) unless @entries + @changesets = @repository.latest_changesets(@path, @rev) + @properties = @repository.properties(@path, @rev) + @repositories = @project.repositories + render :action => 'show' + end + end + + alias_method :browse, :show + + def changes + @entry = @repository.entry(@path, @rev) + (show_error_not_found; return) unless @entry + @changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i) + @properties = @repository.properties(@path, @rev) + @changeset = @repository.find_changeset_by_name(@rev) + end + + def revisions + @changeset_count = @repository.changesets.count + @changeset_pages = Paginator.new @changeset_count, + per_page_option, + params['page'] + @changesets = @repository.changesets. + limit(@changeset_pages.per_page). + offset(@changeset_pages.offset). + includes(:user, :repository, :parents). + to_a + + respond_to do |format| + format.html { render :layout => false if request.xhr? } + format.atom { render_feed(@changesets, :title => "#{@project.name}: #{l(:label_revision_plural)}") } + end + end + + def raw + entry_and_raw(true) + end + + def entry + entry_and_raw(false) + end + + def entry_and_raw(is_raw) + @entry = @repository.entry(@path, @rev) + (show_error_not_found; return) unless @entry + + # If the entry is a dir, show the browser + (show; return) if @entry.is_dir? + + if is_raw + # Force the download + send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) } + send_type = Redmine::MimeType.of(@path) + send_opt[:type] = send_type.to_s if send_type + send_opt[:disposition] = disposition(@path) + send_data @repository.cat(@path, @rev), send_opt + else + if !@entry.size || @entry.size <= Setting.file_max_size_displayed.to_i.kilobyte + content = @repository.cat(@path, @rev) + (show_error_not_found; return) unless content + + if content.size <= Setting.file_max_size_displayed.to_i.kilobyte && + is_entry_text_data?(content, @path) + # TODO: UTF-16 + # Prevent empty lines when displaying a file with Windows style eol + # Is this needed? AttachmentsController simply reads file. + @content = content.gsub("\r\n", "\n") + end + end + @changeset = @repository.find_changeset_by_name(@rev) + end + end + private :entry_and_raw + + def is_entry_text_data?(ent, path) + # UTF-16 contains "\x00". + # It is very strict that file contains less than 30% of ascii symbols + # in non Western Europe. + return true if Redmine::MimeType.is_type?('text', path) + # Ruby 1.8.6 has a bug of integer divisions. + # http://apidock.com/ruby/v1_8_6_287/String/is_binary_data%3F + return false if Redmine::Scm::Adapters::ScmData.binary?(ent) + true + end + private :is_entry_text_data? + + def annotate + @entry = @repository.entry(@path, @rev) + (show_error_not_found; return) unless @entry + + @annotate = @repository.scm.annotate(@path, @rev) + if @annotate.nil? || @annotate.empty? + @annotate = nil + @error_message = l(:error_scm_annotate) + else + ann_buf_size = 0 + @annotate.lines.each do |buf| + ann_buf_size += buf.size + end + if ann_buf_size > Setting.file_max_size_displayed.to_i.kilobyte + @annotate = nil + @error_message = l(:error_scm_annotate_big_text_file) + end + end + @changeset = @repository.find_changeset_by_name(@rev) + end + + def revision + respond_to do |format| + format.html + format.js {render :layout => false} + end + end + + # Adds a related issue to a changeset + # POST /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues + def add_related_issue + issue_id = params[:issue_id].to_s.sub(/^#/,'') + @issue = @changeset.find_referenced_issue_by_id(issue_id) + if @issue && (!@issue.visible? || @changeset.issues.include?(@issue)) + @issue = nil + end + + if @issue + @changeset.issues << @issue + end + end + + # Removes a related issue from a changeset + # DELETE /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues/:issue_id + def remove_related_issue + @issue = Issue.visible.find_by_id(params[:issue_id]) + if @issue + @changeset.issues.delete(@issue) + end + end + + def diff + if params[:format] == 'diff' + @diff = @repository.diff(@path, @rev, @rev_to) + (show_error_not_found; return) unless @diff + filename = "changeset_r#{@rev}" + filename << "_r#{@rev_to}" if @rev_to + send_data @diff.join, :filename => "#{filename}.diff", + :type => 'text/x-patch', + :disposition => 'attachment' + else + @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' + @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) + + # Save diff type as user preference + if User.current.logged? && @diff_type != User.current.pref[:diff_type] + User.current.pref[:diff_type] = @diff_type + User.current.preference.save + end + @cache_key = "repositories/diff/#{@repository.id}/" + + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}-#{current_language}") + unless read_fragment(@cache_key) + @diff = @repository.diff(@path, @rev, @rev_to) + show_error_not_found unless @diff + end + + @changeset = @repository.find_changeset_by_name(@rev) + @changeset_to = @rev_to ? @repository.find_changeset_by_name(@rev_to) : nil + @diff_format_revisions = @repository.diff_format_revisions(@changeset, @changeset_to) + end + end + + def stats + end + + def graph + data = nil + case params[:graph] + when "commits_per_month" + data = graph_commits_per_month(@repository) + when "commits_per_author" + data = graph_commits_per_author(@repository) + end + if data + headers["Content-Type"] = "image/svg+xml" + send_data(data, :type => "image/svg+xml", :disposition => "inline") + else + render_404 + end + end + + private + + def build_new_repository_from_params + scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first + unless @repository = Repository.factory(scm) + render_404 + return + end + + @repository.project = @project + @repository.safe_attributes = params[:repository] + @repository + end + + def find_repository + @repository = Repository.find(params[:id]) + @project = @repository.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i + + def find_project_repository + @project = Project.find(params[:id]) + if params[:repository_id].present? + @repository = @project.repositories.find_by_identifier_param(params[:repository_id]) + else + @repository = @project.repository + end + (render_404; return false) unless @repository + @path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s + @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].to_s.strip + @rev_to = params[:rev_to] + + unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE) + if @repository.branches.blank? + raise InvalidRevisionParam + end + end + rescue ActiveRecord::RecordNotFound + render_404 + rescue InvalidRevisionParam + show_error_not_found + end + + def find_changeset + if @rev.present? + @changeset = @repository.find_changeset_by_name(@rev) + end + show_error_not_found unless @changeset + end + + def show_error_not_found + render_error :message => l(:error_scm_not_found), :status => 404 + end + + # Handler for Redmine::Scm::Adapters::CommandFailed exception + def show_error_command_failed(exception) + render_error l(:error_scm_command_failed, exception.message) + end + + def graph_commits_per_month(repository) + @date_to = User.current.today + @date_from = @date_to << 11 + @date_from = Date.civil(@date_from.year, @date_from.month, 1) + commits_by_day = Changeset. + where("repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to). + group(:commit_date). + count + commits_by_month = [0] * 12 + commits_by_day.each {|c| commits_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } + + changes_by_day = Change. + joins(:changeset). + where("#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to). + group(:commit_date). + count + changes_by_month = [0] * 12 + changes_by_day.each {|c| changes_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } + + fields = [] + today = User.current.today + 12.times {|m| fields << month_name(((today.month - 1 - m) % 12) + 1)} + + graph = SVG::Graph::Bar.new( + :height => 300, + :width => 800, + :fields => fields.reverse, + :stack => :side, + :scale_integers => true, + :step_x_labels => 2, + :show_data_values => false, + :graph_title => l(:label_commits_per_month), + :show_graph_title => true + ) + + graph.add_data( + :data => commits_by_month[0..11].reverse, + :title => l(:label_revision_plural) + ) + + graph.add_data( + :data => changes_by_month[0..11].reverse, + :title => l(:label_change_plural) + ) + + graph.burn + end + + def graph_commits_per_author(repository) + #data + stats = repository.stats_by_author + fields, commits_data, changes_data = [], [], [] + stats.each do |name, hsh| + fields << name + commits_data << hsh[:commits_count] + changes_data << hsh[:changes_count] + end + + #expand to 10 values if needed + fields = fields + [""]*(10 - fields.length) if fields.length<10 + commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10 + changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10 + + # Remove email address in usernames + fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') } + + #prepare graph + graph = SVG::Graph::BarHorizontal.new( + :height => 30 * commits_data.length, + :width => 800, + :fields => fields, + :stack => :side, + :scale_integers => true, + :show_data_values => false, + :rotate_y_labels => false, + :graph_title => l(:label_commits_per_author), + :show_graph_title => true + ) + graph.add_data( + :data => commits_data, + :title => l(:label_revision_plural) + ) + graph.add_data( + :data => changes_data, + :title => l(:label_change_plural) + ) + graph.burn + end + + def disposition(path) + if Redmine::MimeType.of(@path) == "application/pdf" + 'inline' + else + 'attachment' + end + end +end diff --git a/app/controllers/roles_controller.rb b/app/controllers/roles_controller.rb new file mode 100644 index 0000000..b85c51b --- /dev/null +++ b/app/controllers/roles_controller.rb @@ -0,0 +1,123 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class RolesController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin, :except => [:index, :show] + before_action :require_admin_or_api_request, :only => [:index, :show] + before_action :find_role, :only => [:show, :edit, :update, :destroy] + accept_api_auth :index, :show + + require_sudo_mode :create, :update, :destroy + + def index + respond_to do |format| + format.html { + @roles = Role.sorted.to_a + render :layout => false if request.xhr? + } + format.api { + @roles = Role.givable.to_a + } + end + end + + def show + respond_to do |format| + format.api + end + end + + def new + # Prefills the form with 'Non member' role permissions by default + @role = Role.new + @role.safe_attributes = params[:role] || {:permissions => Role.non_member.permissions} + if params[:copy].present? && @copy_from = Role.find_by_id(params[:copy]) + @role.copy_from(@copy_from) + end + @roles = Role.sorted.to_a + end + + def create + @role = Role.new + @role.safe_attributes = params[:role] + if request.post? && @role.save + # workflow copy + if !params[:copy_workflow_from].blank? && (copy_from = Role.find_by_id(params[:copy_workflow_from])) + @role.copy_workflow_rules(copy_from) + end + flash[:notice] = l(:notice_successful_create) + redirect_to roles_path + else + @roles = Role.sorted.to_a + render :action => 'new' + end + end + + def edit + end + + def update + @role.safe_attributes = params[:role] + if @role.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to roles_path(:page => params[:page]) + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.js { head 422 } + end + end + end + + def destroy + begin + @role.destroy + rescue + flash[:error] = l(:error_can_not_remove_role) + end + redirect_to roles_path + end + + def permissions + @roles = Role.sorted.to_a + @permissions = Redmine::AccessControl.permissions.select { |p| !p.public? } + if request.post? + @roles.each do |role| + role.permissions = params[:permissions][role.id.to_s] + role.save + end + flash[:notice] = l(:notice_successful_update) + redirect_to roles_path + end + end + + private + + def find_role + @role = Role.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb new file mode 100644 index 0000000..ce9e21f --- /dev/null +++ b/app/controllers/search_controller.rb @@ -0,0 +1,99 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class SearchController < ApplicationController + before_action :find_optional_project + accept_api_auth :index + + def index + @question = params[:q] || "" + @question.strip! + @all_words = params[:all_words] ? params[:all_words].present? : true + @titles_only = params[:titles_only] ? params[:titles_only].present? : false + @search_attachments = params[:attachments].presence || '0' + @open_issues = params[:open_issues] ? params[:open_issues].present? : false + + case params[:format] + when 'xml', 'json' + @offset, @limit = api_offset_and_limit + else + @offset = nil + @limit = Setting.search_results_per_page.to_i + @limit = 10 if @limit == 0 + end + + # quick jump to an issue + if !api_request? && (m = @question.match(/^#?(\d+)$/)) && (issue = Issue.visible.find_by_id(m[1].to_i)) + redirect_to issue_path(issue) + return + end + + projects_to_search = + case params[:scope] + when 'all' + nil + when 'my_projects' + User.current.projects + when 'subprojects' + @project ? (@project.self_and_descendants.to_a) : nil + else + @project + end + + @object_types = Redmine::Search.available_search_types.dup + if projects_to_search.is_a? Project + # don't search projects + @object_types.delete('projects') + # only show what the user is allowed to view + @object_types = @object_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, projects_to_search)} + end + + @scope = @object_types.select {|t| params[t]} + @scope = @object_types if @scope.empty? + + fetcher = Redmine::Search::Fetcher.new( + @question, User.current, @scope, projects_to_search, + :all_words => @all_words, :titles_only => @titles_only, :attachments => @search_attachments, :open_issues => @open_issues, + :cache => params[:page].present?, :params => params + ) + + if fetcher.tokens.present? + @result_count = fetcher.result_count + @result_count_by_type = fetcher.result_count_by_type + @tokens = fetcher.tokens + + @result_pages = Paginator.new @result_count, @limit, params['page'] + @offset ||= @result_pages.offset + @results = fetcher.results(@offset, @result_pages.per_page) + else + @question = "" + end + respond_to do |format| + format.html { render :layout => false if request.xhr? } + format.api { @results ||= []; render :layout => false } + end + end + +private + def find_optional_project + return true unless params[:id] + @project = Project.find(params[:id]) + check_project_privacy + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb new file mode 100644 index 0000000..7b2dceb --- /dev/null +++ b/app/controllers/settings_controller.rb @@ -0,0 +1,81 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class SettingsController < ApplicationController + layout 'admin' + self.main_menu = false + menu_item :plugins, :only => :plugin + + helper :queries + + before_action :require_admin + + require_sudo_mode :index, :edit, :plugin + + def index + edit + render :action => 'edit' + end + + def edit + @notifiables = Redmine::Notifiable.all + if request.post? + errors = Setting.set_all_from_params(params[:settings]) + if errors.blank? + flash[:notice] = l(:notice_successful_update) + redirect_to settings_path(:tab => params[:tab]) + return + else + @setting_errors = errors + # render the edit form with error messages + end + end + + @options = {} + user_format = User::USER_FORMATS.collect{|key, value| [key, value[:setting_order]]}.sort{|a, b| a[1] <=> b[1]} + @options[:user_format] = user_format.collect{|f| [User.current.name(f[0]), f[0].to_s]} + @deliveries = ActionMailer::Base.perform_deliveries + + @guessed_host_and_path = request.host_with_port.dup + @guessed_host_and_path << ('/'+ Redmine::Utils.relative_url_root.gsub(%r{^\/}, '')) unless Redmine::Utils.relative_url_root.blank? + + @commit_update_keywords = Setting.commit_update_keywords.dup + @commit_update_keywords = [{}] unless @commit_update_keywords.is_a?(Array) && @commit_update_keywords.any? + + Redmine::Themes.rescan + end + + def plugin + @plugin = Redmine::Plugin.find(params[:id]) + unless @plugin.configurable? + render_404 + return + end + + if request.post? + setting = params[:settings] ? params[:settings].permit!.to_h : {} + Setting.send "plugin_#{@plugin.id}=", setting + flash[:notice] = l(:notice_successful_update) + redirect_to plugin_settings_path(@plugin) + else + @partial = @plugin.settings[:partial] + @settings = Setting.send "plugin_#{@plugin.id}" + end + rescue Redmine::PluginNotFound + render_404 + end +end diff --git a/app/controllers/sys_controller.rb b/app/controllers/sys_controller.rb new file mode 100644 index 0000000..bd8238a --- /dev/null +++ b/app/controllers/sys_controller.rb @@ -0,0 +1,82 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class SysController < ActionController::Base + before_action :check_enabled + + def projects + p = Project.active.has_module(:repository). + order("#{Project.table_name}.identifier").preload(:repository).to_a + # extra_info attribute from repository breaks activeresource client + render :json => p.to_json( + :only => [:id, :identifier, :name, :is_public, :status], + :include => {:repository => {:only => [:id, :url]}} + ) + end + + def create_project_repository + project = Project.find(params[:id]) + if project.repository + head 409 + else + logger.info "Repository for #{project.name} was reported to be created by #{request.remote_ip}." + repository = Repository.factory(params[:vendor]) + repository.safe_attributes = params[:repository] + repository.project = project + if repository.save + render :json => {repository.class.name.underscore.gsub('/', '-') => {:id => repository.id, :url => repository.url}}, :status => 201 + else + head 422 + end + end + end + + def fetch_changesets + projects = [] + scope = Project.active.has_module(:repository) + if params[:id] + project = nil + if params[:id].to_s =~ /^\d*$/ + project = scope.find(params[:id]) + else + project = scope.find_by_identifier(params[:id]) + end + raise ActiveRecord::RecordNotFound unless project + projects << project + else + projects = scope.to_a + end + projects.each do |project| + project.repositories.each do |repository| + repository.fetch_changesets + end + end + head 200 + rescue ActiveRecord::RecordNotFound + head 404 + end + + protected + + def check_enabled + User.current = nil + unless Setting.sys_api_enabled? && params[:key].to_s == Setting.sys_api_key + render :plain => 'Access denied. Repository management WS is disabled or key is invalid.', :status => 403 + return false + end + end +end diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb new file mode 100644 index 0000000..df6b618 --- /dev/null +++ b/app/controllers/timelog_controller.rb @@ -0,0 +1,286 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TimelogController < ApplicationController + menu_item :time_entries + + before_action :find_time_entry, :only => [:show, :edit, :update] + before_action :check_editability, :only => [:edit, :update] + before_action :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy] + before_action :authorize, :only => [:show, :edit, :update, :bulk_edit, :bulk_update, :destroy] + + before_action :find_optional_issue, :only => [:new, :create] + before_action :find_optional_project, :only => [:index, :report] + before_action :authorize_global, :only => [:new, :create, :index, :report] + + accept_rss_auth :index + accept_api_auth :index, :show, :create, :update, :destroy + + rescue_from Query::StatementInvalid, :with => :query_statement_invalid + + helper :issues + include TimelogHelper + helper :custom_fields + include CustomFieldsHelper + helper :queries + include QueriesHelper + + def index + retrieve_time_entry_query + scope = time_entry_scope. + preload(:issue => [:project, :tracker, :status, :assigned_to, :priority]). + preload(:project, :user) + + respond_to do |format| + format.html { + @entry_count = scope.count + @entry_pages = Paginator.new @entry_count, per_page_option, params['page'] + @entries = scope.offset(@entry_pages.offset).limit(@entry_pages.per_page).to_a + + render :layout => !request.xhr? + } + format.api { + @entry_count = scope.count + @offset, @limit = api_offset_and_limit + @entries = scope.offset(@offset).limit(@limit).preload(:custom_values => :custom_field).to_a + } + format.atom { + entries = scope.limit(Setting.feeds_limit.to_i).reorder("#{TimeEntry.table_name}.created_on DESC").to_a + render_feed(entries, :title => l(:label_spent_time)) + } + format.csv { + # Export all entries + @entries = scope.to_a + send_data(query_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv') + } + end + end + + def report + retrieve_time_entry_query + scope = time_entry_scope + + @report = Redmine::Helpers::TimeReport.new(@project, @issue, params[:criteria], params[:columns], scope) + + respond_to do |format| + format.html { render :layout => !request.xhr? } + format.csv { send_data(report_to_csv(@report), :type => 'text/csv; header=present', :filename => 'timelog.csv') } + end + end + + def show + respond_to do |format| + # TODO: Implement html response + format.html { head 406 } + format.api + end + end + + def new + @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) + @time_entry.safe_attributes = params[:time_entry] + end + + def create + @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today) + @time_entry.safe_attributes = params[:time_entry] + if @time_entry.project && !User.current.allowed_to?(:log_time, @time_entry.project) + render_403 + return + end + + call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) + + if @time_entry.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_create) + if params[:continue] + options = { + :time_entry => { + :project_id => params[:time_entry][:project_id], + :issue_id => @time_entry.issue_id, + :spent_on => @time_entry.spent_on, + :activity_id => @time_entry.activity_id + }, + :back_url => params[:back_url] + } + if params[:project_id] && @time_entry.project + redirect_to new_project_time_entry_path(@time_entry.project, options) + elsif params[:issue_id] && @time_entry.issue + redirect_to new_issue_time_entry_path(@time_entry.issue, options) + else + redirect_to new_time_entry_path(options) + end + else + redirect_back_or_default project_time_entries_path(@time_entry.project) + end + } + format.api { render :action => 'show', :status => :created, :location => time_entry_url(@time_entry) } + end + else + respond_to do |format| + format.html { render :action => 'new' } + format.api { render_validation_errors(@time_entry) } + end + end + end + + def edit + @time_entry.safe_attributes = params[:time_entry] + end + + def update + @time_entry.safe_attributes = params[:time_entry] + + call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) + + if @time_entry.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_back_or_default project_time_entries_path(@time_entry.project) + } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.api { render_validation_errors(@time_entry) } + end + end + end + + def bulk_edit + @available_activities = @projects.map(&:activities).reduce(:&) + @custom_fields = TimeEntry.first.available_custom_fields.select {|field| field.format.bulk_edit_supported} + end + + def bulk_update + attributes = parse_params_for_bulk_update(params[:time_entry]) + + unsaved_time_entries = [] + saved_time_entries = [] + + @time_entries.each do |time_entry| + time_entry.reload + time_entry.safe_attributes = attributes + call_hook(:controller_time_entries_bulk_edit_before_save, { :params => params, :time_entry => time_entry }) + if time_entry.save + saved_time_entries << time_entry + else + unsaved_time_entries << time_entry + end + end + + if unsaved_time_entries.empty? + flash[:notice] = l(:notice_successful_update) unless saved_time_entries.empty? + redirect_back_or_default project_time_entries_path(@projects.first) + else + @saved_time_entries = @time_entries + @unsaved_time_entries = unsaved_time_entries + @time_entries = TimeEntry.where(:id => unsaved_time_entries.map(&:id)). + preload(:project => :time_entry_activities). + preload(:user).to_a + + bulk_edit + render :action => 'bulk_edit' + end + end + + def destroy + destroyed = TimeEntry.transaction do + @time_entries.each do |t| + unless t.destroy && t.destroyed? + raise ActiveRecord::Rollback + end + end + end + + respond_to do |format| + format.html { + if destroyed + flash[:notice] = l(:notice_successful_delete) + else + flash[:error] = l(:notice_unable_delete_time_entry) + end + redirect_back_or_default project_time_entries_path(@projects.first), :referer => true + } + format.api { + if destroyed + render_api_ok + else + render_validation_errors(@time_entries) + end + } + end + end + +private + def find_time_entry + @time_entry = TimeEntry.find(params[:id]) + @project = @time_entry.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + def check_editability + unless @time_entry.editable_by?(User.current) + render_403 + return false + end + end + + def find_time_entries + @time_entries = TimeEntry.where(:id => params[:id] || params[:ids]). + preload(:project => :time_entry_activities). + preload(:user).to_a + + raise ActiveRecord::RecordNotFound if @time_entries.empty? + raise Unauthorized unless @time_entries.all? {|t| t.editable_by?(User.current)} + @projects = @time_entries.collect(&:project).compact.uniq + @project = @projects.first if @projects.size == 1 + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_optional_issue + if params[:issue_id].present? + @issue = Issue.find(params[:issue_id]) + @project = @issue.project + else + find_optional_project + end + end + + def find_optional_project + if params[:project_id].present? + @project = Project.find(params[:project_id]) + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Returns the TimeEntry scope for index and report actions + def time_entry_scope(options={}) + @query.results_scope(options) + end + + def retrieve_time_entry_query + retrieve_query(TimeEntryQuery, false) + end +end diff --git a/app/controllers/trackers_controller.rb b/app/controllers/trackers_controller.rb new file mode 100644 index 0000000..caf6b11 --- /dev/null +++ b/app/controllers/trackers_controller.rb @@ -0,0 +1,111 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TrackersController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin, :except => :index + before_action :require_admin_or_api_request, :only => :index + accept_api_auth :index + + def index + @trackers = Tracker.sorted.to_a + respond_to do |format| + format.html { render :layout => false if request.xhr? } + format.api + end + end + + def new + @tracker ||= Tracker.new + @tracker.safe_attributes = params[:tracker] + @trackers = Tracker.sorted.to_a + @projects = Project.all + end + + def create + @tracker = Tracker.new + @tracker.safe_attributes = params[:tracker] + if @tracker.save + # workflow copy + if !params[:copy_workflow_from].blank? && (copy_from = Tracker.find_by_id(params[:copy_workflow_from])) + @tracker.copy_workflow_rules(copy_from) + end + flash[:notice] = l(:notice_successful_create) + redirect_to trackers_path + return + end + new + render :action => 'new' + end + + def edit + @tracker ||= Tracker.find(params[:id]) + @projects = Project.all + end + + def update + @tracker = Tracker.find(params[:id]) + @tracker.safe_attributes = params[:tracker] + if @tracker.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to trackers_path(:page => params[:page]) + } + format.js { head 200 } + end + else + respond_to do |format| + format.html { + edit + render :action => 'edit' + } + format.js { head 422 } + end + end + end + + def destroy + @tracker = Tracker.find(params[:id]) + unless @tracker.issues.empty? + flash[:error] = l(:error_can_not_delete_tracker) + else + @tracker.destroy + end + redirect_to trackers_path + end + + def fields + if request.post? && params[:trackers] + params[:trackers].each do |tracker_id, tracker_params| + tracker = Tracker.find_by_id(tracker_id) + if tracker + tracker.core_fields = tracker_params[:core_fields] + tracker.custom_field_ids = tracker_params[:custom_field_ids] + tracker.save + end + end + flash[:notice] = l(:notice_successful_update) + redirect_to fields_trackers_path + return + end + @trackers = Tracker.sorted.to_a + @custom_fields = IssueCustomField.sorted + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000..0133f97 --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,190 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class UsersController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin, :except => :show + before_action ->{ find_user(false) }, :only => :show + before_action :find_user, :only => [:edit, :update, :destroy] + accept_api_auth :index, :show, :create, :update, :destroy + + helper :sort + include SortHelper + helper :custom_fields + include CustomFieldsHelper + helper :principal_memberships + + require_sudo_mode :create, :update, :destroy + + def index + sort_init 'login', 'asc' + sort_update %w(login firstname lastname admin created_on last_login_on) + + case params[:format] + when 'xml', 'json' + @offset, @limit = api_offset_and_limit + else + @limit = per_page_option + end + + @status = params[:status] || 1 + + scope = User.logged.status(@status).preload(:email_address) + scope = scope.like(params[:name]) if params[:name].present? + scope = scope.in_group(params[:group_id]) if params[:group_id].present? + + @user_count = scope.count + @user_pages = Paginator.new @user_count, @limit, params['page'] + @offset ||= @user_pages.offset + @users = scope.order(sort_clause).limit(@limit).offset(@offset).to_a + + respond_to do |format| + format.html { + @groups = Group.givable.sort + render :layout => !request.xhr? + } + format.api + end + end + + def show + unless @user.visible? + render_404 + return + end + + # show projects based on current user visibility + @memberships = @user.memberships.preload(:roles, :project).where(Project.visible_condition(User.current)).to_a + + respond_to do |format| + format.html { + events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10) + @events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)} + render :layout => 'base' + } + format.api + end + end + + def new + @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) + @user.safe_attributes = params[:user] + @auth_sources = AuthSource.all + end + + def create + @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option, :admin => false) + @user.safe_attributes = params[:user] + @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id + @user.pref.safe_attributes = params[:pref] + + if @user.save + Mailer.account_information(@user, @user.password).deliver if params[:send_information] + + respond_to do |format| + format.html { + flash[:notice] = l(:notice_user_successful_create, :id => view_context.link_to(@user.login, user_path(@user))) + if params[:continue] + attrs = params[:user].slice(:generate_password) + redirect_to new_user_path(:user => attrs) + else + redirect_to edit_user_path(@user) + end + } + format.api { render :action => 'show', :status => :created, :location => user_url(@user) } + end + else + @auth_sources = AuthSource.all + # Clear password input + @user.password = @user.password_confirmation = nil + + respond_to do |format| + format.html { render :action => 'new' } + format.api { render_validation_errors(@user) } + end + end + end + + def edit + @auth_sources = AuthSource.all + @membership ||= Member.new + end + + def update + if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?) + @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] + end + @user.safe_attributes = params[:user] + # Was the account actived ? (do it before User#save clears the change) + was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE]) + # TODO: Similar to My#account + @user.pref.safe_attributes = params[:pref] + + if @user.save + @user.pref.save + + if was_activated + Mailer.account_activated(@user).deliver + elsif @user.active? && params[:send_information] && @user != User.current + Mailer.account_information(@user, @user.password).deliver + end + + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to_referer_or edit_user_path(@user) + } + format.api { render_api_ok } + end + else + @auth_sources = AuthSource.all + @membership ||= Member.new + # Clear password input + @user.password = @user.password_confirmation = nil + + respond_to do |format| + format.html { render :action => :edit } + format.api { render_validation_errors(@user) } + end + end + end + + def destroy + @user.destroy + respond_to do |format| + format.html { redirect_back_or_default(users_path) } + format.api { render_api_ok } + end + end + + private + + def find_user(logged = true) + if params[:id] == 'current' + require_login || return + @user = User.current + elsif logged + @user = User.logged.find(params[:id]) + else + @user = User.find(params[:id]) + end + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb new file mode 100644 index 0000000..a536416 --- /dev/null +++ b/app/controllers/versions_controller.rb @@ -0,0 +1,183 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class VersionsController < ApplicationController + menu_item :roadmap + model_object Version + before_action :find_model_object, :except => [:index, :new, :create, :close_completed] + before_action :find_project_from_association, :except => [:index, :new, :create, :close_completed] + before_action :find_project_by_project_id, :only => [:index, :new, :create, :close_completed] + before_action :authorize + + accept_api_auth :index, :show, :create, :update, :destroy + + helper :custom_fields + helper :projects + + def index + respond_to do |format| + format.html { + @trackers = @project.trackers.sorted.to_a + retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?}) + @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') + project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] + + @versions = @project.shared_versions.preload(:custom_values) + @versions += @project.rolled_up_versions.visible.preload(:custom_values) if @with_subprojects + @versions = @versions.to_a.uniq.sort + unless params[:completed] + @completed_versions = @versions.select(&:completed?).reverse + @versions -= @completed_versions + end + + @issues_by_version = {} + if @selected_tracker_ids.any? && @versions.any? + issues = Issue.visible. + includes(:project, :tracker). + preload(:status, :priority, :fixed_version). + where(:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)). + order("#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id") + @issues_by_version = issues.group_by(&:fixed_version) + end + @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} + } + format.api { + @versions = @project.shared_versions.to_a + } + end + end + + def show + respond_to do |format| + format.html { + @issues = @version.fixed_issues.visible. + includes(:status, :tracker, :priority). + preload(:project). + reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id"). + to_a + } + format.api + end + end + + def new + @version = @project.versions.build + @version.safe_attributes = params[:version] + + respond_to do |format| + format.html + format.js + end + end + + def create + @version = @project.versions.build + if params[:version] + attributes = params[:version].dup + attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) + @version.safe_attributes = attributes + end + + if request.post? + if @version.save + respond_to do |format| + format.html do + flash[:notice] = l(:notice_successful_create) + redirect_back_or_default settings_project_path(@project, :tab => 'versions') + end + format.js + format.api do + render :action => 'show', :status => :created, :location => version_url(@version) + end + end + else + respond_to do |format| + format.html { render :action => 'new' } + format.js { render :action => 'new' } + format.api { render_validation_errors(@version) } + end + end + end + end + + def edit + end + + def update + if params[:version] + attributes = params[:version].dup + attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) + @version.safe_attributes = attributes + if @version.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_back_or_default settings_project_path(@project, :tab => 'versions') + } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.api { render_validation_errors(@version) } + end + end + end + end + + def close_completed + if request.put? + @project.close_completed_versions + end + redirect_to settings_project_path(@project, :tab => 'versions') + end + + def destroy + if @version.deletable? + @version.destroy + respond_to do |format| + format.html { redirect_back_or_default settings_project_path(@project, :tab => 'versions') } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { + flash[:error] = l(:notice_unable_delete_version) + redirect_to settings_project_path(@project, :tab => 'versions') + } + format.api { head :unprocessable_entity } + end + end + end + + def status_by + respond_to do |format| + format.html { render :action => 'show' } + format.js + end + end + + private + + def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) + if ids = params[:tracker_ids] + @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s } + else + @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s } + end + end +end diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb new file mode 100644 index 0000000..3f080e9 --- /dev/null +++ b/app/controllers/watchers_controller.rb @@ -0,0 +1,152 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WatchersController < ApplicationController + before_action :require_login, :find_watchables, :only => [:watch, :unwatch] + + def watch + set_watcher(@watchables, User.current, true) + end + + def unwatch + set_watcher(@watchables, User.current, false) + end + + before_action :find_project, :authorize, :only => [:new, :create, :append, :destroy, :autocomplete_for_user] + accept_api_auth :create, :destroy + + def new + @users = users_for_new_watcher + end + + def create + user_ids = [] + if params[:watcher] + user_ids << (params[:watcher][:user_ids] || params[:watcher][:user_id]) + else + user_ids << params[:user_id] + end + users = User.active.visible.where(:id => user_ids.flatten.compact.uniq) + users.each do |user| + @watchables.each do |watchable| + Watcher.create(:watchable => watchable, :user => user) + end + end + respond_to do |format| + format.html { redirect_to_referer_or {render :html => 'Watcher added.', :status => 200, :layout => true}} + format.js { @users = users_for_new_watcher } + format.api { render_api_ok } + end + end + + def append + if params[:watcher] + user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]] + @users = User.active.visible.where(:id => user_ids).to_a + end + if @users.blank? + head 200 + end + end + + def destroy + user = User.find(params[:user_id]) + @watchables.each do |watchable| + watchable.set_watcher(user, false) + end + respond_to do |format| + format.html { redirect_to_referer_or {render :html => 'Watcher removed.', :status => 200, :layout => true} } + format.js + format.api { render_api_ok } + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def autocomplete_for_user + @users = users_for_new_watcher + render :layout => false + end + + private + + def find_project + if params[:object_type] && params[:object_id] + @watchables = find_objets_from_params + @projects = @watchables.map(&:project).uniq + if @projects.size == 1 + @project = @projects.first + end + elsif params[:project_id] + @project = Project.visible.find_by_param(params[:project_id]) + end + end + + def find_watchables + @watchables = find_objets_from_params + unless @watchables.present? + render_404 + end + end + + def set_watcher(watchables, user, watching) + watchables.each do |watchable| + watchable.set_watcher(user, watching) + end + respond_to do |format| + format.html { + text = watching ? 'Watcher added.' : 'Watcher removed.' + redirect_to_referer_or {render :html => text, :status => 200, :layout => true} + } + format.js { render :partial => 'set_watcher', :locals => {:user => user, :watched => watchables} } + end + end + + def users_for_new_watcher + scope = nil + if params[:q].blank? && @project.present? + scope = @project.users + else + scope = User.all.limit(100) + end + users = scope.active.visible.sorted.like(params[:q]).to_a + if @watchables && @watchables.size == 1 + users -= @watchables.first.watcher_users + end + users + end + + def find_objets_from_params + klass = Object.const_get(params[:object_type].camelcase) rescue nil + return unless klass && klass.respond_to?('watched_by') + + scope = klass.where(:id => Array.wrap(params[:object_id])) + if klass.reflect_on_association(:project) + scope = scope.preload(:project => :enabled_modules) + end + objects = scope.to_a + + raise Unauthorized if objects.any? do |w| + if w.respond_to?(:visible?) + !w.visible? + elsif w.respond_to?(:project) && w.project + !w.project.visible? + end + end + objects + end +end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb new file mode 100644 index 0000000..341a64d --- /dev/null +++ b/app/controllers/welcome_controller.rb @@ -0,0 +1,29 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WelcomeController < ApplicationController + self.main_menu = false + + def index + @news = News.latest User.current + end + + def robots + @projects = Project.all_public.active + render :layout => false, :content_type => 'text/plain' + end +end diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index ff06a21..134765e 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -1,7 +1,5 @@ -# frozen_string_literal: true - # Redmine - project management software -# Copyright (C) 2006-2019 Jean-Philippe Lang +# Copyright (C) 2006-2017 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -74,7 +72,7 @@ class WikiController < ApplicationController @page.title = '' unless editable? @page.validate if @page.errors[:title].blank? - path = project_wiki_page_path(@project, @page.title, :parent => params[:parent]) + path = project_wiki_page_path(@project, @page.title) respond_to do |format| format.html { redirect_to path } format.js { render :js => "window.location = #{path.to_json}" } @@ -91,7 +89,7 @@ class WikiController < ApplicationController end @content = @page.content_for_version(params[:version]) if @content.nil? - if params[:version].blank? && User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request? + if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request? edit render :action => 'edit' else @@ -327,7 +325,7 @@ class WikiController < ApplicationController @attachments += page.attachments @previewed = page.content end - @text = params[:content].present? ? params[:content][:text] : params[:text] + @text = params[:content][:text] render :partial => 'common/preview' end @@ -338,7 +336,7 @@ class WikiController < ApplicationController redirect_to :action => 'show', :id => @page.title, :project_id => @project end - private +private def find_wiki @project = Project.find(params[:project_id]) diff --git a/app/controllers/wikis_controller.rb b/app/controllers/wikis_controller.rb new file mode 100644 index 0000000..c61c2f9 --- /dev/null +++ b/app/controllers/wikis_controller.rb @@ -0,0 +1,36 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WikisController < ApplicationController + menu_item :settings + before_action :find_project, :authorize + + # Create or update a project's wiki + def edit + @wiki = @project.wiki || Wiki.new(:project => @project) + @wiki.safe_attributes = params[:wiki] + @wiki.save if request.post? + end + + # Delete a project's wiki + def destroy + if request.post? && params[:confirm] && @project.wiki + @project.wiki.destroy + redirect_to settings_project_path(@project, :tab => 'wiki') + end + end +end diff --git a/app/controllers/workflows_controller.rb b/app/controllers/workflows_controller.rb new file mode 100644 index 0000000..c831827 --- /dev/null +++ b/app/controllers/workflows_controller.rb @@ -0,0 +1,149 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WorkflowsController < ApplicationController + layout 'admin' + self.main_menu = false + + before_action :require_admin + + def index + @roles = Role.sorted.select(&:consider_workflow?) + @trackers = Tracker.sorted + @workflow_counts = WorkflowTransition.group(:tracker_id, :role_id).count + end + + def edit + find_trackers_roles_and_statuses_for_edit + + if request.post? && @roles && @trackers && params[:transitions] + transitions = params[:transitions].deep_dup + transitions.each do |old_status_id, transitions_by_new_status| + transitions_by_new_status.each do |new_status_id, transition_by_rule| + transition_by_rule.reject! {|rule, transition| transition == 'no_change'} + end + end + WorkflowTransition.replace_transitions(@trackers, @roles, transitions) + flash[:notice] = l(:notice_successful_update) + redirect_to_referer_or workflows_edit_path + return + end + + if @trackers && @roles && @statuses.any? + workflows = WorkflowTransition. + where(:role_id => @roles.map(&:id), :tracker_id => @trackers.map(&:id)). + preload(:old_status, :new_status) + @workflows = {} + @workflows['always'] = workflows.select {|w| !w.author && !w.assignee} + @workflows['author'] = workflows.select {|w| w.author} + @workflows['assignee'] = workflows.select {|w| w.assignee} + end + end + + def permissions + find_trackers_roles_and_statuses_for_edit + + if request.post? && @roles && @trackers && params[:permissions] + permissions = params[:permissions].deep_dup + permissions.each { |field, rule_by_status_id| + rule_by_status_id.reject! {|status_id, rule| rule == 'no_change'} + } + WorkflowPermission.replace_permissions(@trackers, @roles, permissions) + flash[:notice] = l(:notice_successful_update) + redirect_to_referer_or workflows_permissions_path + return + end + + if @roles && @trackers + @fields = (Tracker::CORE_FIELDS_ALL - @trackers.map(&:disabled_core_fields).reduce(:&)).map {|field| [field, l("field_"+field.sub(/_id$/, ''))]} + @custom_fields = @trackers.map(&:custom_fields).flatten.uniq.sort + @permissions = WorkflowPermission.rules_by_status_id(@trackers, @roles) + @statuses.each {|status| @permissions[status.id] ||= {}} + end + end + + def copy + @roles = Role.sorted.select(&:consider_workflow?) + @trackers = Tracker.sorted + + if params[:source_tracker_id].blank? || params[:source_tracker_id] == 'any' + @source_tracker = nil + else + @source_tracker = Tracker.find_by_id(params[:source_tracker_id].to_i) + end + if params[:source_role_id].blank? || params[:source_role_id] == 'any' + @source_role = nil + else + @source_role = Role.find_by_id(params[:source_role_id].to_i) + end + @target_trackers = params[:target_tracker_ids].blank? ? + nil : Tracker.where(:id => params[:target_tracker_ids]).to_a + @target_roles = params[:target_role_ids].blank? ? + nil : Role.where(:id => params[:target_role_ids]).to_a + if request.post? + if params[:source_tracker_id].blank? || params[:source_role_id].blank? || (@source_tracker.nil? && @source_role.nil?) + flash.now[:error] = l(:error_workflow_copy_source) + elsif @target_trackers.blank? || @target_roles.blank? + flash.now[:error] = l(:error_workflow_copy_target) + else + WorkflowRule.copy(@source_tracker, @source_role, @target_trackers, @target_roles) + flash[:notice] = l(:notice_successful_update) + redirect_to workflows_copy_path(:source_tracker_id => @source_tracker, :source_role_id => @source_role) + end + end + end + + private + + def find_trackers_roles_and_statuses_for_edit + find_roles + find_trackers + find_statuses + end + + def find_roles + ids = Array.wrap(params[:role_id]) + if ids == ['all'] + @roles = Role.sorted.to_a + elsif ids.present? + @roles = Role.where(:id => ids).to_a + end + @roles = nil if @roles.blank? + end + + def find_trackers + ids = Array.wrap(params[:tracker_id]) + if ids == ['all'] + @trackers = Tracker.sorted.to_a + elsif ids.present? + @trackers = Tracker.where(:id => ids).to_a + end + @trackers = nil if @trackers.blank? + end + + def find_statuses + @used_statuses_only = (params[:used_statuses_only] == '0' ? false : true) + if @trackers && @used_statuses_only + role_ids = Role.all.select(&:consider_workflow?).map(&:id) + status_ids = WorkflowTransition.where( + :tracker_id => @trackers.map(&:id), :role_id => role_ids + ).distinct.pluck(:old_status_id, :new_status_id).flatten.uniq + @statuses = IssueStatus.where(:id => status_ids).sorted.to_a.presence + end + @statuses ||= IssueStatus.sorted.to_a + end +end diff --git a/app/helpers/account_helper.rb b/app/helpers/account_helper.rb new file mode 100644 index 0000000..e4d8222 --- /dev/null +++ b/app/helpers/account_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module AccountHelper +end diff --git a/app/helpers/activities_helper.rb b/app/helpers/activities_helper.rb new file mode 100644 index 0000000..54e5580 --- /dev/null +++ b/app/helpers/activities_helper.rb @@ -0,0 +1,33 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module ActivitiesHelper + def sort_activity_events(events) + events_by_group = events.group_by(&:event_group) + sorted_events = [] + events.sort {|x, y| y.event_datetime <=> x.event_datetime}.each do |event| + if group_events = events_by_group.delete(event.event_group) + group_events.sort {|x, y| y.event_datetime <=> x.event_datetime}.each_with_index do |e, i| + sorted_events << [e, i > 0] + end + end + end + sorted_events + end +end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb new file mode 100644 index 0000000..e972ef0 --- /dev/null +++ b/app/helpers/admin_helper.rb @@ -0,0 +1,35 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module AdminHelper + def project_status_options_for_select(selected) + options_for_select([[l(:label_all), ''], + [l(:project_status_active), '1'], + [l(:project_status_closed), '5'], + [l(:project_status_archived), '9']], selected.to_s) + end + + def plugin_data_for_updates(plugins) + data = {"v" => Redmine::VERSION.to_s, "p" => {}} + plugins.each do |plugin| + data["p"].merge! plugin.id => {"v" => plugin.version, "n" => plugin.name, "a" => plugin.author} + end + data + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000..792af98 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,1522 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'forwardable' +require 'cgi' + +module ApplicationHelper + include Redmine::WikiFormatting::Macros::Definitions + include Redmine::I18n + include GravatarHelper::PublicMethods + include Redmine::Pagination::Helper + include Redmine::SudoMode::Helper + include Redmine::Themes::Helper + include Redmine::Hook::Helper + include Redmine::Helpers::URL + + extend Forwardable + def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter + + # Return true if user is authorized for controller/action, otherwise false + def authorize_for(controller, action) + User.current.allowed_to?({:controller => controller, :action => action}, @project) + end + + # Display a link if user is authorized + # + # @param [String] name Anchor text (passed to link_to) + # @param [Hash] options Hash params. This will checked by authorize_for to see if the user is authorized + # @param [optional, Hash] html_options Options passed to link_to + # @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to + def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) + link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action]) + end + + # Displays a link to user's account page if active + def link_to_user(user, options={}) + if user.is_a?(User) + name = h(user.name(options[:format])) + if user.active? || (User.current.admin? && user.logged?) + link_to name, user_path(user), :class => user.css_classes + else + name + end + else + h(user.to_s) + end + end + + # Displays a link to +issue+ with its subject. + # Examples: + # + # link_to_issue(issue) # => Defect #6: This is the subject + # link_to_issue(issue, :truncate => 6) # => Defect #6: This i... + # link_to_issue(issue, :subject => false) # => Defect #6 + # link_to_issue(issue, :project => true) # => Foo - Defect #6 + # link_to_issue(issue, :subject => false, :tracker => false) # => #6 + # + def link_to_issue(issue, options={}) + title = nil + subject = nil + text = options[:tracker] == false ? "##{issue.id}" : "#{issue.tracker} ##{issue.id}" + if options[:subject] == false + title = issue.subject.truncate(60) + else + subject = issue.subject + if truncate_length = options[:truncate] + subject = subject.truncate(truncate_length) + end + end + only_path = options[:only_path].nil? ? true : options[:only_path] + s = link_to(text, issue_url(issue, :only_path => only_path), + :class => issue.css_classes, :title => title) + s << h(": #{subject}") if subject + s = h("#{issue.project} - ") + s if options[:project] + s + end + + # Generates a link to an attachment. + # Options: + # * :text - Link text (default to attachment filename) + # * :download - Force download (default: false) + def link_to_attachment(attachment, options={}) + text = options.delete(:text) || attachment.filename + route_method = options.delete(:download) ? :download_named_attachment_url : :named_attachment_url + html_options = options.slice!(:only_path) + options[:only_path] = true unless options.key?(:only_path) + url = send(route_method, attachment, attachment.filename, options) + link_to text, url, html_options + end + + # Generates a link to a SCM revision + # Options: + # * :text - Link text (default to the formatted revision) + def link_to_revision(revision, repository, options={}) + if repository.is_a?(Project) + repository = repository.repository + end + text = options.delete(:text) || format_revision(revision) + rev = revision.respond_to?(:identifier) ? revision.identifier : revision + link_to( + h(text), + {:controller => 'repositories', :action => 'revision', :id => repository.project, :repository_id => repository.identifier_param, :rev => rev}, + :title => l(:label_revision_id, format_revision(revision)), + :accesskey => options[:accesskey] + ) + end + + # Generates a link to a message + def link_to_message(message, options={}, html_options = nil) + link_to( + message.subject.truncate(60), + board_message_url(message.board_id, message.parent_id || message.id, { + :r => (message.parent_id && message.id), + :anchor => (message.parent_id ? "message-#{message.id}" : nil), + :only_path => true + }.merge(options)), + html_options + ) + end + + # Generates a link to a project if active + # Examples: + # + # link_to_project(project) # => link to the specified project overview + # link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options + # link_to_project(project, {}, :class => "project") # => html options with default url (project overview) + # + def link_to_project(project, options={}, html_options = nil) + if project.archived? + h(project.name) + else + link_to project.name, + project_url(project, {:only_path => true}.merge(options)), + html_options + end + end + + # Generates a link to a project settings if active + def link_to_project_settings(project, options={}, html_options=nil) + if project.active? + link_to project.name, settings_project_path(project, options), html_options + elsif project.archived? + h(project.name) + else + link_to project.name, project_path(project, options), html_options + end + end + + # Generates a link to a version + def link_to_version(version, options = {}) + return '' unless version && version.is_a?(Version) + options = {:title => format_date(version.effective_date)}.merge(options) + link_to_if version.visible?, format_version_name(version), version_path(version), options + end + + # Helper that formats object for html or text rendering + def format_object(object, html=true, &block) + if block_given? + object = yield object + end + case object.class.name + when 'Array' + formatted_objects = object.map {|o| format_object(o, html)} + html ? safe_join(formatted_objects, ', ') : formatted_objects.join(', ') + when 'Time' + format_time(object) + when 'Date' + format_date(object) + when 'Fixnum' + object.to_s + when 'Float' + sprintf "%.2f", object + when 'User' + html ? link_to_user(object) : object.to_s + when 'Project' + html ? link_to_project(object) : object.to_s + when 'Version' + html ? link_to_version(object) : object.to_s + when 'TrueClass' + l(:general_text_Yes) + when 'FalseClass' + l(:general_text_No) + when 'Issue' + object.visible? && html ? link_to_issue(object) : "##{object.id}" + when 'Attachment' + html ? link_to_attachment(object) : object.filename + when 'CustomValue', 'CustomFieldValue' + if object.custom_field + f = object.custom_field.format.formatted_custom_value(self, object, html) + if f.nil? || f.is_a?(String) + f + else + format_object(f, html, &block) + end + else + object.value.to_s + end + else + html ? h(object) : object.to_s + end + end + + def wiki_page_path(page, options={}) + url_for({:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title}.merge(options)) + end + + def thumbnail_tag(attachment) + thumbnail_size = Setting.thumbnails_size.to_i + link_to( + image_tag( + thumbnail_path(attachment), + :srcset => "#{thumbnail_path(attachment, :size => thumbnail_size * 2)} 2x", + :style => "max-width: #{thumbnail_size}px; max-height: #{thumbnail_size}px;" + ), + named_attachment_path( + attachment, + attachment.filename + ), + :title => attachment.filename + ) + end + + def toggle_link(name, id, options={}) + onclick = "$('##{id}').toggle(); " + onclick << (options[:focus] ? "$('##{options[:focus]}').focus(); " : "this.blur(); ") + onclick << "$(window).scrollTop($('##{options[:focus]}').position().top); " if options[:scroll] + onclick << "return false;" + link_to(name, "#", :onclick => onclick) + end + + # Used to format item titles on the activity view + def format_activity_title(text) + text + end + + def format_activity_day(date) + date == User.current.today ? l(:label_today).titleize : format_date(date) + end + + def format_activity_description(text) + h(text.to_s.truncate(120).gsub(%r{[\r\n]*<(pre|code)>.*$}m, '...') + ).gsub(/[\r\n]+/, "
").html_safe + end + + def format_version_name(version) + if version.project == @project + h(version) + else + h("#{version.project} - #{version}") + end + end + + def format_changeset_comments(changeset, options={}) + method = options[:short] ? :short_comments : :comments + textilizable changeset, method, :formatting => Setting.commit_logs_formatting? + end + + def due_date_distance_in_words(date) + if date + l((date < User.current.today ? :label_roadmap_overdue : :label_roadmap_due_in), distance_of_date_in_words(User.current.today, date)) + end + end + + # Renders a tree of projects as a nested set of unordered lists + # The given collection may be a subset of the whole project tree + # (eg. some intermediate nodes are private and can not be seen) + def render_project_nested_lists(projects, &block) + s = '' + if projects.any? + ancestors = [] + original_project = @project + projects.sort_by(&:lft).each do |project| + # set the project environment to please macros. + @project = project + if (ancestors.empty? || project.is_descendant_of?(ancestors.last)) + s << "\n" + end + end + classes = (ancestors.empty? ? 'root' : 'child') + s << "
  • " + s << h(block_given? ? capture(project, &block) : project.name) + s << "
    \n" + ancestors << project + end + s << ("
  • \n" * ancestors.size) + @project = original_project + end + s.html_safe + end + + def render_page_hierarchy(pages, node=nil, options={}) + content = '' + if pages[node] + content << "\n" + end + content.html_safe + end + + # Renders flash messages + def render_flash_messages + s = '' + flash.each do |k,v| + s << content_tag('div', v.html_safe, :class => "flash #{k}", :id => "flash_#{k}") + end + s.html_safe + end + + # Renders tabs and their content + def render_tabs(tabs, selected=params[:tab]) + if tabs.any? + unless tabs.detect {|tab| tab[:name] == selected} + selected = nil + end + selected ||= tabs.first[:name] + render :partial => 'common/tabs', :locals => {:tabs => tabs, :selected_tab => selected} + else + content_tag 'p', l(:label_no_data), :class => "nodata" + end + end + + # Returns the default scope for the quick search form + # Could be 'all', 'my_projects', 'subprojects' or nil (current project) + def default_search_project_scope + if @project && !@project.leaf? + 'subprojects' + end + end + + # Returns an array of projects that are displayed in the quick-jump box + def projects_for_jump_box(user=User.current) + if user.logged? + user.projects.active.select(:id, :name, :identifier, :lft, :rgt).to_a + else + [] + end + end + + def render_projects_for_jump_box(projects, selected=nil) + jump = params[:jump].presence || current_menu_item + s = ''.html_safe + project_tree(projects) do |project, level| + padding = level * 16 + text = content_tag('span', project.name, :style => "padding-left:#{padding}px;") + s << link_to(text, project_path(project, :jump => jump), :title => project.name, :class => (project == selected ? 'selected' : nil)) + end + s + end + + # Renders the project quick-jump box + def render_project_jump_box + projects = projects_for_jump_box(User.current) + if @project && @project.persisted? + text = @project.name_was + end + text ||= l(:label_jump_to_a_project) + url = autocomplete_projects_path(:format => 'js', :jump => current_menu_item) + + trigger = content_tag('span', text, :class => 'drdn-trigger') + q = text_field_tag('q', '', :id => 'projects-quick-search', :class => 'autocomplete', :data => {:automcomplete_url => url}, :autocomplete => 'off') + all = link_to(l(:label_project_all), projects_path(:jump => current_menu_item), :class => (@project.nil? && controller.class.main_menu ? 'selected' : nil)) + content = content_tag('div', + content_tag('div', q, :class => 'quick-search') + + content_tag('div', render_projects_for_jump_box(projects, @project), :class => 'drdn-items projects selection') + + content_tag('div', all, :class => 'drdn-items all-projects selection'), + :class => 'drdn-content' + ) + + content_tag('div', trigger + content, :id => "project-jump", :class => "drdn") + end + + def project_tree_options_for_select(projects, options = {}) + s = ''.html_safe + if blank_text = options[:include_blank] + if blank_text == true + blank_text = ' '.html_safe + end + s << content_tag('option', blank_text, :value => '') + end + project_tree(projects) do |project, level| + name_prefix = (level > 0 ? ' ' * 2 * level + '» ' : '').html_safe + tag_options = {:value => project.id} + if project == options[:selected] || (options[:selected].respond_to?(:include?) && options[:selected].include?(project)) + tag_options[:selected] = 'selected' + else + tag_options[:selected] = nil + end + tag_options.merge!(yield(project)) if block_given? + s << content_tag('option', name_prefix + h(project), tag_options) + end + s.html_safe + end + + # Yields the given block for each project with its level in the tree + # + # Wrapper for Project#project_tree + def project_tree(projects, options={}, &block) + Project.project_tree(projects, options, &block) + end + + def principals_check_box_tags(name, principals) + s = '' + principals.each do |principal| + s << "\n" + end + s.html_safe + end + + # Returns a string for users/groups option tags + def principals_options_for_select(collection, selected=nil) + s = '' + if collection.include?(User.current) + s << content_tag('option', "<< #{l(:label_me)} >>", :value => User.current.id) + end + groups = '' + collection.sort.each do |element| + selected_attribute = ' selected="selected"' if option_value_selected?(element, selected) || element.id.to_s == selected + (element.is_a?(Group) ? groups : s) << %() + end + unless groups.empty? + s << %(#{groups}) + end + s.html_safe + end + + def option_tag(name, text, value, selected=nil, options={}) + content_tag 'option', value, options.merge(:value => value, :selected => (value == selected)) + end + + def truncate_single_line_raw(string, length) + string.to_s.truncate(length).gsub(%r{[\r\n]+}m, ' ') + end + + # Truncates at line break after 250 characters or options[:length] + def truncate_lines(string, options={}) + length = options[:length] || 250 + if string.to_s =~ /\A(.{#{length}}.*?)$/m + "#{$1}..." + else + string + end + end + + def anchor(text) + text.to_s.gsub(' ', '_') + end + + def html_hours(text) + text.gsub(%r{(\d+)([\.:])(\d+)}, '\1\2\3').html_safe + end + + def authoring(created, author, options={}) + l(options[:label] || :label_added_time_by, :author => link_to_user(author), :age => time_tag(created)).html_safe + end + + def time_tag(time) + text = distance_of_time_in_words(Time.now, time) + if @project + link_to(text, project_activity_path(@project, :from => User.current.time_to_date(time)), :title => format_time(time)) + else + content_tag('abbr', text, :title => format_time(time)) + end + end + + def syntax_highlight_lines(name, content) + syntax_highlight(name, content).each_line.to_a + end + + def syntax_highlight(name, content) + Redmine::SyntaxHighlighting.highlight_by_filename(content, name) + end + + def to_path_param(path) + str = path.to_s.split(%r{[/\\]}).select{|p| !p.blank?}.join("/") + str.blank? ? nil : str + end + + def reorder_links(name, url, method = :post) + # TODO: remove associated styles from application.css too + ActiveSupport::Deprecation.warn "Application#reorder_links will be removed in Redmine 4." + + link_to(l(:label_sort_highest), + url.merge({"#{name}[move_to]" => 'highest'}), :method => method, + :title => l(:label_sort_highest), :class => 'icon-only icon-move-top') + + link_to(l(:label_sort_higher), + url.merge({"#{name}[move_to]" => 'higher'}), :method => method, + :title => l(:label_sort_higher), :class => 'icon-only icon-move-up') + + link_to(l(:label_sort_lower), + url.merge({"#{name}[move_to]" => 'lower'}), :method => method, + :title => l(:label_sort_lower), :class => 'icon-only icon-move-down') + + link_to(l(:label_sort_lowest), + url.merge({"#{name}[move_to]" => 'lowest'}), :method => method, + :title => l(:label_sort_lowest), :class => 'icon-only icon-move-bottom') + end + + def reorder_handle(object, options={}) + data = { + :reorder_url => options[:url] || url_for(object), + :reorder_param => options[:param] || object.class.name.underscore + } + content_tag('span', '', + :class => "sort-handle", + :data => data, + :title => l(:button_sort)) + end + + def breadcrumb(*args) + elements = args.flatten + elements.any? ? content_tag('p', (args.join(" \xc2\xbb ") + " \xc2\xbb ").html_safe, :class => 'breadcrumb') : nil + end + + def other_formats_links(&block) + concat('

    '.html_safe + l(:label_export_to)) + yield Redmine::Views::OtherFormatsBuilder.new(self) + concat('

    '.html_safe) + end + + def page_header_title + if @project.nil? || @project.new_record? + h(Setting.app_title) + else + b = [] + ancestors = (@project.root? ? [] : @project.ancestors.visible.to_a) + if ancestors.any? + root = ancestors.shift + b << link_to_project(root, {:jump => current_menu_item}, :class => 'root') + if ancestors.size > 2 + b << "\xe2\x80\xa6" + ancestors = ancestors[-2, 2] + end + b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') } + end + b << content_tag(:span, h(@project), class: 'current-project') + if b.size > 1 + separator = content_tag(:span, ' » '.html_safe, class: 'separator') + path = safe_join(b[0..-2], separator) + separator + b = [content_tag(:span, path.html_safe, class: 'breadcrumbs'), b[-1]] + end + safe_join b + end + end + + # Returns a h2 tag and sets the html title with the given arguments + def title(*args) + strings = args.map do |arg| + if arg.is_a?(Array) && arg.size >= 2 + link_to(*arg) + else + h(arg.to_s) + end + end + html_title args.reverse.map {|s| (s.is_a?(Array) ? s.first : s).to_s} + content_tag('h2', strings.join(' » ').html_safe) + end + + # Sets the html title + # Returns the html title when called without arguments + # Current project name and app_title and automatically appended + # Exemples: + # html_title 'Foo', 'Bar' + # html_title # => 'Foo - Bar - My Project - Redmine' + def html_title(*args) + if args.empty? + title = @html_title || [] + title << @project.name if @project + title << Setting.app_title unless Setting.app_title == title.last + title.reject(&:blank?).join(' - ') + else + @html_title ||= [] + @html_title += args + end + end + + # Returns the theme, controller name, and action as css classes for the + # HTML body. + def body_css_classes + css = [] + if theme = Redmine::Themes.theme(Setting.ui_theme) + css << 'theme-' + theme.name + end + + css << 'project-' + @project.identifier if @project && @project.identifier.present? + css << 'controller-' + controller_name + css << 'action-' + action_name + if UserPreference::TEXTAREA_FONT_OPTIONS.include?(User.current.pref.textarea_font) + css << "textarea-#{User.current.pref.textarea_font}" + end + css.join(' ') + end + + def accesskey(s) + @used_accesskeys ||= [] + key = Redmine::AccessKeys.key_for(s) + return nil if @used_accesskeys.include?(key) + @used_accesskeys << key + key + end + + # Formats text according to system settings. + # 2 ways to call this method: + # * with a String: textilizable(text, options) + # * with an object and one of its attribute: textilizable(issue, :description, options) + def textilizable(*args) + options = args.last.is_a?(Hash) ? args.pop : {} + case args.size + when 1 + obj = options[:object] + text = args.shift + when 2 + obj = args.shift + attr = args.shift + text = obj.send(attr).to_s + else + raise ArgumentError, 'invalid arguments to textilizable' + end + return '' if text.blank? + project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil) + @only_path = only_path = options.delete(:only_path) == false ? false : true + + text = text.dup + macros = catch_macros(text) + + if options[:formatting] == false + text = h(text) + else + formatting = Setting.text_formatting + text = Redmine::WikiFormatting.to_html(formatting, text, :object => obj, :attribute => attr) + end + + @parsed_headings = [] + @heading_anchors = {} + @current_section = 0 if options[:edit_section_links] + + parse_sections(text, project, obj, attr, only_path, options) + text = parse_non_pre_blocks(text, obj, macros) do |text| + [:parse_inline_attachments, :parse_hires_images, :parse_wiki_links, :parse_redmine_links].each do |method_name| + send method_name, text, project, obj, attr, only_path, options + end + end + parse_headings(text, project, obj, attr, only_path, options) + + if @parsed_headings.any? + replace_toc(text, @parsed_headings) + end + + text.html_safe + end + + def parse_non_pre_blocks(text, obj, macros) + s = StringScanner.new(text) + tags = [] + parsed = '' + while !s.eos? + s.scan(/(.*?)(<(\/)?(pre|code)(.*?)>|\z)/im) + text, full_tag, closing, tag = s[1], s[2], s[3], s[4] + if tags.empty? + yield text + inject_macros(text, obj, macros) if macros.any? + else + inject_macros(text, obj, macros, false) if macros.any? + end + parsed << text + if tag + if closing + if tags.last && tags.last.casecmp(tag) == 0 + tags.pop + end + else + tags << tag.downcase + end + parsed << full_tag + end + end + # Close any non closing tags + while tag = tags.pop + parsed << "" + end + parsed + end + + # add srcset attribute to img tags if filename includes @2x, @3x, etc. + # to support hires displays + def parse_hires_images(text, project, obj, attr, only_path, options) + text.gsub!(/src="([^"]+@(\dx)\.(bmp|gif|jpg|jpe|jpeg|png))"/i) do |m| + filename, dpr = $1, $2 + m + " srcset=\"#{filename} #{dpr}\"" + end + end + + def parse_inline_attachments(text, project, obj, attr, only_path, options) + return if options[:inline_attachments] == false + + # when using an image link, try to use an attachment, if possible + attachments = options[:attachments] || [] + attachments += obj.attachments if obj.respond_to?(:attachments) + if attachments.present? + text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m| + filename, ext, alt, alttext = $1.downcase, $2, $3, $4 + # search for the picture in attachments + if found = Attachment.latest_attach(attachments, CGI.unescape(filename)) + image_url = download_named_attachment_url(found, found.filename, :only_path => only_path) + desc = found.description.to_s.gsub('"', '') + if !desc.blank? && alttext.blank? + alt = " title=\"#{desc}\" alt=\"#{desc}\"" + end + "src=\"#{image_url}\"#{alt}" + else + m + end + end + end + end + + # Wiki links + # + # Examples: + # [[mypage]] + # [[mypage|mytext]] + # wiki links can refer other project wikis, using project name or identifier: + # [[project:]] -> wiki starting page + # [[project:|mytext]] + # [[project:mypage]] + # [[project:mypage|mytext]] + def parse_wiki_links(text, project, obj, attr, only_path, options) + text.gsub!(/(!)?(\[\[([^\]\n\|]+)(\|([^\]\n\|]+))?\]\])/) do |m| + link_project = project + esc, all, page, title = $1, $2, $3, $5 + if esc.nil? + if page =~ /^([^\:]+)\:(.*)$/ + identifier, page = $1, $2 + link_project = Project.find_by_identifier(identifier) || Project.find_by_name(identifier) + title ||= identifier if page.blank? + end + + if link_project && link_project.wiki && User.current.allowed_to?(:view_wiki_pages, link_project) + # extract anchor + anchor = nil + if page =~ /^(.+?)\#(.+)$/ + page, anchor = $1, $2 + end + anchor = sanitize_anchor_name(anchor) if anchor.present? + # check if page exists + wiki_page = link_project.wiki.find_page(page) + url = if anchor.present? && wiki_page.present? && (obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version)) && obj.page == wiki_page + "##{anchor}" + else + case options[:wiki_links] + when :local; "#{page.present? ? Wiki.titleize(page) : ''}.html" + (anchor.present? ? "##{anchor}" : '') + when :anchor; "##{page.present? ? Wiki.titleize(page) : title}" + (anchor.present? ? "_#{anchor}" : '') # used for single-file wiki export + else + wiki_page_id = page.present? ? Wiki.titleize(page) : nil + parent = wiki_page.nil? && obj.is_a?(WikiContent) && obj.page && project == link_project ? obj.page.title : nil + url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, + :id => wiki_page_id, :version => nil, :anchor => anchor, :parent => parent) + end + end + link_to(title.present? ? title.html_safe : h(page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new'))) + else + # project or wiki doesn't exist + all + end + else + all + end + end + end + + # Redmine links + # + # Examples: + # Issues: + # #52 -> Link to issue #52 + # Changesets: + # r52 -> Link to revision 52 + # commit:a85130f -> Link to scmid starting with a85130f + # Documents: + # document#17 -> Link to document with id 17 + # document:Greetings -> Link to the document with title "Greetings" + # document:"Some document" -> Link to the document with title "Some document" + # Versions: + # version#3 -> Link to version with id 3 + # version:1.0.0 -> Link to version named "1.0.0" + # version:"1.0 beta 2" -> Link to version named "1.0 beta 2" + # Attachments: + # attachment:file.zip -> Link to the attachment of the current object named file.zip + # Source files: + # source:some/file -> Link to the file located at /some/file in the project's repository + # source:some/file@52 -> Link to the file's revision 52 + # source:some/file#L120 -> Link to line 120 of the file + # source:some/file@52#L120 -> Link to line 120 of the file's revision 52 + # export:some/file -> Force the download of the file + # Forums: + # forum#1 -> Link to forum with id 1 + # forum:Support -> Link to forum named "Support" + # forum:"Technical Support" -> Link to forum named "Technical Support" + # Forum messages: + # message#1218 -> Link to message with id 1218 + # Projects: + # project:someproject -> Link to project named "someproject" + # project#3 -> Link to project with id 3 + # News: + # news#2 -> Link to news item with id 1 + # news:Greetings -> Link to news item named "Greetings" + # news:"First Release" -> Link to news item named "First Release" + # Users: + # user:jsmith -> Link to user with login jsmith + # @jsmith -> Link to user with login jsmith + # user#2 -> Link to user with id 2 + # + # Links can refer other objects from other projects, using project identifier: + # identifier:r52 + # identifier:document:"Some document" + # identifier:version:1.0.0 + # identifier:source:some/file + def parse_redmine_links(text, default_project, obj, attr, only_path, options) + text.gsub!(LINKS_RE) do |_| + tag_content = $~[:tag_content] + leading = $~[:leading] + esc = $~[:esc] + project_prefix = $~[:project_prefix] + project_identifier = $~[:project_identifier] + prefix = $~[:prefix] + repo_prefix = $~[:repo_prefix] + repo_identifier = $~[:repo_identifier] + sep = $~[:sep1] || $~[:sep2] || $~[:sep3] || $~[:sep4] + identifier = $~[:identifier1] || $~[:identifier2] || $~[:identifier3] + comment_suffix = $~[:comment_suffix] + comment_id = $~[:comment_id] + + if tag_content + $& + else + link = nil + project = default_project + if project_identifier + project = Project.visible.find_by_identifier(project_identifier) + end + if esc.nil? + if prefix.nil? && sep == 'r' + if project + repository = nil + if repo_identifier + repository = project.repositories.detect {|repo| repo.identifier == repo_identifier} + else + repository = project.repository + end + # project.changesets.visible raises an SQL error because of a double join on repositories + if repository && + (changeset = Changeset.visible. + find_by_repository_id_and_revision(repository.id, identifier)) + link = link_to(h("#{project_prefix}#{repo_prefix}r#{identifier}"), + {:only_path => only_path, :controller => 'repositories', + :action => 'revision', :id => project, + :repository_id => repository.identifier_param, + :rev => changeset.revision}, + :class => 'changeset', + :title => truncate_single_line_raw(changeset.comments, 100)) + end + end + elsif sep == '#' + oid = identifier.to_i + case prefix + when nil + if oid.to_s == identifier && + issue = Issue.visible.find_by_id(oid) + anchor = comment_id ? "note-#{comment_id}" : nil + link = link_to("##{oid}#{comment_suffix}", + issue_url(issue, :only_path => only_path, :anchor => anchor), + :class => issue.css_classes, + :title => "#{issue.tracker.name}: #{issue.subject.truncate(100)} (#{issue.status.name})") + end + when 'document' + if document = Document.visible.find_by_id(oid) + link = link_to(document.title, document_url(document, :only_path => only_path), :class => 'document') + end + when 'version' + if version = Version.visible.find_by_id(oid) + link = link_to(version.name, version_url(version, :only_path => only_path), :class => 'version') + end + when 'message' + if message = Message.visible.find_by_id(oid) + link = link_to_message(message, {:only_path => only_path}, :class => 'message') + end + when 'forum' + if board = Board.visible.find_by_id(oid) + link = link_to(board.name, project_board_url(board.project, board, :only_path => only_path), :class => 'board') + end + when 'news' + if news = News.visible.find_by_id(oid) + link = link_to(news.title, news_url(news, :only_path => only_path), :class => 'news') + end + when 'project' + if p = Project.visible.find_by_id(oid) + link = link_to_project(p, {:only_path => only_path}, :class => 'project') + end + when 'user' + u = User.visible.where(:id => oid, :type => 'User').first + link = link_to_user(u) if u + end + elsif sep == ':' + name = remove_double_quotes(identifier) + case prefix + when 'document' + if project && document = project.documents.visible.find_by_title(name) + link = link_to(document.title, document_url(document, :only_path => only_path), :class => 'document') + end + when 'version' + if project && version = project.versions.visible.find_by_name(name) + link = link_to(version.name, version_url(version, :only_path => only_path), :class => 'version') + end + when 'forum' + if project && board = project.boards.visible.find_by_name(name) + link = link_to(board.name, project_board_url(board.project, board, :only_path => only_path), :class => 'board') + end + when 'news' + if project && news = project.news.visible.find_by_title(name) + link = link_to(news.title, news_url(news, :only_path => only_path), :class => 'news') + end + when 'commit', 'source', 'export' + if project + repository = nil + if name =~ %r{^(([a-z0-9\-_]+)\|)(.+)$} + repo_prefix, repo_identifier, name = $1, $2, $3 + repository = project.repositories.detect {|repo| repo.identifier == repo_identifier} + else + repository = project.repository + end + if prefix == 'commit' + if repository && (changeset = Changeset.visible.where("repository_id = ? AND scmid LIKE ?", repository.id, "#{name}%").first) + link = link_to h("#{project_prefix}#{repo_prefix}#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :repository_id => repository.identifier_param, :rev => changeset.identifier}, + :class => 'changeset', + :title => truncate_single_line_raw(changeset.comments, 100) + end + else + if repository && User.current.allowed_to?(:browse_repository, project) + name =~ %r{^[/\\]*(.*?)(@([^/\\@]+?))?(#(L\d+))?$} + path, rev, anchor = $1, $3, $5 + link = link_to h("#{project_prefix}#{prefix}:#{repo_prefix}#{name}"), {:only_path => only_path, :controller => 'repositories', :action => (prefix == 'export' ? 'raw' : 'entry'), :id => project, :repository_id => repository.identifier_param, + :path => to_path_param(path), + :rev => rev, + :anchor => anchor}, + :class => (prefix == 'export' ? 'source download' : 'source') + end + end + repo_prefix = nil + end + when 'attachment' + attachments = options[:attachments] || [] + attachments += obj.attachments if obj.respond_to?(:attachments) + if attachments && attachment = Attachment.latest_attach(attachments, name) + link = link_to_attachment(attachment, :only_path => only_path, :class => 'attachment') + end + when 'project' + if p = Project.visible.where("identifier = :s OR LOWER(name) = :s", :s => name.downcase).first + link = link_to_project(p, {:only_path => only_path}, :class => 'project') + end + when 'user' + u = User.visible.where(:login => name, :type => 'User').first + link = link_to_user(u) if u + end + elsif sep == "@" + name = remove_double_quotes(identifier) + u = User.visible.where(:login => name, :type => 'User').first + link = link_to_user(u) if u + end + end + (leading + (link || "#{project_prefix}#{prefix}#{repo_prefix}#{sep}#{identifier}#{comment_suffix}")) + end + end + end + + LINKS_RE = + %r{ + ]+?)?>(?.*?)| + (?[\s\(,\-\[\>]|^) + (?!)? + (?(?[a-z0-9\-_]+):)? + (?attachment|document|version|forum|news|message|project|commit|source|export|user)? + ( + ( + (?\#)| + ( + (?(?[a-z0-9\-_]+)\|)? + (?r) + ) + ) + ( + (?\d+) + (? + (\#note)? + -(?\d+) + )? + )| + ( + (?:) + (?[^"\s<>][^\s<>]*?|"[^"]+?") + )| + ( + (?@) + (?[a-z0-9_\-@\.]*) + ) + ) + (?= + (?=[[:punct:]][^A-Za-z0-9_/])| + ,| + \s| + \]| + <| + $) + }x + HEADING_RE = /(]+)?>(.+?)<\/h(\d)>)/i unless const_defined?(:HEADING_RE) + + def parse_sections(text, project, obj, attr, only_path, options) + return unless options[:edit_section_links] + text.gsub!(HEADING_RE) do + heading, level = $1, $2 + @current_section += 1 + if @current_section > 1 + content_tag('div', + link_to(l(:button_edit_section), options[:edit_section_links].merge(:section => @current_section), + :class => 'icon-only icon-edit'), + :class => "contextual heading-#{level}", + :title => l(:button_edit_section), + :id => "section-#{@current_section}") + heading.html_safe + else + heading + end + end + end + + # Headings and TOC + # Adds ids and links to headings unless options[:headings] is set to false + def parse_headings(text, project, obj, attr, only_path, options) + return if options[:headings] == false + + text.gsub!(HEADING_RE) do + level, attrs, content = $2.to_i, $3, $4 + item = strip_tags(content).strip + anchor = sanitize_anchor_name(item) + # used for single-file wiki export + anchor = "#{obj.page.title}_#{anchor}" if options[:wiki_links] == :anchor && (obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version)) + @heading_anchors[anchor] ||= 0 + idx = (@heading_anchors[anchor] += 1) + if idx > 1 + anchor = "#{anchor}-#{idx}" + end + @parsed_headings << [level, anchor, item] + "\n#{content}" + end + end + + MACROS_RE = /( + (!)? # escaping + ( + \{\{ # opening tag + ([\w]+) # macro name + (\(([^\n\r]*?)\))? # optional arguments + ([\n\r].*?[\n\r])? # optional block of text + \}\} # closing tag + ) + )/mx unless const_defined?(:MACROS_RE) + + MACRO_SUB_RE = /( + \{\{ + macro\((\d+)\) + \}\} + )/x unless const_defined?(:MACRO_SUB_RE) + + # Extracts macros from text + def catch_macros(text) + macros = {} + text.gsub!(MACROS_RE) do + all, macro = $1, $4.downcase + if macro_exists?(macro) || all =~ MACRO_SUB_RE + index = macros.size + macros[index] = all + "{{macro(#{index})}}" + else + all + end + end + macros + end + + # Executes and replaces macros in text + def inject_macros(text, obj, macros, execute=true) + text.gsub!(MACRO_SUB_RE) do + all, index = $1, $2.to_i + orig = macros.delete(index) + if execute && orig && orig =~ MACROS_RE + esc, all, macro, args, block = $2, $3, $4.downcase, $6.to_s, $7.try(:strip) + if esc.nil? + h(exec_macro(macro, obj, args, block) || all) + else + h(all) + end + elsif orig + h(orig) + else + h(all) + end + end + end + + TOC_RE = /

    \{\{((<|<)|(>|>))?toc\}\}<\/p>/i unless const_defined?(:TOC_RE) + + # Renders the TOC with given headings + def replace_toc(text, headings) + text.gsub!(TOC_RE) do + left_align, right_align = $2, $3 + # Keep only the 4 first levels + headings = headings.select{|level, anchor, item| level <= 4} + if headings.empty? + '' + else + div_class = 'toc' + div_class << ' right' if right_align + div_class << ' left' if left_align + out = "

    • #{l :label_table_of_contents}
    • " + root = headings.map(&:first).min + current = root + started = false + headings.each do |level, anchor, item| + if level > current + out << '
      • ' * (level - current) + elsif level < current + out << "
      \n" * (current - level) + "
    • " + elsif started + out << '
    • ' + end + out << "#{item}" + current = level + started = true + end + out << '
    ' * (current - root) + out << '' + end + end + end + + # Same as Rails' simple_format helper without using paragraphs + def simple_format_without_paragraph(text) + text.to_s. + gsub(/\r\n?/, "\n"). # \r\n and \r -> \n + gsub(/\n\n+/, "

    "). # 2+ newline -> 2 br + gsub(/([^\n]\n)(?=[^\n])/, '\1
    '). # 1 newline -> br + html_safe + end + + def lang_options_for_select(blank=true) + (blank ? [["(auto)", ""]] : []) + languages_options + end + + def labelled_form_for(*args, &proc) + args << {} unless args.last.is_a?(Hash) + options = args.last + if args.first.is_a?(Symbol) + options.merge!(:as => args.shift) + end + options.merge!({:builder => Redmine::Views::LabelledFormBuilder}) + form_for(*args, &proc) + end + + def labelled_fields_for(*args, &proc) + args << {} unless args.last.is_a?(Hash) + options = args.last + options.merge!({:builder => Redmine::Views::LabelledFormBuilder}) + fields_for(*args, &proc) + end + + # Render the error messages for the given objects + def error_messages_for(*objects) + objects = objects.map {|o| o.is_a?(String) ? instance_variable_get("@#{o}") : o}.compact + errors = objects.map {|o| o.errors.full_messages}.flatten + render_error_messages(errors) + end + + # Renders a list of error messages + def render_error_messages(errors) + html = "" + if errors.present? + html << "
      \n" + errors.each do |error| + html << "
    • #{h error}
    • \n" + end + html << "
    \n" + end + html.html_safe + end + + def delete_link(url, options={}) + options = { + :method => :delete, + :data => {:confirm => l(:text_are_you_sure)}, + :class => 'icon icon-del' + }.merge(options) + + link_to l(:button_delete), url, options + end + + def preview_link(url, form, target='preview', options={}) + content_tag 'a', l(:label_preview), { + :href => "#", + :onclick => %|submitPreview("#{escape_javascript url_for(url)}", "#{escape_javascript form}", "#{escape_javascript target}"); return false;|, + :accesskey => accesskey(:preview) + }.merge(options) + end + + def link_to_function(name, function, html_options={}) + content_tag(:a, name, {:href => '#', :onclick => "#{function}; return false;"}.merge(html_options)) + end + + # Helper to render JSON in views + def raw_json(arg) + arg.to_json.to_s.gsub('/', '\/').html_safe + end + + def back_url + url = params[:back_url] + if url.nil? && referer = request.env['HTTP_REFERER'] + url = CGI.unescape(referer.to_s) + # URLs that contains the utf8=[checkmark] parameter added by Rails are + # parsed as invalid by URI.parse so the redirect to the back URL would + # not be accepted (ApplicationController#validate_back_url would return + # false) + url.gsub!(/(\?|&)utf8=\u2713&?/, '\1') + end + url + end + + def back_url_hidden_field_tag + url = back_url + hidden_field_tag('back_url', url, :id => nil) unless url.blank? + end + + def check_all_links(form_name) + link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") + + " | ".html_safe + + link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)") + end + + def toggle_checkboxes_link(selector) + link_to_function '', + "toggleCheckboxesBySelector('#{selector}')", + :title => "#{l(:button_check_all)} / #{l(:button_uncheck_all)}", + :class => 'icon icon-checked' + end + + def progress_bar(pcts, options={}) + pcts = [pcts, pcts] unless pcts.is_a?(Array) + pcts = pcts.collect(&:round) + pcts[1] = pcts[1] - pcts[0] + pcts << (100 - pcts[1] - pcts[0]) + titles = options[:titles].to_a + titles[0] = "#{pcts[0]}%" if titles[0].blank? + legend = options[:legend] || '' + content_tag('table', + content_tag('tr', + (pcts[0] > 0 ? content_tag('td', '', :style => "width: #{pcts[0]}%;", :class => 'closed', :title => titles[0]) : ''.html_safe) + + (pcts[1] > 0 ? content_tag('td', '', :style => "width: #{pcts[1]}%;", :class => 'done', :title => titles[1]) : ''.html_safe) + + (pcts[2] > 0 ? content_tag('td', '', :style => "width: #{pcts[2]}%;", :class => 'todo', :title => titles[2]) : ''.html_safe) + ), :class => "progress progress-#{pcts[0]}").html_safe + + content_tag('p', legend, :class => 'percent').html_safe + end + + def checked_image(checked=true) + if checked + @checked_image_tag ||= content_tag(:span, nil, :class => 'icon-only icon-checked') + end + end + + def context_menu + unless @context_menu_included + content_for :header_tags do + javascript_include_tag('context_menu') + + stylesheet_link_tag('context_menu') + end + if l(:direction) == 'rtl' + content_for :header_tags do + stylesheet_link_tag('context_menu_rtl') + end + end + @context_menu_included = true + end + nil + end + + def calendar_for(field_id) + include_calendar_headers_tags + javascript_tag("$(function() { $('##{field_id}').addClass('date').datepickerFallback(datepickerOptions); });") + end + + def include_calendar_headers_tags + unless @calendar_headers_tags_included + tags = ''.html_safe + @calendar_headers_tags_included = true + content_for :header_tags do + start_of_week = Setting.start_of_week + start_of_week = l(:general_first_day_of_week, :default => '1') if start_of_week.blank? + # Redmine uses 1..7 (monday..sunday) in settings and locales + # JQuery uses 0..6 (sunday..saturday), 7 needs to be changed to 0 + start_of_week = start_of_week.to_i % 7 + tags << javascript_tag( + "var datepickerOptions={dateFormat: 'yy-mm-dd', firstDay: #{start_of_week}, " + + "showOn: 'button', buttonImageOnly: true, buttonImage: '" + + path_to_image('/images/calendar.png') + + "', showButtonPanel: true, showWeek: true, showOtherMonths: true, " + + "selectOtherMonths: true, changeMonth: true, changeYear: true, " + + "beforeShow: beforeShowDatePicker};") + jquery_locale = l('jquery.locale', :default => current_language.to_s) + unless jquery_locale == 'en' + tags << javascript_include_tag("i18n/datepicker-#{jquery_locale}.js") + end + tags + end + end + end + + # Overrides Rails' stylesheet_link_tag with themes and plugins support. + # Examples: + # stylesheet_link_tag('styles') # => picks styles.css from the current theme or defaults + # stylesheet_link_tag('styles', :plugin => 'foo) # => picks styles.css from plugin's assets + # + def stylesheet_link_tag(*sources) + options = sources.last.is_a?(Hash) ? sources.pop : {} + plugin = options.delete(:plugin) + sources = sources.map do |source| + if plugin + "/plugin_assets/#{plugin}/stylesheets/#{source}" + elsif current_theme && current_theme.stylesheets.include?(source) + current_theme.stylesheet_path(source) + else + source + end + end + super *sources, options + end + + # Overrides Rails' image_tag with themes and plugins support. + # Examples: + # image_tag('image.png') # => picks image.png from the current theme or defaults + # image_tag('image.png', :plugin => 'foo) # => picks image.png from plugin's assets + # + def image_tag(source, options={}) + if plugin = options.delete(:plugin) + source = "/plugin_assets/#{plugin}/images/#{source}" + elsif current_theme && current_theme.images.include?(source) + source = current_theme.image_path(source) + end + super source, options + end + + # Overrides Rails' javascript_include_tag with plugins support + # Examples: + # javascript_include_tag('scripts') # => picks scripts.js from defaults + # javascript_include_tag('scripts', :plugin => 'foo) # => picks scripts.js from plugin's assets + # + def javascript_include_tag(*sources) + options = sources.last.is_a?(Hash) ? sources.pop : {} + if plugin = options.delete(:plugin) + sources = sources.map do |source| + if plugin + "/plugin_assets/#{plugin}/javascripts/#{source}" + else + source + end + end + end + super *sources, options + end + + def sidebar_content? + content_for?(:sidebar) || view_layouts_base_sidebar_hook_response.present? + end + + def view_layouts_base_sidebar_hook_response + @view_layouts_base_sidebar_hook_response ||= call_hook(:view_layouts_base_sidebar) + end + + def email_delivery_enabled? + !!ActionMailer::Base.perform_deliveries + end + + # Returns the avatar image tag for the given +user+ if avatars are enabled + # +user+ can be a User or a string that will be scanned for an email address (eg. 'joe ') + def avatar(user, options = { }) + if Setting.gravatar_enabled? + options.merge!(:default => Setting.gravatar_default) + email = nil + if user.respond_to?(:mail) + email = user.mail + elsif user.to_s =~ %r{<(.+?)>} + email = $1 + end + if email.present? + gravatar(email.to_s.downcase, options) rescue nil + elsif user.is_a?(AnonymousUser) + options[:size] &&= options[:size].to_s + image_tag 'anonymous.png', + GravatarHelper::DEFAULT_OPTIONS + .except(:default, :rating, :ssl).merge(options) + else + nil + end + else + '' + end + end + + # Returns a link to edit user's avatar if avatars are enabled + def avatar_edit_link(user, options={}) + if Setting.gravatar_enabled? + url = "https://gravatar.com" + link_to avatar(user, {:title => l(:button_edit)}.merge(options)), url, :target => '_blank' + end + end + + def sanitize_anchor_name(anchor) + anchor.gsub(%r{[^\s\-\p{Word}]}, '').gsub(%r{\s+(\-+\s*)?}, '-') + end + + # Returns the javascript tags that are included in the html layout head + def javascript_heads + tags = javascript_include_tag('jquery-1.11.1-ui-1.11.0-ujs-3.1.4', 'application', 'responsive') + unless User.current.pref.warn_on_leaving_unsaved == '0' + tags << "\n".html_safe + javascript_tag("$(window).load(function(){ warnLeavingUnsaved('#{escape_javascript l(:text_warn_on_leaving_unsaved)}'); });") + end + tags + end + + def favicon + "".html_safe + end + + # Returns the path to the favicon + def favicon_path + icon = (current_theme && current_theme.favicon?) ? current_theme.favicon_path : '/favicon.ico' + image_path(icon) + end + + # Returns the full URL to the favicon + def favicon_url + # TODO: use #image_url introduced in Rails4 + path = favicon_path + base = url_for(:controller => 'welcome', :action => 'index', :only_path => false) + base.sub(%r{/+$},'') + '/' + path.sub(%r{^/+},'') + end + + def robot_exclusion_tag + ''.html_safe + end + + # Returns true if arg is expected in the API response + def include_in_api_response?(arg) + unless @included_in_api_response + param = params[:include] + @included_in_api_response = param.is_a?(Array) ? param.collect(&:to_s) : param.to_s.split(',') + @included_in_api_response.collect!(&:strip) + end + @included_in_api_response.include?(arg.to_s) + end + + # Returns options or nil if nometa param or X-Redmine-Nometa header + # was set in the request + def api_meta(options) + if params[:nometa].present? || request.headers['X-Redmine-Nometa'] + # compatibility mode for activeresource clients that raise + # an error when deserializing an array with attributes + nil + else + options + end + end + + def generate_csv(&block) + decimal_separator = l(:general_csv_decimal_separator) + encoding = l(:general_csv_encoding) + end + + private + + def wiki_helper + helper = Redmine::WikiFormatting.helper_for(Setting.text_formatting) + extend helper + return self + end + + # remove double quotes if any + def remove_double_quotes(identifier) + name = identifier.gsub(%r{^"(.*)"$}, "\\1") + return CGI.unescapeHTML(name) + end +end diff --git a/app/helpers/attachments_helper.rb b/app/helpers/attachments_helper.rb new file mode 100644 index 0000000..36cf0d4 --- /dev/null +++ b/app/helpers/attachments_helper.rb @@ -0,0 +1,81 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module AttachmentsHelper + + def container_attachments_edit_path(container) + object_attachments_edit_path container.class.name.underscore.pluralize, container.id + end + + def container_attachments_path(container) + object_attachments_path container.class.name.underscore.pluralize, container.id + end + + # Displays view/delete links to the attachments of the given object + # Options: + # :author -- author names are not displayed if set to false + # :thumbails -- display thumbnails if enabled in settings + def link_to_attachments(container, options = {}) + options.assert_valid_keys(:author, :thumbnails) + + attachments = if container.attachments.loaded? + container.attachments + else + container.attachments.preload(:author).to_a + end + + if attachments.any? + options = { + :editable => container.attachments_editable?, + :deletable => container.attachments_deletable?, + :author => true + }.merge(options) + render :partial => 'attachments/links', + :locals => { + :container => container, + :attachments => attachments, + :options => options, + :thumbnails => (options[:thumbnails] && Setting.thumbnails_enabled?) + } + end + end + + def render_api_attachment(attachment, api, options={}) + api.attachment do + render_api_attachment_attributes(attachment, api) + options.each { |key, value| eval("api.#{key} value") } + end + end + + def render_api_attachment_attributes(attachment, api) + api.id attachment.id + api.filename attachment.filename + api.filesize attachment.filesize + api.content_type attachment.content_type + api.description attachment.description + api.content_url download_named_attachment_url(attachment, attachment.filename) + if attachment.thumbnailable? + api.thumbnail_url thumbnail_url(attachment) + end + if attachment.author + api.author(:id => attachment.author.id, :name => attachment.author.name) + end + api.created_on attachment.created_on + end +end diff --git a/app/helpers/auth_sources_helper.rb b/app/helpers/auth_sources_helper.rb new file mode 100644 index 0000000..4f4b1cd --- /dev/null +++ b/app/helpers/auth_sources_helper.rb @@ -0,0 +1,24 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module AuthSourcesHelper + def auth_source_partial_name(auth_source) + "form_#{auth_source.class.name.underscore}" + end +end diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb new file mode 100644 index 0000000..0931dd0 --- /dev/null +++ b/app/helpers/boards_helper.rb @@ -0,0 +1,41 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module BoardsHelper + def board_breadcrumb(item) + board = item.is_a?(Message) ? item.board : item + links = [link_to(l(:label_board_plural), project_boards_path(item.project))] + boards = board.ancestors.reverse + if item.is_a?(Message) + boards << board + end + links += boards.map {|ancestor| link_to(h(ancestor.name), project_board_path(ancestor.project, ancestor))} + breadcrumb links + end + + def boards_options_for_select(boards) + options = [] + Board.board_tree(boards) do |board, level| + label = (level > 0 ? ' ' * 2 * level + '» ' : '').html_safe + label << board.name + options << [label, board.id] + end + options + end +end diff --git a/app/helpers/calendars_helper.rb b/app/helpers/calendars_helper.rb new file mode 100644 index 0000000..715667c --- /dev/null +++ b/app/helpers/calendars_helper.rb @@ -0,0 +1,58 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module CalendarsHelper + def link_to_previous_month(year, month, options={}) + target_year, target_month = if month == 1 + [year - 1, 12] + else + [year, month - 1] + end + + name = if target_month == 12 + "#{month_name(target_month)} #{target_year}" + else + "#{month_name(target_month)}" + end + + # \xc2\xab(utf-8) = « + link_to_month(("\xc2\xab " + name), target_year, target_month, options) + end + + def link_to_next_month(year, month, options={}) + target_year, target_month = if month == 12 + [year + 1, 1] + else + [year, month + 1] + end + + name = if target_month == 1 + "#{month_name(target_month)} #{target_year}" + else + "#{month_name(target_month)}" + end + + # \xc2\xbb(utf-8) = » + link_to_month((name + " \xc2\xbb"), target_year, target_month, options) + end + + def link_to_month(link_name, year, month, options={}) + link_to(link_name, {:params => request.query_parameters.merge(:year => year, :month => month)}, options) + end +end diff --git a/app/helpers/context_menus_helper.rb b/app/helpers/context_menus_helper.rb new file mode 100644 index 0000000..0254d3a --- /dev/null +++ b/app/helpers/context_menus_helper.rb @@ -0,0 +1,50 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module ContextMenusHelper + def context_menu_link(name, url, options={}) + options[:class] ||= '' + if options.delete(:selected) + options[:class] << ' icon-checked disabled' + options[:disabled] = true + end + if options.delete(:disabled) + options.delete(:method) + options.delete(:data) + options[:onclick] = 'return false;' + options[:class] << ' disabled' + url = '#' + end + link_to h(name), url, options + end + + def bulk_update_custom_field_context_menu_link(field, text, value) + context_menu_link h(text), + bulk_update_issues_path(:ids => @issue_ids, :issue => {'custom_field_values' => {field.id => value}}, :back_url => @back), + :method => :post, + :selected => (@issue && @issue.custom_field_value(field) == value) + end + + def bulk_update_time_entry_custom_field_context_menu_link(field, text, value) + context_menu_link h(text), + bulk_update_time_entries_path(:ids => @time_entries.map(&:id).sort, :time_entry => {'custom_field_values' => {field.id => value}}, :back_url => @back), + :method => :post, + :selected => (@time_entry && @time_entry.custom_field_value(field) == value) + end +end diff --git a/app/helpers/custom_fields_helper.rb b/app/helpers/custom_fields_helper.rb new file mode 100644 index 0000000..08c8c58 --- /dev/null +++ b/app/helpers/custom_fields_helper.rb @@ -0,0 +1,183 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module CustomFieldsHelper + + CUSTOM_FIELDS_TABS = [ + {:name => 'IssueCustomField', :partial => 'custom_fields/index', + :label => :label_issue_plural}, + {:name => 'TimeEntryCustomField', :partial => 'custom_fields/index', + :label => :label_spent_time}, + {:name => 'ProjectCustomField', :partial => 'custom_fields/index', + :label => :label_project_plural}, + {:name => 'VersionCustomField', :partial => 'custom_fields/index', + :label => :label_version_plural}, + {:name => 'DocumentCustomField', :partial => 'custom_fields/index', + :label => :label_document_plural}, + {:name => 'UserCustomField', :partial => 'custom_fields/index', + :label => :label_user_plural}, + {:name => 'GroupCustomField', :partial => 'custom_fields/index', + :label => :label_group_plural}, + {:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index', + :label => TimeEntryActivity::OptionName}, + {:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index', + :label => IssuePriority::OptionName}, + {:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index', + :label => DocumentCategory::OptionName} + ] + + def render_custom_fields_tabs(types) + tabs = CUSTOM_FIELDS_TABS.select {|h| types.include?(h[:name]) } + render_tabs tabs + end + + def custom_field_type_options + CUSTOM_FIELDS_TABS.map {|h| [l(h[:label]), h[:name]]} + end + + def custom_field_title(custom_field) + items = [] + items << [l(:label_custom_field_plural), custom_fields_path] + items << [l(custom_field.type_name), custom_fields_path(:tab => custom_field.class.name)] if custom_field + items << (custom_field.nil? || custom_field.new_record? ? l(:label_custom_field_new) : custom_field.name) + + title(*items) + end + + def render_custom_field_format_partial(form, custom_field) + partial = custom_field.format.form_partial + if partial + render :partial => custom_field.format.form_partial, :locals => {:f => form, :custom_field => custom_field} + end + end + + def custom_field_tag_name(prefix, custom_field) + name = "#{prefix}[custom_field_values][#{custom_field.id}]" + name << "[]" if custom_field.multiple? + name + end + + def custom_field_tag_id(prefix, custom_field) + "#{prefix}_custom_field_values_#{custom_field.id}" + end + + # Return custom field html tag corresponding to its format + def custom_field_tag(prefix, custom_value) + custom_value.custom_field.format.edit_tag self, + custom_field_tag_id(prefix, custom_value.custom_field), + custom_field_tag_name(prefix, custom_value.custom_field), + custom_value, + :class => "#{custom_value.custom_field.field_format}_cf" + end + + # Return custom field name tag + def custom_field_name_tag(custom_field) + title = custom_field.description.presence + css = title ? "field-description" : nil + content_tag 'span', custom_field.name, :title => title, :class => css + end + + # Return custom field label tag + def custom_field_label_tag(name, custom_value, options={}) + required = options[:required] || custom_value.custom_field.is_required? + for_tag_id = options.fetch(:for_tag_id, "#{name}_custom_field_values_#{custom_value.custom_field.id}") + content = custom_field_name_tag custom_value.custom_field + + content_tag "label", content + + (required ? " *".html_safe : ""), + :for => for_tag_id + end + + # Return custom field tag with its label tag + def custom_field_tag_with_label(name, custom_value, options={}) + tag = custom_field_tag(name, custom_value) + tag_id = nil + ids = tag.scan(/ id="(.+?)"/) + if ids.size == 1 + tag_id = ids.first.first + end + custom_field_label_tag(name, custom_value, options.merge(:for_tag_id => tag_id)) + tag + end + + # Returns the custom field tag for when bulk editing objects + def custom_field_tag_for_bulk_edit(prefix, custom_field, objects=nil, value='') + custom_field.format.bulk_edit_tag self, + custom_field_tag_id(prefix, custom_field), + custom_field_tag_name(prefix, custom_field), + custom_field, + objects, + value, + :class => "#{custom_field.field_format}_cf" + end + + # Return a string used to display a custom value + def show_value(custom_value, html=true) + format_object(custom_value, html) + end + + # Return a string used to display a custom value + def format_value(value, custom_field) + format_object(custom_field.format.formatted_value(self, custom_field, value, false), false) + end + + # Return an array of custom field formats which can be used in select_tag + def custom_field_formats_for_select(custom_field) + Redmine::FieldFormat.as_select(custom_field.class.customized_class.name) + end + + # Yields the given block for each custom field value of object that should be + # displayed, with the custom field and the formatted value as arguments + def render_custom_field_values(object, &block) + object.visible_custom_field_values.each do |custom_value| + formatted = show_value(custom_value) + if formatted.present? + yield custom_value.custom_field, formatted + end + end + end + + # Renders the custom_values in api views + def render_api_custom_values(custom_values, api) + api.array :custom_fields do + custom_values.each do |custom_value| + attrs = {:id => custom_value.custom_field_id, :name => custom_value.custom_field.name} + attrs.merge!(:multiple => true) if custom_value.custom_field.multiple? + api.custom_field attrs do + if custom_value.value.is_a?(Array) + api.array :value do + custom_value.value.each do |value| + api.value value unless value.blank? + end + end + else + api.value custom_value.value + end + end + end + end unless custom_values.empty? + end + + def edit_tag_style_tag(form, options={}) + select_options = [[l(:label_drop_down_list), ''], [l(:label_checkboxes), 'check_box']] + if options[:include_radio] + select_options << [l(:label_radio_buttons), 'radio'] + end + form.select :edit_tag_style, select_options, :label => :label_display + end +end diff --git a/app/helpers/documents_helper.rb b/app/helpers/documents_helper.rb new file mode 100644 index 0000000..a6741b8 --- /dev/null +++ b/app/helpers/documents_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module DocumentsHelper +end diff --git a/app/helpers/email_addresses_helper.rb b/app/helpers/email_addresses_helper.rb new file mode 100644 index 0000000..1f44f21 --- /dev/null +++ b/app/helpers/email_addresses_helper.rb @@ -0,0 +1,38 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module EmailAddressesHelper + + # Returns a link to enable or disable notifications for the address + def toggle_email_address_notify_link(address) + if address.notify? + link_to l(:label_disable_notifications), + user_email_address_path(address.user, address, :notify => '0'), + :method => :put, :remote => true, + :title => l(:label_disable_notifications), + :class => 'icon-only icon-email' + else + link_to l(:label_enable_notifications), + user_email_address_path(address.user, address, :notify => '1'), + :method => :put, :remote => true, + :title => l(:label_enable_notifications), + :class => 'icon-only icon-email-disabled' + end + end +end diff --git a/app/helpers/enumerations_helper.rb b/app/helpers/enumerations_helper.rb new file mode 100644 index 0000000..2759e84 --- /dev/null +++ b/app/helpers/enumerations_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module EnumerationsHelper +end diff --git a/app/helpers/gantt_helper.rb b/app/helpers/gantt_helper.rb new file mode 100644 index 0000000..6558589 --- /dev/null +++ b/app/helpers/gantt_helper.rb @@ -0,0 +1,43 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module GanttHelper + + def gantt_zoom_link(gantt, in_or_out) + case in_or_out + when :in + if gantt.zoom < 4 + link_to l(:text_zoom_in), + {:params => request.query_parameters.merge(gantt.params.merge(:zoom => (gantt.zoom + 1)))}, + :class => 'icon icon-zoom-in' + else + content_tag(:span, l(:text_zoom_in), :class => 'icon icon-zoom-in').html_safe + end + + when :out + if gantt.zoom > 1 + link_to l(:text_zoom_out), + {:params => request.query_parameters.merge(gantt.params.merge(:zoom => (gantt.zoom - 1)))}, + :class => 'icon icon-zoom-out' + else + content_tag(:span, l(:text_zoom_out), :class => 'icon icon-zoom-out').html_safe + end + end + end +end diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb new file mode 100644 index 0000000..7eb885f --- /dev/null +++ b/app/helpers/groups_helper.rb @@ -0,0 +1,46 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module GroupsHelper + def group_settings_tabs(group) + tabs = [] + tabs << {:name => 'general', :partial => 'groups/general', :label => :label_general} + tabs << {:name => 'users', :partial => 'groups/users', :label => :label_user_plural} if group.givable? + tabs << {:name => 'memberships', :partial => 'groups/memberships', :label => :label_project_plural} + tabs + end + + def render_principals_for_new_group_users(group, limit=100) + scope = User.active.sorted.not_in_group(group).like(params[:q]) + principal_count = scope.count + principal_pages = Redmine::Pagination::Paginator.new principal_count, limit, params['page'] + principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).to_a + + s = content_tag('div', + content_tag('div', principals_check_box_tags('user_ids[]', principals), :id => 'principals'), + :class => 'objects-selection' + ) + + links = pagination_links_full(principal_pages, principal_count, :per_page_links => false) {|text, parameters, options| + link_to text, autocomplete_for_user_group_path(group, parameters.merge(:q => params[:q], :format => 'js')), :remote => true + } + + s + content_tag('span', links, :class => 'pagination') + end +end diff --git a/app/helpers/imports_helper.rb b/app/helpers/imports_helper.rb new file mode 100644 index 0000000..39f3b95 --- /dev/null +++ b/app/helpers/imports_helper.rb @@ -0,0 +1,47 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module ImportsHelper + def options_for_mapping_select(import, field, options={}) + tags = "".html_safe + blank_text = options[:required] ? "-- #{l(:actionview_instancetag_blank_option)} --" : " ".html_safe + tags << content_tag('option', blank_text, :value => '') + tags << options_for_select(import.columns_options, import.mapping[field]) + if values = options[:values] + tags << content_tag('option', '--', :disabled => true) + tags << options_for_select(values.map {|text, value| [text, "value:#{value}"]}, import.mapping[field]) + end + tags + end + + def mapping_select_tag(import, field, options={}) + name = "import_settings[mapping][#{field}]" + select_tag name, options_for_mapping_select(import, field, options), :id => "import_mapping_#{field}" + end + + # Returns the options for the date_format setting + def date_format_options + Import::DATE_FORMATS.map do |f| + format = f.gsub('%', '').gsub(/[dmY]/) do + {'d' => 'DD', 'm' => 'MM', 'Y' => 'YYYY'}[$&] + end + [format, f] + end + end +end diff --git a/app/helpers/issue_categories_helper.rb b/app/helpers/issue_categories_helper.rb new file mode 100644 index 0000000..8af3452 --- /dev/null +++ b/app/helpers/issue_categories_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module IssueCategoriesHelper +end diff --git a/app/helpers/issue_relations_helper.rb b/app/helpers/issue_relations_helper.rb new file mode 100644 index 0000000..6208e56 --- /dev/null +++ b/app/helpers/issue_relations_helper.rb @@ -0,0 +1,25 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module IssueRelationsHelper + def collection_for_relation_type_select + values = IssueRelation::TYPES + values.keys.sort{|x,y| values[x][:order] <=> values[y][:order]}.collect{|k| [l(values[k][:name]), k]} + end +end diff --git a/app/helpers/issue_statuses_helper.rb b/app/helpers/issue_statuses_helper.rb new file mode 100644 index 0000000..49441dd --- /dev/null +++ b/app/helpers/issue_statuses_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module IssueStatusesHelper +end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb new file mode 100644 index 0000000..181907e --- /dev/null +++ b/app/helpers/issues_helper.rb @@ -0,0 +1,546 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module IssuesHelper + include ApplicationHelper + include Redmine::Export::PDF::IssuesPdfHelper + + def issue_list(issues, &block) + ancestors = [] + issues.each do |issue| + while (ancestors.any? && !issue.is_descendant_of?(ancestors.last)) + ancestors.pop + end + yield issue, ancestors.size + ancestors << issue unless issue.leaf? + end + end + + def grouped_issue_list(issues, query, &block) + ancestors = [] + grouped_query_results(issues, query) do |issue, group_name, group_count, group_totals| + while (ancestors.any? && !issue.is_descendant_of?(ancestors.last)) + ancestors.pop + end + yield issue, ancestors.size, group_name, group_count, group_totals + ancestors << issue unless issue.leaf? + end + end + + # Renders a HTML/CSS tooltip + # + # To use, a trigger div is needed. This is a div with the class of "tooltip" + # that contains this method wrapped in a span with the class of "tip" + # + #
    <%= link_to_issue(issue) %> + # <%= render_issue_tooltip(issue) %> + #
    + # + def render_issue_tooltip(issue) + @cached_label_status ||= l(:field_status) + @cached_label_start_date ||= l(:field_start_date) + @cached_label_due_date ||= l(:field_due_date) + @cached_label_assigned_to ||= l(:field_assigned_to) + @cached_label_priority ||= l(:field_priority) + @cached_label_project ||= l(:field_project) + + link_to_issue(issue) + "

    ".html_safe + + "#{@cached_label_project}: #{link_to_project(issue.project)}
    ".html_safe + + "#{@cached_label_status}: #{h(issue.status.name)}
    ".html_safe + + "#{@cached_label_start_date}: #{format_date(issue.start_date)}
    ".html_safe + + "#{@cached_label_due_date}: #{format_date(issue.due_date)}
    ".html_safe + + "#{@cached_label_assigned_to}: #{h(issue.assigned_to)}
    ".html_safe + + "#{@cached_label_priority}: #{h(issue.priority.name)}".html_safe + end + + def issue_heading(issue) + h("#{issue.tracker} ##{issue.id}") + end + + def render_issue_subject_with_tree(issue) + s = '' + ancestors = issue.root? ? [] : issue.ancestors.visible.to_a + ancestors.each do |ancestor| + s << '
    ' + content_tag('p', link_to_issue(ancestor, :project => (issue.project_id != ancestor.project_id))) + end + s << '
    ' + subject = h(issue.subject) + if issue.is_private? + subject = content_tag('span', l(:field_is_private), :class => 'private') + ' ' + subject + end + s << content_tag('h3', subject) + s << '
    ' * (ancestors.size + 1) + s.html_safe + end + + def render_descendants_tree(issue) + s = '' + issue_list(issue.descendants.visible.preload(:status, :priority, :tracker, :assigned_to).sort_by(&:lft)) do |child, level| + css = "issue issue-#{child.id} hascontextmenu #{child.css_classes}" + css << " idnt idnt-#{level}" if level > 0 + s << content_tag('tr', + content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') + + content_tag('td', link_to_issue(child, :project => (issue.project_id != child.project_id)), :class => 'subject', :style => 'width: 50%') + + content_tag('td', h(child.status), :class => 'status') + + content_tag('td', link_to_user(child.assigned_to), :class => 'assigned_to') + + content_tag('td', child.disabled_core_fields.include?('done_ratio') ? '' : progress_bar(child.done_ratio), :class=> 'done_ratio'), + :class => css) + end + s << '
    ' + s.html_safe + end + + # Renders the list of related issues on the issue details view + def render_issue_relations(issue, relations) + manage_relations = User.current.allowed_to?(:manage_issue_relations, issue.project) + + s = ''.html_safe + relations.each do |relation| + other_issue = relation.other_issue(issue) + css = "issue hascontextmenu #{other_issue.css_classes}" + link = manage_relations ? link_to(l(:label_relation_delete), + relation_path(relation), + :remote => true, + :method => :delete, + :data => {:confirm => l(:text_are_you_sure)}, + :title => l(:label_relation_delete), + :class => 'icon-only icon-link-break' + ) : nil + + s << content_tag('tr', + content_tag('td', check_box_tag("ids[]", other_issue.id, false, :id => nil), :class => 'checkbox') + + content_tag('td', relation.to_s(@issue) {|other| link_to_issue(other, :project => Setting.cross_project_issue_relations?)}.html_safe, :class => 'subject', :style => 'width: 50%') + + content_tag('td', other_issue.status, :class => 'status') + + content_tag('td', format_date(other_issue.start_date), :class => 'start_date') + + content_tag('td', format_date(other_issue.due_date), :class => 'due_date') + + content_tag('td', other_issue.disabled_core_fields.include?('done_ratio') ? '' : progress_bar(other_issue.done_ratio), :class=> 'done_ratio') + + content_tag('td', link, :class => 'buttons'), + :id => "relation-#{relation.id}", + :class => css) + end + + content_tag('table', s, :class => 'list issues odd-even') + end + + def issue_estimated_hours_details(issue) + if issue.total_estimated_hours.present? + if issue.total_estimated_hours == issue.estimated_hours + l_hours_short(issue.estimated_hours) + else + s = issue.estimated_hours.present? ? l_hours_short(issue.estimated_hours) : "" + s << " (#{l(:label_total)}: #{l_hours_short(issue.total_estimated_hours)})" + s.html_safe + end + end + end + + def issue_spent_hours_details(issue) + if issue.total_spent_hours > 0 + path = project_time_entries_path(issue.project, :issue_id => "~#{issue.id}") + + if issue.total_spent_hours == issue.spent_hours + link_to(l_hours_short(issue.spent_hours), path) + else + s = issue.spent_hours > 0 ? l_hours_short(issue.spent_hours) : "" + s << " (#{l(:label_total)}: #{link_to l_hours_short(issue.total_spent_hours), path})" + s.html_safe + end + end + end + + # Returns an array of error messages for bulk edited issues + def bulk_edit_error_messages(issues) + messages = {} + issues.each do |issue| + issue.errors.full_messages.each do |message| + messages[message] ||= [] + messages[message] << issue + end + end + messages.map { |message, issues| + "#{message}: " + issues.map {|i| "##{i.id}"}.join(', ') + } + end + + # Returns a link for adding a new subtask to the given issue + def link_to_new_subtask(issue) + attrs = { + :parent_issue_id => issue + } + attrs[:tracker_id] = issue.tracker unless issue.tracker.disabled_core_fields.include?('parent_issue_id') + link_to(l(:button_add), new_project_issue_path(issue.project, :issue => attrs, :back_url => issue_path(issue))) + end + + def trackers_options_for_select(issue) + trackers = issue.allowed_target_trackers + if issue.new_record? && issue.parent_issue_id.present? + trackers = trackers.reject do |tracker| + issue.tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id') + end + end + trackers.collect {|t| [t.name, t.id]} + end + + class IssueFieldsRows + include ActionView::Helpers::TagHelper + + def initialize + @left = [] + @right = [] + end + + def left(*args) + args.any? ? @left << cells(*args) : @left + end + + def right(*args) + args.any? ? @right << cells(*args) : @right + end + + def size + @left.size > @right.size ? @left.size : @right.size + end + + def to_html + content = + content_tag('div', @left.reduce(&:+), :class => 'splitcontentleft') + + content_tag('div', @right.reduce(&:+), :class => 'splitcontentleft') + + content_tag('div', content, :class => 'splitcontent') + end + + def cells(label, text, options={}) + options[:class] = [options[:class] || "", 'attribute'].join(' ') + content_tag 'div', + content_tag('div', label + ":", :class => 'label') + content_tag('div', text, :class => 'value'), + options + end + end + + def issue_fields_rows + r = IssueFieldsRows.new + yield r + r.to_html + end + + def render_half_width_custom_fields_rows(issue) + values = issue.visible_custom_field_values.reject {|value| value.custom_field.full_width_layout?} + return if values.empty? + half = (values.size / 2.0).ceil + issue_fields_rows do |rows| + values.each_with_index do |value, i| + css = "cf_#{value.custom_field.id}" + attr_value = show_value(value) + if value.custom_field.text_formatting == 'full' + attr_value = content_tag('div', attr_value, class: 'wiki') + end + m = (i < half ? :left : :right) + rows.send m, custom_field_name_tag(value.custom_field), attr_value, :class => css + end + end + end + + def render_full_width_custom_fields_rows(issue) + values = issue.visible_custom_field_values.select {|value| value.custom_field.full_width_layout?} + return if values.empty? + + s = ''.html_safe + values.each_with_index do |value, i| + attr_value = show_value(value) + next if attr_value.blank? + + if value.custom_field.text_formatting == 'full' + attr_value = content_tag('div', attr_value, class: 'wiki') + end + + content = + content_tag('hr') + + content_tag('p', content_tag('strong', custom_field_name_tag(value.custom_field) )) + + content_tag('div', attr_value, class: 'value') + s << content_tag('div', content, class: "cf_#{value.custom_field.id} attribute") + end + s + end + + # Returns the path for updating the issue form + # with project as the current project + def update_issue_form_path(project, issue) + options = {:format => 'js'} + if issue.new_record? + if project + new_project_issue_path(project, options) + else + new_issue_path(options) + end + else + edit_issue_path(issue, options) + end + end + + # Returns the number of descendants for an array of issues + def issues_descendant_count(issues) + ids = issues.reject(&:leaf?).map {|issue| issue.descendants.ids}.flatten.uniq + ids -= issues.map(&:id) + ids.size + end + + def issues_destroy_confirmation_message(issues) + issues = [issues] unless issues.is_a?(Array) + message = l(:text_issues_destroy_confirmation) + + descendant_count = issues_descendant_count(issues) + if descendant_count > 0 + message << "\n" + l(:text_issues_destroy_descendants_confirmation, :count => descendant_count) + end + message + end + + # Returns an array of users that are proposed as watchers + # on the new issue form + def users_for_new_issue_watchers(issue) + users = issue.watcher_users.select{|u| u.status == User::STATUS_ACTIVE} + if issue.project.users.count <= 20 + users = (users + issue.project.users.sort).uniq + end + users + end + + def email_issue_attributes(issue, user, html) + items = [] + %w(author status priority assigned_to category fixed_version).each do |attribute| + unless issue.disabled_core_fields.include?(attribute+"_id") + if html + items << content_tag('strong', "#{l("field_#{attribute}")}: ") + (issue.send attribute) + else + items << "#{l("field_#{attribute}")}: #{issue.send attribute}" + end + end + end + issue.visible_custom_field_values(user).each do |value| + if html + items << content_tag('strong', "#{value.custom_field.name}: ") + show_value(value, false) + else + items << "#{value.custom_field.name}: #{show_value(value, false)}" + end + end + items + end + + def render_email_issue_attributes(issue, user, html=false) + items = email_issue_attributes(issue, user, html) + if html + content_tag('ul', items.map{|s| content_tag('li', s)}.join("\n").html_safe, :class => "details") + else + items.map{|s| "* #{s}"}.join("\n") + end + end + + # Returns the textual representation of a journal details + # as an array of strings + def details_to_strings(details, no_html=false, options={}) + options[:only_path] = (options[:only_path] == false ? false : true) + strings = [] + values_by_field = {} + details.each do |detail| + if detail.property == 'cf' + field = detail.custom_field + if field && field.multiple? + values_by_field[field] ||= {:added => [], :deleted => []} + if detail.old_value + values_by_field[field][:deleted] << detail.old_value + end + if detail.value + values_by_field[field][:added] << detail.value + end + next + end + end + strings << show_detail(detail, no_html, options) + end + if values_by_field.present? + multiple_values_detail = Struct.new(:property, :prop_key, :custom_field, :old_value, :value) + values_by_field.each do |field, changes| + if changes[:added].any? + detail = multiple_values_detail.new('cf', field.id.to_s, field) + detail.value = changes[:added] + strings << show_detail(detail, no_html, options) + end + if changes[:deleted].any? + detail = multiple_values_detail.new('cf', field.id.to_s, field) + detail.old_value = changes[:deleted] + strings << show_detail(detail, no_html, options) + end + end + end + strings + end + + # Returns the textual representation of a single journal detail + def show_detail(detail, no_html=false, options={}) + multiple = false + show_diff = false + no_details = false + + case detail.property + when 'attr' + field = detail.prop_key.to_s.gsub(/\_id$/, "") + label = l(("field_" + field).to_sym) + case detail.prop_key + when 'due_date', 'start_date' + value = format_date(detail.value.to_date) if detail.value + old_value = format_date(detail.old_value.to_date) if detail.old_value + + when 'project_id', 'status_id', 'tracker_id', 'assigned_to_id', + 'priority_id', 'category_id', 'fixed_version_id' + value = find_name_by_reflection(field, detail.value) + old_value = find_name_by_reflection(field, detail.old_value) + + when 'estimated_hours' + value = l_hours_short(detail.value.to_f) unless detail.value.blank? + old_value = l_hours_short(detail.old_value.to_f) unless detail.old_value.blank? + + when 'parent_id' + label = l(:field_parent_issue) + value = "##{detail.value}" unless detail.value.blank? + old_value = "##{detail.old_value}" unless detail.old_value.blank? + + when 'is_private' + value = l(detail.value == "0" ? :general_text_No : :general_text_Yes) unless detail.value.blank? + old_value = l(detail.old_value == "0" ? :general_text_No : :general_text_Yes) unless detail.old_value.blank? + + when 'description' + show_diff = true + end + when 'cf' + custom_field = detail.custom_field + if custom_field + label = custom_field.name + if custom_field.format.class.change_no_details + no_details = true + elsif custom_field.format.class.change_as_diff + show_diff = true + else + multiple = custom_field.multiple? + value = format_value(detail.value, custom_field) if detail.value + old_value = format_value(detail.old_value, custom_field) if detail.old_value + end + end + when 'attachment' + label = l(:label_attachment) + when 'relation' + if detail.value && !detail.old_value + rel_issue = Issue.visible.find_by_id(detail.value) + value = rel_issue.nil? ? "#{l(:label_issue)} ##{detail.value}" : + (no_html ? rel_issue : link_to_issue(rel_issue, :only_path => options[:only_path])) + elsif detail.old_value && !detail.value + rel_issue = Issue.visible.find_by_id(detail.old_value) + old_value = rel_issue.nil? ? "#{l(:label_issue)} ##{detail.old_value}" : + (no_html ? rel_issue : link_to_issue(rel_issue, :only_path => options[:only_path])) + end + relation_type = IssueRelation::TYPES[detail.prop_key] + label = l(relation_type[:name]) if relation_type + end + call_hook(:helper_issues_show_detail_after_setting, + {:detail => detail, :label => label, :value => value, :old_value => old_value }) + + label ||= detail.prop_key + value ||= detail.value + old_value ||= detail.old_value + + unless no_html + label = content_tag('strong', label) + old_value = content_tag("i", h(old_value)) if detail.old_value + if detail.old_value && detail.value.blank? && detail.property != 'relation' + old_value = content_tag("del", old_value) + end + if detail.property == 'attachment' && value.present? && + atta = detail.journal.journalized.attachments.detect {|a| a.id == detail.prop_key.to_i} + # Link to the attachment if it has not been removed + value = link_to_attachment(atta, only_path: options[:only_path]) + if options[:only_path] != false + value += ' ' + value += link_to_attachment atta, class: 'icon-only icon-download', title: l(:button_download), download: true + end + else + value = content_tag("i", h(value)) if value + end + end + + if no_details + s = l(:text_journal_changed_no_detail, :label => label).html_safe + elsif show_diff + s = l(:text_journal_changed_no_detail, :label => label) + unless no_html + diff_link = link_to 'diff', + diff_journal_url(detail.journal_id, :detail_id => detail.id, :only_path => options[:only_path]), + :title => l(:label_view_diff) + s << " (#{ diff_link })" + end + s.html_safe + elsif detail.value.present? + case detail.property + when 'attr', 'cf' + if detail.old_value.present? + l(:text_journal_changed, :label => label, :old => old_value, :new => value).html_safe + elsif multiple + l(:text_journal_added, :label => label, :value => value).html_safe + else + l(:text_journal_set_to, :label => label, :value => value).html_safe + end + when 'attachment', 'relation' + l(:text_journal_added, :label => label, :value => value).html_safe + end + else + l(:text_journal_deleted, :label => label, :old => old_value).html_safe + end + end + + # Find the name of an associated record stored in the field attribute + def find_name_by_reflection(field, id) + unless id.present? + return nil + end + @detail_value_name_by_reflection ||= Hash.new do |hash, key| + association = Issue.reflect_on_association(key.first.to_sym) + name = nil + if association + record = association.klass.find_by_id(key.last) + if record + name = record.name.force_encoding('UTF-8') + end + end + hash[key] = name + end + @detail_value_name_by_reflection[[field, id]] + end + + # Renders issue children recursively + def render_api_issue_children(issue, api) + return if issue.leaf? + api.array :children do + issue.children.each do |child| + api.issue(:id => child.id) do + api.tracker(:id => child.tracker_id, :name => child.tracker.name) unless child.tracker.nil? + api.subject child.subject + render_api_issue_children(child, api) + end + end + end + end +end diff --git a/app/helpers/journals_helper.rb b/app/helpers/journals_helper.rb new file mode 100644 index 0000000..b1d8774 --- /dev/null +++ b/app/helpers/journals_helper.rb @@ -0,0 +1,69 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module JournalsHelper + + # Returns the attachments of a journal that are displayed as thumbnails + def journal_thumbnail_attachments(journal) + ids = journal.details.select {|d| d.property == 'attachment' && d.value.present?}.map(&:prop_key) + ids.any? ? Attachment.where(:id => ids).select(&:thumbnailable?) : [] + end + + def render_notes(issue, journal, options={}) + content = '' + css_classes = "wiki" + links = [] + if journal.notes.present? + links << link_to(l(:button_quote), + quoted_issue_path(issue, :journal_id => journal), + :remote => true, + :method => 'post', + :title => l(:button_quote), + :class => 'icon-only icon-comment' + ) if options[:reply_links] + + if journal.editable_by?(User.current) + links << link_to(l(:button_edit), + edit_journal_path(journal), + :remote => true, + :method => 'get', + :title => l(:button_edit), + :class => 'icon-only icon-edit' + ) + links << link_to(l(:button_delete), + journal_path(journal, :journal => {:notes => ""}), + :remote => true, + :method => 'put', :data => {:confirm => l(:text_are_you_sure)}, + :title => l(:button_delete), + :class => 'icon-only icon-del' + ) + css_classes << " editable" + end + end + content << content_tag('div', links.join(' ').html_safe, :class => 'contextual') unless links.empty? + content << textilizable(journal, :notes) + content_tag('div', content.html_safe, :id => "journal-#{journal.id}-notes", :class => css_classes) + end + + def render_private_notes_indicator(journal) + content = journal.private_notes? ? l(:field_is_private) : '' + css_classes = journal.private_notes? ? 'private' : '' + content_tag('span', content.html_safe, :id => "journal-#{journal.id}-private_notes", :class => css_classes) + end +end diff --git a/app/helpers/mail_handler_helper.rb b/app/helpers/mail_handler_helper.rb new file mode 100644 index 0000000..f7957ce --- /dev/null +++ b/app/helpers/mail_handler_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module MailHandlerHelper +end diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb new file mode 100644 index 0000000..ff7ff1b --- /dev/null +++ b/app/helpers/members_helper.rb @@ -0,0 +1,38 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module MembersHelper + def render_principals_for_new_members(project, limit=100) + scope = Principal.active.visible.sorted.not_member_of(project).like(params[:q]) + principal_count = scope.count + principal_pages = Redmine::Pagination::Paginator.new principal_count, limit, params['page'] + principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).to_a + + s = content_tag('div', + content_tag('div', principals_check_box_tags('membership[user_ids][]', principals), :id => 'principals'), + :class => 'objects-selection' + ) + + links = pagination_links_full(principal_pages, principal_count, :per_page_links => false) {|text, parameters, options| + link_to text, autocomplete_project_memberships_path(project, parameters.merge(:q => params[:q], :format => 'js')), :remote => true + } + + s + content_tag('span', links, :class => 'pagination') + end +end diff --git a/app/helpers/messages_helper.rb b/app/helpers/messages_helper.rb new file mode 100644 index 0000000..77ca385 --- /dev/null +++ b/app/helpers/messages_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module MessagesHelper +end diff --git a/app/helpers/my_helper.rb b/app/helpers/my_helper.rb new file mode 100644 index 0000000..6c61de8 --- /dev/null +++ b/app/helpers/my_helper.rb @@ -0,0 +1,167 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module MyHelper + # Renders the blocks + def render_blocks(blocks, user, options={}) + s = ''.html_safe + + if blocks.present? + blocks.each do |block| + s << render_block(block, user).to_s + end + end + s + end + + # Renders a single block + def render_block(block, user) + content = render_block_content(block, user) + if content.present? + handle = content_tag('span', '', :class => 'sort-handle', :title => l(:button_move)) + close = link_to(l(:button_delete), + {:action => "remove_block", :block => block}, + :remote => true, :method => 'post', + :class => "icon-only icon-close", :title => l(:button_delete)) + content = content_tag('div', handle + close, :class => 'contextual') + content + + content_tag('div', content, :class => "mypage-box", :id => "block-#{block}") + end + end + + # Renders a single block content + def render_block_content(block, user) + unless block_definition = Redmine::MyPage.find_block(block) + Rails.logger.warn("Unknown block \"#{block}\" found in #{user.login} (id=#{user.id}) preferences") + return + end + + settings = user.pref.my_page_settings(block) + if partial = block_definition[:partial] + begin + render(:partial => partial, :locals => {:user => user, :settings => settings, :block => block}) + rescue ActionView::MissingTemplate + Rails.logger.warn("Partial \"#{partial}\" missing for block \"#{block}\" found in #{user.login} (id=#{user.id}) preferences") + return nil + end + else + send "render_#{block_definition[:name]}_block", block, settings + end + end + + # Returns the select tag used to add a block to My page + def block_select_tag(user) + blocks_in_use = user.pref.my_page_layout.values.flatten + options = content_tag('option') + Redmine::MyPage.block_options(blocks_in_use).each do |label, block| + options << content_tag('option', label, :value => block, :disabled => block.blank?) + end + select_tag('block', options, :id => "block-select", :onchange => "$('#block-form').submit();") + end + + def render_calendar_block(block, settings) + calendar = Redmine::Helpers::Calendar.new(User.current.today, current_language, :week) + calendar.events = Issue.visible. + where(:project_id => User.current.projects.map(&:id)). + where("(start_date>=? and start_date<=?) or (due_date>=? and due_date<=?)", calendar.startdt, calendar.enddt, calendar.startdt, calendar.enddt). + includes(:project, :tracker, :priority, :assigned_to). + references(:project, :tracker, :priority, :assigned_to). + to_a + + render :partial => 'my/blocks/calendar', :locals => {:calendar => calendar, :block => block} + end + + def render_documents_block(block, settings) + documents = Document.visible.order("#{Document.table_name}.created_on DESC").limit(10).to_a + + render :partial => 'my/blocks/documents', :locals => {:block => block, :documents => documents} + end + + def render_issuesassignedtome_block(block, settings) + query = IssueQuery.new(:name => l(:label_assigned_to_me_issues), :user => User.current) + query.add_filter 'assigned_to_id', '=', ['me'] + query.column_names = settings[:columns].presence || ['project', 'tracker', 'status', 'subject'] + query.sort_criteria = settings[:sort].presence || [['priority', 'desc'], ['updated_on', 'desc']] + issues = query.issues(:limit => 10) + + render :partial => 'my/blocks/issues', :locals => {:query => query, :issues => issues, :block => block} + end + + def render_issuesreportedbyme_block(block, settings) + query = IssueQuery.new(:name => l(:label_reported_issues), :user => User.current) + query.add_filter 'author_id', '=', ['me'] + query.column_names = settings[:columns].presence || ['project', 'tracker', 'status', 'subject'] + query.sort_criteria = settings[:sort].presence || [['updated_on', 'desc']] + issues = query.issues(:limit => 10) + + render :partial => 'my/blocks/issues', :locals => {:query => query, :issues => issues, :block => block} + end + + def render_issueswatched_block(block, settings) + query = IssueQuery.new(:name => l(:label_watched_issues), :user => User.current) + query.add_filter 'watcher_id', '=', ['me'] + query.column_names = settings[:columns].presence || ['project', 'tracker', 'status', 'subject'] + query.sort_criteria = settings[:sort].presence || [['updated_on', 'desc']] + issues = query.issues(:limit => 10) + + render :partial => 'my/blocks/issues', :locals => {:query => query, :issues => issues, :block => block} + end + + def render_issuequery_block(block, settings) + query = IssueQuery.visible.find_by_id(settings[:query_id]) + + if query + query.column_names = settings[:columns] if settings[:columns].present? + query.sort_criteria = settings[:sort] if settings[:sort].present? + issues = query.issues(:limit => 10) + render :partial => 'my/blocks/issues', :locals => {:query => query, :issues => issues, :block => block, :settings => settings} + else + queries = IssueQuery.visible.sorted + render :partial => 'my/blocks/issue_query_selection', :locals => {:queries => queries, :block => block, :settings => settings} + end + end + + def render_news_block(block, settings) + news = News.visible. + where(:project_id => User.current.projects.map(&:id)). + limit(10). + includes(:project, :author). + references(:project, :author). + order("#{News.table_name}.created_on DESC"). + to_a + + render :partial => 'my/blocks/news', :locals => {:block => block, :news => news} + end + + def render_timelog_block(block, settings) + days = settings[:days].to_i + days = 7 if days < 1 || days > 365 + + entries = TimeEntry. + where("#{TimeEntry.table_name}.user_id = ? AND #{TimeEntry.table_name}.spent_on BETWEEN ? AND ?", User.current.id, User.current.today - (days - 1), User.current.today). + joins(:activity, :project). + references(:issue => [:tracker, :status]). + includes(:issue => [:tracker, :status]). + order("#{TimeEntry.table_name}.spent_on DESC, #{Project.table_name}.name ASC, #{Tracker.table_name}.position ASC, #{Issue.table_name}.id ASC"). + to_a + entries_by_day = entries.group_by(&:spent_on) + + render :partial => 'my/blocks/timelog', :locals => {:block => block, :entries => entries, :entries_by_day => entries_by_day, :days => days} + end +end diff --git a/app/helpers/news_helper.rb b/app/helpers/news_helper.rb new file mode 100644 index 0000000..f105593 --- /dev/null +++ b/app/helpers/news_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module NewsHelper +end diff --git a/app/helpers/principal_memberships_helper.rb b/app/helpers/principal_memberships_helper.rb new file mode 100644 index 0000000..bf6898f --- /dev/null +++ b/app/helpers/principal_memberships_helper.rb @@ -0,0 +1,64 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module PrincipalMembershipsHelper + def render_principal_memberships(principal) + render :partial => 'principal_memberships/index', :locals => {:principal => principal} + end + + def call_table_header_hook(principal) + if principal.is_a?(Group) + call_hook :view_groups_memberships_table_header, :group => principal + else + call_hook :view_users_memberships_table_header, :user => principal + end + end + + def call_table_row_hook(principal, membership) + if principal.is_a?(Group) + call_hook :view_groups_memberships_table_row, :group => principal, :membership => membership + else + call_hook :view_users_memberships_table_row, :user => principal, :membership => membership + end + end + + def new_principal_membership_path(principal, *args) + if principal.is_a?(Group) + new_group_membership_path(principal, *args) + else + new_user_membership_path(principal, *args) + end + end + + def edit_principal_membership_path(principal, *args) + if principal.is_a?(Group) + edit_group_membership_path(principal, *args) + else + edit_user_membership_path(principal, *args) + end + end + + def principal_membership_path(principal, membership, *args) + if principal.is_a?(Group) + group_membership_path(principal, membership, *args) + else + user_membership_path(principal, membership, *args) + end + end +end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb new file mode 100644 index 0000000..78e192b --- /dev/null +++ b/app/helpers/projects_helper.rb @@ -0,0 +1,140 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module ProjectsHelper + def project_settings_tabs + tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural}, + {:name => 'modules', :action => :select_project_modules, :partial => 'projects/settings/modules', :label => :label_module_plural}, + {:name => 'members', :action => :manage_members, :partial => 'projects/settings/members', :label => :label_member_plural}, + {:name => 'versions', :action => :manage_versions, :partial => 'projects/settings/versions', :label => :label_version_plural, + :url => {:tab => 'versions', :version_status => params[:version_status], :version_name => params[:version_name]}}, + {:name => 'categories', :action => :manage_categories, :partial => 'projects/settings/issue_categories', :label => :label_issue_category_plural}, + {:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki}, + {:name => 'repositories', :action => :manage_repository, :partial => 'projects/settings/repositories', :label => :label_repository_plural}, + {:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural}, + {:name => 'activities', :action => :manage_project_activities, :partial => 'projects/settings/activities', :label => :enumeration_activities} + ] + tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)} + end + + def parent_project_select_tag(project) + selected = project.parent + # retrieve the requested parent project + parent_id = (params[:project] && params[:project][:parent_id]) || params[:parent_id] + if parent_id + selected = (parent_id.blank? ? nil : Project.find(parent_id)) + end + + options = '' + options << "" if project.allowed_parents.include?(nil) + options << project_tree_options_for_select(project.allowed_parents.compact, :selected => selected) + content_tag('select', options.html_safe, :name => 'project[parent_id]', :id => 'project_parent_id') + end + + def render_project_action_links + links = "".html_safe + if User.current.allowed_to?(:add_project, nil, :global => true) + links << link_to(l(:label_project_new), new_project_path, :class => 'icon icon-add') + end + links + end + + # Renders the projects index + def render_project_hierarchy(projects) + render_project_nested_lists(projects) do |project| + s = link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'icon icon-fav my-project' : nil}") + if project.description.present? + s << content_tag('div', textilizable(project.short_description, :project => project), :class => 'wiki description') + end + s + end + end + + # Returns a set of options for a select field, grouped by project. + def version_options_for_select(versions, selected=nil) + grouped = Hash.new {|h,k| h[k] = []} + versions.each do |version| + grouped[version.project.name] << [version.name, version.id] + end + + selected = selected.is_a?(Version) ? selected.id : selected + if grouped.keys.size > 1 + grouped_options_for_select(grouped, selected) + else + options_for_select((grouped.values.first || []), selected) + end + end + + def project_default_version_options(project) + versions = project.shared_versions.open.to_a + if project.default_version && !versions.include?(project.default_version) + versions << project.default_version + end + version_options_for_select(versions, project.default_version) + end + + def project_default_assigned_to_options(project) + assignable_users = (project.assignable_users.to_a + [project.default_assigned_to]).uniq.compact + principals_options_for_select(assignable_users, project.default_assigned_to) + end + + def format_version_sharing(sharing) + sharing = 'none' unless Version::VERSION_SHARINGS.include?(sharing) + l("label_version_sharing_#{sharing}") + end + + def render_boards_tree(boards, parent=nil, level=0, &block) + selection = boards.select {|b| b.parent == parent} + return '' if selection.empty? + + s = ''.html_safe + selection.each do |board| + node = capture(board, level, &block) + node << render_boards_tree(boards, board, level+1, &block) + s << content_tag('div', node) + end + content_tag('div', s, :class => 'sort-level') + end + + def render_api_includes(project, api) + api.array :trackers do + project.trackers.each do |tracker| + api.tracker(:id => tracker.id, :name => tracker.name) + end + end if include_in_api_response?('trackers') + + api.array :issue_categories do + project.issue_categories.each do |category| + api.issue_category(:id => category.id, :name => category.name) + end + end if include_in_api_response?('issue_categories') + + api.array :time_entry_activities do + project.activities.each do |activity| + api.time_entry_activity(:id => activity.id, :name => activity.name) + end + end if include_in_api_response?('time_entry_activities') + + api.array :enabled_modules do + project.enabled_modules.each do |enabled_module| + api.enabled_module(:id => enabled_module.id, :name => enabled_module.name) + end + end if include_in_api_response?('enabled_modules') + end +end diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb new file mode 100644 index 0000000..6ad8437 --- /dev/null +++ b/app/helpers/queries_helper.rb @@ -0,0 +1,406 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module QueriesHelper + include ApplicationHelper + + def filters_options_for_select(query) + ungrouped = [] + grouped = {} + query.available_filters.map do |field, field_options| + if field_options[:type] == :relation + group = :label_relations + elsif field_options[:type] == :tree + group = query.is_a?(IssueQuery) ? :label_relations : nil + elsif field =~ /^cf_\d+\./ + group = (field_options[:through] || field_options[:field]).try(:name) + elsif field =~ /^(.+)\./ + # association filters + group = "field_#{$1}".to_sym + elsif %w(member_of_group assigned_to_role).include?(field) + group = :field_assigned_to + elsif field_options[:type] == :date_past || field_options[:type] == :date + group = :label_date + end + if group + (grouped[group] ||= []) << [field_options[:name], field] + else + ungrouped << [field_options[:name], field] + end + end + # Don't group dates if there's only one (eg. time entries filters) + if grouped[:label_date].try(:size) == 1 + ungrouped << grouped.delete(:label_date).first + end + s = options_for_select([[]] + ungrouped) + if grouped.present? + localized_grouped = grouped.map {|k,v| [k.is_a?(Symbol) ? l(k) : k.to_s, v]} + s << grouped_options_for_select(localized_grouped) + end + s + end + + def query_filters_hidden_tags(query) + tags = ''.html_safe + query.filters.each do |field, options| + tags << hidden_field_tag("f[]", field, :id => nil) + tags << hidden_field_tag("op[#{field}]", options[:operator], :id => nil) + options[:values].each do |value| + tags << hidden_field_tag("v[#{field}][]", value, :id => nil) + end + end + tags + end + + def query_columns_hidden_tags(query) + tags = ''.html_safe + query.columns.each do |column| + tags << hidden_field_tag("c[]", column.name, :id => nil) + end + tags + end + + def query_hidden_tags(query) + query_filters_hidden_tags(query) + query_columns_hidden_tags(query) + end + + def group_by_column_select_tag(query) + options = [[]] + query.groupable_columns.collect {|c| [c.caption, c.name.to_s]} + select_tag('group_by', options_for_select(options, @query.group_by)) + end + + def available_block_columns_tags(query) + tags = ''.html_safe + query.available_block_columns.each do |column| + tags << content_tag('label', check_box_tag('c[]', column.name.to_s, query.has_column?(column), :id => nil) + " #{column.caption}", :class => 'inline') + end + tags + end + + def available_totalable_columns_tags(query) + tags = ''.html_safe + query.available_totalable_columns.each do |column| + tags << content_tag('label', check_box_tag('t[]', column.name.to_s, query.totalable_columns.include?(column), :id => nil) + " #{column.caption}", :class => 'inline') + end + tags << hidden_field_tag('t[]', '') + tags + end + + def query_available_inline_columns_options(query) + (query.available_inline_columns - query.columns).reject(&:frozen?).collect {|column| [column.caption, column.name]} + end + + def query_selected_inline_columns_options(query) + (query.inline_columns & query.available_inline_columns).reject(&:frozen?).collect {|column| [column.caption, column.name]} + end + + def render_query_columns_selection(query, options={}) + tag_name = (options[:name] || 'c') + '[]' + render :partial => 'queries/columns', :locals => {:query => query, :tag_name => tag_name} + end + + def grouped_query_results(items, query, &block) + result_count_by_group = query.result_count_by_group + previous_group, first = false, true + totals_by_group = query.totalable_columns.inject({}) do |h, column| + h[column] = query.total_by_group_for(column) + h + end + items.each do |item| + group_name = group_count = nil + if query.grouped? + group = query.group_by_column.value(item) + if first || group != previous_group + if group.blank? && group != false + group_name = "(#{l(:label_blank_value)})" + else + group_name = format_object(group) + end + group_name ||= "" + group_count = result_count_by_group ? result_count_by_group[group] : nil + group_totals = totals_by_group.map {|column, t| total_tag(column, t[group] || 0)}.join(" ").html_safe + end + end + yield item, group_name, group_count, group_totals + previous_group, first = group, false + end + end + + def render_query_totals(query) + return unless query.totalable_columns.present? + totals = query.totalable_columns.map do |column| + total_tag(column, query.total_for(column)) + end + content_tag('p', totals.join(" ").html_safe, :class => "query-totals") + end + + def total_tag(column, value) + label = content_tag('span', "#{column.caption}:") + value = if [:hours, :spent_hours, :total_spent_hours, :estimated_hours].include? column.name + format_hours(value) + else + format_object(value) + end + value = content_tag('span', value, :class => 'value') + content_tag('span', label + " " + value, :class => "total-for-#{column.name.to_s.dasherize}") + end + + def column_header(query, column, options={}) + if column.sortable? + css, order = nil, column.default_order + if column.name.to_s == query.sort_criteria.first_key + if query.sort_criteria.first_asc? + css = 'sort asc' + order = 'desc' + else + css = 'sort desc' + order = 'asc' + end + end + param_key = options[:sort_param] || :sort + sort_param = { param_key => query.sort_criteria.add(column.name, order).to_param } + while sort_param.keys.first.to_s =~ /^(.+)\[(.+)\]$/ + sort_param = {$1 => {$2 => sort_param.values.first}} + end + link_options = { + :title => l(:label_sort_by, "\"#{column.caption}\""), + :class => css + } + if options[:sort_link_options] + link_options.merge! options[:sort_link_options] + end + content = link_to(column.caption, + {:params => request.query_parameters.deep_merge(sort_param)}, + link_options + ) + else + content = column.caption + end + content_tag('th', content) + end + + def column_content(column, item) + value = column.value_object(item) + if value.is_a?(Array) + values = value.collect {|v| column_value(column, item, v)}.compact + safe_join(values, ', ') + else + column_value(column, item, value) + end + end + + def column_value(column, item, value) + case column.name + when :id + link_to value, issue_path(item) + when :subject + link_to value, issue_path(item) + when :parent + value ? (value.visible? ? link_to_issue(value, :subject => false) : "##{value.id}") : '' + when :description + item.description? ? content_tag('div', textilizable(item, :description), :class => "wiki") : '' + when :last_notes + item.last_notes.present? ? content_tag('div', textilizable(item, :last_notes), :class => "wiki") : '' + when :done_ratio + progress_bar(value) + when :relations + content_tag('span', + value.to_s(item) {|other| link_to_issue(other, :subject => false, :tracker => false)}.html_safe, + :class => value.css_classes_for(item)) + when :hours, :estimated_hours + format_hours(value) + when :spent_hours + link_to_if(value > 0, format_hours(value), project_time_entries_path(item.project, :issue_id => "#{item.id}")) + when :total_spent_hours + link_to_if(value > 0, format_hours(value), project_time_entries_path(item.project, :issue_id => "~#{item.id}")) + when :attachments + value.to_a.map {|a| format_object(a)}.join(" ").html_safe + else + format_object(value) + end + end + + def csv_content(column, item) + value = column.value_object(item) + if value.is_a?(Array) + value.collect {|v| csv_value(column, item, v)}.compact.join(', ') + else + csv_value(column, item, value) + end + end + + def csv_value(column, object, value) + case column.name + when :attachments + value.to_a.map {|a| a.filename}.join("\n") + else + format_object(value, false) do |value| + case value.class.name + when 'Float' + sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator)) + when 'IssueRelation' + value.to_s(object) + when 'Issue' + if object.is_a?(TimeEntry) + "#{value.tracker} ##{value.id}: #{value.subject}" + else + value.id + end + else + value + end + end + end + end + + def query_to_csv(items, query, options={}) + columns = query.columns + + Redmine::Export::CSV.generate do |csv| + # csv header fields + csv << columns.map {|c| c.caption.to_s} + # csv lines + items.each do |item| + csv << columns.map {|c| csv_content(c, item)} + end + end + end + + # Retrieve query from session or build a new query + def retrieve_query(klass=IssueQuery, use_session=true) + session_key = klass.name.underscore.to_sym + + if params[:query_id].present? + cond = "project_id IS NULL" + cond << " OR project_id = #{@project.id}" if @project + @query = klass.where(cond).find(params[:query_id]) + raise ::Unauthorized unless @query.visible? + @query.project = @project + session[session_key] = {:id => @query.id, :project_id => @query.project_id} if use_session + elsif api_request? || params[:set_filter] || !use_session || session[session_key].nil? || session[session_key][:project_id] != (@project ? @project.id : nil) + # Give it a name, required to be valid + @query = klass.new(:name => "_", :project => @project) + @query.build_from_params(params) + session[session_key] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names, :totalable_names => @query.totalable_names, :sort => @query.sort_criteria.to_a} if use_session + else + # retrieve from session + @query = nil + @query = klass.find_by_id(session[session_key][:id]) if session[session_key][:id] + @query ||= klass.new(:name => "_", :filters => session[session_key][:filters], :group_by => session[session_key][:group_by], :column_names => session[session_key][:column_names], :totalable_names => session[session_key][:totalable_names], :sort_criteria => session[session_key][:sort]) + @query.project = @project + end + if params[:sort].present? + @query.sort_criteria = params[:sort] + if use_session + session[session_key] ||= {} + session[session_key][:sort] = @query.sort_criteria.to_a + end + end + @query + end + + def retrieve_query_from_session(klass=IssueQuery) + session_key = klass.name.underscore.to_sym + session_data = session[session_key] + + if session_data + if session_data[:id] + @query = IssueQuery.find_by_id(session_data[:id]) + return unless @query + else + @query = IssueQuery.new(:name => "_", :filters => session_data[:filters], :group_by => session_data[:group_by], :column_names => session_data[:column_names], :totalable_names => session_data[:totalable_names], :sort_criteria => session[session_key][:sort]) + end + if session_data.has_key?(:project_id) + @query.project_id = session_data[:project_id] + else + @query.project = @project + end + @query + end + end + + # Returns the query definition as hidden field tags + def query_as_hidden_field_tags(query) + tags = hidden_field_tag("set_filter", "1", :id => nil) + + if query.filters.present? + query.filters.each do |field, filter| + tags << hidden_field_tag("f[]", field, :id => nil) + tags << hidden_field_tag("op[#{field}]", filter[:operator], :id => nil) + filter[:values].each do |value| + tags << hidden_field_tag("v[#{field}][]", value, :id => nil) + end + end + else + tags << hidden_field_tag("f[]", "", :id => nil) + end + query.columns.each do |column| + tags << hidden_field_tag("c[]", column.name, :id => nil) + end + if query.totalable_names.present? + query.totalable_names.each do |name| + tags << hidden_field_tag("t[]", name, :id => nil) + end + end + if query.group_by.present? + tags << hidden_field_tag("group_by", query.group_by, :id => nil) + end + if query.sort_criteria.present? + tags << hidden_field_tag("sort", query.sort_criteria.to_param, :id => nil) + end + + tags + end + + def query_hidden_sort_tag(query) + hidden_field_tag("sort", query.sort_criteria.to_param, :id => nil) + end + + # Returns the queries that are rendered in the sidebar + def sidebar_queries(klass, project) + klass.visible.global_or_on_project(@project).sorted.to_a + end + + # Renders a group of queries + def query_links(title, queries) + return '' if queries.empty? + # links to #index on issues/show + url_params = controller_name == 'issues' ? {:controller => 'issues', :action => 'index', :project_id => @project} : {} + + content_tag('h3', title) + "\n" + + content_tag('ul', + queries.collect {|query| + css = 'query' + css << ' selected' if query == @query + content_tag('li', link_to(query.name, url_params.merge(:query_id => query), :class => css)) + }.join("\n").html_safe, + :class => 'queries' + ) + "\n" + end + + # Renders the list of queries for the sidebar + def render_sidebar_queries(klass, project) + queries = sidebar_queries(klass, project) + + out = ''.html_safe + out << query_links(l(:label_my_queries), queries.select(&:is_private?)) + out << query_links(l(:label_query_plural), queries.reject(&:is_private?)) + out + end +end diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb new file mode 100644 index 0000000..201c990 --- /dev/null +++ b/app/helpers/reports_helper.rb @@ -0,0 +1,43 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module ReportsHelper + + def aggregate(data, criteria) + a = 0 + data.each { |row| + match = 1 + criteria.each { |k, v| + match = 0 unless (row[k].to_s == v.to_s) || (k == 'closed' && (v == 0 ? ['f', false] : ['t', true]).include?(row[k])) + } unless criteria.nil? + a = a + row["total"].to_i if match == 1 + } unless data.nil? + a + end + + def aggregate_link(data, criteria, *args) + a = aggregate data, criteria + a > 0 ? link_to(h(a), *args) : '-' + end + + def aggregate_path(project, field, row, options={}) + parameters = {:set_filter => 1, :subproject_id => '!*', field => row.id}.merge(options) + project_issues_path(row.is_a?(Project) ? row : project, parameters) + end +end diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb new file mode 100644 index 0000000..c2e0737 --- /dev/null +++ b/app/helpers/repositories_helper.rb @@ -0,0 +1,310 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module RepositoriesHelper + def format_revision(revision) + if revision.respond_to? :format_identifier + revision.format_identifier + else + revision.to_s + end + end + + def truncate_at_line_break(text, length = 255) + if text + text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...') + end + end + + def render_properties(properties) + unless properties.nil? || properties.empty? + content = '' + properties.keys.sort.each do |property| + content << content_tag('li', "#{h property}: #{h properties[property]}".html_safe) + end + content_tag('ul', content.html_safe, :class => 'properties') + end + end + + def render_changeset_changes + changes = @changeset.filechanges.limit(1000).reorder('path').collect do |change| + case change.action + when 'A' + # Detects moved/copied files + if !change.from_path.blank? + change.action = + @changeset.filechanges.detect {|c| c.action == 'D' && c.path == change.from_path} ? 'R' : 'C' + end + change + when 'D' + @changeset.filechanges.detect {|c| c.from_path == change.path} ? nil : change + else + change + end + end.compact + + tree = { } + changes.each do |change| + p = tree + dirs = change.path.to_s.split('/').select {|d| !d.blank?} + path = '' + dirs.each do |dir| + path += '/' + dir + p[:s] ||= {} + p = p[:s] + p[path] ||= {} + p = p[path] + end + p[:c] = change + end + render_changes_tree(tree[:s]) + end + + def render_changes_tree(tree) + return '' if tree.nil? + output = '' + output << '
      ' + tree.keys.sort.each do |file| + style = 'change' + text = File.basename(h(file)) + if s = tree[file][:s] + style << ' folder' + path_param = to_path_param(@repository.relative_path(file)) + text = link_to(h(text), :controller => 'repositories', + :action => 'show', + :id => @project, + :repository_id => @repository.identifier_param, + :path => path_param, + :rev => @changeset.identifier) + output << "
    • #{text}" + output << render_changes_tree(s) + output << "
    • " + elsif c = tree[file][:c] + style << " change-#{c.action}" + path_param = to_path_param(@repository.relative_path(c.path)) + text = link_to(h(text), :controller => 'repositories', + :action => 'entry', + :id => @project, + :repository_id => @repository.identifier_param, + :path => path_param, + :rev => @changeset.identifier) unless c.action == 'D' + text << " - #{h(c.revision)}" unless c.revision.blank? + text << ' ('.html_safe + link_to(l(:label_diff), :controller => 'repositories', + :action => 'diff', + :id => @project, + :repository_id => @repository.identifier_param, + :path => path_param, + :rev => @changeset.identifier) + ') '.html_safe if c.action == 'M' + text << ' '.html_safe + content_tag('span', h(c.from_path), :class => 'copied-from') unless c.from_path.blank? + output << "
    • #{text}
    • " + end + end + output << '
    ' + output.html_safe + end + + def repository_field_tags(form, repository) + method = repository.class.name.demodulize.underscore + "_field_tags" + if repository.is_a?(Repository) && + respond_to?(method) && method != 'repository_field_tags' + send(method, form, repository) + end + end + + def scm_select_tag(repository) + scm_options = [["--- #{l(:actionview_instancetag_blank_option)} ---", '']] + Redmine::Scm::Base.all.each do |scm| + if Setting.enabled_scm.include?(scm) || + (repository && repository.class.name.demodulize == scm) + scm_options << ["Repository::#{scm}".constantize.scm_name, scm] + end + end + select_tag('repository_scm', + options_for_select(scm_options, repository.class.name.demodulize), + :disabled => (repository && !repository.new_record?), + :data => {:remote => true, :method => 'get', :url => new_project_repository_path(repository.project)}) + end + + def with_leading_slash(path) + path.to_s.starts_with?('/') ? path : "/#{path}" + end + + def subversion_field_tags(form, repository) + content_tag('p', form.text_field(:url, :size => 60, :required => true, + :disabled => !repository.safe_attribute?('url')) + + scm_path_info_tag(repository)) + + content_tag('p', form.text_field(:login, :size => 30)) + + content_tag('p', form.password_field( + :password, :size => 30, :name => 'ignore', + :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)), + :onfocus => "this.value=''; this.name='repository[password]';", + :onchange => "this.name='repository[password]';")) + end + + def darcs_field_tags(form, repository) + content_tag('p', form.text_field( + :url, :label => l(:field_path_to_repository), + :size => 60, :required => true, + :disabled => !repository.safe_attribute?('url')) + + scm_path_info_tag(repository)) + + scm_log_encoding_tag(form, repository) + end + + def mercurial_field_tags(form, repository) + content_tag('p', form.text_field( + :url, :label => l(:field_path_to_repository), + :size => 60, :required => true, + :disabled => !repository.safe_attribute?('url') + ) + + scm_path_info_tag(repository)) + + scm_path_encoding_tag(form, repository) + end + + def git_field_tags(form, repository) + content_tag('p', form.text_field( + :url, :label => l(:field_path_to_repository), + :size => 60, :required => true, + :disabled => !repository.safe_attribute?('url') + ) + + scm_path_info_tag(repository)) + + scm_path_encoding_tag(form, repository) + + content_tag('p', form.check_box( + :report_last_commit, + :label => l(:label_git_report_last_commit) + )) + end + + def cvs_field_tags(form, repository) + content_tag('p', form.text_field( + :root_url, + :label => l(:field_cvsroot), + :size => 60, :required => true, + :disabled => !repository.safe_attribute?('root_url')) + + scm_path_info_tag(repository)) + + content_tag('p', form.text_field( + :url, + :label => l(:field_cvs_module), + :size => 30, :required => true, + :disabled => !repository.safe_attribute?('url'))) + + scm_log_encoding_tag(form, repository) + + scm_path_encoding_tag(form, repository) + end + + def bazaar_field_tags(form, repository) + content_tag('p', form.text_field( + :url, :label => l(:field_path_to_repository), + :size => 60, :required => true, + :disabled => !repository.safe_attribute?('url')) + + scm_path_info_tag(repository)) + + scm_log_encoding_tag(form, repository) + end + + def filesystem_field_tags(form, repository) + content_tag('p', form.text_field( + :url, :label => l(:field_root_directory), + :size => 60, :required => true, + :disabled => !repository.safe_attribute?('url')) + + scm_path_info_tag(repository)) + + scm_path_encoding_tag(form, repository) + end + + def scm_path_info_tag(repository) + text = scm_path_info(repository) + if text.present? + content_tag('em', text, :class => 'info') + else + '' + end + end + + def scm_path_info(repository) + scm_name = repository.scm_name.to_s.downcase + + info_from_config = Redmine::Configuration["scm_#{scm_name}_path_info"].presence + return info_from_config.html_safe if info_from_config + + l("text_#{scm_name}_repository_note", :default => '') + end + + def scm_log_encoding_tag(form, repository) + select = form.select( + :log_encoding, + [nil] + Setting::ENCODINGS, + :label => l(:field_commit_logs_encoding), + :required => true + ) + content_tag('p', select) + end + + def scm_path_encoding_tag(form, repository) + select = form.select( + :path_encoding, + [nil] + Setting::ENCODINGS, + :label => l(:field_scm_path_encoding) + ) + content_tag('p', select + content_tag('em', l(:text_scm_path_encoding_note), :class => 'info')) + end + + def index_commits(commits, heads) + return nil if commits.nil? or commits.first.parents.nil? + refs_map = {} + heads.each do |head| + refs_map[head.scmid] ||= [] + refs_map[head.scmid] << head + end + commits_by_scmid = {} + commits.reverse.each_with_index do |commit, commit_index| + commits_by_scmid[commit.scmid] = { + :parent_scmids => commit.parents.collect { |parent| parent.scmid }, + :rdmid => commit_index, + :refs => refs_map.include?(commit.scmid) ? refs_map[commit.scmid].join(" ") : nil, + :scmid => commit.scmid, + :href => block_given? ? yield(commit.scmid) : commit.scmid + } + end + heads.sort! { |head1, head2| head1.to_s <=> head2.to_s } + space = nil + heads.each do |head| + if commits_by_scmid.include? head.scmid + space = index_head((space || -1) + 1, head, commits_by_scmid) + end + end + # when no head matched anything use first commit + space ||= index_head(0, commits.first, commits_by_scmid) + return commits_by_scmid, space + end + + def index_head(space, commit, commits_by_scmid) + stack = [[space, commits_by_scmid[commit.scmid]]] + max_space = space + until stack.empty? + space, commit = stack.pop + commit[:space] = space if commit[:space].nil? + space -= 1 + commit[:parent_scmids].each_with_index do |parent_scmid, parent_index| + parent_commit = commits_by_scmid[parent_scmid] + if parent_commit and parent_commit[:space].nil? + stack.unshift [space += 1, parent_commit] + end + end + max_space = space if max_space < space + end + max_space + end +end diff --git a/app/helpers/roles_helper.rb b/app/helpers/roles_helper.rb new file mode 100644 index 0000000..ce5ffe7 --- /dev/null +++ b/app/helpers/roles_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module RolesHelper +end diff --git a/app/helpers/routes_helper.rb b/app/helpers/routes_helper.rb new file mode 100644 index 0000000..c0a3675 --- /dev/null +++ b/app/helpers/routes_helper.rb @@ -0,0 +1,85 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module RoutesHelper + + # Returns the path to project issues or to the cross-project + # issue list if project is nil + def _project_issues_path(project, *args) + if project + project_issues_path(project, *args) + else + issues_path(*args) + end + end + + def _project_news_path(project, *args) + if project + project_news_index_path(project, *args) + else + news_index_path(*args) + end + end + + def _new_project_issue_path(project, *args) + if project + new_project_issue_path(project, *args) + else + new_issue_path(*args) + end + end + + def _project_calendar_path(project, *args) + project ? project_calendar_path(project, *args) : issues_calendar_path(*args) + end + + def _project_gantt_path(project, *args) + project ? project_gantt_path(project, *args) : issues_gantt_path(*args) + end + + def _time_entries_path(project, issue, *args) + if project + project_time_entries_path(project, *args) + else + time_entries_path(*args) + end + end + + def _report_time_entries_path(project, issue, *args) + if project + report_project_time_entries_path(project, *args) + else + report_time_entries_path(*args) + end + end + + def _new_time_entry_path(project, issue, *args) + if issue + new_issue_time_entry_path(issue, *args) + elsif project + new_project_time_entry_path(project, *args) + else + new_time_entry_path(*args) + end + end + + def board_path(board, *args) + project_board_path(board.project, board, *args) + end +end diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 5fe4946..5f8233c 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -1,7 +1,7 @@ -# frozen_string_literal: true - +# encoding: utf-8 +# # Redmine - project management software -# Copyright (C) 2006-2019 Jean-Philippe Lang +# Copyright (C) 2006-2017 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,7 +24,7 @@ module SearchHelper return text unless text && tokens && !tokens.empty? re_tokens = tokens.collect {|t| Regexp.escape(t)} regexp = Regexp.new "(#{re_tokens.join('|')})", Regexp::IGNORECASE - result = +'' + result = '' text = strip_tags(text) text.split(regexp).each_with_index do |words, i| if result.length > 1200 @@ -58,7 +58,7 @@ module SearchHelper def render_results_by_type(results_by_type) links = [] # Sorts types by results count - results_by_type.keys.sort_by {|k| results_by_type[k]}.reverse_each do |t| + results_by_type.keys.sort {|a, b| results_by_type[b] <=> results_by_type[a]}.each do |t| c = results_by_type[t] next if c == 0 text = "#{type_label(t)} (#{c})" diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb new file mode 100644 index 0000000..86cdff9 --- /dev/null +++ b/app/helpers/settings_helper.rb @@ -0,0 +1,210 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module SettingsHelper + def administration_settings_tabs + tabs = [{:name => 'general', :partial => 'settings/general', :label => :label_general}, + {:name => 'display', :partial => 'settings/display', :label => :label_display}, + {:name => 'authentication', :partial => 'settings/authentication', :label => :label_authentication}, + {:name => 'api', :partial => 'settings/api', :label => :label_api}, + {:name => 'projects', :partial => 'settings/projects', :label => :label_project_plural}, + {:name => 'issues', :partial => 'settings/issues', :label => :label_issue_tracking}, + {:name => 'timelog', :partial => 'settings/timelog', :label => :label_time_tracking}, + {:name => 'attachments', :partial => 'settings/attachments', :label => :label_attachment_plural}, + {:name => 'notifications', :partial => 'settings/notifications', :label => :field_mail_notification}, + {:name => 'mail_handler', :partial => 'settings/mail_handler', :label => :label_incoming_emails}, + {:name => 'repositories', :partial => 'settings/repositories', :label => :label_repository_plural} + ] + end + + def render_settings_error(errors) + return if errors.blank? + s = ''.html_safe + errors.each do |name, message| + s << content_tag('li', content_tag('b', l("setting_#{name}")) + " " + message) + end + content_tag('div', content_tag('ul', s), :id => 'errorExplanation') + end + + def setting_value(setting) + value = nil + if params[:settings] + value = params[:settings][setting] + end + value || Setting.send(setting) + end + + def setting_select(setting, choices, options={}) + if blank_text = options.delete(:blank) + choices = [[blank_text.is_a?(Symbol) ? l(blank_text) : blank_text, '']] + choices + end + setting_label(setting, options).html_safe + + select_tag("settings[#{setting}]", + options_for_select(choices, setting_value(setting).to_s), + options).html_safe + end + + def setting_multiselect(setting, choices, options={}) + setting_values = setting_value(setting) + setting_values = [] unless setting_values.is_a?(Array) + + content_tag("label", l(options[:label] || "setting_#{setting}")) + + hidden_field_tag("settings[#{setting}][]", '').html_safe + + choices.collect do |choice| + text, value = (choice.is_a?(Array) ? choice : [choice, choice]) + content_tag( + 'label', + check_box_tag( + "settings[#{setting}][]", + value, + setting_values.include?(value), + :id => nil + ) + text.to_s, + :class => (options[:inline] ? 'inline' : 'block') + ) + end.join.html_safe + end + + def setting_text_field(setting, options={}) + setting_label(setting, options).html_safe + + text_field_tag("settings[#{setting}]", setting_value(setting), options).html_safe + end + + def setting_text_area(setting, options={}) + setting_label(setting, options).html_safe + + text_area_tag("settings[#{setting}]", setting_value(setting), options).html_safe + end + + def setting_check_box(setting, options={}) + setting_label(setting, options).html_safe + + hidden_field_tag("settings[#{setting}]", 0, :id => nil).html_safe + + check_box_tag("settings[#{setting}]", 1, setting_value(setting).to_s != '0', options).html_safe + end + + def setting_label(setting, options={}) + label = options.delete(:label) + if label == false + '' + else + text = label.is_a?(String) ? label : l(label || "setting_#{setting}") + label_tag("settings_#{setting}", text, options[:label_options]) + end + end + + # Renders a notification field for a Redmine::Notifiable option + def notification_field(notifiable) + tag_data = notifiable.parent.present? ? + {:parent_notifiable => notifiable.parent} : + {:disables => "input[data-parent-notifiable=#{notifiable.name}]"} + + tag = check_box_tag('settings[notified_events][]', + notifiable.name, + setting_value('notified_events').include?(notifiable.name), + :id => nil, + :data => tag_data) + + text = l_or_humanize(notifiable.name, :prefix => 'label_') + + options = {} + if notifiable.parent.present? + options[:class] = "parent" + end + + content_tag(:label, tag + text, options) + end + + def session_lifetime_options + options = [[l(:label_disabled), 0]] + options += [4, 8, 12].map {|hours| + [l('datetime.distance_in_words.x_hours', :count => hours), (hours * 60).to_s] + } + options += [1, 7, 30, 60, 365].map {|days| + [l('datetime.distance_in_words.x_days', :count => days), (days * 24 * 60).to_s] + } + options + end + + def session_timeout_options + options = [[l(:label_disabled), 0]] + options += [1, 2, 4, 8, 12, 24, 48].map {|hours| + [l('datetime.distance_in_words.x_hours', :count => hours), (hours * 60).to_s] + } + options + end + + def link_copied_issue_options + options = [ + [:general_text_Yes, 'yes'], + [:general_text_No, 'no'], + [:label_ask, 'ask'] + ] + + options.map {|label, value| [l(label), value.to_s]} + end + + def cross_project_subtasks_options + options = [ + [:label_disabled, ''], + [:label_cross_project_system, 'system'], + [:label_cross_project_tree, 'tree'], + [:label_cross_project_hierarchy, 'hierarchy'], + [:label_cross_project_descendants, 'descendants'] + ] + + options.map {|label, value| [l(label), value.to_s]} + end + + def parent_issue_dates_options + options = [ + [:label_parent_task_attributes_derived, 'derived'], + [:label_parent_task_attributes_independent, 'independent'] + ] + + options.map {|label, value| [l(label), value.to_s]} + end + + def parent_issue_priority_options + options = [ + [:label_parent_task_attributes_derived, 'derived'], + [:label_parent_task_attributes_independent, 'independent'] + ] + + options.map {|label, value| [l(label), value.to_s]} + end + + def parent_issue_done_ratio_options + options = [ + [:label_parent_task_attributes_derived, 'derived'], + [:label_parent_task_attributes_independent, 'independent'] + ] + + options.map {|label, value| [l(label), value.to_s]} + end + + # Returns the options for the date_format setting + def date_format_setting_options(locale) + Setting::DATE_FORMATS.map do |f| + today = ::I18n.l(User.current.today, :locale => locale, :format => f) + format = f.gsub('%', '').gsub(/[dmY]/) do + {'d' => 'dd', 'm' => 'mm', 'Y' => 'yyyy'}[$&] + end + ["#{today} (#{format})", f] + end + end +end diff --git a/app/helpers/sort_helper.rb b/app/helpers/sort_helper.rb new file mode 100644 index 0000000..c6bf538 --- /dev/null +++ b/app/helpers/sort_helper.rb @@ -0,0 +1,163 @@ +# encoding: utf-8 +# +# Helpers to sort tables using clickable column headers. +# +# Author: Stuart Rackham , March 2005. +# Jean-Philippe Lang, 2009 +# License: This source code is released under the MIT license. +# +# - Consecutive clicks toggle the column's sort order. +# - Sort state is maintained by a session hash entry. +# - CSS classes identify sort column and state. +# - Typically used in conjunction with the Pagination module. +# +# Example code snippets: +# +# Controller: +# +# helper :sort +# include SortHelper +# +# def list +# sort_init 'last_name' +# sort_update %w(first_name last_name) +# @items = Contact.find_all nil, sort_clause +# end +# +# Controller (using Pagination module): +# +# helper :sort +# include SortHelper +# +# def list +# sort_init 'last_name' +# sort_update %w(first_name last_name) +# @contact_pages, @items = paginate :contacts, +# :order_by => sort_clause, +# :per_page => 10 +# end +# +# View (table header in list.rhtml): +# +# +# +# <%= sort_header_tag('id', :title => 'Sort by contact ID') %> +# <%= sort_header_tag('last_name', :caption => 'Name') %> +# <%= sort_header_tag('phone') %> +# <%= sort_header_tag('address', :width => 200) %> +# +# +# +# - Introduces instance variables: @sort_default, @sort_criteria +# - Introduces param :sort +# + +module SortHelper + def sort_name + controller_name + '_' + action_name + '_sort' + end + + # Initializes the default sort. + # Examples: + # + # sort_init 'name' + # sort_init 'id', 'desc' + # sort_init ['name', ['id', 'desc']] + # sort_init [['name', 'desc'], ['id', 'desc']] + # + def sort_init(*args) + case args.size + when 1 + @sort_default = args.first.is_a?(Array) ? args.first : [[args.first]] + when 2 + @sort_default = [[args.first, args.last]] + else + raise ArgumentError + end + end + + # Updates the sort state. Call this in the controller prior to calling + # sort_clause. + # - criteria can be either an array or a hash of allowed keys + # + def sort_update(criteria, sort_name=nil) + sort_name ||= self.sort_name + @sort_criteria = Redmine::SortCriteria.new(params[:sort] || session[sort_name] || @sort_default) + @sortable_columns = criteria + session[sort_name] = @sort_criteria.to_param + end + + # Clears the sort criteria session data + # + def sort_clear + session[sort_name] = nil + end + + # Returns an SQL sort clause corresponding to the current sort state. + # Use this to sort the controller's table items collection. + # + def sort_clause() + @sort_criteria.sort_clause(@sortable_columns) + end + + def sort_criteria + @sort_criteria + end + + # Returns a link which sorts by the named column. + # + # - column is the name of an attribute in the sorted record collection. + # - the optional caption explicitly specifies the displayed link text. + # - 2 CSS classes reflect the state of the link: sort and asc or desc + # + def sort_link(column, caption, default_order) + css, order = nil, default_order + + if column.to_s == @sort_criteria.first_key + if @sort_criteria.first_asc? + css = 'sort asc' + order = 'desc' + else + css = 'sort desc' + order = 'asc' + end + end + caption = column.to_s.humanize unless caption + + sort_options = { :sort => @sort_criteria.add(column.to_s, order).to_param } + link_to(caption, {:params => request.query_parameters.merge(sort_options)}, :class => css) + end + + # Returns a table header tag with a sort link for the named column + # attribute. + # + # Options: + # :caption The displayed link name (defaults to titleized column name). + # :title The tag's 'title' attribute (defaults to 'Sort by :caption'). + # + # Other options hash entries generate additional table header tag attributes. + # + # Example: + # + # <%= sort_header_tag('id', :title => 'Sort by contact ID', :width => 40) %> + # + def sort_header_tag(column, options = {}) + caption = options.delete(:caption) || column.to_s.humanize + default_order = options.delete(:default_order) || 'asc' + options[:title] = l(:label_sort_by, "\"#{caption}\"") unless options[:title] + content_tag('th', sort_link(column, caption, default_order), options) + end + + # Returns the css classes for the current sort order + # + # Example: + # + # sort_css_classes + # # => "sort-by-created-on sort-desc" + def sort_css_classes + if @sort_criteria.first_key + "sort-by-#{@sort_criteria.first_key.to_s.dasherize} sort-#{@sort_criteria.first_asc? ? 'asc' : 'desc'}" + end + end +end + diff --git a/app/helpers/timelog_helper.rb b/app/helpers/timelog_helper.rb new file mode 100644 index 0000000..d1174fe --- /dev/null +++ b/app/helpers/timelog_helper.rb @@ -0,0 +1,121 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module TimelogHelper + include ApplicationHelper + + # Returns a collection of activities for a select field. time_entry + # is optional and will be used to check if the selected TimeEntryActivity + # is active. + def activity_collection_for_select_options(time_entry=nil, project=nil) + project ||= time_entry.try(:project) + project ||= @project + if project.nil? + activities = TimeEntryActivity.shared.active + else + activities = project.activities + end + + collection = [] + if time_entry && time_entry.activity && !time_entry.activity.active? + collection << [ "--- #{l(:actionview_instancetag_blank_option)} ---", '' ] + else + collection << [ "--- #{l(:actionview_instancetag_blank_option)} ---", '' ] unless activities.detect(&:is_default) + end + activities.each { |a| collection << [a.name, a.id] } + collection + end + + def select_hours(data, criteria, value) + if value.to_s.empty? + data.select {|row| row[criteria].blank? } + else + data.select {|row| row[criteria].to_s == value.to_s} + end + end + + def sum_hours(data) + sum = 0 + data.each do |row| + sum += row['hours'].to_f + end + sum + end + + def format_criteria_value(criteria_options, value) + if value.blank? + "[#{l(:label_none)}]" + elsif k = criteria_options[:klass] + obj = k.find_by_id(value.to_i) + if obj.is_a?(Issue) + obj.visible? ? "#{obj.tracker} ##{obj.id}: #{obj.subject}" : "##{obj.id}" + else + obj + end + elsif cf = criteria_options[:custom_field] + format_value(value, cf) + else + value.to_s + end + end + + def report_to_csv(report) + Redmine::Export::CSV.generate do |csv| + # Column headers + headers = report.criteria.collect {|criteria| l(report.available_criteria[criteria][:label]) } + headers += report.periods + headers << l(:label_total_time) + csv << headers + # Content + report_criteria_to_csv(csv, report.available_criteria, report.columns, report.criteria, report.periods, report.hours) + # Total row + str_total = l(:label_total_time) + row = [ str_total ] + [''] * (report.criteria.size - 1) + total = 0 + report.periods.each do |period| + sum = sum_hours(select_hours(report.hours, report.columns, period.to_s)) + total += sum + row << (sum > 0 ? sum : '') + end + row << total + csv << row + end + end + + def report_criteria_to_csv(csv, available_criteria, columns, criteria, periods, hours, level=0) + hours.collect {|h| h[criteria[level]].to_s}.uniq.each do |value| + hours_for_value = select_hours(hours, criteria[level], value) + next if hours_for_value.empty? + row = [''] * level + row << format_criteria_value(available_criteria[criteria[level]], value).to_s + row += [''] * (criteria.length - level - 1) + total = 0 + periods.each do |period| + sum = sum_hours(select_hours(hours_for_value, columns, period.to_s)) + total += sum + row << (sum > 0 ? sum : '') + end + row << total + csv << row + if criteria.length > level + 1 + report_criteria_to_csv(csv, available_criteria, columns, criteria, periods, hours_for_value, level + 1) + end + end + end +end diff --git a/app/helpers/trackers_helper.rb b/app/helpers/trackers_helper.rb new file mode 100644 index 0000000..ffb2ca3 --- /dev/null +++ b/app/helpers/trackers_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module TrackersHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000..d781286 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,64 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module UsersHelper + def users_status_options_for_select(selected) + user_count_by_status = User.group('status').count.to_hash + options_for_select([[l(:label_all), ''], + ["#{l(:status_active)} (#{user_count_by_status[1].to_i})", '1'], + ["#{l(:status_registered)} (#{user_count_by_status[2].to_i})", '2'], + ["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", '3']], selected.to_s) + end + + def user_mail_notification_options(user) + user.valid_notification_options.collect {|o| [l(o.last), o.first]} + end + + def textarea_font_options + [[l(:label_font_default), '']] + UserPreference::TEXTAREA_FONT_OPTIONS.map {|o| [l("label_font_#{o}"), o]} + end + + def change_status_link(user) + url = {:controller => 'users', :action => 'update', :id => user, :page => params[:page], :status => params[:status], :tab => nil} + + if user.locked? + link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock' + elsif user.registered? + link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock' + elsif user != User.current + link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :put, :class => 'icon icon-lock' + end + end + + def additional_emails_link(user) + if user.email_addresses.count > 1 || Setting.max_additional_emails.to_i > 0 + link_to l(:label_email_address_plural), user_email_addresses_path(@user), :class => 'icon icon-email-add', :remote => true + end + end + + def user_settings_tabs + tabs = [{:name => 'general', :partial => 'users/general', :label => :label_general}, + {:name => 'memberships', :partial => 'users/memberships', :label => :label_project_plural} + ] + if Group.givable.any? + tabs.insert 1, {:name => 'groups', :partial => 'users/groups', :label => :label_group_plural} + end + tabs + end +end diff --git a/app/helpers/versions_helper.rb b/app/helpers/versions_helper.rb new file mode 100644 index 0000000..fe1fb88 --- /dev/null +++ b/app/helpers/versions_helper.rb @@ -0,0 +1,76 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module VersionsHelper + + def version_anchor(version) + if @project == version.project + anchor version.name + else + anchor "#{version.project.try(:identifier)}-#{version.name}" + end + end + + def version_filtered_issues_path(version, options = {}) + options = {:fixed_version_id => version, :set_filter => 1}.merge(options) + project = case version.sharing + when 'hierarchy', 'tree' + if version.project && version.project.root.visible? + version.project.root + else + version.project + end + when 'system' + nil + else + version.project + end + + if project + project_issues_path(project, options) + else + issues_path(options) + end + end + + STATUS_BY_CRITERIAS = %w(tracker status priority author assigned_to category) + + def render_issue_status_by(version, criteria) + criteria = 'tracker' unless STATUS_BY_CRITERIAS.include?(criteria) + + h = Hash.new {|k,v| k[v] = [0, 0]} + begin + # Total issue count + version.fixed_issues.group(criteria).count.each {|c,s| h[c][0] = s} + # Open issues count + version.fixed_issues.open.group(criteria).count.each {|c,s| h[c][1] = s} + rescue ActiveRecord::RecordNotFound + # When grouping by an association, Rails throws this exception if there's no result (bug) + end + # Sort with nil keys in last position + counts = h.keys.sort {|a,b| a.nil? ? 1 : (b.nil? ? -1 : a <=> b)}.collect {|k| {:group => k, :total => h[k][0], :open => h[k][1], :closed => (h[k][0] - h[k][1])}} + max = counts.collect {|c| c[:total]}.max + + render :partial => 'issue_counts', :locals => {:version => version, :criteria => criteria, :counts => counts, :max => max} + end + + def status_by_options_for_select(value) + options_for_select(STATUS_BY_CRITERIAS.collect {|criteria| [l("field_#{criteria}".to_sym), criteria]}, value) + end +end diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb new file mode 100644 index 0000000..ad8cd59 --- /dev/null +++ b/app/helpers/watchers_helper.rb @@ -0,0 +1,80 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module WatchersHelper + + def watcher_link(objects, user) + return '' unless user && user.logged? + objects = Array.wrap(objects) + return '' unless objects.any? + + watched = Watcher.any_watched?(objects, user) + css = [watcher_css(objects), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') + text = watched ? l(:button_unwatch) : l(:button_watch) + url = watch_path( + :object_type => objects.first.class.to_s.underscore, + :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) + ) + method = watched ? 'delete' : 'post' + + link_to text, url, :remote => true, :method => method, :class => css + end + + # Returns the css class used to identify watch links for a given +object+ + def watcher_css(objects) + objects = Array.wrap(objects) + id = (objects.size == 1 ? objects.first.id : 'bulk') + "#{objects.first.class.to_s.underscore}-#{id}-watcher" + end + + # Returns a comma separated list of users watching the given object + def watchers_list(object) + remove_allowed = User.current.allowed_to?("delete_#{object.class.name.underscore}_watchers".to_sym, object.project) + content = ''.html_safe + lis = object.watcher_users.preload(:email_address).collect do |user| + s = ''.html_safe + s << avatar(user, :size => "16").to_s + s << link_to_user(user, :class => 'user') + if remove_allowed + url = {:controller => 'watchers', + :action => 'destroy', + :object_type => object.class.to_s.underscore, + :object_id => object.id, + :user_id => user} + s << ' ' + s << link_to(l(:button_delete), url, + :remote => true, :method => 'delete', + :class => "delete icon-only icon-del", + :title => l(:button_delete)) + end + content << content_tag('li', s, :class => "user-#{user.id}") + end + content.present? ? content_tag('ul', content, :class => 'watchers') : content + end + + def watchers_checkboxes(object, users, checked=nil) + users.map do |user| + c = checked.nil? ? object.watched_by?(user) : checked + tag = check_box_tag 'issue[watcher_user_ids][]', user.id, c, :id => nil + content_tag 'label', "#{tag} #{h(user)}".html_safe, + :id => "issue_watcher_user_ids_#{user.id}", + :class => "floating" + end.join.html_safe + end +end diff --git a/app/helpers/welcome_helper.rb b/app/helpers/welcome_helper.rb new file mode 100644 index 0000000..cc8ab38 --- /dev/null +++ b/app/helpers/welcome_helper.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module WelcomeHelper +end diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb new file mode 100644 index 0000000..2a49f08 --- /dev/null +++ b/app/helpers/wiki_helper.rb @@ -0,0 +1,67 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module WikiHelper + include Redmine::Export::PDF::WikiPdfHelper + + def wiki_page_options_for_select(pages, selected = nil, parent = nil, level = 0) + pages = pages.group_by(&:parent) unless pages.is_a?(Hash) + s = ''.html_safe + if pages.has_key?(parent) + pages[parent].each do |page| + attrs = "value='#{page.id}'" + attrs << " selected='selected'" if selected == page + indent = (level > 0) ? (' ' * level * 2 + '» ') : '' + + s << content_tag('option', (indent + h(page.pretty_title)).html_safe, :value => page.id.to_s, :selected => selected == page) + + wiki_page_options_for_select(pages, selected, page, level + 1) + end + end + s + end + + def wiki_page_wiki_options_for_select(page) + projects = Project.allowed_to(:rename_wiki_pages).joins(:wiki).preload(:wiki).to_a + projects << page.project unless projects.include?(page.project) + + project_tree_options_for_select(projects, :selected => page.project) do |project| + wiki_id = project.wiki.try(:id) + {:value => wiki_id, :selected => wiki_id == page.wiki_id} + end + end + + def wiki_page_breadcrumb(page) + breadcrumb(page.ancestors.reverse.collect {|parent| + link_to(h(parent.pretty_title), {:controller => 'wiki', :action => 'show', :id => parent.title, :project_id => parent.project, :version => nil}) + }) + end + + # Returns the path for the Cancel link when editing a wiki page + def wiki_page_edit_cancel_path(page) + if page.new_record? + if parent = page.parent + project_wiki_page_path(parent.project, parent.title) + else + project_wiki_index_path(page.project) + end + else + project_wiki_page_path(page.project, page.title) + end + end +end diff --git a/app/helpers/workflows_helper.rb b/app/helpers/workflows_helper.rb new file mode 100644 index 0000000..142569e --- /dev/null +++ b/app/helpers/workflows_helper.rb @@ -0,0 +1,95 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module WorkflowsHelper + def options_for_workflow_select(name, objects, selected, options={}) + option_tags = ''.html_safe + multiple = false + if selected + if selected.size == objects.size + selected = 'all' + else + selected = selected.map(&:id) + if selected.size > 1 + multiple = true + end + end + else + selected = objects.first.try(:id) + end + all_tag_options = {:value => 'all', :selected => (selected == 'all')} + if multiple + all_tag_options.merge!(:style => "display:none;") + end + option_tags << content_tag('option', l(:label_all), all_tag_options) + option_tags << options_from_collection_for_select(objects, "id", "name", selected) + select_tag name, option_tags, {:multiple => multiple}.merge(options) + end + + def field_required?(field) + field.is_a?(CustomField) ? field.is_required? : %w(project_id tracker_id subject priority_id is_private).include?(field) + end + + def field_permission_tag(permissions, status, field, roles) + name = field.is_a?(CustomField) ? field.id.to_s : field + options = [["", ""], [l(:label_readonly), "readonly"]] + options << [l(:label_required), "required"] unless field_required?(field) + html_options = {} + + if perm = permissions[status.id][name] + if perm.uniq.size > 1 || perm.size < @roles.size * @trackers.size + options << [l(:label_no_change_option), "no_change"] + selected = 'no_change' + else + selected = perm.first + end + end + + hidden = field.is_a?(CustomField) && + !field.visible? && + !roles.detect {|role| role.custom_fields.to_a.include?(field)} + + if hidden + options[0][0] = l(:label_hidden) + selected = '' + html_options[:disabled] = true + end + + select_tag("permissions[#{status.id}][#{name}]", options_for_select(options, selected), html_options) + end + + def transition_tag(workflows, old_status, new_status, name) + w = workflows.select {|w| w.old_status == old_status && w.new_status == new_status}.size + + tag_name = "transitions[#{ old_status.try(:id) || 0 }][#{new_status.id}][#{name}]" + if w == 0 || w == @roles.size * @trackers.size + + hidden_field_tag(tag_name, "0", :id => nil) + + check_box_tag(tag_name, "1", w != 0, + :class => "old-status-#{old_status.try(:id) || 0} new-status-#{new_status.id}") + else + select_tag tag_name, + options_for_select([ + [l(:general_text_Yes), "1"], + [l(:general_text_No), "0"], + [l(:label_no_change_option), "no_change"] + ], "no_change") + end + end +end diff --git a/app/models/attachment.rb b/app/models/attachment.rb new file mode 100644 index 0000000..64ac2c2 --- /dev/null +++ b/app/models/attachment.rb @@ -0,0 +1,492 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require "digest" +require "fileutils" + +class Attachment < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :container, :polymorphic => true + belongs_to :author, :class_name => "User" + + validates_presence_of :filename, :author + validates_length_of :filename, :maximum => 255 + validates_length_of :disk_filename, :maximum => 255 + validates_length_of :description, :maximum => 255 + validate :validate_max_file_size, :validate_file_extension + attr_protected :id + + acts_as_event :title => :filename, + :url => Proc.new {|o| {:controller => 'attachments', :action => 'show', :id => o.id, :filename => o.filename}} + + acts_as_activity_provider :type => 'files', + :permission => :view_files, + :author_key => :author_id, + :scope => select("#{Attachment.table_name}.*"). + joins("LEFT JOIN #{Version.table_name} ON #{Attachment.table_name}.container_type='Version' AND #{Version.table_name}.id = #{Attachment.table_name}.container_id " + + "LEFT JOIN #{Project.table_name} ON #{Version.table_name}.project_id = #{Project.table_name}.id OR ( #{Attachment.table_name}.container_type='Project' AND #{Attachment.table_name}.container_id = #{Project.table_name}.id )") + + acts_as_activity_provider :type => 'documents', + :permission => :view_documents, + :author_key => :author_id, + :scope => select("#{Attachment.table_name}.*"). + joins("LEFT JOIN #{Document.table_name} ON #{Attachment.table_name}.container_type='Document' AND #{Document.table_name}.id = #{Attachment.table_name}.container_id " + + "LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id") + + cattr_accessor :storage_path + @@storage_path = Redmine::Configuration['attachments_storage_path'] || File.join(Rails.root, "files") + + cattr_accessor :thumbnails_storage_path + @@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails") + + before_create :files_to_final_location + after_rollback :delete_from_disk, :on => :create + after_commit :delete_from_disk, :on => :destroy + after_commit :reuse_existing_file_if_possible, :on => :create + + safe_attributes 'filename', 'content_type', 'description' + + # Returns an unsaved copy of the attachment + def copy(attributes=nil) + copy = self.class.new + copy.attributes = self.attributes.dup.except("id", "downloads") + copy.attributes = attributes if attributes + copy + end + + def validate_max_file_size + if @temp_file && self.filesize > Setting.attachment_max_size.to_i.kilobytes + errors.add(:base, l(:error_attachment_too_big, :max_size => Setting.attachment_max_size.to_i.kilobytes)) + end + end + + def validate_file_extension + if @temp_file + extension = File.extname(filename) + unless self.class.valid_extension?(extension) + errors.add(:base, l(:error_attachment_extension_not_allowed, :extension => extension)) + end + end + end + + def file=(incoming_file) + unless incoming_file.nil? + @temp_file = incoming_file + if @temp_file.respond_to?(:original_filename) + self.filename = @temp_file.original_filename + self.filename.force_encoding("UTF-8") + end + if @temp_file.respond_to?(:content_type) + self.content_type = @temp_file.content_type.to_s.chomp + end + self.filesize = @temp_file.size + end + end + + def file + nil + end + + def filename=(arg) + write_attribute :filename, sanitize_filename(arg.to_s) + filename + end + + # Copies the temporary file to its final location + # and computes its MD5 hash + def files_to_final_location + if @temp_file + self.disk_directory = target_directory + self.disk_filename = Attachment.disk_filename(filename, disk_directory) + logger.info("Saving attachment '#{self.diskfile}' (#{@temp_file.size} bytes)") if logger + path = File.dirname(diskfile) + unless File.directory?(path) + FileUtils.mkdir_p(path) + end + sha = Digest::SHA256.new + File.open(diskfile, "wb") do |f| + if @temp_file.respond_to?(:read) + buffer = "" + while (buffer = @temp_file.read(8192)) + f.write(buffer) + sha.update(buffer) + end + else + f.write(@temp_file) + sha.update(@temp_file) + end + end + self.digest = sha.hexdigest + end + @temp_file = nil + + if content_type.blank? && filename.present? + self.content_type = Redmine::MimeType.of(filename) + end + # Don't save the content type if it's longer than the authorized length + if self.content_type && self.content_type.length > 255 + self.content_type = nil + end + end + + # Deletes the file from the file system if it's not referenced by other attachments + def delete_from_disk + if Attachment.where("disk_filename = ? AND id <> ?", disk_filename, id).empty? + delete_from_disk! + end + end + + # Returns file's location on disk + def diskfile + File.join(self.class.storage_path, disk_directory.to_s, disk_filename.to_s) + end + + def title + title = filename.dup + if description.present? + title << " (#{description})" + end + title + end + + def increment_download + increment!(:downloads) + end + + def project + container.try(:project) + end + + def visible?(user=User.current) + if container_id + container && container.attachments_visible?(user) + else + author == user + end + end + + def editable?(user=User.current) + if container_id + container && container.attachments_editable?(user) + else + author == user + end + end + + def deletable?(user=User.current) + if container_id + container && container.attachments_deletable?(user) + else + author == user + end + end + + def image? + !!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png)$/i) + end + + def thumbnailable? + image? + end + + # Returns the full path the attachment thumbnail, or nil + # if the thumbnail cannot be generated. + def thumbnail(options={}) + if thumbnailable? && readable? + size = options[:size].to_i + if size > 0 + # Limit the number of thumbnails per image + size = (size / 50) * 50 + # Maximum thumbnail size + size = 800 if size > 800 + else + size = Setting.thumbnails_size.to_i + end + size = 100 unless size > 0 + target = File.join(self.class.thumbnails_storage_path, "#{id}_#{digest}_#{size}.thumb") + + begin + Redmine::Thumbnail.generate(self.diskfile, target, size) + rescue => e + logger.error "An error occured while generating thumbnail for #{disk_filename} to #{target}\nException was: #{e.message}" if logger + return nil + end + end + end + + # Deletes all thumbnails + def self.clear_thumbnails + Dir.glob(File.join(thumbnails_storage_path, "*.thumb")).each do |file| + File.delete file + end + end + + def is_text? + Redmine::MimeType.is_type?('text', filename) + end + + def is_image? + Redmine::MimeType.is_type?('image', filename) + end + + def is_diff? + self.filename =~ /\.(patch|diff)$/i + end + + def is_pdf? + Redmine::MimeType.of(filename) == "application/pdf" + end + + def previewable? + is_text? || is_image? + end + + # Returns true if the file is readable + def readable? + disk_filename.present? && File.readable?(diskfile) + end + + # Returns the attachment token + def token + "#{id}.#{digest}" + end + + # Finds an attachment that matches the given token and that has no container + def self.find_by_token(token) + if token.to_s =~ /^(\d+)\.([0-9a-f]+)$/ + attachment_id, attachment_digest = $1, $2 + attachment = Attachment.where(:id => attachment_id, :digest => attachment_digest).first + if attachment && attachment.container.nil? + attachment + end + end + end + + # Bulk attaches a set of files to an object + # + # Returns a Hash of the results: + # :files => array of the attached files + # :unsaved => array of the files that could not be attached + def self.attach_files(obj, attachments) + result = obj.save_attachments(attachments, User.current) + obj.attach_saved_attachments + result + end + + # Updates the filename and description of a set of attachments + # with the given hash of attributes. Returns true if all + # attachments were updated. + # + # Example: + # Attachment.update_attachments(attachments, { + # 4 => {:filename => 'foo'}, + # 7 => {:filename => 'bar', :description => 'file description'} + # }) + # + def self.update_attachments(attachments, params) + params = params.transform_keys {|key| key.to_i} + + saved = true + transaction do + attachments.each do |attachment| + if p = params[attachment.id] + attachment.filename = p[:filename] if p.key?(:filename) + attachment.description = p[:description] if p.key?(:description) + saved &&= attachment.save + end + end + unless saved + raise ActiveRecord::Rollback + end + end + saved + end + + def self.latest_attach(attachments, filename) + attachments.sort_by(&:created_on).reverse.detect do |att| + filename.casecmp(att.filename) == 0 + end + end + + def self.prune(age=1.day) + Attachment.where("created_on < ? AND (container_type IS NULL OR container_type = '')", Time.now - age).destroy_all + end + + # Moves an existing attachment to its target directory + def move_to_target_directory! + return unless !new_record? & readable? + + src = diskfile + self.disk_directory = target_directory + dest = diskfile + + return if src == dest + + if !FileUtils.mkdir_p(File.dirname(dest)) + logger.error "Could not create directory #{File.dirname(dest)}" if logger + return + end + + if !FileUtils.mv(src, dest) + logger.error "Could not move attachment from #{src} to #{dest}" if logger + return + end + + update_column :disk_directory, disk_directory + end + + # Moves existing attachments that are stored at the root of the files + # directory (ie. created before Redmine 2.3) to their target subdirectories + def self.move_from_root_to_target_directory + Attachment.where("disk_directory IS NULL OR disk_directory = ''").find_each do |attachment| + attachment.move_to_target_directory! + end + end + + # Updates digests to SHA256 for all attachments that have a MD5 digest + # (ie. created before Redmine 3.4) + def self.update_digests_to_sha256 + Attachment.where("length(digest) < 64").find_each do |attachment| + attachment.update_digest_to_sha256! + end + end + + # Updates attachment digest to SHA256 + def update_digest_to_sha256! + if readable? + sha = Digest::SHA256.new + File.open(diskfile, 'rb') do |f| + while buffer = f.read(8192) + sha.update(buffer) + end + end + update_column :digest, sha.hexdigest + end + end + + # Returns true if the extension is allowed regarding allowed/denied + # extensions defined in application settings, otherwise false + def self.valid_extension?(extension) + denied, allowed = [:attachment_extensions_denied, :attachment_extensions_allowed].map do |setting| + Setting.send(setting) + end + if denied.present? && extension_in?(extension, denied) + return false + end + if allowed.present? && !extension_in?(extension, allowed) + return false + end + true + end + + # Returns true if extension belongs to extensions list. + def self.extension_in?(extension, extensions) + extension = extension.downcase.sub(/\A\.+/, '') + + unless extensions.is_a?(Array) + extensions = extensions.to_s.split(",").map(&:strip) + end + extensions = extensions.map {|s| s.downcase.sub(/\A\.+/, '')}.reject(&:blank?) + extensions.include?(extension) + end + + # Returns true if attachment's extension belongs to extensions list. + def extension_in?(extensions) + self.class.extension_in?(File.extname(filename), extensions) + end + + # returns either MD5 or SHA256 depending on the way self.digest was computed + def digest_type + digest.size < 64 ? "MD5" : "SHA256" if digest.present? + end + + private + + def reuse_existing_file_if_possible + original_diskfile = nil + + reused = with_lock do + if existing = Attachment + .where(digest: self.digest, filesize: self.filesize) + .where('id <> ? and disk_filename <> ?', + self.id, self.disk_filename) + .first + existing.with_lock do + + original_diskfile = self.diskfile + existing_diskfile = existing.diskfile + + if File.readable?(original_diskfile) && + File.readable?(existing_diskfile) && + FileUtils.identical?(original_diskfile, existing_diskfile) + + self.update_columns disk_directory: existing.disk_directory, + disk_filename: existing.disk_filename + end + end + end + end + if reused + File.delete(original_diskfile) + end + rescue ActiveRecord::StatementInvalid, ActiveRecord::RecordNotFound + # Catch and ignore lock errors. It is not critical if deduplication does + # not happen, therefore we do not retry. + # with_lock throws ActiveRecord::RecordNotFound if the record isnt there + # anymore, thats why this is caught and ignored as well. + end + + + # Physically deletes the file from the file system + def delete_from_disk! + if disk_filename.present? && File.exist?(diskfile) + File.delete(diskfile) + end + end + + def sanitize_filename(value) + # get only the filename, not the whole path + just_filename = value.gsub(/\A.*(\\|\/)/m, '') + + # Finally, replace invalid characters with underscore + just_filename.gsub(/[\/\?\%\*\:\|\"\'<>\n\r]+/, '_') + end + + # Returns the subdirectory in which the attachment will be saved + def target_directory + time = created_on || DateTime.now + time.strftime("%Y/%m") + end + + # Returns an ASCII or hashed filename that do not + # exists yet in the given subdirectory + def self.disk_filename(filename, directory=nil) + timestamp = DateTime.now.strftime("%y%m%d%H%M%S") + ascii = '' + if filename =~ %r{^[a-zA-Z0-9_\.\-]*$} && filename.length <= 50 + ascii = filename + else + ascii = Digest::MD5.hexdigest(filename) + # keep the extension if any + ascii << $1 if filename =~ %r{(\.[a-zA-Z0-9]+)$} + end + while File.exist?(File.join(storage_path, directory.to_s, "#{timestamp}_#{ascii}")) + timestamp.succ! + end + "#{timestamp}_#{ascii}" + end +end diff --git a/app/models/auth_source.rb b/app/models/auth_source.rb new file mode 100644 index 0000000..4954c96 --- /dev/null +++ b/app/models/auth_source.rb @@ -0,0 +1,109 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Generic exception for when the AuthSource can not be reached +# (eg. can not connect to the LDAP) +class AuthSourceException < Exception; end +class AuthSourceTimeoutException < AuthSourceException; end + +class AuthSource < ActiveRecord::Base + include Redmine::SafeAttributes + include Redmine::SubclassFactory + include Redmine::Ciphering + + has_many :users + + validates_presence_of :name + validates_uniqueness_of :name + validates_length_of :name, :maximum => 60 + attr_protected :id + + safe_attributes 'name', + 'host', + 'port', + 'account', + 'account_password', + 'base_dn', + 'attr_login', + 'attr_firstname', + 'attr_lastname', + 'attr_mail', + 'onthefly_register', + 'tls', + 'filter', + 'timeout' + + def authenticate(login, password) + end + + def test_connection + end + + def auth_method_name + "Abstract" + end + + def account_password + read_ciphered_attribute(:account_password) + end + + def account_password=(arg) + write_ciphered_attribute(:account_password, arg) + end + + def searchable? + false + end + + def self.search(q) + results = [] + AuthSource.all.each do |source| + begin + if source.searchable? + results += source.search(q) + end + rescue AuthSourceException => e + logger.error "Error while searching users in #{source.name}: #{e.message}" + end + end + results + end + + def allow_password_changes? + self.class.allow_password_changes? + end + + # Does this auth source backend allow password changes? + def self.allow_password_changes? + false + end + + # Try to authenticate a user not yet registered against available sources + def self.authenticate(login, password) + AuthSource.where(:onthefly_register => true).each do |source| + begin + logger.debug "Authenticating '#{login}' against '#{source.name}'" if logger && logger.debug? + attrs = source.authenticate(login, password) + rescue => e + logger.error "Error during authentication: #{e.message}" + attrs = nil + end + return attrs if attrs + end + return nil + end +end diff --git a/app/models/auth_source_ldap.rb b/app/models/auth_source_ldap.rb new file mode 100644 index 0000000..c3565aa --- /dev/null +++ b/app/models/auth_source_ldap.rb @@ -0,0 +1,209 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'net/ldap' +require 'net/ldap/dn' +require 'timeout' + +class AuthSourceLdap < AuthSource + NETWORK_EXCEPTIONS = [ + Net::LDAP::LdapError, + Errno::ECONNABORTED, Errno::ECONNREFUSED, Errno::ECONNRESET, + Errno::EHOSTDOWN, Errno::EHOSTUNREACH, + SocketError + ] + + validates_presence_of :host, :port, :attr_login + validates_length_of :name, :host, :maximum => 60, :allow_nil => true + validates_length_of :account, :account_password, :base_dn, :maximum => 255, :allow_blank => true + validates_length_of :attr_login, :attr_firstname, :attr_lastname, :attr_mail, :maximum => 30, :allow_nil => true + validates_numericality_of :port, :only_integer => true + validates_numericality_of :timeout, :only_integer => true, :allow_blank => true + validate :validate_filter + + before_validation :strip_ldap_attributes + + def initialize(attributes=nil, *args) + super + self.port = 389 if self.port == 0 + end + + def authenticate(login, password) + return nil if login.blank? || password.blank? + + with_timeout do + attrs = get_user_dn(login, password) + if attrs && attrs[:dn] && authenticate_dn(attrs[:dn], password) + logger.debug "Authentication successful for '#{login}'" if logger && logger.debug? + return attrs.except(:dn) + end + end + rescue *NETWORK_EXCEPTIONS => e + raise AuthSourceException.new(e.message) + end + + # Test the connection to the LDAP + def test_connection + with_timeout do + ldap_con = initialize_ldap_con(self.account, self.account_password) + ldap_con.open { } + + if self.account.present? && !self.account.include?("$login") && self.account_password.present? + ldap_auth = authenticate_dn(self.account, self.account_password) + raise AuthSourceException.new(l(:error_ldap_bind_credentials)) if !ldap_auth + end + end + rescue *NETWORK_EXCEPTIONS => e + raise AuthSourceException.new(e.message) + end + + def auth_method_name + "LDAP" + end + + # Returns true if this source can be searched for users + def searchable? + !account.to_s.include?("$login") && %w(login firstname lastname mail).all? {|a| send("attr_#{a}?")} + end + + # Searches the source for users and returns an array of results + def search(q) + q = q.to_s.strip + return [] unless searchable? && q.present? + + results = [] + search_filter = base_filter & Net::LDAP::Filter.begins(self.attr_login, q) + ldap_con = initialize_ldap_con(self.account, self.account_password) + ldap_con.search(:base => self.base_dn, + :filter => search_filter, + :attributes => ['dn', self.attr_login, self.attr_firstname, self.attr_lastname, self.attr_mail], + :size => 10) do |entry| + attrs = get_user_attributes_from_ldap_entry(entry) + attrs[:login] = AuthSourceLdap.get_attr(entry, self.attr_login) + results << attrs + end + results + rescue *NETWORK_EXCEPTIONS => e + raise AuthSourceException.new(e.message) + end + + private + + def with_timeout(&block) + timeout = self.timeout + timeout = 20 unless timeout && timeout > 0 + Timeout.timeout(timeout) do + return yield + end + rescue Timeout::Error => e + raise AuthSourceTimeoutException.new(e.message) + end + + def ldap_filter + if filter.present? + Net::LDAP::Filter.construct(filter) + end + rescue Net::LDAP::LdapError, Net::LDAP::FilterSyntaxInvalidError + nil + end + + def base_filter + filter = Net::LDAP::Filter.eq("objectClass", "*") + if f = ldap_filter + filter = filter & f + end + filter + end + + def validate_filter + if filter.present? && ldap_filter.nil? + errors.add(:filter, :invalid) + end + end + + def strip_ldap_attributes + [:attr_login, :attr_firstname, :attr_lastname, :attr_mail].each do |attr| + write_attribute(attr, read_attribute(attr).strip) unless read_attribute(attr).nil? + end + end + + def initialize_ldap_con(ldap_user, ldap_password) + options = { :host => self.host, + :port => self.port, + :encryption => (self.tls ? :simple_tls : nil) + } + options.merge!(:auth => { :method => :simple, :username => ldap_user, :password => ldap_password }) unless ldap_user.blank? && ldap_password.blank? + Net::LDAP.new options + end + + def get_user_attributes_from_ldap_entry(entry) + { + :dn => entry.dn, + :firstname => AuthSourceLdap.get_attr(entry, self.attr_firstname), + :lastname => AuthSourceLdap.get_attr(entry, self.attr_lastname), + :mail => AuthSourceLdap.get_attr(entry, self.attr_mail), + :auth_source_id => self.id + } + end + + # Return the attributes needed for the LDAP search. It will only + # include the user attributes if on-the-fly registration is enabled + def search_attributes + if onthefly_register? + ['dn', self.attr_firstname, self.attr_lastname, self.attr_mail] + else + ['dn'] + end + end + + # Check if a DN (user record) authenticates with the password + def authenticate_dn(dn, password) + if dn.present? && password.present? + initialize_ldap_con(dn, password).bind + end + end + + # Get the user's dn and any attributes for them, given their login + def get_user_dn(login, password) + ldap_con = nil + if self.account && self.account.include?("$login") + ldap_con = initialize_ldap_con(self.account.sub("$login", Net::LDAP::DN.escape(login)), password) + else + ldap_con = initialize_ldap_con(self.account, self.account_password) + end + attrs = {} + search_filter = base_filter & Net::LDAP::Filter.eq(self.attr_login, login) + ldap_con.search( :base => self.base_dn, + :filter => search_filter, + :attributes=> search_attributes) do |entry| + if onthefly_register? + attrs = get_user_attributes_from_ldap_entry(entry) + else + attrs = {:dn => entry.dn} + end + logger.debug "DN found for #{login}: #{attrs[:dn]}" if logger && logger.debug? + end + attrs + end + + def self.get_attr(entry, attr_name) + if !attr_name.blank? + value = entry[attr_name].is_a?(Array) ? entry[attr_name].first : entry[attr_name] + value.to_s.force_encoding('UTF-8') + end + end +end diff --git a/app/models/board.rb b/app/models/board.rb new file mode 100644 index 0000000..21461e3 --- /dev/null +++ b/app/models/board.rb @@ -0,0 +1,96 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Board < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :project + has_many :messages, lambda {order("#{Message.table_name}.created_on DESC")}, :dependent => :destroy + belongs_to :last_message, :class_name => 'Message' + acts_as_tree :dependent => :nullify + acts_as_positioned :scope => [:project_id, :parent_id] + acts_as_watchable + + validates_presence_of :name, :description + validates_length_of :name, :maximum => 30 + validates_length_of :description, :maximum => 255 + validate :validate_board + attr_protected :id + + scope :visible, lambda {|*args| + joins(:project). + where(Project.allowed_to_condition(args.shift || User.current, :view_messages, *args)) + } + + safe_attributes 'name', 'description', 'parent_id', 'position' + + def visible?(user=User.current) + !user.nil? && user.allowed_to?(:view_messages, project) + end + + def reload(*args) + @valid_parents = nil + super + end + + def to_s + name + end + + # Returns a scope for the board topics (messages without parent) + def topics + messages.where(:parent_id => nil) + end + + def valid_parents + @valid_parents ||= project.boards - self_and_descendants + end + + def reset_counters! + self.class.reset_counters!(id) + end + + # Updates topics_count, messages_count and last_message_id attributes for +board_id+ + def self.reset_counters!(board_id) + board_id = board_id.to_i + Board.where(:id => board_id). + update_all(["topics_count = (SELECT COUNT(*) FROM #{Message.table_name} WHERE board_id=:id AND parent_id IS NULL)," + + " messages_count = (SELECT COUNT(*) FROM #{Message.table_name} WHERE board_id=:id)," + + " last_message_id = (SELECT MAX(id) FROM #{Message.table_name} WHERE board_id=:id)", :id => board_id]) + end + + def self.board_tree(boards, parent_id=nil, level=0) + tree = [] + boards.select {|board| board.parent_id == parent_id}.sort_by(&:position).each do |board| + tree << [board, level] + tree += board_tree(boards, board.id, level+1) + end + if block_given? + tree.each do |board, level| + yield board, level + end + end + tree + end + + protected + + def validate_board + if parent_id && parent_id_changed? + errors.add(:parent_id, :invalid) unless valid_parents.include?(parent) + end + end +end diff --git a/app/models/change.rb b/app/models/change.rb new file mode 100644 index 0000000..e0d25f3 --- /dev/null +++ b/app/models/change.rb @@ -0,0 +1,34 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Change < ActiveRecord::Base + belongs_to :changeset + + validates_presence_of :changeset_id, :action, :path + before_save :init_path + before_validation :replace_invalid_utf8_of_path + attr_protected :id + + def replace_invalid_utf8_of_path + self.path = Redmine::CodesetUtil.replace_invalid_utf8(self.path) + self.from_path = Redmine::CodesetUtil.replace_invalid_utf8(self.from_path) + end + + def init_path + self.path ||= "" + end +end diff --git a/app/models/changeset.rb b/app/models/changeset.rb new file mode 100644 index 0000000..4256f05 --- /dev/null +++ b/app/models/changeset.rb @@ -0,0 +1,296 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Changeset < ActiveRecord::Base + belongs_to :repository + belongs_to :user + has_many :filechanges, :class_name => 'Change', :dependent => :delete_all + has_and_belongs_to_many :issues + has_and_belongs_to_many :parents, + :class_name => "Changeset", + :join_table => "#{table_name_prefix}changeset_parents#{table_name_suffix}", + :association_foreign_key => 'parent_id', :foreign_key => 'changeset_id' + has_and_belongs_to_many :children, + :class_name => "Changeset", + :join_table => "#{table_name_prefix}changeset_parents#{table_name_suffix}", + :association_foreign_key => 'changeset_id', :foreign_key => 'parent_id' + + acts_as_event :title => Proc.new {|o| o.title}, + :description => :long_comments, + :datetime => :committed_on, + :url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project, :repository_id => o.repository.identifier_param, :rev => o.identifier}} + + acts_as_searchable :columns => 'comments', + :preload => {:repository => :project}, + :project_key => "#{Repository.table_name}.project_id", + :date_column => :committed_on + + acts_as_activity_provider :timestamp => "#{table_name}.committed_on", + :author_key => :user_id, + :scope => preload(:user, {:repository => :project}) + + validates_presence_of :repository_id, :revision, :committed_on, :commit_date + validates_uniqueness_of :revision, :scope => :repository_id + validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true + attr_protected :id + + scope :visible, lambda {|*args| + joins(:repository => :project). + where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args)) + } + + after_create :scan_for_issues + before_create :before_create_cs + + def revision=(r) + write_attribute :revision, (r.nil? ? nil : r.to_s) + end + + # Returns the identifier of this changeset; depending on repository backends + def identifier + if repository.class.respond_to? :changeset_identifier + repository.class.changeset_identifier self + else + revision.to_s + end + end + + def committed_on=(date) + self.commit_date = date + super + end + + # Returns the readable identifier + def format_identifier + if repository.class.respond_to? :format_changeset_identifier + repository.class.format_changeset_identifier self + else + identifier + end + end + + def project + repository.project + end + + def author + user || committer.to_s.split('<').first + end + + def before_create_cs + self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding) + self.comments = self.class.normalize_comments( + self.comments, repository.repo_log_encoding) + self.user = repository.find_committer_user(self.committer) + end + + def scan_for_issues + scan_comment_for_issue_ids + end + + TIMELOG_RE = / + ( + ((\d+)(h|hours?))((\d+)(m|min)?)? + | + ((\d+)(h|hours?|m|min)) + | + (\d+):(\d+) + | + (\d+([\.,]\d+)?)h? + ) + /x + + def scan_comment_for_issue_ids + return if comments.blank? + # keywords used to reference issues + ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip) + ref_keywords_any = ref_keywords.delete('*') + # keywords used to fix issues + fix_keywords = Setting.commit_update_keywords_array.map {|r| r['keywords']}.flatten.compact + + kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") + + referenced_issues = [] + + comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match| + action, refs = match[2].to_s.downcase, match[3] + next unless action.present? || ref_keywords_any + + refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m| + issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2] + if issue && !issue_linked_to_same_commit?(issue) + referenced_issues << issue + # Don't update issues or log time when importing old commits + unless repository.created_on && committed_on && committed_on < repository.created_on + fix_issue(issue, action) if fix_keywords.include?(action) + log_time(issue, hours) if hours && Setting.commit_logtime_enabled? + end + end + end + end + + referenced_issues.uniq! + self.issues = referenced_issues unless referenced_issues.empty? + end + + def short_comments + @short_comments || split_comments.first + end + + def long_comments + @long_comments || split_comments.last + end + + def text_tag(ref_project=nil) + repo = "" + if repository && repository.identifier.present? + repo = "#{repository.identifier}|" + end + tag = if scmid? + "commit:#{repo}#{scmid}" + else + "#{repo}r#{revision}" + end + if ref_project && project && ref_project != project + tag = "#{project.identifier}:#{tag}" + end + tag + end + + # Returns the title used for the changeset in the activity/search results + def title + repo = (repository && repository.identifier.present?) ? " (#{repository.identifier})" : '' + comm = short_comments.blank? ? '' : (': ' + short_comments) + "#{l(:label_revision)} #{format_identifier}#{repo}#{comm}" + end + + # Returns the previous changeset + def previous + @previous ||= Changeset.where(["id < ? AND repository_id = ?", id, repository_id]).order('id DESC').first + end + + # Returns the next changeset + def next + @next ||= Changeset.where(["id > ? AND repository_id = ?", id, repository_id]).order('id ASC').first + end + + # Creates a new Change from it's common parameters + def create_change(change) + Change.create(:changeset => self, + :action => change[:action], + :path => change[:path], + :from_path => change[:from_path], + :from_revision => change[:from_revision]) + end + + # Finds an issue that can be referenced by the commit message + def find_referenced_issue_by_id(id) + return nil if id.blank? + issue = Issue.find_by_id(id.to_i) + if Setting.commit_cross_project_ref? + # all issues can be referenced/fixed + elsif issue + # issue that belong to the repository project, a subproject or a parent project only + unless issue.project && + (project == issue.project || project.is_ancestor_of?(issue.project) || + project.is_descendant_of?(issue.project)) + issue = nil + end + end + issue + end + + private + + # Returns true if the issue is already linked to the same commit + # from a different repository + def issue_linked_to_same_commit?(issue) + repository.same_commits_in_scope(issue.changesets, self).any? + end + + # Updates the +issue+ according to +action+ + def fix_issue(issue, action) + # the issue may have been updated by the closure of another one (eg. duplicate) + issue.reload + # don't change the status is the issue is closed + return if issue.closed? + + journal = issue.init_journal(user || User.anonymous, + ll(Setting.default_language, + :text_status_changed_by_changeset, + text_tag(issue.project))) + rule = Setting.commit_update_keywords_array.detect do |rule| + rule['keywords'].include?(action) && + (rule['if_tracker_id'].blank? || rule['if_tracker_id'] == issue.tracker_id.to_s) + end + if rule + issue.assign_attributes rule.slice(*Issue.attribute_names) + end + Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update, + { :changeset => self, :issue => issue, :action => action }) + + if issue.changes.any? + unless issue.save + logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger + end + else + issue.clear_journal + end + issue + end + + def log_time(issue, hours) + time_entry = TimeEntry.new( + :user => user, + :hours => hours, + :issue => issue, + :spent_on => commit_date, + :comments => l(:text_time_logged_by_changeset, :value => text_tag(issue.project), + :locale => Setting.default_language) + ) + time_entry.activity = log_time_activity unless log_time_activity.nil? + + unless time_entry.save + logger.warn("TimeEntry could not be created by changeset #{id}: #{time_entry.errors.full_messages}") if logger + end + time_entry + end + + def log_time_activity + if Setting.commit_logtime_activity_id.to_i > 0 + TimeEntryActivity.find_by_id(Setting.commit_logtime_activity_id.to_i) + end + end + + def split_comments + comments =~ /\A(.+?)\r?\n(.*)$/m + @short_comments = $1 || comments + @long_comments = $2.to_s.strip + return @short_comments, @long_comments + end + + public + + # Strips and reencodes a commit log before insertion into the database + def self.normalize_comments(str, encoding) + Changeset.to_utf8(str.to_s.strip, encoding) + end + + def self.to_utf8(str, encoding) + Redmine::CodesetUtil.to_utf8(str, encoding) + end +end diff --git a/app/models/comment.rb b/app/models/comment.rb new file mode 100644 index 0000000..48b47d9 --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,38 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Comment < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :commented, :polymorphic => true, :counter_cache => true + belongs_to :author, :class_name => 'User' + + validates_presence_of :commented, :author, :comments + attr_protected :id + + after_create :send_notification + + safe_attributes 'comments' + + private + + def send_notification + mailer_method = "#{commented.class.name.underscore}_comment_added" + if Setting.notified_events.include?(mailer_method) + Mailer.send(mailer_method, self).deliver + end + end +end diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb new file mode 100644 index 0000000..ca061a2 --- /dev/null +++ b/app/models/custom_field.rb @@ -0,0 +1,333 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CustomField < ActiveRecord::Base + include Redmine::SafeAttributes + include Redmine::SubclassFactory + + has_many :enumerations, + lambda { order(:position) }, + :class_name => 'CustomFieldEnumeration', + :dependent => :delete_all + has_many :custom_values, :dependent => :delete_all + has_and_belongs_to_many :roles, :join_table => "#{table_name_prefix}custom_fields_roles#{table_name_suffix}", :foreign_key => "custom_field_id" + acts_as_positioned + serialize :possible_values + store :format_store + + validates_presence_of :name, :field_format + validates_uniqueness_of :name, :scope => :type + validates_length_of :name, :maximum => 30 + validates_length_of :regexp, maximum: 255 + validates_inclusion_of :field_format, :in => Proc.new { Redmine::FieldFormat.available_formats } + validate :validate_custom_field + attr_protected :id + + before_validation :set_searchable + before_save do |field| + field.format.before_custom_field_save(field) + end + after_save :handle_multiplicity_change + after_save do |field| + if field.visible_changed? && field.visible + field.roles.clear + end + end + + scope :sorted, lambda { order(:position) } + scope :visible, lambda {|*args| + user = args.shift || User.current + if user.admin? + # nop + elsif user.memberships.any? + where("#{table_name}.visible = ? OR #{table_name}.id IN (SELECT DISTINCT cfr.custom_field_id FROM #{Member.table_name} m" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.member_id = m.id" + + " INNER JOIN #{table_name_prefix}custom_fields_roles#{table_name_suffix} cfr ON cfr.role_id = mr.role_id" + + " WHERE m.user_id = ?)", + true, user.id) + else + where(:visible => true) + end + } + def visible_by?(project, user=User.current) + visible? || user.admin? + end + + safe_attributes 'name', + 'field_format', + 'possible_values', + 'regexp', + 'min_length', + 'max_length', + 'is_required', + 'is_for_all', + 'is_filter', + 'position', + 'searchable', + 'default_value', + 'editable', + 'visible', + 'multiple', + 'description', + 'role_ids', + 'url_pattern', + 'text_formatting', + 'edit_tag_style', + 'user_role', + 'version_status', + 'extensions_allowed', + 'full_width_layout' + + def format + @format ||= Redmine::FieldFormat.find(field_format) + end + + def field_format=(arg) + # cannot change format of a saved custom field + if new_record? + @format = nil + super + end + end + + def set_searchable + # make sure these fields are not searchable + self.searchable = false unless format.class.searchable_supported + # make sure only these fields can have multiple values + self.multiple = false unless format.class.multiple_supported + true + end + + def validate_custom_field + format.validate_custom_field(self).each do |attribute, message| + errors.add attribute, message + end + + if regexp.present? + begin + Regexp.new(regexp) + rescue + errors.add(:regexp, :invalid) + end + end + + if default_value.present? + validate_field_value(default_value).each do |message| + errors.add :default_value, message + end + end + end + + def possible_custom_value_options(custom_value) + format.possible_custom_value_options(custom_value) + end + + def possible_values_options(object=nil) + if object.is_a?(Array) + object.map {|o| format.possible_values_options(self, o)}.reduce(:&) || [] + else + format.possible_values_options(self, object) || [] + end + end + + def possible_values + values = read_attribute(:possible_values) + if values.is_a?(Array) + values.each do |value| + value.to_s.force_encoding('UTF-8') + end + values + else + [] + end + end + + # Makes possible_values accept a multiline string + def possible_values=(arg) + if arg.is_a?(Array) + values = arg.compact.map {|a| a.to_s.strip}.reject(&:blank?) + write_attribute(:possible_values, values) + else + self.possible_values = arg.to_s.split(/[\n\r]+/) + end + end + + def set_custom_field_value(custom_field_value, value) + format.set_custom_field_value(self, custom_field_value, value) + end + + def cast_value(value) + format.cast_value(self, value) + end + + def value_from_keyword(keyword, customized) + format.value_from_keyword(self, keyword, customized) + end + + # Returns the options hash used to build a query filter for the field + def query_filter_options(query) + format.query_filter_options(self, query) + end + + def totalable? + format.totalable_supported + end + + def full_width_layout? + full_width_layout == '1' + end + + # Returns a ORDER BY clause that can used to sort customized + # objects by their value of the custom field. + # Returns nil if the custom field can not be used for sorting. + def order_statement + return nil if multiple? + format.order_statement(self) + end + + # Returns a GROUP BY clause that can used to group by custom value + # Returns nil if the custom field can not be used for grouping. + def group_statement + return nil if multiple? + format.group_statement(self) + end + + def join_for_order_statement + format.join_for_order_statement(self) + end + + def visibility_by_project_condition(project_key=nil, user=User.current, id_column=nil) + if visible? || user.admin? + "1=1" + elsif user.anonymous? + "1=0" + else + project_key ||= "#{self.class.customized_class.table_name}.project_id" + id_column ||= id + "#{project_key} IN (SELECT DISTINCT m.project_id FROM #{Member.table_name} m" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.member_id = m.id" + + " INNER JOIN #{table_name_prefix}custom_fields_roles#{table_name_suffix} cfr ON cfr.role_id = mr.role_id" + + " WHERE m.user_id = #{user.id} AND cfr.custom_field_id = #{id_column})" + end + end + + def self.visibility_condition + if user.admin? + "1=1" + elsif user.anonymous? + "#{table_name}.visible" + else + "#{project_key} IN (SELECT DISTINCT m.project_id FROM #{Member.table_name} m" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.member_id = m.id" + + " INNER JOIN #{table_name_prefix}custom_fields_roles#{table_name_suffix} cfr ON cfr.role_id = mr.role_id" + + " WHERE m.user_id = #{user.id} AND cfr.custom_field_id = #{id})" + end + end + + def <=>(field) + position <=> field.position + end + + # Returns the class that values represent + def value_class + format.target_class if format.respond_to?(:target_class) + end + + def self.customized_class + self.name =~ /^(.+)CustomField$/ + $1.constantize rescue nil + end + + # to move in project_custom_field + def self.for_all + where(:is_for_all => true).order(:position).to_a + end + + def type_name + nil + end + + # Returns the error messages for the given value + # or an empty array if value is a valid value for the custom field + def validate_custom_value(custom_value) + value = custom_value.value + errs = format.validate_custom_value(custom_value) + + unless errs.any? + if value.is_a?(Array) + if !multiple? + errs << ::I18n.t('activerecord.errors.messages.invalid') + end + if is_required? && value.detect(&:present?).nil? + errs << ::I18n.t('activerecord.errors.messages.blank') + end + else + if is_required? && value.blank? + errs << ::I18n.t('activerecord.errors.messages.blank') + end + end + end + + errs + end + + # Returns the error messages for the default custom field value + def validate_field_value(value) + validate_custom_value(CustomFieldValue.new(:custom_field => self, :value => value)) + end + + # Returns true if value is a valid value for the custom field + def valid_field_value?(value) + validate_field_value(value).empty? + end + + def after_save_custom_value(custom_value) + format.after_save_custom_value(self, custom_value) + end + + def format_in?(*args) + args.include?(field_format) + end + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == 'url_pattern' + attr_name = "url" + end + super(attr_name, *args) + end + + protected + + # Removes multiple values for the custom field after setting the multiple attribute to false + # We kepp the value with the highest id for each customized object + def handle_multiplicity_change + if !new_record? && multiple_was && !multiple + ids = custom_values. + where("EXISTS(SELECT 1 FROM #{CustomValue.table_name} cve WHERE cve.custom_field_id = #{CustomValue.table_name}.custom_field_id" + + " AND cve.customized_type = #{CustomValue.table_name}.customized_type AND cve.customized_id = #{CustomValue.table_name}.customized_id" + + " AND cve.id > #{CustomValue.table_name}.id)"). + pluck(:id) + + if ids.any? + custom_values.where(:id => ids).delete_all + end + end + end +end + +require_dependency 'redmine/field_format' diff --git a/app/models/custom_field_enumeration.rb b/app/models/custom_field_enumeration.rb new file mode 100644 index 0000000..125cd41 --- /dev/null +++ b/app/models/custom_field_enumeration.rb @@ -0,0 +1,82 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CustomFieldEnumeration < ActiveRecord::Base + belongs_to :custom_field + + validates_presence_of :name, :position, :custom_field_id + validates_length_of :name, :maximum => 60 + validates_numericality_of :position, :only_integer => true + before_create :set_position + + scope :active, lambda { where(:active => true) } + + def to_s + name.to_s + end + + def objects_count + custom_values.count + end + + def in_use? + objects_count > 0 + end + + alias :destroy_without_reassign :destroy + def destroy(reassign_to=nil) + if reassign_to + custom_values.update_all(:value => reassign_to.id.to_s) + end + destroy_without_reassign + end + + def custom_values + custom_field.custom_values.where(:value => id.to_s) + end + + def self.update_each(custom_field, attributes) + transaction do + attributes.each do |enumeration_id, enumeration_attributes| + enumeration = custom_field.enumerations.find_by_id(enumeration_id) + if enumeration + if block_given? + yield enumeration, enumeration_attributes + else + enumeration.attributes = enumeration_attributes + end + unless enumeration.save + raise ActiveRecord::Rollback + end + end + end + end + end + + def self.fields_for_order_statement(table=nil) + table ||= table_name + columns = ['position'] + columns.uniq.map {|field| "#{table}.#{field}"} + end + + private + + def set_position + max = self.class.where(:custom_field_id => custom_field_id).maximum(:position) || 0 + self.position = max + 1 + end +end diff --git a/app/models/custom_field_value.rb b/app/models/custom_field_value.rb new file mode 100644 index 0000000..b5481e1 --- /dev/null +++ b/app/models/custom_field_value.rb @@ -0,0 +1,68 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CustomFieldValue + attr_accessor :custom_field, :customized, :value, :value_was + + def initialize(attributes={}) + attributes.each do |name, v| + send "#{name}=", v + end + end + + def custom_field_id + custom_field.id + end + + def true? + self.value == '1' + end + + def editable? + custom_field.editable? + end + + def visible? + custom_field.visible? + end + + def required? + custom_field.is_required? + end + + def to_s + value.to_s + end + + def value=(v) + @value = custom_field.set_custom_field_value(self, v) + end + + def value_present? + if value.is_a?(Array) + value.any?(&:present?) + else + value.present? + end + end + + def validate_value + custom_field.validate_custom_value(self).each do |message| + customized.errors.add(:base, custom_field.name + ' ' + message) + end + end +end diff --git a/app/models/custom_value.rb b/app/models/custom_value.rb new file mode 100644 index 0000000..33da1bd --- /dev/null +++ b/app/models/custom_value.rb @@ -0,0 +1,68 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class CustomValue < ActiveRecord::Base + belongs_to :custom_field + belongs_to :customized, :polymorphic => true + attr_protected :id + + after_save :custom_field_after_save_custom_value + + def initialize(attributes=nil, *args) + super + if new_record? && custom_field && !attributes.key?(:value) + self.value ||= custom_field.default_value + end + end + + # Returns true if the boolean custom value is true + def true? + self.value == '1' + end + + def editable? + custom_field.editable? + end + + def visible?(user=User.current) + if custom_field.visible? + true + elsif customized.respond_to?(:project) + custom_field.visible_by?(customized.project, user) + else + false + end + end + + def attachments_visible?(user) + visible?(user) && customized && customized.visible?(user) + end + + def required? + custom_field.is_required? + end + + def to_s + value.to_s + end + + private + + def custom_field_after_save_custom_value + custom_field.after_save_custom_value(self) + end +end diff --git a/app/models/document.rb b/app/models/document.rb new file mode 100644 index 0000000..d347e58 --- /dev/null +++ b/app/models/document.rb @@ -0,0 +1,75 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Document < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :project + belongs_to :category, :class_name => "DocumentCategory" + acts_as_attachable :delete_permission => :delete_documents + acts_as_customizable + + acts_as_searchable :columns => ['title', "#{table_name}.description"], + :preload => :project + acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"}, + :author => Proc.new {|o| o.attachments.reorder("#{Attachment.table_name}.created_on ASC").first.try(:author) }, + :url => Proc.new {|o| {:controller => 'documents', :action => 'show', :id => o.id}} + acts_as_activity_provider :scope => preload(:project) + + validates_presence_of :project, :title, :category + validates_length_of :title, :maximum => 255 + attr_protected :id + + after_create :send_notification + + scope :visible, lambda {|*args| + joins(:project). + where(Project.allowed_to_condition(args.shift || User.current, :view_documents, *args)) + } + + safe_attributes 'category_id', 'title', 'description', 'custom_fields', 'custom_field_values' + + def visible?(user=User.current) + !user.nil? && user.allowed_to?(:view_documents, project) + end + + def initialize(attributes=nil, *args) + super + if new_record? + self.category ||= DocumentCategory.default + end + end + + def updated_on + unless @updated_on + a = attachments.last + @updated_on = (a && a.created_on) || created_on + end + @updated_on + end + + def notified_users + project.notified_users.reject {|user| !visible?(user)} + end + + private + + def send_notification + if Setting.notified_events.include?('document_added') + Mailer.document_added(self).deliver + end + end +end diff --git a/app/models/document_category.rb b/app/models/document_category.rb new file mode 100644 index 0000000..218c6cd --- /dev/null +++ b/app/models/document_category.rb @@ -0,0 +1,40 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class DocumentCategory < Enumeration + has_many :documents, :foreign_key => 'category_id' + + OptionName = :enumeration_doc_categories + + def option_name + OptionName + end + + def objects_count + documents.count + end + + def transfer_relations(to) + documents.update_all(:category_id => to.id) + end + + def self.default + d = super + d = first if d.nil? + d + end +end diff --git a/app/models/document_category_custom_field.rb b/app/models/document_category_custom_field.rb new file mode 100644 index 0000000..9ff5ee7 --- /dev/null +++ b/app/models/document_category_custom_field.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class DocumentCategoryCustomField < CustomField + def type_name + :enumeration_doc_categories + end +end diff --git a/app/models/document_custom_field.rb b/app/models/document_custom_field.rb new file mode 100644 index 0000000..7b689e8 --- /dev/null +++ b/app/models/document_custom_field.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class DocumentCustomField < CustomField + def type_name + :label_document_plural + end +end diff --git a/app/models/email_address.rb b/app/models/email_address.rb new file mode 100644 index 0000000..295b9bc --- /dev/null +++ b/app/models/email_address.rb @@ -0,0 +1,111 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class EmailAddress < ActiveRecord::Base + include Redmine::SafeAttributes + + belongs_to :user + attr_protected :id + + after_create :deliver_security_notification_create + after_update :destroy_tokens, :deliver_security_notification_update + after_destroy :destroy_tokens, :deliver_security_notification_destroy + + validates_presence_of :address + validates_format_of :address, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, :allow_blank => true + validates_length_of :address, :maximum => User::MAIL_LENGTH_LIMIT, :allow_nil => true + validates_uniqueness_of :address, :case_sensitive => false, + :if => Proc.new {|email| email.address_changed? && email.address.present?} + + safe_attributes 'address' + + def address=(arg) + write_attribute(:address, arg.to_s.strip) + end + + def destroy + if is_default? + false + else + super + end + end + + private + + # send a security notification to user that a new email address was added + def deliver_security_notification_create + # only deliver if this isn't the only address. + # in that case, the user is just being created and + # should not receive this email. + if user.mails != [address] + deliver_security_notification(user, + message: :mail_body_security_notification_add, + field: :field_mail, + value: address + ) + end + end + + # send a security notification to user that an email has been changed (notified/not notified) + def deliver_security_notification_update + if address_changed? + recipients = [user, address_was] + options = { + message: :mail_body_security_notification_change_to, + field: :field_mail, + value: address + } + elsif notify_changed? + recipients = [user, address] + options = { + message: notify_was ? :mail_body_security_notification_notify_disabled : :mail_body_security_notification_notify_enabled, + value: address + } + end + deliver_security_notification(recipients, options) + end + + # send a security notification to user that an email address was deleted + def deliver_security_notification_destroy + deliver_security_notification([user, address], + message: :mail_body_security_notification_remove, + field: :field_mail, + value: address + ) + end + + # generic method to send security notifications for email addresses + def deliver_security_notification(recipients, options={}) + Mailer.security_notification(recipients, + options.merge( + title: :label_my_account, + url: {controller: 'my', action: 'account'} + ) + ).deliver + end + + # Delete all outstanding password reset tokens on email change. + # This helps to keep the account secure in case the associated email account + # was compromised. + def destroy_tokens + if address_changed? || destroyed? + tokens = ['recovery'] + Token.where(:user_id => user_id, :action => tokens).delete_all + end + end +end diff --git a/app/models/enabled_module.rb b/app/models/enabled_module.rb new file mode 100644 index 0000000..2548ba2 --- /dev/null +++ b/app/models/enabled_module.rb @@ -0,0 +1,40 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class EnabledModule < ActiveRecord::Base + belongs_to :project + acts_as_watchable + + validates_presence_of :name + validates_uniqueness_of :name, :scope => :project_id + attr_protected :id + + after_create :module_enabled + + private + + # after_create callback used to do things when a module is enabled + def module_enabled + case name + when 'wiki' + # Create a wiki with a default start page + if project && project.wiki.nil? + Wiki.create(:project => project, :start_page => 'Wiki') + end + end + end +end diff --git a/app/models/enumeration.rb b/app/models/enumeration.rb new file mode 100644 index 0000000..eef691c --- /dev/null +++ b/app/models/enumeration.rb @@ -0,0 +1,173 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Enumeration < ActiveRecord::Base + include Redmine::SubclassFactory + + default_scope lambda {order(:position)} + + belongs_to :project + + acts_as_positioned :scope => :parent_id + acts_as_customizable + acts_as_tree + + before_destroy :check_integrity + before_save :check_default + + attr_protected :type + + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:type, :project_id] + validates_length_of :name, :maximum => 30 + + scope :shared, lambda { where(:project_id => nil) } + scope :sorted, lambda { order(:position) } + scope :active, lambda { where(:active => true) } + scope :system, lambda { where(:project_id => nil) } + scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)} + + def self.default + # Creates a fake default scope so Enumeration.default will check + # it's type. STI subclasses will automatically add their own + # types to the finder. + if self.descends_from_active_record? + where(:is_default => true, :type => 'Enumeration').first + else + # STI classes are + where(:is_default => true).first + end + end + + # Overloaded on concrete classes + def option_name + nil + end + + def check_default + if is_default? && is_default_changed? + Enumeration.where({:type => type}).update_all({:is_default => false}) + end + end + + # Overloaded on concrete classes + def objects_count + 0 + end + + def in_use? + self.objects_count != 0 + end + + # Is this enumeration overriding a system level enumeration? + def is_override? + !self.parent.nil? + end + + alias :destroy_without_reassign :destroy + + # Destroy the enumeration + # If a enumeration is specified, objects are reassigned + def destroy(reassign_to = nil) + if reassign_to && reassign_to.is_a?(Enumeration) + self.transfer_relations(reassign_to) + end + destroy_without_reassign + end + + def <=>(enumeration) + position <=> enumeration.position + end + + def to_s; name end + + # Returns the Subclasses of Enumeration. Each Subclass needs to be + # required in development mode. + # + # Note: subclasses is protected in ActiveRecord + def self.get_subclasses + subclasses + end + + # Does the +new+ Hash override the previous Enumeration? + def self.overriding_change?(new, previous) + if (same_active_state?(new['active'], previous.active)) && same_custom_values?(new,previous) + return false + else + return true + end + end + + # Does the +new+ Hash have the same custom values as the previous Enumeration? + def self.same_custom_values?(new, previous) + previous.custom_field_values.each do |custom_value| + if custom_value.value != new["custom_field_values"][custom_value.custom_field_id.to_s] + return false + end + end + + return true + end + + # Are the new and previous fields equal? + def self.same_active_state?(new, previous) + new = (new == "1" ? true : false) + return new == previous + end + + private + + def check_integrity + raise "Cannot delete enumeration" if self.in_use? + end + + # Overrides Redmine::Acts::Positioned#set_default_position so that enumeration overrides + # get the same position as the overridden enumeration + def set_default_position + if position.nil? && parent + self.position = parent.position + end + super + end + + # Overrides Redmine::Acts::Positioned#update_position so that overrides get the same + # position as the overridden enumeration + def update_position + super + if position_changed? + self.class.where.not(:parent_id => nil).update_all( + "position = coalesce(( + select position + from (select id, position from enumerations) as parent + where parent_id = parent.id), 1)" + ) + end + end + + # Overrides Redmine::Acts::Positioned#remove_position so that enumeration overrides + # get the same position as the overridden enumeration + def remove_position + if parent_id.blank? + super + end + end +end + +# Force load the subclasses in development mode +require_dependency 'time_entry_activity' +require_dependency 'document_category' +require_dependency 'issue_priority' diff --git a/app/models/group.rb b/app/models/group.rb new file mode 100644 index 0000000..d94ef75 --- /dev/null +++ b/app/models/group.rb @@ -0,0 +1,119 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Group < Principal + include Redmine::SafeAttributes + + has_and_belongs_to_many :users, + :join_table => "#{table_name_prefix}groups_users#{table_name_suffix}", + :after_add => :user_added, + :after_remove => :user_removed + + acts_as_customizable + + validates_presence_of :lastname + validates_uniqueness_of :lastname, :case_sensitive => false + validates_length_of :lastname, :maximum => 255 + attr_protected :id + + self.valid_statuses = [STATUS_ACTIVE] + + before_destroy :remove_references_before_destroy + + scope :sorted, lambda { order(:type => :asc, :lastname => :asc) } + scope :named, lambda {|arg| where("LOWER(#{table_name}.lastname) = LOWER(?)", arg.to_s.strip)} + scope :givable, lambda {where(:type => 'Group')} + + safe_attributes 'name', + 'user_ids', + 'custom_field_values', + 'custom_fields', + :if => lambda {|group, user| user.admin? && !group.builtin?} + + def to_s + name.to_s + end + + def name + lastname + end + + def name=(arg) + self.lastname = arg + end + + def builtin_type + nil + end + + # Return true if the group is a builtin group + def builtin? + false + end + + # Returns true if the group can be given to a user + def givable? + !builtin? + end + + def user_added(user) + members.each do |member| + next if member.project.nil? + user_member = Member.find_by_project_id_and_user_id(member.project_id, user.id) || Member.new(:project_id => member.project_id, :user_id => user.id) + member.member_roles.each do |member_role| + user_member.member_roles << MemberRole.new(:role => member_role.role, :inherited_from => member_role.id) + end + user_member.save! + end + end + + def user_removed(user) + members.each do |member| + MemberRole. + joins(:member). + where("#{Member.table_name}.user_id = ? AND #{MemberRole.table_name}.inherited_from IN (?)", user.id, member.member_role_ids). + each(&:destroy) + end + end + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == 'lastname' + attr_name = "name" + end + super(attr_name, *args) + end + + def self.anonymous + GroupAnonymous.load_instance + end + + def self.non_member + GroupNonMember.load_instance + end + + private + + # Removes references that are not handled by associations + def remove_references_before_destroy + return if self.id.nil? + + Issue.where(['assigned_to_id = ?', id]).update_all('assigned_to_id = NULL') + end +end + +require_dependency "group_builtin" diff --git a/app/models/group_anonymous.rb b/app/models/group_anonymous.rb new file mode 100644 index 0000000..a3e5f38 --- /dev/null +++ b/app/models/group_anonymous.rb @@ -0,0 +1,26 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class GroupAnonymous < GroupBuiltin + def name + l(:label_group_anonymous) + end + + def builtin_type + "anonymous" + end +end diff --git a/app/models/group_builtin.rb b/app/models/group_builtin.rb new file mode 100644 index 0000000..911e274 --- /dev/null +++ b/app/models/group_builtin.rb @@ -0,0 +1,56 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class GroupBuiltin < Group + validate :validate_uniqueness, :on => :create + + def validate_uniqueness + errors.add :base, 'The builtin group already exists.' if self.class.exists? + end + + def builtin? + true + end + + def destroy + false + end + + def user_added(user) + raise 'Cannot add users to a builtin group' + end + + class << self + def load_instance + return nil if self == GroupBuiltin + instance = unscoped.order('id').first || create_instance + end + + def create_instance + raise 'The builtin group already exists.' if exists? + instance = unscoped.new + instance.lastname = name + instance.save :validate => false + raise 'Unable to create builtin group.' if instance.new_record? + instance + end + private :create_instance + end +end + +require_dependency "group_anonymous" +require_dependency "group_non_member" diff --git a/app/models/group_custom_field.rb b/app/models/group_custom_field.rb new file mode 100644 index 0000000..76755ec --- /dev/null +++ b/app/models/group_custom_field.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class GroupCustomField < CustomField + def type_name + :label_group_plural + end +end diff --git a/app/models/group_non_member.rb b/app/models/group_non_member.rb new file mode 100644 index 0000000..d94666a --- /dev/null +++ b/app/models/group_non_member.rb @@ -0,0 +1,26 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class GroupNonMember < GroupBuiltin + def name + l(:label_group_non_member) + end + + def builtin_type + "non_member" + end +end diff --git a/app/models/import.rb b/app/models/import.rb new file mode 100644 index 0000000..71bc3c1 --- /dev/null +++ b/app/models/import.rb @@ -0,0 +1,270 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'csv' + +class Import < ActiveRecord::Base + has_many :items, :class_name => 'ImportItem', :dependent => :delete_all + belongs_to :user + serialize :settings + + before_destroy :remove_file + + validates_presence_of :filename, :user_id + validates_length_of :filename, :maximum => 255 + + DATE_FORMATS = [ + '%Y-%m-%d', + '%d/%m/%Y', + '%m/%d/%Y', + '%d.%m.%Y', + '%d-%m-%Y' + ] + + def initialize(*args) + super + self.settings ||= {} + end + + def file=(arg) + return unless arg.present? && arg.size > 0 + + self.filename = generate_filename + Redmine::Utils.save_upload(arg, filepath) + end + + def set_default_settings + separator = lu(user, :general_csv_separator) + if file_exists? + begin + content = File.read(filepath, 256) + separator = [',', ';'].sort_by {|sep| content.count(sep) }.last + rescue Exception => e + end + end + wrapper = '"' + encoding = lu(user, :general_csv_encoding) + + date_format = lu(user, "date.formats.default", :default => "foo") + date_format = DATE_FORMATS.first unless DATE_FORMATS.include?(date_format) + + self.settings.merge!( + 'separator' => separator, + 'wrapper' => wrapper, + 'encoding' => encoding, + 'date_format' => date_format + ) + end + + def to_param + filename + end + + # Returns the full path of the file to import + # It is stored in tmp/imports with a random hex as filename + def filepath + if filename.present? && filename =~ /\A[0-9a-f]+\z/ + File.join(Rails.root, "tmp", "imports", filename) + else + nil + end + end + + # Returns true if the file to import exists + def file_exists? + filepath.present? && File.exists?(filepath) + end + + # Returns the headers as an array that + # can be used for select options + def columns_options(default=nil) + i = -1 + headers.map {|h| [h, i+=1]} + end + + # Parses the file to import and updates the total number of items + def parse_file + count = 0 + read_items {|row, i| count=i} + update_attribute :total_items, count + count + end + + # Reads the items to import and yields the given block for each item + def read_items + i = 0 + headers = true + read_rows do |row| + if i == 0 && headers + headers = false + next + end + i+= 1 + yield row, i if block_given? + end + end + + # Returns the count first rows of the file (including headers) + def first_rows(count=4) + rows = [] + read_rows do |row| + rows << row + break if rows.size >= count + end + rows + end + + # Returns an array of headers + def headers + first_rows(1).first || [] + end + + # Returns the mapping options + def mapping + settings['mapping'] || {} + end + + # Adds a callback that will be called after the item at given position is imported + def add_callback(position, name, *args) + settings['callbacks'] ||= {} + settings['callbacks'][position.to_i] ||= [] + settings['callbacks'][position.to_i] << [name, args] + save! + end + + # Executes the callbacks for the given object + def do_callbacks(position, object) + if callbacks = (settings['callbacks'] || {}).delete(position) + callbacks.each do |name, args| + send "#{name}_callback", object, *args + end + save! + end + end + + # Imports items and returns the position of the last processed item + def run(options={}) + max_items = options[:max_items] + max_time = options[:max_time] + current = 0 + imported = 0 + resume_after = items.maximum(:position) || 0 + interrupted = false + started_on = Time.now + + read_items do |row, position| + if (max_items && imported >= max_items) || (max_time && Time.now >= started_on + max_time) + interrupted = true + break + end + if position > resume_after + item = items.build + item.position = position + + if object = build_object(row, item) + if object.save + item.obj_id = object.id + else + item.message = object.errors.full_messages.join("\n") + end + end + + item.save! + imported += 1 + + do_callbacks(item.position, object) + end + current = position + end + + if imported == 0 || interrupted == false + if total_items.nil? + update_attribute :total_items, current + end + update_attribute :finished, true + remove_file + end + + current + end + + def unsaved_items + items.where(:obj_id => nil) + end + + def saved_items + items.where("obj_id IS NOT NULL") + end + + private + + def read_rows + return unless file_exists? + + csv_options = {:headers => false} + csv_options[:encoding] = settings['encoding'].to_s.presence || 'UTF-8' + csv_options[:encoding] = 'bom|UTF-8' if csv_options[:encoding] == 'UTF-8' + separator = settings['separator'].to_s + csv_options[:col_sep] = separator if separator.size == 1 + wrapper = settings['wrapper'].to_s + csv_options[:quote_char] = wrapper if wrapper.size == 1 + + CSV.foreach(filepath, csv_options) do |row| + yield row if block_given? + end + end + + def row_value(row, key) + if index = mapping[key].presence + row[index.to_i].presence + end + end + + def row_date(row, key) + if s = row_value(row, key) + format = settings['date_format'] + format = DATE_FORMATS.first unless DATE_FORMATS.include?(format) + Date.strptime(s, format) rescue s + end + end + + # Builds a record for the given row and returns it + # To be implemented by subclasses + def build_object(row) + end + + # Generates a filename used to store the import file + def generate_filename + Redmine::Utils.random_hex(16) + end + + # Deletes the import file + def remove_file + if file_exists? + begin + File.delete filepath + rescue Exception => e + logger.error "Unable to delete file #{filepath}: #{e.message}" if logger + end + end + end + + # Returns true if value is a string that represents a true value + def yes?(value) + value == lu(user, :general_text_yes) || value == '1' + end +end diff --git a/app/models/import_item.rb b/app/models/import_item.rb new file mode 100644 index 0000000..74d5c37 --- /dev/null +++ b/app/models/import_item.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ImportItem < ActiveRecord::Base + belongs_to :import + + validates_presence_of :import_id, :position +end diff --git a/app/models/issue.rb b/app/models/issue.rb new file mode 100644 index 0000000..f995903 --- /dev/null +++ b/app/models/issue.rb @@ -0,0 +1,1875 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Issue < ActiveRecord::Base + include Redmine::SafeAttributes + include Redmine::Utils::DateCalculation + include Redmine::I18n + before_save :set_parent_id + include Redmine::NestedSet::IssueNestedSet + + belongs_to :project + belongs_to :tracker + belongs_to :status, :class_name => 'IssueStatus' + belongs_to :author, :class_name => 'User' + belongs_to :assigned_to, :class_name => 'Principal' + belongs_to :fixed_version, :class_name => 'Version' + belongs_to :priority, :class_name => 'IssuePriority' + belongs_to :category, :class_name => 'IssueCategory' + + has_many :journals, :as => :journalized, :dependent => :destroy, :inverse_of => :journalized + has_many :time_entries, :dependent => :destroy + has_and_belongs_to_many :changesets, lambda {order("#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC")} + + has_many :relations_from, :class_name => 'IssueRelation', :foreign_key => 'issue_from_id', :dependent => :delete_all + has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all + + acts_as_attachable :after_add => :attachment_added, :after_remove => :attachment_removed + acts_as_customizable + acts_as_watchable + acts_as_searchable :columns => ['subject', "#{table_name}.description"], + :preload => [:project, :status, :tracker], + :scope => lambda {|options| options[:open_issues] ? self.open : self.all} + + acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"}, + :url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}}, + :type => Proc.new {|o| 'issue' + (o.closed? ? '-closed' : '') } + + acts_as_activity_provider :scope => preload(:project, :author, :tracker, :status), + :author_key => :author_id + + DONE_RATIO_OPTIONS = %w(issue_field issue_status) + + attr_accessor :deleted_attachment_ids + attr_reader :current_journal + delegate :notes, :notes=, :private_notes, :private_notes=, :to => :current_journal, :allow_nil => true + + validates_presence_of :subject, :project, :tracker + validates_presence_of :priority, :if => Proc.new {|issue| issue.new_record? || issue.priority_id_changed?} + validates_presence_of :status, :if => Proc.new {|issue| issue.new_record? || issue.status_id_changed?} + validates_presence_of :author, :if => Proc.new {|issue| issue.new_record? || issue.author_id_changed?} + + validates_length_of :subject, :maximum => 255 + validates_inclusion_of :done_ratio, :in => 0..100 + validates :estimated_hours, :numericality => {:greater_than_or_equal_to => 0, :allow_nil => true, :message => :invalid} + validates :start_date, :date => true + validates :due_date, :date => true + validate :validate_issue, :validate_required_fields, :validate_permissions + attr_protected :id + + scope :visible, lambda {|*args| + joins(:project). + where(Issue.visible_condition(args.shift || User.current, *args)) + } + + scope :open, lambda {|*args| + is_closed = args.size > 0 ? !args.first : false + joins(:status). + where(:issue_statuses => {:is_closed => is_closed}) + } + + scope :recently_updated, lambda { order(:updated_on => :desc) } + scope :on_active_project, lambda { + joins(:project). + where(:projects => {:status => Project::STATUS_ACTIVE}) + } + scope :fixed_version, lambda {|versions| + ids = [versions].flatten.compact.map {|v| v.is_a?(Version) ? v.id : v} + ids.any? ? where(:fixed_version_id => ids) : none + } + scope :assigned_to, lambda {|arg| + arg = Array(arg).uniq + ids = arg.map {|p| p.is_a?(Principal) ? p.id : p} + ids += arg.select {|p| p.is_a?(User)}.map(&:group_ids).flatten.uniq + ids.compact! + ids.any? ? where(:assigned_to_id => ids) : none + } + scope :like, lambda {|q| + q = q.to_s + if q.present? + where("LOWER(#{table_name}.subject) LIKE LOWER(?)", "%#{q}%") + end + } + + before_validation :default_assign, on: :create + before_validation :clear_disabled_fields + before_save :close_duplicates, :update_done_ratio_from_issue_status, + :force_updated_on_change, :update_closed_on, :set_assigned_to_was + after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?} + after_save :reschedule_following_issues, :update_nested_set_attributes, + :update_parent_attributes, :delete_selected_attachments, :create_journal + # Should be after_create but would be called before previous after_save callbacks + after_save :after_create_from_copy + after_destroy :update_parent_attributes + after_create :send_notification + + # Returns a SQL conditions string used to find all issues visible by the specified user + def self.visible_condition(user, options={}) + Project.allowed_to_condition(user, :view_issues, options) do |role, user| + sql = if user.id && user.logged? + case role.issues_visibility + when 'all' + '1=1' + when 'default' + user_ids = [user.id] + user.groups.map(&:id).compact + "(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + when 'own' + user_ids = [user.id] + user.groups.map(&:id).compact + "(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + else + '1=0' + end + else + "(#{table_name}.is_private = #{connection.quoted_false})" + end + unless role.permissions_all_trackers?(:view_issues) + tracker_ids = role.permissions_tracker_ids(:view_issues) + if tracker_ids.any? + sql = "(#{sql} AND #{table_name}.tracker_id IN (#{tracker_ids.join(',')}))" + else + sql = '1=0' + end + end + sql + end + end + + # Returns true if usr or current user is allowed to view the issue + def visible?(usr=nil) + (usr || User.current).allowed_to?(:view_issues, self.project) do |role, user| + visible = if user.logged? + case role.issues_visibility + when 'all' + true + when 'default' + !self.is_private? || (self.author == user || user.is_or_belongs_to?(assigned_to)) + when 'own' + self.author == user || user.is_or_belongs_to?(assigned_to) + else + false + end + else + !self.is_private? + end + unless role.permissions_all_trackers?(:view_issues) + visible &&= role.permissions_tracker_ids?(:view_issues, tracker_id) + end + visible + end + end + + # Returns true if user or current user is allowed to edit or add notes to the issue + def editable?(user=User.current) + attributes_editable?(user) || notes_addable?(user) + end + + # Returns true if user or current user is allowed to edit the issue + def attributes_editable?(user=User.current) + user_tracker_permission?(user, :edit_issues) + end + + # Overrides Redmine::Acts::Attachable::InstanceMethods#attachments_editable? + def attachments_editable?(user=User.current) + attributes_editable?(user) + end + + # Returns true if user or current user is allowed to add notes to the issue + def notes_addable?(user=User.current) + user_tracker_permission?(user, :add_issue_notes) + end + + # Returns true if user or current user is allowed to delete the issue + def deletable?(user=User.current) + user_tracker_permission?(user, :delete_issues) + end + + def initialize(attributes=nil, *args) + super + if new_record? + # set default values for new records only + self.priority ||= IssuePriority.default + self.watcher_user_ids = [] + end + end + + def create_or_update + super + ensure + @status_was = nil + end + private :create_or_update + + # AR#Persistence#destroy would raise and RecordNotFound exception + # if the issue was already deleted or updated (non matching lock_version). + # This is a problem when bulk deleting issues or deleting a project + # (because an issue may already be deleted if its parent was deleted + # first). + # The issue is reloaded by the nested_set before being deleted so + # the lock_version condition should not be an issue but we handle it. + def destroy + super + rescue ActiveRecord::StaleObjectError, ActiveRecord::RecordNotFound + # Stale or already deleted + begin + reload + rescue ActiveRecord::RecordNotFound + # The issue was actually already deleted + @destroyed = true + return freeze + end + # The issue was stale, retry to destroy + super + end + + alias :base_reload :reload + def reload(*args) + @workflow_rule_by_attribute = nil + @assignable_versions = nil + @relations = nil + @spent_hours = nil + @total_spent_hours = nil + @total_estimated_hours = nil + @last_updated_by = nil + @last_notes = nil + base_reload(*args) + end + + # Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields + def available_custom_fields + (project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields) : [] + end + + def visible_custom_field_values(user=nil) + user_real = user || User.current + custom_field_values.select do |value| + value.custom_field.visible_by?(project, user_real) + end + end + + # Copies attributes from another issue, arg can be an id or an Issue + def copy_from(arg, options={}) + issue = arg.is_a?(Issue) ? arg : Issue.visible.find(arg) + self.attributes = issue.attributes.dup.except("id", "root_id", "parent_id", "lft", "rgt", "created_on", "updated_on", "status_id", "closed_on") + self.custom_field_values = issue.custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h} + if options[:keep_status] + self.status = issue.status + end + self.author = User.current + unless options[:attachments] == false + self.attachments = issue.attachments.map do |attachement| + attachement.copy(:container => self) + end + end + unless options[:watchers] == false + self.watcher_user_ids = + issue.watcher_users.select{|u| u.status == User::STATUS_ACTIVE}.map(&:id) + end + @copied_from = issue + @copy_options = options + self + end + + # Returns an unsaved copy of the issue + def copy(attributes=nil, copy_options={}) + copy = self.class.new.copy_from(self, copy_options) + copy.attributes = attributes if attributes + copy + end + + # Returns true if the issue is a copy + def copy? + @copied_from.present? + end + + def status_id=(status_id) + if status_id.to_s != self.status_id.to_s + self.status = (status_id.present? ? IssueStatus.find_by_id(status_id) : nil) + end + self.status_id + end + + # Sets the status. + def status=(status) + if status != self.status + @workflow_rule_by_attribute = nil + end + association(:status).writer(status) + end + + def priority_id=(pid) + self.priority = nil + write_attribute(:priority_id, pid) + end + + def category_id=(cid) + self.category = nil + write_attribute(:category_id, cid) + end + + def fixed_version_id=(vid) + self.fixed_version = nil + write_attribute(:fixed_version_id, vid) + end + + def tracker_id=(tracker_id) + if tracker_id.to_s != self.tracker_id.to_s + self.tracker = (tracker_id.present? ? Tracker.find_by_id(tracker_id) : nil) + end + self.tracker_id + end + + # Sets the tracker. + # This will set the status to the default status of the new tracker if: + # * the status was the default for the previous tracker + # * or if the status was not part of the new tracker statuses + # * or the status was nil + def tracker=(tracker) + tracker_was = self.tracker + association(:tracker).writer(tracker) + if tracker != tracker_was + if status == tracker_was.try(:default_status) + self.status = nil + elsif status && tracker && !tracker.issue_status_ids.include?(status.id) + self.status = nil + end + reassign_custom_field_values + @workflow_rule_by_attribute = nil + end + self.status ||= default_status + self.tracker + end + + def project_id=(project_id) + if project_id.to_s != self.project_id.to_s + self.project = (project_id.present? ? Project.find_by_id(project_id) : nil) + end + self.project_id + end + + # Sets the project. + # Unless keep_tracker argument is set to true, this will change the tracker + # to the first tracker of the new project if the previous tracker is not part + # of the new project trackers. + # This will: + # * clear the fixed_version is it's no longer valid for the new project. + # * clear the parent issue if it's no longer valid for the new project. + # * set the category to the category with the same name in the new + # project if it exists, or clear it if it doesn't. + # * for new issue, set the fixed_version to the project default version + # if it's a valid fixed_version. + def project=(project, keep_tracker=false) + project_was = self.project + association(:project).writer(project) + if project != project_was + @safe_attribute_names = nil + end + if project_was && project && project_was != project + @assignable_versions = nil + + unless keep_tracker || project.trackers.include?(tracker) + self.tracker = project.trackers.first + end + # Reassign to the category with same name if any + if category + self.category = project.issue_categories.find_by_name(category.name) + end + # Clear the assignee if not available in the new project for new issues (eg. copy) + # For existing issue, the previous assignee is still valid, so we keep it + if new_record? && assigned_to && !assignable_users.include?(assigned_to) + self.assigned_to_id = nil + end + # Keep the fixed_version if it's still valid in the new_project + if fixed_version && fixed_version.project != project && !project.shared_versions.include?(fixed_version) + self.fixed_version = nil + end + # Clear the parent task if it's no longer valid + unless valid_parent_project? + self.parent_issue_id = nil + end + reassign_custom_field_values + @workflow_rule_by_attribute = nil + end + # Set fixed_version to the project default version if it's valid + if new_record? && fixed_version.nil? && project && project.default_version_id? + if project.shared_versions.open.exists?(project.default_version_id) + self.fixed_version_id = project.default_version_id + end + end + self.project + end + + def description=(arg) + if arg.is_a?(String) + arg = arg.gsub(/(\r\n|\n|\r)/, "\r\n") + end + write_attribute(:description, arg) + end + + def deleted_attachment_ids + Array(@deleted_attachment_ids).map(&:to_i) + end + + # Overrides assign_attributes so that project and tracker get assigned first + def assign_attributes(new_attributes, *args) + return if new_attributes.nil? + attrs = new_attributes.dup + attrs.stringify_keys! + + %w(project project_id tracker tracker_id).each do |attr| + if attrs.has_key?(attr) + send "#{attr}=", attrs.delete(attr) + end + end + super attrs, *args + end + + def attributes=(new_attributes) + assign_attributes new_attributes + end + + def estimated_hours=(h) + write_attribute :estimated_hours, (h.is_a?(String) ? (h.to_hours || h) : h) + end + + safe_attributes 'project_id', + 'tracker_id', + 'status_id', + 'category_id', + 'assigned_to_id', + 'priority_id', + 'fixed_version_id', + 'subject', + 'description', + 'start_date', + 'due_date', + 'done_ratio', + 'estimated_hours', + 'custom_field_values', + 'custom_fields', + 'lock_version', + 'notes', + :if => lambda {|issue, user| issue.new_record? || issue.attributes_editable?(user) } + + safe_attributes 'notes', + :if => lambda {|issue, user| issue.notes_addable?(user)} + + safe_attributes 'private_notes', + :if => lambda {|issue, user| !issue.new_record? && user.allowed_to?(:set_notes_private, issue.project)} + + safe_attributes 'watcher_user_ids', + :if => lambda {|issue, user| issue.new_record? && user.allowed_to?(:add_issue_watchers, issue.project)} + + safe_attributes 'is_private', + :if => lambda {|issue, user| + user.allowed_to?(:set_issues_private, issue.project) || + (issue.author_id == user.id && user.allowed_to?(:set_own_issues_private, issue.project)) + } + + safe_attributes 'parent_issue_id', + :if => lambda {|issue, user| (issue.new_record? || issue.attributes_editable?(user)) && + user.allowed_to?(:manage_subtasks, issue.project)} + + safe_attributes 'deleted_attachment_ids', + :if => lambda {|issue, user| issue.attachments_deletable?(user)} + + def safe_attribute_names(user=nil) + names = super + names -= disabled_core_fields + names -= read_only_attribute_names(user) + if new_record? + # Make sure that project_id can always be set for new issues + names |= %w(project_id) + end + if dates_derived? + names -= %w(start_date due_date) + end + if priority_derived? + names -= %w(priority_id) + end + if done_ratio_derived? + names -= %w(done_ratio) + end + names + end + + # Safely sets attributes + # Should be called from controllers instead of #attributes= + # attr_accessible is too rough because we still want things like + # Issue.new(:project => foo) to work + def safe_attributes=(attrs, user=User.current) + @attributes_set_by = user + return unless attrs.is_a?(Hash) + + attrs = attrs.deep_dup + + # Project and Tracker must be set before since new_statuses_allowed_to depends on it. + if (p = attrs.delete('project_id')) && safe_attribute?('project_id') + if p.is_a?(String) && !p.match(/^\d*$/) + p_id = Project.find_by_identifier(p).try(:id) + else + p_id = p.to_i + end + if allowed_target_projects(user).where(:id => p_id).exists? + self.project_id = p_id + end + + if project_id_changed? && attrs['category_id'].to_s == category_id_was.to_s + # Discard submitted category on previous project + attrs.delete('category_id') + end + end + + if (t = attrs.delete('tracker_id')) && safe_attribute?('tracker_id') + if allowed_target_trackers(user).where(:id => t.to_i).exists? + self.tracker_id = t + end + end + if project && tracker.nil? + # Set a default tracker to accept custom field values + # even if tracker is not specified + allowed_trackers = allowed_target_trackers(user) + + if attrs['parent_issue_id'].present? + # If parent_issue_id is present, the first tracker for which this field + # is not disabled is chosen as default + self.tracker = allowed_trackers.detect {|t| t.core_fields.include?('parent_issue_id')} + end + self.tracker ||= allowed_trackers.first + end + + statuses_allowed = new_statuses_allowed_to(user) + if (s = attrs.delete('status_id')) && safe_attribute?('status_id') + if statuses_allowed.collect(&:id).include?(s.to_i) + self.status_id = s + end + end + if new_record? && !statuses_allowed.include?(status) + self.status = statuses_allowed.first || default_status + end + if (u = attrs.delete('assigned_to_id')) && safe_attribute?('assigned_to_id') + self.assigned_to_id = u + end + + + attrs = delete_unsafe_attributes(attrs, user) + return if attrs.empty? + + if attrs['parent_issue_id'].present? + s = attrs['parent_issue_id'].to_s + unless (m = s.match(%r{\A#?(\d+)\z})) && (m[1] == parent_id.to_s || Issue.visible(user).exists?(m[1])) + @invalid_parent_issue_id = attrs.delete('parent_issue_id') + end + end + + if attrs['custom_field_values'].present? + editable_custom_field_ids = editable_custom_field_values(user).map {|v| v.custom_field_id.to_s} + attrs['custom_field_values'].select! {|k, v| editable_custom_field_ids.include?(k.to_s)} + end + + if attrs['custom_fields'].present? + editable_custom_field_ids = editable_custom_field_values(user).map {|v| v.custom_field_id.to_s} + attrs['custom_fields'].select! {|c| editable_custom_field_ids.include?(c['id'].to_s)} + end + + # mass-assignment security bypass + assign_attributes attrs, :without_protection => true + end + + def disabled_core_fields + tracker ? tracker.disabled_core_fields : [] + end + + # Returns the custom_field_values that can be edited by the given user + def editable_custom_field_values(user=nil) + read_only = read_only_attribute_names(user) + visible_custom_field_values(user).reject do |value| + read_only.include?(value.custom_field_id.to_s) + end + end + + # Returns the custom fields that can be edited by the given user + def editable_custom_fields(user=nil) + editable_custom_field_values(user).map(&:custom_field).uniq + end + + # Returns the names of attributes that are read-only for user or the current user + # For users with multiple roles, the read-only fields are the intersection of + # read-only fields of each role + # The result is an array of strings where sustom fields are represented with their ids + # + # Examples: + # issue.read_only_attribute_names # => ['due_date', '2'] + # issue.read_only_attribute_names(user) # => [] + def read_only_attribute_names(user=nil) + workflow_rule_by_attribute(user).reject {|attr, rule| rule != 'readonly'}.keys + end + + # Returns the names of required attributes for user or the current user + # For users with multiple roles, the required fields are the intersection of + # required fields of each role + # The result is an array of strings where sustom fields are represented with their ids + # + # Examples: + # issue.required_attribute_names # => ['due_date', '2'] + # issue.required_attribute_names(user) # => [] + def required_attribute_names(user=nil) + workflow_rule_by_attribute(user).reject {|attr, rule| rule != 'required'}.keys + end + + # Returns true if the attribute is required for user + def required_attribute?(name, user=nil) + required_attribute_names(user).include?(name.to_s) + end + + # Returns a hash of the workflow rule by attribute for the given user + # + # Examples: + # issue.workflow_rule_by_attribute # => {'due_date' => 'required', 'start_date' => 'readonly'} + def workflow_rule_by_attribute(user=nil) + return @workflow_rule_by_attribute if @workflow_rule_by_attribute && user.nil? + + user_real = user || User.current + roles = user_real.admin ? Role.all.to_a : user_real.roles_for_project(project) + roles = roles.select(&:consider_workflow?) + return {} if roles.empty? + + result = {} + workflow_permissions = WorkflowPermission.where(:tracker_id => tracker_id, :old_status_id => status_id, :role_id => roles.map(&:id)).to_a + if workflow_permissions.any? + workflow_rules = workflow_permissions.inject({}) do |h, wp| + h[wp.field_name] ||= {} + h[wp.field_name][wp.role_id] = wp.rule + h + end + fields_with_roles = {} + IssueCustomField.where(:visible => false).joins(:roles).pluck(:id, "role_id").each do |field_id, role_id| + fields_with_roles[field_id] ||= [] + fields_with_roles[field_id] << role_id + end + roles.each do |role| + fields_with_roles.each do |field_id, role_ids| + unless role_ids.include?(role.id) + field_name = field_id.to_s + workflow_rules[field_name] ||= {} + workflow_rules[field_name][role.id] = 'readonly' + end + end + end + workflow_rules.each do |attr, rules| + next if rules.size < roles.size + uniq_rules = rules.values.uniq + if uniq_rules.size == 1 + result[attr] = uniq_rules.first + else + result[attr] = 'required' + end + end + end + @workflow_rule_by_attribute = result if user.nil? + result + end + private :workflow_rule_by_attribute + + def done_ratio + if Issue.use_status_for_done_ratio? && status && status.default_done_ratio + status.default_done_ratio + else + read_attribute(:done_ratio) + end + end + + def self.use_status_for_done_ratio? + Setting.issue_done_ratio == 'issue_status' + end + + def self.use_field_for_done_ratio? + Setting.issue_done_ratio == 'issue_field' + end + + def validate_issue + if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date + errors.add :due_date, :greater_than_start_date + end + + if start_date && start_date_changed? && soonest_start && start_date < soonest_start + errors.add :start_date, :earlier_than_minimum_start_date, :date => format_date(soonest_start) + end + + if fixed_version + if !assignable_versions.include?(fixed_version) + errors.add :fixed_version_id, :inclusion + elsif reopening? && fixed_version.closed? + errors.add :base, I18n.t(:error_can_not_reopen_issue_on_closed_version) + end + end + + # Checks that the issue can not be added/moved to a disabled tracker + if project && (tracker_id_changed? || project_id_changed?) + if tracker && !project.trackers.include?(tracker) + errors.add :tracker_id, :inclusion + end + end + + if assigned_to_id_changed? && assigned_to_id.present? + unless assignable_users.include?(assigned_to) + errors.add :assigned_to_id, :invalid + end + end + + # Checks parent issue assignment + if @invalid_parent_issue_id.present? + errors.add :parent_issue_id, :invalid + elsif @parent_issue + if !valid_parent_project?(@parent_issue) + errors.add :parent_issue_id, :invalid + elsif (@parent_issue != parent) && ( + self.would_reschedule?(@parent_issue) || + @parent_issue.self_and_ancestors.any? {|a| a.relations_from.any? {|r| r.relation_type == IssueRelation::TYPE_PRECEDES && r.issue_to.would_reschedule?(self)}} + ) + errors.add :parent_issue_id, :invalid + elsif !closed? && @parent_issue.closed? + # cannot attach an open issue to a closed parent + errors.add :base, :open_issue_with_closed_parent + elsif !new_record? + # moving an existing issue + if move_possible?(@parent_issue) + # move accepted + else + errors.add :parent_issue_id, :invalid + end + end + end + end + + # Validates the issue against additional workflow requirements + def validate_required_fields + user = new_record? ? author : current_journal.try(:user) + + required_attribute_names(user).each do |attribute| + if attribute =~ /^\d+$/ + attribute = attribute.to_i + v = custom_field_values.detect {|v| v.custom_field_id == attribute } + if v && Array(v.value).detect(&:present?).nil? + errors.add :base, v.custom_field.name + ' ' + l('activerecord.errors.messages.blank') + end + else + if respond_to?(attribute) && send(attribute).blank? && !disabled_core_fields.include?(attribute) + next if attribute == 'category_id' && project.try(:issue_categories).blank? + next if attribute == 'fixed_version_id' && assignable_versions.blank? + errors.add attribute, :blank + end + end + end + end + + def validate_permissions + if @attributes_set_by && new_record? && copy? + unless allowed_target_trackers(@attributes_set_by).include?(tracker) + errors.add :tracker, :invalid + end + end + end + + # Overrides Redmine::Acts::Customizable::InstanceMethods#validate_custom_field_values + # so that custom values that are not editable are not validated (eg. a custom field that + # is marked as required should not trigger a validation error if the user is not allowed + # to edit this field). + def validate_custom_field_values + user = new_record? ? author : current_journal.try(:user) + if new_record? || custom_field_values_changed? + editable_custom_field_values(user).each(&:validate_value) + end + end + + # Set the done_ratio using the status if that setting is set. This will keep the done_ratios + # even if the user turns off the setting later + def update_done_ratio_from_issue_status + if Issue.use_status_for_done_ratio? && status && status.default_done_ratio + self.done_ratio = status.default_done_ratio + end + end + + def init_journal(user, notes = "") + @current_journal ||= Journal.new(:journalized => self, :user => user, :notes => notes) + end + + # Returns the current journal or nil if it's not initialized + def current_journal + @current_journal + end + + # Clears the current journal + def clear_journal + @current_journal = nil + end + + # Returns the names of attributes that are journalized when updating the issue + def journalized_attribute_names + names = Issue.column_names - %w(id root_id lft rgt lock_version created_on updated_on closed_on) + if tracker + names -= tracker.disabled_core_fields + end + names + end + + # Returns the id of the last journal or nil + def last_journal_id + if new_record? + nil + else + journals.maximum(:id) + end + end + + # Returns a scope for journals that have an id greater than journal_id + def journals_after(journal_id) + scope = journals.reorder("#{Journal.table_name}.id ASC") + if journal_id.present? + scope = scope.where("#{Journal.table_name}.id > ?", journal_id.to_i) + end + scope + end + + # Returns the journals that are visible to user with their index + # Used to display the issue history + def visible_journals_with_index(user=User.current) + result = journals. + preload(:details). + preload(:user => :email_address). + reorder(:created_on, :id).to_a + + result.each_with_index {|j,i| j.indice = i+1} + + unless user.allowed_to?(:view_private_notes, project) + result.select! do |journal| + !journal.private_notes? || journal.user == user + end + end + Journal.preload_journals_details_custom_fields(result) + result.select! {|journal| journal.notes? || journal.visible_details.any?} + result + end + + # Returns the initial status of the issue + # Returns nil for a new issue + def status_was + if status_id_changed? + if status_id_was.to_i > 0 + @status_was ||= IssueStatus.find_by_id(status_id_was) + end + else + @status_was ||= status + end + end + + # Return true if the issue is closed, otherwise false + def closed? + status.present? && status.is_closed? + end + + # Returns true if the issue was closed when loaded + def was_closed? + status_was.present? && status_was.is_closed? + end + + # Return true if the issue is being reopened + def reopening? + if new_record? + false + else + status_id_changed? && !closed? && was_closed? + end + end + alias :reopened? :reopening? + + # Return true if the issue is being closed + def closing? + if new_record? + closed? + else + status_id_changed? && closed? && !was_closed? + end + end + + # Returns true if the issue is overdue + def overdue? + due_date.present? && (due_date < User.current.today) && !closed? + end + + # Is the amount of work done less than it should for the due date + def behind_schedule? + return false if start_date.nil? || due_date.nil? + done_date = start_date + ((due_date - start_date + 1) * done_ratio / 100).floor + return done_date <= User.current.today + end + + # Does this issue have children? + def children? + !leaf? + end + + # Users the issue can be assigned to + def assignable_users + users = project.assignable_users(tracker).to_a + users << author if author && author.active? + if assigned_to_id_was.present? && assignee = Principal.find_by_id(assigned_to_id_was) + users << assignee + end + users.uniq.sort + end + + # Versions that the issue can be assigned to + def assignable_versions + return @assignable_versions if @assignable_versions + + versions = project.shared_versions.open.to_a + if fixed_version + if fixed_version_id_changed? + # nothing to do + elsif project_id_changed? + if project.shared_versions.include?(fixed_version) + versions << fixed_version + end + else + versions << fixed_version + end + end + @assignable_versions = versions.uniq.sort + end + + # Returns true if this issue is blocked by another issue that is still open + def blocked? + !relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil? + end + + # Returns the default status of the issue based on its tracker + # Returns nil if tracker is nil + def default_status + tracker.try(:default_status) + end + + # Returns an array of statuses that user is able to apply + def new_statuses_allowed_to(user=User.current, include_default=false) + initial_status = nil + if new_record? + # nop + elsif tracker_id_changed? + if Tracker.where(:id => tracker_id_was, :default_status_id => status_id_was).any? + initial_status = default_status + elsif tracker.issue_status_ids.include?(status_id_was) + initial_status = IssueStatus.find_by_id(status_id_was) + else + initial_status = default_status + end + else + initial_status = status_was + end + + initial_assigned_to_id = assigned_to_id_changed? ? assigned_to_id_was : assigned_to_id + assignee_transitions_allowed = initial_assigned_to_id.present? && + (user.id == initial_assigned_to_id || user.group_ids.include?(initial_assigned_to_id)) + + statuses = [] + statuses += IssueStatus.new_statuses_allowed( + initial_status, + user.admin ? Role.all.to_a : user.roles_for_project(project), + tracker, + author == user, + assignee_transitions_allowed + ) + statuses << initial_status unless statuses.empty? + statuses << default_status if include_default || (new_record? && statuses.empty?) + + statuses = statuses.compact.uniq.sort + if blocked? || descendants.open.any? + # cannot close a blocked issue or a parent with open subtasks + statuses.reject!(&:is_closed?) + end + if ancestors.open(false).any? + # cannot reopen a subtask of a closed parent + statuses.select!(&:is_closed?) + end + statuses + end + + # Returns the previous assignee (user or group) if changed + def assigned_to_was + # assigned_to_id_was is reset before after_save callbacks + user_id = @previous_assigned_to_id || assigned_to_id_was + if user_id && user_id != assigned_to_id + @assigned_to_was ||= Principal.find_by_id(user_id) + end + end + + # Returns the original tracker + def tracker_was + Tracker.find_by_id(tracker_id_was) + end + + # Returns the users that should be notified + def notified_users + notified = [] + # Author and assignee are always notified unless they have been + # locked or don't want to be notified + notified << author if author + if assigned_to + notified += (assigned_to.is_a?(Group) ? assigned_to.users : [assigned_to]) + end + if assigned_to_was + notified += (assigned_to_was.is_a?(Group) ? assigned_to_was.users : [assigned_to_was]) + end + notified = notified.select {|u| u.active? && u.notify_about?(self)} + + notified += project.notified_users + notified.uniq! + # Remove users that can not view the issue + notified.reject! {|user| !visible?(user)} + notified + end + + # Returns the email addresses that should be notified + def recipients + notified_users.collect(&:mail) + end + + def each_notification(users, &block) + if users.any? + if custom_field_values.detect {|value| !value.custom_field.visible?} + users_by_custom_field_visibility = users.group_by do |user| + visible_custom_field_values(user).map(&:custom_field_id).sort + end + users_by_custom_field_visibility.values.each do |users| + yield(users) + end + else + yield(users) + end + end + end + + def notify? + @notify != false + end + + def notify=(arg) + @notify = arg + end + + # Returns the number of hours spent on this issue + def spent_hours + @spent_hours ||= time_entries.sum(:hours) || 0.0 + end + + # Returns the total number of hours spent on this issue and its descendants + def total_spent_hours + @total_spent_hours ||= if leaf? + spent_hours + else + self_and_descendants.joins(:time_entries).sum("#{TimeEntry.table_name}.hours").to_f || 0.0 + end + end + + def total_estimated_hours + if leaf? + estimated_hours + else + @total_estimated_hours ||= self_and_descendants.visible.sum(:estimated_hours) + end + end + + def relations + @relations ||= IssueRelation::Relations.new(self, (relations_from + relations_to).sort) + end + + def last_updated_by + if @last_updated_by + @last_updated_by.presence + else + journals.reorder(:id => :desc).first.try(:user) + end + end + + def last_notes + if @last_notes + @last_notes + else + journals.where.not(notes: '').reorder(:id => :desc).first.try(:notes) + end + end + + # Preloads relations for a collection of issues + def self.load_relations(issues) + if issues.any? + relations = IssueRelation.where("issue_from_id IN (:ids) OR issue_to_id IN (:ids)", :ids => issues.map(&:id)).all + issues.each do |issue| + issue.instance_variable_set "@relations", relations.select {|r| r.issue_from_id == issue.id || r.issue_to_id == issue.id} + end + end + end + + # Preloads visible spent time for a collection of issues + def self.load_visible_spent_hours(issues, user=User.current) + if issues.any? + hours_by_issue_id = TimeEntry.visible(user).where(:issue_id => issues.map(&:id)).group(:issue_id).sum(:hours) + issues.each do |issue| + issue.instance_variable_set "@spent_hours", (hours_by_issue_id[issue.id] || 0.0) + end + end + end + + # Preloads visible total spent time for a collection of issues + def self.load_visible_total_spent_hours(issues, user=User.current) + if issues.any? + hours_by_issue_id = TimeEntry.visible(user).joins(:issue). + joins("JOIN #{Issue.table_name} parent ON parent.root_id = #{Issue.table_name}.root_id" + + " AND parent.lft <= #{Issue.table_name}.lft AND parent.rgt >= #{Issue.table_name}.rgt"). + where("parent.id IN (?)", issues.map(&:id)).group("parent.id").sum(:hours) + issues.each do |issue| + issue.instance_variable_set "@total_spent_hours", (hours_by_issue_id[issue.id] || 0.0) + end + end + end + + # Preloads visible relations for a collection of issues + def self.load_visible_relations(issues, user=User.current) + if issues.any? + issue_ids = issues.map(&:id) + # Relations with issue_from in given issues and visible issue_to + relations_from = IssueRelation.joins(:issue_to => :project). + where(visible_condition(user)).where(:issue_from_id => issue_ids).to_a + # Relations with issue_to in given issues and visible issue_from + relations_to = IssueRelation.joins(:issue_from => :project). + where(visible_condition(user)). + where(:issue_to_id => issue_ids).to_a + issues.each do |issue| + relations = + relations_from.select {|relation| relation.issue_from_id == issue.id} + + relations_to.select {|relation| relation.issue_to_id == issue.id} + + issue.instance_variable_set "@relations", IssueRelation::Relations.new(issue, relations.sort) + end + end + end + + # Returns a scope of the given issues and their descendants + def self.self_and_descendants(issues) + Issue.joins("JOIN #{Issue.table_name} ancestors" + + " ON ancestors.root_id = #{Issue.table_name}.root_id" + + " AND ancestors.lft <= #{Issue.table_name}.lft AND ancestors.rgt >= #{Issue.table_name}.rgt" + ). + where(:ancestors => {:id => issues.map(&:id)}) + end + + # Preloads users who updated last a collection of issues + def self.load_visible_last_updated_by(issues, user=User.current) + if issues.any? + issue_ids = issues.map(&:id) + journal_ids = Journal.joins(issue: :project). + where(:journalized_type => 'Issue', :journalized_id => issue_ids). + where(Journal.visible_notes_condition(user, :skip_pre_condition => true)). + group(:journalized_id). + maximum(:id). + values + journals = Journal.where(:id => journal_ids).preload(:user).to_a + + issues.each do |issue| + journal = journals.detect {|j| j.journalized_id == issue.id} + issue.instance_variable_set("@last_updated_by", journal.try(:user) || '') + end + end + end + + # Preloads visible last notes for a collection of issues + def self.load_visible_last_notes(issues, user=User.current) + if issues.any? + issue_ids = issues.map(&:id) + journal_ids = Journal.joins(issue: :project). + where(:journalized_type => 'Issue', :journalized_id => issue_ids). + where(Journal.visible_notes_condition(user, :skip_pre_condition => true)). + where.not(notes: ''). + group(:journalized_id). + maximum(:id). + values + journals = Journal.where(:id => journal_ids).to_a + + issues.each do |issue| + journal = journals.detect {|j| j.journalized_id == issue.id} + issue.instance_variable_set("@last_notes", journal.try(:notes) || '') + end + end + end + + # Finds an issue relation given its id. + def find_relation(relation_id) + IssueRelation.where("issue_to_id = ? OR issue_from_id = ?", id, id).find(relation_id) + end + + # Returns true if this issue blocks the other issue, otherwise returns false + def blocks?(other) + all = [self] + last = [self] + while last.any? + current = last.map {|i| i.relations_from.where(:relation_type => IssueRelation::TYPE_BLOCKS).map(&:issue_to)}.flatten.uniq + current -= last + current -= all + return true if current.include?(other) + last = current + all += last + end + false + end + + # Returns true if the other issue might be rescheduled if the start/due dates of this issue change + def would_reschedule?(other) + all = [self] + last = [self] + while last.any? + current = last.map {|i| + i.relations_from.where(:relation_type => IssueRelation::TYPE_PRECEDES).map(&:issue_to) + + i.leaves.to_a + + i.ancestors.map {|a| a.relations_from.where(:relation_type => IssueRelation::TYPE_PRECEDES).map(&:issue_to)} + }.flatten.uniq + current -= last + current -= all + return true if current.include?(other) + last = current + all += last + end + false + end + + # Returns an array of issues that duplicate this one + def duplicates + relations_to.select {|r| r.relation_type == IssueRelation::TYPE_DUPLICATES}.collect {|r| r.issue_from} + end + + # Returns the due date or the target due date if any + # Used on gantt chart + def due_before + due_date || (fixed_version ? fixed_version.effective_date : nil) + end + + # Returns the time scheduled for this issue. + # + # Example: + # Start Date: 2/26/09, End Date: 3/04/09 + # duration => 6 + def duration + (start_date && due_date) ? due_date - start_date : 0 + end + + # Returns the duration in working days + def working_duration + (start_date && due_date) ? working_days(start_date, due_date) : 0 + end + + def soonest_start(reload=false) + if @soonest_start.nil? || reload + relations_to.reload if reload + dates = relations_to.collect{|relation| relation.successor_soonest_start} + p = @parent_issue || parent + if p && Setting.parent_issue_dates == 'derived' + dates << p.soonest_start + end + @soonest_start = dates.compact.max + end + @soonest_start + end + + # Sets start_date on the given date or the next working day + # and changes due_date to keep the same working duration. + def reschedule_on(date) + wd = working_duration + date = next_working_date(date) + self.start_date = date + self.due_date = add_working_days(date, wd) + end + + # Reschedules the issue on the given date or the next working day and saves the record. + # If the issue is a parent task, this is done by rescheduling its subtasks. + def reschedule_on!(date, journal=nil) + return if date.nil? + if leaf? || !dates_derived? + if start_date.nil? || start_date != date + if start_date && start_date > date + # Issue can not be moved earlier than its soonest start date + date = [soonest_start(true), date].compact.max + end + if journal + init_journal(journal.user) + end + reschedule_on(date) + begin + save + rescue ActiveRecord::StaleObjectError + reload + reschedule_on(date) + save + end + end + else + leaves.each do |leaf| + if leaf.start_date + # Only move subtask if it starts at the same date as the parent + # or if it starts before the given date + if start_date == leaf.start_date || date > leaf.start_date + leaf.reschedule_on!(date) + end + else + leaf.reschedule_on!(date) + end + end + end + end + + def dates_derived? + !leaf? && Setting.parent_issue_dates == 'derived' + end + + def priority_derived? + !leaf? && Setting.parent_issue_priority == 'derived' + end + + def done_ratio_derived? + !leaf? && Setting.parent_issue_done_ratio == 'derived' + end + + def <=>(issue) + if issue.nil? + -1 + elsif root_id != issue.root_id + (root_id || 0) <=> (issue.root_id || 0) + else + (lft || 0) <=> (issue.lft || 0) + end + end + + def to_s + "#{tracker} ##{id}: #{subject}" + end + + # Returns a string of css classes that apply to the issue + def css_classes(user=User.current) + s = "issue tracker-#{tracker_id} status-#{status_id} #{priority.try(:css_classes)}" + s << ' closed' if closed? + s << ' overdue' if overdue? + s << ' child' if child? + s << ' parent' unless leaf? + s << ' private' if is_private? + if user.logged? + s << ' created-by-me' if author_id == user.id + s << ' assigned-to-me' if assigned_to_id == user.id + s << ' assigned-to-my-group' if user.groups.any? {|g| g.id == assigned_to_id} + end + s + end + + # Unassigns issues from +version+ if it's no longer shared with issue's project + def self.update_versions_from_sharing_change(version) + # Update issues assigned to the version + update_versions(["#{Issue.table_name}.fixed_version_id = ?", version.id]) + end + + # Unassigns issues from versions that are no longer shared + # after +project+ was moved + def self.update_versions_from_hierarchy_change(project) + moved_project_ids = project.self_and_descendants.reload.collect(&:id) + # Update issues of the moved projects and issues assigned to a version of a moved project + Issue.update_versions( + ["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)", + moved_project_ids, moved_project_ids] + ) + end + + def parent_issue_id=(arg) + s = arg.to_s.strip.presence + if s && (m = s.match(%r{\A#?(\d+)\z})) && (@parent_issue = Issue.find_by_id(m[1])) + @invalid_parent_issue_id = nil + elsif s.blank? + @parent_issue = nil + @invalid_parent_issue_id = nil + else + @parent_issue = nil + @invalid_parent_issue_id = arg + end + end + + def parent_issue_id + if @invalid_parent_issue_id + @invalid_parent_issue_id + elsif instance_variable_defined? :@parent_issue + @parent_issue.nil? ? nil : @parent_issue.id + else + parent_id + end + end + + def set_parent_id + self.parent_id = parent_issue_id + end + + # Returns true if issue's project is a valid + # parent issue project + def valid_parent_project?(issue=parent) + return true if issue.nil? || issue.project_id == project_id + + case Setting.cross_project_subtasks + when 'system' + true + when 'tree' + issue.project.root == project.root + when 'hierarchy' + issue.project.is_or_is_ancestor_of?(project) || issue.project.is_descendant_of?(project) + when 'descendants' + issue.project.is_or_is_ancestor_of?(project) + else + false + end + end + + # Returns an issue scope based on project and scope + def self.cross_project_scope(project, scope=nil) + if project.nil? + return Issue + end + case scope + when 'all', 'system' + Issue + when 'tree' + Issue.joins(:project).where("(#{Project.table_name}.lft >= :lft AND #{Project.table_name}.rgt <= :rgt)", + :lft => project.root.lft, :rgt => project.root.rgt) + when 'hierarchy' + Issue.joins(:project).where("(#{Project.table_name}.lft >= :lft AND #{Project.table_name}.rgt <= :rgt) OR (#{Project.table_name}.lft < :lft AND #{Project.table_name}.rgt > :rgt)", + :lft => project.lft, :rgt => project.rgt) + when 'descendants' + Issue.joins(:project).where("(#{Project.table_name}.lft >= :lft AND #{Project.table_name}.rgt <= :rgt)", + :lft => project.lft, :rgt => project.rgt) + else + Issue.where(:project_id => project.id) + end + end + + def self.by_tracker(project) + count_and_group_by(:project => project, :association => :tracker) + end + + def self.by_version(project) + count_and_group_by(:project => project, :association => :fixed_version) + end + + def self.by_priority(project) + count_and_group_by(:project => project, :association => :priority) + end + + def self.by_category(project) + count_and_group_by(:project => project, :association => :category) + end + + def self.by_assigned_to(project) + count_and_group_by(:project => project, :association => :assigned_to) + end + + def self.by_author(project) + count_and_group_by(:project => project, :association => :author) + end + + def self.by_subproject(project) + r = count_and_group_by(:project => project, :with_subprojects => true, :association => :project) + r.reject {|r| r["project_id"] == project.id.to_s} + end + + # Query generator for selecting groups of issue counts for a project + # based on specific criteria + # + # Options + # * project - Project to search in. + # * with_subprojects - Includes subprojects issues if set to true. + # * association - Symbol. Association for grouping. + def self.count_and_group_by(options) + assoc = reflect_on_association(options[:association]) + select_field = assoc.foreign_key + + Issue. + visible(User.current, :project => options[:project], :with_subprojects => options[:with_subprojects]). + joins(:status, assoc.name). + group(:status_id, :is_closed, select_field). + count. + map do |columns, total| + status_id, is_closed, field_value = columns + is_closed = ['t', 'true', '1'].include?(is_closed.to_s) + { + "status_id" => status_id.to_s, + "closed" => is_closed, + select_field => field_value.to_s, + "total" => total.to_s + } + end + end + + # Returns a scope of projects that user can assign the issue to + def allowed_target_projects(user=User.current) + current_project = new_record? ? nil : project + self.class.allowed_target_projects(user, current_project) + end + + # Returns a scope of projects that user can assign issues to + # If current_project is given, it will be included in the scope + def self.allowed_target_projects(user=User.current, current_project=nil) + condition = Project.allowed_to_condition(user, :add_issues) + if current_project + condition = ["(#{condition}) OR #{Project.table_name}.id = ?", current_project.id] + end + Project.where(condition).having_trackers + end + + # Returns a scope of trackers that user can assign the issue to + def allowed_target_trackers(user=User.current) + self.class.allowed_target_trackers(project, user, tracker_id_was) + end + + # Returns a scope of trackers that user can assign project issues to + def self.allowed_target_trackers(project, user=User.current, current_tracker=nil) + if project + scope = project.trackers.sorted + unless user.admin? + roles = user.roles_for_project(project).select {|r| r.has_permission?(:add_issues)} + unless roles.any? {|r| r.permissions_all_trackers?(:add_issues)} + tracker_ids = roles.map {|r| r.permissions_tracker_ids(:add_issues)}.flatten.uniq + if current_tracker + tracker_ids << current_tracker + end + scope = scope.where(:id => tracker_ids) + end + end + scope + else + Tracker.none + end + end + + private + + def user_tracker_permission?(user, permission) + if project && !project.active? + perm = Redmine::AccessControl.permission(permission) + return false unless perm && perm.read? + end + + if user.admin? + true + else + roles = user.roles_for_project(project).select {|r| r.has_permission?(permission)} + roles.any? {|r| r.permissions_all_trackers?(permission) || r.permissions_tracker_ids?(permission, tracker_id)} + end + end + + def after_project_change + # Update project_id on related time entries + TimeEntry.where({:issue_id => id}).update_all(["project_id = ?", project_id]) + + # Delete issue relations + unless Setting.cross_project_issue_relations? + relations_from.clear + relations_to.clear + end + + # Move subtasks that were in the same project + children.each do |child| + next unless child.project_id == project_id_was + # Change project and keep project + child.send :project=, project, true + unless child.save + errors.add :base, l(:error_move_of_child_not_possible, :child => "##{child.id}", :errors => child.errors.full_messages.join(", ")) + raise ActiveRecord::Rollback + end + end + end + + # Callback for after the creation of an issue by copy + # * adds a "copied to" relation with the copied issue + # * copies subtasks from the copied issue + def after_create_from_copy + return unless copy? && !@after_create_from_copy_handled + + if (@copied_from.project_id == project_id || Setting.cross_project_issue_relations?) && @copy_options[:link] != false + if @current_journal + @copied_from.init_journal(@current_journal.user) + end + relation = IssueRelation.new(:issue_from => @copied_from, :issue_to => self, :relation_type => IssueRelation::TYPE_COPIED_TO) + unless relation.save + logger.error "Could not create relation while copying ##{@copied_from.id} to ##{id} due to validation errors: #{relation.errors.full_messages.join(', ')}" if logger + end + end + + unless @copied_from.leaf? || @copy_options[:subtasks] == false + copy_options = (@copy_options || {}).merge(:subtasks => false) + copied_issue_ids = {@copied_from.id => self.id} + @copied_from.reload.descendants.reorder("#{Issue.table_name}.lft").each do |child| + # Do not copy self when copying an issue as a descendant of the copied issue + next if child == self + # Do not copy subtasks of issues that were not copied + next unless copied_issue_ids[child.parent_id] + # Do not copy subtasks that are not visible to avoid potential disclosure of private data + unless child.visible? + logger.error "Subtask ##{child.id} was not copied during ##{@copied_from.id} copy because it is not visible to the current user" if logger + next + end + copy = Issue.new.copy_from(child, copy_options) + if @current_journal + copy.init_journal(@current_journal.user) + end + copy.author = author + copy.project = project + copy.parent_issue_id = copied_issue_ids[child.parent_id] + copy.fixed_version_id = nil unless child.fixed_version.present? && child.fixed_version.status == 'open' + copy.assigned_to = nil unless child.assigned_to_id.present? && child.assigned_to.status == User::STATUS_ACTIVE + unless copy.save + logger.error "Could not copy subtask ##{child.id} while copying ##{@copied_from.id} to ##{id} due to validation errors: #{copy.errors.full_messages.join(', ')}" if logger + next + end + copied_issue_ids[child.id] = copy.id + end + end + @after_create_from_copy_handled = true + end + + def update_nested_set_attributes + if parent_id_changed? + update_nested_set_attributes_on_parent_change + end + remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) + end + + # Updates the nested set for when an existing issue is moved + def update_nested_set_attributes_on_parent_change + former_parent_id = parent_id_was + # delete invalid relations of all descendants + self_and_descendants.each do |issue| + issue.relations.each do |relation| + relation.destroy unless relation.valid? + end + end + # update former parent + recalculate_attributes_for(former_parent_id) if former_parent_id + end + + def update_parent_attributes + if parent_id + recalculate_attributes_for(parent_id) + association(:parent).reset + end + end + + def recalculate_attributes_for(issue_id) + if issue_id && p = Issue.find_by_id(issue_id) + if p.priority_derived? + # priority = highest priority of open children + # priority is left unchanged if all children are closed and there's no default priority defined + if priority_position = p.children.open.joins(:priority).maximum("#{IssuePriority.table_name}.position") + p.priority = IssuePriority.find_by_position(priority_position) + elsif default_priority = IssuePriority.default + p.priority = default_priority + end + end + + if p.dates_derived? + # start/due dates = lowest/highest dates of children + p.start_date = p.children.minimum(:start_date) + p.due_date = p.children.maximum(:due_date) + if p.start_date && p.due_date && p.due_date < p.start_date + p.start_date, p.due_date = p.due_date, p.start_date + end + end + + if p.done_ratio_derived? + # done ratio = average ratio of children weighted with their total estimated hours + unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio + children = p.children.to_a + if children.any? + child_with_total_estimated_hours = children.select {|c| c.total_estimated_hours.to_f > 0.0} + if child_with_total_estimated_hours.any? + average = child_with_total_estimated_hours.map(&:total_estimated_hours).sum.to_f / child_with_total_estimated_hours.count + else + average = 1.0 + end + done = children.map {|c| + estimated = c.total_estimated_hours.to_f + estimated = average unless estimated > 0.0 + ratio = c.closed? ? 100 : (c.done_ratio || 0) + estimated * ratio + }.sum + progress = done / (average * children.count) + p.done_ratio = progress.round + end + end + end + + # ancestors will be recursively updated + p.save(:validate => false) + end + end + + # Update issues so their versions are not pointing to a + # fixed_version that is not shared with the issue's project + def self.update_versions(conditions=nil) + # Only need to update issues with a fixed_version from + # a different project and that is not systemwide shared + Issue.joins(:project, :fixed_version). + where("#{Issue.table_name}.fixed_version_id IS NOT NULL" + + " AND #{Issue.table_name}.project_id <> #{Version.table_name}.project_id" + + " AND #{Version.table_name}.sharing <> 'system'"). + where(conditions).each do |issue| + next if issue.project.nil? || issue.fixed_version.nil? + unless issue.project.shared_versions.include?(issue.fixed_version) + issue.init_journal(User.current) + issue.fixed_version = nil + issue.save + end + end + end + + def delete_selected_attachments + if deleted_attachment_ids.present? + objects = attachments.where(:id => deleted_attachment_ids.map(&:to_i)) + attachments.delete(objects) + end + end + + # Callback on file attachment + def attachment_added(attachment) + if current_journal && !attachment.new_record? + current_journal.journalize_attachment(attachment, :added) + end + end + + # Callback on attachment deletion + def attachment_removed(attachment) + if current_journal && !attachment.new_record? + current_journal.journalize_attachment(attachment, :removed) + current_journal.save + end + end + + # Called after a relation is added + def relation_added(relation) + if current_journal + current_journal.journalize_relation(relation, :added) + current_journal.save + end + end + + # Called after a relation is removed + def relation_removed(relation) + if current_journal + current_journal.journalize_relation(relation, :removed) + current_journal.save + end + end + + # Default assignment based on project or category + def default_assign + if assigned_to.nil? + if category && category.assigned_to + self.assigned_to = category.assigned_to + elsif project && project.default_assigned_to + self.assigned_to = project.default_assigned_to + end + end + end + + # Updates start/due dates of following issues + def reschedule_following_issues + if start_date_changed? || due_date_changed? + relations_from.each do |relation| + relation.set_issue_to_dates(@current_journal) + end + end + end + + # Closes duplicates if the issue is being closed + def close_duplicates + if closing? + duplicates.each do |duplicate| + # Reload is needed in case the duplicate was updated by a previous duplicate + duplicate.reload + # Don't re-close it if it's already closed + next if duplicate.closed? + # Same user and notes + if @current_journal + duplicate.init_journal(@current_journal.user, @current_journal.notes) + duplicate.private_notes = @current_journal.private_notes + end + duplicate.update_attribute :status, self.status + end + end + end + + # Make sure updated_on is updated when adding a note and set updated_on now + # so we can set closed_on with the same value on closing + def force_updated_on_change + if @current_journal || changed? + self.updated_on = current_time_from_proper_timezone + if new_record? + self.created_on = updated_on + end + end + end + + # Callback for setting closed_on when the issue is closed. + # The closed_on attribute stores the time of the last closing + # and is preserved when the issue is reopened. + def update_closed_on + if closing? + self.closed_on = updated_on + end + end + + # Saves the changes in a Journal + # Called after_save + def create_journal + if current_journal + current_journal.save + end + end + + def send_notification + if notify? && Setting.notified_events.include?('issue_added') + Mailer.deliver_issue_add(self) + end + end + + # Stores the previous assignee so we can still have access + # to it during after_save callbacks (assigned_to_id_was is reset) + def set_assigned_to_was + @previous_assigned_to_id = assigned_to_id_was + end + + # Clears the previous assignee at the end of after_save callbacks + def clear_assigned_to_was + @assigned_to_was = nil + @previous_assigned_to_id = nil + end + + def clear_disabled_fields + if tracker + tracker.disabled_core_fields.each do |attribute| + send "#{attribute}=", nil + end + self.done_ratio ||= 0 + end + end +end diff --git a/app/models/issue_category.rb b/app/models/issue_category.rb new file mode 100644 index 0000000..da96a85 --- /dev/null +++ b/app/models/issue_category.rb @@ -0,0 +1,49 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueCategory < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :project + belongs_to :assigned_to, :class_name => 'Principal' + has_many :issues, :foreign_key => 'category_id', :dependent => :nullify + + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:project_id] + validates_length_of :name, :maximum => 60 + attr_protected :id + + safe_attributes 'name', 'assigned_to_id' + + scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)} + + alias :destroy_without_reassign :destroy + + # Destroy the category + # If a category is specified, issues are reassigned to this category + def destroy(reassign_to = nil) + if reassign_to && reassign_to.is_a?(IssueCategory) && reassign_to.project == self.project + Issue.where({:category_id => id}).update_all({:category_id => reassign_to.id}) + end + destroy_without_reassign + end + + def <=>(category) + name <=> category.name + end + + def to_s; name end +end diff --git a/app/models/issue_custom_field.rb b/app/models/issue_custom_field.rb new file mode 100644 index 0000000..fb7accd --- /dev/null +++ b/app/models/issue_custom_field.rb @@ -0,0 +1,48 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueCustomField < CustomField + has_and_belongs_to_many :projects, :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", :foreign_key => "custom_field_id" + has_and_belongs_to_many :trackers, :join_table => "#{table_name_prefix}custom_fields_trackers#{table_name_suffix}", :foreign_key => "custom_field_id" + has_many :issues, :through => :issue_custom_values + + safe_attributes 'project_ids', + 'tracker_ids' + + def type_name + :label_issue_plural + end + + def visible_by?(project, user=User.current) + super || (roles & user.roles_for_project(project)).present? + end + + def visibility_by_project_condition(project_key=nil, user=User.current, id_column=nil) + sql = super + id_column ||= id + tracker_condition = "#{Issue.table_name}.tracker_id IN (SELECT tracker_id FROM #{table_name_prefix}custom_fields_trackers#{table_name_suffix} WHERE custom_field_id = #{id_column})" + project_condition = "EXISTS (SELECT 1 FROM #{CustomField.table_name} ifa WHERE ifa.is_for_all = #{self.class.connection.quoted_true} AND ifa.id = #{id_column})" + + " OR #{Issue.table_name}.project_id IN (SELECT project_id FROM #{table_name_prefix}custom_fields_projects#{table_name_suffix} WHERE custom_field_id = #{id_column})" + + "((#{sql}) AND (#{tracker_condition}) AND (#{project_condition}))" + end + + def validate_custom_field + super + errors.add(:base, l(:label_role_plural) + ' ' + l('activerecord.errors.messages.blank')) unless visible? || roles.present? + end +end diff --git a/app/models/issue_import.rb b/app/models/issue_import.rb new file mode 100644 index 0000000..9fc4f55 --- /dev/null +++ b/app/models/issue_import.rb @@ -0,0 +1,206 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueImport < Import + + # Returns the objects that were imported + def saved_objects + object_ids = saved_items.pluck(:obj_id) + objects = Issue.where(:id => object_ids).order(:id).preload(:tracker, :priority, :status) + end + + # Returns a scope of projects that user is allowed to + # import issue to + def allowed_target_projects + Project.allowed_to(user, :import_issues) + end + + def project + project_id = mapping['project_id'].to_i + allowed_target_projects.find_by_id(project_id) || allowed_target_projects.first + end + + # Returns a scope of trackers that user is allowed to + # import issue to + def allowed_target_trackers + Issue.allowed_target_trackers(project, user) + end + + def tracker + if mapping['tracker'].to_s =~ /\Avalue:(\d+)\z/ + tracker_id = $1.to_i + allowed_target_trackers.find_by_id(tracker_id) + end + end + + # Returns true if missing categories should be created during the import + def create_categories? + user.allowed_to?(:manage_categories, project) && + mapping['create_categories'] == '1' + end + + # Returns true if missing versions should be created during the import + def create_versions? + user.allowed_to?(:manage_versions, project) && + mapping['create_versions'] == '1' + end + + def mappable_custom_fields + if tracker + issue = Issue.new + issue.project = project + issue.tracker = tracker + issue.editable_custom_field_values(user).map(&:custom_field) + elsif project + project.all_issue_custom_fields + else + [] + end + end + + private + + def build_object(row, item) + issue = Issue.new + issue.author = user + issue.notify = false + + tracker_id = nil + if tracker + tracker_id = tracker.id + elsif tracker_name = row_value(row, 'tracker') + tracker_id = allowed_target_trackers.named(tracker_name).first.try(:id) + end + + attributes = { + 'project_id' => mapping['project_id'], + 'tracker_id' => tracker_id, + 'subject' => row_value(row, 'subject'), + 'description' => row_value(row, 'description') + } + if status_name = row_value(row, 'status') + if status_id = IssueStatus.named(status_name).first.try(:id) + attributes['status_id'] = status_id + end + end + issue.send :safe_attributes=, attributes, user + + attributes = {} + if priority_name = row_value(row, 'priority') + if priority_id = IssuePriority.active.named(priority_name).first.try(:id) + attributes['priority_id'] = priority_id + end + end + if issue.project && category_name = row_value(row, 'category') + if category = issue.project.issue_categories.named(category_name).first + attributes['category_id'] = category.id + elsif create_categories? + category = issue.project.issue_categories.build + category.name = category_name + if category.save + attributes['category_id'] = category.id + end + end + end + if assignee_name = row_value(row, 'assigned_to') + if assignee = Principal.detect_by_keyword(issue.assignable_users, assignee_name) + attributes['assigned_to_id'] = assignee.id + end + end + if issue.project && version_name = row_value(row, 'fixed_version') + version = + issue.project.versions.named(version_name).first || + issue.project.shared_versions.named(version_name).first + if version + attributes['fixed_version_id'] = version.id + elsif create_versions? + version = issue.project.versions.build + version.name = version_name + if version.save + attributes['fixed_version_id'] = version.id + end + end + end + if is_private = row_value(row, 'is_private') + if yes?(is_private) + attributes['is_private'] = '1' + end + end + if parent_issue_id = row_value(row, 'parent_issue_id') + if parent_issue_id =~ /\A(#)?(\d+)\z/ + parent_issue_id = $2.to_i + if $1 + attributes['parent_issue_id'] = parent_issue_id + else + if parent_issue_id > item.position + add_callback(parent_issue_id, 'set_as_parent', item.position) + elsif issue_id = items.where(:position => parent_issue_id).first.try(:obj_id) + attributes['parent_issue_id'] = issue_id + end + end + else + attributes['parent_issue_id'] = parent_issue_id + end + end + if start_date = row_date(row, 'start_date') + attributes['start_date'] = start_date + end + if due_date = row_date(row, 'due_date') + attributes['due_date'] = due_date + end + if estimated_hours = row_value(row, 'estimated_hours') + attributes['estimated_hours'] = estimated_hours + end + if done_ratio = row_value(row, 'done_ratio') + attributes['done_ratio'] = done_ratio + end + + attributes['custom_field_values'] = issue.custom_field_values.inject({}) do |h, v| + value = case v.custom_field.field_format + when 'date' + row_date(row, "cf_#{v.custom_field.id}") + else + row_value(row, "cf_#{v.custom_field.id}") + end + if value + h[v.custom_field.id.to_s] = v.custom_field.value_from_keyword(value, issue) + end + h + end + + issue.send :safe_attributes=, attributes, user + + if issue.tracker_id != tracker_id + issue.tracker_id = nil + end + + issue + end + + # Callback that sets issue as the parent of a previously imported issue + def set_as_parent_callback(issue, child_position) + child_id = items.where(:position => child_position).first.try(:obj_id) + return unless child_id + + child = Issue.find_by_id(child_id) + return unless child + + child.parent_issue_id = issue.id + child.save! + issue.reload + end +end diff --git a/app/models/issue_priority.rb b/app/models/issue_priority.rb new file mode 100644 index 0000000..0858cbf --- /dev/null +++ b/app/models/issue_priority.rb @@ -0,0 +1,68 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssuePriority < Enumeration + has_many :issues, :foreign_key => 'priority_id' + + after_destroy {|priority| priority.class.compute_position_names} + after_save {|priority| priority.class.compute_position_names if (priority.position_changed? && priority.position) || priority.active_changed?} + + OptionName = :enumeration_issue_priorities + + def option_name + OptionName + end + + def objects_count + issues.count + end + + def transfer_relations(to) + issues.update_all(:priority_id => to.id) + end + + def css_classes + "priority-#{id} priority-#{position_name}" + end + + # Clears position_name for all priorities + # Called from migration 20121026003537_populate_enumerations_position_name + def self.clear_position_names + update_all :position_name => nil + end + + # Updates position_name for active priorities + # Called from migration 20121026003537_populate_enumerations_position_name + def self.compute_position_names + priorities = where(:active => true).sort_by(&:position) + if priorities.any? + default = priorities.detect(&:is_default?) || priorities[(priorities.size - 1) / 2] + priorities.each_with_index do |priority, index| + name = case + when priority.position == default.position + "default" + when priority.position < default.position + index == 0 ? "lowest" : "low#{index+1}" + else + index == (priorities.size - 1) ? "highest" : "high#{priorities.size - index}" + end + + where(:id => priority.id).update_all({:position_name => name}) + end + end + end +end diff --git a/app/models/issue_priority_custom_field.rb b/app/models/issue_priority_custom_field.rb new file mode 100644 index 0000000..ffcf2a9 --- /dev/null +++ b/app/models/issue_priority_custom_field.rb @@ -0,0 +1,23 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssuePriorityCustomField < CustomField + def type_name + :enumeration_issue_priorities + end +end + diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb new file mode 100644 index 0000000..c833607 --- /dev/null +++ b/app/models/issue_query.rb @@ -0,0 +1,621 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueQuery < Query + + self.queried_class = Issue + self.view_permission = :view_issues + + self.available_columns = [ + QueryColumn.new(:id, :sortable => "#{Issue.table_name}.id", :default_order => 'desc', :caption => '#', :frozen => true), + QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true), + QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :groupable => true), + QueryColumn.new(:parent, :sortable => ["#{Issue.table_name}.root_id", "#{Issue.table_name}.lft ASC"], :default_order => 'desc', :caption => :field_parent_issue), + QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true), + QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true), + QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"), + QueryColumn.new(:author, :sortable => lambda {User.fields_for_order_statement("authors")}, :groupable => true), + QueryColumn.new(:assigned_to, :sortable => lambda {User.fields_for_order_statement}, :groupable => true), + QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default_order => 'desc'), + QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true), + QueryColumn.new(:fixed_version, :sortable => lambda {Version.fields_for_order_statement}, :groupable => true), + QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"), + QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"), + QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours", :totalable => true), + QueryColumn.new(:total_estimated_hours, + :sortable => -> { "COALESCE((SELECT SUM(estimated_hours) FROM #{Issue.table_name} subtasks" + + " WHERE #{Issue.visible_condition(User.current).gsub(/\bissues\b/, 'subtasks')} AND subtasks.root_id = #{Issue.table_name}.root_id AND subtasks.lft >= #{Issue.table_name}.lft AND subtasks.rgt <= #{Issue.table_name}.rgt), 0)" }, + :default_order => 'desc'), + QueryColumn.new(:done_ratio, :sortable => "#{Issue.table_name}.done_ratio", :groupable => true), + QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'), + QueryColumn.new(:closed_on, :sortable => "#{Issue.table_name}.closed_on", :default_order => 'desc'), + QueryColumn.new(:last_updated_by, :sortable => lambda {User.fields_for_order_statement("last_journal_user")}), + QueryColumn.new(:relations, :caption => :label_related_issues), + QueryColumn.new(:attachments, :caption => :label_attachment_plural), + QueryColumn.new(:description, :inline => false), + QueryColumn.new(:last_notes, :caption => :label_last_notes, :inline => false) + ] + + def initialize(attributes=nil, *args) + super attributes + self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} } + end + + def draw_relations + r = options[:draw_relations] + r.nil? || r == '1' + end + + def draw_relations=(arg) + options[:draw_relations] = (arg == '0' ? '0' : nil) + end + + def draw_progress_line + r = options[:draw_progress_line] + r == '1' + end + + def draw_progress_line=(arg) + options[:draw_progress_line] = (arg == '1' ? '1' : nil) + end + + def build_from_params(params) + super + self.draw_relations = params[:draw_relations] || (params[:query] && params[:query][:draw_relations]) + self.draw_progress_line = params[:draw_progress_line] || (params[:query] && params[:query][:draw_progress_line]) + self + end + + def initialize_available_filters + add_available_filter "status_id", + :type => :list_status, :values => lambda { issue_statuses_values } + + add_available_filter("project_id", + :type => :list, :values => lambda { project_values } + ) if project.nil? + + add_available_filter "tracker_id", + :type => :list, :values => trackers.collect{|s| [s.name, s.id.to_s] } + + add_available_filter "priority_id", + :type => :list, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] } + + add_available_filter("author_id", + :type => :list, :values => lambda { author_values } + ) + + add_available_filter("assigned_to_id", + :type => :list_optional, :values => lambda { assigned_to_values } + ) + + add_available_filter("member_of_group", + :type => :list_optional, :values => lambda { Group.givable.visible.collect {|g| [g.name, g.id.to_s] } } + ) + + add_available_filter("assigned_to_role", + :type => :list_optional, :values => lambda { Role.givable.collect {|r| [r.name, r.id.to_s] } } + ) + + add_available_filter "fixed_version_id", + :type => :list_optional, :values => lambda { fixed_version_values } + + add_available_filter "fixed_version.due_date", + :type => :date, + :name => l(:label_attribute_of_fixed_version, :name => l(:field_effective_date)) + + add_available_filter "fixed_version.status", + :type => :list, + :name => l(:label_attribute_of_fixed_version, :name => l(:field_status)), + :values => Version::VERSION_STATUSES.map{|s| [l("version_status_#{s}"), s] } + + add_available_filter "category_id", + :type => :list_optional, + :values => lambda { project.issue_categories.collect{|s| [s.name, s.id.to_s] } } if project + + add_available_filter "subject", :type => :text + add_available_filter "description", :type => :text + add_available_filter "created_on", :type => :date_past + add_available_filter "updated_on", :type => :date_past + add_available_filter "closed_on", :type => :date_past + add_available_filter "start_date", :type => :date + add_available_filter "due_date", :type => :date + add_available_filter "estimated_hours", :type => :float + add_available_filter "done_ratio", :type => :integer + + if User.current.allowed_to?(:set_issues_private, nil, :global => true) || + User.current.allowed_to?(:set_own_issues_private, nil, :global => true) + add_available_filter "is_private", + :type => :list, + :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]] + end + + add_available_filter "attachment", + :type => :text, :name => l(:label_attachment) + + if User.current.logged? + add_available_filter "watcher_id", + :type => :list, :values => [["<< #{l(:label_me)} >>", "me"]] + end + + add_available_filter("updated_by", + :type => :list, :values => lambda { author_values } + ) + + add_available_filter("last_updated_by", + :type => :list, :values => lambda { author_values } + ) + + if project && !project.leaf? + add_available_filter "subproject_id", + :type => :list_subprojects, + :values => lambda { subproject_values } + end + + add_custom_fields_filters(issue_custom_fields) + add_associations_custom_fields_filters :project, :author, :assigned_to, :fixed_version + + IssueRelation::TYPES.each do |relation_type, options| + add_available_filter relation_type, :type => :relation, :label => options[:name], :values => lambda {all_projects_values} + end + add_available_filter "parent_id", :type => :tree, :label => :field_parent_issue + add_available_filter "child_id", :type => :tree, :label => :label_subtask_plural + + add_available_filter "issue_id", :type => :integer, :label => :label_issue + + Tracker.disabled_core_fields(trackers).each {|field| + delete_available_filter field + } + end + + def available_columns + return @available_columns if @available_columns + @available_columns = self.class.available_columns.dup + @available_columns += issue_custom_fields.visible.collect {|cf| QueryCustomFieldColumn.new(cf) } + + if User.current.allowed_to?(:view_time_entries, project, :global => true) + # insert the columns after total_estimated_hours or at the end + index = @available_columns.find_index {|column| column.name == :total_estimated_hours} + index = (index ? index + 1 : -1) + + subselect = "SELECT SUM(hours) FROM #{TimeEntry.table_name}" + + " JOIN #{Project.table_name} ON #{Project.table_name}.id = #{TimeEntry.table_name}.project_id" + + " WHERE (#{TimeEntry.visible_condition(User.current)}) AND #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id" + + @available_columns.insert index, QueryColumn.new(:spent_hours, + :sortable => "COALESCE((#{subselect}), 0)", + :default_order => 'desc', + :caption => :label_spent_time, + :totalable => true + ) + + subselect = "SELECT SUM(hours) FROM #{TimeEntry.table_name}" + + " JOIN #{Project.table_name} ON #{Project.table_name}.id = #{TimeEntry.table_name}.project_id" + + " JOIN #{Issue.table_name} subtasks ON subtasks.id = #{TimeEntry.table_name}.issue_id" + + " WHERE (#{TimeEntry.visible_condition(User.current)})" + + " AND subtasks.root_id = #{Issue.table_name}.root_id AND subtasks.lft >= #{Issue.table_name}.lft AND subtasks.rgt <= #{Issue.table_name}.rgt" + + @available_columns.insert index+1, QueryColumn.new(:total_spent_hours, + :sortable => "COALESCE((#{subselect}), 0)", + :default_order => 'desc', + :caption => :label_total_spent_time + ) + end + + if User.current.allowed_to?(:set_issues_private, nil, :global => true) || + User.current.allowed_to?(:set_own_issues_private, nil, :global => true) + @available_columns << QueryColumn.new(:is_private, :sortable => "#{Issue.table_name}.is_private", :groupable => true) + end + + disabled_fields = Tracker.disabled_core_fields(trackers).map {|field| field.sub(/_id$/, '')} + disabled_fields << "total_estimated_hours" if disabled_fields.include?("estimated_hours") + @available_columns.reject! {|column| + disabled_fields.include?(column.name.to_s) + } + + @available_columns + end + + def default_columns_names + @default_columns_names ||= begin + default_columns = Setting.issue_list_default_columns.map(&:to_sym) + + project.present? ? default_columns : [:project] | default_columns + end + end + + def default_totalable_names + Setting.issue_list_default_totals.map(&:to_sym) + end + + def default_sort_criteria + [['id', 'desc']] + end + + def base_scope + Issue.visible.joins(:status, :project).where(statement) + end + + # Returns the issue count + def issue_count + base_scope.count + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + # Returns sum of all the issue's estimated_hours + def total_for_estimated_hours(scope) + map_total(scope.sum(:estimated_hours)) {|t| t.to_f.round(2)} + end + + # Returns sum of all the issue's time entries hours + def total_for_spent_hours(scope) + total = scope.joins(:time_entries). + where(TimeEntry.visible_condition(User.current)). + sum("#{TimeEntry.table_name}.hours") + + map_total(total) {|t| t.to_f.round(2)} + end + + # Returns the issues + # Valid options are :order, :offset, :limit, :include, :conditions + def issues(options={}) + order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) + + scope = Issue.visible. + joins(:status, :project). + preload(:priority). + where(statement). + includes(([:status, :project] + (options[:include] || [])).uniq). + where(options[:conditions]). + order(order_option). + joins(joins_for_order_statement(order_option.join(','))). + limit(options[:limit]). + offset(options[:offset]) + + scope = scope.preload([:tracker, :author, :assigned_to, :fixed_version, :category, :attachments] & columns.map(&:name)) + if has_custom_field_column? + scope = scope.preload(:custom_values) + end + + issues = scope.to_a + + if has_column?(:spent_hours) + Issue.load_visible_spent_hours(issues) + end + if has_column?(:total_spent_hours) + Issue.load_visible_total_spent_hours(issues) + end + if has_column?(:last_updated_by) + Issue.load_visible_last_updated_by(issues) + end + if has_column?(:relations) + Issue.load_visible_relations(issues) + end + if has_column?(:last_notes) + Issue.load_visible_last_notes(issues) + end + issues + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + # Returns the issues ids + def issue_ids(options={}) + order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) + + Issue.visible. + joins(:status, :project). + where(statement). + includes(([:status, :project] + (options[:include] || [])).uniq). + references(([:status, :project] + (options[:include] || [])).uniq). + where(options[:conditions]). + order(order_option). + joins(joins_for_order_statement(order_option.join(','))). + limit(options[:limit]). + offset(options[:offset]). + pluck(:id) + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + # Returns the journals + # Valid options are :order, :offset, :limit + def journals(options={}) + Journal.visible. + joins(:issue => [:project, :status]). + where(statement). + order(options[:order]). + limit(options[:limit]). + offset(options[:offset]). + preload(:details, :user, {:issue => [:project, :author, :tracker, :status]}). + to_a + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + # Returns the versions + # Valid options are :conditions + def versions(options={}) + Version.visible. + where(project_statement). + where(options[:conditions]). + includes(:project). + references(:project). + to_a + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + def sql_for_updated_by_field(field, operator, value) + neg = (operator == '!' ? 'NOT' : '') + subquery = "SELECT 1 FROM #{Journal.table_name}" + + " WHERE #{Journal.table_name}.journalized_type='Issue' AND #{Journal.table_name}.journalized_id=#{Issue.table_name}.id" + + " AND (#{sql_for_field field, '=', value, Journal.table_name, 'user_id'})" + + " AND (#{Journal.visible_notes_condition(User.current, :skip_pre_condition => true)})" + + "#{neg} EXISTS (#{subquery})" + end + + def sql_for_last_updated_by_field(field, operator, value) + neg = (operator == '!' ? 'NOT' : '') + subquery = "SELECT 1 FROM #{Journal.table_name} sj" + + " WHERE sj.journalized_type='Issue' AND sj.journalized_id=#{Issue.table_name}.id AND (#{sql_for_field field, '=', value, 'sj', 'user_id'})" + + " AND sj.id IN (SELECT MAX(#{Journal.table_name}.id) FROM #{Journal.table_name}" + + " WHERE #{Journal.table_name}.journalized_type='Issue' AND #{Journal.table_name}.journalized_id=#{Issue.table_name}.id" + + " AND (#{Journal.visible_notes_condition(User.current, :skip_pre_condition => true)}))" + + "#{neg} EXISTS (#{subquery})" + end + + def sql_for_watcher_id_field(field, operator, value) + db_table = Watcher.table_name + + me, others = value.partition { |id| ['0', User.current.id.to_s].include?(id) } + sql = if others.any? + "SELECT #{Issue.table_name}.id FROM #{Issue.table_name} " + + "INNER JOIN #{db_table} ON #{Issue.table_name}.id = #{db_table}.watchable_id AND #{db_table}.watchable_type = 'Issue' " + + "LEFT OUTER JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Issue.table_name}.project_id " + + "WHERE (" + + sql_for_field(field, '=', me, db_table, 'user_id') + + ') OR (' + + Project.allowed_to_condition(User.current, :view_issue_watchers) + + ' AND ' + + sql_for_field(field, '=', others, db_table, 'user_id') + + ')' + else + "SELECT #{db_table}.watchable_id FROM #{db_table} " + + "WHERE #{db_table}.watchable_type='Issue' AND " + + sql_for_field(field, '=', me, db_table, 'user_id') + end + + "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (#{sql})" + end + + def sql_for_member_of_group_field(field, operator, value) + if operator == '*' # Any group + groups = Group.givable + operator = '=' # Override the operator since we want to find by assigned_to + elsif operator == "!*" + groups = Group.givable + operator = '!' # Override the operator since we want to find by assigned_to + else + groups = Group.where(:id => value).to_a + end + groups ||= [] + + members_of_groups = groups.inject([]) {|user_ids, group| + user_ids + group.user_ids + [group.id] + }.uniq.compact.sort.collect(&:to_s) + + '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')' + end + + def sql_for_assigned_to_role_field(field, operator, value) + case operator + when "*", "!*" # Member / Not member + sw = operator == "!*" ? 'NOT' : '' + nl = operator == "!*" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : '' + "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" + + " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))" + when "=", "!" + role_cond = value.any? ? + "#{MemberRole.table_name}.role_id IN (" + value.collect{|val| "'#{self.class.connection.quote_string(val)}'"}.join(",") + ")" : + "1=0" + + sw = operator == "!" ? 'NOT' : '' + nl = operator == "!" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : '' + "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}, #{MemberRole.table_name}" + + " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id AND #{Member.table_name}.id = #{MemberRole.table_name}.member_id AND #{role_cond}))" + end + end + + def sql_for_fixed_version_status_field(field, operator, value) + where = sql_for_field(field, operator, value, Version.table_name, "status") + version_ids = versions(:conditions => [where]).map(&:id) + + nl = operator == "!" ? "#{Issue.table_name}.fixed_version_id IS NULL OR" : '' + "(#{nl} #{sql_for_field("fixed_version_id", "=", version_ids, Issue.table_name, "fixed_version_id")})" + end + + def sql_for_fixed_version_due_date_field(field, operator, value) + where = sql_for_field(field, operator, value, Version.table_name, "effective_date") + version_ids = versions(:conditions => [where]).map(&:id) + + nl = operator == "!*" ? "#{Issue.table_name}.fixed_version_id IS NULL OR" : '' + "(#{nl} #{sql_for_field("fixed_version_id", "=", version_ids, Issue.table_name, "fixed_version_id")})" + end + + def sql_for_is_private_field(field, operator, value) + op = (operator == "=" ? 'IN' : 'NOT IN') + va = value.map {|v| v == '0' ? self.class.connection.quoted_false : self.class.connection.quoted_true}.uniq.join(',') + + "#{Issue.table_name}.is_private #{op} (#{va})" + end + + def sql_for_attachment_field(field, operator, value) + case operator + when "*", "!*" + e = (operator == "*" ? "EXISTS" : "NOT EXISTS") + "#{e} (SELECT 1 FROM #{Attachment.table_name} a WHERE a.container_type = 'Issue' AND a.container_id = #{Issue.table_name}.id)" + when "~", "!~" + c = sql_contains("a.filename", value.first) + e = (operator == "~" ? "EXISTS" : "NOT EXISTS") + "#{e} (SELECT 1 FROM #{Attachment.table_name} a WHERE a.container_type = 'Issue' AND a.container_id = #{Issue.table_name}.id AND #{c})" + end + end + + def sql_for_parent_id_field(field, operator, value) + case operator + when "=" + "#{Issue.table_name}.parent_id = #{value.first.to_i}" + when "~" + root_id, lft, rgt = Issue.where(:id => value.first.to_i).pluck(:root_id, :lft, :rgt).first + if root_id && lft && rgt + "#{Issue.table_name}.root_id = #{root_id} AND #{Issue.table_name}.lft > #{lft} AND #{Issue.table_name}.rgt < #{rgt}" + else + "1=0" + end + when "!*" + "#{Issue.table_name}.parent_id IS NULL" + when "*" + "#{Issue.table_name}.parent_id IS NOT NULL" + end + end + + def sql_for_child_id_field(field, operator, value) + case operator + when "=" + parent_id = Issue.where(:id => value.first.to_i).pluck(:parent_id).first + if parent_id + "#{Issue.table_name}.id = #{parent_id}" + else + "1=0" + end + when "~" + root_id, lft, rgt = Issue.where(:id => value.first.to_i).pluck(:root_id, :lft, :rgt).first + if root_id && lft && rgt + "#{Issue.table_name}.root_id = #{root_id} AND #{Issue.table_name}.lft < #{lft} AND #{Issue.table_name}.rgt > #{rgt}" + else + "1=0" + end + when "!*" + "#{Issue.table_name}.rgt - #{Issue.table_name}.lft = 1" + when "*" + "#{Issue.table_name}.rgt - #{Issue.table_name}.lft > 1" + end + end + + def sql_for_updated_on_field(field, operator, value) + case operator + when "!*" + "#{Issue.table_name}.updated_on = #{Issue.table_name}.created_on" + when "*" + "#{Issue.table_name}.updated_on > #{Issue.table_name}.created_on" + else + sql_for_field("updated_on", operator, value, Issue.table_name, "updated_on") + end + end + + def sql_for_issue_id_field(field, operator, value) + if operator == "=" + # accepts a comma separated list of ids + ids = value.first.to_s.scan(/\d+/).map(&:to_i) + if ids.present? + "#{Issue.table_name}.id IN (#{ids.join(",")})" + else + "1=0" + end + else + sql_for_field("id", operator, value, Issue.table_name, "id") + end + end + + def sql_for_relations(field, operator, value, options={}) + relation_options = IssueRelation::TYPES[field] + return relation_options unless relation_options + + relation_type = field + join_column, target_join_column = "issue_from_id", "issue_to_id" + if relation_options[:reverse] || options[:reverse] + relation_type = relation_options[:reverse] || relation_type + join_column, target_join_column = target_join_column, join_column + end + + sql = case operator + when "*", "!*" + op = (operator == "*" ? 'IN' : 'NOT IN') + "#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name} WHERE #{IssueRelation.table_name}.relation_type = '#{self.class.connection.quote_string(relation_type)}')" + when "=", "!" + op = (operator == "=" ? 'IN' : 'NOT IN') + "#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name} WHERE #{IssueRelation.table_name}.relation_type = '#{self.class.connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = #{value.first.to_i})" + when "=p", "=!p", "!p" + op = (operator == "!p" ? 'NOT IN' : 'IN') + comp = (operator == "=!p" ? '<>' : '=') + "#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name}, #{Issue.table_name} relissues WHERE #{IssueRelation.table_name}.relation_type = '#{self.class.connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = relissues.id AND relissues.project_id #{comp} #{value.first.to_i})" + when "*o", "!o" + op = (operator == "!o" ? 'NOT IN' : 'IN') + "#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name}, #{Issue.table_name} relissues WHERE #{IssueRelation.table_name}.relation_type = '#{self.class.connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = relissues.id AND relissues.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{self.class.connection.quoted_false}))" + end + + if relation_options[:sym] == field && !options[:reverse] + sqls = [sql, sql_for_relations(field, operator, value, :reverse => true)] + sql = sqls.join(["!", "!*", "!p", '!o'].include?(operator) ? " AND " : " OR ") + end + "(#{sql})" + end + + def find_assigned_to_id_filter_values(values) + Principal.visible.where(:id => values).map {|p| [p.name, p.id.to_s]} + end + alias :find_author_id_filter_values :find_assigned_to_id_filter_values + + IssueRelation::TYPES.keys.each do |relation_type| + alias_method "sql_for_#{relation_type}_field".to_sym, :sql_for_relations + end + + def joins_for_order_statement(order_options) + joins = [super] + + if order_options + if order_options.include?('authors') + joins << "LEFT OUTER JOIN #{User.table_name} authors ON authors.id = #{queried_table_name}.author_id" + end + if order_options.include?('users') + joins << "LEFT OUTER JOIN #{User.table_name} ON #{User.table_name}.id = #{queried_table_name}.assigned_to_id" + end + if order_options.include?('last_journal_user') + joins << "LEFT OUTER JOIN #{Journal.table_name} ON #{Journal.table_name}.id = (SELECT MAX(#{Journal.table_name}.id) FROM #{Journal.table_name}" + + " WHERE #{Journal.table_name}.journalized_type='Issue' AND #{Journal.table_name}.journalized_id=#{Issue.table_name}.id AND #{Journal.visible_notes_condition(User.current, :skip_pre_condition => true)})" + + " LEFT OUTER JOIN #{User.table_name} last_journal_user ON last_journal_user.id = #{Journal.table_name}.user_id"; + end + if order_options.include?('versions') + joins << "LEFT OUTER JOIN #{Version.table_name} ON #{Version.table_name}.id = #{queried_table_name}.fixed_version_id" + end + if order_options.include?('issue_categories') + joins << "LEFT OUTER JOIN #{IssueCategory.table_name} ON #{IssueCategory.table_name}.id = #{queried_table_name}.category_id" + end + if order_options.include?('trackers') + joins << "LEFT OUTER JOIN #{Tracker.table_name} ON #{Tracker.table_name}.id = #{queried_table_name}.tracker_id" + end + if order_options.include?('enumerations') + joins << "LEFT OUTER JOIN #{IssuePriority.table_name} ON #{IssuePriority.table_name}.id = #{queried_table_name}.priority_id" + end + end + + joins.any? ? joins.join(' ') : nil + end +end diff --git a/app/models/issue_relation.rb b/app/models/issue_relation.rb new file mode 100644 index 0000000..f23f744 --- /dev/null +++ b/app/models/issue_relation.rb @@ -0,0 +1,256 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueRelation < ActiveRecord::Base + # Class used to represent the relations of an issue + class Relations < Array + include Redmine::I18n + + def initialize(issue, *args) + @issue = issue + super(*args) + end + + def to_s(*args) + map {|relation| relation.to_s(@issue)}.join(', ') + end + end + + include Redmine::SafeAttributes + + belongs_to :issue_from, :class_name => 'Issue' + belongs_to :issue_to, :class_name => 'Issue' + + TYPE_RELATES = "relates" + TYPE_DUPLICATES = "duplicates" + TYPE_DUPLICATED = "duplicated" + TYPE_BLOCKS = "blocks" + TYPE_BLOCKED = "blocked" + TYPE_PRECEDES = "precedes" + TYPE_FOLLOWS = "follows" + TYPE_COPIED_TO = "copied_to" + TYPE_COPIED_FROM = "copied_from" + + TYPES = { + TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to, + :order => 1, :sym => TYPE_RELATES }, + TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicated_by, + :order => 2, :sym => TYPE_DUPLICATED }, + TYPE_DUPLICATED => { :name => :label_duplicated_by, :sym_name => :label_duplicates, + :order => 3, :sym => TYPE_DUPLICATES, :reverse => TYPE_DUPLICATES }, + TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by, + :order => 4, :sym => TYPE_BLOCKED }, + TYPE_BLOCKED => { :name => :label_blocked_by, :sym_name => :label_blocks, + :order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS }, + TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows, + :order => 6, :sym => TYPE_FOLLOWS }, + TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes, + :order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES }, + TYPE_COPIED_TO => { :name => :label_copied_to, :sym_name => :label_copied_from, + :order => 8, :sym => TYPE_COPIED_FROM }, + TYPE_COPIED_FROM => { :name => :label_copied_from, :sym_name => :label_copied_to, + :order => 9, :sym => TYPE_COPIED_TO, :reverse => TYPE_COPIED_TO } + }.freeze + + validates_presence_of :issue_from, :issue_to, :relation_type + validates_inclusion_of :relation_type, :in => TYPES.keys + validates_numericality_of :delay, :allow_nil => true + validates_uniqueness_of :issue_to_id, :scope => :issue_from_id + validate :validate_issue_relation + + attr_protected :issue_from_id, :issue_to_id + before_save :handle_issue_order + after_create :call_issues_relation_added_callback + after_destroy :call_issues_relation_removed_callback + + safe_attributes 'relation_type', + 'delay', + 'issue_to_id' + + def safe_attributes=(attrs, user=User.current) + return unless attrs.is_a?(Hash) + attrs = attrs.deep_dup + + if issue_id = attrs.delete('issue_to_id') + if issue_id.to_s.strip.match(/\A#?(\d+)\z/) + issue_id = $1.to_i + self.issue_to = Issue.visible(user).find_by_id(issue_id) + end + end + + super(attrs) + end + + def visible?(user=User.current) + (issue_from.nil? || issue_from.visible?(user)) && (issue_to.nil? || issue_to.visible?(user)) + end + + def deletable?(user=User.current) + visible?(user) && + ((issue_from.nil? || user.allowed_to?(:manage_issue_relations, issue_from.project)) || + (issue_to.nil? || user.allowed_to?(:manage_issue_relations, issue_to.project))) + end + + def initialize(attributes=nil, *args) + super + if new_record? + if relation_type.blank? + self.relation_type = IssueRelation::TYPE_RELATES + end + end + end + + def validate_issue_relation + if issue_from && issue_to + errors.add :issue_to_id, :invalid if issue_from_id == issue_to_id + unless issue_from.project_id == issue_to.project_id || + Setting.cross_project_issue_relations? + errors.add :issue_to_id, :not_same_project + end + if circular_dependency? + errors.add :base, :circular_dependency + end + if issue_from.is_descendant_of?(issue_to) || issue_from.is_ancestor_of?(issue_to) + errors.add :base, :cant_link_an_issue_with_a_descendant + end + end + end + + def other_issue(issue) + (self.issue_from_id == issue.id) ? issue_to : issue_from + end + + # Returns the relation type for +issue+ + def relation_type_for(issue) + if TYPES[relation_type] + if self.issue_from_id == issue.id + relation_type + else + TYPES[relation_type][:sym] + end + end + end + + def label_for(issue) + TYPES[relation_type] ? + TYPES[relation_type][(self.issue_from_id == issue.id) ? :name : :sym_name] : + :unknow + end + + def to_s(issue=nil) + issue ||= issue_from + issue_text = block_given? ? yield(other_issue(issue)) : "##{other_issue(issue).try(:id)}" + s = [] + s << l(label_for(issue)) + s << "(#{l('datetime.distance_in_words.x_days', :count => delay)})" if delay && delay != 0 + s << issue_text + s.join(' ') + end + + def css_classes_for(issue) + "rel-#{relation_type_for(issue)}" + end + + def handle_issue_order + reverse_if_needed + + if TYPE_PRECEDES == relation_type + self.delay ||= 0 + else + self.delay = nil + end + set_issue_to_dates + end + + def set_issue_to_dates(journal=nil) + soonest_start = self.successor_soonest_start + if soonest_start && issue_to + issue_to.reschedule_on!(soonest_start, journal) + end + end + + def successor_soonest_start + if (TYPE_PRECEDES == self.relation_type) && delay && issue_from && + (issue_from.start_date || issue_from.due_date) + (issue_from.due_date || issue_from.start_date) + 1 + delay + end + end + + def <=>(relation) + r = TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order] + r == 0 ? id <=> relation.id : r + end + + def init_journals(user) + issue_from.init_journal(user) if issue_from + issue_to.init_journal(user) if issue_to + end + + private + + # Reverses the relation if needed so that it gets stored in the proper way + # Should not be reversed before validation so that it can be displayed back + # as entered on new relation form. + # + # Orders relates relations by ID, so that uniqueness index in DB is triggered + # on concurrent access. + def reverse_if_needed + if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse] + issue_tmp = issue_to + self.issue_to = issue_from + self.issue_from = issue_tmp + self.relation_type = TYPES[relation_type][:reverse] + + elsif relation_type == TYPE_RELATES && issue_from_id > issue_to_id + self.issue_to, self.issue_from = issue_from, issue_to + end + end + + # Returns true if the relation would create a circular dependency + def circular_dependency? + case relation_type + when 'follows' + issue_from.would_reschedule? issue_to + when 'precedes' + issue_to.would_reschedule? issue_from + when 'blocked' + issue_from.blocks? issue_to + when 'blocks' + issue_to.blocks? issue_from + when 'relates' + self.class.where(issue_from_id: issue_to, issue_to_id: issue_from).present? + else + false + end + end + + def call_issues_relation_added_callback + call_issues_callback :relation_added + end + + def call_issues_relation_removed_callback + call_issues_callback :relation_removed + end + + def call_issues_callback(name) + [issue_from, issue_to].each do |issue| + if issue + issue.send name, self + end + end + end +end diff --git a/app/models/issue_status.rb b/app/models/issue_status.rb new file mode 100644 index 0000000..6d29cfc --- /dev/null +++ b/app/models/issue_status.rb @@ -0,0 +1,122 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class IssueStatus < ActiveRecord::Base + include Redmine::SafeAttributes + + before_destroy :check_integrity + has_many :workflows, :class_name => 'WorkflowTransition', :foreign_key => "old_status_id" + has_many :workflow_transitions_as_new_status, :class_name => 'WorkflowTransition', :foreign_key => "new_status_id" + acts_as_positioned + + after_update :handle_is_closed_change + before_destroy :delete_workflow_rules + + validates_presence_of :name + validates_uniqueness_of :name + validates_length_of :name, :maximum => 30 + validates_inclusion_of :default_done_ratio, :in => 0..100, :allow_nil => true + attr_protected :id + + scope :sorted, lambda { order(:position) } + scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)} + + safe_attributes 'name', + 'is_closed', + 'position', + 'default_done_ratio' + + # Update all the +Issues+ setting their done_ratio to the value of their +IssueStatus+ + def self.update_issue_done_ratios + if Issue.use_status_for_done_ratio? + IssueStatus.where("default_done_ratio >= 0").each do |status| + Issue.where({:status_id => status.id}).update_all({:done_ratio => status.default_done_ratio}) + end + end + + return Issue.use_status_for_done_ratio? + end + + # Returns an array of all statuses the given role can switch to + def new_statuses_allowed_to(roles, tracker, author=false, assignee=false) + self.class.new_statuses_allowed(self, roles, tracker, author, assignee) + end + alias :find_new_statuses_allowed_to :new_statuses_allowed_to + + def self.new_statuses_allowed(status, roles, tracker, author=false, assignee=false) + if roles.present? && tracker + status_id = status.try(:id) || 0 + + scope = IssueStatus. + joins(:workflow_transitions_as_new_status). + where(:workflows => {:old_status_id => status_id, :role_id => roles.map(&:id), :tracker_id => tracker.id}) + + unless author && assignee + if author || assignee + scope = scope.where("author = ? OR assignee = ?", author, assignee) + else + scope = scope.where("author = ? AND assignee = ?", false, false) + end + end + + scope.distinct.to_a.sort + else + [] + end + end + + def <=>(status) + position <=> status.position + end + + def to_s; name end + + private + + # Updates issues closed_on attribute when an existing status is set as closed. + def handle_is_closed_change + if is_closed_changed? && is_closed == true + # First we update issues that have a journal for when the current status was set, + # a subselect is used to update all issues with a single query + subquery = Journal.joins(:details). + where(:journalized_type => 'Issue'). + where("journalized_id = #{Issue.table_name}.id"). + where(:journal_details => {:property => 'attr', :prop_key => 'status_id', :value => id.to_s}). + select("MAX(created_on)"). + to_sql + Issue.where(:status_id => id, :closed_on => nil).update_all("closed_on = (#{subquery})") + + # Then we update issues that don't have a journal which means the + # current status was set on creation + Issue.where(:status_id => id, :closed_on => nil).update_all("closed_on = created_on") + end + end + + def check_integrity + if Issue.where(:status_id => id).any? + raise "This status is used by some issues" + elsif Tracker.where(:default_status_id => id).any? + raise "This status is used as the default status by some trackers" + end + end + + # Deletes associated workflows + def delete_workflow_rules + WorkflowRule.where(:old_status_id => id).delete_all + WorkflowRule.where(:new_status_id => id).delete_all + end +end diff --git a/app/models/journal.rb b/app/models/journal.rb new file mode 100644 index 0000000..0d2e479 --- /dev/null +++ b/app/models/journal.rb @@ -0,0 +1,328 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Journal < ActiveRecord::Base + include Redmine::SafeAttributes + + belongs_to :journalized, :polymorphic => true + # added as a quick fix to allow eager loading of the polymorphic association + # since always associated to an issue, for now + belongs_to :issue, :foreign_key => :journalized_id + + belongs_to :user + has_many :details, :class_name => "JournalDetail", :dependent => :delete_all, :inverse_of => :journal + attr_accessor :indice + attr_protected :id + + acts_as_event :title => Proc.new {|o| status = ((s = o.new_status) ? " (#{s})" : nil); "#{o.issue.tracker} ##{o.issue.id}#{status}: #{o.issue.subject}" }, + :description => :notes, + :author => :user, + :group => :issue, + :type => Proc.new {|o| (s = o.new_status) ? (s.is_closed? ? 'issue-closed' : 'issue-edit') : 'issue-note' }, + :url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.issue.id, :anchor => "change-#{o.id}"}} + + acts_as_activity_provider :type => 'issues', + :author_key => :user_id, + :scope => preload({:issue => :project}, :user). + joins("LEFT OUTER JOIN #{JournalDetail.table_name} ON #{JournalDetail.table_name}.journal_id = #{Journal.table_name}.id"). + where("#{Journal.table_name}.journalized_type = 'Issue' AND" + + " (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')").distinct + + before_create :split_private_notes + after_commit :send_notification, :on => :create + + scope :visible, lambda {|*args| + user = args.shift || User.current + options = args.shift || {} + + joins(:issue => :project). + where(Issue.visible_condition(user, options)). + where(Journal.visible_notes_condition(user, :skip_pre_condition => true)) + } + + safe_attributes 'notes', + :if => lambda {|journal, user| journal.new_record? || journal.editable_by?(user)} + safe_attributes 'private_notes', + :if => lambda {|journal, user| user.allowed_to?(:set_notes_private, journal.project)} + + # Returns a SQL condition to filter out journals with notes that are not visible to user + def self.visible_notes_condition(user=User.current, options={}) + private_notes_permission = Project.allowed_to_condition(user, :view_private_notes, options) + sanitize_sql_for_conditions(["(#{table_name}.private_notes = ? OR #{table_name}.user_id = ? OR (#{private_notes_permission}))", false, user.id]) + end + + def initialize(*args) + super + if journalized + if journalized.new_record? + self.notify = false + else + start + end + end + end + + def save(*args) + journalize_changes + # Do not save an empty journal + (details.empty? && notes.blank?) ? false : super + end + + # Returns journal details that are visible to user + def visible_details(user=User.current) + details.select do |detail| + if detail.property == 'cf' + detail.custom_field && detail.custom_field.visible_by?(project, user) + elsif detail.property == 'relation' + Issue.find_by_id(detail.value || detail.old_value).try(:visible?, user) + else + true + end + end + end + + def each_notification(users, &block) + if users.any? + users_by_details_visibility = users.group_by do |user| + visible_details(user) + end + users_by_details_visibility.each do |visible_details, users| + if notes? || visible_details.any? + yield(users) + end + end + end + end + + # Returns the JournalDetail for the given attribute, or nil if the attribute + # was not updated + def detail_for_attribute(attribute) + details.detect {|detail| detail.prop_key == attribute} + end + + # Returns the new status if the journal contains a status change, otherwise nil + def new_status + s = new_value_for('status_id') + s ? IssueStatus.find_by_id(s.to_i) : nil + end + + def new_value_for(prop) + detail_for_attribute(prop).try(:value) + end + + def editable_by?(usr) + usr && usr.logged? && (usr.allowed_to?(:edit_issue_notes, project) || (self.user == usr && usr.allowed_to?(:edit_own_issue_notes, project))) + end + + def project + journalized.respond_to?(:project) ? journalized.project : nil + end + + def attachments + journalized.respond_to?(:attachments) ? journalized.attachments : [] + end + + # Returns a string of css classes + def css_classes + s = 'journal' + s << ' has-notes' unless notes.blank? + s << ' has-details' unless details.blank? + s << ' private-notes' if private_notes? + s + end + + def notify? + @notify != false + end + + def notify=(arg) + @notify = arg + end + + def notified_users + notified = journalized.notified_users + if private_notes? + notified = notified.select {|user| user.allowed_to?(:view_private_notes, journalized.project)} + end + notified + end + + def recipients + notified_users.map(&:mail) + end + + def notified_watchers + notified = journalized.notified_watchers + if private_notes? + notified = notified.select {|user| user.allowed_to?(:view_private_notes, journalized.project)} + end + notified + end + + def watcher_recipients + notified_watchers.map(&:mail) + end + + # Sets @custom_field instance variable on journals details using a single query + def self.preload_journals_details_custom_fields(journals) + field_ids = journals.map(&:details).flatten.select {|d| d.property == 'cf'}.map(&:prop_key).uniq + if field_ids.any? + fields_by_id = CustomField.where(:id => field_ids).inject({}) {|h, f| h[f.id] = f; h} + journals.each do |journal| + journal.details.each do |detail| + if detail.property == 'cf' + detail.instance_variable_set "@custom_field", fields_by_id[detail.prop_key.to_i] + end + end + end + end + journals + end + + # Stores the values of the attributes and custom fields of the journalized object + def start + if journalized + @attributes_before_change = journalized.journalized_attribute_names.inject({}) do |h, attribute| + h[attribute] = journalized.send(attribute) + h + end + @custom_values_before_change = journalized.custom_field_values.inject({}) do |h, c| + h[c.custom_field_id] = c.value + h + end + end + self + end + + # Adds a journal detail for an attachment that was added or removed + def journalize_attachment(attachment, added_or_removed) + key = (added_or_removed == :removed ? :old_value : :value) + details << JournalDetail.new( + :property => 'attachment', + :prop_key => attachment.id, + key => attachment.filename + ) + end + + # Adds a journal detail for an issue relation that was added or removed + def journalize_relation(relation, added_or_removed) + key = (added_or_removed == :removed ? :old_value : :value) + details << JournalDetail.new( + :property => 'relation', + :prop_key => relation.relation_type_for(journalized), + key => relation.other_issue(journalized).try(:id) + ) + end + + private + + # Generates journal details for attribute and custom field changes + def journalize_changes + # attributes changes + if @attributes_before_change + attrs = (journalized.journalized_attribute_names + @attributes_before_change.keys).uniq + attrs.each do |attribute| + before = @attributes_before_change[attribute] + after = journalized.send(attribute) + next if before == after || (before.blank? && after.blank?) + add_attribute_detail(attribute, before, after) + end + end + # custom fields changes + if @custom_values_before_change + values_by_custom_field_id = {} + @custom_values_before_change.each do |custom_field_id, value| + values_by_custom_field_id[custom_field_id] = nil + end + journalized.custom_field_values.each do |c| + values_by_custom_field_id[c.custom_field_id] = c.value + end + + values_by_custom_field_id.each do |custom_field_id, after| + before = @custom_values_before_change[custom_field_id] + next if before == after || (before.blank? && after.blank?) + + if before.is_a?(Array) || after.is_a?(Array) + before = [before] unless before.is_a?(Array) + after = [after] unless after.is_a?(Array) + + # values removed + (before - after).reject(&:blank?).each do |value| + add_custom_field_detail(custom_field_id, value, nil) + end + # values added + (after - before).reject(&:blank?).each do |value| + add_custom_field_detail(custom_field_id, nil, value) + end + else + add_custom_field_detail(custom_field_id, before, after) + end + end + end + start + end + + # Adds a journal detail for an attribute change + def add_attribute_detail(attribute, old_value, value) + add_detail('attr', attribute, old_value, value) + end + + # Adds a journal detail for a custom field value change + def add_custom_field_detail(custom_field_id, old_value, value) + add_detail('cf', custom_field_id, old_value, value) + end + + # Adds a journal detail + def add_detail(property, prop_key, old_value, value) + details << JournalDetail.new( + :property => property, + :prop_key => prop_key, + :old_value => old_value, + :value => value + ) + end + + def split_private_notes + if private_notes? + if notes.present? + if details.any? + # Split the journal (notes/changes) so we don't have half-private journals + journal = Journal.new(:journalized => journalized, :user => user, :notes => nil, :private_notes => false) + journal.details = details + journal.save + self.details = [] + self.created_on = journal.created_on + end + else + # Blank notes should not be private + self.private_notes = false + end + end + true + end + + def send_notification + if notify? && (Setting.notified_events.include?('issue_updated') || + (Setting.notified_events.include?('issue_note_added') && notes.present?) || + (Setting.notified_events.include?('issue_status_updated') && new_status.present?) || + (Setting.notified_events.include?('issue_assigned_to_updated') && detail_for_attribute('assigned_to_id').present?) || + (Setting.notified_events.include?('issue_priority_updated') && new_value_for('priority_id').present?) + ) + Mailer.deliver_issue_edit(self) + end + end +end diff --git a/app/models/journal_detail.rb b/app/models/journal_detail.rb new file mode 100644 index 0000000..f901d27 --- /dev/null +++ b/app/models/journal_detail.rb @@ -0,0 +1,50 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class JournalDetail < ActiveRecord::Base + belongs_to :journal + attr_protected :id + + def custom_field + if property == 'cf' + @custom_field ||= CustomField.find_by_id(prop_key) + end + end + + def value=(arg) + write_attribute :value, normalize(arg) + end + + def old_value=(arg) + write_attribute :old_value, normalize(arg) + end + + private + + def normalize(v) + case v + when true + "1" + when false + "0" + when Date + v.strftime("%Y-%m-%d") + else + v + end + end +end diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb new file mode 100755 index 0000000..2390339 --- /dev/null +++ b/app/models/mail_handler.rb @@ -0,0 +1,591 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MailHandler < ActionMailer::Base + include ActionView::Helpers::SanitizeHelper + include Redmine::I18n + + class UnauthorizedAction < StandardError; end + class MissingInformation < StandardError; end + + attr_reader :email, :user, :handler_options + + def self.receive(raw_mail, options={}) + options = options.deep_dup + + options[:issue] ||= {} + + options[:allow_override] ||= [] + if options[:allow_override].is_a?(String) + options[:allow_override] = options[:allow_override].split(',') + end + options[:allow_override].map! {|s| s.strip.downcase.gsub(/\s+/, '_')} + # Project needs to be overridable if not specified + options[:allow_override] << 'project' unless options[:issue].has_key?(:project) + + options[:no_account_notice] = (options[:no_account_notice].to_s == '1') + options[:no_notification] = (options[:no_notification].to_s == '1') + options[:no_permission_check] = (options[:no_permission_check].to_s == '1') + + raw_mail.force_encoding('ASCII-8BIT') + + ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload| + mail = Mail.new(raw_mail) + set_payload_for_mail(payload, mail) + new.receive(mail, options) + end + end + + # Receives an email and rescues any exception + def self.safe_receive(*args) + receive(*args) + rescue Exception => e + Rails.logger.error "MailHandler: an unexpected error occurred when receiving email: #{e.message}" + return false + end + + # Extracts MailHandler options from environment variables + # Use when receiving emails with rake tasks + def self.extract_options_from_env(env) + options = {:issue => {}} + %w(project status tracker category priority assigned_to fixed_version).each do |option| + options[:issue][option.to_sym] = env[option] if env[option] + end + %w(allow_override unknown_user no_permission_check no_account_notice no_notification default_group project_from_subaddress).each do |option| + options[option.to_sym] = env[option] if env[option] + end + if env['private'] + options[:issue][:is_private] = '1' + end + options + end + + def logger + Rails.logger + end + + cattr_accessor :ignored_emails_headers + self.ignored_emails_headers = { + 'Auto-Submitted' => /\Aauto-(replied|generated)/, + 'X-Autoreply' => 'yes' + } + + # Processes incoming emails + # Returns the created object (eg. an issue, a message) or false + def receive(email, options={}) + @email = email + @handler_options = options + sender_email = email.from.to_a.first.to_s.strip + # Ignore emails received from the application emission address to avoid hell cycles + if sender_email.casecmp(Setting.mail_from.to_s.strip) == 0 + if logger + logger.info "MailHandler: ignoring email from Redmine emission address [#{sender_email}]" + end + return false + end + # Ignore auto generated emails + self.class.ignored_emails_headers.each do |key, ignored_value| + value = email.header[key] + if value + value = value.to_s.downcase + if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value + if logger + logger.info "MailHandler: ignoring email with #{key}:#{value} header" + end + return false + end + end + end + @user = User.find_by_mail(sender_email) if sender_email.present? + if @user && !@user.active? + if logger + logger.info "MailHandler: ignoring email from non-active user [#{@user.login}]" + end + return false + end + if @user.nil? + # Email was submitted by an unknown user + case handler_options[:unknown_user] + when 'accept' + @user = User.anonymous + when 'create' + @user = create_user_from_email + if @user + if logger + logger.info "MailHandler: [#{@user.login}] account created" + end + add_user_to_group(handler_options[:default_group]) + unless handler_options[:no_account_notice] + ::Mailer.account_information(@user, @user.password).deliver + end + else + if logger + logger.error "MailHandler: could not create account for [#{sender_email}]" + end + return false + end + else + # Default behaviour, emails from unknown users are ignored + if logger + logger.info "MailHandler: ignoring email from unknown user [#{sender_email}]" + end + return false + end + end + User.current = @user + dispatch + end + + private + + MESSAGE_ID_RE = %r{^ e + # TODO: send a email to the user + logger.error "MailHandler: #{e.message}" if logger + false + rescue MissingInformation => e + logger.error "MailHandler: missing information from #{user}: #{e.message}" if logger + false + rescue UnauthorizedAction => e + logger.error "MailHandler: unauthorized attempt from #{user}" if logger + false + end + + def dispatch_to_default + receive_issue + end + + # Creates a new issue + def receive_issue + project = target_project + # check permission + unless handler_options[:no_permission_check] + raise UnauthorizedAction unless user.allowed_to?(:add_issues, project) + end + + issue = Issue.new(:author => user, :project => project) + attributes = issue_attributes_from_keywords(issue) + if handler_options[:no_permission_check] + issue.tracker_id = attributes['tracker_id'] + if project + issue.tracker_id ||= project.trackers.first.try(:id) + end + end + issue.safe_attributes = attributes + issue.safe_attributes = {'custom_field_values' => custom_field_values_from_keywords(issue)} + issue.subject = cleaned_up_subject + if issue.subject.blank? + issue.subject = '(no subject)' + end + issue.description = cleaned_up_text_body + issue.start_date ||= User.current.today if Setting.default_issue_start_date_to_creation_date? + issue.is_private = (handler_options[:issue][:is_private] == '1') + + # add To and Cc as watchers before saving so the watchers can reply to Redmine + add_watchers(issue) + issue.save! + add_attachments(issue) + logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger + issue + end + + # Adds a note to an existing issue + def receive_issue_reply(issue_id, from_journal=nil) + issue = Issue.find_by_id(issue_id) + return unless issue + # check permission + unless handler_options[:no_permission_check] + unless user.allowed_to?(:add_issue_notes, issue.project) || + user.allowed_to?(:edit_issues, issue.project) + raise UnauthorizedAction + end + end + + # ignore CLI-supplied defaults for new issues + handler_options[:issue].clear + + journal = issue.init_journal(user) + if from_journal && from_journal.private_notes? + # If the received email was a reply to a private note, make the added note private + issue.private_notes = true + end + issue.safe_attributes = issue_attributes_from_keywords(issue) + issue.safe_attributes = {'custom_field_values' => custom_field_values_from_keywords(issue)} + journal.notes = cleaned_up_text_body + + # add To and Cc as watchers before saving so the watchers can reply to Redmine + add_watchers(issue) + issue.save! + add_attachments(issue) + if logger + logger.info "MailHandler: issue ##{issue.id} updated by #{user}" + end + journal + end + + # Reply will be added to the issue + def receive_journal_reply(journal_id) + journal = Journal.find_by_id(journal_id) + if journal && journal.journalized_type == 'Issue' + receive_issue_reply(journal.journalized_id, journal) + end + end + + # Receives a reply to a forum message + def receive_message_reply(message_id) + message = Message.find_by_id(message_id) + if message + message = message.root + + unless handler_options[:no_permission_check] + raise UnauthorizedAction unless user.allowed_to?(:add_messages, message.project) + end + + if !message.locked? + reply = Message.new(:subject => cleaned_up_subject.gsub(%r{^.*msg\d+\]}, '').strip, + :content => cleaned_up_text_body) + reply.author = user + reply.board = message.board + message.children << reply + add_attachments(reply) + reply + else + if logger + logger.info "MailHandler: ignoring reply from [#{email.from.first}] to a locked topic" + end + end + end + end + + def add_attachments(obj) + if email.attachments && email.attachments.any? + email.attachments.each do |attachment| + next unless accept_attachment?(attachment) + next unless attachment.body.decoded.size > 0 + obj.attachments << Attachment.create(:container => obj, + :file => attachment.body.decoded, + :filename => attachment.filename, + :author => user, + :content_type => attachment.mime_type) + end + end + end + + # Returns false if the +attachment+ of the incoming email should be ignored + def accept_attachment?(attachment) + @excluded ||= Setting.mail_handler_excluded_filenames.to_s.split(',').map(&:strip).reject(&:blank?) + @excluded.each do |pattern| + regexp = %r{\A#{Regexp.escape(pattern).gsub("\\*", ".*")}\z}i + if attachment.filename.to_s =~ regexp + logger.info "MailHandler: ignoring attachment #{attachment.filename} matching #{pattern}" + return false + end + end + true + end + + # Adds To and Cc as watchers of the given object if the sender has the + # appropriate permission + def add_watchers(obj) + if handler_options[:no_permission_check] || user.allowed_to?("add_#{obj.class.name.underscore}_watchers".to_sym, obj.project) + addresses = [email.to, email.cc].flatten.compact.uniq.collect {|a| a.strip.downcase} + unless addresses.empty? + users = User.active.having_mail(addresses).to_a + users -= obj.watcher_users + users.each do |u| + obj.add_watcher(u) + end + end + end + end + + def get_keyword(attr, options={}) + @keywords ||= {} + if @keywords.has_key?(attr) + @keywords[attr] + else + @keywords[attr] = begin + override = options.key?(:override) ? + options[:override] : + (handler_options[:allow_override] & [attr.to_s.downcase.gsub(/\s+/, '_'), 'all']).present? + + if override && (v = extract_keyword!(cleaned_up_text_body, attr, options[:format])) + v + elsif !handler_options[:issue][attr].blank? + handler_options[:issue][attr] + end + end + end + end + + # Destructively extracts the value for +attr+ in +text+ + # Returns nil if no matching keyword found + def extract_keyword!(text, attr, format=nil) + keys = [attr.to_s.humanize] + if attr.is_a?(Symbol) + if user && user.language.present? + keys << l("field_#{attr}", :default => '', :locale => user.language) + end + if Setting.default_language.present? + keys << l("field_#{attr}", :default => '', :locale => Setting.default_language) + end + end + keys.reject! {|k| k.blank?} + keys.collect! {|k| Regexp.escape(k)} + format ||= '.+' + keyword = nil + regexp = /^(#{keys.join('|')})[ \t]*:[ \t]*(#{format})\s*$/i + if m = text.match(regexp) + keyword = m[2].strip + text.sub!(regexp, '') + end + keyword + end + + def get_project_from_receiver_addresses + local, domain = handler_options[:project_from_subaddress].to_s.split("@") + return nil unless local && domain + local = Regexp.escape(local) + + [:to, :cc, :bcc].each do |field| + header = @email[field] + next if header.blank? || header.field.blank? || !header.field.respond_to?(:addrs) + header.field.addrs.each do |addr| + if addr.domain.to_s.casecmp(domain)==0 && addr.local.to_s =~ /\A#{local}\+([^+]+)\z/ + if project = Project.find_by_identifier($1) + return project + end + end + end + end + nil + end + + def target_project + # TODO: other ways to specify project: + # * parse the email To field + # * specific project (eg. Setting.mail_handler_target_project) + target = get_project_from_receiver_addresses + target ||= Project.find_by_identifier(get_keyword(:project)) + if target.nil? + # Invalid project keyword, use the project specified as the default one + default_project = handler_options[:issue][:project] + if default_project.present? + target = Project.find_by_identifier(default_project) + end + end + raise MissingInformation.new('Unable to determine target project') if target.nil? + target + end + + # Returns a Hash of issue attributes extracted from keywords in the email body + def issue_attributes_from_keywords(issue) + attrs = { + 'tracker_id' => (k = get_keyword(:tracker)) && issue.project.trackers.named(k).first.try(:id), + 'status_id' => (k = get_keyword(:status)) && IssueStatus.named(k).first.try(:id), + 'priority_id' => (k = get_keyword(:priority)) && IssuePriority.named(k).first.try(:id), + 'category_id' => (k = get_keyword(:category)) && issue.project.issue_categories.named(k).first.try(:id), + 'assigned_to_id' => (k = get_keyword(:assigned_to)) && find_assignee_from_keyword(k, issue).try(:id), + 'fixed_version_id' => (k = get_keyword(:fixed_version)) && issue.project.shared_versions.named(k).first.try(:id), + 'start_date' => get_keyword(:start_date, :format => '\d{4}-\d{2}-\d{2}'), + 'due_date' => get_keyword(:due_date, :format => '\d{4}-\d{2}-\d{2}'), + 'estimated_hours' => get_keyword(:estimated_hours), + 'done_ratio' => get_keyword(:done_ratio, :format => '(\d|10)?0') + }.delete_if {|k, v| v.blank? } + + attrs + end + + # Returns a Hash of issue custom field values extracted from keywords in the email body + def custom_field_values_from_keywords(customized) + customized.custom_field_values.inject({}) do |h, v| + if keyword = get_keyword(v.custom_field.name) + h[v.custom_field.id.to_s] = v.custom_field.value_from_keyword(keyword, customized) + end + h + end + end + + # Returns the text/plain part of the email + # If not found (eg. HTML-only email), returns the body with tags removed + def plain_text_body + return @plain_text_body unless @plain_text_body.nil? + + # check if we have any plain-text parts with content + @plain_text_body = email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/plain'}).presence + + # if not, we try to parse the body from the HTML-parts + @plain_text_body ||= email_parts_to_text(email.all_parts.select {|p| p.mime_type == 'text/html'}).presence + + # If there is still no body found, and there are no mime-parts defined, + # we use the whole raw mail body + @plain_text_body ||= email_parts_to_text([email]).presence if email.all_parts.empty? + + # As a fallback we return an empty plain text body (e.g. if we have only + # empty text parts but a non-text attachment) + @plain_text_body ||= "" + end + + def email_parts_to_text(parts) + parts.reject! do |part| + part.attachment? + end + + parts.map do |p| + body_charset = Mail::RubyVer.respond_to?(:pick_encoding) ? + Mail::RubyVer.pick_encoding(p.charset).to_s : p.charset + + body = Redmine::CodesetUtil.to_utf8(p.body.decoded, body_charset) + # convert html parts to text + p.mime_type == 'text/html' ? self.class.html_body_to_text(body) : self.class.plain_text_body_to_text(body) + end.join("\r\n") + end + + def cleaned_up_text_body + @cleaned_up_text_body ||= cleanup_body(plain_text_body) + end + + def cleaned_up_subject + subject = email.subject.to_s + subject.strip[0,255] + end + + # Converts a HTML email body to text + def self.html_body_to_text(html) + Redmine::WikiFormatting.html_parser.to_text(html) + end + + # Converts a plain/text email body to text + def self.plain_text_body_to_text(text) + # Removes leading spaces that would cause the line to be rendered as + # preformatted text with textile + text.gsub(/^ +(?![*#])/, '') + end + + def self.assign_string_attribute_with_limit(object, attribute, value, limit=nil) + limit ||= object.class.columns_hash[attribute.to_s].limit || 255 + value = value.to_s.slice(0, limit) + object.send("#{attribute}=", value) + end + + # Returns a User from an email address and a full name + def self.new_user_from_attributes(email_address, fullname=nil) + user = User.new + + # Truncating the email address would result in an invalid format + user.mail = email_address + assign_string_attribute_with_limit(user, 'login', email_address, User::LOGIN_LENGTH_LIMIT) + + names = fullname.blank? ? email_address.gsub(/@.*$/, '').split('.') : fullname.split + assign_string_attribute_with_limit(user, 'firstname', names.shift, 30) + assign_string_attribute_with_limit(user, 'lastname', names.join(' '), 30) + user.lastname = '-' if user.lastname.blank? + user.language = Setting.default_language + user.generate_password = true + user.mail_notification = 'only_my_events' + + unless user.valid? + user.login = "user#{Redmine::Utils.random_hex(6)}" unless user.errors[:login].blank? + user.firstname = "-" unless user.errors[:firstname].blank? + (puts user.errors[:lastname];user.lastname = "-") unless user.errors[:lastname].blank? + end + + user + end + + # Creates a User for the +email+ sender + # Returns the user or nil if it could not be created + def create_user_from_email + from = email.header['from'].to_s + addr, name = from, nil + if m = from.match(/^"?(.+?)"?\s+<(.+@.+)>$/) + addr, name = m[2], m[1] + end + if addr.present? + user = self.class.new_user_from_attributes(addr, name) + if handler_options[:no_notification] + user.mail_notification = 'none' + end + if user.save + user + else + logger.error "MailHandler: failed to create User: #{user.errors.full_messages}" if logger + nil + end + else + logger.error "MailHandler: failed to create User: no FROM address found" if logger + nil + end + end + + # Adds the newly created user to default group + def add_user_to_group(default_group) + if default_group.present? + default_group.split(',').each do |group_name| + if group = Group.named(group_name).first + group.users << @user + elsif logger + logger.warn "MailHandler: could not add user to [#{group_name}], group not found" + end + end + end + end + + # Removes the email body of text after the truncation configurations. + def cleanup_body(body) + delimiters = Setting.mail_handler_body_delimiters.to_s.split(/[\r\n]+/).reject(&:blank?) + + if Setting.mail_handler_enable_regex_delimiters? + begin + delimiters = delimiters.map {|s| Regexp.new(s)} + rescue RegexpError => e + logger.error "MailHandler: invalid regexp delimiter found in mail_handler_body_delimiters setting (#{e.message})" if logger + end + end + + unless delimiters.empty? + regex = Regexp.new("^[> ]*(#{ Regexp.union(delimiters) })[[:blank:]]*[\r\n].*", Regexp::MULTILINE) + body = body.gsub(regex, '') + end + body.strip + end + + def find_assignee_from_keyword(keyword, issue) + Principal.detect_by_keyword(issue.assignable_users, keyword) + end +end diff --git a/app/models/mailer.rb b/app/models/mailer.rb new file mode 100644 index 0000000..0c8c55c --- /dev/null +++ b/app/models/mailer.rb @@ -0,0 +1,593 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'roadie' + +class Mailer < ActionMailer::Base + layout 'mailer' + helper :application + helper :issues + helper :custom_fields + + include Redmine::I18n + include Roadie::Rails::Automatic + + def self.default_url_options + options = {:protocol => Setting.protocol} + if Setting.host_name.to_s =~ /\A(https?\:\/\/)?(.+?)(\:(\d+))?(\/.+)?\z/i + host, port, prefix = $2, $4, $5 + options.merge!({ + :host => host, :port => port, :script_name => prefix + }) + else + options[:host] = Setting.host_name + end + options + end + + # Builds a mail for notifying to_users and cc_users about a new issue + def issue_add(issue, to_users, cc_users) + redmine_headers 'Project' => issue.project.identifier, + 'Issue-Id' => issue.id, + 'Issue-Author' => issue.author.login + redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to + message_id issue + references issue + @author = issue.author + @issue = issue + @users = to_users + cc_users + @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue) + mail :to => to_users, + :cc => cc_users, + :subject => "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}" + end + + # Notifies users about a new issue + def self.deliver_issue_add(issue) + to = issue.notified_users + cc = issue.notified_watchers - to + issue.each_notification(to + cc) do |users| + issue_add(issue, to & users, cc & users).deliver + end + end + + # Builds a mail for notifying to_users and cc_users about an issue update + def issue_edit(journal, to_users, cc_users) + issue = journal.journalized + redmine_headers 'Project' => issue.project.identifier, + 'Issue-Id' => issue.id, + 'Issue-Author' => issue.author.login + redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to + message_id journal + references issue + @author = journal.user + s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] " + s << "(#{issue.status.name}) " if journal.new_value_for('status_id') + s << issue.subject + @issue = issue + @users = to_users + cc_users + @journal = journal + @journal_details = journal.visible_details(@users.first) + @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue, :anchor => "change-#{journal.id}") + mail :to => to_users, + :cc => cc_users, + :subject => s + end + + # Notifies users about an issue update + def self.deliver_issue_edit(journal) + issue = journal.journalized.reload + to = journal.notified_users + cc = journal.notified_watchers - to + journal.each_notification(to + cc) do |users| + issue.each_notification(users) do |users2| + issue_edit(journal, to & users2, cc & users2).deliver + end + end + end + + def reminder(user, issues, days) + set_language_if_valid user.language + @issues = issues + @days = days + @issues_url = url_for(:controller => 'issues', :action => 'index', + :set_filter => 1, :assigned_to_id => user.id, + :sort => 'due_date:asc') + mail :to => user, + :subject => l(:mail_subject_reminder, :count => issues.size, :days => days) + end + + # Builds a Mail::Message object used to email users belonging to the added document's project. + # + # Example: + # document_added(document) => Mail::Message object + # Mailer.document_added(document).deliver => sends an email to the document's project recipients + def document_added(document) + redmine_headers 'Project' => document.project.identifier + @author = User.current + @document = document + @document_url = url_for(:controller => 'documents', :action => 'show', :id => document) + mail :to => document.notified_users, + :subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}" + end + + # Builds a Mail::Message object used to email recipients of a project when an attachements are added. + # + # Example: + # attachments_added(attachments) => Mail::Message object + # Mailer.attachments_added(attachments).deliver => sends an email to the project's recipients + def attachments_added(attachments) + container = attachments.first.container + added_to = '' + added_to_url = '' + @author = attachments.first.author + case container.class.name + when 'Project' + added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container) + added_to = "#{l(:label_project)}: #{container}" + recipients = container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)} + when 'Version' + added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container.project) + added_to = "#{l(:label_version)}: #{container.name}" + recipients = container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)} + when 'Document' + added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id) + added_to = "#{l(:label_document)}: #{container.title}" + recipients = container.notified_users + end + redmine_headers 'Project' => container.project.identifier + @attachments = attachments + @added_to = added_to + @added_to_url = added_to_url + mail :to => recipients, + :subject => "[#{container.project.name}] #{l(:label_attachment_new)}" + end + + # Builds a Mail::Message object used to email recipients of a news' project when a news item is added. + # + # Example: + # news_added(news) => Mail::Message object + # Mailer.news_added(news).deliver => sends an email to the news' project recipients + def news_added(news) + redmine_headers 'Project' => news.project.identifier + @author = news.author + message_id news + references news + @news = news + @news_url = url_for(:controller => 'news', :action => 'show', :id => news) + mail :to => news.notified_users, + :cc => news.notified_watchers_for_added_news, + :subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}" + end + + # Builds a Mail::Message object used to email recipients of a news' project when a news comment is added. + # + # Example: + # news_comment_added(comment) => Mail::Message object + # Mailer.news_comment_added(comment) => sends an email to the news' project recipients + def news_comment_added(comment) + news = comment.commented + redmine_headers 'Project' => news.project.identifier + @author = comment.author + message_id comment + references news + @news = news + @comment = comment + @news_url = url_for(:controller => 'news', :action => 'show', :id => news) + mail :to => news.notified_users, + :cc => news.notified_watchers, + :subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}" + end + + # Builds a Mail::Message object used to email the recipients of the specified message that was posted. + # + # Example: + # message_posted(message) => Mail::Message object + # Mailer.message_posted(message).deliver => sends an email to the recipients + def message_posted(message) + redmine_headers 'Project' => message.project.identifier, + 'Topic-Id' => (message.parent_id || message.id) + @author = message.author + message_id message + references message.root + recipients = message.notified_users + cc = ((message.root.notified_watchers + message.board.notified_watchers).uniq - recipients) + @message = message + @message_url = url_for(message.event_url) + mail :to => recipients, + :cc => cc, + :subject => "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}" + end + + # Builds a Mail::Message object used to email the recipients of a project of the specified wiki content was added. + # + # Example: + # wiki_content_added(wiki_content) => Mail::Message object + # Mailer.wiki_content_added(wiki_content).deliver => sends an email to the project's recipients + def wiki_content_added(wiki_content) + redmine_headers 'Project' => wiki_content.project.identifier, + 'Wiki-Page-Id' => wiki_content.page.id + @author = wiki_content.author + message_id wiki_content + recipients = wiki_content.notified_users + cc = wiki_content.page.wiki.notified_watchers - recipients + @wiki_content = wiki_content + @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', + :project_id => wiki_content.project, + :id => wiki_content.page.title) + mail :to => recipients, + :cc => cc, + :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_added, :id => wiki_content.page.pretty_title)}" + end + + # Builds a Mail::Message object used to email the recipients of a project of the specified wiki content was updated. + # + # Example: + # wiki_content_updated(wiki_content) => Mail::Message object + # Mailer.wiki_content_updated(wiki_content).deliver => sends an email to the project's recipients + def wiki_content_updated(wiki_content) + redmine_headers 'Project' => wiki_content.project.identifier, + 'Wiki-Page-Id' => wiki_content.page.id + @author = wiki_content.author + message_id wiki_content + recipients = wiki_content.notified_users + cc = wiki_content.page.wiki.notified_watchers + wiki_content.page.notified_watchers - recipients + @wiki_content = wiki_content + @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', + :project_id => wiki_content.project, + :id => wiki_content.page.title) + @wiki_diff_url = url_for(:controller => 'wiki', :action => 'diff', + :project_id => wiki_content.project, :id => wiki_content.page.title, + :version => wiki_content.version) + mail :to => recipients, + :cc => cc, + :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_updated, :id => wiki_content.page.pretty_title)}" + end + + # Builds a Mail::Message object used to email the specified user their account information. + # + # Example: + # account_information(user, password) => Mail::Message object + # Mailer.account_information(user, password).deliver => sends account information to the user + def account_information(user, password) + set_language_if_valid user.language + @user = user + @password = password + @login_url = url_for(:controller => 'account', :action => 'login') + mail :to => user.mail, + :subject => l(:mail_subject_register, Setting.app_title) + end + + # Builds a Mail::Message object used to email all active administrators of an account activation request. + # + # Example: + # account_activation_request(user) => Mail::Message object + # Mailer.account_activation_request(user).deliver => sends an email to all active administrators + def account_activation_request(user) + # Send the email to all active administrators + recipients = User.active.where(:admin => true) + @user = user + @url = url_for(:controller => 'users', :action => 'index', + :status => User::STATUS_REGISTERED, + :sort_key => 'created_on', :sort_order => 'desc') + mail :to => recipients, + :subject => l(:mail_subject_account_activation_request, Setting.app_title) + end + + # Builds a Mail::Message object used to email the specified user that their account was activated by an administrator. + # + # Example: + # account_activated(user) => Mail::Message object + # Mailer.account_activated(user).deliver => sends an email to the registered user + def account_activated(user) + set_language_if_valid user.language + @user = user + @login_url = url_for(:controller => 'account', :action => 'login') + mail :to => user.mail, + :subject => l(:mail_subject_register, Setting.app_title) + end + + def lost_password(token, recipient=nil) + set_language_if_valid(token.user.language) + recipient ||= token.user.mail + @token = token + @url = url_for(:controller => 'account', :action => 'lost_password', :token => token.value) + mail :to => recipient, + :subject => l(:mail_subject_lost_password, Setting.app_title) + end + + # Notifies user that his password was updated + def self.password_updated(user, options={}) + # Don't send a notification to the dummy email address when changing the password + # of the default admin account which is required after the first login + # TODO: maybe not the best way to handle this + return if user.admin? && user.login == 'admin' && user.mail == 'admin@example.net' + + security_notification(user, + message: :mail_body_password_updated, + title: :button_change_password, + remote_ip: options[:remote_ip], + originator: user, + url: {controller: 'my', action: 'password'} + ).deliver + end + + def register(token) + set_language_if_valid(token.user.language) + @token = token + @url = url_for(:controller => 'account', :action => 'activate', :token => token.value) + mail :to => token.user.mail, + :subject => l(:mail_subject_register, Setting.app_title) + end + + def security_notification(recipients, options={}) + @user = Array(recipients).detect{|r| r.is_a? User } + set_language_if_valid(@user.try :language) + @message = l(options[:message], + field: (options[:field] && l(options[:field])), + value: options[:value] + ) + @title = options[:title] && l(options[:title]) + @originator = options[:originator] || User.current + @remote_ip = options[:remote_ip] || @originator.remote_ip + @url = options[:url] && (options[:url].is_a?(Hash) ? url_for(options[:url]) : options[:url]) + redmine_headers 'Sender' => @originator.login + redmine_headers 'Url' => @url + mail :to => recipients, + :subject => "[#{Setting.app_title}] #{l(:mail_subject_security_notification)}" + end + + def settings_updated(recipients, changes) + redmine_headers 'Sender' => User.current.login + @changes = changes + @url = url_for(controller: 'settings', action: 'index') + mail :to => recipients, + :subject => "[#{Setting.app_title}] #{l(:mail_subject_security_notification)}" + end + + # Notifies admins about settings changes + def self.security_settings_updated(changes) + return unless changes.present? + + users = User.active.where(admin: true).to_a + settings_updated(users, changes).deliver + end + + def test_email(user) + set_language_if_valid(user.language) + @url = url_for(:controller => 'welcome') + mail :to => user.mail, + :subject => 'Redmine test' + end + + # Sends reminders to issue assignees + # Available options: + # * :days => how many days in the future to remind about (defaults to 7) + # * :tracker => id of tracker for filtering issues (defaults to all trackers) + # * :project => id or identifier of project to process (defaults to all projects) + # * :users => array of user/group ids who should be reminded + # * :version => name of target version for filtering issues (defaults to none) + def self.reminders(options={}) + days = options[:days] || 7 + project = options[:project] ? Project.find(options[:project]) : nil + tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil + target_version_id = options[:version] ? Version.named(options[:version]).pluck(:id) : nil + if options[:version] && target_version_id.blank? + raise ActiveRecord::RecordNotFound.new("Couldn't find Version with named #{options[:version]}") + end + user_ids = options[:users] + + scope = Issue.open.where("#{Issue.table_name}.assigned_to_id IS NOT NULL" + + " AND #{Project.table_name}.status = #{Project::STATUS_ACTIVE}" + + " AND #{Issue.table_name}.due_date <= ?", days.day.from_now.to_date + ) + scope = scope.where(:assigned_to_id => user_ids) if user_ids.present? + scope = scope.where(:project_id => project.id) if project + scope = scope.where(:fixed_version_id => target_version_id) if target_version_id.present? + scope = scope.where(:tracker_id => tracker.id) if tracker + issues_by_assignee = scope.includes(:status, :assigned_to, :project, :tracker). + group_by(&:assigned_to) + issues_by_assignee.keys.each do |assignee| + if assignee.is_a?(Group) + assignee.users.each do |user| + issues_by_assignee[user] ||= [] + issues_by_assignee[user] += issues_by_assignee[assignee] + end + end + end + + issues_by_assignee.each do |assignee, issues| + if assignee.is_a?(User) && assignee.active? && issues.present? + visible_issues = issues.select {|i| i.visible?(assignee)} + reminder(assignee, visible_issues, days).deliver if visible_issues.present? + end + end + end + + # Activates/desactivates email deliveries during +block+ + def self.with_deliveries(enabled = true, &block) + was_enabled = ActionMailer::Base.perform_deliveries + ActionMailer::Base.perform_deliveries = !!enabled + yield + ensure + ActionMailer::Base.perform_deliveries = was_enabled + end + + # Sends emails synchronously in the given block + def self.with_synched_deliveries(&block) + saved_method = ActionMailer::Base.delivery_method + if m = saved_method.to_s.match(%r{^async_(.+)$}) + synched_method = m[1] + ActionMailer::Base.delivery_method = synched_method.to_sym + ActionMailer::Base.send "#{synched_method}_settings=", ActionMailer::Base.send("async_#{synched_method}_settings") + end + yield + ensure + ActionMailer::Base.delivery_method = saved_method + end + + def mail(headers={}, &block) + headers.reverse_merge! 'X-Mailer' => 'Redmine', + 'X-Redmine-Host' => Setting.host_name, + 'X-Redmine-Site' => Setting.app_title, + 'X-Auto-Response-Suppress' => 'All', + 'Auto-Submitted' => 'auto-generated', + 'From' => Setting.mail_from, + 'List-Id' => "<#{Setting.mail_from.to_s.gsub('@', '.')}>" + + # Replaces users with their email addresses + [:to, :cc, :bcc].each do |key| + if headers[key].present? + headers[key] = self.class.email_addresses(headers[key]) + end + end + + # Removes the author from the recipients and cc + # if the author does not want to receive notifications + # about what the author do + if @author && @author.logged? && @author.pref.no_self_notified + addresses = @author.mails + headers[:to] -= addresses if headers[:to].is_a?(Array) + headers[:cc] -= addresses if headers[:cc].is_a?(Array) + end + + if @author && @author.logged? + redmine_headers 'Sender' => @author.login + end + + # Blind carbon copy recipients + if Setting.bcc_recipients? + headers[:bcc] = [headers[:to], headers[:cc]].flatten.uniq.reject(&:blank?) + headers[:to] = nil + headers[:cc] = nil + end + + if @message_id_object + headers[:message_id] = "<#{self.class.message_id_for(@message_id_object)}>" + end + if @references_objects + headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o)}>"}.join(' ') + end + + m = if block_given? + super headers, &block + else + super headers do |format| + format.text + format.html unless Setting.plain_text_mail? + end + end + set_language_if_valid @initial_language + + m + end + + def initialize(*args) + @initial_language = current_language + set_language_if_valid Setting.default_language + super + end + + def self.deliver_mail(mail) + return false if mail.to.blank? && mail.cc.blank? && mail.bcc.blank? + begin + # Log errors when raise_delivery_errors is set to false, Rails does not + mail.raise_delivery_errors = true + super + rescue Exception => e + if ActionMailer::Base.raise_delivery_errors + raise e + else + Rails.logger.error "Email delivery error: #{e.message}" + end + end + end + + def self.method_missing(method, *args, &block) + if m = method.to_s.match(%r{^deliver_(.+)$}) + ActiveSupport::Deprecation.warn "Mailer.deliver_#{m[1]}(*args) is deprecated. Use Mailer.#{m[1]}(*args).deliver instead." + send(m[1], *args).deliver + else + super + end + end + + # Returns an array of email addresses to notify by + # replacing users in arg with their notified email addresses + # + # Example: + # Mailer.email_addresses(users) + # => ["foo@example.net", "bar@example.net"] + def self.email_addresses(arg) + arr = Array.wrap(arg) + mails = arr.reject {|a| a.is_a? Principal} + users = arr - mails + if users.any? + mails += EmailAddress. + where(:user_id => users.map(&:id)). + where("is_default = ? OR notify = ?", true, true). + pluck(:address) + end + mails + end + + private + + # Appends a Redmine header field (name is prepended with 'X-Redmine-') + def redmine_headers(h) + h.each { |k,v| headers["X-Redmine-#{k}"] = v.to_s } + end + + def self.token_for(object, rand=true) + timestamp = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on) + hash = [ + "redmine", + "#{object.class.name.demodulize.underscore}-#{object.id}", + timestamp.strftime("%Y%m%d%H%M%S") + ] + if rand + hash << Redmine::Utils.random_hex(8) + end + host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '') + host = "#{::Socket.gethostname}.redmine" if host.empty? + "#{hash.join('.')}@#{host}" + end + + # Returns a Message-Id for the given object + def self.message_id_for(object) + token_for(object, true) + end + + # Returns a uniq token for a given object referenced by all notifications + # related to this object + def self.references_for(object) + token_for(object, false) + end + + def message_id(object) + @message_id_object = object + end + + def references(object) + @references_objects ||= [] + @references_objects << object + end + + def mylogger + Rails.logger + end +end diff --git a/app/models/member.rb b/app/models/member.rb new file mode 100644 index 0000000..0e8fb1d --- /dev/null +++ b/app/models/member.rb @@ -0,0 +1,219 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Member < ActiveRecord::Base + belongs_to :user + belongs_to :principal, :foreign_key => 'user_id' + has_many :member_roles, :dependent => :destroy + has_many :roles, lambda { distinct }, :through => :member_roles + belongs_to :project + + validates_presence_of :principal, :project + validates_uniqueness_of :user_id, :scope => :project_id + validate :validate_role + attr_protected :id + + before_destroy :set_issue_category_nil, :remove_from_project_default_assigned_to + + scope :active, lambda { joins(:principal).where(:users => {:status => Principal::STATUS_ACTIVE})} + + # Sort by first role and principal + scope :sorted, lambda { + includes(:member_roles, :roles, :principal). + reorder("#{Role.table_name}.position"). + order(Principal.fields_for_order_statement) + } + scope :sorted_by_project, lambda { + includes(:project). + reorder("#{Project.table_name}.lft") + } + + alias :base_reload :reload + def reload(*args) + @managed_roles = nil + base_reload(*args) + end + + def role + end + + def role= + end + + def name + self.user.name + end + + alias :base_role_ids= :role_ids= + def role_ids=(arg) + ids = (arg || []).collect(&:to_i) - [0] + # Keep inherited roles + ids += member_roles.select {|mr| !mr.inherited_from.nil?}.collect(&:role_id) + + new_role_ids = ids - role_ids + # Add new roles + new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id, :member => self) } + # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy) + member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)} + if member_roles_to_destroy.any? + member_roles_to_destroy.each(&:destroy) + end + end + + def <=>(member) + a, b = roles.sort, member.roles.sort + if a == b + if principal + principal <=> member.principal + else + 1 + end + elsif a.any? + b.any? ? a <=> b : -1 + else + 1 + end + end + + # Set member role ids ignoring any change to roles that + # user is not allowed to manage + def set_editable_role_ids(ids, user=User.current) + ids = (ids || []).collect(&:to_i) - [0] + editable_role_ids = user.managed_roles(project).map(&:id) + untouched_role_ids = self.role_ids - editable_role_ids + touched_role_ids = ids & editable_role_ids + self.role_ids = untouched_role_ids + touched_role_ids + end + + # Returns true if one of the member roles is inherited + def any_inherited_role? + member_roles.any? {|mr| mr.inherited_from} + end + + # Returns true if the member has the role and if it's inherited + def has_inherited_role?(role) + member_roles.any? {|mr| mr.role_id == role.id && mr.inherited_from.present?} + end + + # Returns true if the member's role is editable by user + def role_editable?(role, user=User.current) + if has_inherited_role?(role) + false + else + user.managed_roles(project).include?(role) + end + end + + # Returns true if the member is deletable by user + def deletable?(user=User.current) + if any_inherited_role? + false + else + roles & user.managed_roles(project) == roles + end + end + + # Destroys the member + def destroy + member_roles.reload.each(&:destroy_without_member_removal) + super + end + + # Returns true if the member is user or is a group + # that includes user + def include?(user) + if principal.is_a?(Group) + !user.nil? && user.groups.include?(principal) + else + self.principal == user + end + end + + def set_issue_category_nil + if user_id && project_id + # remove category based auto assignments for this member + IssueCategory.where(["project_id = ? AND assigned_to_id = ?", project_id, user_id]). + update_all("assigned_to_id = NULL") + end + end + + def remove_from_project_default_assigned_to + if user_id && project && project.default_assigned_to_id == user_id + # remove project based auto assignments for this member + project.update_column(:default_assigned_to_id, nil) + end + end + + # Returns the roles that the member is allowed to manage + # in the project the member belongs to + def managed_roles + @managed_roles ||= begin + if principal.try(:admin?) + Role.givable.to_a + else + members_management_roles = roles.select do |role| + role.has_permission?(:manage_members) + end + if members_management_roles.empty? + [] + elsif members_management_roles.any?(&:all_roles_managed?) + Role.givable.to_a + else + members_management_roles.map(&:managed_roles).reduce(&:|) + end + end + end + end + + # Creates memberships for principal with the attributes, or add the roles + # if the membership already exists. + # * project_ids : one or more project ids + # * role_ids : ids of the roles to give to each membership + # + # Example: + # Member.create_principal_memberships(user, :project_ids => [2, 5], :role_ids => [1, 3] + def self.create_principal_memberships(principal, attributes) + members = [] + if attributes + project_ids = Array.wrap(attributes[:project_ids] || attributes[:project_id]) + role_ids = Array.wrap(attributes[:role_ids]) + project_ids.each do |project_id| + member = Member.find_or_new(project_id, principal) + member.role_ids |= role_ids + member.save + members << member + end + end + members + end + + # Finds or initializes a Member for the given project and principal + def self.find_or_new(project, principal) + project_id = project.is_a?(Project) ? project.id : project + principal_id = principal.is_a?(Principal) ? principal.id : principal + + member = Member.find_by_project_id_and_user_id(project_id, principal_id) + member ||= Member.new(:project_id => project_id, :user_id => principal_id) + member + end + + protected + + def validate_role + errors.add(:role, :empty) if member_roles.empty? && roles.empty? + end +end diff --git a/app/models/member_role.rb b/app/models/member_role.rb new file mode 100644 index 0000000..5084759 --- /dev/null +++ b/app/models/member_role.rb @@ -0,0 +1,77 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MemberRole < ActiveRecord::Base + belongs_to :member + belongs_to :role + + after_destroy :remove_member_if_empty + + after_create :add_role_to_group_users, :add_role_to_subprojects + after_destroy :remove_inherited_roles + + validates_presence_of :role + validate :validate_role_member + attr_protected :id + + def validate_role_member + errors.add :role_id, :invalid if role && !role.member? + end + + def inherited? + !inherited_from.nil? + end + + # Destroys the MemberRole without destroying its Member if it doesn't have + # any other roles + def destroy_without_member_removal + @member_removal = false + destroy + end + + private + + def remove_member_if_empty + if @member_removal != false && member.roles.empty? + member.destroy + end + end + + def add_role_to_group_users + if member.principal.is_a?(Group) && !inherited? + member.principal.users.each do |user| + user_member = Member.find_or_new(member.project_id, user.id) + user_member.member_roles << MemberRole.new(:role => role, :inherited_from => id) + user_member.save! + end + end + end + + def add_role_to_subprojects + member.project.children.each do |subproject| + if subproject.inherit_members? + child_member = Member.find_or_new(subproject.id, member.user_id) + child_member.member_roles << MemberRole.new(:role => role, :inherited_from => id) + child_member.save! + end + end + end + + def remove_inherited_roles + MemberRole.where(:inherited_from => id).destroy_all + end +end diff --git a/app/models/message.rb b/app/models/message.rb new file mode 100644 index 0000000..65ae314 --- /dev/null +++ b/app/models/message.rb @@ -0,0 +1,121 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Message < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :board + belongs_to :author, :class_name => 'User' + acts_as_tree :counter_cache => :replies_count, :order => "#{Message.table_name}.created_on ASC" + acts_as_attachable + belongs_to :last_reply, :class_name => 'Message' + attr_protected :id + + acts_as_searchable :columns => ['subject', 'content'], + :preload => {:board => :project}, + :project_key => "#{Board.table_name}.project_id" + + acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"}, + :description => :content, + :group => :parent, + :type => Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'}, + :url => Proc.new {|o| {:controller => 'messages', :action => 'show', :board_id => o.board_id}.merge(o.parent_id.nil? ? {:id => o.id} : + {:id => o.parent_id, :r => o.id, :anchor => "message-#{o.id}"})} + + acts_as_activity_provider :scope => preload({:board => :project}, :author), + :author_key => :author_id + acts_as_watchable + + validates_presence_of :board, :subject, :content + validates_length_of :subject, :maximum => 255 + validate :cannot_reply_to_locked_topic, :on => :create + + after_create :add_author_as_watcher, :reset_counters! + after_update :update_messages_board + after_destroy :reset_counters! + after_create :send_notification + + scope :visible, lambda {|*args| + joins(:board => :project). + where(Project.allowed_to_condition(args.shift || User.current, :view_messages, *args)) + } + + safe_attributes 'subject', 'content' + safe_attributes 'locked', 'sticky', 'board_id', + :if => lambda {|message, user| + user.allowed_to?(:edit_messages, message.project) + } + + def visible?(user=User.current) + !user.nil? && user.allowed_to?(:view_messages, project) + end + + def cannot_reply_to_locked_topic + # Can not reply to a locked topic + errors.add :base, 'Topic is locked' if root.locked? && self != root + end + + def update_messages_board + if board_id_changed? + Message.where(["id = ? OR parent_id = ?", root.id, root.id]).update_all({:board_id => board_id}) + Board.reset_counters!(board_id_was) + Board.reset_counters!(board_id) + end + end + + def reset_counters! + if parent && parent.id + Message.where({:id => parent.id}).update_all({:last_reply_id => parent.children.maximum(:id)}) + end + board.reset_counters! + end + + def sticky=(arg) + write_attribute :sticky, (arg == true || arg.to_s == '1' ? 1 : 0) + end + + def sticky? + sticky == 1 + end + + def project + board.project + end + + def editable_by?(usr) + usr && usr.logged? && (usr.allowed_to?(:edit_messages, project) || (self.author == usr && usr.allowed_to?(:edit_own_messages, project))) + end + + def destroyable_by?(usr) + usr && usr.logged? && (usr.allowed_to?(:delete_messages, project) || (self.author == usr && usr.allowed_to?(:delete_own_messages, project))) + end + + def notified_users + project.notified_users.reject {|user| !visible?(user)} + end + + private + + def add_author_as_watcher + Watcher.create(:watchable => self.root, :user => author) + end + + def send_notification + if Setting.notified_events.include?('message_posted') + Mailer.message_posted(self).deliver + end + end +end diff --git a/app/models/news.rb b/app/models/news.rb new file mode 100644 index 0000000..7d900d3 --- /dev/null +++ b/app/models/news.rb @@ -0,0 +1,98 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class News < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :project + belongs_to :author, :class_name => 'User' + has_many :comments, lambda {order("created_on")}, :as => :commented, :dependent => :delete_all + + validates_presence_of :title, :description + validates_length_of :title, :maximum => 60 + validates_length_of :summary, :maximum => 255 + attr_protected :id + + acts_as_attachable :edit_permission => :manage_news, + :delete_permission => :manage_news + acts_as_searchable :columns => ['title', 'summary', "#{table_name}.description"], + :preload => :project + acts_as_event :url => Proc.new {|o| {:controller => 'news', :action => 'show', :id => o.id}} + acts_as_activity_provider :scope => preload(:project, :author), + :author_key => :author_id + acts_as_watchable + + after_create :add_author_as_watcher + after_create :send_notification + + scope :visible, lambda {|*args| + joins(:project). + where(Project.allowed_to_condition(args.shift || User.current, :view_news, *args)) + } + + safe_attributes 'title', 'summary', 'description' + + def visible?(user=User.current) + !user.nil? && user.allowed_to?(:view_news, project) + end + + # Returns true if the news can be commented by user + def commentable?(user=User.current) + user.allowed_to?(:comment_news, project) + end + + def notified_users + project.users.select {|user| user.notify_about?(self) && user.allowed_to?(:view_news, project)} + end + + def recipients + notified_users.map(&:mail) + end + + # Returns the users that should be cc'd when a new news is added + def notified_watchers_for_added_news + watchers = [] + if m = project.enabled_module('news') + watchers = m.notified_watchers + unless project.is_public? + watchers = watchers.select {|user| project.users.include?(user)} + end + end + watchers + end + + # Returns the email addresses that should be cc'd when a new news is added + def cc_for_added_news + notified_watchers_for_added_news.map(&:mail) + end + + # returns latest news for projects visible by user + def self.latest(user = User.current, count = 5) + visible(user).preload(:author, :project).order("#{News.table_name}.created_on DESC").limit(count).to_a + end + + private + + def add_author_as_watcher + Watcher.create(:watchable => self, :user => author) + end + + def send_notification + if Setting.notified_events.include?('news_added') + Mailer.news_added(self).deliver + end + end +end diff --git a/app/models/principal.rb b/app/models/principal.rb new file mode 100644 index 0000000..e4410dd --- /dev/null +++ b/app/models/principal.rb @@ -0,0 +1,209 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Principal < ActiveRecord::Base + self.table_name = "#{table_name_prefix}users#{table_name_suffix}" + + # Account statuses + STATUS_ANONYMOUS = 0 + STATUS_ACTIVE = 1 + STATUS_REGISTERED = 2 + STATUS_LOCKED = 3 + + class_attribute :valid_statuses + + has_many :members, :foreign_key => 'user_id', :dependent => :destroy + has_many :memberships, + lambda {joins(:project).where.not(:projects => {:status => Project::STATUS_ARCHIVED})}, + :class_name => 'Member', + :foreign_key => 'user_id' + has_many :projects, :through => :memberships + has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify + + validate :validate_status + + # Groups and active users + scope :active, lambda { where(:status => STATUS_ACTIVE) } + + scope :visible, lambda {|*args| + user = args.first || User.current + + if user.admin? + all + else + view_all_active = false + if user.memberships.to_a.any? + view_all_active = user.memberships.any? {|m| m.roles.any? {|r| r.users_visibility == 'all'}} + else + view_all_active = user.builtin_role.users_visibility == 'all' + end + + if view_all_active + active + else + # self and members of visible projects + active.where("#{table_name}.id = ? OR #{table_name}.id IN (SELECT user_id FROM #{Member.table_name} WHERE project_id IN (?))", + user.id, user.visible_project_ids + ) + end + end + } + + scope :like, lambda {|q| + q = q.to_s + if q.blank? + where({}) + else + pattern = "%#{q}%" + sql = %w(login firstname lastname).map {|column| "LOWER(#{table_name}.#{column}) LIKE LOWER(:p)"}.join(" OR ") + sql << " OR #{table_name}.id IN (SELECT user_id FROM #{EmailAddress.table_name} WHERE LOWER(address) LIKE LOWER(:p))" + params = {:p => pattern} + if q =~ /^(.+)\s+(.+)$/ + a, b = "#{$1}%", "#{$2}%" + sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:a) AND LOWER(#{table_name}.lastname) LIKE LOWER(:b))" + sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:b) AND LOWER(#{table_name}.lastname) LIKE LOWER(:a))" + params.merge!(:a => a, :b => b) + end + where(sql, params) + end + } + + # Principals that are members of a collection of projects + scope :member_of, lambda {|projects| + projects = [projects] if projects.is_a?(Project) + if projects.blank? + where("1=0") + else + ids = projects.map(&:id) + active.where("#{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) + end + } + # Principals that are not members of projects + scope :not_member_of, lambda {|projects| + projects = [projects] unless projects.is_a?(Array) + if projects.empty? + where("1=0") + else + ids = projects.map(&:id) + where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) + end + } + scope :sorted, lambda { order(*Principal.fields_for_order_statement)} + + before_create :set_default_empty_values + before_destroy :nullify_projects_default_assigned_to + + def reload(*args) + @project_ids = nil + super + end + + def name(formatter = nil) + to_s + end + + def mail=(*args) + nil + end + + def mail + nil + end + + def visible?(user=User.current) + Principal.visible(user).where(:id => id).first == self + end + + # Returns true if the principal is a member of project + def member_of?(project) + project.is_a?(Project) && project_ids.include?(project.id) + end + + # Returns an array of the project ids that the principal is a member of + def project_ids + @project_ids ||= super.freeze + end + + def <=>(principal) + if principal.nil? + -1 + elsif self.class.name == principal.class.name + self.to_s.casecmp(principal.to_s) + else + # groups after users + principal.class.name <=> self.class.name + end + end + + # Returns an array of fields names than can be used to make an order statement for principals. + # Users are sorted before Groups. + # Examples: + def self.fields_for_order_statement(table=nil) + table ||= table_name + columns = ['type DESC'] + (User.name_formatter[:order] - ['id']) + ['lastname', 'id'] + columns.uniq.map {|field| "#{table}.#{field}"} + end + + # Returns the principal that matches the keyword among principals + def self.detect_by_keyword(principals, keyword) + keyword = keyword.to_s + return nil if keyword.blank? + + principal = nil + principal ||= principals.detect {|a| keyword.casecmp(a.login.to_s) == 0} + principal ||= principals.detect {|a| keyword.casecmp(a.mail.to_s) == 0} + + if principal.nil? && keyword.match(/ /) + firstname, lastname = *(keyword.split) # "First Last Throwaway" + principal ||= principals.detect {|a| + a.is_a?(User) && + firstname.casecmp(a.firstname.to_s) == 0 && + lastname.casecmp(a.lastname.to_s) == 0 + } + end + if principal.nil? + principal ||= principals.detect {|a| keyword.casecmp(a.name) == 0} + end + principal + end + + def nullify_projects_default_assigned_to + Project.where(default_assigned_to: self).update_all(default_assigned_to_id: nil) + end + + protected + + # Make sure we don't try to insert NULL values (see #4632) + def set_default_empty_values + self.login ||= '' + self.hashed_password ||= '' + self.firstname ||= '' + self.lastname ||= '' + true + end + + def validate_status + if status_changed? && self.class.valid_statuses.present? + unless self.class.valid_statuses.include?(status) + errors.add :status, :invalid + end + end + end +end + +require_dependency "user" +require_dependency "group" diff --git a/app/models/project.rb b/app/models/project.rb new file mode 100644 index 0000000..63eaf00 --- /dev/null +++ b/app/models/project.rb @@ -0,0 +1,1125 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Project < ActiveRecord::Base + include Redmine::SafeAttributes + include Redmine::NestedSet::ProjectNestedSet + + # Project statuses + STATUS_ACTIVE = 1 + STATUS_CLOSED = 5 + STATUS_ARCHIVED = 9 + + # Maximum length for project identifiers + IDENTIFIER_MAX_LENGTH = 100 + + # Specific overridden Activities + has_many :time_entry_activities + has_many :memberships, :class_name => 'Member', :inverse_of => :project + # Memberships of active users only + has_many :members, + lambda { joins(:principal).where(:users => {:type => 'User', :status => Principal::STATUS_ACTIVE}) } + has_many :enabled_modules, :dependent => :delete_all + has_and_belongs_to_many :trackers, lambda {order(:position)} + has_many :issues, :dependent => :destroy + has_many :issue_changes, :through => :issues, :source => :journals + has_many :versions, :dependent => :destroy + belongs_to :default_version, :class_name => 'Version' + belongs_to :default_assigned_to, :class_name => 'Principal' + has_many :time_entries, :dependent => :destroy + has_many :queries, :dependent => :delete_all + has_many :documents, :dependent => :destroy + has_many :news, lambda {includes(:author)}, :dependent => :destroy + has_many :issue_categories, lambda {order(:name)}, :dependent => :delete_all + has_many :boards, lambda {order(:position)}, :inverse_of => :project, :dependent => :destroy + has_one :repository, lambda {where(:is_default => true)} + has_many :repositories, :dependent => :destroy + has_many :changesets, :through => :repository + has_one :wiki, :dependent => :destroy + # Custom field for the project issues + has_and_belongs_to_many :issue_custom_fields, + lambda {order(:position)}, + :class_name => 'IssueCustomField', + :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", + :association_foreign_key => 'custom_field_id' + + acts_as_attachable :view_permission => :view_files, + :edit_permission => :manage_files, + :delete_permission => :manage_files + + acts_as_customizable + acts_as_searchable :columns => ['name', 'identifier', 'description'], :project_key => "#{Project.table_name}.id", :permission => nil + acts_as_event :title => Proc.new {|o| "#{l(:label_project)}: #{o.name}"}, + :url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o}}, + :author => nil + + attr_protected :status + + validates_presence_of :name, :identifier + validates_uniqueness_of :identifier, :if => Proc.new {|p| p.identifier_changed?} + validates_length_of :name, :maximum => 255 + validates_length_of :homepage, :maximum => 255 + validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH + # downcase letters, digits, dashes but not digits only + validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :if => Proc.new { |p| p.identifier_changed? } + # reserved words + validates_exclusion_of :identifier, :in => %w( new ) + validate :validate_parent + + after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?} + after_save :remove_inherited_member_roles, :add_inherited_member_roles, :if => Proc.new {|project| project.parent_id_changed?} + after_update :update_versions_from_hierarchy_change, :if => Proc.new {|project| project.parent_id_changed?} + before_destroy :delete_all_members + + scope :has_module, lambda {|mod| + where("#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s) + } + scope :active, lambda { where(:status => STATUS_ACTIVE) } + scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) } + scope :all_public, lambda { where(:is_public => true) } + scope :visible, lambda {|*args| where(Project.visible_condition(args.shift || User.current, *args)) } + scope :allowed_to, lambda {|*args| + user = User.current + permission = nil + if args.first.is_a?(Symbol) + permission = args.shift + else + user = args.shift + permission = args.shift + end + where(Project.allowed_to_condition(user, permission, *args)) + } + scope :like, lambda {|arg| + if arg.present? + pattern = "%#{arg.to_s.strip}%" + where("LOWER(identifier) LIKE LOWER(:p) OR LOWER(name) LIKE LOWER(:p)", :p => pattern) + end + } + scope :sorted, lambda {order(:lft)} + scope :having_trackers, lambda { + where("#{Project.table_name}.id IN (SELECT DISTINCT project_id FROM #{table_name_prefix}projects_trackers#{table_name_suffix})") + } + + def initialize(attributes=nil, *args) + super + + initialized = (attributes || {}).stringify_keys + if !initialized.key?('identifier') && Setting.sequential_project_identifiers? + self.identifier = Project.next_identifier + end + if !initialized.key?('is_public') + self.is_public = Setting.default_projects_public? + end + if !initialized.key?('enabled_module_names') + self.enabled_module_names = Setting.default_projects_modules + end + if !initialized.key?('trackers') && !initialized.key?('tracker_ids') + default = Setting.default_projects_tracker_ids + if default.is_a?(Array) + self.trackers = Tracker.where(:id => default.map(&:to_i)).sorted.to_a + else + self.trackers = Tracker.sorted.to_a + end + end + end + + def identifier=(identifier) + super unless identifier_frozen? + end + + def identifier_frozen? + errors[:identifier].blank? && !(new_record? || identifier.blank?) + end + + # returns latest created projects + # non public projects will be returned only if user is a member of those + def self.latest(user=nil, count=5) + visible(user).limit(count). + order(:created_on => :desc). + where("#{table_name}.created_on >= ?", 30.days.ago). + to_a + end + + # Returns true if the project is visible to +user+ or to the current user. + def visible?(user=User.current) + user.allowed_to?(:view_project, self) + end + + # Returns a SQL conditions string used to find all projects visible by the specified user. + # + # Examples: + # Project.visible_condition(admin) => "projects.status = 1" + # Project.visible_condition(normal_user) => "((projects.status = 1) AND (projects.is_public = 1 OR projects.id IN (1,3,4)))" + # Project.visible_condition(anonymous) => "((projects.status = 1) AND (projects.is_public = 1))" + def self.visible_condition(user, options={}) + allowed_to_condition(user, :view_project, options) + end + + # Returns a SQL conditions string used to find all projects for which +user+ has the given +permission+ + # + # Valid options: + # * :skip_pre_condition => true don't check that the module is enabled (eg. when the condition is already set elsewhere in the query) + # * :project => project limit the condition to project + # * :with_subprojects => true limit the condition to project and its subprojects + # * :member => true limit the condition to the user projects + def self.allowed_to_condition(user, permission, options={}) + perm = Redmine::AccessControl.permission(permission) + base_statement = (perm && perm.read? ? "#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED}" : "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}") + if !options[:skip_pre_condition] && perm && perm.project_module + # If the permission belongs to a project module, make sure the module is enabled + base_statement << " AND EXISTS (SELECT 1 AS one FROM #{EnabledModule.table_name} em WHERE em.project_id = #{Project.table_name}.id AND em.name='#{perm.project_module}')" + end + if project = options[:project] + project_statement = project.project_condition(options[:with_subprojects]) + base_statement = "(#{project_statement}) AND (#{base_statement})" + end + + if user.admin? + base_statement + else + statement_by_role = {} + unless options[:member] + role = user.builtin_role + if role.allowed_to?(permission) + s = "#{Project.table_name}.is_public = #{connection.quoted_true}" + if user.id + group = role.anonymous? ? Group.anonymous : Group.non_member + principal_ids = [user.id, group.id].compact + s = "(#{s} AND #{Project.table_name}.id NOT IN (SELECT project_id FROM #{Member.table_name} WHERE user_id IN (#{principal_ids.join(',')})))" + end + statement_by_role[role] = s + end + end + user.project_ids_by_role.each do |role, project_ids| + if role.allowed_to?(permission) && project_ids.any? + statement_by_role[role] = "#{Project.table_name}.id IN (#{project_ids.join(',')})" + end + end + if statement_by_role.empty? + "1=0" + else + if block_given? + statement_by_role.each do |role, statement| + if s = yield(role, user) + statement_by_role[role] = "(#{statement} AND (#{s}))" + end + end + end + "((#{base_statement}) AND (#{statement_by_role.values.join(' OR ')}))" + end + end + end + + def override_roles(role) + @override_members ||= memberships. + joins(:principal). + where(:users => {:type => ['GroupAnonymous', 'GroupNonMember']}).to_a + + group_class = role.anonymous? ? GroupAnonymous : GroupNonMember + member = @override_members.detect {|m| m.principal.is_a? group_class} + member ? member.roles.to_a : [role] + end + + def principals + @principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct + end + + def users + @users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct + end + + # Returns the Systemwide and project specific activities + def activities(include_inactive=false) + t = TimeEntryActivity.table_name + scope = TimeEntryActivity.where("#{t}.project_id IS NULL OR #{t}.project_id = ?", id) + + overridden_activity_ids = self.time_entry_activities.pluck(:parent_id).compact + if overridden_activity_ids.any? + scope = scope.where("#{t}.id NOT IN (?)", overridden_activity_ids) + end + unless include_inactive + scope = scope.active + end + scope + end + + # Will create a new Project specific Activity or update an existing one + # + # This will raise a ActiveRecord::Rollback if the TimeEntryActivity + # does not successfully save. + def update_or_create_time_entry_activity(id, activity_hash) + if activity_hash.respond_to?(:has_key?) && activity_hash.has_key?('parent_id') + self.create_time_entry_activity_if_needed(activity_hash) + else + activity = project.time_entry_activities.find_by_id(id.to_i) + activity.update_attributes(activity_hash) if activity + end + end + + # Create a new TimeEntryActivity if it overrides a system TimeEntryActivity + # + # This will raise a ActiveRecord::Rollback if the TimeEntryActivity + # does not successfully save. + def create_time_entry_activity_if_needed(activity) + if activity['parent_id'] + parent_activity = TimeEntryActivity.find(activity['parent_id']) + activity['name'] = parent_activity.name + activity['position'] = parent_activity.position + if Enumeration.overriding_change?(activity, parent_activity) + project_activity = self.time_entry_activities.create(activity) + if project_activity.new_record? + raise ActiveRecord::Rollback, "Overriding TimeEntryActivity was not successfully saved" + else + self.time_entries. + where(:activity_id => parent_activity.id). + update_all(:activity_id => project_activity.id) + end + end + end + end + + # Returns a :conditions SQL string that can be used to find the issues associated with this project. + # + # Examples: + # project.project_condition(true) => "(projects.id = 1 OR (projects.lft > 1 AND projects.rgt < 10))" + # project.project_condition(false) => "projects.id = 1" + def project_condition(with_subprojects) + cond = "#{Project.table_name}.id = #{id}" + cond = "(#{cond} OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt}))" if with_subprojects + cond + end + + def self.find(*args) + if args.first && args.first.is_a?(String) && !args.first.match(/^\d*$/) + project = find_by_identifier(*args) + raise ActiveRecord::RecordNotFound, "Couldn't find Project with identifier=#{args.first}" if project.nil? + project + else + super + end + end + + def self.find_by_param(*args) + self.find(*args) + end + + alias :base_reload :reload + def reload(*args) + @principals = nil + @users = nil + @shared_versions = nil + @rolled_up_versions = nil + @rolled_up_trackers = nil + @rolled_up_statuses = nil + @rolled_up_custom_fields = nil + @all_issue_custom_fields = nil + @all_time_entry_custom_fields = nil + @to_param = nil + @allowed_parents = nil + @allowed_permissions = nil + @actions_allowed = nil + @start_date = nil + @due_date = nil + @override_members = nil + @assignable_users = nil + base_reload(*args) + end + + def to_param + if new_record? + nil + else + # id is used for projects with a numeric identifier (compatibility) + @to_param ||= (identifier.to_s =~ %r{^\d*$} ? id.to_s : identifier) + end + end + + def active? + self.status == STATUS_ACTIVE + end + + def closed? + self.status == STATUS_CLOSED + end + + def archived? + self.status == STATUS_ARCHIVED + end + + # Archives the project and its descendants + def archive + # Check that there is no issue of a non descendant project that is assigned + # to one of the project or descendant versions + version_ids = self_and_descendants.joins(:versions).pluck("#{Version.table_name}.id") + + if version_ids.any? && + Issue. + joins(:project). + where("#{Project.table_name}.lft < ? OR #{Project.table_name}.rgt > ?", lft, rgt). + where(:fixed_version_id => version_ids). + exists? + return false + end + Project.transaction do + archive! + end + true + end + + # Unarchives the project + # All its ancestors must be active + def unarchive + return false if ancestors.detect {|a| a.archived?} + new_status = STATUS_ACTIVE + if parent + new_status = parent.status + end + update_attribute :status, new_status + end + + def close + self_and_descendants.status(STATUS_ACTIVE).update_all :status => STATUS_CLOSED + end + + def reopen + self_and_descendants.status(STATUS_CLOSED).update_all :status => STATUS_ACTIVE + end + + # Returns an array of projects the project can be moved to + # by the current user + def allowed_parents(user=User.current) + return @allowed_parents if @allowed_parents + @allowed_parents = Project.allowed_to(user, :add_subprojects).to_a + @allowed_parents = @allowed_parents - self_and_descendants + if user.allowed_to?(:add_project, nil, :global => true) || (!new_record? && parent.nil?) + @allowed_parents << nil + end + unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent) + @allowed_parents << parent + end + @allowed_parents + end + + # Sets the parent of the project with authorization check + def set_allowed_parent!(p) + ActiveSupport::Deprecation.warn "Project#set_allowed_parent! is deprecated and will be removed in Redmine 4, use #safe_attributes= instead." + p = p.id if p.is_a?(Project) + send :safe_attributes, {:project_id => p} + save + end + + # Sets the parent of the project and saves the project + # Argument can be either a Project, a String, a Fixnum or nil + def set_parent!(p) + if p.is_a?(Project) + self.parent = p + else + self.parent_id = p + end + save + end + + # Returns a scope of the trackers used by the project and its active sub projects + def rolled_up_trackers(include_subprojects=true) + if include_subprojects + @rolled_up_trackers ||= rolled_up_trackers_base_scope. + where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ?", lft, rgt) + else + rolled_up_trackers_base_scope. + where(:projects => {:id => id}) + end + end + + def rolled_up_trackers_base_scope + Tracker. + joins(projects: :enabled_modules). + where("#{Project.table_name}.status <> ?", STATUS_ARCHIVED). + where(:enabled_modules => {:name => 'issue_tracking'}). + distinct. + sorted + end + + def rolled_up_statuses + issue_status_ids = WorkflowTransition. + where(:tracker_id => rolled_up_trackers.map(&:id)). + distinct. + pluck(:old_status_id, :new_status_id). + flatten. + uniq + + IssueStatus.where(:id => issue_status_ids).sorted + end + + # Closes open and locked project versions that are completed + def close_completed_versions + Version.transaction do + versions.where(:status => %w(open locked)).each do |version| + if version.completed? + version.update_attribute(:status, 'closed') + end + end + end + end + + # Returns a scope of the Versions on subprojects + def rolled_up_versions + @rolled_up_versions ||= + Version. + joins(:project). + where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED) + end + + # Returns a scope of the Versions used by the project + def shared_versions + if new_record? + Version. + joins(:project). + preload(:project). + where("#{Project.table_name}.status <> ? AND #{Version.table_name}.sharing = 'system'", STATUS_ARCHIVED) + else + @shared_versions ||= begin + r = root? ? self : root + Version. + joins(:project). + preload(:project). + where("#{Project.table_name}.id = #{id}" + + " OR (#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND (" + + " #{Version.table_name}.sharing = 'system'" + + " OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" + + " OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" + + " OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" + + "))") + end + end + end + + # Returns a hash of project users grouped by role + def users_by_role + members.includes(:user, :roles).inject({}) do |h, m| + m.roles.each do |r| + h[r] ||= [] + h[r] << m.user + end + h + end + end + + # Adds user as a project member with the default role + # Used for when a non-admin user creates a project + def add_default_member(user) + role = self.class.default_member_role + member = Member.new(:project => self, :principal => user, :roles => [role]) + self.members << member + member + end + + # Default role that is given to non-admin users that + # create a project + def self.default_member_role + Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first + end + + # Deletes all project's members + def delete_all_members + me, mr = Member.table_name, MemberRole.table_name + self.class.connection.delete("DELETE FROM #{mr} WHERE #{mr}.member_id IN (SELECT #{me}.id FROM #{me} WHERE #{me}.project_id = #{id})") + Member.where(:project_id => id).delete_all + end + + # Return a Principal scope of users/groups issues can be assigned to + def assignable_users(tracker=nil) + return @assignable_users[tracker] if @assignable_users && @assignable_users[tracker] + + types = ['User'] + types << 'Group' if Setting.issue_group_assignment? + + scope = Principal. + active. + joins(:members => :roles). + where(:type => types, :members => {:project_id => id}, :roles => {:assignable => true}). + distinct. + sorted + + if tracker + # Rejects users that cannot the view the tracker + roles = Role.where(:assignable => true).select {|role| role.permissions_tracker?(:view_issues, tracker)} + scope = scope.where(:roles => {:id => roles.map(&:id)}) + end + + @assignable_users ||= {} + @assignable_users[tracker] = scope + end + + # Returns the mail addresses of users that should be always notified on project events + def recipients + notified_users.collect {|user| user.mail} + end + + # Returns the users that should be notified on project events + def notified_users + # TODO: User part should be extracted to User#notify_about? + members.preload(:principal).select {|m| m.principal.present? && (m.mail_notification? || m.principal.mail_notification == 'all')}.collect {|m| m.principal} + end + + # Returns a scope of all custom fields enabled for project issues + # (explicitly associated custom fields and custom fields enabled for all projects) + def all_issue_custom_fields + if new_record? + @all_issue_custom_fields ||= IssueCustomField. + sorted. + where("is_for_all = ? OR id IN (?)", true, issue_custom_field_ids) + else + @all_issue_custom_fields ||= IssueCustomField. + sorted. + where("is_for_all = ? OR id IN (SELECT DISTINCT cfp.custom_field_id" + + " FROM #{table_name_prefix}custom_fields_projects#{table_name_suffix} cfp" + + " WHERE cfp.project_id = ?)", true, id) + end + end + + # Returns a scope of all custom fields enabled for issues of the project + # and its subprojects + def rolled_up_custom_fields + if leaf? + all_issue_custom_fields + else + @rolled_up_custom_fields ||= IssueCustomField. + sorted. + where("is_for_all = ? OR EXISTS (SELECT 1" + + " FROM #{table_name_prefix}custom_fields_projects#{table_name_suffix} cfp" + + " JOIN #{Project.table_name} p ON p.id = cfp.project_id" + + " WHERE cfp.custom_field_id = #{CustomField.table_name}.id" + + " AND p.lft >= ? AND p.rgt <= ?)", true, lft, rgt) + end + end + + def project + self + end + + def <=>(project) + name.casecmp(project.name) + end + + def to_s + name + end + + # Returns a short description of the projects (first lines) + def short_description(length = 255) + description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description + end + + def css_classes + s = 'project' + s << ' root' if root? + s << ' child' if child? + s << (leaf? ? ' leaf' : ' parent') + unless active? + if archived? + s << ' archived' + else + s << ' closed' + end + end + s + end + + # The earliest start date of a project, based on it's issues and versions + def start_date + @start_date ||= [ + issues.minimum('start_date'), + shared_versions.minimum('effective_date'), + Issue.fixed_version(shared_versions).minimum('start_date') + ].compact.min + end + + # The latest due date of an issue or version + def due_date + @due_date ||= [ + issues.maximum('due_date'), + shared_versions.maximum('effective_date'), + Issue.fixed_version(shared_versions).maximum('due_date') + ].compact.max + end + + def overdue? + active? && !due_date.nil? && (due_date < User.current.today) + end + + # Returns the percent completed for this project, based on the + # progress on it's versions. + def completed_percent(options={:include_subprojects => false}) + if options.delete(:include_subprojects) + total = self_and_descendants.collect(&:completed_percent).sum + + total / self_and_descendants.count + else + if versions.count > 0 + total = versions.collect(&:completed_percent).sum + + total / versions.count + else + 100 + end + end + end + + # Return true if this project allows to do the specified action. + # action can be: + # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') + # * a permission Symbol (eg. :edit_project) + def allows_to?(action) + if archived? + # No action allowed on archived projects + return false + end + unless active? || Redmine::AccessControl.read_action?(action) + # No write action allowed on closed projects + return false + end + # No action allowed on disabled modules + if action.is_a? Hash + allowed_actions.include? "#{action[:controller]}/#{action[:action]}" + else + allowed_permissions.include? action + end + end + + # Return the enabled module with the given name + # or nil if the module is not enabled for the project + def enabled_module(name) + name = name.to_s + enabled_modules.detect {|m| m.name == name} + end + + # Return true if the module with the given name is enabled + def module_enabled?(name) + enabled_module(name).present? + end + + def enabled_module_names=(module_names) + if module_names && module_names.is_a?(Array) + module_names = module_names.collect(&:to_s).reject(&:blank?) + self.enabled_modules = module_names.collect {|name| enabled_modules.detect {|mod| mod.name == name} || EnabledModule.new(:name => name)} + else + enabled_modules.clear + end + end + + # Returns an array of the enabled modules names + def enabled_module_names + enabled_modules.collect(&:name) + end + + # Enable a specific module + # + # Examples: + # project.enable_module!(:issue_tracking) + # project.enable_module!("issue_tracking") + def enable_module!(name) + enabled_modules << EnabledModule.new(:name => name.to_s) unless module_enabled?(name) + end + + # Disable a module if it exists + # + # Examples: + # project.disable_module!(:issue_tracking) + # project.disable_module!("issue_tracking") + # project.disable_module!(project.enabled_modules.first) + def disable_module!(target) + target = enabled_modules.detect{|mod| target.to_s == mod.name} unless enabled_modules.include?(target) + target.destroy unless target.blank? + end + + safe_attributes 'name', + 'description', + 'homepage', + 'is_public', + 'identifier', + 'custom_field_values', + 'custom_fields', + 'tracker_ids', + 'issue_custom_field_ids', + 'parent_id', + 'default_version_id', + 'default_assigned_to_id' + + safe_attributes 'enabled_module_names', + :if => lambda {|project, user| + if project.new_record? + if user.admin? + true + else + default_member_role.has_permission?(:select_project_modules) + end + else + user.allowed_to?(:select_project_modules, project) + end + } + + safe_attributes 'inherit_members', + :if => lambda {|project, user| project.parent.nil? || project.parent.visible?(user)} + + def safe_attributes=(attrs, user=User.current) + return unless attrs.is_a?(Hash) + attrs = attrs.deep_dup + + @unallowed_parent_id = nil + if new_record? || attrs.key?('parent_id') + parent_id_param = attrs['parent_id'].to_s + if new_record? || parent_id_param != parent_id.to_s + p = parent_id_param.present? ? Project.find_by_id(parent_id_param) : nil + unless allowed_parents(user).include?(p) + attrs.delete('parent_id') + @unallowed_parent_id = true + end + end + end + + super(attrs, user) + end + + # Returns an auto-generated project identifier based on the last identifier used + def self.next_identifier + p = Project.order('id DESC').first + p.nil? ? nil : p.identifier.to_s.succ + end + + # Copies and saves the Project instance based on the +project+. + # Duplicates the source project's: + # * Wiki + # * Versions + # * Categories + # * Issues + # * Members + # * Queries + # + # Accepts an +options+ argument to specify what to copy + # + # Examples: + # project.copy(1) # => copies everything + # project.copy(1, :only => 'members') # => copies members only + # project.copy(1, :only => ['members', 'versions']) # => copies members and versions + def copy(project, options={}) + project = project.is_a?(Project) ? project : Project.find(project) + + to_be_copied = %w(members wiki versions issue_categories issues queries boards) + to_be_copied = to_be_copied & Array.wrap(options[:only]) unless options[:only].nil? + + Project.transaction do + if save + reload + to_be_copied.each do |name| + send "copy_#{name}", project + end + Redmine::Hook.call_hook(:model_project_copy_before_save, :source_project => project, :destination_project => self) + save + else + false + end + end + end + + def member_principals + ActiveSupport::Deprecation.warn "Project#member_principals is deprecated and will be removed in Redmine 4.0. Use #memberships.active instead." + memberships.active + end + + # Returns a new unsaved Project instance with attributes copied from +project+ + def self.copy_from(project) + project = project.is_a?(Project) ? project : Project.find(project) + # clear unique attributes + attributes = project.attributes.dup.except('id', 'name', 'identifier', 'status', 'parent_id', 'lft', 'rgt') + copy = Project.new(attributes) + copy.enabled_module_names = project.enabled_module_names + copy.trackers = project.trackers + copy.custom_values = project.custom_values.collect {|v| v.clone} + copy.issue_custom_fields = project.issue_custom_fields + copy + end + + # Yields the given block for each project with its level in the tree + def self.project_tree(projects, options={}, &block) + ancestors = [] + if options[:init_level] && projects.first + ancestors = projects.first.ancestors.to_a + end + projects.sort_by(&:lft).each do |project| + while (ancestors.any? && !project.is_descendant_of?(ancestors.last)) + ancestors.pop + end + yield project, ancestors.size + ancestors << project + end + end + + private + + def update_inherited_members + if parent + if inherit_members? && !inherit_members_was + remove_inherited_member_roles + add_inherited_member_roles + elsif !inherit_members? && inherit_members_was + remove_inherited_member_roles + end + end + end + + def remove_inherited_member_roles + member_roles = MemberRole.where(:member_id => membership_ids).to_a + member_role_ids = member_roles.map(&:id) + member_roles.each do |member_role| + if member_role.inherited_from && !member_role_ids.include?(member_role.inherited_from) + member_role.destroy + end + end + end + + def add_inherited_member_roles + if inherit_members? && parent + parent.memberships.each do |parent_member| + member = Member.find_or_new(self.id, parent_member.user_id) + parent_member.member_roles.each do |parent_member_role| + member.member_roles << MemberRole.new(:role => parent_member_role.role, :inherited_from => parent_member_role.id) + end + member.save! + end + memberships.reset + end + end + + def update_versions_from_hierarchy_change + Issue.update_versions_from_hierarchy_change(self) + end + + def validate_parent + if @unallowed_parent_id + errors.add(:parent_id, :invalid) + elsif parent_id_changed? + unless parent.nil? || (parent.active? && move_possible?(parent)) + errors.add(:parent_id, :invalid) + end + end + end + + # Copies wiki from +project+ + def copy_wiki(project) + # Check that the source project has a wiki first + unless project.wiki.nil? + wiki = self.wiki || Wiki.new + wiki.attributes = project.wiki.attributes.dup.except("id", "project_id") + wiki_pages_map = {} + project.wiki.pages.each do |page| + # Skip pages without content + next if page.content.nil? + new_wiki_content = WikiContent.new(page.content.attributes.dup.except("id", "page_id", "updated_on")) + new_wiki_page = WikiPage.new(page.attributes.dup.except("id", "wiki_id", "created_on", "parent_id")) + new_wiki_page.content = new_wiki_content + wiki.pages << new_wiki_page + wiki_pages_map[page.id] = new_wiki_page + end + + self.wiki = wiki + wiki.save + # Reproduce page hierarchy + project.wiki.pages.each do |page| + if page.parent_id && wiki_pages_map[page.id] + wiki_pages_map[page.id].parent = wiki_pages_map[page.parent_id] + wiki_pages_map[page.id].save + end + end + end + end + + # Copies versions from +project+ + def copy_versions(project) + project.versions.each do |version| + new_version = Version.new + new_version.attributes = version.attributes.dup.except("id", "project_id", "created_on", "updated_on") + self.versions << new_version + end + end + + # Copies issue categories from +project+ + def copy_issue_categories(project) + project.issue_categories.each do |issue_category| + new_issue_category = IssueCategory.new + new_issue_category.attributes = issue_category.attributes.dup.except("id", "project_id") + self.issue_categories << new_issue_category + end + end + + # Copies issues from +project+ + def copy_issues(project) + # Stores the source issue id as a key and the copied issues as the + # value. Used to map the two together for issue relations. + issues_map = {} + + # Store status and reopen locked/closed versions + version_statuses = versions.reject(&:open?).map {|version| [version, version.status]} + version_statuses.each do |version, status| + version.update_attribute :status, 'open' + end + + # Get issues sorted by root_id, lft so that parent issues + # get copied before their children + project.issues.reorder('root_id, lft').each do |issue| + new_issue = Issue.new + new_issue.copy_from(issue, :subtasks => false, :link => false, :keep_status => true) + new_issue.project = self + # Changing project resets the custom field values + # TODO: handle this in Issue#project= + new_issue.custom_field_values = issue.custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h} + # Reassign fixed_versions by name, since names are unique per project + if issue.fixed_version && issue.fixed_version.project == project + new_issue.fixed_version = self.versions.detect {|v| v.name == issue.fixed_version.name} + end + # Reassign version custom field values + new_issue.custom_field_values.each do |custom_value| + if custom_value.custom_field.field_format == 'version' && custom_value.value.present? + versions = Version.where(:id => custom_value.value).to_a + new_value = versions.map do |version| + if version.project == project + self.versions.detect {|v| v.name == version.name}.try(:id) + else + version.id + end + end + new_value.compact! + new_value = new_value.first unless custom_value.custom_field.multiple? + custom_value.value = new_value + end + end + # Reassign the category by name, since names are unique per project + if issue.category + new_issue.category = self.issue_categories.detect {|c| c.name == issue.category.name} + end + # Parent issue + if issue.parent_id + if copied_parent = issues_map[issue.parent_id] + new_issue.parent_issue_id = copied_parent.id + end + end + + self.issues << new_issue + if new_issue.new_record? + logger.info "Project#copy_issues: issue ##{issue.id} could not be copied: #{new_issue.errors.full_messages}" if logger && logger.info? + else + issues_map[issue.id] = new_issue unless new_issue.new_record? + end + end + + # Restore locked/closed version statuses + version_statuses.each do |version, status| + version.update_attribute :status, status + end + + # Relations after in case issues related each other + project.issues.each do |issue| + new_issue = issues_map[issue.id] + unless new_issue + # Issue was not copied + next + end + + # Relations + issue.relations_from.each do |source_relation| + new_issue_relation = IssueRelation.new + new_issue_relation.attributes = source_relation.attributes.dup.except("id", "issue_from_id", "issue_to_id") + new_issue_relation.issue_to = issues_map[source_relation.issue_to_id] + if new_issue_relation.issue_to.nil? && Setting.cross_project_issue_relations? + new_issue_relation.issue_to = source_relation.issue_to + end + new_issue.relations_from << new_issue_relation + end + + issue.relations_to.each do |source_relation| + new_issue_relation = IssueRelation.new + new_issue_relation.attributes = source_relation.attributes.dup.except("id", "issue_from_id", "issue_to_id") + new_issue_relation.issue_from = issues_map[source_relation.issue_from_id] + if new_issue_relation.issue_from.nil? && Setting.cross_project_issue_relations? + new_issue_relation.issue_from = source_relation.issue_from + end + new_issue.relations_to << new_issue_relation + end + end + end + + # Copies members from +project+ + def copy_members(project) + # Copy users first, then groups to handle members with inherited and given roles + members_to_copy = [] + members_to_copy += project.memberships.select {|m| m.principal.is_a?(User)} + members_to_copy += project.memberships.select {|m| !m.principal.is_a?(User)} + + members_to_copy.each do |member| + new_member = Member.new + new_member.attributes = member.attributes.dup.except("id", "project_id", "created_on") + # only copy non inherited roles + # inherited roles will be added when copying the group membership + role_ids = member.member_roles.reject(&:inherited?).collect(&:role_id) + next if role_ids.empty? + new_member.role_ids = role_ids + new_member.project = self + self.members << new_member + end + end + + # Copies queries from +project+ + def copy_queries(project) + project.queries.each do |query| + new_query = query.class.new + new_query.attributes = query.attributes.dup.except("id", "project_id", "sort_criteria", "user_id", "type") + new_query.sort_criteria = query.sort_criteria if query.sort_criteria + new_query.project = self + new_query.user_id = query.user_id + new_query.role_ids = query.role_ids if query.visibility == ::Query::VISIBILITY_ROLES + self.queries << new_query + end + end + + # Copies boards from +project+ + def copy_boards(project) + project.boards.each do |board| + new_board = Board.new + new_board.attributes = board.attributes.dup.except("id", "project_id", "topics_count", "messages_count", "last_message_id") + new_board.project = self + self.boards << new_board + end + end + + def allowed_permissions + @allowed_permissions ||= begin + module_names = enabled_modules.loaded? ? enabled_modules.map(&:name) : enabled_modules.pluck(:name) + Redmine::AccessControl.modules_permissions(module_names).collect {|p| p.name} + end + end + + def allowed_actions + @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten + end + + # Archives subprojects recursively + def archive! + children.each do |subproject| + subproject.send :archive! + end + update_attribute :status, STATUS_ARCHIVED + end +end diff --git a/app/models/project_custom_field.rb b/app/models/project_custom_field.rb new file mode 100644 index 0000000..54e7958 --- /dev/null +++ b/app/models/project_custom_field.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ProjectCustomField < CustomField + def type_name + :label_project_plural + end +end diff --git a/app/models/query.rb b/app/models/query.rb new file mode 100644 index 0000000..bfa010d --- /dev/null +++ b/app/models/query.rb @@ -0,0 +1,1376 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class QueryColumn + attr_accessor :name, :sortable, :groupable, :totalable, :default_order + include Redmine::I18n + + def initialize(name, options={}) + self.name = name + self.sortable = options[:sortable] + self.groupable = options[:groupable] || false + if groupable == true + self.groupable = name.to_s + end + self.totalable = options[:totalable] || false + self.default_order = options[:default_order] + @inline = options.key?(:inline) ? options[:inline] : true + @caption_key = options[:caption] || "field_#{name}".to_sym + @frozen = options[:frozen] + end + + def caption + case @caption_key + when Symbol + l(@caption_key) + when Proc + @caption_key.call + else + @caption_key + end + end + + # Returns true if the column is sortable, otherwise false + def sortable? + !@sortable.nil? + end + + def sortable + @sortable.is_a?(Proc) ? @sortable.call : @sortable + end + + def inline? + @inline + end + + def frozen? + @frozen + end + + def value(object) + object.send name + end + + def value_object(object) + object.send name + end + + def css_classes + name + end +end + +class QueryAssociationColumn < QueryColumn + + def initialize(association, attribute, options={}) + @association = association + @attribute = attribute + name_with_assoc = "#{association}.#{attribute}".to_sym + super(name_with_assoc, options) + end + + def value_object(object) + if assoc = object.send(@association) + assoc.send @attribute + end + end + + def css_classes + @css_classes ||= "#{@association}-#{@attribute}" + end +end + +class QueryCustomFieldColumn < QueryColumn + + def initialize(custom_field, options={}) + self.name = "cf_#{custom_field.id}".to_sym + self.sortable = custom_field.order_statement || false + self.groupable = custom_field.group_statement || false + self.totalable = options.key?(:totalable) ? !!options[:totalable] : custom_field.totalable? + @inline = true + @cf = custom_field + end + + def caption + @cf.name + end + + def custom_field + @cf + end + + def value_object(object) + if custom_field.visible_by?(object.project, User.current) + cv = object.custom_values.select {|v| v.custom_field_id == @cf.id} + cv.size > 1 ? cv.sort {|a,b| a.value.to_s <=> b.value.to_s} : cv.first + else + nil + end + end + + def value(object) + raw = value_object(object) + if raw.is_a?(Array) + raw.map {|r| @cf.cast_value(r.value)} + elsif raw + @cf.cast_value(raw.value) + else + nil + end + end + + def css_classes + @css_classes ||= "#{name} #{@cf.field_format}" + end +end + +class QueryAssociationCustomFieldColumn < QueryCustomFieldColumn + + def initialize(association, custom_field, options={}) + super(custom_field, options) + self.name = "#{association}.cf_#{custom_field.id}".to_sym + # TODO: support sorting/grouping by association custom field + self.sortable = false + self.groupable = false + @association = association + end + + def value_object(object) + if assoc = object.send(@association) + super(assoc) + end + end + + def css_classes + @css_classes ||= "#{@association}_cf_#{@cf.id} #{@cf.field_format}" + end +end + +class QueryFilter + include Redmine::I18n + + def initialize(field, options) + @field = field.to_s + @options = options + @options[:name] ||= l(options[:label] || "field_#{field}".gsub(/_id$/, '')) + # Consider filters with a Proc for values as remote by default + @remote = options.key?(:remote) ? options[:remote] : options[:values].is_a?(Proc) + end + + def [](arg) + if arg == :values + values + else + @options[arg] + end + end + + def values + @values ||= begin + values = @options[:values] + if values.is_a?(Proc) + values = values.call + end + values + end + end + + def remote + @remote + end +end + +class Query < ActiveRecord::Base + class StatementInvalid < ::ActiveRecord::StatementInvalid + end + + include Redmine::SubclassFactory + + VISIBILITY_PRIVATE = 0 + VISIBILITY_ROLES = 1 + VISIBILITY_PUBLIC = 2 + + belongs_to :project + belongs_to :user + has_and_belongs_to_many :roles, :join_table => "#{table_name_prefix}queries_roles#{table_name_suffix}", :foreign_key => "query_id" + serialize :filters + serialize :column_names + serialize :sort_criteria, Array + serialize :options, Hash + + attr_protected :project_id, :user_id + + validates_presence_of :name + validates_length_of :name, :maximum => 255 + validates :visibility, :inclusion => { :in => [VISIBILITY_PUBLIC, VISIBILITY_ROLES, VISIBILITY_PRIVATE] } + validate :validate_query_filters + validate do |query| + errors.add(:base, l(:label_role_plural) + ' ' + l('activerecord.errors.messages.blank')) if query.visibility == VISIBILITY_ROLES && roles.blank? + end + + after_save do |query| + if query.visibility_changed? && query.visibility != VISIBILITY_ROLES + query.roles.clear + end + end + + class_attribute :operators + self.operators = { + "=" => :label_equals, + "!" => :label_not_equals, + "o" => :label_open_issues, + "c" => :label_closed_issues, + "!*" => :label_none, + "*" => :label_any, + ">=" => :label_greater_or_equal, + "<=" => :label_less_or_equal, + "><" => :label_between, + " :label_in_less_than, + ">t+" => :label_in_more_than, + "> :label_in_the_next_days, + "t+" => :label_in, + "t" => :label_today, + "ld" => :label_yesterday, + "w" => :label_this_week, + "lw" => :label_last_week, + "l2w" => [:label_last_n_weeks, {:count => 2}], + "m" => :label_this_month, + "lm" => :label_last_month, + "y" => :label_this_year, + ">t-" => :label_less_than_ago, + " :label_more_than_ago, + "> :label_in_the_past_days, + "t-" => :label_ago, + "~" => :label_contains, + "!~" => :label_not_contains, + "=p" => :label_any_issues_in_project, + "=!p" => :label_any_issues_not_in_project, + "!p" => :label_no_issues_in_project, + "*o" => :label_any_open_issues, + "!o" => :label_no_open_issues + } + + class_attribute :operators_by_filter_type + self.operators_by_filter_type = { + :list => [ "=", "!" ], + :list_status => [ "o", "=", "!", "c", "*" ], + :list_optional => [ "=", "!", "!*", "*" ], + :list_subprojects => [ "*", "!*", "=", "!" ], + :date => [ "=", ">=", "<=", "><", "t+", ">t-", " [ "=", ">=", "<=", "><", ">t-", " [ "=", "~", "!", "!~", "!*", "*" ], + :text => [ "~", "!~", "!*", "*" ], + :integer => [ "=", ">=", "<=", "><", "!*", "*" ], + :float => [ "=", ">=", "<=", "><", "!*", "*" ], + :relation => ["=", "=p", "=!p", "!p", "*o", "!o", "!*", "*"], + :tree => ["=", "~", "!*", "*"] + } + + class_attribute :available_columns + self.available_columns = [] + + class_attribute :queried_class + + # Permission required to view the queries, set on subclasses. + class_attribute :view_permission + + # Scope of queries that are global or on the given project + scope :global_or_on_project, lambda {|project| + where(:project_id => (project.nil? ? nil : [nil, project.id])) + } + + scope :sorted, lambda {order(:name, :id)} + + # Scope of visible queries, can be used from subclasses only. + # Unlike other visible scopes, a class methods is used as it + # let handle inheritance more nicely than scope DSL. + def self.visible(*args) + if self == ::Query + # Visibility depends on permissions for each subclass, + # raise an error if the scope is called from Query (eg. Query.visible) + raise Exception.new("Cannot call .visible scope from the base Query class, but from subclasses only.") + end + + user = args.shift || User.current + base = Project.allowed_to_condition(user, view_permission, *args) + scope = joins("LEFT OUTER JOIN #{Project.table_name} ON #{table_name}.project_id = #{Project.table_name}.id"). + where("#{table_name}.project_id IS NULL OR (#{base})") + + if user.admin? + scope.where("#{table_name}.visibility <> ? OR #{table_name}.user_id = ?", VISIBILITY_PRIVATE, user.id) + elsif user.memberships.any? + scope.where("#{table_name}.visibility = ?" + + " OR (#{table_name}.visibility = ? AND #{table_name}.id IN (" + + "SELECT DISTINCT q.id FROM #{table_name} q" + + " INNER JOIN #{table_name_prefix}queries_roles#{table_name_suffix} qr on qr.query_id = q.id" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.role_id = qr.role_id" + + " INNER JOIN #{Member.table_name} m ON m.id = mr.member_id AND m.user_id = ?" + + " INNER JOIN #{Project.table_name} p ON p.id = m.project_id AND p.status <> ?" + + " WHERE q.project_id IS NULL OR q.project_id = m.project_id))" + + " OR #{table_name}.user_id = ?", + VISIBILITY_PUBLIC, VISIBILITY_ROLES, user.id, Project::STATUS_ARCHIVED, user.id) + elsif user.logged? + scope.where("#{table_name}.visibility = ? OR #{table_name}.user_id = ?", VISIBILITY_PUBLIC, user.id) + else + scope.where("#{table_name}.visibility = ?", VISIBILITY_PUBLIC) + end + end + + # Returns true if the query is visible to +user+ or the current user. + def visible?(user=User.current) + return true if user.admin? + return false unless project.nil? || user.allowed_to?(self.class.view_permission, project) + case visibility + when VISIBILITY_PUBLIC + true + when VISIBILITY_ROLES + if project + (user.roles_for_project(project) & roles).any? + else + user.memberships.joins(:member_roles).where(:member_roles => {:role_id => roles.map(&:id)}).any? + end + else + user == self.user + end + end + + def is_private? + visibility == VISIBILITY_PRIVATE + end + + def is_public? + !is_private? + end + + def queried_table_name + @queried_table_name ||= self.class.queried_class.table_name + end + + def initialize(attributes=nil, *args) + super attributes + @is_for_all = project.nil? + end + + # Builds the query from the given params + def build_from_params(params) + if params[:fields] || params[:f] + self.filters = {} + add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) + else + available_filters.keys.each do |field| + add_short_filter(field, params[field]) if params[field] + end + end + self.group_by = params[:group_by] || (params[:query] && params[:query][:group_by]) + self.column_names = params[:c] || (params[:query] && params[:query][:column_names]) + self.totalable_names = params[:t] || (params[:query] && params[:query][:totalable_names]) + self.sort_criteria = params[:sort] || (params[:query] && params[:query][:sort_criteria]) + self + end + + # Builds a new query from the given params and attributes + def self.build_from_params(params, attributes={}) + new(attributes).build_from_params(params) + end + + def as_params + if new_record? + params = {} + filters.each do |field, options| + params[:f] ||= [] + params[:f] << field + params[:op] ||= {} + params[:op][field] = options[:operator] + params[:v] ||= {} + params[:v][field] = options[:values] + end + params[:c] = column_names + params[:group_by] = group_by.to_s if group_by.present? + params[:t] = totalable_names.map(&:to_s) if totalable_names.any? + params[:sort] = sort_criteria.to_param + params[:set_filter] = 1 + params + else + {:query_id => id} + end + end + + def validate_query_filters + filters.each_key do |field| + if values_for(field) + case type_for(field) + when :integer + add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/\A[+-]?\d+(,[+-]?\d+)*\z/) } + when :float + add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/\A[+-]?\d+(\.\d*)?\z/) } + when :date, :date_past + case operator_for(field) + when "=", ">=", "<=", "><" + add_filter_error(field, :invalid) if values_for(field).detect {|v| + v.present? && (!v.match(/\A\d{4}-\d{2}-\d{2}(T\d{2}((:)?\d{2}){0,2}(Z|\d{2}:?\d{2})?)?\z/) || parse_date(v).nil?) + } + when ">t-", "t+", " 'activerecord.errors.messages') + errors.add(:base, m) + end + + def editable_by?(user) + return false unless user + # Admin can edit them all and regular users can edit their private queries + return true if user.admin? || (is_private? && self.user_id == user.id) + # Members can not edit public queries that are for all project (only admin is allowed to) + is_public? && !@is_for_all && user.allowed_to?(:manage_public_queries, project) + end + + def trackers + @trackers ||= (project.nil? ? Tracker.all : project.rolled_up_trackers).visible.sorted + end + + # Returns a hash of localized labels for all filter operators + def self.operators_labels + operators.inject({}) {|h, operator| h[operator.first] = l(*operator.last); h} + end + + # Returns a representation of the available filters for JSON serialization + def available_filters_as_json + json = {} + available_filters.each do |field, filter| + options = {:type => filter[:type], :name => filter[:name]} + options[:remote] = true if filter.remote + + if has_filter?(field) || !filter.remote + options[:values] = filter.values + if options[:values] && values_for(field) + missing = Array(values_for(field)).select(&:present?) - options[:values].map(&:last) + if missing.any? && respond_to?(method = "find_#{field}_filter_values") + options[:values] += send(method, missing) + end + end + end + json[field] = options.stringify_keys + end + json + end + + def all_projects + @all_projects ||= Project.visible.to_a + end + + def all_projects_values + return @all_projects_values if @all_projects_values + + values = [] + Project.project_tree(all_projects) do |p, level| + prefix = (level > 0 ? ('--' * level + ' ') : '') + values << ["#{prefix}#{p.name}", p.id.to_s] + end + @all_projects_values = values + end + + def project_values + project_values = [] + if User.current.logged? && User.current.memberships.any? + project_values << ["<< #{l(:label_my_projects).downcase} >>", "mine"] + end + project_values += all_projects_values + project_values + end + + def subproject_values + project.descendants.visible.collect{|s| [s.name, s.id.to_s] } + end + + def principals + @principal ||= begin + principals = [] + if project + principals += project.principals.visible + unless project.leaf? + principals += Principal.member_of(project.descendants.visible).visible + end + else + principals += Principal.member_of(all_projects).visible + end + principals.uniq! + principals.sort! + principals.reject! {|p| p.is_a?(GroupBuiltin)} + principals + end + end + + def users + principals.select {|p| p.is_a?(User)} + end + + def author_values + author_values = [] + author_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? + author_values += users.collect{|s| [s.name, s.id.to_s] } + author_values + end + + def assigned_to_values + assigned_to_values = [] + assigned_to_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? + assigned_to_values += (Setting.issue_group_assignment? ? principals : users).collect{|s| [s.name, s.id.to_s] } + assigned_to_values + end + + def fixed_version_values + versions = [] + if project + versions = project.shared_versions.to_a + else + versions = Version.visible.where(:sharing => 'system').to_a + end + Version.sort_by_status(versions).collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s, l("version_status_#{s.status}")] } + end + + # Returns a scope of issue statuses that are available as columns for filters + def issue_statuses_values + if project + statuses = project.rolled_up_statuses + else + statuses = IssueStatus.all.sorted + end + statuses.collect{|s| [s.name, s.id.to_s]} + end + + # Returns a scope of issue custom fields that are available as columns or filters + def issue_custom_fields + if project + project.rolled_up_custom_fields + else + IssueCustomField.all + end + end + + # Adds available filters + def initialize_available_filters + # implemented by sub-classes + end + protected :initialize_available_filters + + # Adds an available filter + def add_available_filter(field, options) + @available_filters ||= ActiveSupport::OrderedHash.new + @available_filters[field] = QueryFilter.new(field, options) + @available_filters + end + + # Removes an available filter + def delete_available_filter(field) + if @available_filters + @available_filters.delete(field) + end + end + + # Return a hash of available filters + def available_filters + unless @available_filters + initialize_available_filters + @available_filters ||= {} + end + @available_filters + end + + def add_filter(field, operator, values=nil) + # values must be an array + return unless values.nil? || values.is_a?(Array) + # check if field is defined as an available filter + if available_filters.has_key? field + filter_options = available_filters[field] + filters[field] = {:operator => operator, :values => (values || [''])} + end + end + + def add_short_filter(field, expression) + return unless expression && available_filters.has_key?(field) + field_type = available_filters[field][:type] + operators_by_filter_type[field_type].sort.reverse.detect do |operator| + next unless expression =~ /^#{Regexp.escape(operator)}(.*)$/ + values = $1 + add_filter field, operator, values.present? ? values.split('|') : [''] + end || add_filter(field, '=', expression.to_s.split('|')) + end + + # Add multiple filters using +add_filter+ + def add_filters(fields, operators, values) + if fields.is_a?(Array) && operators.is_a?(Hash) && (values.nil? || values.is_a?(Hash)) + fields.each do |field| + add_filter(field, operators[field], values && values[field]) + end + end + end + + def has_filter?(field) + filters and filters[field] + end + + def type_for(field) + available_filters[field][:type] if available_filters.has_key?(field) + end + + def operator_for(field) + has_filter?(field) ? filters[field][:operator] : nil + end + + def values_for(field) + has_filter?(field) ? filters[field][:values] : nil + end + + def value_for(field, index=0) + (values_for(field) || [])[index] + end + + def label_for(field) + label = available_filters[field][:name] if available_filters.has_key?(field) + label ||= queried_class.human_attribute_name(field, :default => field) + end + + def self.add_available_column(column) + self.available_columns << (column) if column.is_a?(QueryColumn) + end + + # Returns an array of columns that can be used to group the results + def groupable_columns + available_columns.select {|c| c.groupable} + end + + # Returns a Hash of columns and the key for sorting + def sortable_columns + available_columns.inject({}) {|h, column| + h[column.name.to_s] = column.sortable + h + } + end + + def columns + # preserve the column_names order + cols = (has_default_columns? ? default_columns_names : column_names).collect do |name| + available_columns.find { |col| col.name == name } + end.compact + available_columns.select(&:frozen?) | cols + end + + def inline_columns + columns.select(&:inline?) + end + + def block_columns + columns.reject(&:inline?) + end + + def available_inline_columns + available_columns.select(&:inline?) + end + + def available_block_columns + available_columns.reject(&:inline?) + end + + def available_totalable_columns + available_columns.select(&:totalable) + end + + def default_columns_names + [] + end + + def default_totalable_names + [] + end + + def column_names=(names) + if names + names = names.select {|n| n.is_a?(Symbol) || !n.blank? } + names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym } + if names.delete(:all_inline) + names = available_inline_columns.map(&:name) | names + end + # Set column_names to nil if default columns + if names == default_columns_names + names = nil + end + end + write_attribute(:column_names, names) + end + + def has_column?(column) + name = column.is_a?(QueryColumn) ? column.name : column + columns.detect {|c| c.name == name} + end + + def has_custom_field_column? + columns.any? {|column| column.is_a? QueryCustomFieldColumn} + end + + def has_default_columns? + column_names.nil? || column_names.empty? + end + + def totalable_columns + names = totalable_names + available_totalable_columns.select {|column| names.include?(column.name)} + end + + def totalable_names=(names) + if names + names = names.select(&:present?).map {|n| n.is_a?(Symbol) ? n : n.to_sym} + end + options[:totalable_names] = names + end + + def totalable_names + options[:totalable_names] || default_totalable_names || [] + end + + def default_sort_criteria + [] + end + + def sort_criteria=(arg) + c = Redmine::SortCriteria.new(arg) + write_attribute(:sort_criteria, c.to_a) + c + end + + def sort_criteria + c = read_attribute(:sort_criteria) + if c.blank? + c = default_sort_criteria + end + Redmine::SortCriteria.new(c) + end + + def sort_criteria_key(index) + sort_criteria[index].try(:first) + end + + def sort_criteria_order(index) + sort_criteria[index].try(:last) + end + + def sort_clause + sort_criteria.sort_clause(sortable_columns) + end + + # Returns the SQL sort order that should be prepended for grouping + def group_by_sort_order + if column = group_by_column + order = (sort_criteria.order_for(column.name) || column.default_order || 'asc').try(:upcase) + Array(column.sortable).map {|s| "#{s} #{order}"} + end + end + + # Returns true if the query is a grouped query + def grouped? + !group_by_column.nil? + end + + def group_by_column + groupable_columns.detect {|c| c.groupable && c.name.to_s == group_by} + end + + def group_by_statement + group_by_column.try(:groupable) + end + + def project_statement + project_clauses = [] + active_subprojects_ids = [] + + active_subprojects_ids = project.descendants.active.map(&:id) if project + if active_subprojects_ids.any? + if has_filter?("subproject_id") + case operator_for("subproject_id") + when '=' + # include the selected subprojects + ids = [project.id] + values_for("subproject_id").map(&:to_i) + project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',') + when '!' + # exclude the selected subprojects + ids = [project.id] + active_subprojects_ids - values_for("subproject_id").map(&:to_i) + project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',') + when '!*' + # main project only + project_clauses << "#{Project.table_name}.id = %d" % project.id + else + # all subprojects + project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}" + end + elsif Setting.display_subprojects_issues? + project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}" + else + project_clauses << "#{Project.table_name}.id = %d" % project.id + end + elsif project + project_clauses << "#{Project.table_name}.id = %d" % project.id + end + project_clauses.any? ? project_clauses.join(' AND ') : nil + end + + def statement + # filters clauses + filters_clauses = [] + filters.each_key do |field| + next if field == "subproject_id" + v = values_for(field).clone + next unless v and !v.empty? + operator = operator_for(field) + + # "me" value substitution + if %w(assigned_to_id author_id user_id watcher_id updated_by last_updated_by).include?(field) + if v.delete("me") + if User.current.logged? + v.push(User.current.id.to_s) + v += User.current.group_ids.map(&:to_s) if field == 'assigned_to_id' + else + v.push("0") + end + end + end + + if field == 'project_id' + if v.delete('mine') + v += User.current.memberships.map(&:project_id).map(&:to_s) + end + end + + if field =~ /^cf_(\d+)\.cf_(\d+)$/ + filters_clauses << sql_for_chained_custom_field(field, operator, v, $1, $2) + elsif field =~ /cf_(\d+)$/ + # custom field + filters_clauses << sql_for_custom_field(field, operator, v, $1) + elsif field =~ /^cf_(\d+)\.(.+)$/ + filters_clauses << sql_for_custom_field_attribute(field, operator, v, $1, $2) + elsif respond_to?(method = "sql_for_#{field.gsub('.','_')}_field") + # specific statement + filters_clauses << send(method, field, operator, v) + else + # regular field + filters_clauses << '(' + sql_for_field(field, operator, v, queried_table_name, field) + ')' + end + end if filters and valid? + + if (c = group_by_column) && c.is_a?(QueryCustomFieldColumn) + # Excludes results for which the grouped custom field is not visible + filters_clauses << c.custom_field.visibility_by_project_condition + end + + filters_clauses << project_statement + filters_clauses.reject!(&:blank?) + + filters_clauses.any? ? filters_clauses.join(' AND ') : nil + end + + # Returns the result count by group or nil if query is not grouped + def result_count_by_group + grouped_query do |scope| + scope.count + end + end + + # Returns the sum of values for the given column + def total_for(column) + total_with_scope(column, base_scope) + end + + # Returns a hash of the sum of the given column for each group, + # or nil if the query is not grouped + def total_by_group_for(column) + grouped_query do |scope| + total_with_scope(column, scope) + end + end + + def totals + totals = totalable_columns.map {|column| [column, total_for(column)]} + yield totals if block_given? + totals + end + + def totals_by_group + totals = totalable_columns.map {|column| [column, total_by_group_for(column)]} + yield totals if block_given? + totals + end + + def css_classes + s = sort_criteria.first + if s.present? + key, asc = s + "sort-by-#{key.to_s.dasherize} sort-#{asc}" + end + end + + private + + def grouped_query(&block) + r = nil + if grouped? + begin + # Rails3 will raise an (unexpected) RecordNotFound if there's only a nil group value + r = yield base_group_scope + rescue ActiveRecord::RecordNotFound + r = {nil => yield(base_scope)} + end + c = group_by_column + if c.is_a?(QueryCustomFieldColumn) + r = r.keys.inject({}) {|h, k| h[c.custom_field.cast_value(k)] = r[k]; h} + end + end + r + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + def total_with_scope(column, scope) + unless column.is_a?(QueryColumn) + column = column.to_sym + column = available_totalable_columns.detect {|c| c.name == column} + end + if column.is_a?(QueryCustomFieldColumn) + custom_field = column.custom_field + send "total_for_custom_field", custom_field, scope + else + send "total_for_#{column.name}", scope + end + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid.new(e.message) + end + + def base_scope + raise "unimplemented" + end + + def base_group_scope + base_scope. + joins(joins_for_order_statement(group_by_statement)). + group(group_by_statement) + end + + def total_for_custom_field(custom_field, scope, &block) + total = custom_field.format.total_for_scope(custom_field, scope) + total = map_total(total) {|t| custom_field.format.cast_total_value(custom_field, t)} + total + end + + def map_total(total, &block) + if total.is_a?(Hash) + total.keys.each {|k| total[k] = yield total[k]} + else + total = yield total + end + total + end + + def sql_for_custom_field(field, operator, value, custom_field_id) + db_table = CustomValue.table_name + db_field = 'value' + filter = @available_filters[field] + return nil unless filter + if filter[:field].format.target_class && filter[:field].format.target_class <= User + if value.delete('me') + value.push User.current.id.to_s + end + end + not_in = nil + if operator == '!' + # Makes ! operator work for custom fields with multiple values + operator = '=' + not_in = 'NOT' + end + customized_key = "id" + customized_class = queried_class + if field =~ /^(.+)\.cf_/ + assoc = $1 + customized_key = "#{assoc}_id" + customized_class = queried_class.reflect_on_association(assoc.to_sym).klass.base_class rescue nil + raise "Unknown #{queried_class.name} association #{assoc}" unless customized_class + end + where = sql_for_field(field, operator, value, db_table, db_field, true) + if operator =~ /[<>]/ + where = "(#{where}) AND #{db_table}.#{db_field} <> ''" + end + "#{queried_table_name}.#{customized_key} #{not_in} IN (" + + "SELECT #{customized_class.table_name}.id FROM #{customized_class.table_name}" + + " LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='#{customized_class}' AND #{db_table}.customized_id=#{customized_class.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id}" + + " WHERE (#{where}) AND (#{filter[:field].visibility_by_project_condition}))" + end + + def sql_for_chained_custom_field(field, operator, value, custom_field_id, chained_custom_field_id) + not_in = nil + if operator == '!' + # Makes ! operator work for custom fields with multiple values + operator = '=' + not_in = 'NOT' + end + + filter = available_filters[field] + target_class = filter[:through].format.target_class + + "#{queried_table_name}.id #{not_in} IN (" + + "SELECT customized_id FROM #{CustomValue.table_name}" + + " WHERE customized_type='#{queried_class}' AND custom_field_id=#{custom_field_id}" + + " AND CAST(CASE value WHEN '' THEN '0' ELSE value END AS decimal(30,0)) IN (" + + " SELECT customized_id FROM #{CustomValue.table_name}" + + " WHERE customized_type='#{target_class}' AND custom_field_id=#{chained_custom_field_id}" + + " AND #{sql_for_field(field, operator, value, CustomValue.table_name, 'value')}))" + + end + + def sql_for_custom_field_attribute(field, operator, value, custom_field_id, attribute) + attribute = 'effective_date' if attribute == 'due_date' + not_in = nil + if operator == '!' + # Makes ! operator work for custom fields with multiple values + operator = '=' + not_in = 'NOT' + end + + filter = available_filters[field] + target_table_name = filter[:field].format.target_class.table_name + + "#{queried_table_name}.id #{not_in} IN (" + + "SELECT customized_id FROM #{CustomValue.table_name}" + + " WHERE customized_type='#{queried_class}' AND custom_field_id=#{custom_field_id}" + + " AND CAST(CASE value WHEN '' THEN '0' ELSE value END AS decimal(30,0)) IN (" + + " SELECT id FROM #{target_table_name} WHERE #{sql_for_field(field, operator, value, filter[:field].format.target_class.table_name, attribute)}))" + end + + # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+ + def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false) + sql = '' + case operator + when "=" + if value.any? + case type_for(field) + when :date, :date_past + sql = date_clause(db_table, db_field, parse_date(value.first), parse_date(value.first), is_custom_filter) + when :integer + int_values = value.first.to_s.scan(/[+-]?\d+/).map(&:to_i).join(",") + if int_values.present? + if is_custom_filter + sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) IN (#{int_values}))" + else + sql = "#{db_table}.#{db_field} IN (#{int_values})" + end + else + sql = "1=0" + end + when :float + if is_custom_filter + sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5})" + else + sql = "#{db_table}.#{db_field} BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5}" + end + else + sql = queried_class.send(:sanitize_sql_for_conditions, ["#{db_table}.#{db_field} IN (?)", value]) + end + else + # IN an empty set + sql = "1=0" + end + when "!" + if value.any? + sql = queried_class.send(:sanitize_sql_for_conditions, ["(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (?))", value]) + else + # NOT IN an empty set + sql = "1=1" + end + when "!*" + sql = "#{db_table}.#{db_field} IS NULL" + sql << " OR #{db_table}.#{db_field} = ''" if (is_custom_filter || [:text, :string].include?(type_for(field))) + when "*" + sql = "#{db_table}.#{db_field} IS NOT NULL" + sql << " AND #{db_table}.#{db_field} <> ''" if is_custom_filter + when ">=" + if [:date, :date_past].include?(type_for(field)) + sql = date_clause(db_table, db_field, parse_date(value.first), nil, is_custom_filter) + else + if is_custom_filter + sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) >= #{value.first.to_f})" + else + sql = "#{db_table}.#{db_field} >= #{value.first.to_f}" + end + end + when "<=" + if [:date, :date_past].include?(type_for(field)) + sql = date_clause(db_table, db_field, nil, parse_date(value.first), is_custom_filter) + else + if is_custom_filter + sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) <= #{value.first.to_f})" + else + sql = "#{db_table}.#{db_field} <= #{value.first.to_f}" + end + end + when "><" + if [:date, :date_past].include?(type_for(field)) + sql = date_clause(db_table, db_field, parse_date(value[0]), parse_date(value[1]), is_custom_filter) + else + if is_custom_filter + sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) BETWEEN #{value[0].to_f} AND #{value[1].to_f})" + else + sql = "#{db_table}.#{db_field} BETWEEN #{value[0].to_f} AND #{value[1].to_f}" + end + end + when "o" + sql = "#{queried_table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{self.class.connection.quoted_false})" if field == "status_id" + when "c" + sql = "#{queried_table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{self.class.connection.quoted_true})" if field == "status_id" + when ">t-" + # >= today - n days + sql = relative_date_clause(db_table, db_field, - value.first.to_i, nil, is_custom_filter) + when "t+" + # >= today + n days + sql = relative_date_clause(db_table, db_field, value.first.to_i, nil, is_custom_filter) + when "= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week) + sql = relative_date_clause(db_table, db_field, - days_ago, - days_ago + 6, is_custom_filter) + when "lw" + # = last week + first_day_of_week = l(:general_first_day_of_week).to_i + day_of_week = User.current.today.cwday + days_ago = (day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week) + sql = relative_date_clause(db_table, db_field, - days_ago - 7, - days_ago - 1, is_custom_filter) + when "l2w" + # = last 2 weeks + first_day_of_week = l(:general_first_day_of_week).to_i + day_of_week = User.current.today.cwday + days_ago = (day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week) + sql = relative_date_clause(db_table, db_field, - days_ago - 14, - days_ago - 1, is_custom_filter) + when "m" + # = this month + date = User.current.today + sql = date_clause(db_table, db_field, date.beginning_of_month, date.end_of_month, is_custom_filter) + when "lm" + # = last month + date = User.current.today.prev_month + sql = date_clause(db_table, db_field, date.beginning_of_month, date.end_of_month, is_custom_filter) + when "y" + # = this year + date = User.current.today + sql = date_clause(db_table, db_field, date.beginning_of_year, date.end_of_year, is_custom_filter) + when "~" + sql = sql_contains("#{db_table}.#{db_field}", value.first) + when "!~" + sql = sql_contains("#{db_table}.#{db_field}", value.first, false) + else + raise "Unknown query operator #{operator}" + end + + return sql + end + + # Returns a SQL LIKE statement with wildcards + def sql_contains(db_field, value, match=true) + queried_class.send :sanitize_sql_for_conditions, + [Redmine::Database.like(db_field, '?', :match => match), "%#{value}%"] + end + + # Adds a filter for the given custom field + def add_custom_field_filter(field, assoc=nil) + options = field.query_filter_options(self) + + filter_id = "cf_#{field.id}" + filter_name = field.name + if assoc.present? + filter_id = "#{assoc}.#{filter_id}" + filter_name = l("label_attribute_of_#{assoc}", :name => filter_name) + end + add_available_filter filter_id, options.merge({ + :name => filter_name, + :field => field + }) + end + + # Adds filters for custom fields associated to the custom field target class + # Eg. having a version custom field "Milestone" for issues and a date custom field "Release date" + # for versions, it will add an issue filter on Milestone'e Release date. + def add_chained_custom_field_filters(field) + klass = field.format.target_class + if klass + CustomField.where(:is_filter => true, :type => "#{klass.name}CustomField").each do |chained| + options = chained.query_filter_options(self) + + filter_id = "cf_#{field.id}.cf_#{chained.id}" + filter_name = chained.name + + add_available_filter filter_id, options.merge({ + :name => l(:label_attribute_of_object, :name => chained.name, :object_name => field.name), + :field => chained, + :through => field + }) + end + end + end + + # Adds filters for the given custom fields scope + def add_custom_fields_filters(scope, assoc=nil) + scope.visible.where(:is_filter => true).sorted.each do |field| + add_custom_field_filter(field, assoc) + if assoc.nil? + add_chained_custom_field_filters(field) + + if field.format.target_class && field.format.target_class == Version + add_available_filter "cf_#{field.id}.due_date", + :type => :date, + :field => field, + :name => l(:label_attribute_of_object, :name => l(:field_effective_date), :object_name => field.name) + + add_available_filter "cf_#{field.id}.status", + :type => :list, + :field => field, + :name => l(:label_attribute_of_object, :name => l(:field_status), :object_name => field.name), + :values => Version::VERSION_STATUSES.map{|s| [l("version_status_#{s}"), s] } + end + end + end + end + + # Adds filters for the given associations custom fields + def add_associations_custom_fields_filters(*associations) + fields_by_class = CustomField.visible.where(:is_filter => true).group_by(&:class) + associations.each do |assoc| + association_klass = queried_class.reflect_on_association(assoc).klass + fields_by_class.each do |field_class, fields| + if field_class.customized_class <= association_klass + fields.sort.each do |field| + add_custom_field_filter(field, assoc) + end + end + end + end + end + + def quoted_time(time, is_custom_filter) + if is_custom_filter + # Custom field values are stored as strings in the DB + # using this format that does not depend on DB date representation + time.strftime("%Y-%m-%d %H:%M:%S") + else + self.class.connection.quoted_date(time) + end + end + + def date_for_user_time_zone(y, m, d) + if tz = User.current.time_zone + tz.local y, m, d + else + Time.local y, m, d + end + end + + # Returns a SQL clause for a date or datetime field. + def date_clause(table, field, from, to, is_custom_filter) + s = [] + if from + if from.is_a?(Date) + from = date_for_user_time_zone(from.year, from.month, from.day).yesterday.end_of_day + else + from = from - 1 # second + end + if self.class.default_timezone == :utc + from = from.utc + end + s << ("#{table}.#{field} > '%s'" % [quoted_time(from, is_custom_filter)]) + end + if to + if to.is_a?(Date) + to = date_for_user_time_zone(to.year, to.month, to.day).end_of_day + end + if self.class.default_timezone == :utc + to = to.utc + end + s << ("#{table}.#{field} <= '%s'" % [quoted_time(to, is_custom_filter)]) + end + s.join(' AND ') + end + + # Returns a SQL clause for a date or datetime field using relative dates. + def relative_date_clause(table, field, days_from, days_to, is_custom_filter) + date_clause(table, field, (days_from ? User.current.today + days_from : nil), (days_to ? User.current.today + days_to : nil), is_custom_filter) + end + + # Returns a Date or Time from the given filter value + def parse_date(arg) + if arg.to_s =~ /\A\d{4}-\d{2}-\d{2}T/ + Time.parse(arg) rescue nil + else + Date.parse(arg) rescue nil + end + end + + # Additional joins required for the given sort options + def joins_for_order_statement(order_options) + joins = [] + + if order_options + order_options.scan(/cf_\d+/).uniq.each do |name| + column = available_columns.detect {|c| c.name.to_s == name} + join = column && column.custom_field.join_for_order_statement + if join + joins << join + end + end + end + + joins.any? ? joins.join(' ') : nil + end +end diff --git a/app/models/repository.rb b/app/models/repository.rb new file mode 100644 index 0000000..fd3a9fb --- /dev/null +++ b/app/models/repository.rb @@ -0,0 +1,516 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class ScmFetchError < Exception; end + +class Repository < ActiveRecord::Base + include Redmine::Ciphering + include Redmine::SafeAttributes + + # Maximum length for repository identifiers + IDENTIFIER_MAX_LENGTH = 255 + + belongs_to :project + has_many :changesets, lambda{order("#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC")} + has_many :filechanges, :class_name => 'Change', :through => :changesets + + serialize :extra_info + + before_validation :normalize_identifier + before_save :check_default + + # Raw SQL to delete changesets and changes in the database + # has_many :changesets, :dependent => :destroy is too slow for big repositories + before_destroy :clear_changesets + + validates_length_of :login, maximum: 60, allow_nil: true + validates_length_of :password, :maximum => 255, :allow_nil => true + validates_length_of :root_url, :url, maximum: 255 + validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH, :allow_blank => true + validates_uniqueness_of :identifier, :scope => :project_id + validates_exclusion_of :identifier, :in => %w(browse show entry raw changes annotate diff statistics graph revisions revision) + # donwcase letters, digits, dashes, underscores but not digits only + validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :allow_blank => true + # Checks if the SCM is enabled when creating a repository + validate :repo_create_validation, :on => :create + validate :validate_repository_path + attr_protected :id + + safe_attributes 'identifier', + 'login', + 'password', + 'path_encoding', + 'log_encoding', + 'is_default' + + safe_attributes 'url', + :if => lambda {|repository, user| repository.new_record?} + + def repo_create_validation + unless Setting.enabled_scm.include?(self.class.name.demodulize) + errors.add(:type, :invalid) + end + end + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "log_encoding" + attr_name = "commit_logs_encoding" + end + super(attr_name, *args) + end + + # Removes leading and trailing whitespace + def url=(arg) + write_attribute(:url, arg ? arg.to_s.strip : nil) + end + + # Removes leading and trailing whitespace + def root_url=(arg) + write_attribute(:root_url, arg ? arg.to_s.strip : nil) + end + + def password + read_ciphered_attribute(:password) + end + + def password=(arg) + write_ciphered_attribute(:password, arg) + end + + def scm_adapter + self.class.scm_adapter_class + end + + def scm + unless @scm + @scm = self.scm_adapter.new(url, root_url, + login, password, path_encoding) + if root_url.blank? && @scm.root_url.present? + update_attribute(:root_url, @scm.root_url) + end + end + @scm + end + + def scm_name + self.class.scm_name + end + + def name + if identifier.present? + identifier + elsif is_default? + l(:field_repository_is_default) + else + scm_name + end + end + + def identifier=(identifier) + super unless identifier_frozen? + end + + def identifier_frozen? + errors[:identifier].blank? && !(new_record? || identifier.blank?) + end + + def identifier_param + if is_default? + nil + elsif identifier.present? + identifier + else + id.to_s + end + end + + def <=>(repository) + if is_default? + -1 + elsif repository.is_default? + 1 + else + identifier.to_s <=> repository.identifier.to_s + end + end + + def self.find_by_identifier_param(param) + if param.to_s =~ /^\d+$/ + find_by_id(param) + else + find_by_identifier(param) + end + end + + # TODO: should return an empty hash instead of nil to avoid many ||{} + def extra_info + h = read_attribute(:extra_info) + h.is_a?(Hash) ? h : nil + end + + def merge_extra_info(arg) + h = extra_info || {} + return h if arg.nil? + h.merge!(arg) + write_attribute(:extra_info, h) + end + + def report_last_commit + true + end + + def supports_cat? + scm.supports_cat? + end + + def supports_annotate? + scm.supports_annotate? + end + + def supports_all_revisions? + true + end + + def supports_directory_revisions? + false + end + + def supports_revision_graph? + false + end + + def entry(path=nil, identifier=nil) + scm.entry(path, identifier) + end + + def scm_entries(path=nil, identifier=nil) + scm.entries(path, identifier) + end + protected :scm_entries + + def entries(path=nil, identifier=nil) + entries = scm_entries(path, identifier) + load_entries_changesets(entries) + entries + end + + def branches + scm.branches + end + + def tags + scm.tags + end + + def default_branch + nil + end + + def properties(path, identifier=nil) + scm.properties(path, identifier) + end + + def cat(path, identifier=nil) + scm.cat(path, identifier) + end + + def diff(path, rev, rev_to) + scm.diff(path, rev, rev_to) + end + + def diff_format_revisions(cs, cs_to, sep=':') + text = "" + text << cs_to.format_identifier + sep if cs_to + text << cs.format_identifier if cs + text + end + + # Returns a path relative to the url of the repository + def relative_path(path) + path + end + + # Finds and returns a revision with a number or the beginning of a hash + def find_changeset_by_name(name) + return nil if name.blank? + s = name.to_s + if s.match(/^\d*$/) + changesets.where("revision = ?", s).first + else + changesets.where("revision LIKE ?", s + '%').first + end + end + + def latest_changeset + @latest_changeset ||= changesets.first + end + + # Returns the latest changesets for +path+ + # Default behaviour is to search in cached changesets + def latest_changesets(path, rev, limit=10) + if path.blank? + changesets. + reorder("#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"). + limit(limit). + preload(:user). + to_a + else + filechanges. + where("path = ?", path.with_leading_slash). + reorder("#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"). + limit(limit). + preload(:changeset => :user). + collect(&:changeset) + end + end + + def scan_changesets_for_issue_ids + self.changesets.each(&:scan_comment_for_issue_ids) + end + + # Returns an array of committers usernames and associated user_id + def committers + @committers ||= Changeset.where(:repository_id => id).distinct.pluck(:committer, :user_id) + end + + # Maps committers username to a user ids + def committer_ids=(h) + if h.is_a?(Hash) + committers.each do |committer, user_id| + new_user_id = h[committer] + if new_user_id && (new_user_id.to_i != user_id.to_i) + new_user_id = (new_user_id.to_i > 0 ? new_user_id.to_i : nil) + Changeset.where(["repository_id = ? AND committer = ?", id, committer]). + update_all("user_id = #{new_user_id.nil? ? 'NULL' : new_user_id}") + end + end + @committers = nil + @found_committer_users = nil + true + else + false + end + end + + # Returns the Redmine User corresponding to the given +committer+ + # It will return nil if the committer is not yet mapped and if no User + # with the same username or email was found + def find_committer_user(committer) + unless committer.blank? + @found_committer_users ||= {} + return @found_committer_users[committer] if @found_committer_users.has_key?(committer) + + user = nil + c = changesets.where(:committer => committer). + includes(:user).references(:user).first + if c && c.user + user = c.user + elsif committer.strip =~ /^([^<]+)(<(.*)>)?$/ + username, email = $1.strip, $3 + u = User.find_by_login(username) + u ||= User.find_by_mail(email) unless email.blank? + user = u + end + @found_committer_users[committer] = user + user + end + end + + def repo_log_encoding + encoding = log_encoding.to_s.strip + encoding.blank? ? 'UTF-8' : encoding + end + + # Fetches new changesets for all repositories of active projects + # Can be called periodically by an external script + # eg. ruby script/runner "Repository.fetch_changesets" + def self.fetch_changesets + Project.active.has_module(:repository).all.each do |project| + project.repositories.each do |repository| + begin + repository.fetch_changesets + rescue Redmine::Scm::Adapters::CommandFailed => e + logger.error "scm: error during fetching changesets: #{e.message}" + end + end + end + end + + # scan changeset comments to find related and fixed issues for all repositories + def self.scan_changesets_for_issue_ids + all.each(&:scan_changesets_for_issue_ids) + end + + def self.scm_name + 'Abstract' + end + + def self.available_scm + subclasses.collect {|klass| [klass.scm_name, klass.name]} + end + + def self.factory(klass_name, *args) + repository_class(klass_name).new(*args) rescue nil + end + + def self.repository_class(class_name) + class_name = class_name.to_s.camelize + if Redmine::Scm::Base.all.include?(class_name) + "Repository::#{class_name}".constantize + end + end + + def self.scm_adapter_class + nil + end + + def self.scm_command + ret = "" + begin + ret = self.scm_adapter_class.client_command if self.scm_adapter_class + rescue Exception => e + logger.error "scm: error during get command: #{e.message}" + end + ret + end + + def self.scm_version_string + ret = "" + begin + ret = self.scm_adapter_class.client_version_string if self.scm_adapter_class + rescue Exception => e + logger.error "scm: error during get version string: #{e.message}" + end + ret + end + + def self.scm_available + ret = false + begin + ret = self.scm_adapter_class.client_available if self.scm_adapter_class + rescue Exception => e + logger.error "scm: error during get scm available: #{e.message}" + end + ret + end + + def set_as_default? + new_record? && project && Repository.where(:project_id => project.id).empty? + end + + # Returns a hash with statistics by author in the following form: + # { + # "John Smith" => { :commits => 45, :changes => 324 }, + # "Bob" => { ... } + # } + # + # Notes: + # - this hash honnors the users mapping defined for the repository + def stats_by_author + commits = Changeset.where("repository_id = ?", id).select("committer, user_id, count(*) as count").group("committer, user_id") + + #TODO: restore ordering ; this line probably never worked + #commits.to_a.sort! {|x, y| x.last <=> y.last} + + changes = Change.joins(:changeset).where("#{Changeset.table_name}.repository_id = ?", id).select("committer, user_id, count(*) as count").group("committer, user_id") + + user_ids = changesets.map(&:user_id).compact.uniq + authors_names = User.where(:id => user_ids).inject({}) do |memo, user| + memo[user.id] = user.to_s + memo + end + + (commits + changes).inject({}) do |hash, element| + mapped_name = element.committer + if username = authors_names[element.user_id.to_i] + mapped_name = username + end + hash[mapped_name] ||= { :commits_count => 0, :changes_count => 0 } + if element.is_a?(Changeset) + hash[mapped_name][:commits_count] += element.count.to_i + else + hash[mapped_name][:changes_count] += element.count.to_i + end + hash + end + end + + # Returns a scope of changesets that come from the same commit as the given changeset + # in different repositories that point to the same backend + def same_commits_in_scope(scope, changeset) + scope = scope.joins(:repository).where(:repositories => {:url => url, :root_url => root_url, :type => type}) + if changeset.scmid.present? + scope = scope.where(:scmid => changeset.scmid) + else + scope = scope.where(:revision => changeset.revision) + end + scope + end + + protected + + # Validates repository url based against an optional regular expression + # that can be set in the Redmine configuration file. + def validate_repository_path(attribute=:url) + regexp = Redmine::Configuration["scm_#{scm_name.to_s.downcase}_path_regexp"] + if changes[attribute] && regexp.present? + regexp = regexp.to_s.strip.gsub('%project%') {Regexp.escape(project.try(:identifier).to_s)} + unless send(attribute).to_s.match(Regexp.new("\\A#{regexp}\\z")) + errors.add(attribute, :invalid) + end + end + end + + def normalize_identifier + self.identifier = identifier.to_s.strip + end + + def check_default + if !is_default? && set_as_default? + self.is_default = true + end + if is_default? && is_default_changed? + Repository.where(["project_id = ?", project_id]).update_all(["is_default = ?", false]) + end + end + + def load_entries_changesets(entries) + if entries + entries.each do |entry| + if entry.lastrev && entry.lastrev.identifier + entry.changeset = find_changeset_by_name(entry.lastrev.identifier) + end + end + end + end + + private + + # Deletes repository data + def clear_changesets + cs = Changeset.table_name + ch = Change.table_name + ci = "#{table_name_prefix}changesets_issues#{table_name_suffix}" + cp = "#{table_name_prefix}changeset_parents#{table_name_suffix}" + + self.class.connection.delete("DELETE FROM #{ch} WHERE #{ch}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})") + self.class.connection.delete("DELETE FROM #{ci} WHERE #{ci}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})") + self.class.connection.delete("DELETE FROM #{cp} WHERE #{cp}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})") + self.class.connection.delete("DELETE FROM #{cs} WHERE #{cs}.repository_id = #{id}") + end +end diff --git a/app/models/repository/bazaar.rb b/app/models/repository/bazaar.rb new file mode 100644 index 0000000..9cc84da --- /dev/null +++ b/app/models/repository/bazaar.rb @@ -0,0 +1,124 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/bazaar_adapter' + +class Repository::Bazaar < Repository + attr_protected :root_url + validates_presence_of :url, :log_encoding + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "url" + attr_name = "path_to_repository" + end + super(attr_name, *args) + end + + def self.scm_adapter_class + Redmine::Scm::Adapters::BazaarAdapter + end + + def self.scm_name + 'Bazaar' + end + + def entry(path=nil, identifier=nil) + scm.bzr_path_encodig = log_encoding + scm.entry(path, identifier) + end + + def cat(path, identifier=nil) + scm.bzr_path_encodig = log_encoding + scm.cat(path, identifier) + end + + def annotate(path, identifier=nil) + scm.bzr_path_encodig = log_encoding + scm.annotate(path, identifier) + end + + def diff(path, rev, rev_to) + scm.bzr_path_encodig = log_encoding + scm.diff(path, rev, rev_to) + end + + def scm_entries(path=nil, identifier=nil) + scm.bzr_path_encodig = log_encoding + entries = scm.entries(path, identifier) + if entries + entries.each do |e| + next if e.lastrev.revision.blank? + # Set the filesize unless browsing a specific revision + if identifier.nil? && e.is_file? + full_path = File.join(root_url, e.path) + e.size = File.stat(full_path).size if File.file?(full_path) + end + c = Change. + includes(:changeset). + where("#{Change.table_name}.revision = ? and #{Changeset.table_name}.repository_id = ?", e.lastrev.revision, id). + order("#{Changeset.table_name}.revision DESC"). + first + if c + e.lastrev.identifier = c.changeset.revision + e.lastrev.name = c.changeset.revision + e.lastrev.author = c.changeset.committer + end + end + end + entries + end + protected :scm_entries + + def fetch_changesets + scm.bzr_path_encodig = log_encoding + scm_info = scm.info + if scm_info + # latest revision found in database + db_revision = latest_changeset ? latest_changeset.revision.to_i : 0 + # latest revision in the repository + scm_revision = scm_info.lastrev.identifier.to_i + if db_revision < scm_revision + logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug? + identifier_from = db_revision + 1 + while (identifier_from <= scm_revision) + # loads changesets by batches of 200 + identifier_to = [identifier_from + 199, scm_revision].min + revisions = scm.revisions('', identifier_to, identifier_from) + transaction do + revisions.reverse_each do |revision| + changeset = Changeset.create(:repository => self, + :revision => revision.identifier, + :committer => revision.author, + :committed_on => revision.time, + :scmid => revision.scmid, + :comments => revision.message) + + revision.paths.each do |change| + Change.create(:changeset => changeset, + :action => change[:action], + :path => change[:path], + :revision => change[:revision]) + end + end + end unless revisions.nil? + identifier_from = identifier_to + 1 + end + end + end + end +end diff --git a/app/models/repository/cvs.rb b/app/models/repository/cvs.rb new file mode 100644 index 0000000..4d4a51c --- /dev/null +++ b/app/models/repository/cvs.rb @@ -0,0 +1,213 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/cvs_adapter' +require 'digest/sha1' + +class Repository::Cvs < Repository + validates_presence_of :url, :root_url, :log_encoding + + safe_attributes 'root_url', + :if => lambda {|repository, user| repository.new_record?} + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "root_url" + attr_name = "cvsroot" + elsif attr_name == "url" + attr_name = "cvs_module" + end + super(attr_name, *args) + end + + def self.scm_adapter_class + Redmine::Scm::Adapters::CvsAdapter + end + + def self.scm_name + 'CVS' + end + + def entry(path=nil, identifier=nil) + rev = identifier.nil? ? nil : changesets.find_by_revision(identifier) + scm.entry(path, rev.nil? ? nil : rev.committed_on) + end + + def scm_entries(path=nil, identifier=nil) + rev = nil + if ! identifier.nil? + rev = changesets.find_by_revision(identifier) + return nil if rev.nil? + end + entries = scm.entries(path, rev.nil? ? nil : rev.committed_on) + if entries + entries.each() do |entry| + if ( ! entry.lastrev.nil? ) && ( ! entry.lastrev.revision.nil? ) + change = filechanges.where( + :revision => entry.lastrev.revision, + :path => scm.with_leading_slash(entry.path)).first + if change + entry.lastrev.identifier = change.changeset.revision + entry.lastrev.revision = change.changeset.revision + entry.lastrev.author = change.changeset.committer + # entry.lastrev.branch = change.branch + end + end + end + end + entries + end + protected :scm_entries + + def cat(path, identifier=nil) + rev = nil + if ! identifier.nil? + rev = changesets.find_by_revision(identifier) + return nil if rev.nil? + end + scm.cat(path, rev.nil? ? nil : rev.committed_on) + end + + def annotate(path, identifier=nil) + rev = nil + if ! identifier.nil? + rev = changesets.find_by_revision(identifier) + return nil if rev.nil? + end + scm.annotate(path, rev.nil? ? nil : rev.committed_on) + end + + def diff(path, rev, rev_to) + # convert rev to revision. CVS can't handle changesets here + diff=[] + changeset_from = changesets.find_by_revision(rev) + if rev_to.to_i > 0 + changeset_to = changesets.find_by_revision(rev_to) + end + changeset_from.filechanges.each() do |change_from| + revision_from = nil + revision_to = nil + if path.nil? || (change_from.path.starts_with? scm.with_leading_slash(path)) + revision_from = change_from.revision + end + if revision_from + if changeset_to + changeset_to.filechanges.each() do |change_to| + revision_to = change_to.revision if change_to.path == change_from.path + end + end + unless revision_to + revision_to = scm.get_previous_revision(revision_from) + end + file_diff = scm.diff(change_from.path, revision_from, revision_to) + diff = diff + file_diff unless file_diff.nil? + end + end + return diff + end + + def fetch_changesets + # some nifty bits to introduce a commit-id with cvs + # natively cvs doesn't provide any kind of changesets, + # there is only a revision per file. + # we now take a guess using the author, the commitlog and the commit-date. + + # last one is the next step to take. the commit-date is not equal for all + # commits in one changeset. cvs update the commit-date when the *,v file was touched. so + # we use a small delta here, to merge all changes belonging to _one_ changeset + time_delta = 10.seconds + fetch_since = latest_changeset ? latest_changeset.committed_on : nil + transaction do + tmp_rev_num = 1 + scm.revisions('', fetch_since, nil, :log_encoding => repo_log_encoding) do |revision| + # only add the change to the database, if it doen't exists. the cvs log + # is not exclusive at all. + tmp_time = revision.time.clone + unless filechanges.find_by_path_and_revision( + scm.with_leading_slash(revision.paths[0][:path]), + revision.paths[0][:revision] + ) + cmt = Changeset.normalize_comments(revision.message, repo_log_encoding) + author_utf8 = Changeset.to_utf8(revision.author, repo_log_encoding) + cs = changesets.where( + :committed_on => tmp_time - time_delta .. tmp_time + time_delta, + :committer => author_utf8, + :comments => cmt + ).first + # create a new changeset.... + unless cs + # we use a temporary revision number here (just for inserting) + # later on, we calculate a continuous positive number + tmp_time2 = tmp_time.clone.gmtime + branch = revision.paths[0][:branch] + scmid = branch + "-" + tmp_time2.strftime("%Y%m%d-%H%M%S") + cs = Changeset.create(:repository => self, + :revision => "tmp#{tmp_rev_num}", + :scmid => scmid, + :committer => revision.author, + :committed_on => tmp_time, + :comments => revision.message) + tmp_rev_num += 1 + end + # convert CVS-File-States to internal Action-abbreviations + # default action is (M)odified + action = "M" + if revision.paths[0][:action] == "Exp" && revision.paths[0][:revision] == "1.1" + action = "A" # add-action always at first revision (= 1.1) + elsif revision.paths[0][:action] == "dead" + action = "D" # dead-state is similar to Delete + end + Change.create( + :changeset => cs, + :action => action, + :path => scm.with_leading_slash(revision.paths[0][:path]), + :revision => revision.paths[0][:revision], + :branch => revision.paths[0][:branch] + ) + end + end + + # Renumber new changesets in chronological order + Changeset. + order('committed_on ASC, id ASC'). + where("repository_id = ? AND revision LIKE 'tmp%'", id). + each do |changeset| + changeset.update_attribute :revision, next_revision_number + end + end # transaction + @current_revision_number = nil + end + + protected + + # Overrides Repository#validate_repository_path to validate + # against root_url attribute. + def validate_repository_path(attribute=:root_url) + super(attribute) + end + + private + + # Returns the next revision number to assign to a CVS changeset + def next_revision_number + # Need to retrieve existing revision numbers to sort them as integers + sql = "SELECT revision FROM #{Changeset.table_name} " + sql << "WHERE repository_id = #{id} AND revision NOT LIKE 'tmp%'" + @current_revision_number ||= (self.class.connection.select_values(sql).collect(&:to_i).max || 0) + @current_revision_number += 1 + end +end diff --git a/app/models/repository/darcs.rb b/app/models/repository/darcs.rb new file mode 100644 index 0000000..8c1302c --- /dev/null +++ b/app/models/repository/darcs.rb @@ -0,0 +1,114 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/darcs_adapter' + +class Repository::Darcs < Repository + validates_presence_of :url, :log_encoding + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "url" + attr_name = "path_to_repository" + end + super(attr_name, *args) + end + + def self.scm_adapter_class + Redmine::Scm::Adapters::DarcsAdapter + end + + def self.scm_name + 'Darcs' + end + + def supports_directory_revisions? + true + end + + def entry(path=nil, identifier=nil) + patch = identifier.nil? ? nil : changesets.find_by_revision(identifier) + scm.entry(path, patch.nil? ? nil : patch.scmid) + end + + def scm_entries(path=nil, identifier=nil) + patch = nil + if ! identifier.nil? + patch = changesets.find_by_revision(identifier) + return nil if patch.nil? + end + entries = scm.entries(path, patch.nil? ? nil : patch.scmid) + if entries + entries.each do |entry| + # Search the DB for the entry's last change + if entry.lastrev && !entry.lastrev.scmid.blank? + changeset = changesets.find_by_scmid(entry.lastrev.scmid) + end + if changeset + entry.lastrev.identifier = changeset.revision + entry.lastrev.name = changeset.revision + entry.lastrev.time = changeset.committed_on + entry.lastrev.author = changeset.committer + end + end + end + entries + end + protected :scm_entries + + def cat(path, identifier=nil) + patch = identifier.nil? ? nil : changesets.find_by_revision(identifier.to_s) + scm.cat(path, patch.nil? ? nil : patch.scmid) + end + + def diff(path, rev, rev_to) + patch_from = changesets.find_by_revision(rev) + return nil if patch_from.nil? + patch_to = changesets.find_by_revision(rev_to) if rev_to + if path.blank? + path = patch_from.filechanges.collect{|change| change.path}.join(' ') + end + patch_from ? scm.diff(path, patch_from.scmid, patch_to ? patch_to.scmid : nil) : nil + end + + def fetch_changesets + scm_info = scm.info + if scm_info + db_last_id = latest_changeset ? latest_changeset.scmid : nil + next_rev = latest_changeset ? latest_changeset.revision.to_i + 1 : 1 + # latest revision in the repository + scm_revision = scm_info.lastrev.scmid + unless changesets.find_by_scmid(scm_revision) + revisions = scm.revisions('', db_last_id, nil, :with_path => true) + transaction do + revisions.reverse_each do |revision| + changeset = Changeset.create(:repository => self, + :revision => next_rev, + :scmid => revision.scmid, + :committer => revision.author, + :committed_on => revision.time, + :comments => revision.message) + revision.paths.each do |change| + changeset.create_change(change) + end + next_rev += 1 + end if revisions + end + end + end + end +end diff --git a/app/models/repository/filesystem.rb b/app/models/repository/filesystem.rb new file mode 100644 index 0000000..0a612ae --- /dev/null +++ b/app/models/repository/filesystem.rb @@ -0,0 +1,50 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# FileSystem adapter +# File written by Paul Rivier, at Demotera. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/filesystem_adapter' + +class Repository::Filesystem < Repository + attr_protected :root_url + validates_presence_of :url + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "url" + attr_name = "root_directory" + end + super(attr_name, *args) + end + + def self.scm_adapter_class + Redmine::Scm::Adapters::FilesystemAdapter + end + + def self.scm_name + 'Filesystem' + end + + def supports_all_revisions? + false + end + + def fetch_changesets + nil + end +end diff --git a/app/models/repository/git.rb b/app/models/repository/git.rb new file mode 100644 index 0000000..893dc53 --- /dev/null +++ b/app/models/repository/git.rb @@ -0,0 +1,265 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# Copyright (C) 2007 Patrick Aljord patcito@ŋmail.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/git_adapter' + +class Repository::Git < Repository + attr_protected :root_url + validates_presence_of :url + + safe_attributes 'report_last_commit' + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "url" + attr_name = "path_to_repository" + end + super(attr_name, *args) + end + + def self.scm_adapter_class + Redmine::Scm::Adapters::GitAdapter + end + + def self.scm_name + 'Git' + end + + def report_last_commit + return false if extra_info.nil? + v = extra_info["extra_report_last_commit"] + return false if v.nil? + v.to_s != '0' + end + + def report_last_commit=(arg) + merge_extra_info "extra_report_last_commit" => arg + end + + def supports_directory_revisions? + true + end + + def supports_revision_graph? + true + end + + def repo_log_encoding + 'UTF-8' + end + + # Returns the identifier for the given git changeset + def self.changeset_identifier(changeset) + changeset.scmid + end + + # Returns the readable identifier for the given git changeset + def self.format_changeset_identifier(changeset) + changeset.revision[0, 8] + end + + def branches + scm.branches + end + + def tags + scm.tags + end + + def default_branch + scm.default_branch + rescue Exception => e + logger.error "git: error during get default branch: #{e.message}" + nil + end + + def find_changeset_by_name(name) + if name.present? + changesets.where(:revision => name.to_s).first || + changesets.where('scmid LIKE ?', "#{name}%").first + end + end + + def scm_entries(path=nil, identifier=nil) + scm.entries(path, identifier, :report_last_commit => report_last_commit) + end + protected :scm_entries + + # With SCMs that have a sequential commit numbering, + # such as Subversion and Mercurial, + # Redmine is able to be clever and only fetch changesets + # going forward from the most recent one it knows about. + # + # However, Git does not have a sequential commit numbering. + # + # In order to fetch only new adding revisions, + # Redmine needs to save "heads". + # + # In Git and Mercurial, revisions are not in date order. + # Redmine Mercurial fixed issues. + # * Redmine Takes Too Long On Large Mercurial Repository + # http://www.redmine.org/issues/3449 + # * Sorting for changesets might go wrong on Mercurial repos + # http://www.redmine.org/issues/3567 + # + # Database revision column is text, so Redmine can not sort by revision. + # Mercurial has revision number, and revision number guarantees revision order. + # Redmine Mercurial model stored revisions ordered by database id to database. + # So, Redmine Mercurial model can use correct ordering revisions. + # + # Redmine Mercurial adapter uses "hg log -r 0:tip --limit 10" + # to get limited revisions from old to new. + # But, Git 1.7.3.4 does not support --reverse with -n or --skip. + # + # The repository can still be fully reloaded by calling #clear_changesets + # before fetching changesets (eg. for offline resync) + def fetch_changesets + scm_brs = branches + return if scm_brs.nil? || scm_brs.empty? + + h1 = extra_info || {} + h = h1.dup + repo_heads = scm_brs.map{ |br| br.scmid } + h["heads"] ||= [] + prev_db_heads = h["heads"].dup + if prev_db_heads.empty? + prev_db_heads += heads_from_branches_hash + end + return if prev_db_heads.sort == repo_heads.sort + + h["db_consistent"] ||= {} + if ! changesets.exists? + h["db_consistent"]["ordering"] = 1 + merge_extra_info(h) + self.save + elsif ! h["db_consistent"].has_key?("ordering") + h["db_consistent"]["ordering"] = 0 + merge_extra_info(h) + self.save + end + save_revisions(prev_db_heads, repo_heads) + end + + def save_revisions(prev_db_heads, repo_heads) + h = {} + opts = {} + opts[:reverse] = true + opts[:excludes] = prev_db_heads + opts[:includes] = repo_heads + + revisions = scm.revisions('', nil, nil, opts) + return if revisions.blank? + + # Make the search for existing revisions in the database in a more sufficient manner + # + # Git branch is the reference to the specific revision. + # Git can *delete* remote branch and *re-push* branch. + # + # $ git push remote :branch + # $ git push remote branch + # + # After deleting branch, revisions remain in repository until "git gc". + # On git 1.7.2.3, default pruning date is 2 weeks. + # So, "git log --not deleted_branch_head_revision" return code is 0. + # + # After re-pushing branch, "git log" returns revisions which are saved in database. + # So, Redmine needs to scan revisions and database every time. + # + # This is replacing the one-after-one queries. + # Find all revisions, that are in the database, and then remove them + # from the revision array. + # Then later we won't need any conditions for db existence. + # Query for several revisions at once, and remove them + # from the revisions array, if they are there. + # Do this in chunks, to avoid eventual memory problems + # (in case of tens of thousands of commits). + # If there are no revisions (because the original code's algorithm filtered them), + # then this part will be stepped over. + # We make queries, just if there is any revision. + limit = 100 + offset = 0 + revisions_copy = revisions.clone # revisions will change + while offset < revisions_copy.size + scmids = revisions_copy.slice(offset, limit).map{|x| x.scmid} + recent_changesets_slice = changesets.where(:scmid => scmids) + # Subtract revisions that redmine already knows about + recent_revisions = recent_changesets_slice.map{|c| c.scmid} + revisions.reject!{|r| recent_revisions.include?(r.scmid)} + offset += limit + end + revisions.each do |rev| + transaction do + # There is no search in the db for this revision, because above we ensured, + # that it's not in the db. + save_revision(rev) + end + end + h["heads"] = repo_heads.dup + merge_extra_info(h) + save(:validate => false) + end + private :save_revisions + + def save_revision(rev) + parents = (rev.parents || []).collect{|rp| find_changeset_by_name(rp)}.compact + changeset = Changeset.create( + :repository => self, + :revision => rev.identifier, + :scmid => rev.scmid, + :committer => rev.author, + :committed_on => rev.time, + :comments => rev.message, + :parents => parents + ) + unless changeset.new_record? + rev.paths.each { |change| changeset.create_change(change) } + end + changeset + end + private :save_revision + + def heads_from_branches_hash + h1 = extra_info || {} + h = h1.dup + h["branches"] ||= {} + h['branches'].map{|br, hs| hs['last_scmid']} + end + + def latest_changesets(path,rev,limit=10) + revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false) + return [] if revisions.nil? || revisions.empty? + changesets.where(:scmid => revisions.map {|c| c.scmid}).to_a + end + + def clear_extra_info_of_changesets + return if extra_info.nil? + v = extra_info["extra_report_last_commit"] + write_attribute(:extra_info, nil) + h = {} + h["extra_report_last_commit"] = v + merge_extra_info(h) + save(:validate => false) + end + private :clear_extra_info_of_changesets + + def clear_changesets + super + clear_extra_info_of_changesets + end + private :clear_changesets +end diff --git a/app/models/repository/mercurial.rb b/app/models/repository/mercurial.rb new file mode 100644 index 0000000..b9a767f --- /dev/null +++ b/app/models/repository/mercurial.rb @@ -0,0 +1,211 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/mercurial_adapter' + +class Repository::Mercurial < Repository + # sort changesets by revision number + has_many :changesets, + lambda {order("#{Changeset.table_name}.id DESC")}, + :foreign_key => 'repository_id' + + attr_protected :root_url + validates_presence_of :url + + # number of changesets to fetch at once + FETCH_AT_ONCE = 100 + + def self.human_attribute_name(attribute_key_name, *args) + attr_name = attribute_key_name.to_s + if attr_name == "url" + attr_name = "path_to_repository" + end + super(attr_name, *args) + end + + def self.scm_adapter_class + Redmine::Scm::Adapters::MercurialAdapter + end + + def self.scm_name + 'Mercurial' + end + + def supports_directory_revisions? + true + end + + def supports_revision_graph? + true + end + + def repo_log_encoding + 'UTF-8' + end + + # Returns the readable identifier for the given mercurial changeset + def self.format_changeset_identifier(changeset) + "#{changeset.revision}:#{changeset.scmid[0, 12]}" + end + + # Returns the identifier for the given Mercurial changeset + def self.changeset_identifier(changeset) + changeset.scmid + end + + def diff_format_revisions(cs, cs_to, sep=':') + super(cs, cs_to, ' ') + end + + def modify_entry_lastrev_identifier(entry) + if entry.lastrev && entry.lastrev.identifier + entry.lastrev.identifier = scmid_for_inserting_db(entry.lastrev.identifier) + end + end + private :modify_entry_lastrev_identifier + + def entry(path=nil, identifier=nil) + entry = scm.entry(path, identifier) + return nil if entry.nil? + modify_entry_lastrev_identifier(entry) + entry + end + + def scm_entries(path=nil, identifier=nil) + entries = scm.entries(path, identifier) + return nil if entries.nil? + entries.each {|entry| modify_entry_lastrev_identifier(entry)} + entries + end + protected :scm_entries + + # Finds and returns a revision with a number or the beginning of a hash + def find_changeset_by_name(name) + return nil if name.blank? + s = name.to_s + if /[^\d]/ =~ s or s.size > 8 + cs = changesets.where(:scmid => s).first + else + cs = changesets.where(:revision => s).first + end + return cs if cs + changesets.where('scmid LIKE ?', "#{s}%").first + end + + # Returns the latest changesets for +path+; sorted by revision number + # + # Because :order => 'id DESC' is defined at 'has_many', + # there is no need to set 'order'. + # But, MySQL test fails. + # Sqlite3 and PostgreSQL pass. + # Is this MySQL bug? + def latest_changesets(path, rev, limit=10) + changesets. + includes(:user). + where(latest_changesets_cond(path, rev, limit)). + references(:user). + limit(limit). + order("#{Changeset.table_name}.id DESC"). + to_a + end + + def is_short_id_in_db? + return @is_short_id_in_db unless @is_short_id_in_db.nil? + cs = changesets.first + @is_short_id_in_db = (!cs.nil? && cs.scmid.length != 40) + end + private :is_short_id_in_db? + + def scmid_for_inserting_db(scmid) + is_short_id_in_db? ? scmid[0, 12] : scmid + end + + def nodes_in_branch(rev, branch_limit) + scm.nodes_in_branch(rev, :limit => branch_limit).collect do |b| + scmid_for_inserting_db(b) + end + end + + def tag_scmid(rev) + scmid = scm.tagmap[rev] + scmid.nil? ? nil : scmid_for_inserting_db(scmid) + end + + def latest_changesets_cond(path, rev, limit) + cond, args = [], [] + if scm.branchmap.member? rev + # Mercurial named branch is *stable* in each revision. + # So, named branch can be stored in database. + # Mercurial provides *bookmark* which is equivalent with git branch. + # But, bookmark is not implemented. + cond << "#{Changeset.table_name}.scmid IN (?)" + # Revisions in root directory and sub directory are not equal. + # So, in order to get correct limit, we need to get all revisions. + # But, it is very heavy. + # Mercurial does not treat directory. + # So, "hg log DIR" is very heavy. + branch_limit = path.blank? ? limit : ( limit * 5 ) + args << nodes_in_branch(rev, branch_limit) + elsif last = rev ? find_changeset_by_name(tag_scmid(rev) || rev) : nil + cond << "#{Changeset.table_name}.id <= ?" + args << last.id + end + unless path.blank? + cond << "EXISTS (SELECT * FROM #{Change.table_name} + WHERE #{Change.table_name}.changeset_id = #{Changeset.table_name}.id + AND (#{Change.table_name}.path = ? + OR #{Change.table_name}.path LIKE ? ESCAPE ?))" + args << path.with_leading_slash + args << "#{path.with_leading_slash.gsub(%r{[%_\\]}) { |s| "\\#{s}" }}/%" << '\\' + end + [cond.join(' AND '), *args] unless cond.empty? + end + private :latest_changesets_cond + + def fetch_changesets + return if scm.info.nil? + scm_rev = scm.info.lastrev.revision.to_i + db_rev = latest_changeset ? latest_changeset.revision.to_i : -1 + return unless db_rev < scm_rev # already up-to-date + + logger.debug "Fetching changesets for repository #{url}" if logger + (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i| + scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re| + transaction do + parents = (re.parents || []).collect do |rp| + find_changeset_by_name(scmid_for_inserting_db(rp)) + end.compact + cs = Changeset.create(:repository => self, + :revision => re.revision, + :scmid => scmid_for_inserting_db(re.scmid), + :committer => re.author, + :committed_on => re.time, + :comments => re.message, + :parents => parents) + unless cs.new_record? + re.paths.each do |e| + if from_revision = e[:from_revision] + e[:from_revision] = scmid_for_inserting_db(from_revision) + end + cs.create_change(e) + end + end + end + end + end + end +end diff --git a/app/models/repository/subversion.rb b/app/models/repository/subversion.rb new file mode 100644 index 0000000..70d4977 --- /dev/null +++ b/app/models/repository/subversion.rb @@ -0,0 +1,117 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'redmine/scm/adapters/subversion_adapter' + +class Repository::Subversion < Repository + attr_protected :root_url + validates_presence_of :url + validates_format_of :url, :with => %r{\A(http|https|svn(\+[^\s:\/\\]+)?|file):\/\/.+}i + + def self.scm_adapter_class + Redmine::Scm::Adapters::SubversionAdapter + end + + def self.scm_name + 'Subversion' + end + + def supports_directory_revisions? + true + end + + def repo_log_encoding + 'UTF-8' + end + + def latest_changesets(path, rev, limit=10) + revisions = scm.revisions(path, rev, nil, :limit => limit) + if revisions + identifiers = revisions.collect(&:identifier).compact + changesets.where(:revision => identifiers).reorder("committed_on DESC").includes(:repository, :user).to_a + else + [] + end + end + + # Returns a path relative to the url of the repository + def relative_path(path) + path.gsub(Regexp.new("^\/?#{Regexp.escape(relative_url)}"), '') + end + + def fetch_changesets + scm_info = scm.info + if scm_info + # latest revision found in database + db_revision = latest_changeset ? latest_changeset.revision.to_i : 0 + # latest revision in the repository + scm_revision = scm_info.lastrev.identifier.to_i + if db_revision < scm_revision + logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug? + identifier_from = db_revision + 1 + while (identifier_from <= scm_revision) + # loads changesets by batches of 200 + identifier_to = [identifier_from + 199, scm_revision].min + revisions = scm.revisions('', identifier_to, identifier_from, :with_paths => true) + revisions.reverse_each do |revision| + transaction do + changeset = Changeset.create(:repository => self, + :revision => revision.identifier, + :committer => revision.author, + :committed_on => revision.time, + :comments => revision.message) + + revision.paths.each do |change| + changeset.create_change(change) + end unless changeset.new_record? + end + end unless revisions.nil? + identifier_from = identifier_to + 1 + end + end + end + end + + protected + + def load_entries_changesets(entries) + return unless entries + entries_with_identifier = + entries.select {|entry| entry.lastrev && entry.lastrev.identifier.present?} + identifiers = entries_with_identifier.map {|entry| entry.lastrev.identifier}.compact.uniq + if identifiers.any? + changesets_by_identifier = + changesets.where(:revision => identifiers). + includes(:user, :repository).group_by(&:revision) + entries_with_identifier.each do |entry| + if m = changesets_by_identifier[entry.lastrev.identifier] + entry.changeset = m.first + end + end + end + end + + private + + # Returns the relative url of the repository + # Eg: root_url = file:///var/svn/foo + # url = file:///var/svn/foo/bar + # => returns /bar + def relative_url + @relative_url ||= url.gsub(Regexp.new("^#{Regexp.escape(root_url || scm.root_url)}", Regexp::IGNORECASE), '') + end +end diff --git a/app/models/role.rb b/app/models/role.rb new file mode 100644 index 0000000..8bd2e72 --- /dev/null +++ b/app/models/role.rb @@ -0,0 +1,311 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Role < ActiveRecord::Base + include Redmine::SafeAttributes + + # Custom coder for the permissions attribute that should be an + # array of symbols. Rails 3 uses Psych which can be *unbelievably* + # slow on some platforms (eg. mingw32). + class PermissionsAttributeCoder + def self.load(str) + str.to_s.scan(/:([a-z0-9_]+)/).flatten.map(&:to_sym) + end + + def self.dump(value) + YAML.dump(value) + end + end + + # Built-in roles + BUILTIN_NON_MEMBER = 1 + BUILTIN_ANONYMOUS = 2 + + ISSUES_VISIBILITY_OPTIONS = [ + ['all', :label_issues_visibility_all], + ['default', :label_issues_visibility_public], + ['own', :label_issues_visibility_own] + ] + + TIME_ENTRIES_VISIBILITY_OPTIONS = [ + ['all', :label_time_entries_visibility_all], + ['own', :label_time_entries_visibility_own] + ] + + USERS_VISIBILITY_OPTIONS = [ + ['all', :label_users_visibility_all], + ['members_of_visible_projects', :label_users_visibility_members_of_visible_projects] + ] + + scope :sorted, lambda { order(:builtin, :position) } + scope :givable, lambda { order(:position).where(:builtin => 0) } + scope :builtin, lambda { |*args| + compare = (args.first == true ? 'not' : '') + where("#{compare} builtin = 0") + } + + before_destroy :check_deletable + has_many :workflow_rules, :dependent => :delete_all do + def copy(source_role) + ActiveSupport::Deprecation.warn "role.workflow_rules.copy is deprecated and will be removed in Redmine 4.0, use role.copy_worflow_rules instead" + proxy_association.owner.copy_workflow_rules(source_role) + end + end + has_and_belongs_to_many :custom_fields, :join_table => "#{table_name_prefix}custom_fields_roles#{table_name_suffix}", :foreign_key => "role_id" + + has_and_belongs_to_many :managed_roles, :class_name => 'Role', + :join_table => "#{table_name_prefix}roles_managed_roles#{table_name_suffix}", + :association_foreign_key => "managed_role_id" + + has_many :member_roles, :dependent => :destroy + has_many :members, :through => :member_roles + acts_as_positioned :scope => :builtin + + serialize :permissions, ::Role::PermissionsAttributeCoder + store :settings, :accessors => [:permissions_all_trackers, :permissions_tracker_ids] + attr_protected :builtin + + validates_presence_of :name + validates_uniqueness_of :name + validates_length_of :name, :maximum => 30 + validates_inclusion_of :issues_visibility, + :in => ISSUES_VISIBILITY_OPTIONS.collect(&:first), + :if => lambda {|role| role.respond_to?(:issues_visibility) && role.issues_visibility_changed?} + validates_inclusion_of :users_visibility, + :in => USERS_VISIBILITY_OPTIONS.collect(&:first), + :if => lambda {|role| role.respond_to?(:users_visibility) && role.users_visibility_changed?} + validates_inclusion_of :time_entries_visibility, + :in => TIME_ENTRIES_VISIBILITY_OPTIONS.collect(&:first), + :if => lambda {|role| role.respond_to?(:time_entries_visibility) && role.time_entries_visibility_changed?} + + safe_attributes 'name', + 'assignable', + 'position', + 'issues_visibility', + 'users_visibility', + 'time_entries_visibility', + 'all_roles_managed', + 'managed_role_ids', + 'permissions', + 'permissions_all_trackers', + 'permissions_tracker_ids' + + # Copies attributes from another role, arg can be an id or a Role + def copy_from(arg, options={}) + return unless arg.present? + role = arg.is_a?(Role) ? arg : Role.find_by_id(arg.to_s) + self.attributes = role.attributes.dup.except("id", "name", "position", "builtin", "permissions") + self.permissions = role.permissions.dup + self.managed_role_ids = role.managed_role_ids.dup + self + end + + def permissions=(perms) + perms = perms.collect {|p| p.to_sym unless p.blank? }.compact.uniq if perms + write_attribute(:permissions, perms) + end + + def add_permission!(*perms) + self.permissions = [] unless permissions.is_a?(Array) + + permissions_will_change! + perms.each do |p| + p = p.to_sym + permissions << p unless permissions.include?(p) + end + save! + end + + def remove_permission!(*perms) + return unless permissions.is_a?(Array) + permissions_will_change! + perms.each { |p| permissions.delete(p.to_sym) } + save! + end + + # Returns true if the role has the given permission + def has_permission?(perm) + !permissions.nil? && permissions.include?(perm.to_sym) + end + + def consider_workflow? + has_permission?(:add_issues) || has_permission?(:edit_issues) + end + + def <=>(role) + if role + if builtin == role.builtin + position <=> role.position + else + builtin <=> role.builtin + end + else + -1 + end + end + + def to_s + name + end + + def name + case builtin + when 1; l(:label_role_non_member, :default => read_attribute(:name)) + when 2; l(:label_role_anonymous, :default => read_attribute(:name)) + else; read_attribute(:name) + end + end + + # Return true if the role is a builtin role + def builtin? + self.builtin != 0 + end + + # Return true if the role is the anonymous role + def anonymous? + builtin == 2 + end + + # Return true if the role is a project member role + def member? + !self.builtin? + end + + # Return true if role is allowed to do the specified action + # action can be: + # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') + # * a permission Symbol (eg. :edit_project) + def allowed_to?(action) + if action.is_a? Hash + allowed_actions.include? "#{action[:controller]}/#{action[:action]}" + else + allowed_permissions.include? action + end + end + + # Return all the permissions that can be given to the role + def setable_permissions + setable_permissions = Redmine::AccessControl.permissions - Redmine::AccessControl.public_permissions + setable_permissions -= Redmine::AccessControl.members_only_permissions if self.builtin == BUILTIN_NON_MEMBER + setable_permissions -= Redmine::AccessControl.loggedin_only_permissions if self.builtin == BUILTIN_ANONYMOUS + setable_permissions + end + + def permissions_tracker_ids(*args) + if args.any? + Array(permissions_tracker_ids[args.first.to_s]).map(&:to_i) + else + super || {} + end + end + + def permissions_tracker_ids=(arg) + h = arg.to_hash + h.values.each {|v| v.reject!(&:blank?)} + super(h) + end + + # Returns true if tracker_id belongs to the list of + # trackers for which permission is given + def permissions_tracker_ids?(permission, tracker_id) + permissions_tracker_ids(permission).include?(tracker_id) + end + + def permissions_all_trackers + super || {} + end + + def permissions_all_trackers=(arg) + super(arg.to_hash) + end + + # Returns true if permission is given for all trackers + def permissions_all_trackers?(permission) + permissions_all_trackers[permission.to_s].to_s != '0' + end + + # Returns true if permission is given for the tracker + # (explicitly or for all trackers) + def permissions_tracker?(permission, tracker) + permissions_all_trackers?(permission) || + permissions_tracker_ids?(permission, tracker.try(:id)) + end + + # Sets the trackers that are allowed for a permission. + # tracker_ids can be an array of tracker ids or :all for + # no restrictions. + # + # Examples: + # role.set_permission_trackers :add_issues, [1, 3] + # role.set_permission_trackers :add_issues, :all + def set_permission_trackers(permission, tracker_ids) + h = {permission.to_s => (tracker_ids == :all ? '1' : '0')} + self.permissions_all_trackers = permissions_all_trackers.merge(h) + + h = {permission.to_s => (tracker_ids == :all ? [] : tracker_ids)} + self.permissions_tracker_ids = permissions_tracker_ids.merge(h) + + self + end + + def copy_workflow_rules(source_role) + WorkflowRule.copy(nil, source_role, nil, self) + end + + # Find all the roles that can be given to a project member + def self.find_all_givable + Role.givable.to_a + end + + # Return the builtin 'non member' role. If the role doesn't exist, + # it will be created on the fly. + def self.non_member + find_or_create_system_role(BUILTIN_NON_MEMBER, 'Non member') + end + + # Return the builtin 'anonymous' role. If the role doesn't exist, + # it will be created on the fly. + def self.anonymous + find_or_create_system_role(BUILTIN_ANONYMOUS, 'Anonymous') + end + +private + + def allowed_permissions + @allowed_permissions ||= permissions + Redmine::AccessControl.public_permissions.collect {|p| p.name} + end + + def allowed_actions + @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten + end + + def check_deletable + raise "Cannot delete role" if members.any? + raise "Cannot delete builtin role" if builtin? + end + + def self.find_or_create_system_role(builtin, name) + role = unscoped.where(:builtin => builtin).first + if role.nil? + role = unscoped.create(:name => name) do |r| + r.builtin = builtin + end + raise "Unable to create the #{name} role (#{role.errors.full_messages.join(',')})." if role.new_record? + end + role + end +end diff --git a/app/models/setting.rb b/app/models/setting.rb new file mode 100644 index 0000000..102bc65 --- /dev/null +++ b/app/models/setting.rb @@ -0,0 +1,321 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Setting < ActiveRecord::Base + + DATE_FORMATS = [ + '%Y-%m-%d', + '%d/%m/%Y', + '%d.%m.%Y', + '%d-%m-%Y', + '%m/%d/%Y', + '%d %b %Y', + '%d %B %Y', + '%b %d, %Y', + '%B %d, %Y' + ] + + TIME_FORMATS = [ + '%H:%M', + '%I:%M %p' + ] + + ENCODINGS = %w(US-ASCII + windows-1250 + windows-1251 + windows-1252 + windows-1253 + windows-1254 + windows-1255 + windows-1256 + windows-1257 + windows-1258 + windows-31j + ISO-2022-JP + ISO-2022-KR + ISO-8859-1 + ISO-8859-2 + ISO-8859-3 + ISO-8859-4 + ISO-8859-5 + ISO-8859-6 + ISO-8859-7 + ISO-8859-8 + ISO-8859-9 + ISO-8859-13 + ISO-8859-15 + KOI8-R + UTF-8 + UTF-16 + UTF-16BE + UTF-16LE + EUC-JP + Shift_JIS + CP932 + GB18030 + GBK + ISCII91 + EUC-KR + Big5 + Big5-HKSCS + TIS-620) + + cattr_accessor :available_settings + self.available_settings ||= {} + + validates_uniqueness_of :name, :if => Proc.new {|setting| setting.new_record? || setting.name_changed?} + validates_inclusion_of :name, :in => Proc.new {available_settings.keys} + validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting| + (s = available_settings[setting.name]) && s['format'] == 'int' + } + attr_protected :id + + # Hash used to cache setting values + @cached_settings = {} + @cached_cleared_on = Time.now + + def value + v = read_attribute(:value) + # Unserialize serialized settings + if available_settings[name]['serialized'] && v.is_a?(String) + v = YAML::load(v) + v = force_utf8_strings(v) + end + v = v.to_sym if available_settings[name]['format'] == 'symbol' && !v.blank? + v + end + + def value=(v) + v = v.to_yaml if v && available_settings[name] && available_settings[name]['serialized'] + write_attribute(:value, v.to_s) + end + + # Returns the value of the setting named name + def self.[](name) + v = @cached_settings[name] + v ? v : (@cached_settings[name] = find_or_default(name).value) + end + + def self.[]=(name, v) + setting = find_or_default(name) + setting.value = (v ? v : "") + @cached_settings[name] = nil + setting.save + setting.value + end + + # Updates multiple settings from params and sends a security notification if needed + def self.set_all_from_params(settings) + return nil unless settings.is_a?(Hash) + settings = settings.dup.symbolize_keys + + errors = validate_all_from_params(settings) + return errors if errors.present? + + changes = [] + settings.each do |name, value| + next unless available_settings[name.to_s] + previous_value = Setting[name] + set_from_params name, value + if available_settings[name.to_s]['security_notifications'] && Setting[name] != previous_value + changes << name + end + end + if changes.any? + Mailer.security_settings_updated(changes) + end + nil + end + + def self.validate_all_from_params(settings) + messages = [] + + if settings.key?(:mail_handler_body_delimiters) || settings.key?(:mail_handler_enable_regex_delimiters) + regexp = Setting.mail_handler_enable_regex_delimiters? + if settings.key?(:mail_handler_enable_regex_delimiters) + regexp = settings[:mail_handler_enable_regex_delimiters].to_s != '0' + end + if regexp + settings[:mail_handler_body_delimiters].to_s.split(/[\r\n]+/).each do |delimiter| + begin + Regexp.new(delimiter) + rescue RegexpError => e + messages << [:mail_handler_body_delimiters, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"] + end + end + end + end + + messages + end + + # Sets a setting value from params + def self.set_from_params(name, params) + params = params.dup + params.delete_if {|v| v.blank? } if params.is_a?(Array) + params.symbolize_keys! if params.is_a?(Hash) + + m = "#{name}_from_params" + if respond_to? m + self[name.to_sym] = send m, params + else + self[name.to_sym] = params + end + end + + # Returns a hash suitable for commit_update_keywords setting + # + # Example: + # params = {:keywords => ['fixes', 'closes'], :status_id => ["3", "5"], :done_ratio => ["", "100"]} + # Setting.commit_update_keywords_from_params(params) + # # => [{'keywords => 'fixes', 'status_id' => "3"}, {'keywords => 'closes', 'status_id' => "5", 'done_ratio' => "100"}] + def self.commit_update_keywords_from_params(params) + s = [] + if params.is_a?(Hash) && params.key?(:keywords) && params.values.all? {|v| v.is_a? Array} + attributes = params.except(:keywords).keys + params[:keywords].each_with_index do |keywords, i| + next if keywords.blank? + s << attributes.inject({}) {|h, a| + value = params[a][i].to_s + h[a.to_s] = value if value.present? + h + }.merge('keywords' => keywords) + end + end + s + end + + # Helper that returns an array based on per_page_options setting + def self.per_page_options_array + per_page_options.split(%r{[\s,]}).collect(&:to_i).select {|n| n > 0}.sort + end + + # Helper that returns a Hash with single update keywords as keys + def self.commit_update_keywords_array + a = [] + if commit_update_keywords.is_a?(Array) + commit_update_keywords.each do |rule| + next unless rule.is_a?(Hash) + rule = rule.dup + rule.delete_if {|k, v| v.blank?} + keywords = rule['keywords'].to_s.downcase.split(",").map(&:strip).reject(&:blank?) + next if keywords.empty? + a << rule.merge('keywords' => keywords) + end + end + a + end + + def self.openid? + Object.const_defined?(:OpenID) && self[:openid].to_i > 0 + end + + # Checks if settings have changed since the values were read + # and clears the cache hash if it's the case + # Called once per request + def self.check_cache + settings_updated_on = Setting.maximum(:updated_on) + if settings_updated_on && @cached_cleared_on <= settings_updated_on + clear_cache + end + end + + # Clears the settings cache + def self.clear_cache + @cached_settings.clear + @cached_cleared_on = Time.now + logger.info "Settings cache cleared." if logger + end + + def self.define_plugin_setting(plugin) + if plugin.settings + name = "plugin_#{plugin.id}" + define_setting name, {'default' => plugin.settings[:default], 'serialized' => true} + end + end + + # Defines getter and setter for each setting + # Then setting values can be read using: Setting.some_setting_name + # or set using Setting.some_setting_name = "some value" + def self.define_setting(name, options={}) + available_settings[name.to_s] = options + + src = <<-END_SRC + def self.#{name} + self[:#{name}] + end + + def self.#{name}? + self[:#{name}].to_i > 0 + end + + def self.#{name}=(value) + self[:#{name}] = value + end +END_SRC + class_eval src, __FILE__, __LINE__ + end + + def self.load_available_settings + YAML::load(File.open("#{Rails.root}/config/settings.yml")).each do |name, options| + define_setting name, options + end + end + + def self.load_plugin_settings + Redmine::Plugin.all.each do |plugin| + define_plugin_setting(plugin) + end + end + + load_available_settings + load_plugin_settings + +private + + def force_utf8_strings(arg) + if arg.is_a?(String) + arg.dup.force_encoding('UTF-8') + elsif arg.is_a?(Array) + arg.map do |a| + force_utf8_strings(a) + end + elsif arg.is_a?(Hash) + arg = arg.dup + arg.each do |k,v| + arg[k] = force_utf8_strings(v) + end + arg + else + arg + end + end + + # Returns the Setting instance for the setting named name + # (record found in database or new record with default value) + def self.find_or_default(name) + name = name.to_s + raise "There's no setting named #{name}" unless available_settings.has_key?(name) + setting = where(:name => name).order(:id => :desc).first + unless setting + setting = new + setting.name = name + setting.value = available_settings[name]['default'] + end + setting + end +end diff --git a/app/models/time_entry.rb b/app/models/time_entry.rb new file mode 100644 index 0000000..1e0f5bc --- /dev/null +++ b/app/models/time_entry.rb @@ -0,0 +1,169 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TimeEntry < ActiveRecord::Base + include Redmine::SafeAttributes + # could have used polymorphic association + # project association here allows easy loading of time entries at project level with one database trip + belongs_to :project + belongs_to :issue + belongs_to :user + belongs_to :activity, :class_name => 'TimeEntryActivity' + + attr_protected :user_id, :tyear, :tmonth, :tweek + + acts_as_customizable + acts_as_event :title => Proc.new { |o| + related = o.issue if o.issue && o.issue.visible? + related ||= o.project + "#{l_hours(o.hours)} (#{related.event_title})" + }, + :url => Proc.new {|o| {:controller => 'timelog', :action => 'index', :project_id => o.project, :issue_id => o.issue}}, + :author => :user, + :group => :issue, + :description => :comments + + acts_as_activity_provider :timestamp => "#{table_name}.created_on", + :author_key => :user_id, + :scope => joins(:project).preload(:project) + + validates_presence_of :user_id, :activity_id, :project_id, :hours, :spent_on + validates_presence_of :issue_id, :if => lambda { Setting.timelog_required_fields.include?('issue_id') } + validates_presence_of :comments, :if => lambda { Setting.timelog_required_fields.include?('comments') } + validates_numericality_of :hours, :allow_nil => true, :message => :invalid + validates_length_of :comments, :maximum => 1024, :allow_nil => true + validates :spent_on, :date => true + before_validation :set_project_if_nil + validate :validate_time_entry + + scope :visible, lambda {|*args| + joins(:project). + where(TimeEntry.visible_condition(args.shift || User.current, *args)) + } + scope :left_join_issue, lambda { + joins("LEFT OUTER JOIN #{Issue.table_name} ON #{Issue.table_name}.id = #{TimeEntry.table_name}.issue_id") + } + scope :on_issue, lambda {|issue| + joins(:issue). + where("#{Issue.table_name}.root_id = #{issue.root_id} AND #{Issue.table_name}.lft >= #{issue.lft} AND #{Issue.table_name}.rgt <= #{issue.rgt}") + } + + safe_attributes 'hours', 'comments', 'project_id', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields' + + # Returns a SQL conditions string used to find all time entries visible by the specified user + def self.visible_condition(user, options={}) + Project.allowed_to_condition(user, :view_time_entries, options) do |role, user| + if role.time_entries_visibility == 'all' + nil + elsif role.time_entries_visibility == 'own' && user.id && user.logged? + "#{table_name}.user_id = #{user.id}" + else + '1=0' + end + end + end + + # Returns true if user or current user is allowed to view the time entry + def visible?(user=nil) + (user || User.current).allowed_to?(:view_time_entries, self.project) do |role, user| + if role.time_entries_visibility == 'all' + true + elsif role.time_entries_visibility == 'own' + self.user == user + else + false + end + end + end + + def initialize(attributes=nil, *args) + super + if new_record? && self.activity.nil? + if default_activity = TimeEntryActivity.default + self.activity_id = default_activity.id + end + self.hours = nil if hours == 0 + end + end + + def safe_attributes=(attrs, user=User.current) + if attrs + attrs = super(attrs) + if issue_id_changed? && issue + if issue.visible?(user) && user.allowed_to?(:log_time, issue.project) + if attrs[:project_id].blank? && issue.project_id != project_id + self.project_id = issue.project_id + end + @invalid_issue_id = nil + else + @invalid_issue_id = issue_id + end + end + end + attrs + end + + def set_project_if_nil + self.project = issue.project if issue && project.nil? + end + + def validate_time_entry + errors.add :hours, :invalid if hours && (hours < 0 || hours >= 1000) + errors.add :project_id, :invalid if project.nil? + errors.add :issue_id, :invalid if (issue_id && !issue) || (issue && project!=issue.project) || @invalid_issue_id + errors.add :activity_id, :inclusion if activity_id_changed? && project && !project.activities.include?(activity) + end + + def hours=(h) + write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h) + end + + def hours + h = read_attribute(:hours) + if h.is_a?(Float) + h.round(2) + else + h + end + end + + # tyear, tmonth, tweek assigned where setting spent_on attributes + # these attributes make time aggregations easier + def spent_on=(date) + super + self.tyear = spent_on ? spent_on.year : nil + self.tmonth = spent_on ? spent_on.month : nil + self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil + end + + # Returns true if the time entry can be edited by usr, otherwise false + def editable_by?(usr) + visible?(usr) && ( + (usr == user && usr.allowed_to?(:edit_own_time_entries, project)) || usr.allowed_to?(:edit_time_entries, project) + ) + end + + # Returns the custom_field_values that can be edited by the given user + def editable_custom_field_values(user=nil) + visible_custom_field_values + end + + # Returns the custom fields that can be edited by the given user + def editable_custom_fields(user=nil) + editable_custom_field_values(user).map(&:custom_field).uniq + end +end diff --git a/app/models/time_entry_activity.rb b/app/models/time_entry_activity.rb new file mode 100644 index 0000000..62fd18b --- /dev/null +++ b/app/models/time_entry_activity.rb @@ -0,0 +1,38 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TimeEntryActivity < Enumeration + has_many :time_entries, :foreign_key => 'activity_id' + + OptionName = :enumeration_activities + + def option_name + OptionName + end + + def objects + TimeEntry.where(:activity_id => self_and_descendants(1).map(&:id)) + end + + def objects_count + objects.count + end + + def transfer_relations(to) + objects.update_all(:activity_id => to.id) + end +end diff --git a/app/models/time_entry_activity_custom_field.rb b/app/models/time_entry_activity_custom_field.rb new file mode 100644 index 0000000..93bc682 --- /dev/null +++ b/app/models/time_entry_activity_custom_field.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TimeEntryActivityCustomField < CustomField + def type_name + :enumeration_activities + end +end diff --git a/app/models/time_entry_custom_field.rb b/app/models/time_entry_custom_field.rb new file mode 100644 index 0000000..78bfb9d --- /dev/null +++ b/app/models/time_entry_custom_field.rb @@ -0,0 +1,23 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TimeEntryCustomField < CustomField + def type_name + :label_spent_time + end +end + diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb new file mode 100644 index 0000000..4092efc --- /dev/null +++ b/app/models/time_entry_query.rb @@ -0,0 +1,227 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class TimeEntryQuery < Query + + self.queried_class = TimeEntry + self.view_permission = :view_time_entries + + self.available_columns = [ + QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true), + QueryColumn.new(:spent_on, :sortable => ["#{TimeEntry.table_name}.spent_on", "#{TimeEntry.table_name}.created_on"], :default_order => 'desc', :groupable => true), + QueryColumn.new(:tweek, :sortable => ["#{TimeEntry.table_name}.spent_on", "#{TimeEntry.table_name}.created_on"], :caption => :label_week), + QueryColumn.new(:user, :sortable => lambda {User.fields_for_order_statement}, :groupable => true), + QueryColumn.new(:activity, :sortable => "#{TimeEntryActivity.table_name}.position", :groupable => true), + QueryColumn.new(:issue, :sortable => "#{Issue.table_name}.id"), + QueryAssociationColumn.new(:issue, :tracker, :caption => :field_tracker, :sortable => "#{Tracker.table_name}.position"), + QueryAssociationColumn.new(:issue, :status, :caption => :field_status, :sortable => "#{IssueStatus.table_name}.position"), + QueryColumn.new(:comments), + QueryColumn.new(:hours, :sortable => "#{TimeEntry.table_name}.hours", :totalable => true), + ] + + def initialize(attributes=nil, *args) + super attributes + self.filters ||= { 'spent_on' => {:operator => "*", :values => []} } + end + + def initialize_available_filters + add_available_filter "spent_on", :type => :date_past + + add_available_filter("project_id", + :type => :list, :values => lambda { project_values } + ) if project.nil? + + if project && !project.leaf? + add_available_filter "subproject_id", + :type => :list_subprojects, + :values => lambda { subproject_values } + end + + add_available_filter("issue_id", :type => :tree, :label => :label_issue) + add_available_filter("issue.tracker_id", + :type => :list, + :name => l("label_attribute_of_issue", :name => l(:field_tracker)), + :values => lambda { trackers.map {|t| [t.name, t.id.to_s]} }) + add_available_filter("issue.status_id", + :type => :list, + :name => l("label_attribute_of_issue", :name => l(:field_status)), + :values => lambda { issue_statuses_values }) + add_available_filter("issue.fixed_version_id", + :type => :list, + :name => l("label_attribute_of_issue", :name => l(:field_fixed_version)), + :values => lambda { fixed_version_values }) + + add_available_filter("user_id", + :type => :list_optional, :values => lambda { author_values } + ) + + activities = (project ? project.activities : TimeEntryActivity.shared) + add_available_filter("activity_id", + :type => :list, :values => activities.map {|a| [a.name, a.id.to_s]} + ) + + add_available_filter "comments", :type => :text + add_available_filter "hours", :type => :float + + add_custom_fields_filters(TimeEntryCustomField) + add_associations_custom_fields_filters :project + add_custom_fields_filters(issue_custom_fields, :issue) + add_associations_custom_fields_filters :user + end + + def available_columns + return @available_columns if @available_columns + @available_columns = self.class.available_columns.dup + @available_columns += TimeEntryCustomField.visible. + map {|cf| QueryCustomFieldColumn.new(cf) } + @available_columns += issue_custom_fields.visible. + map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf, :totalable => false) } + @available_columns += ProjectCustomField.visible. + map {|cf| QueryAssociationCustomFieldColumn.new(:project, cf) } + @available_columns + end + + def default_columns_names + @default_columns_names ||= begin + default_columns = [:spent_on, :user, :activity, :issue, :comments, :hours] + + project.present? ? default_columns : [:project] | default_columns + end + end + + def default_totalable_names + [:hours] + end + + def default_sort_criteria + [['spent_on', 'desc']] + end + + # If a filter against a single issue is set, returns its id, otherwise nil. + def filtered_issue_id + if value_for('issue_id').to_s =~ /\A(\d+)\z/ + $1 + end + end + + def base_scope + TimeEntry.visible. + joins(:project, :user). + includes(:activity). + references(:activity). + left_join_issue. + where(statement) + end + + def results_scope(options={}) + order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) + + base_scope. + order(order_option). + joins(joins_for_order_statement(order_option.join(','))) + end + + # Returns sum of all the spent hours + def total_for_hours(scope) + map_total(scope.sum(:hours)) {|t| t.to_f.round(2)} + end + + def sql_for_issue_id_field(field, operator, value) + case operator + when "=" + "#{TimeEntry.table_name}.issue_id = #{value.first.to_i}" + when "~" + issue = Issue.where(:id => value.first.to_i).first + if issue && (issue_ids = issue.self_and_descendants.pluck(:id)).any? + "#{TimeEntry.table_name}.issue_id IN (#{issue_ids.join(',')})" + else + "1=0" + end + when "!*" + "#{TimeEntry.table_name}.issue_id IS NULL" + when "*" + "#{TimeEntry.table_name}.issue_id IS NOT NULL" + end + end + + def sql_for_issue_fixed_version_id_field(field, operator, value) + issue_ids = Issue.where(:fixed_version_id => value.map(&:to_i)).pluck(:id) + case operator + when "=" + if issue_ids.any? + "#{TimeEntry.table_name}.issue_id IN (#{issue_ids.join(',')})" + else + "1=0" + end + when "!" + if issue_ids.any? + "#{TimeEntry.table_name}.issue_id NOT IN (#{issue_ids.join(',')})" + else + "1=1" + end + end + end + + def sql_for_activity_id_field(field, operator, value) + condition_on_id = sql_for_field(field, operator, value, Enumeration.table_name, 'id') + condition_on_parent_id = sql_for_field(field, operator, value, Enumeration.table_name, 'parent_id') + ids = value.map(&:to_i).join(',') + table_name = Enumeration.table_name + if operator == '=' + "(#{table_name}.id IN (#{ids}) OR #{table_name}.parent_id IN (#{ids}))" + else + "(#{table_name}.id NOT IN (#{ids}) AND (#{table_name}.parent_id IS NULL OR #{table_name}.parent_id NOT IN (#{ids})))" + end + end + + def sql_for_issue_tracker_id_field(field, operator, value) + sql_for_field("tracker_id", operator, value, Issue.table_name, "tracker_id") + end + + def sql_for_issue_status_id_field(field, operator, value) + sql_for_field("status_id", operator, value, Issue.table_name, "status_id") + end + + # Accepts :from/:to params as shortcut filters + def build_from_params(params) + super + if params[:from].present? && params[:to].present? + add_filter('spent_on', '><', [params[:from], params[:to]]) + elsif params[:from].present? + add_filter('spent_on', '>=', [params[:from]]) + elsif params[:to].present? + add_filter('spent_on', '<=', [params[:to]]) + end + self + end + + def joins_for_order_statement(order_options) + joins = [super] + + if order_options + if order_options.include?('issue_statuses') + joins << "LEFT OUTER JOIN #{IssueStatus.table_name} ON #{IssueStatus.table_name}.id = #{Issue.table_name}.status_id" + end + if order_options.include?('trackers') + joins << "LEFT OUTER JOIN #{Tracker.table_name} ON #{Tracker.table_name}.id = #{Issue.table_name}.tracker_id" + end + end + + joins.compact! + joins.any? ? joins.join(' ') : nil + end +end diff --git a/app/models/token.rb b/app/models/token.rb new file mode 100644 index 0000000..ee43865 --- /dev/null +++ b/app/models/token.rb @@ -0,0 +1,144 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Token < ActiveRecord::Base + belongs_to :user + validates_uniqueness_of :value + attr_protected :id + + before_create :delete_previous_tokens, :generate_new_token + + cattr_accessor :validity_time + self.validity_time = 1.day + + class << self + attr_reader :actions + + def add_action(name, options) + options.assert_valid_keys(:max_instances, :validity_time) + @actions ||= {} + @actions[name.to_s] = options + end + end + + add_action :api, max_instances: 1, validity_time: nil + add_action :autologin, max_instances: 10, validity_time: Proc.new { Setting.autologin.to_i.days } + add_action :feeds, max_instances: 1, validity_time: nil + add_action :recovery, max_instances: 1, validity_time: Proc.new { Token.validity_time } + add_action :register, max_instances: 1, validity_time: Proc.new { Token.validity_time } + add_action :session, max_instances: 10, validity_time: nil + + def generate_new_token + self.value = Token.generate_token_value + end + + # Return true if token has expired + def expired? + validity_time = self.class.invalid_when_created_before(action) + validity_time.present? && created_on < validity_time + end + + def max_instances + Token.actions.has_key?(action) ? Token.actions[action][:max_instances] : 1 + end + + def self.invalid_when_created_before(action = nil) + if Token.actions.has_key?(action) + validity_time = Token.actions[action][:validity_time] + validity_time = validity_time.call(action) if validity_time.respond_to? :call + else + validity_time = self.validity_time + end + + if validity_time + Time.now - validity_time + end + end + + # Delete all expired tokens + def self.destroy_expired + t = Token.arel_table + + # Unknown actions have default validity_time + condition = t[:action].not_in(self.actions.keys).and(t[:created_on].lt(invalid_when_created_before)) + + self.actions.each do |action, options| + validity_time = invalid_when_created_before(action) + + # Do not delete tokens, which don't become invalid + next if validity_time.nil? + + condition = condition.or( + t[:action].eq(action).and(t[:created_on].lt(validity_time)) + ) + end + + Token.where(condition).delete_all + end + + # Returns the active user who owns the key for the given action + def self.find_active_user(action, key, validity_days=nil) + user = find_user(action, key, validity_days) + if user && user.active? + user + end + end + + # Returns the user who owns the key for the given action + def self.find_user(action, key, validity_days=nil) + token = find_token(action, key, validity_days) + if token + token.user + end + end + + # Returns the token for action and key with an optional + # validity duration (in number of days) + def self.find_token(action, key, validity_days=nil) + action = action.to_s + key = key.to_s + return nil unless action.present? && key =~ /\A[a-z0-9]+\z/i + + token = Token.where(:action => action, :value => key).first + if token && (token.action == action) && (token.value == key) && token.user + if validity_days.nil? || (token.created_on > validity_days.days.ago) + token + end + end + end + + def self.generate_token_value + Redmine::Utils.random_hex(20) + end + + private + + # Removes obsolete tokens (same user and action) + def delete_previous_tokens + if user + scope = Token.where(:user_id => user.id, :action => action) + if max_instances > 1 + ids = scope.order(:updated_on => :desc).offset(max_instances - 1).ids + if ids.any? + Token.delete(ids) + end + else + scope.delete_all + end + end + end +end diff --git a/app/models/tracker.rb b/app/models/tracker.rb new file mode 100644 index 0000000..5926321 --- /dev/null +++ b/app/models/tracker.rb @@ -0,0 +1,150 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Tracker < ActiveRecord::Base + include Redmine::SafeAttributes + + CORE_FIELDS_UNDISABLABLE = %w(project_id tracker_id subject priority_id is_private).freeze + # Fields that can be disabled + # Other (future) fields should be appended, not inserted! + CORE_FIELDS = %w(assigned_to_id category_id fixed_version_id parent_issue_id start_date due_date estimated_hours done_ratio description).freeze + CORE_FIELDS_ALL = (CORE_FIELDS_UNDISABLABLE + CORE_FIELDS).freeze + + before_destroy :check_integrity + belongs_to :default_status, :class_name => 'IssueStatus' + has_many :issues + has_many :workflow_rules, :dependent => :delete_all do + def copy(source_tracker) + ActiveSupport::Deprecation.warn "tracker.workflow_rules.copy is deprecated and will be removed in Redmine 4.0, use tracker.copy_worflow_rules instead" + proxy_association.owner.copy_workflow_rules(source_tracker) + end + end + has_and_belongs_to_many :projects + has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => "#{table_name_prefix}custom_fields_trackers#{table_name_suffix}", :association_foreign_key => 'custom_field_id' + acts_as_positioned + + attr_protected :fields_bits + + validates_presence_of :default_status + validates_presence_of :name + validates_uniqueness_of :name + validates_length_of :name, :maximum => 30 + + scope :sorted, lambda { order(:position) } + scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)} + + # Returns the trackers that are visible by the user. + # + # Examples: + # project.trackers.visible(user) + # => returns the trackers that are visible by the user in project + # + # Tracker.visible(user) + # => returns the trackers that are visible by the user in at least on project + scope :visible, lambda {|*args| + user = args.shift || User.current + condition = Project.allowed_to_condition(user, :view_issues) do |role, user| + unless role.permissions_all_trackers?(:view_issues) + tracker_ids = role.permissions_tracker_ids(:view_issues) + if tracker_ids.any? + "#{Tracker.table_name}.id IN (#{tracker_ids.join(',')})" + else + '1=0' + end + end + end + joins(:projects).where(condition).distinct + } + + safe_attributes 'name', + 'default_status_id', + 'is_in_roadmap', + 'core_fields', + 'position', + 'custom_field_ids', + 'project_ids' + + def to_s; name end + + def <=>(tracker) + position <=> tracker.position + end + + # Returns an array of IssueStatus that are used + # in the tracker's workflows + def issue_statuses + @issue_statuses ||= IssueStatus.where(:id => issue_status_ids).to_a.sort + end + + def issue_status_ids + if new_record? + [] + else + @issue_status_ids ||= WorkflowTransition.where(:tracker_id => id).distinct.pluck(:old_status_id, :new_status_id).flatten.uniq + end + end + + def disabled_core_fields + i = -1 + @disabled_core_fields ||= CORE_FIELDS.select { i += 1; (fields_bits || 0) & (2 ** i) != 0} + end + + def core_fields + CORE_FIELDS - disabled_core_fields + end + + def core_fields=(fields) + raise ArgumentError.new("Tracker.core_fields takes an array") unless fields.is_a?(Array) + + bits = 0 + CORE_FIELDS.each_with_index do |field, i| + unless fields.include?(field) + bits |= 2 ** i + end + end + self.fields_bits = bits + @disabled_core_fields = nil + core_fields + end + + def copy_workflow_rules(source_tracker) + WorkflowRule.copy(source_tracker, nil, self, nil) + end + + # Returns the fields that are disabled for all the given trackers + def self.disabled_core_fields(trackers) + if trackers.present? + trackers.map(&:disabled_core_fields).reduce(:&) + else + [] + end + end + + # Returns the fields that are enabled for one tracker at least + def self.core_fields(trackers) + if trackers.present? + trackers.uniq.map(&:core_fields).reduce(:|) + else + CORE_FIELDS.dup + end + end + +private + def check_integrity + raise Exception.new("Cannot delete tracker") if Issue.where(:tracker_id => self.id).any? + end +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..3578566 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,974 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require "digest/sha1" + +class User < Principal + include Redmine::SafeAttributes + + # Different ways of displaying/sorting users + USER_FORMATS = { + :firstname_lastname => { + :string => '#{firstname} #{lastname}', + :order => %w(firstname lastname id), + :setting_order => 1 + }, + :firstname_lastinitial => { + :string => '#{firstname} #{lastname.to_s.chars.first}.', + :order => %w(firstname lastname id), + :setting_order => 2 + }, + :firstinitial_lastname => { + :string => '#{firstname.to_s.gsub(/(([[:alpha:]])[[:alpha:]]*\.?)/, \'\2.\')} #{lastname}', + :order => %w(firstname lastname id), + :setting_order => 2 + }, + :firstname => { + :string => '#{firstname}', + :order => %w(firstname id), + :setting_order => 3 + }, + :lastname_firstname => { + :string => '#{lastname} #{firstname}', + :order => %w(lastname firstname id), + :setting_order => 4 + }, + :lastnamefirstname => { + :string => '#{lastname}#{firstname}', + :order => %w(lastname firstname id), + :setting_order => 5 + }, + :lastname_comma_firstname => { + :string => '#{lastname}, #{firstname}', + :order => %w(lastname firstname id), + :setting_order => 6 + }, + :lastname => { + :string => '#{lastname}', + :order => %w(lastname id), + :setting_order => 7 + }, + :username => { + :string => '#{login}', + :order => %w(login id), + :setting_order => 8 + }, + } + + MAIL_NOTIFICATION_OPTIONS = [ + ['all', :label_user_mail_option_all], + ['selected', :label_user_mail_option_selected], + ['only_my_events', :label_user_mail_option_only_my_events], + ['only_assigned', :label_user_mail_option_only_assigned], + ['only_owner', :label_user_mail_option_only_owner], + ['none', :label_user_mail_option_none] + ] + + has_and_belongs_to_many :groups, + :join_table => "#{table_name_prefix}groups_users#{table_name_suffix}", + :after_add => Proc.new {|user, group| group.user_added(user)}, + :after_remove => Proc.new {|user, group| group.user_removed(user)} + has_many :changesets, :dependent => :nullify + has_one :preference, :dependent => :destroy, :class_name => 'UserPreference' + has_one :rss_token, lambda {where "action='feeds'"}, :class_name => 'Token' + has_one :api_token, lambda {where "action='api'"}, :class_name => 'Token' + has_one :email_address, lambda {where :is_default => true}, :autosave => true + has_many :email_addresses, :dependent => :delete_all + belongs_to :auth_source + + scope :logged, lambda { where("#{User.table_name}.status <> #{STATUS_ANONYMOUS}") } + scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) } + + acts_as_customizable + + attr_accessor :password, :password_confirmation, :generate_password + attr_accessor :last_before_login_on + attr_accessor :remote_ip + + # Prevents unauthorized assignments + attr_protected :password, :password_confirmation, :hashed_password + + LOGIN_LENGTH_LIMIT = 60 + MAIL_LENGTH_LIMIT = 60 + + validates_presence_of :login, :firstname, :lastname, :if => Proc.new { |user| !user.is_a?(AnonymousUser) } + validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, :case_sensitive => false + # Login must contain letters, numbers, underscores only + validates_format_of :login, :with => /\A[a-z0-9_\-@\.]*\z/i + validates_length_of :login, :maximum => LOGIN_LENGTH_LIMIT + validates_length_of :firstname, :lastname, :maximum => 30 + validates_length_of :identity_url, maximum: 255 + validates_inclusion_of :mail_notification, :in => MAIL_NOTIFICATION_OPTIONS.collect(&:first), :allow_blank => true + validate :validate_password_length + validate do + if password_confirmation && password != password_confirmation + errors.add(:password, :confirmation) + end + end + + self.valid_statuses = [STATUS_ACTIVE, STATUS_REGISTERED, STATUS_LOCKED] + + before_validation :instantiate_email_address + before_create :set_mail_notification + before_save :generate_password_if_needed, :update_hashed_password + before_destroy :remove_references_before_destroy + after_save :update_notified_project_ids, :destroy_tokens, :deliver_security_notification + after_destroy :deliver_security_notification + + scope :admin, lambda {|*args| + admin = args.size > 0 ? !!args.first : true + where(:admin => admin) + } + scope :in_group, lambda {|group| + group_id = group.is_a?(Group) ? group.id : group.to_i + where("#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id) + } + scope :not_in_group, lambda {|group| + group_id = group.is_a?(Group) ? group.id : group.to_i + where("#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id) + } + scope :sorted, lambda { order(*User.fields_for_order_statement)} + scope :having_mail, lambda {|arg| + addresses = Array.wrap(arg).map {|a| a.to_s.downcase} + if addresses.any? + joins(:email_addresses).where("LOWER(#{EmailAddress.table_name}.address) IN (?)", addresses).distinct + else + none + end + } + + def set_mail_notification + self.mail_notification = Setting.default_notification_option if self.mail_notification.blank? + true + end + + def update_hashed_password + # update hashed_password if password was set + if self.password && self.auth_source_id.blank? + salt_password(password) + end + end + + alias :base_reload :reload + def reload(*args) + @name = nil + @roles = nil + @projects_by_role = nil + @project_ids_by_role = nil + @membership_by_project_id = nil + @notified_projects_ids = nil + @notified_projects_ids_changed = false + @builtin_role = nil + @visible_project_ids = nil + @managed_roles = nil + base_reload(*args) + end + + def mail + email_address.try(:address) + end + + def mail=(arg) + email = email_address || build_email_address + email.address = arg + end + + def mail_changed? + email_address.try(:address_changed?) + end + + def mails + email_addresses.pluck(:address) + end + + def self.find_or_initialize_by_identity_url(url) + user = where(:identity_url => url).first + unless user + user = User.new + user.identity_url = url + end + user + end + + def identity_url=(url) + if url.blank? + write_attribute(:identity_url, '') + else + begin + write_attribute(:identity_url, OpenIdAuthentication.normalize_identifier(url)) + rescue OpenIdAuthentication::InvalidOpenId + # Invalid url, don't save + end + end + self.read_attribute(:identity_url) + end + + # Returns the user that matches provided login and password, or nil + def self.try_to_login(login, password, active_only=true) + login = login.to_s.strip + password = password.to_s + + # Make sure no one can sign in with an empty login or password + return nil if login.empty? || password.empty? + user = find_by_login(login) + if user + # user is already in local database + return nil unless user.check_password?(password) + return nil if !user.active? && active_only + else + # user is not yet registered, try to authenticate with available sources + attrs = AuthSource.authenticate(login, password) + if attrs + user = new(attrs) + user.login = login + user.language = Setting.default_language + if user.save + user.reload + logger.info("User '#{user.login}' created from external auth source: #{user.auth_source.type} - #{user.auth_source.name}") if logger && user.auth_source + end + end + end + user.update_column(:last_login_on, Time.now) if user && !user.new_record? && user.active? + user + rescue => text + raise text + end + + # Returns the user who matches the given autologin +key+ or nil + def self.try_to_autologin(key) + user = Token.find_active_user('autologin', key, Setting.autologin.to_i) + if user + user.update_column(:last_login_on, Time.now) + user + end + end + + def self.name_formatter(formatter = nil) + USER_FORMATS[formatter || Setting.user_format] || USER_FORMATS[:firstname_lastname] + end + + # Returns an array of fields names than can be used to make an order statement for users + # according to how user names are displayed + # Examples: + # + # User.fields_for_order_statement => ['users.login', 'users.id'] + # User.fields_for_order_statement('authors') => ['authors.login', 'authors.id'] + def self.fields_for_order_statement(table=nil) + table ||= table_name + name_formatter[:order].map {|field| "#{table}.#{field}"} + end + + # Return user's full name for display + def name(formatter = nil) + f = self.class.name_formatter(formatter) + if formatter + eval('"' + f[:string] + '"') + else + @name ||= eval('"' + f[:string] + '"') + end + end + + def active? + self.status == STATUS_ACTIVE + end + + def registered? + self.status == STATUS_REGISTERED + end + + def locked? + self.status == STATUS_LOCKED + end + + def activate + self.status = STATUS_ACTIVE + end + + def register + self.status = STATUS_REGISTERED + end + + def lock + self.status = STATUS_LOCKED + end + + def activate! + update_attribute(:status, STATUS_ACTIVE) + end + + def register! + update_attribute(:status, STATUS_REGISTERED) + end + + def lock! + update_attribute(:status, STATUS_LOCKED) + end + + # Returns true if +clear_password+ is the correct user's password, otherwise false + def check_password?(clear_password) + if auth_source_id.present? + auth_source.authenticate(self.login, clear_password) + else + User.hash_password("#{salt}#{User.hash_password clear_password}") == hashed_password + end + end + + # Generates a random salt and computes hashed_password for +clear_password+ + # The hashed password is stored in the following form: SHA1(salt + SHA1(password)) + def salt_password(clear_password) + self.salt = User.generate_salt + self.hashed_password = User.hash_password("#{salt}#{User.hash_password clear_password}") + self.passwd_changed_on = Time.now.change(:usec => 0) + end + + # Does the backend storage allow this user to change their password? + def change_password_allowed? + return true if auth_source.nil? + return auth_source.allow_password_changes? + end + + # Returns true if the user password has expired + def password_expired? + period = Setting.password_max_age.to_i + if period.zero? + false + else + changed_on = self.passwd_changed_on || Time.at(0) + changed_on < period.days.ago + end + end + + def must_change_password? + (must_change_passwd? || password_expired?) && change_password_allowed? + end + + def generate_password? + generate_password == '1' || generate_password == true + end + + # Generate and set a random password on given length + def random_password(length=40) + chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a + chars -= %w(0 O 1 l) + password = '' + length.times {|i| password << chars[SecureRandom.random_number(chars.size)] } + self.password = password + self.password_confirmation = password + self + end + + def pref + self.preference ||= UserPreference.new(:user => self) + end + + def time_zone + @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone]) + end + + def force_default_language? + Setting.force_default_language_for_loggedin? + end + + def language + if force_default_language? + Setting.default_language + else + super + end + end + + def wants_comments_in_reverse_order? + self.pref[:comments_sorting] == 'desc' + end + + # Return user's RSS key (a 40 chars long string), used to access feeds + def rss_key + if rss_token.nil? + create_rss_token(:action => 'feeds') + end + rss_token.value + end + + # Return user's API key (a 40 chars long string), used to access the API + def api_key + if api_token.nil? + create_api_token(:action => 'api') + end + api_token.value + end + + # Generates a new session token and returns its value + def generate_session_token + token = Token.create!(:user_id => id, :action => 'session') + token.value + end + + def delete_session_token(value) + Token.where(:user_id => id, :action => 'session', :value => value).delete_all + end + + # Generates a new autologin token and returns its value + def generate_autologin_token + token = Token.create!(:user_id => id, :action => 'autologin') + token.value + end + + def delete_autologin_token(value) + Token.where(:user_id => id, :action => 'autologin', :value => value).delete_all + end + + # Returns true if token is a valid session token for the user whose id is user_id + def self.verify_session_token(user_id, token) + return false if user_id.blank? || token.blank? + + scope = Token.where(:user_id => user_id, :value => token.to_s, :action => 'session') + if Setting.session_lifetime? + scope = scope.where("created_on > ?", Setting.session_lifetime.to_i.minutes.ago) + end + if Setting.session_timeout? + scope = scope.where("updated_on > ?", Setting.session_timeout.to_i.minutes.ago) + end + scope.update_all(:updated_on => Time.now) == 1 + end + + # Return an array of project ids for which the user has explicitly turned mail notifications on + def notified_projects_ids + @notified_projects_ids ||= memberships.select {|m| m.mail_notification?}.collect(&:project_id) + end + + def notified_project_ids=(ids) + @notified_projects_ids_changed = true + @notified_projects_ids = ids.map(&:to_i).uniq.select {|n| n > 0} + end + + # Updates per project notifications (after_save callback) + def update_notified_project_ids + if @notified_projects_ids_changed + ids = (mail_notification == 'selected' ? Array.wrap(notified_projects_ids).reject(&:blank?) : []) + members.update_all(:mail_notification => false) + members.where(:project_id => ids).update_all(:mail_notification => true) if ids.any? + end + end + private :update_notified_project_ids + + def valid_notification_options + self.class.valid_notification_options(self) + end + + # Only users that belong to more than 1 project can select projects for which they are notified + def self.valid_notification_options(user=nil) + # Note that @user.membership.size would fail since AR ignores + # :include association option when doing a count + if user.nil? || user.memberships.length < 1 + MAIL_NOTIFICATION_OPTIONS.reject {|option| option.first == 'selected'} + else + MAIL_NOTIFICATION_OPTIONS + end + end + + # Find a user account by matching the exact login and then a case-insensitive + # version. Exact matches will be given priority. + def self.find_by_login(login) + login = Redmine::CodesetUtil.replace_invalid_utf8(login.to_s) + if login.present? + # First look for an exact match + user = where(:login => login).detect {|u| u.login == login} + unless user + # Fail over to case-insensitive if none was found + user = where("LOWER(login) = ?", login.downcase).first + end + user + end + end + + def self.find_by_rss_key(key) + Token.find_active_user('feeds', key) + end + + def self.find_by_api_key(key) + Token.find_active_user('api', key) + end + + # Makes find_by_mail case-insensitive + def self.find_by_mail(mail) + having_mail(mail).first + end + + # Returns true if the default admin account can no longer be used + def self.default_admin_account_changed? + !User.active.find_by_login("admin").try(:check_password?, "admin") + end + + def to_s + name + end + + CSS_CLASS_BY_STATUS = { + STATUS_ANONYMOUS => 'anon', + STATUS_ACTIVE => 'active', + STATUS_REGISTERED => 'registered', + STATUS_LOCKED => 'locked' + } + + def css_classes + "user #{CSS_CLASS_BY_STATUS[status]}" + end + + # Returns the current day according to user's time zone + def today + if time_zone.nil? + Date.today + else + time_zone.today + end + end + + # Returns the day of +time+ according to user's time zone + def time_to_date(time) + if time_zone.nil? + time.to_date + else + time.in_time_zone(time_zone).to_date + end + end + + def logged? + true + end + + def anonymous? + !logged? + end + + # Returns user's membership for the given project + # or nil if the user is not a member of project + def membership(project) + project_id = project.is_a?(Project) ? project.id : project + + @membership_by_project_id ||= Hash.new {|h, project_id| + h[project_id] = memberships.where(:project_id => project_id).first + } + @membership_by_project_id[project_id] + end + + def roles + @roles ||= Role.joins(members: :project).where(["#{Project.table_name}.status <> ?", Project::STATUS_ARCHIVED]).where(Member.arel_table[:user_id].eq(id)).distinct + end + + # Returns the user's bult-in role + def builtin_role + @builtin_role ||= Role.non_member + end + + # Return user's roles for project + def roles_for_project(project) + # No role on archived projects + return [] if project.nil? || project.archived? + if membership = membership(project) + membership.roles.to_a + elsif project.is_public? + project.override_roles(builtin_role) + else + [] + end + end + + # Returns a hash of user's projects grouped by roles + # TODO: No longer used, should be deprecated + def projects_by_role + return @projects_by_role if @projects_by_role + + result = Hash.new([]) + project_ids_by_role.each do |role, ids| + result[role] = Project.where(:id => ids).to_a + end + @projects_by_role = result + end + + # Returns a hash of project ids grouped by roles. + # Includes the projects that the user is a member of and the projects + # that grant custom permissions to the builtin groups. + def project_ids_by_role + # Clear project condition for when called from chained scopes + # eg. project.children.visible(user) + Project.unscoped do + return @project_ids_by_role if @project_ids_by_role + + group_class = anonymous? ? GroupAnonymous : GroupNonMember + group_id = group_class.pluck(:id).first + + members = Member.joins(:project, :member_roles). + where("#{Project.table_name}.status <> 9"). + where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{Member.table_name}.user_id = ?)", self.id, true, group_id). + pluck(:user_id, :role_id, :project_id) + + hash = {} + members.each do |user_id, role_id, project_id| + # Ignore the roles of the builtin group if the user is a member of the project + next if user_id != id && project_ids.include?(project_id) + + hash[role_id] ||= [] + hash[role_id] << project_id + end + + result = Hash.new([]) + if hash.present? + roles = Role.where(:id => hash.keys).to_a + hash.each do |role_id, proj_ids| + role = roles.detect {|r| r.id == role_id} + if role + result[role] = proj_ids.uniq + end + end + end + @project_ids_by_role = result + end + end + + # Returns the ids of visible projects + def visible_project_ids + @visible_project_ids ||= Project.visible(self).pluck(:id) + end + + # Returns the roles that the user is allowed to manage for the given project + def managed_roles(project) + if admin? + @managed_roles ||= Role.givable.to_a + else + membership(project).try(:managed_roles) || [] + end + end + + # Returns true if user is arg or belongs to arg + def is_or_belongs_to?(arg) + if arg.is_a?(User) + self == arg + elsif arg.is_a?(Group) + arg.users.include?(self) + else + false + end + end + + # Return true if the user is allowed to do the specified action on a specific context + # Action can be: + # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') + # * a permission Symbol (eg. :edit_project) + # Context can be: + # * a project : returns true if user is allowed to do the specified action on this project + # * an array of projects : returns true if user is allowed on every project + # * nil with options[:global] set : check if user has at least one role allowed for this action, + # or falls back to Non Member / Anonymous permissions depending if the user is logged + def allowed_to?(action, context, options={}, &block) + if context && context.is_a?(Project) + return false unless context.allows_to?(action) + # Admin users are authorized for anything else + return true if admin? + + roles = roles_for_project(context) + return false unless roles + roles.any? {|role| + (context.is_public? || role.member?) && + role.allowed_to?(action) && + (block_given? ? yield(role, self) : true) + } + elsif context && context.is_a?(Array) + if context.empty? + false + else + # Authorize if user is authorized on every element of the array + context.map {|project| allowed_to?(action, project, options, &block)}.reduce(:&) + end + elsif context + raise ArgumentError.new("#allowed_to? context argument must be a Project, an Array of projects or nil") + elsif options[:global] + # Admin users are always authorized + return true if admin? + + # authorize if user has at least one role that has this permission + roles = self.roles.to_a | [builtin_role] + roles.any? {|role| + role.allowed_to?(action) && + (block_given? ? yield(role, self) : true) + } + else + false + end + end + + # Is the user allowed to do the specified action on any project? + # See allowed_to? for the actions and valid options. + # + # NB: this method is not used anywhere in the core codebase as of + # 2.5.2, but it's used by many plugins so if we ever want to remove + # it it has to be carefully deprecated for a version or two. + def allowed_to_globally?(action, options={}, &block) + allowed_to?(action, nil, options.reverse_merge(:global => true), &block) + end + + def allowed_to_view_all_time_entries?(context) + allowed_to?(:view_time_entries, context) do |role, user| + role.time_entries_visibility == 'all' + end + end + + # Returns true if the user is allowed to delete the user's own account + def own_account_deletable? + Setting.unsubscribe? && + (!admin? || User.active.admin.where("id <> ?", id).exists?) + end + + safe_attributes 'firstname', + 'lastname', + 'mail', + 'mail_notification', + 'notified_project_ids', + 'language', + 'custom_field_values', + 'custom_fields', + 'identity_url' + + safe_attributes 'login', + :if => lambda {|user, current_user| user.new_record?} + + safe_attributes 'status', + 'auth_source_id', + 'generate_password', + 'must_change_passwd', + 'login', + 'admin', + :if => lambda {|user, current_user| current_user.admin?} + + safe_attributes 'group_ids', + :if => lambda {|user, current_user| current_user.admin? && !user.new_record?} + + # Utility method to help check if a user should be notified about an + # event. + # + # TODO: only supports Issue events currently + def notify_about?(object) + if mail_notification == 'all' + true + elsif mail_notification.blank? || mail_notification == 'none' + false + else + case object + when Issue + case mail_notification + when 'selected', 'only_my_events' + # user receives notifications for created/assigned issues on unselected projects + object.author == self || is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was) + when 'only_assigned' + is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was) + when 'only_owner' + object.author == self + end + when News + # always send to project members except when mail_notification is set to 'none' + true + end + end + end + + def self.current=(user) + RequestStore.store[:current_user] = user + end + + def self.current + RequestStore.store[:current_user] ||= User.anonymous + end + + # Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only + # one anonymous user per database. + def self.anonymous + anonymous_user = AnonymousUser.unscoped.first + if anonymous_user.nil? + anonymous_user = AnonymousUser.unscoped.create(:lastname => 'Anonymous', :firstname => '', :login => '', :status => 0) + raise 'Unable to create the anonymous user.' if anonymous_user.new_record? + end + anonymous_user + end + + # Salts all existing unsalted passwords + # It changes password storage scheme from SHA1(password) to SHA1(salt + SHA1(password)) + # This method is used in the SaltPasswords migration and is to be kept as is + def self.salt_unsalted_passwords! + transaction do + User.where("salt IS NULL OR salt = ''").find_each do |user| + next if user.hashed_password.blank? + salt = User.generate_salt + hashed_password = User.hash_password("#{salt}#{user.hashed_password}") + User.where(:id => user.id).update_all(:salt => salt, :hashed_password => hashed_password) + end + end + end + + protected + + def validate_password_length + return if password.blank? && generate_password? + # Password length validation based on setting + if !password.nil? && password.size < Setting.password_min_length.to_i + errors.add(:password, :too_short, :count => Setting.password_min_length.to_i) + end + end + + def instantiate_email_address + email_address || build_email_address + end + + private + + def generate_password_if_needed + if generate_password? && auth_source.nil? + length = [Setting.password_min_length.to_i + 2, 10].max + random_password(length) + end + end + + # Delete all outstanding password reset tokens on password change. + # Delete the autologin tokens on password change to prohibit session leakage. + # This helps to keep the account secure in case the associated email account + # was compromised. + def destroy_tokens + if hashed_password_changed? || (status_changed? && !active?) + tokens = ['recovery', 'autologin', 'session'] + Token.where(:user_id => id, :action => tokens).delete_all + end + end + + # Removes references that are not handled by associations + # Things that are not deleted are reassociated with the anonymous user + def remove_references_before_destroy + return if self.id.nil? + + substitute = User.anonymous + Attachment.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + Comment.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + Issue.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + Issue.where(['assigned_to_id = ?', id]).update_all('assigned_to_id = NULL') + Journal.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id]) + JournalDetail. + where(["property = 'attr' AND prop_key = 'assigned_to_id' AND old_value = ?", id.to_s]). + update_all(['old_value = ?', substitute.id.to_s]) + JournalDetail. + where(["property = 'attr' AND prop_key = 'assigned_to_id' AND value = ?", id.to_s]). + update_all(['value = ?', substitute.id.to_s]) + Message.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + News.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + # Remove private queries and keep public ones + ::Query.where('user_id = ? AND visibility = ?', id, ::Query::VISIBILITY_PRIVATE).delete_all + ::Query.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id]) + TimeEntry.where(['user_id = ?', id]).update_all(['user_id = ?', substitute.id]) + Token.where('user_id = ?', id).delete_all + Watcher.where('user_id = ?', id).delete_all + WikiContent.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + WikiContent::Version.where(['author_id = ?', id]).update_all(['author_id = ?', substitute.id]) + end + + # Return password digest + def self.hash_password(clear_password) + Digest::SHA1.hexdigest(clear_password || "") + end + + # Returns a 128bits random salt as a hex string (32 chars long) + def self.generate_salt + Redmine::Utils.random_hex(16) + end + + # Send a security notification to all admins if the user has gained/lost admin privileges + def deliver_security_notification + options = { + field: :field_admin, + value: login, + title: :label_user_plural, + url: {controller: 'users', action: 'index'} + } + + deliver = false + if (admin? && id_changed? && active?) || # newly created admin + (admin? && admin_changed? && active?) || # regular user became admin + (admin? && status_changed? && active?) # locked admin became active again + + deliver = true + options[:message] = :mail_body_security_notification_add + + elsif (admin? && destroyed? && active?) || # active admin user was deleted + (!admin? && admin_changed? && active?) || # admin is no longer admin + (admin? && status_changed? && !active?) # admin was locked + + deliver = true + options[:message] = :mail_body_security_notification_remove + end + + if deliver + users = User.active.where(admin: true).to_a + Mailer.security_notification(users, options).deliver + end + end +end + +class AnonymousUser < User + validate :validate_anonymous_uniqueness, :on => :create + + self.valid_statuses = [STATUS_ANONYMOUS] + + def validate_anonymous_uniqueness + # There should be only one AnonymousUser in the database + errors.add :base, 'An anonymous user already exists.' if AnonymousUser.exists? + end + + def available_custom_fields + [] + end + + # Overrides a few properties + def logged?; false end + def admin; false end + def name(*args); I18n.t(:label_user_anonymous) end + def mail=(*args); nil end + def mail; nil end + def time_zone; nil end + def rss_key; nil end + + def pref + UserPreference.new(:user => self) + end + + # Returns the user's bult-in role + def builtin_role + @builtin_role ||= Role.anonymous + end + + def membership(*args) + nil + end + + def member_of?(*args) + false + end + + # Anonymous user can not be destroyed + def destroy + false + end + + protected + + def instantiate_email_address + end +end diff --git a/app/models/user_custom_field.rb b/app/models/user_custom_field.rb new file mode 100644 index 0000000..8b4b347 --- /dev/null +++ b/app/models/user_custom_field.rb @@ -0,0 +1,23 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class UserCustomField < CustomField + def type_name + :label_user_plural + end +end + diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb new file mode 100644 index 0000000..c6b7fc2 --- /dev/null +++ b/app/models/user_preference.rb @@ -0,0 +1,168 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class UserPreference < ActiveRecord::Base + include Redmine::SafeAttributes + + belongs_to :user + serialize :others + + attr_protected :others, :user_id + + before_save :set_others_hash, :clear_unused_block_settings + + safe_attributes 'hide_mail', + 'time_zone', + 'comments_sorting', + 'warn_on_leaving_unsaved', + 'no_self_notified', + 'textarea_font' + + TEXTAREA_FONT_OPTIONS = ['monospace', 'proportional'] + + def initialize(attributes=nil, *args) + super + if new_record? + unless attributes && attributes.key?(:hide_mail) + self.hide_mail = Setting.default_users_hide_mail? + end + unless attributes && attributes.key?(:time_zone) + self.time_zone = Setting.default_users_time_zone + end + unless attributes && attributes.key?(:no_self_notified) + self.no_self_notified = true + end + end + self.others ||= {} + end + + def set_others_hash + self.others ||= {} + end + + def [](attr_name) + if has_attribute? attr_name + super + else + others ? others[attr_name] : nil + end + end + + def []=(attr_name, value) + if has_attribute? attr_name + super + else + h = (read_attribute(:others) || {}).dup + h.update(attr_name => value) + write_attribute(:others, h) + value + end + end + + def comments_sorting; self[:comments_sorting] end + def comments_sorting=(order); self[:comments_sorting]=order end + + def warn_on_leaving_unsaved; self[:warn_on_leaving_unsaved] || '1'; end + def warn_on_leaving_unsaved=(value); self[:warn_on_leaving_unsaved]=value; end + + def no_self_notified; (self[:no_self_notified] == true || self[:no_self_notified] == '1'); end + def no_self_notified=(value); self[:no_self_notified]=value; end + + def activity_scope; Array(self[:activity_scope]) ; end + def activity_scope=(value); self[:activity_scope]=value ; end + + def textarea_font; self[:textarea_font] end + def textarea_font=(value); self[:textarea_font]=value; end + + # Returns the names of groups that are displayed on user's page + # Example: + # preferences.my_page_groups + # # => ['top', 'left, 'right'] + def my_page_groups + Redmine::MyPage.groups + end + + def my_page_layout + self[:my_page_layout] ||= Redmine::MyPage.default_layout.deep_dup + end + + def my_page_layout=(arg) + self[:my_page_layout] = arg + end + + def my_page_settings(block=nil) + s = self[:my_page_settings] ||= {} + if block + s[block] ||= {} + else + s + end + end + + def my_page_settings=(arg) + self[:my_page_settings] = arg + end + + # Removes block from the user page layout + # Example: + # preferences.remove_block('news') + def remove_block(block) + block = block.to_s.underscore + my_page_layout.keys.each do |group| + my_page_layout[group].delete(block) + end + my_page_layout + end + + # Adds block to the user page layout + # Returns nil if block is not valid or if it's already + # present in the user page layout + def add_block(block) + block = block.to_s.underscore + return unless Redmine::MyPage.valid_block?(block, my_page_layout.values.flatten) + + remove_block(block) + # add it to the first group + group = my_page_groups.first + my_page_layout[group] ||= [] + my_page_layout[group].unshift(block) + end + + # Sets the block order for the given group. + # Example: + # preferences.order_blocks('left', ['issueswatched', 'news']) + def order_blocks(group, blocks) + group = group.to_s + if Redmine::MyPage.groups.include?(group) && blocks.present? + blocks = blocks.map(&:underscore) & my_page_layout.values.flatten + blocks.each {|block| remove_block(block)} + my_page_layout[group] = blocks + end + end + + def update_block_settings(block, settings) + block = block.to_s + block_settings = my_page_settings(block).merge(settings.symbolize_keys) + my_page_settings[block] = block_settings + end + + def clear_unused_block_settings + blocks = my_page_layout.values.flatten + my_page_settings.keep_if {|block, settings| blocks.include?(block)} + end + private :clear_unused_block_settings +end diff --git a/app/models/version.rb b/app/models/version.rb new file mode 100644 index 0000000..ee1d3da --- /dev/null +++ b/app/models/version.rb @@ -0,0 +1,362 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Version < ActiveRecord::Base + include Redmine::SafeAttributes + + after_update :update_issues_from_sharing_change + after_save :update_default_project_version + before_destroy :nullify_projects_default_version + + belongs_to :project + has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify + acts_as_customizable + acts_as_attachable :view_permission => :view_files, + :edit_permission => :manage_files, + :delete_permission => :manage_files + + VERSION_STATUSES = %w(open locked closed) + VERSION_SHARINGS = %w(none descendants hierarchy tree system) + + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:project_id] + validates_length_of :name, :maximum => 60 + validates_length_of :description, :wiki_page_title, :maximum => 255 + validates :effective_date, :date => true + validates_inclusion_of :status, :in => VERSION_STATUSES + validates_inclusion_of :sharing, :in => VERSION_SHARINGS + attr_protected :id + + scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)} + scope :like, lambda {|arg| + if arg.present? + pattern = "%#{arg.to_s.strip}%" + where([Redmine::Database.like("#{Version.table_name}.name", '?'), pattern]) + end + } + scope :open, lambda { where(:status => 'open') } + scope :status, lambda {|status| + if status.present? + where(:status => status.to_s) + end + } + scope :visible, lambda {|*args| + joins(:project). + where(Project.allowed_to_condition(args.first || User.current, :view_issues)) + } + + safe_attributes 'name', + 'description', + 'effective_date', + 'due_date', + 'wiki_page_title', + 'status', + 'sharing', + 'default_project_version', + 'custom_field_values', + 'custom_fields' + + # Returns true if +user+ or current user is allowed to view the version + def visible?(user=User.current) + user.allowed_to?(:view_issues, self.project) + end + + # Version files have same visibility as project files + def attachments_visible?(*args) + project.present? && project.attachments_visible?(*args) + end + + def attachments_deletable?(usr=User.current) + project.present? && project.attachments_deletable?(usr) + end + + alias :base_reload :reload + def reload(*args) + @default_project_version = nil + base_reload(*args) + end + + def start_date + @start_date ||= fixed_issues.minimum('start_date') + end + + def due_date + effective_date + end + + def due_date=(arg) + self.effective_date=(arg) + end + + # Returns the total estimated time for this version + # (sum of leaves estimated_hours) + def estimated_hours + @estimated_hours ||= fixed_issues.sum(:estimated_hours).to_f + end + + # Returns the total reported time for this version + def spent_hours + @spent_hours ||= TimeEntry.joins(:issue).where("#{Issue.table_name}.fixed_version_id = ?", id).sum(:hours).to_f + end + + def closed? + status == 'closed' + end + + def open? + status == 'open' + end + + # Returns true if the version is completed: closed or due date reached and no open issues + def completed? + closed? || (effective_date && (effective_date < User.current.today) && (open_issues_count == 0)) + end + + def behind_schedule? + if completed_percent == 100 + return false + elsif due_date && start_date + done_date = start_date + ((due_date - start_date+1)* completed_percent/100).floor + return done_date <= User.current.today + else + false # No issues so it's not late + end + end + + # Returns the completion percentage of this version based on the amount of open/closed issues + # and the time spent on the open issues. + def completed_percent + if issues_count == 0 + 0 + elsif open_issues_count == 0 + 100 + else + issues_progress(false) + issues_progress(true) + end + end + + # Returns the percentage of issues that have been marked as 'closed'. + def closed_percent + if issues_count == 0 + 0 + else + issues_progress(false) + end + end + + # Returns true if the version is overdue: due date reached and some open issues + def overdue? + effective_date && (effective_date < User.current.today) && (open_issues_count > 0) + end + + # Returns assigned issues count + def issues_count + load_issue_counts + @issue_count + end + + # Returns the total amount of open issues for this version. + def open_issues_count + load_issue_counts + @open_issues_count + end + + # Returns the total amount of closed issues for this version. + def closed_issues_count + load_issue_counts + @closed_issues_count + end + + def wiki_page + if project.wiki && !wiki_page_title.blank? + @wiki_page ||= project.wiki.find_page(wiki_page_title) + end + @wiki_page + end + + def to_s; name end + + def to_s_with_project + "#{project} - #{name}" + end + + # Versions are sorted by effective_date and name + # Those with no effective_date are at the end, sorted by name + def <=>(version) + if self.effective_date + if version.effective_date + if self.effective_date == version.effective_date + name == version.name ? id <=> version.id : name <=> version.name + else + self.effective_date <=> version.effective_date + end + else + -1 + end + else + if version.effective_date + 1 + else + name == version.name ? id <=> version.id : name <=> version.name + end + end + end + + # Sort versions by status (open, locked then closed versions) + def self.sort_by_status(versions) + versions.sort do |a, b| + if a.status == b.status + a <=> b + else + b.status <=> a.status + end + end + end + + def css_classes + [ + completed? ? 'version-completed' : 'version-incompleted', + "version-#{status}" + ].join(' ') + end + + def self.fields_for_order_statement(table=nil) + table ||= table_name + ["(CASE WHEN #{table}.effective_date IS NULL THEN 1 ELSE 0 END)", "#{table}.effective_date", "#{table}.name", "#{table}.id"] + end + + scope :sorted, lambda { order(fields_for_order_statement) } + + # Returns the sharings that +user+ can set the version to + def allowed_sharings(user = User.current) + VERSION_SHARINGS.select do |s| + if sharing == s + true + else + case s + when 'system' + # Only admin users can set a systemwide sharing + user.admin? + when 'hierarchy', 'tree' + # Only users allowed to manage versions of the root project can + # set sharing to hierarchy or tree + project.nil? || user.allowed_to?(:manage_versions, project.root) + else + true + end + end + end + end + + # Returns true if the version is shared, otherwise false + def shared? + sharing != 'none' + end + + def deletable? + fixed_issues.empty? && !referenced_by_a_custom_field? && attachments.empty? + end + + def default_project_version + if @default_project_version.nil? + project.present? && project.default_version == self + else + @default_project_version + end + end + + def default_project_version=(arg) + @default_project_version = (arg == '1' || arg == true) + end + + private + + def load_issue_counts + unless @issue_count + @open_issues_count = 0 + @closed_issues_count = 0 + fixed_issues.group(:status).count.each do |status, count| + if status.is_closed? + @closed_issues_count += count + else + @open_issues_count += count + end + end + @issue_count = @open_issues_count + @closed_issues_count + end + end + + # Update the issue's fixed versions. Used if a version's sharing changes. + def update_issues_from_sharing_change + if sharing_changed? + if VERSION_SHARINGS.index(sharing_was).nil? || + VERSION_SHARINGS.index(sharing).nil? || + VERSION_SHARINGS.index(sharing_was) > VERSION_SHARINGS.index(sharing) + Issue.update_versions_from_sharing_change self + end + end + end + + def update_default_project_version + if @default_project_version && project.present? + project.update_columns :default_version_id => id + end + end + + # Returns the average estimated time of assigned issues + # or 1 if no issue has an estimated time + # Used to weight unestimated issues in progress calculation + def estimated_average + if @estimated_average.nil? + average = fixed_issues.average(:estimated_hours).to_f + if average == 0 + average = 1 + end + @estimated_average = average + end + @estimated_average + end + + # Returns the total progress of open or closed issues. The returned percentage takes into account + # the amount of estimated time set for this version. + # + # Examples: + # issues_progress(true) => returns the progress percentage for open issues. + # issues_progress(false) => returns the progress percentage for closed issues. + def issues_progress(open) + @issues_progress ||= {} + @issues_progress[open] ||= begin + progress = 0 + if issues_count > 0 + ratio = open ? 'done_ratio' : 100 + + done = fixed_issues.open(open).sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}").to_f + progress = done / (estimated_average * issues_count) + end + progress + end + end + + def referenced_by_a_custom_field? + CustomValue.joins(:custom_field). + where(:value => id.to_s, :custom_fields => {:field_format => 'version'}).any? + end + + def nullify_projects_default_version + Project.where(:default_version_id => id).update_all(:default_version_id => nil) + end +end diff --git a/app/models/version_custom_field.rb b/app/models/version_custom_field.rb new file mode 100644 index 0000000..f353d7f --- /dev/null +++ b/app/models/version_custom_field.rb @@ -0,0 +1,22 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class VersionCustomField < CustomField + def type_name + :label_version_plural + end +end diff --git a/app/models/watcher.rb b/app/models/watcher.rb new file mode 100644 index 0000000..6198cef --- /dev/null +++ b/app/models/watcher.rb @@ -0,0 +1,81 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Watcher < ActiveRecord::Base + belongs_to :watchable, :polymorphic => true + belongs_to :user + + validates_presence_of :user + validates_uniqueness_of :user_id, :scope => [:watchable_type, :watchable_id] + validate :validate_user + attr_protected :id + + # Returns true if at least one object among objects is watched by user + def self.any_watched?(objects, user) + objects = objects.reject(&:new_record?) + if objects.any? + objects.group_by {|object| object.class.base_class}.each do |base_class, objects| + if Watcher.where(:watchable_type => base_class.name, :watchable_id => objects.map(&:id), :user_id => user.id).exists? + return true + end + end + end + false + end + + # Unwatch things that users are no longer allowed to view + def self.prune(options={}) + if options.has_key?(:user) + prune_single_user(options[:user], options) + else + pruned = 0 + User.where("id IN (SELECT DISTINCT user_id FROM #{table_name})").each do |user| + pruned += prune_single_user(user, options) + end + pruned + end + end + + protected + + def validate_user + errors.add :user_id, :invalid unless user.nil? || user.active? + end + + private + + def self.prune_single_user(user, options={}) + return unless user.is_a?(User) + pruned = 0 + where(:user_id => user.id).each do |watcher| + next if watcher.watchable.nil? + if options.has_key?(:project) + unless watcher.watchable.respond_to?(:project) && + watcher.watchable.project == options[:project] + next + end + end + if watcher.watchable.respond_to?(:visible?) + unless watcher.watchable.visible?(user) + watcher.destroy + pruned += 1 + end + end + end + pruned + end +end diff --git a/app/models/wiki.rb b/app/models/wiki.rb new file mode 100644 index 0000000..9ed9554 --- /dev/null +++ b/app/models/wiki.rb @@ -0,0 +1,107 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Wiki < ActiveRecord::Base + include Redmine::SafeAttributes + belongs_to :project + has_many :pages, lambda {order('title')}, :class_name => 'WikiPage', :dependent => :destroy + has_many :redirects, :class_name => 'WikiRedirect' + + acts_as_watchable + + validates_presence_of :start_page + validates_format_of :start_page, :with => /\A[^,\.\/\?\;\|\:]*\z/ + validates_length_of :start_page, maximum: 255 + attr_protected :id + + before_destroy :delete_redirects + + safe_attributes 'start_page' + + def visible?(user=User.current) + !user.nil? && user.allowed_to?(:view_wiki_pages, project) + end + + # Returns the wiki page that acts as the sidebar content + # or nil if no such page exists + def sidebar + @sidebar ||= find_page('Sidebar', :with_redirect => false) + end + + # find the page with the given title + # if page doesn't exist, return a new page + def find_or_new_page(title) + title = start_page if title.blank? + find_page(title) || WikiPage.new(:wiki => self, :title => Wiki.titleize(title)) + end + + # find the page with the given title + def find_page(title, options = {}) + @page_found_with_redirect = false + title = start_page if title.blank? + title = Wiki.titleize(title) + page = pages.where("LOWER(title) = LOWER(?)", title).first + if page.nil? && options[:with_redirect] != false + # search for a redirect + redirect = redirects.where("LOWER(title) = LOWER(?)", title).first + if redirect + page = redirect.target_page + @page_found_with_redirect = true + end + end + page + end + + # Returns true if the last page was found with a redirect + def page_found_with_redirect? + @page_found_with_redirect + end + + # Deletes all redirects from/to the wiki + def delete_redirects + WikiRedirect.where(:wiki_id => id).delete_all + WikiRedirect.where(:redirects_to_wiki_id => id).delete_all + end + + # Finds a page by title + # The given string can be of one of the forms: "title" or "project:title" + # Examples: + # Wiki.find_page("bar", project => foo) + # Wiki.find_page("foo:bar") + def self.find_page(title, options = {}) + project = options[:project] + if title.to_s =~ %r{^([^\:]+)\:(.*)$} + project_identifier, title = $1, $2 + project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier) + end + if project && project.wiki + page = project.wiki.find_page(title) + if page && page.content + page + end + end + end + + # turn a string into a valid page title + def self.titleize(title) + # replace spaces with _ and remove unwanted caracters + title = title.gsub(/\s+/, '_').delete(',./?;|:') if title + # upcase the first letter + title = (title.slice(0..0).upcase + (title.slice(1..-1) || '')) if title + title + end +end diff --git a/app/models/wiki_content.rb b/app/models/wiki_content.rb new file mode 100644 index 0000000..3d992f8 --- /dev/null +++ b/app/models/wiki_content.rb @@ -0,0 +1,174 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'zlib' + +class WikiContent < ActiveRecord::Base + self.locking_column = 'version' + belongs_to :page, :class_name => 'WikiPage' + belongs_to :author, :class_name => 'User' + validates_presence_of :text + validates_length_of :comments, :maximum => 1024, :allow_nil => true + attr_protected :id + + acts_as_versioned + + after_save :send_notification + + scope :without_text, lambda {select(:id, :page_id, :version, :updated_on)} + + def visible?(user=User.current) + page.visible?(user) + end + + def project + page.project + end + + def attachments + page.nil? ? [] : page.attachments + end + + def notified_users + project.notified_users.reject {|user| !visible?(user)} + end + + # Returns the mail addresses of users that should be notified + def recipients + notified_users.collect(&:mail) + end + + # Return true if the content is the current page content + def current_version? + true + end + + class Version + belongs_to :page, :class_name => '::WikiPage' + belongs_to :author, :class_name => '::User' + attr_protected :data + + acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"}, + :description => :comments, + :datetime => :updated_on, + :type => 'wiki-page', + :group => :page, + :url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.page.wiki.project, :id => o.page.title, :version => o.version}} + + acts_as_activity_provider :type => 'wiki_edits', + :timestamp => "#{WikiContent.versioned_table_name}.updated_on", + :author_key => "#{WikiContent.versioned_table_name}.author_id", + :permission => :view_wiki_edits, + :scope => select("#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " + + "#{WikiContent.versioned_table_name}.#{WikiContent.version_column}, #{WikiPage.table_name}.title, " + + "#{WikiContent.versioned_table_name}.page_id, #{WikiContent.versioned_table_name}.author_id, " + + "#{WikiContent.versioned_table_name}.id"). + joins("LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{WikiContent.versioned_table_name}.page_id " + + "LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id " + + "LEFT JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Wiki.table_name}.project_id") + + after_destroy :page_update_after_destroy + + def text=(plain) + case Setting.wiki_compression + when 'gzip' + begin + self.data = Zlib::Deflate.deflate(plain, Zlib::BEST_COMPRESSION) + self.compression = 'gzip' + rescue + self.data = plain + self.compression = '' + end + else + self.data = plain + self.compression = '' + end + plain + end + + def text + @text ||= begin + str = case compression + when 'gzip' + Zlib::Inflate.inflate(data) + else + # uncompressed data + data + end + str.force_encoding("UTF-8") + str + end + end + + def project + page.project + end + + def attachments + page.nil? ? [] : page.attachments + end + + # Return true if the content is the current page content + def current_version? + page.content.version == self.version + end + + # Returns the previous version or nil + def previous + @previous ||= WikiContent::Version. + reorder('version DESC'). + includes(:author). + where("wiki_content_id = ? AND version < ?", wiki_content_id, version).first + end + + # Returns the next version or nil + def next + @next ||= WikiContent::Version. + reorder('version ASC'). + includes(:author). + where("wiki_content_id = ? AND version > ?", wiki_content_id, version).first + end + + private + + # Updates page's content if the latest version is removed + # or destroys the page if it was the only version + def page_update_after_destroy + latest = page.content.versions.reorder("#{self.class.table_name}.version DESC").first + if latest && page.content.version != latest.version + raise ActiveRecord::Rollback unless page.content.revert_to!(latest) + elsif latest.nil? + raise ActiveRecord::Rollback unless page.destroy + end + end + end + + private + + def send_notification + # new_record? returns false in after_save callbacks + if id_changed? + if Setting.notified_events.include?('wiki_content_added') + Mailer.wiki_content_added(self).deliver + end + elsif text_changed? + if Setting.notified_events.include?('wiki_content_updated') + Mailer.wiki_content_updated(self).deliver + end + end + end +end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb new file mode 100644 index 0000000..d7b09f3 --- /dev/null +++ b/app/models/wiki_page.rb @@ -0,0 +1,298 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'diff' +require 'enumerator' + +class WikiPage < ActiveRecord::Base + include Redmine::SafeAttributes + + belongs_to :wiki + has_one :content, :class_name => 'WikiContent', :foreign_key => 'page_id', :dependent => :destroy + has_one :content_without_text, lambda {without_text.readonly}, :class_name => 'WikiContent', :foreign_key => 'page_id' + + acts_as_attachable :delete_permission => :delete_wiki_pages_attachments + acts_as_tree :dependent => :nullify, :order => 'title' + + acts_as_watchable + acts_as_event :title => Proc.new {|o| "#{l(:label_wiki)}: #{o.title}"}, + :description => :text, + :datetime => :created_on, + :url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.wiki.project, :id => o.title}} + + acts_as_searchable :columns => ['title', "#{WikiContent.table_name}.text"], + :scope => joins(:content, {:wiki => :project}), + :preload => [:content, {:wiki => :project}], + :permission => :view_wiki_pages, + :project_key => "#{Wiki.table_name}.project_id" + + attr_accessor :redirect_existing_links + + validates_presence_of :title + validates_format_of :title, :with => /\A[^,\.\/\?\;\|\s]*\z/ + validates_uniqueness_of :title, :scope => :wiki_id, :case_sensitive => false + validates_length_of :title, maximum: 255 + validates_associated :content + attr_protected :id + + validate :validate_parent_title + before_destroy :delete_redirects + before_save :handle_rename_or_move + after_save :handle_children_move + + # eager load information about last updates, without loading text + scope :with_updated_on, lambda { preload(:content_without_text) } + + # Wiki pages that are protected by default + DEFAULT_PROTECTED_PAGES = %w(sidebar) + + safe_attributes 'parent_id', 'parent_title', 'title', 'redirect_existing_links', 'wiki_id', + :if => lambda {|page, user| page.new_record? || user.allowed_to?(:rename_wiki_pages, page.project)} + + def initialize(attributes=nil, *args) + super + if new_record? && DEFAULT_PROTECTED_PAGES.include?(title.to_s.downcase) + self.protected = true + end + end + + def visible?(user=User.current) + !user.nil? && user.allowed_to?(:view_wiki_pages, project) + end + + def title=(value) + value = Wiki.titleize(value) + write_attribute(:title, value) + end + + def safe_attributes=(attrs, user=User.current) + return unless attrs.is_a?(Hash) + attrs = attrs.deep_dup + + # Project and Tracker must be set before since new_statuses_allowed_to depends on it. + if (w_id = attrs.delete('wiki_id')) && safe_attribute?('wiki_id') + if (w = Wiki.find_by_id(w_id)) && w.project && user.allowed_to?(:rename_wiki_pages, w.project) + self.wiki = w + end + end + + super attrs, user + end + + # Manages redirects if page is renamed or moved + def handle_rename_or_move + if !new_record? && (title_changed? || wiki_id_changed?) + # Update redirects that point to the old title + WikiRedirect.where(:redirects_to => title_was, :redirects_to_wiki_id => wiki_id_was).each do |r| + r.redirects_to = title + r.redirects_to_wiki_id = wiki_id + (r.title == r.redirects_to && r.wiki_id == r.redirects_to_wiki_id) ? r.destroy : r.save + end + # Remove redirects for the new title + WikiRedirect.where(:wiki_id => wiki_id, :title => title).delete_all + # Create a redirect to the new title + unless redirect_existing_links == "0" + WikiRedirect.create( + :wiki_id => wiki_id_was, :title => title_was, + :redirects_to_wiki_id => wiki_id, :redirects_to => title + ) + end + end + if !new_record? && wiki_id_changed? && parent.present? + unless parent.wiki_id == wiki_id + self.parent_id = nil + end + end + end + private :handle_rename_or_move + + # Moves child pages if page was moved + def handle_children_move + if !new_record? && wiki_id_changed? + children.each do |child| + child.wiki_id = wiki_id + child.redirect_existing_links = redirect_existing_links + unless child.save + WikiPage.where(:id => child.id).update_all :parent_id => nil + end + end + end + end + private :handle_children_move + + # Deletes redirects to this page + def delete_redirects + WikiRedirect.where(:redirects_to_wiki_id => wiki_id, :redirects_to => title).delete_all + end + + def pretty_title + WikiPage.pretty_title(title) + end + + def content_for_version(version=nil) + if content + result = content.versions.find_by_version(version.to_i) if version + result ||= content + result + end + end + + def diff(version_to=nil, version_from=nil) + version_to = version_to ? version_to.to_i : self.content.version + content_to = content.versions.find_by_version(version_to) + content_from = version_from ? content.versions.find_by_version(version_from.to_i) : content_to.try(:previous) + return nil unless content_to && content_from + + if content_from.version > content_to.version + content_to, content_from = content_from, content_to + end + + (content_to && content_from) ? WikiDiff.new(content_to, content_from) : nil + end + + def annotate(version=nil) + version = version ? version.to_i : self.content.version + c = content.versions.find_by_version(version) + c ? WikiAnnotate.new(c) : nil + end + + def self.pretty_title(str) + (str && str.is_a?(String)) ? str.tr('_', ' ') : str + end + + def project + wiki.try(:project) + end + + def text + content.text if content + end + + def updated_on + content_attribute(:updated_on) + end + + def version + content_attribute(:version) + end + + # Returns true if usr is allowed to edit the page, otherwise false + def editable_by?(usr) + !protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project) + end + + def attachments_deletable?(usr=User.current) + editable_by?(usr) && super(usr) + end + + def parent_title + @parent_title || (self.parent && self.parent.pretty_title) + end + + def parent_title=(t) + @parent_title = t + parent_page = t.blank? ? nil : self.wiki.find_page(t) + self.parent = parent_page + end + + # Saves the page and its content if text was changed + # Return true if the page was saved + def save_with_content(content) + ret = nil + transaction do + ret = save + if content.text_changed? + begin + self.content = content + ret = ret && content.changed? + rescue ActiveRecord::RecordNotSaved + ret = false + end + end + raise ActiveRecord::Rollback unless ret + end + ret + end + + protected + + def validate_parent_title + errors.add(:parent_title, :invalid) if !@parent_title.blank? && parent.nil? + errors.add(:parent_title, :circular_dependency) if parent && (parent == self || parent.ancestors.include?(self)) + if parent_id_changed? && parent && (parent.wiki_id != wiki_id) + errors.add(:parent_title, :not_same_project) + end + end + + private + + def content_attribute(name) + (association(:content).loaded? ? content : content_without_text).try(name) + end +end + +class WikiDiff < Redmine::Helpers::Diff + attr_reader :content_to, :content_from + + def initialize(content_to, content_from) + @content_to = content_to + @content_from = content_from + super(content_to.text, content_from.text) + end +end + +class WikiAnnotate + attr_reader :lines, :content + + def initialize(content) + @content = content + current = content + current_lines = current.text.split(/\r?\n/) + @lines = current_lines.collect {|t| [nil, nil, t]} + positions = [] + current_lines.size.times {|i| positions << i} + while (current.previous) + d = current.previous.text.split(/\r?\n/).diff(current.text.split(/\r?\n/)).diffs.flatten + d.each_slice(3) do |s| + sign, line = s[0], s[1] + if sign == '+' && positions[line] && positions[line] != -1 + if @lines[positions[line]][0].nil? + @lines[positions[line]][0] = current.version + @lines[positions[line]][1] = current.author + end + end + end + d.each_slice(3) do |s| + sign, line = s[0], s[1] + if sign == '-' + positions.insert(line, -1) + else + positions[line] = nil + end + end + positions.compact! + # Stop if every line is annotated + break unless @lines.detect { |line| line[0].nil? } + current = current.previous + end + @lines.each { |line| + line[0] ||= current.version + # if the last known version is > 1 (eg. history was cleared), we don't know the author + line[1] ||= current.author if current.version == 1 + } + end +end diff --git a/app/models/wiki_redirect.rb b/app/models/wiki_redirect.rb new file mode 100644 index 0000000..eb4de86 --- /dev/null +++ b/app/models/wiki_redirect.rb @@ -0,0 +1,39 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WikiRedirect < ActiveRecord::Base + belongs_to :wiki + + validates_presence_of :wiki_id, :title, :redirects_to + validates_length_of :title, :redirects_to, :maximum => 255 + attr_protected :id + + before_save :set_redirects_to_wiki_id + + def target_page + wiki = Wiki.find_by_id(redirects_to_wiki_id) + if wiki + wiki.find_page(redirects_to, :with_redirect => false) + end + end + + private + + def set_redirects_to_wiki_id + self.redirects_to_wiki_id ||= wiki_id + end +end diff --git a/app/models/workflow_permission.rb b/app/models/workflow_permission.rb new file mode 100644 index 0000000..a231978 --- /dev/null +++ b/app/models/workflow_permission.rb @@ -0,0 +1,69 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WorkflowPermission < WorkflowRule + validates_inclusion_of :rule, :in => %w(readonly required) + validates_presence_of :old_status + validate :validate_field_name + + # Returns the workflow permissions for the given trackers and roles + # grouped by status_id + # + # Example: + # WorkflowPermission.rules_by_status_id trackers, roles + # # => {1 => {'start_date' => 'required', 'due_date' => 'readonly'}} + def self.rules_by_status_id(trackers, roles) + WorkflowPermission.where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id)).inject({}) do |h, w| + h[w.old_status_id] ||= {} + h[w.old_status_id][w.field_name] ||= [] + h[w.old_status_id][w.field_name] << w.rule + h + end + end + + # Replaces the workflow permissions for the given trackers and roles + # + # Example: + # WorkflowPermission.replace_permissions trackers, roles, {'1' => {'start_date' => 'required', 'due_date' => 'readonly'}} + def self.replace_permissions(trackers, roles, permissions) + trackers = Array.wrap trackers + roles = Array.wrap roles + + transaction do + permissions.each { |status_id, rule_by_field| + rule_by_field.each { |field, rule| + where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id), :old_status_id => status_id, :field_name => field).destroy_all + if rule.present? + trackers.each do |tracker| + roles.each do |role| + WorkflowPermission.create(:role_id => role.id, :tracker_id => tracker.id, :old_status_id => status_id, :field_name => field, :rule => rule) + end + end + end + } + } + end + end + + protected + + def validate_field_name + unless Tracker::CORE_FIELDS_ALL.include?(field_name) || field_name.to_s.match(/^\d+$/) + errors.add :field_name, :invalid + end + end +end diff --git a/app/models/workflow_rule.rb b/app/models/workflow_rule.rb new file mode 100644 index 0000000..8872d84 --- /dev/null +++ b/app/models/workflow_rule.rb @@ -0,0 +1,74 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WorkflowRule < ActiveRecord::Base + self.table_name = "#{table_name_prefix}workflows#{table_name_suffix}" + + belongs_to :role + belongs_to :tracker + belongs_to :old_status, :class_name => 'IssueStatus' + belongs_to :new_status, :class_name => 'IssueStatus' + + validates_presence_of :role, :tracker + attr_protected :id + + # Copies workflows from source to targets + def self.copy(source_tracker, source_role, target_trackers, target_roles) + unless source_tracker.is_a?(Tracker) || source_role.is_a?(Role) + raise ArgumentError.new("source_tracker or source_role must be specified, given: #{source_tracker.class.name} and #{source_role.class.name}") + end + + target_trackers = [target_trackers].flatten.compact + target_roles = [target_roles].flatten.compact + + target_trackers = Tracker.sorted.to_a if target_trackers.empty? + target_roles = Role.all.select(&:consider_workflow?) if target_roles.empty? + + target_trackers.each do |target_tracker| + target_roles.each do |target_role| + copy_one(source_tracker || target_tracker, + source_role || target_role, + target_tracker, + target_role) + end + end + end + + # Copies a single set of workflows from source to target + def self.copy_one(source_tracker, source_role, target_tracker, target_role) + unless source_tracker.is_a?(Tracker) && !source_tracker.new_record? && + source_role.is_a?(Role) && !source_role.new_record? && + target_tracker.is_a?(Tracker) && !target_tracker.new_record? && + target_role.is_a?(Role) && !target_role.new_record? + + raise ArgumentError.new("arguments can not be nil or unsaved objects") + end + + if source_tracker == target_tracker && source_role == target_role + false + else + transaction do + where(:tracker_id => target_tracker.id, :role_id => target_role.id).delete_all + connection.insert "INSERT INTO #{WorkflowRule.table_name} (tracker_id, role_id, old_status_id, new_status_id, author, assignee, field_name, #{connection.quote_column_name 'rule'}, type)" + + " SELECT #{target_tracker.id}, #{target_role.id}, old_status_id, new_status_id, author, assignee, field_name, #{connection.quote_column_name 'rule'}, type" + + " FROM #{WorkflowRule.table_name}" + + " WHERE tracker_id = #{source_tracker.id} AND role_id = #{source_role.id}" + end + true + end + end +end diff --git a/app/models/workflow_transition.rb b/app/models/workflow_transition.rb new file mode 100644 index 0000000..4f161df --- /dev/null +++ b/app/models/workflow_transition.rb @@ -0,0 +1,85 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WorkflowTransition < WorkflowRule + validates_presence_of :new_status + + def self.replace_transitions(trackers, roles, transitions) + trackers = Array.wrap trackers + roles = Array.wrap roles + + transaction do + records = WorkflowTransition.where(:tracker_id => trackers.map(&:id), :role_id => roles.map(&:id)).to_a + + transitions.each do |old_status_id, transitions_by_new_status| + transitions_by_new_status.each do |new_status_id, transition_by_rule| + transition_by_rule.each do |rule, transition| + trackers.each do |tracker| + roles.each do |role| + w = records.select {|r| + r.old_status_id == old_status_id.to_i && + r.new_status_id == new_status_id.to_i && + r.tracker_id == tracker.id && + r.role_id == role.id && + !r.destroyed? + } + + if rule == 'always' + w = w.select {|r| !r.author && !r.assignee} + else + w = w.select {|r| r.author || r.assignee} + end + if w.size > 1 + w[1..-1].each(&:destroy) + end + w = w.first + + if transition == "1" || transition == true + unless w + w = WorkflowTransition.new(:old_status_id => old_status_id, :new_status_id => new_status_id, :tracker_id => tracker.id, :role_id => role.id) + records << w + end + w.author = true if rule == "author" + w.assignee = true if rule == "assignee" + w.save if w.changed? + elsif w + if rule == 'always' + w.destroy + elsif rule == 'author' + if w.assignee + w.author = false + w.save if w.changed? + else + w.destroy + end + elsif rule == 'assignee' + if w.author + w.assignee = false + w.save if w.changed? + else + w.destroy + end + end + end + end + end + end + end + end + end + end +end diff --git a/app/views/account/logout.html.erb b/app/views/account/logout.html.erb new file mode 100644 index 0000000..3095976 --- /dev/null +++ b/app/views/account/logout.html.erb @@ -0,0 +1,3 @@ +<%= form_tag(signout_path) do %> +

    <%= submit_tag l(:label_logout) %>

    +<% end %> diff --git a/app/views/account/lost_password.html.erb b/app/views/account/lost_password.html.erb new file mode 100644 index 0000000..19df8d9 --- /dev/null +++ b/app/views/account/lost_password.html.erb @@ -0,0 +1,11 @@ +

    <%=l(:label_password_lost)%>

    + +<%= form_tag(lost_password_path) do %> +
    +

    + + <%= text_field_tag 'mail', nil, :size => 40 %> + <%= submit_tag l(:button_submit) %> +

    +
    +<% end %> diff --git a/app/views/account/password_recovery.html.erb b/app/views/account/password_recovery.html.erb new file mode 100644 index 0000000..24da822 --- /dev/null +++ b/app/views/account/password_recovery.html.erb @@ -0,0 +1,20 @@ +

    <%=l(:label_password_lost)%>

    + +<%= error_messages_for 'user' %> + +<%= form_tag(lost_password_path) do %> + <%= hidden_field_tag 'token', @token.value %> +
    +

    + + <%= password_field_tag 'new_password', nil, :size => 25 %> + <%= l(:text_caracters_minimum, :count => Setting.password_min_length) %> +

    + +

    + + <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %> +

    +
    +

    <%= submit_tag l(:button_save) %>

    +<% end %> diff --git a/app/views/account/register.html.erb b/app/views/account/register.html.erb new file mode 100644 index 0000000..ade00ad --- /dev/null +++ b/app/views/account/register.html.erb @@ -0,0 +1,38 @@ +

    <%=l(:label_register)%> <%=link_to l(:label_login_with_open_id_option), signin_url if Setting.openid? %>

    + +<%= labelled_form_for @user, :url => register_path do |f| %> +<%= error_messages_for 'user' %> + +
    +<% if @user.auth_source_id.nil? %> +

    <%= f.text_field :login, :size => 25, :required => true %>

    + +

    <%= f.password_field :password, :size => 25, :required => true %> + <%= l(:text_caracters_minimum, :count => Setting.password_min_length) %>

    + +

    <%= f.password_field :password_confirmation, :size => 25, :required => true %>

    +<% end %> + +

    <%= f.text_field :firstname, :required => true %>

    +

    <%= f.text_field :lastname, :required => true %>

    +

    <%= f.text_field :mail, :required => true %>

    +<%= labelled_fields_for :pref, @user.pref do |pref_fields| %> +

    <%= pref_fields.check_box :hide_mail %>

    +<% end %> + + +<% unless @user.force_default_language? %> +

    <%= f.select :language, lang_options_for_select %>

    +<% end %> + +<% if Setting.openid? %> +

    <%= f.text_field :identity_url %>

    +<% end %> + +<% @user.custom_field_values.select {|v| (Setting.show_custom_fields_on_registration? && v.editable?) || v.required?}.each do |value| %> +

    <%= custom_field_tag_with_label :user, value %>

    +<% end %> +
    + +<%= submit_tag l(:button_submit) %> +<% end %> diff --git a/app/views/activities/index.html.erb b/app/views/activities/index.html.erb new file mode 100644 index 0000000..c3026fb --- /dev/null +++ b/app/views/activities/index.html.erb @@ -0,0 +1,72 @@ +

    <%= @author.nil? ? l(:label_activity) : l(:label_user_activity, link_to_user(@author)).html_safe %>

    +

    <%= l(:label_date_from_to, :start => format_date(@date_to - @days), :end => format_date(@date_to-1)) %>

    + +
    +<% @events_by_day.keys.sort.reverse.each do |day| %> +

    <%= format_activity_day(day) %>

    +
    +<% sort_activity_events(@events_by_day[day]).each do |e, in_group| -%> +
    <%= User.current.logged? && e.respond_to?(:event_author) && User.current == e.event_author ? 'me' : nil %>"> + <%= avatar(e.event_author, :size => "24") if e.respond_to?(:event_author) %> + <%= format_time(e.event_datetime, false) %> + <%= content_tag('span', e.project, :class => 'project') if @project.nil? || @project != e.project %> + <%= link_to format_activity_title(e.event_title), e.event_url %> +
    +
    "><%= format_activity_description(e.event_description) %> + <%= link_to_user(e.event_author) if e.respond_to?(:event_author) %>
    +<% end -%> +
    +<% end -%> +
    + +<%= content_tag('p', l(:label_no_data), :class => 'nodata') if @events_by_day.empty? %> + + +
      + <% unless @date_to > User.current.today %> +
    +
    +  +<% other_formats_links do |f| %> + <%= f.link_to_with_query_parameters 'Atom', 'from' => nil, :key => User.current.rss_key %> +<% end %> + +<% content_for :header_tags do %> +<%= auto_discovery_link_tag(:atom, :params => request.query_parameters.merge(:from => nil, :key => User.current.rss_key), :format => 'atom') %> +<% end %> + +<% content_for :sidebar do %> +<%= form_tag({}, :method => :get, :id => 'activity_scope_form') do %> +

    <%= l(:label_activity) %>

    +
      +<% @activity.event_types.each do |t| %> +
    • + <%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> + +
    • +<% end %> +
    +<% if @project && @project.descendants.active.any? %> + <%= hidden_field_tag 'with_subprojects', 0, :id => nil %> +

    +<% end %> +<%= hidden_field_tag('user_id', params[:user_id]) unless params[:user_id].blank? %> +<%= hidden_field_tag('from', params[:from]) unless params[:from].blank? %> +

    <%= submit_tag l(:button_apply), :class => 'button-small', :name => 'submit' %>

    +<% end %> +<% end %> + +<% html_title(l(:label_activity), @author) -%> diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb new file mode 100644 index 0000000..2ac62c2 --- /dev/null +++ b/app/views/admin/_menu.html.erb @@ -0,0 +1,3 @@ +
    + <%= render_menu :admin_menu %> +
    diff --git a/app/views/admin/_no_data.html.erb b/app/views/admin/_no_data.html.erb new file mode 100644 index 0000000..8ad39b1 --- /dev/null +++ b/app/views/admin/_no_data.html.erb @@ -0,0 +1,8 @@ +
    +<%= form_tag({:action => 'default_configuration'}) do %> + <%= simple_format(l(:text_no_configuration_data)) %> +

    <%= l(:field_language) %>: + <%= select_tag 'lang', options_for_select(lang_options_for_select(false), current_language.to_s) %> + <%= submit_tag l(:text_load_default_configuration) %>

    +<% end %> +
    diff --git a/app/views/admin/index.html.erb b/app/views/admin/index.html.erb new file mode 100644 index 0000000..768dd4e --- /dev/null +++ b/app/views/admin/index.html.erb @@ -0,0 +1,8 @@ +

    <%=l(:label_administration)%>

    + +
    + <%= render :partial => 'no_data' if @no_configuration_data %> + <%= render :partial => 'menu' %> +
    + +<% html_title(l(:label_administration)) -%> diff --git a/app/views/admin/info.html.erb b/app/views/admin/info.html.erb new file mode 100644 index 0000000..2ff8de5 --- /dev/null +++ b/app/views/admin/info.html.erb @@ -0,0 +1,18 @@ +

    <%=l(:label_information_plural)%>

    + +

    <%= Redmine::Info.versioned_name %>

    + + +<% @checklist.each do |label, result| %> + + + + +<% end %> +
    <%= label.is_a?(Symbol) ? l(label) : label %>
    +
    +
    +
    <%= Redmine::Info.environment %>
    +
    + +<% html_title(l(:label_information_plural)) -%> diff --git a/app/views/admin/plugins.html.erb b/app/views/admin/plugins.html.erb new file mode 100644 index 0000000..3d88c90 --- /dev/null +++ b/app/views/admin/plugins.html.erb @@ -0,0 +1,65 @@ +<%= title l(:label_plugins) %> + +<% if @plugins.any? %> +
    + + <% @plugins.each do |plugin| %> + + + + + + + <% end %> +
    <%= plugin.name %> + <%= content_tag('span', plugin.description, :class => 'description') unless plugin.description.blank? %> + <%= content_tag('span', link_to(plugin.url, plugin.url), :class => 'url') unless plugin.url.blank? %> + <%= plugin.author_url.blank? ? plugin.author : link_to(plugin.author, plugin.author_url) %><%= plugin.version %><%= link_to(l(:button_configure), plugin_settings_path(plugin)) if plugin.configurable? %>
    +
    +

    <%= l(:label_check_for_updates) %>

    +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> + +<%= javascript_tag do %> +$(document).ready(function(){ + $("#check-for-updates").click(function(e){ + e.preventDefault(); + $.ajax({ + dataType: "jsonp", + url: "https://www.redmine.org/plugins/check_updates", + data: <%= raw_json plugin_data_for_updates(@plugins) %>, + timeout: 10000, + beforeSend: function(){ + $('#ajax-indicator').show(); + }, + success: function(data){ + $('#ajax-indicator').hide(); + $("table.plugins td.version span").addClass("unknown"); + $.each(data, function(plugin_id, plugin_data){ + var s = $("tr#plugin-"+plugin_id+" td.version span"); + s.removeClass("icon-ok icon-warning unknown"); + if (plugin_data.url) { + if (s.parent("a").length>0) { + s.unwrap(); + } + s.addClass("found"); + s.wrap($("").attr("href", plugin_data.url).attr("target", "_blank")); + } + if (plugin_data.c == s.text()) { + s.addClass("icon-ok"); + } else if (plugin_data.c) { + s.addClass("icon-warning"); + s.attr("title", "<%= escape_javascript l(:label_latest_compatible_version) %>: "+plugin_data.c); + } + }); + $("table.plugins td.version span.unknown").addClass("icon-help").attr("title", "<%= escape_javascript l(:label_unknown_plugin) %>"); + }, + error: function(){ + $('#ajax-indicator').hide(); + alert("Unable to retrieve plugin informations from www.redmine.org"); + } + }); + }); +}); +<% end if @plugins.any? %> diff --git a/app/views/admin/projects.html.erb b/app/views/admin/projects.html.erb new file mode 100644 index 0000000..077f87c --- /dev/null +++ b/app/views/admin/projects.html.erb @@ -0,0 +1,48 @@ +
    +<%= link_to l(:label_project_new), new_project_path, :class => 'icon icon-add' %> +
    + +<%= title l(:label_project_plural) %> + +<%= form_tag({}, :method => :get) do %> +
    <%= l(:label_filter_plural) %> + +<%= select_tag 'status', project_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %> + +<%= text_field_tag 'name', params[:name], :size => 30 %> +<%= submit_tag l(:button_apply), :class => "small", :name => nil %> +<%= link_to l(:button_clear), admin_projects_path, :class => 'icon icon-reload' %> +
    +<% end %> +  + +<% if @projects.any? %> +
    + + + + + + + + +<% project_tree(@projects, :init_level => true) do |project, level| %> + "> + + + + + +<% end %> + +
    <%=l(:label_project)%><%=l(:field_is_public)%><%=l(:field_created_on)%>
    <%= link_to_project_settings(project, {}, :title => project.short_description) %><%= checked_image project.is_public? %><%= format_date(project.created_on) %> + <%= link_to(l(:button_archive), archive_project_path(project, :status => params[:status]), :data => {:confirm => l(:text_are_you_sure)}, :method => :post, :class => 'icon icon-lock') unless project.archived? %> + <%= link_to(l(:button_unarchive), unarchive_project_path(project, :status => params[:status]), :method => :post, :class => 'icon icon-unlock') if project.archived? && (project.parent.nil? || !project.parent.archived?) %> + <%= link_to(l(:button_copy), copy_project_path(project), :class => 'icon icon-copy') %> + <%= link_to(l(:button_delete), project_path(project), :method => :delete, :class => 'icon icon-del') %> +
    +
    +<%= pagination_links_full @project_pages, @project_count %> +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> diff --git a/app/views/attachments/_form.html.erb b/app/views/attachments/_form.html.erb new file mode 100644 index 0000000..96c8c64 --- /dev/null +++ b/app/views/attachments/_form.html.erb @@ -0,0 +1,47 @@ +<% attachment_param ||= 'attachments' %> +<% saved_attachments ||= container.saved_attachments if defined?(container) && container %> +<% multiple = true unless defined?(multiple) && multiple == false %> +<% show_add = multiple || saved_attachments.blank? %> +<% description = (defined?(description) && description == false ? false : true) %> +<% css_class = (defined?(filedrop) && filedrop == false ? '' : 'filedrop') %> + + + + <% if saved_attachments.present? %> + <% saved_attachments.each_with_index do |attachment, i| %> + + <%= text_field_tag("#{attachment_param}[p#{i}][filename]", attachment.filename, :class => 'filename') %> + <% if attachment.container_id.present? %> + <%= link_to l(:label_delete), "#", :onclick => "$(this).closest('.attachments_form').find('.add_attachment').show(); $(this).parent().remove(); return false;", :class => 'icon-only icon-del' %> + <%= hidden_field_tag "#{attachment_param}[p#{i}][id]", attachment.id %> + <% else %> + <%= text_field_tag("#{attachment_param}[p#{i}][description]", attachment.description, :maxlength => 255, :placeholder => l(:label_optional_description), :class => 'description') if description %> + <%= link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'icon-only icon-del remove-upload') %> + <%= hidden_field_tag "#{attachment_param}[p#{i}][token]", attachment.token %> + <% end %> + + <% end %> + <% end %> + + + <%= file_field_tag "#{attachment_param}[dummy][file]", + :id => nil, + :class => "file_selector #{css_class}", + :multiple => multiple, + :onchange => 'addInputFiles(this);', + :data => { + :max_file_size => Setting.attachment_max_size.to_i.kilobytes, + :max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)), + :max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i, + :upload_path => uploads_path(:format => 'js'), + :param => attachment_param, + :description => description, + :description_placeholder => l(:label_optional_description) + } %> + (<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>) + + + +<% content_for :header_tags do %> + <%= javascript_include_tag 'attachments' %> +<% end %> diff --git a/app/views/attachments/_links.html.erb b/app/views/attachments/_links.html.erb new file mode 100644 index 0000000..0a9f5e3 --- /dev/null +++ b/app/views/attachments/_links.html.erb @@ -0,0 +1,45 @@ +
    +
    + <%= link_to(l(:label_edit_attachments), + container_attachments_edit_path(container), + :title => l(:label_edit_attachments), + :class => 'icon-only icon-edit' + ) if options[:editable] %> +
    + +<% for attachment in attachments %> + + + + + + +<% end %> +
    + <%= link_to_attachment attachment, class: 'icon icon-attachment' -%> + (<%= number_to_human_size attachment.filesize %>) + <%= link_to_attachment attachment, class: 'icon-only icon-download', title: l(:button_download), download: true -%> + <%= attachment.description unless attachment.description.blank? %> + <% if options[:author] %> + <%= attachment.author %>, <%= format_time(attachment.created_on) %> + <% end %> + + <% if options[:deletable] %> + <%= link_to l(:button_delete), attachment_path(attachment), + :data => {:confirm => l(:text_are_you_sure)}, + :method => :delete, + :class => 'delete icon-only icon-del', + :title => l(:button_delete) %> + <% end %> +
    +<% if defined?(thumbnails) && thumbnails %> + <% images = attachments.select(&:thumbnailable?) %> + <% if images.any? %> +
    + <% images.each do |attachment| %> +
    <%= thumbnail_tag(attachment) %>
    + <% end %> +
    + <% end %> +<% end %> +
    diff --git a/app/views/attachments/destroy.js.erb b/app/views/attachments/destroy.js.erb new file mode 100644 index 0000000..29b9a0c --- /dev/null +++ b/app/views/attachments/destroy.js.erb @@ -0,0 +1,2 @@ +$('#attachments_<%= j params[:attachment_id] %>').closest('.attachments_form').find('.add_attachment').show(); +$('#attachments_<%= j params[:attachment_id] %>').remove(); diff --git a/app/views/attachments/diff.html.erb b/app/views/attachments/diff.html.erb new file mode 100644 index 0000000..0bd802d --- /dev/null +++ b/app/views/attachments/diff.html.erb @@ -0,0 +1,10 @@ +<%= render :layout => 'layouts/file' do %> + <%= form_tag({}, :method => 'get') do %> +

    + <%= l(:label_view_diff) %>: + + +

    + <% end %> + <%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type, :diff_style => nil} %> +<% end %> diff --git a/app/views/attachments/edit_all.html.erb b/app/views/attachments/edit_all.html.erb new file mode 100644 index 0000000..de089ea --- /dev/null +++ b/app/views/attachments/edit_all.html.erb @@ -0,0 +1,30 @@ +

    <%= l(:label_edit_attachments) %>

    + +<%= error_messages_for *@attachments %> + +<%= form_tag(container_attachments_path(@container), :method => 'patch') do %> + <%= back_url_hidden_field_tag %> +
    + + <% @attachments.each do |attachment| %> + + + + + + + + <% end %> +
    + <%= attachment.filename_was %> + (<%= number_to_human_size attachment.filesize %>) + <%= attachment.author %>, <%= format_time(attachment.created_on) %> +
    <%= text_field_tag "attachments[#{attachment.id}][filename]", attachment.filename, :size => 40 %> + <%= text_field_tag "attachments[#{attachment.id}][description]", attachment.description, :size => 80, :placeholder => l(:label_optional_description) %> +
    +
    +

    + <%= submit_tag l(:button_save) %> + <%= link_to l(:button_cancel), back_url if back_url.present? %> +

    +<% end %> diff --git a/app/views/attachments/file.html.erb b/app/views/attachments/file.html.erb new file mode 100644 index 0000000..af5ea78 --- /dev/null +++ b/app/views/attachments/file.html.erb @@ -0,0 +1,4 @@ +<%= render :layout => 'layouts/file' do %> +   + <%= render :partial => 'common/file', :locals => {:content => @content, :filename => @attachment.filename} %> +<% end %> diff --git a/app/views/attachments/image.html.erb b/app/views/attachments/image.html.erb new file mode 100644 index 0000000..b0d2258 --- /dev/null +++ b/app/views/attachments/image.html.erb @@ -0,0 +1,3 @@ +<%= render :layout => 'layouts/file' do %> + <%= render :partial => 'common/image', :locals => {:path => download_named_attachment_path(@attachment, @attachment.filename), :alt => @attachment.filename} %> +<% end %> diff --git a/app/views/attachments/other.html.erb b/app/views/attachments/other.html.erb new file mode 100644 index 0000000..608bbf2 --- /dev/null +++ b/app/views/attachments/other.html.erb @@ -0,0 +1,11 @@ +<%= render :layout => 'layouts/file' do %> + <%= render :partial => 'common/other', + :locals => { + :download_link => link_to_attachment( + @attachment, + :text => l(:label_no_preview_download), + :download => true, + :class => 'icon icon-download' + ) + } %> +<% end %> diff --git a/app/views/attachments/show.api.rsb b/app/views/attachments/show.api.rsb new file mode 100644 index 0000000..5a9f74a --- /dev/null +++ b/app/views/attachments/show.api.rsb @@ -0,0 +1 @@ +render_api_attachment(@attachment, api) diff --git a/app/views/attachments/upload.api.rsb b/app/views/attachments/upload.api.rsb new file mode 100644 index 0000000..6049b2e --- /dev/null +++ b/app/views/attachments/upload.api.rsb @@ -0,0 +1,4 @@ +api.upload do + api.id @attachment.id + api.token @attachment.token +end diff --git a/app/views/attachments/upload.js.erb b/app/views/attachments/upload.js.erb new file mode 100644 index 0000000..6b804a6 --- /dev/null +++ b/app/views/attachments/upload.js.erb @@ -0,0 +1,14 @@ +var fileSpan = $('#attachments_<%= j params[:attachment_id] %>'); +<% if @attachment.new_record? %> + fileSpan.hide(); + alert("<%= escape_javascript @attachment.errors.full_messages.join(', ') %>"); +<% else %> +fileSpan.find('input.token').val('<%= j @attachment.token %>'); +fileSpan.find('a.remove-upload') + .attr({ + "data-remote": true, + "data-method": 'delete', + href: '<%= j attachment_path(@attachment, :attachment_id => params[:attachment_id], :format => 'js') %>' + }) + .off('click'); +<% end %> diff --git a/app/views/auth_sources/_form.html.erb b/app/views/auth_sources/_form.html.erb new file mode 100644 index 0000000..05c6ca9 --- /dev/null +++ b/app/views/auth_sources/_form.html.erb @@ -0,0 +1,6 @@ +<%= error_messages_for 'auth_source' %> + +
    +

    <%= f.text_field :name, :required => true %>

    +

    <%= f.check_box :onthefly_register, :label => :field_onthefly %>

    +
    diff --git a/app/views/auth_sources/_form_auth_source_ldap.html.erb b/app/views/auth_sources/_form_auth_source_ldap.html.erb new file mode 100644 index 0000000..d52e979 --- /dev/null +++ b/app/views/auth_sources/_form_auth_source_ldap.html.erb @@ -0,0 +1,24 @@ +<%= error_messages_for 'auth_source' %> + +
    +

    <%= f.text_field :name, :required => true %>

    +

    <%= f.text_field :host, :required => true %>

    +

    <%= f.text_field :port, :required => true, :size => 6 %> <%= f.check_box :tls, :no_label => true %> LDAPS

    +

    <%= f.text_field :account %>

    +

    <%= f.password_field :account_password, :label => :field_password, + :name => 'dummy_password', + :value => ((@auth_source.new_record? || @auth_source.account_password.blank?) ? '' : ('x'*15)), + :onfocus => "this.value=''; this.name='auth_source[account_password]';", + :onchange => "this.name='auth_source[account_password]';" %>

    +

    <%= f.text_field :base_dn, :required => true, :size => 60 %>

    +

    <%= f.text_area :filter, :size => 60, :label => :field_auth_source_ldap_filter %>

    +

    <%= f.text_field :timeout, :size => 4 %>

    +

    <%= f.check_box :onthefly_register, :label => :field_onthefly %>

    +
    + +
    <%=l(:label_attribute_plural)%> +

    <%= f.text_field :attr_login, :required => true, :size => 20 %>

    +

    <%= f.text_field :attr_firstname, :size => 20 %>

    +

    <%= f.text_field :attr_lastname, :size => 20 %>

    +

    <%= f.text_field :attr_mail, :size => 20 %>

    +
    diff --git a/app/views/auth_sources/edit.html.erb b/app/views/auth_sources/edit.html.erb new file mode 100644 index 0000000..7f3d07e --- /dev/null +++ b/app/views/auth_sources/edit.html.erb @@ -0,0 +1,6 @@ +<%= title [l(:label_auth_source_plural), auth_sources_path], @auth_source.name %> + +<%= labelled_form_for @auth_source, :as => :auth_source, :url => auth_source_path(@auth_source), :html => {:id => 'auth_source_form'} do |f| %> + <%= render :partial => auth_source_partial_name(@auth_source), :locals => { :f => f } %> + <%= submit_tag l(:button_save) %> +<% end %> diff --git a/app/views/auth_sources/index.html.erb b/app/views/auth_sources/index.html.erb new file mode 100644 index 0000000..7a0ffa5 --- /dev/null +++ b/app/views/auth_sources/index.html.erb @@ -0,0 +1,31 @@ +
    +<%= link_to l(:label_auth_source_new), {:action => 'new'}, :class => 'icon icon-add' %> +
    + +<%= title l(:label_auth_source_plural) %> + + + + + + + + + + +<% for source in @auth_sources %> + + + + + + + +<% end %> + +
    <%=l(:field_name)%><%=l(:field_type)%><%=l(:field_host)%><%=l(:label_user_plural)%>
    <%= link_to(source.name, :action => 'edit', :id => source)%><%= source.auth_method_name %><%= source.host %><%= source.users.count %> + <%= link_to l(:button_test), try_connection_auth_source_path(source), :class => 'icon icon-test' %> + <%= delete_link auth_source_path(source) %> +
    + +<%= pagination_links_full @auth_source_pages %> diff --git a/app/views/auth_sources/new.html.erb b/app/views/auth_sources/new.html.erb new file mode 100644 index 0000000..e9307fa --- /dev/null +++ b/app/views/auth_sources/new.html.erb @@ -0,0 +1,7 @@ +<%= title [l(:label_auth_source_plural), auth_sources_path], "#{l(:label_auth_source_new)} (#{@auth_source.auth_method_name})" %> + +<%= labelled_form_for @auth_source, :as => :auth_source, :url => auth_sources_path, :html => {:id => 'auth_source_form'} do |f| %> + <%= hidden_field_tag 'type', @auth_source.type %> + <%= render :partial => auth_source_partial_name(@auth_source), :locals => { :f => f } %> + <%= submit_tag l(:button_create) %> +<% end %> diff --git a/app/views/auto_completes/issues.html.erb b/app/views/auto_completes/issues.html.erb new file mode 100644 index 0000000..35f9387 --- /dev/null +++ b/app/views/auto_completes/issues.html.erb @@ -0,0 +1,7 @@ +<%= raw @issues.map {|issue| { + 'id' => issue.id, + 'label' => "#{issue.tracker} ##{issue.id}: #{issue.subject.to_s.truncate(60)}", + 'value' => issue.id + } + }.to_json +%> diff --git a/app/views/boards/_form.html.erb b/app/views/boards/_form.html.erb new file mode 100644 index 0000000..daaecee --- /dev/null +++ b/app/views/boards/_form.html.erb @@ -0,0 +1,9 @@ +<%= error_messages_for @board %> + +
    +

    <%= f.text_field :name, :required => true %>

    +

    <%= f.text_field :description, :required => true, :size => 80 %>

    +<% if @board.valid_parents.any? %> +

    <%= f.select :parent_id, boards_options_for_select(@board.valid_parents), :include_blank => true, :label => :field_board_parent %>

    +<% end %> +
    diff --git a/app/views/boards/edit.html.erb b/app/views/boards/edit.html.erb new file mode 100644 index 0000000..e57509e --- /dev/null +++ b/app/views/boards/edit.html.erb @@ -0,0 +1,6 @@ +

    <%= l(:label_board) %>

    + +<%= labelled_form_for @board, :url => project_board_path(@project, @board) do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> + <%= submit_tag l(:button_save) %> +<% end %> diff --git a/app/views/boards/index.html.erb b/app/views/boards/index.html.erb new file mode 100644 index 0000000..21280e1 --- /dev/null +++ b/app/views/boards/index.html.erb @@ -0,0 +1,38 @@ +

    <%= l(:label_board_plural) %>

    + + + + + + + + + +<% Board.board_tree(@boards) do |board, level| %> + + + + + + +<% end %> + +
    <%= l(:label_board) %><%= l(:label_topic_plural) %><%= l(:label_message_plural) %><%= l(:label_message_last) %>
    + <%= link_to board.name, project_board_path(board.project, board), :class => "board" %>
    + <%=h board.description %> +
    <%= board.topics_count %><%= board.messages_count %> + <% if board.last_message %> + <%= authoring board.last_message.created_on, board.last_message.author %>
    + <%= link_to_message board.last_message %> + <% end %> +
    + +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_messages => 1, :key => User.current.rss_key} %> +<% end %> + +<% content_for :header_tags do %> + <%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %> +<% end %> + +<% html_title l(:label_board_plural) %> diff --git a/app/views/boards/new.html.erb b/app/views/boards/new.html.erb new file mode 100644 index 0000000..acdf43f --- /dev/null +++ b/app/views/boards/new.html.erb @@ -0,0 +1,6 @@ +

    <%= l(:label_board_new) %>

    + +<%= labelled_form_for @board, :url => project_boards_path(@project) do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> + <%= submit_tag l(:button_create) %> +<% end %> diff --git a/app/views/boards/show.html.erb b/app/views/boards/show.html.erb new file mode 100644 index 0000000..4a0a588 --- /dev/null +++ b/app/views/boards/show.html.erb @@ -0,0 +1,66 @@ +<%= board_breadcrumb(@board) %> + +
    +<%= link_to l(:label_message_new), + new_board_message_path(@board), + :class => 'icon icon-add', + :onclick => 'showAndScrollTo("add-message", "message_subject"); return false;' if User.current.allowed_to?(:add_messages, @board.project) %> +<%= watcher_link(@board, User.current) %> +
    + + + +

    <%= @board.name %>

    +

    <%= @board.description %>

    + +<% if @topics.any? %> + + + + + <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %> + <%= sort_header_tag('replies', :caption => l(:label_reply_plural)) %> + <%= sort_header_tag('updated_on', :caption => l(:label_message_last)) %> + + + <% @topics.each do |topic| %> + + + + + + + + <% end %> + +
    <%= l(:field_subject) %><%= l(:field_author) %>
    <%= link_to topic.subject, board_message_path(@board, topic) %><%= link_to_user(topic.author) %><%= format_time(topic.created_on) %><%= topic.replies_count %> + <% if topic.last_reply %> + <%= authoring topic.last_reply.created_on, topic.last_reply.author %>
    + <%= link_to_message topic.last_reply %> + <% end %> +
    +<%= pagination_links_full @topic_pages, @topic_count %> +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> + +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> +<% end %> + +<% html_title @board.name %> + +<% content_for :header_tags do %> + <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@project}: #{@board}") %> +<% end %> diff --git a/app/views/calendars/show.html.erb b/app/views/calendars/show.html.erb new file mode 100644 index 0000000..f189460 --- /dev/null +++ b/app/views/calendars/show.html.erb @@ -0,0 +1,45 @@ +

    <%= @query.new_record? ? l(:label_calendar) : @query.name %>

    + +<%= form_tag({:controller => 'calendars', :action => 'show', :project_id => @project}, + :method => :get, :id => 'query_form') do %> +<%= hidden_field_tag 'set_filter', '1' %> +
    "> + <%= l(:label_filter_plural) %> +
    "> + <%= render :partial => 'queries/filters', :locals => {:query => @query} %> +
    +
    + +

    + <%= link_to_previous_month(@year, @month, :accesskey => accesskey(:previous)) %> | <%= link_to_next_month(@year, @month, :accesskey => accesskey(:next)) %> +

    + +

    +<%= label_tag('month', l(:label_month)) %> +<%= select_month(@month, :prefix => "month", :discard_type => true) %> +<%= label_tag('year', l(:label_year)) %> +<%= select_year(@year, :prefix => "year", :discard_type => true) %> + +<%= link_to_function l(:button_apply), '$("#query_form").submit()', :class => 'icon icon-checked' %> +<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, :class => 'icon icon-reload' %> +

    +<% end %> + +<%= error_messages_for 'query' %> +<% if @query.valid? %> +<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %> + +<%= call_hook(:view_calendars_show_bottom, :year => @year, :month => @month, :project => @project, :query => @query) %> + +

    + <%= l(:text_tip_issue_begin_day) %> + <%= l(:text_tip_issue_end_day) %> + <%= l(:text_tip_issue_begin_end_day) %> +

    +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<% html_title(l(:label_calendar)) -%> diff --git a/app/views/common/_calendar.html.erb b/app/views/common/_calendar.html.erb new file mode 100644 index 0000000..eb830b6 --- /dev/null +++ b/app/views/common/_calendar.html.erb @@ -0,0 +1,32 @@ + + +<% 7.times do |i| %><% end %> + + + +<% day = calendar.startdt +while day <= calendar.enddt %> +<%= ("".html_safe) if day.cwday == calendar.first_wday %> + +<%= ''.html_safe if day.cwday==calendar.last_wday and day!=calendar.enddt %> +<% day = day + 1 +end %> + + +
    <%= day_name( (calendar.first_wday+i)%7 ) %>
    #{(day+(11-day.cwday)%7).cweek} +

    <%= day.day %>

    +<% calendar.events_on(day).each do |i| %> + <% if i.is_a? Issue %> +
    + <%= "#{i.project} -" unless @project && @project == i.project %> + <%= link_to_issue i, :truncate => 30 %> + <%= render_issue_tooltip i %> +
    + <% else %> + + <%= "#{i.project} -" unless @project && @project == i.project %> + <%= link_to_version i%> + + <% end %> +<% end %> +
    diff --git a/app/views/common/_diff.html.erb b/app/views/common/_diff.html.erb new file mode 100644 index 0000000..0d30bed --- /dev/null +++ b/app/views/common/_diff.html.erb @@ -0,0 +1,68 @@ +<% diff = Redmine::UnifiedDiff.new( + diff, :type => diff_type, + :max_lines => Setting.diff_max_lines_displayed.to_i, + :style => diff_style) -%> + +<% diff.each do |table_file| -%> +
    +<% if diff.diff_type == 'sbs' -%> + + + + + + + +<% table_file.each_line do |spacing, line| -%> +<% if spacing -%> + + + +<% end -%> + + + + + + +<% end -%> + +
    + <%= table_file.file_name %> +
    ......
    <%= line.nb_line_left %> +
    <%= line.html_line_left.html_safe %>
    +
    <%= line.nb_line_right %> +
    <%= line.html_line_right.html_safe %>
    +
    + +<% else -%> + + + + + + + +<% table_file.each_line do |spacing, line| %> +<% if spacing -%> + + + +<% end -%> + + + + + +<% end -%> + +
    + <%= table_file.file_name %> +
    ......
    <%= line.nb_line_left %><%= line.nb_line_right %> +
    <%= line.html_line.html_safe %>
    +
    +<% end -%> +
    +<% end -%> + +<%= l(:text_diff_truncated) if diff.truncated? %> diff --git a/app/views/common/_file.html.erb b/app/views/common/_file.html.erb new file mode 100644 index 0000000..95e0fb9 --- /dev/null +++ b/app/views/common/_file.html.erb @@ -0,0 +1,18 @@ +
    + + +<% line_num = 1 %> +<% syntax_highlight_lines(filename, Redmine::CodesetUtil.to_utf8_by_setting(content)).each do |line| %> + + + + + <% line_num += 1 %> +<% end %> + +
    + <%= line_num %> + +
    <%= line.html_safe %>
    +
    +
    diff --git a/app/views/common/_image.html.erb b/app/views/common/_image.html.erb new file mode 100644 index 0000000..ab73a23 --- /dev/null +++ b/app/views/common/_image.html.erb @@ -0,0 +1 @@ +<%= image_tag path, :alt => alt, :class => 'filecontent image' %> diff --git a/app/views/common/_other.html.erb b/app/views/common/_other.html.erb new file mode 100644 index 0000000..74d87a6 --- /dev/null +++ b/app/views/common/_other.html.erb @@ -0,0 +1,7 @@ +

    + <% if defined? download_link %> + <%= t(:label_no_preview_alternative_html, link: download_link) %> + <% else %> + <%= l(:label_no_preview) %> + <% end %> +

    diff --git a/app/views/common/_preview.html.erb b/app/views/common/_preview.html.erb new file mode 100644 index 0000000..90d83ce --- /dev/null +++ b/app/views/common/_preview.html.erb @@ -0,0 +1,3 @@ +
    <%= l(:label_preview) %> +<%= textilizable @text, :attachments => @attachments, :object => @previewed %> +
    diff --git a/app/views/common/_tabs.html.erb b/app/views/common/_tabs.html.erb new file mode 100644 index 0000000..1b880c9 --- /dev/null +++ b/app/views/common/_tabs.html.erb @@ -0,0 +1,21 @@ +
    +
      + <% tabs.each do |tab| -%> +
    • <%= link_to l(tab[:label]), (tab[:url] || { :tab => tab[:name] }), + :id => "tab-#{tab[:name]}", + :class => (tab[:name] != selected_tab ? nil : 'selected'), + :onclick => tab[:partial] ? "showTab('#{tab[:name]}', this.href); this.blur(); return false;" : nil %>
    • + <% end -%> +
    + +
    + +<% tabs.each do |tab| -%> + <%= content_tag('div', render(:partial => tab[:partial], :locals => {:tab => tab} ), + :id => "tab-content-#{tab[:name]}", + :style => (tab[:name] != selected_tab ? 'display:none' : nil), + :class => 'tab-content') if tab[:partial] %> +<% end -%> diff --git a/app/views/common/error.html.erb b/app/views/common/error.html.erb new file mode 100644 index 0000000..a5ec39c --- /dev/null +++ b/app/views/common/error.html.erb @@ -0,0 +1,8 @@ +

    <%= @status %>

    + +<% if @message.present? %> +

    <%= @message %>

    +<% end %> +

    <%= l(:button_back) %>

    + +<% html_title @status %> diff --git a/app/views/common/error_messages.api.rsb b/app/views/common/error_messages.api.rsb new file mode 100644 index 0000000..811d2a8 --- /dev/null +++ b/app/views/common/error_messages.api.rsb @@ -0,0 +1,5 @@ +api.array :errors do + @error_messages.each do |message| + api.error message + end +end diff --git a/app/views/common/feed.atom.builder b/app/views/common/feed.atom.builder new file mode 100644 index 0000000..893400d --- /dev/null +++ b/app/views/common/feed.atom.builder @@ -0,0 +1,32 @@ +xml.instruct! +xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do + xml.title truncate_single_line_raw(@title, 100) + xml.link "rel" => "self", "href" => url_for(:params => request.query_parameters, :only_path => false, :format => 'atom') + xml.link "rel" => "alternate", "href" => url_for(:params => request.query_parameters.merge(:format => nil, :key => nil), :only_path => false) + xml.id home_url + xml.icon favicon_url + xml.updated((@items.first ? @items.first.event_datetime : Time.now).xmlschema) + xml.author { xml.name "#{Setting.app_title}" } + xml.generator(:uri => Redmine::Info.url) { xml.text! Redmine::Info.app_name; } + @items.each do |item| + xml.entry do + url = url_for(item.event_url(:only_path => false)) + if @project + xml.title truncate_single_line_raw(item.event_title, 100) + else + xml.title truncate_single_line_raw("#{item.project} - #{item.event_title}", 100) + end + xml.link "rel" => "alternate", "href" => url + xml.id url + xml.updated item.event_datetime.xmlschema + author = item.event_author if item.respond_to?(:event_author) + xml.author do + xml.name(author) + xml.email(author.mail) if author.is_a?(User) && !author.mail.blank? && !author.pref.hide_mail + end if author + xml.content "type" => "html" do + xml.text! textilizable(item, :event_description, :only_path => false) + end + end + end +end diff --git a/app/views/context_menus/issues.html.erb b/app/views/context_menus/issues.html.erb new file mode 100644 index 0000000..244f9c5 --- /dev/null +++ b/app/views/context_menus/issues.html.erb @@ -0,0 +1,156 @@ +
      + <%= call_hook(:view_issues_context_menu_start, {:issues => @issues, :can => @can, :back => @back }) %> + + <% if @issue -%> +
    • <%= context_menu_link l(:button_edit), edit_issue_path(@issue), + :class => 'icon-edit', :disabled => !@can[:edit] %>
    • + <% else %> +
    • <%= context_menu_link l(:button_edit), bulk_edit_issues_path(:ids => @issue_ids), + :class => 'icon-edit', :disabled => !@can[:edit] %>
    • + <% end %> + + <% if @allowed_statuses.present? %> +
    • + <%= l(:field_status) %> +
        + <% @allowed_statuses.each do |s| -%> +
      • <%= context_menu_link s.name, bulk_update_issues_path(:ids => @issue_ids, :issue => {:status_id => s}, :back_url => @back), :method => :post, + :selected => (@issue && s == @issue.status), :disabled => !@can[:edit] %>
      • + <% end -%> +
      +
    • + <% end %> + + <% if @trackers.present? %> +
    • + <%= l(:field_tracker) %> +
        + <% @trackers.each do |t| -%> +
      • <%= context_menu_link t.name, bulk_update_issues_path(:ids => @issue_ids, :issue => {'tracker_id' => t}, :back_url => @back), :method => :post, + :selected => (@issue && t == @issue.tracker), :disabled => !@can[:edit] %>
      • + <% end -%> +
      +
    • + <% end %> + + <% if @safe_attributes.include?('priority_id') && @priorities.present? -%> +
    • + <%= l(:field_priority) %> +
        + <% @priorities.each do |p| -%> +
      • <%= context_menu_link p.name, bulk_update_issues_path(:ids => @issue_ids, :issue => {'priority_id' => p}, :back_url => @back), :method => :post, + :selected => (@issue && p == @issue.priority), :disabled => (!@can[:edit] || @issues.any?(&:priority_derived?)) %>
      • + <% end -%> +
      +
    • + <% end %> + + <% if @safe_attributes.include?('fixed_version_id') && @versions.present? -%> +
    • + <%= l(:field_fixed_version) %> +
        + <% @versions.sort.each do |v| -%> +
      • <%= context_menu_link format_version_name(v), bulk_update_issues_path(:ids => @issue_ids, :issue => {'fixed_version_id' => v}, :back_url => @back), :method => :post, + :selected => (@issue && v == @issue.fixed_version), :disabled => !@can[:edit] %>
      • + <% end -%> +
      • <%= context_menu_link l(:label_none), bulk_update_issues_path(:ids => @issue_ids, :issue => {'fixed_version_id' => 'none'}, :back_url => @back), :method => :post, + :selected => (@issue && @issue.fixed_version.nil?), :disabled => !@can[:edit] %>
      • +
      +
    • + <% end %> + + <% if @safe_attributes.include?('assigned_to_id') && @assignables.present? -%> +
    • + <%= l(:field_assigned_to) %> +
        + <% if @assignables.include?(User.current) %> +
      • <%= context_menu_link "<< #{l(:label_me)} >>", bulk_update_issues_path(:ids => @issue_ids, :issue => {'assigned_to_id' => User.current}, :back_url => @back), :method => :post, + :disabled => !@can[:edit] %>
      • + <% end %> + <% @assignables.each do |u| -%> +
      • <%= context_menu_link u.name, bulk_update_issues_path(:ids => @issue_ids, :issue => {'assigned_to_id' => u}, :back_url => @back), :method => :post, + :selected => (@issue && u == @issue.assigned_to), :disabled => !@can[:edit] %>
      • + <% end -%> +
      • <%= context_menu_link l(:label_nobody), bulk_update_issues_path(:ids => @issue_ids, :issue => {'assigned_to_id' => 'none'}, :back_url => @back), :method => :post, + :selected => (@issue && @issue.assigned_to.nil?), :disabled => !@can[:edit] %>
      • +
      +
    • + <% end %> + + <% if @safe_attributes.include?('category_id') && @project && @project.issue_categories.any? -%> +
    • + <%= l(:field_category) %> +
        + <% @project.issue_categories.each do |u| -%> +
      • <%= context_menu_link u.name, bulk_update_issues_path(:ids => @issue_ids, :issue => {'category_id' => u}, :back_url => @back), :method => :post, + :selected => (@issue && u == @issue.category), :disabled => !@can[:edit] %>
      • + <% end -%> +
      • <%= context_menu_link l(:label_none), bulk_update_issues_path(:ids => @issue_ids, :issue => {'category_id' => 'none'}, :back_url => @back), :method => :post, + :selected => (@issue && @issue.category.nil?), :disabled => !@can[:edit] %>
      • +
      +
    • + <% end -%> + + <% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %> +
    • + <%= l(:field_done_ratio) %> +
        + <% (0..10).map{|x|x*10}.each do |p| -%> +
      • <%= context_menu_link "#{p}%", bulk_update_issues_path(:ids => @issue_ids, :issue => {'done_ratio' => p}, :back_url => @back), :method => :post, + :selected => (@issue && p == @issue.done_ratio), :disabled => (!@can[:edit] || @issues.any?(&:done_ratio_derived?)) %>
      • + <% end -%> +
      +
    • + <% end %> + + <% @options_by_custom_field.each do |field, options| %> +
    • + <%= field.name %> +
        + <% options.each do |text, value| %> +
      • <%= bulk_update_custom_field_context_menu_link(field, text, value || text) %>
      • + <% end %> + <% unless field.is_required? %> +
      • <%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '__none__') %>
      • + <% end %> +
      +
    • + <% end %> + +<% if @can[:add_watchers] %> +
    • + <%= l(:label_issue_watchers) %> +
        +
      • <%= context_menu_link l(:button_add), + new_watchers_path(:object_type => 'issue', :object_id => @issue_ids), + :remote => true, + :class => 'icon-add' %>
      • +
      +
    • +<% end %> + +<% if User.current.logged? %> +
    • <%= watcher_link(@issues, User.current) %>
    • +<% end %> + +<% unless @issue %> +
    • <%= context_menu_link l(:button_filter), _project_issues_path(@project, :set_filter => 1, :status_id => "*", :issue_id => @issue_ids.join(",")), + :class => 'icon-list' %>
    • +<% end %> + +<% if @issue.present? %> + <% if @can[:log_time] -%> +
    • <%= context_menu_link l(:button_log_time), new_issue_time_entry_path(@issue), + :class => 'icon-time-add' %>
    • + <% end %> +
    • <%= context_menu_link l(:button_copy), project_copy_issue_path(@project, @issue), + :class => 'icon-copy', :disabled => !@can[:copy] %>
    • +<% else %> +
    • <%= context_menu_link l(:button_copy), bulk_edit_issues_path(:ids => @issue_ids, :copy => '1'), + :class => 'icon-copy', :disabled => !@can[:copy] %>
    • +<% end %> +
    • <%= context_menu_link l(:button_delete), issues_path(:ids => @issue_ids, :back_url => @back), + :method => :delete, :data => {:confirm => issues_destroy_confirmation_message(@issues)}, :class => 'icon-del', :disabled => !@can[:delete] %>
    • + + <%= call_hook(:view_issues_context_menu_end, {:issues => @issues, :can => @can, :back => @back }) %> +
    diff --git a/app/views/context_menus/time_entries.html.erb b/app/views/context_menus/time_entries.html.erb new file mode 100644 index 0000000..33e0aa1 --- /dev/null +++ b/app/views/context_menus/time_entries.html.erb @@ -0,0 +1,45 @@ +
      + <% if !@time_entry.nil? -%> +
    • <%= context_menu_link l(:button_edit), {:controller => 'timelog', :action => 'edit', :id => @time_entry}, + :class => 'icon-edit', :disabled => !@can[:edit] %>
    • + <% else %> +
    • <%= context_menu_link l(:button_edit), {:controller => 'timelog', :action => 'bulk_edit', :ids => @time_entries.collect(&:id)}, + :class => 'icon-edit', :disabled => !@can[:edit] %>
    • + <% end %> + + <%= call_hook(:view_time_entries_context_menu_start, {:time_entries => @time_entries, :can => @can, :back => @back }) %> + + <% if @activities.present? -%> +
    • + <%= l(:field_activity) %> +
        + <% @activities.each do |u| -%> +
      • <%= context_menu_link u.name, {:controller => 'timelog', :action => 'bulk_update', :ids => @time_entries.collect(&:id), :time_entry => {'activity_id' => u}, :back_url => @back}, :method => :post, + :selected => (@time_entry && u == @time_entry.activity), :disabled => !@can[:edit] %>
      • + <% end -%> +
      +
    • + <% end %> + + <% @options_by_custom_field.each do |field, options| %> +
    • + <%= field.name %> +
        + <% options.each do |text, value| %> +
      • <%= bulk_update_time_entry_custom_field_context_menu_link(field, text, value || text) %>
      • + <% end %> + <% unless field.is_required? %> +
      • <%= bulk_update_time_entry_custom_field_context_menu_link(field, l(:label_none), '__none__') %>
      • + <% end %> +
      +
    • + <% end %> + + <%= call_hook(:view_time_entries_context_menu_end, {:time_entries => @time_entries, :can => @can, :back => @back }) %> + +
    • + <%= context_menu_link l(:button_delete), + {:controller => 'timelog', :action => 'destroy', :ids => @time_entries.collect(&:id), :back_url => @back}, + :method => :delete, :data => {:confirm => l(:text_time_entries_destroy_confirmation)}, :class => 'icon-del', :disabled => !@can[:delete] %> +
    • +
    diff --git a/app/views/custom_field_enumerations/create.js.erb b/app/views/custom_field_enumerations/create.js.erb new file mode 100644 index 0000000..9a9d404 --- /dev/null +++ b/app/views/custom_field_enumerations/create.js.erb @@ -0,0 +1,2 @@ +$('#content').html('<%= escape_javascript(render(:template => 'custom_field_enumerations/index')) %>'); +$('#custom_field_enumeration_name').focus(); diff --git a/app/views/custom_field_enumerations/destroy.html.erb b/app/views/custom_field_enumerations/destroy.html.erb new file mode 100644 index 0000000..d2ae2ed --- /dev/null +++ b/app/views/custom_field_enumerations/destroy.html.erb @@ -0,0 +1,14 @@ +<%= title [l(:label_custom_field_plural), custom_fields_path], + [l(@custom_field.type_name), custom_fields_path(:tab => @custom_field.class.name)], + @custom_field.name %> + +<%= form_tag(custom_field_enumeration_path(@custom_field, @value), :method => :delete) do %> +
    +

    <%= l(:text_enumeration_destroy_question, :name => @value.name, :count => @value.objects_count) %>

    +

    +<%= select_tag('reassign_to_id', content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '') + options_from_collection_for_select(@enumerations, 'id', 'name')) %>

    +
    + +<%= submit_tag l(:button_apply) %> +<%= link_to l(:button_cancel), custom_field_enumerations_path(@custom_field) %> +<% end %> diff --git a/app/views/custom_field_enumerations/index.html.erb b/app/views/custom_field_enumerations/index.html.erb new file mode 100644 index 0000000..915cba2 --- /dev/null +++ b/app/views/custom_field_enumerations/index.html.erb @@ -0,0 +1,47 @@ +<%= custom_field_title @custom_field %> + +<% if @custom_field.enumerations.any? %> +<%= form_tag custom_field_enumerations_path(@custom_field), :method => 'put' do %> +
    +
      + <% @custom_field.enumerations.each_with_index do |value, position| %> +
    • + + <%= hidden_field_tag "custom_field_enumerations[#{value.id}][position]", position, :class => 'position' %> + <%= text_field_tag "custom_field_enumerations[#{value.id}][name]", value.name, :size => 40 %> + <%= hidden_field_tag "custom_field_enumerations[#{value.id}][active]", 0 %> + + <%= delete_link custom_field_enumeration_path(@custom_field, value) %> +
    • + <% end %> +
    +
    +

    + <%= submit_tag(l(:button_save)) %> | + <%= link_to l(:button_back), edit_custom_field_path(@custom_field) %> +

    +<% end %> +<% end %> + +

    <%= l(:label_enumeration_new) %>

    + +<%= form_tag custom_field_enumerations_path(@custom_field), :method => 'post', :remote => true do %> +

    <%= text_field_tag 'custom_field_enumeration[name]', '', :size => 40 %> + <%= submit_tag(l(:button_add)) %>

    +<% end %> + +<%= javascript_tag do %> +$(function() { + $("#custom_field_enumerations").sortable({ + handle: ".sort-handle", + update: function(event, ui) { + $("#custom_field_enumerations li").each(function(){ + $(this).find("input.position").val($(this).index()+1); + }); + } + }); +}); +<% end %> diff --git a/app/views/custom_fields/_form.html.erb b/app/views/custom_fields/_form.html.erb new file mode 100644 index 0000000..94f417c --- /dev/null +++ b/app/views/custom_fields/_form.html.erb @@ -0,0 +1,133 @@ +<%= error_messages_for 'custom_field' %> + +
    +
    +

    <%= f.select :field_format, custom_field_formats_for_select(@custom_field), {}, :disabled => !@custom_field.new_record? %>

    +

    <%= f.text_field :name, :size => 50, :required => true %>

    +

    <%= f.text_area :description, :rows => 7 %>

    + +<% if @custom_field.format.multiple_supported %> +

    + <%= f.check_box :multiple %> + <% if !@custom_field.new_record? && @custom_field.multiple %> + <%= l(:text_turning_multiple_off) %> + <% end %> +

    +<% end %> + +<%= render_custom_field_format_partial f, @custom_field %> + +<%= call_hook(:view_custom_fields_form_upper_box, :custom_field => @custom_field, :form => f) %> +
    +

    <%= submit_tag l(:button_save) %>

    +
    + +
    +
    +<% case @custom_field.class.name +when "IssueCustomField" %> +

    <%= f.check_box :is_required %>

    + <% if @custom_field.format.is_filter_supported %> +

    <%= f.check_box :is_filter %>

    + <% end %> + <% if @custom_field.format.searchable_supported %> +

    <%= f.check_box :searchable %>

    + <% end %> + +<% when "UserCustomField" %> +

    <%= f.check_box :is_required %>

    +

    <%= f.check_box :visible %>

    +

    <%= f.check_box :editable %>

    + <% if @custom_field.format.is_filter_supported %> +

    <%= f.check_box :is_filter %>

    + <% end %> + +<% when "ProjectCustomField" %> +

    <%= f.check_box :is_required %>

    +

    <%= f.check_box :visible %>

    + <% if @custom_field.format.searchable_supported %> +

    <%= f.check_box :searchable %>

    + <% end %> + <% if @custom_field.format.is_filter_supported %> +

    <%= f.check_box :is_filter %>

    + <% end %> + +<% when "VersionCustomField" %> +

    <%= f.check_box :is_required %>

    + <% if @custom_field.format.is_filter_supported %> +

    <%= f.check_box :is_filter %>

    + <% end %> + +<% when "GroupCustomField" %> +

    <%= f.check_box :is_required %>

    + <% if @custom_field.format.is_filter_supported %> +

    <%= f.check_box :is_filter %>

    + <% end %> + +<% when "TimeEntryCustomField" %> +

    <%= f.check_box :is_required %>

    + <% if @custom_field.format.is_filter_supported %> +

    <%= f.check_box :is_filter %>

    + <% end %> + +<% else %> +

    <%= f.check_box :is_required %>

    + +<% end %> +<%= call_hook(:"view_custom_fields_form_#{@custom_field.type.to_s.underscore}", :custom_field => @custom_field, :form => f) %> +
    + +<% if @custom_field.is_a?(IssueCustomField) %> + +
    <%= l(:field_visible) %> + + + <% role_ids = @custom_field.role_ids %> + <% Role.givable.sorted.each do |role| %> + + <% end %> + <%= hidden_field_tag 'custom_field[role_ids][]', '' %> +
    + +
    <%=l(:label_tracker_plural)%> + <% tracker_ids = @custom_field.tracker_ids %> + <% Tracker.sorted.each do |tracker| %> + <%= check_box_tag "custom_field[tracker_ids][]", + tracker.id, + tracker_ids.include?(tracker.id), + :id => "custom_field_tracker_ids_#{tracker.id}" %> + + <% end %> + <%= hidden_field_tag "custom_field[tracker_ids][]", '' %> +

    <%= check_all_links 'custom_field_tracker_ids' %>

    +
    + +
    <%= l(:label_project_plural) %> +

    <%= f.check_box :is_for_all, :data => {:disables => '#custom_field_project_ids input'} %>

    + +
    + <% project_ids = @custom_field.project_ids.to_a %> + <%= render_project_nested_lists(Project.all) do |p| + content_tag('label', check_box_tag('custom_field[project_ids][]', p.id, project_ids.include?(p.id), :id => nil) + ' ' + p) + end %> + <%= hidden_field_tag('custom_field[project_ids][]', '', :id => nil) %> +

    <%= check_all_links 'custom_field_project_ids' %>

    +
    +
    +<% end %> +
    + +<% include_calendar_headers_tags %> diff --git a/app/views/custom_fields/_index.html.erb b/app/views/custom_fields/_index.html.erb new file mode 100644 index 0000000..04d4aa2 --- /dev/null +++ b/app/views/custom_fields/_index.html.erb @@ -0,0 +1,30 @@ + + + + + + <% if tab[:name] == 'IssueCustomField' %> + + + <% end %> + + + + <% (@custom_fields_by_type[tab[:name]] || []).sort.each do |custom_field| -%> + <% back_url = custom_fields_path(:tab => tab[:name]) %> + + + + + <% if tab[:name] == 'IssueCustomField' %> + + + <% end %> + + + <% end %> + +
    <%=l(:field_name)%><%=l(:field_field_format)%><%=l(:field_is_required)%><%=l(:field_is_for_all)%><%=l(:label_used_by)%>
    <%= link_to custom_field.name, edit_custom_field_path(custom_field) %><%= l(custom_field.format.label) %><%= checked_image custom_field.is_required? %><%= checked_image custom_field.is_for_all? %><%= l(:label_x_projects, :count => @custom_fields_projects_count[custom_field.id] || 0) if custom_field.is_a? IssueCustomField and !custom_field.is_for_all? %> + <%= reorder_handle(custom_field, :url => custom_field_path(custom_field), :param => 'custom_field') %> + <%= delete_link custom_field_path(custom_field) %> +
    diff --git a/app/views/custom_fields/edit.html.erb b/app/views/custom_fields/edit.html.erb new file mode 100644 index 0000000..0cbef1f --- /dev/null +++ b/app/views/custom_fields/edit.html.erb @@ -0,0 +1,5 @@ +<%= custom_field_title @custom_field %> + +<%= labelled_form_for :custom_field, @custom_field, :url => custom_field_path(@custom_field), :html => {:method => :put, :id => 'custom_field_form'} do |f| %> +<%= render :partial => 'form', :locals => { :f => f } %> +<% end %> diff --git a/app/views/custom_fields/formats/_attachment.html.erb b/app/views/custom_fields/formats/_attachment.html.erb new file mode 100644 index 0000000..263238a --- /dev/null +++ b/app/views/custom_fields/formats/_attachment.html.erb @@ -0,0 +1,4 @@ +

    + <%= f.text_field :extensions_allowed, :size => 50, :label => :setting_attachment_extensions_allowed %> + <%= l(:text_comma_separated) %> <%= l(:label_example) %>: txt, png +

    diff --git a/app/views/custom_fields/formats/_bool.html.erb b/app/views/custom_fields/formats/_bool.html.erb new file mode 100644 index 0000000..3b791ac --- /dev/null +++ b/app/views/custom_fields/formats/_bool.html.erb @@ -0,0 +1,3 @@ +

    <%= f.select :default_value, [[]]+@custom_field.possible_values_options %>

    +

    <%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %>

    +

    <%= edit_tag_style_tag f, :include_radio => true %>

    diff --git a/app/views/custom_fields/formats/_date.html.erb b/app/views/custom_fields/formats/_date.html.erb new file mode 100644 index 0000000..b52c063 --- /dev/null +++ b/app/views/custom_fields/formats/_date.html.erb @@ -0,0 +1,3 @@ +

    <%= f.date_field(:default_value, :value => @custom_field.default_value, :size => 10) %>

    +<%= calendar_for('custom_field_default_value') %> +

    <%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %>

    diff --git a/app/views/custom_fields/formats/_enumeration.erb b/app/views/custom_fields/formats/_enumeration.erb new file mode 100644 index 0000000..07e4cf4 --- /dev/null +++ b/app/views/custom_fields/formats/_enumeration.erb @@ -0,0 +1,12 @@ +<% unless @custom_field.new_record? %> +

    + + <%= link_to l(:button_edit), custom_field_enumerations_path(@custom_field), :class => 'icon icon-edit' %> +

    +<% if @custom_field.enumerations.active.any? %> +

    <%= f.select :default_value, @custom_field.enumerations.active.map{|v| [v.name, v.id.to_s]}, :include_blank => true %>

    +<% end %> +<% end %> + +

    <%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %>

    +

    <%= edit_tag_style_tag f %>

    diff --git a/app/views/custom_fields/formats/_link.html.erb b/app/views/custom_fields/formats/_link.html.erb new file mode 100644 index 0000000..9b7d342 --- /dev/null +++ b/app/views/custom_fields/formats/_link.html.erb @@ -0,0 +1,3 @@ +<%= render :partial => 'custom_fields/formats/regexp', :locals => {:f => f, :custom_field => custom_field} %> +

    <%= f.text_field :url_pattern, :size => 50, :label => :field_url %>

    +

    <%= f.text_field(:default_value) %>

    diff --git a/app/views/custom_fields/formats/_list.html.erb b/app/views/custom_fields/formats/_list.html.erb new file mode 100644 index 0000000..675bbbf --- /dev/null +++ b/app/views/custom_fields/formats/_list.html.erb @@ -0,0 +1,7 @@ +

    + <%= f.text_area :possible_values, :value => @custom_field.possible_values.to_a.join("\n"), :rows => 15 %> + <%= l(:text_custom_field_possible_values_info) %> +

    +

    <%= f.text_field(:default_value) %>

    +

    <%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %>

    +

    <%= edit_tag_style_tag f %>

    diff --git a/app/views/custom_fields/formats/_numeric.html.erb b/app/views/custom_fields/formats/_numeric.html.erb new file mode 100644 index 0000000..cc0c798 --- /dev/null +++ b/app/views/custom_fields/formats/_numeric.html.erb @@ -0,0 +1,3 @@ +<%= render :partial => 'custom_fields/formats/regexp', :locals => {:f => f, :custom_field => custom_field} %> +

    <%= f.text_field(:default_value) %>

    +

    <%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %>

    diff --git a/app/views/custom_fields/formats/_regexp.html.erb b/app/views/custom_fields/formats/_regexp.html.erb new file mode 100644 index 0000000..9630d5a --- /dev/null +++ b/app/views/custom_fields/formats/_regexp.html.erb @@ -0,0 +1,9 @@ +

    + + <%= f.text_field :min_length, :size => 5, :no_label => true %> - + <%= f.text_field :max_length, :size => 5, :no_label => true %> +

    +

    + <%= f.text_field :regexp, :size => 50 %> + <%= l(:text_regexp_info) %> +

    diff --git a/app/views/custom_fields/formats/_string.html.erb b/app/views/custom_fields/formats/_string.html.erb new file mode 100644 index 0000000..08aac8e --- /dev/null +++ b/app/views/custom_fields/formats/_string.html.erb @@ -0,0 +1,4 @@ +<%= render :partial => 'custom_fields/formats/regexp', :locals => {:f => f, :custom_field => custom_field} %> +

    <%= f.check_box :text_formatting, {:label => :setting_text_formatting, :data => {:disables => '#custom_field_url_pattern'}}, 'full', '' %>

    +

    <%= f.text_field(:default_value) %>

    +

    <%= f.text_field :url_pattern, :size => 50, :label => :label_link_values_to %>

    diff --git a/app/views/custom_fields/formats/_text.html.erb b/app/views/custom_fields/formats/_text.html.erb new file mode 100644 index 0000000..79ea7c5 --- /dev/null +++ b/app/views/custom_fields/formats/_text.html.erb @@ -0,0 +1,6 @@ +<%= render :partial => 'custom_fields/formats/regexp', :locals => {:f => f, :custom_field => custom_field} %> +

    <%= f.check_box :text_formatting, {:label => :setting_text_formatting}, 'full', '' %>

    +<% if @custom_field.class.name == "IssueCustomField" %> +

    <%= f.check_box :full_width_layout %>

    +<% end %> +

    <%= f.text_area(:default_value, :rows => 5) %>

    diff --git a/app/views/custom_fields/formats/_user.html.erb b/app/views/custom_fields/formats/_user.html.erb new file mode 100644 index 0000000..3bb4d29 --- /dev/null +++ b/app/views/custom_fields/formats/_user.html.erb @@ -0,0 +1,24 @@ +

    + + + + <% Role.givable.sorted.each do |role| %> + + <% end %> + <%= hidden_field_tag 'custom_field[user_role][]', '' %> +

    +

    <%= edit_tag_style_tag f %>

    diff --git a/app/views/custom_fields/formats/_version.html.erb b/app/views/custom_fields/formats/_version.html.erb new file mode 100644 index 0000000..b8060d2 --- /dev/null +++ b/app/views/custom_fields/formats/_version.html.erb @@ -0,0 +1,24 @@ +

    + + + + <% Version::VERSION_STATUSES.each do |status| %> + + <% end %> + <%= hidden_field_tag 'custom_field[version_status][]', '' %> +

    +

    <%= edit_tag_style_tag f %>

    diff --git a/app/views/custom_fields/index.api.rsb b/app/views/custom_fields/index.api.rsb new file mode 100644 index 0000000..8233ed1 --- /dev/null +++ b/app/views/custom_fields/index.api.rsb @@ -0,0 +1,44 @@ +api.array :custom_fields do + @custom_fields.each do |field| + api.custom_field do + api.id field.id + api.name field.name + api.customized_type field.class.customized_class.name.underscore if field.class.customized_class + api.field_format field.field_format + api.regexp field.regexp + api.min_length field.min_length + api.max_length field.max_length + api.is_required field.is_required? + api.is_filter field.is_filter? + api.searchable field.searchable + api.multiple field.multiple? + api.default_value field.default_value + api.visible field.visible? + + values = field.possible_values_options + if values.present? + api.array :possible_values do + values.each do |label, value| + api.possible_value do + api.value value || label + api.label label + end + end + end + end + + if field.is_a?(IssueCustomField) + api.array :trackers do + field.trackers.each do |tracker| + api.tracker :id => tracker.id, :name => tracker.name + end + end + api.array :roles do + field.roles.each do |role| + api.role :id => role.id, :name => role.name + end + end + end + end + end +end diff --git a/app/views/custom_fields/index.html.erb b/app/views/custom_fields/index.html.erb new file mode 100644 index 0000000..cf2193d --- /dev/null +++ b/app/views/custom_fields/index.html.erb @@ -0,0 +1,15 @@ +
    +<%= link_to l(:label_custom_field_new), new_custom_field_path, :class => 'icon icon-add' %> +
    + +<%= title l(:label_custom_field_plural) %> + +<% if @custom_fields_by_type.present? %> + <%= render_custom_fields_tabs(@custom_fields_by_type.keys) %> +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> + +<%= javascript_tag do %> + $(function() { $("table.custom_fields tbody").positionedItems(); }); +<% end %> \ No newline at end of file diff --git a/app/views/custom_fields/new.html.erb b/app/views/custom_fields/new.html.erb new file mode 100644 index 0000000..db42229 --- /dev/null +++ b/app/views/custom_fields/new.html.erb @@ -0,0 +1,17 @@ +<%= custom_field_title @custom_field %> + +<%= labelled_form_for :custom_field, @custom_field, :url => custom_fields_path, :html => {:id => 'custom_field_form'} do |f| %> +<%= render :partial => 'form', :locals => { :f => f } %> +<%= hidden_field_tag 'type', @custom_field.type %> +<% end %> + +<%= javascript_tag do %> +$('#custom_field_field_format').change(function(){ + $.ajax({ + url: '<%= new_custom_field_path(:format => 'js') %>', + type: 'get', + data: $('#custom_field_form').serialize(), + complete: toggleDisabledInit + }); +}); +<% end %> diff --git a/app/views/custom_fields/new.js.erb b/app/views/custom_fields/new.js.erb new file mode 100644 index 0000000..d77c97f --- /dev/null +++ b/app/views/custom_fields/new.js.erb @@ -0,0 +1 @@ +$('#content').html('<%= escape_javascript(render :template => 'custom_fields/new', :layout => nil, :formats => [:html]) %>') diff --git a/app/views/custom_fields/select_type.html.erb b/app/views/custom_fields/select_type.html.erb new file mode 100644 index 0000000..084c9f3 --- /dev/null +++ b/app/views/custom_fields/select_type.html.erb @@ -0,0 +1,14 @@ +<%= custom_field_title @custom_field %> + +<% selected = 0 %> +<%= form_tag new_custom_field_path, :method => 'get' do %> +
    +

    <%= l(:label_custom_field_select_type) %>:

    +

    + <% custom_field_type_options.each do |name, type| %> + + <% end %> +

    +
    +

    <%= submit_tag l(:label_next).html_safe + " »".html_safe, :name => nil %>

    +<% end %> diff --git a/app/views/documents/_document.html.erb b/app/views/documents/_document.html.erb new file mode 100644 index 0000000..9a96d5d --- /dev/null +++ b/app/views/documents/_document.html.erb @@ -0,0 +1,6 @@ +

    <%= link_to document.title, document_path(document) %>

    +

    <%= format_time(document.updated_on) %>

    + +
    + <%= textilizable(truncate_lines(document.description), :object => document) %> +
    diff --git a/app/views/documents/_form.html.erb b/app/views/documents/_form.html.erb new file mode 100644 index 0000000..bd3b7cd --- /dev/null +++ b/app/views/documents/_form.html.erb @@ -0,0 +1,19 @@ +<%= error_messages_for @document %> + +
    +

    <%= f.select :category_id, DocumentCategory.active.collect {|c| [c.name, c.id]} %>

    +

    <%= f.text_field :title, :required => true, :size => 60 %>

    +

    <%= f.text_area :description, :cols => 60, :rows => 15, :class => 'wiki-edit' %>

    + +<% @document.custom_field_values.each do |value| %> +

    <%= custom_field_tag_with_label :document, value %>

    +<% end %> +
    + +<%= wikitoolbar_for 'document_description' %> + +<% if @document.new_record? %> +
    +

    <%= render :partial => 'attachments/form', :locals => {:container => @document} %>

    +
    +<% end %> diff --git a/app/views/documents/edit.html.erb b/app/views/documents/edit.html.erb new file mode 100644 index 0000000..87e08e1 --- /dev/null +++ b/app/views/documents/edit.html.erb @@ -0,0 +1,8 @@ +

    <%=l(:label_document)%>

    + +<%= labelled_form_for @document, :html => {:multipart => true} do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> +

    <%= submit_tag l(:button_save) %>

    +<% end %> + + diff --git a/app/views/documents/index.html.erb b/app/views/documents/index.html.erb new file mode 100644 index 0000000..fc4090f --- /dev/null +++ b/app/views/documents/index.html.erb @@ -0,0 +1,40 @@ +
    +<%= link_to l(:label_document_new), new_project_document_path(@project), :class => 'icon icon-add', + :onclick => 'showAndScrollTo("add-document", "document_title"); return false;' if User.current.allowed_to?(:add_documents, @project) %> +
    + + + +

    <%=l(:label_document_plural)%>

    + +<% if @grouped.empty? %>

    <%= l(:label_no_data) %>

    <% end %> + +<% @grouped.keys.sort.each do |group| %> +

    <%= group %>

    + <%= render :partial => 'documents/document', :collection => @grouped[group] %> +<% end %> + +<% content_for :sidebar do %> +

    <%= l(:label_sort_by, '') %>

    +
      +
    • <%= link_to(l(:field_category), {:sort_by => 'category'}, + :class => (@sort_by == 'category' ? 'selected' :nil)) %>
    • +
    • <%= link_to(l(:label_date), {:sort_by => 'date'}, + :class => (@sort_by == 'date' ? 'selected' :nil)) %>
    • +
    • <%= link_to(l(:field_title), {:sort_by => 'title'}, + :class => (@sort_by == 'title' ? 'selected' :nil)) %>
    • +
    • <%= link_to(l(:field_author), {:sort_by => 'author'}, + :class => (@sort_by == 'author' ? 'selected' :nil)) %>
    • +
    +<% end %> + +<% html_title(l(:label_document_plural)) -%> diff --git a/app/views/documents/new.html.erb b/app/views/documents/new.html.erb new file mode 100644 index 0000000..a34391e --- /dev/null +++ b/app/views/documents/new.html.erb @@ -0,0 +1,6 @@ +

    <%=l(:label_document_new)%>

    + +<%= labelled_form_for @document, :url => project_documents_path(@project), :html => {:multipart => true} do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> +

    <%= submit_tag l(:button_create) %>

    +<% end %> diff --git a/app/views/documents/show.html.erb b/app/views/documents/show.html.erb new file mode 100644 index 0000000..799803c --- /dev/null +++ b/app/views/documents/show.html.erb @@ -0,0 +1,41 @@ +
    +<% if User.current.allowed_to?(:edit_documents, @project) %> +<%= link_to l(:button_edit), edit_document_path(@document), :class => 'icon icon-edit', :accesskey => accesskey(:edit) %> +<% end %> +<% if User.current.allowed_to?(:delete_documents, @project) %> +<%= delete_link document_path(@document) %> +<% end %> +
    + +

    <%= @document.title %>

    + +

    <%= @document.category.name %>
    +<%= format_date @document.created_on %>

    + +<% if @document.custom_field_values.any? %> +
      + <% render_custom_field_values(@document) do |custom_field, formatted| %> +
    • <%= custom_field.name %>: <%= formatted %>
    • + <% end %> +
    +<% end %> + +
    +<%= textilizable @document, :description, :attachments => @document.attachments %> +
    + +

    <%= l(:label_attachment_plural) %>

    +<%= link_to_attachments @document, :thumbnails => true %> + +<% if authorize_for('documents', 'add_attachment') %> +

    <%= link_to l(:label_attachment_new), {}, :onclick => "$('#add_attachment_form').show(); return false;", + :id => 'attach_files_link' %>

    + <%= form_tag({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true, :id => "add_attachment_form", :style => "display:none;") do %> +
    +

    <%= render :partial => 'attachments/form' %>

    +
    + <%= submit_tag l(:button_add) %> + <% end %> +<% end %> + +<% html_title @document.title -%> diff --git a/app/views/email_addresses/_index.html.erb b/app/views/email_addresses/_index.html.erb new file mode 100644 index 0000000..2fcf0b4 --- /dev/null +++ b/app/views/email_addresses/_index.html.erb @@ -0,0 +1,26 @@ +<% if @addresses.present? %> + + <% @addresses.each do |address| %> + + + + + <% end %> + +<% end %> + +<% unless @addresses.size >= Setting.max_additional_emails.to_i %> +
    + <%= form_for @address, :url => user_email_addresses_path(@user), :remote => true do |f| %> +

    <%= l(:label_email_address_add) %>

    + <%= error_messages_for @address %> +

    + <%= f.text_field :address, :size => 40 %> + <%= submit_tag l(:button_add) %> +

    + <% end %> +
    +<% end %> diff --git a/app/views/email_addresses/index.html.erb b/app/views/email_addresses/index.html.erb new file mode 100644 index 0000000..7de1d37 --- /dev/null +++ b/app/views/email_addresses/index.html.erb @@ -0,0 +1,2 @@ +

    <%= @user.name %>

    +<%= render :partial => 'email_addresses/index' %> diff --git a/app/views/email_addresses/index.js.erb b/app/views/email_addresses/index.js.erb new file mode 100644 index 0000000..2a7147f --- /dev/null +++ b/app/views/email_addresses/index.js.erb @@ -0,0 +1,3 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'email_addresses/index') %>'); +showModal('ajax-modal', '600px', '<%= escape_javascript l(:label_email_address_plural) %>'); +$('#email_address_address').focus(); diff --git a/app/views/enumerations/_form.html.erb b/app/views/enumerations/_form.html.erb new file mode 100644 index 0000000..8ff774d --- /dev/null +++ b/app/views/enumerations/_form.html.erb @@ -0,0 +1,11 @@ +<%= error_messages_for 'enumeration' %> + +
    +

    <%= f.text_field :name %>

    +

    <%= f.check_box :active %>

    +

    <%= f.check_box :is_default %>

    + + <% @enumeration.custom_field_values.each do |value| %> +

    <%= custom_field_tag_with_label :enumeration, value %>

    + <% end %> +
    diff --git a/app/views/enumerations/destroy.html.erb b/app/views/enumerations/destroy.html.erb new file mode 100644 index 0000000..2757eed --- /dev/null +++ b/app/views/enumerations/destroy.html.erb @@ -0,0 +1,12 @@ +<%= title [l(@enumeration.option_name), enumerations_path], @enumeration.name %> + +<%= form_tag({}, :method => :delete) do %> +
    +

    <%= l(:text_enumeration_destroy_question, :name => @enumeration.name, :count => @enumeration.objects_count) %>

    +

    +<%= select_tag 'reassign_to_id', (content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '') + options_from_collection_for_select(@enumerations, 'id', 'name')) %>

    +
    + +<%= submit_tag l(:button_apply) %> +<%= link_to l(:button_cancel), enumerations_path %> +<% end %> diff --git a/app/views/enumerations/edit.html.erb b/app/views/enumerations/edit.html.erb new file mode 100644 index 0000000..a7d03ce --- /dev/null +++ b/app/views/enumerations/edit.html.erb @@ -0,0 +1,6 @@ +<%= title [l(@enumeration.option_name), enumerations_path], @enumeration.name %> + +<%= labelled_form_for :enumeration, @enumeration, :url => enumeration_path(@enumeration), :html => {:method => :put, :multipart => true} do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> + <%= submit_tag l(:button_save) %> +<% end %> diff --git a/app/views/enumerations/index.api.rsb b/app/views/enumerations/index.api.rsb new file mode 100644 index 0000000..2cd219f --- /dev/null +++ b/app/views/enumerations/index.api.rsb @@ -0,0 +1,10 @@ +api.array @klass.name.underscore.pluralize do + @enumerations.each do |enumeration| + api.__send__ @klass.name.underscore do + api.id enumeration.id + api.name enumeration.name + api.is_default enumeration.is_default + render_api_custom_values enumeration.visible_custom_field_values, api + end + end +end diff --git a/app/views/enumerations/index.html.erb b/app/views/enumerations/index.html.erb new file mode 100644 index 0000000..09d13a0 --- /dev/null +++ b/app/views/enumerations/index.html.erb @@ -0,0 +1,39 @@ +

    <%=l(:label_enumerations)%>

    + +<% Enumeration.get_subclasses.each do |klass| %> +

    <%= l(klass::OptionName) %>

    + +<% enumerations = klass.shared %> + +

    <%= link_to l(:label_enumeration_new), new_enumeration_path(:type => klass.name), :class => 'icon icon-add' %>

    + +<% if enumerations.any? %> + + + + + + + +<% enumerations.each do |enumeration| %> + + + + + + +<% end %> +
    <%= l(:field_name) %><%= l(:field_is_default) %><%= l(:field_active) %>
    <%= link_to enumeration, edit_enumeration_path(enumeration) %><%= checked_image enumeration.is_default? %><%= checked_image enumeration.active? %> + <%= reorder_handle(enumeration, :url => enumeration_path(enumeration), :param => 'enumeration') %> + <%= delete_link enumeration_path(enumeration) %> +
    +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> +<% end %> + +<% html_title(l(:label_enumerations)) -%> + +<%= javascript_tag do %> + $(function() { $("table.enumerations tbody").positionedItems(); }); +<% end %> \ No newline at end of file diff --git a/app/views/enumerations/new.html.erb b/app/views/enumerations/new.html.erb new file mode 100644 index 0000000..dcd9a49 --- /dev/null +++ b/app/views/enumerations/new.html.erb @@ -0,0 +1,7 @@ +<%= title [l(@enumeration.option_name), enumerations_path], l(:label_enumeration_new) %> + +<%= labelled_form_for :enumeration, @enumeration, :url => enumerations_path, :html => {:multipart => true} do |f| %> + <%= f.hidden_field :type %> + <%= render :partial => 'form', :locals => {:f => f} %> + <%= submit_tag l(:button_create) %> +<% end %> diff --git a/app/views/files/index.api.rsb b/app/views/files/index.api.rsb new file mode 100644 index 0000000..0a317e4 --- /dev/null +++ b/app/views/files/index.api.rsb @@ -0,0 +1,14 @@ +api.array :files do + @containers.each do |container| + container.attachments.each do |attachment| + api.file do + render_api_attachment_attributes(attachment, api) + if container.is_a?(Version) + api.version :id => container.id, :name => container.name + end + api.digest attachment.digest + api.downloads attachment.downloads + end + end + end +end diff --git a/app/views/files/index.html.erb b/app/views/files/index.html.erb new file mode 100644 index 0000000..3e8dda1 --- /dev/null +++ b/app/views/files/index.html.erb @@ -0,0 +1,48 @@ +
    +<%= link_to(l(:label_attachment_new), new_project_file_path(@project), :class => 'icon icon-add') if User.current.allowed_to?(:manage_files, @project) %> +
    + +

    <%=l(:label_attachment_plural)%>

    + +<% delete_allowed = User.current.allowed_to?(:manage_files, @project) %> + +
    + + + <%= sort_header_tag('filename', :caption => l(:field_filename)) %> + <%= sort_header_tag('created_on', :caption => l(:label_date), :default_order => 'desc') %> + <%= sort_header_tag('size', :caption => l(:field_filesize), :default_order => 'desc') %> + <%= sort_header_tag('downloads', :caption => l(:label_downloads_abbr), :default_order => 'desc') %> + + + + + <% @containers.each do |container| %> + <% next if container.attachments.empty? -%> + <% if container.is_a?(Version) -%> + + + + <% end -%> + <% container.attachments.each do |file| %> + + + + + + + + + <% end %> + <% end %> + +
    <%= l(:field_digest) %>
    + <%= link_to(container, {:controller => 'versions', :action => 'show', :id => container}, :class => "icon icon-package") %> +
    <%= link_to_attachment file, :title => file.description -%><%= format_time(file.created_on) %><%= number_to_human_size(file.filesize) %><%= file.downloads %><%= file.digest_type %>: <%= file.digest %> + <%= link_to_attachment file, class: 'icon-only icon-download', title: l(:button_download), download: true %> + <%= link_to(l(:button_delete), attachment_path(file), :class => 'icon-only icon-del', + :data => {:confirm => l(:text_are_you_sure)}, :method => :delete) if delete_allowed %> +
    +
    + +<% html_title(l(:label_attachment_plural)) -%> diff --git a/app/views/files/new.html.erb b/app/views/files/new.html.erb new file mode 100644 index 0000000..ab38b44 --- /dev/null +++ b/app/views/files/new.html.erb @@ -0,0 +1,16 @@ +

    <%=l(:label_attachment_new)%>

    + +<%= error_messages_for 'attachment' %> +<%= form_tag(project_files_path(@project), :multipart => true, :class => "tabular") do %> +
    + +<% if @versions.any? %> +

    +<%= select_tag "version_id", content_tag('option', '') + + options_from_collection_for_select(@versions, "id", "name") %>

    +<% end %> + +

    <%= render :partial => 'attachments/form' %>

    +
    +<%= submit_tag l(:button_add) %> +<% end %> diff --git a/app/views/gantts/show.html.erb b/app/views/gantts/show.html.erb new file mode 100644 index 0000000..314c2f2 --- /dev/null +++ b/app/views/gantts/show.html.erb @@ -0,0 +1,372 @@ +<% @gantt.view = self %> +
    +<% if !@query.new_record? && @query.editable_by?(User.current) %> + <%= link_to l(:button_edit), edit_query_path(@query, :gantt => 1), :class => 'icon icon-edit' %> + <%= delete_link query_path(@query, :gantt => 1) %> +<% end %> +
    + +

    <%= @query.new_record? ? l(:label_gantt) : @query.name %>

    + +<%= form_tag({:controller => 'gantts', :action => 'show', + :project_id => @project, :month => params[:month], + :year => params[:year], :months => params[:months]}, + :method => :get, :id => 'query_form') do %> +<%= hidden_field_tag 'set_filter', '1' %> +<%= hidden_field_tag 'gantt', '1' %> +
    "> + <%= l(:label_filter_plural) %> +
    "> + <%= render :partial => 'queries/filters', :locals => {:query => @query} %> +
    +
    + + +

    + <%= gantt_zoom_link(@gantt, :in) %> + <%= gantt_zoom_link(@gantt, :out) %> +

    + +

    +<%= text_field_tag 'months', @gantt.months, :size => 2 %> +<%= l(:label_months_from) %> +<%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %> +<%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %> +<%= hidden_field_tag 'zoom', @gantt.zoom %> + +<%= link_to_function l(:button_apply), '$("#query_form").submit()', + :class => 'icon icon-checked' %> +<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, + :class => 'icon icon-reload' %> +<% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> + <%= link_to_function l(:button_save), + "$('#query_form').attr('action', '#{ @project ? new_project_query_path(@project) : new_query_path }').submit();", + :class => 'icon icon-save' %> +<% end %> +

    +<% end %> + +<%= error_messages_for 'query' %> +<% if @query.valid? %> +<% + zoom = 1 + @gantt.zoom.times { zoom = zoom * 2 } + + subject_width = 330 + header_height = 18 + + headers_height = header_height + show_weeks = false + show_days = false + show_day_num = false + + if @gantt.zoom > 1 + show_weeks = true + headers_height = 2 * header_height + if @gantt.zoom > 2 + show_days = true + headers_height = 3 * header_height + if @gantt.zoom > 3 + show_day_num = true + headers_height = 4 * header_height + end + end + end + + # Width of the entire chart + g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i + @gantt.render(:top => headers_height + 8, + :zoom => zoom, + :g_width => g_width, + :subject_width => subject_width) + g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max + t_height = g_height + headers_height +%> + +<% if @gantt.truncated %> +

    <%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

    +<% end %> + + + + + + + +
    + <% + style = "" + style += "position:relative;" + style += "height: #{t_height + 24}px;" + style += "width: #{subject_width + 1}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_subjects_container") do %> + <% + style = "" + style += "right:-2px;" + style += "width: #{subject_width}px;" + style += "height: #{headers_height}px;" + style += 'background: #eee;' + %> + <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> + <% + style = "" + style += "right:-2px;" + style += "width: #{subject_width}px;" + style += "height: #{t_height}px;" + style += 'border-left: 1px solid #c0c0c0;' + style += 'overflow: hidden;' + %> + <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> + <%= content_tag(:div, :class => "gantt_subjects") do %> + <%= @gantt.subjects.html_safe %> + <% end %> + <% end %> + +
    +<% + style = "" + style += "width: #{g_width - 1}px;" + style += "height: #{headers_height}px;" + style += 'background: #eee;' +%> +<%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> + +<% ###### Months headers ###### %> +<% + month_f = @gantt.date_from + left = 0 + height = (show_weeks ? header_height : header_height + g_height) +%> +<% @gantt.months.times do %> + <% + width = (((month_f >> 1) - month_f) * zoom - 1).to_i + style = "" + style += "left: #{left}px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> + <%= link_to "#{month_f.year}-#{month_f.month}", + @gantt.params.merge(:year => month_f.year, :month => month_f.month), + :title => "#{month_name(month_f.month)} #{month_f.year}" %> + <% end %> + <% + left = left + width + 1 + month_f = month_f >> 1 + %> +<% end %> + +<% ###### Weeks headers ###### %> +<% if show_weeks %> + <% + left = 0 + height = (show_days ? header_height - 1 : header_height - 1 + g_height) + %> + <% if @gantt.date_from.cwday == 1 %> + <% + # @date_from is monday + week_f = @gantt.date_from + %> + <% else %> + <% + # find next monday after @date_from + week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1) + width = (7 - @gantt.date_from.cwday + 1) * zoom - 1 + style = "" + style += "left: #{left}px;" + style += "top: 19px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, ' '.html_safe, + :style => style, :class => "gantt_hdr") %> + <% left = left + width + 1 %> + <% end %> + <% while week_f <= @gantt.date_to %> + <% + width = ((week_f + 6 <= @gantt.date_to) ? + 7 * zoom - 1 : + (@gantt.date_to - week_f + 1) * zoom - 1).to_i + style = "" + style += "left: #{left}px;" + style += "top: 19px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> + <%= content_tag(:small) do %> + <%= week_f.cweek if width >= 16 %> + <% end %> + <% end %> + <% + left = left + width + 1 + week_f = week_f + 7 + %> + <% end %> +<% end %> + +<% ###### Day numbers headers ###### %> +<% if show_day_num %> + <% + left = 0 + height = g_height + header_height*2 - 1 + wday = @gantt.date_from.cwday + day_num = @gantt.date_from + %> + <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> + <% + width = zoom - 1 + style = "" + style += "left:#{left}px;" + style += "top:37px;" + style += "width:#{width}px;" + style += "height:#{height}px;" + style += "font-size:0.7em;" + clss = "gantt_hdr" + clss << " nwday" if @gantt.non_working_week_days.include?(wday) + %> + <%= content_tag(:div, :style => style, :class => clss) do %> + <%= day_num.day %> + <% end %> + <% + left = left + width+1 + day_num = day_num + 1 + wday = wday + 1 + wday = 1 if wday > 7 + %> + <% end %> +<% end %> + +<% ###### Days headers ####### %> +<% if show_days %> + <% + left = 0 + height = g_height + header_height - 1 + top = (show_day_num ? 55 : 37) + wday = @gantt.date_from.cwday + %> + <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> + <% + width = zoom - 1 + style = "" + style += "left: #{left}px;" + style += "top: #{top}px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + style += "font-size:0.7em;" + clss = "gantt_hdr" + clss << " nwday" if @gantt.non_working_week_days.include?(wday) + %> + <%= content_tag(:div, :style => style, :class => clss) do %> + <%= day_letter(wday) %> + <% end %> + <% + left = left + width + 1 + wday = wday + 1 + wday = 1 if wday > 7 + %> + <% end %> +<% end %> + +<%= @gantt.lines.html_safe %> + +<% ###### Today red line (excluded from cache) ###### %> +<% if User.current.today >= @gantt.date_from and User.current.today <= @gantt.date_to %> + <% + today_left = (((User.current.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i + style = "" + style += "position: absolute;" + style += "height: #{g_height}px;" + style += "top: #{headers_height + 1}px;" + style += "left: #{today_left}px;" + style += "width:10px;" + style += "border-left: 1px dashed red;" + %> + <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %> +<% end %> +<% + style = "" + style += "position: absolute;" + style += "height: #{g_height}px;" + style += "top: #{headers_height + 1}px;" + style += "left: 0px;" + style += "width: #{g_width - 1}px;" +%> +<%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %> +
    +
    + + + + + + +
    + <%= link_to("\xc2\xab " + l(:label_previous), + {:params => request.query_parameters.merge(@gantt.params_previous)}, + :accesskey => accesskey(:previous)) %> + + <%= link_to(l(:label_next) + " \xc2\xbb", + {:params => request.query_parameters.merge(@gantt.params_next)}, + :accesskey => accesskey(:next)) %> +
    + +<% other_formats_links do |f| %> + <%= f.link_to_with_query_parameters 'PDF', @gantt.params %> + <%= f.link_to_with_query_parameters('PNG', @gantt.params) if @gantt.respond_to?('to_image') %> +<% end %> +<% end # query.valid? %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<% html_title(l(:label_gantt)) -%> + +<% content_for :header_tags do %> + <%= javascript_include_tag 'raphael' %> + <%= javascript_include_tag 'gantt' %> +<% end %> + +<%= javascript_tag do %> + var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>; + $(document).ready(drawGanttHandler); + $(window).resize(drawGanttHandler); + $(function() { + $("#draw_relations").change(drawGanttHandler); + $("#draw_progress_line").change(drawGanttHandler); + }); +<% end %> diff --git a/app/views/groups/_form.html.erb b/app/views/groups/_form.html.erb new file mode 100644 index 0000000..9d5b087 --- /dev/null +++ b/app/views/groups/_form.html.erb @@ -0,0 +1,10 @@ +<%= error_messages_for @group %> + +
    +

    <%= f.text_field :name, :required => true, :size => 60, + :disabled => !@group.safe_attribute?('name') %>

    + + <% @group.custom_field_values.each do |value| %> +

    <%= custom_field_tag_with_label :group, value %>

    + <% end %> +
    diff --git a/app/views/groups/_general.html.erb b/app/views/groups/_general.html.erb new file mode 100644 index 0000000..9cc5be6 --- /dev/null +++ b/app/views/groups/_general.html.erb @@ -0,0 +1,4 @@ +<%= labelled_form_for @group, :url => group_path(@group), :html => {:multipart => true} do |f| %> +<%= render :partial => 'form', :locals => { :f => f } %> +<%= submit_tag l(:button_save) %> +<% end %> diff --git a/app/views/groups/_memberships.html.erb b/app/views/groups/_memberships.html.erb new file mode 100644 index 0000000..1242bf6 --- /dev/null +++ b/app/views/groups/_memberships.html.erb @@ -0,0 +1 @@ +<%= render_principal_memberships @group %> diff --git a/app/views/groups/_new_users_form.html.erb b/app/views/groups/_new_users_form.html.erb new file mode 100644 index 0000000..5c33a96 --- /dev/null +++ b/app/views/groups/_new_users_form.html.erb @@ -0,0 +1,9 @@ +
    + <%= label_tag "user_search", l(:label_user_search) %> +

    <%= text_field_tag 'user_search', nil %>

    + <%= javascript_tag "observeSearchfield('user_search', null, '#{ escape_javascript autocomplete_for_user_group_path(@group) }')" %> + +
    + <%= render_principals_for_new_group_users(@group) %> +
    +
    diff --git a/app/views/groups/_new_users_modal.html.erb b/app/views/groups/_new_users_modal.html.erb new file mode 100644 index 0000000..eb2e985 --- /dev/null +++ b/app/views/groups/_new_users_modal.html.erb @@ -0,0 +1,9 @@ +

    <%= l(:label_user_new) %>

    + +<%= form_for(@group, :url => group_users_path(@group), :remote => true, :method => :post) do |f| %> + <%= render :partial => 'new_users_form' %> +

    + <%= submit_tag l(:button_add) %> + <%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> +

    +<% end %> diff --git a/app/views/groups/_users.html.erb b/app/views/groups/_users.html.erb new file mode 100644 index 0000000..8c2ab7e --- /dev/null +++ b/app/views/groups/_users.html.erb @@ -0,0 +1,22 @@ +

    <%= link_to l(:label_user_new), new_group_users_path(@group), :remote => true, :class => "icon icon-add" %>

    + +<% if @group.users.any? %> + + + + + + + <% @group.users.sort.each do |user| %> + + + + + <% end %> + +
    <%= l(:label_user) %>
    <%= link_to_user user %> + <%= delete_link group_user_path(@group, :user_id => user), :remote => true %> +
    +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> diff --git a/app/views/groups/add_users.js.erb b/app/views/groups/add_users.js.erb new file mode 100644 index 0000000..e4af93a --- /dev/null +++ b/app/views/groups/add_users.js.erb @@ -0,0 +1,5 @@ +hideModal(); +$('#tab-content-users').html('<%= escape_javascript(render :partial => 'groups/users') %>'); +<% @users.each do |user| %> + $('#user-<%= user.id %>').effect("highlight"); +<% end %> diff --git a/app/views/groups/autocomplete_for_user.js.erb b/app/views/groups/autocomplete_for_user.js.erb new file mode 100644 index 0000000..9bb569e --- /dev/null +++ b/app/views/groups/autocomplete_for_user.js.erb @@ -0,0 +1 @@ +$('#users').html('<%= escape_javascript(render_principals_for_new_group_users(@group)) %>'); diff --git a/app/views/groups/destroy_membership.js.erb b/app/views/groups/destroy_membership.js.erb new file mode 100644 index 0000000..30ab3b0 --- /dev/null +++ b/app/views/groups/destroy_membership.js.erb @@ -0,0 +1 @@ +$('#tab-content-memberships').html('<%= escape_javascript(render :partial => 'groups/memberships') %>'); diff --git a/app/views/groups/edit.html.erb b/app/views/groups/edit.html.erb new file mode 100644 index 0000000..b2f37bd --- /dev/null +++ b/app/views/groups/edit.html.erb @@ -0,0 +1,3 @@ +<%= title [l(:label_group_plural), groups_path], @group.name %> + +<%= render_tabs group_settings_tabs(@group) %> diff --git a/app/views/groups/edit_membership.js.erb b/app/views/groups/edit_membership.js.erb new file mode 100644 index 0000000..679c998 --- /dev/null +++ b/app/views/groups/edit_membership.js.erb @@ -0,0 +1,6 @@ +<% if @membership.valid? %> + $('#tab-content-memberships').html('<%= escape_javascript(render :partial => 'groups/memberships') %>'); + $('#member-<%= @membership.id %>').effect("highlight"); +<% else %> + alert('<%= raw(escape_javascript(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))) %>'); +<% end %> diff --git a/app/views/groups/index.api.rsb b/app/views/groups/index.api.rsb new file mode 100644 index 0000000..8ebad1b --- /dev/null +++ b/app/views/groups/index.api.rsb @@ -0,0 +1,11 @@ +api.array :groups do + @groups.each do |group| + api.group do + api.id group.id + api.name group.lastname + api.builtin group.builtin_type if group.builtin_type + + render_api_custom_values group.visible_custom_field_values, api + end + end +end diff --git a/app/views/groups/index.html.erb b/app/views/groups/index.html.erb new file mode 100644 index 0000000..7b77fec --- /dev/null +++ b/app/views/groups/index.html.erb @@ -0,0 +1,39 @@ +
    +<%= link_to l(:label_group_new), new_group_path, :class => 'icon icon-add' %> +
    + +<%= title l(:label_group_plural) %> + +<%= form_tag(groups_path, :method => :get) do %> +
    <%= l(:label_filter_plural) %> + + <%= text_field_tag 'name', params[:name], :size => 30 %> + <%= submit_tag l(:button_apply), :class => "small", :name => nil %> + <%= link_to l(:button_clear), groups_path, :class => 'icon icon-reload' %> +
    +<% end %> +  + +<% if @groups.any? %> +
    + + + + + + + +<% @groups.each do |group| %> + "> + + + + +<% end %> + +
    <%=l(:label_group)%><%=l(:label_user_plural)%>
    <%= link_to group, edit_group_path(group) %><%= (@user_count_by_group_id[group.id] || 0) unless group.builtin? %><%= delete_link group unless group.builtin? %>
    +
    +<%= pagination_links_full @group_pages, @group_count %> +<% else %> +

    <%= l(:label_no_data) %>

    +<% end %> diff --git a/app/views/groups/new.html.erb b/app/views/groups/new.html.erb new file mode 100644 index 0000000..c643161 --- /dev/null +++ b/app/views/groups/new.html.erb @@ -0,0 +1,9 @@ +<%= title [l(:label_group_plural), groups_path], l(:label_group_new) %> + +<%= labelled_form_for @group, :html => {:multipart => true} do |f| %> +<%= render :partial => 'form', :locals => { :f => f } %> +

    + <%= f.submit l(:button_create) %> + <%= f.submit l(:button_create_and_continue), :name => 'continue' %> +

    +<% end %> diff --git a/app/views/groups/new_users.html.erb b/app/views/groups/new_users.html.erb new file mode 100644 index 0000000..8875a83 --- /dev/null +++ b/app/views/groups/new_users.html.erb @@ -0,0 +1,6 @@ +

    <%= l(:label_user_new) %>

    + +<%= form_for(@group, :url => group_users_path(@group), :method => :post) do |f| %> + <%= render :partial => 'new_users_form' %> +

    <%= submit_tag l(:button_add) %>

    +<% end %> diff --git a/app/views/groups/new_users.js.erb b/app/views/groups/new_users.js.erb new file mode 100644 index 0000000..1775abe --- /dev/null +++ b/app/views/groups/new_users.js.erb @@ -0,0 +1,2 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'groups/new_users_modal') %>'); +showModal('ajax-modal', '700px'); diff --git a/app/views/groups/remove_user.js.erb b/app/views/groups/remove_user.js.erb new file mode 100644 index 0000000..88daa8f --- /dev/null +++ b/app/views/groups/remove_user.js.erb @@ -0,0 +1 @@ +$('#tab-content-users').html('<%= escape_javascript(render :partial => 'groups/users') %>'); diff --git a/app/views/groups/show.api.rsb b/app/views/groups/show.api.rsb new file mode 100644 index 0000000..db9dadb --- /dev/null +++ b/app/views/groups/show.api.rsb @@ -0,0 +1,31 @@ +api.group do + api.id @group.id + api.name @group.lastname + api.builtin @group.builtin_type if @group.builtin_type + + render_api_custom_values @group.visible_custom_field_values, api + + api.array :users do + @group.users.each do |user| + api.user :id => user.id, :name => user.name + end + end if include_in_api_response?('users') && !@group.builtin? + + api.array :memberships do + @group.memberships.preload(:roles, :project).each do |membership| + api.membership do + api.id membership.id + api.project :id => membership.project.id, :name => membership.project.name + api.array :roles do + membership.member_roles.each do |member_role| + if member_role.role + attrs = {:id => member_role.role.id, :name => member_role.role.name} + attrs.merge!(:inherited => true) if member_role.inherited_from.present? + api.role attrs + end + end + end + end if membership.project + end + end if include_in_api_response?('memberships') +end diff --git a/app/views/groups/show.html.erb b/app/views/groups/show.html.erb new file mode 100644 index 0000000..b10427b --- /dev/null +++ b/app/views/groups/show.html.erb @@ -0,0 +1,7 @@ +<%= title [l(:label_group_plural), groups_path], @group.name %> + +
      +<% @group.users.each do |user| %> +
    • <%= user %>
    • +<% end %> +
    diff --git a/app/views/imports/_fields_mapping.html.erb b/app/views/imports/_fields_mapping.html.erb new file mode 100644 index 0000000..0e1d455 --- /dev/null +++ b/app/views/imports/_fields_mapping.html.erb @@ -0,0 +1,90 @@ +

    + + <%= select_tag 'import_settings[mapping][project_id]', + options_for_select(project_tree_options_for_select(@import.allowed_target_projects, :selected => @import.project)), + :id => 'import_mapping_project_id' %> +

    +

    + + <%= mapping_select_tag @import, 'tracker', :required => true, + :values => @import.allowed_target_trackers.sorted.map {|t| [t.name, t.id]} %> +

    +

    + + <%= mapping_select_tag @import, 'status' %> +

    + +
    +
    +

    + + <%= mapping_select_tag @import, 'subject', :required => true %> +

    +

    + + <%= mapping_select_tag @import, 'description' %> +

    +

    + + <%= mapping_select_tag @import, 'priority' %> +

    +

    + + <%= mapping_select_tag @import, 'category' %> + <% if User.current.allowed_to?(:manage_categories, @import.project) %> + + <% end %> +

    +

    + + <%= mapping_select_tag @import, 'assigned_to' %> +

    +

    + + <%= mapping_select_tag @import, 'fixed_version' %> + <% if User.current.allowed_to?(:manage_versions, @import.project) %> + + <% end %> +

    +<% @custom_fields.each do |field| %> +

    + + <%= mapping_select_tag @import, "cf_#{field.id}" %> +

    +<% end %> +
    + +
    +

    + + <%= mapping_select_tag @import, 'is_private' %> +

    +

    + + <%= mapping_select_tag @import, 'parent_issue_id' %> +

    +

    + + <%= mapping_select_tag @import, 'start_date' %> +

    +

    + + <%= mapping_select_tag @import, 'due_date' %> +

    +

    + + <%= mapping_select_tag @import, 'estimated_hours' %> +

    +

    + + <%= mapping_select_tag @import, 'done_ratio' %> +

    +
    +
    + diff --git a/app/views/imports/mapping.html.erb b/app/views/imports/mapping.html.erb new file mode 100644 index 0000000..2e225d6 --- /dev/null +++ b/app/views/imports/mapping.html.erb @@ -0,0 +1,52 @@ +

    <%= l(:label_import_issues) %>

    + +<%= form_tag(import_mapping_path(@import), :id => "import-form") do %> +
    + <%= l(:label_fields_mapping) %> +
    + <%= render :partial => 'fields_mapping' %> +
    +
    + +
    +
    + <%= l(:label_file_content_preview) %> + + + <% @import.first_rows.each do |row| %> + + <%= row.map {|c| content_tag 'td', truncate(c.to_s, :length => 50) }.join("").html_safe %> + + <% end %> +
    +
    +
    + +

    + <%= button_tag("\xc2\xab " + l(:label_previous), :name => 'previous') %> + <%= submit_tag l(:button_import) %> +

    +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + + +<%= javascript_tag do %> +$(document).ready(function() { + $('#fields-mapping').on('change', '#import_mapping_project_id, #import_mapping_tracker', function(){ + $.ajax({ + url: '<%= import_mapping_path(@import, :format => 'js') %>', + type: 'post', + data: $('#import-form').serialize() + }); + }); + + $('#import-form').submit(function(){ + $('#import-details').show().addClass('ajax-loading'); + $('#import-progress').progressbar({value: 0, max: <%= @import.total_items || 0 %>}); + }); + +}); +<% end %> diff --git a/app/views/imports/mapping.js.erb b/app/views/imports/mapping.js.erb new file mode 100644 index 0000000..8fdf14a --- /dev/null +++ b/app/views/imports/mapping.js.erb @@ -0,0 +1 @@ +$('#fields-mapping').html('<%= escape_javascript(render :partial => 'fields_mapping') %>'); diff --git a/app/views/imports/new.html.erb b/app/views/imports/new.html.erb new file mode 100644 index 0000000..e20be35 --- /dev/null +++ b/app/views/imports/new.html.erb @@ -0,0 +1,15 @@ +

    <%= l(:label_import_issues) %>

    + +<%= form_tag(imports_path, :multipart => true) do %> +
    + <%= l(:label_select_file_to_import) %> (CSV) +

    + <%= file_field_tag 'file' %> +

    +
    +

    <%= submit_tag l(:label_next).html_safe + " »".html_safe, :name => nil %>

    +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> diff --git a/app/views/imports/run.html.erb b/app/views/imports/run.html.erb new file mode 100644 index 0000000..2a72353 --- /dev/null +++ b/app/views/imports/run.html.erb @@ -0,0 +1,20 @@ +

    <%= l(:label_import_issues) %>

    + +
    +
    0 / <%= @import.total_items.to_i %>
    +
    + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<%= javascript_tag do %> +$(document).ready(function() { + $('#import-details').addClass('ajax-loading'); + $('#import-progress').progressbar({value: 0, max: <%= @import.total_items.to_i %>}); + $.ajax({ + url: '<%= import_run_path(@import, :format => 'js') %>', + type: 'post' + }); +}); +<% end %> diff --git a/app/views/imports/run.js.erb b/app/views/imports/run.js.erb new file mode 100644 index 0000000..232904d --- /dev/null +++ b/app/views/imports/run.js.erb @@ -0,0 +1,11 @@ +$('#import-progress').progressbar({value: <%= @current.to_i %>}); +$('#progress-label').text("<%= @current.to_i %> / <%= @import.total_items.to_i %>"); + +<% if @import.finished? %> +window.location.href='<%= import_path(@import) %>'; +<% else %> +$.ajax({ + url: '<%= import_run_path(@import, :format => 'js') %>', + type: 'post' +}); +<% end %> diff --git a/app/views/imports/settings.html.erb b/app/views/imports/settings.html.erb new file mode 100644 index 0000000..374dba5 --- /dev/null +++ b/app/views/imports/settings.html.erb @@ -0,0 +1,30 @@ +

    <%= l(:label_import_issues) %>

    + +<%= form_tag(import_settings_path(@import), :id => "import-form") do %> +
    + <%= l(:label_options) %> +

    + + <%= select_tag 'import_settings[separator]', + options_for_select([[l(:label_comma_char), ','], [l(:label_semi_colon_char), ';']], @import.settings['separator']) %> +

    +

    + + <%= select_tag 'import_settings[wrapper]', + options_for_select([[l(:label_quote_char), "'"], [l(:label_double_quote_char), '"']], @import.settings['wrapper']) %> +

    +

    + + <%= select_tag 'import_settings[encoding]', options_for_select(Setting::ENCODINGS, @import.settings['encoding']) %> +

    +

    + + <%= select_tag 'import_settings[date_format]', options_for_select(date_format_options, @import.settings['date_format']) %> +

    +
    +

    <%= submit_tag l(:label_next).html_safe + " »".html_safe, :name => nil %>

    +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> diff --git a/app/views/imports/show.html.erb b/app/views/imports/show.html.erb new file mode 100644 index 0000000..19c874c --- /dev/null +++ b/app/views/imports/show.html.erb @@ -0,0 +1,38 @@ +

    <%= l(:label_import_issues) %>

    + +<% if @import.saved_items.count > 0 %> +

    <%= l(:notice_import_finished, :count => @import.saved_items.count) %>:

    + +
      + <% @import.saved_objects.each do |issue| %> +
    • <%= link_to_issue issue %>
    • + <% end %> +
    + +

    <%= link_to l(:label_issue_view_all), issues_path(:set_filter => 1, :status_id => '*', :issue_id => @import.saved_objects.map(&:id).join(',')) %>

    +<% end %> + +<% if @import.unsaved_items.count > 0 %> +

    <%= l(:notice_import_finished_with_errors, :count => @import.unsaved_items.count, :total => @import.total_items) %>:

    + + + + + + + + + + <% @import.unsaved_items.each do |item| %> + + + + + <% end %> + +
    PositionMessage
    <%= item.position %><%= simple_format_without_paragraph item.message %>
    +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> diff --git a/app/views/issue_categories/_form.html.erb b/app/views/issue_categories/_form.html.erb new file mode 100644 index 0000000..8a55d9e --- /dev/null +++ b/app/views/issue_categories/_form.html.erb @@ -0,0 +1,6 @@ +<%= error_messages_for 'category' %> + +
    +

    <%= f.text_field :name, :size => 60, :required => true %>

    +

    <%= f.select :assigned_to_id, principals_options_for_select(@project.assignable_users, @category.assigned_to), :include_blank => true %>

    +
    diff --git a/app/views/issue_categories/_new_modal.html.erb b/app/views/issue_categories/_new_modal.html.erb new file mode 100644 index 0000000..07cc289 --- /dev/null +++ b/app/views/issue_categories/_new_modal.html.erb @@ -0,0 +1,9 @@ +

    <%=l(:label_issue_category_new)%>

    + +<%= labelled_form_for @category, :as => 'issue_category', :url => project_issue_categories_path(@project), :remote => true do |f| %> +<%= render :partial => 'issue_categories/form', :locals => { :f => f } %> +

    + <%= submit_tag l(:button_create), :name => nil %> + <%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> +

    +<% end %> diff --git a/app/views/issue_categories/create.js.erb b/app/views/issue_categories/create.js.erb new file mode 100644 index 0000000..c4253b9 --- /dev/null +++ b/app/views/issue_categories/create.js.erb @@ -0,0 +1,3 @@ +hideModal(); +<% select = content_tag('select', content_tag('option') + options_from_collection_for_select(@project.issue_categories, 'id', 'name', @category.id), :id => 'issue_category_id', :name => 'issue[category_id]') %> +$('#issue_category_id').replaceWith('<%= escape_javascript(select) %>'); diff --git a/app/views/issue_categories/destroy.html.erb b/app/views/issue_categories/destroy.html.erb new file mode 100644 index 0000000..5f13eed --- /dev/null +++ b/app/views/issue_categories/destroy.html.erb @@ -0,0 +1,16 @@ +

    <%=l(:label_issue_category)%>: <%=h @category.name %>

    + +<%= form_tag(issue_category_path(@category), :method => :delete) do %> +
    +

    <%= l(:text_issue_category_destroy_question, @issue_count) %>

    +


    +<% if @categories.size > 0 %> +: +<%= label_tag "reassign_to_id", l(:description_issue_category_reassign), :class => "hidden-for-sighted" %> +<%= select_tag 'reassign_to_id', options_from_collection_for_select(@categories, 'id', 'name') %>

    +<% end %> +
    + +<%= submit_tag l(:button_apply) %> +<%= link_to l(:button_cancel), :controller => 'projects', :action => 'settings', :id => @project, :tab => 'categories' %> +<% end %> diff --git a/app/views/issue_categories/edit.html.erb b/app/views/issue_categories/edit.html.erb new file mode 100644 index 0000000..c04aacb --- /dev/null +++ b/app/views/issue_categories/edit.html.erb @@ -0,0 +1,7 @@ +

    <%=l(:label_issue_category)%>

    + +<%= labelled_form_for @category, :as => :issue_category, + :url => issue_category_path(@category), :html => {:method => :put} do |f| %> +<%= render :partial => 'issue_categories/form', :locals => { :f => f } %> +<%= submit_tag l(:button_save) %> +<% end %> diff --git a/app/views/issue_categories/index.api.rsb b/app/views/issue_categories/index.api.rsb new file mode 100644 index 0000000..685d8a5 --- /dev/null +++ b/app/views/issue_categories/index.api.rsb @@ -0,0 +1,10 @@ +api.array :issue_categories, api_meta(:total_count => @categories.size) do + @categories.each do |category| + api.issue_category do + api.id category.id + api.project(:id => category.project_id, :name => category.project.name) unless category.project.nil? + api.name category.name + api.assigned_to(:id => category.assigned_to_id, :name => category.assigned_to.name) unless category.assigned_to.nil? + end + end +end diff --git a/app/views/issue_categories/new.html.erb b/app/views/issue_categories/new.html.erb new file mode 100644 index 0000000..b8ecf89 --- /dev/null +++ b/app/views/issue_categories/new.html.erb @@ -0,0 +1,7 @@ +

    <%=l(:label_issue_category_new)%>

    + +<%= labelled_form_for @category, :as => :issue_category, + :url => project_issue_categories_path(@project) do |f| %> +<%= render :partial => 'issue_categories/form', :locals => { :f => f } %> +<%= submit_tag l(:button_create) %> +<% end %> diff --git a/app/views/issue_categories/new.js.erb b/app/views/issue_categories/new.js.erb new file mode 100644 index 0000000..0d62349 --- /dev/null +++ b/app/views/issue_categories/new.js.erb @@ -0,0 +1,2 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'issue_categories/new_modal') %>'); +showModal('ajax-modal', '600px'); diff --git a/app/views/issue_categories/show.api.rsb b/app/views/issue_categories/show.api.rsb new file mode 100644 index 0000000..cefa7c8 --- /dev/null +++ b/app/views/issue_categories/show.api.rsb @@ -0,0 +1,6 @@ +api.issue_category do + api.id @category.id + api.project(:id => @category.project_id, :name => @category.project.name) unless @category.project.nil? + api.name @category.name + api.assigned_to(:id => @category.assigned_to_id, :name => @category.assigned_to.name) unless @category.assigned_to.nil? +end diff --git a/app/views/issue_relations/_form.html.erb b/app/views/issue_relations/_form.html.erb new file mode 100644 index 0000000..3a1018c --- /dev/null +++ b/app/views/issue_relations/_form.html.erb @@ -0,0 +1,14 @@ +<%= error_messages_for 'relation' %> + +

    <%= f.select :relation_type, collection_for_relation_type_select, {}, :onchange => "setPredecessorFieldsVisibility();" %> +<%= l(:label_issue) %> #<%= f.text_field :issue_to_id, :size => 10 %> + +<%= submit_tag l(:button_add) %> +<%= link_to_function l(:button_cancel), '$("#new-relation-form").hide();'%> +

    + +<%= javascript_tag "observeAutocompleteField('relation_issue_to_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project, :scope => (Setting.cross_project_issue_relations? ? 'all' : nil), :issue_id => @issue.id)}')" %> + +<%= javascript_tag "setPredecessorFieldsVisibility();" %> diff --git a/app/views/issue_relations/create.js.erb b/app/views/issue_relations/create.js.erb new file mode 100644 index 0000000..1572a91 --- /dev/null +++ b/app/views/issue_relations/create.js.erb @@ -0,0 +1,7 @@ +$('#relations').html('<%= escape_javascript(render :partial => 'issues/relations') %>'); +<% if @relation.errors.empty? %> + $('#relation_delay').val(''); + $('#relation_issue_to_id').val(''); +<% end %> +$('#new-relation-form').show(); +$('#relation_issue_to_id').focus(); diff --git a/app/views/issue_relations/destroy.js.erb b/app/views/issue_relations/destroy.js.erb new file mode 100644 index 0000000..f5f29d3 --- /dev/null +++ b/app/views/issue_relations/destroy.js.erb @@ -0,0 +1 @@ +$('#relation-<%= @relation.id %>').remove(); diff --git a/app/views/issue_relations/index.api.rsb b/app/views/issue_relations/index.api.rsb new file mode 100644 index 0000000..11ff309 --- /dev/null +++ b/app/views/issue_relations/index.api.rsb @@ -0,0 +1,11 @@ +api.array :relations do + @relations.each do |relation| + api.relation do + api.id relation.id + api.issue_id relation.issue_from_id + api.issue_to_id relation.issue_to_id + api.relation_type relation.relation_type + api.delay relation.delay + end + end +end diff --git a/app/views/issue_relations/show.api.rsb b/app/views/issue_relations/show.api.rsb new file mode 100644 index 0000000..bffad94 --- /dev/null +++ b/app/views/issue_relations/show.api.rsb @@ -0,0 +1,7 @@ +api.relation do + api.id @relation.id + api.issue_id @relation.issue_from_id + api.issue_to_id @relation.issue_to_id + api.relation_type @relation.relation_type + api.delay @relation.delay +end diff --git a/app/views/issue_statuses/_form.html.erb b/app/views/issue_statuses/_form.html.erb new file mode 100644 index 0000000..2c333a3 --- /dev/null +++ b/app/views/issue_statuses/_form.html.erb @@ -0,0 +1,11 @@ +<%= error_messages_for 'issue_status' %> + +
    +

    <%= f.text_field :name, :required => true %>

    +<% if Issue.use_status_for_done_ratio? %> +

    <%= f.select :default_done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :include_blank => true, :label => :field_done_ratio %>

    +<% end %> +

    <%= f.check_box :is_closed %>

    + +<%= call_hook(:view_issue_statuses_form, :issue_status => @issue_status) %> +
    diff --git a/app/views/issue_statuses/edit.html.erb b/app/views/issue_statuses/edit.html.erb new file mode 100644 index 0000000..425ab43 --- /dev/null +++ b/app/views/issue_statuses/edit.html.erb @@ -0,0 +1,6 @@ +<%= title [l(:label_issue_status_plural), issue_statuses_path], @issue_status.name %> + +<%= labelled_form_for @issue_status do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> + <%= submit_tag l(:button_save) %> +<% end %> diff --git a/app/views/issue_statuses/index.api.rsb b/app/views/issue_statuses/index.api.rsb new file mode 100644 index 0000000..4f3b732 --- /dev/null +++ b/app/views/issue_statuses/index.api.rsb @@ -0,0 +1,9 @@ +api.array :issue_statuses do + @issue_statuses.each do |status| + api.issue_status do + api.id status.id + api.name status.name + api.is_closed status.is_closed + end + end +end diff --git a/app/views/issue_statuses/index.html.erb b/app/views/issue_statuses/index.html.erb new file mode 100644 index 0000000..f5e6538 --- /dev/null +++ b/app/views/issue_statuses/index.html.erb @@ -0,0 +1,38 @@ +
    +<%= link_to l(:label_issue_status_new), new_issue_status_path, :class => 'icon icon-add' %> +<%= link_to(l(:label_update_issue_done_ratios), update_issue_done_ratio_issue_statuses_path, :class => 'icon icon-multiple', :method => 'post', :data => {:confirm => l(:text_are_you_sure)}) if Issue.use_status_for_done_ratio? %> +
    + +

    <%=l(:label_issue_status_plural)%>

    + + + + + <% if Issue.use_status_for_done_ratio? %> + + <% end %> + + + + +<% for status in @issue_statuses %> + + + <% if Issue.use_status_for_done_ratio? %> + + <% end %> + + + +<% end %> + +
    <%=l(:field_status)%><%=l(:field_done_ratio)%><%=l(:field_is_closed)%>
    <%= link_to status.name, edit_issue_status_path(status) %><%= status.default_done_ratio %><%= checked_image status.is_closed? %> + <%= reorder_handle(status) %> + <%= delete_link issue_status_path(status) %> +
    + +<% html_title(l(:label_issue_status_plural)) -%> + +<%= javascript_tag do %> + $(function() { $("table.issue_statuses tbody").positionedItems(); }); +<% end %> diff --git a/app/views/issue_statuses/new.html.erb b/app/views/issue_statuses/new.html.erb new file mode 100644 index 0000000..86f2131 --- /dev/null +++ b/app/views/issue_statuses/new.html.erb @@ -0,0 +1,6 @@ +<%= title [l(:label_issue_status_plural), issue_statuses_path], l(:label_issue_status_new) %> + +<%= labelled_form_for @issue_status do |f| %> + <%= render :partial => 'form', :locals => {:f => f} %> + <%= submit_tag l(:button_create) %> +<% end %> diff --git a/app/views/issues/_action_menu.html.erb b/app/views/issues/_action_menu.html.erb new file mode 100644 index 0000000..b535fae --- /dev/null +++ b/app/views/issues/_action_menu.html.erb @@ -0,0 +1,7 @@ +
    +<%= link_to l(:button_edit), edit_issue_path(@issue), :onclick => 'showAndScrollTo("update", "issue_notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit) if @issue.editable? %> +<%= link_to l(:button_log_time), new_issue_time_entry_path(@issue), :class => 'icon icon-time-add' if User.current.allowed_to?(:log_time, @project) %> +<%= watcher_link(@issue, User.current) %> +<%= link_to l(:button_copy), project_copy_issue_path(@project, @issue), :class => 'icon icon-copy' if User.current.allowed_to?(:copy_issues, @project) && Issue.allowed_target_projects.any? %> +<%= link_to l(:button_delete), issue_path(@issue), :data => {:confirm => issues_destroy_confirmation_message(@issue)}, :method => :delete, :class => 'icon icon-del' if @issue.deletable? %> +
    diff --git a/app/views/issues/_attributes.html.erb b/app/views/issues/_attributes.html.erb new file mode 100644 index 0000000..640a00e --- /dev/null +++ b/app/views/issues/_attributes.html.erb @@ -0,0 +1,83 @@ +<%= labelled_fields_for :issue, @issue do |f| %> + +
    +
    +<% if @issue.safe_attribute?('status_id') && @allowed_statuses.present? %> +

    <%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), {:required => true}, + :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %>

    +<%= hidden_field_tag 'was_default_status', @issue.status_id, :id => nil if @issue.status == @issue.default_status %> +<% else %> +

    <%= @issue.status %>

    +<% end %> + +<% if @issue.safe_attribute? 'priority_id' %> +

    <%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), {:required => true} %>

    +<% end %> + +<% if @issue.safe_attribute? 'assigned_to_id' %> +

    <%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true, :required => @issue.required_attribute?('assigned_to_id') %>

    +<% end %> + +<% if @issue.safe_attribute?('category_id') && @issue.project.issue_categories.any? %> +

    <%= f.select :category_id, (@issue.project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true, :required => @issue.required_attribute?('category_id') %> +<%= link_to(l(:label_issue_category_new), + new_project_issue_category_path(@issue.project), + :remote => true, + :method => 'get', + :title => l(:label_issue_category_new), + :tabindex => 200, + :class => 'icon-only icon-add' + ) if User.current.allowed_to?(:manage_categories, @issue.project) %>

    +<% end %> + +<% if @issue.safe_attribute?('fixed_version_id') && @issue.assignable_versions.any? %> +

    <%= f.select :fixed_version_id, version_options_for_select(@issue.assignable_versions, @issue.fixed_version), :include_blank => true, :required => @issue.required_attribute?('fixed_version_id') %> +<%= link_to(l(:label_version_new), + new_project_version_path(@issue.project), + :remote => true, + :method => 'get', + :title => l(:label_version_new), + :tabindex => 200, + :class => 'icon-only icon-add' + ) if User.current.allowed_to?(:manage_versions, @issue.project) %> +

    +<% end %> +
    + +
    +<% if @issue.safe_attribute? 'parent_issue_id' %> +

    <%= f.text_field :parent_issue_id, :size => 10, :required => @issue.required_attribute?('parent_issue_id') %>

    +<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path(:project_id => @issue.project, :scope => Setting.cross_project_subtasks, :status => @issue.closed? ? 'c' : 'o', :issue_id => @issue.id)}')" %> +<% end %> + +<% if @issue.safe_attribute? 'start_date' %> +

    + <%= f.date_field(:start_date, :size => 10, :required => @issue.required_attribute?('start_date')) %> + <%= calendar_for('issue_start_date') %> +

    +<% end %> + +<% if @issue.safe_attribute? 'due_date' %> +

    + <%= f.date_field(:due_date, :size => 10, :required => @issue.required_attribute?('due_date')) %> + <%= calendar_for('issue_due_date') %> +

    +<% end %> + +<% if @issue.safe_attribute? 'estimated_hours' %> +

    <%= f.hours_field :estimated_hours, :size => 3, :required => @issue.required_attribute?('estimated_hours') %> <%= l(:field_hours) %>

    +<% end %> + +<% if @issue.safe_attribute?('done_ratio') && Issue.use_field_for_done_ratio? %> +

    <%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :required => @issue.required_attribute?('done_ratio') %>

    +<% end %> +
    +
    + +<% if @issue.safe_attribute? 'custom_field_values' %> +<%= render :partial => 'issues/form_custom_fields' %> +<% end %> + +<% end %> + +<% include_calendar_headers_tags %> diff --git a/app/views/issues/_changesets.html.erb b/app/views/issues/_changesets.html.erb new file mode 100644 index 0000000..a407a90 --- /dev/null +++ b/app/views/issues/_changesets.html.erb @@ -0,0 +1,18 @@ +<% changesets.each do |changeset| %> +
    +

    <%= link_to_revision(changeset, changeset.repository, + :text => "#{l(:label_revision)} #{changeset.format_identifier}") %> + <% if changeset.filechanges.any? && User.current.allowed_to?(:browse_repository, changeset.project) %> + (<%= link_to(l(:label_diff), + :controller => 'repositories', + :action => 'diff', + :id => changeset.project, + :repository_id => changeset.repository.identifier_param, + :path => "", + :rev => changeset.identifier) %>) + <% end %> +
    + <%= authoring(changeset.committed_on, changeset.author) %>

    +
    <%= format_changeset_comments changeset %>
    +
    +<% end %> diff --git a/app/views/issues/_conflict.html.erb b/app/views/issues/_conflict.html.erb new file mode 100644 index 0000000..ea4c35d --- /dev/null +++ b/app/views/issues/_conflict.html.erb @@ -0,0 +1,30 @@ +
    + <%= l(:notice_issue_update_conflict) %> + <% if @conflict_journals.present? %> +
    + <% @conflict_journals.sort_by(&:id).each do |journal| %> +
    +

    <%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %>

    + <% if journal.details.any? %> +
      + <% details_to_strings(journal.details).each do |string| %> +
    • <%= string %>
    • + <% end %> +
    + <% end %> +
    + <%= textilizable(journal, :notes) unless journal.notes.blank? %> +
    +
    + <% end %> +
    + <% end %> +
    +

    +
    + <% if @issue.notes.present? %> +
    + <% end %> + +

    +

    <%= submit_tag l(:button_submit) %>

    diff --git a/app/views/issues/_edit.html.erb b/app/views/issues/_edit.html.erb new file mode 100644 index 0000000..fe2119a --- /dev/null +++ b/app/views/issues/_edit.html.erb @@ -0,0 +1,80 @@ +<%= labelled_form_for @issue, :html => {:id => 'issue-form', :multipart => true} do |f| %> + <%= error_messages_for 'issue', 'time_entry' %> + <%= render :partial => 'conflict' if @conflict %> +
    + <% if @issue.attributes_editable? %> +
    <%= l(:label_change_properties) %> +
    + <%= render :partial => 'form', :locals => {:f => f} %> +
    +
    + <% end %> + <% if User.current.allowed_to?(:log_time, @project) %> +
    <%= l(:button_log_time) %> + <%= labelled_fields_for :time_entry, @time_entry do |time_entry| %> +
    +
    +

    <%= time_entry.hours_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %>

    +
    +
    +

    <%= time_entry.select :activity_id, activity_collection_for_select_options %>

    +
    +
    +

    <%= time_entry.text_field :comments, :size => 60 %>

    + <% @time_entry.custom_field_values.each do |value| %> +

    <%= custom_field_tag_with_label :time_entry, value %>

    + <% end %> + <% end %> +
    + <% end %> + <% if @issue.notes_addable? %> +
    <%= l(:field_notes) %> + <%= f.text_area :notes, :cols => 60, :rows => 10, :class => 'wiki-edit', :no_label => true %> + <%= wikitoolbar_for 'issue_notes' %> + + <% if @issue.safe_attribute? 'private_notes' %> + <%= f.check_box :private_notes, :no_label => true %> + <% end %> + + <%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %> +
    + +
    <%= l(:label_attachment_plural) %> + <% if @issue.attachments.any? && @issue.safe_attribute?('deleted_attachment_ids') %> +
    <%= link_to l(:label_edit_attachments), '#', :onclick => "$('#existing-attachments').toggle(); return false;" %>
    +
    + <% @issue.attachments.each do |attachment| %> + + <%= text_field_tag '', attachment.filename, :class => "icon icon-attachment filename", :disabled => true %> + + + <% end %> +
    +
    + <% end %> + +
    + <%= render :partial => 'attachments/form', :locals => {:container => @issue} %> +
    +
    + <% end %> +
    + + <%= f.hidden_field :lock_version %> + <%= hidden_field_tag 'last_journal_id', params[:last_journal_id] || @issue.last_journal_id %> + <%= submit_tag l(:button_submit) %> + <%= preview_link preview_edit_issue_path(:project_id => @project, :id => @issue), 'issue-form' %> + | <%= link_to l(:button_cancel), issue_path(id: @issue.id), :onclick => params[:action] == 'show' ? "$('#update').hide(); return false;" : '' %> + + <%= hidden_field_tag 'prev_issue_id', @prev_issue_id if @prev_issue_id %> + <%= hidden_field_tag 'next_issue_id', @next_issue_id if @next_issue_id %> + <%= hidden_field_tag 'issue_position', @issue_position if @issue_position %> + <%= hidden_field_tag 'issue_count', @issue_count if @issue_count %> +<% end %> + +
    diff --git a/app/views/issues/_form.html.erb b/app/views/issues/_form.html.erb new file mode 100644 index 0000000..ab19fee --- /dev/null +++ b/app/views/issues/_form.html.erb @@ -0,0 +1,57 @@ +<%= labelled_fields_for :issue, @issue do |f| %> +<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %> +<%= hidden_field_tag 'form_update_triggered_by', '' %> +<%= hidden_field_tag 'back_url', params[:back_url], :id => nil if params[:back_url].present? %> + +<% if @issue.safe_attribute? 'is_private' %> +

    + <%= f.check_box :is_private, :no_label => true %> +

    +<% end %> + +<% if (@issue.safe_attribute?('project_id') || @issue.project_id_changed?) && (!@issue.new_record? || @project.nil? || @issue.copy?) %> +

    <%= f.select :project_id, project_tree_options_for_select(@issue.allowed_target_projects, :selected => @issue.project), {:required => true}, + :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %>

    +<% end %> + +<% if @issue.safe_attribute?('tracker_id') || (@issue.persisted? && @issue.tracker_id_changed?) %> +

    <%= f.select :tracker_id, trackers_options_for_select(@issue), {:required => true}, + :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %>

    +<% end %> + +<% if @issue.safe_attribute? 'subject' %> +

    <%= f.text_field :subject, :size => 80, :maxlength => 255, :required => true %>

    +<% end %> + +<% if @issue.safe_attribute? 'description' %> +

    + <%= f.label_for_field :description, :required => @issue.required_attribute?('description') %> + <%= link_to_function content_tag(:span, l(:button_edit), :class => 'icon icon-edit'), '$(this).hide(); $("#issue_description_and_toolbar").show()' unless @issue.new_record? %> + <%= content_tag 'span', :id => "issue_description_and_toolbar", :style => (@issue.new_record? ? nil : 'display:none') do %> + <%= f.text_area :description, + :cols => 60, + :rows => [[10, @issue.description.to_s.length / 50].max, 20].min, + :accesskey => accesskey(:edit), + :class => 'wiki-edit', + :no_label => true %> + <% end %> +

    +<%= wikitoolbar_for 'issue_description' %> +<% end %> + +
    + <%= render :partial => 'issues/attributes' %> +
    + +<%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %> +<% end %> + +<% heads_for_wiki_formatter %> + +<%= javascript_tag do %> +$(document).ready(function(){ + $("#issue_tracker_id, #issue_status_id").each(function(){ + $(this).val($(this).find("option[selected=selected]").val()); + }); +}); +<% end %> diff --git a/app/views/issues/_form_custom_fields.html.erb b/app/views/issues/_form_custom_fields.html.erb new file mode 100644 index 0000000..13bedd5 --- /dev/null +++ b/app/views/issues/_form_custom_fields.html.erb @@ -0,0 +1,23 @@ +<% custom_field_values = @issue.editable_custom_field_values %> +<% custom_field_values_full_width = custom_field_values.select { |value| value.custom_field.full_width_layout? } %> +<% custom_field_values -= custom_field_values_full_width %> + +<% if custom_field_values.present? %> +
    +
    +<% i = 0 %> +<% split_on = (custom_field_values.size / 2.0).ceil - 1 %> +<% custom_field_values.each do |value| %> +

    <%= custom_field_tag_with_label :issue, value, :required => @issue.required_attribute?(value.custom_field_id) %>

    +<% if i == split_on -%> +
    +<% end -%> +<% i += 1 -%> +<% end -%> +
    +
    +<% end %> + +<% custom_field_values_full_width.each do |value| %> +

    <%= custom_field_tag_with_label :issue, value, :required => @issue.required_attribute?(value.custom_field_id) %>

    +<% end %> diff --git a/app/views/issues/_history.html.erb b/app/views/issues/_history.html.erb new file mode 100644 index 0000000..31df3b8 --- /dev/null +++ b/app/views/issues/_history.html.erb @@ -0,0 +1,30 @@ +<% reply_links = issue.notes_addable? -%> +<% for journal in journals %> +
    +
    +

    #<%= journal.indice %> + <%= avatar(journal.user, :size => "24") %> + <%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %> + <%= render_private_notes_indicator(journal) %>

    + + <% if journal.details.any? %> +
      + <% details_to_strings(journal.visible_details).each do |string| %> +
    • <%= string %>
    • + <% end %> +
    + <% if Setting.thumbnails_enabled? && (thumbnail_attachments = journal_thumbnail_attachments(journal)).any? %> +
    + <% thumbnail_attachments.each do |attachment| %> +
    <%= thumbnail_tag(attachment) %>
    + <% end %> +
    + <% end %> + <% end %> + <%= render_notes(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %> +
    +
    + <%= call_hook(:view_issues_history_journal_bottom, { :journal => journal }) %> +<% end %> + +<% heads_for_wiki_formatter if User.current.allowed_to?(:edit_issue_notes, issue.project) || User.current.allowed_to?(:edit_own_issue_notes, issue.project) %> diff --git a/app/views/issues/_list.html.erb b/app/views/issues/_list.html.erb new file mode 100644 index 0000000..8024a69 --- /dev/null +++ b/app/views/issues/_list.html.erb @@ -0,0 +1,54 @@ +<% query_options = nil unless defined?(query_options) %> +<% query_options ||= {} %> + +<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do -%> +<%= hidden_field_tag 'back_url', url_for(:params => request.query_parameters), :id => nil %> +
    + + + + + <% query.inline_columns.each do |column| %> + <%= column_header(query, column, query_options) %> + <% end %> + + + + <% grouped_issue_list(issues, query) do |issue, level, group_name, group_count, group_totals| -%> + <% if group_name %> + <% reset_cycle %> + + + + <% end %> + "> + + <% query.inline_columns.each do |column| %> + <%= content_tag('td', column_content(column, issue), :class => column.css_classes) %> + <% end %> + + <% query.block_columns.each do |column| + if (text = column_content(column, issue)) && text.present? -%> + + + + <% end -%> + <% end -%> + <% end -%> + +
    + <%= check_box_tag 'check_all', '', false, :class => 'toggle-selection', + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %> +
    +   + <%= group_name %> <%= group_count %> <%= group_totals %> + <%= link_to_function("#{l(:button_collapse_all)}/#{l(:button_expand_all)}", + "toggleAllRowGroups(this)", :class => 'toggle-all') %> +
    <%= check_box_tag("ids[]", issue.id, false, :id => nil) %>
    + <% if query.block_columns.count > 1 %> + <%= column.caption %> + <% end %> + <%= text %> +
    +
    +<% end -%> diff --git a/app/views/issues/_relations.html.erb b/app/views/issues/_relations.html.erb new file mode 100644 index 0000000..3825fe6 --- /dev/null +++ b/app/views/issues/_relations.html.erb @@ -0,0 +1,22 @@ +
    +<% if User.current.allowed_to?(:manage_issue_relations, @project) %> + <%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %> +<% end %> +
    + +

    <%=l(:label_related_issues)%>

    + +<% if @relations.present? %> +<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do %> + <%= render_issue_relations(@issue, @relations) %> +<% end %> +<% end %> + +<%= form_for @relation, { + :as => :relation, :remote => true, + :url => issue_relations_path(@issue), + :method => :post, + :html => {:id => 'new-relation-form', :style => 'display: none;'} + } do |f| %> +<%= render :partial => 'issue_relations/form', :locals => {:f => f}%> +<% end %> diff --git a/app/views/issues/_sidebar.html.erb b/app/views/issues/_sidebar.html.erb new file mode 100644 index 0000000..38d682b --- /dev/null +++ b/app/views/issues/_sidebar.html.erb @@ -0,0 +1,18 @@ +

    <%= l(:label_issue_plural) %>

    + +
      +
    • <%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1) %>
    • +<% if @project %> +
    • <%= link_to l(:field_summary), project_issues_report_path(@project) %>
    • +<% end %> + +<% if User.current.allowed_to?(:import_issues, @project, :global => true) %> +
    • <%= link_to l(:button_import), new_issues_import_path %>
    • +<% end %> +
    + +<%= call_hook(:view_issues_sidebar_issues_bottom) %> +<%= call_hook(:view_issues_sidebar_planning_bottom) %> + +<%= render_sidebar_queries(IssueQuery, @project) %> +<%= call_hook(:view_issues_sidebar_queries_bottom) %> diff --git a/app/views/issues/_watchers_form.html.erb b/app/views/issues/_watchers_form.html.erb new file mode 100644 index 0000000..b55e602 --- /dev/null +++ b/app/views/issues/_watchers_form.html.erb @@ -0,0 +1,15 @@ +<% if @issue.safe_attribute? 'watcher_user_ids' -%> + <%= hidden_field_tag 'issue[watcher_user_ids][]', '' %> +

    + + <%= watchers_checkboxes(@issue, users_for_new_issue_watchers(@issue)) %> + + + <%= link_to l(:label_search_for_watchers), + {:controller => 'watchers', :action => 'new', :project_id => @issue.project}, + :class => 'icon icon-add-bullet', + :remote => true, + :method => 'get' %> + +

    +<% end %> diff --git a/app/views/issues/bulk_edit.html.erb b/app/views/issues/bulk_edit.html.erb new file mode 100644 index 0000000..7e10d03 --- /dev/null +++ b/app/views/issues/bulk_edit.html.erb @@ -0,0 +1,235 @@ +

    <%= @copy ? l(:button_copy) : l(:label_bulk_edit_selected_issues) %>

    + +<% if @saved_issues && @unsaved_issues.present? %> +
    + + <%= l(:notice_failed_to_save_issues, + :count => @unsaved_issues.size, + :total => @saved_issues.size, + :ids => @unsaved_issues.map {|i| "##{i.id}"}.join(', ')) %> + +
      + <% bulk_edit_error_messages(@unsaved_issues).each do |message| %> +
    • <%= message %>
    • + <% end %> +
    +
    +<% end %> + +
      +<% @issues.each do |issue| %> + <%= content_tag 'li', link_to_issue(issue) %> +<% end %> +
    + +<%= form_tag(bulk_update_issues_path, :id => 'bulk_edit_form') do %> +<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id, :id => nil)}.join("\n").html_safe %> +
    +
    +<%= l(:label_change_properties) %> + +
    +<% if @allowed_projects.present? %> +

    + + <%= select_tag('issue[project_id]', + project_tree_options_for_select(@allowed_projects, + :include_blank => ((!@copy || (@projects & @allowed_projects == @projects)) ? l(:label_no_change_option) : false), + :selected => @target_project), + :onchange => "updateBulkEditFrom('#{escape_javascript url_for(:action => 'bulk_edit', :format => 'js')}')") %> +

    +<% end %> +

    + + <%= select_tag('issue[tracker_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + options_from_collection_for_select(@trackers, :id, :name, @issue_params[:tracker_id]), + :onchange => "updateBulkEditFrom('#{escape_javascript url_for(:action => 'bulk_edit', :format => 'js')}')") %> +

    +<% if @available_statuses.any? %> +

    + + <%= select_tag('issue[status_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + options_from_collection_for_select(@available_statuses, :id, :name, @issue_params[:status_id]), + :onchange => "updateBulkEditFrom('#{escape_javascript url_for(:action => 'bulk_edit', :format => 'js')}')") %> +

    +<% end %> + +<% if @safe_attributes.include?('priority_id') -%> +

    + + <%= select_tag('issue[priority_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + options_from_collection_for_select(IssuePriority.active, :id, :name, @issue_params[:priority_id])) %> +

    +<% end %> + +<% if @safe_attributes.include?('assigned_to_id') -%> +

    + + <%= select_tag('issue[assigned_to_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + content_tag('option', l(:label_nobody), :value => 'none', :selected => (@issue_params[:assigned_to_id] == 'none')) + + principals_options_for_select(@assignables, @issue_params[:assigned_to_id])) %> +

    +<% end %> + +<% if @safe_attributes.include?('category_id') -%> +

    + + <%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') + + content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:category_id] == 'none')) + + options_from_collection_for_select(@categories, :id, :name, @issue_params[:category_id])) %> +

    +<% end %> + +<% if @safe_attributes.include?('fixed_version_id') -%> +

    + + <%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') + + content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:fixed_version_id] == 'none')) + + version_options_for_select(@versions.sort, @issue_params[:fixed_version_id])) %> +

    +<% end %> + +<% @custom_fields.each do |custom_field| %> +

    + + <%= custom_field_tag_for_bulk_edit('issue', custom_field, @issues, @issue_params[:custom_field_values][custom_field.id.to_s]) %> +

    +<% end %> + +<% if @copy && Setting.link_copied_issue == 'ask' %> +

    + + <%= hidden_field_tag 'link_copy', '0' %> + <%= check_box_tag 'link_copy', '1', params[:link_copy] != 0 %> +

    +<% end %> + +<% if @copy && (@attachments_present || @subtasks_present || @watchers_present) %> +

    + + <% if @attachments_present %> + + <% end %> + <% if @subtasks_present %> + + <% end %> + <% if @watchers_present %> + + <% end %> +

    +<% end %> + +<%= call_hook(:view_issues_bulk_edit_details_bottom, { :issues => @issues }) %> +
    + +
    +<% if @safe_attributes.include?('is_private') %> +

    + + <%= select_tag('issue[is_private]', content_tag('option', l(:label_no_change_option), :value => '') + + content_tag('option', l(:general_text_Yes), :value => '1', :selected => (@issue_params[:is_private] == '1')) + + content_tag('option', l(:general_text_No), :value => '0', :selected => (@issue_params[:is_private] == '0'))) %> +

    +<% end %> + +<% if @safe_attributes.include?('parent_issue_id') && @project %> +

    + + <%= text_field_tag 'issue[parent_issue_id]', '', :size => 10, :value => @issue_params[:parent_issue_id] %> + +

    +<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project, :scope => Setting.cross_project_subtasks)}')" %> +<% end %> + +<% if @safe_attributes.include?('start_date') %> +

    + + <%= date_field_tag 'issue[start_date]', '', :value => @issue_params[:start_date], :size => 10 %><%= calendar_for('issue_start_date') %> + +

    +<% end %> + +<% if @safe_attributes.include?('due_date') %> +

    + + <%= date_field_tag 'issue[due_date]', '', :value => @issue_params[:due_date], :size => 10 %><%= calendar_for('issue_due_date') %> + +

    +<% end %> + +<% if @safe_attributes.include?('estimated_hours') %> +

    + + <%= text_field_tag 'issue[estimated_hours]', '', :value => @issue_params[:estimated_hours], :size => 10 %> + +

    +<% end %> + +<% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %> +

    + + <%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }, @issue_params[:done_ratio]) %> +

    +<% end %> +
    +
    + +
    +<%= l(:field_notes) %> +<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> +<%= wikitoolbar_for 'notes' %> +
    +
    + +<% if @values_by_custom_field.present? %> +
    + <%= l(:warning_fields_cleared_on_bulk_edit) %>:
    + <%= safe_join(@values_by_custom_field.map {|field, ids| content_tag "span", "#{field.name} (#{ids.size})"}, ', ') %> +
    +<% end %> + +

    + <% if @copy %> + <%= hidden_field_tag 'copy', '1' %> + <%= submit_tag l(:button_copy) %> + <%= submit_tag l(:button_copy_and_follow), :name => 'follow' %> + <% elsif @target_project %> + <%= submit_tag l(:button_move) %> + <%= submit_tag l(:button_move_and_follow), :name => 'follow' %> + <% else %> + <%= submit_tag l(:button_submit) %> + <% end %> +

    + +<% end %> + +<%= javascript_tag do %> +$(window).load(function(){ + $(document).on('change', 'input[data-disables]', function(){ + if ($(this).prop('checked')){ + $($(this).data('disables')).attr('disabled', true).val(''); + } else { + $($(this).data('disables')).attr('disabled', false); + } + }); +}); +$(document).ready(function(){ + $('input[data-disables]').trigger('change'); +}); +<% end %> diff --git a/app/views/issues/bulk_edit.js.erb b/app/views/issues/bulk_edit.js.erb new file mode 100644 index 0000000..ac84ad1 --- /dev/null +++ b/app/views/issues/bulk_edit.js.erb @@ -0,0 +1 @@ +$('#content').html('<%= escape_javascript(render :template => 'issues/bulk_edit', :formats => [:html]) %>'); diff --git a/app/views/issues/destroy.html.erb b/app/views/issues/destroy.html.erb new file mode 100644 index 0000000..61b841a --- /dev/null +++ b/app/views/issues/destroy.html.erb @@ -0,0 +1,20 @@ +

    <%= l(:label_confirmation) %>

    + +<%= form_tag({}, :method => :delete) do %> +<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id, :id => nil)}.join("\n").html_safe %> +
    +

    <%= l(:text_destroy_time_entries_question, :hours => number_with_precision(@hours, :precision => 2)) %>

    +

    +
    +<% unless Setting.timelog_required_fields.include?('issue_id') %> +
    +<% end %> +<% if @project %> + +<%= text_field_tag 'reassign_to_id', params[:reassign_to_id], :size => 6, :onfocus => '$("#todo_reassign").attr("checked", true);' %> +<%= javascript_tag "observeAutocompleteField('reassign_to_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project)}')" %> +<% end %> +

    +
    +<%= submit_tag l(:button_apply) %> +<% end %> diff --git a/app/views/issues/edit.html.erb b/app/views/issues/edit.html.erb new file mode 100644 index 0000000..da80a08 --- /dev/null +++ b/app/views/issues/edit.html.erb @@ -0,0 +1,6 @@ +

    <%= "#{@issue.tracker_was} ##{@issue.id}" %>

    + +<%= render :partial => 'edit' %> +<% content_for :header_tags do %> + <%= robot_exclusion_tag %> +<% end %> diff --git a/app/views/issues/edit.js.erb b/app/views/issues/edit.js.erb new file mode 100644 index 0000000..8c94aec --- /dev/null +++ b/app/views/issues/edit.js.erb @@ -0,0 +1,7 @@ +replaceIssueFormWith('<%= escape_javascript(render :partial => 'form') %>'); + +<% if User.current.allowed_to?(:log_time, @issue.project) %> + $('#log_time').show(); +<% else %> + $('#log_time').hide(); +<% end %> diff --git a/app/views/issues/index.api.rsb b/app/views/issues/index.api.rsb new file mode 100644 index 0000000..4bba325 --- /dev/null +++ b/app/views/issues/index.api.rsb @@ -0,0 +1,42 @@ +api.array :issues, api_meta(:total_count => @issue_count, :offset => @offset, :limit => @limit) do + @issues.each do |issue| + api.issue do + api.id issue.id + api.project(:id => issue.project_id, :name => issue.project.name) unless issue.project.nil? + api.tracker(:id => issue.tracker_id, :name => issue.tracker.name) unless issue.tracker.nil? + api.status(:id => issue.status_id, :name => issue.status.name) unless issue.status.nil? + api.priority(:id => issue.priority_id, :name => issue.priority.name) unless issue.priority.nil? + api.author(:id => issue.author_id, :name => issue.author.name) unless issue.author.nil? + api.assigned_to(:id => issue.assigned_to_id, :name => issue.assigned_to.name) unless issue.assigned_to.nil? + api.category(:id => issue.category_id, :name => issue.category.name) unless issue.category.nil? + api.fixed_version(:id => issue.fixed_version_id, :name => issue.fixed_version.name) unless issue.fixed_version.nil? + api.parent(:id => issue.parent_id) unless issue.parent.nil? + + api.subject issue.subject + api.description issue.description + api.start_date issue.start_date + api.due_date issue.due_date + api.done_ratio issue.done_ratio + api.is_private issue.is_private + api.estimated_hours issue.estimated_hours + + render_api_custom_values issue.visible_custom_field_values, api + + api.created_on issue.created_on + api.updated_on issue.updated_on + api.closed_on issue.closed_on + + api.array :attachments do + issue.attachments.each do |attachment| + render_api_attachment(attachment, api) + end + end if include_in_api_response?('attachments') + + api.array :relations do + issue.relations.each do |relation| + api.relation(:id => relation.id, :issue_id => relation.issue_from_id, :issue_to_id => relation.issue_to_id, :relation_type => relation.relation_type, :delay => relation.delay) + end + end if include_in_api_response?('relations') + end + end +end diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb new file mode 100644 index 0000000..e055fc8 --- /dev/null +++ b/app/views/issues/index.html.erb @@ -0,0 +1,72 @@ +
    + <% if User.current.allowed_to?(:add_issues, @project, :global => true) && (@project.nil? || Issue.allowed_target_trackers(@project).any?) %> + <%= link_to l(:label_issue_new), _new_project_issue_path(@project), :class => 'icon icon-add new-issue' %> + <% end %> +
    + +

    <%= @query.new_record? ? l(:label_issue_plural) : @query.name %>

    +<% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> + +<%= form_tag(_project_issues_path(@project), :method => :get, :id => 'query_form') do %> + <%= render :partial => 'queries/query_form' %> +<% end %> + +<% if @query.valid? %> +<% if @issues.empty? %> +

    <%= l(:label_no_data) %>

    +<% else %> +<%= render_query_totals(@query) %> +<%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %> +<%= pagination_links_full @issue_pages, @issue_count %> +<% end %> + +<% other_formats_links do |f| %> + <%= f.link_to_with_query_parameters 'Atom', :key => User.current.rss_key %> + <%= f.link_to_with_query_parameters 'CSV', {}, :onclick => "showModal('csv-export-options', '350px'); return false;" %> + <%= f.link_to_with_query_parameters 'PDF' %> +<% end %> + + + +<% end %> +<%= call_hook(:view_issues_index_bottom, { :issues => @issues, :project => @project, :query => @query }) %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<% content_for :header_tags do %> + <%= auto_discovery_link_tag(:atom, + {:query_id => @query, :format => 'atom', + :page => nil, :key => User.current.rss_key}, + :title => l(:label_issue_plural)) %> + <%= auto_discovery_link_tag(:atom, + {:controller => 'journals', :action => 'index', + :query_id => @query, :format => 'atom', + :page => nil, :key => User.current.rss_key}, + :title => l(:label_changes_details)) %> +<% end %> + +<%= context_menu %> diff --git a/app/views/issues/index.pdf.erb b/app/views/issues/index.pdf.erb new file mode 100644 index 0000000..810818a --- /dev/null +++ b/app/views/issues/index.pdf.erb @@ -0,0 +1 @@ +<%= raw issues_to_pdf(@issues, @project, @query) %> \ No newline at end of file diff --git a/app/views/issues/new.html.erb b/app/views/issues/new.html.erb new file mode 100644 index 0000000..1c2c8ba --- /dev/null +++ b/app/views/issues/new.html.erb @@ -0,0 +1,49 @@ +<%= title l(:label_issue_new) %> + +<%= call_hook(:view_issues_new_top, {:issue => @issue}) %> + +<%= labelled_form_for @issue, :url => _project_issues_path(@project), + :html => {:id => 'issue-form', :multipart => true} do |f| %> + <%= error_messages_for 'issue' %> + <%= hidden_field_tag 'copy_from', params[:copy_from] if params[:copy_from] %> +
    +
    + <%= render :partial => 'issues/form', :locals => {:f => f} %> +
    + + <% if @copy_from && Setting.link_copied_issue == 'ask' %> +

    + + <%= check_box_tag 'link_copy', '1', @link_copy %> +

    + <% end %> + <% if @copy_from && @copy_from.attachments.any? %> +

    + + <%= check_box_tag 'copy_attachments', '1', @copy_attachments %> +

    + <% end %> + <% if @copy_from && !@copy_from.leaf? %> +

    + + <%= check_box_tag 'copy_subtasks', '1', @copy_subtasks %> +

    + <% end %> + +

    <%= render :partial => 'attachments/form', :locals => {:container => @issue} %>

    + +
    + <%= render :partial => 'issues/watchers_form' %> +
    +
    + + <%= submit_tag l(:button_create) %> + <%= submit_tag l(:button_create_and_continue), :name => 'continue' %> + <%= preview_link preview_new_issue_path(:project_id => @issue.project), 'issue-form' %> +<% end %> + +
    + +<% content_for :header_tags do %> + <%= robot_exclusion_tag %> +<% end %> diff --git a/app/views/issues/new.js.erb b/app/views/issues/new.js.erb new file mode 100644 index 0000000..c751b57 --- /dev/null +++ b/app/views/issues/new.js.erb @@ -0,0 +1,4 @@ +replaceIssueFormWith('<%= escape_javascript(render :partial => 'form') %>'); +<% if params[:form_update_triggered_by] == "issue_project_id" %> +$("#watchers_form_container").html('<%= escape_javascript(render :partial => 'issues/watchers_form') %>'); +<% end %> diff --git a/app/views/issues/show.api.rsb b/app/views/issues/show.api.rsb new file mode 100644 index 0000000..f474ed9 --- /dev/null +++ b/app/views/issues/show.api.rsb @@ -0,0 +1,80 @@ +api.issue do + api.id @issue.id + api.project(:id => @issue.project_id, :name => @issue.project.name) unless @issue.project.nil? + api.tracker(:id => @issue.tracker_id, :name => @issue.tracker.name) unless @issue.tracker.nil? + api.status(:id => @issue.status_id, :name => @issue.status.name) unless @issue.status.nil? + api.priority(:id => @issue.priority_id, :name => @issue.priority.name) unless @issue.priority.nil? + api.author(:id => @issue.author_id, :name => @issue.author.name) unless @issue.author.nil? + api.assigned_to(:id => @issue.assigned_to_id, :name => @issue.assigned_to.name) unless @issue.assigned_to.nil? + api.category(:id => @issue.category_id, :name => @issue.category.name) unless @issue.category.nil? + api.fixed_version(:id => @issue.fixed_version_id, :name => @issue.fixed_version.name) unless @issue.fixed_version.nil? + api.parent(:id => @issue.parent_id) unless @issue.parent.nil? + + api.subject @issue.subject + api.description @issue.description + api.start_date @issue.start_date + api.due_date @issue.due_date + api.done_ratio @issue.done_ratio + api.is_private @issue.is_private + api.estimated_hours @issue.estimated_hours + api.total_estimated_hours @issue.total_estimated_hours + if User.current.allowed_to?(:view_time_entries, @project) + api.spent_hours(@issue.spent_hours) + api.total_spent_hours(@issue.total_spent_hours) + end + + render_api_custom_values @issue.visible_custom_field_values, api + + api.created_on @issue.created_on + api.updated_on @issue.updated_on + api.closed_on @issue.closed_on + + render_api_issue_children(@issue, api) if include_in_api_response?('children') + + api.array :attachments do + @issue.attachments.each do |attachment| + render_api_attachment(attachment, api) + end + end if include_in_api_response?('attachments') + + api.array :relations do + @relations.each do |relation| + api.relation(:id => relation.id, :issue_id => relation.issue_from_id, :issue_to_id => relation.issue_to_id, :relation_type => relation.relation_type, :delay => relation.delay) + end + end if include_in_api_response?('relations') && @relations.present? + + api.array :changesets do + @changesets.each do |changeset| + api.changeset :revision => changeset.revision do + api.user(:id => changeset.user_id, :name => changeset.user.name) unless changeset.user.nil? + api.comments changeset.comments + api.committed_on changeset.committed_on + end + end + end if include_in_api_response?('changesets') + + api.array :journals do + @journals.each do |journal| + api.journal :id => journal.id do + api.user(:id => journal.user_id, :name => journal.user.name) unless journal.user.nil? + api.notes journal.notes + api.created_on journal.created_on + api.private_notes journal.private_notes + api.array :details do + journal.visible_details.each do |detail| + api.detail :property => detail.property, :name => detail.prop_key do + api.old_value detail.old_value + api.new_value detail.value + end + end + end + end + end + end if include_in_api_response?('journals') + + api.array :watchers do + @issue.watcher_users.each do |user| + api.user :id => user.id, :name => user.name + end + end if include_in_api_response?('watchers') && User.current.allowed_to?(:view_issue_watchers, @issue.project) +end diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb new file mode 100644 index 0000000..f1f2791 --- /dev/null +++ b/app/views/issues/show.html.erb @@ -0,0 +1,169 @@ +<%= render :partial => 'action_menu' %> + +

    <%= issue_heading(@issue) %>

    + +
    + <% if @prev_issue_id || @next_issue_id %> + + <% end %> + +
    + <%= avatar(@issue.author, :size => "50", :title => l(:field_author)) %> + <%= avatar(@issue.assigned_to, :size => "22", :class => "gravatar gravatar-child", :title => l(:field_assigned_to)) if @issue.assigned_to %> +
    + +
    +<%= render_issue_subject_with_tree(@issue) %> +
    +

    + <%= authoring @issue.created_on, @issue.author %>. + <% if @issue.created_on != @issue.updated_on %> + <%= l(:label_updated_time, time_tag(@issue.updated_on)).html_safe %>. + <% end %> +

    + +
    +<%= issue_fields_rows do |rows| + rows.left l(:field_status), @issue.status.name, :class => 'status' + rows.left l(:field_priority), @issue.priority.name, :class => 'priority' + + unless @issue.disabled_core_fields.include?('assigned_to_id') + rows.left l(:field_assigned_to), (@issue.assigned_to ? link_to_user(@issue.assigned_to) : "-"), :class => 'assigned-to' + end + unless @issue.disabled_core_fields.include?('category_id') || (@issue.category.nil? && @issue.project.issue_categories.none?) + rows.left l(:field_category), (@issue.category ? @issue.category.name : "-"), :class => 'category' + end + unless @issue.disabled_core_fields.include?('fixed_version_id') || (@issue.fixed_version.nil? && @issue.assignable_versions.none?) + rows.left l(:field_fixed_version), (@issue.fixed_version ? link_to_version(@issue.fixed_version) : "-"), :class => 'fixed-version' + end + + unless @issue.disabled_core_fields.include?('start_date') + rows.right l(:field_start_date), format_date(@issue.start_date), :class => 'start-date' + end + unless @issue.disabled_core_fields.include?('due_date') + rows.right l(:field_due_date), format_date(@issue.due_date), :class => 'due-date' + end + unless @issue.disabled_core_fields.include?('done_ratio') + rows.right l(:field_done_ratio), progress_bar(@issue.done_ratio, :legend => "#{@issue.done_ratio}%"), :class => 'progress' + end + unless @issue.disabled_core_fields.include?('estimated_hours') + rows.right l(:field_estimated_hours), issue_estimated_hours_details(@issue), :class => 'estimated-hours' + end + if User.current.allowed_to?(:view_time_entries, @project) && @issue.total_spent_hours > 0 + rows.right l(:label_spent_time), issue_spent_hours_details(@issue), :class => 'spent-time' + end +end %> +<%= render_half_width_custom_fields_rows(@issue) %> +<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %> +
    + +<% if @issue.description? || @issue.attachments.any? -%> +
    +<% if @issue.description? %> +
    +
    + <%= link_to l(:button_quote), quoted_issue_path(@issue), :remote => true, :method => 'post', :class => 'icon icon-comment' if @issue.notes_addable? %> +
    + +

    <%=l(:field_description)%>

    +
    + <%= textilizable @issue, :description, :attachments => @issue.attachments %> +
    +
    +<% end %> +<%= link_to_attachments @issue, :thumbnails => true %> +<% end -%> + +<%= render_full_width_custom_fields_rows(@issue) %> + +<%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %> + +<% if !@issue.leaf? || User.current.allowed_to?(:manage_subtasks, @project) %> +
    +
    +
    + <%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %> +
    +

    <%=l(:label_subtask_plural)%>

    +<%= form_tag({}, :data => {:cm_url => issues_context_menu_path}) do %> +<%= render_descendants_tree(@issue) unless @issue.leaf? %> +<% end %> +
    +<% end %> + +<% if @relations.present? || User.current.allowed_to?(:manage_issue_relations, @project) %> +
    +
    +<%= render :partial => 'relations' %> +
    +<% end %> + +
    + +<% if @changesets.present? %> +
    +

    <%=l(:label_associated_revisions)%>

    +<%= render :partial => 'changesets', :locals => { :changesets => @changesets} %> +
    +<% end %> + +<% if @journals.present? %> +
    +

    <%=l(:label_history)%>

    +<%= render :partial => 'history', :locals => { :issue => @issue, :journals => @journals } %> +
    +<% end %> + + +
    +<%= render :partial => 'action_menu' %> + +
    +<% if @issue.editable? %> + +<% end %> + +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> + <%= f.link_to 'PDF' %> +<% end %> + +<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> + + <% if User.current.allowed_to?(:add_issue_watchers, @project) || + (@issue.watchers.present? && User.current.allowed_to?(:view_issue_watchers, @project)) %> +
    + <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %> +
    + <% end %> +<% end %> + +<% content_for :header_tags do %> + <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %> +<% end %> + +<%= context_menu %> diff --git a/app/views/issues/show.pdf.erb b/app/views/issues/show.pdf.erb new file mode 100644 index 0000000..f26589f --- /dev/null +++ b/app/views/issues/show.pdf.erb @@ -0,0 +1 @@ +<%= raw issue_to_pdf(@issue, :journals => @journals) %> \ No newline at end of file diff --git a/app/views/issues/tabs/_changesets.html.erb b/app/views/issues/tabs/_changesets.html.erb deleted file mode 100644 index 5a1d012..0000000 --- a/app/views/issues/tabs/_changesets.html.erb +++ /dev/null @@ -1,22 +0,0 @@ -<% @changesets.each do |changeset| %> -
    -

    - <%= avatar(changeset.user, :size => "24") %> - <%= authoring changeset.committed_on, changeset.author, :label => :label_added_time_by %> -

    -

    <%= link_to_revision(changeset, changeset.repository, - :text => "#{l(:label_revision)} #{changeset.format_identifier}") %> - <% if changeset.filechanges.any? && User.current.allowed_to?(:browse_repository, changeset.project) %> - (<%= link_to(l(:label_diff), - :controller => 'repositories', - :action => 'diff', - :id => changeset.project, - :repository_id => changeset.repository.identifier_param, - :path => "", - :rev => changeset.identifier) %>) - <% end %>

    - -
    <%= format_changeset_comments changeset %>
    -
    - <%= call_hook(:view_issues_history_changeset_bottom, { :changeset => changeset }) %> -<% end %> diff --git a/app/views/journals/_notes_form.html.erb b/app/views/journals/_notes_form.html.erb new file mode 100644 index 0000000..2ab9787 --- /dev/null +++ b/app/views/journals/_notes_form.html.erb @@ -0,0 +1,24 @@ +<%= form_tag(journal_path(@journal), + :remote => true, + :method => 'put', + :id => "journal-#{@journal.id}-form") do %> + <%= label_tag "notes", l(:description_notes), :class => "hidden-for-sighted", :for => "journal_#{@journal.id}_notes" %> + <%= text_area_tag 'journal[notes]', @journal.notes, + :id => "journal_#{@journal.id}_notes", + :class => 'wiki-edit', + :rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %> + <% if @journal.safe_attribute? 'private_notes' %> + <%= hidden_field_tag 'journal[private_notes]', '0' %> + <%= check_box_tag 'journal[private_notes]', '1', @journal.private_notes, :id => "journal_#{@journal.id}_private_notes" %> + + <% end %> + <%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %> +

    <%= submit_tag l(:button_save) %> + <%= preview_link preview_edit_issue_path(:project_id => @project, :id => @journal.issue), + "journal-#{@journal.id}-form", + "journal_#{@journal.id}_preview" %> | + <%= link_to l(:button_cancel), '#', :onclick => "$('#journal-#{@journal.id}-form').remove(); $('#journal-#{@journal.id}-notes').show(); return false;" %>

    + +
    +<% end %> +<%= wikitoolbar_for "journal_#{@journal.id}_notes" %> diff --git a/app/views/journals/diff.html.erb b/app/views/journals/diff.html.erb new file mode 100644 index 0000000..d28ee0f --- /dev/null +++ b/app/views/journals/diff.html.erb @@ -0,0 +1,13 @@ +

    <%= @issue.tracker %> #<%= @issue.id %>

    +

    <%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %>

    + +
    +<%= simple_format_without_paragraph @diff.to_html %> +
    + +

    + <%= link_to(l(:button_back), issue_path(@issue), + :onclick => 'if (document.referrer != "") {history.back(); return false;}') %> +

    + +<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> diff --git a/app/views/journals/edit.js.erb b/app/views/journals/edit.js.erb new file mode 100644 index 0000000..96cf6b4 --- /dev/null +++ b/app/views/journals/edit.js.erb @@ -0,0 +1,8 @@ +$("#journal-<%= @journal.id %>-notes").hide(); + +if ($("form#journal-<%= @journal.id %>-form").length > 0) { + // journal edit form already loaded + $("#journal-<%= @journal.id %>-form").show(); +} else { + $("#journal-<%= @journal.id %>-notes").after('<%= escape_javascript(render :partial => 'notes_form') %>'); +} diff --git a/app/views/journals/index.builder b/app/views/journals/index.builder new file mode 100644 index 0000000..f157ae9 --- /dev/null +++ b/app/views/journals/index.builder @@ -0,0 +1,31 @@ +xml.instruct! +xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do + xml.title @title + xml.link "rel" => "self", "href" => url_for(:format => 'atom', :key => User.current.rss_key, :only_path => false) + xml.link "rel" => "alternate", "href" => home_url + xml.id home_url + xml.icon favicon_url + xml.updated((@journals.first ? @journals.first.event_datetime : Time.now).xmlschema) + xml.author { xml.name "#{Setting.app_title}" } + @journals.each do |change| + issue = change.issue + xml.entry do + xml.title "#{issue.project.name} - #{issue.tracker.name} ##{issue.id}: #{issue.subject}" + xml.link "rel" => "alternate", "href" => issue_url(issue) + xml.id issue_url(issue, :journal_id => change) + xml.updated change.created_on.xmlschema + xml.author do + xml.name change.user.name + xml.email(change.user.mail) if change.user.is_a?(User) && !change.user.mail.blank? && !change.user.pref.hide_mail + end + xml.content "type" => "html" do + xml.text! '
      ' + details_to_strings(change.visible_details, false).each do |string| + xml.text! '
    • ' + string + '
    • ' + end + xml.text! '
    ' + xml.text! textilizable(change, :notes, :only_path => false) unless change.notes.blank? + end + end + end +end diff --git a/app/views/journals/new.js.erb b/app/views/journals/new.js.erb new file mode 100644 index 0000000..0f832f3 --- /dev/null +++ b/app/views/journals/new.js.erb @@ -0,0 +1,13 @@ +showAndScrollTo("update"); + +var notes = $('#issue_notes').val(); +if (notes > "") { notes = notes + "\n\n"} + +$('#issue_notes').blur().focus().val(notes + "<%= raw escape_javascript(@content) %>"); +<% + # when quoting a private journal, check the private checkbox + if @journal && @journal.private_notes? +%> +$('#issue_private_notes').prop('checked', true); +<% end %> + diff --git a/app/views/journals/update.js.erb b/app/views/journals/update.js.erb new file mode 100644 index 0000000..6a297bb --- /dev/null +++ b/app/views/journals/update.js.erb @@ -0,0 +1,11 @@ +<% if @journal.frozen? %> + $("#change-<%= @journal.id %>").remove(); +<% else %> + $("#change-<%= @journal.id %>").attr('class', '<%= @journal.css_classes %>'); + $("#journal-<%= @journal.id %>-notes").replaceWith('<%= escape_javascript(render_notes(@journal.issue, @journal, :reply_links => authorize_for('issues', 'edit'))) %>'); + $("#journal-<%= @journal.id %>-private_notes").replaceWith('<%= escape_javascript(render_private_notes_indicator(@journal)) %>'); + $("#journal-<%= @journal.id %>-notes").show(); + $("#journal-<%= @journal.id %>-form").remove(); +<% end %> + +<%= call_hook(:view_journals_update_js_bottom, { :journal => @journal }) %> diff --git a/app/views/layouts/_file.html.erb b/app/views/layouts/_file.html.erb new file mode 100644 index 0000000..eb11f99 --- /dev/null +++ b/app/views/layouts/_file.html.erb @@ -0,0 +1,17 @@ +
    + <%= link_to_attachment @attachment, :text => "#{l(:button_download)} (#{number_to_human_size(@attachment.filesize)})", :download => true, :class => 'icon icon-download' -%> +
    + +

    <%=h @attachment.filename %>

    + +
    +

    <%= "#{@attachment.description} - " unless @attachment.description.blank? %> + <%= link_to_user(@attachment.author) %>, <%= format_time(@attachment.created_on) %>

    +
    +<%= yield %> + +<% html_title @attachment.filename %> + +<% content_for :header_tags do -%> + <%= stylesheet_link_tag "scm" -%> +<% end -%> diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb new file mode 100644 index 0000000..8f23129 --- /dev/null +++ b/app/views/layouts/admin.html.erb @@ -0,0 +1,8 @@ +<% unless controller_name == 'admin' && action_name == 'index' %> + <% content_for :sidebar do %> +

    <%=l(:label_administration)%>

    + <%= render :partial => 'admin/menu' %> + <% end %> +<% end %> + +<%= render :file => "layouts/base" %> diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb index 06ede3a..f0f7509 100644 --- a/app/views/layouts/base.html.erb +++ b/app/views/layouts/base.html.erb @@ -9,9 +9,8 @@ <%= csrf_meta_tag %> <%= favicon %> -<%= stylesheet_link_tag 'jquery/jquery-ui-1.11.0', 'cookieconsent.min', 'tribute-3.7.3', 'application', 'responsive', :media => 'all' %> +<%= stylesheet_link_tag 'jquery/jquery-ui-1.11.0', 'cookieconsent.min', 'application', 'responsive', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> - <% is_welcome = !User.current.logged? && current_page?(:controller => 'welcome', :action => 'index') %> <%= stylesheet_link_tag 'frontpage', :media => 'all' if is_welcome %> @@ -28,7 +27,6 @@
    - <% if User.current.logged? || !Setting.login_required? %> +
    <% end %> @@ -146,13 +140,12 @@ - <%= call_hook :view_layouts_base_body_bottom %> + + + + + +<% end %> diff --git a/app/views/welcome/robots.html.erb b/app/views/welcome/robots.html.erb new file mode 100644 index 0000000..10b5409 --- /dev/null +++ b/app/views/welcome/robots.html.erb @@ -0,0 +1,10 @@ +User-agent: * +<% @projects.each do |p| -%> +Disallow: /projects/<%= p.to_param %>/repository +Disallow: /projects/<%= p.to_param %>/issues +Disallow: /projects/<%= p.to_param %>/activity +<% end -%> +Disallow: /issues/gantt +Disallow: /issues/calendar +Disallow: /activity +Disallow: /search diff --git a/app/views/wiki/_content.html.erb b/app/views/wiki/_content.html.erb new file mode 100644 index 0000000..60b6a74 --- /dev/null +++ b/app/views/wiki/_content.html.erb @@ -0,0 +1,4 @@ +
    + <%= textilizable content, :text, :attachments => content.page.attachments, + :edit_section_links => (@sections_editable && {:controller => 'wiki', :action => 'edit', :project_id => @page.project, :id => @page.title}) %> +
    diff --git a/app/views/wiki/_new_modal.html.erb b/app/views/wiki/_new_modal.html.erb new file mode 100644 index 0000000..52a87b7 --- /dev/null +++ b/app/views/wiki/_new_modal.html.erb @@ -0,0 +1,21 @@ +

    <%=l(:label_wiki_page_new)%>

    + +<%= labelled_form_for :page, @page, + :url => new_project_wiki_page_path(@project), + :method => 'post', + :remote => true do |f| %> + + <%= render_error_messages @page.errors.full_messages_for(:title) %> + +
    +

    + <%= f.text_field :title, :name => 'title', :size => 60, :required => true %> + <%= l(:text_unallowed_characters) %>: , . / ? ; : | +

    +
    + +

    + <%= submit_tag l(:label_next), :name => nil %> + <%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> +

    +<% end %> diff --git a/app/views/wiki/_sidebar.html.erb b/app/views/wiki/_sidebar.html.erb new file mode 100644 index 0000000..a8e4110 --- /dev/null +++ b/app/views/wiki/_sidebar.html.erb @@ -0,0 +1,14 @@ +<% if @wiki && @wiki.sidebar -%> +
    + <%= textilizable @wiki.sidebar.content, :text %> +
    +<% end -%> + +

    <%= l(:label_wiki) %>

    +
      +
    • <%= link_to(l(:field_start_page), {:action => 'show', :id => nil}) %>
    • +
    • <%= link_to(l(:label_index_by_title), {:action => 'index'}) %>
    • +
    • <%= link_to(l(:label_index_by_date), + {:controller => 'wiki', :project_id => @project, + :action => 'date_index'}) %>
    • +
    diff --git a/app/views/wiki/annotate.html.erb b/app/views/wiki/annotate.html.erb new file mode 100644 index 0000000..950a5a7 --- /dev/null +++ b/app/views/wiki/annotate.html.erb @@ -0,0 +1,40 @@ +
    +<%= link_to(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit') %> +<%= link_to(l(:label_history), + {:action => 'history', :id => @page.title}, :class => 'icon icon-history') %> +
    + +<%= wiki_page_breadcrumb(@page) %> + +<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], + [l(:label_history), history_project_wiki_page_path(@page.project, @page.title)], + "#{l(:label_version)} #{@annotate.content.version}" %> + +

    + <%= @annotate.content.author ? link_to_user(@annotate.content.author) : l(:label_user_anonymous) + %>, <%= format_time(@annotate.content.updated_on) %>
    + <%= @annotate.content.comments %> +

    + +<% colors = Hash.new {|k,v| k[v] = (k.size % 12) } %> + + + +<% line_num = 1 %> +<% @annotate.lines.each do |line| -%> + + + + + + +<% line_num += 1 %> +<% end -%> + +
    <%= line_num %><%= link_to line[0], :controller => 'wiki', + :action => 'show', :project_id => @project, + :id => @page.title, :version => line[0] %><%= line[1] %>
    <%= line[2] %>
    + +<% content_for :header_tags do %> +<%= stylesheet_link_tag 'scm' %> +<% end %> diff --git a/app/views/wiki/date_index.html.erb b/app/views/wiki/date_index.html.erb new file mode 100644 index 0000000..c382ed6 --- /dev/null +++ b/app/views/wiki/date_index.html.erb @@ -0,0 +1,39 @@ +
    +<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> +<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project), :remote => true, :class => 'icon icon-add' %> +<% end %> +<%= watcher_link(@wiki, User.current) %> +
    + +

    <%= l(:label_index_by_date) %>

    + +<% if @pages.empty? %> +

    <%= l(:label_no_data) %>

    +<% end %> + +<% @pages_by_date.keys.sort.reverse.each do |date| %> +

    <%= format_date(date) %>

    +
      +<% @pages_by_date[date].each do |page| %> +
    • <%= link_to page.pretty_title, :action => 'show', :id => page.title, :project_id => page.project %>
    • +<% end %> +
    +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'sidebar' %> +<% end %> + +<% unless @pages.empty? %> +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> + <% if User.current.allowed_to?(:export_wiki_pages, @project) %> + <%= f.link_to('PDF', :url => {:action => 'export', :format => 'pdf'}) %> + <%= f.link_to('HTML', :url => {:action => 'export'}) %> + <% end %> +<% end %> +<% end %> + +<% content_for :header_tags do %> +<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %> +<% end %> diff --git a/app/views/wiki/destroy.html.erb b/app/views/wiki/destroy.html.erb new file mode 100644 index 0000000..d6270b6 --- /dev/null +++ b/app/views/wiki/destroy.html.erb @@ -0,0 +1,22 @@ +<%= wiki_page_breadcrumb(@page) %> + +

    <%= @page.pretty_title %>

    + +<%= form_tag({}, :method => :delete) do %> +
    +

    <%= l(:text_wiki_page_destroy_question, :descendants => @descendants_count) %>

    +


    + +<% if @reassignable_to.any? %> +
    +: +<%= label_tag "reassign_to_id", l(:description_wiki_subpages_reassign), :class => "hidden-for-sighted" %> +<%= select_tag 'reassign_to_id', wiki_page_options_for_select(@reassignable_to), + :onclick => "$('#todo_reassign').prop('checked', true);" %> +<% end %> +

    +
    + +<%= submit_tag l(:button_apply) %> +<%= link_to l(:button_cancel), :controller => 'wiki', :action => 'show', :project_id => @project, :id => @page.title %> +<% end %> diff --git a/app/views/wiki/diff.html.erb b/app/views/wiki/diff.html.erb new file mode 100644 index 0000000..335e581 --- /dev/null +++ b/app/views/wiki/diff.html.erb @@ -0,0 +1,29 @@ +
    +<%= link_to(l(:label_history), {:action => 'history', :id => @page.title}, + :class => 'icon icon-history') %> +
    + +<%= wiki_page_breadcrumb(@page) %> + +<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], + [l(:label_history), history_project_wiki_page_path(@page.project, @page.title)], + "#{l(:label_version)} #{@diff.content_to.version}" %> + +

    +<%= l(:label_version) %> <%= link_to @diff.content_from.version, :action => 'show', :id => @page.title, :project_id => @page.project, :version => @diff.content_from.version %> +(<%= @diff.content_from.author ? + @diff.content_from.author.name : l(:label_user_anonymous) + %>, <%= format_time(@diff.content_from.updated_on) %>) +→ +<%= l(:label_version) %> <%= link_to @diff.content_to.version, :action => 'show', + :id => @page.title, :project_id => @page.project, + :version => @diff.content_to.version + %>/<%= @page.content.version %> +(<%= @diff.content_to.author ? + link_to_user(@diff.content_to.author.name) : l(:label_user_anonymous) + %>, <%= format_time(@diff.content_to.updated_on) %>) +

    + +
    +<%= simple_format_without_paragraph @diff.to_html %> +
    diff --git a/app/views/wiki/edit.html.erb b/app/views/wiki/edit.html.erb new file mode 100644 index 0000000..a1fc3d0 --- /dev/null +++ b/app/views/wiki/edit.html.erb @@ -0,0 +1,50 @@ +<%= wiki_page_breadcrumb(@page) %> + +

    <%= @page.pretty_title %>

    + +<%= form_for @content, :as => :content, + :url => {:action => 'update', :id => @page.title}, + :html => {:method => :put, :multipart => true, :id => 'wiki_form'} do |f| %> +<%= f.hidden_field :version %> +<% if @section %> +<%= hidden_field_tag 'section', @section %> +<%= hidden_field_tag 'section_hash', @section_hash %> +<% end %> +<%= error_messages_for 'content' %> + +
    +<%= text_area_tag 'content[text]', @text, :cols => 100, :rows => 25, + :class => 'wiki-edit', :accesskey => accesskey(:edit) %> + +<% if @page.safe_attribute_names.include?('parent_id') && @wiki.pages.any? %> + <%= fields_for @page do |fp| %> +

    + + <%= fp.select :parent_id, + content_tag('option', '', :value => '') + + wiki_page_options_for_select( + @wiki.pages.includes(:parent).to_a - + @page.self_and_descendants, @page.parent) %> +

    + <% end %> +<% end %> + +

    <%= f.text_field :comments, :size => 120, :maxlength => 1024 %>

    +

    <%= render :partial => 'attachments/form' %>

    +
    + +

    + <%= submit_tag l(:button_save) %> + <%= preview_link({:controller => 'wiki', :action => 'preview', :project_id => @project, :id => @page.title }, 'wiki_form') %> + | <%= link_to l(:button_cancel), wiki_page_edit_cancel_path(@page) %> +

    +<%= wikitoolbar_for 'content_text' %> +<% end %> + +
    + +<% content_for :header_tags do %> + <%= robot_exclusion_tag %> +<% end %> + +<% html_title @page.pretty_title %> diff --git a/app/views/wiki/export.html.erb b/app/views/wiki/export.html.erb new file mode 100644 index 0000000..a9df66d --- /dev/null +++ b/app/views/wiki/export.html.erb @@ -0,0 +1,21 @@ + + + +<%= @page.pretty_title %> + + + + +<%= textilizable @content, :text, :wiki_links => :local %> + + diff --git a/app/views/wiki/export.pdf.erb b/app/views/wiki/export.pdf.erb new file mode 100644 index 0000000..84d596a --- /dev/null +++ b/app/views/wiki/export.pdf.erb @@ -0,0 +1 @@ +<%= raw wiki_pages_to_pdf(@pages, @project) %> \ No newline at end of file diff --git a/app/views/wiki/export_multiple.html.erb b/app/views/wiki/export_multiple.html.erb new file mode 100644 index 0000000..b068ce1 --- /dev/null +++ b/app/views/wiki/export_multiple.html.erb @@ -0,0 +1,34 @@ + + + +<%= @wiki.project.name %> + + + + + +<%= l(:label_index_by_title) %> + + +<% @pages.each do |page| %> +
    + +<%= textilizable page.content ,:text, :wiki_links => :anchor %> +<% end %> + + + diff --git a/app/views/wiki/history.html.erb b/app/views/wiki/history.html.erb new file mode 100644 index 0000000..e5e72b1 --- /dev/null +++ b/app/views/wiki/history.html.erb @@ -0,0 +1,40 @@ +<%= wiki_page_breadcrumb(@page) %> + +<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], l(:label_history) %> + +<%= form_tag({:controller => 'wiki', :action => 'diff', + :project_id => @page.project, :id => @page.title}, + :method => :get) do %> + + + + + + + + + + + +<% show_diff = @versions.size > 1 %> +<% line_num = 1 %> +<% @versions.each do |ver| %> + + + + + + + + + +<% line_num += 1 %> +<% end %> + +
    #<%= l(:field_updated_on) %><%= l(:field_author) %><%= l(:field_comments) %>
    <%= link_to ver.version, :action => 'show', :id => @page.title, :project_id => @page.project, :version => ver.version %><%= radio_button_tag('version', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('#cbto-#{line_num+1}').prop('checked', true);") if show_diff && (line_num < @versions.size) %><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %><%= format_time(ver.updated_on) %><%= link_to_user ver.author %><%= ver.comments %> + <%= link_to l(:button_annotate), :action => 'annotate', :id => @page.title, :version => ver.version %> + <%= delete_link wiki_page_path(@page, :version => ver.version) if User.current.allowed_to?(:delete_wiki_pages, @page.project) && @version_count > 1 %> +
    +<%= submit_tag l(:label_view_diff), :class => 'small' if show_diff %> +<%= pagination_links_full @version_pages, @version_count %> +<% end %> diff --git a/app/views/wiki/index.api.rsb b/app/views/wiki/index.api.rsb new file mode 100644 index 0000000..f1035c8 --- /dev/null +++ b/app/views/wiki/index.api.rsb @@ -0,0 +1,13 @@ +api.array :wiki_pages do + @pages.each do |page| + api.wiki_page do + api.title page.title + if page.parent + api.parent :title => page.parent.title + end + api.version page.version + api.created_on page.created_on + api.updated_on page.updated_on + end + end +end diff --git a/app/views/wiki/index.html.erb b/app/views/wiki/index.html.erb new file mode 100644 index 0000000..0d6955d --- /dev/null +++ b/app/views/wiki/index.html.erb @@ -0,0 +1,38 @@ +
    +<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> +<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project), :remote => true, :class => 'icon icon-add' %> +<% end %> +<%= watcher_link(@wiki, User.current) %> +
    + +

    <%= l(:label_index_by_title) %>

    + +<% if @pages.empty? %> +

    <%= l(:label_no_data) %>

    +<% end %> + +<%= render_page_hierarchy(@pages_by_parent_id, nil, :timestamp => true) %> + +<% content_for :sidebar do %> + <%= render :partial => 'sidebar' %> +<% end %> + +<% unless @pages.empty? %> +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', + :url => {:controller => 'activities', :action => 'index', + :id => @project, :show_wiki_edits => 1, + :key => User.current.rss_key} %> + <% if User.current.allowed_to?(:export_wiki_pages, @project) %> + <%= f.link_to('PDF', :url => {:action => 'export', :format => 'pdf'}) %> + <%= f.link_to('HTML', :url => {:action => 'export'}) %> + <% end %> +<% end %> +<% end %> + +<% content_for :header_tags do %> +<%= auto_discovery_link_tag( + :atom, :controller => 'activities', :action => 'index', + :id => @project, :show_wiki_edits => 1, :format => 'atom', + :key => User.current.rss_key) %> +<% end %> diff --git a/app/views/wiki/new.html.erb b/app/views/wiki/new.html.erb new file mode 100644 index 0000000..d067420 --- /dev/null +++ b/app/views/wiki/new.html.erb @@ -0,0 +1,17 @@ +<%= title l(:label_wiki_page_new) %> + +<%= labelled_form_for :page, @page, + :url => new_project_wiki_page_path(@project) do |f| %> + + <%= render_error_messages @page.errors.full_messages_for(:title) %> + +
    +

    + <%= f.text_field :title, :name => 'title', :size => 60, :required => true %> + <%= l(:text_unallowed_characters) %>: , . / ? ; : | +

    +
    + + <%= submit_tag(l(:label_next)) %> + +<% end %> diff --git a/app/views/wiki/new.js.erb b/app/views/wiki/new.js.erb new file mode 100644 index 0000000..c12b353 --- /dev/null +++ b/app/views/wiki/new.js.erb @@ -0,0 +1,2 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'wiki/new_modal') %>'); +showModal('ajax-modal', '600px'); diff --git a/app/views/wiki/rename.html.erb b/app/views/wiki/rename.html.erb new file mode 100644 index 0000000..ac88fd4 --- /dev/null +++ b/app/views/wiki/rename.html.erb @@ -0,0 +1,26 @@ +<%= wiki_page_breadcrumb(@page) %> + +

    <%= @original_title %>

    + +<%= error_messages_for 'page' %> + +<%= labelled_form_for :wiki_page, @page, + :url => { :action => 'rename' }, + :html => { :method => :post } do |f| %> +
    +

    <%= f.text_field :title, :required => true, :size => 100 %>

    +

    <%= f.check_box :redirect_existing_links %>

    +

    <%= f.select :parent_id, + content_tag('option', '', :value => '') + + wiki_page_options_for_select( + @wiki.pages.includes(:parent).to_a - @page.self_and_descendants, + @page.parent), + :label => :field_parent_title %>

    + +<% if @page.safe_attribute? 'wiki_id' %> +

    <%= f.select :wiki_id, wiki_page_wiki_options_for_select(@page), :label => :label_project %>

    +<% end %> + +
    +<%= submit_tag l(:button_rename) %> +<% end %> diff --git a/app/views/wiki/show.api.rsb b/app/views/wiki/show.api.rsb new file mode 100644 index 0000000..8e082e1 --- /dev/null +++ b/app/views/wiki/show.api.rsb @@ -0,0 +1,18 @@ +api.wiki_page do + api.title @page.title + if @page.parent + api.parent :title => @page.parent.title + end + api.text @content.text + api.version @content.version + api.author(:id => @content.author_id, :name => @content.author.name) + api.comments @content.comments + api.created_on @page.created_on + api.updated_on @content.updated_on + + api.array :attachments do + @page.attachments.each do |attachment| + render_api_attachment(attachment, api) + end + end if include_in_api_response?('attachments') +end diff --git a/app/views/wiki/show.html.erb b/app/views/wiki/show.html.erb index 1c90103..b0f8503 100644 --- a/app/views/wiki/show.html.erb +++ b/app/views/wiki/show.html.erb @@ -1,30 +1,20 @@
    - +<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> +<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project), :remote => true, :class => 'icon icon-add' %> +<% end %> <% if @editable %> <% if @content.current_version? %> <%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %> <%= watcher_link(@page, User.current) %> + <%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %> + <%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %> + <%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') %> + <%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :id => @page.title}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') %> +<% else %> + <%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :id => @page.title, :version => @content.version }, :class => 'icon icon-cancel') %> <% end %> <% end %> - - <%= actions_dropdown do %> - <%= link_to_if_authorized(l(:label_history), {:action => 'history', :id => @page.title}, :class => 'icon icon-history') %> - - <% if @editable %> - <% if @content.current_version? %> - <%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %> - <%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %> - <%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') %> - <%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :id => @page.title}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') %> - <% else %> - <%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :id => @page.title, :version => @content.version }, :class => 'icon icon-cancel') %> - <% end %> - <% end %> - - <% if User.current.allowed_to?(:edit_wiki_pages, @project) %> - <%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project, :parent => @page.title), :remote => true, :class => 'icon icon-add' %> - <% end %> - <% end %> +<%= link_to_if_authorized(l(:label_history), {:action => 'history', :id => @page.title}, :class => 'icon icon-history') %>
    <%= wiki_page_breadcrumb(@page) %> @@ -32,25 +22,20 @@ <% unless @content.current_version? %> <%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], [l(:label_history), history_project_wiki_page_path(@page.project, @page.title)], - "#{l(:label_revision)} #{@content.version}" %> + "#{l(:label_version)} #{@content.version}" %>

    - <% if @content.previous %> - <%= link_to ("\xc2\xab " + l(:label_previous)), + <%= link_to(("\xc2\xab " + l(:label_previous)), :action => 'show', :id => @page.title, :project_id => @page.project, - :version => @content.previous.version %> | - <% end %> - <%= "#{l(:label_revision)} #{@content.version}/#{@page.content.version}" %> - <% if @content.previous %> - (<%= link_to l(:label_diff), :controller => 'wiki', :action => 'diff', + :version => @content.previous.version) + " - " if @content.previous %> + <%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %> + <%= '('.html_safe + link_to(l(:label_diff), :controller => 'wiki', :action => 'diff', :id => @page.title, :project_id => @page.project, - :version => @content.version %>) - <% end %> - <% if @content.next %> - | <%= link_to (l(:label_next) + " \xc2\xbb"), :action => 'show', + :version => @content.version) + ')'.html_safe if @content.previous %> - + <%= link_to((l(:label_next) + " \xc2\xbb"), :action => 'show', :id => @page.title, :project_id => @page.project, - :version => @content.next.version %> - <% end %> + :version => @content.next.version) + " - " if @content.next %> + <%= link_to(l(:label_current_version), :action => 'show', :id => @page.title, :project_id => @page.project, :version => nil) %>
    <%= @content.author ? link_to_user(@content.author) : l(:label_user_anonymous) %>, <%= format_time(@content.updated_on) %>
    @@ -63,7 +48,7 @@ <% if @page.attachments.length > 0 || (@editable && authorize_for('wiki', 'add_attachment')) %>

    - <%= l(:label_attachment_plural) %> (<%= @page.attachments.length %>) + <%= l(:label_attachment_plural) %> (<%= @page.attachments.length %>)
    <%= link_to_attachments @page, :thumbnails => true %> @@ -84,16 +69,6 @@
    <% end %> -

    - <% if User.current.allowed_to?(:view_wiki_edits, @project) %> - <%= wiki_content_update_info(@content) %> - · <%= link_to l(:label_x_revisions, :count => @content.version), {:action => 'history', :id => @page.title} %> - <% end %> - <% if @page.protected? %> - <%= l('status_locked') %> - <% end %> -

    - <% other_formats_links do |f| %> <%= f.link_to 'PDF', :url => {:id => @page.title, :version => params[:version]} %> <%= f.link_to 'HTML', :url => {:id => @page.title, :version => params[:version]} %> @@ -104,8 +79,4 @@ <%= render :partial => 'sidebar' %> <% end %> -<% content_for :header_tags do %> - <%= robot_exclusion_tag unless @content.current_version? %> -<% end %> - <% html_title @page.pretty_title %> diff --git a/app/views/wiki/show.pdf.erb b/app/views/wiki/show.pdf.erb new file mode 100644 index 0000000..b1f738d --- /dev/null +++ b/app/views/wiki/show.pdf.erb @@ -0,0 +1 @@ +<%= raw wiki_page_to_pdf(@page, @project) %> \ No newline at end of file diff --git a/app/views/wikis/destroy.html.erb b/app/views/wikis/destroy.html.erb new file mode 100644 index 0000000..5afb676 --- /dev/null +++ b/app/views/wikis/destroy.html.erb @@ -0,0 +1,11 @@ +

    <%=l(:label_confirmation)%>

    + +
    +

    <%= @project.name %>
    <%=l(:text_wiki_destroy_confirmation)%>

    +
    + +<%= form_tag({:controller => 'wikis', :action => 'destroy', :id => @project}) do %> + <%= hidden_field_tag "confirm", 1 %> + <%= submit_tag l(:button_delete) %> + <%= link_to l(:button_cancel), settings_project_path(@project, :tab => 'wiki') %> +<% end %> diff --git a/app/views/wikis/edit.js.erb b/app/views/wikis/edit.js.erb new file mode 100644 index 0000000..2c765d1 --- /dev/null +++ b/app/views/wikis/edit.js.erb @@ -0,0 +1 @@ +$('#tab-content-wiki').html('<%= escape_javascript(render :partial => 'projects/settings/wiki') %>'); diff --git a/app/views/workflows/_action_menu.html.erb b/app/views/workflows/_action_menu.html.erb new file mode 100644 index 0000000..6961b27 --- /dev/null +++ b/app/views/workflows/_action_menu.html.erb @@ -0,0 +1,4 @@ +
    +<%= link_to l(:button_copy), {:action => 'copy'}, :class => 'icon icon-copy' %> +<%= link_to l(:field_summary), {:action => 'index'}, :class => 'icon icon-summary' %> +
    diff --git a/app/views/workflows/_form.html.erb b/app/views/workflows/_form.html.erb new file mode 100644 index 0000000..958c1e4 --- /dev/null +++ b/app/views/workflows/_form.html.erb @@ -0,0 +1,49 @@ + + + + + + + + + <% for new_status in @statuses %> + + <% end %> + + + + <% for old_status in [nil] + @statuses %> + <% next if old_status.nil? && name != 'always' %> + + + <% for new_status in @statuses -%> + <% checked = workflows.detect {|w| w.old_status == old_status && w.new_status == new_status} %> + + <% end -%> + + <% end %> + +
    + <%= link_to_function('', "toggleCheckboxesBySelector('table.transitions-#{name} input[type=checkbox]')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%=l(:label_current_status)%> + <%=l(:label_new_statuses_allowed)%>
    + <%= link_to_function('', "toggleCheckboxesBySelector('table.transitions-#{name} input[type=checkbox].new-status-#{new_status.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= new_status.name %> +
    + <%= link_to_function('', "toggleCheckboxesBySelector('table.transitions-#{name} input[type=checkbox].old-status-#{old_status.try(:id) || 0}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <% if old_status %> + <% old_status_name = old_status.name %> + <%= old_status_name %> + <% else %> + <% old_status_name = l(:label_issue_new) %> + <%= content_tag('em', old_status_name) %> + <% end %> + + <%= transition_tag workflows, old_status, new_status, name %> +
    diff --git a/app/views/workflows/copy.html.erb b/app/views/workflows/copy.html.erb new file mode 100644 index 0000000..78997ca --- /dev/null +++ b/app/views/workflows/copy.html.erb @@ -0,0 +1,38 @@ +<%= title [l(:label_workflow), workflows_edit_path], l(:button_copy) %> + +<%= form_tag({}, :id => 'workflow_copy_form') do %> +
    +<%= l(:label_copy_source) %> +

    + + <%= select_tag('source_tracker_id', + content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '') + + content_tag('option', "--- #{ l(:label_copy_same_as_target) } ---", :value => 'any') + + options_from_collection_for_select(@trackers, 'id', 'name', @source_tracker && @source_tracker.id)) %> +

    +

    + + <%= select_tag('source_role_id', + content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '') + + content_tag('option', "--- #{ l(:label_copy_same_as_target) } ---", :value => 'any') + + options_from_collection_for_select(@roles, 'id', 'name', @source_role && @source_role.id)) %> +

    +
    + +
    +<%= l(:label_copy_target) %> +

    + + <%= select_tag 'target_tracker_ids', + content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '', :disabled => true) + + options_from_collection_for_select(@trackers, 'id', 'name', @target_trackers && @target_trackers.map(&:id)), :multiple => true %> +

    +

    + + <%= select_tag 'target_role_ids', + content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '', :disabled => true) + + options_from_collection_for_select(@roles, 'id', 'name', @target_roles && @target_roles.map(&:id)), :multiple => true %> +

    +
    +<%= submit_tag l(:button_copy) %> +<% end %> diff --git a/app/views/workflows/edit.html.erb b/app/views/workflows/edit.html.erb new file mode 100644 index 0000000..3eac0a3 --- /dev/null +++ b/app/views/workflows/edit.html.erb @@ -0,0 +1,75 @@ +<%= render :partial => 'action_menu' %> + +<%= title l(:label_workflow) %> + +
    +
      +
    • <%= link_to l(:label_status_transitions), workflows_edit_path(:role_id => @roles, :tracker_id => @trackers), :class => 'selected' %>
    • +
    • <%= link_to l(:label_fields_permissions), workflows_permissions_path(:role_id => @roles, :tracker_id => @trackers) %>
    • +
    +
    + +

    <%=l(:text_workflow_edit)%>:

    + +<%= form_tag({}, :method => 'get') do %> +

    + + + + + + + <%= submit_tag l(:button_edit), :name => nil %> + + <%= hidden_field_tag 'used_statuses_only', '0', :id => nil %> + + +

    +<% end %> + +<% if @trackers && @roles && @statuses.any? %> + <%= form_tag({}, :id => 'workflow_form' ) do %> + <%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id, :id => nil}.join.html_safe %> + <%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id, :id => nil}.join.html_safe %> + <%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only], :id => nil %> +
    + <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %> + +
    + <%= l(:label_additional_workflow_transitions_for_author) %> +
    + <%= render :partial => 'form', :locals => {:name => 'author', :workflows => @workflows['author']} %> +
    +
    + <%= javascript_tag "hideFieldset($('#author_workflows'))" unless @workflows['author'].present? %> + +
    + <%= l(:label_additional_workflow_transitions_for_assignee) %> +
    + <%= render :partial => 'form', :locals => {:name => 'assignee', :workflows => @workflows['assignee']} %> +
    +
    + <%= javascript_tag "hideFieldset($('#assignee_workflows'))" unless @workflows['assignee'].present? %> +
    + <%= submit_tag l(:button_save) %> + <% end %> +<% end %> + +<%= javascript_tag do %> +$("a[data-expands]").click(function(e){ + e.preventDefault(); + var target = $($(this).attr("data-expands")); + if (target.attr("multiple")) { + target.attr("multiple", false); + target.find("option[value=all]").show(); + } else { + target.attr("multiple", true); + target.find("option[value=all]").attr("selected", false).hide(); + } +}); + +<% end %> diff --git a/app/views/workflows/index.html.erb b/app/views/workflows/index.html.erb new file mode 100644 index 0000000..66785a4 --- /dev/null +++ b/app/views/workflows/index.html.erb @@ -0,0 +1,35 @@ +<%= title [l(:label_workflow), workflows_edit_path], l(:field_summary) %> + +<% if @roles.empty? || @trackers.empty? %> +

    <%= l(:label_no_data) %>

    +<% else %> +
    + + + + + <% @roles.each do |role| %> + + <% end %> + + + +<% @trackers.each do |tracker| -%> + + + <% @roles.each do |role| -%> + <% count = @workflow_counts[[tracker.id, role.id]] || 0 %> + + <% end -%> + +<% end -%> + +
    + <%= content_tag(role.builtin? ? 'em' : 'span', role.name) %> +
    <%= tracker.name %> + <%= link_to((count > 0 ? count : content_tag(:span, nil, :class => 'icon-only icon-not-ok')), + {:action => 'edit', :role_id => role, :tracker_id => tracker}, + :title => l(:button_edit)) %> +
    +
    +<% end %> diff --git a/app/views/workflows/permissions.html.erb b/app/views/workflows/permissions.html.erb new file mode 100644 index 0000000..3a47560 --- /dev/null +++ b/app/views/workflows/permissions.html.erb @@ -0,0 +1,123 @@ +<%= render :partial => 'action_menu' %> + +<%= title l(:label_workflow) %> + +
    +
      +
    • <%= link_to l(:label_status_transitions), workflows_edit_path(:role_id => @roles, :tracker_id => @trackers) %>
    • +
    • <%= link_to l(:label_fields_permissions), workflows_permissions_path(:role_id => @roles, :tracker_id => @trackers), :class => 'selected' %>
    • +
    +
    + +

    <%=l(:text_workflow_edit)%>:

    + +<%= form_tag({}, :method => 'get') do %> +

    + + + + + + + <%= submit_tag l(:button_edit), :name => nil %> + + <%= hidden_field_tag 'used_statuses_only', '0', :id => nil %> + +

    +<% end %> + +<% if @trackers && @roles && @statuses.any? %> + <%= form_tag({}, :id => 'workflow_form' ) do %> + <%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id, :id => nil}.join.html_safe %> + <%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id, :id => nil}.join.html_safe %> + <%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only], :id => nil %> +
    + + + + + + + + + <% for status in @statuses %> + + <% end %> + + + + + + + <% @fields.each do |field, name| %> + + + <% for status in @statuses -%> + + <% end -%> + + <% end %> + <% if @custom_fields.any? %> + + + + <% @custom_fields.each do |field| %> + + + <% for status in @statuses -%> + + <% end -%> + + <% end %> + <% end %> + +
    + <%=l(:label_issue_status)%>
    + <%= status.name %> +
    +   + <%= l(:field_core_fields) %> +
    + <%= name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> + + <%= field_permission_tag(@permissions, status, field, @roles) %> + <% unless status == @statuses.last %>»<% end %> +
    +   + <%= l(:label_custom_field_plural) %> +
    + <%= field.name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> + + <%= field_permission_tag(@permissions, status, field, @roles) %> + <% unless status == @statuses.last %>»<% end %> +
    +
    + <%= submit_tag l(:button_save) %> + <% end %> +<% end %> + +<%= javascript_tag do %> +$("a.repeat-value").click(function(e){ + e.preventDefault(); + var td = $(this).closest('td'); + var selected = td.find("select").find(":selected").val(); + td.nextAll('td').find("select").val(selected); +}); + +$("a[data-expands]").click(function(e){ + e.preventDefault(); + var target = $($(this).attr("data-expands")); + if (target.attr("multiple")) { + target.attr("multiple", false); + target.find("option[value=all]").show(); + } else { + target.attr("multiple", true); + target.find("option[value=all]").attr("selected", false).hide(); + } +}); + +<% end %> diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..d5ea687 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,37 @@ +# Redmine runs tests on own continuous integration server. +# http://www.redmine.org/projects/redmine/wiki/Continuous_integration +# You can also run tests on your environment. + +install: + - SET PATH=C:\Ruby%ruby_version%\bin;%PATH% + - ruby --version + - gem --version + - git --version + - hg --version + - chcp + +build: off + +test_script: + - bundle install --without rmagick + - set SCMS=mercurial + - set RUN_ON_NOT_OFFICIAL= + - set RUBY_VER=1.9 + - set BRANCH=trunk + - bundle exec rake config/database.yml + - bundle install + - bundle exec rake ci:setup + - bundle exec rake test + +environment: + global: + RAILS_ENV: test + DATABASE_ADAPTER: sqlite3 + matrix: + - ruby_version: "193" + - ruby_version: "200" + - ruby_version: "200-x64" + - ruby_version: "21" + - ruby_version: "21-x64" + - ruby_version: "22" + - ruby_version: "22-x64" diff --git a/bin/about b/bin/about new file mode 100755 index 0000000..cfec3b4 --- /dev/null +++ b/bin/about @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby + +ENV["RAILS_ENV"] ||= "production" +require File.expand_path(File.dirname(__FILE__) + "/../config/environment") +puts +puts Redmine::Info.environment diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000..66e9889 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000..728cd85 --- /dev/null +++ b/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../../config/application', __FILE__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000..1724048 --- /dev/null +++ b/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..2a89752 --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run RedmineApp::Application diff --git a/config/additional_environment.rb.example b/config/additional_environment.rb.example new file mode 100644 index 0000000..2a317a3 --- /dev/null +++ b/config/additional_environment.rb.example @@ -0,0 +1,10 @@ +# Copy this file to additional_environment.rb and add any statements +# that need to be passed to the Rails::Initializer. `config` is +# available in this context. +# +# Example: +# +# config.log_level = :debug +# ... +# + diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000..e1a416a --- /dev/null +++ b/config/application.rb @@ -0,0 +1,83 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +Bundler.require(*Rails.groups) + +module RedmineApp + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + config.autoload_paths += %W(#{config.root}/lib) + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + config.active_record.store_full_sti_class = true + config.active_record.default_timezone = :local + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + I18n.enforce_available_locales = true + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + + # Enable the asset pipeline + config.assets.enabled = false + + # Version of your assets, change this if you want to expire all your assets + config.assets.version = '1.0' + + config.action_mailer.perform_deliveries = false + + # Do not include all helpers + config.action_controller.include_all_helpers = false + + # Do not suppress errors in after_rollback and after_commit callbacks + config.active_record.raise_in_transactional_callbacks = true + + # XML parameter parser removed from core in Rails 4.0 + # and extracted to actionpack-xml_parser gem + config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser + + # Sets the Content-Length header on responses with fixed-length bodies + config.middleware.insert_after Rack::Sendfile, Rack::ContentLength + + # Verify validity of user sessions + config.redmine_verify_sessions = true + + # Specific cache for search results, the default file store cache is not + # a good option as it could grow fast. A memory store (32MB max) is used + # as the default. If you're running multiple server processes, it's + # recommended to switch to a shared cache store (eg. mem_cache_store). + # See http://guides.rubyonrails.org/caching_with_rails.html#cache-stores + # for more options (same options as config.cache_store). + config.redmine_search_cache_store = :memory_store + + # Configure log level here so that additional environment file + # can change it (environments/ENV.rb would take precedence over it) + config.log_level = Rails.env.production? ? :info : :debug + + config.session_store :cookie_store, + :key => '_redmine_session', + :path => config.relative_url_root || '/' + + if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb')) + instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb')) + end + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000..3596736 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) diff --git a/config/configuration.yml.example b/config/configuration.yml.example new file mode 100644 index 0000000..3522ef6 --- /dev/null +++ b/config/configuration.yml.example @@ -0,0 +1,221 @@ +# = Redmine configuration file +# +# Each environment has it's own configuration options. If you are only +# running in production, only the production block needs to be configured. +# Environment specific configuration options override the default ones. +# +# Note that this file needs to be a valid YAML file. +# DO NOT USE TABS! Use 2 spaces instead of tabs for identation. + +# default configuration options for all environments +default: + # Outgoing emails configuration + # See the examples below and the Rails guide for more configuration options: + # http://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration + email_delivery: + + # ==== Simple SMTP server at localhost + # + # email_delivery: + # delivery_method: :smtp + # smtp_settings: + # address: "localhost" + # port: 25 + # + # ==== SMTP server at example.com using LOGIN authentication and checking HELO for foo.com + # + # email_delivery: + # delivery_method: :smtp + # smtp_settings: + # address: "example.com" + # port: 25 + # authentication: :login + # domain: 'foo.com' + # user_name: 'myaccount' + # password: 'password' + # + # ==== SMTP server at example.com using PLAIN authentication + # + # email_delivery: + # delivery_method: :smtp + # smtp_settings: + # address: "example.com" + # port: 25 + # authentication: :plain + # domain: 'example.com' + # user_name: 'myaccount' + # password: 'password' + # + # ==== SMTP server at using TLS (GMail) + # This might require some additional configuration. See the guides at: + # http://www.redmine.org/projects/redmine/wiki/EmailConfiguration + # + # email_delivery: + # delivery_method: :smtp + # smtp_settings: + # enable_starttls_auto: true + # address: "smtp.gmail.com" + # port: 587 + # domain: "smtp.gmail.com" # 'your.domain.com' for GoogleApps + # authentication: :plain + # user_name: "your_email@gmail.com" + # password: "your_password" + # + # ==== Sendmail command + # + # email_delivery: + # delivery_method: :sendmail + + # Absolute path to the directory where attachments are stored. + # The default is the 'files' directory in your Redmine instance. + # Your Redmine instance needs to have write permission on this + # directory. + # Examples: + # attachments_storage_path: /var/redmine/files + # attachments_storage_path: D:/redmine/files + attachments_storage_path: + + # Configuration of the autologin cookie. + # autologin_cookie_name: the name of the cookie (default: autologin) + # autologin_cookie_path: the cookie path (default: /) + # autologin_cookie_secure: true sets the cookie secure flag (default: false) + autologin_cookie_name: + autologin_cookie_path: + autologin_cookie_secure: + + # Configuration of SCM executable command. + # + # Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe) + # On Windows + CRuby, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work. + # + # On Windows + JRuby 1.6.2, path which contains spaces does not work. + # For example, "C:\Program Files\TortoiseHg\hg.exe". + # If you want to this feature, you need to install to the path which does not contains spaces. + # For example, "C:\TortoiseHg\hg.exe". + # + # Examples: + # scm_subversion_command: svn # (default: svn) + # scm_mercurial_command: C:\Program Files\TortoiseHg\hg.exe # (default: hg) + # scm_git_command: /usr/local/bin/git # (default: git) + # scm_cvs_command: cvs # (default: cvs) + # scm_bazaar_command: bzr.exe # (default: bzr) + # scm_darcs_command: darcs-1.0.9-i386-linux # (default: darcs) + # + scm_subversion_command: + scm_mercurial_command: + scm_git_command: + scm_cvs_command: + scm_bazaar_command: + scm_darcs_command: + + # SCM paths validation. + # + # You can configure a regular expression for each SCM that will be used to + # validate the path of new repositories (eg. path entered by users with the + # "Manage repositories" permission and path returned by reposman.rb). + # The regexp will be wrapped with \A \z, so it must match the whole path. + # And the regexp is case sensitive. + # + # You can match the project identifier by using %project% in the regexp. + # + # You can also set a custom hint message for each SCM that will be displayed + # on the repository form instead of the default one. + # + # Examples: + # scm_subversion_path_regexp: file:///svnpath/[a-z0-9_]+ + # scm_subversion_path_info: SVN URL (eg. file:///svnpath/foo) + # + # scm_git_path_regexp: /gitpath/%project%(\.[a-z0-9_])?/ + # + scm_subversion_path_regexp: + scm_mercurial_path_regexp: + scm_git_path_regexp: + scm_cvs_path_regexp: + scm_bazaar_path_regexp: + scm_darcs_path_regexp: + scm_filesystem_path_regexp: + + # Absolute path to the SCM commands errors (stderr) log file. + # The default is to log in the 'log' directory of your Redmine instance. + # Example: + # scm_stderr_log_file: /var/log/redmine_scm_stderr.log + scm_stderr_log_file: + + # Key used to encrypt sensitive data in the database (SCM and LDAP passwords). + # If you don't want to enable data encryption, just leave it blank. + # WARNING: losing/changing this key will make encrypted data unreadable. + # + # If you want to encrypt existing passwords in your database: + # * set the cipher key here in your configuration file + # * encrypt data using 'rake db:encrypt RAILS_ENV=production' + # + # If you have encrypted data and want to change this key, you have to: + # * decrypt data using 'rake db:decrypt RAILS_ENV=production' first + # * change the cipher key here in your configuration file + # * encrypt data using 'rake db:encrypt RAILS_ENV=production' + database_cipher_key: + + # Set this to false to disable plugins' assets mirroring on startup. + # You can use `rake redmine:plugins:assets` to manually mirror assets + # to public/plugin_assets when you install/upgrade a Redmine plugin. + # + #mirror_plugins_assets_on_startup: false + + # Your secret key for verifying cookie session data integrity. If you + # change this key, all old sessions will become invalid! Make sure the + # secret is at least 30 characters and all random, no regular words or + # you'll be exposed to dictionary attacks. + # + # If you have a load-balancing Redmine cluster, you have to use the + # same secret token on each machine. + #secret_token: 'change it to a long random string' + + # Requires users to re-enter their password for sensitive actions (editing + # of account data, project memberships, application settings, user, group, + # role, auth source management and project deletion). Disabled by default. + # Timeout is set in minutes. + # + #sudo_mode: true + #sudo_mode_timeout: 15 + + # Absolute path (e.g. /usr/bin/convert, c:/im/convert.exe) to + # the ImageMagick's `convert` binary. Used to generate attachment thumbnails. + #imagemagick_convert_command: + + # Configuration of RMagick font. + # + # Redmine uses RMagick in order to export gantt png. + # You don't need this setting if you don't install RMagick. + # + # In CJK (Chinese, Japanese and Korean), + # in order to show CJK characters correctly, + # you need to set this configuration. + # + # Because there is no standard font across platforms in CJK, + # you need to set a font installed in your server. + # + # This setting is not necessary in non CJK. + # + # Examples for Japanese: + # Windows: + # rmagick_font_path: C:\windows\fonts\msgothic.ttc + # Linux: + # rmagick_font_path: /usr/share/fonts/ipa-mincho/ipam.ttf + # + rmagick_font_path: + + # Maximum number of simultaneous AJAX uploads + #max_concurrent_ajax_uploads: 2 + + # Configure OpenIdAuthentication.store + # + # allowed values: :memory, :file, :memcache + #openid_authentication_store: :memory + +# specific configuration options for production environment +# that overrides the default ones +production: + +# specific configuration options for development environment +# that overrides the default ones +development: diff --git a/config/database.yml.example b/config/database.yml.example new file mode 100644 index 0000000..57bc516 --- /dev/null +++ b/config/database.yml.example @@ -0,0 +1,51 @@ +# Default setup is given for MySQL with ruby1.9. +# Examples for PostgreSQL, SQLite3 and SQL Server can be found at the end. +# Line indentation must be 2 spaces (no tabs). + +production: + adapter: mysql2 + database: redmine + host: localhost + username: root + password: "" + encoding: utf8 + +development: + adapter: mysql2 + database: redmine_development + host: localhost + username: root + password: "" + encoding: utf8 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + adapter: mysql2 + database: redmine_test + host: localhost + username: root + password: "" + encoding: utf8 + +# PostgreSQL configuration example +#production: +# adapter: postgresql +# database: redmine +# host: localhost +# username: postgres +# password: "postgres" + +# SQLite3 configuration example +#production: +# adapter: sqlite3 +# database: db/redmine.sqlite3 + +# SQL Server configuration example +#production: +# adapter: sqlserver +# database: redmine +# host: localhost +# username: jenkins +# password: jenkins diff --git a/config/database.yml.sample b/config/database.yml.sample deleted file mode 100644 index ad5a2d0..0000000 --- a/config/database.yml.sample +++ /dev/null @@ -1,7 +0,0 @@ -production: - adapter: mysql2 - database: suitepro - host: db - username: suitepro - password: "" - encoding: utf8mb4 diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000..705e4ec --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,14 @@ +# Load the Rails application +require File.expand_path('../application', __FILE__) + +# Make sure there's no plugin in vendor/plugin before starting +vendor_plugins_dir = File.join(Rails.root, "vendor", "plugins") +if Dir.glob(File.join(vendor_plugins_dir, "*")).any? + $stderr.puts "Plugins in vendor/plugins (#{vendor_plugins_dir}) are no longer allowed. " + + "Please, put your Redmine plugins in the `plugins` directory at the root of your " + + "Redmine directory (#{File.join(Rails.root, "plugins")})" + exit 1 +end + +# Initialize the Rails application +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000..f7b15e1 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,21 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the webserver when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Disable delivery errors + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to stderr and the Rails logger. + config.active_support.deprecation = [:stderr, :log] +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000..85cd389 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,25 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Disable delivery errors + config.action_mailer.raise_delivery_errors = false + + # No email in production log + config.action_mailer.logger = nil + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000..645996d --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,38 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + config.action_mailer.perform_deliveries = true + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Disable sessions verifications in test environment. + config.redmine_verify_sessions = false + + # Print deprecation notices to stderr and the Rails logger. + config.active_support.deprecation = [:stderr, :log] + + config.secret_key_base = 'a secret token for running the tests' + + config.active_support.test_order = :random +end diff --git a/config/environments/test_pgsql.rb b/config/environments/test_pgsql.rb new file mode 100644 index 0000000..258914d --- /dev/null +++ b/config/environments/test_pgsql.rb @@ -0,0 +1,2 @@ +# Same as test.rb +instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb')) diff --git a/config/environments/test_sqlite3.rb b/config/environments/test_sqlite3.rb new file mode 100644 index 0000000..258914d --- /dev/null +++ b/config/environments/test_sqlite3.rb @@ -0,0 +1,2 @@ +# Same as test.rb +instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb')) diff --git a/config/initializers/00-core_plugins.rb b/config/initializers/00-core_plugins.rb new file mode 100644 index 0000000..95c7f3f --- /dev/null +++ b/config/initializers/00-core_plugins.rb @@ -0,0 +1,15 @@ +# Loads the core plugins located in lib/plugins +Dir.glob(File.join(Rails.root, "lib/plugins/*")).sort.each do |directory| + if File.directory?(directory) + lib = File.join(directory, "lib") + if File.directory?(lib) + $:.unshift lib + ActiveSupport::Dependencies.autoload_paths += [lib] + end + initializer = File.join(directory, "init.rb") + if File.file?(initializer) + config = RedmineApp::Application.config + eval(File.read(initializer), binding, initializer) + end + end +end diff --git a/config/initializers/10-patches.rb b/config/initializers/10-patches.rb new file mode 100644 index 0000000..2693f83 --- /dev/null +++ b/config/initializers/10-patches.rb @@ -0,0 +1,240 @@ +require 'active_record' + +module ActiveRecord + class Base + include Redmine::I18n + # Translate attribute names for validation errors display + def self.human_attribute_name(attr, options = {}) + prepared_attr = attr.to_s.sub(/_id$/, '').sub(/^.+\./, '') + class_prefix = name.underscore.gsub('/', '_') + + redmine_default = [ + :"field_#{class_prefix}_#{prepared_attr}", + :"field_#{prepared_attr}" + ] + + options[:default] = redmine_default + Array(options[:default]) + + super + end + end + + # Undefines private Kernel#open method to allow using `open` scopes in models. + # See Defect #11545 (http://www.redmine.org/issues/11545) for details. + class Base + class << self + undef open + end + end + class Relation ; undef open ; end +end + +module ActionView + module Helpers + module DateHelper + # distance_of_time_in_words breaks when difference is greater than 30 years + def distance_of_date_in_words(from_date, to_date = 0, options = {}) + from_date = from_date.to_date if from_date.respond_to?(:to_date) + to_date = to_date.to_date if to_date.respond_to?(:to_date) + distance_in_days = (to_date - from_date).abs + + I18n.with_options :locale => options[:locale], :scope => :'datetime.distance_in_words' do |locale| + case distance_in_days + when 0..60 then locale.t :x_days, :count => distance_in_days.round + when 61..720 then locale.t :about_x_months, :count => (distance_in_days / 30).round + else locale.t :over_x_years, :count => (distance_in_days / 365).floor + end + end + end + end + end + + class Resolver + def find_all(name, prefix=nil, partial=false, details={}, key=nil, locals=[]) + cached(key, [name, prefix, partial], details, locals) do + if (details[:formats] & [:xml, :json]).any? + details = details.dup + details[:formats] = details[:formats].dup + [:api] + end + find_templates(name, prefix, partial, details) + end + end + end +end + +ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| html_tag || ''.html_safe } + +# HTML5: is invalid, use instead +module ActionView + module Helpers + module Tags + class Base + private + alias :add_options_without_non_empty_blank_option :add_options + def add_options(option_tags, options, value = nil) + if options[:include_blank] == true + options = options.dup + options[:include_blank] = ' '.html_safe + end + add_options_without_non_empty_blank_option(option_tags, options, value) + end + end + end + + module FormTagHelper + alias :select_tag_without_non_empty_blank_option :select_tag + def select_tag(name, option_tags = nil, options = {}) + if options.delete(:include_blank) + options[:prompt] = ' '.html_safe + end + select_tag_without_non_empty_blank_option(name, option_tags, options) + end + end + + module FormOptionsHelper + alias :options_for_select_without_non_empty_blank_option :options_for_select + def options_for_select(container, selected = nil) + if container.is_a?(Array) + container = container.map {|element| element.blank? ? [" ".html_safe, ""] : element} + end + options_for_select_without_non_empty_blank_option(container, selected) + end + end + end +end + +require 'mail' + +module DeliveryMethods + class AsyncSMTP < ::Mail::SMTP + def deliver!(*args) + Thread.start do + super *args + end + end + end + + class AsyncSendmail < ::Mail::Sendmail + def deliver!(*args) + Thread.start do + super *args + end + end + end + + class TmpFile + def initialize(*args); end + + def deliver!(mail) + dest_dir = File.join(Rails.root, 'tmp', 'emails') + Dir.mkdir(dest_dir) unless File.directory?(dest_dir) + File.open(File.join(dest_dir, mail.message_id.gsub(/[<>]/, '') + '.eml'), 'wb') {|f| f.write(mail.encoded) } + end + end +end + +ActionMailer::Base.add_delivery_method :async_smtp, DeliveryMethods::AsyncSMTP +ActionMailer::Base.add_delivery_method :async_sendmail, DeliveryMethods::AsyncSendmail +ActionMailer::Base.add_delivery_method :tmp_file, DeliveryMethods::TmpFile + +# Changes how sent emails are logged +# Rails doesn't log cc and bcc which is misleading when using bcc only (#12090) +module ActionMailer + class LogSubscriber < ActiveSupport::LogSubscriber + def deliver(event) + recipients = [:to, :cc, :bcc].inject("") do |s, header| + r = Array.wrap(event.payload[header]) + if r.any? + s << "\n #{header}: #{r.join(', ')}" + end + s + end + info("\nSent email \"#{event.payload[:subject]}\" (%1.fms)#{recipients}" % event.duration) + debug(event.payload[:mail]) + end + end +end + +# #deliver is deprecated in Rails 4.2 +# Prevents massive deprecation warnings +module ActionMailer + class MessageDelivery < Delegator + def deliver + deliver_now + end + end +end + +module ActionController + module MimeResponds + class Collector + def api(&block) + any(:xml, :json, &block) + end + end + end +end + +module ActionController + class Base + # Displays an explicit message instead of a NoMethodError exception + # when trying to start Redmine with an old session_store.rb + # TODO: remove it in a later version + def self.session=(*args) + $stderr.puts "Please remove config/initializers/session_store.rb and run `rake generate_secret_token`.\n" + + "Setting the session secret with ActionController.session= is no longer supported." + exit 1 + end + end +end + +# Adds asset_id parameters to assets like Rails 3 to invalidate caches in browser +module ActionView + module Helpers + module AssetUrlHelper + @@cache_asset_timestamps = Rails.env.production? + @@asset_timestamps_cache = {} + @@asset_timestamps_cache_guard = Mutex.new + + def asset_path_with_asset_id(source, options = {}) + asset_id = rails_asset_id(source, options) + unless asset_id.blank? + source += "?#{asset_id}" + end + asset_path(source, options) + end + alias :path_to_asset :asset_path_with_asset_id + + def rails_asset_id(source, options = {}) + if asset_id = ENV["RAILS_ASSET_ID"] + asset_id + else + if @@cache_asset_timestamps && (asset_id = @@asset_timestamps_cache[source]) + asset_id + else + extname = compute_asset_extname(source, options) + path = File.join(Rails.public_path, "#{source}#{extname}") + exist = false + if File.exist? path + exist = true + else + path = File.join(Rails.public_path, compute_asset_path("#{source}#{extname}", options)) + if File.exist? path + exist = true + end + end + asset_id = exist ? File.mtime(path).to_i.to_s : '' + + if @@cache_asset_timestamps + @@asset_timestamps_cache_guard.synchronize do + @@asset_timestamps_cache[source] = asset_id + end + end + + asset_id + end + end + end + end + end +end \ No newline at end of file diff --git a/config/initializers/20-mime_types.rb b/config/initializers/20-mime_types.rb new file mode 100644 index 0000000..cfd35a3 --- /dev/null +++ b/config/initializers/20-mime_types.rb @@ -0,0 +1,4 @@ +# Add new mime types for use in respond_to blocks: + +Mime::SET << Mime::CSV unless Mime::SET.include?(Mime::CSV) + diff --git a/config/initializers/30-redmine.rb b/config/initializers/30-redmine.rb new file mode 100644 index 0000000..698c94e --- /dev/null +++ b/config/initializers/30-redmine.rb @@ -0,0 +1,30 @@ +I18n.default_locale = 'en' +I18n.backend = Redmine::I18n::Backend.new +# Forces I18n to load available locales from the backend +I18n.config.available_locales = nil + +require 'redmine' + +# Load the secret token from the Redmine configuration file +secret = Redmine::Configuration['secret_token'] +if secret.present? + RedmineApp::Application.config.secret_token = secret +end + +if Object.const_defined?(:OpenIdAuthentication) + openid_authentication_store = Redmine::Configuration['openid_authentication_store'] + OpenIdAuthentication.store = + openid_authentication_store.present? ? + openid_authentication_store : :memory +end + +Redmine::Plugin.load +unless Redmine::Configuration['mirror_plugins_assets_on_startup'] == false + Redmine::Plugin.mirror_assets +end + +Rails.application.config.to_prepare do + Redmine::FieldFormat::RecordList.subclasses.each do |klass| + klass.instance.reset_target_class + end +end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..890eede --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,11 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code. +# Rails.backtrace_cleaner.remove_silencers! + +# Do not remove plugins backtrace +Rails.backtrace_cleaner.remove_silencers! +Rails.backtrace_cleaner.add_silencer { |line| line !~ /^\/?(app|config|lib|plugins|test)/ } diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000..9e8b013 --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,10 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format +# (all these examples are active by default): +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end diff --git a/config/locales/ar.yml b/config/locales/ar.yml new file mode 100644 index 0000000..6b31412 --- /dev/null +++ b/config/locales/ar.yml @@ -0,0 +1,1230 @@ +ar: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: rtl + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%m/%d/%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [الاحد, الاثنين, الثلاثاء, الاربعاء, الخميس, الجمعة, السبت] + abbr_day_names: [أح, اث, ث, ار, خ, ج, س] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, كانون الثاني, شباط, آذار, نيسان, أيار, حزيران, تموز, آب, أيلول, تشرين الأول, تشرين الثاني, كانون الأول] + abbr_month_names: [~, كانون الثاني, شباط, آذار, نيسان, أيار, حزيران, تموز, آب, أيلول, تشرين الأول, تشرين الثاني, كانون الأول] + # Used in date_select and datime_select. + order: + - :السنة + - :الشهر + - :اليوم + + time: + formats: + default: "%m/%d/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "صباحا" + pm: "مساءاً" + + datetime: + distance_in_words: + half_a_minute: "نصف دقيقة" + less_than_x_seconds: + one: "أقل من ثانية" + other: "ثواني %{count}أقل من " + x_seconds: + one: "ثانية" + other: "%{count}ثواني " + less_than_x_minutes: + one: "أقل من دقيقة" + other: "دقائق%{count}أقل من " + x_minutes: + one: "دقيقة" + other: "%{count} دقائق" + about_x_hours: + one: "حوالي ساعة" + other: "ساعات %{count}حوالي " + x_hours: + one: "%{count} ساعة" + other: "%{count} ساعات" + x_days: + one: "يوم" + other: "%{count} أيام" + about_x_months: + one: "حوالي شهر" + other: "أشهر %{count} حوالي" + x_months: + one: "شهر" + other: "%{count} أشهر" + about_x_years: + one: "حوالي سنة" + other: "سنوات %{count}حوالي " + over_x_years: + one: "اكثر من سنة" + other: "سنوات %{count}أكثر من " + almost_x_years: + one: "تقريبا سنة" + other: "سنوات %{count} نقريبا" + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "و" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: " %{model} خطأ يمنع تخزين" + other: " %{model} يمنع تخزين%{count}خطأ رقم " + messages: + inclusion: "غير مدرجة على القائمة" + exclusion: "محجوز" + invalid: "غير صالح" + confirmation: "غير متطابق" + accepted: "مقبولة" + empty: "لا يمكن ان تكون فارغة" + blank: "لا يمكن ان تكون فارغة" + too_long: " %{count} طويلة جدا، الحد الاقصى هو " + too_short: " %{count} قصيرة جدا، الحد الادنى هو " + wrong_length: " %{count} خطأ في الطول، يجب ان يكون " + taken: "لقد اتخذت سابقا" + not_a_number: "ليس رقما" + not_a_date: "ليس تاريخا صالحا" + greater_than: "%{count}يجب ان تكون اكثر من " + greater_than_or_equal_to: "%{count} يجب ان تكون اكثر من او تساوي" + equal_to: "%{count}يجب ان تساوي" + less_than: " %{count}يجب ان تكون اقل من" + less_than_or_equal_to: " %{count} يجب ان تكون اقل من او تساوي" + odd: "must be odd" + even: "must be even" + greater_than_start_date: "يجب ان تكون اكثر من تاريخ البداية" + not_same_project: "لا ينتمي الى نفس المشروع" + circular_dependency: "هذه العلاقة سوف تخلق علاقة تبعية دائرية" + cant_link_an_issue_with_a_descendant: "لا يمكن ان تكون المشكلة مرتبطة بواحدة من المهام الفرعية" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: الرجاء التحديد + + general_text_No: 'لا' + general_text_Yes: 'نعم' + general_text_no: 'لا' + general_text_yes: 'نعم' + general_lang_name: 'Arabic (عربي)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: DejaVuSans + general_pdf_monospaced_fontname: DejaVuSansMono + general_first_day_of_week: '7' + + notice_account_updated: لقد تم تجديد الحساب بنجاح. + notice_account_invalid_credentials: اسم المستخدم او كلمة المرور غير صحيحة + notice_account_password_updated: لقد تم تجديد كلمة المرور بنجاح. + notice_account_wrong_password: كلمة المرور غير صحيحة + notice_account_register_done: لقد تم انشاء حسابك بنجاح، الرجاء تأكيد الطلب من البريد الالكتروني + notice_account_unknown_email: مستخدم غير معروف. + notice_can_t_change_password: هذا الحساب يستخدم جهاز خارجي غير مصرح به لا يمكن تغير كلمة المرور + notice_account_lost_email_sent: لقد تم ارسال رسالة على بريدك بالتعليمات اللازمة لتغير كلمة المرور + notice_account_activated: لقد تم تفعيل حسابك، يمكنك الدخول الان + notice_successful_create: لقد تم الانشاء بنجاح + notice_successful_update: لقد تم التحديث بنجاح + notice_successful_delete: لقد تم الحذف بنجاح + notice_successful_connection: لقد تم الربط بنجاح + notice_file_not_found: الصفحة التي تحاول الدخول اليها غير موجوده او تم حذفها + notice_locking_conflict: تم تحديث البيانات عن طريق مستخدم آخر. + notice_not_authorized: غير مصرح لك الدخول الى هذه المنطقة. + notice_not_authorized_archived_project: المشروع الذي تحاول الدخول اليه تم ارشفته + notice_email_sent: "%{value}تم ارسال رسالة الى " + notice_email_error: " (%{value})لقد حدث خطأ ما اثناء ارسال الرسالة الى " + notice_feeds_access_key_reseted: كلمة الدخول Atomلقد تم تعديل . + notice_api_access_key_reseted: كلمة الدخولAPIلقد تم تعديل . + notice_failed_to_save_issues: "فشل في حفظ الملف" + notice_failed_to_save_members: "فشل في حفظ الاعضاء: %{errors}." + notice_no_issue_selected: "لم يتم تحديد شيء، الرجاء تحديد المسألة التي تريد" + notice_account_pending: "لقد تم انشاء حسابك، الرجاء الانتظار حتى تتم الموافقة" + notice_default_data_loaded: تم تحميل التكوين الافتراضي بنجاح + notice_unable_delete_version: غير قادر على مسح النسخة. + notice_unable_delete_time_entry: غير قادر على مسح وقت الدخول. + notice_issue_done_ratios_updated: لقد تم تحديث النسب. + notice_gantt_chart_truncated: " (%{max})لقد تم اقتطاع الرسم البياني لانه تجاوز الاحد الاقصى لعدد العناصر المسموح عرضها " + notice_issue_successful_create: "%{id}لقد تم انشاء " + + + error_can_t_load_default_data: "لم يتم تحميل التكوين الافتراضي كاملا %{value}" + error_scm_not_found: "لم يتم العثور على ادخال في المستودع" + error_scm_command_failed: "حدث خطأ عند محاولة الوصول الى المستودع: %{value}" + error_scm_annotate: "الادخال غير موجود." + error_scm_annotate_big_text_file: "لا يمكن حفظ الادخال لانه تجاوز الحد الاقصى لحجم الملف." + error_issue_not_found_in_project: 'لم يتم العثور على المخرج او انه ينتمي الى مشروع اخر' + error_no_tracker_in_project: 'لا يوجد انواع بنود عمل لهذا المشروع، الرجاء التحقق من إعدادات المشروع. ' + error_no_default_issue_status: 'لم يتم التعرف على اي وضع افتراضي، الرجاء التحقق من التكوين الخاص بك (اذهب الى إدارة-إصدار الحالات)' + error_can_not_delete_custom_field: غير قادر على حذف الحقل المظلل + error_can_not_delete_tracker: "هذا النوع من بنود العمل يحتوي على بنود نشطة ولا يمكن حذفه" + error_can_not_remove_role: "هذا الدور قيد الاستخدام، لا يمكن حذفه" + error_can_not_reopen_issue_on_closed_version: 'لا يمكن إعادة فتح بند عمل معين لاصدار مقفل' + error_can_not_archive_project: لا يمكن ارشفة هذا المشروع + error_issue_done_ratios_not_updated: "لم يتم تحديث النسب" + error_workflow_copy_source: 'الرجاء اختيار نوع بند العمل او الادوار' + error_workflow_copy_target: 'الرجاء اختيار نوع بند العمل المستهدف او الادوار المستهدفة' + error_unable_delete_issue_status: 'غير قادر على حذف حالة بند العمل' + error_unable_to_connect: "تعذر الاتصال(%{value})" + error_attachment_too_big: " (%{max_size})لا يمكن تحميل هذا الملف، لقد تجاوز الحد الاقصى المسموح به " + warning_attachments_not_saved: "%{count}تعذر حفظ الملف" + + mail_subject_lost_password: " %{value}كلمة المرور الخاصة بك " + mail_body_lost_password: 'لتغير كلمة المرور، انقر على الروابط التالية:' + mail_subject_register: " %{value}تفعيل حسابك " + mail_body_register: 'لتفعيل حسابك، انقر على الروابط التالية:' + mail_body_account_information_external: " %{value}اصبح بامكانك استخدام حسابك للدخول" + mail_body_account_information: معلومات حسابك + mail_subject_account_activation_request: "%{value}طلب تفعيل الحساب " + mail_body_account_activation_request: " (%{value})تم تسجيل حساب جديد، بانتظار الموافقة:" + mail_subject_reminder: "%{count}تم تأجيل المهام التالية " + mail_body_reminder: "%{count}يجب ان تقوم بتسليم المهام التالية:" + mail_subject_wiki_content_added: "'%{id}' تم اضافة صفحة ويكي" + mail_body_wiki_content_added: "The '%{id}' تم اضافة صفحة ويكي من قبل %{author}." + mail_subject_wiki_content_updated: "'%{id}' تم تحديث صفحة ويكي" + mail_body_wiki_content_updated: "The '%{id}'تم تحديث صفحة ويكي من قبل %{author}." + + + field_name: الاسم + field_description: الوصف + field_summary: الملخص + field_is_required: مطلوب + field_firstname: الاسم الاول + field_lastname: الاسم الاخير + field_mail: البريد الالكتروني + field_filename: اسم الملف + field_filesize: حجم الملف + field_downloads: التنزيل + field_author: المؤلف + field_created_on: تم الانشاء في + field_updated_on: تم التحديث + field_field_format: تنسيق الحقل + field_is_for_all: لكل المشروعات + field_possible_values: قيم محتملة + field_regexp: التعبير العادي + field_min_length: الحد الادنى للطول + field_max_length: الحد الاعلى للطول + field_value: القيمة + field_category: الفئة + field_title: العنوان + field_project: المشروع + field_issue: بند العمل + field_status: الحالة + field_notes: ملاحظات + field_is_closed: بند العمل مغلق + field_is_default: القيمة الافتراضية + field_tracker: نوع بند العمل + field_subject: الموضوع + field_due_date: تاريخ النهاية + field_assigned_to: المحال اليه + field_priority: الأولوية + field_fixed_version: الاصدار المستهدف + field_user: المستخدم + field_principal: الرئيسي + field_role: دور + field_homepage: الصفحة الرئيسية + field_is_public: عام + field_parent: مشروع فرعي من + field_is_in_roadmap: معروض في خارطة الطريق + field_login: تسجيل الدخول + field_mail_notification: ملاحظات على البريد الالكتروني + field_admin: المدير + field_last_login_on: اخر اتصال + field_language: لغة + field_effective_date: تاريخ + field_password: كلمة المرور + field_new_password: كلمة المرور الجديدة + field_password_confirmation: تأكيد + field_version: إصدار + field_type: نوع + field_host: المضيف + field_port: المنفذ + field_account: الحساب + field_base_dn: DN قاعدة + field_attr_login: سمة الدخول + field_attr_firstname: سمة الاسم الاول + field_attr_lastname: سمة الاسم الاخير + field_attr_mail: سمة البريد الالكتروني + field_onthefly: إنشاء حساب مستخدم على تحرك + field_start_date: تاريخ البداية + field_done_ratio: "نسبة الانجاز" + field_auth_source: وضع المصادقة + field_hide_mail: إخفاء بريدي الإلكتروني + field_comments: تعليق + field_url: رابط + field_start_page: صفحة البداية + field_subproject: المشروع الفرعي + field_hours: ساعات + field_activity: النشاط + field_spent_on: تاريخ + field_identifier: المعرف + field_is_filter: استخدم كتصفية + field_issue_to: بنود العمل المتصلة + field_delay: تأخير + field_assignable: يمكن اسناد بنود العمل الى هذا الدور + field_redirect_existing_links: إعادة توجيه الروابط الموجودة + field_estimated_hours: الوقت المتوقع + field_column_names: أعمدة + field_time_entries: وقت الدخول + field_time_zone: المنطقة الزمنية + field_searchable: يمكن البحث فيه + field_default_value: القيمة الافتراضية + field_comments_sorting: اعرض التعليقات + field_parent_title: صفحة الوالدين + field_editable: يمكن اعادة تحريره + field_watcher: مراقب + field_identity_url: افتح الرابط الخاص بالهوية الشخصية + field_content: المحتويات + field_group_by: تصنيف النتائج بواسطة + field_sharing: مشاركة + field_parent_issue: بند العمل الأصلي + field_member_of_group: "مجموعة المحال" + field_assigned_to_role: "دور المحال" + field_text: حقل نصي + field_visible: غير مرئي + field_warn_on_leaving_unsaved: "الرجاء التحذير عند مغادرة صفحة والنص غير محفوظ" + field_issues_visibility: بنود العمل المرئية + field_is_private: خاص + field_commit_logs_encoding: رسائل الترميز + field_scm_path_encoding: ترميز المسار + field_path_to_repository: مسار المستودع + field_root_directory: دليل الجذر + field_cvsroot: CVSجذر + field_cvs_module: وحدة + + setting_app_title: عنوان التطبيق + setting_app_subtitle: العنوان الفرعي للتطبيق + setting_welcome_text: نص الترحيب + setting_default_language: اللغة الافتراضية + setting_login_required: مطلوب المصادقة + setting_self_registration: التسجيل الذاتي + setting_attachment_max_size: الحد الاقصى للملفات المرفقة + setting_issues_export_limit: الحد الاقصى لتصدير بنود العمل لملفات خارجية + setting_mail_from: انبعاثات عنوان بريدك + setting_bcc_recipients: مستلمين النسخ المخفية (bcc) + setting_plain_text_mail: نص عادي (no HTML) + setting_host_name: اسم ومسار المستخدم + setting_text_formatting: تنسيق النص + setting_wiki_compression: ضغط تاريخ الويكي + setting_feeds_limit: Atom feeds الحد الاقصى لعدد البنود في + setting_default_projects_public: المشاريع الجديده متاحة للجميع افتراضيا + setting_autofetch_changesets: الإحضار التلقائي + setting_sys_api_enabled: من ادارة المستودع WS تمكين + setting_commit_ref_keywords: مرجعية الكلمات المفتاحية + setting_commit_fix_keywords: تصحيح الكلمات المفتاحية + setting_autologin: الدخول التلقائي + setting_date_format: تنسيق التاريخ + setting_time_format: تنسيق الوقت + setting_cross_project_issue_relations: السماح بإدراج بنود العمل في هذا المشروع + setting_issue_list_default_columns: الاعمدة الافتراضية المعروضة في قائمة بند العمل + setting_repositories_encodings: ترميز المرفقات والمستودعات + setting_emails_header: رأس رسائل البريد الإلكتروني + setting_emails_footer: ذيل رسائل البريد الإلكتروني + setting_protocol: بروتوكول + setting_per_page_options: الكائنات لكل خيارات الصفحة + setting_user_format: تنسيق عرض المستخدم + setting_activity_days_default: الايام المعروضة على نشاط المشروع + setting_display_subprojects_issues: عرض بنود العمل للمشارع الرئيسية بشكل افتراضي + setting_enabled_scm: SCM تمكين + setting_mail_handler_body_delimiters: "اقتطاع رسائل البريد الإلكتروني بعد هذه الخطوط" + setting_mail_handler_api_enabled: للرسائل الواردةWS تمكين + setting_mail_handler_api_key: API مفتاح + setting_sequential_project_identifiers: انشاء معرفات المشروع المتسلسلة + setting_gravatar_enabled: كأيقونة مستخدمGravatar استخدام + setting_gravatar_default: الافتراضيةGravatar صورة + setting_diff_max_lines_displayed: الحد الاقصى لعدد الخطوط + setting_file_max_size_displayed: الحد الأقصى لحجم النص المعروض على الملفات المرفقة + setting_repository_log_display_limit: الحد الاقصى لعدد التنقيحات المعروضة على ملف السجل + setting_openid: السماح بدخول اسم المستخدم المفتوح والتسجيل + setting_password_min_length: الحد الادني لطول كلمة المرور + setting_new_project_user_role_id: الدور المسند الى المستخدم غير المسؤول الذي يقوم بإنشاء المشروع + setting_default_projects_modules: تمكين الوحدات النمطية للمشاريع الجديدة بشكل افتراضي + setting_issue_done_ratio: حساب نسبة بند العمل المنتهية + setting_issue_done_ratio_issue_field: استخدم حقل بند العمل + setting_issue_done_ratio_issue_status: استخدم وضع بند العمل + setting_start_of_week: بدأ التقويم + setting_rest_api_enabled: تمكين باقي خدمات الويب + setting_cache_formatted_text: النص المسبق تنسيقه في ذاكرة التخزين المؤقت + setting_default_notification_option: خيار الاعلام الافتراضي + setting_commit_logtime_enabled: تميكن وقت الدخول + setting_commit_logtime_activity_id: النشاط في وقت الدخول + setting_gantt_items_limit: الحد الاقصى لعدد العناصر المعروضة على مخطط جانت + setting_issue_group_assignment: السماح للإحالة الى المجموعات + setting_default_issue_start_date_to_creation_date: استخدام التاريخ الحالي كتاريخ بدأ لبنود العمل الجديدة + + permission_add_project: إنشاء مشروع + permission_add_subprojects: إنشاء مشاريع فرعية + permission_edit_project: تعديل مشروع + permission_select_project_modules: تحديد شكل المشروع + permission_manage_members: إدارة الاعضاء + permission_manage_project_activities: ادارة اصدارات المشروع + permission_manage_versions: ادارة الاصدارات + permission_manage_categories: ادارة انواع بنود العمل + permission_view_issues: عرض بنود العمل + permission_add_issues: اضافة بنود العمل + permission_edit_issues: تعديل بنود العمل + permission_manage_issue_relations: ادارة علاقات بنود العمل + permission_set_issues_private: تعين بنود العمل عامة او خاصة + permission_set_own_issues_private: تعين بنود العمل الخاصة بك كبنود عمل عامة او خاصة + permission_add_issue_notes: اضافة ملاحظات + permission_edit_issue_notes: تعديل ملاحظات + permission_edit_own_issue_notes: تعديل ملاحظاتك + permission_move_issues: تحريك بنود العمل + permission_delete_issues: حذف بنود العمل + permission_manage_public_queries: ادارة الاستعلامات العامة + permission_save_queries: حفظ الاستعلامات + permission_view_gantt: عرض طريقة"جانت" + permission_view_calendar: عرض التقويم + permission_view_issue_watchers: عرض قائمة المراقبين + permission_add_issue_watchers: اضافة مراقبين + permission_delete_issue_watchers: حذف مراقبين + permission_log_time: الوقت المستغرق بالدخول + permission_view_time_entries: عرض الوقت المستغرق + permission_edit_time_entries: تعديل الدخولات الزمنية + permission_edit_own_time_entries: تعديل الدخولات الشخصية + permission_manage_news: ادارة الاخبار + permission_comment_news: اخبار التعليقات + permission_view_documents: عرض المستندات + permission_manage_files: ادارة الملفات + permission_view_files: عرض الملفات + permission_manage_wiki: ادارة ويكي + permission_rename_wiki_pages: اعادة تسمية صفحات ويكي + permission_delete_wiki_pages: حذق صفحات ويكي + permission_view_wiki_pages: عرض ويكي + permission_view_wiki_edits: عرض تاريخ ويكي + permission_edit_wiki_pages: تعديل صفحات ويكي + permission_delete_wiki_pages_attachments: حذف المرفقات + permission_protect_wiki_pages: حماية صفحات ويكي + permission_manage_repository: ادارة المستودعات + permission_browse_repository: استعراض المستودعات + permission_view_changesets: عرض طاقم التغيير + permission_commit_access: الوصول + permission_manage_boards: ادارة المنتديات + permission_view_messages: عرض الرسائل + permission_add_messages: نشر الرسائل + permission_edit_messages: تحرير الرسائل + permission_edit_own_messages: تحرير الرسائل الخاصة + permission_delete_messages: حذف الرسائل + permission_delete_own_messages: حذف الرسائل الخاصة + permission_export_wiki_pages: تصدير صفحات ويكي + permission_manage_subtasks: ادارة المهام الفرعية + + project_module_issue_tracking: تعقب بنود العمل + project_module_time_tracking: التعقب الزمني + project_module_news: الاخبار + project_module_documents: المستندات + project_module_files: الملفات + project_module_wiki: ويكي + project_module_repository: المستودع + project_module_boards: المنتديات + project_module_calendar: التقويم + project_module_gantt: جانت + + label_user: المستخدم + label_user_plural: المستخدمين + label_user_new: مستخدم جديد + label_user_anonymous: مجهول الهوية + label_project: مشروع + label_project_new: مشروع جديد + label_project_plural: مشاريع + label_x_projects: + zero: لا يوجد مشاريع + one: مشروع واحد + other: "%{count} مشاريع" + label_project_all: كل المشاريع + label_project_latest: احدث المشاريع + label_issue: بند عمل + label_issue_new: بند عمل جديد + label_issue_plural: بنود عمل + label_issue_view_all: عرض كل بنود العمل + label_issues_by: " %{value}بند العمل لصحابها" + label_issue_added: تم اضافة بند العمل + label_issue_updated: تم تحديث بند العمل + label_issue_note_added: تم اضافة الملاحظة + label_issue_status_updated: تم تحديث الحالة + label_issue_priority_updated: تم تحديث الاولويات + label_document: مستند + label_document_new: مستند جديد + label_document_plural: مستندات + label_document_added: تم اضافة مستند + label_role: دور + label_role_plural: ادوار + label_role_new: دور جديد + label_role_and_permissions: الأدوار والصلاحيات + label_role_anonymous: مجهول الهوية + label_role_non_member: ليس عضو + label_member: عضو + label_member_new: عضو جديد + label_member_plural: اعضاء + label_tracker: نوع بند عمل + label_tracker_plural: أنواع بنود العمل + label_tracker_new: نوع بند عمل جديد + label_workflow: سير العمل + label_issue_status: حالة بند العمل + label_issue_status_plural: حالات بند العمل + label_issue_status_new: حالة جديدة + label_issue_category: فئة بند العمل + label_issue_category_plural: فئات بنود العمل + label_issue_category_new: فئة جديدة + label_custom_field: تخصيص حقل + label_custom_field_plural: تخصيص حقول + label_custom_field_new: حقل مخصص جديد + label_enumerations: التعدادات + label_enumeration_new: قيمة جديدة + label_information: معلومة + label_information_plural: معلومات + label_please_login: برجى تسجيل الدخول + label_register: تسجيل + label_login_with_open_id_option: او الدخول بهوية مفتوحة + label_password_lost: فقدت كلمة السر + label_home: "الصفحة الرئيسية" + label_my_page: الصفحة الخاصة بي + label_my_account: حسابي + label_my_projects: مشاريعي الخاصة + label_administration: إدارة النظام + label_login: تسجيل الدخول + label_logout: تسجيل الخروج + label_help: مساعدة + label_reported_issues: بنود العمل التي أدخلتها + label_assigned_to_me_issues: بنود العمل المسندة إلي + label_last_login: آخر اتصال + label_registered_on: مسجل على + label_activity: النشاط + label_overall_activity: النشاط العام + label_user_activity: "قيمة النشاط" + label_new: جديدة + label_logged_as: تم تسجيل دخولك + label_environment: البيئة + label_authentication: المصادقة + label_auth_source: وضع المصادقة + label_auth_source_new: وضع مصادقة جديدة + label_auth_source_plural: أوضاع المصادقة + label_subproject_plural: مشاريع فرعية + label_subproject_new: مشروع فرعي جديد + label_and_its_subprojects: "قيمة المشاريع الفرعية الخاصة بك" + label_min_max_length: الحد الاقصى والادنى للطول + label_list: قائمة + label_date: تاريخ + label_integer: عدد صحيح + label_float: عدد كسري + label_boolean: "نعم/لا" + label_string: نص + label_text: نص طويل + label_attribute: سمة + label_attribute_plural: السمات + label_no_data: لا توجد بيانات للعرض + label_change_status: تغيير الحالة + label_history: التاريخ + label_attachment: الملف + label_attachment_new: ملف جديد + label_attachment_delete: حذف الملف + label_attachment_plural: الملفات + label_file_added: الملف المضاف + label_report: تقرير + label_report_plural: التقارير + label_news: الأخبار + label_news_new: إضافة الأخبار + label_news_plural: الأخبار + label_news_latest: آخر الأخبار + label_news_view_all: عرض كل الأخبار + label_news_added: الأخبار المضافة + label_news_comment_added: إضافة التعليقات على أخبار + label_settings: إعدادات + label_overview: لمحة عامة + label_version: الإصدار + label_version_new: الإصدار الجديد + label_version_plural: الإصدارات + label_close_versions: أكملت إغلاق الإصدارات + label_confirmation: تأكيد + label_export_to: 'متوفرة أيضا في:' + label_read: القراءة... + label_public_projects: المشاريع العامة + label_open_issues: مفتوح + label_open_issues_plural: بنود عمل مفتوحة + label_closed_issues: مغلق + label_closed_issues_plural: بنود عمل مغلقة + label_x_open_issues_abbr: + zero: 0 مفتوح + one: 1 مقتوح + other: "%{count} مفتوح" + label_x_closed_issues_abbr: + zero: 0 مغلق + one: 1 مغلق + other: "%{count} مغلق" + label_total: الإجمالي + label_permissions: صلاحيات + label_current_status: الحالة الحالية + label_new_statuses_allowed: يسمح بادراج حالات جديدة + label_all: جميع + label_none: لا شيء + label_nobody: لا أحد + label_next: القادم + label_previous: السابق + label_used_by: التي يستخدمها + label_details: التفاصيل + label_add_note: إضافة ملاحظة + label_calendar: التقويم + label_months_from: بعد أشهر من + label_gantt: جانت + label_internal: الداخلية + label_last_changes: "آخر التغييرات %{count}" + label_change_view_all: عرض كافة التغييرات + label_comment: تعليق + label_comment_plural: تعليقات + label_x_comments: + zero: لا يوجد تعليقات + one: تعليق واحد + other: "%{count} تعليقات" + label_comment_add: إضافة تعليق + label_comment_added: تم إضافة التعليق + label_comment_delete: حذف التعليقات + label_query: استعلام مخصص + label_query_plural: استعلامات مخصصة + label_query_new: استعلام جديد + label_my_queries: استعلاماتي المخصصة + label_filter_add: إضافة عامل تصفية + label_filter_plural: عوامل التصفية + label_equals: يساوي + label_not_equals: لا يساوي + label_in_less_than: أقل من + label_in_more_than: أكثر من + label_greater_or_equal: '>=' + label_less_or_equal: '< =' + label_between: بين + label_in: في + label_today: اليوم + label_all_time: كل الوقت + label_yesterday: بالأمس + label_this_week: هذا الأسبوع + label_last_week: الأسبوع الماضي + label_last_n_days: "آخر %{count} أيام" + label_this_month: هذا الشهر + label_last_month: الشهر الماضي + label_this_year: هذا العام + label_date_range: نطاق التاريخ + label_less_than_ago: أقل من عدد أيام + label_more_than_ago: أكثر من عدد أيام + label_ago: منذ أيام + label_contains: يحتوي على + label_not_contains: لا يحتوي على + label_day_plural: أيام + label_repository: المستودع + label_repository_plural: المستودعات + label_browse: تصفح + label_branch: فرع + label_tag: ربط + label_revision: مراجعة + label_revision_plural: تنقيحات + label_revision_id: " %{value}مراجعة" + label_associated_revisions: التنقيحات المرتبطة + label_added: مضاف + label_modified: معدل + label_copied: منسوخ + label_renamed: إعادة تسمية + label_deleted: محذوف + label_latest_revision: آخر تنقيح + label_latest_revision_plural: أحدث المراجعات + label_view_revisions: عرض التنقيحات + label_view_all_revisions: عرض كافة المراجعات + label_max_size: الحد الأقصى للحجم + label_sort_highest: التحرك لأعلى مرتبة + label_sort_higher: تحريك لأعلى + label_sort_lower: تحريك لأسفل + label_sort_lowest: التحرك لأسفل مرتبة + label_roadmap: خارطة الطريق + label_roadmap_due_in: " %{value}تستحق في " + label_roadmap_overdue: "%{value}تأخير" + label_roadmap_no_issues: لا يوجد بنود عمل لهذا الإصدار + label_search: البحث + label_result_plural: النتائج + label_all_words: كل الكلمات + label_wiki: ويكي + label_wiki_edit: تحرير ويكي + label_wiki_edit_plural: عمليات تحرير ويكي + label_wiki_page: صفحة ويكي + label_wiki_page_plural: ويكي صفحات + label_index_by_title: الفهرس حسب العنوان + label_index_by_date: الفهرس حسب التاريخ + label_current_version: الإصدار الحالي + label_preview: معاينة + label_feed_plural: موجز ويب + label_changes_details: تفاصيل جميع التغييرات + label_issue_tracking: تعقب بنود العمل + label_spent_time: ما تم إنفاقه من الوقت + label_overall_spent_time: الوقت الذي تم انفاقه كاملا + label_f_hour: "%{value} ساعة" + label_f_hour_plural: "%{value} ساعات" + label_time_tracking: تعقب الوقت + label_change_plural: التغييرات + label_statistics: إحصاءات + label_commits_per_month: يثبت في الشهر + label_commits_per_author: يثبت لكل مؤلف + label_diff: الاختلافات + label_view_diff: عرض الاختلافات + label_diff_inline: مضمنة + label_diff_side_by_side: جنبا إلى جنب + label_options: خيارات + label_copy_workflow_from: نسخ سير العمل من + label_permissions_report: تقرير الصلاحيات + label_watched_issues: بنود العمل المتابعة بريدياً + label_related_issues: بنود العمل ذات الصلة + label_applied_status: الحالة المطبقة + label_loading: تحميل... + label_relation_new: علاقة جديدة + label_relation_delete: حذف العلاقة + label_relates_to: ذات علاقة بـ + label_duplicates: مكرر من + label_duplicated_by: مكرر بواسطة + label_blocks: يجب تنفيذه قبل + label_blocked_by: لا يمكن تنفيذه إلا بعد + label_precedes: يسبق + label_follows: يتبع + label_stay_logged_in: تسجيل الدخول في + label_disabled: تعطيل + label_show_completed_versions: إظهار الإصدارات الكاملة + label_me: لي + label_board: المنتدى + label_board_new: منتدى جديد + label_board_plural: المنتديات + label_board_locked: تأمين + label_board_sticky: لزجة + label_topic_plural: المواضيع + label_message_plural: رسائل + label_message_last: آخر رسالة + label_message_new: رسالة جديدة + label_message_posted: تم اضافة الرسالة + label_reply_plural: الردود + label_send_information: إرسال معلومات الحساب للمستخدم + label_year: سنة + label_month: شهر + label_week: أسبوع + label_date_from: من + label_date_to: إلى + label_language_based: استناداً إلى لغة المستخدم + label_sort_by: " %{value}الترتيب حسب " + label_send_test_email: ارسل رسالة الكترونية كاختبار + label_feeds_access_key: Atom مفتاح دخول + label_missing_feeds_access_key: مفقودAtom مفتاح دخول + label_feeds_access_key_created_on: "Atom تم انشاء مفتاح %{value} منذ" + label_module_plural: الوحدات النمطية + label_added_time_by: " تم اضافته من قبل %{author} منذ %{age}" + label_updated_time_by: " تم تحديثه من قبل %{author} منذ %{age}" + label_updated_time: "تم التحديث منذ %{value}" + label_jump_to_a_project: الانتقال إلى مشروع... + label_file_plural: الملفات + label_changeset_plural: اعدادات التغير + label_default_columns: الاعمدة الافتراضية + label_no_change_option: (لا تغيير) + label_bulk_edit_selected_issues: تحرير بنود العمل المظللة + label_bulk_edit_selected_time_entries: تعديل بنود الأوقات المظللة + label_theme: الموضوع + label_default: الافتراضي + label_search_titles_only: البحث في العناوين فقط + label_user_mail_option_all: "جميع الخيارات" + label_user_mail_option_selected: "الخيارات المظللة فقط" + label_user_mail_option_none: "لم يتم تحديد اي خيارات" + label_user_mail_option_only_my_events: "السماح لي فقط بمشاهدة الاحداث الخاصة" + label_user_mail_no_self_notified: "لا تريد إعلامك بالتغيرات التي تجريها بنفسك" + label_registration_activation_by_email: حساب التنشيط عبر البريد الإلكتروني + label_registration_manual_activation: تنشيط الحساب اليدوي + label_registration_automatic_activation: تنشيط الحساب التلقائي + label_display_per_page: "لكل صفحة: %{value}" + label_age: العمر + label_change_properties: تغيير الخصائص + label_general: عامة + label_scm: scm + label_plugins: الإضافات + label_ldap_authentication: مصادقة LDAP + label_downloads_abbr: تنزيل + label_optional_description: وصف اختياري + label_add_another_file: إضافة ملف آخر + label_preferences: تفضيلات + label_chronological_order: في ترتيب زمني + label_reverse_chronological_order: في ترتيب زمني عكسي + label_incoming_emails: رسائل البريد الإلكتروني الوارد + label_generate_key: إنشاء مفتاح + label_issue_watchers: المراقبون + label_example: مثال + label_display: العرض + label_sort: فرز + label_ascending: تصاعدي + label_descending: تنازلي + label_date_from_to: من %{start} الى %{end} + label_wiki_content_added: إضافة صفحة ويكي + label_wiki_content_updated: تحديث صفحة ويكي + label_group: مجموعة + label_group_plural: المجموعات + label_group_new: مجموعة جديدة + label_time_entry_plural: الأوقات المنفقة + label_version_sharing_none: غير متاح + label_version_sharing_descendants: متاح للمشاريع الفرعية + label_version_sharing_hierarchy: متاح للتسلسل الهرمي للمشروع + label_version_sharing_tree: مع شجرة المشروع + label_version_sharing_system: مع جميع المشاريع + label_update_issue_done_ratios: تحديث نسبة الأداء لبند العمل + label_copy_source: المصدر + label_copy_target: الهدف + label_copy_same_as_target: مطابق للهدف + label_display_used_statuses_only: عرض الحالات المستخدمة من قبل هذا النوع من بنود العمل فقط + label_api_access_key: مفتاح الوصول إلى API + label_missing_api_access_key: API لم يتم الحصول على مفتاح الوصول + label_api_access_key_created_on: " API إنشاء مفتاح الوصول إلى" + label_profile: الملف الشخصي + label_subtask_plural: المهام الفرعية + label_project_copy_notifications: إرسال إشعار الى البريد الإلكتروني عند نسخ المشروع + label_principal_search: "البحث عن مستخدم أو مجموعة:" + label_user_search: "البحث عن المستخدم:" + label_additional_workflow_transitions_for_author: الانتقالات الإضافية المسموح بها عند المستخدم صاحب البلاغ + label_additional_workflow_transitions_for_assignee: الانتقالات الإضافية المسموح بها عند المستخدم المحال إليه + label_issues_visibility_all: جميع بنود العمل + label_issues_visibility_public: جميع بنود العمل الخاصة + label_issues_visibility_own: بنود العمل التي أنشأها المستخدم + label_git_report_last_commit: اعتماد التقرير الأخير للملفات والدلائل + label_parent_revision: الوالدين + label_child_revision: الطفل + label_export_options: "%{export_format} خيارات التصدير" + + button_login: دخول + button_submit: تثبيت + button_save: حفظ + button_check_all: تحديد الكل + button_uncheck_all: عدم تحديد الكل + button_collapse_all: تقليص الكل + button_expand_all: عرض الكل + button_delete: حذف + button_create: إنشاء + button_create_and_continue: إنشاء واستمرار + button_test: اختبار + button_edit: تعديل + button_edit_associated_wikipage: "تغير صفحة ويكي: %{page_title}" + button_add: إضافة + button_change: تغيير + button_apply: تطبيق + button_clear: إخلاء الحقول + button_lock: قفل + button_unlock: الغاء القفل + button_download: تنزيل + button_list: قائمة + button_view: عرض + button_move: تحرك + button_move_and_follow: تحرك واتبع + button_back: رجوع + button_cancel: إلغاء + button_activate: تنشيط + button_sort: ترتيب + button_log_time: وقت الدخول + button_rollback: الرجوع الى هذا الاصدار + button_watch: تابع عبر البريد + button_unwatch: إلغاء المتابعة عبر البريد + button_reply: رد + button_archive: أرشفة + button_unarchive: إلغاء الأرشفة + button_reset: إعادة + button_rename: إعادة التسمية + button_change_password: تغير كلمة المرور + button_copy: نسخ + button_copy_and_follow: نسخ واتباع + button_annotate: تعليق + button_update: تحديث + button_configure: تكوين + button_quote: اقتباس + button_duplicate: عمل نسخة + button_show: إظهار + button_edit_section: تعديل هذا الجزء + button_export: تصدير لملف + + status_active: نشيط + status_registered: مسجل + status_locked: مقفل + + version_status_open: مفتوح + version_status_locked: مقفل + version_status_closed: مغلق + + field_active: فعال + + text_select_mail_notifications: حدد الامور التي يجب ابلاغك بها عن طريق البريد الالكتروني + text_regexp_info: مثال. ^[A-Z0-9]+$ + text_min_max_length_info: الحد الاقصى والادني لطول المعلومات + text_project_destroy_confirmation: هل أنت متأكد من أنك تريد حذف هذا المشروع والبيانات ذات الصلة؟ + text_subprojects_destroy_warning: "المشاريع الفرعية: %{value} سيتم حذفها أيضاً." + text_workflow_edit: حدد دوراً و نوع بند عمل لتحرير سير العمل + text_are_you_sure: هل أنت متأكد؟ + text_journal_changed: "%{label} تغير %{old} الى %{new}" + text_journal_changed_no_detail: "%{label} تم التحديث" + text_journal_set_to: "%{label} تغير الى %{value}" + text_journal_deleted: "%{label} تم الحذف (%{old})" + text_journal_added: "%{label} %{value} تم الاضافة" + text_tip_issue_begin_day: بند عمل بدأ اليوم + text_tip_issue_end_day: بند عمل انتهى اليوم + text_tip_issue_begin_end_day: بند عمل بدأ وانتهى اليوم + text_caracters_maximum: "%{count} الحد الاقصى." + text_caracters_minimum: "الحد الادنى %{count}" + text_length_between: "الطول %{min} بين %{max} رمز" + text_tracker_no_workflow: لم يتم تحديد سير العمل لهذا النوع من بنود العمل + text_unallowed_characters: رموز غير مسموحة + text_comma_separated: مسموح رموز متنوعة يفصلها فاصلة . + text_line_separated: مسموح رموز متنوعة يفصلها سطور + text_issues_ref_in_commit_messages: الارتباط وتغيير حالة بنود العمل في رسائل تحرير الملفات + text_issue_added: "بند العمل %{id} تم ابلاغها عن طريق %{author}." + text_issue_updated: "بند العمل %{id} تم تحديثها عن طريق %{author}." + text_wiki_destroy_confirmation: هل انت متأكد من رغبتك في حذف هذا الويكي ومحتوياته؟ + text_issue_category_destroy_question: "بعض بنود العمل (%{count}) مرتبطة بهذه الفئة، ماذا تريد ان تفعل بها؟" + text_issue_category_destroy_assignments: حذف الفئة + text_issue_category_reassign_to: اعادة تثبيت البنود في الفئة + text_user_mail_option: "بالنسبة للمشاريع غير المحددة، سوف يتم ابلاغك عن المشاريع التي تشاهدها او تشارك بها فقط!" + text_no_configuration_data: "الادوار والمتتبع وحالات بند العمل ومخطط سير العمل لم يتم تحديد وضعها الافتراضي بعد. " + text_load_default_configuration: تحميل الاعدادات الافتراضية + text_status_changed_by_changeset: " طبق التغيرات المعينة على %{value}." + text_time_logged_by_changeset: "تم تطبيق التغيرات المعينة على %{value}." + text_issues_destroy_confirmation: هل انت متأكد من حذف البنود المظللة؟' + text_issues_destroy_descendants_confirmation: "سوف يؤدي هذا الى حذف %{count} المهام الفرعية ايضا." + text_time_entries_destroy_confirmation: "هل انت متأكد من رغبتك في حذف الادخالات الزمنية المحددة؟" + text_select_project_modules: قم بتحديد الوضع المناسب لهذا المشروع:' + text_default_administrator_account_changed: تم تعديل الاعدادات الافتراضية لحساب المدير + text_file_repository_writable: المرفقات قابلة للكتابة + text_plugin_assets_writable: الدليل المساعد قابل للكتابة + text_destroy_time_entries_question: " ساعة على بند العمل التي تود حذفها، ماذا تريد ان تفعل؟ %{hours} تم تثبيت" + text_destroy_time_entries: قم بحذف الساعات المسجلة + text_assign_time_entries_to_project: ثبت الساعات المسجلة على التقرير + text_reassign_time_entries: 'اعادة تثبيت الساعات المسجلة لبند العمل هذا:' + text_user_wrote: "%{value} كتب:" + text_enumeration_destroy_question: "%{count} الكائنات المعنية لهذه القيمة" + text_enumeration_category_reassign_to: اعادة تثبيت الكائنات التالية لهذه القيمة:' + text_email_delivery_not_configured: "لم يتم تسليم البريد الالكتروني" + text_diff_truncated: '... لقد تم اقتطاع هذا الجزء لانه تجاوز الحد الاقصى المسموح بعرضه' + text_custom_field_possible_values_info: 'سطر لكل قيمة' + text_wiki_page_nullify_children: "الاحتفاظ بصفحات الابن كصفحات جذر" + text_wiki_page_destroy_children: "حذف صفحات الابن وجميع أولادهم" + text_wiki_page_reassign_children: "إعادة تعيين صفحات تابعة لهذه الصفحة الأصلية" + text_own_membership_delete_confirmation: "انت على وشك إزالة بعض أو كافة الصلاحيات الخاصة بك، لن تكون قادراً على تحرير هذا المشروع بعد ذلك. هل أنت متأكد من أنك تريد المتابعة؟" + text_zoom_in: تصغير + text_zoom_out: تكبير + text_warn_on_leaving_unsaved: "الصفحة تحتوي على نص غير مخزن، سوف يفقد النص اذا تم الخروج من الصفحة." + text_scm_path_encoding_note: "الافتراضي: UTF-8" + text_git_repository_note: مستودع فارغ ومحلي + text_mercurial_repository_note: مستودع محلي + text_scm_command: امر + text_scm_command_version: اصدار + text_scm_config: الرجاء اعادة تشغيل التطبيق + text_scm_command_not_available: الامر غير متوفر، الرجاء التحقق من لوحة التحكم + + default_role_manager: مدير + default_role_developer: مطور + default_role_reporter: مراسل + default_tracker_bug: الشوائب + default_tracker_feature: خاصية + default_tracker_support: دعم + default_issue_status_new: جديد + default_issue_status_in_progress: جاري التحميل + default_issue_status_resolved: الحل + default_issue_status_feedback: التغذية الراجعة + default_issue_status_closed: مغلق + default_issue_status_rejected: مرفوض + default_doc_category_user: مستندات المستخدم + default_doc_category_tech: المستندات التقنية + default_priority_low: قليل + default_priority_normal: عادي + default_priority_high: عالي + default_priority_urgent: طارئ + default_priority_immediate: طارئ الآن + default_activity_design: تصميم + default_activity_development: تطوير + + enumeration_issue_priorities: الاولويات + enumeration_doc_categories: تصنيف المستندات + enumeration_activities: الانشطة + enumeration_system_activity: نشاط النظام + description_filter: فلترة + description_search: حقل البحث + description_choose_project: المشاريع + description_project_scope: مجال البحث + description_notes: ملاحظات + description_message_content: محتويات الرسالة + description_query_sort_criteria_attribute: نوع الترتيب + description_query_sort_criteria_direction: اتجاه الترتيب + description_user_mail_notification: إعدادات البريد الالكتروني + description_available_columns: الاعمدة المتوفرة + description_selected_columns: الاعمدة المحددة + description_all_columns: كل الاعمدة + description_issue_category_reassign: اختر التصنيف + description_wiki_subpages_reassign: اختر صفحة جديدة + text_rmagick_available: RMagick available (optional) + text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do? + text_repository_usernames_mapping: |- + Select or update the Redmine user mapped to each username found in the repository log. + Users with the same Redmine and repository username or email are automatically mapped. + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: لا يوجد بنود عمل + one: بند عمل واحد + other: "%{count} بنود عمل" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: منسوخ لـ + label_copied_from: منسوخ من + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: جميع + label_last_n_weeks: آخر %{count} أسبوع/أسابيع + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: متاح للمشاريع الفرعية + label_cross_project_tree: متاح مع شجرة المشروع + label_cross_project_hierarchy: متاح مع التسلسل الهرمي للمشروع + label_cross_project_system: متاح مع جميع المشاريع + button_hide: إخفاء + setting_non_working_week_days: "أيام أجازة/راحة أسبوعية" + label_in_the_next_days: في الأيام المقبلة + label_in_the_past_days: في الأيام الماضية + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: الإجمالي + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: البريد الالكتروني + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: الوقت الذي تم انفاقه كاملا + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API مفتاح + setting_lost_password: فقدت كلمة السر + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/az.yml b/config/locales/az.yml new file mode 100644 index 0000000..2d754ba --- /dev/null +++ b/config/locales/az.yml @@ -0,0 +1,1325 @@ +# +# Translated by Saadat Mutallimova +# Data Processing Center of the Ministry of Communication and Information Technologies +# +az: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%d %b" + long: "%d %B %Y" + + day_names: [bazar, bazar ertəsi, çərşənbə axşamı, çərşənbə, cümə axşamı, cümə, şənbə] + standalone_day_names: [Bazar, Bazar ertəsi, Çərşənbə axşamı, Çərşənbə, Cümə axşamı, Cümə, Şənbə] + abbr_day_names: [B, Be, Ça, Ç, Ca, C, Ş] + + month_names: [~, yanvar, fevral, mart, aprel, may, iyun, iyul, avqust, sentyabr, oktyabr, noyabr, dekabr] + # see russian gem for info on "standalone" day names + standalone_month_names: [~, Yanvar, Fevral, Mart, Aprel, May, İyun, İyul, Avqust, Sentyabr, Oktyabr, Noyabr, Dekabr] + abbr_month_names: [~, yan., fev., mart, apr., may, iyun, iyul, avq., sent., okt., noy., dek.] + standalone_abbr_month_names: [~, yan., fev., mart, apr., may, iyun, iyul, avq., sent., okt., noy., dek.] + + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d %b %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d %b, %H:%M" + long: "%d %B %Y, %H:%M" + + am: "səhər" + pm: "axşam" + + number: + format: + separator: "," + delimiter: " " + precision: 3 + + currency: + format: + format: "%n %u" + unit: "man." + separator: "." + delimiter: " " + precision: 2 + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 3 + # Rails 2.2 + # storage_units: [байт, КБ, МБ, ГБ, ТБ] + + # Rails 2.3 + storage_units: + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u" + units: + byte: + one: "bayt" + few: "bayt" + many: "bayt" + other: "bayt" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + datetime: + distance_in_words: + half_a_minute: "bir dəqiqədən az" + less_than_x_seconds: + one: "%{count} saniyədən az" + few: "%{count} saniyədən az" + many: "%{count} saniyədən az" + other: "%{count} saniyədən az" + x_seconds: + one: "%{count} saniyə" + few: "%{count} saniyə" + many: "%{count} saniyə" + other: "%{count} saniyə" + less_than_x_minutes: + one: "%{count} dəqiqədən az" + few: "%{count} dəqiqədən az" + many: "%{count} dəqiqədən az" + other: "%{count} dəqiqədən az" + x_minutes: + one: "%{count} dəqiqə" + few: "%{count} dəqiqə" + many: "%{count} dəqiqə" + other: "%{count} dəqiqə" + about_x_hours: + one: "təxminən %{count} saat" + few: "təxminən %{count} saat" + many: "təxminən %{count} saat" + other: "təxminən %{count} saat" + x_hours: + one: "1 saat" + other: "%{count} saat" + x_days: + one: "%{count} gün" + few: "%{count} gün" + many: "%{count} gün" + other: "%{count} gün" + about_x_months: + one: "təxminən %{count} ay" + few: "təxminən %{count} ay" + many: "təxminən %{count} ay" + other: "təxminən %{count} ay" + x_months: + one: "%{count} ay" + few: "%{count} ay" + many: "%{count} ay" + other: "%{count} ay" + about_x_years: + one: "təxminən %{count} il" + few: "təxminən %{count} il" + many: "təxminən %{count} il" + other: "təxminən %{count} il" + over_x_years: + one: "%{count} ildən çox" + few: "%{count} ildən çox" + many: "%{count} ildən çox" + other: "%{count} ildən çox" + almost_x_years: + one: "təxminən 1 il" + few: "təxminən %{count} il" + many: "təxminən %{count} il" + other: "təxminən %{count} il" + prompts: + year: "İl" + month: "Ay" + day: "Gün" + hour: "Saat" + minute: "Dəqiqə" + second: "Saniyə" + + activerecord: + errors: + template: + header: + one: "%{model}: %{count} səhvə görə yadda saxlamaq mümkün olmadı" + few: "%{model}: %{count} səhvlərə görə yadda saxlamaq mümkün olmadı" + many: "%{model}: %{count} səhvlərə görə yadda saxlamaq mümkün olmadı" + other: "%{model}: %{count} səhvə görə yadda saxlamaq mümkün olmadı" + + body: "Problemlər aşağıdakı sahələrdə yarandı:" + + messages: + inclusion: "nəzərdə tutulmamış təyinata malikdir" + exclusion: "ehtiyata götürülməmiş təyinata malikdir" + invalid: "düzgün təyinat deyildir" + confirmation: "təsdiq ilə üst-üstə düşmür" + accepted: "təsdiq etmək lazımdır" + empty: "boş saxlanıla bilməz" + blank: "boş saxlanıla bilməz" + too_long: + one: "çox böyük uzunluq (%{count} simvoldan çox ola bilməz)" + few: "çox böyük uzunluq (%{count} simvoldan çox ola bilməz)" + many: "çox böyük uzunluq (%{count} simvoldan çox ola bilməz)" + other: "çox böyük uzunluq (%{count} simvoldan çox ola bilməz)" + too_short: + one: "uzunluq kifayət qədər deyildir (%{count} simvoldan az ola bilməz)" + few: "uzunluq kifayət qədər deyildir (%{count} simvoldan az ola bilməz)" + many: "uzunluq kifayət qədər deyildir (%{count} simvoldan az ola bilməz)" + other: "uzunluq kifayət qədər deyildir (%{count} simvoldan az ola bilməz)" + wrong_length: + one: "düzgün olmayan uzunluq (tam %{count} simvol ola bilər)" + few: "düzgün olmayan uzunluq (tam %{count} simvol ola bilər)" + many: "düzgün olmayan uzunluq (tam %{count} simvol ola bilər)" + other: "düzgün olmayan uzunluq (tam %{count} simvol ola bilər)" + taken: "artıq mövcuddur" + not_a_number: "say kimi hesab edilmir" + greater_than: "%{count} çox təyinata malik ola bilər" + greater_than_or_equal_to: "%{count} çox və ya ona bərabər təyinata malik ola bilər" + equal_to: "yalnız %{count} bərabər təyinata malik ola bilər" + less_than: "%{count} az təyinata malik ola bilər" + less_than_or_equal_to: "%{count} az və ya ona bərabər təyinata malik ola bilər" + odd: "yalnız tək təyinata malik ola bilər" + even: "yalnız cüt təyinata malik ola bilər" + greater_than_start_date: "başlanğıc tarixindən sonra olmalıdır" + not_same_project: "təkcə bir layihəyə aid deyildir" + circular_dependency: "Belə əlaqə dövri asılılığa gətirib çıxaracaq" + cant_link_an_issue_with_a_descendant: "Tapşırıq özünün alt tapşırığı ilə əlaqəli ola bilməz" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + support: + array: + # Rails 2.2 + sentence_connector: "və" + skip_last_comma: true + + # Rails 2.3 + words_connector: ", " + two_words_connector: " və" + last_word_connector: " və " + + actionview_instancetag_blank_option: Seçim edin + + button_activate: Aktivləşdirmək + button_add: Əlavə etmək + button_annotate: Müəlliflik + button_apply: Tətbiq etmək + button_archive: Arxivləşdirmək + button_back: Geriyə + button_cancel: İmtina + button_change_password: Parolu dəyişmək + button_change: Dəyişmək + button_check_all: Hamını qeyd etmək + button_clear: Təmizləmək + button_configure: Parametlər + button_copy: Sürətini çıxarmaq + button_create: Yaratmaq + button_create_and_continue: Yaratmaq və davam etmək + button_delete: Silmək + button_download: Yükləmək + button_edit: Redaktə etmək + button_edit_associated_wikipage: "Əlaqəli wiki-səhifəni redaktə etmək: %{page_title}" + button_list: Siyahı + button_lock: Bloka salmaq + button_login: Giriş + button_log_time: Sərf olunan vaxt + button_move: Yerini dəyişmək + button_quote: Sitat gətirmək + button_rename: Adını dəyişmək + button_reply: Cavablamaq + button_reset: Sıfırlamaq + button_rollback: Bu versiyaya qayıtmaq + button_save: Yadda saxlamaq + button_sort: Çeşidləmək + button_submit: Qəbul etmək + button_test: Yoxlamaq + button_unarchive: Arxivdən çıxarmaq + button_uncheck_all: Təmizləmək + button_unlock: Blokdan çıxarmaq + button_unwatch: İzləməmək + button_update: Yeniləmək + button_view: Baxmaq + button_watch: İzləmək + + default_activity_design: Layihənin hazırlanması + default_activity_development: Hazırlanma prosesi + default_doc_category_tech: Texniki sənədləşmə + default_doc_category_user: İstifadəçi sənədi + default_issue_status_in_progress: İşlənməkdədir + default_issue_status_closed: Bağlanıb + default_issue_status_feedback: Əks əlaqə + default_issue_status_new: Yeni + default_issue_status_rejected: Rədd etmə + default_issue_status_resolved: Həll edilib + default_priority_high: Yüksək + default_priority_immediate: Təxirsiz + default_priority_low: Aşağı + default_priority_normal: Normal + default_priority_urgent: Təcili + default_role_developer: Hazırlayan + default_role_manager: Menecer + default_role_reporter: Reportyor + default_tracker_bug: Səhv + default_tracker_feature: Təkmilləşmə + default_tracker_support: Dəstək + + enumeration_activities: Hərəkətlər (vaxtın uçotu) + enumeration_doc_categories: Sənədlərin kateqoriyası + enumeration_issue_priorities: Tapşırıqların prioriteti + + error_can_not_remove_role: Bu rol istifadə edilir və silinə bilməz. + error_can_not_delete_custom_field: Sazlanmış sahəni silmək mümkün deyildir + error_can_not_delete_tracker: Bu treker tapşırıqlardan ibarət olduğu üçün silinə bilməz. + error_can_t_load_default_data: "Susmaya görə konfiqurasiya yüklənməmişdir: %{value}" + error_issue_not_found_in_project: Tapşırıq tapılmamışdır və ya bu layihəyə bərkidilməmişdir + error_scm_annotate: "Verilənlər mövcud deyildir və ya imzalana bilməz." + error_scm_command_failed: "Saxlayıcıya giriş imkanı səhvi: %{value}" + error_scm_not_found: Saxlayıcıda yazı və/ və ya düzəliş yoxdur. + error_unable_to_connect: Qoşulmaq mümkün deyildir (%{value}) + error_unable_delete_issue_status: Tapşırığın statusunu silmək mümkün deyildir + + field_account: İstifadəçi hesabı + field_activity: Fəaliyyət + field_admin: İnzibatçı + field_assignable: Tapşırıq bu rola təyin edilə bilər + field_assigned_to: Təyin edilib + field_attr_firstname: Ad + field_attr_lastname: Soyad + field_attr_login: Atribut Login + field_attr_mail: e-poçt + field_author: Müəllif + field_auth_source: Autentifikasiya rejimi + field_base_dn: BaseDN + field_category: Kateqoriya + field_column_names: Sütunlar + field_comments: Şərhlər + field_comments_sorting: Şərhlərin təsviri + field_content: Content + field_created_on: Yaradılıb + field_default_value: Susmaya görə təyinat + field_delay: Təxirə salmaq + field_description: Təsvir + field_done_ratio: Hazırlıq + field_downloads: Yükləmələr + field_due_date: Yerinə yetirilmə tarixi + field_editable: Redaktə edilən + field_effective_date: Tarix + field_estimated_hours: Vaxtın dəyərləndirilməsi + field_field_format: Format + field_filename: Fayl + field_filesize: Ölçü + field_firstname: Ad + field_fixed_version: Variant + field_hide_mail: E-poçtumu gizlət + field_homepage: Başlanğıc səhifə + field_host: Kompyuter + field_hours: saat + field_identifier: Unikal identifikator + field_identity_url: OpenID URL + field_is_closed: Tapşırıq bağlanıb + field_is_default: Susmaya görə tapşırıq + field_is_filter: Filtr kimi istifadə edilir + field_is_for_all: Bütün layihələr üçün + field_is_in_roadmap: Operativ planda əks olunan tapşırıqlar + field_is_public: Ümümaçıq + field_is_required: Mütləq + field_issue_to: Əlaqəli tapşırıqlar + field_issue: Tapşırıq + field_language: Dil + field_last_login_on: Son qoşulma + field_lastname: Soyad + field_login: İstifadəçi + field_mail: e-poçt + field_mail_notification: e-poçt ilə bildiriş + field_max_length: maksimal uzunluq + field_min_length: minimal uzunluq + field_name: Ad + field_new_password: Yeni parol + field_notes: Qeyd + field_onthefly: Tez bir zamanda istifadəçinin yaradılması + field_parent_title: Valideyn səhifə + field_parent: Valideyn layihə + field_parent_issue: Valideyn tapşırıq + field_password_confirmation: Təsdiq + field_password: Parol + field_port: Port + field_possible_values: Mümkün olan təyinatlar + field_priority: Prioritet + field_project: Layihə + field_redirect_existing_links: Mövcud olan istinadları istiqamətləndirmək + field_regexp: Müntəzəm ifadə + field_role: Rol + field_searchable: Axtarış üçün açıqdır + field_spent_on: Tarix + field_start_date: Başlanıb + field_start_page: Başlanğıc səhifə + field_status: Status + field_subject: Mövzu + field_subproject: Altlayihə + field_summary: Qısa təsvir + field_text: Mətn sahəsi + field_time_entries: Sərf olunan zaman + field_time_zone: Saat qurşağı + field_title: Başlıq + field_tracker: Treker + field_type: Tip + field_updated_on: Yenilənib + field_url: URL + field_user: İstifadəçi + field_value: Təyinat + field_version: Variant + field_watcher: Nəzarətçi + + general_csv_decimal_separator: ',' + general_csv_encoding: UTF-8 + general_csv_separator: ';' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + general_lang_name: 'Azerbaijani (Azeri)' + general_text_no: 'xeyr' + general_text_No: 'Xeyr' + general_text_yes: 'bəli' + general_text_Yes: 'Bəli' + + label_activity: Görülən işlər + label_add_another_file: Bir fayl daha əlavə etmək + label_added_time_by: "Əlavə etdi %{author} %{age} əvvəl" + label_added: əlavə edilib + label_add_note: Qeydi əlavə etmək + label_administration: İnzibatçılıq + label_age: Yaş + label_ago: gün əvvəl + label_all_time: hər zaman + label_all_words: Bütün sözlər + label_all: hamı + label_and_its_subprojects: "%{value} və bütün altlayihələr" + label_applied_status: Tətbiq olunan status + label_ascending: Artmaya görə + label_assigned_to_me_issues: Mənim tapşırıqlarım + label_associated_revisions: Əlaqəli redaksiyalar + label_attachment: Fayl + label_attachment_delete: Faylı silmək + label_attachment_new: Yeni fayl + label_attachment_plural: Fayllar + label_attribute: Atribut + label_attribute_plural: Atributlar + label_authentication: Autentifikasiya + label_auth_source: Autentifikasiyanın rejimi + label_auth_source_new: Autentifikasiyanın yeni rejimi + label_auth_source_plural: Autentifikasiyanın rejimləri + label_blocked_by: bloklanır + label_blocks: bloklayır + label_board: Forum + label_board_new: Yeni forum + label_board_plural: Forumlar + label_boolean: Məntiqi + label_browse: Baxış + label_bulk_edit_selected_issues: Seçilən bütün tapşırıqları redaktə etmək + label_calendar: Təqvim + label_calendar_filter: O cümlədən + label_calendar_no_assigned: Mənim deyil + label_change_plural: Dəyişikliklər + label_change_properties: Xassələri dəyişmək + label_change_status: Statusu dəyişmək + label_change_view_all: Bütün dəyişikliklərə baxmaq + label_changes_details: Bütün dəyişikliklərə görə təfsilatlar + label_changeset_plural: Dəyişikliklər + label_chronological_order: Xronoloji ardıcıllıq ilə + label_closed_issues: Bağlıdır + label_closed_issues_plural: bağlıdır + label_closed_issues_plural2: bağlıdır + label_closed_issues_plural5: bağlıdır + label_comment: şərhlər + label_comment_add: Şərhləri qeyd etmək + label_comment_added: Əlavə olunmuş şərhlər + label_comment_delete: Şərhi silmək + label_comment_plural: Şərhlər + label_comment_plural2: Şərhlər + label_comment_plural5: şərhlərin + label_commits_per_author: İstifadəçi üzərində dəyişikliklər + label_commits_per_month: Ay üzərində dəyişikliklər + label_confirmation: Təsdiq + label_contains: tərkibi + label_copied: surəti köçürülüb + label_copy_workflow_from: görülən işlərin ardıcıllığının surətini köçürmək + label_current_status: Cari status + label_current_version: Cari variant + label_custom_field: Sazlanan sahə + label_custom_field_new: Yeni sazlanan sahə + label_custom_field_plural: Sazlanan sahələr + label_date_from: С + label_date_from_to: С %{start} по %{end} + label_date_range: vaxt intervalı + label_date_to: üzrə + label_date: Tarix + label_day_plural: gün + label_default: Susmaya görə + label_default_columns: Susmaya görə sütunlar + label_deleted: silinib + label_descending: Azalmaya görə + label_details: Təfsilatlar + label_diff_inline: mətndə + label_diff_side_by_side: Yanaşı + label_disabled: söndürülüb + label_display: Təsvir + label_display_per_page: "Səhifəyə: %{value}" + label_document: Sənəd + label_document_added: Sənəd əlavə edilib + label_document_new: Yeni sənəd + label_document_plural: Sənədlər + label_downloads_abbr: Yükləmələr + label_duplicated_by: çoxaldılır + label_duplicates: çoxaldır + label_enumeration_new: Yeni qiymət + label_enumerations: Qiymətlərin siyahısı + label_environment: Mühit + label_equals: sayılır + label_example: Nümunə + label_export_to: ixrac etmək + label_feed_plural: Atom + label_feeds_access_key_created_on: "Atom-ə giriş açarı %{value} əvvəl yaradılıb" + label_f_hour: "%{value} saat" + label_f_hour_plural: "%{value} saat" + label_file_added: Fayl əlavə edilib + label_file_plural: Fayllar + label_filter_add: Filtr əlavə etmək + label_filter_plural: Filtrlər + label_float: Həqiqi ədəd + label_follows: Əvvəlki + label_gantt: Qant diaqramması + label_general: Ümumi + label_generate_key: Açarı generasiya etmək + label_greater_or_equal: ">=" + label_help: Kömək + label_history: Tarixçə + label_home: Ana səhifə + label_incoming_emails: Məlumatların qəbulu + label_index_by_date: Səhifələrin tarixçəsi + label_index_by_title: Başlıq + label_information_plural: İnformasiya + label_information: İnformasiya + label_in_less_than: az + label_in_more_than: çox + label_integer: Tam + label_internal: Daxili + label_in: da (də) + label_issue: Tapşırıq + label_issue_added: Tapşırıq əlavə edilib + label_issue_category_new: Yeni kateqoriya + label_issue_category_plural: Tapşırığın kateqoriyası + label_issue_category: Tapşırığın kateqoriyası + label_issue_new: Yeni tapşırıq + label_issue_plural: Tapşırıqlar + label_issues_by: "%{value} üzrə çeşidləmək" + label_issue_status_new: Yeni status + label_issue_status_plural: Tapşırıqların statusu + label_issue_status: Tapşırığın statusu + label_issue_tracking: Tapşırıqlar + label_issue_updated: Tapşırıq yenilənib + label_issue_view_all: Bütün tapşırıqlara baxmaq + label_issue_watchers: Nəzarətçilər + label_jump_to_a_project: ... layihəyə keçid + label_language_based: Dilin əsasında + label_last_changes: "%{count} az dəyişiklik" + label_last_login: Sonuncu qoşulma + label_last_month: sonuncu ay + label_last_n_days: "son %{count} gün" + label_last_week: sonuncu həftə + label_latest_revision: Sonuncu redaksiya + label_latest_revision_plural: Sonuncu redaksiyalar + label_ldap_authentication: LDAP vasitəsilə avtorizasiya + label_less_or_equal: <= + label_less_than_ago: gündən az + label_list: Siyahı + label_loading: Yükləmə... + label_logged_as: Daxil olmusunuz + label_login: Daxil olmaq + label_login_with_open_id_option: və ya OpenID vasitəsilə daxil olmaq + label_logout: Çıxış + label_max_size: Maksimal ölçü + label_member_new: Yeni iştirakçı + label_member: İştirakçı + label_member_plural: İştirakçılar + label_message_last: Sonuncu məlumat + label_message_new: Yeni məlumat + label_message_plural: Məlumatlar + label_message_posted: Məlumat əlavə olunub + label_me: mənə + label_min_max_length: Minimal - maksimal uzunluq + label_modified: dəyişilib + label_module_plural: Modullar + label_months_from: ay + label_month: Ay + label_more_than_ago: gündən əvvəl + label_my_account: Mənim hesabım + label_my_page: Mənim səhifəm + label_my_projects: Mənim layihələrim + label_new: Yeni + label_new_statuses_allowed: İcazə verilən yeni statuslar + label_news_added: Xəbər əlavə edilib + label_news_latest: Son xəbərlər + label_news_new: Xəbər əlavə etmək + label_news_plural: Xəbərlər + label_news_view_all: Bütün xəbərlərə baxmaq + label_news: Xəbərlər + label_next: Növbəti + label_nobody: heç kim + label_no_change_option: (Dəyişiklik yoxdur) + label_no_data: Təsvir üçün verilənlər yoxdur + label_none: yoxdur + label_not_contains: mövcud deyil + label_not_equals: sayılmır + label_open_issues: açıqdır + label_open_issues_plural: açıqdır + label_open_issues_plural2: açıqdır + label_open_issues_plural5: açıqdır + label_optional_description: Təsvir (vacib deyil) + label_options: Opsiyalar + label_overall_activity: Görülən işlərin toplu hesabatı + label_overview: Baxış + label_password_lost: Parolun bərpası + label_permissions_report: Giriş hüquqları üzrə hesabat + label_permissions: Giriş hüquqları + label_please_login: Xahiş edirik, daxil olun. + label_plugins: Modullar + label_precedes: növbəti + label_preferences: Üstünlük + label_preview: İlkin baxış + label_previous: Əvvəlki + label_profile: Profil + label_project: Layihə + label_project_all: Bütün layihələr + label_project_copy_notifications: Layihənin surətinin çıxarılması zamanı elektron poçt ilə bildiriş göndərmək + label_project_latest: Son layihələr + label_project_new: Yeni layihə + label_project_plural: Layihələr + label_project_plural2: layihəni + label_project_plural5: layihələri + label_public_projects: Ümumi layihələr + label_query: Yadda saxlanılmış sorğu + label_query_new: Yeni sorğu + label_query_plural: Yadda saxlanılmış sorğular + label_read: Oxu... + label_register: Qeydiyyat + label_registered_on: Qeydiyyatdan keçib + label_registration_activation_by_email: e-poçt üzrə hesabımın aktivləşdirilməsi + label_registration_automatic_activation: uçot qeydlərinin avtomatik aktivləşdirilməsi + label_registration_manual_activation: uçot qeydlərini əl ilə aktivləşdirmək + label_related_issues: Əlaqəli tapşırıqlar + label_relates_to: əlaqəlidir + label_relation_delete: Əlaqəni silmək + label_relation_new: Yeni münasibət + label_renamed: adını dəyişmək + label_reply_plural: Cavablar + label_report: Hesabat + label_report_plural: Hesabatlar + label_reported_issues: Yaradılan tapşırıqlar + label_repository: Saxlayıcı + label_repository_plural: Saxlayıcı + label_result_plural: Nəticələr + label_reverse_chronological_order: Əks ardıcıllıqda + label_revision: Redaksiya + label_revision_plural: Redaksiyalar + label_roadmap: Operativ plan + label_roadmap_due_in: "%{value} müddətində" + label_roadmap_no_issues: bu versiya üçün tapşırıq yoxdur + label_roadmap_overdue: "gecikmə %{value}" + label_role: Rol + label_role_and_permissions: Rollar və giriş hüquqları + label_role_new: Yeni rol + label_role_plural: Rollar + label_scm: Saxlayıcının tipi + label_search: Axtarış + label_search_titles_only: Ancaq adlarda axtarmaq + label_send_information: İstifadəçiyə uçot qeydləri üzrə informasiyanı göndərmək + label_send_test_email: Yoxlama üçün email göndərmək + label_settings: Sazlamalar + label_show_completed_versions: Bitmiş variantları göstərmək + label_sort: Çeşidləmək + label_sort_by: "%{value} üzrə çeşidləmək" + label_sort_higher: Yuxarı + label_sort_highest: Əvvələ qayıt + label_sort_lower: Aşağı + label_sort_lowest: Sona qayıt + label_spent_time: Sərf olunan vaxt + label_statistics: Statistika + label_stay_logged_in: Sistemdə qalmaq + label_string: Mətn + label_subproject_plural: Altlayihələr + label_subtask_plural: Alt tapşırıqlar + label_text: Uzun mətn + label_theme: Mövzu + label_this_month: bu ay + label_this_week: bu həftə + label_this_year: bu il + label_time_tracking: Vaxtın uçotu + label_timelog_today: Bu günə sərf olunan vaxt + label_today: bu gün + label_topic_plural: Mövzular + label_total: Cəmi + label_tracker: Treker + label_tracker_new: Yeni treker + label_tracker_plural: Trekerlər + label_updated_time: "%{value} əvvəl yenilənib" + label_updated_time_by: "%{author} %{age} əvvəl yenilənib" + label_used_by: İstifadə olunur + label_user: İstifasdəçi + label_user_activity: "İstifadəçinin gördüyü işlər %{value}" + label_user_mail_no_self_notified: "Tərəfimdən edilən dəyişikliklər haqqında məni xəbərdar etməmək" + label_user_mail_option_all: "Mənim layihələrimdəki bütün hadisələr haqqında" + label_user_mail_option_selected: "Yalnız seçilən layihədəki bütün hadisələr haqqında..." + label_user_mail_option_only_my_events: Yalnız izlədiyim və ya iştirak etdiyim obyektlər üçün + label_user_new: Yeni istifadəçi + label_user_plural: İstifadəçilər + label_version: Variant + label_version_new: Yeni variant + label_version_plural: Variantlar + label_view_diff: Fərqlərə baxmaq + label_view_revisions: Redaksiyalara baxmaq + label_watched_issues: Tapşırığın izlənilməsi + label_week: Həftə + label_wiki: Wiki + label_wiki_edit: Wiki-nin redaktəsi + label_wiki_edit_plural: Wiki + label_wiki_page: Wiki səhifəsi + label_wiki_page_plural: Wiki səhifələri + label_workflow: Görülən işlərin ardıcıllığı + label_x_closed_issues_abbr: + zero: "0 bağlıdır" + one: "1 bağlanıb" + few: "%{count} bağlıdır" + many: "%{count} bağlıdır" + other: "%{count} bağlıdır" + label_x_comments: + zero: "şərh yoxdur" + one: "1 şərh" + few: "%{count} şərhlər" + many: "%{count} şərh" + other: "%{count} şərh" + label_x_open_issues_abbr: + zero: "0 açıqdır" + one: "1 açıq" + few: "%{count} açıqdır" + many: "%{count} açıqdır" + other: "%{count} açıqdır" + label_x_projects: + zero: "layihələr yoxdur" + one: "1 layihə" + few: "%{count} layihə" + many: "%{count} layihə" + other: "%{count} layihə" + label_year: İl + label_yesterday: dünən + + mail_body_account_activation_request: "Yeni istifadəçi qeydiyyatdan keçib (%{value}). Uçot qeydi Sizin təsdiqinizi gözləyir:" + mail_body_account_information: Sizin uçot qeydiniz haqqında informasiya + mail_body_account_information_external: "Siz özünüzün %{value} uçot qeydinizi giriş üçün istifadə edə bilərsiniz." + mail_body_lost_password: 'Parolun dəyişdirilməsi üçün aşağıdakı linkə keçin:' + mail_body_register: 'Uçot qeydinin aktivləşdirilməsi üçün aşağıdakı linkə keçin:' + mail_body_reminder: "növbəti %{days} gün üçün Sizə təyin olunan %{count}:" + mail_subject_account_activation_request: "Sistemdə istifadəçinin aktivləşdirilməsi üçün sorğu %{value}" + mail_subject_lost_password: "Sizin %{value} parolunuz" + mail_subject_register: "Uçot qeydinin aktivləşdirilməsi %{value}" + mail_subject_reminder: "yaxın %{days} gün üçün Sizə təyin olunan %{count}" + + notice_account_activated: Sizin uçot qeydiniz aktivləşdirilib. Sistemə daxil ola bilərsiniz. + notice_account_invalid_credentials: İstifadəçi adı və ya parolu düzgün deyildir + notice_account_lost_email_sent: Sizə yeni parolun seçimi ilə bağlı təlimatı əks etdirən məktub göndərilmişdir. + notice_account_password_updated: Parol müvəffəqiyyətlə yeniləndi. + notice_account_pending: "Sizin uçot qeydiniz yaradıldı və inzibatçının təsdiqini gözləyir." + notice_account_register_done: Uçot qeydi müvəffəqiyyətlə yaradıldı. Sizin uçot qeydinizin aktivləşdirilməsi üçün elektron poçtunuza göndərilən linkə keçin. + notice_account_unknown_email: Naməlum istifadəçi. + notice_account_updated: Uçot qeydi müvəffəqiyyətlə yeniləndi. + notice_account_wrong_password: Parol düzgün deyildir + notice_can_t_change_password: Bu uçot qeydi üçün xarici autentifikasiya mənbəyi istifadə olunur. Parolu dəyişmək mümkün deyildir. + notice_default_data_loaded: Susmaya görə konfiqurasiya yüklənilmişdir. + notice_email_error: "Məktubun göndərilməsi zamanı səhv baş vermişdi (%{value})" + notice_email_sent: "Məktub göndərilib %{value}" + notice_failed_to_save_issues: "Seçilən %{total} içərisindən %{count} bəndləri saxlamaq mümkün olmadı: %{ids}." + notice_failed_to_save_members: "İştirakçını (ları) yadda saxlamaq mümkün olmadı: %{errors}." + notice_feeds_access_key_reseted: Sizin Atom giriş açarınız sıfırlanmışdır. + notice_file_not_found: Daxil olmağa çalışdığınız səhifə mövcud deyildir və ya silinib. + notice_locking_conflict: İnformasiya digər istifadəçi tərəfindən yenilənib. + notice_no_issue_selected: "Heç bir tapşırıq seçilməyib! Xahiş edirik, redaktə etmək istədiyiniz tapşırığı qeyd edin." + notice_not_authorized: Sizin bu səhifəyə daxil olmaq hüququnuz yoxdur. + notice_successful_connection: Qoşulma müvəffəqiyyətlə yerinə yetirilib. + notice_successful_create: Yaratma müvəffəqiyyətlə yerinə yetirildi. + notice_successful_delete: Silinmə müvəffəqiyyətlə yerinə yetirildi. + notice_successful_update: Yeniləmə müvəffəqiyyətlə yerinə yetirildi. + notice_unable_delete_version: Variantı silmək mümkün olmadı. + + permission_add_issues: Tapşırıqların əlavə edilməsi + permission_add_issue_notes: Qeydlərin əlavə edilməsi + permission_add_issue_watchers: Nəzarətçilərin əlavə edilməsi + permission_add_messages: Məlumatların göndərilməsi + permission_browse_repository: Saxlayıcıya baxış + permission_comment_news: Xəbərlərə şərh + permission_commit_access: Saxlayıcıda faylların dəyişdirilməsi + permission_delete_issues: Tapşırıqların silinməsi + permission_delete_messages: Məlumatların silinməsi + permission_delete_own_messages: Şəxsi məlumatların silinməsi + permission_delete_wiki_pages: Wiki-səhifələrin silinməsi + permission_delete_wiki_pages_attachments: Bərkidilən faylların silinməsi + permission_edit_issue_notes: Qeydlərin redaktə edilməsi + permission_edit_issues: Tapşırıqların redaktə edilməsi + permission_edit_messages: Məlumatların redaktə edilməsi + permission_edit_own_issue_notes: Şəxsi qeydlərin redaktə edilməsi + permission_edit_own_messages: Şəxsi məlumatların redaktə edilməsi + permission_edit_own_time_entries: Şəxsi vaxt uçotunun redaktə edilməsi + permission_edit_project: Layihələrin redaktə edilməsi + permission_edit_time_entries: Vaxt uçotunun redaktə edilməsi + permission_edit_wiki_pages: Wiki-səhifənin redaktə edilməsi + permission_export_wiki_pages: Wiki-səhifənin ixracı + permission_log_time: Sərf olunan vaxtın uçotu + permission_view_changesets: Saxlayıcı dəyişikliklərinə baxış + permission_view_time_entries: Sərf olunan vaxta baxış + permission_manage_project_activities: Layihə üçün hərəkət tiplərinin idarə edilməsi + permission_manage_boards: Forumların idarə edilməsi + permission_manage_categories: Tapşırıq kateqoriyalarının idarə edilməsi + permission_manage_files: Faylların idarə edilməsi + permission_manage_issue_relations: Tapşırıq bağlantılarının idarə edilməsi + permission_manage_members: İştirakçıların idarə edilməsi + permission_manage_news: Xəbərlərin idarə edilməsi + permission_manage_public_queries: Ümumi sorğuların idarə edilməsi + permission_manage_repository: Saxlayıcının idarə edilməsi + permission_manage_subtasks: Alt tapşırıqların idarə edilməsi + permission_manage_versions: Variantların idarə edilməsi + permission_manage_wiki: Wiki-nin idarə edilməsi + permission_move_issues: Tapşırıqların köçürülməsi + permission_protect_wiki_pages: Wiki-səhifələrin bloklanması + permission_rename_wiki_pages: Wiki-səhifələrin adının dəyişdirilməsi + permission_save_queries: Sorğuların yadda saxlanılması + permission_select_project_modules: Layihə modulunun seçimi + permission_view_calendar: Təqvimə baxış + permission_view_documents: Sənədlərə baxış + permission_view_files: Fayllara baxış + permission_view_gantt: Qant diaqramına baxış + permission_view_issue_watchers: Nəzarətçilərin siyahılarına baxış + permission_view_messages: Məlumatlara baxış + permission_view_wiki_edits: Wiki tarixçəsinə baxış + permission_view_wiki_pages: Wiki-yə baxış + + project_module_boards: Forumlar + project_module_documents: Sənədlər + project_module_files: Fayllar + project_module_issue_tracking: Tapşırıqlar + project_module_news: Xəbərlər + project_module_repository: Saxlayıcı + project_module_time_tracking: Vaxtın uçotu + project_module_wiki: Wiki + project_module_gantt: Qant diaqramı + project_module_calendar: Təqvim + + setting_activity_days_default: Görülən işlərdə əks olunan günlərin sayı + setting_app_subtitle: Əlavənin sərlövhəsi + setting_app_title: Əlavənin adı + setting_attachment_max_size: Yerləşdirmənin maksimal ölçüsü + setting_autofetch_changesets: Saxlayıcının dəyişikliklərini avtomatik izləmək + setting_autologin: Avtomatik giriş + setting_bcc_recipients: Gizli surətləri istifadə etmək (BCC) + setting_cache_formatted_text: Formatlaşdırılmış mətnin heşlənməsi + setting_commit_fix_keywords: Açar sözlərin təyini + setting_commit_ref_keywords: Axtarış üçün açar sözlər + setting_cross_project_issue_relations: Layihələr üzrə tapşırıqların kəsişməsinə icazə vermək + setting_date_format: Tarixin formatı + setting_default_language: Susmaya görə dil + setting_default_notification_option: Susmaya görə xəbərdarlıq üsulu + setting_default_projects_public: Yeni layihələr ümumaçıq hesab edilir + setting_diff_max_lines_displayed: diff üçün sətirlərin maksimal sayı + setting_display_subprojects_issues: Susmaya görə altlayihələrin əks olunması + setting_emails_footer: Məktubun sətiraltı qeydləri + setting_enabled_scm: Daxil edilən SCM + setting_feeds_limit: Atom axını üçün başlıqların sayının məhdudlaşdırılması + setting_file_max_size_displayed: Əks olunma üçün mətn faylının maksimal ölçüsü + setting_gravatar_enabled: İstifadəçi avatarını Gravatar-dan istifadə etmək + setting_host_name: Kompyuterin adı + setting_issue_list_default_columns: Susmaya görə tapşırıqların siyahısında əks oluna sütunlar + setting_issues_export_limit: İxrac olunan tapşırıqlar üzrə məhdudiyyətlər + setting_login_required: Autentifikasiya vacibdir + setting_mail_from: Çıxan e-poçt ünvanı + setting_mail_handler_api_enabled: Daxil olan məlumatlar üçün veb-servisi qoşmaq + setting_mail_handler_api_key: API açar + setting_openid: Giriş və qeydiyyat üçün OpenID izacə vermək + setting_per_page_options: Səhifə üçün qeydlərin sayı + setting_plain_text_mail: Yalnız sadə mətn (HTML olmadan) + setting_protocol: Protokol + setting_repository_log_display_limit: Dəyişikliklər jurnalında əks olunan redaksiyaların maksimal sayı + setting_self_registration: Özünüqeydiyyat + setting_sequential_project_identifiers: Layihələrin ardıcıl identifikatorlarını generasiya etmək + setting_sys_api_enabled: Saxlayıcının idarə edilməsi üçün veb-servisi qoşmaq + setting_text_formatting: Mətnin formatlaşdırılması + setting_time_format: Vaxtın formatı + setting_user_format: Adın əks olunma formatı + setting_welcome_text: Salamlama mətni + setting_wiki_compression: Wiki tarixçəsinin sıxlaşdırılması + + status_active: aktivdir + status_locked: bloklanıb + status_registered: qeydiyyatdan keçib + + text_are_you_sure: Siz əminsinizmi? + text_assign_time_entries_to_project: Qeydiyyata alınmış vaxtı layihəyə bərkitmək + text_caracters_maximum: "Maksimum %{count} simvol." + text_caracters_minimum: "%{count} simvoldan az olmamalıdır." + text_comma_separated: Bir neçə qiymət mümkündür (vergül vasitəsilə). + text_custom_field_possible_values_info: 'Hər sətirə bir qiymət' + text_default_administrator_account_changed: İnzibatçının uçot qeydi susmaya görə dəyişmişdir + text_destroy_time_entries_question: "Bu tapşırıq üçün sərf olunan vaxta görə %{hours} saat qeydiyyata alınıb. Siz nə etmək istəyirsiniz?" + text_destroy_time_entries: Qeydiyyata alınmış vaxtı silmək + text_diff_truncated: '... Bu diff məhduddur, çünki əks olunan maksimal ölçünü keçir.' + text_email_delivery_not_configured: "Poçt serveri ilə işin parametrləri sazlanmayıb və e-poçt ilə bildiriş funksiyası aktiv deyildir.\nSizin SMTP-server üçün parametrləri config/configuration.yml faylından sazlaya bilərsiniz. Dəyişikliklərin tətbiq edilməsi üçün əlavəni yenidən başladın." + text_enumeration_category_reassign_to: 'Onlara aşağıdakı qiymətləri təyin etmək:' + text_enumeration_destroy_question: "%{count} obyekt bu qiymətlə bağlıdır." + text_file_repository_writable: Qeydə giriş imkanı olan saxlayıcı + text_issue_added: "Yeni tapşırıq yaradılıb %{id} (%{author})." + text_issue_category_destroy_assignments: Kateqoriyanın təyinatını silmək + text_issue_category_destroy_question: "Bir neçə tapşırıq (%{count}) bu kateqoriya üçün təyin edilib. Siz nə etmək istəyirsiniz?" + text_issue_category_reassign_to: Bu kateqoriya üçün tapşırığı yenidən təyin etmək + text_issues_destroy_confirmation: 'Seçilən tapşırıqları silmək istədiyinizə əminsinizmi?' + text_issues_ref_in_commit_messages: Məlumatın mətnindən çıxış edərək tapşırıqların statuslarının tutuşdurulması və dəyişdirilməsi + text_issue_updated: "Tapşırıq %{id} yenilənib (%{author})." + text_journal_changed: "Parametr %{label} %{old} - %{new} dəyişib" + text_journal_deleted: "Parametrin %{old} qiyməti %{label} silinib" + text_journal_set_to: "%{label} parametri %{value} dəyişib" + text_length_between: "%{min} və %{max} simvollar arasındakı uzunluq." + text_load_default_configuration: Susmaya görə konfiqurasiyanı yükləmək + text_min_max_length_info: 0 məhdudiyyətlərin olmadığını bildirir + text_no_configuration_data: "Rollar, trekerlər, tapşırıqların statusları və operativ plan konfiqurasiya olunmayıblar.\nSusmaya görə konfiqurasiyanın yüklənməsi təkidlə xahiş olunur. Siz onu sonradan dəyişə bilərsiniz." + text_plugin_assets_writable: Modullar kataloqu qeyd üçün açıqdır + text_project_destroy_confirmation: Siz bu layihə və ona aid olan bütün informasiyanı silmək istədiyinizə əminsinizmi? + text_reassign_time_entries: 'Qeydiyyata alınmış vaxtı aşağıdakı tapşırığa keçir:' + text_regexp_info: "məsələn: ^[A-Z0-9]+$" + text_repository_usernames_mapping: "Saxlayıcının jurnalında tapılan adlarla bağlı olan Redmine istifadəçisini seçin və ya yeniləyin.\nEyni ad və e-poçta sahib olan istifadəçilər Redmine və saxlayıcıda avtomatik əlaqələndirilir." + text_rmagick_available: RMagick istifadəsi mümkündür (opsional olaraq) + text_select_mail_notifications: Elektron poçta bildirişlərin göndərilməsi seçim edəcəyiniz hərəkətlərdən asılıdır. + text_select_project_modules: 'Layihədə istifadə olunacaq modulları seçin:' + text_status_changed_by_changeset: "%{value} redaksiyada reallaşdırılıb." + text_subprojects_destroy_warning: "Altlayihələr: %{value} həmçinin silinəcək." + text_tip_issue_begin_day: tapşırığın başlanğıc tarixi + text_tip_issue_begin_end_day: elə həmin gün tapşırığın başlanğıc və bitmə tarixi + text_tip_issue_end_day: tapşırığın başa çatma tarixi + text_tracker_no_workflow: Bu treker üçün hərəkətlərin ardıcıllığı müəyyən ediməyib + text_unallowed_characters: Qadağan edilmiş simvollar + text_user_mail_option: "Seçilməyən layihələr üçün Siz yalnız baxdığınız və ya iştirak etdiyiniz layihələr barədə bildiriş alacaqsınız məsələn, müəllifi olduğunuz layihələr və ya o layihələr ki, Sizə təyin edilib)." + text_user_wrote: "%{value} yazıb:" + text_wiki_destroy_confirmation: Siz bu Wiki və onun tərkibindəkiləri silmək istədiyinizə əminsinizmi? + text_workflow_edit: Vəziyyətlərin ardıcıllığını redaktə etmək üçün rol və trekeri seçin + + warning_attachments_not_saved: "faylın (ların) %{count} yadda saxlamaq mümkün deyildir." + text_wiki_page_destroy_question: Bu səhifə %{descendants} yaxın və çox yaxın səhifələrə malikdir. Siz nə etmək istəyirsiniz? + text_wiki_page_reassign_children: Cari səhifə üçün yaxın səhifələri yenidən təyin etmək + text_wiki_page_nullify_children: Yaxın səhifələri baş səhifələr etmək + text_wiki_page_destroy_children: Yaxın və çox yaxın səhifələri silmək + setting_password_min_length: Parolun minimal uzunluğu + field_group_by: Nəticələri qruplaşdırmaq + mail_subject_wiki_content_updated: "Wiki-səhifə '%{id}' yenilənmişdir" + label_wiki_content_added: Wiki-səhifə əlavə olunub + mail_subject_wiki_content_added: "Wiki-səhifə '%{id}' əlavə edilib" + mail_body_wiki_content_added: "%{author} Wiki-səhifəni '%{id}' əlavə edib." + label_wiki_content_updated: Wiki-səhifə yenilənib + mail_body_wiki_content_updated: "%{author} Wiki-səhifəni '%{id}' yeniləyib." + permission_add_project: Layihənin yaradılması + setting_new_project_user_role_id: Layihəni yaradan istifadəçiyə təyin olunan rol + label_view_all_revisions: Bütün yoxlamaları göstərmək + label_tag: Nişan + label_branch: Şöbə + error_no_tracker_in_project: Bu layihə ilə heç bir treker assosiasiya olunmayıb. Layihənin sazlamalarını yoxlayın. + error_no_default_issue_status: Susmaya görə tapşırıqların statusu müəyyən edilməyib. Sazlamaları yoxlayın (bax. "İnzibatçılıq -> Tapşırıqların statusu"). + label_group_plural: Qruplar + label_group: Qrup + label_group_new: Yeni qrup + label_time_entry_plural: Sərf olunan vaxt + text_journal_added: "%{label} %{value} əlavə edilib" + field_active: Aktiv + enumeration_system_activity: Sistemli + permission_delete_issue_watchers: Nəzarətçilərin silinməsi + version_status_closed: Bağlanıb + version_status_locked: bloklanıb + version_status_open: açıqdır + error_can_not_reopen_issue_on_closed_version: Bağlı varianta təyin edilən tapşırıq yenidən açıq ola bilməz + label_user_anonymous: Anonim + button_move_and_follow: Yerləşdirmək və keçid + setting_default_projects_modules: Yeni layihələr üçün susmaya görə daxil edilən modullar + setting_gravatar_default: Susmaya görə Gravatar təsviri + field_sharing: Birgə istifadə + label_version_sharing_hierarchy: Layihələrin iyerarxiyasına görə + label_version_sharing_system: bütün layihələr ilə + label_version_sharing_descendants: Alt layihələr ilə + label_version_sharing_tree: Layihələrin iyerarxiyası ilə + label_version_sharing_none: Birgə istifadə olmadan + error_can_not_archive_project: Bu layihə arxivləşdirilə bilməz + button_duplicate: Təkrarlamaq + button_copy_and_follow: Surətini çıxarmaq və davam etmək + label_copy_source: Mənbə + setting_issue_done_ratio: Sahənin köməyi ilə tapşırığın hazırlığını nəzərə almaq + setting_issue_done_ratio_issue_status: Tapşırığın statusu + error_issue_done_ratios_not_updated: Tapşırıqların hazırlıq parametri yenilənməyib + error_workflow_copy_target: Məqsədə uyğun trekerləri və rolları seçin + setting_issue_done_ratio_issue_field: Tapşırığın hazırlıq səviyyəsi + label_copy_same_as_target: Məqsəddə olduğu kimi + label_copy_target: Məqsəd + notice_issue_done_ratios_updated: Parametr «hazırlıq» yenilənib. + error_workflow_copy_source: Cari trekeri və ya rolu seçin + label_update_issue_done_ratios: Tapşırığın hazırlıq səviyyəsini yeniləmək + setting_start_of_week: Həftənin birinci günü + label_api_access_key: API-yə giriş açarı + text_line_separated: Bİr neçə qiymət icazə verilib (hər sətirə bir qiymət). + label_revision_id: Yoxlama %{value} + permission_view_issues: Tapşırıqlara baxış + label_display_used_statuses_only: Yalnız bu trekerdə istifadə olunan statusları əks etdirmək + label_api_access_key_created_on: API-yə giriş açarı %{value} əvvəl aradılıb + label_feeds_access_key: Atom giriş açarı + notice_api_access_key_reseted: Sizin API giriş açarınız sıfırlanıb. + setting_rest_api_enabled: REST veb-servisini qoşmaq + button_show: Göstərmək + label_missing_api_access_key: API-yə giriş açarı mövcud deyildir + label_missing_feeds_access_key: Atom-ə giriş açarı mövcud deyildir + setting_mail_handler_body_delimiters: Bu sətirlərin birindən sonra məktubu qısaltmaq + permission_add_subprojects: Alt layihələrin yaradılması + label_subproject_new: Yeni alt layihə + text_own_membership_delete_confirmation: |- + Siz bəzi və ya bütün hüquqları silməyə çalışırsınız, nəticədə bu layihəni redaktə etmək hüququnu da itirə bilərsiniz. Davam etmək istədiyinizə əminsinizmi? + + label_close_versions: Başa çatmış variantları bağlamaq + label_board_sticky: Bərkidilib + label_board_locked: Bloklanıb + field_principal: Ad + text_zoom_out: Uzaqlaşdırmaq + text_zoom_in: Yaxınlaşdırmaq + notice_unable_delete_time_entry: Jurnalın qeydini silmək mümkün deyildir. + label_overall_spent_time: Cəmi sərf olunan vaxt + label_user_mail_option_none: Hadisə yoxdur + field_member_of_group: Təyin olunmuş qrup + field_assigned_to_role: Təyin olunmuş rol + notice_not_authorized_archived_project: Sorğulanan layihə arxivləşdirilib. + label_principal_search: "İstifadəçini və ya qrupu tapmaq:" + label_user_search: "İstifadəçini tapmaq:" + field_visible: Görünmə dərəcəsi + setting_emails_header: Məktubun başlığı + + setting_commit_logtime_activity_id: Vaxtın uçotu üçün görülən hərəkətlər + text_time_logged_by_changeset: "%{value} redaksiyada nəzərə alınıb." + setting_commit_logtime_enabled: Vaxt uçotunu qoşmaq + notice_gantt_chart_truncated: Əks oluna biləcək elementlərin maksimal sayı artdığına görə diaqram kəsiləcək (%{max}) + setting_gantt_items_limit: Qant diaqramında əks olunan elementlərin maksimal sayı + field_warn_on_leaving_unsaved: Yadda saxlanılmayan mətnin səhifəsi bağlanan zaman xəbərdarlıq etmək + text_warn_on_leaving_unsaved: Tərk etmək istədiyiniz cari səhifədə yadda saxlanılmayan və itə biləcək mətn vardır. + label_my_queries: Mənim yadda saxlanılan sorğularım + text_journal_changed_no_detail: "%{label} yenilənib" + label_news_comment_added: Xəbərə şərh əlavə olunub + button_expand_all: Hamısını aç + button_collapse_all: Hamısını çevir + label_additional_workflow_transitions_for_assignee: İstifadəçi icraçı olduğu zaman əlavə keçidlər + label_additional_workflow_transitions_for_author: İstifadəçi müəllif olduğu zaman əlavə keçidlər + label_bulk_edit_selected_time_entries: Sərf olunan vaxtın seçilən qeydlərinin kütləvi şəkildə dəyişdirilməsi + text_time_entries_destroy_confirmation: Siz sərf olunan vaxtın seçilən qeydlərini silmək istədiyinizə əminsinizmi? + label_role_anonymous: Anonim + label_role_non_member: İştirakçı deyil + label_issue_note_added: Qeyd əlavə olunub + label_issue_status_updated: Status yenilənib + label_issue_priority_updated: Prioritet yenilənib + label_issues_visibility_own: İstifadəçi üçün yaradılan və ya ona təyin olunan tapşırıqlar + field_issues_visibility: Tapşırıqların görünmə dərəcəsi + label_issues_visibility_all: Bütün tapşırıqlar + permission_set_own_issues_private: Şəxsi tapşırıqlar üçün görünmə dərəcəsinin (ümumi/şəxsi) qurulması + field_is_private: Şəxsi + permission_set_issues_private: Tapşırıqlar üçün görünmə dərəcəsinin (ümumi/şəxsi) qurulması + label_issues_visibility_public: Yalnız ümumi tapşırıqlar + text_issues_destroy_descendants_confirmation: Həmçinin %{count} tapşırıq (lar) silinəcək. + field_commit_logs_encoding: Saxlayıcıda şərhlərin kodlaşdırılması + field_scm_path_encoding: Yolun kodlaşdırılması + text_scm_path_encoding_note: "Susmaya görə: UTF-8" + field_path_to_repository: Saxlayıcıya yol + field_root_directory: Kök direktoriya + field_cvs_module: Modul + field_cvsroot: CVSROOT + text_mercurial_repository_note: Lokal saxlayıcı (məsələn, /hgrepo, c:\hgrepo) + text_scm_command: Komanda + text_scm_command_version: Variant + label_git_report_last_commit: Fayllar və direktoriyalar üçün son dəyişiklikləri göstərmək + text_scm_config: Siz config/configuration.yml faylında SCM komandasını sazlaya bilərsiniz. Xahiş olunur, bu faylın redaktəsindən sonra əlavəni işə salın. + text_scm_command_not_available: Variantların nəzarət sisteminin komandasına giriş mümkün deyildir. Xahiş olunur, inzibatçı panelindəki sazlamaları yoxlayın. + notice_issue_successful_create: Tapşırıq %{id} yaradılıb. + label_between: arasında + setting_issue_group_assignment: İstifadəçi qruplarına təyinata icazə vermək + label_diff: Fərq(diff) + text_git_repository_note: "Saxlama yerini göstərin (məs: /gitrepo, c:\\gitrepo)" + description_query_sort_criteria_direction: Çeşidləmə qaydası + description_project_scope: Layihənin həcmi + description_filter: Filtr + description_user_mail_notification: E-poçt Mail xəbərdarlıqlarının sazlaması + description_message_content: Mesajın kontenti + description_available_columns: Mövcud sütunlar + description_issue_category_reassign: Məsələnin kateqoriyasını seçin + description_search: Axtarış sahəsi + description_notes: Qeyd + description_choose_project: Layihələr + description_query_sort_criteria_attribute: Çeşidləmə meyarları + description_wiki_subpages_reassign: Yeni valideyn səhifəsini seçmək + description_selected_columns: Seçilmiş sütunlar + label_parent_revision: Valideyn + label_child_revision: Əsas + error_scm_annotate_big_text_file: Mətn faylının maksimal ölçüsü artdığına görə şərh mümkün deyildir. + setting_default_issue_start_date_to_creation_date: Yeni tapşırıqlar üçün cari tarixi başlanğıc tarixi kimi istifadə etmək + button_edit_section: Bu bölməni redaktə etmək + setting_repositories_encodings: Əlavələrin və saxlayıcıların kodlaşdırılması + description_all_columns: Bütün sütunlar + button_export: İxrac + label_export_options: "%{export_format} ixracın parametrləri" + error_attachment_too_big: Faylın maksimal ölçüsü artdığına görə bu faylı yükləmək mümkün deyildir (%{max_size}) + notice_failed_to_save_time_entries: "Səhv N %{ids}. %{total} girişdən %{count} yaddaşa saxlanıla bilmədi." + label_x_issues: + zero: 0 Tapşırıq + one: 1 Tapşırıq + few: "%{count} Tapşırıq" + many: "%{count} Tapşırıq" + other: "%{count} Tapşırıq" + label_repository_new: Yeni saxlayıcı + field_repository_is_default: Susmaya görə saxlayıcı + label_copy_attachments: Əlavənin surətini çıxarmaq + label_item_position: "%{position}/%{count}" + label_completed_versions: Başa çatdırılmış variantlar + text_project_identifier_info: Yalnız kiçik latın hərflərinə (a-z), rəqəmlərə, tire və çicgilərə icazə verilir.
    Yadda saxladıqdan sonra identifikatoru dəyişmək olmaz. + field_multiple: Çoxsaylı qiymətlər + setting_commit_cross_project_ref: Digər bütün layihələrdə tapşırıqları düzəltmək və istinad etmək + text_issue_conflict_resolution_add_notes: Qeydlərimi əlavə etmək və mənim dəyişikliklərimdən imtina etmək + text_issue_conflict_resolution_overwrite: Dəyişikliklərimi tətbiq etmək (əvvəlki bütün qeydlər yadda saxlanacaq, lakin bəzi qeydlər yenidən yazıla bilər) + notice_issue_update_conflict: Tapşırığı redaktə etdiyiniz zaman kimsə onu artıq dəyişib. + text_issue_conflict_resolution_cancel: Mənim dəyişikliklərimi ləğv etmək və tapşırığı yenidən göstərmək %{link} + permission_manage_related_issues: Əlaqəli tapşırıqların idarə edilməsi + field_auth_source_ldap_filter: LDAP filtri + label_search_for_watchers: Nəzarətçiləri axtarmaq + notice_account_deleted: "Sizin uçot qeydiniz tam olaraq silinib" + setting_unsubscribe: "İstifadəçilərə şəxsi uçot qeydlərini silməyə icazə vermək" + button_delete_my_account: "Mənim uçot qeydlərimi silmək" + text_account_destroy_confirmation: "Sizin uçot qeydiniz bir daha bərpa edilmədən tam olaraq silinəcək.\nDavam etmək istədiyinizə əminsinizmi?" + error_session_expired: Sizin sessiya bitmişdir. Xahiş edirik yenidən daxil olun. + text_session_expiration_settings: "Diqqət: bu sazlamaların dəyişməyi cari sessiyanın bağlanmasına çıxara bilər." + setting_session_lifetime: Sessiyanın maksimal Session maximum həyat müddəti + setting_session_timeout: Sessiyanın qeyri aktivlik müddəti + label_session_expiration: Sessiyanın bitməsi + permission_close_project: Layihəni bağla / yenidən aç + label_show_closed_projects: Bağlı layihələrə baxmaq + button_close: Bağla + button_reopen: Yenidən aç + project_status_active: aktiv + project_status_closed: bağlı + project_status_archived: arxiv + text_project_closed: Bu layihə bağlıdı və yalnız oxuma olar. + notice_user_successful_create: İstifadəçi %{id} yaradıldı. + field_core_fields: Standart sahələr + field_timeout: Zaman aşımı (saniyə ilə) + setting_thumbnails_enabled: Əlavələrin kiçik şəklini göstər + setting_thumbnails_size: Kiçik şəkillərin ölçüsü (piksel ilə) + label_status_transitions: Status keçidləri + label_fields_permissions: Sahələrin icazələri + label_readonly: Ancaq oxumaq üçün + label_required: Tələb olunur + text_repository_identifier_info: Yalnız kiçik latın hərflərinə (a-z), rəqəmlərə, tire və çicgilərə icazə verilir.
    Yadda saxladıqdan sonra identifikatoru dəyişmək olmaz. + field_board_parent: Ana forum + label_attribute_of_project: Layihə %{name} + label_attribute_of_author: Müəllif %{name} + label_attribute_of_assigned_to: Təyin edilib %{name} + label_attribute_of_fixed_version: Əsas versiya %{name} + label_copy_subtasks: Alt tapşırığın surətini çıxarmaq + label_cross_project_hierarchy: With project hierarchy + permission_edit_documents: Edit documents + button_hide: Hide + text_turning_multiple_off: If you disable multiple values, multiple values will be removed in order to preserve only one value per item. + label_any: any + label_cross_project_system: With all projects + label_last_n_weeks: last %{count} weeks + label_in_the_past_days: in the past + label_copied_to: Copied to + permission_set_notes_private: Set notes as private + label_in_the_next_days: in the next + label_attribute_of_issue: Issue's %{name} + label_any_issues_in_project: any issues in project + label_cross_project_descendants: With subprojects + field_private_notes: Private notes + setting_jsonp_enabled: Enable JSONP support + label_gantt_progress_line: Progress line + permission_add_documents: Add documents + permission_view_private_notes: View private notes + label_attribute_of_user: User's %{name} + permission_delete_documents: Delete documents + field_inherit_members: Inherit members + setting_cross_project_subtasks: Allow cross-project subtasks + label_no_issues_in_project: no issues in project + label_copied_from: Copied from + setting_non_working_week_days: Non-working days + label_any_issues_not_in_project: any issues not in project + label_cross_project_tree: With project tree + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Cəmi + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: e-poçt + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Cəmi sərf olunan vaxt + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API açar + setting_lost_password: Parolun bərpası + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/bg.yml b/config/locales/bg.yml new file mode 100644 index 0000000..2f57ea1 --- /dev/null +++ b/config/locales/bg.yml @@ -0,0 +1,1214 @@ +# Bulgarian translation by Nikolay Solakov and Ivan Cenov +bg: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d-%m-%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Неделя, Понеделник, Вторник, Сряда, Четвъртък, Петък, Събота] + abbr_day_names: [Нед, Пон, Вто, Сря, Чет, Пет, Съб] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Януари, Февруари, Март, Април, Май, Юни, Юли, Август, Септември, Октомври, Ноември, Декември] + abbr_month_names: [~, Яну, Фев, Мар, Апр, Май, Юни, Юли, Авг, Сеп, Окт, Ное, Дек] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "по-малко от 1 секунда" + other: "по-малко от %{count} секунди" + x_seconds: + one: "1 секунда" + other: "%{count} секунди" + less_than_x_minutes: + one: "по-малко от 1 минута" + other: "по-малко от %{count} минути" + x_minutes: + one: "1 минута" + other: "%{count} минути" + about_x_hours: + one: "около 1 час" + other: "около %{count} часа" + x_hours: + one: "1 час" + other: "%{count} часа" + x_days: + one: "1 ден" + other: "%{count} дена" + about_x_months: + one: "около 1 месец" + other: "около %{count} месеца" + x_months: + one: "1 месец" + other: "%{count} месеца" + about_x_years: + one: "около 1 година" + other: "около %{count} години" + over_x_years: + one: "над 1 година" + other: "над %{count} години" + almost_x_years: + one: "почти 1 година" + other: "почти %{count} години" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: байт + other: байта + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "и" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 грешка попречи този %{model} да бъде записан" + other: "%{count} грешки попречиха този %{model} да бъде записан" + messages: + inclusion: "не съществува в списъка" + exclusion: "е запазено" + invalid: "е невалидно" + confirmation: "липсва одобрение" + accepted: "трябва да се приеме" + empty: "не може да е празно" + blank: "не може да е празно" + too_long: "е прекалено дълго" + too_short: "е прекалено късо" + wrong_length: "е с грешна дължина" + taken: "вече съществува" + not_a_number: "не е число" + not_a_date: "е невалидна дата" + greater_than: "трябва да бъде по-голям[a/о] от %{count}" + greater_than_or_equal_to: "трябва да бъде по-голям[a/о] от или равен[a/o] на %{count}" + equal_to: "трябва да бъде равен[a/o] на %{count}" + less_than: "трябва да бъде по-малък[a/o] от %{count}" + less_than_or_equal_to: "трябва да бъде по-малък[a/o] от или равен[a/o] на %{count}" + odd: "трябва да бъде нечетен[a/o]" + even: "трябва да бъде четен[a/o]" + greater_than_start_date: "трябва да е след началната дата" + not_same_project: "не е от същия проект" + circular_dependency: "Тази релация ще доведе до безкрайна зависимост" + cant_link_an_issue_with_a_descendant: "Една задача не може да бъде свързвана към своя подзадача" + earlier_than_minimum_start_date: "не може да бъде по-рано от %{date} поради предхождащи задачи" + not_a_regexp: "не е валиден регулярен израз" + open_issue_with_closed_parent: "Отворена задача не може да бъде асоциирана към затворена родителска задача" + + actionview_instancetag_blank_option: Изберете + + general_text_No: 'Не' + general_text_Yes: 'Да' + general_text_no: 'не' + general_text_yes: 'да' + general_lang_name: 'Bulgarian (Български)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Профилът е обновен успешно. + notice_account_invalid_credentials: Невалиден потребител или парола. + notice_account_password_updated: Паролата е успешно променена. + notice_account_wrong_password: Грешна парола + notice_account_register_done: Профилът е създаден успешно. E-mail, съдържащ инструкции за активиране на профила + е изпратен на %{email}. + notice_account_unknown_email: Непознат e-mail. + notice_account_not_activated_yet: Вие не сте активирали вашия профил все още. Ако искате да + получите нов e-mail за активиране, моля натиснете тази връзка. + notice_account_locked: Вашият профил е блокиран. + notice_can_t_change_password: Този профил е с външен метод за оторизация. Невъзможна смяна на паролата. + notice_account_lost_email_sent: Изпратен ви е e-mail с инструкции за избор на нова парола. + notice_account_activated: Профилът ви е активиран. Вече може да влезете в Redmine. + notice_successful_create: Успешно създаване. + notice_successful_update: Успешно обновяване. + notice_successful_delete: Успешно изтриване. + notice_successful_connection: Успешно свързване. + notice_file_not_found: Несъществуваща или преместена страница. + notice_locking_conflict: Друг потребител променя тези данни в момента. + notice_not_authorized: Нямате право на достъп до тази страница. + notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран. Ако смятате, че това не е правилно, обърнете се към администратора за разархивиране. + notice_email_sent: "Изпратен e-mail на %{value}" + notice_email_error: "Грешка при изпращане на e-mail (%{value})" + notice_feeds_access_key_reseted: Вашия ключ за Atom достъп беше променен. + notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен. + notice_failed_to_save_issues: "Неуспешен запис на %{count} задачи от %{total} избрани: %{ids}." + notice_failed_to_save_time_entries: "Невъзможност за запис на %{count} записа за използвано време от %{total} избрани: %{ids}." + notice_failed_to_save_members: "Невъзможност за запис на член(ове): %{errors}." + notice_no_issue_selected: "Няма избрани задачи." + notice_account_pending: "Профилът Ви е създаден и очаква одобрение от администратор." + notice_default_data_loaded: Примерната информация е заредена успешно. + notice_unable_delete_version: Невъзможност за изтриване на версия + notice_unable_delete_time_entry: Невъзможност за изтриване на запис за използвано време. + notice_issue_done_ratios_updated: Обновен процент на завършените задачи. + notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max}) + notice_issue_successful_create: Задача %{id} е създадена. + notice_issue_update_conflict: Задачата е била променена от друг потребител, докато вие сте я редактирали. + notice_account_deleted: Вашият профил беше премахнат без възможност за възстановяване. + notice_user_successful_create: Потребител %{id} е създаден. + notice_new_password_must_be_different: Новата парола трябва да бъде различна от сегашната парола + notice_import_finished: "%{count} обекта бяха импортирани" + notice_import_finished_with_errors: "%{count} от общо %{total} обекта не бяха инпортирани" + error_can_t_load_default_data: "Грешка при зареждане на началната информация: %{value}" + error_scm_not_found: Несъществуващ обект в хранилището. + error_scm_command_failed: "Грешка при опит за комуникация с хранилище: %{value}" + error_scm_annotate: "Обектът не съществува или не може да бъде анотиран." + error_scm_annotate_big_text_file: "Файлът не може да бъде анотиран, понеже надхвърля максималния размер за текстови файлове." + error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект' + error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта. + error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи"). + error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле + error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит. + error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита. + error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново + error_can_not_archive_project: Този проект не може да бъде архивиран + error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен. + error_workflow_copy_source: Моля изберете source тракер или роля + error_workflow_copy_target: Моля изберете тракер(и) и роля (роли). + error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача + error_unable_to_connect: Невъзможност за свързване с (%{value}) + error_attachment_too_big: Този файл не може да бъде качен, понеже надхвърля максималната възможна големина (%{max_size}) + error_session_expired: Вашата сесия е изтекла. Моля влезете в Redmine отново. + warning_attachments_not_saved: "%{count} файла не бяха записани." + error_password_expired: Вашата парола е с изтекъл срок или администраторът изисква да я смените. + error_invalid_file_encoding: Файлът няма валидно %{encoding} кодиране. + error_invalid_csv_file_or_settings: Файлът не е CSV файл или не съответства на зададеното по-долу + error_can_not_read_import_file: Грешка по време на четене на импортирания файл + error_attachment_extension_not_allowed: Файлове от тип %{extension} не са позволени + error_ldap_bind_credentials: Невалидни LDAP име/парола + error_no_tracker_allowed_for_new_issue_in_project: Проектът няма тракери, за които да създавате задачи + error_no_projects_with_tracker_allowed_for_new_issue: Няма проекти с тракери за които можете да създавате задачи + error_move_of_child_not_possible: 'Подзадача %{child} не беше преместена в новия проект: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Употребеното време не може да бъде прехвърлено на задача, която ще бъде изтрита + warning_fields_cleared_on_bulk_edit: Промените ще предизвикат автоматично изтриване на стойности от едно или повече полета на избраните обекти + + mail_subject_lost_password: "Вашата парола (%{value})" + mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:' + mail_subject_register: "Активация на профил (%{value})" + mail_body_register: 'За да активирате профила си използвайте следния линк:' + mail_body_account_information_external: "Можете да използвате вашия %{value} профил за вход." + mail_body_account_information: Информацията за профила ви + mail_subject_account_activation_request: "Заявка за активиране на профил в %{value}" + mail_body_account_activation_request: "Има новорегистриран потребител (%{value}), очакващ вашето одобрение:" + mail_subject_reminder: "%{count} задачи с краен срок с следващите %{days} дни" + mail_body_reminder: "%{count} задачи, назначени на вас са с краен срок в следващите %{days} дни:" + mail_subject_wiki_content_added: "Wiki страницата '%{id}' беше добавена" + mail_body_wiki_content_added: Wiki страницата '%{id}' беше добавена от %{author}. + mail_subject_wiki_content_updated: "Wiki страницата '%{id}' беше обновена" + mail_body_wiki_content_updated: Wiki страницата '%{id}' беше обновена от %{author}. + mail_subject_security_notification: Известие за промяна в сигурността + mail_body_security_notification_change: ! '%{field} беше променено.' + mail_body_security_notification_change_to: ! '%{field} беше променено на %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} беше добавено.' + mail_body_security_notification_remove: ! '%{field} %{value} беше премахнато.' + mail_body_security_notification_notify_enabled: Имейл адрес %{value} вече получава известия. + mail_body_security_notification_notify_disabled: Имейл адрес %{value} вече не получава известия. + mail_body_settings_updated: ! 'Изменения в конфигурацията:' + mail_body_password_updated: Вашата парола е сменена. + + field_name: Име + field_description: Описание + field_summary: Анотация + field_is_required: Задължително + field_firstname: Име + field_lastname: Фамилия + field_mail: Имейл + field_address: Имейл + field_filename: Файл + field_filesize: Големина + field_downloads: Изтеглени файлове + field_author: Автор + field_created_on: От дата + field_updated_on: Обновена + field_closed_on: Затворена + field_field_format: Тип + field_is_for_all: За всички проекти + field_possible_values: Възможни стойности + field_regexp: Регулярен израз + field_min_length: Мин. дължина + field_max_length: Макс. дължина + field_value: Стойност + field_category: Категория + field_title: Заглавие + field_project: Проект + field_issue: Задача + field_status: Състояние + field_notes: Бележка + field_is_closed: Затворена задача + field_is_default: Състояние по подразбиране + field_tracker: Тракер + field_subject: Заглавие + field_due_date: Крайна дата + field_assigned_to: Възложена на + field_priority: Приоритет + field_fixed_version: Планувана версия + field_user: Потребител + field_principal: Principal + field_role: Роля + field_homepage: Начална страница + field_is_public: Публичен + field_parent: Подпроект на + field_is_in_roadmap: Да се вижда ли в Пътна карта + field_login: Потребител + field_mail_notification: Известия по пощата + field_admin: Администратор + field_last_login_on: Последно свързване + field_language: Език + field_effective_date: Дата + field_password: Парола + field_new_password: Нова парола + field_password_confirmation: Потвърждение + field_version: Версия + field_type: Тип + field_host: Хост + field_port: Порт + field_account: Профил + field_base_dn: Base DN + field_attr_login: Атрибут Login + field_attr_firstname: Атрибут Първо име (Firstname) + field_attr_lastname: Атрибут Фамилия (Lastname) + field_attr_mail: Атрибут Email + field_onthefly: Динамично създаване на потребител + field_start_date: Начална дата + field_done_ratio: "% Прогрес" + field_auth_source: Начин на оторизация + field_hide_mail: Скрий e-mail адреса ми + field_comments: Коментар + field_url: Адрес + field_start_page: Начална страница + field_subproject: Подпроект + field_hours: Часове + field_activity: Дейност + field_spent_on: Дата + field_identifier: Идентификатор + field_is_filter: Използва се за филтър + field_issue_to: Свързана задача + field_delay: Отместване + field_assignable: Възможно е възлагане на задачи за тази роля + field_redirect_existing_links: Пренасочване на съществуващи линкове + field_estimated_hours: Изчислено време + field_column_names: Колони + field_time_entries: Log time + field_time_zone: Часова зона + field_searchable: С възможност за търсене + field_default_value: Стойност по подразбиране + field_comments_sorting: Сортиране на коментарите + field_parent_title: Родителска страница + field_editable: Editable + field_watcher: Наблюдател + field_identity_url: OpenID URL + field_content: Съдържание + field_group_by: Групиране на резултатите по + field_sharing: Sharing + field_parent_issue: Родителска задача + field_member_of_group: Член на група + field_assigned_to_role: Assignee's role + field_text: Текстово поле + field_visible: Видим + field_warn_on_leaving_unsaved: Предупреди ме, когато напускам страница с незаписано съдържание + field_issues_visibility: Видимост на задачите + field_is_private: Лична + field_commit_logs_encoding: Кодова таблица на съобщенията при поверяване + field_scm_path_encoding: Кодова таблица на пътищата (path) + field_path_to_repository: Път до хранилището + field_root_directory: Коренна директория (папка) + field_cvsroot: CVSROOT + field_cvs_module: Модул + field_repository_is_default: Главно хранилище + field_multiple: Избор на повече от една стойност + field_auth_source_ldap_filter: LDAP филтър + field_core_fields: Стандартни полета + field_timeout: Таймаут (в секунди) + field_board_parent: Родителски форум + field_private_notes: Лични бележки + field_inherit_members: Наследяване на членовете на родителския проект + field_generate_password: Генериране на парола + field_must_change_passwd: Паролата трябва да бъде сменена при следващото влизане в Redmine + field_default_status: Състояние по подразбиране + field_users_visibility: Видимост на потребителите + field_time_entries_visibility: Видимост на записи за използвано време + field_total_estimated_hours: Общо изчислено време + field_default_version: Версия по подразбиране + field_remote_ip: IP адрес + field_textarea_font: Шрифт за текстови блокове + field_updated_by: Обновено от + field_last_updated_by: Последно обновено от + field_full_width_layout: Пълна широчина + field_digest: Контролна сума + field_default_assigned_to: Назначение по подразбиране + + setting_app_title: Заглавие + setting_app_subtitle: Описание + setting_welcome_text: Допълнителен текст + setting_default_language: Език по подразбиране + setting_login_required: Изискване за вход в Redmine + setting_self_registration: Регистрация от потребители + setting_show_custom_fields_on_registration: Показване на потребителските полета при регистрацията + setting_attachment_max_size: Максимална големина на прикачен файл + setting_issues_export_limit: Максимален брой задачи за експорт + setting_mail_from: E-mail адрес за емисии + setting_bcc_recipients: Получатели на скрито копие (bcc) + setting_plain_text_mail: само чист текст (без HTML) + setting_host_name: Хост + setting_text_formatting: Форматиране на текста + setting_wiki_compression: Компресиране на Wiki историята + setting_feeds_limit: Максимален брой записи в ATOM емисии + setting_default_projects_public: Новите проекти са публични по подразбиране + setting_autofetch_changesets: Автоматично извличане на ревизиите + setting_sys_api_enabled: Разрешаване на WS за управление + setting_commit_ref_keywords: Отбелязващи ключови думи + setting_commit_fix_keywords: Приключващи ключови думи + setting_autologin: Автоматичен вход + setting_date_format: Формат на датата + setting_time_format: Формат на часа + setting_timespan_format: Формат на интервал от време + setting_cross_project_issue_relations: Релации на задачи между проекти + setting_cross_project_subtasks: Подзадачи от други проекти + setting_issue_list_default_columns: Показвани колони по подразбиране + setting_repositories_encodings: Кодова таблица на прикачените файлове и хранилищата + setting_emails_header: Email header + setting_emails_footer: Подтекст за e-mail + setting_protocol: Протокол + setting_per_page_options: Опции за страниране + setting_user_format: Потребителски формат + setting_activity_days_default: Брой дни показвани на таб Дейност + setting_display_subprojects_issues: Задачите от подпроектите по подразбиране се показват в главните проекти + setting_enabled_scm: Разрешена SCM + setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове + setting_mail_handler_enable_regex_delimiters: Разрешаванен на регулярни изрази + setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и + setting_mail_handler_api_key: API ключ за входящи e-mail-и + setting_sys_api_key: API ключ за хранилища + setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори + setting_gravatar_enabled: Използване на портребителски икони от Gravatar + setting_gravatar_default: Подразбиращо се изображение от Gravatar + setting_diff_max_lines_displayed: Максимален брой показвани diff редове + setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline + setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла + setting_openid: Рарешаване на OpenID вход и регистрация + setting_password_max_age: Изискване за смяна на паролата след + setting_password_min_length: Минимална дължина на парола + setting_lost_password: Забравена парола + setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор + setting_default_projects_modules: Активирани модули по подразбиране за нов проект + setting_issue_done_ratio: Изчисление на процента на готови задачи с + setting_issue_done_ratio_issue_field: Използване на поле '% Прогрес' + setting_issue_done_ratio_issue_status: Използване на състоянието на задачите + setting_start_of_week: Първи ден на седмицата + setting_rest_api_enabled: Разрешаване на REST web сървис + setting_cache_formatted_text: Кеширане на форматираните текстове + setting_default_notification_option: Подразбиращ се начин за известяване + setting_commit_logtime_enabled: Разрешаване на отчитането на работното време + setting_commit_logtime_activity_id: Дейност при отчитане на работното време + setting_gantt_items_limit: Максимален брой обекти, които да се показват в мрежов график + setting_issue_group_assignment: Разрешено назначаването на задачи на групи + setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата + setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище + setting_unsubscribe: Потребителите могат да премахват профилите си + setting_session_lifetime: Максимален живот на сесиите + setting_session_timeout: Таймаут за неактивност преди прекратяване на сесиите + setting_thumbnails_enabled: Показване на миниатюри на прикачените изображения + setting_thumbnails_size: Размер на миниатюрите (в пиксели) + setting_non_working_week_days: Не работни дни + setting_jsonp_enabled: Разрешаване на поддръжка на JSONP + setting_default_projects_tracker_ids: Тракери по подразбиране за нови проекти + setting_mail_handler_excluded_filenames: Имена на прикачени файлове, които да се пропускат при приемане на e-mail-и (например *.vcf, companylogo.gif). + setting_force_default_language_for_anonymous: Задължително език по подразбиране за анонимните потребители + setting_force_default_language_for_loggedin: Задължително език по подразбиране за потребителите, влезли в Redmine + setting_link_copied_issue: Свързване на задачите при копиране + setting_max_additional_emails: Максимален брой на допълнителните имейл адреси + setting_search_results_per_page: Резултати от търсене на страница + setting_attachment_extensions_allowed: Позволени типове на файлове + setting_attachment_extensions_denied: Разрешени типове на файлове + setting_new_item_menu_tab: Меню-елемент за добавяне на нови обекти (+) + setting_commit_logs_formatting: Прилагане на форматиране за съобщенията при поверяване + setting_timelog_required_fields: Задължителни полета за записи за изразходваното време + + permission_add_project: Създаване на проект + permission_add_subprojects: Създаване на подпроекти + permission_edit_project: Редактиране на проект + permission_close_project: Затваряне / отваряне на проект + permission_select_project_modules: Избор на проектни модули + permission_manage_members: Управление на членовете (на екип) + permission_manage_project_activities: Управление на дейностите на проекта + permission_manage_versions: Управление на версиите + permission_manage_categories: Управление на категориите + permission_view_issues: Разглеждане на задачите + permission_add_issues: Добавяне на задачи + permission_edit_issues: Редактиране на задачи + permission_copy_issues: Копиране на задачи + permission_manage_issue_relations: Управление на връзките между задачите + permission_set_own_issues_private: Установяване на собствените задачи публични или лични + permission_set_issues_private: Установяване на задачите публични или лични + permission_add_issue_notes: Добавяне на бележки + permission_edit_issue_notes: Редактиране на бележки + permission_edit_own_issue_notes: Редактиране на собствени бележки + permission_view_private_notes: Разглеждане на лични бележки + permission_set_notes_private: Установяване на бележките лични + permission_move_issues: Преместване на задачи + permission_delete_issues: Изтриване на задачи + permission_manage_public_queries: Управление на публичните заявки + permission_save_queries: Запис на запитвания (queries) + permission_view_gantt: Разглеждане на мрежов график + permission_view_calendar: Разглеждане на календари + permission_view_issue_watchers: Разглеждане на списък с наблюдатели + permission_add_issue_watchers: Добавяне на наблюдатели + permission_delete_issue_watchers: Изтриване на наблюдатели + permission_log_time: Log spent time + permission_view_time_entries: Разглеждане на записите за изразходваното време + permission_edit_time_entries: Редактиране на записите за изразходваното време + permission_edit_own_time_entries: Редактиране на собствените записи за изразходваното време + permission_view_news: Разглеждане на новини + permission_manage_news: Управление на новини + permission_comment_news: Коментиране на новини + permission_view_documents: Разглеждане на документи + permission_add_documents: Добавяне на документи + permission_edit_documents: Редактиране на документи + permission_delete_documents: Изтриване на документи + permission_manage_files: Управление на файлове + permission_view_files: Разглеждане на файлове + permission_manage_wiki: Управление на wiki + permission_rename_wiki_pages: Преименуване на wiki страници + permission_delete_wiki_pages: Изтриване на wiki страници + permission_view_wiki_pages: Разглеждане на wiki + permission_view_wiki_edits: Разглеждане на wiki история + permission_edit_wiki_pages: Редактиране на wiki страници + permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове към wiki страници + permission_protect_wiki_pages: Заключване на wiki страници + permission_manage_repository: Управление на хранилища + permission_browse_repository: Разглеждане на хранилища + permission_view_changesets: Разглеждане на changesets + permission_commit_access: Поверяване + permission_manage_boards: Управление на boards + permission_view_messages: Разглеждане на съобщения + permission_add_messages: Публикуване на съобщения + permission_edit_messages: Редактиране на съобщения + permission_edit_own_messages: Редактиране на собствени съобщения + permission_delete_messages: Изтриване на съобщения + permission_delete_own_messages: Изтриване на собствени съобщения + permission_export_wiki_pages: Експорт на wiki страници + permission_manage_subtasks: Управление на подзадачите + permission_manage_related_issues: Управление на връзките между задачи и ревизии + permission_import_issues: Импорт на задачи + + project_module_issue_tracking: Тракинг + project_module_time_tracking: Отделяне на време + project_module_news: Новини + project_module_documents: Документи + project_module_files: Файлове + project_module_wiki: Wiki + project_module_repository: Хранилище + project_module_boards: Форуми + project_module_calendar: Календар + project_module_gantt: Мрежов график + + label_user: Потребител + label_user_plural: Потребители + label_user_new: Нов потребител + label_user_anonymous: Анонимен + label_project: Проект + label_project_new: Нов проект + label_project_plural: Проекти + label_x_projects: + zero: 0 проекта + one: 1 проект + other: "%{count} проекта" + label_project_all: Всички проекти + label_project_latest: Последни проекти + label_issue: Задача + label_issue_new: Нова задача + label_issue_plural: Задачи + label_issue_view_all: Всички задачи + label_issues_by: "Задачи по %{value}" + label_issue_added: Добавена задача + label_issue_updated: Обновена задача + label_issue_note_added: Добавена бележка + label_issue_status_updated: Обновено състояние + label_issue_assigned_to_updated: Задачата е с назначен нов изпълнител + label_issue_priority_updated: Обновен приоритет + label_document: Документ + label_document_new: Нов документ + label_document_plural: Документи + label_document_added: Добавен документ + label_role: Роля + label_role_plural: Роли + label_role_new: Нова роля + label_role_and_permissions: Роли и права + label_role_anonymous: Анонимен + label_role_non_member: Не член + label_member: Член + label_member_new: Нов член + label_member_plural: Членове + label_tracker: Тракер + label_tracker_plural: Тракери + label_tracker_all: Всички тракери + label_tracker_new: Нов тракер + label_workflow: Работен процес + label_issue_status: Състояние на задача + label_issue_status_plural: Състояния на задачи + label_issue_status_new: Ново състояние + label_issue_category: Категория задача + label_issue_category_plural: Категории задачи + label_issue_category_new: Нова категория + label_custom_field: Потребителско поле + label_custom_field_plural: Потребителски полета + label_custom_field_new: Ново потребителско поле + label_enumerations: Списъци + label_enumeration_new: Нова стойност + label_information: Информация + label_information_plural: Информация + label_please_login: Вход + label_register: Регистрация + label_login_with_open_id_option: или вход чрез OpenID + label_password_lost: Забравена парола + label_password_required: Потвърдете вашата парола, за да продължите + label_home: Начало + label_my_page: Лична страница + label_my_account: Профил + label_my_projects: Проекти, в които участвам + label_administration: Администрация + label_login: Вход + label_logout: Изход + label_help: Помощ + label_reported_issues: Публикувани задачи + label_assigned_issues: Назначени задачи + label_assigned_to_me_issues: Възложени на мен + label_last_login: Последно свързване + label_registered_on: Регистрация + label_activity: Дейност + label_overall_activity: Цялостна дейност + label_user_activity: "Активност на %{value}" + label_new: Нов + label_logged_as: Здравейте, + label_environment: Среда + label_authentication: Оторизация + label_auth_source: Начин на оторозация + label_auth_source_new: Нов начин на оторизация + label_auth_source_plural: Начини на оторизация + label_subproject_plural: Подпроекти + label_subproject_new: Нов подпроект + label_and_its_subprojects: "%{value} и неговите подпроекти" + label_min_max_length: Минимална - максимална дължина + label_list: Списък + label_date: Дата + label_integer: Целочислен + label_float: Дробно + label_boolean: Чекбокс + label_string: Текст + label_text: Дълъг текст + label_attribute: Атрибут + label_attribute_plural: Атрибути + label_no_data: Няма изходни данни + label_no_preview: Няма наличен преглед (preview) + label_no_preview_alternative_html: Няма наличен преглед (preview). %{link} файл вместо това. + label_no_preview_download: Изтегляне + label_change_status: Промяна на състоянието + label_history: История + label_attachment: Файл + label_attachment_new: Нов файл + label_attachment_delete: Изтриване + label_attachment_plural: Файлове + label_file_added: Добавен файл + label_report: Справка + label_report_plural: Справки + label_news: Новини + label_news_new: Добави + label_news_plural: Новини + label_news_latest: Последни новини + label_news_view_all: Виж всички + label_news_added: Добавена новина + label_news_comment_added: Добавен коментар към новина + label_settings: Настройки + label_overview: Общ изглед + label_version: Версия + label_version_new: Нова версия + label_version_plural: Версии + label_close_versions: Затваряне на завършените версии + label_confirmation: Одобрение + label_export_to: Експорт към + label_read: Read... + label_public_projects: Публични проекти + label_open_issues: отворена + label_open_issues_plural: отворени + label_closed_issues: затворена + label_closed_issues_plural: затворени + label_x_open_issues_abbr: + zero: 0 отворени + one: 1 отворена + other: "%{count} отворени" + label_x_closed_issues_abbr: + zero: 0 затворени + one: 1 затворена + other: "%{count} затворени" + label_x_issues: + zero: 0 задачи + one: 1 задача + other: "%{count} задачи" + label_total: Общо + label_total_plural: Общо + label_total_time: Общо + label_permissions: Права + label_current_status: Текущо състояние + label_new_statuses_allowed: Позволени състояния + label_all: всички + label_any: без значение + label_none: никакви + label_nobody: никой + label_next: Следващ + label_previous: Предишен + label_used_by: Използва се от + label_details: Детайли + label_add_note: Добавяне на бележка + label_calendar: Календар + label_months_from: месеца от + label_gantt: Мрежов график + label_internal: Вътрешен + label_last_changes: "последни %{count} промени" + label_change_view_all: Виж всички промени + label_comment: Коментар + label_comment_plural: Коментари + label_x_comments: + zero: 0 коментара + one: 1 коментар + other: "%{count} коментара" + label_comment_add: Добавяне на коментар + label_comment_added: Добавен коментар + label_comment_delete: Изтриване на коментари + label_query: Потребителска справка + label_query_plural: Потребителски справки + label_query_new: Нова заявка + label_my_queries: Моите заявки + label_filter_add: Добави филтър + label_filter_plural: Филтри + label_equals: е + label_not_equals: не е + label_in_less_than: след по-малко от + label_in_more_than: след повече от + label_in_the_next_days: в следващите + label_in_the_past_days: в предишните + label_greater_or_equal: ">=" + label_less_or_equal: <= + label_between: между + label_in: в следващите + label_today: днес + label_all_time: всички + label_yesterday: вчера + label_this_week: тази седмица + label_last_week: последната седмица + label_last_n_weeks: последните %{count} седмици + label_last_n_days: "последните %{count} дни" + label_this_month: текущия месец + label_last_month: последния месец + label_this_year: текущата година + label_date_range: Период + label_less_than_ago: преди по-малко от + label_more_than_ago: преди повече от + label_ago: преди + label_contains: съдържа + label_not_contains: не съдържа + label_any_issues_in_project: задачи от проект + label_any_issues_not_in_project: задачи, които не са в проект + label_no_issues_in_project: никакви задачи в проект + label_any_open_issues: отворени задачи + label_no_open_issues: без отворени задачи + label_day_plural: дни + label_repository: Хранилище + label_repository_new: Ново хранилище + label_repository_plural: Хранилища + label_browse: Разглеждане + label_branch: работен вариант + label_tag: Версия + label_revision: Ревизия + label_revision_plural: Ревизии + label_revision_id: Ревизия %{value} + label_associated_revisions: Асоциирани ревизии + label_added: добавено + label_modified: променено + label_copied: копирано + label_renamed: преименувано + label_deleted: изтрито + label_latest_revision: Последна ревизия + label_latest_revision_plural: Последни ревизии + label_view_revisions: Виж ревизиите + label_view_all_revisions: Разглеждане на всички ревизии + label_max_size: Максимална големина + label_sort_highest: Премести най-горе + label_sort_higher: Премести по-горе + label_sort_lower: Премести по-долу + label_sort_lowest: Премести най-долу + label_roadmap: Пътна карта + label_roadmap_due_in: "Излиза след %{value}" + label_roadmap_overdue: "%{value} закъснение" + label_roadmap_no_issues: Няма задачи за тази версия + label_search: Търсене + label_result_plural: Pезултати + label_all_words: Всички думи + label_wiki: Wiki + label_wiki_edit: Wiki редакция + label_wiki_edit_plural: Wiki редакции + label_wiki_page: Wiki страница + label_wiki_page_plural: Wiki страници + label_wiki_page_new: Нова wiki страница + label_index_by_title: Индекс + label_index_by_date: Индекс по дата + label_current_version: Текуща версия + label_preview: Преглед + label_feed_plural: Емисии + label_changes_details: Подробни промени + label_issue_tracking: Тракинг + label_spent_time: Отделено време + label_total_spent_time: Общо употребено време + label_overall_spent_time: Общо употребено време + label_f_hour: "%{value} час" + label_f_hour_plural: "%{value} часа" + label_f_hour_short: '%{value} час' + label_time_tracking: Отделяне на време + label_change_plural: Промени + label_statistics: Статистика + label_commits_per_month: Ревизии по месеци + label_commits_per_author: Ревизии по автор + label_diff: diff + label_view_diff: Виж разликите + label_diff_inline: хоризонтално + label_diff_side_by_side: вертикално + label_options: Опции + label_copy_workflow_from: Копирай работния процес от + label_permissions_report: Справка за права + label_watched_issues: Наблюдавани задачи + label_related_issues: Свързани задачи + label_applied_status: Установено състояние + label_loading: Зареждане... + label_relation_new: Нова релация + label_relation_delete: Изтриване на релация + label_relates_to: свързана със + label_duplicates: дублира + label_duplicated_by: дублирана от + label_blocks: блокира + label_blocked_by: блокирана от + label_precedes: предшества + label_follows: изпълнява се след + label_copied_to: копирана в + label_copied_from: копирана от + label_stay_logged_in: Запомни ме + label_disabled: забранено + label_show_completed_versions: Показване на реализирани версии + label_me: аз + label_board: Форум + label_board_new: Нов форум + label_board_plural: Форуми + label_board_locked: Заключена + label_board_sticky: Sticky + label_topic_plural: Теми + label_message_plural: Съобщения + label_message_last: Последно съобщение + label_message_new: Нова тема + label_message_posted: Добавено съобщение + label_reply_plural: Отговори + label_send_information: Изпращане на информацията до потребителя + label_year: Година + label_month: Месец + label_week: Седмица + label_date_from: От + label_date_to: До + label_language_based: В зависимост от езика + label_sort_by: "Сортиране по %{value}" + label_send_test_email: Изпращане на тестов e-mail + label_feeds_access_key: Atom access ключ + label_missing_feeds_access_key: Липсващ Atom ключ за достъп + label_feeds_access_key_created_on: "%{value} от създаването на Atom ключа" + label_module_plural: Модули + label_added_time_by: "Публикувана от %{author} преди %{age}" + label_updated_time_by: "Обновена от %{author} преди %{age}" + label_updated_time: "Обновена преди %{value}" + label_jump_to_a_project: Проект... + label_file_plural: Файлове + label_changeset_plural: Ревизии + label_default_columns: По подразбиране + label_no_change_option: (Без промяна) + label_bulk_edit_selected_issues: Групово редактиране на задачи + label_bulk_edit_selected_time_entries: Групово редактиране на записи за използвано време + label_theme: Тема + label_default: По подразбиране + label_search_titles_only: Само в заглавията + label_user_mail_option_all: "За всяко събитие в проектите, в които участвам" + label_user_mail_option_selected: "За всички събития само в избраните проекти..." + label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)" + label_user_mail_option_only_my_events: Само за неща, в които съм включен/а + label_user_mail_option_only_assigned: Само за неща, които наблюдавам или са назначени на мен + label_user_mail_option_only_owner: Само за неща, които наблюдавам или съм техен собственик + label_user_mail_no_self_notified: "Не искам известия за извършени от мен промени" + label_registration_activation_by_email: активиране на профила по email + label_registration_manual_activation: ръчно активиране + label_registration_automatic_activation: автоматично активиране + label_display_per_page: "На страница по: %{value}" + label_age: Възраст + label_change_properties: Промяна на настройки + label_general: Основни + label_scm: SCM (Система за контрол на версиите) + label_plugins: Плъгини + label_ldap_authentication: LDAP оторизация + label_downloads_abbr: D/L + label_optional_description: Незадължително описание + label_add_another_file: Добавяне на друг файл + label_preferences: Предпочитания + label_chronological_order: Хронологичен ред + label_reverse_chronological_order: Обратен хронологичен ред + label_incoming_emails: Входящи e-mail-и + label_generate_key: Генериране на ключ + label_issue_watchers: Наблюдатели + label_example: Пример + label_display: Показване + label_sort: Сортиране + label_ascending: Нарастващ + label_descending: Намаляващ + label_date_from_to: От %{start} до %{end} + label_wiki_content_added: Wiki страница беше добавена + label_wiki_content_updated: Wiki страница беше обновена + label_group: Група + label_group_plural: Групи + label_group_new: Нова група + label_group_anonymous: Анонимни потребители + label_group_non_member: Потребители, които не са членове на проекта + label_time_entry_plural: Използвано време + label_version_sharing_none: Не споделен + label_version_sharing_descendants: С подпроекти + label_version_sharing_hierarchy: С проектна йерархия + label_version_sharing_tree: С дърво на проектите + label_version_sharing_system: С всички проекти + label_update_issue_done_ratios: Обновяване на процента на завършените задачи + label_copy_source: Източник + label_copy_target: Цел + label_copy_same_as_target: Също като целта + label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер + label_api_access_key: API ключ за достъп + label_missing_api_access_key: Липсващ API ключ + label_api_access_key_created_on: API ключ за достъп е създаден преди %{value} + label_profile: Профил + label_subtask_plural: Подзадачи + label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта + label_principal_search: "Търсене на потребител или група:" + label_user_search: "Търсене на потребител:" + label_additional_workflow_transitions_for_author: Позволени са допълнителни преходи, когато потребителят е авторът + label_additional_workflow_transitions_for_assignee: Позволени са допълнителни преходи, когато потребителят е назначеният към задачата + label_issues_visibility_all: Всички задачи + label_issues_visibility_public: Всички не-лични задачи + label_issues_visibility_own: Задачи, създадени от или назначени на потребителя + label_git_report_last_commit: Извеждане на последното поверяване за файлове и папки + label_parent_revision: Ревизия родител + label_child_revision: Ревизия наследник + label_export_options: "%{export_format} опции за експорт" + label_copy_attachments: Копиране на прикачените файлове + label_copy_subtasks: Копиране на подзадачите + label_item_position: "%{position}/%{count}" + label_completed_versions: Завършени версии + label_search_for_watchers: Търсене на потребители за наблюдатели + label_session_expiration: Изтичане на сесиите + label_show_closed_projects: Разглеждане на затворени проекти + label_status_transitions: Преходи между състоянията + label_fields_permissions: Видимост на полетата + label_readonly: Само за четене + label_required: Задължително + label_hidden: Скрит + label_attribute_of_project: Project's %{name} + label_attribute_of_issue: Issue's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_user: User's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_attribute_of_object: "%{name} на %{object_name}" + label_cross_project_descendants: С подпроекти + label_cross_project_tree: С дърво на проектите + label_cross_project_hierarchy: С проектна йерархия + label_cross_project_system: С всички проекти + label_gantt_progress_line: Линия на изпълнението + label_visibility_private: лични (само за мен) + label_visibility_roles: само за тези роли + label_visibility_public: за всички потребители + label_link: Връзка + label_only: само + label_drop_down_list: drop-down списък + label_checkboxes: чек-бокс + label_radio_buttons: радио-бутони + label_link_values_to: URL (опция) + label_custom_field_select_type: "Изберете тип на обект, към който потребителското поле да бъде асоциирано" + label_check_for_updates: Проверка за нови версии + label_latest_compatible_version: Последна съвместима версия + label_unknown_plugin: Непознат плъгин + label_add_projects: Добавяне на проекти + label_users_visibility_all: Всички активни потребители + label_users_visibility_members_of_visible_projects: Членовете на видимите проекти + label_edit_attachments: Редактиране на прикачените файлове + label_link_copied_issue: Създаване на връзка между задачите + label_ask: Питане преди копиране + label_search_attachments_yes: Търсене на имената на прикачените файлове и техните описания + label_search_attachments_no: Да не се претърсват прикачените файлове + label_search_attachments_only: Търсене само на прикачените файлове + label_search_open_issues_only: Търсене само на задачите + label_email_address_plural: Имейли + label_email_address_add: Добавяне на имейл адрес + label_enable_notifications: Разрешаване на известията + label_disable_notifications: Забрана на известията + label_blank_value: празно + label_parent_task_attributes: Атрибути на родителските задачи + label_parent_task_attributes_derived: Изчислени от подзадачите + label_parent_task_attributes_independent: Независими от подзадачите + label_time_entries_visibility_all: Всички записи за използвано време + label_time_entries_visibility_own: Записи за използвано време създадени от потребителя + label_member_management: Управление на членовете + label_member_management_all_roles: Всички роли + label_member_management_selected_roles_only: Само тези роли + label_import_issues: Импорт на задачи + label_select_file_to_import: Файл за импортиране + label_fields_separator: Разделител между полетата + label_fields_wrapper: Разделител в полетата (wrapper) + label_encoding: Кодиране + label_comma_char: Запетая + label_semi_colon_char: Точка и запетая + label_quote_char: Кавичка + label_double_quote_char: Двойна кавичка + label_fields_mapping: Съответствие между полетата + label_file_content_preview: Предварителен преглед на съдържанието на файла + label_create_missing_values: Създаване на липсващи стойности + label_api: API + label_field_format_enumeration: Списък ключ/стойност + label_default_values_for_new_users: Стойности по подразбиране за нови потребители + label_relations: Релации + label_new_project_issue_tab_enabled: Показване на меню-елемент "Нова задача" + label_new_object_tab_enabled: Показване на изпадащ списък за меню-елемент "+" + label_table_of_contents: Съдържание + label_font_default: Шрифт по подразбиране + label_font_monospace: Monospaced шрифт + label_font_proportional: Пропорционален шрифт + label_last_notes: Последни коментари + + button_login: Вход + button_submit: Изпращане + button_save: Запис + button_check_all: Избор на всички + button_uncheck_all: Изчистване на всички + button_collapse_all: Скриване всички + button_expand_all: Разгъване всички + button_delete: Изтриване + button_create: Създаване + button_create_and_continue: Създаване и продължаване + button_test: Тест + button_edit: Редакция + button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: %{page_title}" + button_add: Добавяне + button_change: Промяна + button_apply: Приложи + button_clear: Изчисти + button_lock: Заключване + button_unlock: Отключване + button_download: Изтегляне + button_list: Списък + button_view: Преглед + button_move: Преместване + button_move_and_follow: Преместване и продължаване + button_back: Назад + button_cancel: Отказ + button_activate: Активация + button_sort: Сортиране + button_log_time: Отделяне на време + button_rollback: Върни се към тази ревизия + button_watch: Наблюдаване + button_unwatch: Край на наблюдението + button_reply: Отговор + button_archive: Архивиране + button_unarchive: Разархивиране + button_reset: Генериране наново + button_rename: Преименуване + button_change_password: Промяна на парола + button_copy: Копиране + button_copy_and_follow: Копиране и продължаване + button_annotate: Анотация + button_update: Обновяване + button_configure: Конфигуриране + button_quote: Цитат + button_duplicate: Дублиране + button_show: Показване + button_hide: Скриване + button_edit_section: Редактиране на тази секция + button_export: Експорт + button_delete_my_account: Премахване на моя профил + button_close: Затваряне + button_reopen: Отваряне + button_import: Импорт + button_filter: Филтър + + status_active: активен + status_registered: регистриран + status_locked: заключен + + project_status_active: активен + project_status_closed: затворен + project_status_archived: архивиран + + version_status_open: отворена + version_status_locked: заключена + version_status_closed: затворена + + field_active: Активен + + text_select_mail_notifications: Изберете събития за изпращане на e-mail. + text_regexp_info: пр. ^[A-Z0-9]+$ + text_min_max_length_info: 0 - без ограничения + text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него? + text_subprojects_destroy_warning: "Неговите подпроекти: %{value} също ще бъдат изтрити." + text_workflow_edit: Изберете роля и тракер за да редактирате работния процес + text_are_you_sure: Сигурни ли сте? + text_journal_changed: "%{label} променен от %{old} на %{new}" + text_journal_changed_no_detail: "%{label} променен" + text_journal_set_to: "%{label} установен на %{value}" + text_journal_deleted: "%{label} изтрит (%{old})" + text_journal_added: "Добавено %{label} %{value}" + text_tip_issue_begin_day: задача, започваща този ден + text_tip_issue_end_day: задача, завършваща този ден + text_tip_issue_begin_end_day: задача, започваща и завършваща този ден + text_project_identifier_info: 'Позволени са малки букви (a-z), цифри, тирета и _.
    Промяна след създаването му не е възможна.' + text_caracters_maximum: "До %{count} символа." + text_caracters_minimum: "Минимум %{count} символа." + text_length_between: "От %{min} до %{max} символа." + text_tracker_no_workflow: Няма дефиниран работен процес за този тракер + text_unallowed_characters: Непозволени символи + text_comma_separated: Позволено е изброяване (с разделител запетая). + text_line_separated: Позволени са много стойности (по едно на ред). + text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от ревизии + text_issue_added: "Публикувана е нова задача с номер %{id} (от %{author})." + text_issue_updated: "Задача %{id} е обновена (от %{author})." + text_wiki_destroy_confirmation: Сигурни ли сте, че искате да изтриете това Wiki и цялото му съдържание? + text_issue_category_destroy_question: "Има задачи (%{count}) обвързани с тази категория. Какво ще изберете?" + text_issue_category_destroy_assignments: Премахване на връзките с категорията + text_issue_category_reassign_to: Преобвързване с категория + text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)." + text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате." + text_load_default_configuration: Зареждане на примерна информация + text_status_changed_by_changeset: "Приложено с ревизия %{value}." + text_time_logged_by_changeset: Приложено в ревизия %{value}. + text_issues_destroy_confirmation: 'Сигурни ли сте, че искате да изтриете избраните задачи?' + text_issues_destroy_descendants_confirmation: Тази операция ще премахне и %{count} подзадача(и). + text_time_entries_destroy_confirmation: Сигурен ли сте, че изтриете избраните записи за изразходвано време? + text_select_project_modules: 'Изберете активните модули за този проект:' + text_default_administrator_account_changed: Сменен фабричния администраторски профил + text_file_repository_writable: Възможност за писане в хранилището с файлове + text_plugin_assets_writable: Папката на приставките е разрешена за запис + text_rmagick_available: Наличен RMagick (по избор) + text_convert_available: Наличен ImageMagick convert (по избор) + text_destroy_time_entries_question: "%{hours} часа са отделени на задачите, които искате да изтриете. Какво избирате?" + text_destroy_time_entries: Изтриване на отделеното време + text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект + text_reassign_time_entries: 'Прехвърляне на отделеното време към задача:' + text_user_wrote: "%{value} написа:" + text_enumeration_destroy_question: "%{count} обекта са свързани с тази стойност." + text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:' + text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/configuration.yml и рестартирайте Redmine, за да ги разрешите." + text_repository_usernames_mapping: "Изберете или променете потребителите в Redmine, съответстващи на потребителите в дневника на хранилището (repository).\nПотребителите с еднакви имена в Redmine и хранилищата се съвместяват автоматично." + text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.' + text_custom_field_possible_values_info: 'Една стойност на ред' + text_wiki_page_destroy_question: Тази страница има %{descendants} страници деца и descendant(s). Какво желаете да правите? + text_wiki_page_nullify_children: Запазване на тези страници като коренни страници + text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants + text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница + text_own_membership_delete_confirmation: "Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това да не можете да редактирате този проект.\nСигурен ли сте, че искате да продължите?" + text_zoom_in: Увеличаване + text_zoom_out: Намаляване + text_warn_on_leaving_unsaved: Страницата съдържа незаписано съдържание, което може да бъде загубено, ако я напуснете. + text_scm_path_encoding_note: "По подразбиране: UTF-8" + text_subversion_repository_note: 'Примери: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + text_git_repository_note: Празно и локално хранилище (например /gitrepo, c:\gitrepo) + text_mercurial_repository_note: Локално хранилище (например /hgrepo, c:\hgrepo) + text_scm_command: SCM команда + text_scm_command_version: Версия + text_scm_config: Можете да конфигурирате SCM командите в config/configuration.yml. За да активирате промените, рестартирайте Redmine. + text_scm_command_not_available: SCM командата не е налична или достъпна. Проверете конфигурацията в административния панел. + text_issue_conflict_resolution_overwrite: Прилагане на моите промени (предишните коментари ще бъдат запазени, но някои други промени може да бъдат презаписани) + text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени + text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link} + text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване." + text_session_expiration_settings: "Внимание: промяната на тези установяваноя може да прекрати всички активни сесии, включително и вашата." + text_project_closed: Този проект е затворен и е само за четене. + text_turning_multiple_off: Ако забраните възможността за повече от една стойност, повечето стойности ще бъдат + премахнати с цел да остане само по една стойност за поле. + + default_role_manager: Мениджър + default_role_developer: Разработчик + default_role_reporter: Публикуващ + default_tracker_bug: Грешка + default_tracker_feature: Функционалност + default_tracker_support: Поддръжка + default_issue_status_new: Нова + default_issue_status_in_progress: Изпълнение + default_issue_status_resolved: Приключена + default_issue_status_feedback: Обратна връзка + default_issue_status_closed: Затворена + default_issue_status_rejected: Отхвърлена + default_doc_category_user: Документация за потребителя + default_doc_category_tech: Техническа документация + default_priority_low: Нисък + default_priority_normal: Нормален + default_priority_high: Висок + default_priority_urgent: Спешен + default_priority_immediate: Веднага + default_activity_design: Дизайн + default_activity_development: Разработка + + enumeration_issue_priorities: Приоритети на задачи + enumeration_doc_categories: Категории документи + enumeration_activities: Дейности (time tracking) + enumeration_system_activity: Системна активност + description_filter: Филтър + description_search: Търсене + description_choose_project: Проекти + description_project_scope: Обхват на търсенето + description_notes: Бележки + description_message_content: Съдържание на съобщението + description_query_sort_criteria_attribute: Атрибут на сортиране + description_query_sort_criteria_direction: Посока на сортиране + description_user_mail_notification: Конфигурация известията по пощата + description_available_columns: Налични колони + description_selected_columns: Избрани колони + description_issue_category_reassign: Изберете категория + description_wiki_subpages_reassign: Изберете нова родителска страница + description_all_columns: Всички колони + text_repository_identifier_info: 'Позволени са малки букви (a-z), цифри, тирета и _.
    Промяна след създаването му не е възможна.' diff --git a/config/locales/bs.yml b/config/locales/bs.yml new file mode 100644 index 0000000..1c51ecf --- /dev/null +++ b/config/locales/bs.yml @@ -0,0 +1,1243 @@ +#Ernad Husremovic hernad@bring.out.ba + +bs: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%e. %b" + long: "%e. %B %Y" + only_day: "%e" + + + day_names: [Nedjelja, Ponedjeljak, Utorak, Srijeda, Četvrtak, Petak, Subota] + abbr_day_names: [Ned, Pon, Uto, Sri, Čet, Pet, Sub] + + month_names: [~, Januar, Februar, Mart, April, Maj, Jun, Jul, Avgust, Septembar, Oktobar, Novembar, Decembar] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Avg, Sep, Okt, Nov, Dec] + order: + - :day + - :month + - :year + + time: + formats: + default: "%A, %e. %B %Y, %H:%M" + short: "%e. %B, %H:%M Uhr" + long: "%A, %e. %B %Y, %H:%M" + time: "%H:%M" + + am: "prijepodne" + pm: "poslijepodne" + + datetime: + distance_in_words: + half_a_minute: "pola minute" + less_than_x_seconds: + one: "manje od 1 sekunde" + other: "manje od %{count} sekudni" + x_seconds: + one: "1 sekunda" + other: "%{count} sekundi" + less_than_x_minutes: + one: "manje od 1 minute" + other: "manje od %{count} minuta" + x_minutes: + one: "1 minuta" + other: "%{count} minuta" + about_x_hours: + one: "oko 1 sahat" + other: "oko %{count} sahata" + x_hours: + one: "1 sahat" + other: "%{count} sahata" + x_days: + one: "1 dan" + other: "%{count} dana" + about_x_months: + one: "oko 1 mjesec" + other: "oko %{count} mjeseci" + x_months: + one: "1 mjesec" + other: "%{count} mjeseci" + about_x_years: + one: "oko 1 godine" + other: "oko %{count} godina" + over_x_years: + one: "preko 1 godine" + other: "preko %{count} godina" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + + number: + format: + precision: 2 + separator: ',' + delimiter: '.' + currency: + format: + unit: 'KM' + format: '%u %n' + negative_format: '%u -%n' + delimiter: '' + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "i" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nije uključeno u listu" + exclusion: "je rezervisano" + invalid: "nije ispravno" + confirmation: "ne odgovara potvrdi" + accepted: "mora se prihvatiti" + empty: "ne može biti prazno" + blank: "ne može biti znak razmaka" + too_long: "je predugačko" + too_short: "je prekratko" + wrong_length: "je pogrešne dužine" + taken: "već je zauzeto" + not_a_number: "nije broj" + not_a_date: "nije ispravan datum" + greater_than: "mora bit veći od %{count}" + greater_than_or_equal_to: "mora bit veći ili jednak %{count}" + equal_to: "mora biti jednak %{count}" + less_than: "mora biti manji od %{count}" + less_than_or_equal_to: "mora bit manji ili jednak %{count}" + odd: "mora biti neparan" + even: "mora biti paran" + greater_than_start_date: "mora biti veći nego početni datum" + not_same_project: "ne pripada istom projektu" + circular_dependency: "Ova relacija stvar cirkularnu zavisnost" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Molimo odaberite + + general_text_No: 'Da' + general_text_Yes: 'Ne' + general_text_no: 'ne' + general_text_yes: 'da' + general_lang_name: 'Bosnian (Bosanski)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_activated: Vaš nalog je aktiviran. Možete se prijaviti. + notice_account_invalid_credentials: Pogrešan korisnik ili lozinka + notice_account_lost_email_sent: Email sa uputstvima o izboru nove šifre je poslat na vašu adresu. + notice_account_password_updated: Lozinka je uspješno promjenjena. + notice_account_pending: "Vaš nalog je kreiran i čeka odobrenje administratora." + notice_account_register_done: Nalog je uspješno kreiran. Da bi ste aktivirali vaš nalog kliknite na link koji vam je poslat. + notice_account_unknown_email: Nepoznati korisnik. + notice_account_updated: Nalog je uspješno promjenen. + notice_account_wrong_password: Pogrešna lozinka + notice_can_t_change_password: Ovaj nalog koristi eksterni izvor prijavljivanja. Ne mogu da promjenim šifru. + notice_default_data_loaded: Podrazumjevana konfiguracija uspječno učitana. + notice_email_error: Došlo je do greške pri slanju emaila (%{value}) + notice_email_sent: "Email je poslan %{value}" + notice_failed_to_save_issues: "Neuspješno snimanje %{count} aktivnosti na %{total} izabrano: %{ids}." + notice_feeds_access_key_reseted: Vaš Atom pristup je resetovan. + notice_file_not_found: Stranica kojoj pokušavate da pristupite ne postoji ili je uklonjena. + notice_locking_conflict: "Konflikt: podaci su izmjenjeni od strane drugog korisnika." + notice_no_issue_selected: "Nijedna aktivnost nije izabrana! Molim, izaberite aktivnosti koje želite za ispravljate." + notice_not_authorized: Niste ovlašćeni da pristupite ovoj stranici. + notice_successful_connection: Uspješna konekcija. + notice_successful_create: Uspješno kreiranje. + notice_successful_delete: Brisanje izvršeno. + notice_successful_update: Promjene uspješno izvršene. + + error_can_t_load_default_data: "Podrazumjevane postavke se ne mogu učitati %{value}" + error_scm_command_failed: "Desila se greška pri pristupu repozitoriju: %{value}" + error_scm_not_found: "Unos i/ili revizija ne postoji u repozitoriju." + + error_scm_annotate: "Ova stavka ne postoji ili nije označena." + error_issue_not_found_in_project: 'Aktivnost nije nađena ili ne pripada ovom projektu' + + warning_attachments_not_saved: "%{count} fajl(ovi) ne mogu biti snimljen(i)." + + mail_subject_lost_password: "Vaša %{value} lozinka" + mail_body_lost_password: 'Za promjenu lozinke, kliknite na sljedeći link:' + mail_subject_register: "Aktivirajte %{value} vaš korisnički račun" + mail_body_register: 'Za aktivaciju vašeg korisničkog računa, kliknite na sljedeći link:' + mail_body_account_information_external: "Možete koristiti vaš %{value} korisnički račun za prijavu na sistem." + mail_body_account_information: Informacija o vašem korisničkom računu + mail_subject_account_activation_request: "%{value} zahtjev za aktivaciju korisničkog računa" + mail_body_account_activation_request: "Novi korisnik (%{value}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:" + mail_subject_reminder: "%{count} aktivnost(i) u kašnjenju u narednim %{days} danima" + mail_body_reminder: "%{count} aktivnost(i) koje su dodjeljenje vama u narednim %{days} danima:" + + + field_name: Ime + field_description: Opis + field_summary: Pojašnjenje + field_is_required: Neophodno popuniti + field_firstname: Ime + field_lastname: Prezime + field_mail: Email + field_filename: Fajl + field_filesize: Veličina + field_downloads: Downloadi + field_author: Autor + field_created_on: Kreirano + field_updated_on: Izmjenjeno + field_field_format: Format + field_is_for_all: Za sve projekte + field_possible_values: Moguće vrijednosti + field_regexp: '"Regularni izraz"' + field_min_length: Minimalna veličina + field_max_length: Maksimalna veličina + field_value: Vrijednost + field_category: Kategorija + field_title: Naslov + field_project: Projekat + field_issue: Aktivnost + field_status: Status + field_notes: Bilješke + field_is_closed: Aktivnost zatvorena + field_is_default: Podrazumjevana vrijednost + field_tracker: Područje aktivnosti + field_subject: Subjekat + field_due_date: Završiti do + field_assigned_to: Dodijeljeno + field_priority: Prioritet + field_fixed_version: Ciljna verzija + field_user: Korisnik + field_role: Uloga + field_homepage: Naslovna strana + field_is_public: Javni + field_parent: Podprojekt od + field_is_in_roadmap: Aktivnosti prikazane u planu realizacije + field_login: Prijava + field_mail_notification: Email notifikacije + field_admin: Administrator + field_last_login_on: Posljednja konekcija + field_language: Jezik + field_effective_date: Datum + field_password: Lozinka + field_new_password: Nova lozinka + field_password_confirmation: Potvrda + field_version: Verzija + field_type: Tip + field_host: Host + field_port: Port + field_account: Korisnički račun + field_base_dn: Base DN + field_attr_login: Attribut za prijavu + field_attr_firstname: Attribut za ime + field_attr_lastname: Atribut za prezime + field_attr_mail: Atribut za email + field_onthefly: 'Kreiranje korisnika "On-the-fly"' + field_start_date: Početak + field_done_ratio: "% Realizovano" + field_auth_source: Mod za authentifikaciju + field_hide_mail: Sakrij moju email adresu + field_comments: Komentar + field_url: URL + field_start_page: Početna stranica + field_subproject: Podprojekat + field_hours: Sahata + field_activity: Operacija + field_spent_on: Datum + field_identifier: Identifikator + field_is_filter: Korišteno kao filter + field_issue_to: Povezana aktivnost + field_delay: Odgađanje + field_assignable: Aktivnosti dodijeljene ovoj ulozi + field_redirect_existing_links: Izvrši redirekciju postojećih linkova + field_estimated_hours: Procjena vremena + field_column_names: Kolone + field_time_zone: Vremenska zona + field_searchable: Pretraživo + field_default_value: Podrazumjevana vrijednost + field_comments_sorting: Prikaži komentare + field_parent_title: 'Stranica "roditelj"' + field_editable: Može se mijenjati + field_watcher: Posmatrač + field_identity_url: OpenID URL + field_content: Sadržaj + + setting_app_title: Naslov aplikacije + setting_app_subtitle: Podnaslov aplikacije + setting_welcome_text: Tekst dobrodošlice + setting_default_language: Podrazumjevani jezik + setting_login_required: Authentifikacija neophodna + setting_self_registration: Samo-registracija + setting_attachment_max_size: Maksimalna veličina prikačenog fajla + setting_issues_export_limit: Limit za eksport aktivnosti + setting_mail_from: Mail adresa - pošaljilac + setting_bcc_recipients: '"BCC" (blind carbon copy) primaoci ' + setting_plain_text_mail: Email sa običnim tekstom (bez HTML-a) + setting_host_name: Ime hosta i putanja + setting_text_formatting: Formatiranje teksta + setting_wiki_compression: Kompresija Wiki istorije + + setting_feeds_limit: 'Limit za "Atom" feed-ove' + setting_default_projects_public: Podrazumjeva se da je novi projekat javni + setting_autofetch_changesets: 'Automatski kupi "commit"-e' + setting_sys_api_enabled: 'Omogući "WS" za upravljanje repozitorijom' + setting_commit_ref_keywords: Ključne riječi za reference + setting_commit_fix_keywords: 'Ključne riječi za status "zatvoreno"' + setting_autologin: Automatski login + setting_date_format: Format datuma + setting_time_format: Format vremena + setting_cross_project_issue_relations: Omogući relacije između aktivnosti na različitim projektima + setting_issue_list_default_columns: Podrazumjevane koleone za prikaz na listi aktivnosti + setting_emails_footer: Potpis na email-ovima + setting_protocol: Protokol + setting_per_page_options: Broj objekata po stranici + setting_user_format: Format korisničkog prikaza + setting_activity_days_default: Prikaz promjena na projektu - opseg dana + setting_display_subprojects_issues: Prikaz podprojekata na glavnom projektima (podrazumjeva se) + setting_enabled_scm: Omogući SCM (source code management) + setting_mail_handler_api_enabled: Omogući automatsku obradu ulaznih emailova + setting_mail_handler_api_key: API ključ (obrada ulaznih mailova) + setting_sequential_project_identifiers: Generiši identifikatore projekta sekvencijalno + setting_gravatar_enabled: 'Koristi "gravatar" korisničke ikone' + setting_diff_max_lines_displayed: Maksimalan broj linija za prikaz razlika između dva fajla + setting_file_max_size_displayed: Maksimalna veličina fajla kod prikaza razlika unutar fajla (inline) + setting_repository_log_display_limit: Maksimalna veličina revizija prikazanih na log fajlu + setting_openid: Omogući OpenID prijavu i registraciju + + permission_edit_project: Ispravke projekta + permission_select_project_modules: Odaberi module projekta + permission_manage_members: Upravljanje članovima + permission_manage_versions: Upravljanje verzijama + permission_manage_categories: Upravljanje kategorijama aktivnosti + permission_add_issues: Dodaj aktivnosti + permission_edit_issues: Ispravka aktivnosti + permission_manage_issue_relations: Upravljaj relacijama među aktivnostima + permission_add_issue_notes: Dodaj bilješke + permission_edit_issue_notes: Ispravi bilješke + permission_edit_own_issue_notes: Ispravi sopstvene bilješke + permission_move_issues: Pomjeri aktivnosti + permission_delete_issues: Izbriši aktivnosti + permission_manage_public_queries: Upravljaj javnim upitima + permission_save_queries: Snimi upite + permission_view_gantt: Pregled gantograma + permission_view_calendar: Pregled kalendara + permission_view_issue_watchers: Pregled liste korisnika koji prate aktivnost + permission_add_issue_watchers: Dodaj onoga koji prati aktivnost + permission_log_time: Evidentiraj utrošak vremena + permission_view_time_entries: Pregled utroška vremena + permission_edit_time_entries: Ispravka utroška vremena + permission_edit_own_time_entries: Ispravka svog utroška vremena + permission_manage_news: Upravljaj novostima + permission_comment_news: Komentiraj novosti + permission_view_documents: Pregled dokumenata + permission_manage_files: Upravljaj fajlovima + permission_view_files: Pregled fajlova + permission_manage_wiki: Upravljaj wiki stranicama + permission_rename_wiki_pages: Ispravi wiki stranicu + permission_delete_wiki_pages: Izbriši wiki stranicu + permission_view_wiki_pages: Pregled wiki sadržaja + permission_view_wiki_edits: Pregled wiki istorije + permission_edit_wiki_pages: Ispravka wiki stranica + permission_delete_wiki_pages_attachments: Brisanje fajlova prikačenih wiki-ju + permission_protect_wiki_pages: Zaštiti wiki stranicu + permission_manage_repository: Upravljaj repozitorijem + permission_browse_repository: Pregled repozitorija + permission_view_changesets: Pregled setova promjena + permission_commit_access: 'Pristup "commit"-u' + permission_manage_boards: Upravljaj forumima + permission_view_messages: Pregled poruka + permission_add_messages: Šalji poruke + permission_edit_messages: Ispravi poruke + permission_edit_own_messages: Ispravka sopstvenih poruka + permission_delete_messages: Prisanje poruka + permission_delete_own_messages: Brisanje sopstvenih poruka + + project_module_issue_tracking: Praćenje aktivnosti + project_module_time_tracking: Praćenje vremena + project_module_news: Novosti + project_module_documents: Dokumenti + project_module_files: Fajlovi + project_module_wiki: Wiki stranice + project_module_repository: Repozitorij + project_module_boards: Forumi + + label_user: Korisnik + label_user_plural: Korisnici + label_user_new: Novi korisnik + label_project: Projekat + label_project_new: Novi projekat + label_project_plural: Projekti + label_x_projects: + zero: 0 projekata + one: 1 projekat + other: "%{count} projekata" + label_project_all: Svi projekti + label_project_latest: Posljednji projekti + label_issue: Aktivnost + label_issue_new: Nova aktivnost + label_issue_plural: Aktivnosti + label_issue_view_all: Vidi sve aktivnosti + label_issues_by: "Aktivnosti po %{value}" + label_issue_added: Aktivnost je dodana + label_issue_updated: Aktivnost je izmjenjena + label_document: Dokument + label_document_new: Novi dokument + label_document_plural: Dokumenti + label_document_added: Dokument je dodan + label_role: Uloga + label_role_plural: Uloge + label_role_new: Nove uloge + label_role_and_permissions: Uloge i dozvole + label_member: Izvršilac + label_member_new: Novi izvršilac + label_member_plural: Izvršioci + label_tracker: Područje aktivnosti + label_tracker_plural: Područja aktivnosti + label_tracker_new: Novo područje aktivnosti + label_workflow: Tok promjena na aktivnosti + label_issue_status: Status aktivnosti + label_issue_status_plural: Statusi aktivnosti + label_issue_status_new: Novi status + label_issue_category: Kategorija aktivnosti + label_issue_category_plural: Kategorije aktivnosti + label_issue_category_new: Nova kategorija + label_custom_field: Proizvoljno polje + label_custom_field_plural: Proizvoljna polja + label_custom_field_new: Novo proizvoljno polje + label_enumerations: Enumeracije + label_enumeration_new: Nova vrijednost + label_information: Informacija + label_information_plural: Informacije + label_please_login: Molimo prijavite se + label_register: Registracija + label_login_with_open_id_option: ili prijava sa OpenID-om + label_password_lost: Izgubljena lozinka + label_home: Početna stranica + label_my_page: Moja stranica + label_my_account: Moj korisnički račun + label_my_projects: Moji projekti + label_administration: Administracija + label_login: Prijavi se + label_logout: Odjavi se + label_help: Pomoć + label_reported_issues: Prijavljene aktivnosti + label_assigned_to_me_issues: Aktivnosti dodjeljene meni + label_last_login: Posljednja konekcija + label_registered_on: Registrovan na + label_activity_plural: Promjene + label_activity: Operacija + label_overall_activity: Pregled svih promjena + label_user_activity: "Promjene izvršene od: %{value}" + label_new: Novi + label_logged_as: Prijavljen kao + label_environment: Sistemsko okruženje + label_authentication: Authentifikacija + label_auth_source: Mod authentifikacije + label_auth_source_new: Novi mod authentifikacije + label_auth_source_plural: Modovi authentifikacije + label_subproject_plural: Podprojekti + label_and_its_subprojects: "%{value} i njegovi podprojekti" + label_min_max_length: Min - Maks dužina + label_list: Lista + label_date: Datum + label_integer: Cijeli broj + label_float: Float + label_boolean: Logička varijabla + label_string: Tekst + label_text: Dugi tekst + label_attribute: Atribut + label_attribute_plural: Atributi + label_no_data: Nema podataka za prikaz + label_change_status: Promjeni status + label_history: Istorija + label_attachment: Fajl + label_attachment_new: Novi fajl + label_attachment_delete: Izbriši fajl + label_attachment_plural: Fajlovi + label_file_added: Fajl je dodan + label_report: Izvještaj + label_report_plural: Izvještaji + label_news: Novosti + label_news_new: Dodaj novosti + label_news_plural: Novosti + label_news_latest: Posljednje novosti + label_news_view_all: Pogledaj sve novosti + label_news_added: Novosti su dodane + label_settings: Postavke + label_overview: Pregled + label_version: Verzija + label_version_new: Nova verzija + label_version_plural: Verzije + label_confirmation: Potvrda + label_export_to: 'Takođe dostupno u:' + label_read: Čitaj... + label_public_projects: Javni projekti + label_open_issues: otvoren + label_open_issues_plural: otvoreni + label_closed_issues: zatvoren + label_closed_issues_plural: zatvoreni + label_x_open_issues_abbr: + zero: 0 otvoreno + one: 1 otvorena + other: "%{count} otvorene" + label_x_closed_issues_abbr: + zero: 0 zatvoreno + one: 1 zatvorena + other: "%{count} zatvorene" + label_total: Ukupno + label_permissions: Dozvole + label_current_status: Tekući status + label_new_statuses_allowed: Novi statusi dozvoljeni + label_all: sve + label_none: ništa + label_nobody: niko + label_next: Sljedeće + label_previous: Predhodno + label_used_by: Korišteno od + label_details: Detalji + label_add_note: Dodaj bilješku + label_calendar: Kalendar + label_months_from: mjeseci od + label_gantt: Gantt + label_internal: Interno + label_last_changes: "posljednjih %{count} promjena" + label_change_view_all: Vidi sve promjene + label_comment: Komentar + label_comment_plural: Komentari + label_x_comments: + zero: bez komentara + one: 1 komentar + other: "%{count} komentari" + label_comment_add: Dodaj komentar + label_comment_added: Komentar je dodan + label_comment_delete: Izbriši komentar + label_query: Proizvoljan upit + label_query_plural: Proizvoljni upiti + label_query_new: Novi upit + label_filter_add: Dodaj filter + label_filter_plural: Filteri + label_equals: je + label_not_equals: nije + label_in_less_than: je manji nego + label_in_more_than: je više nego + label_in: u + label_today: danas + label_all_time: sve vrijeme + label_yesterday: juče + label_this_week: ova hefta + label_last_week: zadnja hefta + label_last_n_days: "posljednjih %{count} dana" + label_this_month: ovaj mjesec + label_last_month: posljednji mjesec + label_this_year: ova godina + label_date_range: Datumski opseg + label_less_than_ago: ranije nego (dana) + label_more_than_ago: starije nego (dana) + label_ago: prije (dana) + label_contains: sadrži + label_not_contains: ne sadrži + label_day_plural: dani + label_repository: Repozitorij + label_repository_plural: Repozitoriji + label_browse: Listaj + label_revision: Revizija + label_revision_plural: Revizije + label_associated_revisions: Doddjeljene revizije + label_added: dodano + label_modified: izmjenjeno + label_copied: kopirano + label_renamed: preimenovano + label_deleted: izbrisano + label_latest_revision: Posljednja revizija + label_latest_revision_plural: Posljednje revizije + label_view_revisions: Vidi revizije + label_max_size: Maksimalna veličina + label_sort_highest: Pomjeri na vrh + label_sort_higher: Pomjeri gore + label_sort_lower: Pomjeri dole + label_sort_lowest: Pomjeri na dno + label_roadmap: Plan realizacije + label_roadmap_due_in: "Obavezan do %{value}" + label_roadmap_overdue: "%{value} kasni" + label_roadmap_no_issues: Nema aktivnosti za ovu verziju + label_search: Traži + label_result_plural: Rezultati + label_all_words: Sve riječi + label_wiki: Wiki stranice + label_wiki_edit: ispravka wiki-ja + label_wiki_edit_plural: ispravke wiki-ja + label_wiki_page: Wiki stranica + label_wiki_page_plural: Wiki stranice + label_index_by_title: Indeks prema naslovima + label_index_by_date: Indeks po datumima + label_current_version: Tekuća verzija + label_preview: Pregled + label_feed_plural: Feeds + label_changes_details: Detalji svih promjena + label_issue_tracking: Evidencija aktivnosti + label_spent_time: Utrošak vremena + label_f_hour: "%{value} sahat" + label_f_hour_plural: "%{value} sahata" + label_time_tracking: Evidencija vremena + label_change_plural: Promjene + label_statistics: Statistika + label_commits_per_month: '"Commit"-a po mjesecu' + label_commits_per_author: '"Commit"-a po autoru' + label_view_diff: Pregled razlika + label_diff_inline: zajedno + label_diff_side_by_side: jedna pored druge + label_options: Opcije + label_copy_workflow_from: Kopiraj tok promjena statusa iz + label_permissions_report: Izvještaj + label_watched_issues: Aktivnosti koje pratim + label_related_issues: Korelirane aktivnosti + label_applied_status: Status je primjenjen + label_loading: Učitavam... + label_relation_new: Nova relacija + label_relation_delete: Izbriši relaciju + label_relates_to: korelira sa + label_duplicates: duplikat + label_duplicated_by: duplicirano od + label_blocks: blokira + label_blocked_by: blokirano on + label_precedes: predhodi + label_follows: slijedi + label_stay_logged_in: Ostani prijavljen + label_disabled: onemogućen + label_show_completed_versions: Prikaži završene verzije + label_me: ja + label_board: Forum + label_board_new: Novi forum + label_board_plural: Forumi + label_topic_plural: Teme + label_message_plural: Poruke + label_message_last: Posljednja poruka + label_message_new: Nova poruka + label_message_posted: Poruka je dodana + label_reply_plural: Odgovori + label_send_information: Pošalji informaciju o korisničkom računu + label_year: Godina + label_month: Mjesec + label_week: Hefta + label_date_from: Od + label_date_to: Do + label_language_based: Bazirano na korisnikovom jeziku + label_sort_by: "Sortiraj po %{value}" + label_send_test_email: Pošalji testni email + label_feeds_access_key_created_on: "Atom pristupni ključ kreiran prije %{value} dana" + label_module_plural: Moduli + label_added_time_by: "Dodano od %{author} prije %{age}" + label_updated_time_by: "Izmjenjeno od %{author} prije %{age}" + label_updated_time: "Izmjenjeno prije %{value}" + label_jump_to_a_project: Skoči na projekat... + label_file_plural: Fajlovi + label_changeset_plural: Setovi promjena + label_default_columns: Podrazumjevane kolone + label_no_change_option: (Bez promjene) + label_bulk_edit_selected_issues: Ispravi odjednom odabrane aktivnosti + label_theme: Tema + label_default: Podrazumjevano + label_search_titles_only: Pretraži samo naslove + label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" + label_user_mail_option_selected: "Za bilo koji događaj na odabranim projektima..." + label_user_mail_no_self_notified: "Ne želim notifikaciju za promjene koje sam ja napravio" + label_registration_activation_by_email: aktivacija korisničkog računa email-om + label_registration_manual_activation: ručna aktivacija korisničkog računa + label_registration_automatic_activation: automatska kreacija korisničkog računa + label_display_per_page: "Po stranici: %{value}" + label_age: Starost + label_change_properties: Promjena osobina + label_general: Generalno + label_scm: SCM + label_plugins: Plugin-ovi + label_ldap_authentication: LDAP authentifikacija + label_downloads_abbr: D/L + label_optional_description: Opis (opciono) + label_add_another_file: Dodaj još jedan fajl + label_preferences: Postavke + label_chronological_order: Hronološki poredak + label_reverse_chronological_order: Reverzni hronološki poredak + label_incoming_emails: Dolazni email-ovi + label_generate_key: Generiši ključ + label_issue_watchers: Praćeno od + label_example: Primjer + label_display: Prikaz + + button_apply: Primjeni + button_add: Dodaj + button_archive: Arhiviranje + button_back: Nazad + button_cancel: Odustani + button_change: Izmjeni + button_change_password: Izmjena lozinke + button_check_all: Označi sve + button_clear: Briši + button_copy: Kopiraj + button_create: Novi + button_delete: Briši + button_download: Download + button_edit: Ispravka + button_list: Lista + button_lock: Zaključaj + button_log_time: Utrošak vremena + button_login: Prijava + button_move: Pomjeri + button_rename: Promjena imena + button_reply: Odgovor + button_reset: Resetuj + button_rollback: Vrati predhodno stanje + button_save: Snimi + button_sort: Sortiranje + button_submit: Pošalji + button_test: Testiraj + button_unarchive: Otpakuj arhivu + button_uncheck_all: Isključi sve + button_unlock: Otključaj + button_unwatch: Prekini notifikaciju + button_update: Promjena na aktivnosti + button_view: Pregled + button_watch: Notifikacija + button_configure: Konfiguracija + button_quote: Citat + + status_active: aktivan + status_registered: registrovan + status_locked: zaključan + + text_select_mail_notifications: Odaberi događaje za koje će se slati email notifikacija. + text_regexp_info: npr. ^[A-Z0-9]+$ + text_min_max_length_info: 0 znači bez restrikcije + text_project_destroy_confirmation: Sigurno želite izbrisati ovaj projekat i njegove podatke ? + text_subprojects_destroy_warning: "Podprojekt(i): %{value} će takođe biti izbrisani." + text_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti + text_are_you_sure: Da li ste sigurni ? + text_tip_issue_begin_day: zadatak počinje danas + text_tip_issue_end_day: zadatak završava danas + text_tip_issue_begin_end_day: zadatak započinje i završava danas + text_caracters_maximum: "maksimum %{count} karaktera." + text_caracters_minimum: "Dužina mora biti najmanje %{count} znakova." + text_length_between: "Broj znakova između %{min} i %{max}." + text_tracker_no_workflow: Tok statusa nije definisan za ovo područje aktivnosti + text_unallowed_characters: Nedozvoljeni znakovi + text_comma_separated: Višestruke vrijednosti dozvoljene (odvojiti zarezom). + text_issues_ref_in_commit_messages: 'Referenciranje i zatvaranje aktivnosti putem "commit" poruka' + text_issue_added: "Aktivnost %{id} je prijavljena od %{author}." + text_issue_updated: "Aktivnost %{id} je izmjenjena od %{author}." + text_wiki_destroy_confirmation: Sigurno želite izbrisati ovaj wiki i čitav njegov sadržaj ? + text_issue_category_destroy_question: "Neke aktivnosti (%{count}) pripadaju ovoj kategoriji. Sigurno to želite uraditi ?" + text_issue_category_destroy_assignments: Ukloni kategoriju + text_issue_category_reassign_to: Ponovo dodijeli ovu kategoriju + text_user_mail_option: "Za projekte koje niste odabrali, primićete samo notifikacije o stavkama koje pratite ili ste u njih uključeni (npr. vi ste autor ili su vama dodjeljenje)." + text_no_configuration_data: "Uloge, područja aktivnosti, statusi aktivnosti i tok promjena statusa nisu konfigurisane.\nKrajnje je preporučeno da učitate tekuđe postavke. Kasnije ćete ih moći mjenjati po svojim potrebama." + text_load_default_configuration: Učitaj tekuću konfiguraciju + text_status_changed_by_changeset: "Primjenjeno u setu promjena %{value}." + text_issues_destroy_confirmation: 'Sigurno želite izbrisati odabranu/e aktivnost/i ?' + text_select_project_modules: 'Odaberi module koje želite u ovom projektu:' + text_default_administrator_account_changed: Tekući administratorski račun je promjenjen + text_file_repository_writable: U direktorij sa fajlovima koji su prilozi se može pisati + text_plugin_assets_writable: U direktorij plugin-ova se može pisati + text_rmagick_available: RMagick je dostupan (opciono) + text_destroy_time_entries_question: "%{hours} sahata je prijavljeno na aktivnostima koje želite brisati. Želite li to učiniti ?" + text_destroy_time_entries: Izbriši prijavljeno vrijeme + text_assign_time_entries_to_project: Dodaj prijavljenoo vrijeme projektu + text_reassign_time_entries: 'Preraspodjeli prijavljeno vrijeme na ovu aktivnost:' + text_user_wrote: "%{value} je napisao/la:" + text_enumeration_destroy_question: "Za %{count} objekata je dodjeljenja ova vrijednost." + text_enumeration_category_reassign_to: 'Ponovo im dodjeli ovu vrijednost:' + text_email_delivery_not_configured: "Email dostava nije konfiguraisana, notifikacija je onemogućena.\nKonfiguriši SMTP server u config/configuration.yml i restartuj aplikaciju nakon toga." + text_repository_usernames_mapping: "Odaberi ili ispravi redmine korisnika mapiranog za svako korisničko ima nađeno u logu repozitorija.\nKorisnici sa istim imenom u redmineu i u repozitoruju se automatski mapiraju." + text_diff_truncated: '... Ovaj prikaz razlike je odsječen pošto premašuje maksimalnu veličinu za prikaz' + text_custom_field_possible_values_info: 'Jedna linija za svaku vrijednost' + + default_role_manager: Menadžer + default_role_developer: Programer + default_role_reporter: Reporter + default_tracker_bug: Greška + default_tracker_feature: Nova funkcija + default_tracker_support: Podrška + default_issue_status_new: Novi + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Riješen + default_issue_status_feedback: Čeka se povratna informacija + default_issue_status_closed: Zatvoren + default_issue_status_rejected: Odbijen + default_doc_category_user: Korisnička dokumentacija + default_doc_category_tech: Tehnička dokumentacija + default_priority_low: Nizak + default_priority_normal: Normalan + default_priority_high: Visok + default_priority_urgent: Urgentno + default_priority_immediate: Odmah + default_activity_design: Dizajn + default_activity_development: Programiranje + + enumeration_issue_priorities: Prioritet aktivnosti + enumeration_doc_categories: Kategorije dokumenata + enumeration_activities: Operacije (utrošak vremena) + notice_unable_delete_version: Ne mogu izbrisati verziju. + button_create_and_continue: Kreiraj i nastavi + button_annotate: Zabilježi + button_activate: Aktiviraj + label_sort: Sortiranje + label_date_from_to: Od %{start} do %{end} + label_ascending: Rastuće + label_descending: Opadajuće + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do? + text_wiki_page_reassign_children: Reassign child pages to this parent page + text_wiki_page_nullify_children: Keep child pages as root pages + text_wiki_page_destroy_children: Delete child pages and all their descendants + setting_password_min_length: Minimum password length + field_group_by: Group results by + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + label_wiki_content_added: Wiki page added + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}. + label_wiki_content_updated: Wiki page updated + mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}. + permission_add_project: Create project + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + label_view_all_revisions: View all revisions + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. + error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses"). + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + label_group_plural: Groups + label_group: Group + label_group_new: New group + label_time_entry_plural: Spent time + text_journal_added: "%{label} %{value} added" + field_active: Active + enumeration_system_activity: System Activity + permission_delete_issue_watchers: Delete watchers + version_status_closed: closed + version_status_locked: locked + version_status_open: open + error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened + label_user_anonymous: Anonymous + button_move_and_follow: Move and follow + setting_default_projects_modules: Default enabled modules for new projects + setting_gravatar_default: Default Gravatar image + field_sharing: Sharing + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_system: With all projects + label_version_sharing_descendants: With subprojects + label_version_sharing_tree: With project tree + label_version_sharing_none: Not shared + error_can_not_archive_project: This project can not be archived + button_duplicate: Duplicate + button_copy_and_follow: Copy and follow + label_copy_source: Source + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_status: Use the issue status + error_issue_done_ratios_not_updated: Issue done ratios not updated. + error_workflow_copy_target: Please select target tracker(s) and role(s) + setting_issue_done_ratio_issue_field: Use the issue field + label_copy_same_as_target: Same as target + label_copy_target: Target + notice_issue_done_ratios_updated: Issue done ratios updated. + error_workflow_copy_source: Please select a source tracker or role + label_update_issue_done_ratios: Update issue done ratios + setting_start_of_week: Start calendars on + permission_view_issues: View Issues + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_revision_id: Revision %{value} + label_api_access_key: API access key + label_api_access_key_created_on: API access key created %{value} ago + label_feeds_access_key: Atom access key + notice_api_access_key_reseted: Your API access key was reset. + setting_rest_api_enabled: Enable REST web service + label_missing_api_access_key: Missing an API access key + label_missing_feeds_access_key: Missing a Atom access key + button_show: Show + text_line_separated: Multiple values allowed (one line for each value). + setting_mail_handler_body_delimiters: Truncate emails after one of these lines + permission_add_subprojects: Create subprojects + label_subproject_new: New subproject + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_close_versions: Close completed versions + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: 'Enkodiranje "commit" poruka' + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 aktivnost + one: 1 aktivnost + other: "%{count} aktivnosti" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: sve + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Ukupno + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API ključ (obrada ulaznih mailova) + setting_lost_password: Izgubljena lozinka + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/ca.yml b/config/locales/ca.yml new file mode 100644 index 0000000..9d9bc73 --- /dev/null +++ b/config/locales/ca.yml @@ -0,0 +1,1220 @@ +# Redmine Catalan translation: +# by Joan Duran +# Contributors: @gimstein (Helder Manuel Torres Vieira) + +ca: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: "ltr" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d-%m-%Y" + short: "%e de %b" + long: "%a, %e de %b de %Y" + + day_names: [Diumenge, Dilluns, Dimarts, Dimecres, Dijous, Divendres, Dissabte] + abbr_day_names: [dg, dl, dt, dc, dj, dv, ds] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Desembre] + abbr_month_names: [~, Gen, Feb, Mar, Abr, Mai, Jun, Jul, Ago, Set, Oct, Nov, Des] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%d-%m-%Y %H:%M" + time: "%H:%M" + short: "%e de %b, %H:%M" + long: "%a, %e de %b de %Y, %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "mig minut" + less_than_x_seconds: + one: "menys d'un segon" + other: "menys de %{count} segons" + x_seconds: + one: "1 segons" + other: "%{count} segons" + less_than_x_minutes: + one: "menys d'un minut" + other: "menys de %{count} minuts" + x_minutes: + one: "1 minut" + other: "%{count} minuts" + about_x_hours: + one: "aproximadament 1 hora" + other: "aproximadament %{count} hores" + x_hours: + one: "1 hora" + other: "%{count} hores" + x_days: + one: "1 dia" + other: "%{count} dies" + about_x_months: + one: "aproximadament 1 mes" + other: "aproximadament %{count} mesos" + x_months: + one: "1 mes" + other: "%{count} mesos" + about_x_years: + one: "aproximadament 1 any" + other: "aproximadament %{count} anys" + over_x_years: + one: "més d'un any" + other: "més de %{count} anys" + almost_x_years: + one: "casi 1 any" + other: "casi %{count} anys" + + number: + # Default format for numbers + format: + separator: "." + delimiter: "," + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "i" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "no s'ha pogut desar aquest %{model} perquè s'ha trobat 1 error" + other: "no s'ha pogut desar aquest %{model} perquè s'han trobat %{count} errors" + messages: + inclusion: "no està inclòs a la llista" + exclusion: "està reservat" + invalid: "no és vàlid" + confirmation: "la confirmació no coincideix" + accepted: "s'ha d'acceptar" + empty: "no pot estar buit" + blank: "no pot estar en blanc" + too_long: "és massa llarg" + too_short: "és massa curt" + wrong_length: "la longitud és incorrecta" + taken: "ja s'està utilitzant" + not_a_number: "no és un número" + not_a_date: "no és una data vàlida" + greater_than: "ha de ser més gran que %{count}" + greater_than_or_equal_to: "ha de ser més gran o igual a %{count}" + equal_to: "ha de ser igual a %{count}" + less_than: "ha de ser menys que %{count}" + less_than_or_equal_to: "ha de ser menys o igual a %{count}" + odd: "ha de ser senar" + even: "ha de ser parell" + greater_than_start_date: "ha de ser superior que la data inicial" + not_same_project: "no pertany al mateix projecte" + circular_dependency: "Aquesta relació crearia una dependència circular" + cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques" + earlier_than_minimum_start_date: "no pot ser anterior a %{date} derivat a les peticions precedents" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: "Seleccionar" + + general_text_No: "No" + general_text_Yes: "Si" + general_text_no: "no" + general_text_yes: "si" + general_lang_name: "Catalan (Català)" + general_csv_separator: ";" + general_csv_decimal_separator: "," + general_csv_encoding: "ISO-8859-15" + general_pdf_fontname: "freesans" + general_pdf_monospaced_fontname: "freemono" + general_first_day_of_week: "1" + + notice_account_updated: "El compte s'ha actualitzat correctament." + notice_account_invalid_credentials: "Usuari o contrasenya invàlid" + notice_account_password_updated: "La contrasenya s'ha modificat correctament." + notice_account_wrong_password: "Contrasenya incorrecta" + notice_account_register_done: "El compte s'ha creat correctament. Per a activar el compte, feu clic en l'enllaç que us han enviat per correu electrònic." + notice_account_unknown_email: "Usuari desconegut." + notice_can_t_change_password: "Aquest compte utilitza una font d'autenticació externa. No és possible canviar la contrasenya." + notice_account_lost_email_sent: "S'ha enviat un correu electrònic amb instruccions per a seleccionar una contrasenya nova." + notice_account_activated: "El compte s'ha activat correctament. Ara ja podeu entrar." + notice_successful_create: "S'ha creat correctament." + notice_successful_update: "S'ha modificat correctament." + notice_successful_delete: "S'ha suprimit correctament." + notice_successful_connection: "S'ha connectat correctament." + notice_file_not_found: "La pàgina a la que intenteu accedir no existeix o s'ha suprimit." + notice_locking_conflict: "Un altre usuari ha actualitzat les dades." + notice_not_authorized: "No teniu permís per accedir a aquesta pàgina." + notice_email_sent: "S'ha enviat un correu electrònic a %{value}" + notice_email_error: "S'ha produït un error en enviar el correu (%{value})" + notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del Atom." + notice_api_access_key_reseted: "S'ha reiniciat la clau d'accés a l'API." + notice_failed_to_save_issues: "No s'han pogut desar %{count} assumptes de %{total} seleccionats: %{ids}." + notice_failed_to_save_members: "No s'han pogut desar els membres: %{errors}." + notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar." + notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador." + notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada." + notice_unable_delete_version: "No s'ha pogut suprimir la versió." + notice_unable_delete_time_entry: "No s'ha pogut suprimir l'entrada del registre de temps." + notice_issue_done_ratios_updated: "S'ha actualitzat el percentatge dels assumptes." + + error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: %{value} " + error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el repositori." + error_scm_command_failed: "S'ha produït un error en intentar accedir al repositori: %{value}" + error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar." + error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte" + error_no_tracker_in_project: "Aquest projecte no té cap tipus d'assumpte associat. Comproveu els paràmetres del projecte." + error_no_default_issue_status: "No s'ha definit cap estat d'assumpte predeterminat. Comproveu la configuració (aneu a «Administració -> Estats de l'assumpte»)." + error_can_not_delete_custom_field: "No s'ha pogut suprimir el camp personalitat" + error_can_not_delete_tracker: "Aquest tipus d'assumpte conté assumptes i no es pot suprimir." + error_can_not_remove_role: "Aquest rol s'està utilitzant i no es pot suprimir." + error_can_not_reopen_issue_on_closed_version: "Un assumpte assignat a una versió tancada no es pot tornar a obrir" + error_can_not_archive_project: "Aquest projecte no es pot arxivar" + error_issue_done_ratios_not_updated: "No s'ha actualitzat el percentatge dels assumptes." + error_workflow_copy_source: "Seleccioneu un tipus d'assumpte o rol font" + error_workflow_copy_target: "Seleccioneu tipus d'assumptes i rols objectiu" + error_unable_delete_issue_status: "No s'ha pogut suprimir l'estat de l'assumpte" + error_unable_to_connect: "No s'ha pogut connectar (%{value})" + warning_attachments_not_saved: "No s'han pogut desar %{count} fitxers." + error_ldap_bind_credentials: "Compte/Contrasenya LDAP incorrecte" + + mail_subject_lost_password: "Contrasenya de %{value}" + mail_body_lost_password: "Per a canviar la contrasenya, feu clic en l'enllaç següent:" + mail_subject_register: "Activació del compte de %{value}" + mail_body_register: "Per a activar el compte, feu clic en l'enllaç següent:" + mail_body_account_information_external: "Podeu utilitzar el compte «%{value}» per entrar." + mail_body_account_information: "Informació del compte" + mail_subject_account_activation_request: "Sol·licitud d'activació del compte de %{value}" + mail_body_account_activation_request: "S'ha registrat un usuari nou (%{value}). El seu compte està pendent d'aprovació:" + mail_subject_reminder: "%{count} assumptes venceran els següents %{days} dies" + mail_body_reminder: "%{count} assumptes que teniu assignades venceran els següents %{days} dies:" + mail_subject_wiki_content_added: "S'ha afegit la pàgina wiki «%{id}»" + mail_body_wiki_content_added: "En %{author} ha afegit la pàgina wiki «%{id}»." + mail_subject_wiki_content_updated: "S'ha actualitzat la pàgina wiki «%{id}»" + mail_body_wiki_content_updated: "L'autor %{author} ha actualitzat la pàgina wiki «%{id}»." + + field_name: "Nom" + field_description: "Descripció" + field_summary: "Resum" + field_is_required: "Necessari" + field_firstname: "Nom" + field_lastname: "Cognom" + field_mail: "Correu electrònic" + field_filename: "Fitxer" + field_filesize: "Mida" + field_downloads: "Baixades" + field_author: "Autor" + field_created_on: "Creat" + field_updated_on: "Actualitzat" + field_field_format: "Format" + field_is_for_all: "Per tots els projectes" + field_possible_values: "Valors possibles" + field_regexp: "Expressió regular" + field_min_length: "Longitud mínima" + field_max_length: "Longitud màxima" + field_value: "Valor" + field_category: "Categoria" + field_title: "Títol" + field_project: "Projecte" + field_issue: "Assumpte" + field_status: "Estat" + field_notes: "Notes" + field_is_closed: "Assumpte tancat" + field_is_default: "Estat predeterminat" + field_tracker: "Tipus d'assumpte" + field_subject: "Tema" + field_due_date: "Data de venciment" + field_assigned_to: "Assignat a" + field_priority: "Prioritat" + field_fixed_version: "Versió prevista" + field_user: "Usuari" + field_principal: "Principal" + field_role: "Rol" + field_homepage: "Pàgina web" + field_is_public: "Públic" + field_parent: "Subprojecte de" + field_is_in_roadmap: "Assumptes mostrats en la planificació" + field_login: "Identificador" + field_mail_notification: "Notificacions per correu electrònic" + field_admin: "Administrador" + field_last_login_on: "Última connexió" + field_language: "Idioma" + field_effective_date: "Data" + field_password: "Contrasenya" + field_new_password: "Nova contrasenya" + field_password_confirmation: "Confirmació" + field_version: "Versió" + field_type: "Tipus" + field_host: "Servidor" + field_port: "Port" + field_account: "Compte" + field_base_dn: "Base DN" + field_attr_login: "Atribut d'entrada" + field_attr_firstname: "Atribut del nom" + field_attr_lastname: "Atribut del cognom" + field_attr_mail: "Atribut del correu electrònic" + field_onthefly: "Creació de l'usuari «al vol»" + field_start_date: "Inici" + field_done_ratio: "% realitzat" + field_auth_source: "Mode d'autenticació" + field_hide_mail: "Oculta l'adreça de correu electrònic" + field_comments: "Comentari" + field_url: "URL" + field_start_page: "Pàgina inicial" + field_subproject: "Subprojecte" + field_hours: "Hores" + field_activity: "Activitat" + field_spent_on: "Data" + field_identifier: "Identificador" + field_is_filter: "Utilitzat com filtre" + field_issue_to: "Assumpte relacionat" + field_delay: "Retràs" + field_assignable: "Es poden assignar assumptes a aquest rol" + field_redirect_existing_links: "Redirigeix els enllaços existents" + field_estimated_hours: "Temps previst" + field_column_names: "Columnes" + field_time_entries: "Registre de temps" + field_time_zone: "Zona horària" + field_searchable: "Es pot cercar" + field_default_value: "Valor predeterminat" + field_comments_sorting: "Mostra els comentaris" + field_parent_title: "Pàgina pare" + field_editable: "Es pot editar" + field_watcher: "Vigilància" + field_identity_url: "URL OpenID" + field_content: "Contingut" + field_group_by: "Agrupa els resultats per" + field_sharing: "Compartir" + field_parent_issue: "Tasca pare" + + setting_app_title: "Títol de l'aplicació" + setting_app_subtitle: "Subtítol de l'aplicació" + setting_welcome_text: "Text de benvinguda" + setting_default_language: "Idioma predeterminat" + setting_login_required: "Es necessita autenticació" + setting_self_registration: "Registre automàtic" + setting_attachment_max_size: "Mida màxima dels fitxers adjunts" + setting_issues_export_limit: "Límit d'exportació d'assumptes" + setting_mail_from: "Adreça de correu electrònic d'emissió" + setting_bcc_recipients: "Vincula els destinataris de les còpies amb carbó (bcc)" + setting_plain_text_mail: "només text pla (no HTML)" + setting_host_name: "Nom del Servidor" + setting_text_formatting: "Format del text" + setting_wiki_compression: "Comprimeix l'historial de la wiki" + setting_feeds_limit: "Límit de contingut del canal" + setting_default_projects_public: "Els projectes nous són públics per defecte" + setting_autofetch_changesets: "Omple automàticament les publicacions" + setting_sys_api_enabled: "Activar WS per a la gestió del repositori" + setting_commit_ref_keywords: "Paraules claus per a la referència" + setting_commit_fix_keywords: "Paraules claus per a la correcció" + setting_autologin: "Entrada automàtica" + setting_date_format: "Format de la data" + setting_time_format: "Format de hora" + setting_cross_project_issue_relations: "Permet les relacions d'assumptes entre projectes" + setting_issue_list_default_columns: "Columnes mostrades per defecte en la llista d'assumptes" + setting_emails_footer: "Peu dels correus electrònics" + setting_protocol: "Protocol" + setting_per_page_options: "Opcions dels objectes per pàgina" + setting_user_format: "Format de com mostrar l'usuari" + setting_activity_days_default: "Dies a mostrar l'activitat del projecte" + setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte" + setting_enabled_scm: "Activar SCM" + setting_mail_handler_body_delimiters: "Trunca els correus electrònics després d'una d'aquestes línies" + setting_mail_handler_api_enabled: "Activar WS per correus electrònics d'entrada" + setting_mail_handler_api_key: "Clau API" + setting_sequential_project_identifiers: "Genera identificadors de projecte seqüencials" + setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar" + setting_gravatar_default: "Imatge Gravatar predeterminada" + setting_diff_max_lines_displayed: "Número màxim de línies amb diferències mostrades" + setting_file_max_size_displayed: "Mida màxima dels fitxers de text mostrats en línia" + setting_repository_log_display_limit: "Número màxim de revisions que es mostren al registre de fitxers" + setting_openid: "Permet entrar i registrar-se amb l'OpenID" + setting_password_min_length: "Longitud mínima de la contrasenya" + setting_new_project_user_role_id: "Aquest rol es dóna a un usuari no administrador per a crear projectes" + setting_default_projects_modules: "Mòduls activats per defecte en els projectes nous" + setting_issue_done_ratio: "Calcula tant per cent realitzat de l'assumpte amb" + setting_issue_done_ratio_issue_status: "Utilitza l'estat de l'assumpte" + setting_issue_done_ratio_issue_field: "Utilitza el camp de l'assumpte" + setting_start_of_week: "Inicia les setmanes en" + setting_rest_api_enabled: "Habilita el servei web REST" + setting_cache_formatted_text: "Cache formatted text" + + permission_add_project: "Crear projecte" + permission_add_subprojects: "Crear subprojectes" + permission_edit_project: "Editar projecte" + permission_select_project_modules: "Selecciona els mòduls del projecte" + permission_manage_members: "Gestionar els membres" + permission_manage_project_activities: "Gestionar les activitats del projecte" + permission_manage_versions: "Gestionar les versions" + permission_manage_categories: "Gestionar les categories dels assumptes" + permission_view_issues: "Visualitza els assumptes" + permission_add_issues: "Afegir assumptes" + permission_edit_issues: "Editar assumptes" + permission_manage_issue_relations: "Gestiona les relacions dels assumptes" + permission_add_issue_notes: "Afegir notes" + permission_edit_issue_notes: "Editar notes" + permission_edit_own_issue_notes: "Editar notes pròpies" + permission_move_issues: "Moure assumptes" + permission_delete_issues: "Suprimir assumptes" + permission_manage_public_queries: "Gestionar consultes públiques" + permission_save_queries: "Desar consultes" + permission_view_gantt: "Visualitzar gràfica de Gantt" + permission_view_calendar: "Visualitzar calendari" + permission_view_issue_watchers: "Visualitzar la llista de vigilàncies" + permission_add_issue_watchers: "Afegir vigilàncies" + permission_delete_issue_watchers: "Suprimir vigilants" + permission_log_time: "Registrar el temps invertit" + permission_view_time_entries: "Visualitzar el temps invertit" + permission_edit_time_entries: "Editar els registres de temps" + permission_edit_own_time_entries: "Editar els registres de temps propis" + permission_manage_news: "Gestionar noticies" + permission_comment_news: "Comentar noticies" + permission_view_documents: "Visualitzar documents" + permission_manage_files: "Gestionar fitxers" + permission_view_files: "Visualitzar fitxers" + permission_manage_wiki: "Gestionar la wiki" + permission_rename_wiki_pages: "Canviar el nom de les pàgines wiki" + permission_delete_wiki_pages: "Suprimir les pàgines wiki" + permission_view_wiki_pages: "Visualitzar la wiki" + permission_view_wiki_edits: "Visualitza l'historial de la wiki" + permission_edit_wiki_pages: "Editar les pàgines wiki" + permission_delete_wiki_pages_attachments: "Suprimir adjunts" + permission_protect_wiki_pages: "Protegir les pàgines wiki" + permission_manage_repository: "Gestionar el repositori" + permission_browse_repository: "Navegar pel repositori" + permission_view_changesets: "Visualitzar els canvis realitzats" + permission_commit_access: "Accés a les publicacions" + permission_manage_boards: "Gestionar els taulers" + permission_view_messages: "Visualitzar els missatges" + permission_add_messages: "Enviar missatges" + permission_edit_messages: "Editar missatges" + permission_edit_own_messages: "Editar missatges propis" + permission_delete_messages: "Suprimir els missatges" + permission_delete_own_messages: Suprimir els missatges propis + permission_export_wiki_pages: "Exportar les pàgines wiki" + permission_manage_subtasks: "Gestionar subtasques" + + project_module_issue_tracking: "Tipus d'assumptes" + project_module_time_tracking: "Seguidor de temps" + project_module_news: "Noticies" + project_module_documents: "Documents" + project_module_files: "Fitxers" + project_module_wiki: "Wiki" + project_module_repository: "Repositori" + project_module_boards: "Taulers" + project_module_calendar: "Calendari" + project_module_gantt: "Gantt" + + label_user: "Usuari" + label_user_plural: "Usuaris" + label_user_new: "Nou usuari" + label_user_anonymous: "Anònim" + label_project: "Projecte" + label_project_new: "Nou projecte" + label_project_plural: "Projectes" + label_x_projects: + zero: "cap projecte" + one: "1 projecte" + other: "%{count} projectes" + label_project_all: "Tots els projectes" + label_project_latest: "Els últims projectes" + label_issue: "Assumpte" + label_issue_new: "Nou assumpte" + label_issue_plural: "Assumptes" + label_issue_view_all: "Visualitzar tots els assumptes" + label_issues_by: "Assumptes per %{value}" + label_issue_added: "Assumpte afegit" + label_issue_updated: "Assumpte actualitzat" + label_document: "Document" + label_document_new: "Nou document" + label_document_plural: "Documents" + label_document_added: "Document afegit" + label_role: "Rol" + label_role_plural: "Rols" + label_role_new: "Nou rol" + label_role_and_permissions: "Rols i permisos" + label_member: "Membre" + label_member_new: "Nou membre" + label_member_plural: "Membres" + label_tracker: "Tipus d'assumpte" + label_tracker_plural: "Tipus d'assumptes" + label_tracker_new: "Nou tipus d'assumpte" + label_workflow: "Flux de treball" + label_issue_status: "Estat de l'assumpte" + label_issue_status_plural: "Estats de l'assumpte" + label_issue_status_new: "Nou estat" + label_issue_category: "Categoria de l'assumpte" + label_issue_category_plural: "Categories de l'assumpte" + label_issue_category_new: "Nova categoria" + label_custom_field: "Camp personalitzat" + label_custom_field_plural: "Camps personalitzats" + label_custom_field_new: "Nou camp personalitzat" + label_enumerations: "Llistat de valors" + label_enumeration_new: "Nou valor" + label_information: "Informació" + label_information_plural: "Informació" + label_please_login: "Si us plau, inicieu sessió" + label_register: "Registrar" + label_login_with_open_id_option: "o entrar amb OpenID" + label_password_lost: "Has oblidat la contrasenya?" + label_home: "Inici" + label_my_page: "La meva pàgina" + label_my_account: "El meu compte" + label_my_projects: "Els meus projectes" + label_administration: "Administració" + label_login: "Iniciar sessió" + label_logout: "Tancar sessió" + label_help: "Ajuda" + label_reported_issues: "Assumptes informats" + label_assigned_to_me_issues: "Assumptes assignats a mi" + label_last_login: "Última connexió" + label_registered_on: "Informat el" + label_activity: "Activitat" + label_overall_activity: "Activitat global" + label_user_activity: "Activitat de %{value}" + label_new: "Nou" + label_logged_as: "Heu entrat com a" + label_environment: "Entorn" + label_authentication: "Autenticació" + label_auth_source: "Mode d'autenticació" + label_auth_source_new: "Nou mode d'autenticació" + label_auth_source_plural: "Modes d'autenticació" + label_subproject_plural: "Subprojectes" + label_subproject_new: "Nou subprojecte" + label_and_its_subprojects: "%{value} i els seus subprojectes" + label_min_max_length: "Longitud mín - màx" + label_list: "Llista" + label_date: "Data" + label_integer: "Numero" + label_float: "Flotant" + label_boolean: "Booleà" + label_string: "Text" + label_text: "Text llarg" + label_attribute: "Atribut" + label_attribute_plural: "Atributs" + label_no_data: "Sense dades a mostrar" + label_change_status: "Canvia l'estat" + label_history: "Historial" + label_attachment: "Fitxer" + label_attachment_new: "Nou fitxer" + label_attachment_delete: "Suprimir fitxer" + label_attachment_plural: "Fitxers" + label_file_added: "Fitxer afegit" + label_report: "Informe" + label_report_plural: "Informes" + label_news: "Noticies" + label_news_new: "Nova noticia" + label_news_plural: "Noticies" + label_news_latest: "Últimes noticies" + label_news_view_all: "Visualitza totes les noticies" + label_news_added: "Noticies afegides" + label_settings: "Paràmetres" + label_overview: "Resum" + label_version: "Versió" + label_version_new: "Nova versió" + label_version_plural: "Versions" + label_close_versions: "Tancar versions completades" + label_confirmation: "Confirmació" + label_export_to: "També disponible a:" + label_read: "Llegir..." + label_public_projects: "Projectes públics" + label_open_issues: "obert" + label_open_issues_plural: "oberts" + label_closed_issues: "tancat" + label_closed_issues_plural: "tancats" + label_x_open_issues_abbr: + zero: "0 oberts" + one: "1 obert" + other: "%{count} oberts" + label_x_closed_issues_abbr: + zero: "0 tancats" + one: "1 tancat" + other: "%{count} tancats" + label_total: "Total" + label_permissions: "Permisos" + label_current_status: "Estat actual" + label_new_statuses_allowed: "Nous estats autoritzats" + label_all: "tots" + label_none: "cap" + label_nobody: "ningú" + label_next: "Següent" + label_previous: "Anterior" + label_used_by: "Utilitzat per" + label_details: "Detalls" + label_add_note: "Afegir una nota" + label_calendar: "Calendari" + label_months_from: "mesos des de" + label_gantt: "Gantt" + label_internal: "Intern" + label_last_changes: "últims %{count} canvis" + label_change_view_all: "Visualitza tots els canvis" + label_comment: "Comentari" + label_comment_plural: "Comentaris" + label_x_comments: + zero: "sense comentaris" + one: "1 comentari" + other: "%{count} comentaris" + label_comment_add: "Afegir un comentari" + label_comment_added: "Comentari afegit" + label_comment_delete: "Suprimir comentaris" + label_query: "Consulta personalitzada" + label_query_plural: "Consultes personalitzades" + label_query_new: "Nova consulta" + label_filter_add: "Afegir un filtre" + label_filter_plural: "Filtres" + label_equals: "és" + label_not_equals: "no és" + label_in_less_than: "en menys de" + label_in_more_than: "en més de" + label_greater_or_equal: ">=" + label_less_or_equal: "<=" + label_in: "en" + label_today: "avui" + label_all_time: "tot el temps" + label_yesterday: "ahir" + label_this_week: "aquesta setmana" + label_last_week: "l'última setmana" + label_last_n_days: "els últims %{count} dies" + label_this_month: "aquest més" + label_last_month: "l'últim més" + label_this_year: "aquest any" + label_date_range: "Rang de dates" + label_less_than_ago: "fa menys de" + label_more_than_ago: "fa més de" + label_ago: "fa" + label_contains: "conté" + label_not_contains: "no conté" + label_day_plural: "dies" + label_repository: "Repositori" + label_repository_plural: "Repositoris" + label_browse: "Navegar" + label_branch: "Branca" + label_tag: "Etiqueta" + label_revision: "Revisió" + label_revision_plural: "Revisions" + label_revision_id: "Revisió %{value}" + label_associated_revisions: "Revisions associades" + label_added: "afegit" + label_modified: "modificat" + label_copied: "copiat" + label_renamed: "reanomenat" + label_deleted: "suprimit" + label_latest_revision: "Última revisió" + label_latest_revision_plural: "Últimes revisions" + label_view_revisions: "Visualitzar revisions" + label_view_all_revisions: "Visualitza totes les revisions" + label_max_size: "Mida màxima" + label_sort_highest: "Primer" + label_sort_higher: "Pujar" + label_sort_lower: "Baixar" + label_sort_lowest: "Ultim" + label_roadmap: "Planificació" + label_roadmap_due_in: "Venç en %{value}" + label_roadmap_overdue: "%{value} tard" + label_roadmap_no_issues: "No hi ha assumptes per a aquesta versió" + label_search: "Cerca" + label_result_plural: "Resultats" + label_all_words: "Totes les paraules" + label_wiki: "Wiki" + label_wiki_edit: "Edició wiki" + label_wiki_edit_plural: "Edicions wiki" + label_wiki_page: "Pàgina wiki" + label_wiki_page_plural: "Pàgines wiki" + label_index_by_title: "Índex per títol" + label_index_by_date: "Índex per data" + label_current_version: "Versió actual" + label_preview: "Previsualitzar" + label_feed_plural: "Canals" + label_changes_details: "Detalls de tots els canvis" + label_issue_tracking: "Seguiment d'assumptes" + label_spent_time: "Temps invertit" + label_overall_spent_time: "Temps total invertit" + label_f_hour: "%{value} hora" + label_f_hour_plural: "%{value} hores" + label_time_tracking: "Temps de seguiment" + label_change_plural: "Canvis" + label_statistics: "Estadístiques" + label_commits_per_month: "Publicacions per mes" + label_commits_per_author: "Publicacions per autor" + label_view_diff: "Visualitza les diferències" + label_diff_inline: "en línia" + label_diff_side_by_side: "costat per costat" + label_options: "Opcions" + label_copy_workflow_from: "Copia el flux de treball des de" + label_permissions_report: "Informe de permisos" + label_watched_issues: "Assumptes vigilats" + label_related_issues: "Assumptes relacionats" + label_applied_status: "Estat aplicat" + label_loading: "S'està carregant..." + label_relation_new: "Nova Relació" + label_relation_delete: "Suprimir relació" + label_relates_to: "relacionat amb" + label_duplicates: "duplicats" + label_duplicated_by: "duplicat per" + label_blocks: "bloqueja" + label_blocked_by: "bloquejats per" + label_precedes: "anterior a" + label_follows: "posterior a" + label_stay_logged_in: "Manté l'entrada" + label_disabled: "inhabilitat" + label_show_completed_versions: "Mostra les versions completes" + label_me: "jo mateix" + label_board: "Tauler" + label_board_new: "Nou Tauler" + label_board_plural: "Taulers" + label_board_locked: "Bloquejat" + label_board_sticky: "Sticky" + label_topic_plural: "Temes" + label_message_plural: "Missatges" + label_message_last: "Últim missatge" + label_message_new: "Nou missatge" + label_message_posted: "Missatge afegit" + label_reply_plural: "Respostes" + label_send_information: "Envia la informació del compte a l'usuari" + label_year: "Any" + label_month: "Mes" + label_week: "Setmana" + label_date_from: "Des de" + label_date_to: "A" + label_language_based: "Basat en l'idioma de l'usuari" + label_sort_by: "Ordenar per %{value}" + label_send_test_email: "Enviar correu electrònic de prova" + label_feeds_access_key: "Clau d'accés Atom" + label_missing_feeds_access_key: "Falta una clau d'accés Atom" + label_feeds_access_key_created_on: "Clau d'accés Atom creada fa %{value}" + label_module_plural: "Mòduls" + label_added_time_by: "Afegit per %{author} fa %{age}" + label_updated_time_by: "Actualitzat per %{author} fa %{age}" + label_updated_time: "Actualitzat fa %{value}" + label_jump_to_a_project: "Anar al projecte..." + label_file_plural: "Fitxers" + label_changeset_plural: "Conjunt de canvis" + label_default_columns: "Columnes predeterminades" + label_no_change_option: (sense canvis) + label_bulk_edit_selected_issues: "Editar en bloc els assumptes seleccionats" + label_theme: "Tema" + label_default: "Predeterminat" + label_search_titles_only: "Cerca només per títol" + label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes" + label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..." + label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix" + label_registration_activation_by_email: "activació del compte per correu electrònic" + label_registration_manual_activation: "activació del compte manual" + label_registration_automatic_activation: "activació del compte automàtica" + label_display_per_page: "Per pàgina: %{value}" + label_age: "Edat" + label_change_properties: "Canvia les propietats" + label_general: "General" + label_scm: "SCM" + label_plugins: "Complements" + label_ldap_authentication: "Autenticació LDAP" + label_downloads_abbr: "Baixades" + label_optional_description: "Descripció opcional" + label_add_another_file: "Afegir un altre fitxer" + label_preferences: "Preferències" + label_chronological_order: "En ordre cronològic" + label_reverse_chronological_order: "En ordre cronològic invers" + label_incoming_emails: "Correu electrònics d'entrada" + label_generate_key: "Generar una clau" + label_issue_watchers: "Vigilàncies" + label_example: "Exemple" + label_display: "Mostrar" + label_sort: "Ordenar" + label_ascending: "Ascendent" + label_descending: "Descendent" + label_date_from_to: "Des de %{start} a %{end}" + label_wiki_content_added: "S'ha afegit la pàgina wiki" + label_wiki_content_updated: "S'ha actualitzat la pàgina wiki" + label_group: "Grup" + label_group_plural: "Grups" + label_group_new: "Nou grup" + label_time_entry_plural: "Temps invertit" + label_version_sharing_hierarchy: "Amb la jerarquia del projecte" + label_version_sharing_system: "Amb tots els projectes" + label_version_sharing_descendants: "Amb tots els subprojectes" + label_version_sharing_tree: "Amb l'arbre del projecte" + label_version_sharing_none: "Sense compartir" + label_update_issue_done_ratios: "Actualitza el tant per cent dels assumptes realitzats" + label_copy_source: "Font" + label_copy_target: "Objectiu" + label_copy_same_as_target: "El mateix que l'objectiu" + label_display_used_statuses_only: "Mostra només els estats que utilitza aquest tipus d'assumpte" + label_api_access_key: "Clau d'accés API" + label_missing_api_access_key: "Falta una clau d'accés API" + label_api_access_key_created_on: "Clau d'accés API creada fa %{value}" + label_profile: "Perfil" + label_subtask_plural: "Subtasques" + label_project_copy_notifications: "Envia notificacions de correu electrònic durant la còpia del projecte" + + button_login: "Accedir" + button_submit: "Acceptar" + button_save: "Desar" + button_check_all: "Selecciona-ho tot" + button_uncheck_all: "No seleccionar res" + button_delete: "Eliminar" + button_create: "Crear" + button_create_and_continue: "Crear i continuar" + button_test: "Provar" + button_edit: "Editar" + button_add: "Afegir" + button_change: "Canviar" + button_apply: "Aplicar" + button_clear: "Netejar" + button_lock: "Bloquejar" + button_unlock: "Desbloquejar" + button_download: "Baixar" + button_list: "Llistar" + button_view: "Visualitzar" + button_move: "Moure" + button_move_and_follow: "Moure i continuar" + button_back: "Enrere" + button_cancel: "Cancel·lar" + button_activate: "Activar" + button_sort: "Ordenar" + button_log_time: "Registre de temps" + button_rollback: "Tornar a aquesta versió" + button_watch: "Vigilar" + button_unwatch: "No vigilar" + button_reply: "Resposta" + button_archive: "Arxivar" + button_unarchive: "Desarxivar" + button_reset: "Reiniciar" + button_rename: "Reanomenar" + button_change_password: "Canviar la contrasenya" + button_copy: "Copiar" + button_copy_and_follow: "Copiar i continuar" + button_annotate: "Anotar" + button_update: "Actualitzar" + button_configure: "Configurar" + button_quote: "Citar" + button_duplicate: "Duplicar" + button_show: "Mostrar" + + status_active: "actiu" + status_registered: "registrat" + status_locked: "bloquejat" + + version_status_open: "oberta" + version_status_locked: "bloquejada" + version_status_closed: "tancada" + + field_active: "Actiu" + + text_select_mail_notifications: "Seleccionar les accions per les quals s'hauria d'enviar una notificació per correu electrònic." + text_regexp_info: "ex. ^[A-Z0-9]+$" + text_min_max_length_info: "0 significa sense restricció" + text_project_destroy_confirmation: "Segur que voleu suprimir aquest projecte i les dades relacionades?" + text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: %{value}." + text_workflow_edit: "Seleccioneu un rol i un tipus d'assumpte per a editar el flux de treball" + text_are_you_sure: "Segur?" + text_journal_changed: "%{label} ha canviat de %{old} a %{new}" + text_journal_set_to: "%{label} s'ha establert a %{value}" + text_journal_deleted: "%{label} s'ha suprimit (%{old})" + text_journal_added: "S'ha afegit %{label} %{value}" + text_tip_issue_begin_day: "tasca que s'inicia aquest dia" + text_tip_issue_end_day: "tasca que finalitza aquest dia" + text_tip_issue_begin_end_day: "tasca que s'inicia i finalitza aquest dia" + text_caracters_maximum: "%{count} caràcters com a màxim." + text_caracters_minimum: "Com a mínim ha de tenir %{count} caràcters." + text_length_between: "Longitud entre %{min} i %{max} caràcters." + text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest tipus d'assumpte" + text_unallowed_characters: "Caràcters no permesos" + text_comma_separated: "Es permeten valors múltiples (separats per una coma)." + text_line_separated: "Es permeten diversos valors (una línia per cada valor)." + text_issues_ref_in_commit_messages: "Referència i soluciona els assumptes en els missatges publicats" + text_issue_added: "L'assumpte %{id} ha sigut informat per %{author}." + text_issue_updated: "L'assumpte %{id} ha sigut actualitzat per %{author}." + text_wiki_destroy_confirmation: "Segur que voleu suprimir aquesta wiki i tot el seu contingut?" + text_issue_category_destroy_question: "Alguns assumptes (%{count}) estan assignats a aquesta categoria. Què voleu fer?" + text_issue_category_destroy_assignments: "Suprimir les assignacions de la categoria" + text_issue_category_reassign_to: "Tornar a assignar els assumptes a aquesta categoria" + text_user_mail_option: "Per als projectes no seleccionats, només rebreu notificacions sobre les coses que vigileu o que hi esteu implicat (ex. assumptes que en sou l'autor o hi esteu assignat)." + text_no_configuration_data: "Encara no s'han configurat els rols, tipus d'assumpte, estats de l'assumpte i flux de treball.\nÉs altament recomanable que carregueu la configuració predeterminada. Podreu modificar-la un cop carregada." + text_load_default_configuration: "Carregar la configuració predeterminada" + text_status_changed_by_changeset: "Aplicat en el conjunt de canvis %{value}." + text_issues_destroy_confirmation: "Segur que voleu suprimir els assumptes seleccionats?" + text_select_project_modules: "Seleccionar els mòduls a habilitar per a aquest projecte:" + text_default_administrator_account_changed: "S'ha canviat el compte d'administrador predeterminat" + text_file_repository_writable: "Es pot escriure en el repositori de fitxers" + text_plugin_assets_writable: "Es pot escriure als complements actius" + text_rmagick_available: "RMagick disponible (opcional)" + text_destroy_time_entries_question: "S'han informat %{hours} hores en els assumptes que aneu a suprimir. Què voleu fer?" + text_destroy_time_entries: "Suprimir les hores informades" + text_assign_time_entries_to_project: "Assignar les hores informades al projecte" + text_reassign_time_entries: "Tornar a assignar les hores informades a aquest assumpte:" + text_user_wrote: "%{value} va escriure:" + text_enumeration_destroy_question: "%{count} objectes estan assignats a aquest valor." + text_enumeration_category_reassign_to: "Torna a assignar-los a aquest valor:" + text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/configuration.yml i reinicieu l'aplicació per habilitar-lo." + text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al repositori.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del repositori s'assignaran automàticament." + text_diff_truncated: "... Aquestes diferències s'han truncat perquè excedeixen la mida màxima que es pot mostrar." + text_custom_field_possible_values_info: "Una línia per a cada valor" + text_wiki_page_destroy_question: "Aquesta pàgina té %{descendants} pàgines fill(es) i descendent(s). Què voleu fer?" + text_wiki_page_nullify_children: "Deixar les pàgines filles com a pàgines arrel" + text_wiki_page_destroy_children: "Suprimir les pàgines filles i tots els seus descendents" + text_wiki_page_reassign_children: "Reasignar les pàgines filles a aquesta pàgina pare" + text_own_membership_delete_confirmation: "Esteu a punt de suprimir algun o tots els vostres permisos i potser no podreu editar més aquest projecte.\nSegur que voleu continuar?" + text_zoom_in: "Reduir" + text_zoom_out: "Ampliar" + + default_role_manager: "Gestor" + default_role_developer: "Desenvolupador" + default_role_reporter: "Informador" + default_tracker_bug: "Error" + default_tracker_feature: "Característica" + default_tracker_support: "Suport" + default_issue_status_new: "Nou" + default_issue_status_in_progress: "En Progrés" + default_issue_status_resolved: "Resolt" + default_issue_status_feedback: "Comentaris" + default_issue_status_closed: "Tancat" + default_issue_status_rejected: "Rebutjat" + default_doc_category_user: "Documentació d'usuari" + default_doc_category_tech: "Documentació tècnica" + default_priority_low: "Baixa" + default_priority_normal: "Normal" + default_priority_high: "Alta" + default_priority_urgent: "Urgent" + default_priority_immediate: "Immediata" + default_activity_design: "Disseny" + default_activity_development: "Desenvolupament" + + enumeration_issue_priorities: "Prioritat dels assumptes" + enumeration_doc_categories: "Categories del document" + enumeration_activities: "Activitats (seguidor de temps)" + enumeration_system_activity: "Activitat del sistema" + + button_edit_associated_wikipage: "Editar pàgines Wiki asociades: %{page_title}" + field_text: "Camp de text" + setting_default_notification_option: "Opció de notificació per defecte" + label_user_mail_option_only_my_events: "Només pels objectes on estic en vigilància o involucrat" + label_user_mail_option_none: "Sense notificacions" + field_member_of_group: "Assignat al grup" + field_assigned_to_role: "Assignat al rol" + notice_not_authorized_archived_project: "El projecte al que intenta accedir està arxivat." + label_principal_search: "Cercar per usuari o grup:" + label_user_search: "Cercar per usuari:" + field_visible: "Visible" + setting_commit_logtime_activity_id: "Activitat dels temps registrats" + text_time_logged_by_changeset: "Aplicat en el canvi %{value}." + setting_commit_logtime_enabled: "Habilitar registre d'hores" + notice_gantt_chart_truncated: "S'ha retallat el diagrama perquè excedeix del número màxim d'elements que es poden mostrar (%{max})" + setting_gantt_items_limit: "Numero màxim d'elements mostrats dins del diagrama de Gantt" + field_warn_on_leaving_unsaved: "Avisa'm quan surti d'una pàgina sense desar els canvis" + text_warn_on_leaving_unsaved: "Aquesta pàgina conté text sense desar i si surt els seus canvis es perdran" + label_my_queries: "Les meves consultes" + text_journal_changed_no_detail: "S'ha actualitzat %{label}" + label_news_comment_added: "S'ha afegit un comentari a la notícia" + button_expand_all: "Expandir tot" + button_collapse_all: "Col·lapsar tot" + label_additional_workflow_transitions_for_assignee: "Operacions addicionals permeses quan l'usuari té assignat l'assumpte" + label_additional_workflow_transitions_for_author: "Operacions addicionals permeses quan l'usuari és propietari de l'assumpte" + label_bulk_edit_selected_time_entries: "Editar en bloc els registres de temps seleccionats" + text_time_entries_destroy_confirmation: "Està segur de voler eliminar (l'hora seleccionada/les hores seleccionades)?" + label_role_anonymous: "Anònim" + label_role_non_member: "No membre" + label_issue_note_added: "Nota afegida" + label_issue_status_updated: "Estat actualitzat" + label_issue_priority_updated: "Prioritat actualitzada" + label_issues_visibility_own: "Peticions creades per l'usuari o assignades a ell" + field_issues_visibility: "Visibilitat de les peticions" + label_issues_visibility_all: "Totes les peticions" + permission_set_own_issues_private: "Posar les teves peticions pròpies com publica o privada" + field_is_private: "Privat" + permission_set_issues_private: "Posar les peticions com publica o privada" + label_issues_visibility_public: "Totes les peticions no privades" + text_issues_destroy_descendants_confirmation: "Es procedira a eliminar tambe %{count} subtas/ca/ques." + field_commit_logs_encoding: "Codificació dels missatges publicats" + field_scm_path_encoding: "Codificació de les rutes" + text_scm_path_encoding_note: "Per defecte: UTF-8" + field_path_to_repository: "Ruta al repositori " + field_root_directory: "Directori arrel" + field_cvs_module: "Modul" + field_cvsroot: "CVSROOT" + text_mercurial_repository_note: Repositori local (p.e. /hgrepo, c:\hgrepo) + text_scm_command: "Comanda" + text_scm_command_version: "Versió" + label_git_report_last_commit: "Informar de l'ultim canvi(commit) per fitxers i directoris" + notice_issue_successful_create: "Assumpte %{id} creat correctament." + label_between: "entre" + setting_issue_group_assignment: "Permetre assignar assumptes als grups" + label_diff: "diferencies" + text_git_repository_note: Directori repositori local (p.e. /hgrepo, c:\hgrepo) + description_query_sort_criteria_direction: "Ordre d'ordenació" + description_project_scope: "Àmbit de la cerca" + description_filter: "Filtre" + description_user_mail_notification: "Configuració de les notificacions per correu" + description_message_content: "Contingut del missatge" + description_available_columns: "Columnes disponibles" + description_issue_category_reassign: "Escollir una categoria de l'assumpte" + description_search: "Camp de cerca" + description_notes: "Notes" + description_choose_project: "Projectes" + description_query_sort_criteria_attribute: "Atribut d'ordenació" + description_wiki_subpages_reassign: "Esculli la nova pàgina pare" + description_selected_columns: "Columnes seleccionades" + label_parent_revision: "Pare" + label_child_revision: "Fill" + error_scm_annotate_big_text_file: "L'entrada no es pot anotar, ja que supera la mida màxima per fitxers de text." + setting_default_issue_start_date_to_creation_date: "Utilitzar la data actual com a data inici per les noves peticions" + button_edit_section: "Editar aquest apartat" + setting_repositories_encodings: "Codificació per defecte pels fitxers adjunts i repositoris" + description_all_columns: "Totes les columnes" + button_export: "Exportar" + label_export_options: "%{export_format} opcions d'exportació" + error_attachment_too_big: "Aquest fitxer no es pot pujar perquè excedeix de la mida màxima (%{max_size})" + notice_failed_to_save_time_entries: "Error al desar %{count} entrades de temps de les %{total} selecionades: %{ids}." + label_x_issues: + zero: "0 assumpte" + one: "1 assumpte" + other: "%{count} assumptes" + label_repository_new: "Nou repositori" + field_repository_is_default: "Repositori principal" + label_copy_attachments: "Copiar adjunts" + label_item_position: "%{position}/%{count}" + label_completed_versions: "Versions completades" + text_project_identifier_info: "Només es permeten lletres en minúscula (a-z), números i guions.
    Una vegada desat, l'identificador no es pot canviar." + field_multiple: "Valors múltiples" + setting_commit_cross_project_ref: "Permetre referenciar i resoldre peticions de tots els altres projectes" + text_issue_conflict_resolution_add_notes: "Afegir les meves notes i descartar els altres canvis" + text_issue_conflict_resolution_overwrite: "Aplicar els meus canvis de totes formes (les notes anteriors es mantindran però alguns canvis poden ser sobreescrits)" + notice_issue_update_conflict: "L'assumpte ha sigut actualitzat per un altre membre mentre s'editava" + text_issue_conflict_resolution_cancel: "Descartar tots els meus canvis i mostrar de nou %{link}" + permission_manage_related_issues: "Gestionar peticions relacionades" + field_auth_source_ldap_filter: "Filtre LDAP" + label_search_for_watchers: "Cercar seguidors per afegir-los" + notice_account_deleted: "El seu compte ha sigut eliminat de forma permanent." + setting_unsubscribe: "Permetre als usuaris d'esborrar el seu propi compte" + button_delete_my_account: "Eliminar el meu compte" + text_account_destroy_confirmation: |- + Estàs segur de continuar? + El seu compte s'eliminarà de forma permanent, sense la possibilitat de reactivar-lo. + error_session_expired: "La seva sessió ha expirat. Si us plau, torni a identificar-se" + text_session_expiration_settings: "Advertència: el canvi d'aquestes opcions poden provocar la expiració de les sessions actives, incloent la seva." + setting_session_lifetime: "Temps de vida màxim de les sessions" + setting_session_timeout: "Temps màxim d'inactivitat de les sessions" + label_session_expiration: "Expiració de les sessions" + permission_close_project: "Tancar / reobrir el projecte" + label_show_closed_projects: "Veure projectes tancats" + button_close: "Tancar" + button_reopen: "Reobrir" + project_status_active: "actiu" + project_status_closed: "tancat" + project_status_archived: "arxivat" + text_project_closed: "Aquest projecte està tancat i només és de lectura." + notice_user_successful_create: "Usuari %{id} creat correctament." + field_core_fields: "Camps bàsics" + field_timeout: "Temps d'inactivitat (en segons)" + setting_thumbnails_enabled: "Mostrar miniatures dels fitxers adjunts" + setting_thumbnails_size: "Mida de les miniatures (en píxels)" + label_status_transitions: "Transicions d'estat" + label_fields_permissions: "Permisos sobre els camps" + label_readonly: "Només lectura" + label_required: "Requerit" + text_repository_identifier_info: "Només es permeten lletres en minúscula (a-z), números i guions.
    Una vegada desat, l'identificador no es pot canviar." + field_board_parent: "Tauler pare" + label_attribute_of_project: "%{name} del projecte" + label_attribute_of_author: "%{name} de l'autor" + label_attribute_of_assigned_to: "{name} de l'assignat" + label_attribute_of_fixed_version: "%{name} de la versió objectiu" + label_copy_subtasks: "Copiar subtasques" + label_copied_to: "copiada a" + label_copied_from: "copiada des de" + label_any_issues_in_project: "qualsevol assumpte del projecte" + label_any_issues_not_in_project: "qualsevol assumpte que no sigui del projecte" + field_private_notes: "Notes privades" + permission_view_private_notes: "Veure notes privades" + permission_set_notes_private: "Posar notes com privades" + label_no_issues_in_project: "sense peticions al projecte" + label_any: "tots" + label_last_n_weeks: "en les darreres %{count} setmanes" + setting_cross_project_subtasks: "Permetre subtasques creuades entre projectes" + label_cross_project_descendants: "Amb tots els subprojectes" + label_cross_project_tree: "Amb l'arbre del projecte" + label_cross_project_hierarchy: "Amb la jerarquia del projecte" + label_cross_project_system: "Amb tots els projectes" + button_hide: "Amagar" + setting_non_working_week_days: "Dies no laborables" + label_in_the_next_days: "en els pròxims" + label_in_the_past_days: "en els anteriors" + label_attribute_of_user: "%{name} de l'usuari" + text_turning_multiple_off: "Si es desactiva els valors múltiples, aquest seran eliminats per deixar només un únic valor per element." + label_attribute_of_issue: "%{name} de l'assumpte" + permission_add_documents: "Afegir document" + permission_edit_documents: "Editar document" + permission_delete_documents: "Eliminar document" + label_gantt_progress_line: "Línia de progres" + setting_jsonp_enabled: "Habilitar suport JSONP" + field_inherit_members: "Heretar membres" + field_closed_on: "Tancada" + field_generate_password: "Generar contrasenya" + setting_default_projects_tracker_ids: "Tipus d'estats d'assumpte habilitat per defecte" + label_total_time: "Total" + text_scm_config: "Pot configurar les ordres SCM en el fitxer config/configuration.yml. Sis us plau, una vegada fet ha de reiniciar l'aplicació per aplicar els canvis." + text_scm_command_not_available: "L'ordre SCM que es vol utilitzar no és troba disponible. Si us plau, comprovi la configuració dins del menú d'administració" + setting_emails_header: "Encapçalament dels correus" + notice_account_not_activated_yet: Encara no ha activat el seu compte. Si vol rebre un nou correu d'activació, si us plau faci clic en aquest enllaç. + notice_account_locked: "Aquest compte està bloquejat." + label_hidden: "Amagada" + label_visibility_private: "només per mi" + label_visibility_roles: "només per aquests rols" + label_visibility_public: "per qualsevol usuari" + field_must_change_passwd: "Canvi de contrasenya al pròxim inici de sessió" + notice_new_password_must_be_different: "La nova contrasenya ha de ser diferent de l'actual." + setting_mail_handler_excluded_filenames: "Excloure fitxers adjunts per nom" + text_convert_available: "Conversió ImageMagick disponible (opcional)" + label_link: "Enllaç" + label_only: "només" + label_drop_down_list: "Llista desplegable (Drop down)" + label_checkboxes: "Camps de selecció (Checkboxes)" + label_link_values_to: "Enllaçar valors a la URL" + setting_force_default_language_for_anonymous: "Forçar llenguatge per defecte als usuaris anònims." + setting_force_default_language_for_loggedin: "Forçar llenguatge per defecte als usuaris identificats." + label_custom_field_select_type: "Seleccioni el tipus d'objecte al qual vol posar el camp personalitzat" + label_issue_assigned_to_updated: "Persona assignada actualitzada" + label_check_for_updates: "Comprovar actualitzacions" + label_latest_compatible_version: "Ultima versió compatible" + label_unknown_plugin: "Complement desconegut" + label_radio_buttons: "Camps de selecció (Radiobutton)" + label_group_anonymous: "Usuaris anònims" + label_group_non_member: "Usuaris no membres" + label_add_projects: "Afegir projectes" + field_default_status: "Estat per defecte" + text_subversion_repository_note: "Exemples: file:///, http://, https://, svn://, svn+[tunnelscheme]://" + field_users_visibility: "Visibilitat dels usuaris" + label_users_visibility_all: "Tots els usuaris actius" + label_users_visibility_members_of_visible_projects: "Membres dels projectes visibles" + label_edit_attachments: "Editar fitxers adjunts" + setting_link_copied_issue: "Enllaçar assumpte quan es realitzi la còpia" + label_link_copied_issue: "Enllaçar assumpte copiat" + label_ask: "Demanar" + label_search_attachments_yes: "Cercar per fitxer adjunt i descripció" + label_search_attachments_no: "Sense fitxers adjunts" + label_search_attachments_only: "Només fitxers adjunts" + label_search_open_issues_only: "Només peticions obertes" + field_address: "Correu electrònic" + setting_max_additional_emails: "Màxim número de correus electrònics addicionals" + label_email_address_plural: "Correus electrònics" + label_email_address_add: "Afegir adreça de correu electrònic" + label_enable_notifications: "Activar notificacions" + label_disable_notifications: "Desactivar notificacions" + setting_search_results_per_page: "Cercar resultats per pàgina" + label_blank_value: "blanc" + permission_copy_issues: "Copiar assumpte" + error_password_expired: "La teva contrasenya ha expirat, és necessari canviar-la" + field_time_entries_visibility: "Visibilitat de les entrades de temps" + setting_password_max_age: "Requereix canviar la contrasenya després de" + label_parent_task_attributes: "Atributs de la tasca pare" + label_parent_task_attributes_derived: "Calculat de les subtasques" + label_parent_task_attributes_independent: "Independent de les subtasques" + label_time_entries_visibility_all: "Tots els registres de temps" + label_time_entries_visibility_own: "Els registres de temps creats per mi" + label_member_management: "Administració de membres" + label_member_management_all_roles: "Tots els rols" + label_member_management_selected_roles_only: "Només aquests rols" + label_password_required: "Confirmi la seva contrasenya per continuar" + label_total_spent_time: "Temps total invertit" + notice_import_finished: "%{count} element/s han sigut importats" + notice_import_finished_with_errors: "%{count} de %{total} elements no s'ha pogut importar" + error_invalid_file_encoding: "El fitxer no utilitza una codificació valida (%{encoding})" + error_invalid_csv_file_or_settings: "El fitxer no es un CSV o no coincideix amb la configuració" + error_can_not_read_import_file: "S'ha produït un error mentre es llegia el fitxer a importar" + permission_import_issues: "Importar assumptes" + label_import_issues: "Importar assumptes" + label_select_file_to_import: "Escull el fitxer per importar" + label_fields_separator: "Separador dels camps" + label_fields_wrapper: "Envoltori dels camps" + label_encoding: "Codificació" + label_comma_char: "Coma" + label_semi_colon_char: "Punt i coma" + label_quote_char: "Comilla simple" + label_double_quote_char: "Comilla doble" + label_fields_mapping: "Mapat de camps" + label_file_content_preview: "Vista prèvia del contingut" + label_create_missing_values: "Crear valors no presents" + button_import: "Importar" + field_total_estimated_hours: "Temps total estimat" + label_api: "API" + label_total_plural: "Totals" + label_assigned_issues: "Assumptes assignats" + label_field_format_enumeration: "Llistat clau/valor" + label_f_hour_short: "%{value} h" + field_default_version: "Versió per defecte" + error_attachment_extension_not_allowed: "L'extensió %{extension} no està permesa" + setting_attachment_extensions_allowed: "Extensions permeses" + setting_attachment_extensions_denied: "Extensions no permeses" + label_any_open_issues: "qualsevol assumpte obert" + label_no_open_issues: "cap assumpte obert" + label_default_values_for_new_users: "Valors per defecte pels nous usuaris" + setting_sys_api_key: "Clau API" + setting_lost_password: "Has oblidat la contrasenya?" + mail_subject_security_notification: "Notificació de seguretat" + mail_body_security_notification_change: ! '%{field} actualitzat.' + mail_body_security_notification_change_to: ! '%{field} actualitzat per %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} afegit.' + mail_body_security_notification_remove: ! '%{field} %{value} eliminat.' + mail_body_security_notification_notify_enabled: "S'han activat les notificacions per l'adreça de correu %{value}" + mail_body_security_notification_notify_disabled: "S'han desactivat les notificacions per l'adreça de correu %{value}" + mail_body_settings_updated: ! "Les següents opcions s'han actualitzat:" + field_remote_ip: Adreça IP + label_wiki_page_new: Nova pàgina wiki + label_relations: Relacions + button_filter: Filtre + mail_body_password_updated: "La seva contrasenya s'ha canviat." + label_no_preview: Previsualització no disponible + error_no_tracker_allowed_for_new_issue_in_project: "El projecte no disposa de cap tipus d'assumpte sobre el qual vostè pugui crear un assumpte" + label_tracker_all: "Tots els tipus d'assumpte" + label_new_project_issue_tab_enabled: Mostrar la pestanya "Nou assumpte" + setting_new_item_menu_tab: Pestanya de nous objectes en el menu de cada projecte + label_new_object_tab_enabled: Mostrar el llistat desplegable "+" + error_no_projects_with_tracker_allowed_for_new_issue: "Cap projecte disposa d'un tipus d'assumpte sobre el qual vostè pugui crear un assumpte" + field_textarea_font: Font utilitzada en les text àrea + label_font_default: Font per defecte + label_font_monospace: Font Monospaced + label_font_proportional: Font Proportional + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/cs.yml b/config/locales/cs.yml new file mode 100644 index 0000000..819b958 --- /dev/null +++ b/config/locales/cs.yml @@ -0,0 +1,1229 @@ +# Update to 2.2, 2.4, 2.5, 2.6, 3.1, 3.3,.. by Karel Picman +# Update to 1.1 by Michal Gebauer +# Updated by Josef Liška +# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz +# Based on original CZ translation by Jan Kadleček +cs: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Neděle, Pondělí, Úterý, Středa, Čtvrtek, Pátek, Sobota] + abbr_day_names: [Ne, Po, Út, St, Čt, Pá, So] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Leden, Únor, Březen, Duben, Květen, Červen, Červenec, Srpen, Září, Říjen, Listopad, Prosinec] + abbr_month_names: [~, Led, Úno, Bře, Dub, Kvě, Čer, Čec, Srp, Zář, Říj, Lis, Pro] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "dop." + pm: "odp." + + datetime: + distance_in_words: + half_a_minute: "půl minuty" + less_than_x_seconds: + one: "méně než sekunda" + other: "méně než %{count} sekund" + x_seconds: + one: "1 sekunda" + other: "%{count} sekund" + less_than_x_minutes: + one: "méně než minuta" + other: "méně než %{count} minut" + x_minutes: + one: "1 minuta" + other: "%{count} minut" + about_x_hours: + one: "asi 1 hodina" + other: "asi %{count} hodin" + x_hours: + one: "1 hodina" + other: "%{count} hodin" + x_days: + one: "1 den" + other: "%{count} dnů" + about_x_months: + one: "asi 1 měsíc" + other: "asi %{count} měsíců" + x_months: + one: "1 měsíc" + other: "%{count} měsíců" + about_x_years: + one: "asi 1 rok" + other: "asi %{count} let" + over_x_years: + one: "více než 1 rok" + other: "více než %{count} roky" + almost_x_years: + one: "témeř 1 rok" + other: "téměř %{count} roky" + + number: + # Výchozí formát pro čísla + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Bajt" + other: "Bajtů" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "a" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 chyba zabránila uložení %{model}" + other: "%{count} chyb zabránilo uložení %{model}" + messages: + inclusion: "není zahrnuto v seznamu" + exclusion: "je rezervováno" + invalid: "je neplatné" + confirmation: "se neshoduje s potvrzením" + accepted: "musí být akceptováno" + empty: "nemůže být prázdný" + blank: "nemůže být prázdný" + too_long: "je příliš dlouhý" + too_short: "je příliš krátký" + wrong_length: "má chybnou délku" + taken: "je již použito" + not_a_number: "není číslo" + not_a_date: "není platné datum" + greater_than: "musí být větší než %{count}" + greater_than_or_equal_to: "musí být větší nebo rovno %{count}" + equal_to: "musí být přesně %{count}" + less_than: "musí být méně než %{count}" + less_than_or_equal_to: "musí být méně nebo rovno %{count}" + odd: "musí být liché" + even: "musí být sudé" + greater_than_start_date: "musí být větší než počáteční datum" + not_same_project: "nepatří stejnému projektu" + circular_dependency: "Tento vztah by vytvořil cyklickou závislost" + cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů" + earlier_than_minimum_start_date: "nemůže být dříve než %{date} kvůli předřazeným úkolům" + not_a_regexp: "není platný regulární výraz" + open_issue_with_closed_parent: "Otevřený úkol nemůže být přiřazen pod uzavřený rodičovský úkol" + + actionview_instancetag_blank_option: Prosím vyberte + + general_text_No: 'Ne' + general_text_Yes: 'Ano' + general_text_no: 'ne' + general_text_yes: 'ano' + general_lang_name: 'Czech (Čeština)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Účet byl úspěšně změněn. + notice_account_invalid_credentials: Chybné jméno nebo heslo + notice_account_password_updated: Heslo bylo úspěšně změněno. + notice_account_wrong_password: Chybné heslo + notice_account_register_done: Účet byl úspěšně vytvořen. Pro aktivaci účtu klikněte na odkaz v emailu, který vám byl zaslán. + notice_account_unknown_email: Neznámý uživatel. + notice_can_t_change_password: Tento účet používá externí autentifikaci. Zde heslo změnit nemůžete. + notice_account_lost_email_sent: Byl vám zaslán email s intrukcemi jak si nastavíte nové heslo. + notice_account_activated: Váš účet byl aktivován. Nyní se můžete přihlásit. + notice_successful_create: Úspěšně vytvořeno. + notice_successful_update: Úspěšně aktualizováno. + notice_successful_delete: Úspěšně odstraněno. + notice_successful_connection: Úspěšné připojení. + notice_file_not_found: Stránka, kterou se snažíte zobrazit, neexistuje nebo byla smazána. + notice_locking_conflict: Údaje byly změněny jiným uživatelem. + notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky. + notice_not_authorized_archived_project: Projekt, ke kterému se snažíte přistupovat, byl archivován. + notice_email_sent: "Na adresu %{value} byl odeslán email" + notice_email_error: "Při odesílání emailu nastala chyba (%{value})" + notice_feeds_access_key_reseted: Váš klíč pro přístup k Atom byl resetován. + notice_api_access_key_reseted: Váš API přístupový klíč byl resetován. + notice_failed_to_save_issues: "Chyba při uložení %{count} úkolu(ů) z %{total} vybraných: %{ids}." + notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}." + notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat" + notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem." + notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána. + notice_unable_delete_version: Nemohu odstanit verzi + notice_unable_delete_time_entry: Nelze smazat záznam času. + notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány. + notice_gantt_chart_truncated: Graf byl oříznut, počet položek přesáhl limit pro zobrazení (%{max}) + + error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: %{value}" + error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři." + error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: %{value}" + error_scm_annotate: "Položka neexistuje nebo nemůže být komentována." + error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu' + error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu. + error_no_default_issue_status: Není nastaven výchozí stav úkolů. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů"). + error_can_not_delete_custom_field: Nelze smazat volitelné pole + error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazána. + error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat. + error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen + error_can_not_archive_project: Tento projekt nemůže být archivován + error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován. + error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roli + error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roli(e) + error_unable_delete_issue_status: Nelze smazat stavy úkolů + error_unable_to_connect: Nelze se připojit (%{value}) + warning_attachments_not_saved: "%{count} soubor(ů) nebylo možné uložit." + + mail_subject_lost_password: "Vaše heslo (%{value})" + mail_body_lost_password: 'Pro změnu vašeho hesla klikněte na následující odkaz:' + mail_subject_register: "Aktivace účtu (%{value})" + mail_body_register: 'Pro aktivaci vašeho účtu klikněte na následující odkaz:' + mail_body_account_information_external: "Pomocí vašeho účtu %{value} se můžete přihlásit." + mail_body_account_information: Informace o vašem účtu + mail_subject_account_activation_request: "Aktivace %{value} účtu" + mail_body_account_activation_request: "Byl zaregistrován nový uživatel %{value}. Aktivace jeho účtu závisí na vašem potvrzení." + mail_subject_reminder: "%{count} úkol(ů) má termín během několik dní (%{days})" + mail_body_reminder: "%{count} úkol(ů), které máte přiřazeny má termín během několika dní (%{days}):" + mail_subject_wiki_content_added: "'%{id}' Wiki stránka byla přidána" + mail_body_wiki_content_added: "'%{id}' Wiki stránka byla přidána od %{author}." + mail_subject_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována" + mail_body_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována od %{author}." + + + field_name: Název + field_description: Popis + field_summary: Přehled + field_is_required: Povinné pole + field_firstname: Jméno + field_lastname: Příjmení + field_mail: Email + field_filename: Soubor + field_filesize: Velikost + field_downloads: Staženo + field_author: Autor + field_created_on: Vytvořeno + field_updated_on: Aktualizováno + field_field_format: Formát + field_is_for_all: Pro všechny projekty + field_possible_values: Možné hodnoty + field_regexp: Regulární výraz + field_min_length: Minimální délka + field_max_length: Maximální délka + field_value: Hodnota + field_category: Kategorie + field_title: Název + field_project: Projekt + field_issue: Úkol + field_status: Stav + field_notes: Poznámka + field_is_closed: Úkol uzavřen + field_is_default: Výchozí stav + field_tracker: Fronta + field_subject: Předmět + field_due_date: Uzavřít do + field_assigned_to: Přiřazeno + field_priority: Priorita + field_fixed_version: Cílová verze + field_user: Uživatel + field_principal: Hlavní + field_role: Role + field_homepage: Domovská stránka + field_is_public: Veřejný + field_parent: Nadřazený projekt + field_is_in_roadmap: Úkoly zobrazené v plánu + field_login: Přihlášení + field_mail_notification: Emailová oznámení + field_admin: Administrátor + field_last_login_on: Poslední přihlášení + field_language: Jazyk + field_effective_date: Datum + field_password: Heslo + field_new_password: Nové heslo + field_password_confirmation: Potvrzení + field_version: Verze + field_type: Typ + field_host: Host + field_port: Port + field_account: Účet + field_base_dn: Base DN + field_attr_login: Přihlášení (atribut) + field_attr_firstname: Jméno (atribut) + field_attr_lastname: Příjemní (atribut) + field_attr_mail: Email (atribut) + field_onthefly: Automatické vytváření uživatelů + field_start_date: Začátek + field_done_ratio: "% Hotovo" + field_auth_source: Autentifikační mód + field_hide_mail: Nezobrazovat můj email + field_comments: Komentář + field_url: URL + field_start_page: Výchozí stránka + field_subproject: Podprojekt + field_hours: Hodiny + field_activity: Aktivita + field_spent_on: Datum + field_identifier: Identifikátor + field_is_filter: Použít jako filtr + field_issue_to: Související úkol + field_delay: Zpoždění + field_assignable: Úkoly mohou být přiřazeny této roli + field_redirect_existing_links: Přesměrovat stávající odkazy + field_estimated_hours: Odhadovaná doba + field_column_names: Sloupce + field_time_entries: Zaznamenaný čas + field_time_zone: Časové pásmo + field_searchable: Umožnit vyhledávání + field_default_value: Výchozí hodnota + field_comments_sorting: Zobrazit komentáře + field_parent_title: Rodičovská stránka + field_editable: Editovatelný + field_watcher: Sleduje + field_identity_url: OpenID URL + field_content: Obsah + field_group_by: Seskupovat výsledky podle + field_sharing: Sdílení + field_parent_issue: Rodičovský úkol + field_member_of_group: Skupina přiřaditele + field_assigned_to_role: Role přiřaditele + field_text: Textové pole + field_visible: Viditelný + + setting_app_title: Název aplikace + setting_app_subtitle: Podtitulek aplikace + setting_welcome_text: Uvítací text + setting_default_language: Výchozí jazyk + setting_login_required: Autentifikace vyžadována + setting_self_registration: Povolena automatická registrace + setting_attachment_max_size: Maximální velikost přílohy + setting_issues_export_limit: Limit pro export úkolů + setting_mail_from: Odesílat emaily z adresy + setting_bcc_recipients: Příjemci jako skrytá kopie (bcc) + setting_plain_text_mail: pouze prostý text (ne HTML) + setting_host_name: Jméno serveru + setting_text_formatting: Formátování textu + setting_wiki_compression: Komprese historie Wiki + setting_feeds_limit: Limit obsahu příspěvků + setting_default_projects_public: Nové projekty nastavovat jako veřejné + setting_autofetch_changesets: Automaticky stahovat commity + setting_sys_api_enabled: Povolit WS pro správu repozitory + setting_commit_ref_keywords: Klíčová slova pro odkazy + setting_commit_fix_keywords: Klíčová slova pro uzavření + setting_autologin: Automatické přihlašování + setting_date_format: Formát data + setting_time_format: Formát času + setting_cross_project_issue_relations: Povolit vazby úkolů napříč projekty + setting_issue_list_default_columns: Výchozí sloupce zobrazené v seznamu úkolů + setting_emails_header: Záhlaví emailů + setting_emails_footer: Zápatí emailů + setting_protocol: Protokol + setting_per_page_options: Povolené počty řádků na stránce + setting_user_format: Formát zobrazení uživatele + setting_activity_days_default: Dny zobrazené v činnosti projektu + setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu + setting_enabled_scm: Povolené SCM + setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků + setting_mail_handler_api_enabled: Povolit WS pro příchozí e-maily + setting_mail_handler_api_key: API klíč + setting_sequential_project_identifiers: Generovat sekvenční identifikátory projektů + setting_gravatar_enabled: Použít uživatelské ikony Gravatar + setting_gravatar_default: Výchozí Gravatar + setting_diff_max_lines_displayed: Maximální počet zobrazených řádků rozdílu + setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce + setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru + setting_openid: Umožnit přihlašování a registrace s OpenID + setting_password_min_length: Minimální délka hesla + setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil + setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt + setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s + setting_issue_done_ratio_issue_field: Použít pole úkolu + setting_issue_done_ratio_issue_status: Použít stav úkolu + setting_start_of_week: Začínat kalendáře + setting_rest_api_enabled: Zapnout službu REST + setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti + setting_default_notification_option: Výchozí nastavení oznámení + setting_commit_logtime_enabled: Povolit zapisování času + setting_commit_logtime_activity_id: Aktivita pro zapsaný čas + setting_gantt_items_limit: Maximální počet položek zobrazený na ganttově diagramu + + permission_add_project: Vytvořit projekt + permission_add_subprojects: Vytvořit podprojekty + permission_edit_project: Úprava projektů + permission_select_project_modules: Výběr modulů projektu + permission_manage_members: Spravování členství + permission_manage_project_activities: Spravovat aktivity projektu + permission_manage_versions: Spravování verzí + permission_manage_categories: Spravování kategorií úkolů + permission_view_issues: Zobrazit úkoly + permission_add_issues: Přidávání úkolů + permission_edit_issues: Upravování úkolů + permission_manage_issue_relations: Spravování vztahů mezi úkoly + permission_add_issue_notes: Přidávání poznámek + permission_edit_issue_notes: Upravování poznámek + permission_edit_own_issue_notes: Upravování vlastních poznámek + permission_move_issues: Přesouvání úkolů + permission_delete_issues: Mazání úkolů + permission_manage_public_queries: Správa veřejných dotazů + permission_save_queries: Ukládání dotazů + permission_view_gantt: Zobrazení ganttova diagramu + permission_view_calendar: Prohlížení kalendáře + permission_view_issue_watchers: Zobrazení seznamu sledujících uživatelů + permission_add_issue_watchers: Přidání sledujících uživatelů + permission_delete_issue_watchers: Smazat sledující uživatele + permission_log_time: Zaznamenávání stráveného času + permission_view_time_entries: Zobrazení stráveného času + permission_edit_time_entries: Upravování záznamů o stráveném času + permission_edit_own_time_entries: Upravování vlastních zázamů o stráveném čase + permission_manage_news: Spravování novinek + permission_comment_news: Komentování novinek + permission_view_documents: Prohlížení dokumentů + permission_manage_files: Spravování souborů + permission_view_files: Prohlížení souborů + permission_manage_wiki: Spravování Wiki + permission_rename_wiki_pages: Přejmenovávání Wiki stránek + permission_delete_wiki_pages: Mazání stránek na Wiki + permission_view_wiki_pages: Prohlížení Wiki + permission_view_wiki_edits: Prohlížení historie Wiki + permission_edit_wiki_pages: Upravování stránek Wiki + permission_delete_wiki_pages_attachments: Mazání příloh + permission_protect_wiki_pages: Zabezpečení Wiki stránek + permission_manage_repository: Spravování repozitáře + permission_browse_repository: Procházení repozitáře + permission_view_changesets: Zobrazování revizí + permission_commit_access: Commit přístup + permission_manage_boards: Správa diskusních fór + permission_view_messages: Prohlížení příspěvků + permission_add_messages: Posílání příspěvků + permission_edit_messages: Upravování příspěvků + permission_edit_own_messages: Upravit vlastní příspěvky + permission_delete_messages: Mazání příspěvků + permission_delete_own_messages: Smazat vlastní příspěvky + permission_export_wiki_pages: Exportovat Wiki stránky + permission_manage_subtasks: Spravovat dílčí úkoly + + project_module_issue_tracking: Sledování úkolů + project_module_time_tracking: Sledování času + project_module_news: Novinky + project_module_documents: Dokumenty + project_module_files: Soubory + project_module_wiki: Wiki + project_module_repository: Repozitář + project_module_boards: Diskuse + project_module_calendar: Kalendář + project_module_gantt: Gantt + + label_user: Uživatel + label_user_plural: Uživatelé + label_user_new: Nový uživatel + label_user_anonymous: Anonymní + label_project: Projekt + label_project_new: Nový projekt + label_project_plural: Projekty + label_x_projects: + zero: žádné projekty + one: 1 projekt + other: "%{count} projekty(ů)" + label_project_all: Všechny projekty + label_project_latest: Poslední projekty + label_issue: Úkol + label_issue_new: Nový úkol + label_issue_plural: Úkoly + label_issue_view_all: Všechny úkoly + label_issues_by: "Úkoly podle %{value}" + label_issue_added: Úkol přidán + label_issue_updated: Úkol aktualizován + label_document: Dokument + label_document_new: Nový dokument + label_document_plural: Dokumenty + label_document_added: Dokument přidán + label_role: Role + label_role_plural: Role + label_role_new: Nová role + label_role_and_permissions: Role a práva + label_member: Člen + label_member_new: Nový člen + label_member_plural: Členové + label_tracker: Fronta + label_tracker_plural: Fronty + label_tracker_new: Nová fronta + label_workflow: Průběh práce + label_issue_status: Stav úkolu + label_issue_status_plural: Stavy úkolů + label_issue_status_new: Nový stav + label_issue_category: Kategorie úkolu + label_issue_category_plural: Kategorie úkolů + label_issue_category_new: Nová kategorie + label_custom_field: Uživatelské pole + label_custom_field_plural: Uživatelská pole + label_custom_field_new: Nové uživatelské pole + label_enumerations: Seznamy + label_enumeration_new: Nová hodnota + label_information: Informace + label_information_plural: Informace + label_please_login: Přihlašte se, prosím + label_register: Registrovat + label_login_with_open_id_option: nebo se přihlašte s OpenID + label_password_lost: Zapomenuté heslo + label_home: Úvodní + label_my_page: Moje stránka + label_my_account: Můj účet + label_my_projects: Moje projekty + label_administration: Administrace + label_login: Přihlášení + label_logout: Odhlášení + label_help: Nápověda + label_reported_issues: Nahlášené úkoly + label_assigned_to_me_issues: Mé úkoly + label_last_login: Poslední přihlášení + label_registered_on: Registrován + label_activity: Aktivita + label_overall_activity: Celková aktivita + label_user_activity: "Aktivita uživatele: %{value}" + label_new: Nový + label_logged_as: Přihlášen jako + label_environment: Prostředí + label_authentication: Autentifikace + label_auth_source: Mód autentifikace + label_auth_source_new: Nový mód autentifikace + label_auth_source_plural: Módy autentifikace + label_subproject_plural: Podprojekty + label_subproject_new: Nový podprojekt + label_and_its_subprojects: "%{value} a jeho podprojekty" + label_min_max_length: Min - Max délka + label_list: Seznam + label_date: Datum + label_integer: Celé číslo + label_float: Desetinné číslo + label_boolean: Ano/Ne + label_string: Text + label_text: Dlouhý text + label_attribute: Atribut + label_attribute_plural: Atributy + label_no_data: Žádné položky + label_change_status: Změnit stav + label_history: Historie + label_attachment: Soubor + label_attachment_new: Nový soubor + label_attachment_delete: Odstranit soubor + label_attachment_plural: Soubory + label_file_added: Soubor přidán + label_report: Přehled + label_report_plural: Přehledy + label_news: Novinky + label_news_new: Přidat novinku + label_news_plural: Novinky + label_news_latest: Poslední novinky + label_news_view_all: Zobrazit všechny novinky + label_news_added: Novinka přidána + label_settings: Nastavení + label_overview: Přehled + label_version: Verze + label_version_new: Nová verze + label_version_plural: Verze + label_close_versions: Zavřít dokončené verze + label_confirmation: Potvrzení + label_export_to: 'Také k dispozici:' + label_read: Načítá se... + label_public_projects: Veřejné projekty + label_open_issues: otevřený + label_open_issues_plural: otevřené + label_closed_issues: uzavřený + label_closed_issues_plural: uzavřené + label_x_open_issues_abbr: + zero: 0 otevřených + one: 1 otevřený + other: "%{count} otevřených" + label_x_closed_issues_abbr: + zero: 0 uzavřených + one: 1 uzavřený + other: "%{count} uzavřených" + label_total: Celkem + label_permissions: Práva + label_current_status: Aktuální stav + label_new_statuses_allowed: Nové povolené stavy + label_all: vše + label_none: nic + label_nobody: nikdo + label_next: Další + label_previous: Předchozí + label_used_by: Použito + label_details: Detaily + label_add_note: Přidat poznámku + label_calendar: Kalendář + label_months_from: měsíců od + label_gantt: Ganttův diagram + label_internal: Interní + label_last_changes: "posledních %{count} změn" + label_change_view_all: Zobrazit všechny změny + label_comment: Komentář + label_comment_plural: Komentáře + label_x_comments: + zero: žádné komentáře + one: 1 komentář + other: "%{count} komentářů" + label_comment_add: Přidat komentáře + label_comment_added: Komentář přidán + label_comment_delete: Odstranit komentář + label_query: Uživatelský dotaz + label_query_plural: Uživatelské dotazy + label_query_new: Nový dotaz + label_filter_add: Přidat filtr + label_filter_plural: Filtry + label_equals: je + label_not_equals: není + label_in_less_than: je měší než + label_in_more_than: je větší než + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: v + label_today: dnes + label_all_time: vše + label_yesterday: včera + label_this_week: tento týden + label_last_week: minulý týden + label_last_n_days: "posledních %{count} dnů" + label_this_month: tento měsíc + label_last_month: minulý měsíc + label_this_year: tento rok + label_date_range: Časový rozsah + label_less_than_ago: před méně jak (dny) + label_more_than_ago: před více jak (dny) + label_ago: před (dny) + label_contains: obsahuje + label_not_contains: neobsahuje + label_day_plural: dny + label_repository: Repozitář + label_repository_plural: Repozitáře + label_browse: Procházet + label_branch: Větev + label_tag: Tag + label_revision: Revize + label_revision_plural: Revizí + label_revision_id: "Revize %{value}" + label_associated_revisions: Související verze + label_added: přidáno + label_modified: změněno + label_copied: zkopírováno + label_renamed: přejmenováno + label_deleted: odstraněno + label_latest_revision: Poslední revize + label_latest_revision_plural: Poslední revize + label_view_revisions: Zobrazit revize + label_view_all_revisions: Zobrazit všechny revize + label_max_size: Maximální velikost + label_sort_highest: Přesunout na začátek + label_sort_higher: Přesunout nahoru + label_sort_lower: Přesunout dolů + label_sort_lowest: Přesunout na konec + label_roadmap: Plán + label_roadmap_due_in: "Zbývá %{value}" + label_roadmap_overdue: "%{value} pozdě" + label_roadmap_no_issues: Pro tuto verzi nejsou žádné úkoly + label_search: Hledat + label_result_plural: Výsledky + label_all_words: Všechna slova + label_wiki: Wiki + label_wiki_edit: Wiki úprava + label_wiki_edit_plural: Wiki úpravy + label_wiki_page: Wiki stránka + label_wiki_page_plural: Wiki stránky + label_index_by_title: Index dle názvu + label_index_by_date: Index dle data + label_current_version: Aktuální verze + label_preview: Náhled + label_feed_plural: Příspěvky + label_changes_details: Detail všech změn + label_issue_tracking: Sledování úkolů + label_spent_time: Strávený čas + label_overall_spent_time: Celkem strávený čas + label_f_hour: "%{value} hodina" + label_f_hour_plural: "%{value} hodin" + label_time_tracking: Sledování času + label_change_plural: Změny + label_statistics: Statistiky + label_commits_per_month: Commitů za měsíc + label_commits_per_author: Commitů za autora + label_view_diff: Zobrazit rozdíly + label_diff_inline: uvnitř + label_diff_side_by_side: vedle sebe + label_options: Nastavení + label_copy_workflow_from: Kopírovat průběh práce z + label_permissions_report: Přehled práv + label_watched_issues: Sledované úkoly + label_related_issues: Související úkoly + label_applied_status: Použitý stav + label_loading: Nahrávám... + label_relation_new: Nová souvislost + label_relation_delete: Odstranit souvislost + label_relates_to: související s + label_duplicates: duplikuje + label_duplicated_by: duplikován + label_blocks: blokuje + label_blocked_by: blokován + label_precedes: předchází + label_follows: následuje + label_stay_logged_in: Zůstat přihlášený + label_disabled: zakázán + label_show_completed_versions: Zobrazit dokončené verze + label_me: já + label_board: Fórum + label_board_new: Nové fórum + label_board_plural: Fóra + label_board_locked: Zamčeno + label_board_sticky: Nálepka + label_topic_plural: Témata + label_message_plural: Příspěvky + label_message_last: Poslední příspěvek + label_message_new: Nový příspěvek + label_message_posted: Příspěvek přidán + label_reply_plural: Odpovědi + label_send_information: Zaslat informace o účtu uživateli + label_year: Rok + label_month: Měsíc + label_week: Týden + label_date_from: Od + label_date_to: Do + label_language_based: Podle výchozího jazyka + label_sort_by: "Seřadit podle %{value}" + label_send_test_email: Poslat testovací email + label_feeds_access_key: Přístupový klíč pro Atom + label_missing_feeds_access_key: Postrádá přístupový klíč pro Atom + label_feeds_access_key_created_on: "Přístupový klíč pro Atom byl vytvořen před %{value}" + label_module_plural: Moduly + label_added_time_by: "Přidáno uživatelem %{author} před %{age}" + label_updated_time_by: "Aktualizováno uživatelem %{author} před %{age}" + label_updated_time: "Aktualizováno před %{value}" + label_jump_to_a_project: Vyberte projekt... + label_file_plural: Soubory + label_changeset_plural: Revize + label_default_columns: Výchozí sloupce + label_no_change_option: (beze změny) + label_bulk_edit_selected_issues: Hromadná úprava vybraných úkolů + label_theme: Téma + label_default: Výchozí + label_search_titles_only: Vyhledávat pouze v názvech + label_user_mail_option_all: "Pro všechny události všech mých projektů" + label_user_mail_option_selected: "Pro všechny události vybraných projektů..." + label_user_mail_option_none: "Žádné události" + label_user_mail_option_only_my_events: "Jen pro věci, co sleduji nebo jsem v nich zapojen" + label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách" + label_registration_activation_by_email: aktivace účtu emailem + label_registration_manual_activation: manuální aktivace účtu + label_registration_automatic_activation: automatická aktivace účtu + label_display_per_page: "%{value} na stránku" + label_age: Věk + label_change_properties: Změnit vlastnosti + label_general: Obecné + label_scm: SCM + label_plugins: Doplňky + label_ldap_authentication: Autentifikace LDAP + label_downloads_abbr: Staž. + label_optional_description: Volitelný popis + label_add_another_file: Přidat další soubor + label_preferences: Nastavení + label_chronological_order: V chronologickém pořadí + label_reverse_chronological_order: V obrácaném chronologickém pořadí + label_incoming_emails: Příchozí e-maily + label_generate_key: Generovat klíč + label_issue_watchers: Sledování + label_example: Příklad + label_display: Zobrazit + label_sort: Řazení + label_ascending: Vzestupně + label_descending: Sestupně + label_date_from_to: Od %{start} do %{end} + label_wiki_content_added: Wiki stránka přidána + label_wiki_content_updated: Wiki stránka aktualizována + label_group: Skupina + label_group_plural: Skupiny + label_group_new: Nová skupina + label_time_entry_plural: Strávený čas + label_version_sharing_none: Nesdíleno + label_version_sharing_descendants: S podprojekty + label_version_sharing_hierarchy: S hierarchií projektu + label_version_sharing_tree: Se stromem projektu + label_version_sharing_system: Se všemi projekty + label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů + label_copy_source: Zdroj + label_copy_target: Cíl + label_copy_same_as_target: Stejný jako cíl + label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou + label_api_access_key: API přístupový klíč + label_missing_api_access_key: Chybějící přístupový klíč API + label_api_access_key_created_on: API přístupový klíč vytvořen %{value} + label_profile: Profil + label_subtask_plural: Dílčí úkoly + label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu + label_principal_search: "Hledat uživatele nebo skupinu:" + label_user_search: "Hledat uživatele:" + + button_login: Přihlásit + button_submit: Potvrdit + button_save: Uložit + button_check_all: Zašrtnout vše + button_uncheck_all: Odšrtnout vše + button_delete: Odstranit + button_create: Vytvořit + button_create_and_continue: Vytvořit a pokračovat + button_test: Testovat + button_edit: Upravit + button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: %{page_title}" + button_add: Přidat + button_change: Změnit + button_apply: Použít + button_clear: Smazat + button_lock: Zamknout + button_unlock: Odemknout + button_download: Stáhnout + button_list: Vypsat + button_view: Zobrazit + button_move: Přesunout + button_move_and_follow: Přesunout a následovat + button_back: Zpět + button_cancel: Storno + button_activate: Aktivovat + button_sort: Seřadit + button_log_time: Přidat čas + button_rollback: Zpět k této verzi + button_watch: Sledovat + button_unwatch: Nesledovat + button_reply: Odpovědět + button_archive: Archivovat + button_unarchive: Dearchivovat + button_reset: Resetovat + button_rename: Přejmenovat + button_change_password: Změnit heslo + button_copy: Kopírovat + button_copy_and_follow: Kopírovat a následovat + button_annotate: Komentovat + button_update: Aktualizovat + button_configure: Konfigurovat + button_quote: Citovat + button_duplicate: Duplikovat + button_show: Zobrazit + + status_active: aktivní + status_registered: registrovaný + status_locked: zamčený + + version_status_open: otevřený + version_status_locked: zamčený + version_status_closed: zavřený + + field_active: Aktivní + + text_select_mail_notifications: Vyberte akci, při které bude zasláno upozornění emailem. + text_regexp_info: např. ^[A-Z0-9]+$ + text_min_max_length_info: 0 znamená bez limitu + text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data? + text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány." + text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce + text_are_you_sure: Jste si jisti? + text_journal_changed: "%{label} změněn z %{old} na %{new}" + text_journal_set_to: "%{label} nastaven na %{value}" + text_journal_deleted: "%{label} smazán (%{old})" + text_journal_added: "%{label} %{value} přidán" + text_tip_issue_begin_day: úkol začíná v tento den + text_tip_issue_end_day: úkol končí v tento den + text_tip_issue_begin_end_day: úkol začíná a končí v tento den + text_caracters_maximum: "%{count} znaků maximálně." + text_caracters_minimum: "Musí být alespoň %{count} znaků dlouhé." + text_length_between: "Délka mezi %{min} a %{max} znaky." + text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce + text_unallowed_characters: Nepovolené znaky + text_comma_separated: Povoleno více hodnot (oddělěné čárkou). + text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu). + text_issues_ref_in_commit_messages: Odkazování a opravování úkolů v poznámkách commitů + text_issue_added: "Úkol %{id} byl vytvořen uživatelem %{author}." + text_issue_updated: "Úkol %{id} byl aktualizován uživatelem %{author}." + text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto Wiki a celý její obsah? + text_issue_category_destroy_question: "Některé úkoly (%{count}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?" + text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii + text_issue_category_reassign_to: Přiřadit úkoly do této kategorie + text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))." + text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit" + text_load_default_configuration: Nahrát výchozí konfiguraci + text_status_changed_by_changeset: "Použito v sadě změn %{value}." + text_time_logged_by_changeset: Aplikováno v sadě změn %{value}. + text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?' + text_select_project_modules: 'Aktivní moduly v tomto projektu:' + text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno + text_file_repository_writable: Povolen zápis do adresáře ukládání souborů + text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets + text_rmagick_available: RMagick k dispozici (volitelné) + text_destroy_time_entries_question: "U úkolů, které chcete odstranit, je evidováno %{hours} práce. Co chete udělat?" + text_destroy_time_entries: Odstranit zaznamenané hodiny. + text_assign_time_entries_to_project: Přiřadit zaznamenané hodiny projektu + text_reassign_time_entries: 'Přeřadit zaznamenané hodiny k tomuto úkolu:' + text_user_wrote: "%{value} napsal:" + text_enumeration_destroy_question: "Několik (%{count}) objektů je přiřazeno k této hodnotě." + text_enumeration_category_reassign_to: 'Přeřadit je do této:' + text_email_delivery_not_configured: "Doručování e-mailů není nastaveno a odesílání notifikací je zakázáno.\nNastavte Váš SMTP server v souboru config/configuration.yml a restartujte aplikaci." + text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapováni automaticky." + text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.' + text_custom_field_possible_values_info: 'Každá hodnota na novém řádku' + text_wiki_page_destroy_question: Tato stránka má %{descendants} podstránek a potomků. Co chcete udělat? + text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky + text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky + text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči + text_own_membership_delete_confirmation: "Chystáte se odebrat si některá nebo všechna svá oprávnění, potom již nemusíte být schopni upravit tento projekt.\nOpravdu chcete pokračovat?" + text_zoom_in: Přiblížit + text_zoom_out: Oddálit + + default_role_manager: Manažer + default_role_developer: Vývojář + default_role_reporter: Reportér + default_tracker_bug: Chyba + default_tracker_feature: Požadavek + default_tracker_support: Podpora + default_issue_status_new: Nový + default_issue_status_in_progress: Ve vývoji + default_issue_status_resolved: Vyřešený + default_issue_status_feedback: Čeká se + default_issue_status_closed: Uzavřený + default_issue_status_rejected: Odmítnutý + default_doc_category_user: Uživatelská dokumentace + default_doc_category_tech: Technická dokumentace + default_priority_low: Nízká + default_priority_normal: Normální + default_priority_high: Vysoká + default_priority_urgent: Urgentní + default_priority_immediate: Okamžitá + default_activity_design: Návhr + default_activity_development: Vývoj + + enumeration_issue_priorities: Priority úkolů + enumeration_doc_categories: Kategorie dokumentů + enumeration_activities: Aktivity (sledování času) + enumeration_system_activity: Systémová aktivita + + field_warn_on_leaving_unsaved: Varuj mě před opuštěním stránky s neuloženým textem + text_warn_on_leaving_unsaved: Aktuální stránka obsahuje neuložený text, který bude ztracen, když opustíte stránku. + label_my_queries: Moje vlastní dotazy + text_journal_changed_no_detail: "%{label} aktualizován" + label_news_comment_added: K novince byl přidán komentář + button_expand_all: Rozbal vše + button_collapse_all: Sbal vše + label_additional_workflow_transitions_for_assignee: Další změna stavu povolena, jestliže je uživatel přiřazen + label_additional_workflow_transitions_for_author: Další změna stavu povolena, jestliže je uživatel autorem + label_bulk_edit_selected_time_entries: Hromadná změna záznamů času + text_time_entries_destroy_confirmation: Jste si jistí, že chcete smazat vybraný záznam(y) času? + label_role_anonymous: Anonymní + label_role_non_member: Není členem + label_issue_note_added: Přidána poznámka + label_issue_status_updated: Aktualizován stav + label_issue_priority_updated: Aktualizována priorita + label_issues_visibility_own: Úkol vytvořen nebo přiřazen uživatel(i/em) + field_issues_visibility: Viditelnost úkolů + label_issues_visibility_all: Všechny úkoly + permission_set_own_issues_private: Nastavit vlastní úkoly jako veřejné nebo soukromé + field_is_private: Soukromý + permission_set_issues_private: Nastavit úkoly jako veřejné nebo soukromé + label_issues_visibility_public: Všechny úkoly, které nejsou soukromé + text_issues_destroy_descendants_confirmation: "%{count} dílčí(ch) úkol(ů) bude rovněž smazán(o)." + field_commit_logs_encoding: Kódování zpráv při commitu + field_scm_path_encoding: Kódování cesty SCM + text_scm_path_encoding_note: "Výchozí: UTF-8" + field_path_to_repository: Cesta k repositáři + field_root_directory: Kořenový adresář + field_cvs_module: Modul + field_cvsroot: CVSROOT + text_mercurial_repository_note: Lokální repositář (např. /hgrepo, c:\hgrepo) + text_scm_command: Příkaz + text_scm_command_version: Verze + label_git_report_last_commit: Reportovat poslední commit pro soubory a adresáře + text_scm_config: Můžete si nastavit vaše SCM příkazy v config/configuration.yml. Restartujte, prosím, aplikaci po jejich úpravě. + text_scm_command_not_available: SCM příkaz není k dispozici. Zkontrolujte, prosím, nastavení v panelu Administrace. + notice_issue_successful_create: Úkol %{id} vytvořen. + label_between: mezi + setting_issue_group_assignment: Povolit přiřazení úkolu skupině + label_diff: rozdíl + text_git_repository_note: Repositář je "bare and local" (např. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Směr třídění + description_project_scope: Rozsah vyhledávání + description_filter: Filtr + description_user_mail_notification: Nastavení emailových notifikací + description_message_content: Obsah zprávy + description_available_columns: Dostupné sloupce + description_issue_category_reassign: Zvolte kategorii úkolu + description_search: Vyhledávací pole + description_notes: Poznámky + description_choose_project: Projekty + description_query_sort_criteria_attribute: Třídící atribut + description_wiki_subpages_reassign: Zvolte novou rodičovskou stránku + description_selected_columns: Vybraný sloupec + label_parent_revision: Rodič + label_child_revision: Potomek + error_scm_annotate_big_text_file: Vstup nemůže být komentován, protože překračuje povolenou velikost textového souboru + setting_default_issue_start_date_to_creation_date: Použij aktuální datum jako počáteční datum pro nové úkoly + button_edit_section: Uprav tuto část + setting_repositories_encodings: Kódování příloh a repositářů + description_all_columns: Všechny sloupce + button_export: Export + label_export_options: "nastavení exportu %{export_format}" + error_attachment_too_big: Soubor nemůže být nahrán, protože jeho velikost je větší než maximální (%{max_size}) + notice_failed_to_save_time_entries: "Chyba při ukládání %{count} časov(ých/ého) záznam(ů) z %{total} vybraného: %{ids}." + label_x_issues: + zero: 0 Úkol + one: 1 Úkol + other: "%{count} Úkoly" + label_repository_new: Nový repositář + field_repository_is_default: Hlavní repositář + label_copy_attachments: Kopírovat přílohy + label_item_position: "%{position}/%{count}" + label_completed_versions: Dokončené verze + text_project_identifier_info: Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka.
    Po uložení již nelze identifikátor měnit. + field_multiple: Více hodnot + setting_commit_cross_project_ref: Povolit reference a opravy úkolů ze všech ostatních projektů + text_issue_conflict_resolution_add_notes: Přidat moje poznámky a zahodit ostatní změny + text_issue_conflict_resolution_overwrite: Přesto přijmout moje úpravy (předchozí poznámky budou zachovány, ale některé změny mohou být přepsány) + notice_issue_update_conflict: Během vašich úprav byl úkol aktualizován jiným uživatelem. + text_issue_conflict_resolution_cancel: Zahoď všechny moje změny a znovu zobraz %{link} + permission_manage_related_issues: Spravuj související úkoly + field_auth_source_ldap_filter: LDAP filtr + label_search_for_watchers: Hledej sledující pro přidání + notice_account_deleted: Váš účet byl trvale smazán. + setting_unsubscribe: Povolit uživatelům smazání jejich vlastního účtu + button_delete_my_account: Smazat můj účet + text_account_destroy_confirmation: |- + Skutečně chcete pokračovat? + Váš účet bude nenávratně smazán. + error_session_expired: Vaše sezení vypršelo. Znovu se přihlaste, prosím. + text_session_expiration_settings: "Varování: změnou tohoto nastavení mohou vypršet aktuální sezení včetně toho vašeho." + setting_session_lifetime: Maximální čas sezení + setting_session_timeout: Vypršení sezení bez aktivity + label_session_expiration: Vypršení sezení + permission_close_project: Zavřít / Otevřít projekt + label_show_closed_projects: Zobrazit zavřené projekty + button_close: Zavřít + button_reopen: Znovu otevřít + project_status_active: aktivní + project_status_closed: zavřený + project_status_archived: archivovaný + text_project_closed: Tento projekt je uzevřený a je pouze pro čtení. + notice_user_successful_create: Uživatel %{id} vytvořen. + field_core_fields: Standardní pole + field_timeout: Vypršení (v sekundách) + setting_thumbnails_enabled: Zobrazit náhled přílohy + setting_thumbnails_size: Velikost náhledu (v pixelech) + label_status_transitions: Změna stavu + label_fields_permissions: Práva k polím + label_readonly: Pouze pro čtení + label_required: Vyžadováno + text_repository_identifier_info: Jou povoleny pouze malá písmena (a-z), číslice, pomlčky a podtržítka.
    Po uložení již nelze identifikátor změnit. + field_board_parent: Rodičovské fórum + label_attribute_of_project: Projektové %{name} + label_attribute_of_author: Autorovo %{name} + label_attribute_of_assigned_to: "%{name} přiřazené(ho)" + label_attribute_of_fixed_version: Cílová verze %{name} + label_copy_subtasks: Kopírovat dílčí úkoly + label_copied_to: zkopírováno do + label_copied_from: zkopírováno z + label_any_issues_in_project: jakékoli úkoly v projektu + label_any_issues_not_in_project: jakékoli úkoly mimo projekt + field_private_notes: Soukromé poznámky + permission_view_private_notes: Zobrazit soukromé poznámky + permission_set_notes_private: Nastavit poznámky jako soukromé + label_no_issues_in_project: žádné úkoly v projektu + label_any: vše + label_last_n_weeks: poslední %{count} týdny + setting_cross_project_subtasks: Povolit dílčí úkoly napříč projekty + label_cross_project_descendants: S podprojekty + label_cross_project_tree: Se stromem projektu + label_cross_project_hierarchy: S hierarchií projektu + label_cross_project_system: Se všemi projekty + button_hide: Skrýt + setting_non_working_week_days: Dny pracovního volna/klidu + label_in_the_next_days: v přístích + label_in_the_past_days: v minulých + label_attribute_of_user: "%{name} uživatel(e/ky)" + text_turning_multiple_off: Jestliže zakážete více hodnot, + hodnoty budou smazány za účelem rezervace pouze jediné hodnoty na položku. + label_attribute_of_issue: "%{name} úkolu" + permission_add_documents: Přidat dokument + permission_edit_documents: Upravit dokumenty + permission_delete_documents: Smazet dokumenty + label_gantt_progress_line: Vývojová čára + setting_jsonp_enabled: Povolit podporu JSONP + field_inherit_members: Zdědit členy + field_closed_on: Uzavřeno + field_generate_password: Generovat heslo + setting_default_projects_tracker_ids: Výchozí fronta pro nové projekty + label_total_time: Celkem + notice_account_not_activated_yet: Neaktivovali jste si dosud Váš účet. + Pro opětovné zaslání aktivačního emailu klikněte na tento odkaz, prosím. + notice_account_locked: Váš účet je uzamčen. + label_hidden: Skrytý + label_visibility_private: pouze pro mě + label_visibility_roles: pouze pro tyto role + label_visibility_public: pro všechny uživatele + field_must_change_passwd: Musí změnit heslo při příštím přihlášení + notice_new_password_must_be_different: Nové heslo se musí lišit od stávajícího + setting_mail_handler_excluded_filenames: Vyřadit přílohy podle jména + text_convert_available: ImageMagick convert k dispozici (volitelné) + label_link: Odkaz + label_only: jenom + label_drop_down_list: rozbalovací seznam + label_checkboxes: zaškrtávátka + label_link_values_to: Propojit hodnoty s URL + setting_force_default_language_for_anonymous: Vynutit výchozí jazyk pro anonymní uživatele + users + setting_force_default_language_for_loggedin: Vynutit výchozí jazyk pro přihlášené uživatele + users + label_custom_field_select_type: Vybrat typ objektu, ke kterému bude přiřazeno uživatelské pole + label_issue_assigned_to_updated: Přiřazený uživatel aktualizován + label_check_for_updates: Zkontroluj aktualizace + label_latest_compatible_version: Poslední kompatibilní verze + label_unknown_plugin: Nezámý plugin + label_radio_buttons: radio tlačítka + label_group_anonymous: Anonymní uživatelé + label_group_non_member: Nečleni + label_add_projects: Přidat projekty + field_default_status: Výchozí stav + text_subversion_repository_note: 'Např.: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Viditelnost uživatelů + label_users_visibility_all: Všichni aktivní uživatelé + label_users_visibility_members_of_visible_projects: Členové viditelných projektů + label_edit_attachments: Editovat přiložené soubory + setting_link_copied_issue: Vytvořit odkazy na kopírované úkol + label_link_copied_issue: Vytvořit odkaz na kopírovaný úkol + label_ask: Zeptat se + label_search_attachments_yes: Vyhledat názvy a popisy souborů + label_search_attachments_no: Nevyhledávat soubory + label_search_attachments_only: Vyhledávat pouze soubory + label_search_open_issues_only: Pouze otevřené úkoly + field_address: Email + setting_max_additional_emails: Maximální počet dalších emailových adres + label_email_address_plural: Emaily + label_email_address_add: Přidat emailovou adresu + label_enable_notifications: Povolit notifikace + label_disable_notifications: Zakázat notifikace + setting_search_results_per_page: Vyhledaných výsledků na stránku + label_blank_value: prázdný + permission_copy_issues: Kopírovat úkoly + error_password_expired: Platnost vašeho hesla vypršela a administrátor vás žádá o jeho změnu. + field_time_entries_visibility: Viditelnost časových záznamů + setting_password_max_age: Změna hesla je vyžadována po + label_parent_task_attributes: Atributy rodičovského úkolu + label_parent_task_attributes_derived: Vypočteno z dílčích úkolů + label_parent_task_attributes_independent: Nezávisle na dílčích úkolech + label_time_entries_visibility_all: Všechny zaznamenané časy + label_time_entries_visibility_own: Zaznamenané časy vytvořené uživatelem + label_member_management: Správa členů + label_member_management_all_roles: Všechny role + label_member_management_selected_roles_only: Pouze tyto role + label_password_required: Pro pokračování potvrďte vaše heslo + label_total_spent_time: Celkem strávený čas + notice_import_finished: "%{count} položek bylo naimportováno" + notice_import_finished_with_errors: "%{count} z %{total} položek nemohlo být naimportováno" + error_invalid_file_encoding: Soubor není platným souborem s kódováním %{encoding} + error_invalid_csv_file_or_settings: Soubor není CSV soubor nebo neodpovídá + níže uvedenému nastavení + error_can_not_read_import_file: Chyba při čtení souboru pro import + permission_import_issues: Import úkolů + label_import_issues: Import úkolů + label_select_file_to_import: Vyberte soubor pro import + label_fields_separator: Oddělovač pole + label_fields_wrapper: Oddělovač textu + label_encoding: Kódování + label_comma_char: Čárka + label_semi_colon_char: Středník + label_quote_char: Uvozovky + label_double_quote_char: Dvojté uvozovky + label_fields_mapping: Mapování polí + label_file_content_preview: Náhled obsahu souboru + label_create_missing_values: Vytvořit chybějící hodnoty + button_import: Import + field_total_estimated_hours: Celkový odhadovaný čas + label_api: API + label_total_plural: Celkem + label_assigned_issues: Přiřazené úkoly + label_field_format_enumeration: Seznam klíčů/hodnot + label_f_hour_short: '%{value} hod' + field_default_version: Výchozí verze + error_attachment_extension_not_allowed: Přípona přílohy %{extension} není povolena + setting_attachment_extensions_allowed: Povolené přípony + setting_attachment_extensions_denied: Nepovolené přípony + label_any_open_issues: otevřené úkoly + label_no_open_issues: bez otevřených úkolů + label_default_values_for_new_users: Výchozí hodnoty pro nové uživatele + error_ldap_bind_credentials: Neplatný účet/heslo LDAP + setting_sys_api_key: API klíč + setting_lost_password: Zapomenuté heslo + mail_subject_security_notification: Bezpečnostní upozornění + mail_body_security_notification_change: ! '%{field} bylo změněno.' + mail_body_security_notification_change_to: ! '%{field} bylo změněno na %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} bylo přidáno.' + mail_body_security_notification_remove: ! '%{field} %{value} bylo odebráno.' + mail_body_security_notification_notify_enabled: Email %{value} nyní dostává + notifikace. + mail_body_security_notification_notify_disabled: Email %{value} už nedostává + notifikace. + mail_body_settings_updated: ! 'Následující nastavení byla změněna:' + field_remote_ip: IP adresa + label_wiki_page_new: Nová wiki stránka + label_relations: Relace + button_filter: Filtr + mail_body_password_updated: Vaše heslo bylo změněno. + label_no_preview: Náhled není k dispozici + error_no_tracker_allowed_for_new_issue_in_project: Projekt neobsahuje žádnou frontu, pro kterou lze vytvořit úkol + label_tracker_all: Všechny fronty + label_new_project_issue_tab_enabled: Zobraz záložku "Nový úkol" + setting_new_item_menu_tab: Záložka v menu projektu pro vytváření nových objektů + label_new_object_tab_enabled: Zobrazit rozbalovací menu "+" + error_no_projects_with_tracker_allowed_for_new_issue: Neexistují projekty s frontou, pro kterou lze vytvořit úkol + field_textarea_font: Písmo použité pro textová pole + label_font_default: Výchozí písmo + label_font_monospace: Neproporcionální písmo + label_font_proportional: Proporciální písmo + setting_timespan_format: Formát časového intervalu + label_table_of_contents: Obsah + setting_commit_logs_formatting: Použij textové formátování pro popisky comitů + setting_mail_handler_enable_regex_delimiters: Povol regulární výrazy + error_move_of_child_not_possible: 'Dílčí úkol %{child} nemůže být přesunut do nového + projektu: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Strávený čas nemůže + být přiřazen k úkolu, který se bude mazat + setting_timelog_required_fields: Požadovaná pole pro zapisování času + label_attribute_of_object: "%{object_name} %{name}" + label_user_mail_option_only_assigned: Pouze pro věci, které sleduji nebo jsem na ně přiřazený + label_user_mail_option_only_owner: Pouze pro věci, které sleduji nebo jsem jejich vlastníkem + warning_fields_cleared_on_bulk_edit: Změny způsobí automatické smazání + hodnot z jednoho nebo více polí vybraných objektů + field_updated_by: Aktualizoval + field_last_updated_by: Naposledy změnil + field_full_width_layout: Celá šířka schematu + label_last_notes: Poslední poznámky + field_digest: Kontrolní součet + field_default_assigned_to: Výchozí přiřazený uživatel + setting_show_custom_fields_on_registration: Zobraz uživatelská pole při registraci + permission_view_news: Zobraz novinky + label_no_preview_alternative_html: "Náhled není k dispozici. Soubor: %{link}." + label_no_preview_download: Stažení diff --git a/config/locales/da.yml b/config/locales/da.yml new file mode 100644 index 0000000..57f6dfd --- /dev/null +++ b/config/locales/da.yml @@ -0,0 +1,1247 @@ +# Danish translation file for standard Ruby on Rails internationalization +# by Lars Hoeg (http://www.lenio.dk/) +# updated and upgraded to 0.9 by Morten Krogh Andersen (http://www.krogh.net) + +da: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%e. %b %Y" + long: "%e. %B %Y" + + day_names: [søndag, mandag, tirsdag, onsdag, torsdag, fredag, lørdag] + abbr_day_names: [sø, ma, ti, 'on', to, fr, lø] + month_names: [~, januar, februar, marts, april, maj, juni, juli, august, september, oktober, november, december] + abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec] + order: + - :day + - :month + - :year + + time: + formats: + default: "%e. %B %Y, %H:%M" + time: "%H:%M" + short: "%e. %b %Y, %H:%M" + long: "%A, %e. %B %Y, %H:%M" + am: "" + pm: "" + + support: + array: + sentence_connector: "og" + skip_last_comma: true + + datetime: + distance_in_words: + half_a_minute: "et halvt minut" + less_than_x_seconds: + one: "mindre end et sekund" + other: "mindre end %{count} sekunder" + x_seconds: + one: "et sekund" + other: "%{count} sekunder" + less_than_x_minutes: + one: "mindre end et minut" + other: "mindre end %{count} minutter" + x_minutes: + one: "et minut" + other: "%{count} minutter" + about_x_hours: + one: "cirka en time" + other: "cirka %{count} timer" + x_hours: + one: "1 time" + other: "%{count} timer" + x_days: + one: "en dag" + other: "%{count} dage" + about_x_months: + one: "cirka en måned" + other: "cirka %{count} måneder" + x_months: + one: "en måned" + other: "%{count} måneder" + about_x_years: + one: "cirka et år" + other: "cirka %{count} år" + over_x_years: + one: "mere end et år" + other: "mere end %{count} år" + almost_x_years: + one: "næsten 1 år" + other: "næsten %{count} år" + + number: + format: + separator: "," + delimiter: "." + precision: 3 + currency: + format: + format: "%u %n" + unit: "DKK" + separator: "," + delimiter: "." + precision: 2 + precision: + format: + # separator: + delimiter: "" + # precision: + human: + format: + # separator: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + percentage: + format: + # separator: + delimiter: "" + # precision: + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "er ikke i listen" + exclusion: "er reserveret" + invalid: "er ikke gyldig" + confirmation: "stemmer ikke overens" + accepted: "skal accepteres" + empty: "må ikke udelades" + blank: "skal udfyldes" + too_long: "er for lang (højst %{count} tegn)" + too_short: "er for kort (mindst %{count} tegn)" + wrong_length: "har forkert længde (skulle være %{count} tegn)" + taken: "er allerede anvendt" + not_a_number: "er ikke et tal" + greater_than: "skal være større end %{count}" + greater_than_or_equal_to: "skal være større end eller lig med %{count}" + equal_to: "skal være lig med %{count}" + less_than: "skal være mindre end %{count}" + less_than_or_equal_to: "skal være mindre end eller lig med %{count}" + odd: "skal være ulige" + even: "skal være lige" + greater_than_start_date: "skal være senere end startdatoen" + not_same_project: "hører ikke til samme projekt" + circular_dependency: "Denne relation vil skabe et afhængighedsforhold" + cant_link_an_issue_with_a_descendant: "En sag kan ikke relateres til en af dens underopgaver" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + template: + header: + one: "En fejl forhindrede %{model} i at blive gemt" + other: "%{count} fejl forhindrede denne %{model} i at blive gemt" + body: "Der var problemer med følgende felter:" + + actionview_instancetag_blank_option: Vælg venligst + + general_text_No: 'Nej' + general_text_Yes: 'Ja' + general_text_no: 'nej' + general_text_yes: 'ja' + general_lang_name: 'Danish (Dansk)' + general_csv_separator: ',' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Kontoen er opdateret. + notice_account_invalid_credentials: Ugyldig bruger og/eller kodeord + notice_account_password_updated: Kodeordet er opdateret. + notice_account_wrong_password: Forkert kodeord + notice_account_register_done: Kontoen er oprettet. For at aktivere kontoen skal du klikke på linket i den tilsendte email. + notice_account_unknown_email: Ukendt bruger. + notice_can_t_change_password: Denne konto benytter en ekstern sikkerhedsgodkendelse. Det er ikke muligt at skifte kodeord. + notice_account_lost_email_sent: En email med instruktioner til at vælge et nyt kodeord er afsendt til dig. + notice_account_activated: Din konto er aktiveret. Du kan nu logge ind. + notice_successful_create: Succesfuld oprettelse. + notice_successful_update: Succesfuld opdatering. + notice_successful_delete: Succesfuld sletning. + notice_successful_connection: Succesfuld forbindelse. + notice_file_not_found: Siden du forsøger at tilgå eksisterer ikke eller er blevet fjernet. + notice_locking_conflict: Data er opdateret af en anden bruger. + notice_not_authorized: Du har ikke adgang til denne side. + notice_email_sent: "En email er sendt til %{value}" + notice_email_error: "En fejl opstod under afsendelse af email (%{value})" + notice_feeds_access_key_reseted: Din adgangsnøgle til Atom er nulstillet. + notice_failed_to_save_issues: "Det mislykkedes at gemme %{count} sage(r) på %{total} valgt: %{ids}." + notice_no_issue_selected: "Ingen sag er valgt! Vælg venligst hvilke emner du vil rette." + notice_account_pending: "Din konto er oprettet, og afventer administrators godkendelse." + notice_default_data_loaded: Standardopsætningen er indlæst. + + error_can_t_load_default_data: "Standardopsætning kunne ikke indlæses: %{value}" + error_scm_not_found: "Adgang nægtet og/eller revision blev ikke fundet i det valgte repository." + error_scm_command_failed: "En fejl opstod under forbindelsen til det valgte repository: %{value}" + + mail_subject_lost_password: "Dit %{value} kodeord" + mail_body_lost_password: 'Klik på dette link for at ændre dit kodeord:' + mail_subject_register: "%{value} kontoaktivering" + mail_body_register: 'Klik på dette link for at aktivere din konto:' + mail_body_account_information_external: "Du kan bruge din %{value} konto til at logge ind." + mail_body_account_information: Din kontoinformation + mail_subject_account_activation_request: "%{value} kontoaktivering" + mail_body_account_activation_request: "En ny bruger (%{value}) er registreret. Godkend venligst kontoen:" + + + field_name: Navn + field_description: Beskrivelse + field_summary: Sammenfatning + field_is_required: Skal udfyldes + field_firstname: Fornavn + field_lastname: Efternavn + field_mail: Email + field_filename: Fil + field_filesize: Størrelse + field_downloads: Downloads + field_author: Forfatter + field_created_on: Oprettet + field_updated_on: Opdateret + field_field_format: Format + field_is_for_all: For alle projekter + field_possible_values: Mulige værdier + field_regexp: Regulære udtryk + field_min_length: Mindste længde + field_max_length: Største længde + field_value: Værdi + field_category: Kategori + field_title: Titel + field_project: Projekt + field_issue: Sag + field_status: Status + field_notes: Noter + field_is_closed: Sagen er lukket + field_is_default: Standardværdi + field_tracker: Type + field_subject: Emne + field_due_date: Deadline + field_assigned_to: Tildelt til + field_priority: Prioritet + field_fixed_version: Udgave + field_user: Bruger + field_role: Rolle + field_homepage: Hjemmeside + field_is_public: Offentlig + field_parent: Underprojekt af + field_is_in_roadmap: Sager vist i roadmap + field_login: Login + field_mail_notification: Email-påmindelser + field_admin: Administrator + field_last_login_on: Sidste forbindelse + field_language: Sprog + field_effective_date: Dato + field_password: Kodeord + field_new_password: Nyt kodeord + field_password_confirmation: Bekræft + field_version: Version + field_type: Type + field_host: Vært + field_port: Port + field_account: Kode + field_base_dn: Base DN + field_attr_login: Login attribut + field_attr_firstname: Fornavn attribut + field_attr_lastname: Efternavn attribut + field_attr_mail: Email attribut + field_onthefly: løbende brugeroprettelse + field_start_date: Start dato + field_done_ratio: "% færdig" + field_auth_source: Sikkerhedsmetode + field_hide_mail: Skjul min email + field_comments: Kommentar + field_url: URL + field_start_page: Startside + field_subproject: Underprojekt + field_hours: Timer + field_activity: Aktivitet + field_spent_on: Dato + field_identifier: Identifikator + field_is_filter: Brugt som et filter + field_issue_to: Beslægtede sag + field_delay: Udsættelse + field_assignable: Sager kan tildeles denne rolle + field_redirect_existing_links: Videresend eksisterende links + field_estimated_hours: Anslået tid + field_column_names: Kolonner + field_time_zone: Tidszone + field_searchable: Søgbar + field_default_value: Standardværdi + + setting_app_title: Applikationstitel + setting_app_subtitle: Applikationsundertekst + setting_welcome_text: Velkomsttekst + setting_default_language: Standardsporg + setting_login_required: Sikkerhed påkrævet + setting_self_registration: Brugeroprettelse + setting_attachment_max_size: Vedhæftede filers max størrelse + setting_issues_export_limit: Sagseksporteringsbegrænsning + setting_mail_from: Afsender-email + setting_bcc_recipients: Skjult modtager (bcc) + setting_host_name: Værtsnavn + setting_text_formatting: Tekstformatering + setting_wiki_compression: Komprimering af wiki-historik + setting_feeds_limit: Feed indholdsbegrænsning + setting_autofetch_changesets: Hent automatisk commits + setting_sys_api_enabled: Aktiver webservice for automatisk administration af repository + setting_commit_ref_keywords: Referencenøgleord + setting_commit_fix_keywords: Afslutningsnøgleord + setting_autologin: Automatisk login + setting_date_format: Datoformat + setting_time_format: Tidsformat + setting_cross_project_issue_relations: Tillad sagsrelationer på tværs af projekter + setting_issue_list_default_columns: Standardkolonner på sagslisten + setting_emails_footer: Email-fodnote + setting_protocol: Protokol + setting_user_format: Brugervisningsformat + + project_module_issue_tracking: Sagssøgning + project_module_time_tracking: Tidsstyring + project_module_news: Nyheder + project_module_documents: Dokumenter + project_module_files: Filer + project_module_wiki: Wiki + project_module_repository: Repository + project_module_boards: Fora + + label_user: Bruger + label_user_plural: Brugere + label_user_new: Ny bruger + label_project: Projekt + label_project_new: Nyt projekt + label_project_plural: Projekter + label_x_projects: + zero: Ingen projekter + one: 1 projekt + other: "%{count} projekter" + label_project_all: Alle projekter + label_project_latest: Seneste projekter + label_issue: Sag + label_issue_new: Opret sag + label_issue_plural: Sager + label_issue_view_all: Vis alle sager + label_issues_by: "Sager fra %{value}" + label_issue_added: Sagen er oprettet + label_issue_updated: Sagen er opdateret + label_document: Dokument + label_document_new: Nyt dokument + label_document_plural: Dokumenter + label_document_added: Dokument tilføjet + label_role: Rolle + label_role_plural: Roller + label_role_new: Ny rolle + label_role_and_permissions: Roller og rettigheder + label_member: Medlem + label_member_new: Nyt medlem + label_member_plural: Medlemmer + label_tracker: Type + label_tracker_plural: Typer + label_tracker_new: Ny type + label_workflow: Arbejdsgang + label_issue_status: Sagsstatus + label_issue_status_plural: Sagsstatusser + label_issue_status_new: Ny status + label_issue_category: Sagskategori + label_issue_category_plural: Sagskategorier + label_issue_category_new: Ny kategori + label_custom_field: Brugerdefineret felt + label_custom_field_plural: Brugerdefinerede felter + label_custom_field_new: Nyt brugerdefineret felt + label_enumerations: Værdier + label_enumeration_new: Ny værdi + label_information: Information + label_information_plural: Information + label_please_login: Login + label_register: Registrér + label_password_lost: Glemt kodeord + label_home: Forside + label_my_page: Min side + label_my_account: Min konto + label_my_projects: Mine projekter + label_administration: Administration + label_login: Log ind + label_logout: Log ud + label_help: Hjælp + label_reported_issues: Rapporterede sager + label_assigned_to_me_issues: Sager tildelt til mig + label_last_login: Sidste logintidspunkt + label_registered_on: Registreret den + label_activity: Aktivitet + label_new: Ny + label_logged_as: Registreret som + label_environment: Miljø + label_authentication: Sikkerhed + label_auth_source: Sikkerhedsmetode + label_auth_source_new: Ny sikkerhedsmetode + label_auth_source_plural: Sikkerhedsmetoder + label_subproject_plural: Underprojekter + label_min_max_length: Min - Max længde + label_list: Liste + label_date: Dato + label_integer: Heltal + label_float: Kommatal + label_boolean: Sand/falsk + label_string: Tekst + label_text: Lang tekst + label_attribute: Attribut + label_attribute_plural: Attributter + label_no_data: Ingen data at vise + label_change_status: Ændringsstatus + label_history: Historik + label_attachment: Fil + label_attachment_new: Ny fil + label_attachment_delete: Slet fil + label_attachment_plural: Filer + label_file_added: Fil tilføjet + label_report: Rapport + label_report_plural: Rapporter + label_news: Nyheder + label_news_new: Tilføj nyheder + label_news_plural: Nyheder + label_news_latest: Seneste nyheder + label_news_view_all: Vis alle nyheder + label_news_added: Nyhed tilføjet + label_settings: Indstillinger + label_overview: Oversigt + label_version: Udgave + label_version_new: Ny udgave + label_version_plural: Udgaver + label_confirmation: Bekræftelser + label_export_to: Eksporter til + label_read: Læs... + label_public_projects: Offentlige projekter + label_open_issues: åben + label_open_issues_plural: åbne + label_closed_issues: lukket + label_closed_issues_plural: lukkede + label_x_open_issues_abbr: + zero: 0 åbne + one: 1 åben + other: "%{count} åbne" + label_x_closed_issues_abbr: + zero: 0 lukkede + one: 1 lukket + other: "%{count} lukkede" + label_total: Total + label_permissions: Rettigheder + label_current_status: Nuværende status + label_new_statuses_allowed: Ny status tilladt + label_all: alle + label_none: intet + label_nobody: ingen + label_next: Næste + label_previous: Forrige + label_used_by: Brugt af + label_details: Detaljer + label_add_note: Tilføj note + label_calendar: Kalender + label_months_from: måneder frem + label_gantt: Gantt + label_internal: Intern + label_last_changes: "sidste %{count} ændringer" + label_change_view_all: Vis alle ændringer + label_comment: Kommentar + label_comment_plural: Kommentarer + label_x_comments: + zero: ingen kommentarer + one: 1 kommentar + other: "%{count} kommentarer" + label_comment_add: Tilføj en kommentar + label_comment_added: Kommentaren er tilføjet + label_comment_delete: Slet kommentar + label_query: Brugerdefineret forespørgsel + label_query_plural: Brugerdefinerede forespørgsler + label_query_new: Ny forespørgsel + label_filter_add: Tilføj filter + label_filter_plural: Filtre + label_equals: er + label_not_equals: er ikke + label_in_less_than: er mindre end + label_in_more_than: er større end + label_in: indeholdt i + label_today: i dag + label_all_time: altid + label_yesterday: i går + label_this_week: denne uge + label_last_week: sidste uge + label_last_n_days: "sidste %{count} dage" + label_this_month: denne måned + label_last_month: sidste måned + label_this_year: dette år + label_date_range: Dato interval + label_less_than_ago: mindre end dage siden + label_more_than_ago: mere end dage siden + label_ago: dage siden + label_contains: indeholder + label_not_contains: ikke indeholder + label_day_plural: dage + label_repository: Repository + label_repository_plural: Repositories + label_browse: Gennemse + label_revision: Revision + label_revision_plural: Revisioner + label_associated_revisions: Tilknyttede revisioner + label_added: tilføjet + label_modified: ændret + label_deleted: slettet + label_latest_revision: Seneste revision + label_latest_revision_plural: Seneste revisioner + label_view_revisions: Se revisioner + label_max_size: Maksimal størrelse + label_sort_highest: Flyt til toppen + label_sort_higher: Flyt op + label_sort_lower: Flyt ned + label_sort_lowest: Flyt til bunden + label_roadmap: Roadmap + label_roadmap_due_in: Deadline + label_roadmap_overdue: "%{value} forsinket" + label_roadmap_no_issues: Ingen sager i denne version + label_search: Søg + label_result_plural: Resultater + label_all_words: Alle ord + label_wiki: Wiki + label_wiki_edit: Wiki ændring + label_wiki_edit_plural: Wiki ændringer + label_wiki_page: Wiki side + label_wiki_page_plural: Wiki sider + label_index_by_title: Indhold efter titel + label_index_by_date: Indhold efter dato + label_current_version: Nuværende version + label_preview: Forhåndsvisning + label_feed_plural: Feeds + label_changes_details: Detaljer for alle ændringer + label_issue_tracking: Sagssøgning + label_spent_time: Anvendt tid + label_f_hour: "%{value} time" + label_f_hour_plural: "%{value} timer" + label_time_tracking: Tidsstyring + label_change_plural: Ændringer + label_statistics: Statistik + label_commits_per_month: Commits pr. måned + label_commits_per_author: Commits pr. bruger + label_view_diff: Vis forskelle + label_diff_inline: inline + label_diff_side_by_side: side om side + label_options: Formatering + label_copy_workflow_from: Kopier arbejdsgang fra + label_permissions_report: Godkendelsesrapport + label_watched_issues: Overvågede sager + label_related_issues: Relaterede sager + label_applied_status: Anvendte statusser + label_loading: Indlæser... + label_relation_new: Ny relation + label_relation_delete: Slet relation + label_relates_to: relaterer til + label_duplicates: duplikater + label_blocks: blokerer + label_blocked_by: blokeret af + label_precedes: kommer før + label_follows: følger + label_stay_logged_in: Forbliv indlogget + label_disabled: deaktiveret + label_show_completed_versions: Vis færdige versioner + label_me: mig + label_board: Forum + label_board_new: Nyt forum + label_board_plural: Fora + label_topic_plural: Emner + label_message_plural: Beskeder + label_message_last: Sidste besked + label_message_new: Ny besked + label_message_posted: Besked tilføjet + label_reply_plural: Besvarer + label_send_information: Send konto information til bruger + label_year: År + label_month: Måned + label_week: Uge + label_date_from: Fra + label_date_to: Til + label_language_based: Baseret på brugerens sprog + label_sort_by: "Sortér efter %{value}" + label_send_test_email: Send en test email + label_feeds_access_key_created_on: "Atom adgangsnøgle dannet for %{value} siden" + label_module_plural: Moduler + label_added_time_by: "Tilføjet af %{author} for %{age} siden" + label_updated_time: "Opdateret for %{value} siden" + label_jump_to_a_project: Skift til projekt... + label_file_plural: Filer + label_changeset_plural: Ændringer + label_default_columns: Standardkolonner + label_no_change_option: (Ingen ændringer) + label_bulk_edit_selected_issues: Masse-ret de valgte sager + label_theme: Tema + label_default: standard + label_search_titles_only: Søg kun i titler + label_user_mail_option_all: "For alle hændelser på mine projekter" + label_user_mail_option_selected: "For alle hændelser på de valgte projekter..." + label_user_mail_no_self_notified: "Jeg ønsker ikke besked om ændring foretaget af mig selv" + label_registration_activation_by_email: kontoaktivering på email + label_registration_manual_activation: manuel kontoaktivering + label_registration_automatic_activation: automatisk kontoaktivering + label_display_per_page: "Per side: %{value}" + label_age: Alder + label_change_properties: Ændre indstillinger + label_general: Generelt + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: LDAP-godkendelse + label_downloads_abbr: D/L + + button_login: Login + button_submit: Send + button_save: Gem + button_check_all: Vælg alt + button_uncheck_all: Fravælg alt + button_delete: Slet + button_create: Opret + button_test: Test + button_edit: Ret + button_add: Tilføj + button_change: Ændre + button_apply: Anvend + button_clear: Nulstil + button_lock: Lås + button_unlock: Lås op + button_download: Download + button_list: List + button_view: Vis + button_move: Flyt + button_back: Tilbage + button_cancel: Annullér + button_activate: Aktivér + button_sort: Sortér + button_log_time: Log tid + button_rollback: Tilbagefør til denne version + button_watch: Overvåg + button_unwatch: Stop overvågning + button_reply: Besvar + button_archive: Arkivér + button_unarchive: Fjern fra arkiv + button_reset: Nulstil + button_rename: Omdøb + button_change_password: Skift kodeord + button_copy: Kopiér + button_annotate: Annotér + button_update: Opdatér + button_configure: Konfigurér + + status_active: aktiv + status_registered: registreret + status_locked: låst + + text_select_mail_notifications: Vælg handlinger der skal sendes email besked for. + text_regexp_info: f.eks. ^[A-ZÆØÅ0-9]+$ + text_min_max_length_info: 0 betyder ingen begrænsninger + text_project_destroy_confirmation: Er du sikker på at du vil slette dette projekt og alle relaterede data? + text_workflow_edit: Vælg en rolle samt en type, for at redigere arbejdsgangen + text_are_you_sure: Er du sikker? + text_tip_issue_begin_day: opgaven begynder denne dag + text_tip_issue_end_day: opaven slutter denne dag + text_tip_issue_begin_end_day: opgaven begynder og slutter denne dag + text_caracters_maximum: "max %{count} karakterer." + text_caracters_minimum: "Skal være mindst %{count} karakterer lang." + text_length_between: "Længde skal være mellem %{min} og %{max} karakterer." + text_tracker_no_workflow: Ingen arbejdsgang defineret for denne type + text_unallowed_characters: Ikke-tilladte karakterer + text_comma_separated: Adskillige værdier tilladt (adskilt med komma). + text_issues_ref_in_commit_messages: Referer og løser sager i commit-beskeder + text_issue_added: "Sag %{id} er rapporteret af %{author}." + text_issue_updated: "Sag %{id} er blevet opdateret af %{author}." + text_wiki_destroy_confirmation: Er du sikker på at du vil slette denne wiki og dens indhold? + text_issue_category_destroy_question: "Nogle sager (%{count}) er tildelt denne kategori. Hvad ønsker du at gøre?" + text_issue_category_destroy_assignments: Slet tildelinger af kategori + text_issue_category_reassign_to: Tildel sager til denne kategori + text_user_mail_option: "For ikke-valgte projekter vil du kun modtage beskeder omhandlende ting du er involveret i eller overvåger (f.eks. sager du har indberettet eller ejer)." + text_no_configuration_data: "Roller, typer, sagsstatusser og arbejdsgange er endnu ikke konfigureret.\nDet er anbefalet at indlæse standardopsætningen. Du vil kunne ændre denne når den er indlæst." + text_load_default_configuration: Indlæs standardopsætningen + text_status_changed_by_changeset: "Anvendt i ændring %{value}." + text_issues_destroy_confirmation: 'Er du sikker på du ønsker at slette den/de valgte sag(er)?' + text_select_project_modules: 'Vælg moduler er skal være aktiveret for dette projekt:' + text_default_administrator_account_changed: Standardadministratorkonto ændret + text_file_repository_writable: Filarkiv er skrivbar + text_rmagick_available: RMagick tilgængelig (valgfri) + + default_role_manager: Leder + default_role_developer: Udvikler + default_role_reporter: Rapportør + default_tracker_bug: Fejl + default_tracker_feature: Funktion + default_tracker_support: Support + default_issue_status_new: Ny + default_issue_status_in_progress: Igangværende + default_issue_status_resolved: Løst + default_issue_status_feedback: Feedback + default_issue_status_closed: Lukket + default_issue_status_rejected: Afvist + default_doc_category_user: Brugerdokumentation + default_doc_category_tech: Teknisk dokumentation + default_priority_low: Lav + default_priority_normal: Normal + default_priority_high: Høj + default_priority_urgent: Akut + default_priority_immediate: Omgående + default_activity_design: Design + default_activity_development: Udvikling + + enumeration_issue_priorities: Sagsprioriteter + enumeration_doc_categories: Dokumentkategorier + enumeration_activities: Aktiviteter (tidsstyring) + + label_add_another_file: Tilføj endnu en fil + label_chronological_order: I kronologisk rækkefølge + setting_activity_days_default: Antal dage der vises under projektaktivitet + text_destroy_time_entries_question: "%{hours} timer er registreret på denne sag som du er ved at slette. Hvad vil du gøre?" + error_issue_not_found_in_project: 'Sagen blev ikke fundet eller tilhører ikke dette projekt' + text_assign_time_entries_to_project: Tildel raporterede timer til projektet + setting_display_subprojects_issues: Vis sager for underprojekter på hovedprojektet som standard + label_optional_description: Valgfri beskrivelse + text_destroy_time_entries: Slet registrerede timer + field_comments_sorting: Vis kommentar + text_reassign_time_entries: 'Tildel registrerede timer til denne sag igen' + label_reverse_chronological_order: I omvendt kronologisk rækkefølge + label_preferences: Præferencer + label_overall_activity: Overordnet aktivitet + setting_default_projects_public: Nye projekter er offentlige som standard + error_scm_annotate: "Filen findes ikke, eller kunne ikke annoteres." + text_subprojects_destroy_warning: "Dets underprojekter(er): %{value} vil også blive slettet." + permission_edit_issues: Redigér sager + setting_diff_max_lines_displayed: Højeste antal forskelle der vises + permission_edit_own_issue_notes: Redigér egne noter + setting_enabled_scm: Aktiveret SCM + button_quote: Citér + permission_view_files: Se filer + permission_add_issues: Tilføj sager + permission_edit_own_messages: Redigér egne beskeder + permission_delete_own_messages: Slet egne beskeder + permission_manage_public_queries: Administrér offentlig forespørgsler + permission_log_time: Registrér anvendt tid + label_renamed: omdøbt + label_incoming_emails: Indkommende emails + permission_view_changesets: Se ændringer + permission_manage_versions: Administrér versioner + permission_view_time_entries: Se anvendt tid + label_generate_key: Generér en nøglefil + permission_manage_categories: Administrér sagskategorier + permission_manage_wiki: Administrér wiki + setting_sequential_project_identifiers: Generér sekventielle projekt-identifikatorer + setting_plain_text_mail: Emails som almindelig tekst (ingen HTML) + field_parent_title: Siden over + text_email_delivery_not_configured: "Email-afsendelse er ikke indstillet og notifikationer er defor slået fra.\nKonfigurér din SMTP server i config/configuration.yml og genstart applikationen for at aktivere email-afsendelse." + permission_protect_wiki_pages: Beskyt wiki sider + permission_add_issue_watchers: Tilføj overvågere + warning_attachments_not_saved: "der var %{count} fil(er), som ikke kunne gemmes." + permission_comment_news: Kommentér nyheder + text_enumeration_category_reassign_to: 'Flyt dem til denne værdi:' + permission_select_project_modules: Vælg projektmoduler + permission_view_gantt: Se Gantt diagram + permission_delete_messages: Slet beskeder + permission_move_issues: Flyt sager + permission_edit_wiki_pages: Redigér wiki sider + label_user_activity: "%{value}'s aktivitet" + permission_manage_issue_relations: Administrér sags-relationer + label_issue_watchers: Overvågere + permission_delete_wiki_pages: Slet wiki sider + notice_unable_delete_version: Kan ikke slette versionen. + permission_view_wiki_edits: Se wiki historik + field_editable: Redigérbar + label_duplicated_by: dubleret af + permission_manage_boards: Administrér fora + permission_delete_wiki_pages_attachments: Slet filer vedhæftet wiki sider + permission_view_messages: Se beskeder + text_enumeration_destroy_question: "%{count} objekter er tildelt denne værdi." + permission_manage_files: Administrér filer + permission_add_messages: Opret beskeder + permission_edit_issue_notes: Redigér noter + permission_manage_news: Administrér nyheder + text_plugin_assets_writable: Der er skriverettigheder til plugin assets folderen + label_display: Vis + label_and_its_subprojects: "%{value} og dets underprojekter" + permission_view_calendar: Se kalender + button_create_and_continue: Opret og fortsæt + setting_gravatar_enabled: Anvend Gravatar brugerikoner + label_updated_time_by: "Opdateret af %{author} for %{age} siden" + text_diff_truncated: '... Listen over forskelle er blevet afkortet da den overstiger den maksimale størrelse der kan vises.' + text_user_wrote: "%{value} skrev:" + setting_mail_handler_api_enabled: Aktiver webservice for indkomne emails + permission_delete_issues: Slet sager + permission_view_documents: Se dokumenter + permission_browse_repository: Gennemse repository + permission_manage_repository: Administrér repository + permission_manage_members: Administrér medlemmer + mail_subject_reminder: "%{count} sag(er) har deadline i de kommende dage (%{days})" + permission_add_issue_notes: Tilføj noter + permission_edit_messages: Redigér beskeder + permission_view_issue_watchers: Se liste over overvågere + permission_commit_access: Commit adgang + setting_mail_handler_api_key: API nøgle + label_example: Eksempel + permission_rename_wiki_pages: Omdøb wiki sider + text_custom_field_possible_values_info: 'En linje for hver værdi' + permission_view_wiki_pages: Se wiki + permission_edit_project: Redigér projekt + permission_save_queries: Gem forespørgsler + label_copied: kopieret + text_repository_usernames_mapping: "Vælg eller opdatér de Redmine brugere der svarer til de enkelte brugere fundet i repository loggen.\nBrugere med samme brugernavn eller email adresse i både Redmine og det valgte repository bliver automatisk koblet sammen." + permission_edit_time_entries: Redigér tidsregistreringer + general_csv_decimal_separator: ',' + permission_edit_own_time_entries: Redigér egne tidsregistreringer + setting_repository_log_display_limit: Højeste antal revisioner vist i fil-log + setting_file_max_size_displayed: Maksimale størrelse på tekstfiler vist inline + field_watcher: Overvåger + setting_openid: Tillad OpenID login og registrering + field_identity_url: OpenID URL + label_login_with_open_id_option: eller login med OpenID + setting_per_page_options: Enheder per side muligheder + mail_body_reminder: "%{count} sage(er) som er tildelt dig har deadline indenfor de næste %{days} dage:" + field_content: Indhold + label_descending: Aftagende + label_sort: Sortér + label_ascending: Tiltagende + label_date_from_to: Fra %{start} til %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Denne side har %{descendants} underside(r) og afledte. Hvad vil du gøre? + text_wiki_page_reassign_children: Flyt undersider til denne side + text_wiki_page_nullify_children: Behold undersider som rod-sider + text_wiki_page_destroy_children: Slet undersider ogalle deres afledte sider. + setting_password_min_length: Mindste længde på kodeord + field_group_by: Gruppér resultater efter + mail_subject_wiki_content_updated: "'%{id}' wikisiden er blevet opdateret" + label_wiki_content_added: Wiki side tilføjet + mail_subject_wiki_content_added: "'%{id}' wikisiden er blevet tilføjet" + mail_body_wiki_content_added: The '%{id}' wikiside er blevet tilføjet af %{author}. + label_wiki_content_updated: Wikiside opdateret + mail_body_wiki_content_updated: Wikisiden '%{id}' er blevet opdateret af %{author}. + permission_add_project: Opret projekt + setting_new_project_user_role_id: Denne rolle gives til en bruger, som ikke er administrator, og som opretter et projekt + label_view_all_revisions: Se alle revisioner + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: Der er ingen sagshåndtering for dette projekt. Kontrollér venligst projektindstillingerne. + error_no_default_issue_status: Der er ikke defineret en standardstatus. Kontrollér venligst indstillingerne (gå til "Administration -> Sagsstatusser"). + text_journal_changed: "%{label} ændret fra %{old} til %{new}" + text_journal_set_to: "%{label} sat til %{value}" + text_journal_deleted: "%{label} slettet (%{old})" + label_group_plural: Grupper + label_group: Grupper + label_group_new: Ny gruppe + label_time_entry_plural: Anvendt tid + text_journal_added: "%{label} %{value} tilføjet" + field_active: Aktiv + enumeration_system_activity: System Aktivitet + permission_delete_issue_watchers: Slet overvågere + version_status_closed: lukket + version_status_locked: låst + version_status_open: åben + error_can_not_reopen_issue_on_closed_version: En sag tildelt en lukket version kan ikke genåbnes + label_user_anonymous: Anonym + button_move_and_follow: Flyt og overvåg + setting_default_projects_modules: Standard moduler, aktiveret for nye projekter + setting_gravatar_default: Standard Gravatar billede + field_sharing: Delning + label_version_sharing_hierarchy: Med projekthierarki + label_version_sharing_system: Med alle projekter + label_version_sharing_descendants: Med underprojekter + label_version_sharing_tree: Med projekttræ + label_version_sharing_none: Ikke delt + error_can_not_archive_project: Dette projekt kan ikke arkiveres + button_duplicate: Duplikér + button_copy_and_follow: Kopiér og overvåg + label_copy_source: Kilde + setting_issue_done_ratio: Beregn sagsløsning ratio + setting_issue_done_ratio_issue_status: Benyt sagsstatus + error_issue_done_ratios_not_updated: Sagsløsnings ratio, ikke opdateret. + error_workflow_copy_target: Vælg venligst måltracker og rolle(r) + setting_issue_done_ratio_issue_field: Benyt sagsfelt + label_copy_same_as_target: Samme som mål + label_copy_target: Mål + notice_issue_done_ratios_updated: Sagsløsningsratio opdateret. + error_workflow_copy_source: Vælg venligst en kildetracker eller rolle + label_update_issue_done_ratios: Opdater sagsløsningsratio + setting_start_of_week: Start kalendre på + permission_view_issues: Vis sager + label_display_used_statuses_only: Vis kun statusser der er benyttet af denne tracker + label_revision_id: Revision %{value} + label_api_access_key: API nøgle + label_api_access_key_created_on: API nøgle genereret %{value} siden + label_feeds_access_key: Atom nøgle + notice_api_access_key_reseted: Din API nøgle er nulstillet. + setting_rest_api_enabled: Aktiver REST web service + label_missing_api_access_key: Mangler en API nøgle + label_missing_feeds_access_key: Mangler en Atom nøgle + button_show: Vis + text_line_separated: Flere væredier tilladt (en linje for hver værdi). + setting_mail_handler_body_delimiters: Trunkér emails efter en af disse linjer + permission_add_subprojects: Lav underprojekter + label_subproject_new: Nyt underprojekt + text_own_membership_delete_confirmation: |- + Du er ved at fjerne en eller flere af dine rettigheder, og kan muligvis ikke redigere projektet bagefter. + Er du sikker på du ønsker at fortsætte? + label_close_versions: Luk færdige versioner + label_board_sticky: Klistret + label_board_locked: Låst + permission_export_wiki_pages: Eksporter wiki sider + setting_cache_formatted_text: Cache formatteret tekst + permission_manage_project_activities: Administrer projektaktiviteter + error_unable_delete_issue_status: Det var ikke muligt at slette sagsstatus + label_profile: Profil + permission_manage_subtasks: Administrer underopgaver + field_parent_issue: Hovedopgave + label_subtask_plural: Underopgaver + label_project_copy_notifications: Send email notifikationer, mens projektet kopieres + error_can_not_delete_custom_field: Kan ikke slette brugerdefineret felt + error_unable_to_connect: Kan ikke forbinde (%{value}) + error_can_not_remove_role: Denne rolle er i brug og kan ikke slettes. + error_can_not_delete_tracker: Denne type indeholder sager og kan ikke slettes. + field_principal: Principal + notice_failed_to_save_members: "Fejl under lagring af medlem(mer): %{errors}." + text_zoom_out: Zoom ud + text_zoom_in: Zoom ind + notice_unable_delete_time_entry: Kan ikke slette tidsregistrering. + label_overall_spent_time: Overordnet forbrug af tid + field_time_entries: Log tid + project_module_gantt: Gantt + project_module_calendar: Kalender + button_edit_associated_wikipage: "Redigér tilknyttet Wiki side: %{page_title}" + field_text: Tekstfelt + setting_default_notification_option: Standardpåmindelsesmulighed + label_user_mail_option_only_my_events: Kun for ting jeg overvåger eller er involveret i + label_user_mail_option_none: Ingen hændelser + field_member_of_group: Medlem af gruppe + field_assigned_to_role: Medlem af rolle + notice_not_authorized_archived_project: Projektet du prøver at tilgå, er blevet arkiveret. + label_principal_search: "Søg efter bruger eller gruppe:" + label_user_search: "Søg efter bruger:" + field_visible: Synlig + setting_commit_logtime_activity_id: Aktivitet for registreret tid + text_time_logged_by_changeset: Anvendt i changeset %{value}. + setting_commit_logtime_enabled: Aktiver tidsregistrering + notice_gantt_chart_truncated: Kortet er blevet afkortet, fordi det overstiger det maksimale antal elementer, der kan vises (%{max}) + setting_gantt_items_limit: Maksimalt antal af elementer der kan vises på gantt kortet + + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Kodning af Commit beskeder + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 sag + one: 1 sag + other: "%{count} sager" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: alle + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Med underprojekter + label_cross_project_tree: Med projekttræ + label_cross_project_hierarchy: Med projekthierarki + label_cross_project_system: Med alle projekter + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Total + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overordnet forbrug af tid + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API nøgle + setting_lost_password: Glemt kodeord + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/de.yml b/config/locales/de.yml new file mode 100644 index 0000000..f01b4d2 --- /dev/null +++ b/config/locales/de.yml @@ -0,0 +1,1229 @@ +# German translations for Ruby on Rails +# by Clemens Kofler (clemens@railway.at) +# additions for Redmine 1.2 by Jens Martsch (jmartsch@gmail.com) + +de: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d.%m.%Y" + short: "%e. %b" + long: "%e. %B %Y" + + day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag] + abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember] + abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d.%m.%Y %H:%M" + time: "%H:%M" + short: "%e. %b %H:%M" + long: "%A, %e. %B %Y, %H:%M Uhr" + am: "vormittags" + pm: "nachmittags" + + datetime: + distance_in_words: + half_a_minute: 'eine halbe Minute' + less_than_x_seconds: + one: 'weniger als 1 Sekunde' + other: 'weniger als %{count} Sekunden' + x_seconds: + one: '1 Sekunde' + other: '%{count} Sekunden' + less_than_x_minutes: + one: 'weniger als 1 Minute' + other: 'weniger als %{count} Minuten' + x_minutes: + one: '1 Minute' + other: '%{count} Minuten' + about_x_hours: + one: 'etwa 1 Stunde' + other: 'etwa %{count} Stunden' + x_hours: + one: "1 Stunde" + other: "%{count} Stunden" + x_days: + one: '1 Tag' + other: '%{count} Tagen' + about_x_months: + one: 'etwa 1 Monat' + other: 'etwa %{count} Monaten' + x_months: + one: '1 Monat' + other: '%{count} Monaten' + about_x_years: + one: 'etwa 1 Jahr' + other: 'etwa %{count} Jahren' + over_x_years: + one: 'mehr als 1 Jahr' + other: 'mehr als %{count} Jahren' + almost_x_years: + one: "fast 1 Jahr" + other: "fast %{count} Jahren" + + number: + # Default format for numbers + format: + separator: ',' + delimiter: '.' + precision: 2 + currency: + format: + unit: '€' + format: '%n %u' + delimiter: '' + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "und" + skip_last_comma: true + + activerecord: + errors: + template: + header: + one: "Dieses %{model}-Objekt konnte nicht gespeichert werden: %{count} Fehler." + other: "Dieses %{model}-Objekt konnte nicht gespeichert werden: %{count} Fehler." + body: "Bitte überprüfen Sie die folgenden Felder:" + + messages: + inclusion: "ist kein gültiger Wert" + exclusion: "ist nicht verfügbar" + invalid: "ist nicht gültig" + confirmation: "stimmt nicht mit der Bestätigung überein" + accepted: "muss akzeptiert werden" + empty: "muss ausgefüllt werden" + blank: "muss ausgefüllt werden" + too_long: "ist zu lang (nicht mehr als %{count} Zeichen)" + too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)" + wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)" + taken: "ist bereits vergeben" + not_a_number: "ist keine Zahl" + not_a_date: "ist kein gültiges Datum" + greater_than: "muss größer als %{count} sein" + greater_than_or_equal_to: "muss größer oder gleich %{count} sein" + equal_to: "muss genau %{count} sein" + less_than: "muss kleiner als %{count} sein" + less_than_or_equal_to: "muss kleiner oder gleich %{count} sein" + odd: "muss ungerade sein" + even: "muss gerade sein" + greater_than_start_date: "muss größer als Anfangsdatum sein" + not_same_project: "gehört nicht zum selben Projekt" + circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen" + cant_link_an_issue_with_a_descendant: "Ein Ticket kann nicht mit einer Ihrer Unteraufgaben verlinkt werden" + earlier_than_minimum_start_date: "kann wegen eines Vorgängertickets nicht vor %{date} liegen" + not_a_regexp: "Ist kein korrekter regulärer Ausdruck" + open_issue_with_closed_parent: "Ein offenes Ticket kann nicht an einen geschlossenen Vater gehängt werden" + + actionview_instancetag_blank_option: Bitte auswählen + + button_activate: Aktivieren + button_add: Hinzufügen + button_annotate: Annotieren + button_apply: Anwenden + button_archive: Archivieren + button_back: Zurück + button_cancel: Abbrechen + button_change: Wechseln + button_change_password: Passwort ändern + button_check_all: Alles auswählen + button_clear: Zurücksetzen + button_close: Schließen + button_collapse_all: Alle einklappen + button_configure: Konfigurieren + button_copy: Kopieren + button_copy_and_follow: Kopieren und Ticket anzeigen + button_create: Anlegen + button_create_and_continue: Anlegen und weiter + button_delete: Löschen + button_delete_my_account: Mein Benutzerkonto löschen + button_download: Herunterladen + button_duplicate: Duplizieren + button_edit: Bearbeiten + button_edit_associated_wikipage: "Zugehörige Wikiseite bearbeiten: %{page_title}" + button_edit_section: Diesen Bereich bearbeiten + button_expand_all: Alle ausklappen + button_export: Exportieren + button_hide: Verstecken + button_list: Liste + button_lock: Sperren + button_log_time: Aufwand buchen + button_login: Anmelden + button_move: Verschieben + button_move_and_follow: Verschieben und Ticket anzeigen + button_quote: Zitieren + button_rename: Umbenennen + button_reopen: Öffnen + button_reply: Antworten + button_reset: Zurücksetzen + button_rollback: Auf diese Version zurücksetzen + button_save: Speichern + button_show: Anzeigen + button_sort: Sortieren + button_submit: OK + button_test: Testen + button_unarchive: Entarchivieren + button_uncheck_all: Alles abwählen + button_unlock: Entsperren + button_unwatch: Nicht beobachten + button_update: Aktualisieren + button_view: Anzeigen + button_watch: Beobachten + + default_activity_design: Design + default_activity_development: Entwicklung + default_doc_category_tech: Technische Dokumentation + default_doc_category_user: Benutzerdokumentation + default_issue_status_closed: Erledigt + default_issue_status_feedback: Feedback + default_issue_status_in_progress: In Bearbeitung + default_issue_status_new: Neu + default_issue_status_rejected: Abgewiesen + default_issue_status_resolved: Gelöst + default_priority_high: Hoch + default_priority_immediate: Sofort + default_priority_low: Niedrig + default_priority_normal: Normal + default_priority_urgent: Dringend + default_role_developer: Entwickler + default_role_manager: Manager + default_role_reporter: Reporter + default_tracker_bug: Fehler + default_tracker_feature: Feature + default_tracker_support: Unterstützung + + description_all_columns: Alle Spalten + description_available_columns: Verfügbare Spalten + description_choose_project: Projekte + description_filter: Filter + description_issue_category_reassign: Neue Kategorie wählen + description_message_content: Nachrichteninhalt + description_notes: Kommentare + description_project_scope: Suchbereich + description_query_sort_criteria_attribute: Sortierattribut + description_query_sort_criteria_direction: Sortierrichtung + description_search: Suchfeld + description_selected_columns: Ausgewählte Spalten + + description_user_mail_notification: Mailbenachrichtigungseinstellung + description_wiki_subpages_reassign: Neue Elternseite wählen + + enumeration_activities: Aktivitäten (Zeiterfassung) + enumeration_doc_categories: Dokumentenkategorien + enumeration_issue_priorities: Ticket-Prioritäten + enumeration_system_activity: System-Aktivität + + error_attachment_too_big: Diese Datei kann nicht hochgeladen werden, da sie die maximale Dateigröße von (%{max_size}) überschreitet. + error_can_not_archive_project: Dieses Projekt kann nicht archiviert werden. + error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen. + error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden. + error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden. + error_can_not_reopen_issue_on_closed_version: Das Ticket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden. + error_can_t_load_default_data: "Die Standard-Konfiguration konnte nicht geladen werden: %{value}" + error_issue_done_ratios_not_updated: Der Ticket-Fortschritt wurde nicht aktualisiert. + error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.' + error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Ticket-Status"). + error_no_tracker_in_project: Diesem Projekt ist kein Tracker zugeordnet. Bitte überprüfen Sie die Projekteinstellungen. + error_scm_annotate: "Der Eintrag existiert nicht oder kann nicht annotiert werden." + error_scm_annotate_big_text_file: Der Eintrag kann nicht umgesetzt werden, da er die maximale Textlänge überschreitet. + error_scm_command_failed: "Beim Zugriff auf das Repository ist ein Fehler aufgetreten: %{value}" + error_scm_not_found: Eintrag und/oder Revision existiert nicht im Repository. + error_session_expired: Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an. + error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden." + error_unable_to_connect: Fehler beim Verbinden (%{value}) + error_workflow_copy_source: Bitte wählen Sie einen Quell-Tracker und eine Quell-Rolle. + error_workflow_copy_target: Bitte wählen Sie die Ziel-Tracker und -Rollen. + error_move_of_child_not_possible: "Unteraufgabe %{child} konnte nicht in das neue Projekt verschoben werden: %{errors}" + + field_account: Konto + field_active: Aktiv + field_activity: Aktivität + field_admin: Administrator + field_assignable: Tickets können dieser Rolle zugewiesen werden + field_assigned_to: Zugewiesen an + field_assigned_to_role: Zuständigkeitsrolle + field_attr_firstname: Vorname-Attribut + field_attr_lastname: Name-Attribut + field_attr_login: Mitgliedsname-Attribut + field_attr_mail: E-Mail-Attribut + field_auth_source: Authentifizierungs-Modus + field_auth_source_ldap_filter: LDAP-Filter + field_author: Autor + field_base_dn: Base DN + field_board_parent: Übergeordnetes Forum + field_category: Kategorie + field_column_names: Spalten + field_closed_on: Geschlossen am + field_comments: Kommentar + field_comments_sorting: Kommentare anzeigen + field_commit_logs_encoding: Kodierung der Commit-Nachrichten + field_content: Inhalt + field_core_fields: Standardwerte + field_created_on: Angelegt + field_cvs_module: Modul + field_cvsroot: CVSROOT + field_default_value: Standardwert + field_default_status: Standardstatus + field_delay: Pufferzeit + field_description: Beschreibung + field_done_ratio: "% erledigt" + field_downloads: Downloads + field_due_date: Abgabedatum + field_editable: Bearbeitbar + field_effective_date: Datum + field_estimated_hours: Geschätzter Aufwand + field_field_format: Format + field_filename: Datei + field_filesize: Größe + field_firstname: Vorname + field_fixed_version: Zielversion + field_generate_password: Passwort generieren + field_group_by: Gruppiere Ergebnisse nach + field_hide_mail: E-Mail-Adresse nicht anzeigen + field_homepage: Projekt-Homepage + field_host: Host + field_hours: Stunden + field_identifier: Kennung + field_identity_url: OpenID-URL + field_inherit_members: Benutzer erben + field_is_closed: Ticket geschlossen + field_is_default: Standardeinstellung + field_is_filter: Als Filter benutzen + field_is_for_all: Für alle Projekte + field_is_in_roadmap: In der Roadmap anzeigen + field_is_private: Privat + field_is_public: Öffentlich + field_is_required: Erforderlich + field_issue: Ticket + field_issue_to: Zugehöriges Ticket + field_issues_visibility: Ticket-Sichtbarkeit + field_language: Sprache + field_last_login_on: Letzte Anmeldung + field_lastname: Nachname + field_login: Mitgliedsname + field_mail: E-Mail + field_mail_notification: Mailbenachrichtigung + field_max_length: Maximale Länge + field_member_of_group: Zuständigkeitsgruppe + field_min_length: Minimale Länge + field_multiple: Mehrere Werte + field_must_change_passwd: Passwort beim nächsten Login ändern + field_name: Name + field_new_password: Neues Passwort + field_notes: Kommentare + field_onthefly: On-the-fly-Benutzererstellung + field_parent: Unterprojekt von + field_parent_issue: Übergeordnete Aufgabe + field_parent_title: Übergeordnete Seite + field_password: Passwort + field_password_confirmation: Bestätigung + field_path_to_repository: Pfad zum Repository + field_port: Port + field_possible_values: Mögliche Werte + field_principal: Auftraggeber + field_priority: Priorität + field_private_notes: Privater Kommentar + field_project: Projekt + field_redirect_existing_links: Existierende Links umleiten + field_regexp: Regulärer Ausdruck + field_repository_is_default: Haupt-Repository + field_role: Rolle + field_root_directory: Wurzelverzeichnis + field_scm_path_encoding: Pfad-Kodierung + field_searchable: Durchsuchbar + field_sharing: Gemeinsame Verwendung + field_spent_on: Datum + field_start_date: Beginn + field_start_page: Hauptseite + field_status: Status + field_subject: Thema + field_subproject: Unterprojekt von + field_summary: Zusammenfassung + field_text: Textfeld + field_time_entries: Aufwand buchen + field_time_zone: Zeitzone + field_timeout: Auszeit (in Sekunden) + field_title: Titel + field_tracker: Tracker + field_type: Typ + field_updated_on: Aktualisiert + field_url: URL + field_user: Benutzer + field_users_visibility: Benutzer-Sichtbarkeit + field_value: Wert + field_version: Version + field_visible: Sichtbar + field_warn_on_leaving_unsaved: Vor dem Verlassen einer Seite mit ungesichertem Text im Editor warnen + field_watcher: Beobachter + field_default_assigned_to: Standardbearbeiter + + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-1 + general_csv_separator: ';' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + general_lang_name: 'German (Deutsch)' + general_text_No: 'Nein' + general_text_Yes: 'Ja' + general_text_no: 'nein' + general_text_yes: 'ja' + + label_activity: Aktivität + label_add_another_file: Eine weitere Datei hinzufügen + label_add_note: Kommentar hinzufügen + label_add_projects: Projekt hinzufügen + label_added: hinzugefügt + label_added_time_by: "Von %{author} vor %{age} hinzugefügt" + label_additional_workflow_transitions_for_assignee: Zusätzliche Berechtigungen wenn der Benutzer der Zugewiesene ist + label_additional_workflow_transitions_for_author: Zusätzliche Berechtigungen wenn der Benutzer der Autor ist + label_administration: Administration + label_age: Geändert vor + label_ago: vor + label_all: alle + label_all_time: gesamter Zeitraum + label_all_words: Alle Wörter + label_and_its_subprojects: "%{value} und dessen Unterprojekte" + label_any: alle + label_any_issues_in_project: irgendein Ticket im Projekt + label_any_issues_not_in_project: irgendein Ticket nicht im Projekt + label_api_access_key: API-Zugriffsschlüssel + label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor %{value} erstellt + label_applied_status: Zugewiesener Status + label_ascending: Aufsteigend + label_ask: Nachfragen + label_assigned_to_me_issues: Mir zugewiesene Tickets + label_associated_revisions: Zugehörige Revisionen + label_attachment: Datei + label_attachment_delete: Anhang löschen + label_attachment_new: Neue Datei + label_attachment_plural: Dateien + label_attribute: Attribut + label_attribute_of_assigned_to: "%{name} des Bearbeiters" + label_attribute_of_author: "%{name} des Autors" + label_attribute_of_fixed_version: "%{name} der Zielversion" + label_attribute_of_issue: "%{name} des Tickets" + label_attribute_of_project: "%{name} des Projekts" + label_attribute_of_user: "%{name} des Benutzers" + label_attribute_plural: Attribute + label_auth_source: Authentifizierungs-Modus + label_auth_source_new: Neuer Authentifizierungs-Modus + label_auth_source_plural: Authentifizierungs-Arten + label_authentication: Authentifizierung + label_between: zwischen + label_blocked_by: Blockiert durch + label_blocks: Blockiert + label_board: Forum + label_board_locked: Gesperrt + label_board_new: Neues Forum + label_board_plural: Foren + label_board_sticky: Wichtig (immer oben) + label_boolean: Boolean + label_branch: Zweig + label_browse: Codebrowser + label_bulk_edit_selected_issues: Alle ausgewählten Tickets bearbeiten + label_bulk_edit_selected_time_entries: Ausgewählte Zeitaufwände bearbeiten + label_calendar: Kalender + label_change_plural: Änderungen + label_change_properties: Eigenschaften ändern + label_change_status: Statuswechsel + label_change_view_all: Alle Änderungen anzeigen + label_changes_details: Details aller Änderungen + label_changeset_plural: Changesets + label_checkboxes: Checkboxen + label_check_for_updates: Auf Updates prüfen + label_child_revision: Nachfolger + label_chronological_order: in zeitlicher Reihenfolge + label_close_versions: Vollständige Versionen schließen + label_closed_issues: geschlossen + label_closed_issues_plural: geschlossen + label_comment: Kommentar + label_comment_add: Kommentar hinzufügen + label_comment_added: Kommentar hinzugefügt + label_comment_delete: Kommentar löschen + label_comment_plural: Kommentare + label_commits_per_author: Übertragungen pro Autor + label_commits_per_month: Übertragungen pro Monat + label_completed_versions: Abgeschlossene Versionen + label_confirmation: Bestätigung + label_contains: enthält + label_copied: kopiert + label_copied_from: Kopiert von + label_copied_to: Kopiert nach + label_copy_attachments: Anhänge kopieren + label_copy_same_as_target: So wie das Ziel + label_copy_source: Quelle + label_copy_subtasks: Unteraufgaben kopieren + label_copy_target: Ziel + label_copy_workflow_from: Workflow kopieren von + label_cross_project_descendants: Mit Unterprojekten + label_cross_project_hierarchy: Mit Projekthierarchie + label_cross_project_system: Mit allen Projekten + label_cross_project_tree: Mit Projektbaum + label_current_status: Gegenwärtiger Status + label_current_version: Gegenwärtige Version + label_custom_field: Benutzerdefiniertes Feld + label_custom_field_new: Neues Feld + label_custom_field_plural: Benutzerdefinierte Felder + label_custom_field_select_type: Bitte wählen Sie den Objekttyp, zu dem das benutzerdefinierte Feld hinzugefügt werden soll + label_date: Datum + label_date_from: Von + label_date_from_to: von %{start} bis %{end} + label_date_range: Zeitraum + label_date_to: Bis + label_day_plural: Tage + label_default: Standard + label_default_columns: Standard-Spalten + label_deleted: gelöscht + label_descending: Absteigend + label_details: Details + label_diff: diff + label_diff_inline: einspaltig + label_diff_side_by_side: nebeneinander + label_disabled: gesperrt + label_display: Anzeige + label_display_per_page: "Pro Seite: %{value}" + label_display_used_statuses_only: Zeige nur Status an, die von diesem Tracker verwendet werden + label_document: Dokument + label_document_added: Dokument hinzugefügt + label_document_new: Neues Dokument + label_document_plural: Dokumente + label_downloads_abbr: D/L + label_drop_down_list: Dropdown-Liste + label_duplicated_by: Dupliziert durch + label_duplicates: Duplikat von + label_edit_attachments: Angehängte Dateien bearbeiten + label_enumeration_new: Neuer Wert + label_enumerations: Aufzählungen + label_environment: Umgebung + label_equals: ist + label_example: Beispiel + label_export_options: "%{export_format} Export-Eigenschaften" + label_export_to: "Auch abrufbar als:" + label_f_hour: "%{value} Stunde" + label_f_hour_plural: "%{value} Stunden" + label_feed_plural: Feeds + label_feeds_access_key: Atom-Zugriffsschlüssel + label_feeds_access_key_created_on: "Atom-Zugriffsschlüssel vor %{value} erstellt" + label_fields_permissions: Feldberechtigungen + label_file_added: Datei hinzugefügt + label_file_plural: Dateien + label_filter_add: Filter hinzufügen + label_filter_plural: Filter + label_float: Fließkommazahl + label_follows: Nachfolger von + label_gantt: Gantt-Diagramm + label_gantt_progress_line: Fortschrittslinie + label_general: Allgemein + label_generate_key: Generieren + label_git_report_last_commit: Bericht des letzten Commits für Dateien und Verzeichnisse + label_greater_or_equal: ">=" + label_group: Gruppe + label_group_anonymous: Anonyme Benutzer + label_group_new: Neue Gruppe + label_group_non_member: Nichtmitglieder + label_group_plural: Gruppen + label_help: Hilfe + label_hidden: Versteckt + label_history: Historie + label_home: Hauptseite + label_in: in + label_in_less_than: in weniger als + label_in_more_than: in mehr als + label_in_the_next_days: in den nächsten + label_in_the_past_days: in den letzten + label_incoming_emails: Eingehende E-Mails + label_index_by_date: Seiten nach Datum sortiert + label_index_by_title: Seiten nach Titel sortiert + label_information: Information + label_information_plural: Informationen + label_integer: Zahl + label_internal: Intern + label_issue: Ticket + label_issue_added: Ticket hinzugefügt + label_issue_assigned_to_updated: Bearbeiter aktualisiert + label_issue_category: Ticket-Kategorie + label_issue_category_new: Neue Kategorie + label_issue_category_plural: Ticket-Kategorien + label_issue_new: Neues Ticket + label_issue_note_added: Notiz hinzugefügt + label_issue_plural: Tickets + label_issue_priority_updated: Priorität aktualisiert + label_issue_status: Ticket-Status + label_issue_status_new: Neuer Status + label_issue_status_plural: Ticket-Status + label_issue_status_updated: Status aktualisiert + label_issue_tracking: Tickets + label_issue_updated: Ticket aktualisiert + label_issue_view_all: Alle Tickets anzeigen + label_issue_watchers: Beobachter + label_issues_by: "Tickets pro %{value}" + label_issues_visibility_all: Alle Tickets + label_issues_visibility_own: Tickets die folgender Benutzer erstellt hat oder die ihm zugewiesen sind + label_issues_visibility_public: Alle öffentlichen Tickets + label_item_position: "%{position}/%{count}" + label_jump_to_a_project: Zu einem Projekt springen... + label_language_based: Sprachabhängig + label_last_changes: "%{count} letzte Änderungen" + label_last_login: Letzte Anmeldung + label_last_month: voriger Monat + label_last_n_days: "die letzten %{count} Tage" + label_last_n_weeks: letzte %{count} Wochen + label_last_week: vorige Woche + label_latest_compatible_version: Letzte kompatible Version + label_latest_revision: Aktuellste Revision + label_latest_revision_plural: Aktuellste Revisionen + label_ldap_authentication: LDAP-Authentifizierung + label_less_or_equal: "<=" + label_less_than_ago: vor weniger als + label_link: Link + label_link_copied_issue: Kopierte Tickets verlinken + label_link_values_to: Werte mit URL verknüpfen + label_list: Liste + label_loading: Lade... + label_logged_as: Angemeldet als + label_login: Anmelden + label_login_with_open_id_option: oder mit OpenID anmelden + label_logout: Abmelden + label_only: nur + label_max_size: Maximale Größe + label_me: ich + label_member: Mitglied + label_member_new: Neues Mitglied + label_member_plural: Mitglieder + label_message_last: Letzter Forenbeitrag + label_message_new: Neues Thema + label_message_plural: Forenbeiträge + label_message_posted: Forenbeitrag hinzugefügt + label_min_max_length: Länge (Min. - Max.) + label_missing_api_access_key: Der API-Zugriffsschlüssel fehlt. + label_missing_feeds_access_key: Der Atom-Zugriffsschlüssel fehlt. + label_modified: geändert + label_module_plural: Module + label_month: Monat + label_months_from: Monate ab + label_more_than_ago: vor mehr als + label_my_account: Mein Konto + label_my_page: Meine Seite + label_my_projects: Meine Projekte + label_my_queries: Meine eigenen Abfragen + label_new: Neu + label_new_statuses_allowed: Neue Berechtigungen + label_news: News + label_news_added: News hinzugefügt + label_news_comment_added: Kommentar zu einer News hinzugefügt + label_news_latest: Letzte News + label_news_new: News hinzufügen + label_news_plural: News + label_news_view_all: Alle News anzeigen + label_next: Weiter + label_no_change_option: (Keine Änderung) + label_no_data: Nichts anzuzeigen + label_no_preview: Keine Vorschau verfügbar + label_no_preview_alternative_html: Keine Vorschau verfügbar. Sie können die Datei stattdessen %{link}. + label_no_preview_download: herunterladen + label_no_issues_in_project: keine Tickets im Projekt + label_nobody: Niemand + label_none: kein + label_not_contains: enthält nicht + label_not_equals: ist nicht + label_open_issues: offen + label_open_issues_plural: offen + label_optional_description: Beschreibung (optional) + label_options: Optionen + label_overall_activity: Aktivitäten aller Projekte anzeigen + label_overall_spent_time: Aufgewendete Zeit aller Projekte anzeigen + label_overview: Übersicht + label_parent_revision: Vorgänger + label_password_lost: Passwort vergessen + label_password_required: Bitte geben Sie Ihr Passwort ein + label_permissions: Berechtigungen + label_permissions_report: Berechtigungsübersicht + label_please_login: Anmelden + label_plugins: Plugins + label_precedes: Vorgänger von + label_preferences: Präferenzen + label_preview: Vorschau + label_previous: Zurück + label_principal_search: "Nach Benutzer oder Gruppe suchen:" + label_profile: Profil + label_project: Projekt + label_project_all: Alle Projekte + label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts. + label_project_latest: Neueste Projekte + label_project_new: Neues Projekt + label_project_plural: Projekte + label_public_projects: Öffentliche Projekte + label_query: Benutzerdefinierte Abfrage + label_query_new: Neue Abfrage + label_query_plural: Benutzerdefinierte Abfragen + label_radio_buttons: Radio-Buttons + label_read: Lesen... + label_readonly: Nur-Lese-Zugriff + label_register: Registrieren + label_registered_on: Angemeldet am + label_registration_activation_by_email: Kontoaktivierung durch E-Mail + label_registration_automatic_activation: Automatische Kontoaktivierung + label_registration_manual_activation: Manuelle Kontoaktivierung + label_related_issues: Zugehörige Tickets + label_relates_to: Beziehung mit + label_relation_delete: Beziehung löschen + label_relation_new: Neue Beziehung + label_renamed: umbenannt + label_reply_plural: Antworten + label_report: Bericht + label_report_plural: Berichte + label_reported_issues: Erstellte Tickets + label_repository: Repository + label_repository_new: Neues Repository + label_repository_plural: Repositories + label_required: Erforderlich + label_result_plural: Resultate + label_reverse_chronological_order: in umgekehrter zeitlicher Reihenfolge + label_revision: Revision + label_revision_id: Revision %{value} + label_revision_plural: Revisionen + label_roadmap: Roadmap + label_roadmap_due_in: "Fällig in %{value}" + label_roadmap_no_issues: Keine Tickets für diese Version + label_roadmap_overdue: "seit %{value} verspätet" + label_role: Rolle + label_role_and_permissions: Rollen und Rechte + label_role_anonymous: Anonym + label_role_new: Neue Rolle + label_role_non_member: Nichtmitglied + label_role_plural: Rollen + label_scm: Versionskontrollsystem + label_search: Suche + label_search_for_watchers: Nach hinzufügbaren Beobachtern suchen + label_search_titles_only: Nur Titel durchsuchen + label_send_information: Sende Kontoinformationen an Benutzer + label_send_test_email: Test-E-Mail senden + label_session_expiration: Ende einer Sitzung + label_settings: Konfiguration + label_show_closed_projects: Geschlossene Projekte anzeigen + label_show_completed_versions: Abgeschlossene Versionen anzeigen + label_sort: Sortierung + label_sort_by: "Sortiert nach %{value}" + label_sort_higher: Eins höher + label_sort_highest: An den Anfang + label_sort_lower: Eins tiefer + label_sort_lowest: Ans Ende + label_spent_time: Aufgewendete Zeit + label_statistics: Statistiken + label_status_transitions: Statusänderungen + label_stay_logged_in: Angemeldet bleiben + label_string: Text + label_subproject_new: Neues Unterprojekt + label_subproject_plural: Unterprojekte + label_subtask_plural: Unteraufgaben + label_tag: Markierung + label_text: Langer Text + label_theme: Design-Stil + label_this_month: aktueller Monat + label_this_week: aktuelle Woche + label_this_year: aktuelles Jahr + label_time_entry_plural: Benötigte Zeit + label_time_tracking: Zeiterfassung + label_today: heute + label_topic_plural: Themen + label_total: Gesamtzahl + label_total_time: Gesamtzeit + label_tracker: Tracker + label_tracker_new: Neuer Tracker + label_tracker_plural: Tracker + label_unknown_plugin: Unbekanntes Plugin + label_update_issue_done_ratios: Ticket-Fortschritt aktualisieren + label_updated_time: "Vor %{value} aktualisiert" + label_updated_time_by: "Von %{author} vor %{age} aktualisiert" + label_used_by: Benutzt von + label_user: Benutzer + label_user_activity: "Aktivität von %{value}" + label_user_anonymous: Anonym + label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe." + label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten" + label_user_mail_option_none: Keine Ereignisse + label_user_mail_option_only_my_events: Nur für Aufgaben die ich beobachte oder an welchen ich mitarbeite + label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten" + label_user_new: Neuer Benutzer + label_user_plural: Benutzer + label_user_search: "Nach Benutzer suchen:" + label_users_visibility_all: Alle aktiven Benutzer + label_users_visibility_members_of_visible_projects: Mitglieder von sichtbaren Projekten + label_version: Version + label_version_new: Neue Version + label_version_plural: Versionen + label_version_sharing_descendants: Mit Unterprojekten + label_version_sharing_hierarchy: Mit Projekthierarchie + label_version_sharing_none: Nicht gemeinsam verwenden + label_version_sharing_system: Mit allen Projekten + label_version_sharing_tree: Mit Projektbaum + label_view_all_revisions: Alle Revisionen anzeigen + label_view_diff: Unterschiede anzeigen + label_view_revisions: Revisionen anzeigen + label_visibility_private: nur für mich + label_visibility_public: für jeden Benutzer + label_visibility_roles: nur für diese Rollen + label_watched_issues: Beobachtete Tickets + label_week: Woche + label_wiki: Wiki + label_wiki_content_added: Wiki-Seite hinzugefügt + label_wiki_content_updated: Wiki-Seite aktualisiert + label_wiki_edit: Wiki-Bearbeitung + label_wiki_edit_plural: Wiki-Bearbeitungen + label_wiki_page: Wiki-Seite + label_wiki_page_plural: Wiki-Seiten + label_wiki_page_new: Neue Wiki-Seite + label_workflow: Workflow + label_x_closed_issues_abbr: + zero: 0 geschlossen + one: 1 geschlossen + other: "%{count} geschlossen" + label_x_comments: + zero: keine Kommentare + one: 1 Kommentar + other: "%{count} Kommentare" + label_x_issues: + zero: 0 Tickets + one: 1 Ticket + other: "%{count} Tickets" + label_x_open_issues_abbr: + zero: 0 offen + one: 1 offen + other: "%{count} offen" + label_x_projects: + zero: keine Projekte + one: 1 Projekt + other: "%{count} Projekte" + label_year: Jahr + label_yesterday: gestern + + mail_body_account_activation_request: "Ein neuer Benutzer (%{value}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:" + mail_body_account_information: Ihre Konto-Informationen + mail_body_account_information_external: "Sie können sich mit Ihrem Konto %{value} anmelden." + mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Passwort zu ändern:' + mail_body_register: 'Um Ihr Konto zu aktivieren, benutzen Sie folgenden Link:' + mail_body_reminder: "%{count} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:" + mail_body_wiki_content_added: "Die Wiki-Seite '%{id}' wurde von %{author} hinzugefügt." + mail_body_wiki_content_updated: "Die Wiki-Seite '%{id}' wurde von %{author} aktualisiert." + mail_subject_account_activation_request: "Antrag auf %{value} Kontoaktivierung" + mail_subject_lost_password: "Ihr %{value} Passwort" + mail_subject_register: "%{value} Kontoaktivierung" + mail_subject_reminder: "%{count} Tickets müssen in den nächsten %{days} Tagen abgegeben werden" + mail_subject_wiki_content_added: "Wiki-Seite '%{id}' hinzugefügt" + mail_subject_wiki_content_updated: "Wiki-Seite '%{id}' erfolgreich aktualisiert" + mail_subject_security_notification: "Sicherheitshinweis" + mail_body_security_notification_change: "%{field} wurde geändert." + mail_body_security_notification_change_to: "%{field} wurde geändert zu %{value}." + mail_body_security_notification_add: "%{field} %{value} wurde hinzugefügt." + mail_body_security_notification_remove: "%{field} %{value} wurde entfernt." + mail_body_security_notification_notify_enabled: "E-Mail-Adresse %{value} erhält nun Benachrichtigungen." + mail_body_security_notification_notify_disabled: "E-Mail-Adresse %{value} erhält keine Benachrichtigungen mehr." + + notice_account_activated: Ihr Konto ist aktiviert. Sie können sich jetzt anmelden. + notice_account_deleted: Ihr Benutzerkonto wurde unwiderruflich gelöscht. + notice_account_invalid_credentials: Benutzer oder Passwort ist ungültig. + notice_account_lost_email_sent: Eine E-Mail mit Anweisungen, ein neues Passwort zu wählen, wurde Ihnen geschickt. + notice_account_locked: Ihr Konto ist gesperrt. + notice_account_not_activated_yet: Sie haben Ihr Konto noch nicht aktiviert. Wenn Sie die Aktivierungsmail erneut erhalten wollen, klicken Sie bitte hier. + notice_account_password_updated: Passwort wurde erfolgreich aktualisiert. + notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators." + notice_account_register_done: Konto wurde erfolgreich angelegt. Eine E-Mail mit weiteren Instruktionen zur Kontoaktivierung wurde an %{email} gesendet. + notice_account_unknown_email: Unbekannter Benutzer. + notice_account_updated: Konto wurde erfolgreich aktualisiert. + notice_account_wrong_password: Falsches Passwort. + notice_api_access_key_reseted: Ihr API-Zugriffsschlüssel wurde zurückgesetzt. + notice_can_t_change_password: Dieses Konto verwendet eine externe Authentifizierungs-Quelle. Unmöglich, das Passwort zu ändern. + notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen. + notice_email_error: "Beim Senden einer E-Mail ist ein Fehler aufgetreten (%{value})." + notice_email_sent: "Eine E-Mail wurde an %{value} gesendet." + notice_failed_to_save_issues: "%{count} von %{total} ausgewählten Tickets konnte(n) nicht gespeichert werden: %{ids}." + notice_failed_to_save_members: "Benutzer konnte nicht gespeichert werden: %{errors}." + notice_failed_to_save_time_entries: "%{count} von %{total} ausgewählten Zeiteinträgen konnte(n) nicht gespeichert werden: %{ids}" + notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt. + notice_file_not_found: Anhang existiert nicht oder ist gelöscht worden. + notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max}) + notice_issue_done_ratios_updated: Der Ticket-Fortschritt wurde aktualisiert. + notice_issue_successful_create: Ticket %{id} erstellt. + notice_issue_update_conflict: Das Ticket wurde während Ihrer Bearbeitung von einem anderen Nutzer überarbeitet. + notice_locking_conflict: Datum wurde von einem anderen Benutzer geändert. + notice_new_password_must_be_different: Das neue Passwort muss sich vom dem Aktuellen unterscheiden + notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten." + notice_not_authorized: Sie sind nicht berechtigt, auf diese Seite zuzugreifen. + notice_not_authorized_archived_project: Das Projekt wurde archiviert und ist daher nicht verfügbar. + notice_successful_connection: Verbindung erfolgreich. + notice_successful_create: Erfolgreich angelegt + notice_successful_delete: Erfolgreich gelöscht. + notice_successful_update: Erfolgreich aktualisiert. + notice_unable_delete_time_entry: Der Zeiterfassungseintrag konnte nicht gelöscht werden. + notice_unable_delete_version: Die Version konnte nicht gelöscht werden. + notice_user_successful_create: Benutzer %{id} angelegt. + + permission_add_issue_notes: Kommentare hinzufügen + permission_add_issue_watchers: Beobachter hinzufügen + permission_add_issues: Tickets hinzufügen + permission_add_messages: Forenbeiträge hinzufügen + permission_add_project: Projekt erstellen + permission_add_subprojects: Unterprojekte erstellen + permission_add_documents: Dokumente hinzufügen + permission_browse_repository: Repository ansehen + permission_close_project: Schließen / erneutes Öffnen eines Projekts + permission_comment_news: News kommentieren + permission_commit_access: Commit-Zugriff + permission_delete_issue_watchers: Beobachter löschen + permission_delete_issues: Tickets löschen + permission_delete_messages: Forenbeiträge löschen + permission_delete_own_messages: Eigene Forenbeiträge löschen + permission_delete_wiki_pages: Wiki-Seiten löschen + permission_delete_wiki_pages_attachments: Anhänge löschen + permission_delete_documents: Dokumente löschen + permission_edit_issue_notes: Kommentare bearbeiten + permission_edit_issues: Tickets bearbeiten + permission_edit_messages: Forenbeiträge bearbeiten + permission_edit_own_issue_notes: Eigene Kommentare bearbeiten + permission_edit_own_messages: Eigene Forenbeiträge bearbeiten + permission_edit_own_time_entries: Selbst gebuchte Aufwände bearbeiten + permission_edit_project: Projekt bearbeiten + permission_edit_time_entries: Gebuchte Aufwände bearbeiten + permission_edit_wiki_pages: Wiki-Seiten bearbeiten + permission_edit_documents: Dokumente bearbeiten + permission_export_wiki_pages: Wiki-Seiten exportieren + permission_log_time: Aufwände buchen + permission_manage_boards: Foren verwalten + permission_manage_categories: Ticket-Kategorien verwalten + permission_manage_files: Dateien verwalten + permission_manage_issue_relations: Ticket-Beziehungen verwalten + permission_manage_members: Mitglieder verwalten + permission_view_news: News ansehen + permission_manage_news: News verwalten + permission_manage_project_activities: Aktivitäten (Zeiterfassung) verwalten + permission_manage_public_queries: Öffentliche Filter verwalten + permission_manage_related_issues: Zugehörige Tickets verwalten + permission_manage_repository: Repository verwalten + permission_manage_subtasks: Unteraufgaben verwalten + permission_manage_versions: Versionen verwalten + permission_manage_wiki: Wiki verwalten + permission_move_issues: Tickets verschieben + permission_protect_wiki_pages: Wiki-Seiten schützen + permission_rename_wiki_pages: Wiki-Seiten umbenennen + permission_save_queries: Filter speichern + permission_select_project_modules: Projektmodule auswählen + permission_set_issues_private: Tickets privat oder öffentlich markieren + permission_set_notes_private: Kommentar als privat markieren + permission_set_own_issues_private: Eigene Tickets privat oder öffentlich markieren + permission_view_calendar: Kalender ansehen + permission_view_changesets: Changesets ansehen + permission_view_documents: Dokumente ansehen + permission_view_files: Dateien ansehen + permission_view_gantt: Gantt-Diagramm ansehen + permission_view_issue_watchers: Liste der Beobachter ansehen + permission_view_issues: Tickets anzeigen + permission_view_messages: Forenbeiträge ansehen + permission_view_private_notes: Private Kommentare sehen + permission_view_time_entries: Gebuchte Aufwände ansehen + permission_view_wiki_edits: Wiki-Versionsgeschichte ansehen + permission_view_wiki_pages: Wiki ansehen + + project_module_boards: Foren + project_module_calendar: Kalender + project_module_documents: Dokumente + project_module_files: Dateien + project_module_gantt: Gantt + project_module_issue_tracking: Tickets + project_module_news: News + project_module_repository: Repository + project_module_time_tracking: Zeiterfassung + project_module_wiki: Wiki + project_status_active: aktiv + project_status_archived: archiviert + project_status_closed: geschlossen + + setting_activity_days_default: Anzahl Tage pro Seite der Projekt-Aktivität + setting_app_subtitle: Applikationsuntertitel + setting_app_title: Applikationstitel + setting_attachment_max_size: Max. Dateigröße + setting_autofetch_changesets: Changesets automatisch abrufen + setting_autologin: Automatische Anmeldung läuft ab nach + setting_bcc_recipients: E-Mails als Blindkopie (BCC) senden + setting_cache_formatted_text: Formatierten Text im Cache speichern + setting_commit_cross_project_ref: Erlauben Tickets aller anderen Projekte zu referenzieren + setting_commit_fix_keywords: Schlüsselwörter (Status) + setting_commit_logtime_activity_id: Aktivität für die Zeiterfassung + setting_commit_logtime_enabled: Aktiviere Zeiterfassung via Commit-Nachricht + setting_commit_ref_keywords: Schlüsselwörter (Beziehungen) + setting_cross_project_issue_relations: Ticket-Beziehungen zwischen Projekten erlauben + setting_cross_project_subtasks: Projektübergreifende Unteraufgaben erlauben + setting_date_format: Datumsformat + setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden + setting_default_language: Standardsprache + setting_default_notification_option: Standard Benachrichtigungsoptionen + setting_default_projects_modules: Standardmäßig aktivierte Module für neue Projekte + setting_default_projects_public: Neue Projekte sind standardmäßig öffentlich + setting_default_projects_tracker_ids: Standardmäßig aktivierte Tracker für neue Projekte + setting_diff_max_lines_displayed: Maximale Anzahl anzuzeigender Diff-Zeilen + setting_display_subprojects_issues: Tickets von Unterprojekten im Hauptprojekt anzeigen + setting_emails_footer: E-Mail-Fußzeile + setting_emails_header: E-Mail-Kopfzeile + setting_enabled_scm: Aktivierte Versionskontrollsysteme + setting_feeds_limit: Max. Anzahl Einträge pro Atom-Feed + setting_file_max_size_displayed: Maximale Größe inline angezeigter Textdateien + setting_force_default_language_for_anonymous: Standardsprache für anonyme Benutzer erzwingen + setting_force_default_language_for_loggedin: Standardsprache für angemeldete Benutzer erzwingen + setting_gantt_items_limit: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden + setting_gravatar_default: Standard-Gravatar-Bild + setting_gravatar_enabled: Gravatar-Benutzerbilder benutzen + setting_host_name: Hostname + setting_issue_done_ratio: Berechne den Ticket-Fortschritt mittels + setting_issue_done_ratio_issue_field: Ticket-Feld % erledigt + setting_issue_done_ratio_issue_status: Ticket-Status + setting_issue_group_assignment: Ticketzuweisung an Gruppen erlauben + setting_issue_list_default_columns: Standard-Spalten in der Ticket-Auflistung + setting_issues_export_limit: Max. Anzahl Tickets bei CSV/PDF-Export + setting_jsonp_enabled: JSONP Unterstützung aktivieren + setting_link_copied_issue: Tickets beim Kopieren verlinken + setting_login_required: Authentifizierung erforderlich + setting_mail_from: E-Mail-Absender + setting_mail_handler_api_enabled: Abruf eingehender E-Mails aktivieren + setting_mail_handler_api_key: API-Schlüssel für eingehende E-Mails + setting_sys_api_key: API-Schlüssel für Webservice zur Repository-Verwaltung + setting_mail_handler_body_delimiters: "Schneide E-Mails nach einer dieser Zeilen ab" + setting_mail_handler_excluded_filenames: Anhänge nach Namen ausschließen + setting_new_project_user_role_id: Rolle, die einem Nicht-Administrator zugeordnet wird, der ein Projekt erstellt + setting_non_working_week_days: Arbeitsfreie Tage + setting_openid: Erlaube OpenID-Anmeldung und -Registrierung + setting_password_min_length: Mindestlänge des Passworts + setting_password_max_age: Erzwinge Passwortwechsel nach + setting_lost_password: Erlaube Passwort-Zurücksetzen per E-Mail + setting_per_page_options: Objekte pro Seite + setting_plain_text_mail: Nur reinen Text (kein HTML) senden + setting_protocol: Protokoll + setting_repositories_encodings: Kodierung von Anhängen und Repositories + setting_repository_log_display_limit: Maximale Anzahl anzuzeigender Revisionen in der Historie einer Datei + setting_rest_api_enabled: REST-Schnittstelle aktivieren + setting_self_registration: Registrierung ermöglichen + setting_show_custom_fields_on_registration: Benutzerdefinierte Felder bei der Registrierung abfragen + setting_sequential_project_identifiers: Fortlaufende Projektkennungen generieren + setting_session_lifetime: Längste Dauer einer Sitzung + setting_session_timeout: Zeitüberschreitung bei Inaktivität + setting_start_of_week: Wochenanfang + setting_sys_api_enabled: Webservice zur Verwaltung der Repositories benutzen + setting_text_formatting: Textformatierung + setting_thumbnails_enabled: Vorschaubilder von Dateianhängen anzeigen + setting_thumbnails_size: Größe der Vorschaubilder (in Pixel) + setting_time_format: Zeitformat + setting_timespan_format: Format für Zeitspannen + setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen + setting_user_format: Benutzer-Anzeigeformat + setting_welcome_text: Willkommenstext + setting_wiki_compression: Wiki-Historie komprimieren + + status_active: aktiv + status_locked: gesperrt + status_registered: nicht aktivierte + + text_account_destroy_confirmation: "Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden." + text_are_you_sure: Sind Sie sicher? + text_assign_time_entries_to_project: Gebuchte Aufwände dem Projekt zuweisen + text_caracters_maximum: "Max. %{count} Zeichen." + text_caracters_minimum: "Muss mindestens %{count} Zeichen lang sein." + text_comma_separated: Mehrere Werte erlaubt (durch Komma getrennt). + text_convert_available: ImageMagick-Konvertierung verfügbar (optional) + text_custom_field_possible_values_info: 'Eine Zeile pro Wert' + text_default_administrator_account_changed: Administrator-Passwort geändert + text_destroy_time_entries: Gebuchte Aufwände löschen + text_destroy_time_entries_question: Es wurden bereits %{hours} Stunden auf dieses Ticket gebucht. Was soll mit den Aufwänden geschehen? + text_diff_truncated: '... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.' + text_email_delivery_not_configured: "Der SMTP-Server ist nicht konfiguriert und Mailbenachrichtigungen sind ausgeschaltet.\nNehmen Sie die Einstellungen für Ihren SMTP-Server in config/configuration.yml vor und starten Sie die Applikation neu." + text_enumeration_category_reassign_to: 'Die Objekte stattdessen diesem Wert zuordnen:' + text_enumeration_destroy_question: "%{count} Objekt(e) sind diesem Wert zugeordnet." + text_file_repository_writable: Verzeichnis für Dateien beschreibbar + text_git_repository_note: Repository steht für sich alleine (bare) und liegt lokal (z.B. /gitrepo, c:\gitrepo) + text_issue_added: "Ticket %{id} wurde erstellt von %{author}." + text_issue_category_destroy_assignments: Kategorie-Zuordnung entfernen + text_issue_category_destroy_question: "Einige Tickets (%{count}) sind dieser Kategorie zugeordnet. Was möchten Sie tun?" + text_issue_category_reassign_to: Tickets dieser Kategorie zuordnen + text_issue_conflict_resolution_add_notes: Nur meine Kommentare hinzufügen, meine übrigen Änderungen verwerfen + text_issue_conflict_resolution_cancel: Meine Kommentare und Änderungen verwerfen und %{link} neu anzeigen + text_issue_conflict_resolution_overwrite: Meine Änderungen trotzdem übernehmen (bisherige Kommentare bleiben bestehen, weitere Änderungen werden möglicherweise überschrieben) + text_issue_updated: "Ticket %{id} wurde aktualisiert von %{author}." + text_issues_destroy_confirmation: 'Sind Sie sicher, dass Sie die ausgewählten Tickets löschen möchten?' + text_issues_destroy_descendants_confirmation: Dies wird auch %{count} Unteraufgabe/n löschen. + text_issues_ref_in_commit_messages: Ticket-Beziehungen und -Status in Commit-Nachrichten + text_journal_added: "%{label} %{value} wurde hinzugefügt" + text_journal_changed: "%{label} wurde von %{old} zu %{new} geändert" + text_journal_changed_no_detail: "%{label} aktualisiert" + text_journal_deleted: "%{label} %{old} wurde gelöscht" + text_journal_set_to: "%{label} wurde auf %{value} gesetzt" + text_length_between: "Länge zwischen %{min} und %{max} Zeichen." + text_line_separated: Mehrere Werte sind erlaubt (eine Zeile pro Wert). + text_load_default_configuration: Standard-Konfiguration laden + text_mercurial_repository_note: Lokales Repository (e.g. /hgrepo, c:\hgrepo) + text_min_max_length_info: 0 heißt keine Beschränkung + text_no_configuration_data: "Rollen, Tracker, Ticket-Status und Workflows wurden noch nicht konfiguriert.\nEs ist sehr zu empfehlen, die Standard-Konfiguration zu laden. Sobald sie geladen ist, können Sie diese abändern." + text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?" + text_plugin_assets_writable: Verzeichnis für Plugin-Assets beschreibbar + text_project_closed: Dieses Projekt ist geschlossen und kann nicht bearbeitet werden. + text_project_destroy_confirmation: Sind Sie sicher, dass Sie das Projekt löschen wollen? + text_project_identifier_info: 'Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt, muss mit einem Kleinbuchstaben beginnen.
    Einmal gespeichert, kann die Kennung nicht mehr geändert werden.' + text_reassign_time_entries: 'Gebuchte Aufwände diesem Ticket zuweisen:' + text_regexp_info: z. B. ^[A-Z0-9]+$ + text_repository_identifier_info: 'Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt.
    Einmal gespeichert, kann die Kennung nicht mehr geändert werden.' + text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der Redmine-Benutzer zu den Benutzernamen der Commit-Nachrichten des Repositories fest.\nBenutzer mit identischen Redmine- und Repository-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet." + text_rmagick_available: RMagick verfügbar (optional) + text_scm_command: Kommando + text_scm_command_not_available: SCM-Kommando ist nicht verfügbar. Bitte prüfen Sie die Einstellungen im Administrationspanel. + text_scm_command_version: Version + text_scm_config: Die SCM-Kommandos können in der in config/configuration.yml konfiguriert werden. Redmine muss anschließend neu gestartet werden. + text_scm_path_encoding_note: "Standard: UTF-8" + text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll. + text_select_project_modules: 'Bitte wählen Sie die Module aus, die in diesem Projekt aktiviert sein sollen:' + text_session_expiration_settings: "Achtung: Änderungen können aktuelle Sitzungen beenden, Ihre eingeschlossen!" + text_status_changed_by_changeset: "Status geändert durch Changeset %{value}." + text_subprojects_destroy_warning: "Dessen Unterprojekte (%{value}) werden ebenfalls gelöscht." + text_subversion_repository_note: 'Beispiele: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + text_time_entries_destroy_confirmation: Sind Sie sicher, dass Sie die ausgewählten Zeitaufwände löschen möchten? + text_time_logged_by_changeset: Angewendet in Changeset %{value}. + text_tip_issue_begin_day: Aufgabe, die an diesem Tag beginnt + text_tip_issue_begin_end_day: Aufgabe, die an diesem Tag beginnt und endet + text_tip_issue_end_day: Aufgabe, die an diesem Tag endet + text_tracker_no_workflow: Kein Workflow für diesen Tracker definiert. + text_turning_multiple_off: Wenn Sie die Mehrfachauswahl deaktivieren, werden Felder mit Mehrfachauswahl bereinigt. + Dadurch wird sichergestellt, dass lediglich ein Wert pro Feld ausgewählt ist. + text_unallowed_characters: Nicht erlaubte Zeichen + text_user_mail_option: "Für nicht ausgewählte Projekte werden Sie nur Benachrichtigungen für Dinge erhalten, die Sie beobachten oder an denen Sie beteiligt sind (z. B. Tickets, deren Autor Sie sind oder die Ihnen zugewiesen sind)." + text_user_wrote: "%{value} schrieb:" + text_warn_on_leaving_unsaved: Die aktuellen Änderungen gehen verloren, wenn Sie diese Seite verlassen. + text_wiki_destroy_confirmation: Sind Sie sicher, dass Sie dieses Wiki mit sämtlichem Inhalt löschen möchten? + text_wiki_page_destroy_children: Lösche alle Unterseiten + text_wiki_page_destroy_question: "Diese Seite hat %{descendants} Unterseite(n). Was möchten Sie tun?" + text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene + text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu + text_workflow_edit: Workflow zum Bearbeiten auswählen + text_zoom_in: Ansicht vergrößern + text_zoom_out: Ansicht verkleinern + + version_status_closed: abgeschlossen + version_status_locked: gesperrt + version_status_open: offen + + warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden." + label_search_attachments_yes: Namen und Beschreibungen von Anhängen durchsuchen + label_search_attachments_no: Keine Anhänge suchen + label_search_attachments_only: Nur Anhänge suchen + label_search_open_issues_only: Nur offene Tickets + field_address: E-Mail + setting_max_additional_emails: Maximale Anzahl zusätzlicher E-Mailadressen + label_email_address_plural: E-Mails + label_email_address_add: E-Mailadresse hinzufügen + label_enable_notifications: Benachrichtigungen aktivieren + label_disable_notifications: Benachrichtigungen deaktivieren + setting_search_results_per_page: Suchergebnisse pro Seite + label_blank_value: leer + permission_copy_issues: Tickets kopieren + error_password_expired: Ihr Passwort ist abgelaufen oder der Administrator verlangt eine Passwortänderung. + field_time_entries_visibility: Zeiten-Sichtbarkeit + field_remote_ip: IP-Adresse + label_parent_task_attributes: Eigenschaften übergeordneter Aufgaben + label_parent_task_attributes_derived: Abgeleitet von Unteraufgaben + label_parent_task_attributes_independent: Unabhängig von Unteraufgaben + label_time_entries_visibility_all: Alle Zeitaufwände + label_time_entries_visibility_own: Nur eigene Aufwände + label_member_management: Mitglieder verwalten + label_member_management_all_roles: Alle Rollen + label_member_management_selected_roles_only: Nur diese Rollen + label_total_spent_time: Aufgewendete Zeit aller Projekte anzeigen + notice_import_finished: "%{count} Einträge wurden importiert" + notice_import_finished_with_errors: "%{count} von %{total} Einträgen konnten nicht importiert werden" + error_invalid_file_encoding: Die Datei ist keine gültige %{encoding} kodierte Datei + error_invalid_csv_file_or_settings: Die Datei ist keine CSV-Datei oder entspricht nicht den Einstellungen unten + error_can_not_read_import_file: Beim Einlesen der Datei ist ein Fehler aufgetreten + permission_import_issues: Tickets importieren + label_import_issues: Tickets importieren + label_select_file_to_import: Bitte wählen Sie eine Datei für den Import aus + label_fields_separator: Trennzeichen + label_fields_wrapper: Textqualifizierer + label_encoding: Kodierung + label_comma_char: Komma + label_semi_colon_char: Semikolon + label_quote_char: Anführungszeichen + label_double_quote_char: Doppelte Anführungszeichen + label_fields_mapping: Zuordnung der Felder + label_file_content_preview: Inhaltsvorschau + label_create_missing_values: Ergänze fehlende Werte + button_import: Importieren + field_total_estimated_hours: Summe des geschätzten Aufwands + label_api: API + label_total_plural: Summe + label_assigned_issues: Zugewiesene Tickets + label_field_format_enumeration: Eigenschaft/Wert-Paare + label_f_hour_short: '%{value} h' + field_default_version: Standard-Version + error_attachment_extension_not_allowed: Der Dateityp %{extension} des Anhangs ist nicht zugelassen + setting_attachment_extensions_allowed: Zugelassene Dateitypen + setting_attachment_extensions_denied: Nicht zugelassene Dateitypen + label_any_open_issues: irgendein offenes Ticket + label_no_open_issues: kein offenes Ticket + label_default_values_for_new_users: Standardwerte für neue Benutzer + error_ldap_bind_credentials: Ungültiges LDAP Konto/Passwort + mail_body_settings_updated: ! 'Die folgenden Einstellungen wurden geändert:' + label_relations: Beziehungen + button_filter: Filter + mail_body_password_updated: Ihr Passwort wurde geändert. + error_no_tracker_allowed_for_new_issue_in_project: Für dieses Projekt wurden keine Tracker aktiviert. + label_tracker_all: Alle Tracker + label_new_project_issue_tab_enabled: Tab "Neues Ticket" anzeigen + setting_new_item_menu_tab: Menü zum Anlegen neuer Objekte + label_new_object_tab_enabled: Dropdown-Menü "+" anzeigen + label_table_of_contents: Inhaltsverzeichnis + error_no_projects_with_tracker_allowed_for_new_issue: Es gibt keine Projekte mit Trackern, für welche sie Tickets erzeugen können + field_textarea_font: Schriftart für Textbereiche + label_font_default: Standardschrift + label_font_monospace: Nichtproportionale Schrift + label_font_proportional: Proportionale Schrift + setting_commit_logs_formatting: Textformatierung für Commit Nachrichten + setting_mail_handler_enable_regex_delimiters: Reguläre Ausdrücke erlauben + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Zeitbuchungen für Tickets, die gelöscht werden sind nicht möglich + setting_timelog_required_fields: Erforderliche Felder für Zeitbuchungen + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Nur für Dinge, die ich beobachte oder die mir zugewiesen sind + label_user_mail_option_only_owner: Nur für Dinge, die ich beobachte oder die mir gehören + warning_fields_cleared_on_bulk_edit: Diese Änderungen werden eine automatische Löschung von ein oder mehreren Werten auf den selektierten Objekten zur Folge haben + field_updated_by: Geändert von + field_last_updated_by: Zuletzt geändert von + field_full_width_layout: Layout mit voller Breite + label_last_notes: Letzte Kommentare + field_digest: Checksumme diff --git a/config/locales/el.yml b/config/locales/el.yml new file mode 100644 index 0000000..8c4d2f3 --- /dev/null +++ b/config/locales/el.yml @@ -0,0 +1,1230 @@ +# Greek translations for Ruby on Rails +# by Vaggelis Typaldos (vtypal@gmail.com), Spyros Raptis (spirosrap@gmail.com) + +el: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%m/%d/%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Κυριακή, Δευτέρα, Τρίτη, Τετάρτη, Πέμπτη, Παρασκευή, Σάββατο] + abbr_day_names: [Κυρ, Δευ, Τρι, Τετ, Πεμ, Παρ, Σαβ] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Ιανουάριος, Φεβρουάριος, Μάρτιος, Απρίλιος, Μάϊος, Ιούνιος, Ιούλιος, Αύγουστος, Σεπτέμβριος, Οκτώβριος, Νοέμβριος, Δεκέμβριος] + abbr_month_names: [~, Ιαν, Φεβ, Μαρ, Απρ, Μαϊ, Ιον, Ιολ, Αυγ, Σεπ, Οκτ, Νοε, Δεκ] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%m/%d/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "πμ" + pm: "μμ" + + datetime: + distance_in_words: + half_a_minute: "μισό λεπτό" + less_than_x_seconds: + one: "λιγότερο από 1 δευτερόλεπτο" + other: "λιγότερο από %{count} δευτερόλεπτα" + x_seconds: + one: "1 δευτερόλεπτο" + other: "%{count} δευτερόλεπτα" + less_than_x_minutes: + one: "λιγότερο από ένα λεπτό" + other: "λιγότερο από %{count} λεπτά" + x_minutes: + one: "1 λεπτό" + other: "%{count} λεπτά" + about_x_hours: + one: "περίπου 1 ώρα" + other: "περίπου %{count} ώρες" + x_hours: + one: "1 ώρα" + other: "%{count} ώρες" + x_days: + one: "1 ημέρα" + other: "%{count} ημέρες" + about_x_months: + one: "περίπου 1 μήνα" + other: "περίπου %{count} μήνες" + x_months: + one: "1 μήνα" + other: "%{count} μήνες" + about_x_years: + one: "περίπου 1 χρόνο" + other: "περίπου %{count} χρόνια" + over_x_years: + one: "πάνω από 1 χρόνο" + other: "πάνω από %{count} χρόνια" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + precision: 3 + delimiter: "" + storage_units: + format: "%n %u" + units: + kb: KB + tb: TB + gb: GB + byte: + one: Byte + other: Bytes + mb: MB + +# Used in array.to_sentence. + support: + array: + sentence_connector: "and" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "δεν περιέχεται στη λίστα" + exclusion: "έχει κατοχυρωθεί" + invalid: "είναι άκυρο" + confirmation: "δεν αντιστοιχεί με την επιβεβαίωση" + accepted: "πρέπει να γίνει αποδοχή" + empty: "δε μπορεί να είναι άδειο" + blank: "δε μπορεί να είναι κενό" + too_long: "έχει πολλούς (μέγ.επιτρ. %{count} χαρακτήρες)" + too_short: "έχει λίγους (ελάχ.επιτρ. %{count} χαρακτήρες)" + wrong_length: "δεν είναι σωστός ο αριθμός χαρακτήρων (πρέπει να έχει %{count} χαρακτήρες)" + taken: "έχει ήδη κατοχυρωθεί" + not_a_number: "δεν είναι αριθμός" + not_a_date: "δεν είναι σωστή ημερομηνία" + greater_than: "πρέπει να είναι μεγαλύτερο από %{count}" + greater_than_or_equal_to: "πρέπει να είναι μεγαλύτερο από ή ίσο με %{count}" + equal_to: "πρέπει να είναι ίσον με %{count}" + less_than: "πρέπει να είναι μικρότερη από %{count}" + less_than_or_equal_to: "πρέπει να είναι μικρότερο από ή ίσο με %{count}" + odd: "πρέπει να είναι μονός" + even: "πρέπει να είναι ζυγός" + greater_than_start_date: "πρέπει να είναι αργότερα από την ημερομηνία έναρξης" + not_same_project: "δεν ανήκει στο ίδιο έργο" + circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Παρακαλώ επιλέξτε + + general_text_No: 'Όχι' + general_text_Yes: 'Ναι' + general_text_no: 'όχι' + general_text_yes: 'ναι' + general_lang_name: 'Greek (Ελληνικά)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_updated: Ο λογαριασμός ενημερώθηκε επιτυχώς. + notice_account_invalid_credentials: Άκυρο όνομα χρήστη ή κωδικού πρόσβασης + notice_account_password_updated: Ο κωδικός πρόσβασης ενημερώθηκε επιτυχώς. + notice_account_wrong_password: Λάθος κωδικός πρόσβασης + notice_account_register_done: Ο λογαριασμός δημιουργήθηκε επιτυχώς. Για να ενεργοποιήσετε το λογαριασμό σας, πατήστε το σύνδεσμο που σας έχει αποσταλεί με email. + notice_account_unknown_email: Άγνωστος χρήστης. + notice_can_t_change_password: Αυτός ο λογαριασμός χρησιμοποιεί εξωτερική πηγή πιστοποίησης. Δεν είναι δυνατόν να αλλάξετε τον κωδικό πρόσβασης. + notice_account_lost_email_sent: Σας έχει αποσταλεί email με οδηγίες για την επιλογή νέου κωδικού πρόσβασης. + notice_account_activated: Ο λογαριασμός σας έχει ενεργοποιηθεί. Τώρα μπορείτε να συνδεθείτε. + notice_successful_create: Επιτυχής δημιουργία. + notice_successful_update: Επιτυχής ενημέρωση. + notice_successful_delete: Επιτυχής διαγραφή. + notice_successful_connection: Επιτυχής σύνδεση. + notice_file_not_found: Η σελίδα που ζητήσατε δεν υπάρχει ή έχει αφαιρεθεί. + notice_locking_conflict: Τα δεδομένα έχουν ενημερωθεί από άλλο χρήστη. + notice_not_authorized: Δεν έχετε δικαίωμα πρόσβασης σε αυτή τη σελίδα. + notice_email_sent: "Ένα μήνυμα ηλεκτρονικού ταχυδρομείου εστάλη στο %{value}" + notice_email_error: "Σφάλμα κατά την αποστολή του μηνύματος στο (%{value})" + notice_feeds_access_key_reseted: Έγινε επαναφορά στο κλειδί πρόσβασης Atom. + notice_failed_to_save_issues: "Αποτυχία αποθήκευσης %{count} θεμα(των) από τα %{total} επιλεγμένα: %{ids}." + notice_no_issue_selected: "Κανένα θέμα δεν είναι επιλεγμένο! Παρακαλούμε, ελέγξτε τα θέματα που θέλετε να επεξεργαστείτε." + notice_account_pending: "Ο λογαριασμός σας έχει δημιουργηθεί και είναι σε στάδιο έγκρισης από τον διαχειριστή." + notice_default_data_loaded: Οι προεπιλεγμένες ρυθμίσεις φορτώθηκαν επιτυχώς. + notice_unable_delete_version: Αδύνατον να διαγραφεί η έκδοση. + + error_can_t_load_default_data: "Οι προεπιλεγμένες ρυθμίσεις δεν μπόρεσαν να φορτωθούν:: %{value}" + error_scm_not_found: "Η εγγραφή ή η αναθεώρηση δεν βρέθηκε στο αποθετήριο." + error_scm_command_failed: "Παρουσιάστηκε σφάλμα κατά την προσπάθεια πρόσβασης στο αποθετήριο: %{value}" + error_scm_annotate: "Η καταχώριση δεν υπάρχει ή δεν μπορεί να σχολιαστεί." + error_issue_not_found_in_project: 'Το θέμα δεν βρέθηκε ή δεν ανήκει σε αυτό το έργο' + error_no_tracker_in_project: 'Δεν υπάρχει ανιχνευτής για αυτό το έργο. Παρακαλώ ελέγξτε τις ρυθμίσεις του έργου.' + error_no_default_issue_status: 'Δεν έχει οριστεί η προεπιλογή κατάστασης θεμάτων. Παρακαλώ ελέγξτε τις ρυθμίσεις σας (Μεταβείτε στην "Διαχείριση -> Κατάσταση θεμάτων").' + + warning_attachments_not_saved: "%{count} αρχείο(α) δε μπορούν να αποθηκευτούν." + + mail_subject_lost_password: "Ο κωδικός σας %{value}" + mail_body_lost_password: 'Για να αλλάξετε τον κωδικό πρόσβασης, πατήστε τον ακόλουθο σύνδεσμο:' + mail_subject_register: "Ενεργοποίηση του λογαριασμού χρήστη %{value} " + mail_body_register: 'Για να ενεργοποιήσετε το λογαριασμό σας, επιλέξτε τον ακόλουθο σύνδεσμο:' + mail_body_account_information_external: "Μπορείτε να χρησιμοποιήσετε τον λογαριασμό %{value} για να συνδεθείτε." + mail_body_account_information: Πληροφορίες του λογαριασμού σας + mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού %{value}" + mail_body_account_activation_request: "'Ένας νέος χρήστης (%{value}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:" + mail_subject_reminder: "%{count} θέμα(τα) με προθεσμία στις επόμενες %{days} ημέρες" + mail_body_reminder: "%{count}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες %{days} ημέρες:" + mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki %{id}' " + mail_body_wiki_content_added: "Η σελίδα wiki '%{id}' προστέθηκε από τον %{author}." + mail_subject_wiki_content_updated: "'ενημερώθηκε η σελίδα wiki %{id}' " + mail_body_wiki_content_updated: "Η σελίδα wiki '%{id}' ενημερώθηκε από τον %{author}." + + + field_name: Όνομα + field_description: Περιγραφή + field_summary: Συνοπτικά + field_is_required: Απαιτείται + field_firstname: Όνομα + field_lastname: Επώνυμο + field_mail: Email + field_filename: Αρχείο + field_filesize: Μέγεθος + field_downloads: Μεταφορτώσεις + field_author: Συγγραφέας + field_created_on: Δημιουργήθηκε + field_updated_on: Ενημερώθηκε + field_field_format: Μορφοποίηση + field_is_for_all: Για όλα τα έργα + field_possible_values: Πιθανές τιμές + field_regexp: Κανονική παράσταση + field_min_length: Ελάχιστο μήκος + field_max_length: Μέγιστο μήκος + field_value: Τιμή + field_category: Κατηγορία + field_title: Τίτλος + field_project: Έργο + field_issue: Θέμα + field_status: Κατάσταση + field_notes: Σημειώσεις + field_is_closed: Κλειστά θέματα + field_is_default: Προεπιλεγμένη τιμή + field_tracker: Ανιχνευτής + field_subject: Θέμα + field_due_date: Προθεσμία + field_assigned_to: Ανάθεση σε + field_priority: Προτεραιότητα + field_fixed_version: Στόχος έκδοσης + field_user: Χρήστης + field_role: Ρόλος + field_homepage: Αρχική σελίδα + field_is_public: Δημόσιο + field_parent: Επιμέρους έργο του + field_is_in_roadmap: Προβολή θεμάτων στο χάρτη πορείας + field_login: Όνομα χρήστη + field_mail_notification: Ειδοποιήσεις email + field_admin: Διαχειριστής + field_last_login_on: Τελευταία σύνδεση + field_language: Γλώσσα + field_effective_date: Ημερομηνία + field_password: Κωδικός πρόσβασης + field_new_password: Νέος κωδικός πρόσβασης + field_password_confirmation: Επιβεβαίωση + field_version: Έκδοση + field_type: Τύπος + field_host: Κόμβος + field_port: Θύρα + field_account: Λογαριασμός + field_base_dn: Βάση DN + field_attr_login: Ιδιότητα εισόδου + field_attr_firstname: Ιδιότητα ονόματος + field_attr_lastname: Ιδιότητα επωνύμου + field_attr_mail: Ιδιότητα email + field_onthefly: Άμεση δημιουργία χρήστη + field_start_date: Εκκίνηση + field_done_ratio: "% επιτεύχθη" + field_auth_source: Τρόπος πιστοποίησης + field_hide_mail: Απόκρυψη διεύθυνσης email + field_comments: Σχόλιο + field_url: URL + field_start_page: Πρώτη σελίδα + field_subproject: Επιμέρους έργο + field_hours: Ώρες + field_activity: Δραστηριότητα + field_spent_on: Ημερομηνία + field_identifier: Στοιχείο αναγνώρισης + field_is_filter: Χρήση ως φίλτρο + field_issue_to: Σχετικά θέματα + field_delay: Καθυστέρηση + field_assignable: Θέματα που μπορούν να ανατεθούν σε αυτό το ρόλο + field_redirect_existing_links: Ανακατεύθυνση των τρεχόντων συνδέσμων + field_estimated_hours: Εκτιμώμενος χρόνος + field_column_names: Στήλες + field_time_zone: Ωριαία ζώνη + field_searchable: Ερευνήσιμο + field_default_value: Προκαθορισμένη τιμή + field_comments_sorting: Προβολή σχολίων + field_parent_title: Γονική σελίδα + field_editable: Επεξεργάσιμο + field_watcher: Παρατηρητής + field_identity_url: OpenID URL + field_content: Περιεχόμενο + field_group_by: Ομαδικά αποτελέσματα από + + setting_app_title: Τίτλος εφαρμογής + setting_app_subtitle: Υπότιτλος εφαρμογής + setting_welcome_text: Κείμενο υποδοχής + setting_default_language: Προεπιλεγμένη γλώσσα + setting_login_required: Απαιτείται πιστοποίηση + setting_self_registration: Αυτο-εγγραφή + setting_attachment_max_size: Μέγ. μέγεθος συνημμένου + setting_issues_export_limit: Θέματα περιορισμού εξαγωγής + setting_mail_from: Μετάδοση διεύθυνσης email + setting_bcc_recipients: Αποδέκτες κρυφής κοινοποίησης (bcc) + setting_plain_text_mail: Email απλού κειμένου (όχι HTML) + setting_host_name: Όνομα κόμβου και διαδρομή + setting_text_formatting: Μορφοποίηση κειμένου + setting_wiki_compression: Συμπίεση ιστορικού wiki + setting_feeds_limit: Feed περιορισμού περιεχομένου + setting_default_projects_public: Τα νέα έργα έχουν προεπιλεγεί ως δημόσια + setting_autofetch_changesets: Αυτόματη λήψη commits + setting_sys_api_enabled: Ενεργοποίηση WS για διαχείριση αποθετηρίου + setting_commit_ref_keywords: Αναφορά σε λέξεις-κλειδιά + setting_commit_fix_keywords: Καθορισμός σε λέξεις-κλειδιά + setting_autologin: Αυτόματη σύνδεση + setting_date_format: Μορφή ημερομηνίας + setting_time_format: Μορφή ώρας + setting_cross_project_issue_relations: Επιτρέψτε συσχετισμό θεμάτων σε διασταύρωση-έργων + setting_issue_list_default_columns: Προκαθορισμένες εμφανιζόμενες στήλες στη λίστα θεμάτων + setting_emails_footer: Υποσέλιδο στα email + setting_protocol: Πρωτόκολο + setting_per_page_options: Αντικείμενα ανά σελίδα επιλογών + setting_user_format: Μορφή εμφάνισης χρηστών + setting_activity_days_default: Ημέρες που εμφανίζεται στη δραστηριότητα έργου + setting_display_subprojects_issues: Εμφάνιση από προεπιλογή θεμάτων επιμέρους έργων στα κύρια έργα + setting_enabled_scm: Ενεργοποίηση SCM + setting_mail_handler_api_enabled: Ενεργοποίηση WS για εισερχόμενα email + setting_mail_handler_api_key: κλειδί API + setting_sequential_project_identifiers: Δημιουργία διαδοχικών αναγνωριστικών έργου + setting_gravatar_enabled: Χρήση Gravatar εικονιδίων χρηστών + setting_diff_max_lines_displayed: Μεγ.αριθμός εμφάνισης γραμμών diff + setting_file_max_size_displayed: Μεγ.μέγεθος των αρχείων απλού κειμένου που εμφανίζονται σε σειρά + setting_repository_log_display_limit: Μέγιστος αριθμός αναθεωρήσεων που εμφανίζονται στο ιστορικό αρχείου + setting_openid: Επιτρέψτε συνδέσεις OpenID και εγγραφή + setting_password_min_length: Ελάχιστο μήκος κωδικού πρόσβασης + setting_new_project_user_role_id: Απόδοση ρόλου σε χρήστη μη-διαχειριστή όταν δημιουργεί ένα έργο + + permission_add_project: Δημιουργία έργου + permission_edit_project: Επεξεργασία έργου + permission_select_project_modules: Επιλογή μονάδων έργου + permission_manage_members: Διαχείριση μελών + permission_manage_versions: Διαχείριση εκδόσεων + permission_manage_categories: Διαχείριση κατηγοριών θεμάτων + permission_add_issues: Προσθήκη θεμάτων + permission_edit_issues: Επεξεργασία θεμάτων + permission_manage_issue_relations: Διαχείριση συσχετισμών θεμάτων + permission_add_issue_notes: Προσθήκη σημειώσεων + permission_edit_issue_notes: Επεξεργασία σημειώσεων + permission_edit_own_issue_notes: Επεξεργασία δικών μου σημειώσεων + permission_move_issues: Μεταφορά θεμάτων + permission_delete_issues: Διαγραφή θεμάτων + permission_manage_public_queries: Διαχείριση δημόσιων αναζητήσεων + permission_save_queries: Αποθήκευση αναζητήσεων + permission_view_gantt: Προβολή διαγράμματος gantt + permission_view_calendar: Προβολή ημερολογίου + permission_view_issue_watchers: Προβολή λίστας παρατηρητών + permission_add_issue_watchers: Προσθήκη παρατηρητών + permission_log_time: Ιστορικό χρόνου που δαπανήθηκε + permission_view_time_entries: Προβολή χρόνου που δαπανήθηκε + permission_edit_time_entries: Επεξεργασία ιστορικού χρόνου + permission_edit_own_time_entries: Επεξεργασία δικού μου ιστορικού χρόνου + permission_manage_news: Διαχείριση νέων + permission_comment_news: Σχολιασμός νέων + permission_view_documents: Προβολή εγγράφων + permission_manage_files: Διαχείριση αρχείων + permission_view_files: Προβολή αρχείων + permission_manage_wiki: Διαχείριση wiki + permission_rename_wiki_pages: Μετονομασία σελίδων wiki + permission_delete_wiki_pages: Διαγραφή σελίδων wiki + permission_view_wiki_pages: Προβολή wiki + permission_view_wiki_edits: Προβολή ιστορικού wiki + permission_edit_wiki_pages: Επεξεργασία σελίδων wiki + permission_delete_wiki_pages_attachments: Διαγραφή συνημμένων + permission_protect_wiki_pages: Προστασία σελίδων wiki + permission_manage_repository: Διαχείριση αποθετηρίου + permission_browse_repository: Διαχείριση εγγράφων + permission_view_changesets: Προβολή changesets + permission_commit_access: Πρόσβαση commit + permission_manage_boards: Διαχείριση πινάκων συζητήσεων + permission_view_messages: Προβολή μηνυμάτων + permission_add_messages: Αποστολή μηνυμάτων + permission_edit_messages: Επεξεργασία μηνυμάτων + permission_edit_own_messages: Επεξεργασία δικών μου μηνυμάτων + permission_delete_messages: Διαγραφή μηνυμάτων + permission_delete_own_messages: Διαγραφή δικών μου μηνυμάτων + + project_module_issue_tracking: Ανίχνευση θεμάτων + project_module_time_tracking: Ανίχνευση χρόνου + project_module_news: Νέα + project_module_documents: Έγγραφα + project_module_files: Αρχεία + project_module_wiki: Wiki + project_module_repository: Αποθετήριο + project_module_boards: Πίνακες συζητήσεων + + label_user: Χρήστης + label_user_plural: Χρήστες + label_user_new: Νέος Χρήστης + label_project: Έργο + label_project_new: Νέο έργο + label_project_plural: Έργα + label_x_projects: + zero: κανένα έργο + one: 1 έργο + other: "%{count} έργα" + label_project_all: Όλα τα έργα + label_project_latest: Τελευταία έργα + label_issue: Θέμα + label_issue_new: Νέο θέμα + label_issue_plural: Θέματα + label_issue_view_all: Προβολή όλων των θεμάτων + label_issues_by: "Θέματα του %{value}" + label_issue_added: Το θέμα προστέθηκε + label_issue_updated: Το θέμα ενημερώθηκε + label_document: Έγγραφο + label_document_new: Νέο έγγραφο + label_document_plural: Έγγραφα + label_document_added: Έγγραφο προστέθηκε + label_role: Ρόλος + label_role_plural: Ρόλοι + label_role_new: Νέος ρόλος + label_role_and_permissions: Ρόλοι και άδειες + label_member: Μέλος + label_member_new: Νέο μέλος + label_member_plural: Μέλη + label_tracker: Ανιχνευτής + label_tracker_plural: Ανιχνευτές + label_tracker_new: Νέος Ανιχνευτής + label_workflow: Ροή εργασίας + label_issue_status: Κατάσταση θέματος + label_issue_status_plural: Κατάσταση θέματος + label_issue_status_new: Νέα κατάσταση + label_issue_category: Κατηγορία θέματος + label_issue_category_plural: Κατηγορίες θεμάτων + label_issue_category_new: Νέα κατηγορία + label_custom_field: Προσαρμοσμένο πεδίο + label_custom_field_plural: Προσαρμοσμένα πεδία + label_custom_field_new: Νέο προσαρμοσμένο πεδίο + label_enumerations: Απαριθμήσεις + label_enumeration_new: Νέα τιμή + label_information: Πληροφορία + label_information_plural: Πληροφορίες + label_please_login: Παρακαλώ συνδεθείτε + label_register: Εγγραφή + label_login_with_open_id_option: ή συνδεθείτε με OpenID + label_password_lost: Ανάκτηση κωδικού πρόσβασης + label_home: Αρχική σελίδα + label_my_page: Η σελίδα μου + label_my_account: Ο λογαριασμός μου + label_my_projects: Τα έργα μου + label_administration: Διαχείριση + label_login: Σύνδεση + label_logout: Αποσύνδεση + label_help: Βοήθεια + label_reported_issues: Εισηγμένα θέματα + label_assigned_to_me_issues: Θέματα που έχουν ανατεθεί σε μένα + label_last_login: Τελευταία σύνδεση + label_registered_on: Εγγράφηκε την + label_activity: Δραστηριότητα + label_overall_activity: Συνολική δραστηριότητα + label_user_activity: "δραστηριότητα του %{value}" + label_new: Νέο + label_logged_as: Σύνδεδεμένος ως + label_environment: Περιβάλλον + label_authentication: Πιστοποίηση + label_auth_source: Τρόπος πιστοποίησης + label_auth_source_new: Νέος τρόπος πιστοποίησης + label_auth_source_plural: Τρόποι πιστοποίησης + label_subproject_plural: Επιμέρους έργα + label_and_its_subprojects: "%{value} και τα επιμέρους έργα του" + label_min_max_length: Ελάχ. - Μέγ. μήκος + label_list: Λίστα + label_date: Ημερομηνία + label_integer: Ακέραιος + label_float: Αριθμός κινητής υποδιαστολής + label_boolean: Λογικός + label_string: Κείμενο + label_text: Μακροσκελές κείμενο + label_attribute: Ιδιότητα + label_attribute_plural: Ιδιότητες + label_no_data: Δεν υπάρχουν δεδομένα + label_change_status: Αλλαγή κατάστασης + label_history: Ιστορικό + label_attachment: Αρχείο + label_attachment_new: Νέο αρχείο + label_attachment_delete: Διαγραφή αρχείου + label_attachment_plural: Αρχεία + label_file_added: Το αρχείο προστέθηκε + label_report: Αναφορά + label_report_plural: Αναφορές + label_news: Νέα + label_news_new: Προσθήκη νέων + label_news_plural: Νέα + label_news_latest: Τελευταία νέα + label_news_view_all: Προβολή όλων των νέων + label_news_added: Τα νέα προστέθηκαν + label_settings: Ρυθμίσεις + label_overview: Επισκόπηση + label_version: Έκδοση + label_version_new: Νέα έκδοση + label_version_plural: Εκδόσεις + label_confirmation: Επιβεβαίωση + label_export_to: 'Επίσης διαθέσιμο σε:' + label_read: Διάβασε... + label_public_projects: Δημόσια έργα + label_open_issues: Ανοικτό + label_open_issues_plural: Ανοικτά + label_closed_issues: Κλειστό + label_closed_issues_plural: Κλειστά + label_x_open_issues_abbr: + zero: 0 ανοικτά + one: 1 ανοικτό + other: "%{count} ανοικτά" + label_x_closed_issues_abbr: + zero: 0 κλειστά + one: 1 κλειστό + other: "%{count} κλειστά" + label_total: Σύνολο + label_permissions: Άδειες + label_current_status: Τρέχουσα κατάσταση + label_new_statuses_allowed: Νέες καταστάσεις επιτρέπονται + label_all: όλα + label_none: κανένα + label_nobody: κανείς + label_next: Επόμενο + label_previous: Προηγούμενο + label_used_by: Χρησιμοποιήθηκε από + label_details: Λεπτομέρειες + label_add_note: Προσθήκη σημείωσης + label_calendar: Ημερολόγιο + label_months_from: μηνών από + label_gantt: Gantt + label_internal: Εσωτερικό + label_last_changes: "Τελευταίες %{count} αλλαγές" + label_change_view_all: Προβολή όλων των αλλαγών + label_comment: Σχόλιο + label_comment_plural: Σχόλια + label_x_comments: + zero: δεν υπάρχουν σχόλια + one: 1 σχόλιο + other: "%{count} σχόλια" + label_comment_add: Προσθήκη σχολίου + label_comment_added: Τα σχόλια προστέθηκαν + label_comment_delete: Διαγραφή σχολίων + label_query: Προσαρμοσμένη αναζήτηση + label_query_plural: Προσαρμοσμένες αναζητήσεις + label_query_new: Νέα αναζήτηση + label_filter_add: Προσθήκη φίλτρου + label_filter_plural: Φίλτρα + label_equals: είναι + label_not_equals: δεν είναι + label_in_less_than: μικρότερο από + label_in_more_than: περισσότερο από + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: σε + label_today: σήμερα + label_all_time: συνέχεια + label_yesterday: χθες + label_this_week: αυτή την εβδομάδα + label_last_week: την προηγούμενη εβδομάδα + label_last_n_days: "τελευταίες %{count} μέρες" + label_this_month: αυτό το μήνα + label_last_month: τον προηγούμενο μήνα + label_this_year: αυτό το χρόνο + label_date_range: Χρονικό διάστημα + label_less_than_ago: σε λιγότερο από ημέρες πριν + label_more_than_ago: σε περισσότερο από ημέρες πριν + label_ago: ημέρες πριν + label_contains: περιέχει + label_not_contains: δεν περιέχει + label_day_plural: μέρες + label_repository: Αποθετήριο + label_repository_plural: Αποθετήρια + label_browse: Πλοήγηση + label_branch: Branch + label_tag: Tag + label_revision: Αναθεώρηση + label_revision_plural: Αναθεωρήσεις + label_associated_revisions: Συνεταιρικές αναθεωρήσεις + label_added: προστέθηκε + label_modified: τροποποιήθηκε + label_copied: αντιγράφηκε + label_renamed: μετονομάστηκε + label_deleted: διαγράφηκε + label_latest_revision: Τελευταία αναθεώριση + label_latest_revision_plural: Τελευταίες αναθεωρήσεις + label_view_revisions: Προβολή αναθεωρήσεων + label_view_all_revisions: Προβολή όλων των αναθεωρήσεων + label_max_size: Μέγιστο μέγεθος + label_sort_highest: Μετακίνηση στην κορυφή + label_sort_higher: Μετακίνηση προς τα πάνω + label_sort_lower: Μετακίνηση προς τα κάτω + label_sort_lowest: Μετακίνηση στο κατώτατο μέρος + label_roadmap: Χάρτης πορείας + label_roadmap_due_in: "Προθεσμία σε %{value}" + label_roadmap_overdue: "%{value} καθυστερημένο" + label_roadmap_no_issues: Δεν υπάρχουν θέματα για αυτή την έκδοση + label_search: Αναζήτηση + label_result_plural: Αποτελέσματα + label_all_words: Όλες οι λέξεις + label_wiki: Wiki + label_wiki_edit: Επεξεργασία wiki + label_wiki_edit_plural: Επεξεργασία wiki + label_wiki_page: Σελίδα Wiki + label_wiki_page_plural: Σελίδες Wiki + label_index_by_title: Δείκτης ανά τίτλο + label_index_by_date: Δείκτης ανά ημερομηνία + label_current_version: Τρέχουσα έκδοση + label_preview: Προεπισκόπηση + label_feed_plural: Feeds + label_changes_details: Λεπτομέρειες όλων των αλλαγών + label_issue_tracking: Ανίχνευση θεμάτων + label_spent_time: Δαπανημένος χρόνος + label_f_hour: "%{value} ώρα" + label_f_hour_plural: "%{value} ώρες" + label_time_tracking: Ανίχνευση χρόνου + label_change_plural: Αλλαγές + label_statistics: Στατιστικά + label_commits_per_month: Commits ανά μήνα + label_commits_per_author: Commits ανά συγγραφέα + label_view_diff: Προβολή διαφορών + label_diff_inline: σε σειρά + label_diff_side_by_side: αντικρυστά + label_options: Επιλογές + label_copy_workflow_from: Αντιγραφή ροής εργασίας από + label_permissions_report: Συνοπτικός πίνακας αδειών + label_watched_issues: Θέματα υπό παρακολούθηση + label_related_issues: Σχετικά θέματα + label_applied_status: Εφαρμογή κατάστασης + label_loading: Φορτώνεται... + label_relation_new: Νέα συσχέτιση + label_relation_delete: Διαγραφή συσχέτισης + label_relates_to: σχετικό με + label_duplicates: αντίγραφα + label_duplicated_by: αντιγράφηκε από + label_blocks: φραγές + label_blocked_by: φραγή από τον + label_precedes: προηγείται + label_follows: ακολουθεί + label_stay_logged_in: Παραμονή σύνδεσης + label_disabled: απενεργοποιημένη + label_show_completed_versions: Προβολή ολοκληρωμένων εκδόσεων + label_me: εγώ + label_board: Φόρουμ + label_board_new: Νέο φόρουμ + label_board_plural: Φόρουμ + label_topic_plural: Θέματα + label_message_plural: Μηνύματα + label_message_last: Τελευταίο μήνυμα + label_message_new: Νέο μήνυμα + label_message_posted: Το μήνυμα προστέθηκε + label_reply_plural: Απαντήσεις + label_send_information: Αποστολή πληροφοριών λογαριασμού στο χρήστη + label_year: Έτος + label_month: Μήνας + label_week: Εβδομάδα + label_date_from: Από + label_date_to: Έως + label_language_based: Με βάση τη γλώσσα του χρήστη + label_sort_by: "Ταξινόμηση ανά %{value}" + label_send_test_email: Αποστολή δοκιμαστικού email + label_feeds_access_key_created_on: "το κλειδί πρόσβασης Atom δημιουργήθηκε πριν από %{value}" + label_module_plural: Μονάδες + label_added_time_by: "Προστέθηκε από τον %{author} πριν από %{age}" + label_updated_time_by: "Ενημερώθηκε από τον %{author} πριν από %{age}" + label_updated_time: "Ενημερώθηκε πριν από %{value}" + label_jump_to_a_project: Μεταβείτε σε ένα έργο... + label_file_plural: Αρχεία + label_changeset_plural: Changesets + label_default_columns: Προεπιλεγμένες στήλες + label_no_change_option: (Δεν υπάρχουν αλλαγές) + label_bulk_edit_selected_issues: Μαζική επεξεργασία επιλεγμένων θεμάτων + label_theme: Θέμα + label_default: Προεπιλογή + label_search_titles_only: Αναζήτηση τίτλων μόνο + label_user_mail_option_all: "Για όλες τις εξελίξεις σε όλα τα έργα μου" + label_user_mail_option_selected: "Για όλες τις εξελίξεις μόνο στα επιλεγμένα έργα..." + label_user_mail_no_self_notified: "Δεν θέλω να ειδοποιούμαι για τις δικές μου αλλαγές" + label_registration_activation_by_email: ενεργοποίηση λογαριασμού με email + label_registration_manual_activation: χειροκίνητη ενεργοποίηση λογαριασμού + label_registration_automatic_activation: αυτόματη ενεργοποίηση λογαριασμού + label_display_per_page: "Ανά σελίδα: %{value}" + label_age: Ηλικία + label_change_properties: Αλλαγή ιδιοτήτων + label_general: Γενικά + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: Πιστοποίηση LDAP + label_downloads_abbr: Μ/Φ + label_optional_description: Προαιρετική περιγραφή + label_add_another_file: Προσθήκη άλλου αρχείου + label_preferences: Προτιμήσεις + label_chronological_order: Κατά χρονολογική σειρά + label_reverse_chronological_order: Κατά αντίστροφη χρονολογική σειρά + label_incoming_emails: Εισερχόμενα email + label_generate_key: Δημιουργία κλειδιού + label_issue_watchers: Παρατηρητές + label_example: Παράδειγμα + label_display: Προβολή + label_sort: Ταξινόμηση + label_ascending: Αύξουσα + label_descending: Φθίνουσα + label_date_from_to: Από %{start} έως %{end} + label_wiki_content_added: Η σελίδα Wiki προστέθηκε + label_wiki_content_updated: Η σελίδα Wiki ενημερώθηκε + + button_login: Σύνδεση + button_submit: Αποστολή + button_save: Αποθήκευση + button_check_all: Επιλογή όλων + button_uncheck_all: Αποεπιλογή όλων + button_delete: Διαγραφή + button_create: Δημιουργία + button_create_and_continue: Δημιουργία και συνέχεια + button_test: Τεστ + button_edit: Επεξεργασία + button_add: Προσθήκη + button_change: Αλλαγή + button_apply: Εφαρμογή + button_clear: Καθαρισμός + button_lock: Κλείδωμα + button_unlock: Ξεκλείδωμα + button_download: Μεταφόρτωση + button_list: Λίστα + button_view: Προβολή + button_move: Μετακίνηση + button_back: Πίσω + button_cancel: Ακύρωση + button_activate: Ενεργοποίηση + button_sort: Ταξινόμηση + button_log_time: Ιστορικό χρόνου + button_rollback: Επαναφορά σε αυτή την έκδοση + button_watch: Παρακολούθηση + button_unwatch: Αναίρεση παρακολούθησης + button_reply: Απάντηση + button_archive: Αρχειοθέτηση + button_unarchive: Αναίρεση αρχειοθέτησης + button_reset: Επαναφορά + button_rename: Μετονομασία + button_change_password: Αλλαγή κωδικού πρόσβασης + button_copy: Αντιγραφή + button_annotate: Σχολιασμός + button_update: Ενημέρωση + button_configure: Ρύθμιση + button_quote: Παράθεση + + status_active: ενεργό(ς)/ή + status_registered: εγεγγραμμένο(ς)/η + status_locked: κλειδωμένο(ς)/η + + text_select_mail_notifications: Επιλογή ενεργειών για τις οποίες θα πρέπει να αποσταλεί ειδοποίηση με email. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 σημαίνει ότι δεν υπάρχουν περιορισμοί + text_project_destroy_confirmation: Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το έργο και τα σχετικά δεδομένα του; + text_subprojects_destroy_warning: "Επίσης το(α) επιμέρους έργο(α): %{value} θα διαγραφούν." + text_workflow_edit: Επιλέξτε ένα ρόλο και έναν ανιχνευτή για να επεξεργαστείτε τη ροή εργασίας + text_are_you_sure: Είστε σίγουρος ; + text_tip_issue_begin_day: καθήκοντα που ξεκινάνε σήμερα + text_tip_issue_end_day: καθήκοντα που τελειώνουν σήμερα + text_tip_issue_begin_end_day: καθήκοντα που ξεκινάνε και τελειώνουν σήμερα + text_caracters_maximum: "μέγιστος αριθμός %{count} χαρακτήρες." + text_caracters_minimum: "Πρέπει να περιέχει τουλάχιστον %{count} χαρακτήρες." + text_length_between: "Μήκος μεταξύ %{min} και %{max} χαρακτήρες." + text_tracker_no_workflow: Δεν έχει οριστεί ροή εργασίας για αυτό τον ανιχνευτή + text_unallowed_characters: Μη επιτρεπόμενοι χαρακτήρες + text_comma_separated: Επιτρέπονται πολλαπλές τιμές (χωρισμένες με κόμμα). + text_issues_ref_in_commit_messages: Αναφορά και καθορισμός θεμάτων σε μηνύματα commit + text_issue_added: "Το θέμα %{id} παρουσιάστηκε από τον %{author}." + text_issue_updated: "Το θέμα %{id} ενημερώθηκε από τον %{author}." + text_wiki_destroy_confirmation: Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το wiki και όλο το περιεχόμενο του ; + text_issue_category_destroy_question: "Κάποια θέματα (%{count}) έχουν εκχωρηθεί σε αυτή την κατηγορία. Τι θέλετε να κάνετε ;" + text_issue_category_destroy_assignments: Αφαίρεση εκχωρήσεων κατηγορίας + text_issue_category_reassign_to: Επανεκχώρηση θεμάτων σε αυτή την κατηγορία + text_user_mail_option: "Για μη επιλεγμένα έργα, θα λάβετε ειδοποιήσεις μόνο για πράγματα που παρακολουθείτε ή στα οποία συμμετέχω ενεργά (π.χ. θέματα των οποίων είστε συγγραφέας ή σας έχουν ανατεθεί)." + text_no_configuration_data: "Οι ρόλοι, οι ανιχνευτές, η κατάσταση των θεμάτων και η ροή εργασίας δεν έχουν ρυθμιστεί ακόμα.\nΣυνιστάται ιδιαίτερα να φορτώσετε τις προεπιλεγμένες ρυθμίσεις. Θα είστε σε θέση να τις τροποποιήσετε μετά τη φόρτωση τους." + text_load_default_configuration: Φόρτωση προεπιλεγμένων ρυθμίσεων + text_status_changed_by_changeset: "Εφαρμόστηκε στο changeset %{value}." + text_issues_destroy_confirmation: 'Είστε σίγουρος ότι θέλετε να διαγράψετε το επιλεγμένο θέμα(τα);' + text_select_project_modules: 'Επιλέξτε ποιες μονάδες θα ενεργοποιήσετε για αυτό το έργο:' + text_default_administrator_account_changed: Ο προκαθορισμένος λογαριασμός του διαχειριστή άλλαξε + text_file_repository_writable: Εγγράψιμος κατάλογος συνημμένων + text_plugin_assets_writable: Εγγράψιμος κατάλογος plugin assets + text_rmagick_available: Διαθέσιμο RMagick (προαιρετικό) + text_destroy_time_entries_question: "%{hours} δαπανήθηκαν σχετικά με τα θέματα που πρόκειται να διαγράψετε. Τι θέλετε να κάνετε ;" + text_destroy_time_entries: Διαγραφή αναφερόμενων ωρών + text_assign_time_entries_to_project: Ανάθεση αναφερόμενων ωρών στο έργο + text_reassign_time_entries: 'Ανάθεση εκ νέου των αναφερόμενων ωρών στο θέμα:' + text_user_wrote: "%{value} έγραψε:" + text_enumeration_destroy_question: "%{count} αντικείμενα έχουν τεθεί σε αυτή την τιμή." + text_enumeration_category_reassign_to: 'Επανεκχώρηση τους στην παρούσα αξία:' + text_email_delivery_not_configured: "Δεν έχουν γίνει ρυθμίσεις παράδοσης email, και οι ειδοποιήσεις είναι απενεργοποιημένες.\nΔηλώστε τον εξυπηρετητή SMTP στο config/configuration.yml και κάντε επανακκίνηση την εφαρμογή για να τις ρυθμίσεις." + text_repository_usernames_mapping: "Επιλέξτε ή ενημερώστε τον χρήστη Redmine που αντιστοιχεί σε κάθε όνομα χρήστη στο ιστορικό του αποθετηρίου.\nΧρήστες με το ίδιο όνομα χρήστη ή email στο Redmine και στο αποθετηρίο αντιστοιχίζονται αυτόματα." + text_diff_truncated: '... Αυτό το diff εχεί κοπεί επειδή υπερβαίνει το μέγιστο μέγεθος που μπορεί να προβληθεί.' + text_custom_field_possible_values_info: 'Μία γραμμή για κάθε τιμή' + text_wiki_page_destroy_question: "Αυτή η σελίδα έχει %{descendants} σελίδες τέκνων και απογόνων. Τι θέλετε να κάνετε ;" + text_wiki_page_nullify_children: "Διατηρήστε τις σελίδες τέκνων ως σελίδες root" + text_wiki_page_destroy_children: "Διαγράψτε όλες τις σελίδες τέκνων και των απογόνων τους" + text_wiki_page_reassign_children: "Επανεκχώριση των σελίδων τέκνων στη γονική σελίδα" + + default_role_manager: Manager + default_role_developer: Developer + default_role_reporter: Reporter + default_tracker_bug: Σφάλματα + default_tracker_feature: Λειτουργίες + default_tracker_support: Υποστήριξη + default_issue_status_new: Νέα + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Επιλυμένο + default_issue_status_feedback: Σχόλια + default_issue_status_closed: Κλειστό + default_issue_status_rejected: Απορριπτέο + default_doc_category_user: Τεκμηρίωση χρήστη + default_doc_category_tech: Τεχνική τεκμηρίωση + default_priority_low: Χαμηλή + default_priority_normal: Κανονική + default_priority_high: Υψηλή + default_priority_urgent: Επείγον + default_priority_immediate: Άμεση + default_activity_design: Σχεδιασμός + default_activity_development: Ανάπτυξη + + enumeration_issue_priorities: Προτεραιότητα θέματος + enumeration_doc_categories: Κατηγορία εγγράφων + enumeration_activities: Δραστηριότητες (κατακερματισμός χρόνου) + text_journal_changed: "%{label} άλλαξε από %{old} σε %{new}" + text_journal_set_to: "%{label} ορίζεται σε %{value}" + text_journal_deleted: "%{label} διαγράφηκε (%{old})" + label_group_plural: Ομάδες + label_group: Ομάδα + label_group_new: Νέα ομάδα + label_time_entry_plural: Χρόνος που δαπανήθηκε + text_journal_added: "%{label} %{value} added" + field_active: Active + enumeration_system_activity: System Activity + permission_delete_issue_watchers: Delete watchers + version_status_closed: closed + version_status_locked: locked + version_status_open: open + error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened + label_user_anonymous: Anonymous + button_move_and_follow: Move and follow + setting_default_projects_modules: Default enabled modules for new projects + setting_gravatar_default: Default Gravatar image + field_sharing: Sharing + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_system: With all projects + label_version_sharing_descendants: With subprojects + label_version_sharing_tree: With project tree + label_version_sharing_none: Not shared + error_can_not_archive_project: This project can not be archived + button_duplicate: Duplicate + button_copy_and_follow: Copy and follow + label_copy_source: Source + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_status: Use the issue status + error_issue_done_ratios_not_updated: Issue done ratios not updated. + error_workflow_copy_target: Please select target tracker(s) and role(s) + setting_issue_done_ratio_issue_field: Use the issue field + label_copy_same_as_target: Same as target + label_copy_target: Target + notice_issue_done_ratios_updated: Issue done ratios updated. + error_workflow_copy_source: Please select a source tracker or role + label_update_issue_done_ratios: Update issue done ratios + setting_start_of_week: Start calendars on + permission_view_issues: View Issues + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_revision_id: Revision %{value} + label_api_access_key: API access key + label_api_access_key_created_on: API access key created %{value} ago + label_feeds_access_key: Atom access key + notice_api_access_key_reseted: Your API access key was reset. + setting_rest_api_enabled: Enable REST web service + label_missing_api_access_key: Missing an API access key + label_missing_feeds_access_key: Missing a Atom access key + button_show: Show + text_line_separated: Multiple values allowed (one line for each value). + setting_mail_handler_body_delimiters: Truncate emails after one of these lines + permission_add_subprojects: Create subprojects + label_subproject_new: New subproject + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_close_versions: Close completed versions + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Κωδικοποίηση μηνυμάτων commit + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 Θέμα + one: 1 Θέμα + other: "%{count} Θέματα" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: όλα + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Σύνολο + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: κλειδί API + setting_lost_password: Ανάκτηση κωδικού πρόσβασης + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml new file mode 100644 index 0000000..2723241 --- /dev/null +++ b/config/locales/en-GB.yml @@ -0,0 +1,1232 @@ +en-GB: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d/%m/%Y" + short: "%d %b" + long: "%d %B, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%d/%m/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_hours: + one: "1 hour" + other: "%{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: " " + precision: 3 + + currency: + format: + format: "%u%n" + unit: "£" + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "and" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "is not included in the list" + exclusion: "is reserved" + invalid: "is invalid" + confirmation: "doesn't match confirmation" + accepted: "must be accepted" + empty: "cannot be empty" + blank: "cannot be blank" + too_long: "is too long (maximum is %{count} characters)" + too_short: "is too short (minimum is %{count} characters)" + wrong_length: "is the wrong length (should be %{count} characters)" + taken: "has already been taken" + not_a_number: "is not a number" + not_a_date: "is not a valid date" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "must be odd" + even: "must be even" + greater_than_start_date: "must be greater than start date" + not_same_project: "doesn't belong to the same project" + circular_dependency: "This relation would create a circular dependency" + cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Please select + + general_text_No: 'No' + general_text_Yes: 'Yes' + general_text_no: 'no' + general_text_yes: 'yes' + general_lang_name: 'English (British)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Account was successfully updated. + notice_account_invalid_credentials: Invalid user or password + notice_account_password_updated: Password was successfully updated. + notice_account_wrong_password: Wrong password + notice_account_register_done: Account was successfully created. An email containing the instructions to activate your account was sent to %{email}. + notice_account_unknown_email: Unknown user. + notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. + notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. + notice_account_activated: Your account has been activated. You can now log in. + notice_successful_create: Successful creation. + notice_successful_update: Successful update. + notice_successful_delete: Successful deletion. + notice_successful_connection: Successful connection. + notice_file_not_found: The page you were trying to access doesn't exist or has been removed. + notice_locking_conflict: Data has been updated by another user. + notice_not_authorized: You are not authorised to access this page. + notice_not_authorized_archived_project: The project you're trying to access has been archived. + notice_email_sent: "An email was sent to %{value}" + notice_email_error: "An error occurred while sending mail (%{value})" + notice_feeds_access_key_reseted: Your Atom access key was reset. + notice_api_access_key_reseted: Your API access key was reset. + notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." + notice_account_pending: "Your account was created and is now pending administrator approval." + notice_default_data_loaded: Default configuration successfully loaded. + notice_unable_delete_version: Unable to delete version. + notice_unable_delete_time_entry: Unable to delete time log entry. + notice_issue_done_ratios_updated: Issue done ratios updated. + notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})" + + error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" + error_scm_not_found: "The entry or revision was not found in the repository." + error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" + error_scm_annotate: "The entry does not exist or cannot be annotated." + error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size." + error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_delete_custom_field: Unable to delete custom field + error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." + error_can_not_remove_role: "This role is in use and cannot be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened' + error_can_not_archive_project: This project cannot be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + error_unable_delete_issue_status: 'Unable to delete issue status' + error_unable_to_connect: "Unable to connect (%{value})" + warning_attachments_not_saved: "%{count} file(s) could not be saved." + + mail_subject_lost_password: "Your %{value} password" + mail_body_lost_password: 'To change your password, click on the following link:' + mail_subject_register: "Your %{value} account activation" + mail_body_register: 'To activate your account, click on the following link:' + mail_body_account_information_external: "You can use your %{value} account to log in." + mail_body_account_information: Your account information + mail_subject_account_activation_request: "%{value} account activation request" + mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:" + mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" + mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + + field_name: Name + field_description: Description + field_summary: Summary + field_is_required: Required + field_firstname: First name + field_lastname: Last name + field_mail: Email + field_filename: File + field_filesize: Size + field_downloads: Downloads + field_author: Author + field_created_on: Created + field_updated_on: Updated + field_field_format: Format + field_is_for_all: For all projects + field_possible_values: Possible values + field_regexp: Regular expression + field_min_length: Minimum length + field_max_length: Maximum length + field_value: Value + field_category: Category + field_title: Title + field_project: Project + field_issue: Issue + field_status: Status + field_notes: Notes + field_is_closed: Issue closed + field_is_default: Default value + field_tracker: Tracker + field_subject: Subject + field_due_date: Due date + field_assigned_to: Assignee + field_priority: Priority + field_fixed_version: Target version + field_user: User + field_principal: Principal + field_role: Role + field_homepage: Homepage + field_is_public: Public + field_parent: Subproject of + field_is_in_roadmap: Issues displayed in roadmap + field_login: Login + field_mail_notification: Email notifications + field_admin: Administrator + field_last_login_on: Last connection + field_language: Language + field_effective_date: Due date + field_password: Password + field_new_password: New password + field_password_confirmation: Confirmation + field_version: Version + field_type: Type + field_host: Host + field_port: Port + field_account: Account + field_base_dn: Base DN + field_attr_login: Login attribute + field_attr_firstname: Firstname attribute + field_attr_lastname: Lastname attribute + field_attr_mail: Email attribute + field_onthefly: On-the-fly user creation + field_start_date: Start date + field_done_ratio: "% Done" + field_auth_source: Authentication mode + field_hide_mail: Hide my email address + field_comments: Comment + field_url: URL + field_start_page: Start page + field_subproject: Subproject + field_hours: Hours + field_activity: Activity + field_spent_on: Date + field_identifier: Identifier + field_is_filter: Used as a filter + field_issue_to: Related issue + field_delay: Delay + field_assignable: Issues can be assigned to this role + field_redirect_existing_links: Redirect existing links + field_estimated_hours: Estimated time + field_column_names: Columns + field_time_entries: Log time + field_time_zone: Time zone + field_searchable: Searchable + field_default_value: Default value + field_comments_sorting: Display comments + field_parent_title: Parent page + field_editable: Editable + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Content + field_group_by: Group results by + field_sharing: Sharing + field_parent_issue: Parent task + field_member_of_group: "Assignee's group" + field_assigned_to_role: "Assignee's role" + field_text: Text field + field_visible: Visible + field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text" + + setting_app_title: Application title + setting_app_subtitle: Application subtitle + setting_welcome_text: Welcome text + setting_default_language: Default language + setting_login_required: Authentication required + setting_self_registration: Self-registration + setting_attachment_max_size: Attachment max. size + setting_issues_export_limit: Issues export limit + setting_mail_from: Emission email address + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Plain text mail (no HTML) + setting_host_name: Host name and path + setting_text_formatting: Text formatting + setting_wiki_compression: Wiki history compression + setting_feeds_limit: Feed content limit + setting_default_projects_public: New projects are public by default + setting_autofetch_changesets: Autofetch commits + setting_sys_api_enabled: Enable WS for repository management + setting_commit_ref_keywords: Referencing keywords + setting_commit_fix_keywords: Fixing keywords + setting_autologin: Autologin + setting_date_format: Date format + setting_time_format: Time format + setting_cross_project_issue_relations: Allow cross-project issue relations + setting_issue_list_default_columns: Default columns displayed on the issue list + setting_emails_header: Email header + setting_emails_footer: Email footer + setting_protocol: Protocol + setting_per_page_options: Objects per page options + setting_user_format: Users display format + setting_activity_days_default: Days displayed on project activity + setting_display_subprojects_issues: Display subprojects issues on main projects by default + setting_enabled_scm: Enabled SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: Generate sequential project identifiers + setting_gravatar_enabled: Use Gravatar user icons + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Max number of diff lines displayed + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + setting_default_notification_option: Default notification option + setting_commit_logtime_enabled: Enable time logging + setting_commit_logtime_activity_id: Activity for logged time + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + setting_issue_group_assignment: Allow issue assignment to groups + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + + permission_add_project: Create project + permission_add_subprojects: Create subprojects + permission_edit_project: Edit project + permission_select_project_modules: Select project modules + permission_manage_members: Manage members + permission_manage_project_activities: Manage project activities + permission_manage_versions: Manage versions + permission_manage_categories: Manage issue categories + permission_view_issues: View Issues + permission_add_issues: Add issues + permission_edit_issues: Edit issues + permission_manage_issue_relations: Manage issue relations + permission_add_issue_notes: Add notes + permission_edit_issue_notes: Edit notes + permission_edit_own_issue_notes: Edit own notes + permission_move_issues: Move issues + permission_delete_issues: Delete issues + permission_manage_public_queries: Manage public queries + permission_save_queries: Save queries + permission_view_gantt: View gantt chart + permission_view_calendar: View calendar + permission_view_issue_watchers: View watchers list + permission_add_issue_watchers: Add watchers + permission_delete_issue_watchers: Delete watchers + permission_log_time: Log spent time + permission_view_time_entries: View spent time + permission_edit_time_entries: Edit time logs + permission_edit_own_time_entries: Edit own time logs + permission_manage_news: Manage news + permission_comment_news: Comment news + permission_view_documents: View documents + permission_manage_files: Manage files + permission_view_files: View files + permission_manage_wiki: Manage wiki + permission_rename_wiki_pages: Rename wiki pages + permission_delete_wiki_pages: Delete wiki pages + permission_view_wiki_pages: View wiki + permission_view_wiki_edits: View wiki history + permission_edit_wiki_pages: Edit wiki pages + permission_delete_wiki_pages_attachments: Delete attachments + permission_protect_wiki_pages: Protect wiki pages + permission_manage_repository: Manage repository + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Commit access + permission_manage_boards: Manage forums + permission_view_messages: View messages + permission_add_messages: Post messages + permission_edit_messages: Edit messages + permission_edit_own_messages: Edit own messages + permission_delete_messages: Delete messages + permission_delete_own_messages: Delete own messages + permission_export_wiki_pages: Export wiki pages + permission_manage_subtasks: Manage subtasks + + project_module_issue_tracking: Issue tracking + project_module_time_tracking: Time tracking + project_module_news: News + project_module_documents: Documents + project_module_files: Files + project_module_wiki: Wiki + project_module_repository: Repository + project_module_boards: Forums + project_module_calendar: Calendar + project_module_gantt: Gantt + + label_user: User + label_user_plural: Users + label_user_new: New user + label_user_anonymous: Anonymous + label_project: Project + label_project_new: New project + label_project_plural: Projects + label_x_projects: + zero: no projects + one: 1 project + other: "%{count} projects" + label_project_all: All Projects + label_project_latest: Latest projects + label_issue: Issue + label_issue_new: New issue + label_issue_plural: Issues + label_issue_view_all: View all issues + label_issues_by: "Issues by %{value}" + label_issue_added: Issue added + label_issue_updated: Issue updated + label_document: Document + label_document_new: New document + label_document_plural: Documents + label_document_added: Document added + label_role: Role + label_role_plural: Roles + label_role_new: New role + label_role_and_permissions: Roles and permissions + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_member: Member + label_member_new: New member + label_member_plural: Members + label_tracker: Tracker + label_tracker_plural: Trackers + label_tracker_new: New tracker + label_workflow: Workflow + label_issue_status: Issue status + label_issue_status_plural: Issue statuses + label_issue_status_new: New status + label_issue_category: Issue category + label_issue_category_plural: Issue categories + label_issue_category_new: New category + label_custom_field: Custom field + label_custom_field_plural: Custom fields + label_custom_field_new: New custom field + label_enumerations: Enumerations + label_enumeration_new: New value + label_information: Information + label_information_plural: Information + label_please_login: Please log in + label_register: Register + label_login_with_open_id_option: or login with OpenID + label_password_lost: Lost password + label_home: Home + label_my_page: My page + label_my_account: My account + label_my_projects: My projects + label_administration: Administration + label_login: Sign in + label_logout: Sign out + label_help: Help + label_reported_issues: Reported issues + label_assigned_to_me_issues: Issues assigned to me + label_last_login: Last connection + label_registered_on: Registered on + label_activity: Activity + label_overall_activity: Overall activity + label_user_activity: "%{value}'s activity" + label_new: New + label_logged_as: Logged in as + label_environment: Environment + label_authentication: Authentication + label_auth_source: Authentication mode + label_auth_source_new: New authentication mode + label_auth_source_plural: Authentication modes + label_subproject_plural: Subprojects + label_subproject_new: New subproject + label_and_its_subprojects: "%{value} and its subprojects" + label_min_max_length: Min - Max length + label_list: List + label_date: Date + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Text + label_text: Long text + label_attribute: Attribute + label_attribute_plural: Attributes + label_no_data: No data to display + label_no_preview: No preview available + label_change_status: Change status + label_history: History + label_attachment: File + label_attachment_new: New file + label_attachment_delete: Delete file + label_attachment_plural: Files + label_file_added: File added + label_report: Report + label_report_plural: Reports + label_news: News + label_news_new: Add news + label_news_plural: News + label_news_latest: Latest news + label_news_view_all: View all news + label_news_added: News added + label_news_comment_added: Comment added to a news + label_settings: Settings + label_overview: Overview + label_version: Version + label_version_new: New version + label_version_plural: Versions + label_close_versions: Close completed versions + label_confirmation: Confirmation + label_export_to: 'Also available in:' + label_read: Read... + label_public_projects: Public projects + label_open_issues: open + label_open_issues_plural: open + label_closed_issues: closed + label_closed_issues_plural: closed + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_total: Total + label_permissions: Permissions + label_current_status: Current status + label_new_statuses_allowed: New statuses allowed + label_all: all + label_none: none + label_nobody: nobody + label_next: Next + label_previous: Previous + label_used_by: Used by + label_details: Details + label_add_note: Add a note + label_calendar: Calendar + label_months_from: months from + label_gantt: Gantt + label_internal: Internal + label_last_changes: "last %{count} changes" + label_change_view_all: View all changes + label_comment: Comment + label_comment_plural: Comments + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_comment_add: Add a comment + label_comment_added: Comment added + label_comment_delete: Delete comments + label_query: Custom query + label_query_plural: Custom queries + label_query_new: New query + label_my_queries: My custom queries + label_filter_add: Add filter + label_filter_plural: Filters + label_equals: is + label_not_equals: is not + label_in_less_than: in less than + label_in_more_than: in more than + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: in + label_today: today + label_all_time: all time + label_yesterday: yesterday + label_this_week: this week + label_last_week: last week + label_last_n_days: "last %{count} days" + label_this_month: this month + label_last_month: last month + label_this_year: this year + label_date_range: Date range + label_less_than_ago: less than days ago + label_more_than_ago: more than days ago + label_ago: days ago + label_contains: contains + label_not_contains: doesn't contain + label_day_plural: days + label_repository: Repository + label_repository_plural: Repositories + label_browse: Browse + label_branch: Branch + label_tag: Tag + label_revision: Revision + label_revision_plural: Revisions + label_revision_id: "Revision %{value}" + label_associated_revisions: Associated revisions + label_added: added + label_modified: modified + label_copied: copied + label_renamed: renamed + label_deleted: deleted + label_latest_revision: Latest revision + label_latest_revision_plural: Latest revisions + label_view_revisions: View revisions + label_view_all_revisions: View all revisions + label_max_size: Maximum size + label_sort_highest: Move to top + label_sort_higher: Move up + label_sort_lower: Move down + label_sort_lowest: Move to bottom + label_roadmap: Roadmap + label_roadmap_due_in: "Due in %{value}" + label_roadmap_overdue: "%{value} late" + label_roadmap_no_issues: No issues for this version + label_search: Search + label_result_plural: Results + label_all_words: All words + label_wiki: Wiki + label_wiki_edit: Wiki edit + label_wiki_edit_plural: Wiki edits + label_wiki_page: Wiki page + label_wiki_page_plural: Wiki pages + label_index_by_title: Index by title + label_index_by_date: Index by date + label_current_version: Current version + label_preview: Preview + label_feed_plural: Feeds + label_changes_details: Details of all changes + label_issue_tracking: Issue tracking + label_spent_time: Spent time + label_overall_spent_time: Overall spent time + label_f_hour: "%{value} hour" + label_f_hour_plural: "%{value} hours" + label_time_tracking: Time tracking + label_change_plural: Changes + label_statistics: Statistics + label_commits_per_month: Commits per month + label_commits_per_author: Commits per author + label_view_diff: View differences + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: Options + label_copy_workflow_from: Copy workflow from + label_permissions_report: Permissions report + label_watched_issues: Watched issues + label_related_issues: Related issues + label_applied_status: Applied status + label_loading: Loading... + label_relation_new: New relation + label_relation_delete: Delete relation + label_relates_to: related to + label_duplicates: is duplicate of + label_duplicated_by: has duplicate + label_blocks: blocks + label_blocked_by: blocked by + label_precedes: precedes + label_follows: follows + label_stay_logged_in: Stay logged in + label_disabled: disabled + label_show_completed_versions: Show completed versions + label_me: me + label_board: Forum + label_board_new: New forum + label_board_plural: Forums + label_board_locked: Locked + label_board_sticky: Sticky + label_topic_plural: Topics + label_message_plural: Messages + label_message_last: Last message + label_message_new: New message + label_message_posted: Message added + label_reply_plural: Replies + label_send_information: Send account information to the user + label_year: Year + label_month: Month + label_week: Week + label_date_from: From + label_date_to: To + label_language_based: Based on user's language + label_sort_by: "Sort by %{value}" + label_send_test_email: Send a test email + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom access key created %{value} ago" + label_module_plural: Modules + label_added_time_by: "Added by %{author} %{age} ago" + label_updated_time_by: "Updated by %{author} %{age} ago" + label_updated_time: "Updated %{value} ago" + label_jump_to_a_project: Jump to a project... + label_file_plural: Files + label_changeset_plural: Changesets + label_default_columns: Default columns + label_no_change_option: (No change) + label_bulk_edit_selected_issues: Bulk edit selected issues + label_theme: Theme + label_default: Default + label_search_titles_only: Search titles only + label_user_mail_option_all: "For any event on all my projects" + label_user_mail_option_selected: "For any event on the selected projects only..." + label_user_mail_option_none: "No events" + label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" + label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" + label_registration_activation_by_email: account activation by email + label_registration_manual_activation: manual account activation + label_registration_automatic_activation: automatic account activation + label_display_per_page: "Per page: %{value}" + label_age: Age + label_change_properties: Change properties + label_general: General + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: LDAP authentication + label_downloads_abbr: D/L + label_optional_description: Optional description + label_add_another_file: Add another file + label_preferences: Preferences + label_chronological_order: In chronological order + label_reverse_chronological_order: In reverse chronological order + label_incoming_emails: Incoming emails + label_generate_key: Generate a key + label_issue_watchers: Watchers + label_example: Example + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Groups + label_group_new: New group + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + label_profile: Profile + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + + button_login: Login + button_submit: Submit + button_save: Save + button_check_all: Check all + button_uncheck_all: Uncheck all + button_collapse_all: Collapse all + button_expand_all: Expand all + button_delete: Delete + button_create: Create + button_create_and_continue: Create and continue + button_test: Test + button_edit: Edit + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + button_add: Add + button_change: Change + button_apply: Apply + button_clear: Clear + button_lock: Lock + button_unlock: Unlock + button_download: Download + button_list: List + button_view: View + button_move: Move + button_move_and_follow: Move and follow + button_back: Back + button_cancel: Cancel + button_activate: Activate + button_sort: Sort + button_log_time: Log time + button_rollback: Rollback to this version + button_watch: Watch + button_unwatch: Unwatch + button_reply: Reply + button_archive: Archive + button_unarchive: Unarchive + button_reset: Reset + button_rename: Rename + button_change_password: Change password + button_copy: Copy + button_copy_and_follow: Copy and follow + button_annotate: Annotate + button_update: Update + button_configure: Configure + button_quote: Quote + button_duplicate: Duplicate + button_show: Show + + status_active: active + status_registered: registered + status_locked: locked + + version_status_open: open + version_status_locked: locked + version_status_closed: closed + + field_active: Active + + text_select_mail_notifications: Select actions for which email notifications should be sent. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 means no restriction + text_project_destroy_confirmation: Are you sure you want to delete this project and related data? + text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Are you sure? + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_changed_no_detail: "%{label} updated" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + text_journal_added: "%{label} %{value} added" + text_tip_issue_begin_day: task beginning this day + text_tip_issue_end_day: task ending this day + text_tip_issue_begin_end_day: task beginning and ending this day + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.
    Once saved, the identifier cannot be changed.' + text_caracters_maximum: "%{count} characters maximum." + text_caracters_minimum: "Must be at least %{count} characters long." + text_length_between: "Length between %{min} and %{max} characters." + text_tracker_no_workflow: No workflow defined for this tracker + text_unallowed_characters: Unallowed characters + text_comma_separated: Multiple values allowed (comma separated). + text_line_separated: Multiple values allowed (one line for each value). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Issue %{id} has been reported by %{author}." + text_issue_updated: "Issue %{id} has been updated by %{author}." + text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? + text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" + text_issue_category_destroy_assignments: Remove category assignments + text_issue_category_reassign_to: Reassign issues to this category + text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Load the default configuration + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_time_logged_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' + text_select_project_modules: 'Select modules to enable for this project:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Attachments directory writable + text_plugin_assets_writable: Plugin assets directory writable + text_rmagick_available: RMagick available (optional) + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" + text_destroy_time_entries: Delete reported hours + text_assign_time_entries_to_project: Assign reported hours to the project + text_reassign_time_entries: 'Reassign reported hours to this issue:' + text_user_wrote: "%{value} wrote:" + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + text_zoom_in: Zoom in + text_zoom_out: Zoom out + text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page." + + default_role_manager: Manager + default_role_developer: Developer + default_role_reporter: Reporter + default_tracker_bug: Bug + default_tracker_feature: Feature + default_tracker_support: Support + default_issue_status_new: New + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Resolved + default_issue_status_feedback: Feedback + default_issue_status_closed: Closed + default_issue_status_rejected: Rejected + default_doc_category_user: User documentation + default_doc_category_tech: Technical documentation + default_priority_low: Low + default_priority_normal: Normal + default_priority_high: High + default_priority_urgent: Urgent + default_priority_immediate: Immediate + default_activity_design: Design + default_activity_development: Development + + enumeration_issue_priorities: Issue priorities + enumeration_doc_categories: Document categories + enumeration_activities: Activities (time tracking) + enumeration_system_activity: System Activity + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_issue_successful_create: Issue %{id} created. + label_between: between + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 issue + one: 1 issue + other: "%{count} issues" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position} of %{count}" + label_completed_versions: Completed versions + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_any: all + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Total + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API key + setting_lost_password: Lost password + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/en.yml b/config/locales/en.yml index 495dede..687523b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -132,10 +132,6 @@ en: earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" not_a_regexp: "is not a valid regular expression" open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" - must_contain_uppercase: "must contain uppercase letters (A-Z)" - must_contain_lowercase: "must contain lowercase letters (a-z)" - must_contain_digits: "must contain digits (0-9)" - must_contain_special_chars: "must contain special characters (!, $, %, ...)" actionview_instancetag_blank_option: Please select @@ -208,11 +204,10 @@ en: error_issue_done_ratios_not_updated: "Issue done ratios not updated." error_workflow_copy_source: 'Please select a source tracker or role' error_workflow_copy_target: 'Please select target tracker(s) and role(s)' - error_unable_delete_issue_status: 'Unable to delete issue status (%{value})' + error_unable_delete_issue_status: 'Unable to delete issue status' error_unable_to_connect: "Unable to connect (%{value})" error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" error_session_expired: "Your session has expired. Please login again." - error_token_expired: "This password recovery link has expired, please try again." warning_attachments_not_saved: "%{count} file(s) could not be saved." error_password_expired: "Your password has expired or the administrator requires you to change it." error_invalid_file_encoding: "The file is not a valid %{encoding} encoded file" @@ -225,14 +220,9 @@ en: error_move_of_child_not_possible: "Subtask %{child} could not be moved to the new project: %{errors}" error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: "Spent time cannot be reassigned to an issue that is about to be deleted" warning_fields_cleared_on_bulk_edit: "Changes will result in the automatic deletion of values from one or more fields on the selected objects" - error_exceeds_maximum_hours_per_day: "Cannot log more than %{max_hours} hours on the same day (%{logged_hours} hours have already been logged)" - error_can_not_delete_auth_source: "This authentication mode is in use and cannot be deleted." - error_spent_on_future_date: "Cannot log time on a future date" - error_not_allowed_to_log_time_for_other_users: "You are not allowed to log time for other users" mail_subject_lost_password: "Your %{value} password" mail_body_lost_password: 'To change your password, click on the following link:' - mail_body_lost_password_validity: 'Please be aware that you may change the password only once using this link.' mail_subject_register: "Your %{value} account activation" mail_body_register: 'To activate your account, click on the following link:' mail_body_account_information_external: "You can use your %{value} account to log in." @@ -333,7 +323,7 @@ en: field_is_filter: Used as a filter field_issue_to: Related issue field_delay: Delay - field_assignable: Issues can be assigned to users with this role + field_assignable: Issues can be assigned to this role field_redirect_existing_links: Redirect existing links field_estimated_hours: Estimated time field_column_names: Columns @@ -350,7 +340,6 @@ en: field_group_by: Group results by field_sharing: Sharing field_parent_issue: Parent task - field_parent_issue_subject: Parent task subject field_member_of_group: "Assignee's group" field_assigned_to_role: "Assignee's role" field_text: Text field @@ -386,11 +375,9 @@ en: field_full_width_layout: Full width layout field_digest: Checksum field_default_assigned_to: Default assignee - field_recently_used_projects: Number of recently used projects in jump box - field_history_default_tab: Issue's history default tab - field_unique_id: Unique ID setting_app_title: Application title + setting_app_subtitle: Application subtitle setting_welcome_text: Welcome text setting_default_language: Default language setting_login_required: Authentication required @@ -416,7 +403,7 @@ en: setting_timespan_format: Time span format setting_cross_project_issue_relations: Allow cross-project issue relations setting_cross_project_subtasks: Allow cross-project subtasks - setting_issue_list_default_columns: Issues list defaults + setting_issue_list_default_columns: Default columns displayed on the issue list setting_repositories_encodings: Attachments and repositories encodings setting_emails_header: Email header setting_emails_footer: Email footer @@ -427,10 +414,9 @@ en: setting_display_subprojects_issues: Display subprojects issues on main projects by default setting_enabled_scm: Enabled SCM setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" - setting_mail_handler_enable_regex: "Enable regular expressions" + setting_mail_handler_enable_regex_delimiters: "Enable regular expressions" setting_mail_handler_api_enabled: Enable WS for incoming emails setting_mail_handler_api_key: Incoming email WS API key - setting_mail_handler_preferred_body_part: Preferred part of multipart (HTML) emails setting_sys_api_key: Repository management WS API key setting_sequential_project_identifiers: Generate sequential project identifiers setting_gravatar_enabled: Use Gravatar user icons @@ -441,7 +427,6 @@ en: setting_openid: Allow OpenID login and registration setting_password_max_age: Require password change after setting_password_min_length: Minimum password length - setting_password_required_char_classes : Required character classes for passwords setting_lost_password: Allow password reset via email setting_new_project_user_role_id: Role given to a non-admin user who creates a project setting_default_projects_modules: Default enabled modules for new projects @@ -455,7 +440,6 @@ en: setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_activity_id: Activity for logged time setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - setting_gantt_months_limit: Maximum number of months displayed on the gantt chart setting_issue_group_assignment: Allow issue assignment to groups setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed @@ -478,13 +462,6 @@ en: setting_new_item_menu_tab: Project menu tab for creating new objects setting_commit_logs_formatting: Apply text formatting to commit messages setting_timelog_required_fields: Required fields for time logs - setting_close_duplicate_issues: Close duplicate issues automatically - setting_time_entry_list_defaults: Timelog list defaults - setting_timelog_accept_0_hours: Accept time logs with 0 hours - setting_timelog_max_hours_per_day: Maximum hours that can be logged per day and user - setting_timelog_accept_future_dates: Accept time logs on future dates - setting_show_status_changes_in_mail_subject: Show status changes in issue mail notifications subject - setting_project_list_defaults: Projects list defaults permission_add_project: Create project permission_add_subprojects: Create subprojects @@ -498,7 +475,6 @@ en: permission_view_issues: View Issues permission_add_issues: Add issues permission_edit_issues: Edit issues - permission_edit_own_issues: Edit own issues permission_copy_issues: Copy issues permission_manage_issue_relations: Manage issue relations permission_set_issues_private: Set issues public or private @@ -508,6 +484,7 @@ en: permission_edit_own_issue_notes: Edit own notes permission_view_private_notes: View private notes permission_set_notes_private: Set notes as private + permission_move_issues: Move issues permission_delete_issues: Delete issues permission_manage_public_queries: Manage public queries permission_save_queries: Save queries @@ -552,7 +529,6 @@ en: permission_manage_subtasks: Manage subtasks permission_manage_related_issues: Manage related issues permission_import_issues: Import issues - permission_log_time_for_other_users: Log spent time for other users project_module_issue_tracking: Issue tracking project_module_time_tracking: Time tracking @@ -589,7 +565,6 @@ en: label_issue_status_updated: Status updated label_issue_assigned_to_updated: Assignee updated label_issue_priority_updated: Priority updated - label_issue_fixed_version_updated: Target version updated label_document: Document label_document_new: New document label_document_plural: Documents @@ -621,6 +596,7 @@ en: label_enumeration_new: New value label_information: Information label_information_plural: Information + label_please_login: Please log in label_register: Register label_login_with_open_id_option: or login with OpenID label_password_lost: Lost password @@ -636,7 +612,6 @@ en: label_reported_issues: Reported issues label_assigned_issues: Assigned issues label_assigned_to_me_issues: Issues assigned to me - label_updated_issues: Updated issues label_last_login: Last connection label_registered_on: Registered on label_activity: Activity @@ -687,7 +662,6 @@ en: label_version: Version label_version_new: New version label_version_plural: Versions - label_version_and_files: Versions (%{count}) and Files label_close_versions: Close completed versions label_confirmation: Confirmation label_export_to: 'Also available in:' @@ -756,16 +730,14 @@ en: label_between: between label_in: in label_today: today + label_all_time: all time label_yesterday: yesterday - label_tomorrow: tomorrow label_this_week: this week label_last_week: last week - label_next_week: next week label_last_n_weeks: "last %{count} weeks" label_last_n_days: "last %{count} days" label_this_month: this month label_last_month: last month - label_next_month: next month label_this_year: this year label_date_range: Date range label_less_than_ago: less than days ago @@ -773,8 +745,6 @@ en: label_ago: days ago label_contains: contains label_not_contains: doesn't contain - label_starts_with: starts with - label_ends_with: ends with label_any_issues_in_project: any issues in project label_any_issues_not_in_project: any issues not in project label_no_issues_in_project: no issues in project @@ -800,7 +770,6 @@ en: label_latest_revision_plural: Latest revisions label_view_revisions: View revisions label_view_all_revisions: View all revisions - label_x_revisions: "%{count} revisions" label_max_size: Maximum size label_sort_highest: Move to top label_sort_higher: Move up @@ -851,7 +820,6 @@ en: label_relation_new: New relation label_relation_delete: Delete relation label_relates_to: Related to - label_delete_link_to_subtask: Delete link to subtask label_duplicates: Is duplicate of label_duplicated_by: Has duplicate label_blocks: Blocks @@ -917,11 +885,7 @@ en: label_general: General label_scm: SCM label_plugins: Plugins - label_ldap: LDAP label_ldap_authentication: LDAP authentication - label_ldaps_verify_none: LDAPS (without certificate check) - label_ldaps_verify_peer: LDAPS - label_ldaps_warning: It is recommended to use an encrypted LDAPS connection with certificate check to prevent any manipulation during the authentication process. label_downloads_abbr: D/L label_optional_description: Optional description label_add_another_file: Add another file @@ -961,7 +925,6 @@ en: label_profile: Profile label_subtask_plural: Subtasks label_project_copy_notifications: Send email notifications during the project copy - label_import_notifications: Send email notifications during the import label_principal_search: "Search for user or group:" label_user_search: "Search for user:" label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author @@ -979,6 +942,7 @@ en: label_completed_versions: Completed versions label_search_for_watchers: Search for watchers to add label_session_expiration: Session expiration + label_show_closed_projects: View closed projects label_status_transitions: Status transitions label_fields_permissions: Fields permissions label_readonly: Read-only @@ -1033,7 +997,6 @@ en: label_member_management_all_roles: All roles label_member_management_selected_roles_only: Only these roles label_import_issues: Import issues - permission_import_time_entries: Import time entries label_select_file_to_import: Select the file to import label_fields_separator: Field separator label_fields_wrapper: Field wrapper @@ -1055,28 +1018,7 @@ en: label_font_default: Default font label_font_monospace: Monospaced font label_font_proportional: Proportional font - label_optgroup_bookmarks: Bookmarks - label_optgroup_others: Other projects - label_optgroup_recents: Recently used label_last_notes: Last notes - label_nothing_to_preview: Nothing to preview - label_inherited_from_parent_project: "Inherited from parent project" - label_inherited_from_group: "Inherited from group %{name}" - label_trackers_description: Trackers description - label_open_trackers_description: View all trackers description - label_preferred_body_part_text: Text - label_preferred_body_part_html: HTML (experimental) - label_issue_history_properties: Property changes - label_issue_history_notes: Notes - label_last_tab_visited: Last visited tab - label_password_char_class_uppercase: uppercase letters - label_password_char_class_lowercase: lowercase letters - label_password_char_class_digits: digits - label_password_char_class_special_chars: special characters - label_display_type: Display results as - label_display_type_list: List - label_display_type_board: Board - label_my_bookmarks: My bookmarks button_login: Login button_submit: Submit @@ -1087,7 +1029,7 @@ en: button_expand_all: Expand all button_delete: Delete button_create: Create - button_create_and_continue: Create and add another + button_create_and_continue: Create and continue button_test: Test button_edit: Edit button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" @@ -1122,6 +1064,7 @@ en: button_update: Update button_configure: Configure button_quote: Quote + button_duplicate: Duplicate button_show: Show button_hide: Hide button_edit_section: Edit this section @@ -1130,10 +1073,7 @@ en: button_close: Close button_reopen: Reopen button_import: Import - button_project_bookmark: Add bookmark - button_project_bookmark_delete: Remove bookmark button_filter: Filter - button_actions: Actions status_active: active status_registered: registered @@ -1164,14 +1104,11 @@ en: text_tip_issue_begin_day: issue beginning this day text_tip_issue_end_day: issue ending this day text_tip_issue_begin_end_day: issue beginning and ending this day - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.
    Once saved, the identifier cannot be changed.' text_caracters_maximum: "%{count} characters maximum." text_caracters_minimum: "Must be at least %{count} characters long." - text_characters_must_contain: "Must contain %{character_classes}." text_length_between: "Length between %{min} and %{max} characters." text_tracker_no_workflow: No workflow defined for this tracker - text_role_no_workflow: No workflow defined for this role - text_status_no_workflow: No tracker uses this status in the workflows text_unallowed_characters: Unallowed characters text_comma_separated: Multiple values allowed (comma separated). text_line_separated: Multiple values allowed (one line for each value). @@ -1194,15 +1131,13 @@ en: text_default_administrator_account_changed: Default administrator account changed text_file_repository_writable: Attachments directory writable text_plugin_assets_writable: Plugin assets directory writable - text_minimagick_available: MiniMagick available (optional) + text_rmagick_available: RMagick available (optional) text_convert_available: ImageMagick convert available (optional) - text_gs_available: ImageMagick PDF support available (optional) text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" text_destroy_time_entries: Delete reported hours text_assign_time_entries_to_project: Assign reported hours to the project text_reassign_time_entries: 'Reassign reported hours to this issue:' text_user_wrote: "%{value} wrote:" - text_user_wrote_in: "%{value} wrote in %{link}:" text_enumeration_destroy_question: "%{count} objects are assigned to the value “%{name}”." text_enumeration_category_reassign_to: 'Reassign them to this value:' text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." @@ -1232,10 +1167,6 @@ en: text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." text_project_closed: This project is closed and read-only. text_turning_multiple_off: "If you disable multiple values, multiple values will be removed in order to preserve only one value per item." - text_select_apply_tracker: "Select tracker" - text_avatar_server_config_html: The current avatar server is %{url}. You can configure it in config/configuration.yml. - text_no_subject: no subject - default_role_manager: Manager default_role_developer: Developer @@ -1278,14 +1209,38 @@ en: description_issue_category_reassign: Choose issue category description_wiki_subpages_reassign: Choose new parent page text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' - text_login_required_html: When not requiring authentication, public projects and their contents are openly available on the network. You can edit the applicable permissions. - label_login_required_yes: "Yes" - label_login_required_no: "No, allow anonymous access to public projects" - text_project_is_public_non_member: Public projects and their contents are available to all logged-in users. - text_project_is_public_anonymous: Public projects and their contents are openly available on the network. - label_import_time_entries: Import time entries + welcome_suitepro: Planning, knowledge sharing, clients support and personal productivity, with both powerful and simplicity in mind. + welcome_discover: Discover + welcome_suitepro_is_redmine: "%{suitepro} is powered by %{redmine}, the popular project management and issue tracking solution based on the Ruby on Rails framework. Redmine lets us have a powerful workflow for getting tasks done and keep information in one place." + + welcome_spotlight_1_title: "The Basics: Projects,
    Tasks, Issue Tracking" + welcome_spotlight_1_text: Keep track of everything, with visual indicators to monitorize tasks and subtasks in order to stay up to date with milestones, track of time, workflows and all that requires attention. + welcome_spotlight_2_title: "Documents, Wikis,
    File Management" + welcome_spotlight_2_text: Keep documents and files availables wherever you are. Use the wiki project to save project requeriments, attached files, install and user guides, or meeting minutes at your fingertips. + welcome_spotlight_3_title: "Flexible control
    of user access" + welcome_spotlight_3_text: Using a role-based approach, roles are a collection of permissions outlining how users can operate with the projects. Each member of a project can have one or more roles assigned by administrators. + + welcome_other_features: Other Features + welcome_feature_1_title: Gantt Chart And Calendar + welcome_feature_1_text: The gantt chart displays issues that have a start date and a due date. The calendar provides an overview of a project as a monthly view. + welcome_feature_2_title: News And Forums + welcome_feature_2_text: News to show information about the status of projects or any other subjects. The forums allow users from a project to communicate with each others. + welcome_feature_3_title: Email notifications And Feeds + welcome_feature_3_text: SuitePro can be configured to receive notifications via email. It also provides web feeds to use with external readers or aggregators. + welcome_feature_4_title: Code Repositories + welcome_feature_4_text: Version Control Systems like Git or Subversion can be used as code repositories and also keep track of changes made to the code. + welcome_feature_5_title: Responsive Design + welcome_feature_5_text: SuitePro is optimized to look great on mobile devices thanks to its responsive design. All pages adapt automatically to the screen size on a mobile phone, tablet or desktop computer. + welcome_feature_6_title: Is Open Source Software + welcome_feature_6_text: It means you are not locked into using a particular vendor’s system, and it’s continually evolving in real time as developers add to it and modify it. + + welcome_any_questions: Any Questions? + welcome_please_contact: Please feel free to contact me if you need any further information. + welcome_contact: Contact + welcome_about_me: More About Me + link_my_blog: My Blog label_legal: Legal notice diff --git a/config/locales/es-PA.yml b/config/locales/es-PA.yml new file mode 100644 index 0000000..ef2be86 --- /dev/null +++ b/config/locales/es-PA.yml @@ -0,0 +1,1260 @@ +# Spanish translations for Rails +# by Francisco Fernando García Nieto (ffgarcianieto@gmail.com) +# Redmine spanish translation: +# by J. Cayetano Delgado (Cayetano _dot_ Delgado _at_ ioko _dot_ com) +# Contributors: @borjacampina @jgutierrezvega +# Modified by: Leonel Iturralde +# For use to spanish panama + +es-PA: + number: + # Used in number_with_delimiter() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "." + # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "," + # Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00) + precision: 3 + + # Used in number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%n %u" + unit: "$" + # These three are to override number.format and are optional + separator: "," + delimiter: "." + precision: 2 + + # Used in number_to_percentage() + percentage: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_precision() + precision: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_human_size() + human: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "medio minuto" + less_than_x_seconds: + one: "menos de 1 segundo" + other: "menos de %{count} segundos" + x_seconds: + one: "1 segundo" + other: "%{count} segundos" + less_than_x_minutes: + one: "menos de 1 minuto" + other: "menos de %{count} minutos" + x_minutes: + one: "1 minuto" + other: "%{count} minutos" + about_x_hours: + one: "alrededor de 1 hora" + other: "alrededor de %{count} horas" + x_hours: + one: "1 hora" + other: "%{count} horas" + x_days: + one: "1 día" + other: "%{count} días" + about_x_months: + one: "alrededor de 1 mes" + other: "alrededor de %{count} meses" + x_months: + one: "1 mes" + other: "%{count} meses" + about_x_years: + one: "alrededor de 1 año" + other: "alrededor de %{count} años" + over_x_years: + one: "más de 1 año" + other: "más de %{count} años" + almost_x_years: + one: "casi 1 año" + other: "casi %{count} años" + + activerecord: + errors: + template: + header: + one: "no se pudo guardar este %{model} porque se encontró 1 error" + other: "no se pudo guardar este %{model} porque se encontraron %{count} errores" + # The variable :count is also available + body: "Se encontraron problemas con los siguientes campos:" + + # The values :model, :attribute and :value are always available for interpolation + # The value :count is available when applicable. Can be used for pluralization. + messages: + inclusion: "no está incluido en la lista" + exclusion: "está reservado" + invalid: "no es válido" + confirmation: "no coincide con la confirmación" + accepted: "debe ser aceptado" + empty: "no puede estar vacío" + blank: "no puede estar en blanco" + too_long: "es demasiado largo (%{count} caracteres máximo)" + too_short: "es demasiado corto (%{count} caracteres mínimo)" + wrong_length: "no tiene la longitud correcta (%{count} caracteres exactos)" + taken: "ya está en uso" + not_a_number: "no es un número" + greater_than: "debe ser mayor que %{count}" + greater_than_or_equal_to: "debe ser mayor que o igual a %{count}" + equal_to: "debe ser igual a %{count}" + less_than: "debe ser menor que %{count}" + less_than_or_equal_to: "debe ser menor que o igual a %{count}" + odd: "debe ser impar" + even: "debe ser par" + greater_than_start_date: "debe ser posterior a la fecha de comienzo" + not_same_project: "no pertenece al mismo proyecto" + circular_dependency: "Esta relación podría crear una dependencia circular" + cant_link_an_issue_with_a_descendant: "Esta incidencia no puede ser ligada a una de estas tareas" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + # Append your own errors here or at the model/attributes scope. + + models: + # Overrides default messages + + attributes: + # Overrides model and default messages. + + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%d de %b" + long: "%d de %B de %Y" + + day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado] + abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre] + abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%A, %d de %B de %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d de %b %H:%M" + long: "%d de %B de %Y %H:%M" + am: "am" + pm: "pm" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "y" + + actionview_instancetag_blank_option: Por favor seleccione + + button_activate: Activar + button_add: Añadir + button_annotate: Anotar + button_apply: Aceptar + button_archive: Archivar + button_back: Atrás + button_cancel: Cancelar + button_change: Cambiar + button_change_password: Cambiar contraseña + button_check_all: Seleccionar todo + button_clear: Anular + button_configure: Configurar + button_copy: Copiar + button_create: Crear + button_delete: Borrar + button_download: Descargar + button_edit: Modificar + button_list: Listar + button_lock: Bloquear + button_log_time: Tiempo dedicado + button_login: Acceder + button_move: Mover + button_quote: Citar + button_rename: Renombrar + button_reply: Responder + button_reset: Reestablecer + button_rollback: Volver a esta versión + button_save: Guardar + button_sort: Ordenar + button_submit: Aceptar + button_test: Probar + button_unarchive: Desarchivar + button_uncheck_all: No seleccionar nada + button_unlock: Desbloquear + button_unwatch: No monitorizar + button_update: Actualizar + button_view: Ver + button_watch: Monitorizar + default_activity_design: Diseño + default_activity_development: Desarrollo + default_doc_category_tech: Documentación técnica + default_doc_category_user: Documentación de usuario + default_issue_status_in_progress: En curso + default_issue_status_closed: Cerrada + default_issue_status_feedback: Comentarios + default_issue_status_new: Nueva + default_issue_status_rejected: Rechazada + default_issue_status_resolved: Resuelta + default_priority_high: Alta + default_priority_immediate: Inmediata + default_priority_low: Baja + default_priority_normal: Normal + default_priority_urgent: Urgente + default_role_developer: Desarrollador + default_role_manager: Jefe de proyecto + default_role_reporter: Informador + default_tracker_bug: Errores + default_tracker_feature: Tareas + default_tracker_support: Soporte + enumeration_activities: Actividades (tiempo dedicado) + enumeration_doc_categories: Categorías del documento + enumeration_issue_priorities: Prioridad de las incidencias + error_can_t_load_default_data: "No se ha podido cargar la configuración por defecto: %{value}" + error_issue_not_found_in_project: 'La incidencia no se encuentra o no está asociada a este proyecto' + error_scm_annotate: "No existe la entrada o no ha podido ser anotada" + error_scm_annotate_big_text_file: "La entrada no puede anotarse, al superar el tamaño máximo para archivos de texto." + error_scm_command_failed: "Se produjo un error al acceder al repositorio: %{value}" + error_scm_not_found: "La entrada y/o la revisión no existe en el repositorio." + error_ldap_bind_credentials: "Cuenta/Contraseña LDAP incorrecta" + field_account: Cuenta + field_activity: Actividad + field_admin: Administrador + field_assignable: Se pueden asignar incidencias a este perfil + field_assigned_to: Asignado a + field_attr_firstname: Cualidad del nombre + field_attr_lastname: Cualidad del apellido + field_attr_login: Cualidad del identificador + field_attr_mail: Cualidad del Email + field_auth_source: Modo de identificación + field_author: Autor + field_base_dn: DN base + field_category: Categoría + field_column_names: Columnas + field_comments: Comentario + field_comments_sorting: Mostrar comentarios + field_created_on: Creado + field_default_value: Estado por defecto + field_delay: Retraso + field_description: Descripción + field_done_ratio: "% Realizado" + field_downloads: Descargas + field_due_date: Fecha fin + field_effective_date: Fecha + field_estimated_hours: Tiempo estimado + field_field_format: Formato + field_filename: Archivo + field_filesize: Tamaño + field_firstname: Nombre + field_fixed_version: Versión prevista + field_hide_mail: Ocultar mi dirección de correo + field_homepage: Sitio web + field_host: Anfitrión + field_hours: Horas + field_identifier: Identificador + field_is_closed: Incidencia resuelta + field_is_default: Estado por defecto + field_is_filter: Usado como filtro + field_is_for_all: Para todos los proyectos + field_is_in_roadmap: Consultar las incidencias en la planificación + field_is_public: Público + field_is_required: Obligatorio + field_issue: Incidencia + field_issue_to: Incidencia relacionada + field_language: Idioma + field_last_login_on: Última conexión + field_lastname: Apellido + field_login: Identificador + field_mail: Correo electrónico + field_mail_notification: Notificaciones por correo + field_max_length: Longitud máxima + field_min_length: Longitud mínima + field_name: Nombre + field_new_password: Nueva contraseña + field_notes: Notas + field_onthefly: Creación del usuario "al vuelo" + field_parent: Proyecto padre + field_parent_title: Página padre + field_password: Contraseña + field_password_confirmation: Confirmación + field_port: Puerto + field_possible_values: Valores posibles + field_priority: Prioridad + field_project: Proyecto + field_redirect_existing_links: Redireccionar enlaces existentes + field_regexp: Expresión regular + field_role: Perfil + field_searchable: Incluir en las búsquedas + field_spent_on: Fecha + field_start_date: Fecha de inicio + field_start_page: Página principal + field_status: Estado + field_subject: Asunto + field_subproject: Proyecto secundario + field_summary: Resumen + field_time_zone: Zona horaria + field_title: Título + field_tracker: Tipo + field_type: Tipo + field_updated_on: Actualizado + field_url: URL + field_user: Usuario + field_value: Valor + field_version: Versión + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-15 + general_csv_separator: ',' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + general_lang_name: 'Spanish/Panama (Español/Panamá)' + general_text_No: 'No' + general_text_Yes: 'Sí' + general_text_no: 'no' + general_text_yes: 'sí' + label_activity: Actividad + label_add_another_file: Añadir otro archivo + label_add_note: Añadir una nota + label_added: añadido + label_added_time_by: "Añadido por %{author} hace %{age}" + label_administration: Administración + label_age: Edad + label_ago: hace + label_all: todos + label_all_time: todo el tiempo + label_all_words: Todas las palabras + label_and_its_subprojects: "%{value} y proyectos secundarios" + label_applied_status: Aplicar estado + label_assigned_to_me_issues: Incidencias que me asignaron + label_associated_revisions: Revisiones asociadas + label_attachment: Archivo + label_attachment_delete: Borrar el archivo + label_attachment_new: Nuevo archivo + label_attachment_plural: Archivos + label_attribute: Cualidad + label_attribute_plural: Cualidades + label_auth_source: Modo de autenticación + label_auth_source_new: Nuevo modo de autenticación + label_auth_source_plural: Modos de autenticación + label_authentication: Autenticación + label_blocked_by: bloqueado por + label_blocks: bloquea a + label_board: Foro + label_board_new: Nuevo foro + label_board_plural: Foros + label_boolean: Booleano + label_browse: Hojear + label_bulk_edit_selected_issues: Editar las incidencias seleccionadas + label_calendar: Calendario + label_change_plural: Cambios + label_change_properties: Cambiar propiedades + label_change_status: Cambiar el estado + label_change_view_all: Ver todos los cambios + label_changes_details: Detalles de todos los cambios + label_changeset_plural: Cambios + label_chronological_order: En orden cronológico + label_closed_issues: cerrada + label_closed_issues_plural: cerradas + label_x_open_issues_abbr: + zero: 0 abiertas + one: 1 abierta + other: "%{count} abiertas" + label_x_closed_issues_abbr: + zero: 0 cerradas + one: 1 cerrada + other: "%{count} cerradas" + label_comment: Comentario + label_comment_add: Añadir un comentario + label_comment_added: Comentario añadido + label_comment_delete: Borrar comentarios + label_comment_plural: Comentarios + label_x_comments: + zero: sin comentarios + one: 1 comentario + other: "%{count} comentarios" + label_commits_per_author: Commits por autor + label_commits_per_month: Commits por mes + label_confirmation: Confirmación + label_contains: contiene + label_copied: copiado + label_copy_workflow_from: Copiar flujo de trabajo desde + label_current_status: Estado actual + label_current_version: Versión actual + label_custom_field: Campo personalizado + label_custom_field_new: Nuevo campo personalizado + label_custom_field_plural: Campos personalizados + label_date: Fecha + label_date_from: Desde + label_date_range: Rango de fechas + label_date_to: Hasta + label_day_plural: días + label_default: Por defecto + label_default_columns: Columnas por defecto + label_deleted: suprimido + label_details: Detalles + label_diff_inline: en línea + label_diff_side_by_side: cara a cara + label_disabled: deshabilitado + label_display_per_page: "Por página: %{value}" + label_document: Documento + label_document_added: Documento añadido + label_document_new: Nuevo documento + label_document_plural: Documentos + label_downloads_abbr: D/L + label_duplicated_by: duplicada por + label_duplicates: duplicada de + label_enumeration_new: Nuevo valor + label_enumerations: Listas de valores + label_environment: Entorno + label_equals: igual + label_example: Ejemplo + label_export_to: 'Exportar a:' + label_f_hour: "%{value} hora" + label_f_hour_plural: "%{value} horas" + label_feed_plural: Feeds + label_feeds_access_key_created_on: "Clave de acceso por Atom creada hace %{value}" + label_file_added: Archivo añadido + label_file_plural: Archivos + label_filter_add: Añadir el filtro + label_filter_plural: Filtros + label_float: Flotante + label_follows: posterior a + label_gantt: Gantt + label_general: General + label_generate_key: Generar clave + label_help: Ayuda + label_history: Histórico + label_home: Inicio + label_in: en + label_in_less_than: en menos que + label_in_more_than: en más que + label_incoming_emails: Correos entrantes + label_index_by_date: Índice por fecha + label_index_by_title: Índice por título + label_information: Información + label_information_plural: Información + label_integer: Número + label_internal: Interno + label_issue: Incidencias + label_issue_added: Incidencias añadida + label_issue_category: Categoría de las incidencias + label_issue_category_new: Nueva categoría + label_issue_category_plural: Categorías de las incidencias + label_issue_new: Nueva incidencia + label_issue_plural: Incidencias + label_issue_status: Estado de la incidencias + label_issue_status_new: Nuevo estado + label_issue_status_plural: Estados de las incidencias + label_issue_tracking: Incidencias + label_issue_updated: Incidencia actualizada + label_issue_view_all: Ver todas las incidencias + label_issue_watchers: Seguidores + label_issues_by: "Incidencias por %{value}" + label_jump_to_a_project: Ir al proyecto... + label_language_based: Basado en el idioma + label_last_changes: "últimos %{count} cambios" + label_last_login: Última conexión + label_last_month: último mes + label_last_n_days: "últimos %{count} días" + label_last_week: última semana + label_latest_revision: Última revisión + label_latest_revision_plural: Últimas revisiones + label_ldap_authentication: Autenticación LDAP + label_less_than_ago: hace menos de + label_list: Lista + label_loading: Cargando... + label_logged_as: Conectado como + label_login: Iniciar sesión + label_logout: Terminar sesión + label_max_size: Tamaño máximo + label_me: yo mismo + label_member: Miembro + label_member_new: Nuevo miembro + label_member_plural: Miembros + label_message_last: Último mensaje + label_message_new: Nuevo mensaje + label_message_plural: Mensajes + label_message_posted: Mensaje añadido + label_min_max_length: Longitud mín - máx + label_modified: modificado + label_module_plural: Módulos + label_month: Mes + label_months_from: meses de + label_more_than_ago: hace más de + label_my_account: Mi cuenta + label_my_page: Mi página + label_my_projects: Mis proyectos + label_new: Nuevo + label_new_statuses_allowed: Nuevos estados autorizados + label_news: Noticia + label_news_added: Noticia añadida + label_news_latest: Últimas noticias + label_news_new: Nueva noticia + label_news_plural: Noticias + label_news_view_all: Ver todas las noticias + label_next: Siguiente + label_no_change_option: (Sin cambios) + label_no_data: Ningún dato disponible + label_nobody: nadie + label_none: ninguno + label_not_contains: no contiene + label_not_equals: no igual + label_open_issues: abierta + label_open_issues_plural: abiertas + label_optional_description: Descripción opcional + label_options: Opciones + label_overall_activity: Actividad global + label_overview: Vistazo + label_password_lost: ¿Olvidaste la contraseña? + label_permissions: Permisos + label_permissions_report: Informe de permisos + label_please_login: Por favor, inicie sesión + label_plugins: Extensiones + label_precedes: anterior a + label_preferences: Preferencias + label_preview: Previsualizar + label_previous: Anterior + label_project: Proyecto + label_project_all: Todos los proyectos + label_project_latest: Últimos proyectos + label_project_new: Nuevo proyecto + label_project_plural: Proyectos + label_x_projects: + zero: sin proyectos + one: 1 proyecto + other: "%{count} proyectos" + label_public_projects: Proyectos públicos + label_query: Consulta personalizada + label_query_new: Nueva consulta + label_query_plural: Consultas personalizadas + label_read: Leer... + label_register: Registrar + label_registered_on: Inscrito el + label_registration_activation_by_email: activación de cuenta por correo + label_registration_automatic_activation: activación automática de cuenta + label_registration_manual_activation: activación manual de cuenta + label_related_issues: Incidencias relacionadas + label_relates_to: relacionada con + label_relation_delete: Eliminar relación + label_relation_new: Nueva relación + label_renamed: renombrado + label_reply_plural: Respuestas + label_report: Informe + label_report_plural: Informes + label_reported_issues: Incidencias registradas por mí + label_repository: Repositorio + label_repository_plural: Repositorios + label_result_plural: Resultados + label_reverse_chronological_order: En orden cronológico inverso + label_revision: Revisión + label_revision_plural: Revisiones + label_roadmap: Planificación + label_roadmap_due_in: "Finaliza en %{value}" + label_roadmap_no_issues: No hay incidencias para esta versión + label_roadmap_overdue: "%{value} tarde" + label_role: Perfil + label_role_and_permissions: Perfiles y permisos + label_role_new: Nuevo perfil + label_role_plural: Perfiles + label_scm: SCM + label_search: Búsqueda + label_search_titles_only: Buscar sólo en títulos + label_send_information: Enviar información de la cuenta al usuario + label_send_test_email: Enviar un correo de prueba + label_settings: Configuración + label_show_completed_versions: Muestra las versiones terminadas + label_sort_by: "Ordenar por %{value}" + label_sort_higher: Subir + label_sort_highest: Primero + label_sort_lower: Bajar + label_sort_lowest: Último + label_spent_time: Tiempo dedicado + label_statistics: Estadísticas + label_stay_logged_in: Mantener la sesión abierta + label_string: Texto + label_subproject_plural: Proyectos secundarios + label_text: Texto largo + label_theme: Tema + label_this_month: este mes + label_this_week: esta semana + label_this_year: este año + label_time_tracking: Control de tiempo + label_today: hoy + label_topic_plural: Temas + label_total: Total + label_tracker: Tipo + label_tracker_new: Nuevo tipo + label_tracker_plural: Tipos de incidencias + label_updated_time: "Actualizado hace %{value}" + label_updated_time_by: "Actualizado por %{author} hace %{age}" + label_used_by: Utilizado por + label_user: Usuario + label_user_activity: "Actividad de %{value}" + label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí" + label_user_mail_option_all: "Para cualquier evento en todos mis proyectos" + label_user_mail_option_selected: "Para cualquier evento de los proyectos seleccionados..." + label_user_new: Nuevo usuario + label_user_plural: Usuarios + label_version: Versión + label_version_new: Nueva versión + label_version_plural: Versiones + label_view_diff: Ver diferencias + label_view_revisions: Ver las revisiones + label_watched_issues: Incidencias monitorizadas + label_week: Semana + label_wiki: Wiki + label_wiki_edit: Modificación Wiki + label_wiki_edit_plural: Modificaciones Wiki + label_wiki_page: Página Wiki + label_wiki_page_plural: Páginas Wiki + label_workflow: Flujo de trabajo + label_year: Año + label_yesterday: ayer + mail_body_account_activation_request: "Se ha inscrito un nuevo usuario (%{value}). La cuenta está pendiende de aprobación:" + mail_body_account_information: Información sobre su cuenta + mail_body_account_information_external: "Puede usar su cuenta %{value} para conectarse." + mail_body_lost_password: 'Para cambiar su contraseña, haga clic en el siguiente enlace:' + mail_body_register: 'Para activar su cuenta, haga clic en el siguiente enlace:' + mail_body_reminder: "%{count} incidencia(s) asignadas a ti finalizan en los próximos %{days} días:" + mail_subject_account_activation_request: "Incidencia de activación de cuenta %{value}" + mail_subject_lost_password: "Tu contraseña del %{value}" + mail_subject_register: "Activación de la cuenta del %{value}" + mail_subject_reminder: "%{count} incidencia(s) finalizan en los próximos %{days} días" + notice_account_activated: Su cuenta ha sido activada. Ya puede conectarse. + notice_account_invalid_credentials: Usuario o contraseña inválido. + notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña. + notice_account_password_updated: Contraseña modificada correctamente. + notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte del administrador." + notice_account_register_done: Cuenta creada correctamente. Para activarla, haga clic sobre el enlace que le ha sido enviado por correo. + notice_account_unknown_email: Usuario desconocido. + notice_account_updated: Cuenta actualizada correctamente. + notice_account_wrong_password: Contraseña incorrecta. + notice_can_t_change_password: Esta cuenta utiliza una fuente de autenticación externa. No es posible cambiar la contraseña. + notice_default_data_loaded: Configuración por defecto cargada correctamente. + notice_email_error: "Ha ocurrido un error mientras enviando el correo (%{value})" + notice_email_sent: "Se ha enviado un correo a %{value}" + notice_failed_to_save_issues: "Imposible grabar %{count} incidencia(s) de %{total} seleccionada(s): %{ids}." + notice_feeds_access_key_reseted: Su clave de acceso para Atom ha sido reiniciada. + notice_file_not_found: La página a la que intenta acceder no existe. + notice_locking_conflict: Los datos han sido modificados por otro usuario. + notice_no_issue_selected: "Ninguna incidencia seleccionada. Por favor, compruebe la incidencia que quiere modificar" + notice_not_authorized: No tiene autorización para acceder a esta página. + notice_successful_connection: Conexión correcta. + notice_successful_create: Creación correcta. + notice_successful_delete: Borrado correcto. + notice_successful_update: Modificación correcta. + notice_unable_delete_version: No se puede borrar la versión + permission_add_issue_notes: Añadir notas + permission_add_issue_watchers: Añadir seguidores + permission_add_issues: Añadir incidencias + permission_add_messages: Enviar mensajes + permission_browse_repository: Hojear repositiorio + permission_comment_news: Comentar noticias + permission_commit_access: Acceso de escritura + permission_delete_issues: Borrar incidencias + permission_delete_messages: Borrar mensajes + permission_delete_own_messages: Borrar mensajes propios + permission_delete_wiki_pages: Borrar páginas wiki + permission_delete_wiki_pages_attachments: Borrar archivos + permission_edit_issue_notes: Modificar notas + permission_edit_issues: Modificar incidencias + permission_edit_messages: Modificar mensajes + permission_edit_own_issue_notes: Modificar notas propias + permission_edit_own_messages: Editar mensajes propios + permission_edit_own_time_entries: Modificar tiempos dedicados propios + permission_edit_project: Modificar proyecto + permission_edit_time_entries: Modificar tiempos dedicados + permission_edit_wiki_pages: Modificar páginas wiki + permission_log_time: Anotar tiempo dedicado + permission_manage_boards: Administrar foros + permission_manage_categories: Administrar categorías de incidencias + permission_manage_files: Administrar archivos + permission_manage_issue_relations: Administrar relación con otras incidencias + permission_manage_members: Administrar miembros + permission_manage_news: Administrar noticias + permission_manage_public_queries: Administrar consultas públicas + permission_manage_repository: Administrar repositorio + permission_manage_versions: Administrar versiones + permission_manage_wiki: Administrar wiki + permission_move_issues: Mover incidencias + permission_protect_wiki_pages: Proteger páginas wiki + permission_rename_wiki_pages: Renombrar páginas wiki + permission_save_queries: Grabar consultas + permission_select_project_modules: Seleccionar módulos del proyecto + permission_view_calendar: Ver calendario + permission_view_changesets: Ver cambios + permission_view_documents: Ver documentos + permission_view_files: Ver archivos + permission_view_gantt: Ver diagrama de Gantt + permission_view_issue_watchers: Ver lista de seguidores + permission_view_messages: Ver mensajes + permission_view_time_entries: Ver tiempo dedicado + permission_view_wiki_edits: Ver histórico del wiki + permission_view_wiki_pages: Ver wiki + project_module_boards: Foros + project_module_documents: Documentos + project_module_files: Archivos + project_module_issue_tracking: Incidencias + project_module_news: Noticias + project_module_repository: Repositorio + project_module_time_tracking: Control de tiempo + project_module_wiki: Wiki + setting_activity_days_default: Días a mostrar en la actividad de proyecto + setting_app_subtitle: Subtítulo de la aplicación + setting_app_title: Título de la aplicación + setting_attachment_max_size: Tamaño máximo del archivo + setting_autofetch_changesets: Autorellenar los commits del repositorio + setting_autologin: Inicio de sesión automático + setting_bcc_recipients: Ocultar las copias de carbón (bcc) + setting_commit_fix_keywords: Palabras clave para la corrección + setting_commit_ref_keywords: Palabras clave para la referencia + setting_cross_project_issue_relations: Permitir relacionar incidencias de distintos proyectos + setting_date_format: Formato de fecha + setting_default_language: Idioma por defecto + setting_default_projects_public: Los proyectos nuevos son públicos por defecto + setting_diff_max_lines_displayed: Número máximo de diferencias mostradas + setting_display_subprojects_issues: Mostrar por defecto incidencias de proy. secundarios en el principal + setting_emails_footer: Pie de mensajes + setting_enabled_scm: Activar SCM + setting_feeds_limit: Límite de contenido para sindicación + setting_gravatar_enabled: Usar iconos de usuario (Gravatar) + setting_host_name: Nombre y ruta del servidor + setting_issue_list_default_columns: Columnas por defecto para la lista de incidencias + setting_issues_export_limit: Límite de exportación de incidencias + setting_login_required: Se requiere identificación + setting_mail_from: Correo desde el que enviar mensajes + setting_mail_handler_api_enabled: Activar SW para mensajes entrantes + setting_mail_handler_api_key: Clave de la API + setting_per_page_options: Objetos por página + setting_plain_text_mail: sólo texto plano (no HTML) + setting_protocol: Protocolo + setting_self_registration: Registro permitido + setting_sequential_project_identifiers: Generar identificadores de proyecto + setting_sys_api_enabled: Habilitar SW para la gestión del repositorio + setting_text_formatting: Formato de texto + setting_time_format: Formato de hora + setting_user_format: Formato de nombre de usuario + setting_welcome_text: Texto de bienvenida + setting_wiki_compression: Compresión del historial del Wiki + status_active: activo + status_locked: bloqueado + status_registered: registrado + text_are_you_sure: ¿Está seguro? + text_assign_time_entries_to_project: Asignar las horas al proyecto + text_caracters_maximum: "%{count} caracteres como máximo." + text_caracters_minimum: "%{count} caracteres como mínimo." + text_comma_separated: Múltiples valores permitidos (separados por coma). + text_default_administrator_account_changed: Cuenta de administrador por defecto modificada + text_destroy_time_entries: Borrar las horas + text_destroy_time_entries_question: Existen %{hours} horas asignadas a la incidencia que quiere borrar. ¿Qué quiere hacer? + text_diff_truncated: '... Diferencia truncada por exceder el máximo tamaño visualizable.' + text_email_delivery_not_configured: "Las notificaciones están desactivadas porque el servidor de correo no está configurado.\nConfigure el servidor de SMTP en config/configuration.yml y reinicie la aplicación para activar los cambios." + text_enumeration_category_reassign_to: 'Reasignar al siguiente valor:' + text_enumeration_destroy_question: "%{count} objetos con este valor asignado." + text_file_repository_writable: Se puede escribir en el repositorio + text_issue_added: "Incidencia %{id} añadida por %{author}." + text_issue_category_destroy_assignments: Dejar las incidencias sin categoría + text_issue_category_destroy_question: "Algunas incidencias (%{count}) están asignadas a esta categoría. ¿Qué desea hacer?" + text_issue_category_reassign_to: Reasignar las incidencias a la categoría + text_issue_updated: "La incidencia %{id} ha sido actualizada por %{author}." + text_issues_destroy_confirmation: '¿Seguro que quiere borrar las incidencias seleccionadas?' + text_issues_ref_in_commit_messages: Referencia y incidencia de corrección en los mensajes + text_length_between: "Longitud entre %{min} y %{max} caracteres." + text_load_default_configuration: Cargar la configuración por defecto + text_min_max_length_info: 0 para ninguna restricción + text_no_configuration_data: "Todavía no se han configurado perfiles, ni tipos, estados y flujo de trabajo asociado a incidencias. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla." + text_project_destroy_confirmation: ¿Estás seguro de querer eliminar el proyecto? + text_reassign_time_entries: 'Reasignar las horas a esta incidencia:' + text_regexp_info: ej. ^[A-Z0-9]+$ + text_repository_usernames_mapping: "Establezca la correspondencia entre los usuarios de Redmine y los presentes en el log del repositorio.\nLos usuarios con el mismo nombre o correo en Redmine y en el repositorio serán asociados automáticamente." + text_rmagick_available: RMagick disponible (opcional) + text_select_mail_notifications: Seleccionar los eventos a notificar + text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:' + text_status_changed_by_changeset: "Aplicado en los cambios %{value}" + text_subprojects_destroy_warning: "Los proyectos secundarios: %{value} también se eliminarán" + text_tip_issue_begin_day: tarea que comienza este día + text_tip_issue_begin_end_day: tarea que comienza y termina este día + text_tip_issue_end_day: tarea que termina este día + text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tipo de incidencia + text_unallowed_characters: Caracteres no permitidos + text_user_mail_option: "De los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, incidencia de las que usted sea autor o asignadas a usted)." + text_user_wrote: "%{value} escribió:" + text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido? + text_workflow_edit: Seleccionar un flujo de trabajo para actualizar + text_plugin_assets_writable: Se puede escribir en el directorio público de las extensiones + warning_attachments_not_saved: "No se han podido grabar %{count} archivos." + button_create_and_continue: Crear y continuar + text_custom_field_possible_values_info: 'Un valor en cada línea' + label_display: Mostrar + field_editable: Modificable + setting_repository_log_display_limit: Número máximo de revisiones mostradas en el archivo de trazas + setting_file_max_size_displayed: Tamaño máximo de los archivos de texto mostrados + field_watcher: Seguidor + setting_openid: Permitir identificación y registro por OpenID + field_identity_url: URL de OpenID + label_login_with_open_id_option: o identifíquese con OpenID + field_content: Contenido + label_descending: Descendente + label_sort: Ordenar + label_ascending: Ascendente + label_date_from_to: Desde %{start} hasta %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Esta página tiene %{descendants} página(s) hija(s) y descendiente(s). ¿Qué desea hacer? + text_wiki_page_reassign_children: Reasignar páginas hijas a esta página + text_wiki_page_nullify_children: Dejar páginas hijas como páginas raíz + text_wiki_page_destroy_children: Eliminar páginas hijas y todos sus descendientes + setting_password_min_length: Longitud mínima de la contraseña + field_group_by: Agrupar resultados por + mail_subject_wiki_content_updated: "La página wiki '%{id}' ha sido actualizada" + label_wiki_content_added: Página wiki añadida + mail_subject_wiki_content_added: "Se ha añadido la página wiki '%{id}'." + mail_body_wiki_content_added: "%{author} ha añadido la página wiki '%{id}'." + label_wiki_content_updated: Página wiki actualizada + mail_body_wiki_content_updated: La página wiki '%{id}' ha sido actualizada por %{author}. + permission_add_project: Crear proyecto + setting_new_project_user_role_id: Permiso asignado a un usuario no-administrador para crear proyectos + label_view_all_revisions: Ver todas las revisiones + label_tag: Etiqueta + label_branch: Rama + error_no_tracker_in_project: Este proyecto no tiene asociados tipos de incidencias. Por favor, revise la configuración. + error_no_default_issue_status: No se ha definido un estado de incidencia por defecto. Por favor, revise la configuración (en "Administración" -> "Estados de las incidencias"). + text_journal_changed: "%{label} cambiado %{old} por %{new}" + text_journal_set_to: "%{label} establecido a %{value}" + text_journal_deleted: "%{label} eliminado (%{old})" + label_group_plural: Grupos + label_group: Grupo + label_group_new: Nuevo grupo + label_time_entry_plural: Tiempo dedicado + text_journal_added: "Añadido %{label} %{value}" + field_active: Activo + enumeration_system_activity: Actividad del sistema + permission_delete_issue_watchers: Borrar seguidores + version_status_closed: cerrado + version_status_locked: bloqueado + version_status_open: abierto + error_can_not_reopen_issue_on_closed_version: No se puede reabrir una incidencia asignada a una versión cerrada + + label_user_anonymous: Anónimo + button_move_and_follow: Mover y seguir + setting_default_projects_modules: Módulos activados por defecto en proyectos nuevos + setting_gravatar_default: Imagen Gravatar por defecto + field_sharing: Compartir + button_copy_and_follow: Copiar y seguir + label_version_sharing_hierarchy: Con la jerarquía del proyecto + label_version_sharing_tree: Con el árbol del proyecto + label_version_sharing_descendants: Con proyectos hijo + label_version_sharing_system: Con todos los proyectos + label_version_sharing_none: No compartir + button_duplicate: Duplicar + error_can_not_archive_project: Este proyecto no puede ser archivado + label_copy_source: Fuente + setting_issue_done_ratio: Calcular el ratio de tareas realizadas con + setting_issue_done_ratio_issue_status: Usar el estado de tareas + error_issue_done_ratios_not_updated: Ratios de tareas realizadas no actualizado. + error_workflow_copy_target: Por favor, elija categoría(s) y perfil(es) destino + setting_issue_done_ratio_issue_field: Utilizar el campo de incidencia + label_copy_same_as_target: El mismo que el destino + label_copy_target: Destino + notice_issue_done_ratios_updated: Ratios de tareas realizadas actualizados. + error_workflow_copy_source: Por favor, elija una categoría o rol de origen + label_update_issue_done_ratios: Actualizar ratios de tareas realizadas + setting_start_of_week: Comenzar las semanas en + permission_view_issues: Ver incidencias + label_display_used_statuses_only: Sólo mostrar los estados usados por este tipo de incidencia + label_revision_id: Revisión %{value} + label_api_access_key: Clave de acceso de la API + label_api_access_key_created_on: Clave de acceso de la API creada hace %{value} + label_feeds_access_key: Clave de acceso Atom + notice_api_access_key_reseted: Clave de acceso a la API regenerada. + setting_rest_api_enabled: Activar servicio web REST + label_missing_api_access_key: Clave de acceso a la API ausente + label_missing_feeds_access_key: Clave de accesso Atom ausente + button_show: Mostrar + text_line_separated: Múltiples valores permitidos (un valor en cada línea). + setting_mail_handler_body_delimiters: Truncar correos tras una de estas líneas + permission_add_subprojects: Crear subproyectos + label_subproject_new: Nuevo subproyecto + text_own_membership_delete_confirmation: |- + Está a punto de eliminar algún o todos sus permisos y podría perder la posibilidad de modificar este proyecto tras hacerlo. + ¿Está seguro de querer continuar? + label_close_versions: Cerrar versiones completadas + label_board_sticky: Pegajoso + label_board_locked: Bloqueado + permission_export_wiki_pages: Exportar páginas wiki + setting_cache_formatted_text: Cachear texto formateado + permission_manage_project_activities: Gestionar actividades del proyecto + error_unable_delete_issue_status: Fue imposible eliminar el estado de la incidencia + label_profile: Perfil + permission_manage_subtasks: Gestionar subtareas + field_parent_issue: Tarea padre + label_subtask_plural: Subtareas + label_project_copy_notifications: Enviar notificaciones por correo electrónico durante la copia del proyecto + error_can_not_delete_custom_field: Fue imposible eliminar el campo personalizado + error_unable_to_connect: Fue imposible conectarse (%{value}) + error_can_not_remove_role: Este rol está en uso y no puede ser eliminado. + error_can_not_delete_tracker: Este tipo contiene incidencias y no puede ser eliminado. + field_principal: Principal + notice_failed_to_save_members: "Fallo al guardar miembro(s): %{errors}." + text_zoom_out: Alejar + text_zoom_in: Acercar + notice_unable_delete_time_entry: Fue imposible eliminar la entrada de tiempo dedicado. + label_overall_spent_time: Tiempo total dedicado + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendario + button_edit_associated_wikipage: "Editar paginas Wiki asociadas: %{page_title}" + field_text: Campo de texto + setting_default_notification_option: Opcion de notificacion por defecto + label_user_mail_option_only_my_events: Solo para objetos que soy seguidor o estoy involucrado + label_user_mail_option_none: Sin eventos + field_member_of_group: Asignado al grupo + field_assigned_to_role: Asignado al perfil + notice_not_authorized_archived_project: El proyecto al que intenta acceder ha sido archivado. + label_principal_search: "Buscar por usuario o grupo:" + label_user_search: "Buscar por usuario:" + field_visible: Visible + setting_emails_header: Encabezado de Correos + + setting_commit_logtime_activity_id: Actividad de los tiempos registrados + text_time_logged_by_changeset: Aplicado en los cambios %{value}. + setting_commit_logtime_enabled: Habilitar registro de horas + notice_gantt_chart_truncated: Se recortó el diagrama porque excede el número máximo de elementos que pueden ser mostrados (%{max}) + setting_gantt_items_limit: Número máximo de elementos mostrados en el diagrama de Gantt + field_warn_on_leaving_unsaved: Avisarme cuando vaya a abandonar una página con texto no guardado + text_warn_on_leaving_unsaved: Esta página contiene texto no guardado y si la abandona sus cambios se perderán + label_my_queries: Mis consultas personalizadas + text_journal_changed_no_detail: "Se actualizó %{label}" + label_news_comment_added: Comentario añadido a noticia + button_expand_all: Expandir todo + button_collapse_all: Contraer todo + label_additional_workflow_transitions_for_assignee: Transiciones adicionales permitidas cuando la incidencia está asignada al usuario + label_additional_workflow_transitions_for_author: Transiciones adicionales permitidas cuando el usuario es autor de la incidencia + label_bulk_edit_selected_time_entries: Editar en bloque las horas seleccionadas + text_time_entries_destroy_confirmation: ¿Está seguro de querer eliminar (la hora seleccionada/las horas seleccionadas)? + label_role_anonymous: Anónimo + label_role_non_member: No miembro + label_issue_note_added: Nota añadida + label_issue_status_updated: Estado actualizado + label_issue_priority_updated: Prioridad actualizada + label_issues_visibility_own: Incidencias creadas por el usuario o asignadas a él + field_issues_visibility: Visibilidad de las incidencias + label_issues_visibility_all: Todas las incidencias + permission_set_own_issues_private: Poner las incidencias propias como públicas o privadas + field_is_private: Privada + permission_set_issues_private: Poner incidencias como públicas o privadas + label_issues_visibility_public: Todas las incidencias no privadas + text_issues_destroy_descendants_confirmation: Se procederá a borrar también %{count} subtarea(s). + field_commit_logs_encoding: Codificación de los mensajes de commit + field_scm_path_encoding: Codificación de las rutas + text_scm_path_encoding_note: "Por defecto: UTF-8" + field_path_to_repository: Ruta al repositorio + field_root_directory: Directorio raíz + field_cvs_module: Módulo + field_cvsroot: CVSROOT + text_mercurial_repository_note: Repositorio local (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Orden + text_scm_command_version: Versión + label_git_report_last_commit: Informar del último commit para archivos y directorios + text_scm_config: Puede configurar las órdenes de cada scm en configuration/configuration.yml. Por favor, reinicie la aplicación después de editarlo + text_scm_command_not_available: La orden para el Scm no está disponible. Por favor, compruebe la configuración en el panel de administración. + notice_issue_successful_create: Incidencia %{id} creada. + label_between: entre + setting_issue_group_assignment: Permitir asignar incidencias a grupos + label_diff: diferencias + text_git_repository_note: El repositorio es básico y local (p.e. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Dirección de ordenación + description_project_scope: Ámbito de búsqueda + description_filter: Filtro + description_user_mail_notification: Configuración de notificaciones por correo + description_message_content: Contenido del mensaje + description_available_columns: Columnas disponibles + description_issue_category_reassign: Elija la categoría de la incidencia + description_search: Campo de búsqueda + description_notes: Notas + description_choose_project: Proyectos + description_query_sort_criteria_attribute: Atributo de ordenación + description_wiki_subpages_reassign: Elija la nueva página padre + description_selected_columns: Columnas seleccionadas + label_parent_revision: Padre + label_child_revision: Hijo + setting_default_issue_start_date_to_creation_date: Utilizar la fecha actual como fecha de inicio para nuevas incidencias + button_edit_section: Editar esta sección + setting_repositories_encodings: Codificación de adjuntos y repositorios + description_all_columns: Todas las columnas + button_export: Exportar + label_export_options: "%{export_format} opciones de exportación" + error_attachment_too_big: Este archivo no se puede adjuntar porque excede el tamaño máximo de archivo (%{max_size}) + notice_failed_to_save_time_entries: "Error al guardar %{count} entradas de tiempo de las %{total} seleccionadas: %{ids}." + label_x_issues: + zero: 0 incidencia + one: 1 incidencia + other: "%{count} incidencias" + label_repository_new: Nuevo repositorio + field_repository_is_default: Repositorio principal + label_copy_attachments: Copiar adjuntos + label_item_position: "%{position}/%{count}" + label_completed_versions: Versiones completadas + text_project_identifier_info: Solo se permiten letras en minúscula (a-z), números, guiones y barras bajas.
    Una vez guardado, el identificador no se puede cambiar. + field_multiple: Valores múltiples + setting_commit_cross_project_ref: Permitir referenciar y resolver incidencias de todos los demás proyectos + text_issue_conflict_resolution_add_notes: Añadir mis notas y descartar mis otros cambios + text_issue_conflict_resolution_overwrite: Aplicar mis campos de todas formas (las notas anteriores se mantendrán pero algunos cambios podrían ser sobreescritos) + notice_issue_update_conflict: La incidencia ha sido actualizada por otro usuario mientras la editaba. + text_issue_conflict_resolution_cancel: Descartar todos mis cambios y mostrar de nuevo %{link} + permission_manage_related_issues: Gestionar incidencias relacionadas + field_auth_source_ldap_filter: Filtro LDAP + label_search_for_watchers: Buscar seguidores para añadirlos + notice_account_deleted: Su cuenta ha sido eliminada + setting_unsubscribe: Permitir a los usuarios borrar sus propias cuentas + button_delete_my_account: Borrar mi cuenta + text_account_destroy_confirmation: |- + ¿Está seguro de querer proceder? + Su cuenta quedará borrada permanentemente, sin la posibilidad de reactivarla. + error_session_expired: Su sesión ha expirado. Por favor, vuelva a identificarse. + text_session_expiration_settings: "Advertencia: el cambio de estas opciones podría hacer expirar las sesiones activas, incluyendo la suya." + setting_session_lifetime: Tiempo de vida máximo de las sesiones + setting_session_timeout: Tiempo máximo de inactividad de las sesiones + label_session_expiration: Expiración de sesiones + permission_close_project: Cerrar / reabrir el proyecto + label_show_closed_projects: Ver proyectos cerrados + button_close: Cerrar + button_reopen: Reabrir + project_status_active: activo + project_status_closed: cerrado + project_status_archived: archivado + text_project_closed: Este proyecto está cerrado y es de sólo lectura + notice_user_successful_create: Usuario %{id} creado. + field_core_fields: Campos básicos + field_timeout: Tiempo de inactividad (en segundos) + setting_thumbnails_enabled: Mostrar miniaturas de los adjuntos + setting_thumbnails_size: Tamaño de las miniaturas (en píxeles) + label_status_transitions: Transiciones de estado + label_fields_permissions: Permisos sobre los campos + label_readonly: Sólo lectura + label_required: Requerido + text_repository_identifier_info: Solo se permiten letras en minúscula (a-z), números, guiones y barras bajas.
    Una vez guardado, el identificador no se puede cambiar. + field_board_parent: Foro padre + label_attribute_of_project: "%{name} del proyecto" + label_attribute_of_author: "%{name} del autor" + label_attribute_of_assigned_to: "%{name} de la persona asignada" + label_attribute_of_fixed_version: "%{name} de la versión indicada" + label_copy_subtasks: Copiar subtareas + label_copied_to: copiada a + label_copied_from: copiada desde + label_any_issues_in_project: cualquier incidencia del proyecto + label_any_issues_not_in_project: cualquier incidencia que no sea del proyecto + field_private_notes: Notas privadas + permission_view_private_notes: Ver notas privadas + permission_set_notes_private: Poner notas como privadas + label_no_issues_in_project: no hay incidencias en el proyecto + label_any: todos + label_last_n_weeks: en las últimas %{count} semanas + setting_cross_project_subtasks: Permitir subtareas cruzadas entre proyectos + label_cross_project_descendants: Con proyectos hijo + label_cross_project_tree: Con el árbol del proyecto + label_cross_project_hierarchy: Con la jerarquía del proyecto + label_cross_project_system: Con todos los proyectos + button_hide: Ocultar + setting_non_working_week_days: Días no laborables + label_in_the_next_days: en los próximos + label_in_the_past_days: en los anteriores + label_attribute_of_user: "%{name} del usuario" + text_turning_multiple_off: Si desactiva los valores múltiples, éstos serán eliminados para dejar un único valor por elemento. + label_attribute_of_issue: "%{name} de la incidencia" + permission_add_documents: Añadir documentos + permission_edit_documents: Editar documentos + permission_delete_documents: Borrar documentos + label_gantt_progress_line: Línea de progreso + setting_jsonp_enabled: Habilitar soporte de JSONP + field_inherit_members: Heredar miembros + field_closed_on: Cerrada + field_generate_password: Generar contraseña + setting_default_projects_tracker_ids: Tipos de incidencia habilitados por defecto + label_total_time: Total + notice_account_not_activated_yet: No ha activado su cuenta aún. Si quiere + recibir un nuevo correo de activación, por favor haga clic en este enlace. + notice_account_locked: Su cuenta está bloqueada. + label_hidden: Oculto + label_visibility_private: sólo para mí + label_visibility_roles: sólo para estos roles + label_visibility_public: para cualquier usuario + field_must_change_passwd: Cambiar contraseña en el próximo inicio de sesión + notice_new_password_must_be_different: La nueva contraseña debe ser diferente de la actual + setting_mail_handler_excluded_filenames: Excluir adjuntos por nombre + text_convert_available: Conversión ImageMagick disponible (opcional) + label_link: Enlace + label_only: sólo + label_drop_down_list: Lista desplegable + label_checkboxes: casillas de selección + label_link_values_to: Enlazar valores a la URL + setting_force_default_language_for_anonymous: Forzar lenguaje por defecto a usuarios anónimos + setting_force_default_language_for_loggedin: Forzar lenguaje por defecto para usuarios identificados + label_custom_field_select_type: Seleccione el tipo de objeto al que unir el campo personalizado + label_issue_assigned_to_updated: Persona asignada actualizada + label_check_for_updates: Comprobar actualizaciones + label_latest_compatible_version: Útima versión compatible + label_unknown_plugin: Plugin desconocido + label_radio_buttons: Botones de selección excluyentes + label_group_anonymous: Usuarios anónimos + label_group_non_member: Usuarios no miembros + label_add_projects: Añadir Proyectos + field_default_status: Estado Predeterminado + text_subversion_repository_note: 'Ejemplos: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Visibilidad de Usuarios + label_users_visibility_all: Todos los Usuarios Activos + label_users_visibility_members_of_visible_projects: Miembros de Proyectos Visibles + label_edit_attachments: Editar archivos adjuntos + setting_link_copied_issue: Enlazar incidencia cuando se copia + label_link_copied_issue: Enlazar incidencia copiada + label_ask: Preguntar + label_search_attachments_yes: Buscar adjuntos por nombre de archivo y descripciones + label_search_attachments_no: No buscar adjuntos + label_search_attachments_only: Sólo Buscar adjuntos + label_search_open_issues_only: Sólo Abrir Incidencias + field_address: Correo electrónico + setting_max_additional_emails: Número Máximo de correos electrónicos adicionales + label_email_address_plural: Correo Electrónicos + label_email_address_add: Añadir correos electrónicos + label_enable_notifications: Permitir Notificaciones + label_disable_notifications: No Permitir Notificaciones + setting_search_results_per_page: Buscar resultados por página + label_blank_value: blanco + permission_copy_issues: Copiar incidencias + error_password_expired: Tu contraseña ha expirado o tu administrador requiere que la cambies. + field_time_entries_visibility: Visibilidad de las entradas de tiempo + setting_password_max_age: Requiere cambiar de contraseña después de + label_parent_task_attributes: Atributos de la tarea padre + label_parent_task_attributes_derived: Calculada de las subtareas + label_parent_task_attributes_independent: Independiente de las subtareas + label_time_entries_visibility_all: Todos los registros de tiempo + label_time_entries_visibility_own: Los registros de tiempo creados por el usuario + label_member_management: Administración de Miembros + label_member_management_all_roles: Todos los roles + label_member_management_selected_roles_only: Sólo estos roles + label_password_required: Confirme su contraseña para continuar + label_total_spent_time: Tiempo total dedicado + notice_import_finished: "%{count} elementos han sido importados" + notice_import_finished_with_errors: "%{count} de %{total} elementos no pudieron ser importados" + error_invalid_file_encoding: El archivo no utiliza %{encoding} válida + error_invalid_csv_file_or_settings: El archivo no es un archivo CSV o no coincide con la + configuración + error_can_not_read_import_file: Ocurrió un error mientras se leía el archivo a importar + permission_import_issues: Importar incidencias + label_import_issues: Importar incidencias + label_select_file_to_import: Selecciona el archivo a importar + label_fields_separator: Separador de Campos + label_fields_wrapper: Envoltorio de Campo + label_encoding: Codificación + label_comma_char: Coma + label_semi_colon_char: Punto y Coma + label_quote_char: Comilla Simple + label_double_quote_char: Comilla Doble + label_fields_mapping: Mapeo de Campos + label_file_content_preview: Vista Previa del contenido + label_create_missing_values: Crear valores no presentes + button_import: Importar + field_total_estimated_hours: Total de Tiempo Estimado + label_api: API + label_total_plural: Totales + label_assigned_issues: Incidencias Asignadas + label_field_format_enumeration: Lista Llave/valor + label_f_hour_short: '%{value} h' + field_default_version: Version Predeterminada + error_attachment_extension_not_allowed: Extensión adjuntada %{extension} no es permitida + setting_attachment_extensions_allowed: Extensiones Permitidas + setting_attachment_extensions_denied: Extensiones Prohibidas + label_any_open_issues: cualquier incidencias abierta + label_no_open_issues: incidencias cerradas + label_default_values_for_new_users: Valor predeterminado para nuevos usuarios + setting_sys_api_key: Clave de la API + setting_lost_password: ¿Olvidaste la contraseña? + mail_subject_security_notification: Notificación de seguridad + mail_body_security_notification_change: ! '%{field} modificado.' + mail_body_security_notification_change_to: ! '%{field} modificado por %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} añadido.' + mail_body_security_notification_remove: ! '%{field} %{value} eliminado.' + mail_body_security_notification_notify_enabled: Se han activado las notificaciones para el correo electrónico %{value} + mail_body_security_notification_notify_disabled: Se han desactivado las notificaciones para el correo electrónico %{value} + mail_body_settings_updated: ! 'Las siguientes opciones han sido actualizadas:' + field_remote_ip: Dirección IP + label_wiki_page_new: Nueva pagina wiki + label_relations: Relaciones + button_filter: Filtro + mail_body_password_updated: Su contraseña se ha cambiado. + label_no_preview: No hay vista previa disponible + error_no_tracker_allowed_for_new_issue_in_project: El proyecto no dispone de ningún tipo sobre el cual puedas crear una petición + label_tracker_all: Todos los tipos + label_new_project_issue_tab_enabled: Mostrar la pestaña "Nueva incidencia" + setting_new_item_menu_tab: Pestaña de creación de nuevos objetos en el menú de cada proyecto + label_new_object_tab_enabled: Mostrar la lista desplegable "+" + error_no_projects_with_tracker_allowed_for_new_issue: Ningún proyecto dispone de un tipo sobre el cual puedas crear una petición + field_textarea_font: Fuente usada en las áreas de texto + label_font_default: Fuente por defecto + label_font_monospace: Fuente Monospaced + label_font_proportional: Fuente Proportional + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/es.yml b/config/locales/es.yml index 77ada1b..6177f32 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -140,10 +140,6 @@ es: earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" not_a_regexp: "is not a valid regular expression" open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" - must_contain_uppercase: "must contain uppercase letters (A-Z)" - must_contain_lowercase: "must contain lowercase letters (a-z)" - must_contain_digits: "must contain digits (0-9)" - must_contain_special_chars: "must contain special characters (!, $, %, ...)" # Append your own errors here or at the model/attributes scope. @@ -364,6 +360,7 @@ es: label_age: Edad label_ago: hace label_all: todos + label_all_time: todo el tiempo label_all_words: Todas las palabras label_and_its_subprojects: "%{value} y proyectos secundarios" label_applied_status: Aplicar estado @@ -550,6 +547,7 @@ es: label_password_lost: ¿Olvidaste la contraseña? label_permissions: Permisos label_permissions_report: Informe de permisos + label_please_login: Por favor, inicie sesión label_plugins: Extensiones label_precedes: anterior a label_preferences: Preferencias @@ -717,6 +715,7 @@ es: permission_manage_repository: Administrar repositorio permission_manage_versions: Administrar versiones permission_manage_wiki: Administrar wiki + permission_move_issues: Mover peticiones permission_protect_wiki_pages: Proteger páginas wiki permission_rename_wiki_pages: Renombrar páginas wiki permission_save_queries: Grabar consultas @@ -740,6 +739,7 @@ es: project_module_time_tracking: Control de tiempo project_module_wiki: Wiki setting_activity_days_default: Días a mostrar en la actividad de proyecto + setting_app_subtitle: Subtítulo de la aplicación setting_app_title: Título de la aplicación setting_attachment_max_size: Tamaño máximo del fichero setting_autofetch_changesets: Autorellenar los commits del repositorio @@ -806,7 +806,7 @@ es: text_reassign_time_entries: 'Reasignar las horas a esta petición:' text_regexp_info: ej. ^[A-Z0-9]+$ text_repository_usernames_mapping: "Establezca la correspondencia entre los usuarios de Redmine y los presentes en el log del repositorio.\nLos usuarios con el mismo nombre o correo en Redmine y en el repositorio serán asociados automáticamente." - text_minimagick_available: MiniMagick disponible (opcional) + text_rmagick_available: RMagick disponible (opcional) text_select_mail_notifications: Seleccionar los eventos a notificar text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:' text_status_changed_by_changeset: "Aplicado en los cambios %{value}" @@ -818,7 +818,6 @@ es: text_unallowed_characters: Caracteres no permitidos text_user_mail_option: "De los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)." text_user_wrote: "%{value} escribió:" - text_user_wrote_in: "%{value} escribió (%{link}):" text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido? text_workflow_edit: Seleccionar un flujo de trabajo para actualizar text_plugin_assets_writable: Se puede escribir en el directorio público de las extensiones @@ -859,7 +858,7 @@ es: label_branch: Rama error_no_tracker_in_project: Este proyecto no tiene asociados tipos de peticiones. Por favor, revise la configuración. error_no_default_issue_status: No se ha definido un estado de petición por defecto. Por favor, revise la configuración (en "Administración" -> "Estados de las peticiones"). - text_journal_changed: "%{label} cambiado de %{old} a %{new}" + text_journal_changed: "%{label} cambiado %{old} por %{new}" text_journal_set_to: "%{label} establecido a %{value}" text_journal_deleted: "%{label} eliminado (%{old})" label_group_plural: Grupos @@ -886,6 +885,7 @@ es: label_version_sharing_descendants: Con proyectos hijo label_version_sharing_system: Con todos los proyectos label_version_sharing_none: No compartir + button_duplicate: Duplicar error_can_not_archive_project: Este proyecto no puede ser archivado label_copy_source: Fuente setting_issue_done_ratio: Calcular el ratio de tareas realizadas con @@ -923,7 +923,7 @@ es: permission_export_wiki_pages: Exportar páginas wiki setting_cache_formatted_text: Cachear texto formateado permission_manage_project_activities: Gestionar actividades del proyecto - error_unable_delete_issue_status: Fue imposible eliminar el estado de la petición (%{value}) + error_unable_delete_issue_status: Fue imposible eliminar el estado de la petición label_profile: Perfil permission_manage_subtasks: Gestionar subtareas field_parent_issue: Tarea padre @@ -1056,6 +1056,7 @@ es: setting_session_timeout: Tiempo máximo de inactividad de las sesiones label_session_expiration: Expiración de sesiones permission_close_project: Cerrar / reabrir el proyecto + label_show_closed_projects: Ver proyectos cerrados button_close: Cerrar button_reopen: Reabrir project_status_active: activo @@ -1231,118 +1232,61 @@ es: label_font_default: Fuente por defecto label_font_monospace: Fuente Monospaced label_font_proportional: Fuente Proportional - setting_timespan_format: Formato de timespan + setting_timespan_format: Time span format label_table_of_contents: Tabla de contenidos - setting_commit_logs_formatting: Aplicar formato de texto a los mensajes de commits - setting_mail_handler_enable_regex: Habilitar expresiones regulares - error_move_of_child_not_possible: 'Subtarea %{child} no ha podido ser movida al nuevo - proyecto: %{errors}' - error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: El tiempo dedicado no puede - ser reasignado a una petición que va a ser borrada - setting_timelog_required_fields: Campos requeridos para imputación de tiempo + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs label_attribute_of_object: '%{object_name}''s %{name}' - label_user_mail_option_only_assigned: Sólo para asuntos que sigo o en los que estoy asignado - label_user_mail_option_only_owner: Sólo para asuntos que sigo o de los que soy propietario - warning_fields_cleared_on_bulk_edit: Los cambios conllevarán la eliminación automática - de valores de uno o más campos de los objetos seleccionados - field_updated_by: Actualizado por - field_last_updated_by: Última actualización de - field_full_width_layout: Diseño de ancho completo - label_last_notes: Últimas notas + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes field_digest: Checksum - field_default_assigned_to: Asignado por defecto - setting_show_custom_fields_on_registration: Mostrar campos personalizados en el registro + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download - permission_view_news: Ver noticias - label_no_preview_alternative_html: No hay vista previa disponible. %{link} el archivo en su lugar. - label_no_preview_download: Descargar - setting_close_duplicate_issues: Cerrar peticiones duplicadas automáticamente - error_exceeds_maximum_hours_per_day: No se pueden registrar más de %{max_hours} horas en el - mismo día (se han registrado ya %{logged_hours} horas) - setting_time_entry_list_defaults: Listas por defecto del Timelog - setting_timelog_accept_0_hours: Aceptar registros de tiempo de 0 horas - setting_timelog_max_hours_per_day: Número de horas máximo que se puede imputar por día y usuario - label_x_revisions: "Revisiones: %{count}" - error_can_not_delete_auth_source: Este modo de autenticación está en uso y no puede ser - eliminado. - button_actions: Acciones - mail_body_lost_password_validity: Por favor, tenga en cuenta que sólo puede cambiar la contraseña - una vez usando este enlace. - text_login_required_html: Cuando no se requiera autenticación, los proyectos públicos y sus - contenidos están abiertos en la red. Puede editar - los permisos aplicables. - label_login_required_yes: 'Sí' - label_login_required_no: No, permitir acceso anónimo a los proyectos públicos - text_project_is_public_non_member: Los proyectos públicos y sus contenidos están disponibles - a todos los usuarios identificados. - text_project_is_public_anonymous: Los proyectos públicos y sus contenidos están disponibles libremente - en la red. - label_version_and_files: Versionees (%{count}) y Ficheros - label_ldap: LDAP - label_ldaps_verify_none: LDAPS (sin chequeo de certificado) - label_ldaps_verify_peer: LDAPS - label_ldaps_warning: Se recomienda usar una conexión LDAPS encriptada con chequeo de - certificado para prevenir cualquier manipulación durante el proceso de autenticación. - label_nothing_to_preview: Nada que previsualizar - error_token_expired: Este enlace de recuperación de contraseña ha expirado, por favor, inténtelo de nuevo. - error_spent_on_future_date: No se puede registrar tiempo en una fecha futura - setting_timelog_accept_future_dates: Aceptar registros de tiempo en fechas futuras - label_delete_link_to_subtask: Eliminar relación - error_not_allowed_to_log_time_for_other_users: No está autorizado a registrar tiempo para - otros usuarios - permission_log_time_for_other_users: Registrar tiempo para otros usuarios - label_tomorrow: mañana - label_next_week: próxima semana - label_next_month: próximo mes - text_role_no_workflow: No se ha definido un flujo de trabajo para este perfil - text_status_no_workflow: Ningún tipo de petición utiliza este estado en los flujos de trabajo - setting_mail_handler_preferred_body_part: Parte preferida de los correos electrónicos multiparte (HTML) - setting_show_status_changes_in_mail_subject: Mostrar los cambios de estado en el asunto de las notificaciones de correo - electrónico de las peticiones - label_inherited_from_parent_project: Heredado del proyecto padre - label_inherited_from_group: Heredado del grupo %{name} - label_trackers_description: Descripción del tipo de petición - label_open_trackers_description: Ver todas las descripciones de los tipos de petición - label_preferred_body_part_text: Texto - label_preferred_body_part_html: HTML (experimental) - field_parent_issue_subject: Asunto de la tarea padre - permission_edit_own_issues: Editar sus propias peticiones - text_select_apply_tracker: Seleccionar tipo de petición - label_updated_issues: Peticiones actualizadas - text_avatar_server_config_html: El servidor actual de avatares es %{url}. - Puede configurarlo en config/configuration.yml. - setting_gantt_months_limit: Máximo número de meses mostrados en el diagrama de Gantt - permission_import_time_entries: Importar registros de tiempo - label_import_notifications: Enviar notificaciones de correo electrónico durante la importación - text_gs_available: Disponible soporte ImageMagick PDF (opcional) - field_recently_used_projects: Número de proyectos recientemente usados en el selector - label_optgroup_bookmarks: Marcadores - label_optgroup_others: Otros proyectos - label_optgroup_recents: Accesos recientes - button_project_bookmark: Añadir marcador - button_project_bookmark_delete: Quitar marcador - field_history_default_tab: Pstaña por defecto del historial de la petición - label_issue_history_properties: Cambios de propiedades - label_issue_history_notes: Notas - label_last_tab_visited: Última pestaña visitada - field_unique_id: ID único - text_no_subject: sin asunto - setting_password_required_char_classes: Clases de caracteres requeridos para las contraseñas - label_password_char_class_uppercase: mayúsculas - label_password_char_class_lowercase: minúsculas - label_password_char_class_digits: dígitos - label_password_char_class_special_chars: caracteres especiales - text_characters_must_contain: Debe contener %{character_classes}. - label_starts_with: empieza con - label_ends_with: termina con - label_issue_fixed_version_updated: Versión objetivo actualizada - setting_project_list_defaults: Por defecto para la lista de proyectos - label_display_type: Mostrar resultados como - label_display_type_list: Lista - label_display_type_board: Panel - label_my_bookmarks: Mis marcadores - label_import_time_entries: Importar registros de tiempo + welcome_suitepro: Potencia y sencillez para planificar, compartir conocimiento, prestar soporte a clientes y acelerar la productividad. + welcome_discover: Descubre + welcome_suitepro_is_redmine: "%{suitepro} es %{redmine}, la conocida herramienta para la gestión de proyectos y el seguimiento de peticiones basada en Ruby on Rails. Redmine apremia la finalización de las tareas y mantiene la información en un único sitio." + + welcome_spotlight_1_title: "Lo Básico: Proyectos,
    Tareas, Peticiones" + welcome_spotlight_1_text: Podrás hacer un seguimiento completo de todo, monitorizar tareas y subtareas para estar al día de los hitos de proyecto, controlar los tiempos, los flujos de trabajo o cualquier elemento que requiera atención. + welcome_spotlight_2_title: "Documentos, Wikis,
    Gestión de Archivos" + welcome_spotlight_2_text: Organizados para disponer de los documentos y los archivos allá donde se esté. Y el wiki de proyecto para estructurar los requerimientos, las guías de instalación y de usuario, o las actas de trabajo. + welcome_spotlight_3_title: "Control de accesos
    flexible" + welcome_spotlight_3_text: Usando permisos agrupados en roles para establecer cómo pueden operar los usuarios en los proyectos. Cada miembro de un proyecto podrá tener uno o más roles asignados por los administradores. + + welcome_other_features: Otras Características + welcome_feature_1_title: Diagrama de Gantt y Calendario + welcome_feature_1_text: El diagrama de Gantt muestra las tareas que tienen fecha de inicio y vencimiento. Y el calendario da una visión general de los proyectos en una vista mensual. + welcome_feature_2_title: Noticias y Foros + welcome_feature_2_text: Las noticias muestran información sobre novedades en los proyectos u otros temas de interés. Y los foros permiten que los usuarios de un proyecto se comuniquen entre sí. + welcome_feature_3_title: Notificaciones y Sindicación + welcome_feature_3_text: SuitePro se puede configurar para recibir notificaciones por correo electrónico. Y también proporciona sindicaciones para utilizar con agregadores externos. + welcome_feature_4_title: Repositorios de Código + welcome_feature_4_text: Sistemas de Control de Versiones como Git o Subversion pueden usarse como repositorios de código y seguir desde SuitePro los cambios realizados en el código. + welcome_feature_5_title: Responsive Design + welcome_feature_5_text: SuitePro está optimizado para visualizarse en dispositivos móviles. Las páginas se adaptan automáticamente al tamaño de la pantalla, ya sea un teléfono móvil, una tableta o un ordenador. + welcome_feature_6_title: Es Software de Código Abierto + welcome_feature_6_text: Esto supone no estar limitado por ningún proveedor, y seguir en permanente evolución con desarrolladores que se involucran continuamente. + + welcome_any_questions: ¿Alguna Pregunta? + welcome_please_contact: No dudar en contactar conmigo para obtener más información. + welcome_contact: Contactar + welcome_about_me: Más Sobre Mí link_my_blog: Mi blog personal diff --git a/config/locales/et.yml b/config/locales/et.yml new file mode 100644 index 0000000..ca69944 --- /dev/null +++ b/config/locales/et.yml @@ -0,0 +1,1235 @@ +# Estonian localization for Redmine +# Copyright (C) 2012 Kaitseministeerium +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +et: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d.%m.%Y" + short: "%d.%b" + long: "%d. %B %Y" + + day_names: [Pühapäev, Esmaspäev, Teisipäev, Kolmapäev, Neljapäev, Reede, Laupäev] + abbr_day_names: [P, E, T, K, N, R, L] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Jaanuar, Veebruar, Märts, Aprill, Mai, Juuni, Juuli, August, September, Oktoober, November, Detsember] + abbr_month_names: [~, jaan, veebr, märts, apr, mai, juuni, juuli, aug, sept, okt, nov, dets] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%d.%m.%Y %H:%M" + time: "%H:%M" + short: "%d.%b %H:%M" + long: "%d. %B %Y %H:%M %z" + am: "enne lõunat" + pm: "peale lõunat" + + datetime: + distance_in_words: + half_a_minute: "pool minutit" + less_than_x_seconds: + one: "vähem kui sekund" + other: "vähem kui %{count} sekundit" + x_seconds: + one: "1 sekund" + other: "%{count} sekundit" + less_than_x_minutes: + one: "vähem kui minut" + other: "vähem kui %{count} minutit" + x_minutes: + one: "1 minut" + other: "%{count} minutit" + about_x_hours: + one: "umbes tund" + other: "umbes %{count} tundi" + x_hours: + one: "1 tund" + other: "%{count} tundi" + x_days: + one: "1 päev" + other: "%{count} päeva" + about_x_months: + one: "umbes kuu" + other: "umbes %{count} kuud" + x_months: + one: "1 kuu" + other: "%{count} kuud" + about_x_years: + one: "umbes aasta" + other: "umbes %{count} aastat" + over_x_years: + one: "rohkem kui aasta" + other: "rohkem kui %{count} aastat" + almost_x_years: + one: "peaaegu aasta" + other: "peaaegu %{count} aastat" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "bait" + other: "baiti" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "ja" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 viga ei võimaldanud selle %{model} salvestamist" + other: "%{count} viga ei võimaldanud selle %{model} salvestamist" + messages: + inclusion: "ei ole nimekirjas" + exclusion: "on reserveeritud" + invalid: "ei sobi" + confirmation: "ei lange kinnitusega kokku" + accepted: "peab olema aktsepteeritud" + empty: "ei või olla tühi" + blank: "ei või olla täitmata" + too_long: "on liiga pikk (lubatud on kuni %{count} märki)" + too_short: "on liiga lühike (vaja on vähemalt %{count} märki)" + wrong_length: "on vale pikkusega (peaks olema %{count} märki)" + taken: "on juba võetud" + not_a_number: "ei ole arv" + not_a_date: "ei ole korrektne kuupäev" + greater_than: "peab olema suurem kui %{count}" + greater_than_or_equal_to: "peab olema võrdne või suurem kui %{count}" + equal_to: "peab võrduma %{count}-ga" + less_than: "peab olema väiksem kui %{count}" + less_than_or_equal_to: "peab olema võrdne või väiksem kui %{count}" + odd: "peab olema paaritu arv" + even: "peab olema paarisarv" + greater_than_start_date: "peab olema suurem kui alguskuupäev" + not_same_project: "ei kuulu sama projekti juurde" + circular_dependency: "See suhe looks vastastikuse sõltuvuse" + cant_link_an_issue_with_a_descendant: "Teemat ei saa sidustada tema enda alamteemaga" + earlier_than_minimum_start_date: "Tähtpäev ei saa olla varasem kui %{date} eelnevate teemade tähtpäevade tõttu" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: "Palun vali" + + general_text_No: "Ei" + general_text_Yes: "Jah" + general_text_no: "ei" + general_text_yes: "jah" + general_lang_name: "Estonian (Eesti)" + general_csv_separator: "," + general_csv_decimal_separator: "." + general_csv_encoding: ISO-8859-13 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: "1" + + notice_account_updated: "Konto uuendamine õnnestus." + notice_account_invalid_credentials: "Sobimatu kasutajanimi või parool" + notice_account_password_updated: "Parooli uuendamine õnnestus." + notice_account_wrong_password: "Vale parool" + notice_account_register_done: "Konto loomine õnnestus. Konto aktiveerimiseks vajuta vastaval lingil Sulle saadetud e-kirjas." + notice_account_unknown_email: "Tundmatu kasutaja." + notice_can_t_change_password: "See konto kasutab välist autentimisallikat. Siin ei saa selle konto parooli vahetada." + notice_account_lost_email_sent: "Sulle saadeti e-kiri parooli vahetamise juhistega." + notice_account_activated: "Su konto on aktiveeritud. Saad nüüd sisse logida." + notice_successful_create: "Loomine õnnestus." + notice_successful_update: "Uuendamine õnnestus." + notice_successful_delete: "Kustutamine õnnestus." + notice_successful_connection: "Ühenduse loomine õnnestus." + notice_file_not_found: "Sellist lehte ei leitud." + notice_locking_conflict: "Teine kasutaja uuendas vahepeal neid andmeid." + notice_not_authorized: "Sul ei ole sellele lehele ligipääsuks õigusi." + notice_not_authorized_archived_project: "See projekt on arhiveeritud." + notice_email_sent: "%{value}-le saadeti kiri" + notice_email_error: "Kirja saatmisel tekkis viga (%{value})" + notice_feeds_access_key_reseted: "Sinu Atom juurdepääsuvõti nulliti." + notice_api_access_key_reseted: "Sinu API juurdepääsuvõti nulliti." + notice_failed_to_save_issues: "%{count} teemat %{total}-st ei õnnestunud salvestada: %{ids}." + notice_failed_to_save_time_entries: "%{count} ajakulu kannet %{total}-st ei õnnestunud salvestada: %{ids}." + notice_failed_to_save_members: "Liiget/liikmeid ei õnnestunud salvestada: %{errors}." + notice_no_issue_selected: "Ühtegi teemat ei ole valitud! Palun vali teema(d), mida soovid muuta." + notice_account_pending: "Sinu konto on loodud ja ootab nüüd administraatori kinnitust." + notice_default_data_loaded: "Algseadistuste laadimine õnnestus." + notice_unable_delete_version: "Versiooni kustutamine ei õnnestunud." + notice_unable_delete_time_entry: "Ajakulu kande kustutamine ei õnnestunud." + notice_issue_done_ratios_updated: "Teema edenemise astmed on uuendatud." + notice_gantt_chart_truncated: "Diagrammi kärbiti kuna ületati kuvatavate objektide suurim hulk (%{max})" + notice_issue_successful_create: "Teema %{id} loodud." + notice_issue_update_conflict: "Teine kasutaja uuendas seda teemat Sinuga samaaegselt." + notice_account_deleted: "Sinu konto on lõplikult kustutatud." + + error_can_t_load_default_data: "Algseadistusi ei saanud laadida: %{value}" + error_scm_not_found: "Seda sissekannet hoidlast ei leitud." + error_scm_command_failed: "Hoidla poole pöördumisel tekkis viga: %{value}" + error_scm_annotate: "Sissekannet ei eksisteeri või ei saa annoteerida." + error_scm_annotate_big_text_file: "Sissekannet ei saa annoteerida, kuna see on liiga pikk." + error_issue_not_found_in_project: "Teemat ei leitud või see ei kuulu siia projekti" + error_no_tracker_in_project: "Selle projektiga ei ole seostatud ühtegi valdkonda. Palun vaata üle projekti seaded." + error_no_default_issue_status: 'Teema algolek on määramata. Palun vaata asetused üle ("Seadistused -> Olekud").' + error_can_not_delete_custom_field: "Omaloodud välja kustutamine ei õnnestunud" + error_can_not_delete_tracker: "See valdkond on mõnes teemas kasutusel ja seda ei saa kustutada." + error_can_not_remove_role: "See roll on mõnes projektis kasutusel ja seda ei saa kustutada." + error_can_not_reopen_issue_on_closed_version: "Suletud versiooni juurde kuulunud teemat ei saa taasavada" + error_can_not_archive_project: "Seda projekti ei saa arhiveerida" + error_issue_done_ratios_not_updated: "Teema edenemise astmed jäid uuendamata." + error_workflow_copy_source: "Palun vali algne valdkond või roll" + error_workflow_copy_target: "Palun vali sihtvaldkon(na)d või -roll(id)" + error_unable_delete_issue_status: "Oleku kustutamine ei õnnestunud" + error_unable_to_connect: "Ühenduse loomine ei õnnestunud (%{value})" + error_attachment_too_big: "Faili ei saa üles laadida, sest see on lubatust (%{max_size}) mahukam" + warning_attachments_not_saved: "%{count} faili salvestamine ei õnnestunud." + + mail_subject_lost_password: "Sinu %{value} parool" + mail_body_lost_password: "Parooli vahetamiseks vajuta järgmisele lingile:" + mail_subject_register: "Sinu %{value} konto aktiveerimine" + mail_body_register: "Konto aktiveerimiseks vajuta järgmisele lingile:" + mail_body_account_information_external: "Sisse logimiseks saad kasutada oma %{value} kontot." + mail_body_account_information: "Sinu konto teave" + mail_subject_account_activation_request: "%{value} konto aktiveerimise nõue" + mail_body_account_activation_request: "Registreerus uus kasutaja (%{value}). Konto avamine ootab Sinu kinnitust:" + mail_subject_reminder: "%{count} teema tähtpäev jõuab kätte järgmise %{days} päeva jooksul" + mail_body_reminder: "%{count} Sulle määratud teema tähtpäev jõuab kätte järgmise %{days} päeva jooksul:" + mail_subject_wiki_content_added: "Lisati vikileht '%{id}'" + mail_body_wiki_content_added: "Vikileht '%{id}' lisati %{author} poolt." + mail_subject_wiki_content_updated: "Uuendati '%{id}' vikilehte" + mail_body_wiki_content_updated: "Vikilehte '%{id}' uuendati %{author} poolt." + + + field_name: "Nimi" + field_description: "Kirjeldus" + field_summary: "Kokkuvõte" + field_is_required: "Kohustuslik" + field_firstname: "Eesnimi" + field_lastname: "Perekonnanimi" + field_mail: "E-post" + field_filename: "Fail" + field_filesize: "Maht" + field_downloads: "Allalaadimist" + field_author: "Autor" + field_created_on: "Loodud" + field_updated_on: "Uuendatud" + field_field_format: "Tüüp" + field_is_for_all: "Kõigile projektidele" + field_possible_values: "Võimalikud väärtused" + field_regexp: "Regulaaravaldis" + field_min_length: "Vähim maht" + field_max_length: "Suurim naht" + field_value: "Väärtus" + field_category: "Kategooria" + field_title: "Pealkiri" + field_project: "Projekt" + field_issue: "Teema" + field_status: "Olek" + field_notes: "Märkused" + field_is_closed: "Sulgeb teema" + field_is_default: "Algolek" + field_tracker: "Valdkond" + field_subject: "Teema" + field_due_date: "Tähtaeg" + field_assigned_to: "Tegeleja" + field_priority: "Prioriteet" + field_fixed_version: "Sihtversioon" + field_user: "Kasutaja" + field_principal: "Vastutav isik" + field_role: "Roll" + field_homepage: "Koduleht" + field_is_public: "Avalik" + field_parent: "Emaprojekt" + field_is_in_roadmap: "Teemad on teekaardil näha" + field_login: "Kasutajanimi" + field_mail_notification: "Teated e-kirjaga" + field_admin: "Admin" + field_last_login_on: "Viimane ühendus" + field_language: "Keel" + field_effective_date: "Tähtaeg" + field_password: "Parool" + field_new_password: "Uus parool" + field_password_confirmation: "Kinnitus" + field_version: "Versioon" + field_type: "Tüüp" + field_host: "Server" + field_port: "Port" + field_account: "Konto" + field_base_dn: "Baas DN" + field_attr_login: "Kasutajanime atribuut" + field_attr_firstname: "Eesnime atribuut" + field_attr_lastname: "Perekonnanime atribuut" + field_attr_mail: "E-posti atribuut" + field_onthefly: "Kasutaja automaatne loomine" + field_start_date: "Alguskuupäev" + field_done_ratio: "% tehtud" + field_auth_source: "Autentimise viis" + field_hide_mail: "Peida e-posti aadress" + field_comments: "Kommentaar" + field_url: "URL" + field_start_page: "Esileht" + field_subproject: "Alamprojekt" + field_hours: "tundi" + field_activity: "Tegevus" + field_spent_on: "Kuupäev" + field_identifier: "Tunnus" + field_is_filter: "Kasutatav filtrina" + field_issue_to: "Seotud teema" + field_delay: "Viivitus" + field_assignable: "Saab määrata teemadega tegelema" + field_redirect_existing_links: "Suuna olemasolevad lingid ringi" + field_estimated_hours: "Eeldatav ajakulu" + field_column_names: "Veerud" + field_time_entries: "Ajakulu" + field_time_zone: "Ajatsoon" + field_searchable: "Otsitav" + field_default_value: "Vaikimisi" + field_comments_sorting: "Kommentaaride järjestus" + field_parent_title: "Pärineb lehest" + field_editable: "Muudetav" + field_watcher: "Jälgija" + field_identity_url: "OpenID URL" + field_content: "Sisu" + field_group_by: "Rühmita tulemus" + field_sharing: "Teemade jagamine" + field_parent_issue: "Pärineb teemast" + field_member_of_group: "Tegeleja rühm" + field_assigned_to_role: "Tegeleja roll" + field_text: "Tekstiväli" + field_visible: "Nähtav" + field_warn_on_leaving_unsaved: "Hoiata salvestamata sisuga lehtedelt lahkumisel" + field_issues_visibility: "See roll näeb" + field_is_private: "Privaatne" + field_commit_logs_encoding: "Sissekannete kodeering" + field_scm_path_encoding: "Teeraja märkide kodeering" + field_path_to_repository: "Hoidla teerada" + field_root_directory: "Juurkataloog" + field_cvsroot: "CVSROOT" + field_cvs_module: "Moodul" + field_repository_is_default: "Peamine hoidla" + field_multiple: "Korraga mitu väärtust" + field_auth_source_ldap_filter: "LDAP filter" + + setting_app_title: "Veebilehe pealkiri" + setting_app_subtitle: "Veebilehe alampealkiri" + setting_welcome_text: "Tervitustekst" + setting_default_language: "Vaikimisi keel" + setting_login_required: "Autentimine on kohustuslik" + setting_self_registration: "Omaloodud konto aktiveerimine" + setting_attachment_max_size: "Manuse suurim maht" + setting_issues_export_limit: "Teemade ekspordi limiit" + setting_mail_from: "Saatja e-posti aadress" + setting_bcc_recipients: "Saajaid ei näidata (lähevad BCC reale)" + setting_plain_text_mail: "E-kiri tavalise tekstina (ilma HTML-ta)" + setting_host_name: "Serveri nimi ja teerada" + setting_text_formatting: "Vormindamise abi" + setting_wiki_compression: "Viki ajaloo pakkimine" + setting_feeds_limit: "Atom voogude suurim objektide arv" + setting_default_projects_public: "Uued projektid on vaikimisi avalikud" + setting_autofetch_changesets: "Lae uuendused automaatselt" + setting_sys_api_enabled: "Hoidlate haldamine veebiteenuse kaudu" + setting_commit_ref_keywords: "Viitade võtmesõnad" + setting_commit_fix_keywords: "Paranduste võtmesõnad" + setting_autologin: "Automaatne sisselogimine" + setting_date_format: "Kuupäeva formaat" + setting_time_format: "Ajaformaat" + setting_cross_project_issue_relations: "Luba siduda eri projektide teemasid" + setting_issue_list_default_columns: "Teemade nimekirja vaikimisi veerud" + setting_repositories_encodings: "Manuste ja hoidlate kodeering" + setting_emails_header: "E-kirja päis" + setting_emails_footer: "E-kirja jalus" + setting_protocol: "Protokoll" + setting_per_page_options: "Objekte lehe kohta variandid" + setting_user_format: "Kasutaja nime esitamise vorm" + setting_activity_days_default: "Projektide ajalugu näidatakse" + setting_display_subprojects_issues: "Näita projektis vaikimisi ka alamprojektide teemasid" + setting_enabled_scm: "Kasutatavad lähtekoodi haldusvahendid" + setting_mail_handler_body_delimiters: "Kärbi e-kirja lõpp peale sellist rida" + setting_mail_handler_api_enabled: "E-kirjade vastuvõtt veebiteenuse kaudu" + setting_mail_handler_api_key: "Veebiteenuse API võti" + setting_sequential_project_identifiers: "Genereeri järjestikused projektitunnused" + setting_gravatar_enabled: "Kasuta Gravatari kasutajaikoone" + setting_gravatar_default: "Vaikimisi kasutatav ikoon" + setting_diff_max_lines_displayed: "Enim korraga näidatavaid erinevusi" + setting_file_max_size_displayed: "Kuvatava tekstifaili suurim maht" + setting_repository_log_display_limit: "Enim ajaloos näidatavaid sissekandeid" + setting_openid: "Luba OpenID-ga registreerimine ja sisselogimine" + setting_password_min_length: "Lühim lubatud parooli pikkus" + setting_new_project_user_role_id: "Projekti looja roll oma projektis" + setting_default_projects_modules: "Vaikimisi moodulid uutes projektides" + setting_issue_done_ratio: "Määra teema edenemise aste" + setting_issue_done_ratio_issue_field: "kasutades vastavat välja" + setting_issue_done_ratio_issue_status: "kasutades teema olekut" + setting_start_of_week: "Nädala alguspäev" + setting_rest_api_enabled: "Luba REST API kasutamine" + setting_cache_formatted_text: "Puhverda vormindatud teksti" + setting_default_notification_option: "Vaikimisi teavitatakse" + setting_commit_logtime_enabled: "Luba ajakulu sisestamine" + setting_commit_logtime_activity_id: "Tegevus kulunud ajal" + setting_gantt_items_limit: "Gantti diagrammi objektide suurim hulk" + setting_issue_group_assignment: "Luba teemade andmine gruppidele" + setting_default_issue_start_date_to_creation_date: "Uute teemade alguskuupäevaks on teema loomise päev" + setting_commit_cross_project_ref: "Luba viiteid ja parandusi ka kõigi teiste projektide teemadele" + setting_unsubscribe: "Luba kasutajal oma konto kustutada" + + permission_add_project: "Projekte luua" + permission_add_subprojects: "Alamprojekte luua" + permission_edit_project: "Projekte muuta" + permission_select_project_modules: "Projektimooduleid valida" + permission_manage_members: "Liikmeid hallata" + permission_manage_project_activities: "Projekti tegevusi hallata" + permission_manage_versions: "Versioone hallata" + permission_manage_categories: "Kategooriaid hallata" + permission_view_issues: "Teemasid näha" + permission_add_issues: "Teemasid lisada" + permission_edit_issues: "Teemasid uuendada" + permission_manage_issue_relations: "Teemade seoseid hallata" + permission_set_issues_private: "Teemasid avalikeks või privaatseiks seada" + permission_set_own_issues_private: "Omi teemasid avalikeks või privaatseiks seada" + permission_add_issue_notes: "Märkusi lisada" + permission_edit_issue_notes: "Märkusi muuta" + permission_edit_own_issue_notes: "Omi märkusi muuta" + permission_move_issues: "Teemasid teise projekti tõsta" + permission_delete_issues: "Teemasid kustutada" + permission_manage_public_queries: "Avalikke päringuid hallata" + permission_save_queries: "Päringuid salvestada" + permission_view_gantt: "Gantti diagramme näha" + permission_view_calendar: "Kalendrit näha" + permission_view_issue_watchers: "Jälgijate nimekirja näha" + permission_add_issue_watchers: "Jälgijaid lisada" + permission_delete_issue_watchers: "Jälgijaid kustutada" + permission_log_time: "Ajakulu sisestada" + permission_view_time_entries: "Ajakulu näha" + permission_edit_time_entries: "Ajakulu kandeid muuta" + permission_edit_own_time_entries: "Omi ajakulu kandeid muuta" + permission_manage_news: "Uudiseid hallata" + permission_comment_news: "Uudiseid kommenteerida" + permission_view_documents: "Dokumente näha" + permission_manage_files: "Faile hallata" + permission_view_files: "Faile näha" + permission_manage_wiki: "Vikit hallata" + permission_rename_wiki_pages: "Vikilehti ümber nimetada" + permission_delete_wiki_pages: "Vikilehti kustutada" + permission_view_wiki_pages: "Vikit näha" + permission_view_wiki_edits: "Viki ajalugu näha" + permission_edit_wiki_pages: "Vikilehti muuta" + permission_delete_wiki_pages_attachments: "Vikilehe manuseid kustutada" + permission_protect_wiki_pages: "Vikilehti kaitsta" + permission_manage_repository: "Hoidlaid hallata" + permission_browse_repository: "Hoidlaid sirvida" + permission_view_changesets: "Sissekandeid näha" + permission_commit_access: "Sissekandeid teha" + permission_manage_boards: "Foorumeid hallata" + permission_view_messages: "Postitusi näha" + permission_add_messages: "Postitusi lisada" + permission_edit_messages: "Postitusi muuta" + permission_edit_own_messages: "Omi postitusi muuta" + permission_delete_messages: "Postitusi kustutada" + permission_delete_own_messages: "Omi postitusi kustutada" + permission_export_wiki_pages: "Vikilehti eksportida" + permission_manage_subtasks: "Alamteemasid hallata" + permission_manage_related_issues: "Seotud teemasid hallata" + + project_module_issue_tracking: "Teemade jälgimine" + project_module_time_tracking: "Ajakulu arvestus" + project_module_news: "Uudised" + project_module_documents: "Dokumendid" + project_module_files: "Failid" + project_module_wiki: "Viki" + project_module_repository: "Hoidlad" + project_module_boards: "Foorumid" + project_module_calendar: "Kalender" + project_module_gantt: "Gantt" + + label_user: "Kasutaja" + label_user_plural: "Kasutajad" + label_user_new: "Uus kasutaja" + label_user_anonymous: "Anonüümne" + label_project: "Projekt" + label_project_new: "Uus projekt" + label_project_plural: "Projektid" + label_x_projects: + zero: "pole projekte" + one: "1 projekt" + other: "%{count} projekti" + label_project_all: "Kõik projektid" + label_project_latest: "Viimased projektid" + label_issue: "Teema" + label_issue_new: "Uus teema" + label_issue_plural: "Teemad" + label_issue_view_all: "Teemade nimekiri" + label_issues_by: "Teemad %{value} järgi" + label_issue_added: "Teema lisatud" + label_issue_updated: "Teema uuendatud" + label_issue_note_added: "Märkus lisatud" + label_issue_status_updated: "Olek uuendatud" + label_issue_priority_updated: "Prioriteet uuendatud" + label_document: "Dokument" + label_document_new: "Uus dokument" + label_document_plural: "Dokumendid" + label_document_added: "Dokument lisatud" + label_role: "Roll" + label_role_plural: "Rollid" + label_role_new: "Uus roll" + label_role_and_permissions: "Rollid ja õigused" + label_role_anonymous: "Registreerimata kasutaja" + label_role_non_member: "Projekti kaasamata kasutaja" + label_member: "Liige" + label_member_new: "Uus liige" + label_member_plural: "Liikmed" + label_tracker: "Valdkond" + label_tracker_plural: "Valdkonnad" + label_tracker_new: "Uus valdkond" + label_workflow: "Töövood" + label_issue_status: "Olek" + label_issue_status_plural: "Olekud" + label_issue_status_new: "Uus olek" + label_issue_category: "Kategooria" + label_issue_category_plural: "Kategooriad" + label_issue_category_new: "Uus kategooria" + label_custom_field: "Omaloodud väli" + label_custom_field_plural: "Omaloodud väljad" + label_custom_field_new: "Uus väli" + label_enumerations: "Loetelud" + label_enumeration_new: "Lisa" + label_information: "Teave" + label_information_plural: "Teave" + label_please_login: "Palun logi sisse" + label_register: "Registreeru" + label_login_with_open_id_option: "või logi sisse OpenID-ga" + label_password_lost: "Kui parool on ununud..." + label_home: "Kodu" + label_my_page: "Minu leht" + label_my_account: "Minu konto" + label_my_projects: "Minu projektid" + label_administration: "Seadistused" + label_login: "Logi sisse" + label_logout: "Logi välja" + label_help: "Abi" + label_reported_issues: "Minu poolt lisatud teemad" + label_assigned_to_me_issues: "Minu teha olevad teemad" + label_last_login: "Viimane ühendus" + label_registered_on: "Registreeritud" + label_activity: "Ajalugu" + label_overall_activity: "Üldine tegevuste ajalugu" + label_user_activity: "%{value} tegevuste ajalugu" + label_new: "Uus" + label_logged_as: "Sisse logitud kasutajana" + label_environment: "Keskkond" + label_authentication: "Autentimine" + label_auth_source: "Autentimisallikas" + label_auth_source_new: "Uus autentimisallikas" + label_auth_source_plural: "Autentimisallikad" + label_subproject_plural: "Alamprojektid" + label_subproject_new: "Uus alamprojekt" + label_and_its_subprojects: "%{value} ja selle alamprojektid" + label_min_max_length: "Min.-maks. pikkus" + label_list: "Nimekiri" + label_date: "Kuupäev" + label_integer: "Täisarv" + label_float: "Ujukomaarv" + label_boolean: "Tõeväärtus" + label_string: "Tekst" + label_text: "Pikk tekst" + label_attribute: "Atribuut" + label_attribute_plural: "Atribuudid" + label_no_data: "Pole" + label_change_status: "Muuda olekut" + label_history: "Ajalugu" + label_attachment: "Fail" + label_attachment_new: "Uus fail" + label_attachment_delete: "Kustuta fail" + label_attachment_plural: "Failid" + label_file_added: "Fail lisatud" + label_report: "Aruanne" + label_report_plural: "Aruanded" + label_news: "Uudised" + label_news_new: "Lisa uudis" + label_news_plural: "Uudised" + label_news_latest: "Viimased uudised" + label_news_view_all: "Kõik uudised" + label_news_added: "Uudis lisatud" + label_news_comment_added: "Kommentaar uudisele lisatud" + label_settings: "Seaded" + label_overview: "Ülevaade" + label_version: "Versioon" + label_version_new: "Uus versioon" + label_version_plural: "Versioonid" + label_close_versions: "Sulge lõpetatud versioonid" + label_confirmation: "Kinnitus" + label_export_to: "Saadaval ka formaadis" + label_read: "Loe..." + label_public_projects: "Avalikud projektid" + label_open_issues: "avatud" + label_open_issues_plural: "avatud" + label_closed_issues: "suletud" + label_closed_issues_plural: "suletud" + label_x_open_issues_abbr: + zero: "0 avatud" + one: "1 avatud" + other: "%{count} avatud" + label_x_closed_issues_abbr: + zero: "0 suletud" + one: "1 suletud" + other: "%{count} suletud" + label_x_issues: + zero: "0 teemat" + one: "1 teema" + other: "%{count} teemat" + label_total: "Kokku" + label_permissions: "Õigused" + label_current_status: "Praegune olek" + label_new_statuses_allowed: "Uued lubatud olekud" + label_all: "kõik" + label_none: "pole" + label_nobody: "eikeegi" + label_next: "Järgmine" + label_previous: "Eelmine" + label_used_by: "Kasutab" + label_details: "Üksikasjad" + label_add_note: "Lisa märkus" + label_calendar: "Kalender" + label_months_from: "kuu kaugusel" + label_gantt: "Gantt" + label_internal: "Sisemine" + label_last_changes: "viimased %{count} muudatust" + label_change_view_all: "Kõik muudatused" + label_comment: "Kommentaar" + label_comment_plural: "Kommentaarid" + label_x_comments: + zero: "kommentaare pole" + one: "1 kommentaar" + other: "%{count} kommentaari" + label_comment_add: "Lisa kommentaar" + label_comment_added: "Kommentaar lisatud" + label_comment_delete: "Kustuta kommentaar" + label_query: "Omaloodud päring" + label_query_plural: "Omaloodud päringud" + label_query_new: "Uus päring" + label_my_queries: "Mu omaloodud päringud" + label_filter_add: "Lisa filter" + label_filter_plural: "Filtrid" + label_equals: "on" + label_not_equals: "ei ole" + label_in_less_than: "on väiksem kui" + label_in_more_than: "on suurem kui" + label_greater_or_equal: "suurem-võrdne" + label_less_or_equal: "väiksem-võrdne" + label_between: "vahemikus" + label_in: "sisaldub hulgas" + label_today: "täna" + label_all_time: "piirideta" + label_yesterday: "eile" + label_this_week: "sel nädalal" + label_last_week: "eelmisel nädalal" + label_last_n_days: "viimase %{count} päeva jooksul" + label_this_month: "sel kuul" + label_last_month: "eelmisel kuul" + label_this_year: "sel aastal" + label_date_range: "Kuupäevavahemik" + label_less_than_ago: "uuem kui" + label_more_than_ago: "vanem kui" + label_ago: "vanus" + label_contains: "sisaldab" + label_not_contains: "ei sisalda" + label_day_plural: "päeva" + label_repository: "Hoidla" + label_repository_new: "Uus hoidla" + label_repository_plural: "Hoidlad" + label_browse: "Sirvi" + label_branch: "Haru" + label_tag: "Sildiga" + label_revision: "Sissekanne" + label_revision_plural: "Sissekanded" + label_revision_id: "Sissekande kood %{value}" + label_associated_revisions: "Seotud sissekanded" + label_added: "lisatud" + label_modified: "muudetud" + label_copied: "kopeeritud" + label_renamed: "ümber nimetatud" + label_deleted: "kustutatud" + label_latest_revision: "Viimane sissekanne" + label_latest_revision_plural: "Viimased sissekanded" + label_view_revisions: "Haru ajalugu" + label_view_all_revisions: "Kogu ajalugu" + label_max_size: "Suurim maht" + label_sort_highest: "Nihuta esimeseks" + label_sort_higher: "Nihuta üles" + label_sort_lower: "Nihuta alla" + label_sort_lowest: "Nihuta viimaseks" + label_roadmap: "Teekaart" + label_roadmap_due_in: "Tähtaeg %{value}" + label_roadmap_overdue: "%{value} hiljaks jäänud" + label_roadmap_no_issues: "Selles versioonis ei ole teemasid" + label_search: "Otsi" + label_result_plural: "Tulemused" + label_all_words: "Kõik sõnad" + label_wiki: "Viki" + label_wiki_edit: "Viki muutmine" + label_wiki_edit_plural: "Viki muutmised" + label_wiki_page: "Vikileht" + label_wiki_page_plural: "Vikilehed" + label_index_by_title: "Järjesta pealkirja järgi" + label_index_by_date: "Järjesta kuupäeva järgi" + label_current_version: "Praegune versioon" + label_preview: "Eelvaade" + label_feed_plural: "Vood" + label_changes_details: "Kõigi muudatuste üksikasjad" + label_issue_tracking: "Teemade jälgimine" + label_spent_time: "Kulutatud aeg" + label_overall_spent_time: "Kokku kulutatud aeg" + label_f_hour: "%{value} tund" + label_f_hour_plural: "%{value} tundi" + label_time_tracking: "Ajakulu arvestus" + label_change_plural: "Muudatused" + label_statistics: "Statistika" + label_commits_per_month: "Sissekandeid kuu kohta" + label_commits_per_author: "Sissekandeid autori kohta" + label_diff: "erinevused" + label_view_diff: "Vaata erinevusi" + label_diff_inline: "teksti sees" + label_diff_side_by_side: "kõrvuti" + label_options: "Valikud" + label_copy_workflow_from: "Kopeeri see töövoog" + label_permissions_report: "Õiguste aruanne" + label_watched_issues: "Jälgitud teemad" + label_related_issues: "Seotud teemad" + label_applied_status: "Kehtestatud olek" + label_loading: "Laadimas..." + label_relation_new: "Uus seos" + label_relation_delete: "Kustuta seos" + label_relates_to: "seostub" + label_duplicates: "duplitseerib" + label_duplicated_by: "duplitseerijaks" + label_blocks: "blokeerib" + label_blocked_by: "blokeerijaks" + label_precedes: "eelneb" + label_follows: "järgneb" + label_stay_logged_in: "Püsi sisselogituna" + label_disabled: "pole võimalik" + label_show_completed_versions: "Näita lõpetatud versioone" + label_me: "mina" + label_board: "Foorum" + label_board_new: "Uus foorum" + label_board_plural: "Foorumid" + label_board_locked: "Lukus" + label_board_sticky: "Püsiteema" + label_topic_plural: "Teemad" + label_message_plural: "Postitused" + label_message_last: "Viimane postitus" + label_message_new: "Uus postitus" + label_message_posted: "Postitus lisatud" + label_reply_plural: "Vastused" + label_send_information: "Saada teave konto kasutajale" + label_year: "Aasta" + label_month: "Kuu" + label_week: "Nädal" + label_date_from: "Alates" + label_date_to: "Kuni" + label_language_based: "Kasutaja keele põhjal" + label_sort_by: "Sorteeri %{value} järgi" + label_send_test_email: "Saada kontrollkiri" + label_feeds_access_key: "Atom juurdepääsuvõti" + label_missing_feeds_access_key: "Atom juurdepääsuvõti on puudu" + label_feeds_access_key_created_on: "Atom juurdepääsuvõti loodi %{value} tagasi" + label_module_plural: "Moodulid" + label_added_time_by: "Lisatud %{author} poolt %{age} tagasi" + label_updated_time_by: "Uuendatud %{author} poolt %{age} tagasi" + label_updated_time: "Uuendatud %{value} tagasi" + label_jump_to_a_project: "Ava projekt..." + label_file_plural: "Failid" + label_changeset_plural: "Muudatused" + label_default_columns: "Vaikimisi veerud" + label_no_change_option: "(Ei muutu)" + label_bulk_edit_selected_issues: "Muuda valitud teemasid korraga" + label_bulk_edit_selected_time_entries: "Muuda valitud ajakandeid korraga" + label_theme: "Visuaalne teema" + label_default: "Tavaline" + label_search_titles_only: "Ainult pealkirjadest" + label_user_mail_option_all: "Kõigist tegevustest kõigis mu projektides" + label_user_mail_option_selected: "Kõigist tegevustest ainult valitud projektides..." + label_user_mail_option_none: "Teavitusi ei saadeta" + label_user_mail_option_only_my_events: "Ainult mu jälgitavatest või minuga seotud tegevustest" + label_user_mail_no_self_notified: "Ära teavita mind mu enda tehtud muudatustest" + label_registration_activation_by_email: "e-kirjaga" + label_registration_manual_activation: "käsitsi" + label_registration_automatic_activation: "automaatselt" + label_display_per_page: "Lehe kohta: %{value}" + label_age: "Vanus" + label_change_properties: "Muuda omadusi" + label_general: "Üldine" + label_scm: "Lähtekoodi haldusvahend" + label_plugins: "Lisamoodulid" + label_ldap_authentication: "LDAP autentimine" + label_downloads_abbr: "A/L" + label_optional_description: "Teave" + label_add_another_file: "Lisa veel üks fail" + label_preferences: "Eelistused" + label_chronological_order: "kronoloogiline" + label_reverse_chronological_order: "tagurpidi kronoloogiline" + label_incoming_emails: "Sissetulevad e-kirjad" + label_generate_key: "Genereeri võti" + label_issue_watchers: "Jälgijad" + label_example: "Näide" + label_display: "Kujundus" + label_sort: "Sorteeri" + label_ascending: "Kasvavalt" + label_descending: "Kahanevalt" + label_date_from_to: "Alates %{start} kuni %{end}" + label_wiki_content_added: "Vikileht lisatud" + label_wiki_content_updated: "Vikileht uuendatud" + label_group: "Rühm" + label_group_plural: "Rühmad" + label_group_new: "Uus rühm" + label_time_entry_plural: "Kulutatud aeg" + label_version_sharing_none: "ei toimu" + label_version_sharing_descendants: "alamprojektidega" + label_version_sharing_hierarchy: "projektihierarhiaga" + label_version_sharing_tree: "projektipuuga" + label_version_sharing_system: "kõigi projektidega" + label_update_issue_done_ratios: "Uuenda edenemise astmeid" + label_copy_source: "Allikas" + label_copy_target: "Sihtkoht" + label_copy_same_as_target: "Sama mis sihtkoht" + label_display_used_statuses_only: "Näita ainult selles valdkonnas kasutusel olekuid" + label_api_access_key: "API juurdepääsuvõti" + label_missing_api_access_key: "API juurdepääsuvõti on puudu" + label_api_access_key_created_on: "API juurdepääsuvõti loodi %{value} tagasi" + label_profile: "Profiil" + label_subtask_plural: "Alamteemad" + label_project_copy_notifications: "Saada projekti kopeerimise kohta teavituskiri" + label_principal_search: "Otsi kasutajat või rühma:" + label_user_search: "Otsi kasutajat:" + label_additional_workflow_transitions_for_author: "Luba ka järgmisi üleminekuid, kui kasutaja on teema looja" + label_additional_workflow_transitions_for_assignee: "Luba ka järgmisi üleminekuid, kui kasutaja on teemaga tegeleja" + label_issues_visibility_all: "kõiki teemasid" + label_issues_visibility_public: "kõiki mitteprivaatseid teemasid" + label_issues_visibility_own: "enda poolt loodud või enda teha teemasid" + label_git_report_last_commit: "Viimase sissekande teave otse failinimekirja" + label_parent_revision: "Eellane" + label_child_revision: "Järglane" + label_export_options: "%{export_format} ekspordivalikud" + label_copy_attachments: "Kopeeri manused" + label_item_position: "%{position}/%{count}" + label_completed_versions: "Lõpetatud versioonid" + label_search_for_watchers: "Otsi lisamiseks jälgijaid" + + button_login: "Logi sisse" + button_submit: "Sisesta" + button_save: "Salvesta" + button_check_all: "Märgi kõik" + button_uncheck_all: "Nulli valik" + button_collapse_all: "Voldi kõik kokku" + button_expand_all: "Voldi kõik lahti" + button_delete: "Kustuta" + button_create: "Loo" + button_create_and_continue: "Loo ja jätka" + button_test: "Testi" + button_edit: "Muuda" + button_edit_associated_wikipage: "Muuda seotud vikilehte: %{page_title}" + button_add: "Lisa" + button_change: "Muuda" + button_apply: "Lae" + button_clear: "Puhasta" + button_lock: "Lukusta" + button_unlock: "Ava lukust" + button_download: "Lae alla" + button_list: "Listi" + button_view: "Vaata" + button_move: "Tõsta" + button_move_and_follow: "Tõsta ja järgne" + button_back: "Tagasi" + button_cancel: "Katkesta" + button_activate: "Aktiveeri" + button_sort: "Sorteeri" + button_log_time: "Ajakulu" + button_rollback: "Rulli tagasi sellesse versiooni" + button_watch: "Jälgi" + button_unwatch: "Ära jälgi" + button_reply: "Vasta" + button_archive: "Arhiveeri" + button_unarchive: "Arhiivist tagasi" + button_reset: "Nulli" + button_rename: "Nimeta ümber" + button_change_password: "Vaheta parool" + button_copy: "Kopeeri" + button_copy_and_follow: "Kopeeri ja järgne" + button_annotate: "Annoteeri" + button_update: "Muuda" + button_configure: "Konfigureeri" + button_quote: "Tsiteeri" + button_duplicate: "Duplitseeri" + button_show: "Näita" + button_edit_section: "Muuda seda sektsiooni" + button_export: "Ekspordi" + button_delete_my_account: "Kustuta oma konto" + + status_active: "aktiivne" + status_registered: "registreeritud" + status_locked: "lukus" + + version_status_open: "avatud" + version_status_locked: "lukus" + version_status_closed: "suletud" + + field_active: "Aktiivne" + + text_select_mail_notifications: "Tegevused, millest e-kirjaga teavitatakse" + text_regexp_info: "nt. ^[A-Z0-9]+$" + text_min_max_length_info: "0 tähendab, et piiranguid ei ole" + text_project_destroy_confirmation: "Oled Sa kindel oma soovis see projekt täielikult kustutada?" + text_subprojects_destroy_warning: "Alamprojekt(id) - %{value} - kustutatakse samuti." + text_workflow_edit: "Töövoo muutmiseks vali roll ja valdkond" + text_are_you_sure: "Oled Sa kindel?" + text_journal_changed: "%{label} muudetud %{old} -> %{new}" + text_journal_changed_no_detail: "%{label} uuendatud" + text_journal_set_to: "%{label} uus väärtus on %{value}" + text_journal_deleted: "%{label} kustutatud (%{old})" + text_journal_added: "%{label} %{value} lisatud" + text_tip_issue_begin_day: "teema avamise päev" + text_tip_issue_end_day: "teema sulgemise päev" + text_tip_issue_begin_end_day: "teema avati ja suleti samal päeval" + text_project_identifier_info: "Lubatud on ainult väikesed tähed (a-z), numbrid ja kriipsud.
    Peale salvestamist ei saa tunnust enam muuta." + text_caracters_maximum: "%{count} märki kõige rohkem." + text_caracters_minimum: "Peab olema vähemalt %{count} märki pikk." + text_length_between: "Pikkus %{min} kuni %{max} märki." + text_tracker_no_workflow: "Selle valdkonna jaoks ei ole ühtegi töövoogu kirjeldatud" + text_unallowed_characters: "Lubamatud märgid" + text_comma_separated: "Lubatud erinevad väärtused (komaga eraldatult)." + text_line_separated: "Lubatud erinevad väärtused (igaüks eraldi real)." + text_issues_ref_in_commit_messages: "Teemadele ja parandustele viitamine sissekannete märkustes" + text_issue_added: "%{author} lisas uue teema %{id}." + text_issue_updated: "%{author} uuendas teemat %{id}." + text_wiki_destroy_confirmation: "Oled Sa kindel oma soovis kustutada see Viki koos kogu sisuga?" + text_issue_category_destroy_question: "Kustutatavat kategooriat kasutab %{count} teema(t). Mis Sa soovid nendega ette võtta?" + text_issue_category_destroy_assignments: "Jäta teemadel kategooria määramata" + text_issue_category_reassign_to: "Määra teemad teise kategooriasse" + text_user_mail_option: "Valimata projektidest saad teavitusi ainult jälgitavate või Sinuga seotud asjade kohta (nt. Sinu loodud või teha teemad)." + text_no_configuration_data: "Rollid, valdkonnad, olekud ja töövood ei ole veel seadistatud.\nVäga soovitav on laadida vaikeasetused. Peale laadimist saad neid ise muuta." + text_load_default_configuration: "Lae vaikeasetused" + text_status_changed_by_changeset: "Kehtestatakse muudatuses %{value}." + text_time_logged_by_changeset: "Kehtestatakse muudatuses %{value}." + text_issues_destroy_confirmation: "Oled Sa kindel oma soovis valitud teema(d) kustutada?" + text_issues_destroy_descendants_confirmation: "See kustutab samuti %{count} alamteemat." + text_time_entries_destroy_confirmation: "Oled Sa kindel oma soovis valitud ajakulu kanne/kanded kustutada?" + text_select_project_modules: "Projektis kasutatavad moodulid" + text_default_administrator_account_changed: "Algne administraatori konto on muudetud" + text_file_repository_writable: "Manuste kataloog on kirjutatav" + text_plugin_assets_writable: "Lisamoodulite abifailide kataloog on kirjutatav" + text_rmagick_available: "RMagick on kasutatav (ei ole kohustuslik)" + text_destroy_time_entries_question: "Kustutatavatele teemadele oli kirja pandud %{hours} tundi. Mis Sa soovid ette võtta?" + text_destroy_time_entries: "Kustuta need tunnid" + text_assign_time_entries_to_project: "Vii tunnid üle teise projekti" + text_reassign_time_entries: "Määra tunnid sellele teemale:" + text_user_wrote: "%{value} kirjutas:" + text_enumeration_destroy_question: "Selle väärtusega on seotud %{count} objekt(i)." + text_enumeration_category_reassign_to: "Seo nad teise väärtuse külge:" + text_email_delivery_not_configured: "E-kirjade saatmine ei ole seadistatud ja teavitusi ei saadeta.\nKonfigureeri oma SMTP server failis config/configuration.yml ja taaskäivita Redmine." + text_repository_usernames_mapping: "Seosta Redmine kasutaja hoidlasse sissekannete tegijaga.\nSama nime või e-postiga kasutajad seostatakse automaatselt." + text_diff_truncated: "... Osa erinevusi jäi välja, sest neid on näitamiseks liiga palju." + text_custom_field_possible_values_info: "Üks rida iga väärtuse jaoks" + text_wiki_page_destroy_question: "Sel lehel on %{descendants} järglasleht(e) ja järeltulija(t). Mis Sa soovid ette võtta?" + text_wiki_page_nullify_children: "Muuda järglaslehed uuteks juurlehtedeks" + text_wiki_page_destroy_children: "Kustuta järglaslehed ja kõik nende järglased" + text_wiki_page_reassign_children: "Määra järglaslehed teise lehe külge" + text_own_membership_delete_confirmation: "Sa võtad endalt ära osa või kõik õigused ega saa edaspidi seda projekti võib-olla enam muuta.\nOled Sa jätkamises kindel?" + text_zoom_in: "Vaata lähemalt" + text_zoom_out: "Vaata kaugemalt" + text_warn_on_leaving_unsaved: "Sel lehel on salvestamata teksti, mis läheb kaduma, kui siit lehelt lahkud." + text_scm_path_encoding_note: "Vaikimisi UTF-8" + text_git_repository_note: "Hoidla peab olema paljas (bare) ja kohalik (nt. /gitrepo, c:\\gitrepo)" + text_mercurial_repository_note: "Hoidla peab olema kohalik (nt. /hgrepo, c:\\hgrepo)" + text_scm_command: "Hoidla poole pöördumise käsk" + text_scm_command_version: "Versioon" + text_scm_config: "Hoidlate poole pöördumist saab konfigureerida failis config/configuration.yml. Peale selle muutmist taaskäivita Redmine." + text_scm_command_not_available: "Hoidla poole pöördumine ebaõnnestus. Palun kontrolli seadistusi." + text_issue_conflict_resolution_overwrite: "Kehtesta oma muudatused (kõik märkused jäävad, ent muu võidakse üle kirjutada)" + text_issue_conflict_resolution_add_notes: "Lisa oma märkused, aga loobu teistest muudatustest" + text_issue_conflict_resolution_cancel: "Loobu kõigist muudatustest ja lae %{link} uuesti" + text_account_destroy_confirmation: "Oled Sa kindel?\nSu konto kustutatakse jäädavalt ja seda pole võimalik taastada." + + default_role_manager: "Haldaja" + default_role_developer: "Arendaja" + default_role_reporter: "Edastaja" + default_tracker_bug: "Veaparandus" + default_tracker_feature: "Täiendus" + default_tracker_support: "Klienditugi" + default_issue_status_new: "Avatud" + default_issue_status_in_progress: "Töös" + default_issue_status_resolved: "Lahendatud" + default_issue_status_feedback: "Tagasiside" + default_issue_status_closed: "Suletud" + default_issue_status_rejected: "Tagasi lükatud" + default_doc_category_user: "Juhend lõppkasutajale" + default_doc_category_tech: "Tehniline dokumentatsioon" + default_priority_low: "Aega on" + default_priority_normal: "Tavaline" + default_priority_high: "Pakiline" + default_priority_urgent: "Täna vaja" + default_priority_immediate: "Kohe vaja" + default_activity_design: "Kavandamine" + default_activity_development: "Arendamine" + + enumeration_issue_priorities: "Teemade prioriteedid" + enumeration_doc_categories: "Dokumentide kategooriad" + enumeration_activities: "Tegevused (ajakulu)" + enumeration_system_activity: "Süsteemi aktiivsus" + description_filter: "Filter" + description_search: "Otsinguväli" + description_choose_project: "Projektid" + description_project_scope: "Otsingu ulatus" + description_notes: "Märkused" + description_message_content: "Postituse sisu" + description_query_sort_criteria_attribute: "Sorteerimise kriteerium" + description_query_sort_criteria_direction: "Sorteerimise suund" + description_user_mail_notification: "E-kirjaga teavitamise seaded" + description_available_columns: "Kasutatavad veerud" + description_selected_columns: "Valitud veerud" + description_all_columns: "Kõik veerud" + description_issue_category_reassign: "Vali uus kategooria" + description_wiki_subpages_reassign: "Vali lehele uus vanem" + error_session_expired: "Sinu sessioon on aegunud. Palun logi uuesti sisse" + text_session_expiration_settings: "Hoiatus! Nende sätete muutmine võib kehtivad sessioonid lõpetada. Ka sinu enda oma!" + setting_session_lifetime: "Sessiooni eluiga" + setting_session_timeout: "Sessiooni aegumine jõudeoleku tõttu" + label_session_expiration: "Sessiooni aegumine" + permission_close_project: "Sule projekt/ava projekt uuesti" + label_show_closed_projects: "Näita ka suletud projekte" + button_close: "Sulge" + button_reopen: "Ava uuesti" + project_status_active: "Aktiivne" + project_status_closed: "Suletud" + project_status_archived: "Arhiveeritud" + text_project_closed: "See projekt on suletud ja projekti muuta ei saa" + notice_user_successful_create: "Kasutaja %{id} loodud." + field_core_fields: "Standardväljad" + field_timeout: "Aegumine (sekundites)" + setting_thumbnails_enabled: "Näita manustest väikest pilti" + setting_thumbnails_size: "Väikese pildi suurus (pikslites)" + label_status_transitions: "Staatuse muutumine" + label_fields_permissions: "Väljade õigused" + label_readonly: "Muuta ei saa" + label_required: "Kohtustuslik" + text_repository_identifier_info: "Lubatud on ainult väikesed tähed (a-z), numbrid ja kriipsud.
    Peale salvestamist ei saa tunnust enam muuta." + field_board_parent: "Ülemfoorum" + label_attribute_of_project: "Projekti nimi: %{name}" + label_attribute_of_author: "Autori nimi: %{name}" + label_attribute_of_assigned_to: "Tegeleja nimi: %{name}" + label_attribute_of_fixed_version: "Sihtversiooni nimi: %{name}" + label_copy_subtasks: "Kopeeri alamülesanded" + label_copied_to: "Kopeeritud siia: " + label_copied_from: "Kopeeritud kohast:" + label_any_issues_in_project: "Kõik projekti teemad" + label_any_issues_not_in_project: "Kõik teemad, mis pole projektis" + field_private_notes: "Privaatsed märkmed" + permission_view_private_notes: "Vaata privaatseid märkmeid" + permission_set_notes_private: "Õigus märkmeid privaatseks teha" + label_no_issues_in_project: "Projektis pole teemasid" + label_any: "kõik" + label_last_n_weeks: "viimased %{count} nädalat" + setting_cross_project_subtasks: "Luba projektide vahelisi alamülesandeid" + label_cross_project_descendants: "alamprojektidega" + label_cross_project_tree: "projektipuuga" + label_cross_project_hierarchy: "projektihierarhiaga" + label_cross_project_system: "kõigi projektidega" + button_hide: "Peida" + setting_non_working_week_days: "Puhkepäevad" + label_in_the_next_days: "järgmisel päeval" + label_in_the_past_days: "eelmisel päeval" + label_attribute_of_user: "Kasutaja nimi: %{name}" + text_turning_multiple_off: "Kui sa keelad mitme väärtuse võimaluse, siis need eemaldatakse nii, et jääb ainult üks väärtus asja kohta." + label_attribute_of_issue: "Teema %{name}" + permission_add_documents: "Lisa dokumente" + permission_edit_documents: "Muuda dokumente" + permission_delete_documents: "Kustuta dokumente" + label_gantt_progress_line: "Progressi graafik" + setting_jsonp_enabled: "JSONP tugi sees" + field_inherit_members: "Päri liikmed" + field_closed_on: "Suletud kuupäeval" + field_generate_password: "Loo parool" + setting_default_projects_tracker_ids: "Uute projektide vaikimisi jälgijad" + label_total_time: "Kokku" + notice_account_not_activated_yet: "Sa pole veel oma kontot aktiveerinud. Kui sa soovid saada uut aktiveerimise e-posti, siis vajuta siia." + notice_account_locked: "Sinu konto on lukus" + label_hidden: "Peidetud" + label_visibility_private: "ainult minule" + label_visibility_roles: "ainult neile rollidele" + label_visibility_public: "kõigile kasutajatele" + field_must_change_passwd: "Peab parooli järgmisel sisselogimisel ära muutma" + notice_new_password_must_be_different: "Uus parool peab olema eelmisest erinev" + setting_mail_handler_excluded_filenames: "Välista manuseid nime kaudu" + text_convert_available: "ImageMagick teisendaja on saadaval (pole kohustuslik)" + label_link: "Viit" + label_only: "ainult" + label_drop_down_list: "hüpikmenüü" + label_checkboxes: "märkeruudud" + label_link_values_to: "Lingi väärtused URLiga" + setting_force_default_language_for_anonymous: "Anonüümsed kasutajad on vaikimisi keelega" + setting_force_default_language_for_loggedin: "Sisse logitud kasutajad on vaikimisi keelega" + label_custom_field_select_type: "Vali objekti tüüp, millele omaloodud väli külge pannakse" + label_issue_assigned_to_updated: "Tegeleja uuendatud" + label_check_for_updates: "Vaata uuendusi" + label_latest_compatible_version: "Värskeim ühilduv versioon" + label_unknown_plugin: "Tundmatu plugin" + label_radio_buttons: "raadionupud" + label_group_anonymous: "Anonüümsed kasutajad" + label_group_non_member: "Rühmata kasutajad" + label_add_projects: "Lisa projekte" + field_default_status: "Vaikimisi staatus" + text_subversion_repository_note: 'Näited: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: "Kasutajate nähtavus" + label_users_visibility_all: "Kõik aktiivsed kasutajad" + label_users_visibility_members_of_visible_projects: "Nähtavate projektide liikmed" + label_edit_attachments: "Muuda lisatud faile" + setting_link_copied_issue: "Kopeerimisel lingi teemad" + label_link_copied_issue: "Lingi kopeeritud teema" + label_ask: "Küsi" + label_search_attachments_yes: "Otsi manuste nimedest ja kirjeldustest" + label_search_attachments_no: "Ära manustest otsi" + label_search_attachments_only: "Otsi ainult manustest" + label_search_open_issues_only: "Otsi ainult avatud teemadest" + field_address: "E-post" + setting_max_additional_emails: "Lisa e-posti aadresside suurim kogus" + label_email_address_plural: "E-posti aadressid" + label_email_address_add: "Lisa e-posti aadress" + label_enable_notifications: "Saada teavitusi" + label_disable_notifications: "Ära saada teavitusi" + setting_search_results_per_page: "Otsitulemusi lehe kohta" + label_blank_value: "tühi" + permission_copy_issues: "Kopeeri teemad" + error_password_expired: "Su parool on aegunud või administraator nõuab sult selle vahetamist" + field_time_entries_visibility: "Ajakannete nähtavus" + setting_password_max_age: "Parooli kehtivus" + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: "Tuletatud alateemadest" + label_parent_task_attributes_independent: "Sõltumatu alateemadest" + label_time_entries_visibility_all: "Kõik ajakanded" + label_time_entries_visibility_own: "Kasutaja poolt loodud ajakanded" + label_member_management: "Liikmete haldus" + label_member_management_all_roles: "Kõik rollid" + label_member_management_selected_roles_only: "Ainult need rollid" + label_password_required: "Jätkamiseks kinnita oma parool" + label_total_spent_time: "Kokku kulutatud aeg" + notice_import_finished: "%{count} rida imporditud" + notice_import_finished_with_errors: "%{count} rida %{total}st ei õnnestunud importida" + error_invalid_file_encoding: "See fail ei ole õige %{encoding} kodeeringuga" + error_invalid_csv_file_or_settings: "See fail kas ei ole CSV formaadis või ei klapi allolevate sätetega" + error_can_not_read_import_file: "Importfaili sisselugemisel ilmnes viga" + permission_import_issues: "Impordi teemasid" + label_import_issues: "Impordi teemad" + label_select_file_to_import: "Vali fail mida importida" + label_fields_separator: "Väljade eristaja" + label_fields_wrapper: "Väljade wrapper" + label_encoding: "Kodeering" + label_comma_char: "Koma" + label_semi_colon_char: "Semikoolon" + label_quote_char: "Ülakoma" + label_double_quote_char: "Jutumärgid" + label_fields_mapping: "Väljade mäppimine" + label_file_content_preview: "Sisu eelvaade" + label_create_missing_values: "Loo puuduolevad väärtused" + button_import: "Import" + field_total_estimated_hours: "Ennustatud aja summa" + label_api: "API" + label_total_plural: "Summad" + label_assigned_issues: "Määratud väärtused" + label_field_format_enumeration: "Võtme/väärtuse nimekiri" + label_f_hour_short: "%{value} h" + field_default_version: "Vaikimisi versioon" + error_attachment_extension_not_allowed: "Manuse laiend %{extension} on keelatud" + setting_attachment_extensions_allowed: "Lubatud manuse laiendid" + setting_attachment_extensions_denied: "Keelatud manuse laiendid" + label_any_open_issues: "Kõik avatud teemad" + label_no_open_issues: "Mitte ühtki avatud teemat" + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: "Veebiteenuse API võti" + setting_lost_password: "Kui parool on ununud..." + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/eu.yml b/config/locales/eu.yml new file mode 100644 index 0000000..8127a32 --- /dev/null +++ b/config/locales/eu.yml @@ -0,0 +1,1231 @@ +# Redmine EU language +# Author: Ales Zabala Alava (Shagi), +# 2010-01-25 +# Distributed under the same terms as the Redmine itself. +eu: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%b %d" + long: "%Y %B %d" + + day_names: [Igandea, Astelehena, Asteartea, Asteazkena, Osteguna, Ostirala, Larunbata] + abbr_day_names: [Ig., Al., Ar., Az., Og., Or., La.] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Urtarrila, Otsaila, Martxoa, Apirila, Maiatza, Ekaina, Uztaila, Abuztua, Iraila, Urria, Azaroa, Abendua] + abbr_month_names: [~, Urt, Ots, Mar, Api, Mai, Eka, Uzt, Abu, Ira, Urr, Aza, Abe] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d %H:%M" + time: "%H:%M" + short: "%b %d %H:%M" + long: "%Y %B %d %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "minutu erdi" + less_than_x_seconds: + one: "segundu bat baino gutxiago" + other: "%{count} segundu baino gutxiago" + x_seconds: + one: "segundu 1" + other: "%{count} segundu" + less_than_x_minutes: + one: "minutu bat baino gutxiago" + other: "%{count} minutu baino gutxiago" + x_minutes: + one: "minutu 1" + other: "%{count} minutu" + about_x_hours: + one: "ordu 1 inguru" + other: "%{count} ordu inguru" + x_hours: + one: "ordu 1" + other: "%{count} ordu" + x_days: + one: "egun 1" + other: "%{count} egun" + about_x_months: + one: "hilabete 1 inguru" + other: "%{count} hilabete inguru" + x_months: + one: "hilabete 1" + other: "%{count} hilabete" + about_x_years: + one: "urte 1 inguru" + other: "%{count} urte inguru" + over_x_years: + one: "urte 1 baino gehiago" + other: "%{count} urte baino gehiago" + almost_x_years: + one: "ia urte 1" + other: "ia %{count} urte" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Byte" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "eta" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "Errore batek %{model} hau godetzea galarazi du." + other: "%{count} errorek %{model} hau gordetzea galarazi dute." + messages: + inclusion: "ez dago zerrendan" + exclusion: "erreserbatuta dago" + invalid: "baliogabea da" + confirmation: "ez du berrespenarekin bat egiten" + accepted: "onartu behar da" + empty: "ezin da hutsik egon" + blank: "ezin da hutsik egon" + too_long: "luzeegia da (maximoa %{count} karaktere dira)" + too_short: "laburregia da (minimoa %{count} karaktere dira)" + wrong_length: "luzera ezegokia da (%{count} karakter izan beharko litzake)" + taken: "dagoeneko hartuta dago" + not_a_number: "ez da zenbaki bat" + not_a_date: "ez da baliozko data" + greater_than: "%{count} baino handiagoa izan behar du" + greater_than_or_equal_to: "%{count} edo handiagoa izan behar du" + equal_to: "%{count} izan behar du" + less_than: "%{count} baino gutxiago izan behar du" + less_than_or_equal_to: "%{count} edo gutxiago izan behar du" + odd: "bakoitia izan behar du" + even: "bikoitia izan behar du" + greater_than_start_date: "hasiera data baino handiagoa izan behar du" + not_same_project: "ez dago proiektu berdinean" + circular_dependency: "Erlazio honek mendekotasun zirkular bat sortuko luke" + cant_link_an_issue_with_a_descendant: "Zeregin bat ezin da bere azpiataza batekin estekatu." + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Hautatu mesedez + + general_text_No: 'Ez' + general_text_Yes: 'Bai' + general_text_no: 'ez' + general_text_yes: 'bai' + general_lang_name: 'Basque (Euskara)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Kontua ongi eguneratu da. + notice_account_invalid_credentials: Erabiltzaile edo pasahitz ezegokia + notice_account_password_updated: Pasahitza ongi eguneratu da. + notice_account_wrong_password: Pasahitz ezegokia. + notice_account_register_done: Kontua ongi sortu da. Kontua gaitzeko klikatu epostan adierazi zaizun estekan. + notice_account_unknown_email: Erabiltzaile ezezaguna. + notice_can_t_change_password: Kontu honek kanpoko autentikazio bat erabiltzen du. Ezinezkoa da pasahitza aldatzea. + notice_account_lost_email_sent: Pasahitz berria aukeratzeko jarraibideak dituen eposta bat bidali zaizu. + notice_account_activated: Zure kontua gaituta dago. Orain saioa has dezakezu + notice_successful_create: Sortze arrakastatsua. + notice_successful_update: Eguneratze arrakastatsua. + notice_successful_delete: Ezabaketa arrakastatsua. + notice_successful_connection: Konexio arrakastatsua. + notice_file_not_found: Atzitu nahi duzun orria ez da exisitzen edo ezabatua izan da. + notice_locking_conflict: Beste erabiltzaile batek datuak eguneratu ditu. + notice_not_authorized: Ez duzu orri hau atzitzeko baimenik. + notice_email_sent: "%{value} helbidera eposta bat bidali da" + notice_email_error: "Errorea eposta bidaltzean (%{value})" + notice_feeds_access_key_reseted: Zure Atom atzipen giltza berrezarri da. + notice_api_access_key_reseted: Zure API atzipen giltza berrezarri da. + notice_failed_to_save_issues: "Hautatutako %{total} zereginetatik %{count} ezin izan dira konpondu: %{ids}." + notice_no_issue_selected: "Ez da zereginik hautatu! Mesedez, editatu nahi dituzun arazoak markatu." + notice_account_pending: "Zure kontua sortu da, orain kudeatzailearen onarpenaren zain dago." + notice_default_data_loaded: Lehenetsitako konfigurazioa ongi kargatu da. + notice_unable_delete_version: Ezin da bertsioa ezabatu. + notice_issue_done_ratios_updated: Burututako zereginen erlazioa eguneratu da. + + error_can_t_load_default_data: "Ezin izan da lehenetsitako konfigurazioa kargatu: %{value}" + error_scm_not_found: "Sarrera edo berrikuspena ez da biltegian topatu." + error_scm_command_failed: "Errorea gertatu da biltegia atzitzean: %{value}" + error_scm_annotate: "Sarrera ez da existitzen edo ezin da anotatu." + error_issue_not_found_in_project: 'Zeregina ez da topatu edo ez da proiektu honetakoa' + error_no_tracker_in_project: 'Proiektu honek ez du aztarnaririk esleituta. Mesedez egiaztatu Proiektuaren ezarpenak.' + error_no_default_issue_status: 'Zereginek ez dute lehenetsitako egoerarik. Mesedez egiaztatu zure konfigurazioa ("Kudeaketa -> Arazoen egoerak" atalera joan).' + error_can_not_reopen_issue_on_closed_version: 'Itxitako bertsio batera esleitutako zereginak ezin dira berrireki' + error_can_not_archive_project: Proiektu hau ezin da artxibatu + error_issue_done_ratios_not_updated: "Burututako zereginen erlazioa ez da eguneratu." + error_workflow_copy_source: 'Mesedez hautatu iturburuko aztarnari edo rola' + error_workflow_copy_target: 'Mesedez hautatu helburuko aztarnari(ak) edo rola(k)' + + warning_attachments_not_saved: "%{count} fitxategi ezin izan d(ir)a gorde." + + mail_subject_lost_password: "Zure %{value} pasahitza" + mail_body_lost_password: 'Zure pasahitza aldatzeko hurrengo estekan klikatu:' + mail_subject_register: "Zure %{value} kontuaren gaitzea" + mail_body_register: 'Zure kontua gaitzeko hurrengo estekan klikatu:' + mail_body_account_information_external: "Zure %{value} kontua erabil dezakezu saioa hasteko." + mail_body_account_information: Zure kontuaren informazioa + mail_subject_account_activation_request: "%{value} kontu gaitzeko eskaera" + mail_body_account_activation_request: "Erabiltzaile berri bat (%{value}) erregistratu da. Kontua zure onarpenaren zain dago:" + mail_subject_reminder: "%{count} arazo hurrengo %{days} egunetan amaitzen d(ir)a" + mail_body_reminder: "Zuri esleituta dauden %{count} arazo hurrengo %{days} egunetan amaitzen d(ir)a:" + mail_subject_wiki_content_added: "'%{id}' wiki orria gehitu da" + mail_body_wiki_content_added: "%{author}-(e)k '%{id}' wiki orria gehitu du." + mail_subject_wiki_content_updated: "'%{id}' wiki orria eguneratu da" + mail_body_wiki_content_updated: "%{author}-(e)k '%{id}' wiki orria eguneratu du." + + + field_name: Izena + field_description: Deskribapena + field_summary: Laburpena + field_is_required: Beharrezkoa + field_firstname: Izena + field_lastname: Abizenak + field_mail: Eposta + field_filename: Fitxategia + field_filesize: Tamaina + field_downloads: Deskargak + field_author: Egilea + field_created_on: Sortuta + field_updated_on: Eguneratuta + field_field_format: Formatua + field_is_for_all: Proiektu guztietarako + field_possible_values: Balio posibleak + field_regexp: Expresio erregularra + field_min_length: Luzera minimoa + field_max_length: Luzera maxioma + field_value: Balioa + field_category: Kategoria + field_title: Izenburua + field_project: Proiektua + field_issue: Zeregina + field_status: Egoera + field_notes: Oharrak + field_is_closed: Itxitako arazoa + field_is_default: Lehenetsitako balioa + field_tracker: Aztarnaria + field_subject: Gaia + field_due_date: Amaiera data + field_assigned_to: Esleituta + field_priority: Lehentasuna + field_fixed_version: Helburuko bertsioa + field_user: Erabiltzilea + field_role: Rola + field_homepage: Orri nagusia + field_is_public: Publikoa + field_parent: "Honen azpiproiektua:" + field_is_in_roadmap: Arazoak ibilbide-mapan erakutsi + field_login: Erabiltzaile izena + field_mail_notification: Eposta jakinarazpenak + field_admin: Kudeatzailea + field_last_login_on: Azken konexioa + field_language: Hizkuntza + field_effective_date: Data + field_password: Pasahitza + field_new_password: Pasahitz berria + field_password_confirmation: Berrespena + field_version: Bertsioa + field_type: Mota + field_host: Ostalaria + field_port: Portua + field_account: Kontua + field_base_dn: Base DN + field_attr_login: Erabiltzaile atributua + field_attr_firstname: Izena atributua + field_attr_lastname: Abizenak atributua + field_attr_mail: Eposta atributua + field_onthefly: Zuzeneko erabiltzaile sorrera + field_start_date: Hasiera + field_done_ratio: Egindako % + field_auth_source: Autentikazio modua + field_hide_mail: Nire eposta helbidea ezkutatu + field_comments: Iruzkina + field_url: URL + field_start_page: Hasierako orria + field_subproject: Azpiproiektua + field_hours: Ordu + field_activity: Jarduera + field_spent_on: Data + field_identifier: Identifikatzailea + field_is_filter: Iragazki moduan erabilita + field_issue_to: Erlazionatutako zereginak + field_delay: Atzerapena + field_assignable: Arazoak rol honetara esleitu daitezke + field_redirect_existing_links: Existitzen diren estekak berbideratu + field_estimated_hours: Estimatutako denbora + field_column_names: Zutabeak + field_time_zone: Ordu zonaldea + field_searchable: Bilagarria + field_default_value: Lehenetsitako balioa + field_comments_sorting: Iruzkinak erakutsi + field_parent_title: Orri gurasoa + field_editable: Editagarria + field_watcher: Behatzailea + field_identity_url: OpenID URLa + field_content: Edukia + field_group_by: Emaitzak honegatik taldekatu + field_sharing: Partekatzea + + setting_app_title: Aplikazioaren izenburua + setting_app_subtitle: Aplikazioaren azpizenburua + setting_welcome_text: Ongietorriko testua + setting_default_language: Lehenetsitako hizkuntza + setting_login_required: Autentikazioa derrigorrezkoa + setting_self_registration: Norberak erregistratu + setting_attachment_max_size: Eranskinen tamaina max. + setting_issues_export_limit: Zereginen esportatze limitea + setting_mail_from: Igorlearen eposta helbidea + setting_bcc_recipients: Hartzaileak ezkutuko kopian (bcc) + setting_plain_text_mail: Testu soileko epostak (HTML-rik ez) + setting_host_name: Ostalari izena eta bidea + setting_text_formatting: Testu formatua + setting_wiki_compression: Wikiaren historia konprimitu + setting_feeds_limit: Jarioaren edukiera limitea + setting_default_projects_public: Proiektu berriak defektuz publikoak dira + setting_autofetch_changesets: Commit-ak automatikoki hartu + setting_sys_api_enabled: Biltegien kudeaketarako WS gaitu + setting_commit_ref_keywords: Erreferentzien gako-hitzak + setting_commit_fix_keywords: Konpontze gako-hitzak + setting_autologin: Saioa automatikoki hasi + setting_date_format: Data formatua + setting_time_format: Ordu formatua + setting_cross_project_issue_relations: Zereginak proiektuen artean erlazionatzea baimendu + setting_issue_list_default_columns: Zereginen zerrendan defektuz ikusten diren zutabeak + setting_emails_footer: Eposten oina + setting_protocol: Protokoloa + setting_per_page_options: Orriko objektuen aukerak + setting_user_format: Erabiltzaileak erakusteko formatua + setting_activity_days_default: Proiektuen jardueran erakusteko egunak + setting_display_subprojects_issues: Azpiproiektuen zereginak proiektu nagusian erakutsi defektuz + setting_enabled_scm: Gaitutako IKKak + setting_mail_handler_body_delimiters: "Lerro hauteko baten ondoren epostak moztu" + setting_mail_handler_api_enabled: Sarrerako epostentzako WS gaitu + setting_mail_handler_api_key: API giltza + setting_sequential_project_identifiers: Proiektuen identifikadore sekuentzialak sortu + setting_gravatar_enabled: Erabili Gravatar erabiltzaile ikonoak + setting_gravatar_default: Lehenetsitako Gravatar irudia + setting_diff_max_lines_displayed: Erakutsiko diren diff lerro kopuru maximoa + setting_file_max_size_displayed: Barnean erakuzten diren testu fitxategien tamaina maximoa + setting_repository_log_display_limit: Egunkari fitxategian erakutsiko diren berrikuspen kopuru maximoa. + setting_openid: Baimendu OpenID saio hasiera eta erregistatzea + setting_password_min_length: Pasahitzen luzera minimoa + setting_new_project_user_role_id: Proiektu berriak sortzerakoan kudeatzaile ez diren erabiltzaileei esleitutako rola + setting_default_projects_modules: Proiektu berrientzako defektuz gaitutako moduluak + setting_issue_done_ratio: "Zereginen burututako tasa kalkulatzean erabili:" + setting_issue_done_ratio_issue_field: Zeregin eremua erabili + setting_issue_done_ratio_issue_status: Zeregin egoera erabili + setting_start_of_week: "Egutegiak noiz hasi:" + setting_rest_api_enabled: Gaitu REST web zerbitzua + + permission_add_project: Proiektua sortu + permission_add_subprojects: Azpiproiektuak sortu + permission_edit_project: Proiektua editatu + permission_select_project_modules: Proiektuaren moduluak hautatu + permission_manage_members: Kideak kudeatu + permission_manage_versions: Bertsioak kudeatu + permission_manage_categories: Arazoen kategoriak kudeatu + permission_view_issues: Zereginak ikusi + permission_add_issues: Zereginak gehitu + permission_edit_issues: Zereginak aldatu + permission_manage_issue_relations: Zereginen erlazioak kudeatu + permission_add_issue_notes: Oharrak gehitu + permission_edit_issue_notes: Oharrak aldatu + permission_edit_own_issue_notes: Nork bere oharrak aldatu + permission_move_issues: Zereginak mugitu + permission_delete_issues: Zereginak ezabatu + permission_manage_public_queries: Galdera publikoak kudeatu + permission_save_queries: Galderak gorde + permission_view_gantt: Gantt grafikoa ikusi + permission_view_calendar: Egutegia ikusi + permission_view_issue_watchers: Behatzaileen zerrenda ikusi + permission_add_issue_watchers: Behatzaileak gehitu + permission_delete_issue_watchers: Behatzaileak ezabatu + permission_log_time: Igarotako denbora erregistratu + permission_view_time_entries: Igarotako denbora ikusi + permission_edit_time_entries: Denbora egunkariak editatu + permission_edit_own_time_entries: Nork bere denbora egunkariak editatu + permission_manage_news: Berriak kudeatu + permission_comment_news: Berrien iruzkinak egin + permission_view_documents: Dokumentuak ikusi + permission_manage_files: Fitxategiak kudeatu + permission_view_files: Fitxategiak ikusi + permission_manage_wiki: Wikia kudeatu + permission_rename_wiki_pages: Wiki orriak berrizendatu + permission_delete_wiki_pages: Wiki orriak ezabatu + permission_view_wiki_pages: Wikia ikusi + permission_view_wiki_edits: Wikiaren historia ikusi + permission_edit_wiki_pages: Wiki orriak editatu + permission_delete_wiki_pages_attachments: Eranskinak ezabatu + permission_protect_wiki_pages: Wiki orriak babestu + permission_manage_repository: Biltegiak kudeatu + permission_browse_repository: Biltegia arakatu + permission_view_changesets: Aldaketak ikusi + permission_commit_access: Commit atzipena + permission_manage_boards: Foroak kudeatu + permission_view_messages: Mezuak ikusi + permission_add_messages: Mezuak bidali + permission_edit_messages: Mezuak aldatu + permission_edit_own_messages: Nork bere mezuak aldatu + permission_delete_messages: Mezuak ezabatu + permission_delete_own_messages: Nork bere mezuak ezabatu + + project_module_issue_tracking: Zereginen jarraipena + project_module_time_tracking: Denbora jarraipena + project_module_news: Berriak + project_module_documents: Dokumentuak + project_module_files: Fitxategiak + project_module_wiki: Wiki + project_module_repository: Biltegia + project_module_boards: Foroak + + label_user: Erabiltzailea + label_user_plural: Erabiltzaileak + label_user_new: Erabiltzaile berria + label_user_anonymous: Ezezaguna + label_project: Proiektua + label_project_new: Proiektu berria + label_project_plural: Proiektuak + label_x_projects: + zero: proiekturik ez + one: proiektu bat + other: "%{count} proiektu" + label_project_all: Proiektu guztiak + label_project_latest: Azken proiektuak + label_issue: Zeregina + label_issue_new: Zeregin berria + label_issue_plural: Zereginak + label_issue_view_all: Zeregin guztiak ikusi + label_issues_by: "Zereginak honengatik: %{value}" + label_issue_added: Zeregina gehituta + label_issue_updated: Zeregina eguneratuta + label_document: Dokumentua + label_document_new: Dokumentu berria + label_document_plural: Dokumentuak + label_document_added: Dokumentua gehituta + label_role: Rola + label_role_plural: Rolak + label_role_new: Rol berria + label_role_and_permissions: Rolak eta baimenak + label_member: Kidea + label_member_new: Kide berria + label_member_plural: Kideak + label_tracker: Aztarnaria + label_tracker_plural: Aztarnariak + label_tracker_new: Aztarnari berria + label_workflow: Lan-fluxua + label_issue_status: Zeregin egoera + label_issue_status_plural: Zeregin egoerak + label_issue_status_new: Egoera berria + label_issue_category: Zeregin kategoria + label_issue_category_plural: Zeregin kategoriak + label_issue_category_new: Kategoria berria + label_custom_field: Eremu pertsonalizatua + label_custom_field_plural: Eremu pertsonalizatuak + label_custom_field_new: Eremu pertsonalizatu berria + label_enumerations: Enumerazioak + label_enumeration_new: Balio berria + label_information: Informazioa + label_information_plural: Informazioa + label_please_login: Saioa hasi mesedez + label_register: Erregistratu + label_login_with_open_id_option: edo OpenID-rekin saioa hasi + label_password_lost: Pasahitza galduta + label_home: Hasiera + label_my_page: Nire orria + label_my_account: Nire kontua + label_my_projects: Nire proiektuak + label_administration: Kudeaketa + label_login: Saioa hasi + label_logout: Saioa bukatu + label_help: Laguntza + label_reported_issues: Berri emandako zereginak + label_assigned_to_me_issues: Niri esleitutako arazoak + label_last_login: Azken konexioa + label_registered_on: Noiz erregistratuta + label_activity: Jarduerak + label_overall_activity: Jarduera guztiak + label_user_activity: "%{value}-(r)en jarduerak" + label_new: Berria + label_logged_as: "Sartutako erabiltzailea:" + label_environment: Ingurune + label_authentication: Autentikazioa + label_auth_source: Autentikazio modua + label_auth_source_new: Autentikazio modu berria + label_auth_source_plural: Autentikazio moduak + label_subproject_plural: Azpiproiektuak + label_subproject_new: Azpiproiektu berria + label_and_its_subprojects: "%{value} eta bere azpiproiektuak" + label_min_max_length: Luzera min - max + label_list: Zerrenda + label_date: Data + label_integer: Osokoa + label_float: Koma higikorrekoa + label_boolean: Boolearra + label_string: Testua + label_text: Testu luzea + label_attribute: Atributua + label_attribute_plural: Atributuak + label_no_data: Ez dago erakusteko daturik + label_change_status: Egoera aldatu + label_history: Historikoa + label_attachment: Fitxategia + label_attachment_new: Fitxategi berria + label_attachment_delete: Fitxategia ezabatu + label_attachment_plural: Fitxategiak + label_file_added: Fitxategia gehituta + label_report: Berri ematea + label_report_plural: Berri emateak + label_news: Berria + label_news_new: Berria gehitu + label_news_plural: Berriak + label_news_latest: Azken berriak + label_news_view_all: Berri guztiak ikusi + label_news_added: Berria gehituta + label_settings: Ezarpenak + label_overview: Gainbegirada + label_version: Bertsioa + label_version_new: Bertsio berria + label_version_plural: Bertsioak + label_close_versions: Burututako bertsioak itxi + label_confirmation: Baieztapena + label_export_to: 'Eskuragarri baita:' + label_read: Irakurri... + label_public_projects: Proiektu publikoak + label_open_issues: irekita + label_open_issues_plural: irekiak + label_closed_issues: itxita + label_closed_issues_plural: itxiak + label_x_open_issues_abbr: + zero: 0 irekita + one: 1 irekita + other: "%{count} irekiak" + label_x_closed_issues_abbr: + zero: 0 itxita + one: 1 itxita + other: "%{count} itxiak" + label_total: Guztira + label_permissions: Baimenak + label_current_status: Uneko egoera + label_new_statuses_allowed: Baimendutako egoera berriak + label_all: guztiak + label_none: ezer + label_nobody: inor + label_next: Hurrengoa + label_previous: Aurrekoak + label_used_by: Erabilita + label_details: Xehetasunak + label_add_note: Oharra gehitu + label_calendar: Egutegia + label_months_from: hilabete noiztik + label_gantt: Gantt + label_internal: Barnekoa + label_last_changes: "azken %{count} aldaketak" + label_change_view_all: Aldaketa guztiak ikusi + label_comment: Iruzkin + label_comment_plural: Iruzkinak + label_x_comments: + zero: iruzkinik ez + one: iruzkin 1 + other: "%{count} iruzkin" + label_comment_add: Iruzkina gehitu + label_comment_added: Iruzkina gehituta + label_comment_delete: Iruzkinak ezabatu + label_query: Galdera pertsonalizatua + label_query_plural: Pertsonalizatutako galderak + label_query_new: Galdera berria + label_filter_add: Iragazkia gehitu + label_filter_plural: Iragazkiak + label_equals: da + label_not_equals: ez da + label_in_less_than: baino gutxiagotan + label_in_more_than: baino gehiagotan + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: hauetan + label_today: gaur + label_all_time: denbora guztia + label_yesterday: atzo + label_this_week: aste honetan + label_last_week: pasadan astean + label_last_n_days: "azken %{count} egunetan" + label_this_month: hilabete hau + label_last_month: pasadan hilabetea + label_this_year: urte hau + label_date_range: Data tartea + label_less_than_ago: egun hauek baino gutxiago + label_more_than_ago: egun hauek baino gehiago + label_ago: orain dela + label_contains: dauka + label_not_contains: ez dauka + label_day_plural: egun + label_repository: Biltegia + label_repository_plural: Biltegiak + label_browse: Arakatu + label_branch: Adarra + label_tag: Etiketa + label_revision: Berrikuspena + label_revision_plural: Berrikuspenak + label_revision_id: "%{value} berrikuspen" + label_associated_revisions: Elkartutako berrikuspenak + label_added: gehituta + label_modified: aldatuta + label_copied: kopiatuta + label_renamed: berrizendatuta + label_deleted: ezabatuta + label_latest_revision: Azken berrikuspena + label_latest_revision_plural: Azken berrikuspenak + label_view_revisions: Berrikuspenak ikusi + label_view_all_revisions: Berrikuspen guztiak ikusi + label_max_size: Tamaina maximoa + label_sort_highest: Goraino mugitu + label_sort_higher: Gora mugitu + label_sort_lower: Behera mugitu + label_sort_lowest: Beheraino mugitu + label_roadmap: Ibilbide-mapa + label_roadmap_due_in: "Epea: %{value}" + label_roadmap_overdue: "%{value} berandu" + label_roadmap_no_issues: Ez dago zereginik bertsio honetan + label_search: Bilatu + label_result_plural: Emaitzak + label_all_words: hitz guztiak + label_wiki: Wikia + label_wiki_edit: Wiki edizioa + label_wiki_edit_plural: Wiki edizioak + label_wiki_page: Wiki orria + label_wiki_page_plural: Wiki orriak + label_index_by_title: Izenburuaren araberako indizea + label_index_by_date: Dataren araberako indizea + label_current_version: Uneko bertsioa + label_preview: Aurreikusi + label_feed_plural: Jarioak + label_changes_details: Aldaketa guztien xehetasunak + label_issue_tracking: Zeregin jarraipena + label_spent_time: Igarotako denbora + label_f_hour: "ordu %{value}" + label_f_hour_plural: "%{value} ordu" + label_time_tracking: Denbora jarraipena + label_change_plural: Aldaketak + label_statistics: Estatistikak + label_commits_per_month: Commit-ak hilabeteka + label_commits_per_author: Commit-ak egileka + label_view_diff: Ezberdintasunak ikusi + label_diff_inline: barnean + label_diff_side_by_side: aldez alde + label_options: Aukerak + label_copy_workflow_from: Kopiatu workflow-a hemendik + label_permissions_report: Baimenen txostena + label_watched_issues: Behatutako zereginak + label_related_issues: Erlazionatutako zereginak + label_applied_status: Aplikatutako egoera + label_loading: Kargatzen... + label_relation_new: Erlazio berria + label_relation_delete: Erlazioa ezabatu + label_relates_to: erlazionatuta dago + label_duplicates: bikoizten du + label_duplicated_by: honek bikoiztuta + label_blocks: blokeatzen du + label_blocked_by: honek blokeatuta + label_precedes: aurretik doa + label_follows: jarraitzen du + label_stay_logged_in: Saioa mantendu + label_disabled: ezgaituta + label_show_completed_versions: Bukatutako bertsioak ikusi + label_me: ni + label_board: Foroa + label_board_new: Foro berria + label_board_plural: Foroak + label_topic_plural: Gaiak + label_message_plural: Mezuak + label_message_last: Azken mezua + label_message_new: Mezu berria + label_message_posted: Mezua gehituta + label_reply_plural: Erantzunak + label_send_information: Erabiltzaileai kontuaren informazioa bidali + label_year: Urtea + label_month: Hilabetea + label_week: Astea + label_date_from: Nork + label_date_to: Nori + label_language_based: Erabiltzailearen hizkuntzaren arabera + label_sort_by: "Ordenazioa: %{value}" + label_send_test_email: Frogako mezua bidali + label_feeds_access_key: Atom atzipen giltza + label_missing_feeds_access_key: Atom atzipen giltza falta da + label_feeds_access_key_created_on: "Atom atzipen giltza orain dela %{value} sortuta" + label_module_plural: Moduluak + label_added_time_by: "%{author}, orain dela %{age} gehituta" + label_updated_time_by: "%{author}, orain dela %{age} eguneratuta" + label_updated_time: "Orain dela %{value} eguneratuta" + label_jump_to_a_project: Joan proiektura... + label_file_plural: Fitxategiak + label_changeset_plural: Aldaketak + label_default_columns: Lehenetsitako zutabeak + label_no_change_option: (Aldaketarik ez) + label_bulk_edit_selected_issues: Hautatutako zereginak batera editatu + label_theme: Itxura + label_default: Lehenetsia + label_search_titles_only: Izenburuetan bakarrik bilatu + label_user_mail_option_all: "Nire proiektu guztietako gertakari guztientzat" + label_user_mail_option_selected: "Hautatutako proiektuetako edozein gertakarientzat..." + label_user_mail_no_self_notified: "Ez dut nik egiten ditudan aldeketen jakinarazpenik jaso nahi" + label_registration_activation_by_email: kontuak epostaz gaitu + label_registration_manual_activation: kontuak eskuz gaitu + label_registration_automatic_activation: kontuak automatikoki gaitu + label_display_per_page: "Orriko: %{value}" + label_age: Adina + label_change_properties: Propietateak aldatu + label_general: Orokorra + label_scm: IKK + label_plugins: Pluginak + label_ldap_authentication: LDAP autentikazioa + label_downloads_abbr: Desk. + label_optional_description: Aukerako deskribapena + label_add_another_file: Beste fitxategia gehitu + label_preferences: Hobespenak + label_chronological_order: Orden kronologikoan + label_reverse_chronological_order: Alderantzizko orden kronologikoan + label_incoming_emails: Sarrerako epostak + label_generate_key: Giltza sortu + label_issue_watchers: Behatzaileak + label_example: Adibidea + label_display: Bistaratzea + label_sort: Ordenatu + label_ascending: Gorantz + label_descending: Beherantz + label_date_from_to: "%{start}-tik %{end}-ra" + label_wiki_content_added: Wiki orria gehituta + label_wiki_content_updated: Wiki orria eguneratuta + label_group: Taldea + label_group_plural: Taldeak + label_group_new: Talde berria + label_time_entry_plural: Igarotako denbora + label_version_sharing_none: Ez partekatuta + label_version_sharing_descendants: Azpiproiektuekin + label_version_sharing_hierarchy: Proiektu Hierarkiarekin + label_version_sharing_tree: Proiektu zuhaitzarekin + label_version_sharing_system: Proiektu guztiekin + label_update_issue_done_ratios: Zereginen burututako erlazioa eguneratu + label_copy_source: Iturburua + label_copy_target: Helburua + label_copy_same_as_target: Helburuaren berdina + label_display_used_statuses_only: Aztarnari honetan erabiltzen diren egoerak bakarrik erakutsi + label_api_access_key: API atzipen giltza + label_missing_api_access_key: API atzipen giltza falta da + label_api_access_key_created_on: "API atzipen giltza sortuta orain dela %{value}" + + button_login: Saioa hasi + button_submit: Bidali + button_save: Gorde + button_check_all: Guztiak markatu + button_uncheck_all: Guztiak desmarkatu + button_delete: Ezabatu + button_create: Sortu + button_create_and_continue: Sortu eta jarraitu + button_test: Frogatu + button_edit: Editatu + button_add: Gehitu + button_change: Aldatu + button_apply: Aplikatu + button_clear: Garbitu + button_lock: Blokeatu + button_unlock: Desblokeatu + button_download: Deskargatu + button_list: Zerrenda + button_view: Ikusi + button_move: Mugitu + button_move_and_follow: Mugitu eta jarraitu + button_back: Atzera + button_cancel: Ezeztatu + button_activate: Gahitu + button_sort: Ordenatu + button_log_time: Denbora erregistratu + button_rollback: Itzuli bertsio honetara + button_watch: Behatu + button_unwatch: Behatzen utzi + button_reply: Erantzun + button_archive: Artxibatu + button_unarchive: Desartxibatu + button_reset: Berrezarri + button_rename: Berrizendatu + button_change_password: Pasahitza aldatu + button_copy: Kopiatu + button_copy_and_follow: Kopiatu eta jarraitu + button_annotate: Anotatu + button_update: Eguneratu + button_configure: Konfiguratu + button_quote: Aipatu + button_duplicate: Bikoiztu + button_show: Ikusi + + status_active: gaituta + status_registered: izena emanda + status_locked: blokeatuta + + version_status_open: irekita + version_status_locked: blokeatuta + version_status_closed: itxita + + field_active: Gaituta + + text_select_mail_notifications: Jakinarazpenak zein ekintzetarako bidaliko diren hautatu. + text_regexp_info: adib. ^[A-Z0-9]+$ + text_min_max_length_info: 0k mugarik gabe esan nahi du + text_project_destroy_confirmation: Ziur zaude proiektu hau eta erlazionatutako datu guztiak ezabatu nahi dituzula? + text_subprojects_destroy_warning: "%{value} azpiproiektuak ere ezabatuko dira." + text_workflow_edit: Hautatu rola eta aztarnaria workflow-a editatzeko + text_are_you_sure: Ziur zaude? + text_journal_changed: "%{label} %{old}-(e)tik %{new}-(e)ra aldatuta" + text_journal_set_to: "%{label}-k %{value} balioa hartu du" + text_journal_deleted: "%{label} ezabatuta (%{old})" + text_journal_added: "%{label} %{value} gehituta" + text_tip_issue_begin_day: gaur hasten diren zereginak + text_tip_issue_end_day: gaur bukatzen diren zereginak + text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren zereginak + text_caracters_maximum: "%{count} karaktere gehienez." + text_caracters_minimum: "Gutxienez %{count} karaktereetako luzerakoa izan behar du." + text_length_between: "Luzera %{min} eta %{max} karaktereen artekoa." + text_tracker_no_workflow: Ez da workflow-rik definitu aztarnari honentzako + text_unallowed_characters: Debekatutako karaktereak + text_comma_separated: Balio anitz izan daitezke (komaz banatuta). + text_line_separated: Balio anitz izan daitezke (balio bakoitza lerro batean). + text_issues_ref_in_commit_messages: Commit-en mezuetan zereginak erlazionatu eta konpontzen + text_issue_added: "%{id} zeregina %{author}-(e)k jakinarazi du." + text_issue_updated: "%{id} zeregina %{author}-(e)k eguneratu du." + text_wiki_destroy_confirmation: Ziur zaude wiki hau eta bere eduki guztiak ezabatu nahi dituzula? + text_issue_category_destroy_question: "Zeregin batzuk (%{count}) kategoria honetara esleituta daude. Zer egin nahi duzu?" + text_issue_category_destroy_assignments: Kategoria esleipenak kendu + text_issue_category_reassign_to: Zereginak kategoria honetara esleitu + text_user_mail_option: "Hautatu gabeko proiektuetan, behatzen edo parte hartzen duzun gauzei buruzko jakinarazpenak jasoko dituzu (adib. zu egile zaren edo esleituta dituzun zereginak)." + text_no_configuration_data: "Rolak, aztarnariak, zeregin egoerak eta workflow-ak ez dira oraindik konfiguratu.\nOso gomendagarria de lehenetsitako kkonfigurazioa kargatzea. Kargatu eta gero aldatu ahalko duzu." + text_load_default_configuration: Lehenetsitako konfigurazioa kargatu + text_status_changed_by_changeset: "%{value} aldaketan aplikatuta." + text_issues_destroy_confirmation: 'Ziur zaude hautatutako zeregina(k) ezabatu nahi dituzula?' + text_select_project_modules: 'Hautatu proiektu honetan gaitu behar diren moduluak:' + text_default_administrator_account_changed: Lehenetsitako kudeatzaile kontua aldatuta + text_file_repository_writable: Eranskinen direktorioan idatz daiteke + text_plugin_assets_writable: Pluginen baliabideen direktorioan idatz daiteke + text_rmagick_available: RMagick eskuragarri (aukerazkoa) + text_destroy_time_entries_question: "%{hours} orduei buruz berri eman zen zuk ezabatzera zoazen zereginean. Zer egin nahi duzu?" + text_destroy_time_entries: Ezabatu berri emandako orduak + text_assign_time_entries_to_project: Berri emandako orduak proiektura esleitu + text_reassign_time_entries: 'Berri emandako orduak zeregin honetara esleitu:' + text_user_wrote: "%{value}-(e)k idatzi zuen:" + text_enumeration_destroy_question: "%{count} objetu balio honetara esleituta daude." + text_enumeration_category_reassign_to: 'Beste balio honetara esleitu:' + text_email_delivery_not_configured: "Eposta bidalketa ez dago konfiguratuta eta jakinarazpenak ezgaituta daude.\nKonfiguratu zure SMTP zerbitzaria config/configuration.yml-n eta aplikazioa berrabiarazi hauek gaitzeko." + text_repository_usernames_mapping: "Hautatu edo eguneratu Redmineko erabiltzailea biltegiko egunkarietan topatzen diren erabiltzaile izenekin erlazionatzeko.\nRedmine-n eta biltegian erabiltzaile izen edo eposta berdina duten erabiltzaileak automatikoki erlazionatzen dira." + text_diff_truncated: '... Diff hau moztua izan da erakus daitekeen tamaina maximoa gainditu duelako.' + text_custom_field_possible_values_info: 'Lerro bat balio bakoitzeko' + text_wiki_page_destroy_question: "Orri honek %{descendants} orri seme eta ondorengo ditu. Zer egin nahi duzu?" + text_wiki_page_nullify_children: "Orri semeak erro orri moduan mantendu" + text_wiki_page_destroy_children: "Orri semeak eta beraien ondorengo guztiak ezabatu" + text_wiki_page_reassign_children: "Orri semeak orri guraso honetara esleitu" + text_own_membership_delete_confirmation: "Zure baimen batzuk (edo guztiak) kentzera zoaz eta baliteke horren ondoren proiektu hau ezin editatzea.\n Ziur zaude jarraitu nahi duzula?" + + default_role_manager: Kudeatzailea + default_role_developer: Garatzailea + default_role_reporter: Berriemailea + default_tracker_bug: Errorea + default_tracker_feature: Eginbidea + default_tracker_support: Laguntza + default_issue_status_new: Berria + default_issue_status_in_progress: Lanean + default_issue_status_resolved: Ebatzita + default_issue_status_feedback: Berrelikadura + default_issue_status_closed: Itxita + default_issue_status_rejected: Baztertua + default_doc_category_user: Erabiltzaile dokumentazioa + default_doc_category_tech: Dokumentazio teknikoa + default_priority_low: Baxua + default_priority_normal: Normala + default_priority_high: Altua + default_priority_urgent: Larria + default_priority_immediate: Berehalakoa + default_activity_design: Diseinua + default_activity_development: Garapena + + enumeration_issue_priorities: Zeregin lehentasunak + enumeration_doc_categories: Dokumentu kategoriak + enumeration_activities: Jarduerak (denbora kontrola)) + enumeration_system_activity: Sistemako Jarduera + label_board_sticky: Itsaskorra + label_board_locked: Blokeatuta + permission_export_wiki_pages: Wiki orriak esportatu + setting_cache_formatted_text: Formatudun testua katxeatu + permission_manage_project_activities: Proiektuaren jarduerak kudeatu + error_unable_delete_issue_status: Ezine da zereginaren egoera ezabatu + label_profile: Profila + permission_manage_subtasks: Azpiatazak kudeatu + field_parent_issue: Zeregin gurasoa + label_subtask_plural: Azpiatazak + label_project_copy_notifications: Proiektua kopiatzen den bitartean eposta jakinarazpenak bidali + error_can_not_delete_custom_field: Ezin da eremu pertsonalizatua ezabatu + error_unable_to_connect: Ezin da konektatu (%{value}) + error_can_not_remove_role: Rol hau erabiltzen hari da eta ezin da ezabatu. + error_can_not_delete_tracker: Aztarnari honek zereginak ditu eta ezin da ezabatu. + field_principal: Ekintzaile + notice_failed_to_save_members: "Kidea(k) gordetzean errorea: %{errors}." + text_zoom_out: Zooma txikiagotu + text_zoom_in: Zooma handiagotu + notice_unable_delete_time_entry: "Ezin da hautatutako denbora erregistroa ezabatu." + label_overall_spent_time: Igarotako denbora guztira + field_time_entries: "Denbora erregistratu" + project_module_gantt: Gantt + project_module_calendar: Egutegia + button_edit_associated_wikipage: "Esleitutako wiki orria editatu: %{page_title}" + field_text: Testu eremua + setting_default_notification_option: "Lehenetsitako ohartarazpen aukera" + label_user_mail_option_only_my_events: "Behatzen ditudan edo partaide naizen gauzetarako bakarrik" + label_user_mail_option_none: "Gertakaririk ez" + field_member_of_group: "Esleituta duenaren taldea" + field_assigned_to_role: "Esleituta duenaren rola" + notice_not_authorized_archived_project: "Atzitu nahi duzun proiektua artxibatua izan da." + label_principal_search: "Bilatu erabiltzaile edo taldea:" + label_user_search: "Erabiltzailea bilatu:" + field_visible: Ikusgai + setting_emails_header: "Eposten goiburua" + setting_commit_logtime_activity_id: "Erregistratutako denboraren jarduera" + text_time_logged_by_changeset: "%{value} aldaketan egindakoa." + setting_commit_logtime_enabled: "Erregistrutako denbora gaitu" + notice_gantt_chart_truncated: Grafikoa moztu da bistara daitekeen elementuen kopuru maximoa gainditu delako (%{max}) + setting_gantt_items_limit: "Gantt grafikoan bistara daitekeen elementu kopuru maximoa" + field_warn_on_leaving_unsaved: Gorde gabeko testua duen orri batetik ateratzen naizenean ohartarazi + text_warn_on_leaving_unsaved: Uneko orritik joaten bazara gorde gabeko testua galduko da. + label_my_queries: Nire galdera pertsonalizatuak + text_journal_changed_no_detail: "%{label} eguneratuta" + label_news_comment_added: Berri batera iruzkina gehituta + button_expand_all: Guztia zabaldu + button_collapse_all: Guztia tolestu + label_additional_workflow_transitions_for_assignee: Erabiltzaileak esleitua duenean baimendutako transtsizio gehigarriak + label_additional_workflow_transitions_for_author: Erabiltzailea egilea denean baimendutako transtsizio gehigarriak + label_bulk_edit_selected_time_entries: Hautatutako denbora egunkariak batera editatu + text_time_entries_destroy_confirmation: Ziur zaude hautatutako denbora egunkariak ezabatu nahi dituzula? + label_role_anonymous: Ezezaguna + label_role_non_member: Ez kidea + label_issue_note_added: Oharra gehituta + label_issue_status_updated: Egoera eguneratuta + label_issue_priority_updated: Lehentasuna eguneratuta + label_issues_visibility_own: Erabiltzaileak sortu edo esleituta dituen zereginak + field_issues_visibility: Zeregin ikusgarritasuna + label_issues_visibility_all: Zeregin guztiak + permission_set_own_issues_private: Nork bere zereginak publiko edo pribatu jarri + field_is_private: Pribatu + permission_set_issues_private: Zereginak publiko edo pribatu jarri + label_issues_visibility_public: Pribatu ez diren zeregin guztiak + text_issues_destroy_descendants_confirmation: Honek %{count} azpiataza ezabatuko ditu baita ere. + field_commit_logs_encoding: Commit-en egunkarien kodetzea + field_scm_path_encoding: Bidearen kodeketa + text_scm_path_encoding_note: "Lehentsita: UTF-8" + field_path_to_repository: Biltegirako bidea + field_root_directory: Erro direktorioa + field_cvs_module: Modulua + field_cvsroot: CVSROOT + text_mercurial_repository_note: Biltegi locala (adib. /hgrepo, c:\hgrepo) + text_scm_command: Komandoa + text_scm_command_version: Bertsioa + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 zeregina + one: 1 zeregina + other: "%{count} zereginak" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: guztiak + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Azpiproiektuekin + label_cross_project_tree: Proiektu zuhaitzarekin + label_cross_project_hierarchy: Proiektu Hierarkiarekin + label_cross_project_system: Proiektu guztiekin + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Guztira + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Eposta + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Igarotako denbora guztira + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API giltza + setting_lost_password: Pasahitza galduta + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/fa.yml b/config/locales/fa.yml new file mode 100644 index 0000000..5ee5b5f --- /dev/null +++ b/config/locales/fa.yml @@ -0,0 +1,1231 @@ +fa: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: rtl + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [یک‌شنبه, دوشنبه, سه‌شنبه, چهارشنبه, پنج‌شنبه, جمعه, شنبه] + abbr_day_names: [یک, دو, سه, چهار, پنج, جمعه, شنبه] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر] + abbr_month_names: [~, ژان, فور, مار, آور, مه, ژوئن, ژوئیه, اوت, سپت, اکت, نوا, دسا] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d - %H:%M" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B %Y ساعت %H:%M" + am: "صبح" + pm: "عصر" + + datetime: + distance_in_words: + half_a_minute: "نیم دقیقه" + less_than_x_seconds: + one: "کمتر از 1 ثانیه" + other: "کمتر از %{count} ثانیه" + x_seconds: + one: "1 ثانیه" + other: "%{count} ثانیه" + less_than_x_minutes: + one: "کمتر از 1 دقیقه" + other: "کمتر از %{count} دقیقه" + x_minutes: + one: "1 دقیقه" + other: "%{count} دقیقه" + about_x_hours: + one: "نزدیک 1 ساعت" + other: "نزدیک %{count} ساعت" + x_hours: + one: "1 ساعت" + other: "%{count} ساعت" + x_days: + one: "1 روز" + other: "%{count} روز" + about_x_months: + one: "نزدیک 1 ماه" + other: "نزدیک %{count} ماه" + x_months: + one: "1 ماه" + other: "%{count} ماه" + about_x_years: + one: "نزدیک 1 سال" + other: "نزدیک %{count} سال" + over_x_years: + one: "بیش از 1 سال" + other: "بیش از %{count} سال" + almost_x_years: + one: "نزدیک 1 سال" + other: "نزدیک %{count} سال" + + number: + # Default format for numbers + format: + separator: "٫" + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "بایت" + other: "بایت" + kb: "کیلوبایت" + mb: "مگابایت" + gb: "گیگابایت" + tb: "ترابایت" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "و" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 ایراد از ذخیره سازی این %{model} جلوگیری کرد" + other: "%{count} ایراد از ذخیره سازی این %{model} جلوگیری کرد" + messages: + inclusion: "در فهرست نیامده است" + exclusion: "رزرو شده است" + invalid: "نادرست است" + confirmation: "با بررسی سازگاری ندارد" + accepted: "باید پذیرفته شود" + empty: "نمی‌تواند تهی باشد" + blank: "نمی‌تواند تهی باشد" + too_long: "خیلی بلند است (بیشترین اندازه %{count} نویسه است)" + too_short: "خیلی کوتاه است (کمترین اندازه %{count} نویسه است)" + wrong_length: "اندازه نادرست است (باید %{count} نویسه باشد)" + taken: "پیش از این گرفته شده است" + not_a_number: "شماره درستی نیست" + not_a_date: "تاریخ درستی نیست" + greater_than: "باید بزرگتر از %{count} باشد" + greater_than_or_equal_to: "باید بزرگتر از یا برابر با %{count} باشد" + equal_to: "باید برابر با %{count} باشد" + less_than: "باید کمتر از %{count} باشد" + less_than_or_equal_to: "باید کمتر از یا برابر با %{count} باشد" + odd: "باید فرد باشد" + even: "باید زوج باشد" + greater_than_start_date: "باید از تاریخ آغاز بزرگتر باشد" + not_same_project: "به همان پروژه وابسته نیست" + circular_dependency: "این وابستگی یک وابستگی دایره وار خواهد ساخت" + cant_link_an_issue_with_a_descendant: "یک مورد نمی‌تواند به یکی از زیر کارهایش پیوند بخورد" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: گزینش کنید + + general_text_No: 'خیر' + general_text_Yes: 'آری' + general_text_no: 'خیر' + general_text_yes: 'آری' + general_lang_name: 'Persian (پارسی)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: DejaVuSans + general_pdf_monospaced_fontname: DejaVuSans + general_first_day_of_week: '6' + + notice_account_updated: حساب شما بروز شد. + notice_account_invalid_credentials: نام کاربری یا گذرواژه نادرست است + notice_account_password_updated: گذرواژه بروز شد + notice_account_wrong_password: گذرواژه نادرست است + notice_account_register_done: حساب ساخته شد. برای فعال نمودن آن، روی پیوندی که به شما ایمیل شده کلیک کنید. + notice_account_unknown_email: کاربر شناخته نشد. + notice_can_t_change_password: این حساب یک روش شناسایی بیرونی را به کار گرفته است. گذرواژه را نمی‌توان جایگزین کرد. + notice_account_lost_email_sent: یک ایمیل با راهنمایی درباره گزینش گذرواژه جدید برای شما فرستاده شد. + notice_account_activated: حساب شما فعال شده است. اکنون می‌توانید وارد شوید. + notice_successful_create: با موفقیت ساخته شد. + notice_successful_update: با موفقیت بروز شد. + notice_successful_delete: با موفقیت برداشته شد. + notice_successful_connection: با موفقیت متصل شد. + notice_file_not_found: صفحه درخواستی شما در دسترس نیست یا پاک شده است. + notice_locking_conflict: داده‌ها را کاربر دیگری بروز کرده است. + notice_not_authorized: شما به این صفحه دسترسی ندارید. + notice_not_authorized_archived_project: پروژه درخواستی شما بایگانی شده است. + notice_email_sent: "یک ایمیل به %{value} فرستاده شد." + notice_email_error: "یک ایراد در فرستادن ایمیل پیش آمد (%{value})." + notice_feeds_access_key_reseted: کلید دسترسی Atom شما بازنشانی شد. + notice_api_access_key_reseted: کلید دسترسی API شما بازنشانی شد. + notice_failed_to_save_issues: "ذخیره سازی %{count} مورد از %{total} مورد گزینش شده شکست خورد: %{ids}." + notice_failed_to_save_members: "ذخیره سازی همکاران شکست خورد: %{errors}." + notice_no_issue_selected: "هیچ موردی انتخاب نشده است! موردهایی که می‌خواهید ویرایش کنید را انتخاب کنید." + notice_account_pending: "حساب شما ساخته شد و اکنون منتظر تایید مدیر سایت است." + notice_default_data_loaded: پیکربندی پیش‌گزیده با موفقیت بار شد. + notice_unable_delete_version: نگارش را نمی‌توان پاک کرد. + notice_unable_delete_time_entry: زمان گزارش شده را نمی‌توان پاک کرد. + notice_issue_done_ratios_updated: اندازه انجام شده مورد بروز شد. + notice_gantt_chart_truncated: "نمودار بریده شد چون از بیشترین شماری که می‌توان نشان داد بزگتر است (%{max})." + + error_can_t_load_default_data: "پیکربندی پیش‌گزیده نمی‌تواند بار شود: %{value}" + error_scm_not_found: "بخش یا نگارش در بایگانی پیدا نشد." + error_scm_command_failed: "ایرادی در دسترسی به بایگانی پیش آمد: %{value}" + error_scm_annotate: "بخش پیدا نشد یا نمی‌توان برای آن یادداشت نوشت." + error_issue_not_found_in_project: 'مورد پیدا نشد یا به این پروژه وابسته نیست.' + error_no_tracker_in_project: 'هیچ ردیابی به این پروژه پیوسته نشده است. پیکربندی پروژه را بررسی کنید.' + error_no_default_issue_status: 'هیچ وضعیت مورد پیش‌گزیده‌ای مشخص نشده است. پیکربندی را بررسی کنید (به «پیکربندی -> وضعیت‌های مورد» بروید).' + error_can_not_delete_custom_field: فیلد سفارشی را نمی‌توان پاک کرد. + error_can_not_delete_tracker: "این ردیاب دارای مورد است و نمی‌توان آن را پاک کرد." + error_can_not_remove_role: "این نقش به کار گرفته شده است و نمی‌توان آن را پاک کرد." + error_can_not_reopen_issue_on_closed_version: 'یک مورد که به یک نگارش بسته شده وابسته است را نمی‌توان باز کرد.' + error_can_not_archive_project: این پروژه را نمی‌توان بایگانی کرد. + error_issue_done_ratios_not_updated: "اندازه انجام شده مورد بروز نشد." + error_workflow_copy_source: 'یک ردیاب یا نقش منبع را برگزینید.' + error_workflow_copy_target: 'ردیابها یا نقش‌های مقصد را برگزینید.' + error_unable_delete_issue_status: 'وضعیت مورد را نمی‌توان پاک کرد.' + error_unable_to_connect: "نمی‌توان متصل شد (%{value})" + warning_attachments_not_saved: "%{count} پرونده ذخیره نشد." + + mail_subject_lost_password: "گذرواژه حساب %{value} شما" + mail_body_lost_password: 'برای جایگزینی گذرواژه خود، بر روی پیوند زیر کلیک کنید:' + mail_subject_register: "فعالسازی حساب %{value} شما" + mail_body_register: 'برای فعالسازی حساب خود، بر روی پیوند زیر کلیک کنید:' + mail_body_account_information_external: "شما می‌توانید حساب %{value} خود را برای ورود به کار برید." + mail_body_account_information: داده‌های حساب شما + mail_subject_account_activation_request: "درخواست فعالسازی حساب %{value}" + mail_body_account_activation_request: "یک کاربر جدید (%{value}) نامنویسی کرده است. این حساب منتظر تایید شماست:" + mail_subject_reminder: "زمان رسیدگی به %{count} مورد در %{days} روز آینده سر می‌رسد" + mail_body_reminder: "زمان رسیدگی به %{count} مورد که به شما واگذار شده است، در %{days} روز آینده سر می‌رسد:" + mail_subject_wiki_content_added: "صفحه ویکی «%{id}» افزوده شد" + mail_body_wiki_content_added: "صفحه ویکی «%{id}» به دست %{author} افزوده شد." + mail_subject_wiki_content_updated: "صفحه ویکی «%{id}» بروز شد" + mail_body_wiki_content_updated: "صفحه ویکی «%{id}» به دست %{author} بروز شد." + + field_name: نام + field_description: توضیحات + field_summary: خلاصه + field_is_required: الزامی + field_firstname: نام کوچک + field_lastname: نام خانوادگی + field_mail: ایمیل + field_filename: پرونده + field_filesize: اندازه + field_downloads: دریافت‌ها + field_author: نویسنده + field_created_on: ساخته شده در + field_updated_on: بروز شده در + field_field_format: قالب + field_is_for_all: برای همه پروژه‌ها + field_possible_values: مقادیر ممکن + field_regexp: عبارت منظم + field_min_length: کمترین اندازه + field_max_length: بیشترین اندازه + field_value: مقدار + field_category: دسته بندی + field_title: عنوان + field_project: پروژه + field_issue: مورد + field_status: وضعیت + field_notes: یادداشت + field_is_closed: مورد بسته شده + field_is_default: مقدار پیش‌گزیده + field_tracker: ردیاب + field_subject: موضوع + field_due_date: زمان سررسید + field_assigned_to: واگذار شده به + field_priority: اولویت + field_fixed_version: نگارش هدف + field_user: کاربر + field_principal: دستور دهنده + field_role: نقش + field_homepage: صفحه اصلی + field_is_public: همگانی + field_parent: پروژه پدر + field_is_in_roadmap: این موردها در نقشه راه نشان داده شوند + field_login: کد پرسنلی + field_mail_notification: آگاه سازی‌های ایمیلی + field_admin: مدیر سایت + field_last_login_on: آخرین ورود + field_language: زبان + field_effective_date: تاریخ + field_password: گذرواژه + field_new_password: گذرواژه جدید + field_password_confirmation: تکرار گذرواژه + field_version: نگارش + field_type: گونه + field_host: میزبان + field_port: درگاه + field_account: حساب + field_base_dn: DN پایه + field_attr_login: نشانه کد پرسنلی + field_attr_firstname: نشانه نام کوچک + field_attr_lastname: نشانه نام خانوادگی + field_attr_mail: نشانه ایمیل + field_onthefly: ساخت کاربر بیدرنگ + field_start_date: تاریخ آغاز + field_done_ratio: ٪ انجام شده + field_auth_source: روش شناسایی + field_hide_mail: ایمیل من پنهان شود + field_comments: نظر + field_url: نشانی + field_start_page: صفحه آغاز + field_subproject: زیر پروژه + field_hours: ساعت‌ + field_activity: گزارش + field_spent_on: در تاریخ + field_identifier: شناسه + field_is_filter: پالایش پذیر + field_issue_to: مورد وابسته + field_delay: دیرکرد + field_assignable: موردها می‌توانند به این نقش واگذار شوند + field_redirect_existing_links: پیوندهای پیشین به پیوند جدید راهنمایی شوند + field_estimated_hours: زمان برآورد شده + field_column_names: ستون‌ها + field_time_entries: زمان نوشتن + field_time_zone: پهنه زمانی + field_searchable: جستجو پذیر + field_default_value: مقدار پیش‌گزیده + field_comments_sorting: نمایش نظر‌ها + field_parent_title: صفحه پدر + field_editable: ویرایش پذیر + field_watcher: دیده‌بان + field_identity_url: نشانی OpenID + field_content: محتوا + field_group_by: دسته بندی با + field_sharing: اشتراک گذاری + field_parent_issue: فعاليت یا مورد مافوق + field_member_of_group: "همکار گروه واگذار شونده" + field_assigned_to_role: "نقش واگذار شونده" + field_text: فیلد متنی + field_visible: آشکار + + setting_app_title: نام برنامه + setting_app_subtitle: زیرنام برنامه + setting_welcome_text: متن خوش‌آمد گویی + setting_default_language: زبان پیش‌گزیده + setting_login_required: الزامی بودن ورود + setting_self_registration: خود نام نویسی + setting_attachment_max_size: بیشترین اندازه پیوست + setting_issues_export_limit: کرانه صدور پییامدها + setting_mail_from: نشانی فرستنده ایمیل + setting_bcc_recipients: گیرندگان ایمیل دیده نشوند (bcc) + setting_plain_text_mail: ایمیل نوشته ساده (بدون HTML) + setting_host_name: نام میزبان و نشانی + setting_text_formatting: قالب بندی نوشته + setting_wiki_compression: فشرده‌سازی پیشینه ویکی + setting_feeds_limit: کرانه محتوای خوراک + setting_default_projects_public: حالت پیش‌گزیده پروژه‌های جدید، همگانی است + setting_autofetch_changesets: دریافت خودکار تغییرات + setting_sys_api_enabled: فعال سازی وب سرویس برای مدیریت بایگانی + setting_commit_ref_keywords: کلیدواژه‌های نشانه + setting_commit_fix_keywords: کلیدواژه‌های انجام + setting_autologin: ورود خودکار + setting_date_format: قالب تاریخ + setting_time_format: قالب زمان + setting_cross_project_issue_relations: توانایی وابستگی میان پروژه‌ای موردها + setting_issue_list_default_columns: ستون‌های پیش‌گزیده نمایش داده شده در فهرست موردها + setting_emails_header: سرنویس ایمیل‌ها + setting_emails_footer: پانویس ایمیل‌ها + setting_protocol: پیوندنامه + setting_per_page_options: گزینه‌های اندازه داده‌های هر برگ + setting_user_format: قالب نمایشی کاربران + setting_activity_days_default: روزهای نمایش داده شده در گزارش پروژه + setting_display_subprojects_issues: پیش‌گزیده نمایش موردهای زیرپروژه در پروژه پدر + setting_enabled_scm: فعالسازی SCM + setting_mail_handler_body_delimiters: "بریدن ایمیل‌ها پس از یکی از این ردیف‌ها" + setting_mail_handler_api_enabled: فعالسازی وب سرویس برای ایمیل‌های آمده + setting_mail_handler_api_key: کلید API + setting_sequential_project_identifiers: ساخت پشت سر هم شناسه پروژه + setting_gravatar_enabled: کاربرد Gravatar برای عکس کاربر + setting_gravatar_default: عکس Gravatar پیش‌گزیده + setting_diff_max_lines_displayed: بیشترین اندازه ردیف‌های تفاوت نشان داده شده + setting_file_max_size_displayed: بیشترین اندازه پرونده‌های نمایش داده شده درون خطی + setting_repository_log_display_limit: بیشترین شمار نگارش‌های نمایش داده شده در گزارش پرونده + setting_openid: پذیرش ورود و نام نویسی با OpenID + setting_password_min_length: کمترین اندازه گذرواژه + setting_new_project_user_role_id: نقش داده شده به کاربری که مدیر سایت نیست و پروژه می‌سازد + setting_default_projects_modules: پودمان های پیش‌گزیده فعال برای پروژه‌های جدید + setting_issue_done_ratio: برآورد اندازه انجام شده مورد با + setting_issue_done_ratio_issue_field: کاربرد فیلد مورد + setting_issue_done_ratio_issue_status: کاربرد وضعیت مورد + setting_start_of_week: آغاز تقویم از + setting_rest_api_enabled: فعالسازی وب سرویس‌های REST + setting_cache_formatted_text: نهان سازی نوشته‌های قالب بندی شده + setting_default_notification_option: آگاه سازی پیش‌گزیده + setting_commit_logtime_enabled: فعالسازی زمان صرف شده + setting_commit_logtime_activity_id: کد فعالیت زمان صرف شده + setting_gantt_items_limit: بیشترین شمار بخش‌های نمایش داده شده در نمودار گانت + + permission_add_project: ساخت پروژه + permission_add_subprojects: ساخت زیرپروژه + permission_edit_project: ویرایش پروژه + permission_select_project_modules: گزینش پودمان های پروژه + permission_manage_members: مدیریت همکاران پروژه + permission_manage_project_activities: مدیریت کارهای پروژه + permission_manage_versions: مدیریت نگارش‌ها + permission_manage_categories: مدیریت دسته بندی موارد + permission_view_issues: دیدن موردها + permission_add_issues: افزودن موردها + permission_edit_issues: ویرایش موردها + permission_manage_issue_relations: مدیریت وابستگی موردها + permission_add_issue_notes: افزودن یادداشت + permission_edit_issue_notes: ویرایش یادداشت + permission_edit_own_issue_notes: ویرایش یادداشت خود + permission_move_issues: جابجایی موردها + permission_delete_issues: پاک کردن موردها + permission_manage_public_queries: مدیریت پرس‌وجوهای همگانی + permission_save_queries: ذخیره سازی پرس‌وجوها + permission_view_gantt: دیدن نمودار گانت + permission_view_calendar: دیدن تقویم + permission_view_issue_watchers: دیدن فهرست دیده‌بان‌ها + permission_add_issue_watchers: افزودن دیده‌بان‌ها + permission_delete_issue_watchers: پاک کردن دیده‌بان‌ها + permission_log_time: نوشتن زمان صرف شده + permission_view_time_entries: دیدن زمان صرف شده + permission_edit_time_entries: ویرایش زمان صرف شده + permission_edit_own_time_entries: ویرایش زمان صرف شده خود + permission_manage_news: مدیریت اخبار + permission_comment_news: افزودن نظر شخصی به مجموعه اخبار + permission_view_documents: دیدن مستندات + permission_manage_files: مدیریت پرونده‌ها + permission_view_files: دیدن پرونده‌ها + permission_manage_wiki: مدیریت ویکی + permission_rename_wiki_pages: نامگذاری صفحه ویکی + permission_delete_wiki_pages: پاک کردن صفحه ویکی + permission_view_wiki_pages: دیدن ویکی + permission_view_wiki_edits: دیدن پیشینه ویکی + permission_edit_wiki_pages: ویرایش صفحه‌های ویکی + permission_delete_wiki_pages_attachments: پاک کردن پیوست‌های صفحه ویکی + permission_protect_wiki_pages: نگه‌داری صفحه‌های ویکی + permission_manage_repository: مدیریت بایگانی + permission_browse_repository: مرور و بررسی در بایگانی + permission_view_changesets: دیدن تغییرات + permission_commit_access: دسترسی تغییر بایگانی + permission_manage_boards: مدیریت انجمن‌ها + permission_view_messages: دیدن پیام‌ها + permission_add_messages: فرستادن پیام‌ها + permission_edit_messages: ویرایش پیام‌ها + permission_edit_own_messages: ویرایش پیام خود + permission_delete_messages: پاک کردن پیام‌ها + permission_delete_own_messages: پاک کردن پیام خود + permission_export_wiki_pages: صدور صفحه‌های ویکی + permission_manage_subtasks: مدیریت زیرکارها + + project_module_issue_tracking: پیگیری موردها + project_module_time_tracking: پیگیری زمان + project_module_news: اخبار + project_module_documents: مستندات + project_module_files: پرونده‌ها + project_module_wiki: ویکی + project_module_repository: بایگانی + project_module_boards: انجمن‌ها + project_module_calendar: تقویم + project_module_gantt: گانت + + label_user: کاربر + label_user_plural: کاربر + label_user_new: کاربر جدید + label_user_anonymous: ناشناس + label_project: پروژه + label_project_new: پروژه جدید + label_project_plural: پروژه ها + label_x_projects: + zero: بدون پروژه + one: "1 پروژه" + other: "%{count} پروژه" + label_project_all: همه پروژه‌ها + label_project_latest: آخرین پروژه‌ها + label_issue: مورد + label_issue_new: مورد جدید + label_issue_plural: موردها + label_issue_view_all: دیدن همه موردها + label_issues_by: "دسته‌بندی موردها با %{value}" + label_issue_added: مورد افزوده شد + label_issue_updated: مورد بروز شد + label_document: مستند + label_document_new: مستند جدید + label_document_plural: مستندات + label_document_added: مستند افزوده شد + label_role: نقش + label_role_plural: نقش ها + label_role_new: نقش جدید + label_role_and_permissions: نقش‌ها و مجوز‌ها + label_member: همکار + label_member_new: همکار جدید + label_member_plural: همکاران + label_tracker: ردیاب + label_tracker_plural: ردیاب ها + label_tracker_new: ردیاب جدید + label_workflow: گردش کار + label_issue_status: وضعیت مورد + label_issue_status_plural: وضعیت موارد + label_issue_status_new: وضعیت جدید + label_issue_category: دسته بندی مورد + label_issue_category_plural: دسته بندی موارد + label_issue_category_new: دسته بندی جدید + label_custom_field: فیلد سفارشی + label_custom_field_plural: فیلدهای سفارشی + label_custom_field_new: فیلد سفارشی جدید + label_enumerations: برشمردنی‌ها + label_enumeration_new: مقدار جدید + label_information: داده + label_information_plural: داده ها + label_please_login: وارد شوید + label_register: نام نویسی کنید + label_login_with_open_id_option: یا با OpenID وارد شوید + label_password_lost: بازیافت گذرواژه + label_home: پیش خوان + label_my_page: صفحه خودم + label_my_account: تنظیمات خودم + label_my_projects: پروژه‌های خودم + label_administration: مدیریت + label_login: نام کاربری + label_logout: خروج + label_help: راهنما + label_reported_issues: موردهای گزارش شده + label_assigned_to_me_issues: موردهای واگذار شده به من + label_last_login: آخرین ورود + label_registered_on: نام نویسی شده در + label_activity: گزارش فعالیت ها + label_overall_activity: کل فعالیت ها روی هم رفته + label_user_activity: "درصد فعالیت %{value}" + label_new: جدید + label_logged_as: "نام کاربری:" + label_environment: محیط + label_authentication: شناسایی + label_auth_source: روش شناسایی + label_auth_source_new: روش شناسایی جدید + label_auth_source_plural: روش های شناسایی + label_subproject_plural: زیرپروژه ها + label_subproject_new: زیرپروژه جدید + label_and_its_subprojects: "%{value} و زیرپروژه‌هایش" + label_min_max_length: کمترین و بیشترین اندازه + label_list: فهرست + label_date: تاریخ + label_integer: شماره درست + label_float: شماره شناور + label_boolean: درست/نادرست + label_string: نوشته + label_text: نوشته بلند + label_attribute: نشانه + label_attribute_plural: نشانه ها + label_no_data: هیچ داده‌ای برای نمایش نیست + label_change_status: جایگزینی وضعیت + label_history: پیشینه + label_attachment: پرونده + label_attachment_new: پرونده جدید + label_attachment_delete: پاک کردن پرونده + label_attachment_plural: پرونده + label_file_added: پرونده افزوده شد + label_report: گزارش + label_report_plural: گزارشات + label_news: اخبار + label_news_new: افزودن خبر + label_news_plural: اخبار + label_news_latest: آخرین اخبار + label_news_view_all: دیدن همه اخبار + label_news_added: خبر افزوده شد + label_settings: پیکربندی + label_overview: در یک نگاه + label_version: نگارش + label_version_new: نگارش جدید + label_version_plural: نگارش ها + label_close_versions: بستن نگارش‌های انجام شده + label_confirmation: بررسی + label_export_to: 'قالب‌های دیگر:' + label_read: خواندن... + label_public_projects: پروژه‌های همگانی + label_open_issues: باز + label_open_issues_plural: باز + label_closed_issues: بسته + label_closed_issues_plural: بسته + label_x_open_issues_abbr: + zero: 0 باز + one: 1 باز + other: "%{count} باز" + label_x_closed_issues_abbr: + zero: 0 بسته + one: 1 بسته + other: "%{count} بسته" + label_total: مجموعا + label_permissions: مجوز‌ها + label_current_status: وضعیت کنونی + label_new_statuses_allowed: وضعیت‌های پذیرفتنی جدید + label_all: همه + label_none: هیچ + label_nobody: هیچکس + label_next: پسین + label_previous: پیشین + label_used_by: به کار رفته در + label_details: جزئیات + label_add_note: افزودن یادداشت + label_calendar: تقویم + label_months_from: از ماه + label_gantt: گانت + label_internal: درونی + label_last_changes: "%{count} تغییر آخر" + label_change_view_all: دیدن همه تغییرات + label_comment: نظر + label_comment_plural: نظر ها + label_x_comments: + zero: بدون نظر + one: 1 نظر + other: "%{count} نظر" + label_comment_add: افزودن نظر + label_comment_added: نظر افزوده شد + label_comment_delete: پاک کردن نظر‌ها + label_query: پرس‌وجوی سفارشی + label_query_plural: پرس‌وجوی های سفارشی + label_query_new: پرس‌وجوی جدید + label_filter_add: افزودن پالایه + label_filter_plural: پالایه ها + label_equals: برابر است با + label_not_equals: برابر نیست با + label_in_less_than: کمتر است از + label_in_more_than: بیشتر است از + label_greater_or_equal: بیشتر یا برابر است با + label_less_or_equal: کمتر یا برابر است با + label_in: در + label_today: امروز + label_all_time: همیشه + label_yesterday: دیروز + label_this_week: این هفته + label_last_week: هفته پیشین + label_last_n_days: "%{count} روز گذشته" + label_this_month: این ماه + label_last_month: ماه پیشین + label_this_year: امسال + label_date_range: بازه تاریخ + label_less_than_ago: کمتر از چند روز پیشین + label_more_than_ago: بیشتر از چند روز پیشین + label_ago: روز پیشین + label_contains: دارد + label_not_contains: ندارد + label_day_plural: روز + label_repository: بایگانی + label_repository_plural: بایگانی ها + label_browse: مرور و بررسی + label_branch: شاخه + label_tag: برچسب + label_revision: شماره بازنگری + label_revision_plural: شماره بازنگری‌ها + label_revision_id: "بازنگری %{value}" + label_associated_revisions: بازنگری‌های وابسته + label_added: افزوده شده + label_modified: پیراسته شده + label_copied: رونویسی شده + label_renamed: نامگذاری شده + label_deleted: پاکسازی شده + label_latest_revision: آخرین بازنگری‌ + label_latest_revision_plural: آخرین بازنگری‌ها + label_view_revisions: دیدن بازنگری‌ها + label_view_all_revisions: دیدن همه بازنگری‌ها + label_max_size: بیشترین اندازه + label_sort_highest: بردن به آغاز + label_sort_higher: بردن به بالا + label_sort_lower: بردن به پایین + label_sort_lowest: بردن به پایان + label_roadmap: نقشه راه + label_roadmap_due_in: "سررسید در %{value}" + label_roadmap_overdue: "%{value} دیرکرد" + label_roadmap_no_issues: هیچ موردی برای این نگارش نیست + label_search: جستجو + label_result_plural: دست‌آورد + label_all_words: همه واژه‌ها + label_wiki: ویکی + label_wiki_edit: ویرایش ویکی + label_wiki_edit_plural: ویرایش ویکی + label_wiki_page: صفحه ویکی + label_wiki_page_plural: صفحه ویکی + label_index_by_title: شاخص بر اساس نام + label_index_by_date: شاخص بر اساس تاریخ + label_current_version: نگارش کنونی + label_preview: پیش‌نمایش + label_feed_plural: خوراک + label_changes_details: ریز همه جایگذاری‌ها + label_issue_tracking: پیگیری موارد + label_spent_time: زمان صرف شده + label_overall_spent_time: زمان صرف شده روی هم + label_f_hour: "%{value} ساعت" + label_f_hour_plural: "%{value} ساعت" + label_time_tracking: پیگیری زمان + label_change_plural: جایگذاری + label_statistics: سرشماری + label_commits_per_month: تغییر در هر ماه + label_commits_per_author: تغییر هر نویسنده + label_view_diff: دیدن تفاوت‌ها + label_diff_inline: همراستا + label_diff_side_by_side: کنار به کنار + label_options: گزینه‌ها + label_copy_workflow_from: رونویسی گردش کار از روی + label_permissions_report: گزارش مجوز‌ها + label_watched_issues: موردهای دیده‌بانی شده + label_related_issues: موردهای وابسته + label_applied_status: وضعیت به کار رفته + label_loading: بار گذاری... + label_relation_new: وابستگی جدید + label_relation_delete: پاک کردن وابستگی + label_relates_to: وابسته به + label_duplicates: نگارش دیگری از + label_duplicated_by: نگارشی دیگر در + label_blocks: بازداشت‌ها + label_blocked_by: بازداشت به دست + label_precedes: جلوتر است از + label_follows: پستر است از + label_stay_logged_in: وارد شده بمانید + label_disabled: غیرفعال + label_show_completed_versions: نمایش نگارش‌های انجام شده + label_me: من + label_board: انجمن + label_board_new: انجمن جدید + label_board_plural: انجمن + label_board_locked: قفل شده + label_board_sticky: چسبناک + label_topic_plural: سرفصل + label_message_plural: پیام + label_message_last: آخرین پیام + label_message_new: پیام جدید + label_message_posted: پیام افزوده شد + label_reply_plural: پاسخ + label_send_information: فرستادن داده‌های حساب به کاربر + label_year: سال + label_month: ماه + label_week: هفته + label_date_from: از + label_date_to: تا + label_language_based: بر اساس زبان کاربر + label_sort_by: "جور کرد با %{value}" + label_send_test_email: فرستادن ایمیل آزمایشی + label_feeds_access_key: کلید دسترسی Atom + label_missing_feeds_access_key: کلید دسترسی Atom در دسترس نیست + label_feeds_access_key_created_on: "کلید دسترسی Atom %{value} پیش ساخته شده است" + label_module_plural: پودمان ها + label_added_time_by: "افزوده شده به دست %{author} در %{age} پیش" + label_updated_time_by: "بروز شده به دست %{author} در %{age} پیش" + label_updated_time: "بروز شده در %{value} پیش" + label_jump_to_a_project: پرش به یک پروژه... + label_file_plural: پرونده + label_changeset_plural: تغییر + label_default_columns: ستون‌های پیش‌گزیده + label_no_change_option: (بدون تغییر) + label_bulk_edit_selected_issues: ویرایش گروهی‌ موردهای گزینش شده + label_theme: پوسته + label_default: پیش‌گزیده + label_search_titles_only: تنها نام‌ها جستجو شود + label_user_mail_option_all: "برای هر خبر در همه پروژه‌ها" + label_user_mail_option_selected: "برای هر خبر تنها در پروژه‌های گزینش شده..." + label_user_mail_option_none: "هیچ خبری" + label_user_mail_option_only_my_events: "تنها برای چیزهایی که دیده‌بان هستم یا در آن‌ها درگیر هستم" + label_user_mail_no_self_notified: "نمی‌خواهم از تغییراتی که خودم می‌دهم آگاه شوم" + label_registration_activation_by_email: فعالسازی حساب با ایمیل + label_registration_manual_activation: فعالسازی حساب دستی + label_registration_automatic_activation: فعالسازی حساب خودکار + label_display_per_page: "ردیف‌ها در هر صفحه: %{value}" + label_age: سن + label_change_properties: ویرایش ویژگی‌ها + label_general: همگانی + label_scm: SCM + label_plugins: افزونه‌ها + label_ldap_authentication: شناساییLDAP + label_downloads_abbr: دریافت + label_optional_description: توضیحات دلخواه + label_add_another_file: افزودن پرونده دیگر + label_preferences: پسندها + label_chronological_order: به ترتیب تاریخ + label_reverse_chronological_order: برعکس ترتیب تاریخ + label_incoming_emails: ایمیل‌های آمده + label_generate_key: ساخت کلید + label_issue_watchers: دیده‌بان‌ها + label_example: نمونه + label_display: نمایش + label_sort: جور کرد + label_ascending: افزایشی + label_descending: کاهشی + label_date_from_to: از %{start} تا %{end} + label_wiki_content_added: صفحه ویکی افزوده شد + label_wiki_content_updated: صفحه ویکی بروز شد + label_group: گروه + label_group_plural: گروهها + label_group_new: گروه جدید + label_time_entry_plural: زمان های صرف شده + label_version_sharing_none: بدون اشتراک + label_version_sharing_descendants: با زیر پروژه‌ها + label_version_sharing_hierarchy: با رشته پروژه‌ها + label_version_sharing_tree: با درخت پروژه + label_version_sharing_system: با همه پروژه‌ها + label_update_issue_done_ratios: بروز رسانی اندازه انجام شده مورد + label_copy_source: منبع + label_copy_target: مقصد + label_copy_same_as_target: مانند مقصد + label_display_used_statuses_only: تنها وضعیت‌هایی نشان داده شوند که در این ردیاب به کار رفته‌اند + label_api_access_key: کلید دسترسی API + label_missing_api_access_key: کلید دسترسی API در دسترس نیست + label_api_access_key_created_on: "کلید دسترسی API %{value} پیش ساخته شده است" + label_profile: نمایه + label_subtask_plural: زیرکار + label_project_copy_notifications: در هنگام رونویسی پروژه ایمیل‌های آگاه‌سازی را بفرست + label_principal_search: "جستجو برای کاربر یا گروه:" + label_user_search: "جستجو برای کاربر:" + + button_login: ورود + button_submit: ارسال + button_save: ذخیره + button_check_all: گزینش همه + button_uncheck_all: گزینش هیچ + button_delete: پاک + button_create: ساخت + button_create_and_continue: ساخت و ادامه + button_test: آزمایش + button_edit: ویرایش + button_edit_associated_wikipage: "ویرایش صفحه ویکی وابسته: %{page_title}" + button_add: افزودن + button_change: ویرایش + button_apply: انجام + button_clear: پاک + button_lock: گذاشتن قفل + button_unlock: برداشتن قفل + button_download: دریافت + button_list: فهرست + button_view: دیدن + button_move: جابجایی + button_move_and_follow: جابجایی و ادامه + button_back: برگشت + button_cancel: بازگشت + button_activate: فعالسازی + button_sort: جور کرد + button_log_time: زمان‌نویسی + button_rollback: برگرد به این نگارش + button_watch: دیده‌بانی + button_unwatch: نا‌دیده‌بانی + button_reply: پاسخ + button_archive: بایگانی + button_unarchive: برگشت از بایگانی + button_reset: بازنشانی + button_rename: نامگذاری + button_change_password: تغییر گذرواژه + button_copy: رونوشت + button_copy_and_follow: رونوشت و ادامه + button_annotate: یادداشت + button_update: بروز رسانی + button_configure: پیکربندی + button_quote: نقل قول + button_duplicate: نگارش دیگر + button_show: نمایش + + status_active: فعال + status_registered: نام‌نویسی شده + status_locked: قفل + + version_status_open: باز + version_status_locked: قفل + version_status_closed: بسته + + field_active: فعال + + text_select_mail_notifications: فرمان‌هایی که برای آن‌ها باید ایمیل فرستاده شود را برگزینید. + text_regexp_info: برای نمونه ^[A-Z0-9]+$ + text_min_max_length_info: 0 یعنی بدون کران + text_project_destroy_confirmation: آیا براستی می‌خواهید این پروژه و همه داده‌های آن را پاک کنید؟ + text_subprojects_destroy_warning: "زیرپروژه‌های آن: %{value} هم پاک خواهند شد." + text_workflow_edit: یک نقش و یک ردیاب را برای ویرایش گردش کار برگزینید + text_are_you_sure: آیا این کار انجام شود؟ + text_journal_changed: "«%{label}» از «%{old}» به «%{new}» جایگزین شد" + text_journal_set_to: "«%{label}» به «%{value}» تغییر یافت" + text_journal_deleted: "«%{label}» پاک شد (%{old})" + text_journal_added: "«%{label}»، «%{value}» را افزود" + text_tip_task_begin_day: روز آغاز مورد + text_tip_task_end_day: روز پایان مورد + text_tip_task_begin_end_day: روز آغاز و پایان مورد + text_caracters_maximum: "بیشترین اندازه %{count} است." + text_caracters_minimum: "کمترین اندازه %{count} است." + text_length_between: "باید میان %{min} و %{max} نویسه باشد." + text_tracker_no_workflow: هیچ گردش کاری برای این ردیاب مشخص نشده است + text_unallowed_characters: نویسه‌های ناپسند + text_comma_separated: چند مقدار پذیرفتنی است (با «,» از هم جدا شوند). + text_line_separated: چند مقدار پذیرفتنی است (هر مقدار در یک خط). + text_issues_ref_in_commit_messages: نشانه روی و بستن موردها در پیام‌های بایگانی + text_issue_added: "مورد %{id} به دست %{author} گزارش شد." + text_issue_updated: "مورد %{id} به دست %{author} بروز شد." + text_wiki_destroy_confirmation: آیا براستی می‌خواهید این ویکی و همه محتوای آن را پاک کنید؟ + text_issue_category_destroy_question: "برخی موردها (%{count}) به این دسته بندی واگذار شده‌اند. می‌خواهید چه کنید؟" + text_issue_category_destroy_assignments: پاک کردن واگذاریها به دسته بندی موارد + text_issue_category_reassign_to: واگذاری دوباره موردها به این دسته بندی + text_user_mail_option: "برای پروژه‌های گزینش نشده، تنها ایمیل‌هایی درباره چیزهایی که دیده‌بان یا درگیر آن‌ها هستید دریافت خواهید کرد (مانند موردهایی که نویسنده آن‌ها هستید یا به شما واگذار شده‌اند)." + text_no_configuration_data: "نقش‌ها، ردیابها، وضعیت‌های مورد و گردش کار هنوز پیکربندی نشده‌اند. \nبه سختی پیشنهاد می‌شود که پیکربندی پیش‌گزیده را بار کنید. سپس می‌توانید آن را ویرایش کنید." + text_load_default_configuration: بارگذاری پیکربندی پیش‌گزیده + text_status_changed_by_changeset: "در تغییر %{value} بروز شده است." + text_time_logged_by_changeset: "در تغییر %{value} نوشته شده است." + text_issues_destroy_confirmation: 'آیا براستی می‌خواهید موردهای گزینش شده را پاک کنید؟' + text_select_project_modules: 'پودمان هایی که باید برای این پروژه فعال شوند را برگزینید:' + text_default_administrator_account_changed: حساب مدیریت پیش‌گزیده جایگزین شد + text_file_repository_writable: پوشه پیوست‌ها نوشتنی است + text_plugin_assets_writable: پوشه دارایی‌های افزونه‌ها نوشتنی است + text_rmagick_available: RMagick در دسترس است (اختیاری) + text_destroy_time_entries_question: "%{hours} ساعت روی موردهایی که می‌خواهید پاک کنید کار گزارش شده است. می‌خواهید چه کنید؟" + text_destroy_time_entries: ساعت‌های گزارش شده پاک شوند + text_assign_time_entries_to_project: ساعت‌های گزارش شده به پروژه واگذار شوند + text_reassign_time_entries: 'ساعت‌های گزارش شده به این مورد واگذار شوند:' + text_user_wrote: "%{value} نوشت:" + text_enumeration_destroy_question: "%{count} داده به این برشمردنی وابسته شده‌اند." + text_enumeration_category_reassign_to: 'به این برشمردنی وابسته شوند:' + text_email_delivery_not_configured: "دریافت ایمیل پیکربندی نشده است و آگاه‌سازی‌ها غیر فعال هستند.\nکارگزار SMTP خود را در config/configuration.yml پیکربندی کنید و برنامه را بازنشانی کنید تا فعال شوند." + text_repository_usernames_mapping: "کاربر Redmine که به هر نام کاربری پیام‌های بایگانی نگاشت می‌شود را برگزینید.\nکاربرانی که نام کاربری یا ایمیل همسان دارند، خود به خود نگاشت می‌شوند." + text_diff_truncated: '... این تفاوت بریده شده چون بیشتر از بیشترین اندازه نمایش دادنی است.' + text_custom_field_possible_values_info: 'یک خط برای هر مقدار' + text_wiki_page_destroy_question: "این صفحه %{descendants} زیرصفحه دارد.می‌خواهید چه کنید؟" + text_wiki_page_nullify_children: "زیرصفحه‌ها صفحه ریشه شوند" + text_wiki_page_destroy_children: "زیرصفحه‌ها و زیرصفحه‌های آن‌ها پاک شوند" + text_wiki_page_reassign_children: "زیرصفحه‌ها به زیر این صفحه پدر بروند" + text_own_membership_delete_confirmation: "شما دارید برخی یا همه مجوز‌های خود را برمی‌دارید و شاید پس از این دیگر نتوانید این پروژه را ویرایش کنید.\nآیا می‌خواهید این کار را بکنید؟" + text_zoom_in: درشتنمایی + text_zoom_out: ریزنمایی + + default_role_manager: مدیر سایت + default_role_developer: برنامه‌نویس + default_role_reporter: گزارش‌دهنده + default_tracker_bug: ایراد + default_tracker_feature: ویژگی + default_tracker_support: پشتیبانی + default_issue_status_new: جدید + default_issue_status_in_progress: در گردش + default_issue_status_resolved: درست شده + default_issue_status_feedback: بازخورد + default_issue_status_closed: بسته + default_issue_status_rejected: برگشت خورده + default_doc_category_user: مستندات کاربر + default_doc_category_tech: مستندات فنی + default_priority_low: پایین + default_priority_normal: میانه + default_priority_high: بالا + default_priority_urgent: زود + default_priority_immediate: بیدرنگ + default_activity_design: طراحی + default_activity_development: ساخت + + enumeration_issue_priorities: اولویت‌های مورد + enumeration_doc_categories: دسته بندی‌های مستندات + enumeration_activities: فعالیت ها (پیگیری زمان) + enumeration_system_activity: فعالیت سیستمی + + text_tip_issue_begin_day: مورد در این روز آغاز می‌شود + field_warn_on_leaving_unsaved: هنگام ترک صفحه‌ای که نوشته‌های آن ذخیره نشده، به من هشدار بده + text_tip_issue_begin_end_day: مورد در این روز آغاز می‌شود و پایان می‌پذیرد + text_tip_issue_end_day: مورد در این روز پایان می‌پذیرد + text_warn_on_leaving_unsaved: این صفحه دارای نوشته‌های ذخیره نشده است که اگر آن را ترک کنید، از میان می‌روند. + label_my_queries: جستارهای سفارشی خودم + text_journal_changed_no_detail: "%{label} بروز شد" + label_news_comment_added: نظر شخصی به مجموعه اخبار افزوده شد + button_expand_all: باز کردن همه + button_collapse_all: بستن همه + label_additional_workflow_transitions_for_assignee: زمانی که به فرد مسئول، گذارهای بیشتر پذیرفته می‌شود + label_additional_workflow_transitions_for_author: زمانی که کاربر نویسنده است، گذارهای بیشتر پذیرفته می‌شود + label_bulk_edit_selected_time_entries: ویرایش گروهی زمان‌های گزارش شده گزینش شده + text_time_entries_destroy_confirmation: آیا می‌خواهید زمان‌های گزارش شده گزینش شده پاک شوند؟ + label_role_anonymous: ناشناس + label_role_non_member: غیر همکار + label_issue_note_added: یادداشت افزوده شد + label_issue_status_updated: وضعیت بروز شد + label_issue_priority_updated: اولویت بروز شد + label_issues_visibility_own: موردهای ایجاد شده تو سط خود کاربر و یا محول شده به وی + field_issues_visibility: امکان مشاهده موارد + label_issues_visibility_all: همه موارد + permission_set_own_issues_private: اجازه دارد موردهای خود را خصوصی یا عمومی نماید + field_is_private: خصوصی + permission_set_issues_private: اجازه دارد موردها را خصوصی یا عمومی نماید + label_issues_visibility_public: همه موردهای غیر خصوصی + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: کدگذاری پیام‌های بایگانی + field_scm_path_encoding: Path encoding نحوه کدگذاری مسیر یا + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: مسیر بایگانی + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 مورد + one: 1 مورد + other: "%{count} مورد" + label_repository_new: بایگانی جدید + field_repository_is_default: بایگانی پیش گزیده + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: .مهلت اعتبار ارتباط شما با سایت پایان یافته، لطفا دوباره وارد شوید + text_session_expiration_settings: "اخطار: تغییر در این تنظیمات ممکن است منجر به انقضای اعتبار جلسات افراد از جمله خود شما شود" + setting_session_lifetime: حداکثر زمان حفظ برقراری ارتباط با سایت + setting_session_timeout: مدت زمان ارتباط بدون فعالیت + label_session_expiration: انقضای ارتباط با سایت + permission_close_project: باز یا بستن پروژه + label_show_closed_projects: نمایش پروژه های بسته شده + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: نحوه تغییر وضعیت مورد + label_fields_permissions: مجوز فیلدها + label_readonly: فقط خواندنی + label_required: الزامی + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: از فرم پروژه -- %{name} + label_attribute_of_author: از فرم نویسنده -- %{name} + label_attribute_of_assigned_to: از فرم فرد مسئول -- %{name} + label_attribute_of_fixed_version: از فرم نگارش -- %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: مواردی که کپی شده اند به + label_copied_from: مواردی که کپی شده اند از + label_any_issues_in_project: کلیه مواردی که در این پروژه باشند + label_any_issues_not_in_project: کلیه مواردی که در این پروژه نباشند + field_private_notes: یادداشت های خصوصی + permission_view_private_notes: مشاهده یادداشت های خصوصی + permission_set_notes_private: می تواند یادداشت ها را خصوصی کند + label_no_issues_in_project: هیچ موردی در این پروژه وجود نداشته باشد + label_any: همه + label_last_n_weeks: هفته اخیر %{count} + setting_cross_project_subtasks: مجوز تعریف فعالیت های بین پروژه ای + label_cross_project_descendants: با زیر پروژه‌ها + label_cross_project_tree: با درخت پروژه + label_cross_project_hierarchy: با رشته پروژه‌ها + label_cross_project_system: با همه پروژه‌ها + button_hide: Hide + setting_non_working_week_days: روزهای غیرکاری + label_in_the_next_days: در روزهای بعد + label_in_the_past_days: در روزهای گذشته + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: همکاران هم بصورت موروثی منتقل شوند + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: کل زمان + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: ایمیل + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: زمان صرف شده روی هم + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: کلید API + setting_lost_password: بازیافت گذرواژه + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/fi.yml b/config/locales/fi.yml new file mode 100644 index 0000000..7d69d6c --- /dev/null +++ b/config/locales/fi.yml @@ -0,0 +1,1251 @@ +# Finnish translations for Ruby on Rails +# by Marko Seppä (marko.seppa@gmail.com) + +fi: + direction: ltr + date: + formats: + default: "%e. %Bta %Y" + long: "%A%e. %Bta %Y" + short: "%e.%m.%Y" + + day_names: [Sunnuntai, Maanantai, Tiistai, Keskiviikko, Torstai, Perjantai, Lauantai] + abbr_day_names: [Su, Ma, Ti, Ke, To, Pe, La] + month_names: [~, Tammikuu, Helmikuu, Maaliskuu, Huhtikuu, Toukokuu, Kesäkuu, Heinäkuu, Elokuu, Syyskuu, Lokakuu, Marraskuu, Joulukuu] + abbr_month_names: [~, Tammi, Helmi, Maalis, Huhti, Touko, Kesä, Heinä, Elo, Syys, Loka, Marras, Joulu] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %e. %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%e. %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "aamupäivä" + pm: "iltapäivä" + + support: + array: + words_connector: ", " + two_words_connector: " ja " + last_word_connector: " ja " + + + + number: + format: + separator: "," + delimiter: "." + precision: 3 + + currency: + format: + format: "%n %u" + unit: "€" + separator: "," + delimiter: "." + precision: 2 + + percentage: + format: + # separator: + delimiter: "" + # precision: + + precision: + format: + # separator: + delimiter: "" + # precision: + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Tavua" + other: "Tavua" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + datetime: + distance_in_words: + half_a_minute: "puoli minuuttia" + less_than_x_seconds: + one: "aiemmin kuin sekunti" + other: "aiemmin kuin %{count} sekuntia" + x_seconds: + one: "sekunti" + other: "%{count} sekuntia" + less_than_x_minutes: + one: "aiemmin kuin minuutti" + other: "aiemmin kuin %{count} minuuttia" + x_minutes: + one: "minuutti" + other: "%{count} minuuttia" + about_x_hours: + one: "noin tunti" + other: "noin %{count} tuntia" + x_hours: + one: "1 tunti" + other: "%{count} tuntia" + x_days: + one: "päivä" + other: "%{count} päivää" + about_x_months: + one: "noin kuukausi" + other: "noin %{count} kuukautta" + x_months: + one: "kuukausi" + other: "%{count} kuukautta" + about_x_years: + one: "vuosi" + other: "noin %{count} vuotta" + over_x_years: + one: "yli vuosi" + other: "yli %{count} vuotta" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + prompts: + year: "Vuosi" + month: "Kuukausi" + day: "Päivä" + hour: "Tunti" + minute: "Minuutti" + second: "Sekuntia" + + activerecord: + errors: + template: + header: + one: "1 virhe esti tämän %{model} mallinteen tallentamisen" + other: "%{count} virhettä esti tämän %{model} mallinteen tallentamisen" + body: "Seuraavat kentät aiheuttivat ongelmia:" + messages: + inclusion: "ei löydy listauksesta" + exclusion: "on jo varattu" + invalid: "on kelvoton" + confirmation: "ei vastaa varmennusta" + accepted: "täytyy olla hyväksytty" + empty: "ei voi olla tyhjä" + blank: "ei voi olla sisällötön" + too_long: "on liian pitkä (maksimi on %{count} merkkiä)" + too_short: "on liian lyhyt (minimi on %{count} merkkiä)" + wrong_length: "on väärän pituinen (täytyy olla täsmälleen %{count} merkkiä)" + taken: "on jo käytössä" + not_a_number: "ei ole numero" + greater_than: "täytyy olla suurempi kuin %{count}" + greater_than_or_equal_to: "täytyy olla suurempi tai yhtä suuri kuin%{count}" + equal_to: "täytyy olla yhtä suuri kuin %{count}" + less_than: "täytyy olla pienempi kuin %{count}" + less_than_or_equal_to: "täytyy olla pienempi tai yhtä suuri kuin %{count}" + odd: "täytyy olla pariton" + even: "täytyy olla parillinen" + greater_than_start_date: "tulee olla aloituspäivän jälkeinen" + not_same_project: "ei kuulu samaan projektiin" + circular_dependency: "Tämä suhde loisi kehän." + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Valitse, ole hyvä + + general_text_No: 'Ei' + general_text_Yes: 'Kyllä' + general_text_no: 'ei' + general_text_yes: 'kyllä' + general_lang_name: 'Finnish (Suomi)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-15 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Tilin päivitys onnistui. + notice_account_invalid_credentials: Virheellinen käyttäjätunnus tai salasana + notice_account_password_updated: Salasanan päivitys onnistui. + notice_account_wrong_password: Väärä salasana + notice_account_register_done: Tilin luonti onnistui. Aktivoidaksesi tilin seuraa linkkiä joka välitettiin sähköpostiisi. + notice_account_unknown_email: Tuntematon käyttäjä. + notice_can_t_change_password: Tämä tili käyttää ulkoista tunnistautumisjärjestelmää. Salasanaa ei voi muuttaa. + notice_account_lost_email_sent: Sinulle on lähetetty sähköposti jossa on ohje kuinka vaihdat salasanasi. + notice_account_activated: Tilisi on nyt aktivoitu, voit kirjautua sisälle. + notice_successful_create: Luonti onnistui. + notice_successful_update: Päivitys onnistui. + notice_successful_delete: Poisto onnistui. + notice_successful_connection: Yhteyden muodostus onnistui. + notice_file_not_found: Hakemaasi sivua ei löytynyt tai se on poistettu. + notice_locking_conflict: Toinen käyttäjä on päivittänyt tiedot. + notice_not_authorized: Sinulla ei ole oikeutta näyttää tätä sivua. + notice_email_sent: "Sähköposti on lähetty osoitteeseen %{value}" + notice_email_error: "Sähköpostilähetyksessä tapahtui virhe (%{value})" + notice_feeds_access_key_reseted: Atom salasana on nollaantunut. + notice_failed_to_save_issues: "%{count} Tapahtum(an/ien) tallennus epäonnistui %{total} valitut: %{ids}." + notice_no_issue_selected: "Tapahtumia ei ole valittu! Valitse tapahtumat joita haluat muokata." + notice_account_pending: "Tilisi on luotu ja odottaa ylläpitäjän hyväksyntää." + notice_default_data_loaded: Vakioasetusten palautus onnistui. + + error_can_t_load_default_data: "Vakioasetuksia ei voitu ladata: %{value}" + error_scm_not_found: "Syötettä ja/tai versiota ei löydy tietovarastosta." + error_scm_command_failed: "Tietovarastoon pääsyssä tapahtui virhe: %{value}" + + mail_subject_lost_password: "Sinun %{value} salasanasi" + mail_body_lost_password: 'Vaihtaaksesi salasanasi, napsauta seuraavaa linkkiä:' + mail_subject_register: "%{value} tilin aktivointi" + mail_body_register: 'Aktivoidaksesi tilisi, napsauta seuraavaa linkkiä:' + mail_body_account_information_external: "Voit nyt käyttää %{value} tiliäsi kirjautuaksesi järjestelmään." + mail_body_account_information: Sinun tilin tiedot + mail_subject_account_activation_request: "%{value} tilin aktivointi pyyntö" + mail_body_account_activation_request: "Uusi käyttäjä (%{value}) on rekisteröitynyt. Hänen tili odottaa hyväksyntääsi:" + + + field_name: Nimi + field_description: Kuvaus + field_summary: Yhteenveto + field_is_required: Vaaditaan + field_firstname: Etunimi + field_lastname: Sukunimi + field_mail: Sähköposti + field_filename: Tiedosto + field_filesize: Koko + field_downloads: Latausta + field_author: Tekijä + field_created_on: Luotu + field_updated_on: Päivitetty + field_field_format: Muoto + field_is_for_all: Kaikille projekteille + field_possible_values: Mahdolliset arvot + field_regexp: Säännöllinen lauseke (reg exp) + field_min_length: Minimipituus + field_max_length: Maksimipituus + field_value: Arvo + field_category: Luokka + field_title: Otsikko + field_project: Projekti + field_issue: Tapahtuma + field_status: Tila + field_notes: Muistiinpanot + field_is_closed: Tapahtuma suljettu + field_is_default: Vakioarvo + field_tracker: Tapahtuma + field_subject: Aihe + field_due_date: Määräaika + field_assigned_to: Nimetty + field_priority: Prioriteetti + field_fixed_version: Kohdeversio + field_user: Käyttäjä + field_role: Rooli + field_homepage: Kotisivu + field_is_public: Julkinen + field_parent: Aliprojekti + field_is_in_roadmap: Tapahtumat näytetään roadmap näkymässä + field_login: Kirjautuminen + field_mail_notification: Sähköposti muistutukset + field_admin: Ylläpitäjä + field_last_login_on: Viimeinen yhteys + field_language: Kieli + field_effective_date: Päivä + field_password: Salasana + field_new_password: Uusi salasana + field_password_confirmation: Vahvistus + field_version: Versio + field_type: Tyyppi + field_host: Verkko-osoite + field_port: Portti + field_account: Tili + field_base_dn: Base DN + field_attr_login: Kirjautumismääre + field_attr_firstname: Etuminenmääre + field_attr_lastname: Sukunimenmääre + field_attr_mail: Sähköpostinmääre + field_onthefly: Automaattinen käyttäjien luonti + field_start_date: Alku + field_done_ratio: "% Tehty" + field_auth_source: Varmennusmuoto + field_hide_mail: Piiloita sähköpostiosoitteeni + field_comments: Kommentti + field_url: URL + field_start_page: Aloitussivu + field_subproject: Aliprojekti + field_hours: Tuntia + field_activity: Historia + field_spent_on: Päivä + field_identifier: Tunniste + field_is_filter: Käytetään suodattimena + field_issue_to: Liittyvä tapahtuma + field_delay: Viive + field_assignable: Tapahtumia voidaan nimetä tälle roolille + field_redirect_existing_links: Uudelleenohjaa olemassa olevat linkit + field_estimated_hours: Arvioitu aika + field_column_names: Saraketta + field_time_zone: Aikavyöhyke + field_searchable: Haettava + field_default_value: Vakioarvo + + setting_app_title: Ohjelman otsikko + setting_app_subtitle: Ohjelman alaotsikko + setting_welcome_text: Tervehdysteksti + setting_default_language: Vakiokieli + setting_login_required: Pakollinen kirjautuminen + setting_self_registration: Itserekisteröinti + setting_attachment_max_size: Liitteen maksimikoko + setting_issues_export_limit: Tapahtumien vientirajoite + setting_mail_from: Lähettäjän sähköpostiosoite + setting_bcc_recipients: Vastaanottajat piilokopiona (bcc) + setting_host_name: Verkko-osoite + setting_text_formatting: Tekstin muotoilu + setting_wiki_compression: Wiki historian pakkaus + setting_feeds_limit: Syötteen sisällön raja + setting_autofetch_changesets: Automaattisten muutosjoukkojen haku + setting_sys_api_enabled: Salli WS tietovaraston hallintaan + setting_commit_ref_keywords: Viittaavat hakusanat + setting_commit_fix_keywords: Korjaavat hakusanat + setting_autologin: Automaatinen kirjautuminen + setting_date_format: Päivän muoto + setting_time_format: Ajan muoto + setting_cross_project_issue_relations: Salli projektien väliset tapahtuminen suhteet + setting_issue_list_default_columns: Vakiosarakkeiden näyttö tapahtumalistauksessa + setting_emails_footer: Sähköpostin alatunniste + setting_protocol: Protokolla + setting_per_page_options: Sivun objektien määrän asetukset + + label_user: Käyttäjä + label_user_plural: Käyttäjät + label_user_new: Uusi käyttäjä + label_project: Projekti + label_project_new: Uusi projekti + label_project_plural: Projektit + label_x_projects: + zero: no projects + one: 1 project + other: "%{count} projects" + label_project_all: Kaikki projektit + label_project_latest: Uusimmat projektit + label_issue: Tapahtuma + label_issue_new: Uusi tapahtuma + label_issue_plural: Tapahtumat + label_issue_view_all: Näytä kaikki tapahtumat + label_issues_by: "Tapahtumat %{value}" + label_document: Dokumentti + label_document_new: Uusi dokumentti + label_document_plural: Dokumentit + label_role: Rooli + label_role_plural: Roolit + label_role_new: Uusi rooli + label_role_and_permissions: Roolit ja oikeudet + label_member: Jäsen + label_member_new: Uusi jäsen + label_member_plural: Jäsenet + label_tracker: Tapahtuma + label_tracker_plural: Tapahtumat + label_tracker_new: Uusi tapahtuma + label_workflow: Työnkulku + label_issue_status: Tapahtuman tila + label_issue_status_plural: Tapahtumien tilat + label_issue_status_new: Uusi tila + label_issue_category: Tapahtumaluokka + label_issue_category_plural: Tapahtumaluokat + label_issue_category_new: Uusi luokka + label_custom_field: Räätälöity kenttä + label_custom_field_plural: Räätälöidyt kentät + label_custom_field_new: Uusi räätälöity kenttä + label_enumerations: Lista + label_enumeration_new: Uusi arvo + label_information: Tieto + label_information_plural: Tiedot + label_please_login: Kirjaudu ole hyvä + label_register: Rekisteröidy + label_password_lost: Hukattu salasana + label_home: Koti + label_my_page: Omasivu + label_my_account: Oma tili + label_my_projects: Omat projektit + label_administration: Ylläpito + label_login: Kirjaudu sisään + label_logout: Kirjaudu ulos + label_help: Ohjeet + label_reported_issues: Raportoidut tapahtumat + label_assigned_to_me_issues: Minulle nimetyt tapahtumat + label_last_login: Viimeinen yhteys + label_registered_on: Rekisteröity + label_activity: Historia + label_new: Uusi + label_logged_as: Kirjauduttu nimellä + label_environment: Ympäristö + label_authentication: Varmennus + label_auth_source: Varmennustapa + label_auth_source_new: Uusi varmennustapa + label_auth_source_plural: Varmennustavat + label_subproject_plural: Aliprojektit + label_min_max_length: Min - Max pituudet + label_list: Lista + label_date: Päivä + label_integer: Kokonaisluku + label_float: Liukuluku + label_boolean: Totuusarvomuuttuja + label_string: Merkkijono + label_text: Pitkä merkkijono + label_attribute: Määre + label_attribute_plural: Määreet + label_no_data: Ei tietoa näytettäväksi + label_change_status: Muutos tila + label_history: Historia + label_attachment: Tiedosto + label_attachment_new: Uusi tiedosto + label_attachment_delete: Poista tiedosto + label_attachment_plural: Tiedostot + label_report: Raportti + label_report_plural: Raportit + label_news: Uutinen + label_news_new: Lisää uutinen + label_news_plural: Uutiset + label_news_latest: Viimeisimmät uutiset + label_news_view_all: Näytä kaikki uutiset + label_settings: Asetukset + label_overview: Yleiskatsaus + label_version: Versio + label_version_new: Uusi versio + label_version_plural: Versiot + label_confirmation: Vahvistus + label_export_to: Vie + label_read: Lukee... + label_public_projects: Julkiset projektit + label_open_issues: avoin, yhteensä + label_open_issues_plural: avointa, yhteensä + label_closed_issues: suljettu + label_closed_issues_plural: suljettua + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_total: Yhteensä + label_permissions: Oikeudet + label_current_status: Nykyinen tila + label_new_statuses_allowed: Uudet tilat sallittu + label_all: kaikki + label_none: ei mitään + label_nobody: ei kukaan + label_next: Seuraava + label_previous: Edellinen + label_used_by: Käytetty + label_details: Yksityiskohdat + label_add_note: Lisää muistiinpano + label_calendar: Kalenteri + label_months_from: kuukauden päässä + label_gantt: Gantt + label_internal: Sisäinen + label_last_changes: "viimeiset %{count} muutokset" + label_change_view_all: Näytä kaikki muutokset + label_comment: Kommentti + label_comment_plural: Kommentit + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_comment_add: Lisää kommentti + label_comment_added: Kommentti lisätty + label_comment_delete: Poista kommentti + label_query: Räätälöity haku + label_query_plural: Räätälöidyt haut + label_query_new: Uusi haku + label_filter_add: Lisää suodatin + label_filter_plural: Suodattimet + label_equals: sama kuin + label_not_equals: eri kuin + label_in_less_than: pienempi kuin + label_in_more_than: suurempi kuin + label_today: tänään + label_this_week: tällä viikolla + label_less_than_ago: vähemmän kuin päivää sitten + label_more_than_ago: enemän kuin päivää sitten + label_ago: päiviä sitten + label_contains: sisältää + label_not_contains: ei sisällä + label_day_plural: päivää + label_repository: Tietovarasto + label_repository_plural: Tietovarastot + label_browse: Selaus + label_revision: Versio + label_revision_plural: Versiot + label_added: lisätty + label_modified: muokattu + label_deleted: poistettu + label_latest_revision: Viimeisin versio + label_latest_revision_plural: Viimeisimmät versiot + label_view_revisions: Näytä versiot + label_max_size: Suurin koko + label_sort_highest: Siirrä ylimmäiseksi + label_sort_higher: Siirrä ylös + label_sort_lower: Siirrä alas + label_sort_lowest: Siirrä alimmaiseksi + label_roadmap: Roadmap + label_roadmap_due_in: "Määräaika %{value}" + label_roadmap_overdue: "%{value} myöhässä" + label_roadmap_no_issues: Ei tapahtumia tälle versiolle + label_search: Haku + label_result_plural: Tulokset + label_all_words: kaikki sanat + label_wiki: Wiki + label_wiki_edit: Wiki muokkaus + label_wiki_edit_plural: Wiki muokkaukset + label_wiki_page: Wiki sivu + label_wiki_page_plural: Wiki sivut + label_index_by_title: Hakemisto otsikoittain + label_index_by_date: Hakemisto päivittäin + label_current_version: Nykyinen versio + label_preview: Esikatselu + label_feed_plural: Syötteet + label_changes_details: Kaikkien muutosten yksityiskohdat + label_issue_tracking: Tapahtumien seuranta + label_spent_time: Käytetty aika + label_f_hour: "%{value} tunti" + label_f_hour_plural: "%{value} tuntia" + label_time_tracking: Ajan seuranta + label_change_plural: Muutokset + label_statistics: Tilastot + label_commits_per_month: Tapahtumaa per kuukausi + label_commits_per_author: Tapahtumaa per tekijä + label_view_diff: Näytä erot + label_diff_inline: sisällössä + label_diff_side_by_side: vierekkäin + label_options: Valinnat + label_copy_workflow_from: Kopioi työnkulku + label_permissions_report: Oikeuksien raportti + label_watched_issues: Seurattavat tapahtumat + label_related_issues: Liittyvät tapahtumat + label_applied_status: Lisätty tila + label_loading: Lataa... + label_relation_new: Uusi suhde + label_relation_delete: Poista suhde + label_relates_to: liittyy + label_duplicates: kopio + label_blocks: estää + label_blocked_by: estetty + label_precedes: edeltää + label_follows: seuraa + label_stay_logged_in: Pysy kirjautuneena + label_disabled: poistettu käytöstä + label_show_completed_versions: Näytä valmiit versiot + label_me: minä + label_board: Keskustelupalsta + label_board_new: Uusi keskustelupalsta + label_board_plural: Keskustelupalstat + label_topic_plural: Aiheet + label_message_plural: Viestit + label_message_last: Viimeisin viesti + label_message_new: Uusi viesti + label_reply_plural: Vastaukset + label_send_information: Lähetä tilin tiedot käyttäjälle + label_year: Vuosi + label_month: Kuukausi + label_week: Viikko + label_language_based: Pohjautuen käyttäjän kieleen + label_sort_by: "Lajittele %{value}" + label_send_test_email: Lähetä testi sähköposti + label_feeds_access_key_created_on: "Atom salasana luotiin %{value} sitten" + label_module_plural: Moduulit + label_added_time_by: "Lisännyt %{author} %{age} sitten" + label_updated_time: "Päivitetty %{value} sitten" + label_jump_to_a_project: Siirry projektiin... + label_file_plural: Tiedostot + label_changeset_plural: Muutosryhmät + label_default_columns: Vakiosarakkeet + label_no_change_option: (Ei muutosta) + label_bulk_edit_selected_issues: Perusmuotoile valitut tapahtumat + label_theme: Teema + label_default: Vakio + label_search_titles_only: Hae vain otsikot + label_user_mail_option_all: "Kaikista tapahtumista kaikissa projekteistani" + label_user_mail_option_selected: "Kaikista tapahtumista vain valitsemistani projekteista..." + label_user_mail_no_self_notified: "En halua muistutusta muutoksista joita itse teen" + label_registration_activation_by_email: tilin aktivointi sähköpostitse + label_registration_manual_activation: tilin aktivointi käsin + label_registration_automatic_activation: tilin aktivointi automaattisesti + label_display_per_page: "Per sivu: %{value}" + label_age: Ikä + label_change_properties: Vaihda asetuksia + label_general: Yleinen + + button_login: Kirjaudu + button_submit: Lähetä + button_save: Tallenna + button_check_all: Valitse kaikki + button_uncheck_all: Poista valinnat + button_delete: Poista + button_create: Luo + button_test: Testaa + button_edit: Muokkaa + button_add: Lisää + button_change: Muuta + button_apply: Ota käyttöön + button_clear: Tyhjää + button_lock: Lukitse + button_unlock: Vapauta + button_download: Lataa + button_list: Lista + button_view: Näytä + button_move: Siirrä + button_back: Takaisin + button_cancel: Peruuta + button_activate: Aktivoi + button_sort: Järjestä + button_log_time: Seuraa aikaa + button_rollback: Siirry takaisin tähän versioon + button_watch: Seuraa + button_unwatch: Älä seuraa + button_reply: Vastaa + button_archive: Arkistoi + button_unarchive: Palauta + button_reset: Nollaus + button_rename: Uudelleen nimeä + button_change_password: Vaihda salasana + button_copy: Kopioi + button_annotate: Lisää selitys + button_update: Päivitä + + status_active: aktiivinen + status_registered: rekisteröity + status_locked: lukittu + + text_select_mail_notifications: Valitse tapahtumat joista tulisi lähettää sähköpostimuistutus. + text_regexp_info: esim. ^[A-Z0-9]+$ + text_min_max_length_info: 0 tarkoittaa, ei rajoitusta + text_project_destroy_confirmation: Oletko varma että haluat poistaa tämän projektin ja kaikki siihen kuuluvat tiedot? + text_workflow_edit: Valitse rooli ja tapahtuma muokataksesi työnkulkua + text_are_you_sure: Oletko varma? + text_tip_issue_begin_day: tehtävä joka alkaa tänä päivänä + text_tip_issue_end_day: tehtävä joka loppuu tänä päivänä + text_tip_issue_begin_end_day: tehtävä joka alkaa ja loppuu tänä päivänä + text_caracters_maximum: "%{count} merkkiä enintään." + text_caracters_minimum: "Täytyy olla vähintään %{count} merkkiä pitkä." + text_length_between: "Pituus välillä %{min} ja %{max} merkkiä." + text_tracker_no_workflow: Työnkulkua ei määritelty tälle tapahtumalle + text_unallowed_characters: Kiellettyjä merkkejä + text_comma_separated: Useat arvot sallittu (pilkku eroteltuna). + text_issues_ref_in_commit_messages: Liitän ja korjaan ongelmia syötetyssä viestissä + text_issue_added: "Issue %{id} has been reported by %{author}." + text_issue_updated: "Issue %{id} has been updated by %{author}." + text_wiki_destroy_confirmation: Oletko varma että haluat poistaa tämän wiki:n ja kaikki sen sisältämän tiedon? + text_issue_category_destroy_question: "Jotkut tapahtumat (%{count}) ovat nimetty tälle luokalle. Mitä haluat tehdä?" + text_issue_category_destroy_assignments: Poista luokan tehtävät + text_issue_category_reassign_to: Vaihda tapahtuma tähän luokkaan + text_user_mail_option: "Valitsemattomille projekteille, saat vain muistutuksen asioista joita seuraat tai olet mukana (esim. tapahtumat joissa olet tekijä tai nimettynä)." + text_no_configuration_data: "Rooleja, tapahtumien tiloja ja työnkulkua ei vielä olla määritelty.\nOn erittäin suotavaa ladata vakioasetukset. Voit muuttaa sitä latauksen jälkeen." + text_load_default_configuration: Lataa vakioasetukset + + default_role_manager: Päälikkö + default_role_developer: Kehittäjä + default_role_reporter: Tarkastelija + default_tracker_bug: Ohjelmointivirhe + default_tracker_feature: Ominaisuus + default_tracker_support: Tuki + default_issue_status_new: Uusi + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Hyväksytty + default_issue_status_feedback: Palaute + default_issue_status_closed: Suljettu + default_issue_status_rejected: Hylätty + default_doc_category_user: Käyttäjä dokumentaatio + default_doc_category_tech: Tekninen dokumentaatio + default_priority_low: Matala + default_priority_normal: Normaali + default_priority_high: Korkea + default_priority_urgent: Kiireellinen + default_priority_immediate: Valitön + default_activity_design: Suunnittelu + default_activity_development: Kehitys + + enumeration_issue_priorities: Tapahtuman tärkeysjärjestys + enumeration_doc_categories: Dokumentin luokat + enumeration_activities: Historia (ajan seuranta) + label_associated_revisions: Liittyvät versiot + setting_user_format: Käyttäjien esitysmuoto + text_status_changed_by_changeset: "Päivitetty muutosversioon %{value}." + text_issues_destroy_confirmation: 'Oletko varma että haluat poistaa valitut tapahtumat ?' + label_issue_added: Tapahtuma lisätty + label_issue_updated: Tapahtuma päivitetty + label_document_added: Dokumentti lisätty + label_message_posted: Viesti lisätty + label_file_added: Tiedosto lisätty + label_scm: SCM + text_select_project_modules: 'Valitse modulit jotka haluat käyttöön tähän projektiin:' + label_news_added: Uutinen lisätty + project_module_boards: Keskustelupalsta + project_module_issue_tracking: Tapahtuman seuranta + project_module_wiki: Wiki + project_module_files: Tiedostot + project_module_documents: Dokumentit + project_module_repository: Tietovarasto + project_module_news: Uutiset + project_module_time_tracking: Ajan seuranta + text_file_repository_writable: Kirjoitettava tiedostovarasto + text_default_administrator_account_changed: Vakio hallinoijan tunnus muutettu + text_rmagick_available: RMagick saatavilla (valinnainen) + button_configure: Asetukset + label_plugins: Lisäosat + label_ldap_authentication: LDAP tunnistautuminen + label_downloads_abbr: D/L + label_add_another_file: Lisää uusi tiedosto + label_this_month: tässä kuussa + text_destroy_time_entries_question: "%{hours} tuntia on raportoitu tapahtumasta jonka aiot poistaa. Mitä haluat tehdä ?" + label_last_n_days: "viimeiset %{count} päivää" + label_all_time: koko ajalta + error_issue_not_found_in_project: 'Tapahtumaa ei löytynyt tai se ei kuulu tähän projektiin' + label_this_year: tänä vuonna + text_assign_time_entries_to_project: Määritä tunnit projektille + label_date_range: Aikaväli + label_last_week: viime viikolla + label_yesterday: eilen + label_optional_description: Lisäkuvaus + label_last_month: viime kuussa + text_destroy_time_entries: Poista raportoidut tunnit + text_reassign_time_entries: 'Siirrä raportoidut tunnit tälle tapahtumalle:' + label_chronological_order: Aikajärjestyksessä + label_date_to: '' + setting_activity_days_default: Päivien esittäminen projektien historiassa + label_date_from: '' + label_in: '' + setting_display_subprojects_issues: Näytä aliprojektien tapahtumat pääprojektissa oletusarvoisesti + field_comments_sorting: Näytä kommentit + label_reverse_chronological_order: Käänteisessä aikajärjestyksessä + label_preferences: Asetukset + setting_default_projects_public: Uudet projektit ovat oletuksena julkisia + label_overall_activity: Kokonaishistoria + error_scm_annotate: "Merkintää ei ole tai siihen ei voi lisätä selityksiä." + text_subprojects_destroy_warning: "Tämän aliprojekti(t): %{value} tullaan myös poistamaan." + label_and_its_subprojects: "%{value} ja aliprojektit" + mail_body_reminder: "%{count} sinulle nimettyä tapahtuma(a) erääntyy %{days} päivä sisään:" + mail_subject_reminder: "%{count} tapahtuma(a) erääntyy %{days} lähipäivinä" + text_user_wrote: "%{value} kirjoitti:" + label_duplicated_by: kopioinut + setting_enabled_scm: Versionhallinta käytettävissä + text_enumeration_category_reassign_to: 'Siirrä täksi arvoksi:' + text_enumeration_destroy_question: "%{count} kohdetta on sijoitettu tälle arvolle." + label_incoming_emails: Saapuvat sähköpostiviestit + label_generate_key: Luo avain + setting_mail_handler_api_enabled: Ota käyttöön WS saapuville sähköposteille + setting_mail_handler_api_key: API avain + text_email_delivery_not_configured: "Sähköpostin jakelu ei ole määritelty ja sähköpostimuistutukset eivät ole käytössä.\nKonfiguroi sähköpostipalvelinasetukset (SMTP) config/configuration.yml tiedostosta ja uudelleenkäynnistä sovellus jotta asetukset astuvat voimaan." + field_parent_title: Aloitussivu + label_issue_watchers: Tapahtuman seuraajat + button_quote: Vastaa + setting_sequential_project_identifiers: Luo peräkkäiset projektien tunnisteet + notice_unable_delete_version: Version poisto epäonnistui + label_renamed: uudelleennimetty + label_copied: kopioitu + setting_plain_text_mail: vain muotoilematonta tekstiä (ei HTML) + permission_view_files: Näytä tiedostot + permission_edit_issues: Muokkaa tapahtumia + permission_edit_own_time_entries: Muokka omia aikamerkintöjä + permission_manage_public_queries: Hallinnoi julkisia hakuja + permission_add_issues: Lisää tapahtumia + permission_log_time: Lokita käytettyä aikaa + permission_view_changesets: Näytä muutosryhmät + permission_view_time_entries: Näytä käytetty aika + permission_manage_versions: Hallinnoi versioita + permission_manage_wiki: Hallinnoi wikiä + permission_manage_categories: Hallinnoi tapahtumien luokkia + permission_protect_wiki_pages: Suojaa wiki sivut + permission_comment_news: Kommentoi uutisia + permission_delete_messages: Poista viestit + permission_select_project_modules: Valitse projektin modulit + permission_edit_wiki_pages: Muokkaa wiki sivuja + permission_add_issue_watchers: Lisää seuraajia + permission_view_gantt: Näytä gantt kaavio + permission_move_issues: Siirrä tapahtuma + permission_manage_issue_relations: Hallinoi tapahtuman suhteita + permission_delete_wiki_pages: Poista wiki sivuja + permission_manage_boards: Hallinnoi keskustelupalstaa + permission_delete_wiki_pages_attachments: Poista liitteitä + permission_view_wiki_edits: Näytä wiki historia + permission_add_messages: Jätä viesti + permission_view_messages: Näytä viestejä + permission_manage_files: Hallinnoi tiedostoja + permission_edit_issue_notes: Muokkaa muistiinpanoja + permission_manage_news: Hallinnoi uutisia + permission_view_calendar: Näytä kalenteri + permission_manage_members: Hallinnoi jäseniä + permission_edit_messages: Muokkaa viestejä + permission_delete_issues: Poista tapahtumia + permission_view_issue_watchers: Näytä seuraaja lista + permission_manage_repository: Hallinnoi tietovarastoa + permission_commit_access: Tee pääsyoikeus + permission_browse_repository: Selaa tietovarastoa + permission_view_documents: Näytä dokumentit + permission_edit_project: Muokkaa projektia + permission_add_issue_notes: Lisää muistiinpanoja + permission_save_queries: Tallenna hakuja + permission_view_wiki_pages: Näytä wiki + permission_rename_wiki_pages: Uudelleennimeä wiki sivuja + permission_edit_time_entries: Muokkaa aika lokeja + permission_edit_own_issue_notes: Muokkaa omia muistiinpanoja + setting_gravatar_enabled: Käytä Gravatar käyttäjä ikoneita + label_example: Esimerkki + text_repository_usernames_mapping: "Valitse päivittääksesi Redmine käyttäjä jokaiseen käyttäjään joka löytyy tietovaraston lokista.\nKäyttäjät joilla on sama Redmine ja tietovaraston käyttäjänimi tai sähköpostiosoite, yhdistetään automaattisesti." + permission_edit_own_messages: Muokkaa omia viestejä + permission_delete_own_messages: Poista omia viestejä + label_user_activity: "Käyttäjän %{value} historia" + label_updated_time_by: "Updated by %{author} %{age} ago" + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + setting_diff_max_lines_displayed: Max number of diff lines displayed + text_plugin_assets_writable: Plugin assets directory writable + warning_attachments_not_saved: "%{count} file(s) could not be saved." + button_create_and_continue: Create and continue + text_custom_field_possible_values_info: 'One line for each value' + label_display: Display + field_editable: Editable + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_file_max_size_displayed: Max size of text files displayed inline + field_watcher: Watcher + setting_openid: Allow OpenID login and registration + field_identity_url: OpenID URL + label_login_with_open_id_option: or login with OpenID + field_content: Content + label_descending: Descending + label_sort: Sort + label_ascending: Ascending + label_date_from_to: From %{start} to %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do? + text_wiki_page_reassign_children: Reassign child pages to this parent page + text_wiki_page_nullify_children: Keep child pages as root pages + text_wiki_page_destroy_children: Delete child pages and all their descendants + setting_password_min_length: Minimum password length + field_group_by: Group results by + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + label_wiki_content_added: Wiki page added + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}. + label_wiki_content_updated: Wiki page updated + mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}. + permission_add_project: Create project + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + label_view_all_revisions: View all revisions + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. + error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses"). + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + label_group_plural: Groups + label_group: Group + label_group_new: New group + label_time_entry_plural: Spent time + text_journal_added: "%{label} %{value} added" + field_active: Active + enumeration_system_activity: System Activity + permission_delete_issue_watchers: Delete watchers + version_status_closed: closed + version_status_locked: locked + version_status_open: open + error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened + label_user_anonymous: Anonymous + button_move_and_follow: Move and follow + setting_default_projects_modules: Default enabled modules for new projects + setting_gravatar_default: Default Gravatar image + field_sharing: Sharing + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_system: With all projects + label_version_sharing_descendants: With subprojects + label_version_sharing_tree: With project tree + label_version_sharing_none: Not shared + error_can_not_archive_project: This project can not be archived + button_duplicate: Duplicate + button_copy_and_follow: Copy and follow + label_copy_source: Source + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_status: Use the issue status + error_issue_done_ratios_not_updated: Issue done ratios not updated. + error_workflow_copy_target: Please select target tracker(s) and role(s) + setting_issue_done_ratio_issue_field: Use the issue field + label_copy_same_as_target: Same as target + label_copy_target: Target + notice_issue_done_ratios_updated: Issue done ratios updated. + error_workflow_copy_source: Please select a source tracker or role + label_update_issue_done_ratios: Update issue done ratios + setting_start_of_week: Start calendars on + permission_view_issues: View Issues + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_revision_id: Revision %{value} + label_api_access_key: API access key + label_api_access_key_created_on: API access key created %{value} ago + label_feeds_access_key: Atom access key + notice_api_access_key_reseted: Your API access key was reset. + setting_rest_api_enabled: Enable REST web service + label_missing_api_access_key: Missing an API access key + label_missing_feeds_access_key: Missing a Atom access key + button_show: Show + text_line_separated: Multiple values allowed (one line for each value). + setting_mail_handler_body_delimiters: Truncate emails after one of these lines + permission_add_subprojects: Create subprojects + label_subproject_new: New subproject + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_close_versions: Close completed versions + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Tee viestien koodaus + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 tapahtuma + one: 1 tapahtuma + other: "%{count} tapahtumat" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: kaikki + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Yhteensä + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Sähköposti + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API avain + setting_lost_password: Hukattu salasana + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/fr.yml b/config/locales/fr.yml new file mode 100644 index 0000000..dea9e3e --- /dev/null +++ b/config/locales/fr.yml @@ -0,0 +1,1231 @@ +# French translations for Ruby on Rails +# by Christian Lescuyer (christian@flyingcoders.com) +# contributor: Sebastien Grosjean - ZenCocoon.com +# contributor: Thibaut Cuvelier - Developpez.com + +fr: + direction: ltr + date: + formats: + default: "%d/%m/%Y" + short: "%e %b" + long: "%e %B %Y" + long_ordinal: "%e %B %Y" + only_day: "%e" + + day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi] + abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] + abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d/%m/%Y %H:%M" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%A %d %B %Y %H:%M:%S %Z" + long_ordinal: "%A %d %B %Y %H:%M:%S %Z" + only_second: "%S" + am: 'am' + pm: 'pm' + + datetime: + distance_in_words: + half_a_minute: "30 secondes" + less_than_x_seconds: + zero: "moins d'une seconde" + one: "moins d'une seconde" + other: "moins de %{count} secondes" + x_seconds: + one: "1 seconde" + other: "%{count} secondes" + less_than_x_minutes: + zero: "moins d'une minute" + one: "moins d'une minute" + other: "moins de %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "environ une heure" + other: "environ %{count} heures" + x_hours: + one: "une heure" + other: "%{count} heures" + x_days: + one: "un jour" + other: "%{count} jours" + about_x_months: + one: "environ un mois" + other: "environ %{count} mois" + x_months: + one: "un mois" + other: "%{count} mois" + about_x_years: + one: "environ un an" + other: "environ %{count} ans" + over_x_years: + one: "plus d'un an" + other: "plus de %{count} ans" + almost_x_years: + one: "presqu'un an" + other: "presque %{count} ans" + prompts: + year: "Année" + month: "Mois" + day: "Jour" + hour: "Heure" + minute: "Minute" + second: "Seconde" + + number: + format: + precision: 3 + separator: ',' + delimiter: ' ' + currency: + format: + unit: '€' + precision: 2 + format: '%n %u' + human: + format: + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "octet" + other: "octets" + kb: "ko" + mb: "Mo" + gb: "Go" + tb: "To" + + support: + array: + sentence_connector: 'et' + skip_last_comma: true + word_connector: ", " + two_words_connector: " et " + last_word_connector: " et " + + activerecord: + errors: + template: + header: + one: "Impossible d'enregistrer %{model} : une erreur" + other: "Impossible d'enregistrer %{model} : %{count} erreurs." + body: "Veuillez vérifier les champs suivants :" + messages: + inclusion: "n'est pas inclus(e) dans la liste" + exclusion: "n'est pas disponible" + invalid: "n'est pas valide" + confirmation: "ne concorde pas avec la confirmation" + accepted: "doit être accepté(e)" + empty: "doit être renseigné(e)" + blank: "doit être renseigné(e)" + too_long: "est trop long (pas plus de %{count} caractères)" + too_short: "est trop court (au moins %{count} caractères)" + wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)" + taken: "est déjà utilisé" + not_a_number: "n'est pas un nombre" + not_a_date: "n'est pas une date valide" + greater_than: "doit être supérieur à %{count}" + greater_than_or_equal_to: "doit être supérieur ou égal à %{count}" + equal_to: "doit être égal à %{count}" + less_than: "doit être inférieur à %{count}" + less_than_or_equal_to: "doit être inférieur ou égal à %{count}" + odd: "doit être impair" + even: "doit être pair" + greater_than_start_date: "doit être postérieure à la date de début" + not_same_project: "n'appartient pas au même projet" + circular_dependency: "Cette relation créerait une dépendance circulaire" + cant_link_an_issue_with_a_descendant: "Une demande ne peut pas être liée à l'une de ses sous-tâches" + earlier_than_minimum_start_date: "ne peut pas être antérieure au %{date} à cause des demandes qui précèdent" + not_a_regexp: "n'est pas une expression regulière valide" + open_issue_with_closed_parent: "Une demande ouverte ne peut pas être rattachée à une demande fermée" + + actionview_instancetag_blank_option: Choisir + + general_text_No: 'Non' + general_text_Yes: 'Oui' + general_text_no: 'non' + general_text_yes: 'oui' + general_lang_name: 'French (Français)' + general_csv_separator: ';' + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Le compte a été mis à jour avec succès. + notice_account_invalid_credentials: Identifiant ou mot de passe invalide. + notice_account_password_updated: Mot de passe mis à jour avec succès. + notice_account_wrong_password: Mot de passe incorrect + notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé à l'adresse %{email}. + notice_account_unknown_email: Aucun compte ne correspond à cette adresse. + notice_account_not_activated_yet: Vous n'avez pas encore activé votre compte. Si vous voulez recevoir un nouveau message d'activation, veuillez cliquer sur ce lien. + notice_account_locked: Votre compte est verrouillé. + notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe. + notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé. + notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter. + notice_successful_create: Création effectuée avec succès. + notice_successful_update: Mise à jour effectuée avec succès. + notice_successful_delete: Suppression effectuée avec succès. + notice_successful_connection: Connexion réussie. + notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée." + notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible. + notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page." + notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé. + notice_email_sent: "Un email a été envoyé à %{value}" + notice_email_error: "Erreur lors de l'envoi de l'email (%{value})" + notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée." + notice_api_access_key_reseted: Votre clé d'accès API a été réinitialisée. + notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}." + notice_failed_to_save_time_entries: "%{count} temps passé(s) sur les %{total} sélectionnés n'ont pas pu être mis à jour: %{ids}." + notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}." + notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour." + notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur." + notice_default_data_loaded: Paramétrage par défaut chargé avec succès. + notice_unable_delete_version: Impossible de supprimer cette version. + notice_unable_delete_time_entry: Impossible de supprimer le temps passé. + notice_issue_done_ratios_updated: L'avancement des demandes a été mis à jour. + notice_gantt_chart_truncated: "Le diagramme a été tronqué car il excède le nombre maximal d'éléments pouvant être affichés (%{max})" + notice_issue_successful_create: "Demande %{id} créée." + notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez." + notice_account_deleted: "Votre compte a été définitivement supprimé." + notice_user_successful_create: "Utilisateur %{id} créé." + notice_new_password_must_be_different: Votre nouveau mot de passe doit être différent de votre mot de passe actuel + notice_import_finished: "%{count} éléments ont été importé(s)" + notice_import_finished_with_errors: "%{count} élément(s) sur %{total} n'ont pas pu être importé(s)" + + error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage : %{value}" + error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt." + error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt : %{value}" + error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée." + error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale. + error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet" + error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet." + error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)." + error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé + error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé. + error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé. + error_can_not_reopen_issue_on_closed_version: 'Une demande assignée à une version fermée ne peut pas être réouverte' + error_can_not_archive_project: "Ce projet ne peut pas être archivé" + error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour. + error_workflow_copy_source: 'Veuillez sélectionner un tracker et/ou un rôle source' + error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles' + error_unable_delete_issue_status: Impossible de supprimer le statut de demande + error_unable_to_connect: Connexion impossible (%{value}) + error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size}) + error_session_expired: "Votre session a expiré. Veuillez vous reconnecter." + warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés." + error_password_expired: "Votre mot de passe a expiré ou nécessite d'être changé." + error_invalid_file_encoding: "Le fichier n'est pas un fichier %{encoding} valide" + error_invalid_csv_file_or_settings: "Le fichier n'est pas un fichier CSV ou n'est pas conforme aux paramètres sélectionnés" + error_can_not_read_import_file: "Une erreur est survenue lors de la lecture du fichier à importer" + error_attachment_extension_not_allowed: "L'extension %{extension} n'est pas autorisée" + error_ldap_bind_credentials: "Identifiant ou mot de passe LDAP incorrect" + error_no_tracker_allowed_for_new_issue_in_project: "Le projet ne dispose d'aucun tracker sur lequel vous pouvez créer une demande" + error_no_projects_with_tracker_allowed_for_new_issue: "Aucun projet ne dispose d'un tracker sur lequel vous pouvez créer une demande" + error_move_of_child_not_possible: "La sous-tâche %{child} n'a pas pu être déplacée dans le nouveau projet : %{errors}" + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: "Le temps passé ne peut pas être réaffecté à une demande qui va être supprimée" + warning_fields_cleared_on_bulk_edit: "Les changements apportés entraîneront la suppression automatique des valeurs d'un ou plusieurs champs sur les objets sélectionnés" + + mail_subject_lost_password: "Votre mot de passe %{value}" + mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant :' + mail_subject_register: "Activation de votre compte %{value}" + mail_body_register: 'Pour activer votre compte, cliquez sur le lien suivant :' + mail_body_account_information_external: "Vous pouvez utiliser votre compte %{value} pour vous connecter." + mail_body_account_information: Paramètres de connexion de votre compte + mail_subject_account_activation_request: "Demande d'activation d'un compte %{value}" + mail_body_account_activation_request: "Un nouvel utilisateur (%{value}) s'est inscrit. Son compte nécessite votre approbation :" + mail_subject_reminder: "%{count} demande(s) arrivent à échéance (%{days})" + mail_body_reminder: "%{count} demande(s) qui vous sont assignées arrivent à échéance dans les %{days} prochains jours :" + mail_subject_wiki_content_added: "Page wiki '%{id}' ajoutée" + mail_body_wiki_content_added: "La page wiki '%{id}' a été ajoutée par %{author}." + mail_subject_wiki_content_updated: "Page wiki '%{id}' mise à jour" + mail_body_wiki_content_updated: "La page wiki '%{id}' a été mise à jour par %{author}." + mail_body_settings_updated: "Les paramètres suivants ont été modifiés :" + mail_body_password_updated: "Votre mot de passe a été changé." + + field_name: Nom + field_description: Description + field_summary: Résumé + field_is_required: Obligatoire + field_firstname: Prénom + field_lastname: Nom + field_mail: Email + field_address: Email + field_filename: Fichier + field_filesize: Taille + field_downloads: Téléchargements + field_author: Auteur + field_created_on: Créé + field_updated_on: Mis-à-jour + field_closed_on: Fermé + field_field_format: Format + field_is_for_all: Pour tous les projets + field_possible_values: Valeurs possibles + field_regexp: Expression régulière + field_min_length: Longueur minimum + field_max_length: Longueur maximum + field_value: Valeur + field_category: Catégorie + field_title: Titre + field_project: Projet + field_issue: Demande + field_status: Statut + field_notes: Notes + field_is_closed: Demande fermée + field_is_default: Valeur par défaut + field_tracker: Tracker + field_subject: Sujet + field_due_date: Echéance + field_assigned_to: Assigné à + field_priority: Priorité + field_fixed_version: Version cible + field_user: Utilisateur + field_principal: Principal + field_role: Rôle + field_homepage: Site web + field_is_public: Public + field_parent: Sous-projet de + field_is_in_roadmap: Demandes affichées dans la roadmap + field_login: Identifiant + field_mail_notification: Notifications par mail + field_admin: Administrateur + field_last_login_on: Dernière connexion + field_language: Langue + field_effective_date: Date + field_password: Mot de passe + field_new_password: Nouveau mot de passe + field_password_confirmation: Confirmation + field_version: Version + field_type: Type + field_host: Hôte + field_port: Port + field_account: Compte + field_base_dn: Base DN + field_attr_login: Attribut Identifiant + field_attr_firstname: Attribut Prénom + field_attr_lastname: Attribut Nom + field_attr_mail: Attribut Email + field_onthefly: Création des utilisateurs à la volée + field_start_date: Début + field_done_ratio: "% réalisé" + field_auth_source: Mode d'authentification + field_hide_mail: Cacher mon adresse mail + field_comments: Commentaire + field_url: URL + field_start_page: Page de démarrage + field_subproject: Sous-projet + field_hours: Heures + field_activity: Activité + field_spent_on: Date + field_identifier: Identifiant + field_is_filter: Utilisé comme filtre + field_issue_to: Demande liée + field_delay: Retard + field_assignable: Demandes assignables à ce rôle + field_redirect_existing_links: Rediriger les liens existants + field_estimated_hours: Temps estimé + field_column_names: Colonnes + field_time_entries: Temps passé + field_time_zone: Fuseau horaire + field_searchable: Utilisé pour les recherches + field_default_value: Valeur par défaut + field_comments_sorting: Afficher les commentaires + field_parent_title: Page parent + field_editable: Modifiable + field_watcher: Observateur + field_identity_url: URL OpenID + field_content: Contenu + field_group_by: Grouper par + field_sharing: Partage + field_parent_issue: Tâche parente + field_member_of_group: Groupe de l'assigné + field_assigned_to_role: Rôle de l'assigné + field_text: Champ texte + field_visible: Visible + field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé" + field_issues_visibility: Visibilité des demandes + field_is_private: Privée + field_commit_logs_encoding: Encodage des messages de commit + field_scm_path_encoding: Encodage des chemins + field_path_to_repository: Chemin du dépôt + field_root_directory: Répertoire racine + field_cvsroot: CVSROOT + field_cvs_module: Module + field_repository_is_default: Dépôt principal + field_multiple: Valeurs multiples + field_auth_source_ldap_filter: Filtre LDAP + field_core_fields: Champs standards + field_timeout: "Timeout (en secondes)" + field_board_parent: Forum parent + field_private_notes: Notes privées + field_inherit_members: Hériter les membres + field_generate_password: Générer un mot de passe + field_must_change_passwd: Doit changer de mot de passe à la prochaine connexion + field_default_status: Statut par défaut + field_users_visibility: Visibilité des utilisateurs + field_time_entries_visibility: Visibilité du temps passé + field_total_estimated_hours: Temps estimé total + field_default_version: Version par défaut + field_textarea_font: Police utilisée pour les champs texte + field_updated_by: Mise à jour par + field_last_updated_by: Dernière mise à jour par + field_full_width_layout: Afficher sur toute la largeur + field_digest: Checksum + field_default_assigned_to: Assigné par défaut + + setting_app_title: Titre de l'application + setting_app_subtitle: Sous-titre de l'application + setting_welcome_text: Texte d'accueil + setting_default_language: Langue par défaut + setting_login_required: Authentification obligatoire + setting_self_registration: Inscription des nouveaux utilisateurs + setting_show_custom_fields_on_registration: Afficher les champs personnalisés sur le formulaire d'inscription + setting_attachment_max_size: Taille maximale des fichiers + setting_issues_export_limit: Limite d'exportation des demandes + setting_mail_from: Adresse d'émission + setting_bcc_recipients: Destinataires en copie cachée (cci) + setting_plain_text_mail: Mail en texte brut (non HTML) + setting_host_name: Nom d'hôte et chemin + setting_text_formatting: Formatage du texte + setting_wiki_compression: Compression de l'historique des pages wiki + setting_feeds_limit: Nombre maximal d'éléments dans les flux Atom + setting_default_projects_public: Définir les nouveaux projets comme publics par défaut + setting_autofetch_changesets: Récupération automatique des commits + setting_sys_api_enabled: Activer les WS pour la gestion des dépôts + setting_commit_ref_keywords: Mots-clés de référencement + setting_commit_fix_keywords: Mots-clés de résolution + setting_autologin: Durée maximale de connexion automatique + setting_date_format: Format de date + setting_time_format: Format d'heure + setting_timespan_format: Format des temps en heures + setting_cross_project_issue_relations: Autoriser les relations entre demandes de différents projets + setting_cross_project_subtasks: Autoriser les sous-tâches dans des projets différents + setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes + setting_repositories_encodings: Encodages des fichiers et des dépôts + setting_emails_header: En-tête des emails + setting_emails_footer: Pied-de-page des emails + setting_protocol: Protocole + setting_per_page_options: Options d'objets affichés par page + setting_user_format: Format d'affichage des utilisateurs + setting_activity_days_default: Nombre de jours affichés sur l'activité des projets + setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux + setting_enabled_scm: SCM activés + setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes" + setting_mail_handler_enable_regex_delimiters: "Utiliser les expressions regulières" + setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails" + setting_mail_handler_api_key: Clé de protection de l'API + setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels + setting_gravatar_enabled: Afficher les Gravatar des utilisateurs + setting_gravatar_default: Image Gravatar par défaut + setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées + setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne + setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier" + setting_openid: "Autoriser l'authentification et l'enregistrement OpenID" + setting_password_max_age: Expiration des mots de passe après + setting_password_min_length: Longueur minimum des mots de passe + setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet + setting_default_projects_modules: Modules activés par défaut pour les nouveaux projets + setting_issue_done_ratio: Calcul de l'avancement des demandes + setting_issue_done_ratio_issue_field: 'Utiliser le champ % effectué' + setting_issue_done_ratio_issue_status: Utiliser le statut + setting_start_of_week: Jour de début des calendriers + setting_rest_api_enabled: Activer l'API REST + setting_cache_formatted_text: Mettre en cache le texte formaté + setting_default_notification_option: Option de notification par défaut + setting_commit_logtime_enabled: Permettre la saisie de temps + setting_commit_logtime_activity_id: Activité pour le temps saisi + setting_gantt_items_limit: Nombre maximum d'éléments affichés sur le gantt + setting_issue_group_assignment: Permettre l'assignation des demandes aux groupes + setting_default_issue_start_date_to_creation_date: Donner à la date de début d'une nouvelle demande la valeur de la date du jour + setting_commit_cross_project_ref: Permettre le référencement et la résolution des demandes de tous les autres projets + setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte + setting_session_lifetime: Durée de vie maximale des sessions + setting_session_timeout: Durée maximale d'inactivité + setting_thumbnails_enabled: Afficher les vignettes des images + setting_thumbnails_size: Taille des vignettes (en pixels) + setting_non_working_week_days: Jours non travaillés + setting_jsonp_enabled: Activer le support JSONP + setting_default_projects_tracker_ids: Trackers par défaut pour les nouveaux projets + setting_mail_handler_excluded_filenames: Exclure les fichiers attachés par leur nom + setting_force_default_language_for_anonymous: Forcer la langue par défault pour les utilisateurs anonymes + setting_force_default_language_for_loggedin: Forcer la langue par défault pour les utilisateurs identifiés + setting_link_copied_issue: Lier les demandes lors de la copie + setting_max_additional_emails: Nombre maximal d'adresses email additionnelles + setting_search_results_per_page: Résultats de recherche affichés par page + setting_attachment_extensions_allowed: Extensions autorisées + setting_attachment_extensions_denied: Extensions non autorisées + setting_sys_api_key: Clé de protection de l'API + setting_lost_password: Autoriser la réinitialisation par email de mot de passe perdu + setting_new_item_menu_tab: Onglet de création d'objets dans le menu du project + setting_commit_logs_formatting: Appliquer le formattage de texte aux messages de commit + setting_timelog_required_fields: Champs obligatoire pour les temps passés + + permission_add_project: Créer un projet + permission_add_subprojects: Créer des sous-projets + permission_edit_project: Modifier le projet + permission_close_project: Fermer / réouvrir le projet + permission_select_project_modules: Choisir les modules + permission_manage_members: Gérer les membres + permission_manage_project_activities: Gérer les activités + permission_manage_versions: Gérer les versions + permission_manage_categories: Gérer les catégories de demandes + permission_view_issues: Voir les demandes + permission_add_issues: Créer des demandes + permission_edit_issues: Modifier les demandes + permission_copy_issues: Copier les demandes + permission_manage_issue_relations: Gérer les relations + permission_set_issues_private: Rendre les demandes publiques ou privées + permission_set_own_issues_private: Rendre ses propres demandes publiques ou privées + permission_add_issue_notes: Ajouter des notes + permission_edit_issue_notes: Modifier les notes + permission_edit_own_issue_notes: Modifier ses propres notes + permission_view_private_notes: Voir les notes privées + permission_set_notes_private: Rendre les notes privées + permission_move_issues: Déplacer les demandes + permission_delete_issues: Supprimer les demandes + permission_manage_public_queries: Gérer les requêtes publiques + permission_save_queries: Sauvegarder les requêtes + permission_view_gantt: Voir le gantt + permission_view_calendar: Voir le calendrier + permission_view_issue_watchers: Voir la liste des observateurs + permission_add_issue_watchers: Ajouter des observateurs + permission_delete_issue_watchers: Supprimer des observateurs + permission_log_time: Saisir le temps passé + permission_view_time_entries: Voir le temps passé + permission_edit_time_entries: Modifier les temps passés + permission_edit_own_time_entries: Modifier son propre temps passé + permission_view_news: Voir les annonces + permission_manage_news: Gérer les annonces + permission_comment_news: Commenter les annonces + permission_view_documents: Voir les documents + permission_add_documents: Ajouter des documents + permission_edit_documents: Modifier les documents + permission_delete_documents: Supprimer les documents + permission_manage_files: Gérer les fichiers + permission_view_files: Voir les fichiers + permission_manage_wiki: Gérer le wiki + permission_rename_wiki_pages: Renommer les pages + permission_delete_wiki_pages: Supprimer les pages + permission_view_wiki_pages: Voir le wiki + permission_view_wiki_edits: "Voir l'historique des modifications" + permission_edit_wiki_pages: Modifier les pages + permission_delete_wiki_pages_attachments: Supprimer les fichiers joints + permission_protect_wiki_pages: Protéger les pages + permission_manage_repository: Gérer le dépôt de sources + permission_browse_repository: Parcourir les sources + permission_view_changesets: Voir les révisions + permission_commit_access: Droit de commit + permission_manage_boards: Gérer les forums + permission_view_messages: Voir les messages + permission_add_messages: Poster un message + permission_edit_messages: Modifier les messages + permission_edit_own_messages: Modifier ses propres messages + permission_delete_messages: Supprimer les messages + permission_delete_own_messages: Supprimer ses propres messages + permission_export_wiki_pages: Exporter les pages + permission_manage_subtasks: Gérer les sous-tâches + permission_manage_related_issues: Gérer les demandes associées + permission_import_issues: Importer des demandes + + project_module_issue_tracking: Suivi des demandes + project_module_time_tracking: Suivi du temps passé + project_module_news: Publication d'annonces + project_module_documents: Publication de documents + project_module_files: Publication de fichiers + project_module_wiki: Wiki + project_module_repository: Dépôt de sources + project_module_boards: Forums de discussion + project_module_calendar: Calendrier + project_module_gantt: Gantt + + label_user: Utilisateur + label_user_plural: Utilisateurs + label_user_new: Nouvel utilisateur + label_user_anonymous: Anonyme + label_project: Projet + label_project_new: Nouveau projet + label_project_plural: Projets + label_x_projects: + zero: aucun projet + one: un projet + other: "%{count} projets" + label_project_all: Tous les projets + label_project_latest: Derniers projets + label_issue: Demande + label_issue_new: Nouvelle demande + label_issue_plural: Demandes + label_issue_view_all: Voir toutes les demandes + label_issues_by: "Demandes par %{value}" + label_issue_added: Demande ajoutée + label_issue_updated: Demande mise à jour + label_issue_note_added: Note ajoutée + label_issue_status_updated: Statut changé + label_issue_assigned_to_updated: Assigné changé + label_issue_priority_updated: Priorité changée + label_document: Document + label_document_new: Nouveau document + label_document_plural: Documents + label_document_added: Document ajouté + label_role: Rôle + label_role_plural: Rôles + label_role_new: Nouveau rôle + label_role_and_permissions: Rôles et permissions + label_role_anonymous: Anonyme + label_role_non_member: Non membre + label_member: Membre + label_member_new: Nouveau membre + label_member_plural: Membres + label_tracker: Tracker + label_tracker_plural: Trackers + label_tracker_all: Tous les trackers + label_tracker_new: Nouveau tracker + label_workflow: Workflow + label_issue_status: Statut de demandes + label_issue_status_plural: Statuts de demandes + label_issue_status_new: Nouveau statut + label_issue_category: Catégorie de demandes + label_issue_category_plural: Catégories de demandes + label_issue_category_new: Nouvelle catégorie + label_custom_field: Champ personnalisé + label_custom_field_plural: Champs personnalisés + label_custom_field_new: Nouveau champ personnalisé + label_enumerations: Listes de valeurs + label_enumeration_new: Nouvelle valeur + label_information: Information + label_information_plural: Informations + label_please_login: Identification + label_register: S'enregistrer + label_login_with_open_id_option: S'authentifier avec OpenID + label_password_lost: Mot de passe perdu + label_password_required: Confirmez votre mot de passe pour continuer + label_home: Accueil + label_my_page: Ma page + label_my_account: Mon compte + label_my_projects: Mes projets + label_administration: Administration + label_login: Connexion + label_logout: Déconnexion + label_help: Aide + label_reported_issues: Demandes soumises + label_assigned_issues: Demandes assignées + label_assigned_to_me_issues: Demandes qui me sont assignées + label_last_login: Dernière connexion + label_registered_on: Inscrit le + label_activity: Activité + label_overall_activity: Activité globale + label_user_activity: "Activité de %{value}" + label_new: Nouveau + label_logged_as: Connecté en tant que + label_environment: Environnement + label_authentication: Authentification + label_auth_source: Mode d'authentification + label_auth_source_new: Nouveau mode d'authentification + label_auth_source_plural: Modes d'authentification + label_subproject_plural: Sous-projets + label_subproject_new: Nouveau sous-projet + label_and_its_subprojects: "%{value} et ses sous-projets" + label_min_max_length: Longueurs mini - maxi + label_list: Liste + label_date: Date + label_integer: Entier + label_float: Nombre décimal + label_boolean: Booléen + label_string: Texte + label_text: Texte long + label_attribute: Attribut + label_attribute_plural: Attributs + label_no_data: Aucune donnée à afficher + label_change_status: Changer le statut + label_history: Historique + label_attachment: Fichier + label_attachment_new: Nouveau fichier + label_attachment_delete: Supprimer le fichier + label_attachment_plural: Fichiers + label_file_added: Fichier ajouté + label_report: Rapport + label_report_plural: Rapports + label_news: Annonce + label_news_new: Nouvelle annonce + label_news_plural: Annonces + label_news_latest: Dernières annonces + label_news_view_all: Voir toutes les annonces + label_news_added: Annonce ajoutée + label_news_comment_added: Commentaire ajouté à une annonce + label_settings: Configuration + label_overview: Aperçu + label_version: Version + label_version_new: Nouvelle version + label_version_plural: Versions + label_close_versions: Fermer les versions terminées + label_confirmation: Confirmation + label_export_to: 'Formats disponibles :' + label_read: Lire... + label_public_projects: Projets publics + label_open_issues: ouvert + label_open_issues_plural: ouverts + label_closed_issues: fermé + label_closed_issues_plural: fermés + label_x_open_issues_abbr: + zero: 0 ouverte + one: 1 ouverte + other: "%{count} ouvertes" + label_x_closed_issues_abbr: + zero: 0 fermée + one: 1 fermée + other: "%{count} fermées" + label_x_issues: + zero: 0 demande + one: 1 demande + other: "%{count} demandes" + label_total: Total + label_total_plural: Totaux + label_total_time: Temps total + label_permissions: Permissions + label_current_status: Statut actuel + label_new_statuses_allowed: Nouveaux statuts autorisés + label_all: tous + label_any: tous + label_none: aucun + label_nobody: personne + label_next: Suivant + label_previous: Précédent + label_used_by: Utilisé par + label_details: Détails + label_add_note: Ajouter une note + label_calendar: Calendrier + label_months_from: mois depuis + label_gantt: Gantt + label_internal: Interne + label_last_changes: "%{count} derniers changements" + label_change_view_all: Voir tous les changements + label_comment: Commentaire + label_comment_plural: Commentaires + label_x_comments: + zero: aucun commentaire + one: un commentaire + other: "%{count} commentaires" + label_comment_add: Ajouter un commentaire + label_comment_added: Commentaire ajouté + label_comment_delete: Supprimer les commentaires + label_query: Rapport personnalisé + label_query_plural: Rapports personnalisés + label_query_new: Nouveau rapport + label_my_queries: Mes rapports personnalisés + label_filter_add: Ajouter le filtre + label_filter_plural: Filtres + label_equals: égal + label_not_equals: différent + label_in_less_than: dans moins de + label_in_more_than: dans plus de + label_in_the_next_days: dans les prochains jours + label_in_the_past_days: dans les derniers jours + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_between: entre + label_in: dans + label_today: aujourd'hui + label_all_time: toute la période + label_yesterday: hier + label_this_week: cette semaine + label_last_week: la semaine dernière + label_last_n_weeks: "les %{count} dernières semaines" + label_last_n_days: "les %{count} derniers jours" + label_this_month: ce mois-ci + label_last_month: le mois dernier + label_this_year: cette année + label_date_range: Période + label_less_than_ago: il y a moins de + label_more_than_ago: il y a plus de + label_ago: il y a + label_contains: contient + label_not_contains: ne contient pas + label_any_issues_in_project: une demande du projet + label_any_issues_not_in_project: une demande hors du projet + label_no_issues_in_project: aucune demande du projet + label_any_open_issues: une demande ouverte + label_no_open_issues: aucune demande ouverte + label_day_plural: jours + label_repository: Dépôt + label_repository_new: Nouveau dépôt + label_repository_plural: Dépôts + label_browse: Parcourir + label_branch: Branche + label_tag: Tag + label_revision: Révision + label_revision_plural: Révisions + label_revision_id: "Révision %{value}" + label_associated_revisions: Révisions associées + label_added: ajouté + label_modified: modifié + label_copied: copié + label_renamed: renommé + label_deleted: supprimé + label_latest_revision: Dernière révision + label_latest_revision_plural: Dernières révisions + label_view_revisions: Voir les révisions + label_view_all_revisions: Voir toutes les révisions + label_max_size: Taille maximale + label_sort_highest: Remonter en premier + label_sort_higher: Remonter + label_sort_lower: Descendre + label_sort_lowest: Descendre en dernier + label_roadmap: Roadmap + label_roadmap_due_in: "Échéance dans %{value}" + label_roadmap_overdue: "En retard de %{value}" + label_roadmap_no_issues: Aucune demande pour cette version + label_search: Recherche + label_result_plural: Résultats + label_all_words: Tous les mots + label_wiki: Wiki + label_wiki_edit: Révision wiki + label_wiki_edit_plural: Révisions wiki + label_wiki_page: Page wiki + label_wiki_page_plural: Pages wiki + label_wiki_page_new: Nouvelle page wiki + label_index_by_title: Index par titre + label_index_by_date: Index par date + label_current_version: Version actuelle + label_preview: Prévisualisation + label_feed_plural: Flux Atom + label_changes_details: Détails de tous les changements + label_issue_tracking: Suivi des demandes + label_spent_time: Temps passé + label_total_spent_time: Temps passé total + label_overall_spent_time: Temps passé global + label_f_hour: "%{value} heure" + label_f_hour_plural: "%{value} heures" + label_f_hour_short: "%{value} h" + label_time_tracking: Suivi du temps + label_change_plural: Changements + label_statistics: Statistiques + label_commits_per_month: Commits par mois + label_commits_per_author: Commits par auteur + label_diff: diff + label_view_diff: Voir les différences + label_diff_inline: en ligne + label_diff_side_by_side: côte à côte + label_options: Options + label_copy_workflow_from: Copier le workflow de + label_permissions_report: Synthèse des permissions + label_watched_issues: Demandes surveillées + label_related_issues: Demandes liées + label_applied_status: Statut appliqué + label_loading: Chargement... + label_relation_new: Nouvelle relation + label_relation_delete: Supprimer la relation + label_relates_to: Lié à + label_duplicates: Duplique + label_duplicated_by: Dupliqué par + label_blocks: Bloque + label_blocked_by: Bloqué par + label_precedes: Précède + label_follows: Suit + label_copied_to: Copié vers + label_copied_from: Copié depuis + label_stay_logged_in: Rester connecté + label_disabled: désactivé + label_show_completed_versions: Voir les versions passées + label_me: moi + label_board: Forum + label_board_new: Nouveau forum + label_board_plural: Forums + label_board_locked: Verrouillé + label_board_sticky: Sticky + label_topic_plural: Discussions + label_message_plural: Messages + label_message_last: Dernier message + label_message_new: Nouveau message + label_message_posted: Message ajouté + label_reply_plural: Réponses + label_send_information: Envoyer les informations à l'utilisateur + label_year: Année + label_month: Mois + label_week: Semaine + label_date_from: Du + label_date_to: Au + label_language_based: Basé sur la langue de l'utilisateur + label_sort_by: "Trier par %{value}" + label_send_test_email: Envoyer un email de test + label_feeds_access_key: Clé d'accès Atom + label_missing_feeds_access_key: Clé d'accès Atom manquante + label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}" + label_module_plural: Modules + label_added_time_by: "Ajouté par %{author} il y a %{age}" + label_updated_time_by: "Mis à jour par %{author} il y a %{age}" + label_updated_time: "Mis à jour il y a %{value}" + label_jump_to_a_project: Aller à un projet... + label_file_plural: Fichiers + label_changeset_plural: Révisions + label_default_columns: Colonnes par défaut + label_no_change_option: (Pas de changement) + label_bulk_edit_selected_issues: Modifier les demandes sélectionnées + label_bulk_edit_selected_time_entries: Modifier les temps passés sélectionnés + label_theme: Thème + label_default: Défaut + label_search_titles_only: Uniquement dans les titres + label_user_mail_option_all: "Pour tous les événements de tous mes projets" + label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..." + label_user_mail_option_none: Aucune notification + label_user_mail_option_only_my_events: Seulement pour ce que je surveille + label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue" + label_registration_activation_by_email: activation du compte par email + label_registration_manual_activation: activation manuelle du compte + label_registration_automatic_activation: activation automatique du compte + label_display_per_page: "Par page : %{value}" + label_age: Âge + label_change_properties: Changer les propriétés + label_general: Général + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: Authentification LDAP + label_downloads_abbr: D/L + label_optional_description: Description facultative + label_add_another_file: Ajouter un autre fichier + label_preferences: Préférences + label_chronological_order: Dans l'ordre chronologique + label_reverse_chronological_order: Dans l'ordre chronologique inverse + label_incoming_emails: Emails entrants + label_generate_key: Générer une clé + label_issue_watchers: Observateurs + label_example: Exemple + label_display: Affichage + label_sort: Tri + label_ascending: Croissant + label_descending: Décroissant + label_date_from_to: Du %{start} au %{end} + label_wiki_content_added: Page wiki ajoutée + label_wiki_content_updated: Page wiki mise à jour + label_group: Groupe + label_group_plural: Groupes + label_group_new: Nouveau groupe + label_group_anonymous: Utilisateurs anonymes + label_group_non_member: Utilisateurs non membres + label_time_entry_plural: Temps passé + label_version_sharing_none: Non partagé + label_version_sharing_descendants: Avec les sous-projets + label_version_sharing_hierarchy: Avec toute la hiérarchie + label_version_sharing_tree: Avec tout l'arbre + label_version_sharing_system: Avec tous les projets + label_update_issue_done_ratios: Mettre à jour l'avancement des demandes + label_copy_source: Source + label_copy_target: Cible + label_copy_same_as_target: Comme la cible + label_display_used_statuses_only: N'afficher que les statuts utilisés dans ce tracker + label_api_access_key: Clé d'accès API + label_missing_api_access_key: Clé d'accès API manquante + label_api_access_key_created_on: Clé d'accès API créée il y a %{value} + label_profile: Profil + label_subtask_plural: Sous-tâches + label_project_copy_notifications: Envoyer les notifications durant la copie du projet + label_principal_search: "Rechercher un utilisateur ou un groupe :" + label_user_search: "Rechercher un utilisateur :" + label_additional_workflow_transitions_for_author: Autorisations supplémentaires lorsque l'utilisateur a créé la demande + label_additional_workflow_transitions_for_assignee: Autorisations supplémentaires lorsque la demande est assignée à l'utilisateur + label_issues_visibility_all: Toutes les demandes + label_issues_visibility_public: Toutes les demandes non privées + label_issues_visibility_own: Demandes créées par ou assignées à l'utilisateur + label_git_report_last_commit: Afficher le dernier commit des fichiers et répertoires + label_parent_revision: Parent + label_child_revision: Enfant + label_export_options: Options d'exportation %{export_format} + label_copy_attachments: Copier les fichiers + label_copy_subtasks: Copier les sous-tâches + label_item_position: "%{position} sur %{count}" + label_completed_versions: Versions passées + label_search_for_watchers: Rechercher des observateurs + label_session_expiration: Expiration des sessions + label_show_closed_projects: Voir les projets fermés + label_status_transitions: Changements de statut + label_fields_permissions: Permissions sur les champs + label_readonly: Lecture + label_required: Obligatoire + label_hidden: Caché + label_attribute_of_project: "%{name} du projet" + label_attribute_of_issue: "%{name} de la demande" + label_attribute_of_author: "%{name} de l'auteur" + label_attribute_of_assigned_to: "%{name} de l'assigné" + label_attribute_of_user: "%{name} de l'utilisateur" + label_attribute_of_fixed_version: "%{name} de la version cible" + label_attribute_of_object: "%{name} de \"%{object_name}\"" + label_cross_project_descendants: Avec les sous-projets + label_cross_project_tree: Avec tout l'arbre + label_cross_project_hierarchy: Avec toute la hiérarchie + label_cross_project_system: Avec tous les projets + label_gantt_progress_line: Ligne de progression + label_visibility_private: par moi uniquement + label_visibility_roles: par ces rôles uniquement + label_visibility_public: par tout le monde + label_link: Lien + label_only: seulement + label_drop_down_list: liste déroulante + label_checkboxes: cases à cocher + label_radio_buttons: boutons radio + label_link_values_to: Lier les valeurs vers l'URL + label_custom_field_select_type: Selectionner le type d'objet auquel attacher le champ personnalisé + label_check_for_updates: Vérifier les mises à jour + label_latest_compatible_version: Dernière version compatible + label_unknown_plugin: Plugin inconnu + label_add_projects: Ajouter des projets + label_users_visibility_all: Tous les utilisateurs actifs + label_users_visibility_members_of_visible_projects: Membres des projets visibles + label_edit_attachments: Modifier les fichiers attachés + label_link_copied_issue: Lier la demande copiée + label_ask: Demander + label_search_attachments_yes: Rechercher les noms et descriptions de fichiers + label_search_attachments_no: Ne pas rechercher les fichiers + label_search_attachments_only: Rechercher les fichiers uniquement + label_search_open_issues_only: Demandes ouvertes uniquement + label_email_address_plural: Emails + label_email_address_add: Ajouter une adresse email + label_enable_notifications: Activer les notifications + label_disable_notifications: Désactiver les notifications + label_blank_value: non renseigné + label_parent_task_attributes: Attributs des tâches parentes + label_time_entries_visibility_all: Tous les temps passés + label_time_entries_visibility_own: Ses propres temps passés + label_member_management: Gestion des membres + label_member_management_all_roles: Tous les rôles + label_member_management_selected_roles_only: Ces rôles uniquement + label_import_issues: Importer des demandes + label_select_file_to_import: Sélectionner le fichier à importer + label_fields_separator: Séparateur de champs + label_fields_wrapper: Délimiteur de texte + label_encoding: Encodage + label_comma_char: Virgule + label_semi_colon_char: Point virgule + label_quote_char: Apostrophe + label_double_quote_char: Double apostrophe + label_fields_mapping: Correspondance des champs + label_file_content_preview: Aperçu du contenu du fichier + label_create_missing_values: Créer les valeurs manquantes + label_api: API + label_field_format_enumeration: Liste clé/valeur + label_default_values_for_new_users: Valeurs par défaut pour les nouveaux utilisateurs + label_relations: Relations + label_new_project_issue_tab_enabled: Afficher l'onglet "Nouvelle demande" + label_new_object_tab_enabled: Afficher le menu déroulant "+" + label_table_of_contents: Contenu + label_font_default: Police par défaut + label_font_monospace: Police non proportionnelle + label_font_proportional: Police proportionnelle + label_last_notes: Dernières notes + + button_login: Connexion + button_submit: Soumettre + button_save: Sauvegarder + button_check_all: Tout cocher + button_uncheck_all: Tout décocher + button_collapse_all: Plier tout + button_expand_all: Déplier tout + button_delete: Supprimer + button_create: Créer + button_create_and_continue: Créer et continuer + button_test: Tester + button_edit: Modifier + button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}" + button_add: Ajouter + button_change: Changer + button_apply: Appliquer + button_clear: Effacer + button_lock: Verrouiller + button_unlock: Déverrouiller + button_download: Télécharger + button_list: Lister + button_view: Voir + button_move: Déplacer + button_move_and_follow: Déplacer et suivre + button_back: Retour + button_cancel: Annuler + button_activate: Activer + button_sort: Trier + button_log_time: Saisir temps + button_rollback: Revenir à cette version + button_watch: Surveiller + button_unwatch: Ne plus surveiller + button_reply: Répondre + button_archive: Archiver + button_unarchive: Désarchiver + button_reset: Réinitialiser + button_rename: Renommer + button_change_password: Changer de mot de passe + button_copy: Copier + button_copy_and_follow: Copier et suivre + button_annotate: Annoter + button_update: Mettre à jour + button_configure: Configurer + button_quote: Citer + button_duplicate: Dupliquer + button_show: Afficher + button_hide: Cacher + button_edit_section: Modifier cette section + button_export: Exporter + button_delete_my_account: Supprimer mon compte + button_close: Fermer + button_reopen: Réouvrir + button_import: Importer + button_filter: Filtrer + + status_active: actif + status_registered: enregistré + status_locked: verrouillé + + project_status_active: actif + project_status_closed: fermé + project_status_archived: archivé + + version_status_open: ouvert + version_status_locked: verrouillé + version_status_closed: fermé + + field_active: Actif + + text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée + text_regexp_info: ex. ^[A-Z0-9]+$ + text_min_max_length_info: 0 pour aucune restriction + text_project_destroy_confirmation: Êtes-vous sûr de vouloir supprimer ce projet et toutes ses données ? + text_subprojects_destroy_warning: "Ses sous-projets : %{value} seront également supprimés." + text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow + text_are_you_sure: Êtes-vous sûr ? + text_journal_changed: "%{label} changé de %{old} à %{new}" + text_journal_changed_no_detail: "%{label} mis à jour" + text_journal_set_to: "%{label} mis à %{value}" + text_journal_deleted: "%{label} %{old} supprimé" + text_journal_added: "%{label} %{value} ajouté" + text_tip_issue_begin_day: tâche commençant ce jour + text_tip_issue_end_day: tâche finissant ce jour + text_tip_issue_begin_end_day: tâche commençant et finissant ce jour + text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés, doit commencer par une minuscule.
    Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' + text_caracters_maximum: "%{count} caractères maximum." + text_caracters_minimum: "%{count} caractères minimum." + text_length_between: "Longueur comprise entre %{min} et %{max} caractères." + text_tracker_no_workflow: Aucun worflow n'est défini pour ce tracker + text_unallowed_characters: Caractères non autorisés + text_comma_separated: Plusieurs valeurs possibles (séparées par des virgules). + text_line_separated: Plusieurs valeurs possibles (une valeur par ligne). + text_issues_ref_in_commit_messages: Référencement et résolution des demandes dans les commentaires de commits + text_issue_added: "La demande %{id} a été soumise par %{author}." + text_issue_updated: "La demande %{id} a été mise à jour par %{author}." + text_wiki_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce wiki et tout son contenu ? + text_issue_category_destroy_question: "%{count} demandes sont affectées à cette catégorie. Que voulez-vous faire ?" + text_issue_category_destroy_assignments: N'affecter les demandes à aucune autre catégorie + text_issue_category_reassign_to: Réaffecter les demandes à cette catégorie + text_user_mail_option: "Pour les projets non sélectionnés, vous recevrez seulement des notifications pour ce que vous surveillez ou à quoi vous participez (exemple: demandes dont vous êtes l'auteur ou la personne assignée)." + text_no_configuration_data: "Les rôles, trackers, statuts et le workflow ne sont pas encore paramétrés.\nIl est vivement recommandé de charger le paramétrage par defaut. Vous pourrez le modifier une fois chargé." + text_load_default_configuration: Charger le paramétrage par défaut + text_status_changed_by_changeset: "Appliqué par commit %{value}." + text_time_logged_by_changeset: "Appliqué par commit %{value}" + text_issues_destroy_confirmation: 'Êtes-vous sûr de vouloir supprimer la ou les demandes(s) selectionnée(s) ?' + text_issues_destroy_descendants_confirmation: "Cela entrainera également la suppression de %{count} sous-tâche(s)." + text_time_entries_destroy_confirmation: "Etes-vous sûr de vouloir supprimer les temps passés sélectionnés ?" + text_select_project_modules: 'Sélectionner les modules à activer pour ce projet :' + text_default_administrator_account_changed: Compte administrateur par défaut changé + text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture + text_plugin_assets_writable: Répertoire public des plugins accessible en écriture + text_rmagick_available: Bibliothèque RMagick présente (optionnelle) + text_convert_available: Binaire convert de ImageMagick présent (optionel) + text_destroy_time_entries_question: "%{hours} heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?" + text_destroy_time_entries: Supprimer les heures + text_assign_time_entries_to_project: Reporter les heures sur le projet + text_reassign_time_entries: 'Reporter les heures sur cette demande:' + text_user_wrote: "%{value} a écrit :" + text_enumeration_destroy_question: "La valeur « %{name} » est affectée à %{count} objet(s)." + text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:' + text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/configuration.yml et redémarrez l'application pour les activer." + text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés." + text_diff_truncated: '... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.' + text_custom_field_possible_values_info: 'Une ligne par valeur' + text_wiki_page_destroy_question: "Cette page possède %{descendants} sous-page(s) et descendante(s). Que voulez-vous faire ?" + text_wiki_page_nullify_children: "Conserver les sous-pages en tant que pages racines" + text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes" + text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page" + text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?" + text_zoom_in: Zoom avant + text_zoom_out: Zoom arrière + text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page." + text_scm_path_encoding_note: "Défaut : UTF-8" + text_subversion_repository_note: "Exemples (en fonction des protocoles supportés) : file:///, http://, https://, svn://, svn+[tunnelscheme]://" + text_git_repository_note: "Chemin vers un dépôt vide et local (exemples : /gitrepo, c:\\gitrepo)" + text_mercurial_repository_note: "Chemin vers un dépôt local (exemples : /hgrepo, c:\\hgrepo)" + text_scm_command: Commande + text_scm_command_version: Version + text_scm_config: Vous pouvez configurer les commandes des SCM dans config/configuration.yml. Redémarrer l'application après modification. + text_scm_command_not_available: Ce SCM n'est pas disponible. Vérifier les paramètres dans la section administration. + text_issue_conflict_resolution_overwrite: "Appliquer quand même ma mise à jour (les notes précédentes seront conservées mais des changements pourront être écrasés)" + text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements" + text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}" + text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver." + text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre." + text_project_closed: Ce projet est fermé et accessible en lecture seule. + text_turning_multiple_off: "Si vous désactivez les valeurs multiples, les valeurs multiples seront supprimées pour n'en conserver qu'une par objet." + + default_role_manager: Manager + default_role_developer: Développeur + default_role_reporter: Rapporteur + default_tracker_bug: Anomalie + default_tracker_feature: Evolution + default_tracker_support: Assistance + default_issue_status_new: Nouveau + default_issue_status_in_progress: En cours + default_issue_status_resolved: Résolu + default_issue_status_feedback: Commentaire + default_issue_status_closed: Fermé + default_issue_status_rejected: Rejeté + default_doc_category_user: Documentation utilisateur + default_doc_category_tech: Documentation technique + default_priority_low: Bas + default_priority_normal: Normal + default_priority_high: Haut + default_priority_urgent: Urgent + default_priority_immediate: Immédiat + default_activity_design: Conception + default_activity_development: Développement + + enumeration_issue_priorities: Priorités des demandes + enumeration_doc_categories: Catégories des documents + enumeration_activities: Activités (suivi du temps) + enumeration_system_activity: Activité système + description_filter: Filtre + description_search: Champ de recherche + description_choose_project: Projets + description_project_scope: Périmètre de recherche + description_notes: Notes + description_message_content: Contenu du message + description_query_sort_criteria_attribute: Critère de tri + description_query_sort_criteria_direction: Ordre de tri + description_user_mail_notification: Option de notification + description_available_columns: Colonnes disponibles + description_selected_columns: Colonnes sélectionnées + description_all_columns: Toutes les colonnes + description_issue_category_reassign: Choisir une catégorie + description_wiki_subpages_reassign: Choisir une nouvelle page parent + text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés.
    Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' + label_parent_task_attributes_derived: Calculé à partir des sous-tâches + label_parent_task_attributes_independent: Indépendent des sous-tâches + mail_subject_security_notification: Notification de sécurité + mail_body_security_notification_change: ! '%{field} modifié(e).' + mail_body_security_notification_change_to: ! '%{field} changé(e) en %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} ajouté(e).' + mail_body_security_notification_remove: ! '%{field} %{value} supprimé(e).' + mail_body_security_notification_notify_enabled: Les notifications ont été activées pour l'adresse %{value} + mail_body_security_notification_notify_disabled: Les notifications ont été désactivées pour l'adresse %{value} + field_remote_ip: Adresse IP + label_no_preview: Aucun aperçu disponible + label_no_preview_alternative_html: Aucun aperçu disponible. Veuillez %{link} le fichier. + label_no_preview_download: télécharger + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of diff --git a/config/locales/gl.yml b/config/locales/gl.yml new file mode 100644 index 0000000..b5de3ac --- /dev/null +++ b/config/locales/gl.yml @@ -0,0 +1,1238 @@ +# Galician (Spain) for Ruby on Rails +# By: +# Marcos Arias Pena +# Adrián Chaves Fernández (Gallaecio) + +gl: + number: + format: + separator: "," + delimiter: "." + precision: 3 + + currency: + format: + format: "%n %u" + unit: "€" + separator: "," + delimiter: "." + precision: 2 + + percentage: + format: + # separator: + delimiter: "" + # precision: + + precision: + format: + # separator: + delimiter: "" + # precision: + + human: + format: + # separator: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "B" + other: "B" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + direction: ltr + date: + formats: + default: "%e/%m/%Y" + short: "%e %b" + long: "%A %e de %B de %Y" + day_names: [Domingo, Luns, Martes, Mércores, Xoves, Venres, Sábado] + abbr_day_names: [Dom, Lun, Mar, Mer, Xov, Ven, Sab] + month_names: [~, Xaneiro, Febreiro, Marzo, Abril, Maio, Xunio, Xullo, Agosto, Setembro, Outubro, Novembro, Decembro] + abbr_month_names: [~, Xan, Feb, Maz, Abr, Mai, Xun, Xul, Ago, Set, Out, Nov, Dec] + order: + - :day + - :month + - :year + + time: + formats: + default: "%A, %e de %B de %Y, %H:%M hs" + time: "%H:%M hs" + short: "%e/%m, %H:%M hs" + long: "%A %e de %B de %Y ás %H:%M horas" + + am: '' + pm: '' + + datetime: + distance_in_words: + half_a_minute: 'medio minuto' + less_than_x_seconds: + zero: 'menos dun segundo' + one: '1 segundo' + few: 'poucos segundos' + other: '%{count} segundos' + x_seconds: + one: '1 segundo' + other: '%{count} segundos' + less_than_x_minutes: + zero: 'menos dun minuto' + one: '1 minuto' + other: '%{count} minutos' + x_minutes: + one: '1 minuto' + other: '%{count} minuto' + about_x_hours: + one: 'aproximadamente unha hora' + other: '%{count} horas' + x_hours: + one: "1 hora" + other: "%{count} horas" + x_days: + one: '1 día' + other: '%{count} días' + x_weeks: + one: '1 semana' + other: '%{count} semanas' + about_x_months: + one: 'aproximadamente 1 mes' + other: '%{count} meses' + x_months: + one: '1 mes' + other: '%{count} meses' + about_x_years: + one: 'aproximadamente 1 ano' + other: '%{count} anos' + over_x_years: + one: 'máis dun ano' + other: '%{count} anos' + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + now: 'agora' + today: 'hoxe' + tomorrow: 'mañá' + in: 'dentro de' + + support: + array: + sentence_connector: e + + activerecord: + models: + attributes: + errors: + template: + header: + one: "1 erro evitou que se poidese gardar o %{model}" + other: "%{count} erros evitaron que se poidese gardar o %{model}" + body: "Atopáronse os seguintes problemas:" + messages: + inclusion: "non está incluido na lista" + exclusion: "xa existe" + invalid: "non é válido" + confirmation: "non coincide coa confirmación" + accepted: "debe ser aceptado" + empty: "non pode estar baleiro" + blank: "non pode estar en branco" + too_long: "é demasiado longo (non máis de %{count} carácteres)" + too_short: "é demasiado curto (non menos de %{count} carácteres)" + wrong_length: "non ten a lonxitude correcta (debe ser de %{count} carácteres)" + taken: "non está dispoñíbel" + not_a_number: "non é un número" + greater_than: "debe ser maior que %{count}" + greater_than_or_equal_to: "debe ser maior ou igual que %{count}" + equal_to: "debe ser igual a %{count}" + less_than: "debe ser menor que %{count}" + less_than_or_equal_to: "debe ser menor ou igual que %{count}" + odd: "debe ser par" + even: "debe ser impar" + greater_than_start_date: "debe ser posterior á data de comezo" + not_same_project: "non pertence ao mesmo proxecto" + circular_dependency: "Esta relación podería crear unha dependencia circular" + cant_link_an_issue_with_a_descendant: "As peticións non poden estar ligadas coas súas subtarefas" + earlier_than_minimum_start_date: "Non pode ser antes de %{date} por mor de peticións anteriores" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Por favor seleccione + + button_activate: Activar + button_add: Engadir + button_annotate: Anotar + button_apply: Aceptar + button_archive: Arquivar + button_back: Atrás + button_cancel: Cancelar + button_change: Cambiar + button_change_password: "Cambiar o contrasinal" + button_check_all: "Seleccionalo todo" + button_clear: Anular + button_configure: Configurar + button_copy: Copiar + button_create: Crear + button_delete: Borrar + button_download: Descargar + button_edit: Modificar + button_list: Listar + button_lock: Bloquear + button_log_time: Tempo dedicado + button_login: Acceder + button_move: Mover + button_quote: Citar + button_rename: Renomear + button_reply: Respostar + button_reset: Restablecer + button_rollback: Volver a esta versión + button_save: Gardar + button_sort: Ordenar + button_submit: Aceptar + button_test: Probar + button_unarchive: Desarquivar + button_uncheck_all: Non seleccionar nada + button_unlock: Desbloquear + button_unwatch: Non monitorizar + button_update: Actualizar + button_view: Ver + button_watch: Monitorizar + default_activity_design: Deseño + default_activity_development: Desenvolvemento + default_doc_category_tech: Documentación técnica + default_doc_category_user: Documentación de usuario + default_issue_status_in_progress: "En curso" + default_issue_status_closed: Pechada + default_issue_status_feedback: Comentarios + default_issue_status_new: Nova + default_issue_status_rejected: Rexeitada + default_issue_status_resolved: Resolta + default_priority_high: Alta + default_priority_immediate: Inmediata + default_priority_low: Baixa + default_priority_normal: Normal + default_priority_urgent: Urxente + default_role_developer: Desenvolvedor + default_role_manager: Xefe de proxecto + default_role_reporter: Informador + default_tracker_bug: Erros + default_tracker_feature: Tarefas + default_tracker_support: Soporte + enumeration_activities: Actividades (tempo dedicado) + enumeration_doc_categories: Categorías do documento + enumeration_issue_priorities: Prioridade das peticións + error_can_t_load_default_data: "Non se puido cargar a configuración predeterminada: %{value}" + error_issue_not_found_in_project: 'A petición non se atopa ou non está asociada a este proxecto' + error_scm_annotate: "Non existe a entrada ou non se puido anotar" + error_scm_command_failed: "Aconteceu un erro ao acceder ao repositorio: %{value}" + error_scm_not_found: "A entrada e/ou revisión non existe no repositorio." + field_account: Conta + field_activity: Actividade + field_admin: Administrador + field_assignable: Pódense asignar peticións a este perfil + field_assigned_to: Asignado a + field_attr_firstname: "Atributo do nome" + field_attr_lastname: "Atributo dos apelidos" + field_attr_login: "Atributo do nome de usuario" + field_attr_mail: "Atributo da conta de correo electrónico" + field_auth_source: Modo de identificación + field_author: Autor + field_base_dn: DN base + field_category: Categoría + field_column_names: Columnas + field_comments: Comentario + field_comments_sorting: Mostrar comentarios + field_created_on: Creado + field_default_value: "Estado predeterminado" + field_delay: Retraso + field_description: Descrición + field_done_ratio: "% Realizado" + field_downloads: Descargas + field_due_date: Data fin + field_effective_date: Data + field_estimated_hours: Tempo estimado + field_field_format: Formato + field_filename: Ficheiro + field_filesize: Tamaño + field_firstname: Nome + field_fixed_version: Versión prevista + field_hide_mail: "Agochar o enderezo de correo." + field_homepage: Sitio web + field_host: Anfitrión + field_hours: Horas + field_identifier: Identificador + field_is_closed: Petición resolta + field_is_default: "Estado predeterminado" + field_is_filter: Usado como filtro + field_is_for_all: Para todos os proxectos + field_is_in_roadmap: Consultar as peticións na planificación + field_is_public: Público + field_is_required: Obrigatorio + field_issue: Petición + field_issue_to: Petición relacionada + field_language: Idioma + field_last_login_on: "Último acceso" + field_lastname: "Apelidos" + field_login: "Usuario" + field_mail: Correo electrónico + field_mail_notification: Notificacións por correo + field_max_length: Lonxitude máxima + field_min_length: Lonxitude mínima + field_name: Nome + field_new_password: Novo contrasinal + field_notes: Notas + field_onthefly: Creación do usuario "ao voo" + field_parent: Proxecto pai + field_parent_title: Páxina pai + field_password: Contrasinal + field_password_confirmation: Confirmación + field_port: Porto + field_possible_values: Valores posibles + field_priority: Prioridade + field_project: Proxecto + field_redirect_existing_links: Redireccionar ligazóns existentes + field_regexp: Expresión regular + field_role: Perfil + field_searchable: Incluír nas buscas + field_spent_on: Data + field_start_date: Data de inicio + field_start_page: Páxina principal + field_status: Estado + field_subject: Tema + field_subproject: Proxecto secundario + field_summary: Resumo + field_time_zone: Zona horaria + field_title: Título + field_tracker: Tipo + field_type: Tipo + field_updated_on: Actualizado + field_url: URL + field_user: Usuario + field_value: Valor + field_version: Versión + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-15 + general_csv_separator: ';' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + general_lang_name: 'Galician (Galego)' + general_text_No: 'Non' + general_text_Yes: 'Si' + general_text_no: 'non' + general_text_yes: 'si' + label_activity: Actividade + label_add_another_file: Engadir outro ficheiro + label_add_note: Engadir unha nota + label_added: engadido + label_added_time_by: "Engadido por %{author} hai %{age}" + label_administration: Administración + label_age: Idade + label_ago: "hai" + label_all: todos + label_all_time: todo o tempo + label_all_words: Tódalas palabras + label_and_its_subprojects: "%{value} e proxectos secundarios" + label_applied_status: Aplicar estado + label_assigned_to_me_issues: "Peticións asignadas a vostede" + label_associated_revisions: Revisións asociadas + label_attachment: Ficheiro + label_attachment_delete: Borrar o ficheiro + label_attachment_new: Novo ficheiro + label_attachment_plural: Ficheiros + label_attribute: Atributo + label_attribute_plural: Atributos + label_auth_source: Modo de autenticación + label_auth_source_new: Novo modo de autenticación + label_auth_source_plural: Modos de autenticación + label_authentication: Autenticación + label_blocked_by: bloqueado por + label_blocks: bloquea a + label_board: Foro + label_board_new: Novo foro + label_board_plural: Foros + label_boolean: Booleano + label_browse: Ollar + label_bulk_edit_selected_issues: Editar as peticións seleccionadas + label_calendar: Calendario + label_change_plural: Cambios + label_change_properties: Cambiar propiedades + label_change_status: Cambiar o estado + label_change_view_all: Ver todos os cambios + label_changes_details: Detalles de todos os cambios + label_changeset_plural: Cambios + label_chronological_order: En orde cronolóxica + label_closed_issues: pechada + label_closed_issues_plural: pechadas + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_comment: Comentario + label_comment_add: Engadir un comentario + label_comment_added: Comentario engadido + label_comment_delete: Borrar comentarios + label_comment_plural: Comentarios + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_commits_per_author: Remisións por autor + label_commits_per_month: Remisións por mes + label_confirmation: Confirmación + label_contains: conten + label_copied: copiado + label_copy_workflow_from: Copiar fluxo de traballo dende + label_current_status: Estado actual + label_current_version: Versión actual + label_custom_field: Campo personalizado + label_custom_field_new: Novo campo personalizado + label_custom_field_plural: Campos personalizados + label_date: Data + label_date_from: Dende + label_date_range: Rango de datas + label_date_to: Ata + label_day_plural: días + label_default: Predeterminada + label_default_columns: Columnas predeterminadas + label_deleted: suprimido + label_details: Detalles + label_diff_inline: liña por liña + label_diff_side_by_side: un a cada lado + label_disabled: deshabilitado + label_display_per_page: "Por páxina: %{value}" + label_document: Documento + label_document_added: Documento engadido + label_document_new: Novo documento + label_document_plural: Documentos + label_downloads_abbr: D/L + label_duplicated_by: duplicada por + label_duplicates: duplicada de + label_enumeration_new: Novo valor + label_enumerations: Listas de valores + label_environment: Entorno + label_equals: igual + label_example: Exemplo + label_export_to: 'Exportar a:' + label_f_hour: "%{value} hora" + label_f_hour_plural: "%{value} horas" + label_feed_plural: Feeds + label_feeds_access_key_created_on: "Chave de acceso por Atom creada hai %{value}" + label_file_added: Ficheiro engadido + label_file_plural: Ficheiros + label_filter_add: Engadir o filtro + label_filter_plural: Filtros + label_float: Flotante + label_follows: posterior a + label_gantt: Gantt + label_general: Xeral + label_generate_key: Xerar chave + label_help: Axuda + label_history: Histórico + label_home: Inicio + label_in: en + label_in_less_than: "en menos de" + label_in_more_than: "en máis de" + label_incoming_emails: Correos entrantes + label_index_by_date: Índice por data + label_index_by_title: Índice por título + label_information: Información + label_information_plural: Información + label_integer: Número + label_internal: Interno + label_issue: Petición + label_issue_added: Petición engadida + label_issue_category: Categoría das peticións + label_issue_category_new: Nova categoría + label_issue_category_plural: Categorías das peticións + label_issue_new: Nova petición + label_issue_plural: Peticións + label_issue_status: Estado da petición + label_issue_status_new: Novo estado + label_issue_status_plural: Estados das peticións + label_issue_tracking: Peticións + label_issue_updated: Petición actualizada + label_issue_view_all: Ver todas as peticións + label_issue_watchers: Seguidores + label_issues_by: "Peticións por %{value}" + label_jump_to_a_project: Ir ao proxecto… + label_language_based: Baseado no idioma + label_last_changes: "últimos %{count} cambios" + label_last_login: "Último acceso" + label_last_month: último mes + label_last_n_days: "últimos %{count} días" + label_last_week: última semana + label_latest_revision: Última revisión + label_latest_revision_plural: Últimas revisións + label_ldap_authentication: Autenticación LDAP + label_less_than_ago: "hai menos de" + label_list: Lista + label_loading: Cargando… + label_logged_as: "Identificado como" + label_login: "Acceder" + label_logout: "Saír" + label_max_size: Tamaño máximo + label_me: eu mesmo + label_member: Membro + label_member_new: Novo membro + label_member_plural: Membros + label_message_last: Última mensaxe + label_message_new: Nova mensaxe + label_message_plural: Mensaxes + label_message_posted: Mensaxe engadida + label_min_max_length: Lonxitude mín - máx + label_modified: modificado + label_module_plural: Módulos + label_month: Mes + label_months_from: meses de + label_more_than_ago: "hai máis de" + label_my_account: "Conta" + label_my_page: "Páxina persoal" + label_my_projects: "Proxectos persoais" + label_new: Novo + label_new_statuses_allowed: Novos estados autorizados + label_news: Noticia + label_news_added: Noticia engadida + label_news_latest: Últimas noticias + label_news_new: Nova noticia + label_news_plural: Noticias + label_news_view_all: Ver todas as noticias + label_next: Seguinte + label_no_change_option: (sen cambios) + label_no_data: "Non hai ningún dato que mostrar." + label_nobody: ninguén + label_none: ningún + label_not_contains: non conten + label_not_equals: non igual + label_open_issues: aberta + label_open_issues_plural: abertas + label_optional_description: Descrición opcional + label_options: Opcións + label_overall_activity: Actividade global + label_overview: Vistazo + label_password_lost: "Esqueceu o contrasinal?" + label_permissions: Permisos + label_permissions_report: Informe de permisos + label_please_login: "Acceder" + label_plugins: Complementos + label_precedes: anterior a + label_preferences: Preferencias + label_preview: "Vista previa" + label_previous: Anterior + label_project: Proxecto + label_project_all: Tódolos proxectos + label_project_latest: Últimos proxectos + label_project_new: Novo proxecto + label_project_plural: Proxectos + label_x_projects: + zero: "ningún proxecto" + one: "un proxecto" + other: "%{count} proxectos" + label_public_projects: Proxectos públicos + label_query: Consulta personalizada + label_query_new: Nova consulta + label_query_plural: Consultas personalizadas + label_read: Ler… + label_register: "Rexistrarse" + label_registered_on: Inscrito o + label_registration_activation_by_email: activación de conta por correo + label_registration_automatic_activation: activación automática de conta + label_registration_manual_activation: activación manual de conta + label_related_issues: Peticións relacionadas + label_relates_to: relacionada con + label_relation_delete: Eliminar relación + label_relation_new: Nova relación + label_renamed: renomeado + label_reply_plural: Respostas + label_report: Informe + label_report_plural: Informes + label_reported_issues: "Peticións rexistradas por vostede" + label_repository: Repositorio + label_repository_plural: Repositorios + label_result_plural: Resultados + label_reverse_chronological_order: En orde cronolóxica inversa + label_revision: Revisión + label_revision_plural: Revisións + label_roadmap: Planificación + label_roadmap_due_in: "Remata en %{value}" + label_roadmap_no_issues: Non hai peticións para esta versión + label_roadmap_overdue: "%{value} tarde" + label_role: Perfil + label_role_and_permissions: Perfís e permisos + label_role_new: Novo perfil + label_role_plural: Perfís + label_scm: SCM + label_search: Busca + label_search_titles_only: Buscar só en títulos + label_send_information: Enviar información da conta ao usuario + label_send_test_email: Enviar un correo de proba + label_settings: Configuración + label_show_completed_versions: Mostra as versións rematadas + label_sort_by: "Ordenar por %{value}" + label_sort_higher: Subir + label_sort_highest: Primeiro + label_sort_lower: Baixar + label_sort_lowest: Último + label_spent_time: Tempo dedicado + label_statistics: Estatísticas + label_stay_logged_in: "Lembrar o contrasinal." + label_string: Texto + label_subproject_plural: Proxectos secundarios + label_text: Texto largo + label_theme: Tema + label_this_month: este mes + label_this_week: esta semana + label_this_year: este ano + label_time_tracking: Control de tempo + label_today: hoxe + label_topic_plural: Temas + label_total: Total + label_tracker: Tipo + label_tracker_new: Novo tipo + label_tracker_plural: Tipos de peticións + label_updated_time: "Actualizado hai %{value}" + label_updated_time_by: "Actualizado por %{author} hai %{age}" + label_used_by: Utilizado por + label_user: Usuario + label_user_activity: "Actividade de %{value}" + label_user_mail_no_self_notified: "Non quero ser avisado de cambios feitos por min mesmo." + label_user_mail_option_all: "Para calquera evento en todos os proxectos." + label_user_mail_option_selected: "Para calquera evento dos proxectos seleccionados…" + label_user_new: Novo usuario + label_user_plural: Usuarios + label_version: Versión + label_version_new: Nova versión + label_version_plural: Versións + label_view_diff: Ver diferencias + label_view_revisions: Ver as revisións + label_watched_issues: Peticións monitorizadas + label_week: Semana + label_wiki: Wiki + label_wiki_edit: Wiki edición + label_wiki_edit_plural: Wiki edicións + label_wiki_page: Wiki páxina + label_wiki_page_plural: Wiki páxinas + label_workflow: Fluxo de traballo + label_year: Ano + label_yesterday: onte + mail_body_account_activation_request: "Inscribiuse un novo usuario (%{value}). A conta está pendente de aprobación:" + mail_body_account_information: Información sobre a súa conta + mail_body_account_information_external: "Pode usar a súa conta %{value} para conectarse." + mail_body_lost_password: 'Para cambiar o seu contrasinal, prema a seguinte ligazón:' + mail_body_register: 'Para activar a súa conta, prema a seguinte ligazón:' + mail_body_reminder: "%{count} petición(s) asignadas a ti rematan nos próximos %{days} días:" + mail_subject_account_activation_request: "Petición de activación de conta %{value}" + mail_subject_lost_password: "O teu contrasinal de %{value}" + mail_subject_register: "Activación da conta de %{value}" + mail_subject_reminder: "%{count} petición(s) rematarán nos próximos %{days} días" + notice_account_activated: A súa conta foi activada. Xa pode conectarse. + notice_account_invalid_credentials: "O usuario ou contrasinal non é correcto." + notice_account_lost_email_sent: Enviouse un correo con instrucións para elixir un novo contrasinal. + notice_account_password_updated: Contrasinal modificado correctamente. + notice_account_pending: "A súa conta creouse e está pendente da aprobación por parte do administrador." + notice_account_register_done: "A conta creouse correctamente. Recibirá unha ligazón na súa conta de correo electrónico, sígaa para activar a nova conta." + notice_account_unknown_email: Usuario descoñecido. + notice_account_updated: Conta actualizada correctamente. + notice_account_wrong_password: Contrasinal incorrecto. + notice_can_t_change_password: Esta conta utiliza unha fonte de autenticación externa. Non é posible cambiar o contrasinal. + notice_default_data_loaded: "A configuración predeterminada cargouse correctamente." + notice_email_error: "Ocorreu un error enviando o correo (%{value})" + notice_email_sent: "Enviouse un correo a %{value}" + notice_failed_to_save_issues: "Imposible gravar %{count} petición(s) de %{total} seleccionada(s): %{ids}." + notice_feeds_access_key_reseted: A súa chave de acceso para Atom reiniciouse. + notice_file_not_found: A páxina á que tenta acceder non existe. + notice_locking_conflict: Os datos modificáronse por outro usuario. + notice_no_issue_selected: "Ningunha petición seleccionada. Por favor, comprobe a petición que quere modificar" + notice_not_authorized: Non ten autorización para acceder a esta páxina. + notice_successful_connection: "Accedeu correctamente." + notice_successful_create: Creación correcta. + notice_successful_delete: Borrado correcto. + notice_successful_update: Modificación correcta. + notice_unable_delete_version: Non se pode borrar a versión + permission_add_issue_notes: Engadir notas + permission_add_issue_watchers: Engadir seguidores + permission_add_issues: Engadir peticións + permission_add_messages: Enviar mensaxes + permission_browse_repository: Ollar repositorio + permission_comment_news: Comentar noticias + permission_commit_access: Acceso de escritura + permission_delete_issues: Borrar peticións + permission_delete_messages: Borrar mensaxes + permission_delete_own_messages: Borrar mensaxes propios + permission_delete_wiki_pages: Borrar páxinas wiki + permission_delete_wiki_pages_attachments: Borrar ficheiros + permission_edit_issue_notes: Modificar notas + permission_edit_issues: Modificar peticións + permission_edit_messages: Modificar mensaxes + permission_edit_own_issue_notes: Modificar notas propias + permission_edit_own_messages: Editar mensaxes propios + permission_edit_own_time_entries: Modificar tempos dedicados propios + permission_edit_project: Modificar proxecto + permission_edit_time_entries: Modificar tempos dedicados + permission_edit_wiki_pages: Modificar páxinas wiki + permission_log_time: Anotar tempo dedicado + permission_manage_boards: Administrar foros + permission_manage_categories: Administrar categorías de peticións + permission_manage_files: Administrar ficheiros + permission_manage_issue_relations: Administrar relación con outras peticións + permission_manage_members: Administrar membros + permission_manage_news: Administrar noticias + permission_manage_public_queries: Administrar consultas públicas + permission_manage_repository: Administrar repositorio + permission_manage_versions: Administrar versións + permission_manage_wiki: Administrar wiki + permission_move_issues: Mover peticións + permission_protect_wiki_pages: Protexer páxinas wiki + permission_rename_wiki_pages: Renomear páxinas wiki + permission_save_queries: Gravar consultas + permission_select_project_modules: Seleccionar módulos do proxecto + permission_view_calendar: Ver calendario + permission_view_changesets: Ver cambios + permission_view_documents: Ver documentos + permission_view_files: Ver ficheiros + permission_view_gantt: Ver diagrama de Gantt + permission_view_issue_watchers: Ver lista de seguidores + permission_view_messages: Ver mensaxes + permission_view_time_entries: Ver tempo dedicado + permission_view_wiki_edits: Ver histórico do wiki + permission_view_wiki_pages: Ver wiki + project_module_boards: Foros + project_module_documents: Documentos + project_module_files: Ficheiros + project_module_issue_tracking: Peticións + project_module_news: Noticias + project_module_repository: Repositorio + project_module_time_tracking: Control de tempo + project_module_wiki: Wiki + setting_activity_days_default: Días a mostrar na actividade do proxecto + setting_app_subtitle: Subtítulo da aplicación + setting_app_title: Título da aplicación + setting_attachment_max_size: Tamaño máximo do ficheiro + setting_autofetch_changesets: Autorechear as remisións do repositorio + setting_autologin: "Identificarse automaticamente." + setting_bcc_recipients: Ocultar as copias de carbón (bcc) + setting_commit_fix_keywords: Palabras chave para a corrección + setting_commit_ref_keywords: Palabras chave para a referencia + setting_cross_project_issue_relations: Permitir relacionar peticións de distintos proxectos + setting_date_format: Formato da data + setting_default_language: Idioma predeterminado + setting_default_projects_public: "Os proxectos novos son públicos de maneira predeterminada." + setting_diff_max_lines_displayed: Número máximo de diferencias mostradas + setting_display_subprojects_issues: "Mostrar peticións de prox. secundarios no principal de maneira predeterminada." + setting_emails_footer: Pe de mensaxes + setting_enabled_scm: Activar SCM + setting_feeds_limit: Límite de contido para sindicación + setting_gravatar_enabled: Usar iconas de usuario (Gravatar) + setting_host_name: Nome e ruta do servidor + setting_issue_list_default_columns: "Columnas predeterminadas para a lista de peticións." + setting_issues_export_limit: Límite de exportación de peticións + setting_login_required: Requírese identificación + setting_mail_from: Correo dende o que enviar mensaxes + setting_mail_handler_api_enabled: Activar o programa para mensaxes entrantes + setting_mail_handler_api_key: Chave da API + setting_per_page_options: Obxectos por páxina + setting_plain_text_mail: só texto plano (non HTML) + setting_protocol: Protocolo + setting_self_registration: Rexistro permitido + setting_sequential_project_identifiers: Xerar identificadores de proxecto + setting_sys_api_enabled: Activar o programa para a xestión do repositorio + setting_text_formatting: Formato de texto + setting_time_format: Formato de hora + setting_user_format: Formato de nome de usuario + setting_welcome_text: Texto de benvida + setting_wiki_compression: Compresión do historial do Wiki + status_active: activo + status_locked: bloqueado + status_registered: rexistrado + text_are_you_sure: Está seguro? + text_assign_time_entries_to_project: Asignar as horas ao proxecto + text_caracters_maximum: "%{count} caracteres como máximo." + text_caracters_minimum: "%{count} caracteres como mínimo." + text_comma_separated: Múltiples valores permitidos (separados por coma). + text_default_administrator_account_changed: "Cambiouse a conta predeterminada de administrador." + text_destroy_time_entries: Borrar as horas + text_destroy_time_entries_question: Existen %{hours} horas asignadas á petición que quere borrar. Que quere facer ? + text_diff_truncated: '… Diferencia truncada por exceder o máximo tamaño visíbel.' + text_email_delivery_not_configured: "O envío de correos non está configurado, e as notificacións desactiváronse. \n Configure o servidor de SMTP en config/configuration.yml e reinicie a aplicación para activar os cambios." + text_enumeration_category_reassign_to: 'Reasignar ao seguinte valor:' + text_enumeration_destroy_question: "%{count} obxectos con este valor asignado." + text_file_repository_writable: Pódese escribir no repositorio + text_issue_added: "Petición %{id} engadida por %{author}." + text_issue_category_destroy_assignments: Deixar as peticións sen categoría + text_issue_category_destroy_question: "Algunhas peticións (%{count}) están asignadas a esta categoría. Que desexa facer?" + text_issue_category_reassign_to: Reasignar as peticións á categoría + text_issue_updated: "A petición %{id} actualizouse por %{author}." + text_issues_destroy_confirmation: 'Seguro que quere borrar as peticións seleccionadas?' + text_issues_ref_in_commit_messages: Referencia e petición de corrección nas mensaxes + text_length_between: "Lonxitude entre %{min} e %{max} caracteres." + text_load_default_configuration: "Cargar a configuración predeterminada" + text_min_max_length_info: 0 para ningunha restrición + text_no_configuration_data: "Inda non se configuraron perfiles, nin tipos, estados e fluxo de traballo asociado a peticións. Recoméndase encarecidamente cargar a configuración predeterminada. Unha vez cargada, poderá modificala." + text_project_destroy_confirmation: Estás seguro de querer eliminar o proxecto? + text_reassign_time_entries: 'Reasignar as horas a esta petición:' + text_regexp_info: ex. ^[A-Z0-9]+$ + text_repository_usernames_mapping: "Estableza a correspondencia entre os usuarios de Redmine e os presentes no historial do repositorio.\nOs usuarios co mesmo nome ou correo en Redmine e no repositorio serán asociados automaticamente." + text_rmagick_available: RMagick dispoñíbel (opcional) + text_select_mail_notifications: Seleccionar os eventos a notificar + text_select_project_modules: 'Seleccione os módulos a activar para este proxecto:' + text_status_changed_by_changeset: "Aplicado nos cambios %{value}" + text_subprojects_destroy_warning: "Os proxectos secundarios: %{value} tamén se eliminarán" + text_tip_issue_begin_day: tarefa que comeza este día + text_tip_issue_begin_end_day: tarefa que comeza e remata este día + text_tip_issue_end_day: tarefa que remata este día + text_tracker_no_workflow: Non hai ningún fluxo de traballo definido para este tipo de petición + text_unallowed_characters: Caracteres non permitidos + text_user_mail_option: "Dos proxectos non seleccionados, só recibirá notificacións sobre elementos monitorizados ou elementos nos que estea involucrado (por exemplo, peticións das que vostede sexa autor ou asignadas a vostede)." + text_user_wrote: "%{value} escribiu:" + text_wiki_destroy_confirmation: Seguro que quere borrar o wiki e todo o seu contido? + text_workflow_edit: Seleccionar un fluxo de traballo para actualizar + warning_attachments_not_saved: "Non foi posíbel gardar %{count} ficheiros." + field_editable: "Editábel" + text_plugin_assets_writable: "Ten permisos de escritura no cartafol de recursos do complemento." + label_display: "Mostrar" + button_create_and_continue: "Crear en continuar" + text_custom_field_possible_values_info: "Cada valor nunha liña." + setting_repository_log_display_limit: "Número máximo de revisións que se mostran no ficheiro do historial." + setting_file_max_size_displayed: "Tamaño máximo dos ficheiros de texto que se mostran liña por liña." + field_watcher: "Seguidor" + setting_openid: "Permitir rexistrarse e acceder mediante OpenID." + field_identity_url: "URL de OpenID" + label_login_with_open_id_option: "ou acceda mediante OpenID." + field_content: "Contido" + label_descending: "Descendente" + label_sort: "Ordenar" + label_ascending: "Ascendente" + label_date_from_to: "De %{start} a %{end}" + label_greater_or_equal: ">=" + label_less_or_equal: "<=" + text_wiki_page_destroy_question: "Esta páxina ten %{descendants} subpáxinas e descendentes. Que quere facer?" + text_wiki_page_reassign_children: "Asignar as subpáxinas a esta páxina superior." + text_wiki_page_nullify_children: "Manter as subpáxinas como páxinas raíz." + text_wiki_page_destroy_children: "Eliminar as subpáxinas e todas as súas descendentes." + setting_password_min_length: "Lonxitude mínima dos contrasinais" + field_group_by: "Agrupar os resultados por" + mail_subject_wiki_content_updated: "Actualizouse a páxina «%{id}» do wiki." + label_wiki_content_added: "Engadiuse unha páxina ao wiki." + mail_subject_wiki_content_added: "Engadiuse a páxina «%{id}» ao wiki." + mail_body_wiki_content_added: "%{author} engadiu a páxina «%{id}» ao wiki." + label_wiki_content_updated: "Actualizouse a páxina." + mail_body_wiki_content_updated: "%{author} actualizou a páxina «%{id}» do wiki." + permission_add_project: "Crear un proxecto" + setting_new_project_user_role_id: "Rol que se lle dá aos usuarios que non son administradores e crear algún proxecto." + label_view_all_revisions: "Ver todas as revisións" + label_tag: "Etiqueta" + label_branch: "Rama" + error_no_tracker_in_project: "Non hai ningún tipo de petición asociado con este proxecto. Revise a configuración do proxecto." + error_no_default_issue_status: "Non se definiu un estado predeterminado para as peticións. Revise a configuración desde «Administración → Estados das peticións»." + text_journal_changed: "O campo «%{label}» cambiou de «%{old}» a «%{new}»." + text_journal_set_to: "O campo «%{label}» é agora «%{value}»." + text_journal_deleted: "Eliminouse o campo «%{label}» (%{old})." + label_group_plural: "Grupos" + label_group: "Grupo" + label_group_new: "Crear un grupo" + label_time_entry_plural: "Tempo empregado" + text_journal_added: "Engadiuse o campo «%{label}» co valor «%{value}»." + field_active: "Activo" + enumeration_system_activity: "Actividade do sistema" + permission_delete_issue_watchers: "Eliminar os seguidores" + version_status_closed: "pechada" + version_status_locked: "bloqueada" + version_status_open: "aberta" + error_can_not_reopen_issue_on_closed_version: "Non se pode volver abrir unha petición que estea asignada a unha versión pechada." + label_user_anonymous: "Anónimo" + button_move_and_follow: "Mover e seguir" + setting_default_projects_modules: "Módulos activados de maneira predeterminada para novos proxectos." + setting_gravatar_default: "Imaxe de Gravatar predeterminada" + field_sharing: "Compartir" + label_version_sharing_hierarchy: "Coa xerarquía do proxecto" + label_version_sharing_system: "Con todos os proxectos" + label_version_sharing_descendants: "Cos subproxectos" + label_version_sharing_tree: "Coa árbore de proxectos" + label_version_sharing_none: "Non compartir" + error_can_not_archive_project: "Non é posíbel arquivar este proxecto." + button_duplicate: "Duplicado" + button_copy_and_follow: "Copiar e seguir" + label_copy_source: "Fonte" + setting_issue_done_ratio: "Calcular a proporción de peticións completadas mediante" + setting_issue_done_ratio_issue_status: "O estado das peticións" + error_issue_done_ratios_not_updated: "Non se actualizaron as proporcións de peticións completadas." + error_workflow_copy_target: "Seleccione os tipos de petición e os roles." + setting_issue_done_ratio_issue_field: "Use o campo da petición" + label_copy_same_as_target: "O mesmo que o de destino" + label_copy_target: "Petición de destino" + notice_issue_done_ratios_updated: "Actualizáronse as proporcións de peticións completadas." + error_workflow_copy_source: "Seleccione un tipo de petición e rol de orixe." + label_update_issue_done_ratios: "Actualizar as proporcións de peticións completadas" + setting_start_of_week: "Que os calendarios comecen o" + permission_view_issues: "Ver as peticións" + label_display_used_statuses_only: "Só mostrar os estados que osa este tipo de petición." + label_revision_id: "Revisión %{value}" + label_api_access_key: "Chave de acceso á API" + label_api_access_key_created_on: "A chave de acceso á API creouse hai %{value}." + label_feeds_access_key: "Chave de acceso mediante Atom" + notice_api_access_key_reseted: "Restableceuse a súa chave de acceso á API." + setting_rest_api_enabled: "Activar o servizo web REST." + label_missing_api_access_key: "Necesita unha chave de acceso á API." + label_missing_feeds_access_key: "Necesita unha chave de acceso mediante Atom." + button_show: "Mostrar" + text_line_separated: "Permítense varios valores (un por liña)." + setting_mail_handler_body_delimiters: "Acurtar as mensaxes a partir dunha destas liñas." + permission_add_subprojects: "Crear subproxectos" + label_subproject_new: "Crear un sobproxecto" + text_own_membership_delete_confirmation: |- + Está a piques de eliminar todos ou parte dos permisos de que dispón, e pode + que en canto remate perda a capacidade de facer máis cambios neste proxecto. + Está seguro de que quere continuar? + label_close_versions: "Pechar as versións completadas" + label_board_sticky: "Destacado" + label_board_locked: "Bloqueado" + permission_export_wiki_pages: "Exportar as páxinas do wiki" + setting_cache_formatted_text: "Gardar o texto formatado na caché." + permission_manage_project_activities: "Xestionar as actividades do proxecto" + error_unable_delete_issue_status: "Non foi posíbel eliminar o estado da petición." + label_profile: "Perfil" + permission_manage_subtasks: "Xestionar as subtarefas" + field_parent_issue: "Tarefa superior" + label_subtask_plural: "Subtarefas" + label_project_copy_notifications: "Enviar notificacións por correo electrónico durante a copia do proxecto." + error_can_not_delete_custom_field: "Non foi posíbel eliminar o campo personalizado." + error_unable_to_connect: "Non foi posíbel conectarse (%{value})." + error_can_not_remove_role: "Este rol non pode eliminarse porque está a usarse." + error_can_not_delete_tracker: "Este tipo de petición non pode eliminarse porque existen peticións deste tipo." + field_principal: "Principal" + notice_failed_to_save_members: "Non foi posíbel gardar os membros: %{errors}." + text_zoom_out: "Afastar" + text_zoom_in: "Achegar" + notice_unable_delete_time_entry: "Non foi posíbel eliminar a entrada do historial." + label_overall_spent_time: "Tempo total empregado" + field_time_entries: "Rexistrar tempo" + project_module_gantt: "Gantt" + project_module_calendar: "Calendario" + button_edit_associated_wikipage: "Editar a páxina do wiki asociada: %{page_title}" + field_text: "Campo de texto" + setting_default_notification_option: "Opción de notificación predeterminada" + label_user_mail_option_only_my_events: "Só para as cousas que sigo ou nas que estou involucrado" + label_user_mail_option_none: "Non hai eventos." + field_member_of_group: "Grupo do asignado" + field_assigned_to_role: "Rol do asignado" + notice_not_authorized_archived_project: "O proxecto ao que intenta acceder está arquivado." + label_principal_search: "Buscar un usuario ou grupo:" + label_user_search: "Buscar un usuario:" + field_visible: "Visíbel" + setting_commit_logtime_activity_id: "Actividade de tempo rexistrado" + text_time_logged_by_changeset: "Aplicado nos cambios %{value}." + setting_commit_logtime_enabled: "Activar o rexistro de tempo." + notice_gantt_chart_truncated: "O diagrama recortouse porque se superou o número de elementos que pode mostrar (%{max})." + setting_gantt_items_limit: "Número máximo de elementos que se poden mostrar no diagrama de Gantt." + field_warn_on_leaving_unsaved: "Avisarme antes de pechar unha páxina que conteña texto sen gardar." + text_warn_on_leaving_unsaved: "A páxina actual contén texto sen gardar que se perderá se continúa." + label_my_queries: "Consultas personalizadas" + text_journal_changed_no_detail: "Actualizouse o campo «%{label}»." + label_news_comment_added: "Engadiuse un comentario a unha nova." + button_expand_all: "Expandilo todo" + button_collapse_all: "Recollelo todo" + label_additional_workflow_transitions_for_assignee: "Transicións adicionais que se lle permiten ao asignado" + label_additional_workflow_transitions_for_author: "Transicións adicionais que se lle permiten ao autor" + label_bulk_edit_selected_time_entries: "Editar as entradas de tempo seleccionadas á vez" + text_time_entries_destroy_confirmation: "Está seguro de que quere eliminar as entradas de tempo seleccionadas?" + label_role_anonymous: "Anónimo" + label_role_non_member: "Non membro" + label_issue_note_added: "Engadiuse a nota." + label_issue_status_updated: "Actualizouse o estado." + label_issue_priority_updated: "Actualizouse a prioridade." + label_issues_visibility_own: "Peticións creadas polo usuario ou asignadas a el" + field_issues_visibility: "Visibilidade das peticións" + label_issues_visibility_all: "Todas as peticións" + permission_set_own_issues_private: "Peticións propias públicas ou privadas" + field_is_private: "Privadas" + permission_set_issues_private: "Peticións públicas ou privadas" + label_issues_visibility_public: "Todas as peticións non privadas" + text_issues_destroy_descendants_confirmation: "Isto tamén eliminará %{count} subtareas." + field_commit_logs_encoding: "Codificación das mensaxes das remisións" + field_scm_path_encoding: "Codificación das rutas" + text_scm_path_encoding_note: "Predeterminada: UTF-8" + field_path_to_repository: "Ruta do repositorio" + field_root_directory: "Cartafol raíz" + field_cvs_module: "Módulo" + field_cvsroot: "CVSROOT" + text_mercurial_repository_note: "Repositorio local (por exemplo «/hgrepo» ou «C:\\hgrepo»)" + text_scm_command: "Orde" + text_scm_command_version: "Versión" + label_git_report_last_commit: "Informar da última remisión de ficheiros e cartafoles" + notice_issue_successful_create: "Creouse a petición %{id}." + label_between: "entre" + setting_issue_group_assignment: "Permitir asignar peticións a grupos." + label_diff: "Diferencias" + text_git_repository_note: "O repositorio está baleiro e é local (por exemplo, «/gitrepo» ou «C:\\gitrepo»)" + description_query_sort_criteria_direction: "Dirección da orde" + description_project_scope: "Ámbito da busca" + description_filter: "Filtro" + description_user_mail_notification: "Configuración das notificacións por correo electrónico" + description_message_content: "Contido da mensaxe" + description_available_columns: "Columnas dispoñíbeis" + description_issue_category_reassign: "Escolla a categoría da petición." + description_search: "Campo de busca" + description_notes: "Notas" + description_choose_project: "Proxectos" + description_query_sort_criteria_attribute: "Ordenar polo atributo" + description_wiki_subpages_reassign: "Escoller unha nova páxina superior" + description_selected_columns: "Columnas seleccionadas" + label_parent_revision: "Revisión superior" + label_child_revision: "Subrevisión" + error_scm_annotate_big_text_file: "Non pode engadirse unha anotación á entrada, supera o tamaño máximo para os ficheiros de texto." + setting_default_issue_start_date_to_creation_date: "usar a data actual como a data de inicio das novas peticións." + button_edit_section: "Editar esta sección" + setting_repositories_encodings: "Anexos e codificación dos repositorios" + description_all_columns: "Todas as columnas" + button_export: "Exportar" + label_export_options: "Opcións de exportación a %{export_format}" + error_attachment_too_big: "Non é posíbel enviar este ficheiro porque o seu tamaño supera o máximo permitido (%{max_size})." + notice_failed_to_save_time_entries: "Non foi posíbel gardar %{count} das %{total} entradas de tempo seleccionadas: %{ids}." + label_x_issues: + zero: "0 peticións" + one: "1 petición" + other: "%{count} peticións" + label_repository_new: "Engadir un repositorio" + field_repository_is_default: "Repositorio principal" + label_copy_attachments: "Copiar os anexos" + label_item_position: "%{position}/%{count}" + label_completed_versions: "Versións completadas" + text_project_identifier_info: "Só se permiten letras latinas minúsculas (a-z), díxitos, guións e guións baixos.
    Non pode cambiar o identificador despois de gardalo." + field_multiple: "Varios valores" + setting_commit_cross_project_ref: "Permitir ligar e solucionar peticións do resto de proxectos." + text_issue_conflict_resolution_add_notes: "Engadir as notas e descartar o resto dos cambios." + text_issue_conflict_resolution_overwrite: "Aplicar os cambios de todos xeitos (as notas anteriores manteranse, pero pode que se perda algún dos outros cambios)." + notice_issue_update_conflict: "Outro usuario actualizou a petición mentres vostede estaba a modificala." + text_issue_conflict_resolution_cancel: "Descartar todos os meus cambios e volver mostrar %{link}." + permission_manage_related_issues: "Xestionar as peticións relacionadas" + field_auth_source_ldap_filter: "Filtro de LDAP" + label_search_for_watchers: "Buscar seguidores que engadir" + notice_account_deleted: "A súa conta eliminouse de maneira permanente." + setting_unsubscribe: "Permitirlle aos usuarios eliminar as súas contas." + button_delete_my_account: "Eliminar a miña conta." + text_account_destroy_confirmation: |- + Está seguro de que quere continuar? + A súa conta eliminarase de maneira permanente, e non poderá volvela activar nunca. + error_session_expired: "Caducou a sesión, acceda de novo ao sitio." + text_session_expiration_settings: "Advertencia: ao cambiar estas opcións é posíbel que caduquen todas as sesións actuais, incluída a súa, e todos os usuarios deban identificarse de novo." + setting_session_lifetime: "Tempo de vida máximo das sesións" + setting_session_timeout: "Tempo de inactividade máximo das sesións" + label_session_expiration: "Caducidade das sesións" + permission_close_project: "Pechar ou volver abrir o proxecto" + label_show_closed_projects: "Ver os proxectos pechados" + button_close: "Pechar" + button_reopen: "Volver abrir" + project_status_active: "activo" + project_status_closed: "pechado" + project_status_archived: "arquivado" + text_project_closed: "O proxecto está pechado, e só admite accións de lectura." + notice_user_successful_create: "Creouse o usuario %{id}." + field_core_fields: "Campos estándar" + field_timeout: "Tempo límite (en segundos)" + setting_thumbnails_enabled: "Mostrar as miniaturas dos anexos." + setting_thumbnails_size: "Tamaño das miniaturas (en píxeles)" + label_status_transitions: "Transicións de estado" + label_fields_permissions: "Permisos dos campos" + label_readonly: "Só lectura" + label_required: "Necesario" + text_repository_identifier_info: "Só se permiten letras minúsculas latinas (a-z), díxitos, guións e guións baixos.
    Non pode cambiar o identificador unha vez queda gardado." + field_board_parent: "Foro superior" + label_attribute_of_project: "%{name} do proxecto" + label_attribute_of_author: "%{name} do autor" + label_attribute_of_assigned_to: "%{name} do asignado" + label_attribute_of_fixed_version: "%{name} da versión de destino" + label_copy_subtasks: "Copiar as subtarefas" + label_copied_to: "copiado a" + label_copied_from: "copiado de" + label_any_issues_in_project: "calquera petición do proxecto" + label_any_issues_not_in_project: "calquera petición fóra do proxecto" + field_private_notes: "Notas privadas" + permission_view_private_notes: "Ver as notas privadas" + permission_set_notes_private: "Marcar as notas como privadas" + label_no_issues_in_project: "O proxecto non ten peticións." + label_any: "todos" + label_last_n_weeks: "ultimas %{count} semanas" + setting_cross_project_subtasks: "Permitir tarefas en varios proxectos" + label_cross_project_descendants: "Con subproxectos" + label_cross_project_tree: "Con árbore de proxectos" + label_cross_project_hierarchy: "Con xerarquía de proxectos" + label_cross_project_system: "Con todos os proxectos" + button_hide: "Agochar" + setting_non_working_week_days: "Días non lectivos" + label_in_the_next_days: "nos seguintes" + label_in_the_past_days: "nos últimos" + label_attribute_of_user: "%{name} do usuario" + text_turning_multiple_off: "Se desactiva varios valores, eliminaranse varios valores para preservar só un valor por elemento." + label_attribute_of_issue: "%{name} da petición" + permission_add_documents: "Engadir documentos" + permission_edit_documents: "Editar os documentos" + permission_delete_documents: "Eliminar os documentos" + label_gantt_progress_line: "Liña do progreso" + setting_jsonp_enabled: "Activar a compatibilidade con JSONP." + field_inherit_members: "Herdar os membros" + field_closed_on: "Pechado" + field_generate_password: "Xerar un contrasinal" + setting_default_projects_tracker_ids: "Tipos de petición predeterminados para novos proxectos." + label_total_time: "Total" + text_scm_config: "Pode configurar as súas ordes de SCM en «config/configuration.yml». Reinicie o programa despois de gardar os cambios." + text_scm_command_not_available: "A orde de SCM non está dispoñíbel. Revise a opción desde o panel de administración." + setting_emails_header: "Cabeceira da mensaxe" + notice_account_not_activated_yet: 'Aínda non activou a conta. Siga esta ligazón para solicitar unha nova mensaxe de confirmación.' + notice_account_locked: "A conta está bloqueada." + label_hidden: "Agochado" + label_visibility_private: "só para min" + label_visibility_roles: "só para estes roles" + label_visibility_public: "para calquera usuario" + field_must_change_passwd: "Debe cambiar de contrasinal a seguinte vez que acceda ao sitio." + notice_new_password_must_be_different: "O novo contrasinal non pode ser idéntico ao contrasinal actual." + setting_mail_handler_excluded_filenames: "Excluír anexos por nome" + text_convert_available: "O programa «convert» de ImageMagick está dispoñíbel (opcional)." + label_link: "Ligazón" + label_only: "só" + label_drop_down_list: "lista despregábel" + label_checkboxes: "caixas de opción múltiple" + label_link_values_to: "Ligar os valores co URL" + setting_force_default_language_for_anonymous: "Definir un idioma predeterminado para os usuarios anónimos." + setting_force_default_language_for_loggedin: "Definir un idioma predeterminado para os usuarios rexistrados." + label_custom_field_select_type: "Seleccionar o tipo de obxecto ao que se anexará o campo personalizado." + label_issue_assigned_to_updated: "Actualizouse o asignado." + label_check_for_updates: "Comprobar se hai actualizacións" + label_latest_compatible_version: "Última versión compatíbel" + label_unknown_plugin: "Complemento descoñecido" + label_radio_buttons: "caixas de opción única" + label_group_anonymous: "Usuarios anónimos" + label_group_non_member: "Usuarios non membros" + label_add_projects: "Engadir proxectos" + field_default_status: "Estado predeterminado" + text_subversion_repository_note: "Exemplos: file:///, http://, https://, svn://, svn+[esquema de túnel]://" + field_users_visibility: "Visibilidade dos usuarios" + label_users_visibility_all: "Todos os usuarios activos" + label_users_visibility_members_of_visible_projects: "Membros de proxectos visíbeis" + label_edit_attachments: "Editar os ficheiros anexos" + setting_link_copied_issue: "Ligar aos tíckets ao copialos" + label_link_copied_issue: "Ligar ao tícket copiado" + label_ask: "Preguntar" + label_search_attachments_yes: Buscar nomes e descricións dos ficheiros + label_search_attachments_no: Non buscar ficheiros + label_search_attachments_only: Buscar só ficheiros + label_search_open_issues_only: Só peticións abertas + field_address: Correo electrónico + setting_max_additional_emails: Máximo número de enderezos de correo adicionais + label_email_address_plural: Correos + label_email_address_add: Engadir enderezo de correo + label_enable_notifications: Activar notificacións + label_disable_notifications: Desactivar notificacións + setting_search_results_per_page: Resultados da busca por páxina + label_blank_value: En branco + permission_copy_issues: Copiar peticións + error_password_expired: A túa contrasinal caducou ou o administrador obrígate + a cambiala. + field_time_entries_visibility: Visibilidade das entradas de tempo + setting_password_max_age: Obrigar a cambiar a contrasinal despois de + label_parent_task_attributes: Atributos da tarefa pai + label_parent_task_attributes_derived: Calculada a partir das subtarefas + label_parent_task_attributes_independent: Independente das subtarefas + label_time_entries_visibility_all: Todas as entradas de tempo + label_time_entries_visibility_own: Horas creadas polo usuario + label_member_management: Xestión de membros + label_member_management_all_roles: Todos os roles + label_member_management_selected_roles_only: Só estes roles + label_password_required: Confirma a túa contrasinal para continuar + label_total_spent_time: "Tempo total empregado" + notice_import_finished: "%{count} elementos foron importados" + notice_import_finished_with_errors: "%{count} dun total de %{total} elementos non puideron ser importados" + error_invalid_file_encoding: O ficheiro non é un ficheiro codificado %{encoding} válido + error_invalid_csv_file_or_settings: O ficheiro non é un arquivo CSV ou non coincide coas + opcións de abaixo + error_can_not_read_import_file: Aconteceu un erro lendo o ficheiro a importar + permission_import_issues: Importar peticións + label_import_issues: Importar peticións + label_select_file_to_import: Selecciona o ficheiro a importar + label_fields_separator: Separador dos campos + label_fields_wrapper: Envoltorio dos campos + label_encoding: Codificación + label_comma_char: Coma + label_semi_colon_char: Punto e coma + label_quote_char: Comilla simple + label_double_quote_char: Comilla dobre + label_fields_mapping: Mapeo de campos + label_file_content_preview: Vista previa do contido + label_create_missing_values: Crear valores non presentes + button_import: Importar + field_total_estimated_hours: Total de tempo estimado + label_api: API + label_total_plural: Totais + label_assigned_issues: Peticións asignadas + label_field_format_enumeration: Listaxe chave/valor + label_f_hour_short: '%{value} h' + field_default_version: Versión predeterminada + error_attachment_extension_not_allowed: A extensión anexada %{extension} non é permitida + setting_attachment_extensions_allowed: Extensións permitidas + setting_attachment_extensions_denied: Extensións prohibidas + label_any_open_issues: Calquera petición aberta + label_no_open_issues: Peticións non abertas + label_default_values_for_new_users: Valor predeterminado para novos usuarios + error_ldap_bind_credentials: A conta/contrasinal do LDAP non é válida + setting_sys_api_key: Chave da API + setting_lost_password: Esqueceu a contrasinal? + mail_subject_security_notification: Notificación de seguridade + mail_body_security_notification_change: ! '%{field} modificado.' + mail_body_security_notification_change_to: ! '%{field} modificado por %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} engadido.' + mail_body_security_notification_remove: ! '%{field} %{value} eliminado.' + mail_body_security_notification_notify_enabled: O correo electrónico %{value} agora recibirá + notificacións + mail_body_security_notification_notify_disabled: O correo electrónico %{value} deixará de recibir + notificacións + mail_body_settings_updated: ! 'As seguintes opcións foron actualizadas:' + field_remote_ip: Enderezo IP + label_wiki_page_new: Nova páxina wiki + label_relations: Relacións + button_filter: Filtro + mail_body_password_updated: A súa contrasinal foi cambiada. + label_no_preview: Non hai vista previa dispoñible + error_no_tracker_allowed_for_new_issue_in_project: O proxecto non ten ningún tipo + para que poida crear unha petición + label_tracker_all: Tódolos tipos + label_new_project_issue_tab_enabled: Amosar a lapela "Nova petición" + setting_new_item_menu_tab: Lapela no menú de cada proxecto para creación de novos obxectos + label_new_object_tab_enabled: Amosar a lista despregable "+" + error_no_projects_with_tracker_allowed_for_new_issue: Non hai proxectos con tipos + para as que poida crear unha petición + field_textarea_font: Fonte usada nas áreas de texto + label_font_default: Fonte por defecto + label_font_monospace: Fonte Monospaced + label_font_proportional: Fonte Proporcional + setting_timespan_format: Formato de período temporal + label_table_of_contents: Índice de contidos + setting_commit_logs_formatting: Aplicar formateo de texto para as mensaxes de commit + setting_mail_handler_enable_regex_delimiters: Activar expresións regulares + error_move_of_child_not_possible: 'A subtarefa %{child} non se pode mover ao novo + proxecto: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: O tempo empregado non pode + ser reasignado a unha petición que vai ser eliminada + setting_timelog_required_fields: Campos obrigatorios para as imputacións de tempo + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Só para as cousas que sigo ou que teño asignado + label_user_mail_option_only_owner: Só para as cousas que sigo ou son o propietario + warning_fields_cleared_on_bulk_edit: Os cambios provocarán o borrado automático + dos valores de un ou máis campos dos obxectos seleccionados + field_updated_by: Actualizado por + field_last_updated_by: Última actualización por + field_full_width_layout: Deseño para ancho completo + label_last_notes: Últimas notas + field_digest: Suma de verificación + field_default_assigned_to: Asignado por defecto + setting_show_custom_fields_on_registration: Amosar os campos personalizados no rexistro + permission_view_news: Ver noticias + label_no_preview_alternative_html: Non hai vista previa dispoñible. %{link} o ficheiro no seu lugar. + label_no_preview_download: Descargar diff --git a/config/locales/he.yml b/config/locales/he.yml new file mode 100644 index 0000000..59d70d8 --- /dev/null +++ b/config/locales/he.yml @@ -0,0 +1,1235 @@ +# Hebrew translation for Redmine +# Initiated by Dotan Nahum (dipidi@gmail.com) +# Jul 2010 - Updated by Orgad Shaneh (orgads@gmail.com) + +he: + direction: rtl + date: + formats: + default: "%d/%m/%Y" + short: "%d/%m" + long: "%d/%m/%Y" + only_day: "%e" + + day_names: [ראשון, שני, שלישי, רביעי, חמישי, שישי, שבת] + abbr_day_names: ["א'", "ב'", "ג'", "ד'", "ה'", "ו'", "ש'"] + month_names: [~, ינואר, פברואר, מרץ, אפריל, מאי, יוני, יולי, אוגוסט, ספטמבר, אוקטובר, נובמבר, דצמבר] + abbr_month_names: [~, יאנ, פבר, מרץ, אפר, מאי, יונ, יול, אוג, ספט, אוק, נוב, דצמ] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a %d/%m/%Y %H:%M:%S" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + only_second: "%S" + + datetime: + formats: + default: "%d-%m-%YT%H:%M:%S%Z" + + am: 'am' + pm: 'pm' + + datetime: + distance_in_words: + half_a_minute: 'חצי דקה' + less_than_x_seconds: + zero: 'פחות משניה' + one: 'פחות משניה' + other: 'פחות מ־%{count} שניות' + x_seconds: + one: 'שניה אחת' + other: '%{count} שניות' + less_than_x_minutes: + zero: 'פחות מדקה אחת' + one: 'פחות מדקה אחת' + other: 'פחות מ־%{count} דקות' + x_minutes: + one: 'דקה אחת' + other: '%{count} דקות' + about_x_hours: + one: 'בערך שעה אחת' + other: 'בערך %{count} שעות' + x_hours: + one: "1 שעה" + other: "%{count} שעות" + x_days: + one: 'יום אחד' + other: '%{count} ימים' + about_x_months: + one: 'בערך חודש אחד' + other: 'בערך %{count} חודשים' + x_months: + one: 'חודש אחד' + other: '%{count} חודשים' + about_x_years: + one: 'בערך שנה אחת' + other: 'בערך %{count} שנים' + over_x_years: + one: 'מעל שנה אחת' + other: 'מעל %{count} שנים' + almost_x_years: + one: "כמעט שנה" + other: "כמעט %{count} שנים" + + number: + format: + precision: 3 + separator: '.' + delimiter: ',' + currency: + format: + unit: 'ש"ח' + precision: 2 + format: '%u %n' + human: + storage_units: + format: "%n %u" + units: + byte: + one: "בייט" + other: "בתים" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + support: + array: + sentence_connector: "וגם" + skip_last_comma: true + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "לא נכלל ברשימה" + exclusion: "לא זמין" + invalid: "לא ולידי" + confirmation: "לא תואם לאישור" + accepted: "חייב באישור" + empty: "חייב להכלל" + blank: "חייב להכלל" + too_long: "ארוך מדי (לא יותר מ־%{count} תוים)" + too_short: "קצר מדי (לא יותר מ־%{count} תוים)" + wrong_length: "לא באורך הנכון (חייב להיות %{count} תוים)" + taken: "לא זמין" + not_a_number: "הוא לא מספר" + greater_than: "חייב להיות גדול מ־%{count}" + greater_than_or_equal_to: "חייב להיות גדול או שווה ל־%{count}" + equal_to: "חייב להיות שווה ל־%{count}" + less_than: "חייב להיות קטן מ־%{count}" + less_than_or_equal_to: "חייב להיות קטן או שווה ל־%{count}" + odd: "חייב להיות אי זוגי" + even: "חייב להיות זוגי" + greater_than_start_date: "חייב להיות מאוחר יותר מתאריך ההתחלה" + not_same_project: "לא שייך לאותו הפרויקט" + circular_dependency: "קשר זה יצור תלות מעגלית" + cant_link_an_issue_with_a_descendant: "לא ניתן לקשר נושא לתת־משימה שלו" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: בחר בבקשה + + general_text_No: 'לא' + general_text_Yes: 'כן' + general_text_no: 'לא' + general_text_yes: 'כן' + general_lang_name: 'Hebrew (עברית)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_updated: החשבון עודכן בהצלחה! + notice_account_invalid_credentials: שם משתמש או סיסמה שגויים + notice_account_password_updated: הסיסמה עודכנה בהצלחה! + notice_account_wrong_password: סיסמה שגויה + notice_account_register_done: החשבון נוצר בהצלחה. להפעלת החשבון לחץ על הקישור שנשלח לדוא"ל שלך. + notice_account_unknown_email: משתמש לא מוכר. + notice_can_t_change_password: החשבון הזה משתמש במקור הזדהות חיצוני. שינוי סיסמה הינו בילתי אפשר + notice_account_lost_email_sent: דוא"ל עם הוראות לבחירת סיסמה חדשה נשלח אליך. + notice_account_activated: חשבונך הופעל. אתה יכול להתחבר כעת. + notice_successful_create: יצירה מוצלחת. + notice_successful_update: עידכון מוצלח. + notice_successful_delete: מחיקה מוצלחת. + notice_successful_connection: חיבור מוצלח. + notice_file_not_found: הדף שאתה מנסה לגשת אליו אינו קיים או שהוסר. + notice_locking_conflict: המידע עודכן על ידי משתמש אחר. + notice_not_authorized: אינך מורשה לראות דף זה. + notice_not_authorized_archived_project: הפרויקט שאתה מנסה לגשת אליו נמצא בארכיון. + notice_email_sent: "דואל נשלח לכתובת %{value}" + notice_email_error: "ארעה שגיאה בעת שליחת הדואל (%{value})" + notice_feeds_access_key_reseted: מפתח ה־Atom שלך אופס. + notice_api_access_key_reseted: מפתח הגישה שלך ל־API אופס. + notice_failed_to_save_issues: "נכשרת בשמירת %{count} נושאים ב %{total} נבחרו: %{ids}." + notice_failed_to_save_members: "כשלון בשמירת חבר(ים): %{errors}." + notice_no_issue_selected: "לא נבחר אף נושא! בחר בבקשה את הנושאים שברצונך לערוך." + notice_account_pending: "החשבון שלך נוצר ועתה מחכה לאישור מנהל המערכת." + notice_default_data_loaded: אפשרויות ברירת מחדל מופעלות. + notice_unable_delete_version: לא ניתן למחוק גירסה + notice_unable_delete_time_entry: לא ניתן למחוק רשומת זמן. + notice_issue_done_ratios_updated: אחוזי התקדמות לנושא עודכנו. + + error_can_t_load_default_data: "אפשרויות ברירת המחדל לא הצליחו להיטען: %{value}" + error_scm_not_found: כניסה ו\או מהדורה אינם קיימים במאגר. + error_scm_command_failed: "ארעה שגיאה בעת ניסון גישה למאגר: %{value}" + error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה." + error_issue_not_found_in_project: 'הנושאים לא נמצאו או אינם שיכים לפרויקט' + error_no_tracker_in_project: לא הוגדר סיווג לפרויקט זה. נא בדוק את הגדרות הפרויקט. + error_no_default_issue_status: לא מוגדר מצב ברירת מחדל לנושאים. נא בדוק את התצורה ("ניהול -> מצבי נושא"). + error_can_not_delete_custom_field: לא ניתן למחוק שדה מותאם אישית + error_can_not_delete_tracker: קיימים נושאים בסיווג זה, ולא ניתן למחוק אותו. + error_can_not_remove_role: תפקיד זה נמצא בשימוש, ולא ניתן למחוק אותו. + error_can_not_reopen_issue_on_closed_version: לא ניתן לפתוח מחדש נושא שמשויך לגירסה סגורה + error_can_not_archive_project: לא ניתן לארכב פרויקט זה + error_issue_done_ratios_not_updated: אחוז התקדמות לנושא לא עודכן. + error_workflow_copy_source: נא בחר סיווג או תפקיד מקור + error_workflow_copy_target: נא בחר תפקיד(ים) וסיווג(ים) + error_unable_delete_issue_status: לא ניתן למחוק מצב נושא + error_unable_to_connect: לא ניתן להתחבר (%{value}) + warning_attachments_not_saved: "כשלון בשמירת %{count} קבצים." + + mail_subject_lost_password: "סיסמת ה־%{value} שלך" + mail_body_lost_password: 'לשינו סיסמת ה־Redmine שלך, לחץ על הקישור הבא:' + mail_subject_register: "הפעלת חשבון %{value}" + mail_body_register: 'להפעלת חשבון ה־Redmine שלך, לחץ על הקישור הבא:' + mail_body_account_information_external: "אתה יכול להשתמש בחשבון %{value} כדי להתחבר" + mail_body_account_information: פרטי החשבון שלך + mail_subject_account_activation_request: "בקשת הפעלה לחשבון %{value}" + mail_body_account_activation_request: "משתמש חדש (%{value}) נרשם. החשבון שלו מחכה לאישור שלך:" + mail_subject_reminder: "%{count} נושאים מיועדים להגשה בימים הקרובים (%{days})" + mail_body_reminder: "%{count} נושאים שמיועדים אליך מיועדים להגשה בתוך %{days} ימים:" + mail_subject_wiki_content_added: "דף ה־wiki ‏'%{id}' נוסף" + mail_body_wiki_content_added: דף ה־wiki ‏'%{id}' נוסף ע"י %{author}. + mail_subject_wiki_content_updated: "דף ה־wiki ‏'%{id}' עודכן" + mail_body_wiki_content_updated: דף ה־wiki ‏'%{id}' עודכן ע"י %{author}. + + + field_name: שם + field_description: תיאור + field_summary: תקציר + field_is_required: נדרש + field_firstname: שם פרטי + field_lastname: שם משפחה + field_mail: דוא"ל + field_filename: קובץ + field_filesize: גודל + field_downloads: הורדות + field_author: כותב + field_created_on: נוצר + field_updated_on: עודכן + field_field_format: פורמט + field_is_for_all: לכל הפרויקטים + field_possible_values: ערכים אפשריים + field_regexp: ביטוי רגיל + field_min_length: אורך מינימאלי + field_max_length: אורך מקסימאלי + field_value: ערך + field_category: קטגוריה + field_title: כותרת + field_project: פרויקט + field_issue: נושא + field_status: מצב + field_notes: הערות + field_is_closed: נושא סגור + field_is_default: ערך ברירת מחדל + field_tracker: סיווג + field_subject: שם נושא + field_due_date: תאריך סיום + field_assigned_to: אחראי + field_priority: עדיפות + field_fixed_version: גירסת יעד + field_user: מתשמש + field_principal: מנהל + field_role: תפקיד + field_homepage: דף הבית + field_is_public: פומבי + field_parent: תת פרויקט של + field_is_in_roadmap: נושאים המוצגים במפת הדרכים + field_login: שם משתמש + field_mail_notification: הודעות דוא"ל + field_admin: ניהול + field_last_login_on: התחברות אחרונה + field_language: שפה + field_effective_date: תאריך + field_password: סיסמה + field_new_password: סיסמה חדשה + field_password_confirmation: אישור + field_version: גירסה + field_type: סוג + field_host: שרת + field_port: פורט + field_account: חשבון + field_base_dn: בסיס DN + field_attr_login: תכונת התחברות + field_attr_firstname: תכונת שם פרטים + field_attr_lastname: תכונת שם משפחה + field_attr_mail: תכונת דוא"ל + field_onthefly: יצירת משתמשים זריזה + field_start_date: תאריך התחלה + field_done_ratio: "% גמור" + field_auth_source: מקור הזדהות + field_hide_mail: החבא את כתובת הדוא"ל שלי + field_comments: הערות + field_url: URL + field_start_page: דף התחלתי + field_subproject: תת־פרויקט + field_hours: שעות + field_activity: פעילות + field_spent_on: תאריך + field_identifier: מזהה + field_is_filter: משמש כמסנן + field_issue_to: נושאים קשורים + field_delay: עיקוב + field_assignable: ניתן להקצות נושאים לתפקיד זה + field_redirect_existing_links: העבר קישורים קיימים + field_estimated_hours: זמן משוער + field_column_names: עמודות + field_time_entries: רישום זמנים + field_time_zone: איזור זמן + field_searchable: ניתן לחיפוש + field_default_value: ערך ברירת מחדל + field_comments_sorting: הצג הערות + field_parent_title: דף אב + field_editable: ניתן לעריכה + field_watcher: צופה + field_identity_url: כתובת OpenID + field_content: תוכן + field_group_by: קבץ את התוצאות לפי + field_sharing: שיתוף + field_parent_issue: משימת אב + field_text: שדה טקסט + + setting_app_title: כותרת ישום + setting_app_subtitle: תת־כותרת ישום + setting_welcome_text: טקסט "ברוך הבא" + setting_default_language: שפת ברירת מחדל + setting_login_required: דרושה הזדהות + setting_self_registration: אפשר הרשמה עצמית + setting_attachment_max_size: גודל דבוקה מקסימאלי + setting_issues_export_limit: גבול יצוא נושאים + setting_mail_from: כתובת שליחת דוא"ל + setting_bcc_recipients: מוסתר (bcc) + setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML) + setting_host_name: שם שרת + setting_text_formatting: עיצוב טקסט + setting_wiki_compression: כיווץ היסטורית wiki + setting_feeds_limit: גבול תוכן הזנות + setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל + setting_autofetch_changesets: משיכה אוטומטית של שינויים + setting_sys_api_enabled: אפשר שירות רשת לניהול המאגר + setting_commit_ref_keywords: מילות מפתח מקשרות + setting_commit_fix_keywords: מילות מפתח מתקנות + setting_autologin: התחברות אוטומטית + setting_date_format: פורמט תאריך + setting_time_format: פורמט זמן + setting_cross_project_issue_relations: הרשה קישור נושאים בין פרויקטים + setting_issue_list_default_columns: עמודות ברירת מחדל המוצגות ברשימת הנושאים + setting_emails_footer: תחתית דוא"ל + setting_protocol: פרוטוקול + setting_per_page_options: אפשרויות אוביקטים לפי דף + setting_user_format: פורמט הצגת משתמשים + setting_activity_days_default: ימים המוצגים על פעילות הפרויקט + setting_display_subprojects_issues: הצג נושאים של תתי־פרויקטים כברירת מחדל + setting_enabled_scm: אפשר ניהול תצורה + setting_mail_handler_body_delimiters: חתוך כתובות דואר אחרי אחת משורות אלה + setting_mail_handler_api_enabled: אפשר שירות רשת לדואר נכנס + setting_mail_handler_api_key: מפתח API + setting_sequential_project_identifiers: השתמש במספרים עוקבים למזהי פרויקט + setting_gravatar_enabled: שימוש בצלמיות משתמשים מ־Gravatar + setting_gravatar_default: תמונת Gravatar ברירת מחדל + setting_diff_max_lines_displayed: מספר מירבי של שורות בתצוגת שינויים + setting_file_max_size_displayed: גודל מירבי של מלל המוצג בתוך השורה + setting_repository_log_display_limit: מספר מירבי של מהדורות המוצגות ביומן קובץ + setting_openid: אפשר התחברות ורישום באמצעות OpenID + setting_password_min_length: אורך סיסמה מינימאלי + setting_new_project_user_role_id: התפקיד שמוגדר למשתמש פשוט אשר יוצר פרויקט + setting_default_projects_modules: מודולים מאופשרים בברירת מחדל עבור פרויקטים חדשים + setting_issue_done_ratio: חשב אחוז התקדמות בנושא עם + setting_issue_done_ratio_issue_field: השתמש בשדה הנושא + setting_issue_done_ratio_issue_status: השתמש במצב הנושא + setting_start_of_week: השבוע מתחיל ביום + setting_rest_api_enabled: אפשר שירות רשת REST + setting_cache_formatted_text: שמור טקסט מעוצב במטמון + setting_default_notification_option: אפשרות התראה ברירת־מחדל + + permission_add_project: יצירת פרויקט + permission_add_subprojects: יצירת תתי־פרויקט + permission_edit_project: עריכת פרויקט + permission_select_project_modules: בחירת מודולי פרויקט + permission_manage_members: ניהול חברים + permission_manage_project_activities: נהל פעילויות פרויקט + permission_manage_versions: ניהול גירסאות + permission_manage_categories: ניהול קטגוריות נושאים + permission_view_issues: צפיה בנושאים + permission_add_issues: הוספת נושא + permission_edit_issues: עריכת נושאים + permission_manage_issue_relations: ניהול קשרים בין נושאים + permission_add_issue_notes: הוספת הערות לנושאים + permission_edit_issue_notes: עריכת רשימות + permission_edit_own_issue_notes: עריכת הערות של עצמו + permission_move_issues: הזזת נושאים + permission_delete_issues: מחיקת נושאים + permission_manage_public_queries: ניהול שאילתות פומביות + permission_save_queries: שמירת שאילתות + permission_view_gantt: צפיה בגאנט + permission_view_calendar: צפיה בלוח השנה + permission_view_issue_watchers: צפיה ברשימת צופים + permission_add_issue_watchers: הוספת צופים + permission_delete_issue_watchers: הסרת צופים + permission_log_time: תיעוד זמן שהושקע + permission_view_time_entries: צפיה ברישום זמנים + permission_edit_time_entries: עריכת רישום זמנים + permission_edit_own_time_entries: עריכת רישום הזמנים של עצמו + permission_manage_news: ניהול חדשות + permission_comment_news: תגובה לחדשות + permission_view_documents: צפיה במסמכים + permission_manage_files: ניהול קבצים + permission_view_files: צפיה בקבצים + permission_manage_wiki: ניהול wiki + permission_rename_wiki_pages: שינוי שם של דפי wiki + permission_delete_wiki_pages: מחיקת דפי wiki + permission_view_wiki_pages: צפיה ב־wiki + permission_view_wiki_edits: צפיה בהיסטורית wiki + permission_edit_wiki_pages: עריכת דפי wiki + permission_delete_wiki_pages_attachments: מחיקת דבוקות + permission_protect_wiki_pages: הגנה על כל דפי wiki + permission_manage_repository: ניהול מאגר + permission_browse_repository: סיור במאגר + permission_view_changesets: צפיה בסדרות שינויים + permission_commit_access: אישור הפקדות + permission_manage_boards: ניהול לוחות + permission_view_messages: צפיה בהודעות + permission_add_messages: הצבת הודעות + permission_edit_messages: עריכת הודעות + permission_edit_own_messages: עריכת הודעות של עצמו + permission_delete_messages: מחיקת הודעות + permission_delete_own_messages: מחיקת הודעות של עצמו + permission_export_wiki_pages: יצא דפי wiki + permission_manage_subtasks: נהל תתי־משימות + + project_module_issue_tracking: מעקב נושאים + project_module_time_tracking: מעקב אחר זמנים + project_module_news: חדשות + project_module_documents: מסמכים + project_module_files: קבצים + project_module_wiki: Wiki + project_module_repository: מאגר + project_module_boards: לוחות + project_module_calendar: לוח שנה + project_module_gantt: גאנט + + label_user: משתמש + label_user_plural: משתמשים + label_user_new: משתמש חדש + label_user_anonymous: אלמוני + label_project: פרויקט + label_project_new: פרויקט חדש + label_project_plural: פרויקטים + label_x_projects: + zero: ללא פרויקטים + one: פרויקט אחד + other: "%{count} פרויקטים" + label_project_all: כל הפרויקטים + label_project_latest: הפרויקטים החדשים ביותר + label_issue: נושא + label_issue_new: נושא חדש + label_issue_plural: נושאים + label_issue_view_all: צפה בכל הנושאים + label_issues_by: "נושאים לפי %{value}" + label_issue_added: נושא נוסף + label_issue_updated: נושא עודכן + label_document: מסמך + label_document_new: מסמך חדש + label_document_plural: מסמכים + label_document_added: מסמך נוסף + label_role: תפקיד + label_role_plural: תפקידים + label_role_new: תפקיד חדש + label_role_and_permissions: תפקידים והרשאות + label_member: חבר + label_member_new: חבר חדש + label_member_plural: חברים + label_tracker: סיווג + label_tracker_plural: סיווגים + label_tracker_new: סיווג חדש + label_workflow: זרימת עבודה + label_issue_status: מצב נושא + label_issue_status_plural: מצבי נושא + label_issue_status_new: מצב חדש + label_issue_category: קטגורית נושא + label_issue_category_plural: קטגוריות נושא + label_issue_category_new: קטגוריה חדשה + label_custom_field: שדה אישי + label_custom_field_plural: שדות אישיים + label_custom_field_new: שדה אישי חדש + label_enumerations: אינומרציות + label_enumeration_new: ערך חדש + label_information: מידע + label_information_plural: מידע + label_please_login: נא התחבר + label_register: הרשמה + label_login_with_open_id_option: או התחבר באמצעות OpenID + label_password_lost: אבדה הסיסמה? + label_home: דף הבית + label_my_page: הדף שלי + label_my_account: החשבון שלי + label_my_projects: הפרויקטים שלי + label_administration: ניהול + label_login: התחבר + label_logout: התנתק + label_help: עזרה + label_reported_issues: נושאים שדווחו + label_assigned_to_me_issues: נושאים שהוצבו לי + label_last_login: התחברות אחרונה + label_registered_on: נרשם בתאריך + label_activity: פעילות + label_overall_activity: פעילות כוללת + label_user_activity: "הפעילות של %{value}" + label_new: חדש + label_logged_as: מחובר כ + label_environment: סביבה + label_authentication: הזדהות + label_auth_source: מקור הזדהות + label_auth_source_new: מקור הזדהות חדש + label_auth_source_plural: מקורות הזדהות + label_subproject_plural: תת־פרויקטים + label_subproject_new: תת־פרויקט חדש + label_and_its_subprojects: "%{value} וכל תתי־הפרויקטים שלו" + label_min_max_length: אורך מינימאלי - מקסימאלי + label_list: רשימה + label_date: תאריך + label_integer: מספר שלם + label_float: צף + label_boolean: ערך בוליאני + label_string: טקסט + label_text: טקסט ארוך + label_attribute: תכונה + label_attribute_plural: תכונות + label_no_data: אין מידע להציג + label_change_status: שנה מצב + label_history: היסטוריה + label_attachment: קובץ + label_attachment_new: קובץ חדש + label_attachment_delete: מחק קובץ + label_attachment_plural: קבצים + label_file_added: קובץ נוסף + label_report: דו"ח + label_report_plural: דו"חות + label_news: חדשות + label_news_new: הוסף חדשות + label_news_plural: חדשות + label_news_latest: חדשות אחרונות + label_news_view_all: צפה בכל החדשות + label_news_added: חדשות נוספו + label_settings: הגדרות + label_overview: מבט רחב + label_version: גירסה + label_version_new: גירסה חדשה + label_version_plural: גירסאות + label_close_versions: סגור גירסאות שהושלמו + label_confirmation: אישור + label_export_to: יצא ל + label_read: קרא... + label_public_projects: פרויקטים פומביים + label_open_issues: פתוח + label_open_issues_plural: פתוחים + label_closed_issues: סגור + label_closed_issues_plural: סגורים + label_x_open_issues_abbr: + zero: 0 פתוחים + one: 1 פתוח + other: "%{count} פתוחים" + label_x_closed_issues_abbr: + zero: 0 סגורים + one: 1 סגור + other: "%{count} סגורים" + label_total: סה"כ + label_permissions: הרשאות + label_current_status: מצב נוכחי + label_new_statuses_allowed: מצבים חדשים אפשריים + label_all: הכל + label_none: כלום + label_nobody: אף אחד + label_next: הבא + label_previous: הקודם + label_used_by: בשימוש ע"י + label_details: פרטים + label_add_note: הוסף הערה + label_calendar: לוח שנה + label_months_from: חודשים מ + label_gantt: גאנט + label_internal: פנימי + label_last_changes: "%{count} שינוים אחרונים" + label_change_view_all: צפה בכל השינוים + label_comment: תגובה + label_comment_plural: תגובות + label_x_comments: + zero: אין הערות + one: הערה אחת + other: "%{count} הערות" + label_comment_add: הוסף תגובה + label_comment_added: תגובה נוספה + label_comment_delete: מחק תגובות + label_query: שאילתה אישית + label_query_plural: שאילתות אישיות + label_query_new: שאילתה חדשה + label_filter_add: הוסף מסנן + label_filter_plural: מסננים + label_equals: הוא + label_not_equals: הוא לא + label_in_less_than: בפחות מ + label_in_more_than: ביותר מ + label_greater_or_equal: ">=" + label_less_or_equal: <= + label_in: ב + label_today: היום + label_all_time: תמיד + label_yesterday: אתמול + label_this_week: השבוע + label_last_week: השבוע שעבר + label_last_n_days: "ב־%{count} ימים אחרונים" + label_this_month: החודש + label_last_month: חודש שעבר + label_this_year: השנה + label_date_range: טווח תאריכים + label_less_than_ago: פחות מ + label_more_than_ago: יותר מ + label_ago: לפני + label_contains: מכיל + label_not_contains: לא מכיל + label_day_plural: ימים + label_repository: מאגר + label_repository_plural: מאגרים + label_browse: סייר + label_branch: ענף + label_tag: סימון + label_revision: מהדורה + label_revision_plural: מהדורות + label_revision_id: מהדורה %{value} + label_associated_revisions: מהדורות קשורות + label_added: נוסף + label_modified: שונה + label_copied: הועתק + label_renamed: השם שונה + label_deleted: נמחק + label_latest_revision: מהדורה אחרונה + label_latest_revision_plural: מהדורות אחרונות + label_view_revisions: צפה במהדורות + label_view_all_revisions: צפה בכל המהדורות + label_max_size: גודל מקסימאלי + label_sort_highest: הזז לראשית + label_sort_higher: הזז למעלה + label_sort_lower: הזז למטה + label_sort_lowest: הזז לתחתית + label_roadmap: מפת הדרכים + label_roadmap_due_in: "נגמר בעוד %{value}" + label_roadmap_overdue: "%{value} מאחר" + label_roadmap_no_issues: אין נושאים לגירסה זו + label_search: חפש + label_result_plural: תוצאות + label_all_words: כל המילים + label_wiki: Wiki + label_wiki_edit: ערוך wiki + label_wiki_edit_plural: עריכות wiki + label_wiki_page: דף Wiki + label_wiki_page_plural: דפי wiki + label_index_by_title: סדר על פי כותרת + label_index_by_date: סדר על פי תאריך + label_current_version: גירסה נוכחית + label_preview: תצוגה מקדימה + label_feed_plural: הזנות + label_changes_details: פירוט כל השינויים + label_issue_tracking: מעקב אחר נושאים + label_spent_time: זמן שהושקע + label_overall_spent_time: זמן שהושקע סה"כ + label_f_hour: "%{value} שעה" + label_f_hour_plural: "%{value} שעות" + label_time_tracking: מעקב זמנים + label_change_plural: שינויים + label_statistics: סטטיסטיקות + label_commits_per_month: הפקדות לפי חודש + label_commits_per_author: הפקדות לפי כותב + label_view_diff: צפה בשינויים + label_diff_inline: בתוך השורה + label_diff_side_by_side: צד לצד + label_options: אפשרויות + label_copy_workflow_from: העתק זירמת עבודה מ + label_permissions_report: דו"ח הרשאות + label_watched_issues: נושאים שנצפו + label_related_issues: נושאים קשורים + label_applied_status: מצב מוחל + label_loading: טוען... + label_relation_new: קשר חדש + label_relation_delete: מחק קשר + label_relates_to: קשור ל + label_duplicates: מכפיל את + label_duplicated_by: שוכפל ע"י + label_blocks: חוסם את + label_blocked_by: חסום ע"י + label_precedes: מקדים את + label_follows: עוקב אחרי + label_stay_logged_in: השאר מחובר + label_disabled: מבוטל + label_show_completed_versions: הצג גירסאות גמורות + label_me: אני + label_board: פורום + label_board_new: פורום חדש + label_board_plural: פורומים + label_board_locked: נעול + label_board_sticky: דביק + label_topic_plural: נושאים + label_message_plural: הודעות + label_message_last: הודעה אחרונה + label_message_new: הודעה חדשה + label_message_posted: הודעה נוספה + label_reply_plural: השבות + label_send_information: שלח מידע על חשבון למשתמש + label_year: שנה + label_month: חודש + label_week: שבוע + label_date_from: מתאריך + label_date_to: עד + label_language_based: מבוסס שפה + label_sort_by: "מיין לפי %{value}" + label_send_test_email: שלח דוא"ל בדיקה + label_feeds_access_key: מפתח גישה ל־Atom + label_missing_feeds_access_key: חסר מפתח גישה ל־Atom + label_feeds_access_key_created_on: "מפתח הזנת Atom נוצר לפני%{value}" + label_module_plural: מודולים + label_added_time_by: 'נוסף ע"י %{author} לפני %{age}' + label_updated_time_by: 'עודכן ע"י %{author} לפני %{age}' + label_updated_time: "עודכן לפני %{value} " + label_jump_to_a_project: קפוץ לפרויקט... + label_file_plural: קבצים + label_changeset_plural: סדרות שינויים + label_default_columns: עמודת ברירת מחדל + label_no_change_option: (אין שינוים) + label_bulk_edit_selected_issues: ערוך את הנושאים המסומנים + label_theme: ערכת נושא + label_default: ברירת מחדל + label_search_titles_only: חפש בכותרות בלבד + label_user_mail_option_all: "לכל אירוע בכל הפרויקטים שלי" + label_user_mail_option_selected: "לכל אירוע בפרויקטים שבחרתי בלבד..." + label_user_mail_option_only_my_events: עבור דברים שאני צופה או מעורב בהם בלבד + label_user_mail_no_self_notified: "אני לא רוצה שיודיעו לי על שינויים שאני מבצע" + label_registration_activation_by_email: הפעל חשבון באמצעות דוא"ל + label_registration_manual_activation: הפעלת חשבון ידנית + label_registration_automatic_activation: הפעלת חשבון אוטומטית + label_display_per_page: "בכל דף: %{value} תוצאות" + label_age: גיל + label_change_properties: שנה מאפיינים + label_general: כללי + label_scm: מערכת ניהול תצורה + label_plugins: תוספים + label_ldap_authentication: הזדהות LDAP + label_downloads_abbr: D/L + label_optional_description: תיאור רשות + label_add_another_file: הוסף עוד קובץ + label_preferences: העדפות + label_chronological_order: בסדר כרונולוגי + label_reverse_chronological_order: בסדר כרונולוגי הפוך + label_incoming_emails: דוא"ל נכנס + label_generate_key: צור מפתח + label_issue_watchers: צופים + label_example: דוגמא + label_display: תצוגה + label_sort: מיון + label_ascending: בסדר עולה + label_descending: בסדר יורד + label_date_from_to: 'מתאריך %{start} ועד תאריך %{end}' + label_wiki_content_added: נוסף דף ל־wiki + label_wiki_content_updated: דף wiki עודכן + label_group: קבוצה + label_group_plural: קבוצות + label_group_new: קבוצה חדשה + label_time_entry_plural: זמן שהושקע + label_version_sharing_none: לא משותף + label_version_sharing_descendants: עם פרויקטים בנים + label_version_sharing_hierarchy: עם היררכית הפרויקטים + label_version_sharing_tree: עם עץ הפרויקט + label_version_sharing_system: עם כל הפרויקטים + label_update_issue_done_ratios: עדכן אחוז התקדמות לנושא + label_copy_source: מקור + label_copy_target: יעד + label_copy_same_as_target: זהה ליעד + label_display_used_statuses_only: הצג רק את המצבים בשימוש לסיווג זה + label_api_access_key: מפתח גישה ל־API + label_missing_api_access_key: חסר מפתח גישה ל־API + label_api_access_key_created_on: 'מפתח גישה ל־API נוצר לפני %{value}' + label_profile: פרופיל + label_subtask_plural: תתי־משימות + label_project_copy_notifications: שלח התראות דואר במהלך העתקת הפרויקט + + button_login: התחבר + button_submit: אשר + button_save: שמור + button_check_all: בחר הכל + button_uncheck_all: בחר כלום + button_delete: מחק + button_create: צור + button_create_and_continue: צור ופתח חדש + button_test: בדוק + button_edit: ערוך + button_edit_associated_wikipage: "ערוך דף wiki מקושר: %{page_title}" + button_add: הוסף + button_change: שנה + button_apply: החל + button_clear: נקה + button_lock: נעל + button_unlock: בטל נעילה + button_download: הורד + button_list: רשימה + button_view: צפה + button_move: הזז + button_move_and_follow: העבר ועקוב + button_back: הקודם + button_cancel: בטל + button_activate: הפעל + button_sort: מיין + button_log_time: רישום זמנים + button_rollback: חזור למהדורה זו + button_watch: צפה + button_unwatch: בטל צפיה + button_reply: השב + button_archive: ארכיון + button_unarchive: הוצא מהארכיון + button_reset: אפס + button_rename: שנה שם + button_change_password: שנה סיסמה + button_copy: העתק + button_copy_and_follow: העתק ועקוב + button_annotate: הוסף תיאור מסגרת + button_update: עדכן + button_configure: אפשרויות + button_quote: צטט + button_duplicate: שכפל + button_show: הצג + + status_active: פעיל + status_registered: רשום + status_locked: נעול + + version_status_open: פתוח + version_status_locked: נעול + version_status_closed: סגור + + field_active: פעיל + + text_select_mail_notifications: בחר פעולת שבגללן ישלח דוא"ל. + text_regexp_info: כגון. ^[A-Z0-9]+$ + text_min_max_length_info: 0 משמעו ללא הגבלות + text_project_destroy_confirmation: האם אתה בטוח שברצונך למחוק את הפרויקט ואת כל המידע הקשור אליו? + text_subprojects_destroy_warning: "תת־הפרויקטים: %{value} ימחקו גם כן." + text_workflow_edit: בחר תפקיד וסיווג כדי לערוך את זרימת העבודה + text_are_you_sure: האם אתה בטוח? + text_journal_changed: "%{label} השתנה מ%{old} ל%{new}" + text_journal_set_to: "%{label} נקבע ל%{value}" + text_journal_deleted: "%{label} נמחק (%{old})" + text_journal_added: "%{label} %{value} נוסף" + text_tip_issue_begin_day: מטלה המתחילה היום + text_tip_issue_end_day: מטלה המסתיימת היום + text_tip_issue_begin_end_day: מטלה המתחילה ומסתיימת היום + text_caracters_maximum: "מקסימום %{count} תווים." + text_caracters_minimum: "חייב להיות לפחות באורך של %{count} תווים." + text_length_between: "אורך בין %{min} ל %{max} תווים." + text_tracker_no_workflow: זרימת עבודה לא הוגדרה עבור סיווג זה + text_unallowed_characters: תווים לא מורשים + text_comma_separated: הכנסת ערכים מרובים מותרת (מופרדים בפסיקים). + text_line_separated: ניתן להזין מספר ערכים (שורה אחת לכל ערך). + text_issues_ref_in_commit_messages: קישור ותיקום נושאים בהודעות הפקדה + text_issue_added: "הנושא %{id} דווח (בידי %{author})." + text_issue_updated: "הנושא %{id} עודכן (בידי %{author})." + text_wiki_destroy_confirmation: האם אתה בטוח שברצונך למחוק את הWIKI הזה ואת כל תוכנו? + text_issue_category_destroy_question: "כמה נושאים (%{count}) מוצבים לקטגוריה הזו. מה ברצונך לעשות?" + text_issue_category_destroy_assignments: הסר הצבת קטגוריה + text_issue_category_reassign_to: הצב מחדש את הקטגוריה לנושאים + text_user_mail_option: "בפרויקטים שלא בחרת, אתה רק תקבל התרעות על שאתה צופה או קשור אליהם (לדוגמא:נושאים שאתה היוצר שלהם או אחראי עליהם)." + text_no_configuration_data: "לא הוגדרה תצורה עבור תפקידים, סיווגים, מצבי נושא וזרימת עבודה.\nמומלץ מאד לטעון את תצורת ברירת המחדל. תוכל לשנותה מאוחר יותר." + text_load_default_configuration: טען את אפשרויות ברירת המחדל + text_status_changed_by_changeset: "הוחל בסדרת השינויים %{value}." + text_issues_destroy_confirmation: 'האם אתה בטוח שברצונך למחוק את הנושאים?' + text_select_project_modules: 'בחר מודולים להחיל על פרויקט זה:' + text_default_administrator_account_changed: מנהל המערכת ברירת המחדל שונה + text_file_repository_writable: מאגר הקבצים ניתן לכתיבה + text_plugin_assets_writable: ספרית נכסי תוספים ניתנת לכתיבה + text_rmagick_available: RMagick זמין (רשות) + text_destroy_time_entries_question: "%{hours} שעות דווחו על הנושאים שאתה עומד למחוק. מה ברצונך לעשות?" + text_destroy_time_entries: מחק שעות שדווחו + text_assign_time_entries_to_project: הצב שעות שדווחו לפרויקט הזה + text_reassign_time_entries: 'הצב מחדש שעות שדווחו לפרויקט הזה:' + text_user_wrote: "%{value} כתב:" + text_enumeration_destroy_question: "%{count} אוביקטים מוצבים לערך זה." + text_enumeration_category_reassign_to: 'הצב מחדש לערך הזה:' + text_email_delivery_not_configured: 'לא נקבעה תצורה לשליחת דואר, וההתראות כבויות.\nקבע את תצורת שרת ה־SMTP בקובץ /etc/redmine/<instance>/configuration.yml והתחל את האפליקציה מחדש ע"מ לאפשר אותם.' + text_repository_usernames_mapping: "בחר או עדכן את משתמש Redmine הממופה לכל שם משתמש ביומן המאגר.\nמשתמשים בעלי שם או כתובת דואר זהה ב־Redmine ובמאגר ממופים באופן אוטומטי." + text_diff_truncated: '... השינויים עוברים את מספר השורות המירבי לתצוגה, ולכן הם קוצצו.' + text_custom_field_possible_values_info: שורה אחת לכל ערך + text_wiki_page_destroy_question: לדף זה יש %{descendants} דפים בנים ותלויים. מה ברצונך לעשות? + text_wiki_page_nullify_children: השאר דפים בנים כדפים ראשיים + text_wiki_page_destroy_children: מחק את הדפים הבנים ואת כל התלויים בהם + text_wiki_page_reassign_children: הצב מחדש דפים בנים לדף האב הנוכחי + text_own_membership_delete_confirmation: |- + בכוונתך למחוק חלק או את כל ההרשאות שלך. לאחר מכן לא תוכל יותר לערוך פרויקט זה. + האם אתה בטוח שברצונך להמשיך? + text_zoom_in: התקרב + text_zoom_out: התרחק + + default_role_manager: מנהל + default_role_developer: מפתח + default_role_reporter: מדווח + default_tracker_bug: תקלה + default_tracker_feature: יכולת + default_tracker_support: תמיכה + default_issue_status_new: חדש + default_issue_status_in_progress: בעבודה + default_issue_status_resolved: נפתר + default_issue_status_feedback: משוב + default_issue_status_closed: סגור + default_issue_status_rejected: נדחה + default_doc_category_user: תיעוד משתמש + default_doc_category_tech: תיעוד טכני + default_priority_low: נמוכה + default_priority_normal: רגילה + default_priority_high: גבוהה + default_priority_urgent: דחופה + default_priority_immediate: מידית + default_activity_design: עיצוב + default_activity_development: פיתוח + + enumeration_issue_priorities: עדיפות נושאים + enumeration_doc_categories: קטגוריות מסמכים + enumeration_activities: פעילויות (מעקב אחר זמנים) + enumeration_system_activity: פעילות מערכת + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: קידוד הודעות הפקדה + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 נושא + one: 1 נושא + other: "%{count} נושאים" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: הכל + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: עם פרויקטים בנים + label_cross_project_tree: עם עץ הפרויקט + label_cross_project_hierarchy: עם היררכית הפרויקטים + label_cross_project_system: עם כל הפרויקטים + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: סה"כ + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: דוא"ל + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: זמן שהושקע סה"כ + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: מפתח API + setting_lost_password: אבדה הסיסמה? + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/hr.yml b/config/locales/hr.yml new file mode 100644 index 0000000..89ea299 --- /dev/null +++ b/config/locales/hr.yml @@ -0,0 +1,1229 @@ +hr: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%m/%d/%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Nedjelja, Ponedjeljak, Utorak, Srijeda, Četvrtak, Petak, Subota] + abbr_day_names: [Ned, Pon, Uto, Sri, Čet, Pet, Sub] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Siječanj, Veljača, Ožujak, Travanj, Svibanj, Lipanj, Srpanj, Kolovoz, Rujan, Listopad, Studeni, Prosinac] + abbr_month_names: [~, Sij, Velj, Ožu, Tra, Svi, Lip, Srp, Kol, Ruj, Lis, Stu, Pro] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%m/%d/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "pola minute" + less_than_x_seconds: + one: "manje od sekunde" + other: "manje od %{count} sekundi" + x_seconds: + one: "1 sekunda" + other: "%{count} sekundi" + less_than_x_minutes: + one: "manje od minute" + other: "manje od %{count} minuta" + x_minutes: + one: "1 minuta" + other: "%{count} minuta" + about_x_hours: + one: "oko sat vremena" + other: "oko %{count} sati" + x_hours: + one: "1 sata" + other: "%{count} sati" + x_days: + one: "1 dan" + other: "%{count} dana" + about_x_months: + one: "oko 1 mjesec" + other: "oko %{count} mjeseci" + x_months: + one: "mjesec" + other: "%{count} mjeseci" + about_x_years: + one: "1 godina" + other: "%{count} godina" + over_x_years: + one: "preko 1 godine" + other: "preko %{count} godina" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "i" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nije ukljuceno u listu" + exclusion: "je rezervirano" + invalid: "nije ispravno" + confirmation: "ne odgovara za potvrdu" + accepted: "mora biti prihvaćen" + empty: "ne može biti prazno" + blank: "ne može biti razmaka" + too_long: "je predug (maximum is %{count} characters)" + too_short: "je prekratak (minimum is %{count} characters)" + wrong_length: "je pogrešne dužine (should be %{count} characters)" + taken: "već je zauzeto" + not_a_number: "nije broj" + not_a_date: "nije ispravan datum" + greater_than: "mora biti veći od %{count}" + greater_than_or_equal_to: "mora biti veći ili jednak %{count}" + equal_to: "mora biti jednak %{count}" + less_than: "mora biti manji od %{count}" + less_than_or_equal_to: "mora bit manji ili jednak%{count}" + odd: "mora biti neparan" + even: "mora biti paran" + greater_than_start_date: "mora biti veci nego pocetni datum" + not_same_project: "ne pripada istom projektu" + circular_dependency: "Ovaj relacija stvara kružnu ovisnost" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Molimo odaberite + + general_text_No: 'Ne' + general_text_Yes: 'Da' + general_text_no: 'ne' + general_text_yes: 'da' + general_lang_name: 'Croatian (Hrvatski)' + general_csv_separator: ';' + general_csv_decimal_separator: ',' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_updated: Vaš profil je uspješno promijenjen. + notice_account_invalid_credentials: Neispravno korisničko ime ili zaporka. + notice_account_password_updated: Zaporka je uspješno promijenjena. + notice_account_wrong_password: Pogrešna zaporka + notice_account_register_done: Racun je uspješno napravljen. Da biste aktivirali svoj račun, kliknite na link koji vam je poslan na e-mail. + notice_account_unknown_email: Nepoznati korisnik. + notice_can_t_change_password: Ovaj račun koristi eksterni izvor prijavljivanja. Nemoguće je promijeniti zaporku. + notice_account_lost_email_sent: E-mail s uputama kako bi odabrali novu zaporku je poslan na na vašu e-mail adresu. + notice_account_activated: Vaš racun je aktiviran. Možete se prijaviti. + notice_successful_create: Uspješno napravljeno. + notice_successful_update: Uspješna promjena. + notice_successful_delete: Uspješno brisanje. + notice_successful_connection: Uspješna veza. + notice_file_not_found: Stranica kojoj ste pokušali pristupiti ne postoji ili je uklonjena. + notice_locking_conflict: Podataci su ažurirani od strane drugog korisnika. + notice_not_authorized: Niste ovlašteni za pristup ovoj stranici. + notice_email_sent: E-mail je poslan %{value}" + notice_email_error: Dogodila se pogreška tijekom slanja E-maila (%{value})" + notice_feeds_access_key_reseted: Vaš Atom pristup je resetovan. + notice_api_access_key_reseted: Vaš API pristup je resetovan. + notice_failed_to_save_issues: "Neuspjelo spremanje %{count} predmeta na %{total} odabrane: %{ids}." + notice_no_issue_selected: "Niti jedan predmet nije odabran! Molim, odaberite predmete koje želite urediti." + notice_account_pending: "Vaš korisnicki račun je otvoren, čeka odobrenje administratora." + notice_default_data_loaded: Konfiguracija je uspješno učitana. + notice_unable_delete_version: Nije moguće izbrisati verziju. + notice_issue_done_ratios_updated: Issue done ratios updated. + + error_can_t_load_default_data: "Zadanu konfiguracija nije učitana: %{value}" + error_scm_not_found: "Unos i/ili revizija nije pronađen." + error_scm_command_failed: "Dogodila se pogreška prilikom pokušaja pristupa: %{value}" + error_scm_annotate: "Ne postoji ili ne može biti obilježen." + error_issue_not_found_in_project: 'Nije pronađen ili ne pripada u ovaj projekt' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' + error_can_not_archive_project: This project can not be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + + warning_attachments_not_saved: "%{count} Datoteka/e nije mogla biti spremljena." + + mail_subject_lost_password: "Vaša %{value} zaporka" + mail_body_lost_password: 'Kako biste promijenili Vašu zaporku slijedite poveznicu:' + mail_subject_register: "Aktivacija korisničog računa %{value}" + mail_body_register: 'Da biste aktivirali svoj račun, kliknite na sljedeci link:' + mail_body_account_information_external: "Možete koristiti vaš račun %{value} za prijavu." + mail_body_account_information: Vaši korisnički podaci + mail_subject_account_activation_request: "%{value} predmet za aktivaciju korisničkog računa" + mail_body_account_activation_request: "Novi korisnik (%{value}) je registriran. Njegov korisnički račun čeka vaše odobrenje:" + mail_subject_reminder: "%{count} predmet(a) dospijeva sljedećih %{days} dana" + mail_body_reminder: "%{count} vama dodijeljen(ih) predmet(a) dospijeva u sljedećih %{days} dana:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + + field_name: Ime + field_description: Opis + field_summary: Sažetak + field_is_required: Obavezno + field_firstname: Ime + field_lastname: Prezime + field_mail: E-pošta + field_filename: Datoteka + field_filesize: Veličina + field_downloads: Preuzimanja + field_author: Autor + field_created_on: Napravljen + field_updated_on: Promijenjen + field_field_format: Format + field_is_for_all: Za sve projekte + field_possible_values: Moguće vrijednosti + field_regexp: Regularni izraz + field_min_length: Minimalna dužina + field_max_length: Maksimalna dužina + field_value: Vrijednost + field_category: Kategorija + field_title: Naslov + field_project: Projekt + field_issue: Predmet + field_status: Status + field_notes: Napomene + field_is_closed: Predmet je zatvoren + field_is_default: Zadana vrijednost + field_tracker: Tracker + field_subject: Predmet + field_due_date: Do datuma + field_assigned_to: Dodijeljeno + field_priority: Prioritet + field_fixed_version: Verzija + field_user: Korisnik + field_role: Uloga + field_homepage: Naslovnica + field_is_public: Javni projekt + field_parent: Potprojekt od + field_is_in_roadmap: Predmeti se prikazuju u Putokazu + field_login: Korisničko ime + field_mail_notification: Obavijest putem e-pošte + field_admin: Administrator + field_last_login_on: Zadnja prijava + field_language: Primarni jezik + field_effective_date: Datum + field_password: Zaporka + field_new_password: Nova zaporka + field_password_confirmation: Potvrda zaporke + field_version: Verzija + field_type: Tip + field_host: Host + field_port: Port + field_account: Racun + field_base_dn: Osnovni DN + field_attr_login: Login atribut + field_attr_firstname: Atribut imena + field_attr_lastname: Atribut prezimena + field_attr_mail: Atribut e-pošte + field_onthefly: "Izrada korisnika \"u hodu\"" + field_start_date: Pocetak + field_done_ratio: "% Učinjeno" + field_auth_source: Vrsta prijavljivanja + field_hide_mail: Sakrij moju adresu e-pošte + field_comments: Komentar + field_url: URL + field_start_page: Početna stranica + field_subproject: Potprojekt + field_hours: Sati + field_activity: Aktivnost + field_spent_on: Datum + field_identifier: Identifikator + field_is_filter: Korišteno kao filtar + field_issue_to_id: Povezano s predmetom + field_delay: Odgodeno + field_assignable: Predmeti mogu biti dodijeljeni ovoj ulozi + field_redirect_existing_links: Preusmjeravanje postojećih linkova + field_estimated_hours: Procijenjeno vrijeme + field_column_names: Stupci + field_time_zone: Vremenska zona + field_searchable: Pretraživo + field_default_value: Zadana vrijednost + field_comments_sorting: Prikaz komentara + field_parent_title: Parent page + field_editable: Editable + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Content + field_group_by: Group results by + + setting_app_title: Naziv aplikacije + setting_app_subtitle: Podnaslov aplikacije + setting_welcome_text: Tekst dobrodošlice + setting_default_language: Zadani jezik + setting_login_required: Potrebna je prijava + setting_self_registration: Samoregistracija je dozvoljena + setting_attachment_max_size: Maksimalna veličina privitka + setting_issues_export_limit: Ograničenje izvoza predmeta + setting_mail_from: Izvorna adresa e-pošte + setting_bcc_recipients: Blind carbon copy primatelja (bcc) + setting_plain_text_mail: obični tekst pošte (bez HTML-a) + setting_host_name: Naziv domaćina (host) + setting_text_formatting: Oblikovanje teksta + setting_wiki_compression: Sažimanje + setting_feeds_limit: Ogranicenje unosa sadržaja + setting_default_projects_public: Novi projekti su javni po defaultu + setting_autofetch_changesets: Autofetch commits + setting_sys_api_enabled: Omogući WS za upravljanje skladištem + setting_commit_ref_keywords: Referentne ključne riječi + setting_commit_fix_keywords: Fiksne ključne riječi + setting_autologin: Automatska prijava + setting_date_format: Format datuma + setting_time_format: Format vremena + setting_cross_project_issue_relations: Dozvoli povezivanje predmeta izmedu različitih projekata + setting_issue_list_default_columns: Stupci prikazani na listi predmeta + setting_emails_footer: Zaglavlje e-pošte + setting_protocol: Protokol + setting_per_page_options: Objekata po stranici opcija + setting_user_format: Oblik prikaza korisnika + setting_activity_days_default: Dani prikazane aktivnosti na projektu + setting_display_subprojects_issues: Prikaz predmeta potprojekta na glavnom projektu po defaultu + setting_enabled_scm: Omogućen SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Omoguci WS za dolaznu e-poštu + setting_mail_handler_api_key: API ključ + setting_sequential_project_identifiers: Generiraj slijedne identifikatore projekta + setting_gravatar_enabled: Koristi Gravatar korisničke ikone + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Maksimalni broj diff linija za prikazati + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + + permission_add_project: Dodaj projekt + permission_add_subprojects: Dodaj potprojekt + permission_edit_project: Uredi projekt + permission_select_project_modules: Odaberi projektne module + permission_manage_members: Upravljaj članovima + permission_manage_versions: Upravljaj verzijama + permission_manage_categories: Upravljaj kategorijama predmeta + permission_view_issues: Pregledaj zahtjeve + permission_add_issues: Dodaj predmete + permission_edit_issues: Uredi predmete + permission_manage_issue_relations: Upravljaj relacijama predmeta + permission_add_issue_notes: Dodaj bilješke + permission_edit_issue_notes: Uredi bilješke + permission_edit_own_issue_notes: Uredi vlastite bilješke + permission_move_issues: Premjesti predmete + permission_delete_issues: Brisanje predmeta + permission_manage_public_queries: Upravljaj javnim upitima + permission_save_queries: Spremi upite + permission_view_gantt: Pregledaj gantt grafikon + permission_view_calendar: Pregledaj kalendar + permission_view_issue_watchers: Pregledaj listu promatraca + permission_add_issue_watchers: Dodaj promatrača + permission_delete_issue_watchers: Delete watchers + permission_log_time: Dnevnik utrošenog vremena + permission_view_time_entries: Pregledaj utrošeno vrijeme + permission_edit_time_entries: Uredi vremenske dnevnike + permission_edit_own_time_entries: Edit own time logs + permission_manage_news: Upravljaj novostima + permission_comment_news: Komentiraj novosti + permission_view_documents: Pregledaj dokumente + permission_manage_files: Upravljaj datotekama + permission_view_files: Pregledaj datoteke + permission_manage_wiki: Upravljaj wikijem + permission_rename_wiki_pages: Promijeni ime wiki stranicama + permission_delete_wiki_pages: Obriši wiki stranice + permission_view_wiki_pages: Pregledaj wiki + permission_view_wiki_edits: Pregledaj povijest wikija + permission_edit_wiki_pages: Uredi wiki stranice + permission_delete_wiki_pages_attachments: Obriši privitke + permission_protect_wiki_pages: Zaštiti wiki stranice + permission_manage_repository: Upravljaj skladištem + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Mogućnost pohranjivanja + permission_manage_boards: Manage boards + permission_view_messages: Pregledaj poruke + permission_add_messages: Objavi poruke + permission_edit_messages: Uredi poruke + permission_edit_own_messages: Uredi vlastite poruke + permission_delete_messages: Obriši poruke + permission_delete_own_messages: Obriši vlastite poruke + + project_module_issue_tracking: Praćenje predmeta + project_module_time_tracking: Praćenje vremena + project_module_news: Novosti + project_module_documents: Dokumenti + project_module_files: Datoteke + project_module_wiki: Wiki + project_module_repository: Skladište + project_module_boards: Boards + + label_user: Korisnik + label_user_plural: Korisnici + label_user_new: Novi korisnik + label_user_anonymous: Anonymous + label_project: Projekt + label_project_new: Novi projekt + label_project_plural: Projekti + label_x_projects: + zero: no projects + one: 1 project + other: "%{count} projects" + label_project_all: Svi Projekti + label_project_latest: Najnoviji projekt + label_issue: Predmet + label_issue_new: Novi predmet + label_issue_plural: Predmeti + label_issue_view_all: Pregled svih predmeta + label_issues_by: "Predmeti od %{value}" + label_issue_added: Predmet dodan + label_issue_updated: Predmet promijenjen + label_document: Dokument + label_document_new: Novi dokument + label_document_plural: Dokumenti + label_document_added: Dokument dodan + label_role: Uloga + label_role_plural: Uloge + label_role_new: Nova uloga + label_role_and_permissions: Uloge i ovlasti + label_member: Član + label_member_new: Novi član + label_member_plural: Članovi + label_tracker: Vrsta + label_tracker_plural: Vrste predmeta + label_tracker_new: Nova vrsta + label_workflow: Tijek rada + label_issue_status: Status predmeta + label_issue_status_plural: Status predmeta + label_issue_status_new: Novi status + label_issue_category: Kategorija predmeta + label_issue_category_plural: Kategorije predmeta + label_issue_category_new: Nova kategorija + label_custom_field: Korisnički definirano polje + label_custom_field_plural: Korisnički definirana polja + label_custom_field_new: Novo korisnički definirano polje + label_enumerations: Pobrojenice + label_enumeration_new: Nova vrijednost + label_information: Informacija + label_information_plural: Informacije + label_please_login: Molim prijavite se + label_register: Registracija + label_login_with_open_id_option: or login with OpenID + label_password_lost: Izgubljena zaporka + label_home: Početna stranica + label_my_page: Moja stranica + label_my_account: Moj profil + label_my_projects: Moji projekti + label_administration: Administracija + label_login: Korisnik + label_logout: Odjava + label_help: Pomoć + label_reported_issues: Prijavljeni predmeti + label_assigned_to_me_issues: Moji predmeti + label_last_login: Last connection + label_registered_on: Registrirano + label_activity: Aktivnosti + label_overall_activity: Aktivnosti + label_user_activity: "%{value} ova/ina aktivnost" + label_new: Novi + label_logged_as: Prijavljeni ste kao + label_environment: Okolina + label_authentication: Autentikacija + label_auth_source: Način prijavljivanja + label_auth_source_new: Novi način prijavljivanja + label_auth_source_plural: Načini prijavljivanja + label_subproject_plural: Potprojekti + label_subproject_new: Novi potprojekt + label_and_its_subprojects: "%{value} i njegovi potprojekti" + label_min_max_length: Min - Maks veličina + label_list: Liste + label_date: Datum + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Text + label_text: Long text + label_attribute: Atribut + label_attribute_plural: Atributi + label_no_data: Nema podataka za prikaz + label_change_status: Promjena statusa + label_history: Povijest + label_attachment: Datoteka + label_attachment_new: Nova datoteka + label_attachment_delete: Brisanje datoteke + label_attachment_plural: Datoteke + label_file_added: Datoteka dodana + label_report: Izvješće + label_report_plural: Izvješća + label_news: Novosti + label_news_new: Dodaj novost + label_news_plural: Novosti + label_news_latest: Novosti + label_news_view_all: Pregled svih novosti + label_news_added: Novosti dodane + label_settings: Postavke + label_overview: Pregled + label_version: Verzija + label_version_new: Nova verzija + label_version_plural: Verzije + label_confirmation: Potvrda + label_export_to: 'Izvoz u:' + label_read: Čitaj... + label_public_projects: Javni projekti + label_open_issues: Otvoren + label_open_issues_plural: Otvoreno + label_closed_issues: Zatvoren + label_closed_issues_plural: Zatvoreno + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_total: Ukupno + label_permissions: Dozvole + label_current_status: Trenutni status + label_new_statuses_allowed: Novi status je dozvoljen + label_all: Svi + label_none: nema + label_nobody: nitko + label_next: Naredni + label_previous: Prethodni + label_used_by: Korišten od + label_details: Detalji + label_add_note: Dodaj napomenu + label_calendar: Kalendar + label_months_from: Mjeseci od + label_gantt: Gantt + label_internal: Interno + label_last_changes: "Posljednjih %{count} promjena" + label_change_view_all: Prikaz svih promjena + label_comment: Komentar + label_comment_plural: Komentari + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_comment_add: Dodaj komentar + label_comment_added: Komentar dodan + label_comment_delete: Brisanje komentara + label_query: Korisnički upit + label_query_plural: Korisnički upiti + label_query_new: Novi upit + label_filter_add: Dodaj filtar + label_filter_plural: Filtri + label_equals: je + label_not_equals: nije + label_in_less_than: za manje od + label_in_more_than: za više od + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: za točno + label_today: danas + label_all_time: sva vremena + label_yesterday: jučer + label_this_week: ovog tjedna + label_last_week: prošlog tjedna + label_last_n_days: "zadnjih %{count} dana" + label_this_month: ovog mjeseca + label_last_month: prošlog mjeseca + label_this_year: ove godine + label_date_range: vremenski raspon + label_less_than_ago: manje od + label_more_than_ago: više od + label_ago: prije + label_contains: Sadrži + label_not_contains: ne sadrži + label_day_plural: dana + label_repository: Skladište + label_repository_plural: Skladišta + label_browse: Pregled + label_branch: Branch + label_tag: Tag + label_revision: Revizija + label_revision_plural: Revizije + label_revision_id: "Revision %{value}" + label_associated_revisions: Dodijeljene revizije + label_added: dodano + label_modified: promijenjen + label_copied: kopirano + label_renamed: preimenovano + label_deleted: obrisano + label_latest_revision: Posljednja revizija + label_latest_revision_plural: Posljednje revizije + label_view_revisions: Pregled revizija + label_view_all_revisions: View all revisions + label_max_size: Maksimalna veličina + label_sort_highest: Premjesti na vrh + label_sort_higher: Premjesti prema gore + label_sort_lower: Premjesti prema dolje + label_sort_lowest: Premjesti na dno + label_roadmap: Putokaz + label_roadmap_due_in: "Završava se za %{value}" + label_roadmap_overdue: "%{value} kasni" + label_roadmap_no_issues: Nema predmeta za ovu verziju + label_search: Traži + label_result_plural: Rezultati + label_all_words: Sve riječi + label_wiki: Wiki + label_wiki_edit: Wiki promjena + label_wiki_edit_plural: Wiki promjene + label_wiki_page: Wiki stranica + label_wiki_page_plural: Wiki stranice + label_index_by_title: Indeks po naslovima + label_index_by_date: Indeks po datumu + label_current_version: Trenutna verzija + label_preview: Brzi pregled + label_feed_plural: Feeds + label_changes_details: Detalji svih promjena + label_issue_tracking: Praćenje predmeta + label_spent_time: Utrošeno vrijeme + label_f_hour: "%{value} sata" + label_f_hour_plural: "%{value} sati" + label_time_tracking: Praćenje vremena + label_change_plural: Promjene + label_statistics: Statistika + label_commits_per_month: Pohrana po mjesecu + label_commits_per_author: Pohrana po autoru + label_view_diff: Pregled razlika + label_diff_inline: uvučeno + label_diff_side_by_side: paralelno + label_options: Opcije + label_copy_workflow_from: Kopiraj tijek rada od + label_permissions_report: Izvješće o dozvolama + label_watched_issues: Praćeni predmeti + label_related_issues: Povezani predmeti + label_applied_status: Primijenjen status + label_loading: Učitavam... + label_relation_new: Nova relacija + label_relation_delete: Brisanje relacije + label_relates_to: u relaciji sa + label_duplicates: Duplira + label_duplicated_by: ponovljen kao + label_blocks: blokira + label_blocked_by: blokiran od strane + label_precedes: prethodi + label_follows: slijedi + label_stay_logged_in: Ostanite prijavljeni + label_disabled: Isključen + label_show_completed_versions: Prikaži završene verzije + label_me: ja + label_board: Forum + label_board_new: Novi forum + label_board_plural: Forumi + label_topic_plural: Teme + label_message_plural: Poruke + label_message_last: Posljednja poruka + label_message_new: Nova poruka + label_message_posted: Poruka dodana + label_reply_plural: Odgovori + label_send_information: Pošalji korisniku informaciju o profilu + label_year: Godina + label_month: Mjesec + label_week: Tjedan + label_date_from: Od + label_date_to: Do + label_language_based: Zasnovano na jeziku + label_sort_by: "Uredi po %{value}" + label_send_test_email: Pošalji testno E-pismo + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom kljuc za pristup je napravljen prije %{value}" + label_module_plural: Moduli + label_added_time_by: "Promijenio %{author} prije %{age}" + label_updated_time_by: "Dodao/la %{author} prije %{age}" + label_updated_time: "Promijenjeno prije %{value}" + label_jump_to_a_project: Prebaci se na projekt... + label_file_plural: Datoteke + label_changeset_plural: Promjene + label_default_columns: Zadani stupci + label_no_change_option: (Bez promjene) + label_bulk_edit_selected_issues: Zajednička promjena izabranih predmeta + label_theme: Tema + label_default: Zadana + label_search_titles_only: Pretraživanje samo naslova + label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" + label_user_mail_option_selected: "Za bilo koji događaj samo za izabrane projekte..." + label_user_mail_no_self_notified: "Ne želim primati obavijesti o promjenama koje sam napravim" + label_registration_activation_by_email: aktivacija putem e-pošte + label_registration_manual_activation: ručna aktivacija + label_registration_automatic_activation: automatska aktivacija + label_display_per_page: "Po stranici: %{value}" + label_age: Starost + label_change_properties: Promijeni svojstva + label_general: Općenito + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: LDAP autentikacija + label_downloads_abbr: D/L + label_optional_description: Opcije + label_add_another_file: Dodaj još jednu datoteku + label_preferences: Preferences + label_chronological_order: U kronološkom redoslijedu + label_reverse_chronological_order: U obrnutom kronološkom redoslijedu + label_incoming_emails: Dolazne poruke e-pošte + label_generate_key: Generiraj ključ + label_issue_watchers: Promatrači + label_example: Primjer + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Grupe + label_group_new: Nova grupa + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + + button_login: Prijavi + button_submit: Pošalji + button_save: Spremi + button_check_all: Označi sve + button_uncheck_all: Isključi sve + button_delete: Obriši + button_create: Napravi + button_create_and_continue: Napravi i nastavi + button_test: Test + button_edit: Uredi + button_add: Dodaj + button_change: Promijeni + button_apply: Primijeni + button_clear: Ukloni + button_lock: Zaključaj + button_unlock: Otključaj + button_download: Preuzmi + button_list: Spisak + button_view: Pregled + button_move: Premjesti + button_move_and_follow: Move and follow + button_back: Nazad + button_cancel: Odustani + button_activate: Aktiviraj + button_sort: Redoslijed + button_log_time: Zapiši vrijeme + button_rollback: Izvrši rollback na ovu verziju + button_watch: Prati + button_unwatch: Prekini pracenje + button_reply: Odgovori + button_archive: Arhiviraj + button_rollback: Dearhiviraj + button_reset: Poništi + button_rename: Promijeni ime + button_change_password: Promjena zaporke + button_copy: Kopiraj + button_copy_and_follow: Copy and follow + button_annotate: Annotate + button_update: Promijeni + button_configure: Konfiguracija + button_quote: Navod + button_duplicate: Duplicate + button_show: Show + + status_active: aktivan + status_registered: Registriran + status_locked: zaključan + + version_status_open: open + version_status_locked: locked + version_status_closed: closed + + field_active: Active + + text_select_mail_notifications: Izbor akcija za koje će biti poslana obavijest e-poštom. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 znači bez ograničenja + text_project_destroy_confirmation: Da li ste sigurni da želite izbrisati ovaj projekt i sve njegove podatke? + text_subprojects_destroy_warning: "Njegov(i) potprojekt(i): %{value} će također biti obrisan." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Da li ste sigurni? + text_journal_changed: "%{label} promijenjen iz %{old} u %{new}" + text_journal_set_to: "%{label} postavi na %{value}" + text_journal_deleted: "%{label} izbrisano (%{old})" + text_journal_added: "%{label} %{value} added" + text_tip_issue_begin_day: Zadaci koji počinju ovog dana + text_tip_issue_end_day: zadaci koji se završavaju ovog dana + text_tip_issue_begin_end_day: Zadaci koji počinju i završavaju se ovog dana + text_caracters_maximum: "Najviše %{count} znakova." + text_caracters_minimum: "Mora biti dugačko najmanje %{count} znakova." + text_length_between: "Dužina izmedu %{min} i %{max} znakova." + text_tracker_no_workflow: Tijek rada nije definiran za ovaj tracker + text_unallowed_characters: Nedozvoljeni znakovi + text_comma_separated: Višestruke vrijednosti su dozvoljene (razdvojene zarezom). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_tracker_no_workflow: No workflow defined for this tracker + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Predmet %{id} je prijavljen (prijavio %{author})." + text_issue_updated: "Predmet %{id} je promijenjen %{author})." + text_wiki_destroy_confirmation: Da li ste sigurni da želite izbrisati ovaj wiki i njegov sadržaj? + text_issue_category_destroy_question: "Neke predmeti (%{count}) su dodijeljeni ovoj kategoriji. Što želite uraditi?" + text_issue_category_destroy_assignments: Ukloni dodjeljivanje kategorija + text_issue_category_reassign_to: Ponovo dodijeli predmete ovoj kategoriji + text_user_mail_option: "Za neizabrane projekte, primit ćete obavjesti samo o stvarima koje pratite ili u kojima sudjelujete (npr. predmete koje ste vi napravili ili koje su vama dodjeljeni)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Učitaj početnu konfiguraciju + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Jeste li sigurni da želite obrisati izabrani/e predmet(e)?' + text_select_project_modules: 'Odaberite module koji će biti omogućeni za ovaj projekt:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Dozvoljeno pisanje u direktorij za privitke + text_plugin_assets_writable: Plugin assets directory writable + text_rmagick_available: RMagick dostupan (nije obavezno) + text_destroy_time_entries_question: "%{hours} sati je prijavljeno za predmete koje želite obrisati. Što ćete učiniti?" + text_destroy_time_entries: Obriši prijavljene sate + text_assign_time_entries_to_project: Pridruži prijavljene sate projektu + text_reassign_time_entries: 'Premjesti prijavljene sate ovom predmetu:' + text_user_wrote: "%{value} je napisao/la:" + text_enumeration_destroy_question: "%{count} objekata je pridruženo toj vrijednosti." + text_enumeration_category_reassign_to: 'Premjesti ih ovoj vrijednosti:' + text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_diff_truncated: '... Ovaj diff je odrezan zato što prelazi maksimalnu veličinu koja može biti prikazana.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + default_role_manager: Upravitelj + default_role_developer: Razvojni inženjer + default_role_reporter: Korisnik + default_tracker_bug: Pogreška + default_tracker_feature: Funkcionalnost + default_tracker_support: Podrška + default_issue_status_new: Novo + default_issue_status_assigned: Dodijeljeno + default_issue_status_resolved: Riješeno + default_issue_status_feedback: Povratna informacija + default_issue_status_closed: Zatvoreno + default_issue_status_rejected: Odbaceno + default_doc_category_user: Korisnička dokumentacija + default_doc_category_tech: Tehnička dokumentacija + default_priority_low: Nizak + default_priority_normal: Redovan + default_priority_high: Visok + default_priority_urgent: Hitan + default_priority_immediate: Odmah + default_activity_design: Dizajn + default_activity_development: Razvoj + enumeration_issue_priorities: Prioriteti predmeta + enumeration_doc_categories: Kategorija dokumenata + enumeration_activities: Aktivnosti (po vremenu) + enumeration_system_activity: System Activity + field_sharing: Sharing + text_line_separated: Multiple values allowed (one line for each value). + label_close_versions: Close completed versions + button_unarchive: Unarchive + field_issue_to: Related issue + default_issue_status_in_progress: In Progress + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 predmet + one: 1 predmet + other: "%{count} predmeti" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: Svi + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Ukupno + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: E-pošta + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API ključ + setting_lost_password: Izgubljena zaporka + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/hu.yml b/config/locales/hu.yml new file mode 100644 index 0000000..37ff35a --- /dev/null +++ b/config/locales/hu.yml @@ -0,0 +1,1249 @@ +# Hungarian translations for Ruby on Rails +# by Richard Abonyi (richard.abonyi@gmail.com) +# thanks to KKata, replaced and #hup.hu +# Cleaned up by László Bácsi (http://lackac.hu) +# updated by kfl62 kfl62g@gmail.com +# updated by Gábor Takács (taky77@gmail.com) + +"hu": + direction: ltr + date: + formats: + default: "%Y.%m.%d." + short: "%b %e." + long: "%Y. %B %e." + day_names: [vasárnap, hétfő, kedd, szerda, csütörtök, péntek, szombat] + abbr_day_names: [v., h., k., sze., cs., p., szo.] + month_names: [~, január, február, március, április, május, június, július, augusztus, szeptember, október, november, december] + abbr_month_names: [~, jan., febr., márc., ápr., máj., jún., júl., aug., szept., okt., nov., dec.] + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y. %b %d., %H:%M" + time: "%H:%M" + short: "%b %e., %H:%M" + long: "%Y. %B %e., %A, %H:%M" + am: "de." + pm: "du." + + datetime: + distance_in_words: + half_a_minute: 'fél perc' + less_than_x_seconds: +# zero: 'kevesebb, mint 1 másodperce' + one: 'kevesebb, mint 1 másodperce' + other: 'kevesebb, mint %{count} másodperce' + x_seconds: + one: '1 másodperce' + other: '%{count} másodperce' + less_than_x_minutes: +# zero: 'kevesebb, mint 1 perce' + one: 'kevesebb, mint 1 perce' + other: 'kevesebb, mint %{count} perce' + x_minutes: + one: '1 perce' + other: '%{count} perce' + about_x_hours: + one: 'csaknem 1 órája' + other: 'csaknem %{count} órája' + x_hours: + one: "1 óra" + other: "%{count} óra" + x_days: + one: '1 napja' + other: '%{count} napja' + about_x_months: + one: 'csaknem 1 hónapja' + other: 'csaknem %{count} hónapja' + x_months: + one: '1 hónapja' + other: '%{count} hónapja' + about_x_years: + one: 'csaknem 1 éve' + other: 'csaknem %{count} éve' + over_x_years: + one: 'több, mint 1 éve' + other: 'több, mint %{count} éve' + almost_x_years: + one: "csaknem 1 éve" + other: "csaknem %{count} éve" + prompts: + year: "Év" + month: "Hónap" + day: "Nap" + hour: "Óra" + minute: "Perc" + second: "Másodperc" + + number: + format: + precision: 2 + separator: ',' + delimiter: ' ' + currency: + format: + unit: 'Ft' + precision: 0 + format: '%n %u' + separator: "," + delimiter: "" + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "bájt" + other: "bájt" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + support: + array: +# sentence_connector: "és" +# skip_last_comma: true + words_connector: ", " + two_words_connector: " és " + last_word_connector: " és " + activerecord: + errors: + template: + header: + one: "1 hiba miatt nem menthető a következő: %{model}" + other: "%{count} hiba miatt nem menthető a következő: %{model}" + body: "Problémás mezők:" + messages: + inclusion: "nincs a listában" + exclusion: "nem elérhető" + invalid: "nem megfelelő" + confirmation: "nem egyezik" + accepted: "nincs elfogadva" + empty: "nincs megadva" + blank: "nincs megadva" + too_long: "túl hosszú (nem lehet több %{count} karakternél)" + too_short: "túl rövid (legalább %{count} karakter kell legyen)" + wrong_length: "nem megfelelő hosszúságú (%{count} karakter szükséges)" + taken: "már foglalt" + not_a_number: "nem szám" + greater_than: "nagyobb kell legyen, mint %{count}" + greater_than_or_equal_to: "legalább %{count} kell legyen" + equal_to: "pontosan %{count} kell legyen" + less_than: "kevesebb, mint %{count} kell legyen" + less_than_or_equal_to: "legfeljebb %{count} lehet" + odd: "páratlan kell legyen" + even: "páros kell legyen" + greater_than_start_date: "nagyobbnak kell lennie, mint az indítás dátuma" + not_same_project: "nem azonos projekthez tartozik" + circular_dependency: "Ez a kapcsolat egy körkörös függőséget eredményez" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Kérem válasszon + + general_text_No: 'Nem' + general_text_Yes: 'Igen' + general_text_no: 'nem' + general_text_yes: 'igen' + general_lang_name: 'Hungarian (Magyar)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-2 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: A fiók adatai sikeresen frissítve. + notice_account_invalid_credentials: Hibás felhasználói név, vagy jelszó + notice_account_password_updated: A jelszó módosítása megtörtént. + notice_account_wrong_password: Hibás jelszó + notice_account_register_done: A fiók sikeresen létrehozva. Aktiválásához kattints az e-mailben kapott linkre + notice_account_unknown_email: Ismeretlen felhasználó. + notice_can_t_change_password: A fiók külső azonosítási forrást használ. A jelszó megváltoztatása nem lehetséges. + notice_account_lost_email_sent: Egy e-mail üzenetben postáztunk Önnek egy leírást az új jelszó beállításáról. + notice_account_activated: Fiókját aktiváltuk. Most már be tud jelentkezni a rendszerbe. + notice_successful_create: Sikeres létrehozás. + notice_successful_update: Sikeres módosítás. + notice_successful_delete: Sikeres törlés. + notice_successful_connection: Sikeres bejelentkezés. + notice_file_not_found: Az oldal, amit meg szeretne nézni nem található, vagy átkerült egy másik helyre. + notice_locking_conflict: Az adatot egy másik felhasználó idő közben módosította. + notice_not_authorized: Nincs hozzáférési engedélye ehhez az oldalhoz. + notice_email_sent: "Egy e-mail üzenetet küldtünk a következő címre %{value}" + notice_email_error: "Hiba történt a levél küldése közben (%{value})" + notice_feeds_access_key_reseted: Az Atom hozzáférési kulcsát újra generáltuk. + notice_failed_to_save_issues: "Nem sikerült a %{count} feladat(ok) mentése a %{total} -ban kiválasztva: %{ids}." + notice_no_issue_selected: "Nincs feladat kiválasztva! Kérem jelölje meg melyik feladatot szeretné szerkeszteni!" + notice_account_pending: "A fiókja létrejött, és adminisztrátori jóváhagyásra vár." + notice_default_data_loaded: Az alapértelmezett konfiguráció betöltése sikeresen megtörtént. + + error_can_t_load_default_data: "Az alapértelmezett konfiguráció betöltése nem lehetséges: %{value}" + error_scm_not_found: "A bejegyzés, vagy revízió nem található a tárolóban." + error_scm_command_failed: "A tároló elérése közben hiba lépett fel: %{value}" + error_scm_annotate: "A bejegyzés nem létezik, vagy nics jegyzetekkel ellátva." + error_issue_not_found_in_project: 'A feladat nem található, vagy nem ehhez a projekthez tartozik' + + mail_subject_lost_password: Az Ön Redmine jelszava + mail_body_lost_password: 'A Redmine jelszó megváltoztatásához, kattintson a következő linkre:' + mail_subject_register: Redmine azonosító aktiválása + mail_body_register: 'A Redmine azonosítója aktiválásához, kattintson a következő linkre:' + mail_body_account_information_external: "A %{value} azonosító használatával bejelentkezhet a Redmine-ba." + mail_body_account_information: Az Ön Redmine azonosítójának információi + mail_subject_account_activation_request: Redmine azonosító aktiválási kérelem + mail_body_account_activation_request: "Egy új felhasználó (%{value}) regisztrált, azonosítója jóváhasgyásra várakozik:" + + + field_name: Név + field_description: Leírás + field_summary: Összegzés + field_is_required: Kötelező + field_firstname: Keresztnév + field_lastname: Vezetéknév + field_mail: E-mail + field_filename: Fájl + field_filesize: Méret + field_downloads: Letöltések + field_author: Szerző + field_created_on: Létrehozva + field_updated_on: Módosítva + field_field_format: Formátum + field_is_for_all: Minden projekthez + field_possible_values: Lehetséges értékek + field_regexp: Reguláris kifejezés + field_min_length: Minimum hossz + field_max_length: Maximum hossz + field_value: Érték + field_category: Kategória + field_title: Cím + field_project: Projekt + field_issue: Feladat + field_status: Státusz + field_notes: Feljegyzések + field_is_closed: Feladat lezárva + field_is_default: Alapértelmezett érték + field_tracker: Típus + field_subject: Tárgy + field_due_date: Befejezés dátuma + field_assigned_to: Felelős + field_priority: Prioritás + field_fixed_version: Cél verzió + field_user: Felhasználó + field_role: Szerepkör + field_homepage: Weboldal + field_is_public: Nyilvános + field_parent: Szülő projekt + field_is_in_roadmap: Feladatok látszanak az életútban + field_login: Azonosító + field_mail_notification: E-mail értesítések + field_admin: Adminisztrátor + field_last_login_on: Utolsó bejelentkezés + field_language: Nyelv + field_effective_date: Dátum + field_password: Jelszó + field_new_password: Új jelszó + field_password_confirmation: Megerősítés + field_version: Verzió + field_type: Típus + field_host: Kiszolgáló + field_port: Port + field_account: Felhasználói fiók + field_base_dn: Base DN + field_attr_login: Bejelentkezési tulajdonság + field_attr_firstname: Keresztnév + field_attr_lastname: Vezetéknév + field_attr_mail: E-mail + field_onthefly: On-the-fly felhasználó létrehozás + field_start_date: Kezdés dátuma + field_done_ratio: Készültség (%) + field_auth_source: Azonosítási mód + field_hide_mail: Rejtse el az e-mail címem + field_comments: Megjegyzés + field_url: URL + field_start_page: Kezdőlap + field_subproject: Alprojekt + field_hours: Óra + field_activity: Aktivitás + field_spent_on: Dátum + field_identifier: Azonosító + field_is_filter: Szűrőként használható + field_issue_to: Kapcsolódó feladat + field_delay: Késés + field_assignable: Feladat rendelhető ehhez a szerepkörhöz + field_redirect_existing_links: Létező linkek átirányítása + field_estimated_hours: Becsült időigény + field_column_names: Oszlopok + field_time_zone: Időzóna + field_searchable: Kereshető + field_default_value: Alapértelmezett érték + field_comments_sorting: Feljegyzések megjelenítése + + setting_app_title: Alkalmazás címe + setting_app_subtitle: Alkalmazás alcíme + setting_welcome_text: Üdvözlő üzenet + setting_default_language: Alapértelmezett nyelv + setting_login_required: Azonosítás szükséges + setting_self_registration: Regisztráció + setting_attachment_max_size: Melléklet max. mérete + setting_issues_export_limit: Feladatok exportálásának korlátja + setting_mail_from: Kibocsátó e-mail címe + setting_bcc_recipients: Titkos másolat címzet (bcc) + setting_host_name: Kiszolgáló neve + setting_text_formatting: Szöveg formázás + setting_wiki_compression: Wiki történet tömörítés + setting_feeds_limit: Atom tartalom korlát + setting_default_projects_public: Az új projektek alapértelmezés szerint nyilvánosak + setting_autofetch_changesets: Commitok automatikus lehúzása + setting_sys_api_enabled: WS engedélyezése a tárolók kezeléséhez + setting_commit_ref_keywords: Hivatkozó kulcsszavak + setting_commit_fix_keywords: Javítások kulcsszavai + setting_autologin: Automatikus bejelentkezés + setting_date_format: Dátum formátum + setting_time_format: Idő formátum + setting_cross_project_issue_relations: Kereszt-projekt feladat hivatkozások engedélyezése + setting_issue_list_default_columns: Az alapértelmezésként megjelenített oszlopok a feladat listában + setting_emails_footer: E-mail lábléc + setting_protocol: Protokol + setting_per_page_options: Objektum / oldal opciók + setting_user_format: Felhasználók megjelenítésének formája + setting_activity_days_default: Napok megjelenítése a project aktivitásnál + setting_display_subprojects_issues: Alapértelmezettként mutassa az alprojektek feladatait is a projekteken + setting_start_of_week: A hét első napja + + project_module_issue_tracking: Feladat követés + project_module_time_tracking: Idő rögzítés + project_module_news: Hírek + project_module_documents: Dokumentumok + project_module_files: Fájlok + project_module_wiki: Wiki + project_module_repository: Forráskód + project_module_boards: Fórumok + + label_user: Felhasználó + label_user_plural: Felhasználók + label_user_new: Új felhasználó + label_project: Projekt + label_project_new: Új projekt + label_project_plural: Projektek + label_x_projects: + zero: nincsenek projektek + one: 1 projekt + other: "%{count} projekt" + label_project_all: Az összes projekt + label_project_latest: Legutóbbi projektek + label_issue: Feladat + label_issue_new: Új feladat + label_issue_plural: Feladatok + label_issue_view_all: Minden feladat + label_issues_by: "%{value} feladatai" + label_issue_added: Feladat hozzáadva + label_issue_updated: Feladat frissítve + label_document: Dokumentum + label_document_new: Új dokumentum + label_document_plural: Dokumentumok + label_document_added: Dokumentum hozzáadva + label_role: Szerepkör + label_role_plural: Szerepkörök + label_role_new: Új szerepkör + label_role_and_permissions: Szerepkörök, és jogosultságok + label_member: Résztvevő + label_member_new: Új résztvevő + label_member_plural: Résztvevők + label_tracker: Feladat típus + label_tracker_plural: Feladat típusok + label_tracker_new: Új feladat típus + label_workflow: Workflow + label_issue_status: Feladat státusz + label_issue_status_plural: Feladat státuszok + label_issue_status_new: Új státusz + label_issue_category: Feladat kategória + label_issue_category_plural: Feladat kategóriák + label_issue_category_new: Új kategória + label_custom_field: Egyéni mező + label_custom_field_plural: Egyéni mezők + label_custom_field_new: Új egyéni mező + label_enumerations: Felsorolások + label_enumeration_new: Új érték + label_information: Információ + label_information_plural: Információk + label_please_login: Jelentkezzen be + label_register: Regisztráljon + label_password_lost: Elfelejtett jelszó + label_home: Kezdőlap + label_my_page: Saját kezdőlapom + label_my_account: Fiókom adatai + label_my_projects: Saját projektem + label_administration: Adminisztráció + label_login: Bejelentkezés + label_logout: Kijelentkezés + label_help: Súgó + label_reported_issues: Bejelentett feladatok + label_assigned_to_me_issues: A nekem kiosztott feladatok + label_last_login: Utolsó bejelentkezés + label_registered_on: Regisztrált + label_activity: Történések + label_overall_activity: Teljes aktivitás + label_new: Új + label_logged_as: Bejelentkezve, mint + label_environment: Környezet + label_authentication: Azonosítás + label_auth_source: Azonosítás módja + label_auth_source_new: Új azonosítási mód + label_auth_source_plural: Azonosítási módok + label_subproject_plural: Alprojektek + label_and_its_subprojects: "%{value} és alprojektjei" + label_min_max_length: Min - Max hossz + label_list: Lista + label_date: Dátum + label_integer: Egész + label_float: Lebegőpontos + label_boolean: Logikai + label_string: Szöveg + label_text: Hosszú szöveg + label_attribute: Tulajdonság + label_attribute_plural: Tulajdonságok + label_no_data: Nincs megjeleníthető adat + label_change_status: Státusz módosítása + label_history: Történet + label_attachment: Fájl + label_attachment_new: Új fájl + label_attachment_delete: Fájl törlése + label_attachment_plural: Fájlok + label_file_added: Fájl hozzáadva + label_report: Jelentés + label_report_plural: Jelentések + label_news: Hírek + label_news_new: Hír hozzáadása + label_news_plural: Hírek + label_news_latest: Legutóbbi hírek + label_news_view_all: Minden hír megtekintése + label_news_added: Hír hozzáadva + label_settings: Beállítások + label_overview: Áttekintés + label_version: Verzió + label_version_new: Új verzió + label_version_plural: Verziók + label_confirmation: Jóváhagyás + label_export_to: Exportálás + label_read: Olvas... + label_public_projects: Nyilvános projektek + label_open_issues: nyitott + label_open_issues_plural: nyitott + label_closed_issues: lezárt + label_closed_issues_plural: lezárt + label_x_open_issues_abbr: + zero: 0 nyitott + one: 1 nyitott + other: "%{count} nyitott" + label_x_closed_issues_abbr: + zero: 0 lezárt + one: 1 lezárt + other: "%{count} lezárt" + label_total: Összesen + label_permissions: Jogosultságok + label_current_status: Jelenlegi státusz + label_new_statuses_allowed: Státusz változtatások engedélyei + label_all: mind + label_none: nincs + label_nobody: senki + label_next: Következő + label_previous: Előző + label_used_by: Használja + label_details: Részletek + label_add_note: Jegyzet hozzáadása + label_calendar: Naptár + label_months_from: hónap, kezdve + label_gantt: Gantt + label_internal: Belső + label_last_changes: "utolsó %{count} változás" + label_change_view_all: Minden változás megtekintése + label_comment: Megjegyzés + label_comment_plural: Megjegyzés + label_x_comments: + zero: nincs megjegyzés + one: 1 megjegyzés + other: "%{count} megjegyzés" + label_comment_add: Megjegyzés hozzáadása + label_comment_added: Megjegyzés hozzáadva + label_comment_delete: Megjegyzések törlése + label_query: Egyéni lekérdezés + label_query_plural: Egyéni lekérdezések + label_query_new: Új lekérdezés + label_filter_add: Szűrő hozzáadása + label_filter_plural: Szűrők + label_equals: egyenlő + label_not_equals: nem egyenlő + label_in_less_than: kevesebb, mint + label_in_more_than: több, mint + label_in: in + label_today: ma + label_all_time: mindenkor + label_yesterday: tegnap + label_this_week: aktuális hét + label_last_week: múlt hét + label_last_n_days: "az elmúlt %{count} nap" + label_this_month: aktuális hónap + label_last_month: múlt hónap + label_this_year: aktuális év + label_date_range: Dátum intervallum + label_less_than_ago: kevesebb, mint nappal ezelőtt + label_more_than_ago: több, mint nappal ezelőtt + label_ago: nappal ezelőtt + label_contains: tartalmazza + label_not_contains: nem tartalmazza + label_day_plural: nap + label_repository: Forráskód + label_repository_plural: Forráskódok + label_browse: Tallóz + label_revision: Revízió + label_revision_plural: Revíziók + label_associated_revisions: Kapcsolt revíziók + label_added: hozzáadva + label_modified: módosítva + label_deleted: törölve + label_latest_revision: Legutolsó revízió + label_latest_revision_plural: Legutolsó revíziók + label_view_revisions: Revíziók megtekintése + label_max_size: Maximális méret + label_sort_highest: Az elejére + label_sort_higher: Eggyel feljebb + label_sort_lower: Eggyel lejjebb + label_sort_lowest: Az aljára + label_roadmap: Életút + label_roadmap_due_in: "Elkészültéig várhatóan még %{value}" + label_roadmap_overdue: "%{value} késésben" + label_roadmap_no_issues: Nincsenek feladatok ehhez a verzióhoz + label_search: Keresés + label_result_plural: Találatok + label_all_words: Minden szó + label_wiki: Wiki + label_wiki_edit: Wiki szerkesztés + label_wiki_edit_plural: Wiki szerkesztések + label_wiki_page: Wiki oldal + label_wiki_page_plural: Wiki oldalak + label_index_by_title: Cím szerint indexelve + label_index_by_date: Dátum szerint indexelve + label_current_version: Jelenlegi verzió + label_preview: Előnézet + label_feed_plural: Visszajelzések + label_changes_details: Változások részletei + label_issue_tracking: Feladat követés + label_spent_time: Ráfordított idő + label_f_hour: "%{value} óra" + label_f_hour_plural: "%{value} óra" + label_time_tracking: Idő rögzítés + label_change_plural: Változások + label_statistics: Statisztikák + label_commits_per_month: Commitok havonta + label_commits_per_author: Commitok szerzőnként + label_view_diff: Különbségek megtekintése + label_diff_inline: soronként + label_diff_side_by_side: egymás mellett + label_options: Opciók + label_copy_workflow_from: Workflow másolása innen + label_permissions_report: Jogosultsági riport + label_watched_issues: Megfigyelt feladatok + label_related_issues: Kapcsolódó feladatok + label_applied_status: Alkalmazandó státusz + label_loading: Betöltés... + label_relation_new: Új kapcsolat + label_relation_delete: Kapcsolat törlése + label_relates_to: kapcsolódik + label_duplicates: duplikálja + label_blocks: zárolja + label_blocked_by: zárolta + label_precedes: megelőzi + label_follows: követi + label_stay_logged_in: Emlékezzen rám + label_disabled: kikapcsolva + label_show_completed_versions: A kész verziók mutatása + label_me: én + label_board: Fórum + label_board_new: Új fórum + label_board_plural: Fórumok + label_topic_plural: Témák + label_message_plural: Üzenetek + label_message_last: Utolsó üzenet + label_message_new: Új üzenet + label_message_posted: Üzenet hozzáadva + label_reply_plural: Válaszok + label_send_information: Fiók infomációk küldése a felhasználónak + label_year: Év + label_month: Hónap + label_week: Hét + label_date_from: 'Kezdet:' + label_date_to: 'Vége:' + label_language_based: A felhasználó nyelve alapján + label_sort_by: "%{value} szerint rendezve" + label_send_test_email: Teszt e-mail küldése + label_feeds_access_key_created_on: "Atom hozzáférési kulcs létrehozva %{value}" + label_module_plural: Modulok + label_added_time_by: "%{author} adta hozzá %{age}" + label_updated_time: "Utolsó módosítás %{value}" + label_jump_to_a_project: Ugrás projekthez... + label_file_plural: Fájlok + label_changeset_plural: Changesets + label_default_columns: Alapértelmezett oszlopok + label_no_change_option: (Nincs változás) + label_bulk_edit_selected_issues: A kiválasztott feladatok kötegelt szerkesztése + label_theme: Téma + label_default: Alapértelmezett + label_search_titles_only: Keresés csak a címekben + label_user_mail_option_all: "Minden eseményről minden saját projektemben" + label_user_mail_option_selected: "Minden eseményről a kiválasztott projektekben..." + label_user_mail_no_self_notified: "Nem kérek értesítést az általam végzett módosításokról" + label_registration_activation_by_email: Fiók aktiválása e-mailben + label_registration_manual_activation: Manuális fiók aktiválás + label_registration_automatic_activation: Automatikus fiók aktiválás + label_display_per_page: "Oldalanként: %{value}" + label_age: Kor + label_change_properties: Tulajdonságok változtatása + label_general: Általános + label_scm: SCM + label_plugins: Pluginek + label_ldap_authentication: LDAP azonosítás + label_downloads_abbr: D/L + label_optional_description: Opcionális leírás + label_add_another_file: Újabb fájl hozzáadása + label_preferences: Tulajdonságok + label_chronological_order: Időrendben + label_reverse_chronological_order: Fordított időrendben + + button_login: Bejelentkezés + button_submit: Elfogad + button_save: Mentés + button_check_all: Mindent kijelöl + button_uncheck_all: Kijelölés törlése + button_delete: Töröl + button_create: Létrehoz + button_test: Teszt + button_edit: Szerkeszt + button_add: Hozzáad + button_change: Változtat + button_apply: Alkalmaz + button_clear: Töröl + button_lock: Zárol + button_unlock: Felold + button_download: Letöltés + button_list: Lista + button_view: Megnéz + button_move: Mozgat + button_back: Vissza + button_cancel: Mégse + button_activate: Aktivál + button_sort: Rendezés + button_log_time: Idő rögzítés + button_rollback: Visszaáll erre a verzióra + button_watch: Megfigyel + button_unwatch: Megfigyelés törlése + button_reply: Válasz + button_archive: Archivál + button_unarchive: Dearchivál + button_reset: Reset + button_rename: Átnevez + button_change_password: Jelszó megváltoztatása + button_copy: Másol + button_annotate: Jegyzetel + button_update: Módosít + button_configure: Konfigurál + + status_active: aktív + status_registered: regisztrált + status_locked: zárolt + + text_select_mail_notifications: Válasszon eseményeket, amelyekről e-mail értesítést kell küldeni. + text_regexp_info: pl. ^[A-Z0-9]+$ + text_min_max_length_info: 0 = nincs korlátozás + text_project_destroy_confirmation: Biztosan törölni szeretné a projektet és vele együtt minden kapcsolódó adatot ? + text_subprojects_destroy_warning: "Az alprojekt(ek): %{value} szintén törlésre kerülnek." + text_workflow_edit: Válasszon egy szerepkört, és egy feladat típust a workflow szerkesztéséhez + text_are_you_sure: Biztos benne ? + text_tip_issue_begin_day: a feladat ezen a napon kezdődik + text_tip_issue_end_day: a feladat ezen a napon ér véget + text_tip_issue_begin_end_day: a feladat ezen a napon kezdődik és ér véget + text_caracters_maximum: "maximum %{count} karakter." + text_caracters_minimum: "Legkevesebb %{count} karakter hosszúnek kell lennie." + text_length_between: "Legalább %{min} és legfeljebb %{max} hosszú karakter." + text_tracker_no_workflow: Nincs workflow definiálva ehhez a feladat típushoz + text_unallowed_characters: Tiltott karakterek + text_comma_separated: Több érték megengedett (vesszővel elválasztva) + text_issues_ref_in_commit_messages: Hivatkozás feladatokra, feladatok javítása a commit üzenetekben + text_issue_added: "%{author} új feladatot hozott létre %{id} sorszámmal." + text_issue_updated: "%{author} módosította a %{id} sorszámú feladatot." + text_wiki_destroy_confirmation: Biztosan törölni szeretné ezt a wiki-t minden tartalmával együtt ? + text_issue_category_destroy_question: "Néhány feladat (%{count}) hozzá van rendelve ehhez a kategóriához. Mit szeretne tenni?" + text_issue_category_destroy_assignments: Kategória hozzárendelés megszüntetése + text_issue_category_reassign_to: Feladatok újra hozzárendelése másik kategóriához + text_user_mail_option: "A nem kiválasztott projektekről csak akkor kap értesítést, ha figyelést kér rá, vagy részt vesz benne (pl. Ön a létrehozó, vagy a hozzárendelő)" + text_no_configuration_data: "Szerepkörök, feladat típusok, feladat státuszok, és workflow adatok még nincsenek konfigurálva.\nErősen ajánlott, az alapértelmezett konfiguráció betöltése, és utána módosíthatja azt." + text_load_default_configuration: Alapértelmezett konfiguráció betöltése + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Biztos benne, hogy törölni szeretné a kijelölt feladato(ka)t ?' + text_select_project_modules: 'Válassza ki az engedélyezett modulokat ehhez a projekthez:' + text_default_administrator_account_changed: Alapértelmezett adminisztrátor fiók megváltoztatva + text_file_repository_writable: Fájl tároló írható + text_rmagick_available: RMagick elérhető (nem kötelező) + text_destroy_time_entries_question: "%{hours} órányi munka van rögzítve a feladatokon, amiket törölni szeretne. Mit szeretne tenni?" + text_destroy_time_entries: A rögzített órák törlése + text_assign_time_entries_to_project: A rögzített órák hozzárendelése a projekthez + text_reassign_time_entries: 'A rögzített órák újra hozzárendelése másik feladathoz:' + + default_role_manager: Vezető + default_role_developer: Fejlesztő + default_role_reporter: Bejelentő + default_tracker_bug: Hiba + default_tracker_feature: Fejlesztés + default_tracker_support: Támogatás + default_issue_status_new: Új + default_issue_status_in_progress: Folyamatban + default_issue_status_resolved: Megoldva + default_issue_status_feedback: Visszajelzés + default_issue_status_closed: Lezárt + default_issue_status_rejected: Elutasított + default_doc_category_user: Felhasználói dokumentáció + default_doc_category_tech: Technikai dokumentáció + default_priority_low: Alacsony + default_priority_normal: Normál + default_priority_high: Magas + default_priority_urgent: Sürgős + default_priority_immediate: Azonnal + default_activity_design: Tervezés + default_activity_development: Fejlesztés + + enumeration_issue_priorities: Feladat prioritások + enumeration_doc_categories: Dokumentum kategóriák + enumeration_activities: Tevékenységek (idő rögzítés) + mail_body_reminder: "%{count} neked kiosztott feladat határidős az elkövetkező %{days} napban:" + mail_subject_reminder: "%{count} feladat határidős az elkövetkező %{days} napban" + text_user_wrote: "%{value} írta:" + label_duplicated_by: duplikálta + setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése + text_enumeration_category_reassign_to: 'Újra hozzárendelés ehhez:' + text_enumeration_destroy_question: "%{count} objektum van hozzárendelve ehhez az értékhez." + label_incoming_emails: Beérkezett levelek + label_generate_key: Kulcs generálása + setting_mail_handler_api_enabled: Web Service engedélyezése a beérkezett levelekhez + setting_mail_handler_api_key: API kulcs + text_email_delivery_not_configured: "Az E-mail küldés nincs konfigurálva, és az értesítések ki vannak kapcsolva.\nÁllítsd be az SMTP szervert a config/configuration.yml fájlban és indítsd újra az alkalmazást, hogy érvénybe lépjen." + field_parent_title: Szülő oldal + label_issue_watchers: Megfigyelők + button_quote: Hozzászólás / Idézet + setting_sequential_project_identifiers: Szekvenciális projekt azonosítók generálása + notice_unable_delete_version: A verziót nem lehet törölni + label_renamed: átnevezve + label_copied: lemásolva + setting_plain_text_mail: csak szöveg (nem HTML) + permission_view_files: Fájlok megtekintése + permission_edit_issues: Feladatok szerkesztése + permission_edit_own_time_entries: Saját időnapló szerkesztése + permission_manage_public_queries: Nyilvános kérések kezelése + permission_add_issues: Feladat felvétele + permission_log_time: Idő rögzítése + permission_view_changesets: Változáskötegek megtekintése + permission_view_time_entries: Időrögzítések megtekintése + permission_manage_versions: Verziók kezelése + permission_manage_wiki: Wiki kezelése + permission_manage_categories: Feladat kategóriák kezelése + permission_protect_wiki_pages: Wiki oldalak védelme + permission_comment_news: Hírek kommentelése + permission_delete_messages: Üzenetek törlése + permission_select_project_modules: Projekt modulok kezelése + permission_edit_wiki_pages: Wiki oldalak szerkesztése + permission_add_issue_watchers: Megfigyelők felvétele + permission_view_gantt: Gannt diagramm megtekintése + permission_move_issues: Feladatok mozgatása + permission_manage_issue_relations: Feladat kapcsolatok kezelése + permission_delete_wiki_pages: Wiki oldalak törlése + permission_manage_boards: Fórumok kezelése + permission_delete_wiki_pages_attachments: Csatolmányok törlése + permission_view_wiki_edits: Wiki történet megtekintése + permission_add_messages: Üzenet beküldése + permission_view_messages: Üzenetek megtekintése + permission_manage_files: Fájlok kezelése + permission_edit_issue_notes: Jegyzetek szerkesztése + permission_manage_news: Hírek kezelése + permission_view_calendar: Naptár megtekintése + permission_manage_members: Tagok kezelése + permission_edit_messages: Üzenetek szerkesztése + permission_delete_issues: Feladatok törlése + permission_view_issue_watchers: Megfigyelők listázása + permission_manage_repository: Tárolók kezelése + permission_commit_access: Commit hozzáférés + permission_browse_repository: Tároló böngészése + permission_view_documents: Dokumetumok megtekintése + permission_edit_project: Projekt szerkesztése + permission_add_issue_notes: Jegyzet rögzítése + permission_save_queries: Kérések mentése + permission_view_wiki_pages: Wiki megtekintése + permission_rename_wiki_pages: Wiki oldalak átnevezése + permission_edit_time_entries: Időnaplók szerkesztése + permission_edit_own_issue_notes: Saját jegyzetek szerkesztése + setting_gravatar_enabled: Felhasználói fényképek engedélyezése + label_example: Példa + text_repository_usernames_mapping: "Állítsd be a felhasználó összerendeléseket a Redmine, és a tároló logban található felhasználók között.\nAz azonos felhasználó nevek összerendelése automatikusan megtörténik." + permission_edit_own_messages: Saját üzenetek szerkesztése + permission_delete_own_messages: Saját üzenetek törlése + label_user_activity: "%{value} tevékenységei" + label_updated_time_by: "Módosította %{author} %{age}" + text_diff_truncated: '... A diff fájl vége nem jelenik meg, mert hosszab, mint a megjeleníthető sorok száma.' + setting_diff_max_lines_displayed: A megjelenítendő sorok száma (maximum) a diff fájloknál + text_plugin_assets_writable: Plugin eszközök könyvtár írható + warning_attachments_not_saved: "%{count} fájl mentése nem sikerült." + button_create_and_continue: Létrehozás és folytatás + text_custom_field_possible_values_info: 'Értékenként egy sor' + label_display: Megmutat + field_editable: Szerkeszthető + setting_repository_log_display_limit: Maximum hány revíziót mutasson meg a log megjelenítésekor + setting_file_max_size_displayed: Maximum mekkora szövegfájlokat jelenítsen meg soronkénti összehasonlításnál + field_watcher: Megfigyelő + setting_openid: OpenID regisztráció és bejelentkezés engedélyezése + field_identity_url: OpenID URL + label_login_with_open_id_option: bejelentkezés OpenID használatával + field_content: Tartalom + label_descending: Csökkenő + label_sort: Rendezés + label_ascending: Növekvő + label_date_from_to: "%{start} -tól %{end} -ig" + label_greater_or_equal: ">=" + label_less_or_equal: "<=" + text_wiki_page_destroy_question: Ennek az oldalnak %{descendants} gyermek-, és leszármazott oldala van. Mit szeretne tenni? + text_wiki_page_reassign_children: Aloldalak hozzárendelése ehhez a szülő oldalhoz + text_wiki_page_nullify_children: Aloldalak átalakítása főoldallá + text_wiki_page_destroy_children: Minden aloldal és leszármazottjának törlése + setting_password_min_length: Minimum jelszó hosszúság + field_group_by: Szerint csoportosítva + mail_subject_wiki_content_updated: "'%{id}' wiki oldal frissítve" + label_wiki_content_added: Wiki oldal hozzáadva + mail_subject_wiki_content_added: "Új wiki oldal: '%{id}'" + mail_body_wiki_content_added: "%{author} létrehozta a '%{id}' wiki oldalt." + label_wiki_content_updated: Wiki oldal frissítve + mail_body_wiki_content_updated: "%{author} frissítette a '%{id}' wiki oldalt." + permission_add_project: Projekt létrehozása + setting_new_project_user_role_id: Projekt létrehozási jog nem adminisztrátor felhasználóknak + label_view_all_revisions: Összes verzió + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: Nincs feladat típus hozzárendelve ehhez a projekthez. Kérem ellenőrizze a projekt beállításait. + error_no_default_issue_status: Nincs alapértelmezett feladat státusz beállítva. Kérem ellenőrizze a beállításokat (Itt találja "Adminisztráció -> Feladat státuszok"). + text_journal_changed: "%{label} megváltozott, %{old} helyett %{new} lett" + text_journal_set_to: "%{label} új értéke: %{value}" + text_journal_deleted: "%{label} törölve lett (%{old})" + label_group_plural: Csoportok + label_group: Csoport + label_group_new: Új csoport + label_time_entry_plural: Időráfordítás + text_journal_added: "%{label} %{value} hozzáadva" + field_active: Aktív + enumeration_system_activity: Rendszertevékenység + permission_delete_issue_watchers: Megfigyelők törlése + version_status_closed: lezárt + version_status_locked: zárolt + version_status_open: nyitott + error_can_not_reopen_issue_on_closed_version: Lezárt verzióhoz rendelt feladatot nem lehet újranyitni + label_user_anonymous: Névtelen + button_move_and_follow: Mozgatás és követés + setting_default_projects_modules: Alapértelmezett modulok az új projektekhez + setting_gravatar_default: Alapértelmezett Gravatar kép + field_sharing: Megosztás + label_version_sharing_hierarchy: Projekt hierarchiával + label_version_sharing_system: Minden projekttel + label_version_sharing_descendants: Alprojektekkel + label_version_sharing_tree: Projekt fával + label_version_sharing_none: Nincs megosztva + error_can_not_archive_project: A projektet nem lehet archiválni + button_duplicate: Duplikálás + button_copy_and_follow: Másolás és követés + label_copy_source: Forrás + setting_issue_done_ratio: Feladat készültségi szint számolása a következő alapján + setting_issue_done_ratio_issue_status: Feladat státusz alapján + error_issue_done_ratios_not_updated: A feladat készültségi szintek nem lettek frissítve. + error_workflow_copy_target: Kérem válasszon cél feladat típus(oka)t és szerepkör(öke)t. + setting_issue_done_ratio_issue_field: A feladat mező alapján + label_copy_same_as_target: A céllal egyező + label_copy_target: Cél + notice_issue_done_ratios_updated: Feladat készültségi szintek frissítve. + error_workflow_copy_source: Kérem válasszon forrás feladat típust vagy szerepkört + label_update_issue_done_ratios: Feladat készültségi szintek frissítése + setting_start_of_week: A hét első napja + permission_view_issues: Feladatok megtekintése + label_display_used_statuses_only: Csak olyan feladat státuszok megjelenítése, amit ez a feladat típus használ + label_revision_id: Revízió %{value} + label_api_access_key: API hozzáférési kulcs + label_api_access_key_created_on: API hozzáférési kulcs létrehozva %{value} ezelőtt + label_feeds_access_key: Atom hozzáférési kulcs + notice_api_access_key_reseted: Az API hozzáférési kulcsa újragenerálva. + setting_rest_api_enabled: REST web service engedélyezése + label_missing_api_access_key: Egy API hozzáférési kulcs hiányzik + label_missing_feeds_access_key: Atom hozzáférési kulcs hiányzik + button_show: Megmutat + text_line_separated: Több érték megadása lehetséges (soronként 1 érték). + setting_mail_handler_body_delimiters: E-mailek levágása a következő sorok valamelyike esetén + permission_add_subprojects: Alprojektek létrehozása + label_subproject_new: Új alprojekt + text_own_membership_delete_confirmation: |- + Arra készül, hogy eltávolítja egyes vagy minden jogosultságát! Ezt követően lehetséges, hogy nem fogja tudni szerkeszteni ezt a projektet! + Biztosan folyatni szeretné? + label_close_versions: Kész verziók lezárása + label_board_sticky: Sticky + setting_cache_formatted_text: Formázott szöveg gyorsítótárazása (Cache) + permission_export_wiki_pages: Wiki oldalak exportálása + permission_manage_project_activities: Projekt tevékenységek kezelése + label_board_locked: Zárolt + error_can_not_delete_custom_field: Nem lehet törölni az egyéni mezőt + permission_manage_subtasks: Alfeladatok kezelése + label_profile: Profil + error_unable_to_connect: Nem lehet csatlakozni (%{value}) + error_can_not_remove_role: Ez a szerepkör használatban van és ezért nem törölhető- + field_parent_issue: Szülő feladat + error_unable_delete_issue_status: Nem lehet törölni a feladat állapotát + label_subtask_plural: Alfeladatok + error_can_not_delete_tracker: Ebbe a kategóriába feladatok tartoznak és ezért nem törölhető. + label_project_copy_notifications: Küldjön e-mail értesítéseket projektmásolás közben. + field_principal: Felelős + notice_failed_to_save_members: "Nem sikerült menteni a tago(ka)t: %{errors}." + text_zoom_out: Kicsinyít + text_zoom_in: Nagyít + notice_unable_delete_time_entry: Az időrögzítés nem törölhető + label_overall_spent_time: Összes ráfordított idő + field_time_entries: Idő rögzítés + project_module_gantt: Gantt + project_module_calendar: Naptár + button_edit_associated_wikipage: "Hozzárendelt Wiki oldal szerkesztése: %{page_title}" + field_text: Szöveg mező + setting_default_notification_option: Alapértelmezett értesítési beállítások + label_user_mail_option_only_my_events: Csak az általam megfigyelt dolgokról vagy amiben részt veszek + label_user_mail_option_none: Semilyen eseményről + field_member_of_group: Hozzárendelt csoport + field_assigned_to_role: Hozzárendelt szerepkör + notice_not_authorized_archived_project: A projekt, amihez hozzá szeretnél férni archiválva lett. + label_principal_search: "Felhasználó vagy csoport keresése:" + label_user_search: "Felhasználó keresése:" + field_visible: Látható + setting_emails_header: Emailek fejléce + setting_commit_logtime_activity_id: A rögzített időhöz tartozó tevékenység + text_time_logged_by_changeset: Alkalmazva a %{value} changeset-ben. + setting_commit_logtime_enabled: Időrögzítés engedélyezése + notice_gantt_chart_truncated: A diagram le lett vágva, mert elérte a maximálisan megjeleníthető elemek számát (%{max}) + setting_gantt_items_limit: A gantt diagrammon megjeleníthető maximális elemek száma + field_warn_on_leaving_unsaved: Figyelmeztessen, nem mentett módosításokat tartalmazó oldal elhagyásakor + text_warn_on_leaving_unsaved: A jelenlegi oldal nem mentett módosításokat tartalmaz, ami elvész, ha elhagyja az oldalt. + label_my_queries: Egyéni lekérdezéseim + text_journal_changed_no_detail: "%{label} módosítva" + label_news_comment_added: Megjegyzés hozzáadva a hírhez + button_expand_all: Mindet kibont + button_collapse_all: Mindet összecsuk + label_additional_workflow_transitions_for_assignee: További átmenetek engedélyezettek, ha a felhasználó a hozzárendelt + label_additional_workflow_transitions_for_author: További átmenetek engedélyezettek, ha a felhasználó a szerző + label_bulk_edit_selected_time_entries: A kiválasztott idő bejegyzések csoportos szerkesztése + text_time_entries_destroy_confirmation: Biztos benne, hogy törölni szeretné a kiválasztott idő bejegyzés(eke)t? + label_role_anonymous: Anonymous + label_role_non_member: Nem tag + label_issue_note_added: Jegyzet hozzáadva + label_issue_status_updated: Állapot módosítva + label_issue_priority_updated: Prioritás módosítva + label_issues_visibility_own: A felhasználó által létrehozott vagy hozzárendelt feladatok + field_issues_visibility: Feladatok láthatósága + label_issues_visibility_all: Minden feladat + permission_set_own_issues_private: Saját feladatok beállítása nyilvánosra vagy privátra + field_is_private: Privát + permission_set_issues_private: Feladatok beállítása nyilvánosra vagy privátra + label_issues_visibility_public: Minden nem privát feladat + text_issues_destroy_descendants_confirmation: Ezzel törölni fog %{count} alfeladatot is. + field_commit_logs_encoding: Commit üzenetek kódlapja + field_scm_path_encoding: Elérési útvonal kódlapja + text_scm_path_encoding_note: "Alapértelmezett: UTF-8" + field_path_to_repository: A repository elérési útja + field_root_directory: Gyökér könyvtár + field_cvs_module: Modul + field_cvsroot: CVSROOT + text_mercurial_repository_note: Helyi repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Parancs + text_scm_command_version: Verzió + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 feladat + one: 1 feladat + other: "%{count} feladatok" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: mind + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Alprojektekkel + label_cross_project_tree: Projekt fával + label_cross_project_hierarchy: Projekt hierarchiával + label_cross_project_system: Minden projekttel + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Összesen + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: E-mail + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Összes ráfordított idő + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API kulcs + setting_lost_password: Elfelejtett jelszó + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/id.yml b/config/locales/id.yml new file mode 100644 index 0000000..1ae8dbc --- /dev/null +++ b/config/locales/id.yml @@ -0,0 +1,1234 @@ +# Indonesian translations +# by Raden Prabowo (cakbowo@gmail.com) + +id: + direction: ltr + date: + formats: + default: "%d-%m-%Y" + short: "%d %b" + long: "%d %B %Y" + + day_names: [Minggu, Senin, Selasa, Rabu, Kamis, Jumat, Sabtu] + abbr_day_names: [Ming, Sen, Sel, Rab, Kam, Jum, Sab] + + month_names: [~, Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Mei, Jun, Jul, Agu, Sep, Okt, Nov, Des] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a %d %b %Y, %H:%M:%S" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "setengah menit" + less_than_x_seconds: + one: "kurang dari sedetik" + other: "kurang dari %{count} detik" + x_seconds: + one: "sedetik" + other: "%{count} detik" + less_than_x_minutes: + one: "kurang dari semenit" + other: "kurang dari %{count} menit" + x_minutes: + one: "semenit" + other: "%{count} menit" + about_x_hours: + one: "sekitar sejam" + other: "sekitar %{count} jam" + x_hours: + one: "1 jam" + other: "%{count} jam" + x_days: + one: "sehari" + other: "%{count} hari" + about_x_months: + one: "sekitar sebulan" + other: "sekitar %{count} bulan" + x_months: + one: "sebulan" + other: "%{count} bulan" + about_x_years: + one: "sekitar setahun" + other: "sekitar %{count} tahun" + over_x_years: + one: "lebih dari setahun" + other: "lebih dari %{count} tahun" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + precision: 3 + separator: ',' + delimiter: '.' + currency: + format: + unit: 'Rp' + precision: 2 + format: '%n %u' + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + support: + array: + sentence_connector: "dan" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "tidak termasuk dalam daftar" + exclusion: "sudah dicadangkan" + invalid: "salah" + confirmation: "tidak sesuai konfirmasi" + accepted: "harus disetujui" + empty: "tidak boleh kosong" + blank: "tidak boleh kosong" + too_long: "terlalu panjang (maksimum %{count} karakter)" + too_short: "terlalu pendek (minimum %{count} karakter)" + wrong_length: "panjangnya salah (seharusnya %{count} karakter)" + taken: "sudah diambil" + not_a_number: "bukan angka" + not_a_date: "bukan tanggal" + greater_than: "harus lebih besar dari %{count}" + greater_than_or_equal_to: "harus lebih besar atau sama dengan %{count}" + equal_to: "harus sama dengan %{count}" + less_than: "harus kurang dari %{count}" + less_than_or_equal_to: "harus kurang atau sama dengan %{count}" + odd: "harus ganjil" + even: "harus genap" + greater_than_start_date: "harus lebih besar dari tanggal mulai" + not_same_project: "tidak tergabung dalam proyek yang sama" + circular_dependency: "kaitan ini akan menghasilkan circular dependency" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Silakan pilih + + general_text_No: 'Tidak' + general_text_Yes: 'Ya' + general_text_no: 'tidak' + general_text_yes: 'ya' + general_lang_name: 'Indonesian (Bahasa Indonesia)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_updated: Akun sudah berhasil diperbarui. + notice_account_invalid_credentials: Pengguna atau kata sandi salah + notice_account_password_updated: Kata sandi sudah berhasil diperbarui. + notice_account_wrong_password: Kata sandi salah. + notice_account_register_done: Akun sudah berhasil dibuat. Untuk mengaktifkan akun anda, silakan klik tautan (link) yang dikirim kepada anda melalui e-mail. + notice_account_unknown_email: Pengguna tidak dikenal. + notice_can_t_change_password: Akun ini menggunakan sumber otentikasi eksternal yang tidak dikenal. Kata sandi tidak bisa diubah. + notice_account_lost_email_sent: Email berisi instruksi untuk memilih kata sandi baru sudah dikirimkan kepada anda. + notice_account_activated: Akun anda sudah diaktifasi. Sekarang anda bisa login. + notice_successful_create: Berhasil dibuat. + notice_successful_update: Berhasil diperbarui. + notice_successful_delete: Berhasil dihapus. + notice_successful_connection: Berhasil terhubung. + notice_file_not_found: Berkas yang anda buka tidak ada atau sudah dihapus. + notice_locking_conflict: Data sudah diubah oleh pengguna lain. + notice_not_authorized: Anda tidak memiliki akses ke halaman ini. + notice_email_sent: "Email sudah dikirim ke %{value}" + notice_email_error: "Terjadi kesalahan pada saat pengiriman email (%{value})" + notice_feeds_access_key_reseted: Atom access key anda sudah direset. + notice_failed_to_save_issues: "Gagal menyimpan %{count} masalah dari %{total} yang dipilih: %{ids}." + notice_no_issue_selected: "Tidak ada masalah yang dipilih! Silakan pilih masalah yang akan anda sunting." + notice_account_pending: "Akun anda sudah dibuat dan sekarang sedang menunggu persetujuan administrator." + notice_default_data_loaded: Konfigurasi default sudah berhasil dimuat. + notice_unable_delete_version: Tidak bisa menghapus versi. + + error_can_t_load_default_data: "Konfigurasi default tidak bisa dimuat: %{value}" + error_scm_not_found: "Entri atau revisi tidak terdapat pada repositori." + error_scm_command_failed: "Terjadi kesalahan pada saat mengakses repositori: %{value}" + error_scm_annotate: "Entri tidak ada, atau tidak dapat di anotasi." + error_issue_not_found_in_project: 'Masalah tidak ada atau tidak tergabung dalam proyek ini.' + error_no_tracker_in_project: 'Tidak ada pelacak yang diasosiasikan pada proyek ini. Silakan pilih Pengaturan Proyek.' + error_no_default_issue_status: 'Nilai default untuk Status masalah belum didefinisikan. Periksa kembali konfigurasi anda (Pilih "Administrasi --> Status masalah").' + error_can_not_reopen_issue_on_closed_version: 'Masalah yang ditujukan pada versi tertutup tidak bisa dibuka kembali' + error_can_not_archive_project: Proyek ini tidak bisa diarsipkan + + warning_attachments_not_saved: "%{count} berkas tidak bisa disimpan." + + mail_subject_lost_password: "Kata sandi %{value} anda" + mail_body_lost_password: 'Untuk mengubah kata sandi anda, klik tautan berikut::' + mail_subject_register: "Aktivasi akun %{value} anda" + mail_body_register: 'Untuk mengaktifkan akun anda, klik tautan berikut:' + mail_body_account_information_external: "Anda dapat menggunakan akun %{value} anda untuk login." + mail_body_account_information: Informasi akun anda + mail_subject_account_activation_request: "Permintaan aktivasi akun %{value} " + mail_body_account_activation_request: "Pengguna baru (%{value}) sudan didaftarkan. Akun tersebut menunggu persetujuan anda:" + mail_subject_reminder: "%{count} masalah harus selesai pada hari berikutnya (%{days})" + mail_body_reminder: "%{count} masalah yang ditugaskan pada anda harus selesai dalam %{days} hari kedepan:" + mail_subject_wiki_content_added: "'%{id}' halaman wiki sudah ditambahkan" + mail_body_wiki_content_added: "The '%{id}' halaman wiki sudah ditambahkan oleh %{author}." + mail_subject_wiki_content_updated: "'%{id}' halaman wiki sudah diperbarui" + mail_body_wiki_content_updated: "The '%{id}' halaman wiki sudah diperbarui oleh %{author}." + + + field_name: Nama + field_description: Deskripsi + field_summary: Ringkasan + field_is_required: Dibutuhkan + field_firstname: Nama depan + field_lastname: Nama belakang + field_mail: Email + field_filename: Berkas + field_filesize: Ukuran + field_downloads: Unduhan + field_author: Pengarang + field_created_on: Dibuat + field_updated_on: Diperbarui + field_field_format: Format + field_is_for_all: Untuk semua proyek + field_possible_values: Nilai yang mungkin + field_regexp: Regular expression + field_min_length: Panjang minimum + field_max_length: Panjang maksimum + field_value: Nilai + field_category: Kategori + field_title: Judul + field_project: Proyek + field_issue: Masalah + field_status: Status + field_notes: Catatan + field_is_closed: Masalah ditutup + field_is_default: Nilai default + field_tracker: Pelacak + field_subject: Perihal + field_due_date: Harus selesai + field_assigned_to: Ditugaskan ke + field_priority: Prioritas + field_fixed_version: Versi target + field_user: Pengguna + field_role: Peran + field_homepage: Halaman web + field_is_public: Publik + field_parent: Subproyek dari + field_is_in_roadmap: Masalah ditampilkan di rencana kerja + field_login: Login + field_mail_notification: Notifikasi email + field_admin: Administrator + field_last_login_on: Terakhir login + field_language: Bahasa + field_effective_date: Tanggal + field_password: Kata sandi + field_new_password: Kata sandi baru + field_password_confirmation: Konfirmasi + field_version: Versi + field_type: Tipe + field_host: Host + field_port: Port + field_account: Akun + field_base_dn: Base DN + field_attr_login: Atribut login + field_attr_firstname: Atribut nama depan + field_attr_lastname: Atribut nama belakang + field_attr_mail: Atribut email + field_onthefly: Pembuatan pengguna seketika + field_start_date: Mulai + field_done_ratio: "% Selesai" + field_auth_source: Mode otentikasi + field_hide_mail: Sembunyikan email saya + field_comments: Komentar + field_url: URL + field_start_page: Halaman awal + field_subproject: Subproyek + field_hours: Jam + field_activity: Kegiatan + field_spent_on: Tanggal + field_identifier: Pengenal + field_is_filter: Digunakan sebagai penyaring + field_issue_to: Masalah terkait + field_delay: Tertunday + field_assignable: Masalah dapat ditugaskan pada peran ini + field_redirect_existing_links: Alihkan tautan yang ada + field_estimated_hours: Perkiraan waktu + field_column_names: Kolom + field_time_zone: Zona waktu + field_searchable: Dapat dicari + field_default_value: Nilai default + field_comments_sorting: Tampilkan komentar + field_parent_title: Halaman induk + field_editable: Dapat disunting + field_watcher: Pemantau + field_identity_url: OpenID URL + field_content: Isi + field_group_by: Dikelompokkan berdasar + field_sharing: Berbagi + + setting_app_title: Judul aplikasi + setting_app_subtitle: Subjudul aplikasi + setting_welcome_text: Teks sambutan + setting_default_language: Bahasa Default + setting_login_required: Butuhkan otentikasi + setting_self_registration: Swa-pendaftaran + setting_attachment_max_size: Ukuran maksimum untuk lampiran + setting_issues_export_limit: Batasan ukuran export masalah + setting_mail_from: Emisi alamat email + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Plain text mail (no HTML) + setting_host_name: Nama host dan path + setting_text_formatting: Format teks + setting_wiki_compression: Kompresi untuk riwayat wiki + setting_feeds_limit: Batasan isi feed + setting_default_projects_public: Proyek baru defaultnya adalah publik + setting_autofetch_changesets: Autofetch commits + setting_sys_api_enabled: Aktifkan WS untuk pengaturan repositori + setting_commit_ref_keywords: Referensi kaca kunci + setting_commit_fix_keywords: Pembetulan kaca kunci + setting_autologin: Autologin + setting_date_format: Format tanggal + setting_time_format: Format waktu + setting_cross_project_issue_relations: Perbolehkan kaitan masalah proyek berbeda + setting_issue_list_default_columns: Kolom default ditampilkan di daftar masalah + setting_emails_footer: Footer untuk email + setting_protocol: Protokol + setting_per_page_options: Pilihan obyek per halaman + setting_user_format: Format tampilan untuk pengguna + setting_activity_days_default: Hari tertampil pada kegiatan proyek + setting_display_subprojects_issues: Secara default, tampilkan masalah subproyek pada proyek utama + setting_enabled_scm: Enabled SCM + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: Buat pengenal proyek terurut + setting_gravatar_enabled: Gunakan icon pengguna dari Gravatar + setting_gravatar_default: Gambar default untuk Gravatar + setting_diff_max_lines_displayed: Maksimum perbedaan baris tertampil + setting_file_max_size_displayed: Maksimum berkas tertampil secara inline + setting_repository_log_display_limit: Nilai maksimum dari revisi ditampilkan di log berkas + setting_openid: Perbolehkan Login dan pendaftaran melalui OpenID + setting_password_min_length: Panjang minimum untuk kata sandi + setting_new_project_user_role_id: Peran diberikan pada pengguna non-admin yang membuat proyek + setting_default_projects_modules: Modul yang diaktifkan pada proyek baru + + permission_add_project: Tambahkan proyek + permission_edit_project: Sunting proyek + permission_select_project_modules: Pilih modul proyek + permission_manage_members: Atur anggota + permission_manage_versions: Atur versi + permission_manage_categories: Atur kategori masalah + permission_add_issues: Tambahkan masalah + permission_edit_issues: Sunting masalah + permission_manage_issue_relations: Atur kaitan masalah + permission_add_issue_notes: Tambahkan catatan + permission_edit_issue_notes: Sunting catatan + permission_edit_own_issue_notes: Sunting catatan saya + permission_move_issues: Pindahkan masalah + permission_delete_issues: Hapus masalah + permission_manage_public_queries: Atur query publik + permission_save_queries: Simpan query + permission_view_gantt: Tampilkan gantt chart + permission_view_calendar: Tampilkan kalender + permission_view_issue_watchers: Tampilkan daftar pemantau + permission_add_issue_watchers: Tambahkan pemantau + permission_delete_issue_watchers: Hapus pemantau + permission_log_time: Log waktu terpakai + permission_view_time_entries: Tampilkan waktu terpakai + permission_edit_time_entries: Sunting catatan waktu + permission_edit_own_time_entries: Sunting catatan waktu saya + permission_manage_news: Atur berita + permission_comment_news: Komentari berita + permission_view_documents: Tampilkan dokumen + permission_manage_files: Atur berkas + permission_view_files: Tampilkan berkas + permission_manage_wiki: Atur wiki + permission_rename_wiki_pages: Ganti nama halaman wiki + permission_delete_wiki_pages: Hapus halaman wiki + permission_view_wiki_pages: Tampilkan wiki + permission_view_wiki_edits: Tampilkan riwayat wiki + permission_edit_wiki_pages: Sunting halaman wiki + permission_delete_wiki_pages_attachments: Hapus lampiran + permission_protect_wiki_pages: Proteksi halaman wiki + permission_manage_repository: Atur repositori + permission_browse_repository: Jelajah repositori + permission_view_changesets: Tampilkan set perubahan + permission_commit_access: Commit akses + permission_manage_boards: Atur forum + permission_view_messages: Tampilkan pesan + permission_add_messages: Tambahkan pesan + permission_edit_messages: Sunting pesan + permission_edit_own_messages: Sunting pesan saya + permission_delete_messages: Hapus pesan + permission_delete_own_messages: Hapus pesan saya + + project_module_issue_tracking: Pelacak masalah + project_module_time_tracking: Pelacak waktu + project_module_news: Berita + project_module_documents: Dokumen + project_module_files: Berkas + project_module_wiki: Wiki + project_module_repository: Repositori + project_module_boards: Forum + + label_user: Pengguna + label_user_plural: Pengguna + label_user_new: Pengguna baru + label_user_anonymous: Anonymous + label_project: Proyek + label_project_new: Proyek baru + label_project_plural: Proyek + label_x_projects: + zero: tidak ada proyek + one: 1 proyek + other: "%{count} proyek" + label_project_all: Semua Proyek + label_project_latest: Proyek terakhir + label_issue: Masalah + label_issue_new: Masalah baru + label_issue_plural: Masalah + label_issue_view_all: tampilkan semua masalah + label_issues_by: "Masalah ditambahkan oleh %{value}" + label_issue_added: Masalah ditambahan + label_issue_updated: Masalah diperbarui + label_document: Dokumen + label_document_new: Dokumen baru + label_document_plural: Dokumen + label_document_added: Dokumen ditambahkan + label_role: Peran + label_role_plural: Peran + label_role_new: Peran baru + label_role_and_permissions: Peran dan perijinan + label_member: Anggota + label_member_new: Anggota baru + label_member_plural: Anggota + label_tracker: Pelacak + label_tracker_plural: Pelacak + label_tracker_new: Pelacak baru + label_workflow: Alur kerja + label_issue_status: Status masalah + label_issue_status_plural: Status masalah + label_issue_status_new: Status baru + label_issue_category: Kategori masalah + label_issue_category_plural: Kategori masalah + label_issue_category_new: Kategori baru + label_custom_field: Field kustom + label_custom_field_plural: Field kustom + label_custom_field_new: Field kustom + label_enumerations: Enumerasi + label_enumeration_new: Buat baru + label_information: Informasi + label_information_plural: Informasi + label_please_login: Silakan login + label_register: mendaftar + label_login_with_open_id_option: atau login menggunakan OpenID + label_password_lost: Lupa password + label_home: Halaman depan + label_my_page: Beranda + label_my_account: Akun saya + label_my_projects: Proyek saya + label_administration: Administrasi + label_login: Login + label_logout: Keluar + label_help: Bantuan + label_reported_issues: Masalah terlapor + label_assigned_to_me_issues: Masalah yang ditugaskan pada saya + label_last_login: Terakhir login + label_registered_on: Terdaftar pada + label_activity: Kegiatan + label_overall_activity: Kegiatan umum + label_user_activity: "kegiatan %{value}" + label_new: Baru + label_logged_as: Login sebagai + label_environment: Lingkungan + label_authentication: Otentikasi + label_auth_source: Mode Otentikasi + label_auth_source_new: Mode otentikasi baru + label_auth_source_plural: Mode Otentikasi + label_subproject_plural: Subproyek + label_and_its_subprojects: "%{value} dan subproyeknya" + label_min_max_length: Panjang Min - Maks + label_list: Daftar + label_date: Tanggal + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Text + label_text: Long text + label_attribute: Atribut + label_attribute_plural: Atribut + label_no_data: Tidak ada data untuk ditampilkan + label_change_status: Status perubahan + label_history: Riwayat + label_attachment: Berkas + label_attachment_new: Berkas baru + label_attachment_delete: Hapus Berkas + label_attachment_plural: Berkas + label_file_added: Berkas ditambahkan + label_report: Laporan + label_report_plural: Laporan + label_news: Berita + label_news_new: Tambahkan berita + label_news_plural: Berita + label_news_latest: Berita terakhir + label_news_view_all: Tampilkan semua berita + label_news_added: Berita ditambahkan + label_settings: Pengaturan + label_overview: Umum + label_version: Versi + label_version_new: Versi baru + label_version_plural: Versi + label_confirmation: Konfirmasi + label_export_to: 'Juga tersedia dalam:' + label_read: Baca... + label_public_projects: Proyek publik + label_open_issues: belum selesai + label_open_issues_plural: belum selesai + label_closed_issues: selesai + label_closed_issues_plural: selesai + label_x_open_issues_abbr: + zero: 0 belum selesai + one: 1 belum selesai + other: "%{count} belum selesai" + label_x_closed_issues_abbr: + zero: 0 selesai + one: 1 selesai + other: "%{count} selesai" + label_total: Total + label_permissions: Perijinan + label_current_status: Status sekarang + label_new_statuses_allowed: Status baru yang diijinkan + label_all: semua + label_none: tidak ada + label_nobody: tidak ada + label_next: Berikut + label_previous: Sebelum + label_used_by: Digunakan oleh + label_details: Rincian + label_add_note: Tambahkan catatan + label_calendar: Kalender + label_months_from: dari bulan + label_gantt: Gantt + label_internal: Internal + label_last_changes: "%{count} perubahan terakhir" + label_change_view_all: Tampilkan semua perubahan + label_comment: Komentar + label_comment_plural: Komentar + label_x_comments: + zero: tak ada komentar + one: 1 komentar + other: "%{count} komentar" + label_comment_add: Tambahkan komentar + label_comment_added: Komentar ditambahkan + label_comment_delete: Hapus komentar + label_query: Custom query + label_query_plural: Custom queries + label_query_new: Query baru + label_filter_add: Tambahkan filter + label_filter_plural: Filter + label_equals: sama dengan + label_not_equals: tidak sama dengan + label_in_less_than: kurang dari + label_in_more_than: lebih dari + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: pada + label_today: hari ini + label_all_time: semua waktu + label_yesterday: kemarin + label_this_week: minggu ini + label_last_week: minggu lalu + label_last_n_days: "%{count} hari terakhir" + label_this_month: bulan ini + label_last_month: bulan lalu + label_this_year: this year + label_date_range: Jangkauan tanggal + label_less_than_ago: kurang dari hari yang lalu + label_more_than_ago: lebih dari hari yang lalu + label_ago: hari yang lalu + label_contains: berisi + label_not_contains: tidak berisi + label_day_plural: hari + label_repository: Repositori + label_repository_plural: Repositori + label_browse: Jelajah + label_branch: Cabang + label_tag: Tag + label_revision: Revisi + label_revision_plural: Revisi + label_associated_revisions: Revisi terkait + label_added: ditambahkan + label_modified: diubah + label_copied: disalin + label_renamed: diganti nama + label_deleted: dihapus + label_latest_revision: Revisi terakhir + label_latest_revision_plural: Revisi terakhir + label_view_revisions: Tampilkan revisi + label_view_all_revisions: Tampilkan semua revisi + label_max_size: Ukuran maksimum + label_sort_highest: Ke paling atas + label_sort_higher: Ke atas + label_sort_lower: Ke bawah + label_sort_lowest: Ke paling bawah + label_roadmap: Rencana kerja + label_roadmap_due_in: "Harus selesai dalam %{value}" + label_roadmap_overdue: "%{value} terlambat" + label_roadmap_no_issues: Tak ada masalah pada versi ini + label_search: Cari + label_result_plural: Hasil + label_all_words: Semua kata + label_wiki: Wiki + label_wiki_edit: Sunting wiki + label_wiki_edit_plural: Sunting wiki + label_wiki_page: Halaman wiki + label_wiki_page_plural: Halaman wiki + label_index_by_title: Indeks menurut judul + label_index_by_date: Indeks menurut tanggal + label_current_version: Versi sekarang + label_preview: Tinjauan + label_feed_plural: Feeds + label_changes_details: Rincian semua perubahan + label_issue_tracking: Pelacak masalah + label_spent_time: Waktu terpakai + label_f_hour: "%{value} jam" + label_f_hour_plural: "%{value} jam" + label_time_tracking: Pelacak waktu + label_change_plural: Perubahan + label_statistics: Statistik + label_commits_per_month: Komit per bulan + label_commits_per_author: Komit per pengarang + label_view_diff: Tampilkan perbedaan + label_diff_inline: inline + label_diff_side_by_side: berdampingan + label_options: Pilihan + label_copy_workflow_from: Salin alur kerja dari + label_permissions_report: Laporan perijinan + label_watched_issues: Masalah terpantau + label_related_issues: Masalah terkait + label_applied_status: Status teraplikasi + label_loading: Memuat... + label_relation_new: Kaitan baru + label_relation_delete: Hapus kaitan + label_relates_to: terkait pada + label_duplicates: salinan + label_duplicated_by: disalin oleh + label_blocks: blok + label_blocked_by: diblok oleh + label_precedes: mendahului + label_follows: mengikuti + label_stay_logged_in: Tetap login + label_disabled: tidak diaktifkan + label_show_completed_versions: Tampilkan versi lengkap + label_me: saya + label_board: Forum + label_board_new: Forum baru + label_board_plural: Forum + label_topic_plural: Topik + label_message_plural: Pesan + label_message_last: Pesan terakhir + label_message_new: Pesan baru + label_message_posted: Pesan ditambahkan + label_reply_plural: Balasan + label_send_information: Kirim informasi akun ke pengguna + label_year: Tahun + label_month: Bulan + label_week: Minggu + label_date_from: Dari + label_date_to: Sampai + label_language_based: Berdasarkan bahasa pengguna + label_sort_by: "Urut berdasarkan %{value}" + label_send_test_email: Kirim email percobaan + label_feeds_access_key_created_on: "Atom access key dibuat %{value} yang lalu" + label_module_plural: Modul + label_added_time_by: "Ditambahkan oleh %{author} %{age} yang lalu" + label_updated_time_by: "Diperbarui oleh %{author} %{age} yang lalu" + label_updated_time: "Diperbarui oleh %{value} yang lalu" + label_jump_to_a_project: Pilih proyek... + label_file_plural: Berkas + label_changeset_plural: Set perubahan + label_default_columns: Kolom default + label_no_change_option: (Tak ada perubahan) + label_bulk_edit_selected_issues: Ubah masalah terpilih secara masal + label_theme: Tema + label_default: Default + label_search_titles_only: Cari judul saja + label_user_mail_option_all: "Untuk semua kejadian pada semua proyek saya" + label_user_mail_option_selected: "Hanya untuk semua kejadian pada proyek yang saya pilih ..." + label_user_mail_no_self_notified: "Saya tak ingin diberitahu untuk perubahan yang saya buat sendiri" + label_user_mail_assigned_only_mail_notification: "Kirim email hanya bila saya ditugaskan untuk masalah terkait" + label_user_mail_block_mail_notification: "Saya tidak ingin menerima email. Terima kasih." + label_registration_activation_by_email: aktivasi akun melalui email + label_registration_manual_activation: aktivasi akun secara manual + label_registration_automatic_activation: aktivasi akun secara otomatis + label_display_per_page: "Per halaman: %{value}" + label_age: Umur + label_change_properties: Rincian perubahan + label_general: Umum + label_scm: SCM + label_plugins: Plugin + label_ldap_authentication: Otentikasi LDAP + label_downloads_abbr: Unduh + label_optional_description: Deskripsi optional + label_add_another_file: Tambahkan berkas lain + label_preferences: Preferensi + label_chronological_order: Urut sesuai kronologis + label_reverse_chronological_order: Urut dari yang terbaru + label_incoming_emails: Email masuk + label_generate_key: Buat kunci + label_issue_watchers: Pemantau + label_example: Contoh + label_display: Tampilan + label_sort: Urut + label_ascending: Menaik + label_descending: Menurun + label_date_from_to: Dari %{start} sampai %{end} + label_wiki_content_added: Halaman wiki ditambahkan + label_wiki_content_updated: Halaman wiki diperbarui + label_group: Kelompok + label_group_plural: Kelompok + label_group_new: Kelompok baru + label_time_entry_plural: Waktu terpakai + label_version_sharing_none: Tidak dibagi + label_version_sharing_descendants: Dengan subproyek + label_version_sharing_hierarchy: Dengan hirarki proyek + label_version_sharing_tree: Dengan pohon proyek + label_version_sharing_system: Dengan semua proyek + + + button_login: Login + button_submit: Kirim + button_save: Simpan + button_check_all: Contreng semua + button_uncheck_all: Hilangkan semua contreng + button_delete: Hapus + button_create: Buat + button_create_and_continue: Buat dan lanjutkan + button_test: Test + button_edit: Sunting + button_add: Tambahkan + button_change: Ubah + button_apply: Terapkan + button_clear: Bersihkan + button_lock: Kunci + button_unlock: Buka kunci + button_download: Unduh + button_list: Daftar + button_view: Tampilkan + button_move: Pindah + button_move_and_follow: Pindah dan ikuti + button_back: Kembali + button_cancel: Batal + button_activate: Aktifkan + button_sort: Urut + button_log_time: Rekam waktu + button_rollback: Kembali ke versi ini + button_watch: Pantau + button_unwatch: Tidak Memantau + button_reply: Balas + button_archive: Arsip + button_unarchive: Batalkan arsip + button_reset: Reset + button_rename: Ganti nama + button_change_password: Ubah kata sandi + button_copy: Salin + button_copy_and_follow: Salin dan ikuti + button_annotate: Anotasi + button_update: Perbarui + button_configure: Konfigur + button_quote: Kutip + button_duplicate: Duplikat + + status_active: aktif + status_registered: terdaftar + status_locked: terkunci + + version_status_open: terbuka + version_status_locked: terkunci + version_status_closed: tertutup + + field_active: Aktif + + text_select_mail_notifications: Pilih aksi dimana email notifikasi akan dikirimkan. + text_regexp_info: mis. ^[A-Z0-9]+$ + text_min_max_length_info: 0 berarti tidak ada pembatasan + text_project_destroy_confirmation: Apakah anda benar-benar akan menghapus proyek ini beserta data terkait ? + text_subprojects_destroy_warning: "Subproyek: %{value} juga akan dihapus." + text_workflow_edit: Pilih peran dan pelacak untuk menyunting alur kerja + text_are_you_sure: Anda yakin ? + text_journal_changed: "%{label} berubah dari %{old} menjadi %{new}" + text_journal_set_to: "%{label} di set ke %{value}" + text_journal_deleted: "%{label} dihapus (%{old})" + text_journal_added: "%{label} %{value} ditambahkan" + text_tip_issue_begin_day: tugas dimulai hari itu + text_tip_issue_end_day: tugas berakhir hari itu + text_tip_issue_begin_end_day: tugas dimulai dan berakhir hari itu + text_caracters_maximum: "maximum %{count} karakter." + text_caracters_minimum: "Setidaknya harus sepanjang %{count} karakter." + text_length_between: "Panjang diantara %{min} dan %{max} karakter." + text_tracker_no_workflow: Tidak ada alur kerja untuk pelacak ini + text_unallowed_characters: Karakter tidak diperbolehkan + text_comma_separated: Beberapa nilai diperbolehkan (dipisahkan koma). + text_issues_ref_in_commit_messages: Mereferensikan dan membetulkan masalah pada pesan komit + text_issue_added: "Masalah %{id} sudah dilaporkan oleh %{author}." + text_issue_updated: "Masalah %{id} sudah diperbarui oleh %{author}." + text_wiki_destroy_confirmation: Apakah anda benar-benar akan menghapus wiki ini beserta semua isinya ? + text_issue_category_destroy_question: "Beberapa masalah (%{count}) ditugaskan pada kategori ini. Apa yang anda lakukan ?" + text_issue_category_destroy_assignments: Hapus kategori penugasan + text_issue_category_reassign_to: Tugaskan kembali masalah untuk kategori ini + text_user_mail_option: "Untuk proyek yang tidak dipilih, anda hanya akan menerima notifikasi hal-hal yang anda pantau atau anda terlibat di dalamnya (misalnya masalah yang anda tulis atau ditugaskan pada anda)." + text_no_configuration_data: "Peran, pelacak, status masalah dan alur kerja belum dikonfigur.\nSangat disarankan untuk memuat konfigurasi default. Anda akan bisa mengubahnya setelah konfigurasi dimuat." + text_load_default_configuration: Muat konfigurasi default + text_status_changed_by_changeset: "Diterapkan di set perubahan %{value}." + text_issues_destroy_confirmation: 'Apakah anda yakin untuk menghapus masalah terpilih ?' + text_select_project_modules: 'Pilih modul untuk diaktifkan pada proyek ini:' + text_default_administrator_account_changed: Akun administrator default sudah berubah + text_file_repository_writable: Direktori yang bisa ditulisi untuk lampiran + text_plugin_assets_writable: Direktori yang bisa ditulisi untuk plugin asset + text_rmagick_available: RMagick tersedia (optional) + text_destroy_time_entries_question: "%{hours} jam sudah dilaporkan pada masalah yang akan anda hapus. Apa yang akan anda lakukan ?" + text_destroy_time_entries: Hapus jam yang terlapor + text_assign_time_entries_to_project: Tugaskan jam terlapor pada proyek + text_reassign_time_entries: 'Tugaskan kembali jam terlapor pada masalah ini:' + text_user_wrote: "%{value} menulis:" + text_enumeration_destroy_question: "%{count} obyek ditugaskan untuk nilai ini." + text_enumeration_category_reassign_to: 'Tugaskan kembali untuk nilai ini:' + text_email_delivery_not_configured: "Pengiriman email belum dikonfigurasi, notifikasi tidak diaktifkan.\nAnda harus mengkonfigur SMTP server anda pada config/configuration.yml dan restart kembali aplikasi untuk mengaktifkan." + text_repository_usernames_mapping: "Pilih atau perbarui pengguna Redmine yang terpetakan ke setiap nama pengguna yang ditemukan di log repositori.\nPengguna dengan nama pengguna dan repositori atau email yang sama secara otomasit akan dipetakan." + text_diff_truncated: '... Perbedaan terpotong karena melebihi batas maksimum yang bisa ditampilkan.' + text_custom_field_possible_values_info: 'Satu baris untuk setiap nilai' + text_wiki_page_destroy_question: "Halaman ini mempunyai %{descendants} halaman anak dan turunannya. Apa yang akan anda lakukan ?" + text_wiki_page_nullify_children: "Biarkan halaman anak sebagai halaman teratas (root)" + text_wiki_page_destroy_children: "Hapus halaman anak dan semua turunannya" + text_wiki_page_reassign_children: "Tujukan halaman anak ke halaman induk yang ini" + + default_role_manager: Manager + default_role_developer: Pengembang + default_role_reporter: Pelapor + default_tracker_bug: Bug + default_tracker_feature: Fitur + default_tracker_support: Dukungan + default_issue_status_new: Baru + default_issue_status_in_progress: Dalam proses + default_issue_status_resolved: Resolved + default_issue_status_feedback: Umpan balik + default_issue_status_closed: Ditutup + default_issue_status_rejected: Ditolak + default_doc_category_user: Dokumentasi pengguna + default_doc_category_tech: Dokumentasi teknis + default_priority_low: Rendah + default_priority_normal: Normal + default_priority_high: Tinggi + default_priority_urgent: Penting + default_priority_immediate: Segera + default_activity_design: Rancangan + default_activity_development: Pengembangan + + enumeration_issue_priorities: Prioritas masalah + enumeration_doc_categories: Kategori dokumen + enumeration_activities: Kegiatan + enumeration_system_activity: Kegiatan Sistem + label_copy_source: Source + label_update_issue_done_ratios: Update issue done ratios + setting_issue_done_ratio: Calculate the issue done ratio with + label_api_access_key: API access key + text_line_separated: Multiple values allowed (one line for each value). + label_revision_id: Revision %{value} + permission_view_issues: View Issues + setting_issue_done_ratio_issue_status: Use the issue status + error_issue_done_ratios_not_updated: Issue done ratios not updated. + label_display_used_statuses_only: Only display statuses that are used by this tracker + error_workflow_copy_target: Please select target tracker(s) and role(s) + label_api_access_key_created_on: API access key created %{value} ago + label_feeds_access_key: Atom access key + notice_api_access_key_reseted: Your API access key was reset. + setting_rest_api_enabled: Enable REST web service + label_copy_same_as_target: Same as target + button_show: Show + setting_issue_done_ratio_issue_field: Use the issue field + label_missing_api_access_key: Missing an API access key + label_copy_target: Target + label_missing_feeds_access_key: Missing a Atom access key + notice_issue_done_ratios_updated: Issue done ratios updated. + error_workflow_copy_source: Please select a source tracker or role + setting_start_of_week: Start calendars on + setting_mail_handler_body_delimiters: Truncate emails after one of these lines + permission_add_subprojects: Create subprojects + label_subproject_new: New subproject + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_close_versions: Close completed versions + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 masalah + one: 1 masalah + other: "%{count} masalah" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: semua + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Dengan subproyek + label_cross_project_tree: Dengan pohon proyek + label_cross_project_hierarchy: Dengan hirarki proyek + label_cross_project_system: Dengan semua proyek + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Total + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API key + setting_lost_password: Lupa password + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/it.yml b/config/locales/it.yml new file mode 100644 index 0000000..97bf67f --- /dev/null +++ b/config/locales/it.yml @@ -0,0 +1,1225 @@ +# Italian translations for Ruby on Rails +# by Claudio Poli (masterkain@gmail.com) +# by Diego Pierotto (ita.translations@tiscali.it) +# by Emidio Stani (emidiostani@gmail.com) + +it: + direction: ltr + date: + formats: + default: "%d-%m-%Y" + short: "%d %b" + long: "%d %B %Y" + only_day: "%e" + + day_names: [Domenica, Lunedì, Martedì, Mercoledì, Giovedì, Venerdì, Sabato] + abbr_day_names: [Dom, Lun, Mar, Mer, Gio, Ven, Sab] + month_names: [~, Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre] + abbr_month_names: [~, Gen, Feb, Mar, Apr, Mag, Giu, Lug, Ago, Set, Ott, Nov, Dic] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a %d %b %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B %Y %H:%M" + only_second: "%S" + + datetime: + formats: + default: "%d-%m-%YT%H:%M:%S%Z" + + am: 'am' + pm: 'pm' + + datetime: + distance_in_words: + half_a_minute: "mezzo minuto" + less_than_x_seconds: + one: "meno di un secondo" + other: "meno di %{count} secondi" + x_seconds: + one: "1 secondo" + other: "%{count} secondi" + less_than_x_minutes: + one: "meno di un minuto" + other: "meno di %{count} minuti" + x_minutes: + one: "1 minuto" + other: "%{count} minuti" + about_x_hours: + one: "circa un'ora" + other: "circa %{count} ore" + x_hours: + one: "1 ora" + other: "%{count} ore" + x_days: + one: "1 giorno" + other: "%{count} giorni" + about_x_months: + one: "circa un mese" + other: "circa %{count} mesi" + x_months: + one: "1 mese" + other: "%{count} mesi" + about_x_years: + one: "circa un anno" + other: "circa %{count} anni" + over_x_years: + one: "oltre un anno" + other: "oltre %{count} anni" + almost_x_years: + one: "quasi 1 anno" + other: "quasi %{count} anni" + + number: + format: + precision: 3 + separator: ',' + delimiter: '.' + currency: + format: + unit: '€' + precision: 2 + format: '%n %u' + human: + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + support: + array: + sentence_connector: "e" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "Non posso salvare questo %{model}: 1 errore" + other: "Non posso salvare questo %{model}: %{count} errori." + body: "Per favore ricontrolla i seguenti campi:" + messages: + inclusion: "non è incluso nella lista" + exclusion: "è riservato" + invalid: "non è valido" + confirmation: "non coincide con la conferma" + accepted: "deve essere accettata" + empty: "non può essere vuoto" + blank: "non può essere lasciato in bianco" + too_long: "è troppo lungo (il massimo è %{count} lettere)" + too_short: "è troppo corto (il minimo è %{count} lettere)" + wrong_length: "è della lunghezza sbagliata (deve essere di %{count} lettere)" + taken: "è già in uso" + not_a_number: "non è un numero" + greater_than: "deve essere superiore a %{count}" + greater_than_or_equal_to: "deve essere superiore o uguale a %{count}" + equal_to: "deve essere uguale a %{count}" + less_than: "deve essere meno di %{count}" + less_than_or_equal_to: "deve essere meno o uguale a %{count}" + odd: "deve essere dispari" + even: "deve essere pari" + greater_than_start_date: "deve essere maggiore della data di partenza" + not_same_project: "non appartiene allo stesso progetto" + circular_dependency: "Questa relazione creerebbe una dipendenza circolare" + cant_link_an_issue_with_a_descendant: "Una segnalazione non può essere collegata a una delle sue discendenti" + earlier_than_minimum_start_date: "non può essere precedente a %{date} a causa di una precedente segnalazione" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Scegli + + general_text_No: 'No' + general_text_Yes: 'Sì' + general_text_no: 'no' + general_text_yes: 'sì' + general_lang_name: 'Italian (Italiano)' + general_csv_separator: ';' + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: L'utente è stato aggiornato. + notice_account_invalid_credentials: Nome utente o password non validi. + notice_account_password_updated: La password è stata aggiornata. + notice_account_wrong_password: Password errata + notice_account_unknown_email: Utente sconosciuto. + notice_can_t_change_password: Questo utente utilizza un metodo di autenticazione esterno. Impossibile cambiare la password. + notice_account_lost_email_sent: Ti è stata spedita una email con le istruzioni per cambiare la password. + notice_account_activated: Il tuo account è stato attivato. Ora puoi effettuare l'accesso. + notice_successful_create: Creazione effettuata. + notice_successful_update: Modifica effettuata. + notice_successful_delete: Eliminazione effettuata. + notice_successful_connection: Connessione effettuata. + notice_file_not_found: La pagina desiderata non esiste o è stata rimossa. + notice_locking_conflict: Le informazioni sono state modificate da un altro utente. + notice_not_authorized: Non sei autorizzato ad accedere a questa pagina. + notice_email_sent: "Una email è stata spedita a %{value}" + notice_email_error: "Si è verificato un errore durante l'invio di una email (%{value})" + notice_feeds_access_key_reseted: La tua chiave di accesso Atom è stata reimpostata. + + error_scm_not_found: "La risorsa e/o la versione non esistono nel repository." + error_scm_command_failed: "Si è verificato un errore durante l'accesso al repository: %{value}" + + mail_subject_lost_password: "Password %{value}" + mail_body_lost_password: 'Per cambiare la password, usa il seguente collegamento:' + mail_subject_register: "Attivazione utente %{value}" + mail_body_register: "Per attivare l'utente, usa il seguente collegamento:" + + + field_name: Nome + field_description: Descrizione + field_summary: Sommario + field_is_required: Richiesto + field_firstname: Nome + field_lastname: Cognome + field_mail: Email + field_filename: File + field_filesize: Dimensione + field_downloads: Download + field_author: Autore + field_created_on: Creato + field_updated_on: Aggiornato + field_field_format: Formato + field_is_for_all: Per tutti i progetti + field_possible_values: Valori possibili + field_regexp: Espressione regolare + field_min_length: Lunghezza minima + field_max_length: Lunghezza massima + field_value: Valore + field_category: Categoria + field_title: Titolo + field_project: Progetto + field_issue: Segnalazione + field_status: Stato + field_notes: Note + field_is_closed: Chiudi la segnalazione + field_is_default: Stato predefinito + field_tracker: Tracker + field_subject: Oggetto + field_due_date: Scadenza + field_assigned_to: Assegnato a + field_priority: Priorità + field_fixed_version: Versione prevista + field_user: Utente + field_role: Ruolo + field_homepage: Homepage + field_is_public: Pubblico + field_parent: Sottoprogetto di + field_is_in_roadmap: Segnalazioni mostrate nella roadmap + field_login: Utente + field_mail_notification: Notifiche via email + field_admin: Amministratore + field_last_login_on: Ultima connessione + field_language: Lingua + field_effective_date: Data + field_password: Password + field_new_password: Nuova password + field_password_confirmation: Conferma + field_version: Versione + field_type: Tipo + field_host: Host + field_port: Porta + field_account: Utente + field_base_dn: DN base + field_attr_login: Attributo connessione + field_attr_firstname: Attributo nome + field_attr_lastname: Attributo cognome + field_attr_mail: Attributo email + field_onthefly: Creazione utente "al volo" + field_start_date: Inizio + field_done_ratio: "% completato" + field_auth_source: Modalità di autenticazione + field_hide_mail: Nascondi il mio indirizzo email + field_comments: Commento + field_url: URL + field_start_page: Pagina principale + field_subproject: Sottoprogetto + field_hours: Ore + field_activity: Attività + field_spent_on: Data + field_identifier: Identificativo + field_is_filter: Usato come filtro + field_issue_to: Segnalazioni correlate + field_delay: Ritardo + field_assignable: E' possibile assegnare segnalazioni a questo ruolo + field_redirect_existing_links: Redirige i collegamenti esistenti + field_estimated_hours: Tempo stimato + field_default_value: Stato predefinito + + setting_app_title: Titolo applicazione + setting_app_subtitle: Sottotitolo applicazione + setting_welcome_text: Testo di benvenuto + setting_default_language: Lingua predefinita + setting_login_required: Autenticazione richiesta + setting_self_registration: Auto-registrazione abilitata + setting_attachment_max_size: Dimensione massima allegati + setting_issues_export_limit: Limite esportazione segnalazioni + setting_mail_from: Indirizzo sorgente email + setting_host_name: Nome host + setting_text_formatting: Formattazione testo + setting_wiki_compression: Comprimi cronologia wiki + setting_feeds_limit: Limite contenuti del feed + setting_autofetch_changesets: Acquisisci automaticamente le commit + setting_sys_api_enabled: Abilita WS per la gestione del repository + setting_commit_ref_keywords: Parole chiave riferimento + setting_commit_fix_keywords: Parole chiave chiusura + setting_autologin: Connessione automatica + setting_date_format: Formato data + setting_cross_project_issue_relations: Consenti la creazione di relazioni tra segnalazioni in progetti differenti + + label_user: Utente + label_user_plural: Utenti + label_user_new: Nuovo utente + label_project: Progetto + label_project_new: Nuovo progetto + label_project_plural: Progetti + label_x_projects: + zero: nessun progetto + one: 1 progetto + other: "%{count} progetti" + label_project_all: Tutti i progetti + label_project_latest: Ultimi progetti registrati + label_issue: Segnalazione + label_issue_new: Nuova segnalazione + label_issue_plural: Segnalazioni + label_issue_view_all: Mostra tutte le segnalazioni + label_document: Documento + label_document_new: Nuovo documento + label_document_plural: Documenti + label_role: Ruolo + label_role_plural: Ruoli + label_role_new: Nuovo ruolo + label_role_and_permissions: Ruoli e permessi + label_member: Membro + label_member_new: Nuovo membro + label_member_plural: Membri + label_tracker: Tracker + label_tracker_plural: Tracker + label_tracker_new: Nuovo tracker + label_workflow: Workflow + label_issue_status: Stato segnalazione + label_issue_status_plural: Stati segnalazioni + label_issue_status_new: Nuovo stato + label_issue_category: Categoria segnalazione + label_issue_category_plural: Categorie segnalazioni + label_issue_category_new: Nuova categoria + label_custom_field: Campo personalizzato + label_custom_field_plural: Campi personalizzati + label_custom_field_new: Nuovo campo personalizzato + label_enumerations: Enumerazioni + label_enumeration_new: Nuovo valore + label_information: Informazione + label_information_plural: Informazioni + label_please_login: Entra + label_register: Registrati + label_password_lost: Password dimenticata + label_home: Home + label_my_page: Pagina personale + label_my_account: Il mio utente + label_my_projects: I miei progetti + label_administration: Amministrazione + label_login: Entra + label_logout: Esci + label_help: Aiuto + label_reported_issues: Segnalazioni + label_assigned_to_me_issues: Le mie segnalazioni + label_last_login: Ultimo collegamento + label_registered_on: Registrato il + label_activity: Attività + label_new: Nuovo + label_logged_as: Collegato come + label_environment: Ambiente + label_authentication: Autenticazione + label_auth_source: Modalità di autenticazione + label_auth_source_new: Nuova modalità di autenticazione + label_auth_source_plural: Modalità di autenticazione + label_subproject_plural: Sottoprogetti + label_min_max_length: Lunghezza minima - massima + label_list: Elenco + label_date: Data + label_integer: Intero + label_boolean: Booleano + label_string: Testo + label_text: Testo esteso + label_attribute: Attributo + label_attribute_plural: Attributi + label_no_data: Nessun dato disponibile + label_change_status: Cambia stato + label_history: Cronologia + label_attachment: File + label_attachment_new: Nuovo file + label_attachment_delete: Elimina file + label_attachment_plural: File + label_report: Report + label_report_plural: Report + label_news: Notizia + label_news_new: Aggiungi notizia + label_news_plural: Notizie + label_news_latest: Utime notizie + label_news_view_all: Tutte le notizie + label_settings: Impostazioni + label_overview: Panoramica + label_version: Versione + label_version_new: Nuova versione + label_version_plural: Versioni + label_confirmation: Conferma + label_export_to: Esporta su + label_read: Leggi... + label_public_projects: Progetti pubblici + label_open_issues: aperta + label_open_issues_plural: aperte + label_closed_issues: chiusa + label_closed_issues_plural: chiuse + label_x_open_issues_abbr: + zero: 0 aperte + one: 1 aperta + other: "%{count} aperte" + label_x_closed_issues_abbr: + zero: 0 chiuse + one: 1 chiusa + other: "%{count} chiuse" + label_total: Totale + label_permissions: Permessi + label_current_status: Stato attuale + label_new_statuses_allowed: Nuovi stati possibili + label_all: tutti + label_none: nessuno + label_next: Successivo + label_previous: Precedente + label_used_by: Usato da + label_details: Dettagli + label_add_note: Aggiungi una nota + label_calendar: Calendario + label_months_from: mesi da + label_gantt: Gantt + label_internal: Interno + label_last_changes: "ultime %{count} modifiche" + label_change_view_all: Tutte le modifiche + label_comment: Commento + label_comment_plural: Commenti + label_x_comments: + zero: nessun commento + one: 1 commento + other: "%{count} commenti" + label_comment_add: Aggiungi un commento + label_comment_added: Commento aggiunto + label_comment_delete: Elimina commenti + label_query: Query personalizzata + label_query_plural: Query personalizzate + label_query_new: Nuova query + label_filter_add: Aggiungi filtro + label_filter_plural: Filtri + label_equals: è + label_not_equals: non è + label_in_less_than: è minore di + label_in_more_than: è maggiore di + label_in: in + label_today: oggi + label_this_week: questa settimana + label_less_than_ago: meno di giorni fa + label_more_than_ago: più di giorni fa + label_ago: giorni fa + label_contains: contiene + label_not_contains: non contiene + label_day_plural: giorni + label_repository: Repository + label_browse: Sfoglia + label_revision: Versione + label_revision_plural: Versioni + label_added: aggiunto + label_modified: modificato + label_deleted: eliminato + label_latest_revision: Ultima versione + label_latest_revision_plural: Ultime versioni + label_view_revisions: Mostra versioni + label_max_size: Dimensione massima + label_sort_highest: Sposta in cima + label_sort_higher: Su + label_sort_lower: Giù + label_sort_lowest: Sposta in fondo + label_roadmap: Roadmap + label_roadmap_due_in: "Da ultimare in %{value}" + label_roadmap_overdue: "%{value} di ritardo" + label_roadmap_no_issues: Nessuna segnalazione per questa versione + label_search: Ricerca + label_result_plural: Risultati + label_all_words: Tutte le parole + label_wiki: Wiki + label_wiki_edit: Modifica wiki + label_wiki_edit_plural: Modifiche wiki + label_wiki_page: Pagina Wiki + label_wiki_page_plural: Pagine wiki + label_index_by_title: Ordina per titolo + label_index_by_date: Ordina per data + label_current_version: Versione corrente + label_preview: Anteprima + label_feed_plural: Feed + label_changes_details: Particolari di tutti i cambiamenti + label_issue_tracking: Tracking delle segnalazioni + label_spent_time: Tempo impiegato + label_f_hour: "%{value} ora" + label_f_hour_plural: "%{value} ore" + label_time_tracking: Tracking del tempo + label_change_plural: Modifiche + label_statistics: Statistiche + label_commits_per_month: Commit per mese + label_commits_per_author: Commit per autore + label_view_diff: mostra differenze + label_diff_inline: in linea + label_diff_side_by_side: fianco a fianco + label_options: Opzioni + label_copy_workflow_from: Copia workflow da + label_permissions_report: Report permessi + label_watched_issues: Segnalazioni osservate + label_related_issues: Segnalazioni correlate + label_applied_status: Stato applicato + label_loading: Caricamento... + label_relation_new: Nuova relazione + label_relation_delete: Elimina relazione + label_relates_to: correlata a + label_duplicates: duplica + label_blocks: blocca + label_blocked_by: bloccata da + label_precedes: precede + label_follows: segue + label_stay_logged_in: Rimani collegato + label_disabled: disabilitato + label_show_completed_versions: Mostra versioni completate + label_me: io + label_board: Forum + label_board_new: Nuovo forum + label_board_plural: Forum + label_topic_plural: Argomenti + label_message_plural: Messaggi + label_message_last: Ultimo messaggio + label_message_new: Nuovo messaggio + label_reply_plural: Risposte + label_send_information: Invia all'utente le informazioni relative all'account + label_year: Anno + label_month: Mese + label_week: Settimana + label_date_from: Da + label_date_to: A + label_language_based: Basato sul linguaggio + label_sort_by: "Ordina per %{value}" + label_send_test_email: Invia una email di prova + label_feeds_access_key_created_on: "chiave di accesso Atom creata %{value} fa" + label_module_plural: Moduli + label_added_time_by: "Aggiunto da %{author} %{age} fa" + label_updated_time: "Aggiornato %{value} fa" + label_jump_to_a_project: Vai al progetto... + + button_login: Entra + button_submit: Invia + button_save: Salva + button_check_all: Seleziona tutti + button_uncheck_all: Deseleziona tutti + button_delete: Elimina + button_create: Crea + button_test: Prova + button_edit: Modifica + button_add: Aggiungi + button_change: Cambia + button_apply: Applica + button_clear: Pulisci + button_lock: Blocca + button_unlock: Sblocca + button_download: Scarica + button_list: Elenca + button_view: Mostra + button_move: Sposta + button_back: Indietro + button_cancel: Annulla + button_activate: Attiva + button_sort: Ordina + button_log_time: Registra tempo + button_rollback: Ripristina questa versione + button_watch: Osserva + button_unwatch: Dimentica + button_reply: Rispondi + button_archive: Archivia + button_unarchive: Ripristina + button_reset: Reimposta + button_rename: Rinomina + + status_active: attivo + status_registered: registrato + status_locked: bloccato + + text_select_mail_notifications: Seleziona le azioni per cui deve essere inviata una notifica. + text_regexp_info: es. ^[A-Z0-9]+$ + text_min_max_length_info: 0 significa nessuna restrizione + text_project_destroy_confirmation: Sei sicuro di voler eliminare il progetto e tutti i dati ad esso collegati? + text_workflow_edit: Seleziona un ruolo ed un tracker per modificare il workflow + text_are_you_sure: Sei sicuro ? + text_tip_issue_begin_day: attività che iniziano in questa giornata + text_tip_issue_end_day: attività che terminano in questa giornata + text_tip_issue_begin_end_day: attività che iniziano e terminano in questa giornata + text_caracters_maximum: "massimo %{count} caratteri." + text_length_between: "Lunghezza compresa tra %{min} e %{max} caratteri." + text_tracker_no_workflow: Nessun workflow definito per questo tracker + text_unallowed_characters: Caratteri non permessi + text_comma_separated: Valori multipli permessi (separati da virgole). + text_issues_ref_in_commit_messages: Segnalazioni di riferimento e chiusura nei messaggi di commit + text_issue_added: "%{author} ha aggiunto la segnalazione %{id}." + text_issue_updated: "La segnalazione %{id} è stata aggiornata da %{author}." + text_wiki_destroy_confirmation: Sicuro di voler eliminare questo wiki e tutti i suoi contenuti? + text_issue_category_destroy_question: "Alcune segnalazioni (%{count}) risultano assegnate a questa categoria. Cosa vuoi fare ?" + text_issue_category_destroy_assignments: Rimuovi le assegnazioni a questa categoria + text_issue_category_reassign_to: Riassegna segnalazioni a questa categoria + + default_role_manager: Gestore + default_role_developer: Sviluppatore + default_role_reporter: Segnalatore + default_tracker_bug: Segnalazione + default_tracker_feature: Funzione + default_tracker_support: Supporto + default_issue_status_new: Nuovo + default_issue_status_in_progress: In elaborazione + default_issue_status_resolved: Risolto + default_issue_status_feedback: Commenti + default_issue_status_closed: Chiuso + default_issue_status_rejected: Rifiutato + default_doc_category_user: Documentazione utente + default_doc_category_tech: Documentazione tecnica + default_priority_low: Bassa + default_priority_normal: Normale + default_priority_high: Alta + default_priority_urgent: Urgente + default_priority_immediate: Immediata + default_activity_design: Progettazione + default_activity_development: Sviluppo + + enumeration_issue_priorities: Priorità segnalazioni + enumeration_doc_categories: Categorie di documenti + enumeration_activities: Attività (time tracking) + label_file_plural: File + label_changeset_plural: Changeset + field_column_names: Colonne + label_default_columns: Colonne predefinite + setting_issue_list_default_columns: Colonne predefinite mostrate nell'elenco segnalazioni + notice_no_issue_selected: "Nessuna segnalazione selezionata! Seleziona le segnalazioni che intendi modificare." + label_bulk_edit_selected_issues: Modifica massiva delle segnalazioni selezionate + label_no_change_option: (Nessuna modifica) + notice_failed_to_save_issues: "Impossibile salvare %{count} segnalazioni su %{total} selezionate: %{ids}." + label_theme: Tema + label_default: Predefinito + label_search_titles_only: Cerca solo nei titoli + label_nobody: nessuno + button_change_password: Modifica password + text_user_mail_option: "Per i progetti non selezionati, riceverai solo le notifiche riguardanti le cose che osservi o nelle quali sei coinvolto (per esempio segnalazioni che hai creato o che ti sono state assegnate)." + label_user_mail_option_selected: "Solo per gli eventi relativi ai progetti selezionati..." + label_user_mail_option_all: "Per ogni evento relativo ad uno dei miei progetti" + setting_emails_footer: Piè di pagina email + label_float: Decimale + button_copy: Copia + mail_body_account_information_external: "Puoi utilizzare il tuo account %{value} per accedere al sistema." + mail_body_account_information: Le informazioni riguardanti il tuo account + setting_protocol: Protocollo + label_user_mail_no_self_notified: "Non voglio notifiche riguardanti modifiche da me apportate" + setting_time_format: Formato ora + label_registration_activation_by_email: attivazione account via email + mail_subject_account_activation_request: "%{value} richiesta attivazione account" + mail_body_account_activation_request: "Un nuovo utente (%{value}) ha effettuato la registrazione. Il suo account è in attesa di abilitazione da parte tua:" + label_registration_automatic_activation: attivazione account automatica + label_registration_manual_activation: attivazione account manuale + notice_account_pending: "Il tuo account è stato creato ed è in attesa di attivazione da parte dell'amministratore." + field_time_zone: Fuso orario + text_caracters_minimum: "Deve essere lungo almeno %{count} caratteri." + setting_bcc_recipients: Destinatari in copia nascosta (bcc) + button_annotate: Annota + label_issues_by: "Segnalazioni di %{value}" + field_searchable: Ricercabile + label_display_per_page: "Per pagina: %{value}" + setting_per_page_options: Opzioni oggetti per pagina + label_age: Età + notice_default_data_loaded: Configurazione predefinita caricata con successo. + text_load_default_configuration: Carica la configurazione predefinita + text_no_configuration_data: "Ruoli, tracker, stati delle segnalazioni e workflow non sono stati ancora configurati.\nE' vivamente consigliato caricare la configurazione predefinita. Potrai modificarla una volta caricata." + error_can_t_load_default_data: "Non è stato possibile caricare la configurazione predefinita : %{value}" + button_update: Aggiorna + label_change_properties: Modifica le proprietà + label_general: Generale + label_repository_plural: Repository + label_associated_revisions: Revisioni associate + setting_user_format: Formato visualizzazione utenti + text_status_changed_by_changeset: "Applicata nel changeset %{value}." + text_issues_destroy_confirmation: 'Sei sicuro di voler eliminare le segnalazioni selezionate?' + label_scm: SCM + text_select_project_modules: 'Seleziona i moduli abilitati per questo progetto:' + label_issue_added: Segnalazioni aggiunte + label_issue_updated: Segnalazioni aggiornate + label_document_added: Documenti aggiunti + label_message_posted: Messaggi aggiunti + label_file_added: File aggiunti + label_news_added: Notizie aggiunte + project_module_boards: Forum + project_module_issue_tracking: Tracking delle segnalazioni + project_module_wiki: Wiki + project_module_files: File + project_module_documents: Documenti + project_module_repository: Repository + project_module_news: Notizie + project_module_time_tracking: Time tracking + text_file_repository_writable: Repository dei file scrivibile + text_default_administrator_account_changed: L'account amministrativo predefinito è stato modificato + text_rmagick_available: RMagick disponibile (opzionale) + button_configure: Configura + label_plugins: Plugin + label_ldap_authentication: Autenticazione LDAP + label_downloads_abbr: D/L + label_this_month: questo mese + label_last_n_days: "ultimi %{count} giorni" + label_all_time: sempre + label_this_year: quest'anno + label_date_range: Intervallo di date + label_last_week: ultima settimana + label_yesterday: ieri + label_last_month: ultimo mese + label_add_another_file: Aggiungi un altro file + label_optional_description: Descrizione opzionale + text_destroy_time_entries_question: "%{hours} ore risultano spese sulle segnalazioni che stai per eliminare. Cosa vuoi fare ?" + error_issue_not_found_in_project: 'La segnalazione non è stata trovata o non appartiene al progetto' + text_assign_time_entries_to_project: Assegna le ore segnalate al progetto + text_destroy_time_entries: Elimina le ore segnalate + text_reassign_time_entries: 'Riassegna le ore a questa segnalazione:' + setting_activity_days_default: Giorni mostrati sulle attività di progetto + label_chronological_order: In ordine cronologico + field_comments_sorting: Mostra commenti + label_reverse_chronological_order: In ordine cronologico inverso + label_preferences: Preferenze + setting_display_subprojects_issues: Mostra le segnalazioni dei sottoprogetti nel progetto principale in modo predefinito + label_overall_activity: Attività generale + setting_default_projects_public: I nuovi progetti sono pubblici in modo predefinito + error_scm_annotate: "L'oggetto non esiste o non può essere annotato." + text_subprojects_destroy_warning: "Anche i suoi sottoprogetti: %{value} verranno eliminati." + label_and_its_subprojects: "%{value} ed i suoi sottoprogetti" + mail_body_reminder: "%{count} segnalazioni che ti sono state assegnate scadranno nei prossimi %{days} giorni:" + mail_subject_reminder: "%{count} segnalazioni in scadenza nei prossimi %{days} giorni" + text_user_wrote: "%{value} ha scritto:" + label_duplicated_by: duplicata da + setting_enabled_scm: SCM abilitato + text_enumeration_category_reassign_to: 'Riassegnale a questo valore:' + text_enumeration_destroy_question: "%{count} oggetti hanno un assegnamento su questo valore." + label_incoming_emails: Email in arrivo + label_generate_key: Genera una chiave + setting_mail_handler_api_enabled: Abilita WS per le email in arrivo + setting_mail_handler_api_key: Chiave API + text_email_delivery_not_configured: "La consegna via email non è configurata e le notifiche sono disabilitate.\nConfigura il tuo server SMTP in config/configuration.yml e riavvia l'applicazione per abilitarle." + field_parent_title: Pagina principale + label_issue_watchers: Osservatori + button_quote: Quota + setting_sequential_project_identifiers: Genera progetti con identificativi in sequenza + notice_unable_delete_version: Impossibile eliminare la versione + label_renamed: rinominato + label_copied: copiato + setting_plain_text_mail: Solo testo (non HTML) + permission_view_files: Vedi files + permission_edit_issues: Modifica segnalazioni + permission_edit_own_time_entries: Modifica propri time logs + permission_manage_public_queries: Gestisci query pubbliche + permission_add_issues: Aggiungi segnalazioni + permission_log_time: Segna tempo impiegato + permission_view_changesets: Vedi changesets + permission_view_time_entries: Vedi tempi impiegati + permission_manage_versions: Gestisci versioni + permission_manage_wiki: Gestisci wiki + permission_manage_categories: Gestisci categorie segnalazioni + permission_protect_wiki_pages: Proteggi pagine wiki + permission_comment_news: Commenta notizie + permission_delete_messages: Elimina messaggi + permission_select_project_modules: Seleziona moduli progetto + permission_edit_wiki_pages: Modifica pagine wiki + permission_add_issue_watchers: Aggiungi osservatori + permission_view_gantt: Vedi diagrammi gantt + permission_move_issues: Muovi segnalazioni + permission_manage_issue_relations: Gestisci relazioni tra segnalazioni + permission_delete_wiki_pages: Elimina pagine wiki + permission_manage_boards: Gestisci forum + permission_delete_wiki_pages_attachments: Elimina allegati + permission_view_wiki_edits: Vedi cronologia wiki + permission_add_messages: Aggiungi messaggi + permission_view_messages: Vedi messaggi + permission_manage_files: Gestisci files + permission_edit_issue_notes: Modifica note + permission_manage_news: Gestisci notizie + permission_view_calendar: Vedi calendario + permission_manage_members: Gestisci membri + permission_edit_messages: Modifica messaggi + permission_delete_issues: Elimina segnalazioni + permission_view_issue_watchers: Vedi lista osservatori + permission_manage_repository: Gestisci repository + permission_commit_access: Permesso di commit + permission_browse_repository: Sfoglia repository + permission_view_documents: Vedi documenti + permission_edit_project: Modifica progetti + permission_add_issue_notes: Aggiungi note + permission_save_queries: Salva query + permission_view_wiki_pages: Vedi pagine wiki + permission_rename_wiki_pages: Rinomina pagine wiki + permission_edit_time_entries: Modifica time logs + permission_edit_own_issue_notes: Modifica proprie note + setting_gravatar_enabled: Usa icone utente Gravatar + label_example: Esempio + text_repository_usernames_mapping: "Seleziona per aggiornare la corrispondenza tra gli utenti Redmine e quelli presenti nel log del repository.\nGli utenti Redmine e repository con lo stesso note utente o email sono mappati automaticamente." + permission_edit_own_messages: Modifica propri messaggi + permission_delete_own_messages: Elimina propri messaggi + label_user_activity: "attività di %{value}" + label_updated_time_by: "Aggiornato da %{author} %{age} fa" + text_diff_truncated: '... Le differenze sono state troncate perchè superano il limite massimo visualizzabile.' + setting_diff_max_lines_displayed: Limite massimo di differenze (linee) mostrate + text_plugin_assets_writable: Directory attività dei plugins scrivibile + warning_attachments_not_saved: "%{count} file non possono essere salvati." + button_create_and_continue: Crea e continua + text_custom_field_possible_values_info: 'Un valore per ogni riga' + label_display: Mostra + field_editable: Modificabile + setting_repository_log_display_limit: Numero massimo di revisioni elencate nella cronologia file + setting_file_max_size_displayed: Dimensione massima dei contenuti testuali visualizzati + field_watcher: Osservatore + setting_openid: Accetta connessione e registrazione con OpenID + field_identity_url: URL OpenID + label_login_with_open_id_option: oppure autenticati usando OpenID + field_content: Contenuto + label_descending: Discendente + label_sort: Ordina + label_ascending: Ascendente + label_date_from_to: Da %{start} a %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Questa pagina ha %{descendants} pagine figlie. Cosa ne vuoi fare? + text_wiki_page_reassign_children: Riassegna le pagine figlie al padre di questa pagina + text_wiki_page_nullify_children: Mantieni le pagine figlie come pagine radice + text_wiki_page_destroy_children: Elimina le pagine figlie e tutta la discendenza + setting_password_min_length: Lunghezza minima password + field_group_by: Raggruppa risultati per + mail_subject_wiki_content_updated: "La pagina wiki '%{id}' è stata aggiornata" + label_wiki_content_added: Aggiunta pagina al wiki + mail_subject_wiki_content_added: "La pagina '%{id}' è stata aggiunta al wiki" + mail_body_wiki_content_added: La pagina '%{id}' è stata aggiunta al wiki da %{author}. + label_wiki_content_updated: Aggiornata pagina wiki + mail_body_wiki_content_updated: La pagina '%{id}' wiki è stata aggiornata da%{author}. + permission_add_project: Crea progetto + setting_new_project_user_role_id: Ruolo assegnato agli utenti non amministratori che creano un progetto + label_view_all_revisions: Mostra tutte le revisioni + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: Nessun tracker è associato a questo progetto. Per favore verifica le impostazioni del Progetto. + error_no_default_issue_status: Nessuno stato predefinito delle segnalazioni è configurato. Per favore verifica le impostazioni (Vai in "Amministrazione -> Stati segnalazioni"). + text_journal_changed: "%{label} modificata da %{old} a %{new}" + text_journal_set_to: "%{label} impostata a %{value}" + text_journal_deleted: "%{label} eliminata (%{old})" + label_group_plural: Gruppi + label_group: Gruppo + label_group_new: Nuovo gruppo + label_time_entry_plural: Tempo impiegato + text_journal_added: "%{value} %{label} aggiunto" + field_active: Attivo + enumeration_system_activity: Attività di sistema + permission_delete_issue_watchers: Elimina osservatori + version_status_closed: chiusa + version_status_locked: bloccata + version_status_open: aperta + error_can_not_reopen_issue_on_closed_version: Una segnalazione assegnata ad una versione chiusa non può essere riaperta + label_user_anonymous: Anonimo + button_move_and_follow: Sposta e segui + setting_default_projects_modules: Moduli predefiniti abilitati per i nuovi progetti + setting_gravatar_default: Immagine Gravatar predefinita + field_sharing: Condivisione + label_version_sharing_hierarchy: Con gerarchia progetto + label_version_sharing_system: Con tutti i progetti + label_version_sharing_descendants: Con sottoprogetti + label_version_sharing_tree: Con progetto padre + label_version_sharing_none: Nessuna condivisione + error_can_not_archive_project: Questo progetto non può essere archiviato + button_duplicate: Duplica + button_copy_and_follow: Copia e segui + label_copy_source: Sorgente + setting_issue_done_ratio: Calcola la percentuale di segnalazioni completate con + setting_issue_done_ratio_issue_status: Usa lo stato segnalazioni + error_issue_done_ratios_not_updated: La percentuale delle segnalazioni completate non è aggiornata. + error_workflow_copy_target: Per favore seleziona trackers finali e ruolo(i) + setting_issue_done_ratio_issue_field: Usa il campo segnalazioni + label_copy_same_as_target: Uguale a destinazione + label_copy_target: Destinazione + notice_issue_done_ratios_updated: La percentuale delle segnalazioni completate è aggiornata. + error_workflow_copy_source: Per favore seleziona un tracker sorgente o ruolo + label_update_issue_done_ratios: Aggiorna la percentuale delle segnalazioni completate + setting_start_of_week: Avvia calendari il + permission_view_issues: Mostra segnalazioni + label_display_used_statuses_only: Mostra solo stati che vengono usati per questo tracker + label_revision_id: Revisione %{value} + label_api_access_key: Chiave di accesso API + label_api_access_key_created_on: Chiave di accesso API creata %{value} fa + label_feeds_access_key: Chiave di accesso Atom + notice_api_access_key_reseted: La chiave di accesso API è stata reimpostata. + setting_rest_api_enabled: Abilita il servizio web REST + label_missing_api_access_key: Chiave di accesso API mancante + label_missing_feeds_access_key: Chiave di accesso Atom mancante + button_show: Mostra + text_line_separated: Valori multipli permessi (un valore per ogni riga). + setting_mail_handler_body_delimiters: Tronca email dopo una di queste righe + permission_add_subprojects: Crea sottoprogetti + label_subproject_new: Nuovo sottoprogetto + text_own_membership_delete_confirmation: |- + Stai per eliminare alcuni o tutti i permessi e non sarai più in grado di modificare questo progetto dopo tale azione. + Sei sicuro di voler continuare? + label_close_versions: Versioni completate chiuse + label_board_sticky: Annunci + label_board_locked: Bloccato + permission_export_wiki_pages: Esporta pagine wiki + setting_cache_formatted_text: Cache testo formattato + permission_manage_project_activities: Gestisci attività progetti + error_unable_delete_issue_status: Impossibile eliminare lo stato segnalazioni + label_profile: Profilo + permission_manage_subtasks: Gestisci sottoattività + field_parent_issue: Attività principale + label_subtask_plural: Sottoattività + label_project_copy_notifications: Invia notifiche email durante la copia del progetto + error_can_not_delete_custom_field: Impossibile eliminare il campo personalizzato + error_unable_to_connect: Impossibile connettersi (%{value}) + error_can_not_remove_role: Questo ruolo è in uso e non può essere eliminato. + error_can_not_delete_tracker: Questo tracker contiene segnalazioni e non può essere eliminato. + field_principal: Principale + notice_failed_to_save_members: "Impossibile salvare il membro(i): %{errors}." + text_zoom_out: Riduci ingrandimento + text_zoom_in: Aumenta ingrandimento + notice_unable_delete_time_entry: Impossibile eliminare il valore time log. + label_overall_spent_time: Totale tempo impiegato + field_time_entries: Tempo di collegamento + project_module_gantt: Gantt + project_module_calendar: Calendario + button_edit_associated_wikipage: "Modifica la pagina wiki associata: %{page_title}" + field_text: Campo di testo + setting_default_notification_option: Opzione di notifica predefinita + label_user_mail_option_only_my_events: Solo se sono un osservatore o sono coinvolto + label_user_mail_option_none: Nessun evento + field_member_of_group: Gruppo dell'assegnatario + field_assigned_to_role: Ruolo dell'assegnatario + notice_not_authorized_archived_project: Il progetto a cui stai accedendo è stato archiviato. + label_principal_search: "Cerca utente o gruppo:" + label_user_search: "Cerca utente:" + field_visible: Visibile + setting_emails_header: Intestazione email + setting_commit_logtime_activity_id: Attività per il tempo di collegamento + text_time_logged_by_changeset: Usato nel changeset %{value}. + setting_commit_logtime_enabled: Abilita registrazione del tempo di collegamento + notice_gantt_chart_truncated: Il grafico è stato troncato perchè eccede il numero di oggetti (%{max}) da visualizzare + setting_gantt_items_limit: Massimo numero di oggetti da visualizzare sul diagramma di gantt + field_warn_on_leaving_unsaved: Avvisami quando lascio una pagina con testo non salvato + text_warn_on_leaving_unsaved: La pagina corrente contiene del testo non salvato che verrà perso se lasci questa pagina. + label_my_queries: Le mie queries personalizzate + text_journal_changed_no_detail: "%{label} aggiornato" + label_news_comment_added: Commento aggiunto a una notizia + button_expand_all: Espandi tutto + button_collapse_all: Comprimi tutto + label_additional_workflow_transitions_for_assignee: Transizioni supplementari consentite quando l'utente è l'assegnatario + label_additional_workflow_transitions_for_author: Transizioni supplementari consentite quando l'utente è l'autore + label_bulk_edit_selected_time_entries: Modifica massiva delle ore segnalate selezionate + text_time_entries_destroy_confirmation: Sei sicuro di voler eliminare l'ora\e selezionata\e? + label_role_anonymous: Anonimo + label_role_non_member: Non membro + label_issue_note_added: Nota aggiunta + label_issue_status_updated: Stato aggiornato + label_issue_priority_updated: Priorità aggiornata + label_issues_visibility_own: Segnalazioni create o assegnate all'utente + field_issues_visibility: Visibilità segnalazioni + label_issues_visibility_all: Tutte le segnalazioni + permission_set_own_issues_private: Imposta le proprie segnalazioni pubbliche o private + field_is_private: Privato + permission_set_issues_private: Imposta le segnalazioni pubbliche o private + label_issues_visibility_public: Tutte le segnalazioni non private + text_issues_destroy_descendants_confirmation: Questo eliminerà anche %{count} sottoattività. + field_commit_logs_encoding: Codifica dei messaggi di commit + field_scm_path_encoding: Codifica del percorso + text_scm_path_encoding_note: "Predefinito: UTF-8" + field_path_to_repository: Percorso del repository + field_root_directory: Directory radice + field_cvs_module: Modulo + field_cvsroot: CVSROOT + text_mercurial_repository_note: Repository locale (es. /hgrepo, c:\hgrepo) + text_scm_command: Comando + text_scm_command_version: Versione + label_git_report_last_commit: Riporta l'ultimo commit per files e directories + text_scm_config: Puoi configurare i comandi scm nel file config/configuration.yml. E' necessario riavviare l'applicazione dopo averlo modificato. + text_scm_command_not_available: Il comando scm non è disponibile. Controllare le impostazioni nel pannello di amministrazione. + notice_issue_successful_create: Segnalazione %{id} creata. + label_between: tra + setting_issue_group_assignment: Permetti di assegnare una segnalazione a gruppi + label_diff: diff + text_git_repository_note: Il repository è spoglio e locale (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Ordinamento + description_project_scope: Ambito della ricerca + description_filter: Filtro + description_user_mail_notification: Impostazioni notifica via mail + description_message_content: Contenuto del messaggio + description_available_columns: Colonne disponibili + description_issue_category_reassign: Scegli la categoria della segnalazione + description_search: Campo di ricerca + description_notes: Note + description_choose_project: Progetti + description_query_sort_criteria_attribute: Attributo di ordinamento + description_wiki_subpages_reassign: Scegli la nuova pagina padre + description_selected_columns: Colonne selezionate + label_parent_revision: Padre + label_child_revision: Figlio + error_scm_annotate_big_text_file: La nota non può essere salvata, supera la dimensiona massima del campo di testo. + setting_default_issue_start_date_to_creation_date: Usa la data corrente come data d'inizio per le nuove segnalazioni + button_edit_section: Modifica questa sezione + setting_repositories_encodings: Codifica degli allegati e dei repository + description_all_columns: Tutte le colonne + button_export: Esporta + label_export_options: "%{export_format} opzioni per l'export" + error_attachment_too_big: Questo file non può essere caricato in quanto la sua dimensione supera la massima consentita (%{max_size}) + notice_failed_to_save_time_entries: "Non ho potuto salvare %{count} registrazioni di tempo impiegato su %{total} selezionate: %{ids}." + label_x_issues: + zero: 0 segnalazione + one: 1 segnalazione + other: "%{count} segnalazioni" + label_repository_new: Nuovo repository + field_repository_is_default: Repository principale + label_copy_attachments: Copia allegati + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Consentiti solo lettere minuscole (a-z), numeri, trattini e trattini bassi.
    Una volta salvato, l'identificatore non può essere modificato. + field_multiple: Valori multipli + setting_commit_cross_project_ref: Permetti alle segnalazioni degli altri progetti di essere referenziate e risolte + text_issue_conflict_resolution_add_notes: Aggiunge le mie note e non salvare le mie ulteriori modifiche + text_issue_conflict_resolution_overwrite: Applica comunque le mie modifiche (le note precedenti verranno mantenute ma alcuni cambiamenti potrebbero essere sovrascritti) + notice_issue_update_conflict: La segnalazione è stata aggiornata da un altro utente mentre la stavi editando. + text_issue_conflict_resolution_cancel: Cancella ogni modifica e rivisualizza %{link} + permission_manage_related_issues: Gestisci relative segnalazioni + field_auth_source_ldap_filter: Filtro LDAP + label_search_for_watchers: Cerca osservatori da aggiungere + notice_account_deleted: Il tuo account sarà definitivamente rimosso. + setting_unsubscribe: Consentire agli utenti di cancellare il proprio account + button_delete_my_account: Cancella il mio account + text_account_destroy_confirmation: "Sei sicuro di voler procedere?\nIl tuo account sarà definitivamente cancellato, senza alcuna possibilità di ripristino." + error_session_expired: "La tua sessione è scaduta. Effettua nuovamente il login." + text_session_expiration_settings: "Attenzione: la modifica di queste impostazioni può far scadere le sessioni correnti, compresa la tua." + setting_session_lifetime: Massima durata di una sessione + setting_session_timeout: Timeout di inattività di una sessione + label_session_expiration: Scadenza sessione + permission_close_project: Chiusura / riapertura progetto + label_show_closed_projects: Vedi progetti chiusi + button_close: Chiudi + button_reopen: Riapri + project_status_active: attivo + project_status_closed: chiuso + project_status_archived: archiviato + text_project_closed: Questo progetto è chiuso e in sola lettura. + notice_user_successful_create: Creato utente %{id}. + field_core_fields: Campi standard + field_timeout: Timeout (in secondi) + setting_thumbnails_enabled: Mostra miniature degli allegati + setting_thumbnails_size: Dimensioni delle miniature (in pixels) + label_status_transitions: Transizioni di stato + label_fields_permissions: Permessi sui campi + label_readonly: Sola lettura + label_required: Richiesto + text_repository_identifier_info: Consentiti solo lettere minuscole (a-z), numeri, trattini e trattini bassi.
    Una volta salvato, ll'identificatore non può essere modificato. + field_board_parent: Forum padre + label_attribute_of_project: del progetto %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assegnatari %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copia sottoattività + label_copied_to: copia + label_copied_from: copiata da + label_any_issues_in_project: ogni segnalazione del progetto + label_any_issues_not_in_project: ogni segnalazione non nel progetto + field_private_notes: Note private + permission_view_private_notes: Visualizza note private + permission_set_notes_private: Imposta note come private + label_no_issues_in_project: progetto privo di segnalazioni + label_any: tutti + label_last_n_weeks: ultime %{count} settimane + setting_cross_project_subtasks: Consenti sottoattività cross-project + label_cross_project_descendants: Con sottoprogetti + label_cross_project_tree: Con progetto padre + label_cross_project_hierarchy: Con gerarchia progetto + label_cross_project_system: Con tutti i progetti + button_hide: Nascondi + setting_non_working_week_days: Giorni non lavorativi + label_in_the_next_days: nei prossimi + label_in_the_past_days: nei passati + label_attribute_of_user: Utente %{name} + text_turning_multiple_off: Disabilitando valori multipli, i valori multipli verranno rimossi, in modo da mantenere un solo valore per item. + label_attribute_of_issue: Segnalazione %{name} + permission_add_documents: Aggiungi documenti + permission_edit_documents: Edita documenti + permission_delete_documents: Cancella documenti + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Abilita supporto a JSONP + field_inherit_members: Eredita membri + field_closed_on: Chiuso + field_generate_password: Genera password + setting_default_projects_tracker_ids: Trackers di default per nuovi progetti + label_total_time: Totale + notice_account_not_activated_yet: Non hai ancora attivato il tuo account. Se vuoi + ricevere una nuova email di attivazione clicca qui. + notice_account_locked: Il tuo account è bloccato. + notice_account_register_done: Account creato correttamente. E' stata inviata un'email contenente + le istruzioni per attivare l'account a %{email}. + label_hidden: Nascosto + label_visibility_private: solo a me + label_visibility_roles: solo a questi ruoli + label_visibility_public: a tutti gli utenti + field_must_change_passwd: Cambio password obbligatorio al prossimo logon + notice_new_password_must_be_different: La nuova password deve essere differente da + quella attuale + setting_mail_handler_excluded_filenames: Escludi allegati per nome + text_convert_available: ImageMagick convert disponibile (opzionale) + label_link: Link + label_only: solo + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Collega valori ad un URL + setting_force_default_language_for_anonymous: Forza la lingua di default per gli utenti anonimi + setting_force_default_language_for_loggedin: Forza la lingua di default per gli utenti loggati + label_custom_field_select_type: Seleziona il tipo di oggetto a cui il campo personalizzato è collegato + label_issue_assigned_to_updated: Assegnatario aggiornato + label_check_for_updates: Verifica aggiornamenti + label_latest_compatible_version: Ultima versione compatibile + label_unknown_plugin: Plugin sconosciuto + label_radio_buttons: radio buttons + label_group_anonymous: Utenti anonimi + label_group_non_member: Utenti non membri + label_add_projects: Aggiungi progetti + field_default_status: Stato predefinito + text_subversion_repository_note: 'Esempio: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Visibilità degli utenti + label_users_visibility_all: Tutti gli utenti attivi + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Modifica gli allegati + setting_link_copied_issue: Collega le segnalazioni dopo la copia + label_link_copied_issue: Collega le segnalazioni copiate + label_ask: Ask + label_search_attachments_yes: Cerca nel nome e nelle descrizioni degli allegati + label_search_attachments_no: Non cercare gli allegati + label_search_attachments_only: Cerca solo allegati + label_search_open_issues_only: Solo segnalazioni aperte + field_address: Email + setting_max_additional_emails: Numero massimo di email aggiuntive + label_email_address_plural: Emails + label_email_address_add: Aggiungi un'email + label_enable_notifications: Attiva le notifiche + label_disable_notifications: Disattiva le notifiche + setting_search_results_per_page: Risultati per pagina + label_blank_value: vuoto + permission_copy_issues: Copia segnalazioni + error_password_expired: La password è scaduta o l'amministratore ha richiesto che sia cambiata. + field_time_entries_visibility: Visibilità Time logs + setting_password_max_age: Richiesta cambio password dopo + label_parent_task_attributes: Attributi attività padre + label_parent_task_attributes_derived: Calcolati dalle sottoattività + label_parent_task_attributes_independent: Indipendente dalle sottoattività + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Gestione membri + label_member_management_all_roles: Tutti i ruoli + label_member_management_selected_roles_only: Solo questi ruoli + label_password_required: Confirm your password to continue + label_total_spent_time: Totale tempo impiegato + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: Chiave API + setting_lost_password: Password dimenticata + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/ja.yml b/config/locales/ja.yml new file mode 100644 index 0000000..30b2f5c --- /dev/null +++ b/config/locales/ja.yml @@ -0,0 +1,1237 @@ +# Japanese translations for Ruby on Rails +# by Akira Matsuda (ronnie@dio.jp) +# AR error messages are basically taken from Ruby-GetText-Package. Thanks to Masao Mutoh. + +ja: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%m/%d" + long: "%Y年%m月%d日(%a)" + + day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日] + abbr_day_names: [日, 月, 火, 水, 木, 金, 土] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d %H:%M:%S" + time: "%H:%M" + short: "%y/%m/%d %H:%M" + long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z" + am: "午前" + pm: "午後" + + datetime: + distance_in_words: + half_a_minute: "30秒前後" + less_than_x_seconds: + one: "1秒以内" + other: "%{count}秒以内" + x_seconds: + one: "1秒" + other: "%{count}秒" + less_than_x_minutes: + one: "1分以内" + other: "%{count}分以内" + x_minutes: + one: "1分" + other: "%{count}分" + about_x_hours: + one: "約1時間" + other: "約%{count}時間" + x_hours: + one: "1時間" + other: "%{count}時間" + x_days: + one: "1日" + other: "%{count}日" + about_x_months: + one: "約1ヶ月" + other: "約%{count}ヶ月" + x_months: + one: "1ヶ月" + other: "%{count}ヶ月" + about_x_years: + one: "約1年" + other: "約%{count}年" + over_x_years: + one: "1年以上" + other: "%{count}年以上" + almost_x_years: + one: "ほぼ1年" + other: "ほぼ%{count}年" + + number: + format: + separator: "." + delimiter: "," + precision: 3 + + currency: + format: + format: "%n%u" + unit: "円" + separator: "." + delimiter: "," + precision: 0 + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "及び" + skip_last_comma: true + + activerecord: + errors: + template: + header: + one: "%{model} にエラーが発生しました。" + other: "%{model} に %{count} つのエラーが発生しました。" + body: "次の項目を確認してください。" + + messages: + inclusion: "は一覧にありません" + exclusion: "は予約されています" + invalid: "は不正な値です" + confirmation: "が一致しません" + accepted: "を受諾してください" + empty: "を入力してください" + blank: "を入力してください" + too_long: "は%{count}文字以内で入力してください" + too_short: "は%{count}文字以上で入力してください" + wrong_length: "は%{count}文字で入力してください" + taken: "はすでに存在します" + not_a_number: "は数値で入力してください" + not_a_date: "は日付を入力してください" + greater_than: "は%{count}より大きい値にしてください" + greater_than_or_equal_to: "は%{count}以上の値にしてください" + equal_to: "は%{count}にしてください" + less_than: "は%{count}より小さい値にしてください" + less_than_or_equal_to: "は%{count}以下の値にしてください" + odd: "は奇数にしてください" + even: "は偶数にしてください" + greater_than_start_date: "を開始日より後にしてください" + not_same_project: "同じプロジェクトに属していません" + circular_dependency: "この関係では、循環依存になります" + cant_link_an_issue_with_a_descendant: "親子関係にあるチケット間での関連の設定はできません" + earlier_than_minimum_start_date: "を%{date}より前にすることはできません。先行するチケットがあります" + not_a_regexp: "は正しい正規表現ではありません" + open_issue_with_closed_parent: "完了したチケットに未完了の子チケットを追加することはできません" + + actionview_instancetag_blank_option: 選んでください + + general_text_No: 'いいえ' + general_text_Yes: 'はい' + general_text_no: 'いいえ' + general_text_yes: 'はい' + general_lang_name: 'Japanese (日本語)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: CP932 + general_pdf_fontname: kozminproregular + general_pdf_monospaced_fontname: kozminproregular + general_first_day_of_week: '7' + + notice_account_updated: アカウントが更新されました。 + notice_account_invalid_credentials: ユーザー名もしくはパスワードが無効です + notice_account_password_updated: パスワードが更新されました。 + notice_account_wrong_password: パスワードが違います + notice_account_register_done: アカウントを作成しました。アカウントを有効にするための手順を記載したメールを %{email} 宛に送信しました。 + notice_account_unknown_email: ユーザーが存在しません。 + notice_can_t_change_password: このアカウントでは外部認証を使っています。パスワードは変更できません。 + notice_account_lost_email_sent: 新しいパスワードのメールを送信しました。 + notice_account_activated: アカウントが有効になりました。ログインできます。 + notice_successful_create: 作成しました。 + notice_successful_update: 更新しました。 + notice_successful_delete: 削除しました。 + notice_successful_connection: 接続しました。 + notice_file_not_found: アクセスしようとしたページは存在しないか削除されています。 + notice_locking_conflict: 別のユーザーがデータを更新しています。 + notice_not_authorized: このページのアクセスは許可されていません。 + notice_not_authorized_archived_project: プロジェクトはアーカイブされています。 + notice_email_sent: "%{value} 宛にメールを送信しました。" + notice_email_error: "メール送信中にエラーが発生しました (%{value})" + notice_feeds_access_key_reseted: Atomアクセスキーを初期化しました。 + notice_api_access_key_reseted: APIアクセスキーを初期化しました。 + notice_failed_to_save_issues: "全%{total}件中%{count}件のチケットが保存できませんでした: %{ids}。" + notice_failed_to_save_members: "メンバーの保存に失敗しました: %{errors}。" + notice_no_issue_selected: "チケットが選択されていません! 更新対象のチケットを選択してください。" + notice_account_pending: アカウントを作成しました。システム管理者の承認待ちです。 + notice_default_data_loaded: デフォルト設定をロードしました。 + notice_unable_delete_version: バージョンを削除できません + notice_unable_delete_time_entry: 作業時間を削除できません + notice_issue_done_ratios_updated: チケットの進捗率を更新しました。 + notice_gantt_chart_truncated: ガントチャートは、最大表示件数(%{max})を超えたため切り捨てられました。 + + error_can_t_load_default_data: "デフォルト設定がロードできませんでした: %{value}" + error_scm_not_found: リポジトリに、エントリ/リビジョンが存在しません。 + error_scm_command_failed: "リポジトリへアクセスしようとしてエラーになりました: %{value}" + error_scm_annotate: "エントリが存在しない、もしくはアノテートできません。" + error_issue_not_found_in_project: 'チケットが見つかりません、もしくはこのプロジェクトに属していません' + error_unable_delete_issue_status: "チケットのステータスを削除できませんでした。" + error_no_tracker_in_project: 'このプロジェクトにはトラッカーが登録されていません。プロジェクト設定を確認してください。' + error_no_default_issue_status: 'デフォルトのチケットステータスが定義されていません。設定を確認してください(管理→チケットのステータス)。' + error_can_not_delete_custom_field: 'カスタムフィールドを削除できません。' + error_unable_to_connect: "接続できません。 (%{value})" + error_can_not_remove_role: 'このロールは使用されています。削除できません。' + error_can_not_reopen_issue_on_closed_version: '終了したバージョンにひも付けされたチケットの再オープンはできません。' + error_can_not_archive_project: このプロジェクトはアーカイブできません + error_issue_done_ratios_not_updated: "チケットの進捗率が更新できません。" + error_workflow_copy_source: 'コピー元となるトラッカーまたはロールを選択してください' + error_workflow_copy_target: 'コピー先となるトラッカーとロールを選択してください' + error_can_not_delete_tracker: 'このトラッカーは使用されています。削除できません。' + + warning_attachments_not_saved: "%{count}個の添付ファイルが保存できませんでした。" + + mail_subject_lost_password: "%{value} パスワード再発行" + mail_body_lost_password: 'パスワードを変更するには、以下のリンクをクリックしてください:' + mail_subject_register: "%{value} アカウント登録の確認" + mail_body_register: 'アカウント登録を完了するには、以下のアドレスをクリックしてください:' + mail_body_account_information_external: "%{value} アカウントを使ってにログインできます。" + mail_body_account_information: アカウント情報 + mail_subject_account_activation_request: "%{value} アカウントの承認要求" + mail_body_account_activation_request: "新しいユーザー %{value} が登録されました。このアカウントはあなたの承認待ちです:" + mail_subject_reminder: "%{count}件のチケットの期日が%{days}日以内に到来します" + mail_body_reminder: "%{count}件の担当チケットの期日が%{days}日以内に到来します:" + mail_subject_wiki_content_added: "Wikiページ %{id} が追加されました" + mail_body_wiki_content_added: "%{author} によってWikiページ %{id} が追加されました。" + mail_subject_wiki_content_updated: "Wikiページ %{id} が更新されました" + mail_body_wiki_content_updated: "%{author} によってWikiページ %{id} が更新されました。" + + + field_name: 名称 + field_description: 説明 + field_summary: サマリー + field_is_required: 必須 + field_firstname: 名 + field_lastname: 姓 + field_mail: メールアドレス + field_filename: ファイル + field_filesize: サイズ + field_downloads: ダウンロード + field_author: 作成者 + field_created_on: 作成日 + field_updated_on: 更新日 + field_field_format: 形式 + field_is_for_all: 全プロジェクト向け + field_possible_values: 選択肢 + field_regexp: 正規表現 + field_min_length: 最短長 + field_max_length: 最大長 + field_value: 値 + field_category: カテゴリ + field_title: タイトル + field_project: プロジェクト + field_issue: チケット + field_status: ステータス + field_notes: 注記 + field_is_closed: 終了したチケット + field_is_default: デフォルト値 + field_tracker: トラッカー + field_subject: 題名 + field_due_date: 期日 + field_assigned_to: 担当者 + field_priority: 優先度 + field_fixed_version: 対象バージョン + field_user: ユーザー + field_principal: 主体 + field_role: ロール + field_homepage: ホームページ + field_is_public: 公開 + field_parent: 親プロジェクト名 + field_is_in_roadmap: チケットをロードマップに表示する + field_login: ログインID + field_mail_notification: メール通知 + field_admin: システム管理者 + field_last_login_on: 最終接続日 + field_language: 言語 + field_effective_date: 期日 + field_password: パスワード + field_new_password: 新しいパスワード + field_password_confirmation: パスワードの確認 + field_version: バージョン + field_type: タイプ + field_host: ホスト + field_port: ポート + field_account: アカウント + field_base_dn: ベースDN + field_attr_login: ログインIDの属性 + field_attr_firstname: 名の属性 + field_attr_lastname: 姓の属性 + field_attr_mail: メールアドレスの属性 + field_onthefly: あわせてユーザーを作成 + field_start_date: 開始日 + field_done_ratio: 進捗率 + field_auth_source: 認証方式 + field_hide_mail: メールアドレスを隠す + field_comments: コメント + field_url: URL + field_start_page: メインページ + field_subproject: サブプロジェクト + field_hours: 時間 + field_activity: 活動 + field_spent_on: 日付 + field_identifier: 識別子 + field_is_filter: フィルタとして使用 + field_issue_to: 関連するチケット + field_delay: 遅延 + field_assignable: このロールにチケットを割り当て可能 + field_redirect_existing_links: 既存のリンクをリダイレクトする + field_estimated_hours: 予定工数 + field_column_names: 項目 + field_time_entries: 時間を記録 + field_time_zone: タイムゾーン + field_searchable: 検索対象 + field_default_value: デフォルト値 + field_comments_sorting: コメントの表示順 + field_parent_title: 親ページ + field_editable: 編集可能 + field_watcher: ウォッチャー + field_identity_url: OpenID URL + field_content: 内容 + field_group_by: グループ条件 + field_sharing: 共有 + field_parent_issue: 親チケット + field_member_of_group: 担当者のグループ + field_assigned_to_role: 担当者のロール + field_text: テキスト + field_visible: 表示 + field_warn_on_leaving_unsaved: データを保存せずにページから移動するときに警告 + field_commit_logs_encoding: コミットメッセージのエンコーディング + field_scm_path_encoding: パスのエンコーディング + field_path_to_repository: リポジトリのパス + field_root_directory: ルートディレクトリ + field_cvsroot: CVSROOT + field_cvs_module: モジュール + + setting_app_title: アプリケーションのタイトル + setting_app_subtitle: アプリケーションのサブタイトル + setting_welcome_text: ウェルカムメッセージ + setting_default_language: デフォルトの言語 + setting_login_required: 認証が必要 + setting_self_registration: ユーザーによるアカウント登録 + setting_attachment_max_size: 添付ファイルサイズの上限 + setting_issues_export_limit: エクスポートするチケット数の上限 + setting_mail_from: 送信元メールアドレス + setting_bcc_recipients: 宛先を非表示(bcc) + setting_plain_text_mail: プレインテキスト形式(HTMLなし) + setting_host_name: ホスト名とパス + setting_text_formatting: テキスト書式 + setting_cache_formatted_text: テキスト書式の変換結果をキャッシュ + setting_wiki_compression: Wiki履歴を圧縮する + setting_feeds_limit: Atomフィードの最大出力件数 + setting_default_projects_public: デフォルトで新しいプロジェクトは公開にする + setting_autofetch_changesets: コミットを自動取得する + setting_sys_api_enabled: リポジトリ管理用のWebサービスを有効にする + setting_commit_ref_keywords: 参照用キーワード + setting_commit_fix_keywords: 修正用キーワード + setting_autologin: 自動ログイン + setting_date_format: 日付の形式 + setting_time_format: 時刻の形式 + setting_cross_project_issue_relations: 異なるプロジェクトのチケット間で関連の設定を許可 + setting_issue_list_default_columns: チケットの一覧で表示する項目 + setting_repositories_encodings: 添付ファイルとリポジトリのエンコーディング + setting_emails_header: メールのヘッダ + setting_emails_footer: メールのフッタ + setting_protocol: プロトコル + setting_per_page_options: ページごとの表示件数 + setting_user_format: ユーザー名の表示形式 + setting_activity_days_default: プロジェクトの活動ページに表示される日数 + setting_display_subprojects_issues: サブプロジェクトのチケットをメインプロジェクトに表示する + setting_enabled_scm: 使用するバージョン管理システム + setting_mail_handler_body_delimiters: "メール本文から一致する行以降を切り捨てる" + setting_mail_handler_api_enabled: 受信メール用のWebサービスを有効にする + setting_mail_handler_api_key: APIキー + setting_sequential_project_identifiers: プロジェクト識別子を連番で生成する + setting_gravatar_enabled: Gravatarのアイコンを使用する + setting_gravatar_default: デフォルトのGravatarアイコン + setting_diff_max_lines_displayed: 差分の表示行数の上限 + setting_file_max_size_displayed: 画面表示するテキストファイルサイズの上限 + setting_repository_log_display_limit: ファイルのリビジョン表示数の上限 + setting_openid: OpenIDによるログインと登録 + setting_password_min_length: パスワードの最低必要文字数 + setting_new_project_user_role_id: システム管理者以外のユーザーが作成したプロジェクトに設定するロール + setting_default_projects_modules: 新規プロジェクトにおいてデフォルトで有効になるモジュール + setting_issue_done_ratio: 進捗率の算出方法 + setting_issue_done_ratio_issue_field: チケットのフィールドを使用 + setting_issue_done_ratio_issue_status: チケットのステータスに連動 + setting_start_of_week: 週の開始曜日 + setting_rest_api_enabled: RESTによるWebサービスを有効にする + setting_default_notification_option: デフォルトのメール通知オプション + setting_commit_logtime_enabled: コミット時に作業時間を記録する + setting_commit_logtime_activity_id: 作業時間の作業分類 + setting_gantt_items_limit: ガントチャート最大表示件数 + setting_default_projects_tracker_ids: 新規プロジェクトにおいてデフォルトで有効になるトラッカー + + permission_add_project: プロジェクトの追加 + permission_add_subprojects: サブプロジェクトの追加 + permission_edit_project: プロジェクトの編集 + permission_select_project_modules: モジュールの選択 + permission_manage_members: メンバーの管理 + permission_manage_versions: バージョンの管理 + permission_manage_categories: チケットのカテゴリの管理 + permission_view_issues: チケットの閲覧 + permission_add_issues: チケットの追加 + permission_edit_issues: チケットの編集 + permission_manage_issue_relations: 関連するチケットの管理 + permission_add_issue_notes: 注記の追加 + permission_edit_issue_notes: 注記の編集 + permission_edit_own_issue_notes: 自身が記入した注記の編集 + permission_move_issues: チケットの移動 + permission_delete_issues: チケットの削除 + permission_manage_public_queries: 公開クエリの管理 + permission_save_queries: クエリの保存 + permission_view_gantt: ガントチャートの閲覧 + permission_view_calendar: カレンダーの閲覧 + permission_view_issue_watchers: ウォッチャー一覧の閲覧 + permission_add_issue_watchers: ウォッチャーの追加 + permission_delete_issue_watchers: ウォッチャーの削除 + permission_log_time: 作業時間の記入 + permission_view_time_entries: 作業時間の閲覧 + permission_edit_time_entries: 作業時間の編集 + permission_edit_own_time_entries: 自身が記入した作業時間の編集 + permission_manage_project_activities: 作業分類 (時間管理) の管理 + permission_view_news: ニュースの閲覧 + permission_manage_news: ニュースの管理 + permission_comment_news: ニュースへのコメント + permission_view_documents: 文書の閲覧 + permission_manage_files: ファイルの管理 + permission_view_files: ファイルの閲覧 + permission_manage_wiki: Wikiの管理 + permission_rename_wiki_pages: Wikiページ名の変更 + permission_delete_wiki_pages: Wikiページの削除 + permission_view_wiki_pages: Wikiの閲覧 + permission_export_wiki_pages: Wikiページを他の形式にエクスポート + permission_view_wiki_edits: Wiki履歴の閲覧 + permission_edit_wiki_pages: Wikiページの編集 + permission_delete_wiki_pages_attachments: 添付ファイルの削除 + permission_protect_wiki_pages: Wikiページの凍結 + permission_manage_repository: リポジトリの管理 + permission_browse_repository: リポジトリの閲覧 + permission_view_changesets: 更新履歴の閲覧 + permission_commit_access: コミット権限 + permission_manage_boards: フォーラムの管理 + permission_view_messages: メッセージの閲覧 + permission_add_messages: メッセージの追加 + permission_edit_messages: メッセージの編集 + permission_edit_own_messages: 自身が記入したメッセージの編集 + permission_delete_messages: メッセージの削除 + permission_delete_own_messages: 自身が記入したメッセージの削除 + permission_manage_subtasks: 子チケットの管理 + + project_module_issue_tracking: チケットトラッキング + project_module_time_tracking: 時間管理 + project_module_news: ニュース + project_module_documents: 文書 + project_module_files: ファイル + project_module_wiki: Wiki + project_module_repository: リポジトリ + project_module_boards: フォーラム + project_module_gantt: ガントチャート + project_module_calendar: カレンダー + + label_user: ユーザー + label_user_plural: ユーザー + label_user_new: 新しいユーザー + label_user_anonymous: 匿名ユーザー + label_profile: プロフィール + label_project: プロジェクト + label_project_new: 新しいプロジェクト + label_project_plural: プロジェクト + label_x_projects: + zero: プロジェクトはありません + one: 1プロジェクト + other: "%{count}プロジェクト" + label_project_all: 全プロジェクト + label_project_latest: 最近のプロジェクト + label_issue: チケット + label_issue_new: 新しいチケット + label_issue_plural: チケット + label_issue_view_all: すべてのチケットを表示 + label_issues_by: "%{value} 別のチケット" + label_issue_added: チケットの追加 + label_issue_updated: チケットの更新 + label_document: 文書 + label_document_new: 新しい文書 + label_document_plural: 文書 + label_document_added: 文書の追加 + label_role: ロール + label_role_plural: ロール + label_role_new: 新しいロール + label_role_and_permissions: ロールと権限 + label_member: メンバー + label_member_new: 新しいメンバー + label_member_plural: メンバー + label_tracker: トラッカー + label_tracker_plural: トラッカー + label_tracker_new: 新しいトラッカー + label_workflow: ワークフロー + label_issue_status: チケットのステータス + label_issue_status_plural: チケットのステータス + label_issue_status_new: 新しいステータス + label_issue_category: チケットのカテゴリ + label_issue_category_plural: チケットのカテゴリ + label_issue_category_new: 新しいカテゴリ + label_custom_field: カスタムフィールド + label_custom_field_plural: カスタムフィールド + label_custom_field_new: 新しいカスタムフィールド + label_enumerations: 選択肢の値 + label_enumeration_new: 新しい値 + label_information: 情報 + label_information_plural: 情報 + label_please_login: ログインしてください + label_register: 登録する + label_login_with_open_id_option: またはOpenIDでログインする + label_password_lost: パスワードの再発行 + label_home: ホーム + label_my_page: マイページ + label_my_account: 個人設定 + label_my_projects: マイプロジェクト + label_administration: 管理 + label_login: ログイン + label_logout: ログアウト + label_help: ヘルプ + label_reported_issues: 報告したチケット + label_assigned_to_me_issues: 担当しているチケット + label_last_login: 最近の接続 + label_registered_on: 登録日 + label_activity: 活動 + label_overall_activity: すべての活動 + label_user_activity: "%{value} の活動" + label_new: 新しく作成 + label_logged_as: ログイン中: + label_environment: 環境 + label_authentication: 認証 + label_auth_source: 認証方式 + label_auth_source_new: 新しい認証方式 + label_auth_source_plural: 認証方式 + label_subproject_plural: サブプロジェクト + label_subproject_new: 新しいサブプロジェクト + label_and_its_subprojects: "%{value} とサブプロジェクト" + label_min_max_length: 最短 - 最大長 + label_list: リスト + label_date: 日付 + label_integer: 整数 + label_float: 小数 + label_boolean: 真偽値 + label_string: テキスト + label_text: 長いテキスト + label_attribute: 属性 + label_attribute_plural: 属性 + label_no_data: 表示するデータがありません + label_change_status: ステータスの変更 + label_history: 履歴 + label_attachment: ファイル + label_attachment_new: 新しいファイル + label_attachment_delete: ファイルを削除 + label_attachment_plural: ファイル + label_file_added: ファイルの追加 + label_report: レポート + label_report_plural: レポート + label_news: ニュース + label_news_new: ニュースを追加 + label_news_plural: ニュース + label_news_latest: 最新ニュース + label_news_view_all: すべてのニュースを表示 + label_news_added: ニュースの追加 + label_news_comment_added: ニュースへのコメント追加 + label_settings: 設定 + label_overview: 概要 + label_version: バージョン + label_version_new: 新しいバージョン + label_version_plural: バージョン + label_confirmation: 確認 + label_close_versions: 完了したバージョンを終了にする + label_export_to: '他の形式にエクスポート:' + label_read: 読む... + label_public_projects: 公開プロジェクト + label_open_issues: 未完了 + label_open_issues_plural: 未完了 + label_closed_issues: 完了 + label_closed_issues_plural: 完了 + label_x_open_issues_abbr: + zero: 0件未完了 + one: 1件未完了 + other: "%{count}件未完了" + label_x_closed_issues_abbr: + zero: 0件完了 + one: 1件完了 + other: "%{count}件完了" + label_total: 合計 + label_permissions: 権限 + label_current_status: 現在のステータス + label_new_statuses_allowed: 遷移できるステータス + label_all: すべて + label_none: なし + label_nobody: 無記名 + label_next: 次 + label_previous: 前 + label_used_by: 使用中 + label_details: 詳細 + label_add_note: 注記を追加 + label_calendar: カレンダー + label_months_from: ヶ月分 + label_gantt: ガントチャート + label_internal: 内部 + label_last_changes: "最新の変更 %{count}件" + label_change_view_all: すべての変更を表示 + label_comment: コメント + label_comment_plural: コメント + label_x_comments: + zero: コメントがありません + one: 1コメント + other: "%{count}コメント" + label_comment_add: コメント追加 + label_comment_added: コメントが追加されました + label_comment_delete: コメント削除 + label_query: カスタムクエリ + label_query_plural: カスタムクエリ + label_query_new: 新しいクエリ + label_my_queries: マイカスタムクエリ + label_filter_add: フィルタ追加 + label_filter_plural: フィルタ + label_equals: 等しい + label_not_equals: 等しくない + label_in_less_than: 今日から○日後以前 + label_in_more_than: 今日から○日後以降 + label_greater_or_equal: 以上 + label_less_or_equal: 以下 + label_in: 今日から○日後 + label_today: 今日 + label_all_time: 全期間 + label_yesterday: 昨日 + label_this_week: 今週 + label_last_week: 先週 + label_last_n_days: "直近%{count}日間" + label_this_month: 今月 + label_last_month: 先月 + label_this_year: 今年 + label_date_range: 期間 + label_less_than_ago: 今日より○日前以降 + label_more_than_ago: 今日より○日前以前 + label_ago: ○日前 + label_contains: 含む + label_not_contains: 含まない + label_day_plural: 日 + label_repository: リポジトリ + label_repository_plural: リポジトリ + label_browse: ブラウズ + label_branch: ブランチ + label_tag: タグ + label_revision: リビジョン + label_revision_plural: リビジョン + label_revision_id: リビジョン %{value} + label_associated_revisions: 関係しているリビジョン + label_added: 追加 + label_modified: 変更 + label_copied: コピー + label_renamed: 名称変更 + label_deleted: 削除 + label_latest_revision: 最新リビジョン + label_latest_revision_plural: 最新リビジョン + label_view_revisions: リビジョンを表示 + label_view_all_revisions: すべてのリビジョンを表示 + label_max_size: サイズの上限 + label_sort_highest: 一番上へ + label_sort_higher: 上へ + label_sort_lower: 下へ + label_sort_lowest: 一番下へ + label_roadmap: ロードマップ + label_roadmap_due_in: "期日まで %{value}" + label_roadmap_overdue: "%{value} 遅れ" + label_roadmap_no_issues: このバージョンに関するチケットはありません + label_search: 検索 + label_result_plural: 結果 + label_all_words: すべての単語 + label_wiki: Wiki + label_wiki_edit: Wiki編集 + label_wiki_edit_plural: Wiki編集 + label_wiki_page: Wikiページ + label_wiki_page_plural: Wikiページ + label_index_by_title: 索引(名前順) + label_index_by_date: 索引(日付順) + label_current_version: 最新版 + label_preview: プレビュー + label_feed_plural: フィード + label_changes_details: 全変更の詳細 + label_issue_tracking: チケットトラッキング + label_spent_time: 作業時間 + label_overall_spent_time: すべての作業時間 + label_f_hour: "%{value}時間" + label_f_hour_plural: "%{value}時間" + label_time_tracking: 時間管理 + label_change_plural: 変更 + label_statistics: 統計 + label_commits_per_month: 月別のコミット + label_commits_per_author: 作成者別のコミット + label_diff: 差分 + label_view_diff: 差分を表示 + label_diff_inline: インライン + label_diff_side_by_side: 横に並べる + label_options: オプション + label_copy_workflow_from: ワークフローをここからコピー + label_permissions_report: 権限レポート + label_watched_issues: ウォッチしているチケット + label_related_issues: 関連するチケット + label_applied_status: 適用されるステータス + label_loading: ロード中... + label_relation_new: 新しい関連 + label_relation_delete: 関連の削除 + label_relates_to: 関連している + label_duplicates: 次のチケットと重複 + label_duplicated_by: 次のチケットが重複 + label_blocks: ブロック先 + label_blocked_by: ブロック元 + label_precedes: 次のチケットに先行 + label_follows: 次のチケットに後続 + label_stay_logged_in: ログインを維持 + label_disabled: 無効 + label_show_completed_versions: 完了したバージョンを表示 + label_me: 自分 + label_board: フォーラム + label_board_new: 新しいフォーラム + label_board_plural: フォーラム + label_board_sticky: スティッキー + label_board_locked: ロック + label_topic_plural: トピック + label_message_plural: メッセージ + label_message_last: 最新のメッセージ + label_message_new: 新しいメッセージ + label_message_posted: メッセージの追加 + label_reply_plural: 返答 + label_send_information: アカウント情報をユーザーに送信 + label_year: 年 + label_month: 月 + label_week: 週 + label_date_from: "日付指定: " + label_date_to: から + label_language_based: ユーザーの言語の設定に従う + label_sort_by: "並べ替え %{value}" + label_send_test_email: テストメールを送信 + label_feeds_access_key: Atomアクセスキー + label_missing_feeds_access_key: Atomアクセスキーが見つかりません + label_feeds_access_key_created_on: "Atomアクセスキーは%{value}前に作成されました" + label_module_plural: モジュール + label_added_time_by: "%{author} が%{age}前に追加" + label_updated_time_by: "%{author} が%{age}前に更新" + label_updated_time: "%{value}前に更新" + label_jump_to_a_project: プロジェクトへ移動... + label_file_plural: ファイル + label_changeset_plural: 更新履歴 + label_default_columns: デフォルトの項目 + label_no_change_option: (変更無し) + label_bulk_edit_selected_issues: チケットの一括編集 + label_theme: テーマ + label_default: デフォルト + label_search_titles_only: タイトルのみ + label_user_mail_option_all: "参加しているプロジェクトのすべての通知" + label_user_mail_option_selected: "選択したプロジェクトのすべての通知..." + label_user_mail_option_none: "通知しない" + label_user_mail_option_only_my_events: "ウォッチ中または自分が関係しているもの" + label_user_mail_option_only_assigned: "ウォッチ中または自分が担当しているもの" + label_user_mail_option_only_owner: "ウォッチ中または自分が作成したもの" + label_user_mail_no_self_notified: 自分自身による変更の通知は不要 + label_registration_activation_by_email: メールでアカウントを有効化 + label_registration_manual_activation: 手動でアカウントを有効化 + label_registration_automatic_activation: 自動でアカウントを有効化 + label_display_per_page: "1ページに: %{value}" + label_age: 経過期間 + label_change_properties: プロパティの変更 + label_general: 全般 + label_scm: バージョン管理システム + label_plugins: プラグイン + label_ldap_authentication: LDAP認証 + label_downloads_abbr: DL + label_optional_description: 説明 (任意) + label_add_another_file: 別のファイルを追加 + label_preferences: 設定 + label_chronological_order: 古い順 + label_reverse_chronological_order: 新しい順 + label_incoming_emails: 受信メール + label_generate_key: キーの生成 + label_issue_watchers: ウォッチャー + label_example: 例 + label_display: 表示 + label_sort: ソート条件 + label_ascending: 昇順 + label_descending: 降順 + label_date_from_to: "%{start}から%{end}まで" + label_wiki_content_added: Wikiページの追加 + label_wiki_content_updated: Wikiページの更新 + label_group: グループ + label_group_plural: グループ + label_group_new: 新しいグループ + label_time_entry_plural: 作業時間 + label_version_sharing_none: 共有しない + label_version_sharing_descendants: サブプロジェクト単位 + label_version_sharing_hierarchy: プロジェクト階層単位 + label_version_sharing_tree: プロジェクトツリー単位 + label_version_sharing_system: すべてのプロジェクト + label_update_issue_done_ratios: 進捗率の更新 + label_copy_source: コピー元 + label_copy_target: コピー先 + label_copy_same_as_target: 同じコピー先 + label_display_used_statuses_only: このトラッカーで使用中のステータスのみ表示 + label_api_access_key: APIアクセスキー + label_missing_api_access_key: APIアクセスキーが見つかりません + label_api_access_key_created_on: "APIアクセスキーは%{value}前に作成されました" + label_subtask_plural: 子チケット + label_project_copy_notifications: コピーしたチケットのメール通知を送信する + label_principal_search: "ユーザーまたはグループの検索:" + label_user_search: "ユーザーの検索:" + label_git_report_last_commit: ファイルとディレクトリの最新コミットを表示する + label_parent_revision: 親 + label_child_revision: 子 + label_gantt_progress_line: イナズマ線 + + button_login: ログイン + button_submit: 送信 + button_save: 保存 + button_check_all: すべてにチェックをつける + button_uncheck_all: すべてのチェックを外す + button_expand_all: 展開 + button_collapse_all: 折りたたみ + button_delete: 削除 + button_create: 作成 + button_create_and_continue: 連続作成 + button_test: テスト + button_edit: 編集 + button_edit_associated_wikipage: "関連するWikiページを編集: %{page_title}" + button_add: 追加 + button_change: 変更 + button_apply: 適用 + button_clear: クリア + button_lock: ロック + button_unlock: アンロック + button_download: ダウンロード + button_list: 一覧 + button_view: 表示 + button_move: 移動 + button_move_and_follow: 移動後表示 + button_back: 戻る + button_cancel: キャンセル + button_activate: 有効にする + button_sort: ソート + button_log_time: 時間を記録 + button_rollback: このバージョンにロールバック + button_watch: ウォッチ + button_unwatch: ウォッチをやめる + button_reply: 返答 + button_archive: アーカイブ + button_unarchive: アーカイブ解除 + button_reset: リセット + button_rename: 名前変更 + button_change_password: パスワード変更 + button_copy: コピー + button_copy_and_follow: コピー後表示 + button_annotate: アノテート + button_update: 更新 + button_configure: 設定 + button_quote: 引用 + button_duplicate: 複製 + button_show: 表示 + + status_active: 有効 + status_registered: 登録 + status_locked: ロック + + version_status_open: 進行中 + version_status_locked: ロック中 + version_status_closed: 終了 + + field_active: 有効 + + text_select_mail_notifications: メール通知の送信対象とする操作を選択してください。 + text_regexp_info: 例) ^[A-Z0-9]+$ + text_min_max_length_info: 0だと無制限になります + text_project_destroy_confirmation: 本当にこのプロジェクトと関連データを削除しますか? + text_subprojects_destroy_warning: "サブプロジェクト %{value} も削除されます。" + text_workflow_edit: ワークフローを編集するロールとトラッカーを選んでください + text_are_you_sure: よろしいですか? + text_journal_changed: "%{label} を %{old} から %{new} に変更" + text_journal_changed_no_detail: "%{label} を更新" + text_journal_set_to: "%{label} を %{value} にセット" + text_journal_deleted: "%{label} を削除 (%{old})" + text_journal_added: "%{label} %{value} を追加" + text_tip_issue_begin_day: この日に開始するチケット + text_tip_issue_end_day: この日に終了するチケット + text_tip_issue_begin_end_day: この日に開始・終了するチケット + text_caracters_maximum: "最大%{count}文字です。" + text_caracters_minimum: "最低%{count}文字の長さが必要です" + text_length_between: "長さは%{min}から%{max}文字までです。" + text_tracker_no_workflow: このトラッカーにワークフローが定義されていません + text_unallowed_characters: 次の文字は使用できません + text_comma_separated: (カンマで区切ることで)複数の値を設定できます。 + text_line_separated: (1行ごとに書くことで)複数の値を設定できます。 + text_issues_ref_in_commit_messages: コミットメッセージ内でチケットの参照/修正 + text_issue_added: "チケット %{id} が %{author} によって報告されました。" + text_issue_updated: "チケット %{id} が %{author} によって更新されました。" + text_wiki_destroy_confirmation: 本当にこのwikiとその内容のすべてを削除しますか? + text_issue_category_destroy_question: "%{count}件のチケットがこのカテゴリに割り当てられています。" + text_issue_category_destroy_assignments: カテゴリの割り当てを削除する + text_issue_category_reassign_to: チケットをこのカテゴリに再割り当てする + text_user_mail_option: "未選択のプロジェクトでは、ウォッチまたは関係している事柄(例: 自分が報告者もしくは担当者であるチケット)のみメールが送信されます。" + text_no_configuration_data: "ロール、トラッカー、チケットのステータス、ワークフローがまだ設定されていません。\nデフォルト設定のロードを強くお勧めします。ロードした後、それを修正することができます。" + text_load_default_configuration: デフォルト設定をロード + text_status_changed_by_changeset: "更新履歴 %{value} で適用されました。" + text_time_logged_by_changeset: "更新履歴 %{value} で適用されました。" + text_issues_destroy_confirmation: '本当に選択したチケットを削除しますか?' + text_select_project_modules: 'このプロジェクトで使用するモジュールを選択してください:' + text_default_administrator_account_changed: デフォルト管理アカウントが変更済 + text_file_repository_writable: ファイルリポジトリに書き込み可能 + text_plugin_assets_writable: Plugin assetsディレクトリに書き込み可能 + text_rmagick_available: RMagickが利用可能 (オプション) + text_destroy_time_entries_question: このチケットの%{hours}時間分の作業記録の扱いを選択してください。 + text_destroy_time_entries: 記録された作業時間を含めて削除 + text_assign_time_entries_to_project: 記録された作業時間をプロジェクト自体に割り当て + text_reassign_time_entries: '記録された作業時間をこのチケットに再割り当て:' + text_user_wrote: "%{value} さんは書きました:" + text_enumeration_destroy_question: "%{count}個のオブジェクトがこの値に割り当てられています。" + text_enumeration_category_reassign_to: '次の値に割り当て直す:' + text_email_delivery_not_configured: "メールを送信するために必要な設定が行われていないため、メール通知は利用できません。\nconfig/configuration.ymlでSMTPサーバの設定を行い、アプリケーションを再起動してください。" + text_repository_usernames_mapping: "リポジトリのログから検出されたユーザー名をどのRedmineユーザーに関連づけるのか選択してください。\nログ上のユーザー名またはメールアドレスがRedmineのユーザーと一致する場合は自動的に関連づけられます。" + text_diff_truncated: '... 差分の行数が表示可能な上限を超えました。超過分は表示しません。' + text_custom_field_possible_values_info: '選択肢の値は1行に1個ずつ記述してください。' + text_wiki_page_destroy_question: "この親ページの配下に%{descendants}ページの子孫ページがあります。" + text_wiki_page_nullify_children: "子ページをメインページ配下に移動する" + text_wiki_page_destroy_children: "配下の子孫ページも削除する" + text_wiki_page_reassign_children: "子ページを次の親ページの配下に移動する" + text_own_membership_delete_confirmation: "一部またはすべての権限を自分自身から剥奪しようとしているため、このプロジェクトを編集できなくなる可能性があります。\n本当に続けますか?" + text_zoom_in: 拡大 + text_zoom_out: 縮小 + text_warn_on_leaving_unsaved: このページから移動すると、保存されていないデータが失われます。 + text_scm_path_encoding_note: "デフォルト: UTF-8" + text_mercurial_repository_note: "ローカルリポジトリ (例: /hgrepo, c:\\hgrepo)" + text_git_repository_note: "ローカルのベア(bare)リポジトリ (例: /gitrepo, c:\\gitrepo)" + text_scm_command: コマンド + text_scm_command_version: バージョン + text_scm_config: バージョン管理システムのコマンドをconfig/configuration.ymlで設定できます。設定後、Redmineを再起動してください。 + text_scm_command_not_available: バージョン管理システムのコマンドが利用できません。管理画面にて設定を確認してください。 + + default_role_manager: 管理者 + default_role_developer: 開発者 + default_role_reporter: 報告者 + default_tracker_bug: バグ + default_tracker_feature: 機能 + default_tracker_support: サポート + default_issue_status_new: 新規 + default_issue_status_in_progress: 進行中 + default_issue_status_resolved: 解決 + default_issue_status_feedback: フィードバック + default_issue_status_closed: 終了 + default_issue_status_rejected: 却下 + default_doc_category_user: ユーザー文書 + default_doc_category_tech: 技術文書 + default_priority_low: 低め + default_priority_normal: 通常 + default_priority_high: 高め + default_priority_urgent: 急いで + default_priority_immediate: 今すぐ + default_activity_design: 設計作業 + default_activity_development: 開発作業 + + enumeration_issue_priorities: チケットの優先度 + enumeration_doc_categories: 文書カテゴリ + enumeration_activities: 作業分類 (時間管理) + enumeration_system_activity: システム作業分類 + label_additional_workflow_transitions_for_assignee: チケット担当者に追加で許可する遷移 + label_additional_workflow_transitions_for_author: チケット作成者に追加で許可する遷移 + label_bulk_edit_selected_time_entries: 作業時間の一括編集 + text_time_entries_destroy_confirmation: 本当に選択した作業時間を削除しますか? + + label_role_anonymous: 匿名ユーザー + label_role_non_member: 非メンバー + + label_issue_note_added: 注記の追加 + label_issue_status_updated: ステータスの更新 + label_issue_priority_updated: 優先度の更新 + label_issues_visibility_own: 作成者か担当者であるチケット + field_issues_visibility: 表示できるチケット + label_issues_visibility_all: すべてのチケット + permission_set_own_issues_private: 自分のチケットをプライベートに設定 + field_is_private: プライベート + permission_set_issues_private: チケットをプライベートに設定 + label_issues_visibility_public: プライベートチケット以外 + text_issues_destroy_descendants_confirmation: "%{count}個の子チケットも削除されます。" + notice_issue_successful_create: チケット %{id} が作成されました。 + label_between: 次の範囲内 + setting_issue_group_assignment: グループへのチケット割り当てを許可 + description_query_sort_criteria_direction: 順序 + description_project_scope: 検索範囲 + description_filter: Filter + description_user_mail_notification: メール通知の設定 + description_message_content: 内容 + description_available_columns: 利用できる項目 + description_issue_category_reassign: 新しいカテゴリを選択してください + description_search: 検索キーワード + description_notes: 注記 + description_choose_project: プロジェクト + description_query_sort_criteria_attribute: 項目 + description_wiki_subpages_reassign: 新しい親ページを選択してください + description_selected_columns: 選択された項目 + error_scm_annotate_big_text_file: テキストファイルサイズの上限を超えているためアノテートできません。 + setting_default_issue_start_date_to_creation_date: 現在の日付を新しいチケットの開始日とする + button_edit_section: このセクションを編集 + description_all_columns: すべての項目 + button_export: エクスポート + label_export_options: "%{export_format} エクスポート設定" + error_attachment_too_big: このファイルはアップロードできません。添付ファイルサイズの上限(%{max_size})を超えています。 + notice_failed_to_save_time_entries: "全%{total}件中%{count}件の作業時間が保存できませんでした: %{ids}。" + label_x_issues: + zero: 0 チケット + one: 1 チケット + other: "%{count} チケット" + label_repository_new: 新しいリポジトリ + field_repository_is_default: メインリポジトリ + label_copy_attachments: 添付ファイルをコピー + label_item_position: "%{position}/%{count}" + label_completed_versions: 完了したバージョン + text_project_identifier_info: アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。最初の文字はアルファベットの小文字にしてください。
    識別子は後で変更することはできません。 + field_multiple: 複数選択可 + setting_commit_cross_project_ref: 異なるプロジェクトのチケットの参照/修正を許可 + text_issue_conflict_resolution_add_notes: 自分の編集内容を破棄し注記のみ追加 + text_issue_conflict_resolution_overwrite: 自分の編集内容の保存を強行 (他のユーザーの更新内容は注記を除き上書きされます) + notice_issue_update_conflict: このチケットを編集中に他のユーザーが更新しました。 + text_issue_conflict_resolution_cancel: 自分の編集内容を破棄し %{link} を再表示 + permission_manage_related_issues: リビジョンとチケットの関連の管理 + field_auth_source_ldap_filter: LDAPフィルタ + label_search_for_watchers: ウォッチャーを検索して追加 + notice_account_deleted: アカウントが削除されました。 + setting_unsubscribe: ユーザーによるアカウント削除を許可 + button_delete_my_account: 自分のアカウントを削除 + text_account_destroy_confirmation: |- + 本当にアカウントを削除しますか? + アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。 + error_session_expired: セッションが失効しました。ログインし直してください。 + text_session_expiration_settings: "警告: この設定を変更すると現在有効なセッションが失効する可能性があります。" + setting_session_lifetime: 有効期間の最大値 + setting_session_timeout: 無操作タイムアウト + label_session_expiration: セッション有効期間 + permission_close_project: プロジェクトの終了/再開 + label_show_closed_projects: 終了したプロジェクトを表示 + button_close: 終了 + button_reopen: 再開 + project_status_active: 有効 + project_status_closed: 終了 + project_status_archived: アーカイブ + text_project_closed: このプロジェクトは終了しているため読み取り専用です。 + notice_user_successful_create: ユーザー %{id} を作成しました。 + field_core_fields: 標準フィールド + field_timeout: タイムアウト(秒単位) + setting_thumbnails_enabled: 添付ファイルのサムネイル画像を表示 + setting_thumbnails_size: サムネイル画像の大きさ(ピクセル単位) + label_status_transitions: ステータスの遷移 + label_fields_permissions: フィールドに対する権限 + label_readonly: 読み取り専用 + label_required: 必須 + text_repository_identifier_info: アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。
    識別子は後で変更することはできません。 + field_board_parent: 親フォーラム + label_attribute_of_project: プロジェクトの %{name} + label_attribute_of_author: 作成者の %{name} + label_attribute_of_assigned_to: 担当者の %{name} + label_attribute_of_fixed_version: 対象バージョンの %{name} + label_copy_subtasks: 子チケットをコピー + label_copied_to: コピー先 + label_copied_from: コピー元 + label_any_issues_in_project: 次のプロジェクト内のチケット + label_any_issues_not_in_project: 次のプロジェクト外のチケット + field_private_notes: プライベート注記 + permission_view_private_notes: プライベート注記の閲覧 + permission_set_notes_private: 注記をプライベートに設定 + label_no_issues_in_project: 次のプロジェクト内のチケットを除く + label_any: すべて + label_last_n_weeks: 直近%{count}週間 + setting_cross_project_subtasks: 異なるプロジェクトのチケット間の親子関係を許可 + label_cross_project_descendants: サブプロジェクト単位 + label_cross_project_tree: プロジェクトツリー単位 + label_cross_project_hierarchy: プロジェクト階層単位 + label_cross_project_system: すべてのプロジェクト + button_hide: 隠す + setting_non_working_week_days: 休業日 + label_in_the_next_days: 今後○日 + label_in_the_past_days: 過去○日 + label_attribute_of_user: ユーザーの %{name} + text_turning_multiple_off: この設定を無効にすると、複数選択されている値のうち1個だけが保持され残りは選択解除されます。 + label_attribute_of_issue: チケットの %{name} + permission_add_documents: 文書の追加 + permission_edit_documents: 文書の編集 + permission_delete_documents: 文書の削除 + setting_jsonp_enabled: JSONPを有効にする + field_inherit_members: メンバーを継承 + field_closed_on: 終了日 + field_generate_password: パスワードを自動生成 + label_total_time: 合計 + notice_account_not_activated_yet: アカウントが有効化されていません。アカウントを有効にするためのメールをもう一度受信したいときはこのリンクをクリックしてください。 + notice_account_locked: アカウントがロックされています + label_hidden: 非表示 + label_visibility_private: 自分のみ + label_visibility_roles: 次のロールのみ + label_visibility_public: すべてのユーザー + field_must_change_passwd: 次回ログイン時にパスワード変更を強制 + notice_new_password_must_be_different: 新しいパスワードは現在のパスワードと異なるものでなければなりません + setting_mail_handler_excluded_filenames: 除外する添付ファイル名 + text_convert_available: ImageMagickのconvertコマンドが利用可能 (オプション) + label_link: リンク + label_only: 次のもののみ + label_drop_down_list: ドロップダウンリスト + label_checkboxes: チェックボックス + label_link_values_to: 値に設定するリンクURL + setting_force_default_language_for_anonymous: 匿名ユーザーにデフォルトの言語を強制 + setting_force_default_language_for_loggedin: ログインユーザーにデフォルトの言語を強制 + label_custom_field_select_type: カスタムフィールドを追加するオブジェクトを選択してください + label_issue_assigned_to_updated: 担当者の更新 + label_check_for_updates: アップデートを確認 + label_latest_compatible_version: 互換性のある最新バージョン + label_unknown_plugin: 不明なプラグイン + label_radio_buttons: ラジオボタン + label_group_anonymous: 匿名ユーザー + label_group_non_member: 非メンバー + label_add_projects: プロジェクトの追加 + field_default_status: デフォルトのステータス + text_subversion_repository_note: '例: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: 表示できるユーザー + label_users_visibility_all: すべてのアクティブなユーザー + label_users_visibility_members_of_visible_projects: 見ることができるプロジェクトのメンバー + label_edit_attachments: 添付ファイルの編集 + setting_link_copied_issue: チケットをコピーしたときに関連を設定 + label_link_copied_issue: コピーしたチケットに関連を設定 + label_ask: 都度選択 + label_search_attachments_yes: 添付ファイルの名前と説明も検索 + label_search_attachments_no: 添付ファイルを除外 + label_search_attachments_only: 添付ファイルのみ検索 + label_search_open_issues_only: 未完了のチケットのみ + field_address: メールアドレス + setting_max_additional_emails: 追加メールアドレス数の上限 + label_email_address_plural: メールアドレス + label_email_address_add: メールアドレスの追加 + label_enable_notifications: 通知を有効にする + label_disable_notifications: 通知を無効にする + setting_search_results_per_page: ページごとの検索結果表示件数 + label_blank_value: 空 + permission_copy_issues: チケットのコピー + error_password_expired: パスワードの有効期限が過ぎたか、システム管理者より変更を求められています。 + field_time_entries_visibility: 表示できる作業時間 + setting_password_max_age: パスワードの有効期限 + label_parent_task_attributes: 親チケットの値の算出方法 + label_parent_task_attributes_derived: 子チケットの値から算出 + label_parent_task_attributes_independent: 子チケットから独立 + label_time_entries_visibility_all: すべての作業時間 + label_time_entries_visibility_own: 自身が登録した作業時間 + label_member_management: メンバーの管理 + label_member_management_all_roles: すべてのロール + label_member_management_selected_roles_only: 次のロールのみ + label_password_required: この操作を続行するにはパスワードを入力してください + label_total_spent_time: 合計作業時間 + notice_import_finished: "%{count}件のデータをすべてインポートしました" + notice_import_finished_with_errors: "全%{total}件中%{count}件のデータがインポートできませんでした" + error_invalid_file_encoding: このファイルのエンコーディングは正しい%{encoding}ではありません + error_invalid_csv_file_or_settings: このファイルはCSVファイルではないか、以下の設定と一致していません + error_can_not_read_import_file: インポート元のファイルを読み込み中にエラーが発生しました + permission_import_issues: チケットのインポート + label_import_issues: チケットのインポート + label_select_file_to_import: インポートするファイルを選択してください + label_fields_separator: 区切り文字 + label_fields_wrapper: 文字列の引用符 + label_encoding: エンコーディング + label_comma_char: コンマ + label_semi_colon_char: セミコロン + label_quote_char: シングルクォート + label_double_quote_char: ダブルクォート + label_fields_mapping: フィールドの対応関係 + label_file_content_preview: ファイル内容のプレビュー + label_create_missing_values: 存在しない値は新規作成 + button_import: インポート + field_total_estimated_hours: 合計予定工数 + label_api: API + label_total_plural: 合計 + label_assigned_issues: 担当しているチケット + label_field_format_enumeration: キー・バリュー リスト + label_f_hour_short: '%{value}時間' + field_default_version: デフォルトのバージョン + error_attachment_extension_not_allowed: 拡張子が %{extension} のファイルの添付は禁止されています + setting_attachment_extensions_allowed: 許可する拡張子 + setting_attachment_extensions_denied: 禁止する拡張子 + label_any_open_issues: 未完了のチケット + label_no_open_issues: なし または完了したチケット + label_default_values_for_new_users: 新しいユーザーのデフォルト設定 + error_ldap_bind_credentials: LDAPアカウント/パスワードが無効です + setting_sys_api_key: APIキー + setting_lost_password: パスワードの再発行 + mail_subject_security_notification: セキュリティ通知 + mail_body_security_notification_change: ! '%{field} が変更されました。' + mail_body_security_notification_change_to: ! '%{field} が %{value} に変更されました。' + mail_body_security_notification_add: ! '%{field} に %{value} が追加されました。' + mail_body_security_notification_remove: ! '%{field} から %{value} が削除されました。' + mail_body_security_notification_notify_enabled: メールアドレス %{value} に今後の通知が送信されます。 + mail_body_security_notification_notify_disabled: メールアドレス %{value} には今後は通知が送信されません。 + mail_body_settings_updated: ! '下記の設定が変更されました:' + field_remote_ip: IPアドレス + label_wiki_page_new: 新しいWikiページ + label_relations: 関係 + button_filter: フィルタ + mail_body_password_updated: パスワードが変更されました。 + label_no_preview: このファイルはプレビューできません + error_no_tracker_allowed_for_new_issue_in_project: このプロジェクトにはチケットの追加が許可されているトラッカーがありません + label_tracker_all: すべてのトラッカー + label_new_project_issue_tab_enabled: '"新しいチケット" タブを表示' + setting_new_item_menu_tab: 新規オブジェクト作成タブ + label_new_object_tab_enabled: '"+" ドロップダウンを表示' + error_no_projects_with_tracker_allowed_for_new_issue: チケットを追加できるプロジェクトがありません + field_textarea_font: テキストエリアのフォント + label_font_default: デフォルト + label_font_monospace: 等幅 + label_font_proportional: プロポーショナル + setting_timespan_format: 時間の形式 + label_table_of_contents: 目次 + setting_commit_logs_formatting: コミットメッセージにテキスト書式を適用 + setting_mail_handler_enable_regex_delimiters: 正規表現を使用 + error_move_of_child_not_possible: '子チケット %{child} を指定されたプロジェクトに移動できませんでした: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: 削除対象チケットへの作業時間の再割り当てはできません + setting_timelog_required_fields: 作業時間の必須入力フィールド + label_attribute_of_object: '%{object_name}の %{name}' + warning_fields_cleared_on_bulk_edit: この編集操作により次のフィールドの値がチケットから削除されます + field_updated_by: 更新者 + field_last_updated_by: 最終更新者 + field_full_width_layout: ワイド表示 + label_last_notes: 最新の注記 + field_digest: チェックサム + field_default_assigned_to: デフォルトの担当者 + setting_show_custom_fields_on_registration: アカウント登録画面でカスタムフィールドを表示 + label_no_preview_alternative_html: このファイルはプレビューできません。 %{link} してください。 + label_no_preview_download: ダウンロード diff --git a/config/locales/ko.yml b/config/locales/ko.yml new file mode 100644 index 0000000..a0473a7 --- /dev/null +++ b/config/locales/ko.yml @@ -0,0 +1,1269 @@ +# Korean translations for Ruby on Rails +ko: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%m/%d" + long: "%Y년 %m월 %d일 (%a)" + + day_names: [일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일] + abbr_day_names: [일, 월, 화, 수, 목, 금, 토] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월] + abbr_month_names: [~, 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d %H:%M:%S" + time: "%H:%M" + short: "%y/%m/%d %H:%M" + long: "%Y년 %B월 %d일, %H시 %M분 %S초 %Z" + am: "오전" + pm: "오후" + + datetime: + distance_in_words: + half_a_minute: "30초" + less_than_x_seconds: + one: "일초 이하" + other: "%{count}초 이하" + x_seconds: + one: "일초" + other: "%{count}초" + less_than_x_minutes: + one: "일분 이하" + other: "%{count}분 이하" + x_minutes: + one: "일분" + other: "%{count}분" + about_x_hours: + one: "약 한시간" + other: "약 %{count}시간" + x_hours: + one: "1 시간" + other: "%{count} 시간" + x_days: + one: "하루" + other: "%{count}일" + about_x_months: + one: "약 한달" + other: "약 %{count}달" + x_months: + one: "한달" + other: "%{count}달" + about_x_years: + one: "약 일년" + other: "약 %{count}년" + over_x_years: + one: "일년 이상" + other: "%{count}년 이상" + almost_x_years: + one: "약 1년" + other: "약 %{count}년" + prompts: + year: "년" + month: "월" + day: "일" + hour: "시" + minute: "분" + second: "초" + + number: + # Used in number_with_delimiter() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "." + # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "," + # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) + precision: 3 + + # Used in number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%u%n" + unit: "₩" + # These three are to override number.format and are optional + separator: "." + delimiter: "," + precision: 0 + + # Used in number_to_percentage() + percentage: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_precision() + precision: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_human_size() + human: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + words_connector: ", " + two_words_connector: "과 " + last_word_connector: ", " + sentence_connector: "그리고" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "한개의 오류가 발생해 %{model}을(를) 저장하지 않았습니다." + other: "%{count}개의 오류가 발생해 %{model}을(를) 저장하지 않았습니다." + # The variable :count is also available + body: "다음 항목에 문제가 발견했습니다:" + + messages: + inclusion: "은 목록에 포함되어 있지 않습니다" + exclusion: "은 예약되어 있습니다" + invalid: "은 유효하지 않습니다." + confirmation: "은 확인이 되지 않았습니다" + accepted: "은 인정되어야 합니다" + empty: "은 길이가 0이어서는 안됩니다." + blank: "은 빈 값이어서는 안 됩니다" + too_long: "은 너무 깁니다 (최대 %{count}자 까지)" + too_short: "은 너무 짧습니다 (최소 %{count}자 까지)" + wrong_length: "은 길이가 틀렸습니다 (%{count}자이어야 합니다.)" + taken: "은 이미 선택된 겁니다" + not_a_number: "은 숫자가 아닙니다" + greater_than: "은 %{count}보다 커야 합니다." + greater_than_or_equal_to: "은 %{count}보다 크거나 같아야 합니다" + equal_to: "은 %{count}(와)과 같아야 합니다" + less_than: "은 %{count}보다 작어야 합니다" + less_than_or_equal_to: "은 %{count}과 같거나 이하을 요구합니다" + odd: "은 홀수여야 합니다" + even: "은 짝수여야 합니다" + greater_than_start_date: "는 시작날짜보다 커야 합니다" + not_same_project: "는 같은 프로젝트에 속해 있지 않습니다" + circular_dependency: "이 관계는 순환 의존관계를 만들 수 있습니다" + cant_link_an_issue_with_a_descendant: "일감은 하위 일감과 연결할 수 없습니다." + earlier_than_minimum_start_date: "시작날짜 %{date}보다 앞선 시간으로 설정할 수 없습니다." + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: 선택하세요 + + general_text_No: '아니오' + general_text_Yes: '예' + general_text_no: '아니오' + general_text_yes: '예' + general_lang_name: 'Korean (한국어)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: CP949 + general_pdf_fontname: hysmyeongjostdmedium + general_pdf_monospaced_fontname: hysmyeongjostdmedium + general_first_day_of_week: '7' + + notice_account_updated: 계정이 성공적으로 변경되었습니다. + notice_account_invalid_credentials: 잘못된 계정 또는 비밀번호 + notice_account_password_updated: 비밀번호가 잘 변경되었습니다. + notice_account_wrong_password: 잘못된 비밀번호 + notice_account_register_done: 계정이 잘 만들어졌습니다. 계정을 활성화하시려면 받은 메일의 링크를 클릭해주세요. + notice_account_unknown_email: 알려지지 않은 사용자. + notice_can_t_change_password: 이 계정은 외부 인증을 이용합니다. 비밀번호를 변경할 수 없습니다. + notice_account_lost_email_sent: 새로운 비밀번호를 위한 메일이 발송되었습니다. + notice_account_activated: 계정이 활성화되었습니다. 이제 로그인 하실수 있습니다. + notice_successful_create: 생성 성공. + notice_successful_update: 변경 성공. + notice_successful_delete: 삭제 성공. + notice_successful_connection: 연결 성공. + notice_file_not_found: 요청하신 페이지는 삭제되었거나 옮겨졌습니다. + notice_locking_conflict: 다른 사용자에 의해서 데이터가 변경되었습니다. + notice_not_authorized: 이 페이지에 접근할 권한이 없습니다. + notice_email_sent: "%{value}님에게 메일이 발송되었습니다." + notice_email_error: "메일을 전송하는 과정에 오류가 발생했습니다. (%{value})" + notice_feeds_access_key_reseted: Atom에 접근가능한 열쇠(key)가 생성되었습니다. + notice_failed_to_save_issues: "저장에 실패하였습니다: 실패 %{count}(선택 %{total}): %{ids}." + notice_no_issue_selected: "일감이 선택되지 않았습니다. 수정하기 원하는 일감을 선택하세요" + notice_account_pending: "계정이 만들어졌으며 관리자 승인 대기중입니다." + notice_default_data_loaded: 기본값을 성공적으로 읽어들였습니다. + notice_unable_delete_version: 삭제할 수 없는 버전입니다. + + error_can_t_load_default_data: "기본값을 읽어들일 수 없습니다.: %{value}" + error_scm_not_found: 항목이나 리비젼이 저장소에 존재하지 않습니다. + error_scm_command_failed: "저장소에 접근하는 도중에 오류가 발생하였습니다.: %{value}" + error_scm_annotate: "항목이 없거나 행별 이력을 볼 수 없습니다." + error_issue_not_found_in_project: '일감이 없거나 이 프로젝트의 것이 아닙니다.' + + warning_attachments_not_saved: "%{count}개 파일을 저장할 수 없습니다." + + mail_subject_lost_password: "%{value} 비밀번호" + mail_body_lost_password: '비밀번호를 변경하려면 다음 링크를 클릭하세요.' + mail_subject_register: "%{value} 계정 활성화" + mail_body_register: '계정을 활성화하려면 링크를 클릭하세요.:' + mail_body_account_information_external: "로그인할 때 %{value} 계정을 사용하실 수 있습니다." + mail_body_account_information: 계정 정보 + mail_subject_account_activation_request: "%{value} 계정 활성화 요청" + mail_body_account_activation_request: "새 사용자(%{value})가 등록되었습니다. 관리자님의 승인을 기다리고 있습니다.:" + mail_body_reminder: "당신이 맡고 있는 일감 %{count}개의 완료기한이 %{days}일 후 입니다." + mail_subject_reminder: "내일이 만기인 일감 %{count}개 (%{days})" + mail_subject_wiki_content_added: "위키페이지 '%{id}'이(가) 추가되었습니다." + mail_subject_wiki_content_updated: "'위키페이지 %{id}'이(가) 수정되었습니다." + mail_body_wiki_content_added: "%{author}이(가) 위키페이지 '%{id}'을(를) 추가하였습니다." + mail_body_wiki_content_updated: "%{author}이(가) 위키페이지 '%{id}'을(를) 수정하였습니다." + + + field_name: 이름 + field_description: 설명 + field_summary: 요약 + field_is_required: 필수 + field_firstname: 이름 + field_lastname: 성 + field_mail: 메일 + field_filename: 파일 + field_filesize: 크기 + field_downloads: 다운로드 + field_author: 저자 + field_created_on: 등록 + field_updated_on: 변경 + field_field_format: 형식 + field_is_for_all: 모든 프로젝트 + field_possible_values: 가능한 값들 + field_regexp: 정규식 + field_min_length: 최소 길이 + field_max_length: 최대 길이 + field_value: 값 + field_category: 범주 + field_title: 제목 + field_project: 프로젝트 + field_issue: 일감 + field_status: 상태 + field_notes: 덧글 + field_is_closed: 완료 상태 + field_is_default: 기본값 + field_tracker: 유형 + field_subject: 제목 + field_due_date: 완료기한 + field_assigned_to: 담당자 + field_priority: 우선순위 + field_fixed_version: 목표버전 + field_user: 사용자 + field_role: 역할 + field_homepage: 홈페이지 + field_is_public: 공개 + field_parent: 상위 프로젝트 + field_is_in_roadmap: 로드맵에 표시 + field_login: 로그인 + field_mail_notification: 메일 알림 + field_admin: 관리자 + field_last_login_on: 마지막 로그인 + field_language: 언어 + field_effective_date: 날짜 + field_password: 비밀번호 + field_new_password: 새 비밀번호 + field_password_confirmation: 비밀번호 확인 + field_version: 버전 + field_type: 방식 + field_host: 호스트 + field_port: 포트 + field_account: 계정 + field_base_dn: 기본 DN + field_attr_login: 로그인 속성 + field_attr_firstname: 이름 속성 + field_attr_lastname: 성 속성 + field_attr_mail: 메일 속성 + field_onthefly: 동적 사용자 생성 + field_start_date: 시작시간 + field_done_ratio: 진척도 + field_auth_source: 인증 공급자 + field_hide_mail: 메일 주소 숨기기 + field_comments: 설명 + field_url: URL + field_start_page: 첫 페이지 + field_subproject: 하위 프로젝트 + field_hours: 시간 + field_activity: 작업종류 + field_spent_on: 작업시간 + field_identifier: 식별자 + field_is_filter: 검색조건으로 사용됨 + field_issue_to_id: 연관된 일감 + field_delay: 지연 + field_assignable: 일감을 맡길 수 있음 + field_redirect_existing_links: 기존의 링크로 돌려보냄(redirect) + field_estimated_hours: 추정시간 + field_column_names: 컬럼 + field_default_value: 기본값 + field_time_zone: 시간대 + field_searchable: 검색가능 + field_comments_sorting: 댓글 정렬 + field_parent_title: 상위 제목 + field_editable: 편집가능 + field_watcher: 일감관람자 + field_identity_url: OpenID URL + field_content: 내용 + field_group_by: 결과를 묶어 보여줄 기준 + + setting_app_title: 레드마인 제목 + setting_app_subtitle: 레드마인 부제목 + setting_welcome_text: 환영 메시지 + setting_default_language: 기본 언어 + setting_login_required: 인증이 필요함 + setting_self_registration: 사용자 직접등록 + setting_attachment_max_size: 최대 첨부파일 크기 + setting_issues_export_limit: 일감 내보내기 제한 + setting_mail_from: 발신 메일 주소 + setting_bcc_recipients: 참조자들을 bcc로 숨기기 + setting_plain_text_mail: 텍스트만 (HTML 없이) + setting_host_name: 호스트 이름과 경로 + setting_text_formatting: 본문 형식 + setting_wiki_compression: 위키 이력 압축 + setting_feeds_limit: 피드에 포함할 항목의 수 + setting_default_projects_public: 새 프로젝트를 공개로 설정 + setting_autofetch_changesets: 커밋을 자동으로 가져오기 + setting_sys_api_enabled: 저장소 관리에 WS를 사용 + setting_commit_ref_keywords: 일감 참조에 사용할 키워드들 + setting_commit_fix_keywords: 일감 해결에 사용할 키워드들 + setting_autologin: 자동 로그인 + setting_date_format: 날짜 형식 + setting_time_format: 시간 형식 + setting_cross_project_issue_relations: 다른 프로젝트의 일감과 연결하는 것을 허용 + setting_issue_list_default_columns: 일감 목록에 표시할 항목 + setting_emails_footer: 메일 꼬리 + setting_protocol: 프로토콜 + setting_per_page_options: 목록에서, 한 페이지에 표시할 행 + setting_user_format: 사용자 표시 형식 + setting_activity_days_default: 프로젝트 작업내역에 표시할 기간 + setting_display_subprojects_issues: 하위 프로젝트의 일감을 함께 표시 + setting_enabled_scm: "지원할 SCM(Source Control Management)" + setting_mail_handler_api_enabled: 수신 메일에 WS를 허용 + setting_mail_handler_api_key: API 키 + setting_sequential_project_identifiers: 프로젝트 식별자를 순차적으로 생성 + setting_gravatar_enabled: 그라바타 사용자 아이콘 사용 + setting_diff_max_lines_displayed: 차이점(diff) 보기에 표시할 최대 줄수 + setting_repository_log_display_limit: 저장소 보기에 표시할 개정이력의 최대 갯수 + setting_file_max_size_displayed: 바로 보여줄 텍스트파일의 최대 크기 + setting_openid: OpenID 로그인과 등록 허용 + setting_password_min_length: 최소 암호 길이 + setting_new_project_user_role_id: 프로젝트를 만든 사용자에게 주어질 역할 + + permission_add_project: 프로젝트 생성 + permission_edit_project: 프로젝트 편집 + permission_select_project_modules: 프로젝트 모듈 선택 + permission_manage_members: 구성원 관리 + permission_manage_versions: 버전 관리 + permission_manage_categories: 일감 범주 관리 + permission_add_issues: 일감 추가 + permission_edit_issues: 일감 편집 + permission_manage_issue_relations: 일감 관계 관리 + permission_add_issue_notes: 덧글 추가 + permission_edit_issue_notes: 덧글 편집 + permission_edit_own_issue_notes: 내 덧글 편집 + permission_move_issues: 일감 이동 + permission_delete_issues: 일감 삭제 + permission_manage_public_queries: 공용 검색양식 관리 + permission_save_queries: 검색양식 저장 + permission_view_gantt: Gantt차트 보기 + permission_view_calendar: 달력 보기 + permission_view_issue_watchers: 일감관람자 보기 + permission_add_issue_watchers: 일감관람자 추가 + permission_log_time: 작업시간 기록 + permission_view_time_entries: 시간입력 보기 + permission_edit_time_entries: 시간입력 편집 + permission_edit_own_time_entries: 내 시간입력 편집 + permission_manage_news: 뉴스 관리 + permission_comment_news: 뉴스에 댓글달기 + permission_view_documents: 문서 보기 + permission_manage_files: 파일관리 + permission_view_files: 파일보기 + permission_manage_wiki: 위키 관리 + permission_rename_wiki_pages: 위키 페이지 이름변경 + permission_delete_wiki_pages: 위치 페이지 삭제 + permission_view_wiki_pages: 위키 보기 + permission_view_wiki_edits: 위키 기록 보기 + permission_edit_wiki_pages: 위키 페이지 편집 + permission_delete_wiki_pages_attachments: 첨부파일 삭제 + permission_protect_wiki_pages: 프로젝트 위키 페이지 + permission_manage_repository: 저장소 관리 + permission_browse_repository: 저장소 둘러보기 + permission_view_changesets: 변경묶음 보기 + permission_commit_access: 변경로그 보기 + permission_manage_boards: 게시판 관리 + permission_view_messages: 메시지 보기 + permission_add_messages: 메시지 추가 + permission_edit_messages: 메시지 편집 + permission_edit_own_messages: 자기 메시지 편집 + permission_delete_messages: 메시지 삭제 + permission_delete_own_messages: 자기 메시지 삭제 + + project_module_issue_tracking: 일감관리 + project_module_time_tracking: 시간추적 + project_module_news: 뉴스 + project_module_documents: 문서 + project_module_files: 파일 + project_module_wiki: 위키 + project_module_repository: 저장소 + project_module_boards: 게시판 + + label_user: 사용자 + label_user_plural: 사용자 + label_user_new: 새 사용자 + label_project: 프로젝트 + label_project_new: 새 프로젝트 + label_project_plural: 프로젝트 + label_x_projects: + zero: 없음 + one: "한 프로젝트" + other: "%{count}개 프로젝트" + label_project_all: 모든 프로젝트 + label_project_latest: 최근 프로젝트 + label_issue: 일감 + label_issue_new: 새 일감만들기 + label_issue_plural: 일감 + label_issue_view_all: 모든 일감 보기 + label_issues_by: "%{value}별 일감" + label_issue_added: 일감 추가 + label_issue_updated: 일감 수정 + label_document: 문서 + label_document_new: 새 문서 + label_document_plural: 문서 + label_document_added: 문서 추가 + label_role: 역할 + label_role_plural: 역할 + label_role_new: 새 역할 + label_role_and_permissions: 역할 및 권한 + label_member: 구성원 + label_member_new: 새 구성원 + label_member_plural: 구성원 + label_tracker: 일감 유형 + label_tracker_plural: 일감 유형 + label_tracker_new: 새 일감 유형 + label_workflow: 업무흐름 + label_issue_status: 일감 상태 + label_issue_status_plural: 일감 상태 + label_issue_status_new: 새 일감 상태 + label_issue_category: 일감 범주 + label_issue_category_plural: 일감 범주 + label_issue_category_new: 새 일감 범주 + label_custom_field: 사용자 정의 항목 + label_custom_field_plural: 사용자 정의 항목 + label_custom_field_new: 새 사용자 정의 항목 + label_enumerations: 코드값 + label_enumeration_new: 새 코드값 + label_information: 정보 + label_information_plural: 정보 + label_please_login: 로그인하세요. + label_register: 등록 + label_login_with_open_id_option: 또는 OpenID로 로그인 + label_password_lost: 비밀번호 찾기 + label_home: 초기화면 + label_my_page: 내 페이지 + label_my_account: 내 계정 + label_my_projects: 내 프로젝트 + label_administration: 관리 + label_login: 로그인 + label_logout: 로그아웃 + label_help: 도움말 + label_reported_issues: 보고한 일감 + label_assigned_to_me_issues: 내가 맡은 일감 + label_last_login: 마지막 접속 + label_registered_on: 등록시각 + label_activity: 작업내역 + label_overall_activity: 전체 작업내역 + label_user_activity: "%{value}의 작업내역" + label_new: 새로 만들기 + label_logged_as: '로그인계정:' + label_environment: 환경 + label_authentication: 인증 + label_auth_source: 인증 공급자 + label_auth_source_new: 새 인증 공급자 + label_auth_source_plural: 인증 공급자 + label_subproject_plural: 하위 프로젝트 + label_and_its_subprojects: "%{value}와 하위 프로젝트들" + label_min_max_length: 최소 - 최대 길이 + label_list: 목록 + label_date: 날짜 + label_integer: 정수 + label_float: 부동소수 + label_boolean: 부울린 + label_string: 문자열 + label_text: 텍스트 + label_attribute: 속성 + label_attribute_plural: 속성 + label_no_data: 표시할 데이터가 없습니다. + label_change_status: 상태 변경 + label_history: 이력 + label_attachment: 파일 + label_attachment_new: 파일추가 + label_attachment_delete: 파일삭제 + label_attachment_plural: 파일 + label_file_added: 파일 추가 + label_report: 보고서 + label_report_plural: 보고서 + label_news: 뉴스 + label_news_new: 새 뉴스 + label_news_plural: 뉴스 + label_news_latest: 최근 뉴스 + label_news_view_all: 모든 뉴스 + label_news_added: 뉴스 추가 + label_settings: 설정 + label_overview: 개요 + label_version: 버전 + label_version_new: 새 버전 + label_version_plural: 버전 + label_confirmation: 확인 + label_export_to: 내보내기 + label_read: 읽기... + label_public_projects: 공개 프로젝트 + label_open_issues: 진행중 + label_open_issues_plural: 진행중 + label_closed_issues: 완료됨 + label_closed_issues_plural: 완료됨 + label_x_open_issues_abbr: + zero: 모두 완료 + one: 한 건 진행 중 + other: "%{count} 건 진행 중" + label_x_closed_issues_abbr: + zero: 모두 미완료 + one: 한 건 완료 + other: "%{count} 건 완료" + label_total: 합계 + label_permissions: 권한 + label_current_status: 일감 상태 + label_new_statuses_allowed: 허용되는 일감 상태 + label_all: 모두 + label_none: 없음 + label_nobody: 미지정 + label_next: 다음 + label_previous: 뒤로 + label_used_by: 사용됨 + label_details: 자세히 + label_add_note: 일감덧글 추가 + label_calendar: 달력 + label_months_from: 개월 동안 | 다음부터 + label_gantt: Gantt 챠트 + label_internal: 내부 + label_last_changes: "최근 %{count}개의 변경사항" + label_change_view_all: 모든 변경 내역 보기 + label_comment: 댓글 + label_comment_plural: 댓글 + label_x_comments: + zero: 댓글 없음 + one: 한 개의 댓글 + other: "%{count} 개의 댓글" + label_comment_add: 댓글 추가 + label_comment_added: 댓글이 추가되었습니다. + label_comment_delete: 댓글 삭제 + label_query: 검색양식 + label_query_plural: 검색양식 + label_query_new: 새 검색양식 + label_filter_add: 검색조건 추가 + label_filter_plural: 검색조건 + label_equals: 이다 + label_not_equals: 아니다 + label_in_less_than: 이내 + label_in_more_than: 이후 + label_greater_or_equal: ">=" + label_less_or_equal: "<=" + label_in: 이내 + label_today: 오늘 + label_all_time: 모든 시간 + label_yesterday: 어제 + label_this_week: 이번주 + label_last_week: 지난 주 + label_last_n_days: "지난 %{count} 일" + label_this_month: 이번 달 + label_last_month: 지난 달 + label_this_year: 올해 + label_date_range: 날짜 범위 + label_less_than_ago: 이전 + label_more_than_ago: 이후 + label_ago: 일 전 + label_contains: 포함되는 키워드 + label_not_contains: 포함하지 않는 키워드 + label_day_plural: 일 + label_repository: 저장소 + label_repository_plural: 저장소 + label_browse: 저장소 둘러보기 + label_revision: 개정판 + label_revision_plural: 개정판 + label_associated_revisions: 관련된 개정판들 + label_added: 추가됨 + label_modified: 변경됨 + label_copied: 복사됨 + label_renamed: 이름바뀜 + label_deleted: 삭제됨 + label_latest_revision: 최근 개정판 + label_latest_revision_plural: 최근 개정판 + label_view_revisions: 개정판 보기 + label_max_size: 최대 크기 + label_sort_highest: 맨 위로 + label_sort_higher: 위로 + label_sort_lower: 아래로 + label_sort_lowest: 맨 아래로 + label_roadmap: 로드맵 + label_roadmap_due_in: "기한 %{value}" + label_roadmap_overdue: "%{value} 지연" + label_roadmap_no_issues: 이 버전에 해당하는 일감 없음 + label_search: 검색 + label_result_plural: 결과 + label_all_words: 모든 단어 + label_wiki: 위키 + label_wiki_edit: 위키 편집 + label_wiki_edit_plural: 위키 편집 + label_wiki_page: 위키 페이지 + label_wiki_page_plural: 위키 페이지 + label_index_by_title: 제목별 색인 + label_index_by_date: 날짜별 색인 + label_current_version: 현재 버전 + label_preview: 미리보기 + label_feed_plural: 피드(Feeds) + label_changes_details: 모든 상세 변경 내역 + label_issue_tracking: 일감 추적 + label_spent_time: 소요 시간 + label_f_hour: "%{value} 시간" + label_f_hour_plural: "%{value} 시간" + label_time_tracking: 시간추적 + label_change_plural: 변경사항들 + label_statistics: 통계 + label_commits_per_month: 월별 커밋 내역 + label_commits_per_author: 저자별 커밋 내역 + label_view_diff: 차이점 보기 + label_diff_inline: 두줄로 + label_diff_side_by_side: 한줄로 + label_options: 옵션 + label_copy_workflow_from: 업무흐름 복사하기 + label_permissions_report: 권한 보고서 + label_watched_issues: 지켜보고 있는 일감 + label_related_issues: 연결된 일감 + label_applied_status: 적용된 상태 + label_loading: 읽는 중... + label_relation_new: 새 관계 + label_relation_delete: 관계 지우기 + label_relates_to: "다음 일감과 관련됨:" + label_duplicates: "다음 일감에 중복됨:" + label_duplicated_by: "중복된 일감:" + label_blocks: "다음 일감의 해결을 막고 있음:" + label_blocked_by: "다음 일감에게 막혀 있음:" + label_precedes: "다음에 진행할 일감:" + label_follows: "다음 일감을 우선 진행:" + label_stay_logged_in: 로그인 유지 + label_disabled: 비활성화 + label_show_completed_versions: 완료된 버전 보기 + label_me: 나 + label_board: 게시판 + label_board_new: 새 게시판 + label_board_plural: 게시판 + label_topic_plural: 주제 + label_message_plural: 글 + label_message_last: 마지막 글 + label_message_new: 새글쓰기 + label_message_posted: 글 추가 + label_reply_plural: 답글 + label_send_information: 사용자에게 계정정보를 보내기 + label_year: 년 + label_month: 월 + label_week: 주 + label_date_from: '기간:' + label_date_to: ' ~ ' + label_language_based: 언어설정에 따름 + label_sort_by: "%{value}(으)로 정렬" + label_send_test_email: 테스트 메일 보내기 + label_feeds_access_key_created_on: "피드 접근 키가 %{value} 이전에 생성되었습니다." + label_module_plural: 모듈 + label_added_time_by: "%{author}이(가) %{age} 전에 추가함" + label_updated_time_by: "%{author}이(가) %{age} 전에 변경" + label_updated_time: "%{value} 전에 수정됨" + label_jump_to_a_project: 프로젝트 바로가기 + label_file_plural: 파일 + label_changeset_plural: 변경묶음 + label_default_columns: 기본 컬럼 + label_no_change_option: (수정 안함) + label_bulk_edit_selected_issues: 선택한 일감들을 한꺼번에 수정하기 + label_theme: 테마 + label_default: 기본 + label_search_titles_only: 제목에서만 찾기 + label_user_mail_option_all: "내가 속한 프로젝트들로부터 모든 메일 받기" + label_user_mail_option_selected: "선택한 프로젝트들로부터 모든 메일 받기.." + label_user_mail_no_self_notified: "내가 만든 변경사항들에 대해서는 알림을 받지 않습니다." + label_registration_activation_by_email: 메일로 계정을 활성화하기 + label_registration_automatic_activation: 자동 계정 활성화 + label_registration_manual_activation: 수동 계정 활성화 + label_display_per_page: "페이지당 줄수: %{value}" + label_age: 마지막 수정일 + label_change_properties: 속성 변경 + label_general: 일반 + label_scm: 형상관리시스템 + label_plugins: 플러그인 + label_ldap_authentication: LDAP 인증 + label_downloads_abbr: D/L + label_optional_description: 부가적인 설명 + label_add_another_file: 다른 파일 추가 + label_preferences: 설정 + label_chronological_order: 시간 순으로 정렬 + label_reverse_chronological_order: 시간 역순으로 정렬 + label_incoming_emails: 수신 메일 + label_generate_key: 키 생성 + label_issue_watchers: 일감관람자 + label_example: 예 + label_display: 표시방식 + label_sort: 정렬 + label_ascending: 오름차순 + label_descending: 내림차순 + label_date_from_to: "%{start}부터 %{end}까지" + label_wiki_content_added: 위키페이지 추가 + label_wiki_content_updated: 위키페이지 수정 + + button_login: 로그인 + button_submit: 확인 + button_save: 저장 + button_check_all: 모두선택 + button_uncheck_all: 선택해제 + button_delete: 삭제 + button_create: 만들기 + button_create_and_continue: 만들고 계속하기 + button_test: 테스트 + button_edit: 편집 + button_add: 추가 + button_change: 변경 + button_apply: 적용 + button_clear: 지우기 + button_lock: 잠금 + button_unlock: 잠금해제 + button_download: 다운로드 + button_list: 목록 + button_view: 보기 + button_move: 이동 + button_back: 뒤로 + button_cancel: 취소 + button_activate: 활성화 + button_sort: 정렬 + button_log_time: 작업시간 기록 + button_rollback: 이 버전으로 되돌리기 + button_watch: 지켜보기 + button_unwatch: 관심끄기 + button_reply: 답글 + button_archive: 잠금보관 + button_unarchive: 잠금보관해제 + button_reset: 초기화 + button_rename: 이름바꾸기 + button_change_password: 비밀번호 바꾸기 + button_copy: 복사 + button_annotate: 이력해설 + button_update: 업데이트 + button_configure: 설정 + button_quote: 댓글달기 + + status_active: 사용중 + status_registered: 등록대기 + status_locked: 잠김 + + text_select_mail_notifications: 알림메일이 필요한 작업을 선택하세요. + text_regexp_info: 예) ^[A-Z0-9]+$ + text_min_max_length_info: 0 는 제한이 없음을 의미함 + text_project_destroy_confirmation: 이 프로젝트를 삭제하고 모든 데이터를 지우시겠습니까? + text_subprojects_destroy_warning: "하위 프로젝트(%{value})이(가) 자동으로 지워질 것입니다." + text_workflow_edit: 업무흐름을 수정하려면 역할과 일감 유형을 선택하세요. + text_are_you_sure: 계속 진행 하시겠습니까? + text_tip_issue_begin_day: 오늘 시작하는 업무(task) + text_tip_issue_end_day: 오늘 종료하는 업무(task) + text_tip_issue_begin_end_day: 오늘 시작하고 종료하는 업무(task) + text_caracters_maximum: "최대 %{count} 글자 가능" + text_caracters_minimum: "최소한 %{count} 글자 이상이어야 합니다." + text_length_between: "%{min} 에서 %{max} 글자" + text_tracker_no_workflow: 이 일감 유형에는 업무흐름이 정의되지 않았습니다. + text_unallowed_characters: 허용되지 않는 문자열 + text_comma_separated: "구분자','를 이용해서 여러 개의 값을 입력할 수 있습니다." + text_issues_ref_in_commit_messages: 커밋 메시지에서 일감을 참조하거나 해결하기 + text_issue_added: "%{author}이(가) 일감 %{id}을(를) 보고하였습니다." + text_issue_updated: "%{author}이(가) 일감 %{id}을(를) 수정하였습니다." + text_wiki_destroy_confirmation: 이 위키와 모든 내용을 지우시겠습니까? + text_issue_category_destroy_question: "일부 일감들(%{count}개)이 이 범주에 지정되어 있습니다. 어떻게 하시겠습니까?" + text_issue_category_destroy_assignments: 범주 지정 지우기 + text_issue_category_reassign_to: 일감을 이 범주에 다시 지정하기 + text_user_mail_option: "선택하지 않은 프로젝트에서도, 지켜보는 중이거나 속해있는 사항(일감를 발행했거나 할당된 경우)이 있으면 알림메일을 받게 됩니다." + text_no_configuration_data: "역할, 일감 유형, 일감 상태들과 업무흐름이 아직 설정되지 않았습니다.\n기본 설정을 읽어들이는 것을 권장합니다. 읽어들인 후에 수정할 수 있습니다." + text_load_default_configuration: 기본 설정을 읽어들이기 + text_status_changed_by_changeset: "변경묶음 %{value}에 의하여 변경됨" + text_issues_destroy_confirmation: '선택한 일감를 정말로 삭제하시겠습니까?' + text_select_project_modules: '이 프로젝트에서 활성화시킬 모듈을 선택하세요:' + text_default_administrator_account_changed: 기본 관리자 계정이 변경 + text_file_repository_writable: 파일 저장소 쓰기 가능 + text_plugin_assets_writable: 플러그인 전용 디렉토리가 쓰기 가능 + text_rmagick_available: RMagick 사용 가능 (선택적) + text_destroy_time_entries_question: 삭제하려는 일감에 %{hours} 시간이 보고되어 있습니다. 어떻게 하시겠습니까? + text_destroy_time_entries: 보고된 시간을 삭제하기 + text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기 + text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:' + text_user_wrote: "%{value}의 덧글:" + text_enumeration_category_reassign_to: '새로운 값을 설정:' + text_enumeration_destroy_question: "%{count} 개의 일감이 이 값을 사용하고 있습니다." + text_email_delivery_not_configured: "이메일 전달이 설정되지 않았습니다. 그래서 알림이 비활성화되었습니다.\n SMTP서버를 config/configuration.yml에서 설정하고 어플리케이션을 다시 시작하십시오. 그러면 동작합니다." + text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다." + text_diff_truncated: '... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.' + text_custom_field_possible_values_info: '각 값 당 한 줄' + text_wiki_page_destroy_question: 이 페이지는 %{descendants} 개의 하위 페이지와 관련 내용이 있습니다. 이 내용을 어떻게 하시겠습니까? + text_wiki_page_nullify_children: 하위 페이지를 최상위 페이지 아래로 지정 + text_wiki_page_destroy_children: 모든 하위 페이지와 관련 내용을 삭제 + text_wiki_page_reassign_children: 하위 페이지를 이 페이지 아래로 지정 + + default_role_manager: 관리자 + default_role_developer: 개발자 + default_role_reporter: 보고자 + default_tracker_bug: 결함 + default_tracker_feature: 새기능 + default_tracker_support: 지원 + default_issue_status_new: 신규 + default_issue_status_in_progress: 진행 + default_issue_status_resolved: 해결 + default_issue_status_feedback: 의견 + default_issue_status_closed: 완료 + default_issue_status_rejected: 거절 + default_doc_category_user: 사용자 문서 + default_doc_category_tech: 기술 문서 + default_priority_low: 낮음 + default_priority_normal: 보통 + default_priority_high: 높음 + default_priority_urgent: 긴급 + default_priority_immediate: 즉시 + default_activity_design: 설계 + default_activity_development: 개발 + + enumeration_issue_priorities: 일감 우선순위 + enumeration_doc_categories: 문서 범주 + enumeration_activities: 작업분류(시간추적) + + field_issue_to: 관련 일감 + label_view_all_revisions: 모든 개정판 표시 + label_tag: 태그(Tag) + label_branch: 브랜치(Branch) + error_no_tracker_in_project: 사용할 수 있도록 설정된 일감 유형이 없습니다. 프로젝트 설정을 확인하십시오. + error_no_default_issue_status: '기본 상태가 정해져 있지 않습니다. 설정을 확인하십시오. (주 메뉴의 "관리" -> "일감 상태")' + text_journal_changed: "%{label}을(를) %{old}에서 %{new}(으)로 변경되었습니다." + text_journal_set_to: "%{label}을(를) %{value}(으)로 지정되었습니다." + text_journal_deleted: "%{label} 값이 지워졌습니다. (%{old})" + label_group_plural: 그룹 + label_group: 그룹 + label_group_new: 새 그룹 + label_time_entry_plural: 작업시간 + text_journal_added: "%{label}에 %{value}이(가) 추가되었습니다." + field_active: 사용중 + enumeration_system_activity: 시스템 작업 + permission_delete_issue_watchers: 일감관람자 지우기 + version_status_closed: 닫힘 + version_status_locked: 잠김 + version_status_open: 진행 + error_can_not_reopen_issue_on_closed_version: 닫힌 버전에 할당된 일감은 다시 재발생시킬 수 없습니다. + label_user_anonymous: 이름없음 + button_move_and_follow: 이동하고 따라가기 + setting_default_projects_modules: 새 프로젝트에 기본적으로 활성화될 모듈 + setting_gravatar_default: 기본 그라바타 이미지 + field_sharing: 공유 + label_version_sharing_hierarchy: 상위 및 하위 프로젝트 + label_version_sharing_system: 모든 프로젝트 + label_version_sharing_descendants: 하위 프로젝트 + label_version_sharing_tree: 최상위 및 모든 하위 프로젝트 + label_version_sharing_none: 공유없음 + error_can_not_archive_project: 이 프로젝트를 잠금보관할 수 없습니다. + button_duplicate: 복제 + button_copy_and_follow: 복사하고 따라가기 + label_copy_source: 원본 + setting_issue_done_ratio: 일감의 진척도 계산방법 + setting_issue_done_ratio_issue_status: 일감 상태를 사용하기 + error_issue_done_ratios_not_updated: 일감 진척도가 수정되지 않았습니다. + error_workflow_copy_target: 대상 일감의 유형과 역할을 선택하세요. + setting_issue_done_ratio_issue_field: 일감 수정에서 진척도 입력하기 + label_copy_same_as_target: 대상과 같음. + label_copy_target: 대상 + notice_issue_done_ratios_updated: 일감 진척도가 수정되었습니다. + error_workflow_copy_source: 원본 일감의 유형이나 역할을 선택하세요. + label_update_issue_done_ratios: 모든 일감 진척도 갱신하기 + setting_start_of_week: 달력 시작 요일 + permission_view_issues: 일감 보기 + label_display_used_statuses_only: 이 일감 유형에서 사용되는 상태만 보여주기 + label_revision_id: 개정판 %{value} + label_api_access_key: API 접근키 + label_api_access_key_created_on: API 접근키가 %{value} 전에 생성되었습니다. + label_feeds_access_key: Atom 접근키 + notice_api_access_key_reseted: API 접근키가 초기화되었습니다. + setting_rest_api_enabled: REST 웹서비스 활성화 + label_missing_api_access_key: API 접근키가 없습니다. + label_missing_feeds_access_key: Atom 접근키가 없습니다. + button_show: 보기 + text_line_separated: 여러 값이 허용됨(값 마다 한 줄씩) + setting_mail_handler_body_delimiters: 메일 본문 구분자 + permission_add_subprojects: 하위 프로젝트 만들기 + label_subproject_new: 새 하위 프로젝트 + text_own_membership_delete_confirmation: |- + 권한들 일부 또는 전부를 막 삭제하려고 하고 있습니다. 그렇게 되면 이 프로젝트를 더이상 수정할 수 없게 됩니다. + 계속하시겠습니까? + label_close_versions: 완료된 버전 닫기 + label_board_sticky: 붙박이 + label_board_locked: 잠금 + permission_export_wiki_pages: 위키 페이지 내보내기 + setting_cache_formatted_text: 형식을 가진 텍스트 빠른 임시 기억 + permission_manage_project_activities: 프로젝트 작업내역 관리 + error_unable_delete_issue_status: 일감 상태를 지울 수 없습니다. + label_profile: 사용자정보 + permission_manage_subtasks: 하위 일감 관리 + field_parent_issue: 상위 일감 + label_subtask_plural: 하위 일감 + label_project_copy_notifications: 프로젝트 복사 중에 이메일 알림 보내기 + error_can_not_delete_custom_field: 사용자 정의 필드를 삭제할 수 없습니다. + error_unable_to_connect: 연결할 수 없습니다((%{value}) + error_can_not_remove_role: 이 역할은 현재 사용 중이이서 삭제할 수 없습니다. + error_can_not_delete_tracker: 이 유형의 일감들이 있어서 삭제할 수 없습니다. + field_principal: 신원 + notice_failed_to_save_members: "%{errors}:구성원을 저장 중 실패하였습니다" + text_zoom_out: 더 작게 + text_zoom_in: 더 크게 + notice_unable_delete_time_entry: 시간 기록 항목을 삭제할 수 없습니다. + label_overall_spent_time: 총 소요시간 + field_time_entries: 기록된 시간 + project_module_gantt: Gantt 챠트 + project_module_calendar: 달력 + button_edit_associated_wikipage: "연관된 위키 페이지 %{page_title} 수정" + field_text: 텍스트 영역 + setting_default_notification_option: 기본 알림 옵션 + label_user_mail_option_only_my_events: 내가 지켜보거나 속해있는 사항만 + label_user_mail_option_none: 알림 없음 + field_member_of_group: 할당된 사람의 그룹 + field_assigned_to_role: 할당된 사람의 역할 + notice_not_authorized_archived_project: 접근하려는 프로젝트는 이미 잠금보관되어 있습니다. + label_principal_search: "사용자 및 그룹 찾기:" + label_user_search: "사용자 찾기::" + field_visible: 보이기 + setting_emails_header: 이메일 헤더 + setting_commit_logtime_activity_id: 기록된 시간에 적용할 작업분류 + text_time_logged_by_changeset: "변경묶음 %{value}에서 적용되었습니다." + setting_commit_logtime_enabled: 커밋 시점에 작업 시간 기록 활성화 + notice_gantt_chart_truncated: "표시할 수 있는 최대 항목수(%{max})를 초과하여 차트가 잘렸습니다." + setting_gantt_items_limit: "Gantt 차트에 표시되는 최대 항목수" + field_warn_on_leaving_unsaved: "저장하지 않은 페이지를 빠져나갈 때 나에게 알림" + text_warn_on_leaving_unsaved: "현재 페이지는 저장되지 않은 문자가 있습니다. 이 페이지를 빠져나가면 내용을 잃을 것입니다." + label_my_queries: "내 검색 양식" + text_journal_changed_no_detail: "%{label}이 변경되었습니다." + label_news_comment_added: "뉴스에 설명이 추가되었습니다." + button_expand_all: "모두 확장" + button_collapse_all: "모두 축소" + label_additional_workflow_transitions_for_assignee: "사용자가 작업자일 때 허용되는 추가 상태" + label_additional_workflow_transitions_for_author: "사용자가 저자일 때 허용되는 추가 상태" + label_bulk_edit_selected_time_entries: "선택된 소요 시간 대량 편집" + text_time_entries_destroy_confirmation: "선택한 소요 시간 항목을 삭제하시겠습니까?" + label_role_anonymous: 익명 + label_role_non_member: 비회원 + + label_issue_note_added: "덧글이 추가되었습니다." + label_issue_status_updated: "상태가 변경되었습니다." + label_issue_priority_updated: "우선 순위가 변경되었습니다." + label_issues_visibility_own: "일감을 생성하거나 맡은 사용자" + field_issues_visibility: "일감 보임" + label_issues_visibility_all: "모든 일감" + permission_set_own_issues_private: "자신의 일감을 공개나 비공개로 설정" + field_is_private: "비공개" + permission_set_issues_private: "일감을 공개나 비공개로 설정" + label_issues_visibility_public: "비공개 일감 제외" + text_issues_destroy_descendants_confirmation: "%{count} 개의 하위 일감을 삭제할 것입니다." + field_commit_logs_encoding: "커밋 기록 인코딩" + field_scm_path_encoding: "경로 인코딩" + text_scm_path_encoding_note: "기본: UTF-8" + field_path_to_repository: "저장소 경로" + field_root_directory: "루트 경로" + field_cvs_module: "모듈" + field_cvsroot: "CVS 루트" + text_mercurial_repository_note: "로컬 저장소 (예: /hgrepo, c:\\hgrepo)" + text_scm_command: "명령" + text_scm_command_version: "버전" + label_git_report_last_commit: "파일이나 폴더의 마지막 커밋을 보고" + text_scm_config: "SCM 명령을 config/configuration.yml에서 수정할 수 있습니다. 수정후에는 재시작하십시오." + text_scm_command_not_available: "SCM 명령을 사용할 수 없습니다. 관리 페이지의 설정을 검사하십시오." + notice_issue_successful_create: "%{id} 일감이 생성되었습니다." + label_between: "사이" + setting_issue_group_assignment: "그룹에 일감 할당 허용" + label_diff: "비교(diff)" + text_git_repository_note: "로컬의 bare 저장소 (예: /gitrepo, c:\\gitrepo)" + description_query_sort_criteria_direction: "정렬 방향" + description_project_scope: "검색 범위" + description_filter: "검색 조건" + description_user_mail_notification: "메일 알림 설정" + description_message_content: "메세지 내용" + description_available_columns: "가능한 컬럼" + description_issue_category_reassign: "일감 범주를 선택하십시오." + description_search: "검색항목" + description_notes: "덧글" + description_choose_project: "프로젝트" + description_query_sort_criteria_attribute: "정렬 속성" + description_wiki_subpages_reassign: "새로운 상위 페이지를 선택하십시오." + description_selected_columns: "선택된 컬럼" + label_parent_revision: "상위" + label_child_revision: "하위" + error_scm_annotate_big_text_file: "최대 텍스트 파일 크기를 초과 하면 항목은 이력화 될 수 없습니다." + setting_default_issue_start_date_to_creation_date: "새로운 일감의 시작 날짜로 오늘 날짜 사용" + button_edit_section: "이 부분 수정" + setting_repositories_encodings: "첨부파일이나 저장소 인코딩" + description_all_columns: "모든 컬럼" + button_export: "내보내기" + label_export_options: "내보내기 옵션: %{export_format}" + error_attachment_too_big: "이 파일은 제한된 크기(%{max_size})를 초과하였기 때문에 업로드 할 수 없습니다." + + notice_failed_to_save_time_entries: "%{total} 개의 시간입력중 다음 %{count} 개의 저장에 실패했습니다:: %{ids}." + label_x_issues: + zero: 0 일감 + one: 1 일감 + other: "%{count} 일감" + label_repository_new: 저장소 추가 + field_repository_is_default: 주 저장소 + label_copy_attachments: 첨부파일 복사 + label_item_position: "%{position}/%{count}" + label_completed_versions: 완료 버전 + text_project_identifier_info: "소문자(a-z),숫자,대쉬(-)와 밑줄(_)만 가능합니다.
    식별자는 저장후에는 수정할 수 없습니다." + field_multiple: 복수선택가능 + setting_commit_cross_project_ref: 다른 프로젝트의 일감 참조 및 수정 허용 + text_issue_conflict_resolution_add_notes: 변경내용은 취소하고 덧글만 추가 + text_issue_conflict_resolution_overwrite: 변경내용 강제적용 (이전 덧글을 제외하고 덮어 씁니다) + notice_issue_update_conflict: 일감이 수정되는 동안 다른 사용자에 의해서 변경되었습니다. + text_issue_conflict_resolution_cancel: "변경내용을 되돌리고 다시 표시 %{link}" + permission_manage_related_issues: 연결된 일감 관리 + field_auth_source_ldap_filter: LDAP 필터 + label_search_for_watchers: 추가할 일감관람자 검색 + notice_account_deleted: 당신의 계정이 완전히 삭제되었습니다. + setting_unsubscribe: 사용자들이 자신의 계정을 삭제토록 허용 + button_delete_my_account: 나의 계정 삭제 + text_account_destroy_confirmation: |- + 계속하시겠습니까? + 계정이 삭제되면 복구할 수 없습니다. + error_session_expired: 당신의 세션이 만료되었습니다. 다시 로그인하세요. + text_session_expiration_settings: "경고: 이 설정을 바꾸면 당신을 포함하여 현재의 세션들을 만료시킬 수 있습니다." + setting_session_lifetime: 세션 최대 시간 + setting_session_timeout: 세션 비활성화 타임아웃 + label_session_expiration: 세션 만료 + permission_close_project: 프로젝트를 닫거나 다시 열기 + label_show_closed_projects: 닫힌 프로젝트 보기 + button_close: 닫기 + button_reopen: 다시 열기 + project_status_active: 사용중 + project_status_closed: 닫힘 + project_status_archived: 잠금보관 + text_project_closed: 이 프로젝트는 닫혀 있으며 읽기 전용입니다. + notice_user_successful_create: 사용자 %{id} 이(가) 생성되었습니다. + field_core_fields: 표준 항목들 + field_timeout: 타임아웃 (초) + setting_thumbnails_enabled: 첨부파일의 썸네일을 보여줌 + setting_thumbnails_size: 썸네일 크기 (픽셀) + label_status_transitions: 일감 상태 변경 + label_fields_permissions: 항목 편집 권한 + label_readonly: 읽기 전용 + label_required: 필수 + text_repository_identifier_info: "소문자(a-z),숫자,대쉬(-)와 밑줄(_)만 가능합니다.
    식별자는 저장후에는 수정할 수 없습니다." + field_board_parent: Parent forum + label_attribute_of_project: "프로젝트의 %{name}" + label_attribute_of_author: "저자의 %{name}" + label_attribute_of_assigned_to: "담당자의 %{name}" + label_attribute_of_fixed_version: "목표버전의 %{name}" + label_copy_subtasks: 하위 일감들을 복사 + label_copied_to: "다음 일감으로 복사됨:" + label_copied_from: "다음 일감으로부터 복사됨:" + label_any_issues_in_project: 다음 프로젝트에 속한 아무 일감 + label_any_issues_not_in_project: 다음 프로젝트에 속하지 않은 아무 일감 + field_private_notes: 비공개 덧글 + permission_view_private_notes: 비공개 덧글 보기 + permission_set_notes_private: 덧글을 비공개로 설정 + label_no_issues_in_project: 다음 프로젝트의 일감 제외 + label_any: 모두 + label_last_n_weeks: 최근 %{count} 주 + setting_cross_project_subtasks: 다른 프로젝트로부터 상위 일감 지정 허용 + label_cross_project_descendants: 하위 프로젝트 + label_cross_project_tree: 최상위 및 모든 하위 프로젝트 + label_cross_project_hierarchy: 상위 및 하위 프로젝트 + label_cross_project_system: 모든 프로젝트 + button_hide: 숨기기 + setting_non_working_week_days: 휴일 + label_in_the_next_days: 다음 + label_in_the_past_days: 지난 + label_attribute_of_user: "사용자의 %{name}" + text_turning_multiple_off: 복수선택을 비활성화하면, 하나의 값을 제외한 나머지 값들이 지워집니다. + label_attribute_of_issue: "일감의 %{name}" + permission_add_documents: 문서 추가 + permission_edit_documents: 문서 편집 + permission_delete_documents: 문서 삭제 + label_gantt_progress_line: 진행 선 + setting_jsonp_enabled: JSONP 허용 + field_inherit_members: 상위 프로젝트 구성원 상속 + field_closed_on: 완료일 + field_generate_password: 비밀번호 생성 + setting_default_projects_tracker_ids: 새 프로젝트에 기본적으로 추가할 일감 유형 + label_total_time: 합계 + notice_account_not_activated_yet: 계정이 활성화되지 않았습니다. 계정을 활성화하기 위해 메일을 다시 수신하려면 여기를 클릭해 주세요. + notice_account_locked: 계정이 잠겨 있습니다. + label_hidden: 숨김 + label_visibility_private: 자신 만 + label_visibility_roles: 다음 역할 만 + label_visibility_public: 모든 사용자 + field_must_change_passwd: 다음 로그온 시 암호 변경 + notice_new_password_must_be_different: 새 암호는 현재 암호와 달라야 합니다. + setting_mail_handler_excluded_filenames: 제외할 첨부 파일명 + text_convert_available: ImageMagick 변환 사용 가능 (옵션) + label_link: 링크 + label_only: 다음의 것만 + label_drop_down_list: 드롭다운 목록 + label_checkboxes: 체크박스 + label_link_values_to: URL 링크 값 + setting_force_default_language_for_anonymous: 익명 사용자의 기본 언어 강제 + setting_force_default_language_for_loggedin: 로그인 사용자의 기본 언어 강제 + label_custom_field_select_type: 사용자 정의 필드에 추가할 대상을 선택해주세요. + label_issue_assigned_to_updated: 담당자 업데이트 + label_check_for_updates: 업데이트 확인 + label_latest_compatible_version: 최종 호환 버전 + label_unknown_plugin: 알 수 없는 플러그인 + label_radio_buttons: radio buttons + label_group_anonymous: 익명 사용자 + label_group_non_member: 비회원 사용자 + label_add_projects: 프로젝트 추가 + field_default_status: 초기 상태 + text_subversion_repository_note: '예: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: 사용자 가시성 + label_users_visibility_all: 모든 활성 사용자 + label_users_visibility_members_of_visible_projects: 보이는 프로젝트 회원 + label_edit_attachments: 첨부파일 편집 + setting_link_copied_issue: 복사할 때 일감 연결 + label_link_copied_issue: 복사한 일감 연결 + label_ask: 물어보기 + label_search_attachments_yes: 첨부파일명과 설명만 검색 + label_search_attachments_no: 첨부는 검색하지 않음 + label_search_attachments_only: 첨부만 검색 + label_search_open_issues_only: 열린 일감만 + field_address: 메일 + setting_max_additional_emails: 허용하는 메일주소 개수 + label_email_address_plural: 메일주소 + label_email_address_add: 메일주소 추가 + label_enable_notifications: 알림 켜기 + label_disable_notifications: 알림 끄기 + setting_search_results_per_page: 페이지당 검색 결과 + label_blank_value: blank + permission_copy_issues: 일감 복사 + error_password_expired: 암호가 만료되었거나 관리자가 변경하도록 설정하였습니다. + field_time_entries_visibility: 시간기록 가시성 + setting_password_max_age: 암호 변경 주기 + label_parent_task_attributes: 상위일감 속성 + label_parent_task_attributes_derived: 하위일감으로부터 계산 + label_parent_task_attributes_independent: 하위일감과 별도로 계산 + label_time_entries_visibility_all: 모든 시간기록 + label_time_entries_visibility_own: 이 사용자가 생성한 시간기록 + label_member_management: 회원 관리 + label_member_management_all_roles: 모든 역할 + label_member_management_selected_roles_only: 선택된 역할 만 + label_password_required: 계속하려면 암호를 확인해야 합니다. + label_total_spent_time: 총 소요시간 + notice_import_finished: "총 %{count} 건을 가져왔습니다" + notice_import_finished_with_errors: "총 %{total} 건 중 %{count} 건을 가져오지 못했습니다" + error_invalid_file_encoding: 이 파일은 정상적인 %{encoding} 파일이 아닙니다. + error_invalid_csv_file_or_settings: 이 파일은 CSV 파일이 아니거나 아래 조건에 맞지 않습니다. + error_can_not_read_import_file: 가져오기 파일을 읽을 수 없습니다. + permission_import_issues: 일감 가져오기 + label_import_issues: 일감 가져오기 + label_select_file_to_import: 가져올 파일 선택 + label_fields_separator: 구분자 + label_fields_wrapper: 묶음 기호 + label_encoding: 인코딩 + label_comma_char: 쉼표(,) + label_semi_colon_char: 세미콜론(;) + label_quote_char: 작은따옴표 + label_double_quote_char: 큰따옴표 + label_fields_mapping: 항목 연결 + label_file_content_preview: 내용 미리보기 + label_create_missing_values: 값이 없으면 자동으로 만들기 + button_import: 가져오기 + field_total_estimated_hours: 추정 시간 + label_api: API + label_total_plural: 합계 + label_assigned_issues: 할당된 일감 + label_field_format_enumeration: 키/값 목록 + label_f_hour_short: '%{value} h' + field_default_version: 기본 버전 + error_attachment_extension_not_allowed: 첨부의 확장자 %{extension}은(는) 허용되지 않습니다. + setting_attachment_extensions_allowed: 허용되는 확장자 + setting_attachment_extensions_denied: 허용되지 않는 확장자 + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: 새 사용자 기본값 + error_ldap_bind_credentials: 잘못된 LDAP 계정/암호 + setting_sys_api_key: API 키 + setting_lost_password: 비밀번호 찾기 + mail_subject_security_notification: 보안 알림 + mail_body_security_notification_change: ! '%{field}이(가) 변경되었습니다.' + mail_body_security_notification_change_to: ! '%{field}이(가) %{value}(으)로 변경되었습니다.' + mail_body_security_notification_add: ! '%{field}에 %{value}이(가) 추가되었습니다.' + mail_body_security_notification_remove: ! '%{field}에 %{value}이(가) 삭제되었습니다.' + mail_body_security_notification_notify_enabled: 이제 %{value}(으)로 알람이 발송됩니다. + mail_body_security_notification_notify_disabled: '%{value}(으)로 더 이상 알람이 발송되지 않습니다.' + mail_body_settings_updated: ! '다음의 설정이 변경되었습니다:' + field_remote_ip: IP 주소 + label_wiki_page_new: 새 위키 페이지 + label_relations: 관계 + button_filter: 필터 + mail_body_password_updated: 암호가 변경되었습니다. + label_no_preview: 미리보기 없음 + error_no_tracker_allowed_for_new_issue_in_project: 프로젝트에 사용할 수 있는 일감 유형이 없습니다 + label_tracker_all: 모든 유형 + label_new_project_issue_tab_enabled: '"새 일감" 탭 표시' + setting_new_item_menu_tab: 프로젝트 메뉴의 새로 만들기 탭 + label_new_object_tab_enabled: 메뉴에 "+" 탭 표시 + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/lt.yml b/config/locales/lt.yml new file mode 100644 index 0000000..b4ab1f5 --- /dev/null +++ b/config/locales/lt.yml @@ -0,0 +1,1220 @@ +# Lithuanian translations for Ruby on Rails +# by Laurynas Butkus (laurynas.butkus@gmail.com) +# and Sergej Jegorov sergej.jegorov@gmail.com +# and Gytis Gurklys gytis.gurklys@gmail.com +# and Andrius Kriučkovas andrius.kriuckovas@gmail.com +# and Gediminas Muižis gediminas.muizis@gmail.com +# and Marius Žilėnas m.zilenas@litrail.lt + +lt: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%m/%d/%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [sekmadienis, pirmadienis, antradienis, trečiadienis, ketvirtadienis, penktadienis, šeštadienis] + abbr_day_names: [Sek, Pir, Ant, Tre, Ket, Pen, Šeš] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, sausio, vasario, kovo, balandžio, gegužės, birželio, liepos, rugpjūčio, rugsėjo, spalio, lapkričio, gruodžio] + abbr_month_names: [~, Sau, Vas, Kov, Bal, Geg, Bir, Lie, Rgp, Rgs, Spa, Lap, Grd] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "ryto" + pm: "vakaro" + + datetime: + distance_in_words: + half_a_minute: "pusė minutės" + less_than_x_seconds: + one: "mažiau nei 1 sekundę" + other: "mažiau nei %{count} sekundžių(ės)" + x_seconds: + one: "1 sekundė" + other: "%{count} sekundžių(ės)" + less_than_x_minutes: + one: "mažiau nei minutė" + other: "mažiau nei %{count} minučių(ės)" + x_minutes: + one: "1 minutė" + other: "mažiau nei %{count} minučių(ės)" + about_x_hours: + one: "apie 1 valandą" + other: "apie %{count} valandų(as)" + x_hours: + one: "1 valanda" + other: "%{count} valandų(os)" + x_days: + one: "1 diena" + other: "%{count} dienų(os)" + about_x_months: + one: "apie 1 mėnesį" + other: "apie %{count} mėnesių(ius)" + x_months: + one: "1 mėnuo" + other: "%{count} mėnesių(iai)" + about_x_years: + one: "apie 1 metus" + other: "apie %{count} metų(us)" + over_x_years: + one: "virš 1 metų" + other: "virš %{count} metų" + almost_x_years: + one: "beveik 1 metai" + other: "beveik %{count} metų(ai)" + + number: + format: + separator: "," + delimiter: " " + precision: 3 + + human: + format: + delimiter: " " + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "baitas" + other: "baitų(ai)" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "ir" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "Išsaugant objektą %{model} rasta 1 klaida" + other: "Išsaugant objektą %{model} rastos %{count} klaidų(os)" + messages: + inclusion: "neįtraukta į sąrašą" + exclusion: "užimtas" + invalid: "neteisingas" + confirmation: "neteisingai pakartotas" + accepted: "turi būti patvirtinta(as)" + empty: "negali būti tuščias" + blank: "negali būti tuščias" + too_long: "per ilgas tekstas (daugiausiai %{count} simbolių" + not_a_number: "ne skaičius" + not_a_date: "neteisinga data" + greater_than: "turi būti daugiau už %{count}" + greater_than_or_equal_to: "turi būti daugiau arba lygu %{count}" + equal_to: "turi būti lygus %{count}" + less_than: "turi būti mažiau už %{count}" + less_than_or_equal_to: "turi būti mažiau arba lygu %{count}" + odd: "turi būti nelyginis" + even: "turi būti lyginis" + greater_than_start_date: "turi būti didesnė negu pradžios data" + not_same_project: "nepriklauso tam pačiam projektui" + circular_dependency: "Šis ryšys sukurtų ciklinę priklausomybę" + cant_link_an_issue_with_a_descendant: "Darbas negali būti susietas su viena iš savo darbo dalių" + earlier_than_minimum_start_date: "negali būti anksčiau už %{date} dėl ankstesnių darbų" + not_a_regexp: "neteisingas reguliarusis reiškinys" + open_issue_with_closed_parent: "Atviras darbas negali būti pridėtas prie uždarytos tėvinės užduoties" + + actionview_instancetag_blank_option: Prašom parinkti + + general_text_No: 'Ne' + general_text_Yes: 'Taip' + general_text_no: 'ne' + general_text_yes: 'taip' + general_lang_name: 'Lithuanian (lietuvių)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Paskyra buvo sėkmingai atnaujinta. + notice_account_invalid_credentials: Neteisingas vartotojo vardas ar slaptažodis + notice_account_password_updated: Slaptažodis buvo sėkmingai atnaujintas. + notice_account_wrong_password: Neteisingas slaptažodis + notice_account_register_done: Paskyra buvo sėkmingai sukurta. Norint aktyvinti savo paskyrą, paspauskite nuorodą, kuri jums buvo siųsta į %{email}. + notice_account_unknown_email: Nežinomas vartotojas. + notice_account_not_activated_yet: Dar nesatę aktyvavę savo paskyros. Jei norite gauti naują aktyvavimo laišką, paspauskite šią nuorodą + notice_account_locked: Jūsų paskyra užblokuota. + notice_can_t_change_password: Šis pranešimas naudoja išorinį autentiškumo nustatymo šaltinį. Neįmanoma pakeisti slaptažodžio. + notice_account_lost_email_sent: Į Jūsų paštą išsiųstas laiškas su naujo slaptažodžio pasirinkimo instrukcija. + notice_account_activated: Jūsų paskyra aktyvuota. Galite prisijungti. + notice_successful_create: Sėkmingas sukūrimas. + notice_successful_update: Sėkmingas atnaujinimas. + notice_successful_delete: Sėkmingas panaikinimas. + notice_successful_connection: Sėkmingas susijungimas. + notice_file_not_found: Puslapis, į kurį ketinate įeiti, neegzistuoja arba yra pašalintas. + notice_locking_conflict: Duomenys buvo atnaujinti kito vartotojo. + notice_not_authorized: Jūs neturite teisių gauti prieigą prie šio puslapio. + notice_not_authorized_archived_project: Projektas, kurį bandote atidaryti, buvo suarchyvuotas. + notice_email_sent: "Laiškas išsiųstas į %{value}" + notice_email_error: "Laiško siuntimo metu (%{value}) įvyko klaida" + notice_feeds_access_key_reseted: Jūsų Atom raktas buvo atnaujintas. + notice_api_access_key_reseted: Jūsų API prieigos raktas buvo atnaujintas. + notice_failed_to_save_issues: "Nepavyko išsaugoti %{count} darbo(ų) iš %{total} pasirinktų: %{ids}." + notice_failed_to_save_time_entries: "Nepavyko išsaugoti %{count} laiko įrašo(ų) iš %{total} pasirinktų: %{ids}." + notice_failed_to_save_members: "Nepavyko išsaugoti nario(ių): %{errors}." + notice_no_issue_selected: "Nepasirinktas nei vienas darbas! Prašom pažymėti darbus, kuriuos norite redaguoti" + notice_account_pending: "Jūsų paskyra buvo sukurta ir dabar laukiama administratoriaus patvirtinimo." + notice_default_data_loaded: Numatytoji konfigūracija sėkmingai įkrauta. + notice_unable_delete_version: Neįmanoma ištrinti versijos. + notice_unable_delete_time_entry: Neįmano ištrinti laiko žurnalo įrašo. + notice_issue_done_ratios_updated: Darbo atlikimo progresas atnaujintas. + notice_gantt_chart_truncated: "Grafikas buvo sutrumpintas, kadangi jis viršija maksimalų (%{max}) leistinų atvaizduoti elementų kiekį" + notice_issue_successful_create: "Darbas %{id} sukurtas." + notice_issue_update_conflict: "Darbas buvo atnaujintas kito vartotojo kol jūs jį redagavote." + notice_account_deleted: "Jūsų paskyra panaikinta." + notice_user_successful_create: "Vartotojas %{id} sukurtas." + notice_new_password_must_be_different: Naujas slaptažodis turi skirtis nuo esamo slaptažodžio + notice_import_finished: "%{count} įrašai hbuvo suimportuoti" + notice_import_finished_with_errors: "%{count} iš %{total} įrašų nepavyko suimportuoti" + error_can_t_load_default_data: "Numatytoji konfigūracija negali būti užkrauta: %{value}" + error_scm_not_found: "Saugykloje nebuvo rastas toks įrašas ar revizija" + error_scm_command_failed: "Įvyko klaida jungiantis prie saugyklos: %{value}" + error_scm_annotate: "Įrašas neegzistuoja arba jo negalima atvaizduoti" + error_scm_annotate_big_text_file: "Įrašo negalima atvaizduoti, nes jis viršija maksimalų tekstinio failo dydį." + error_issue_not_found_in_project: 'Darbas nerastas arba nepriklauso šiam projektui' + error_no_tracker_in_project: 'Joks pėdsekys nesusietas su šiuo projektu. Prašom patikrinti Projekto nustatymus.' + error_no_default_issue_status: 'Nenustatyta numatytoji darbo būsena. Prašome patikrinti nustatymus ("Administravimas -> Darbų būsenos").' + error_can_not_delete_custom_field: Negalima ištrinti kliento lauko + error_can_not_delete_tracker: "Šis pėdsekys turi įrašų ir todėl negali būti ištrintas." + error_can_not_remove_role: "Ši rolė yra naudojama ir negali būti ištrinta." + error_can_not_reopen_issue_on_closed_version: 'Uždarytai versijai priskirtas darbas negali būti atnaujintas.' + error_can_not_archive_project: Šio projekto negalima suarchyvuoti + error_issue_done_ratios_not_updated: "Įrašo baigtumo rodikliai nebuvo atnaujinti. " + error_workflow_copy_source: 'Prašome pasirinkti pirminį seklį arba rolę, kurį norite kopijuoti' + error_workflow_copy_target: 'Prašome pasirinkti seklį(-ius) arba rolę(-s) į kuriuos norite kopijuoti' + error_unable_delete_issue_status: 'Negalima ištrinti darbo statuso' + error_unable_to_connect: "Negalima prisijungti (%{value})" + error_attachment_too_big: "Šis failas negali būti įkeltas, nes viršija maksimalų (%{max_size}) leistiną failo dydį" + error_session_expired: "Jūsų sesija pasibaigė. Prašome prisijunti iš naujo." + warning_attachments_not_saved: "%{count} byla(-ų) negali būti išsaugota." + error_password_expired: "Jūsų slaptažodžio galiojimo laikas baigėsi arba administratorius reikalauja jūsų jį pasikeisti" + error_invalid_file_encoding: "Failas nėra tinkamas %{encoding} koduotės failas" + error_invalid_csv_file_or_settings: "Failas nėra CSV failas arba neatitinka žemiau esančių nustatymų" + error_can_not_read_import_file: "Iškilo klaida skaitant importuojamą failą" + error_attachment_extension_not_allowed: "Priedo plėtinys %{extension} negalimas" + error_ldap_bind_credentials: "Netinkamas LDAP Vartotojo vardas/Slaptažodis" + + mail_subject_lost_password: "Jūsų %{value} slaptažodis" + mail_body_lost_password: 'Norėdami pakeisti slaptažodį, spauskite nuorodą:' + mail_subject_register: "Jūsų %{value} paskyros aktyvavimas" + mail_body_register: 'Norėdami aktyvuoti paskyrą, spauskite nuorodą:' + mail_body_account_information_external: "Jūs galite naudoti savo %{value} paskyrą, norėdami prisijungti." + mail_body_account_information: Informacija apie Jūsų paskyrą + mail_subject_account_activation_request: "%{value} paskyros aktyvavimo prašymas" + mail_body_account_activation_request: "Užsiregistravo naujas vartotojas (%{value}). Jo paskyra laukia jūsų patvirtinimo:" + mail_subject_reminder: "%{count} darbų(ai) baigiasi per artimiausias %{days} dienų(as)" + mail_body_reminder: "%{count} darbas(ai), kurie yra jums priskirti, baigiasi per artimiausias %{days} dienų(as):" + mail_subject_wiki_content_added: "Wiki puslapis '%{id}' pridėtas" + mail_body_wiki_content_added: "Wiki puslapis '%{id}' buvo pridėtas %{author}." + mail_subject_wiki_content_updated: "Wiki puslapis '%{id}' buvo atnaujintas" + mail_body_wiki_content_updated: "'%{id}' wiki puslapį atnaujino %{author}." + mail_subject_security_notification: "Saugumo pranešimas" + mail_body_security_notification_change: "%{field} buvo pakeista(as)." + mail_body_security_notification_change_to: "%{field} buvo pakeista(as) į %{value}." + mail_body_security_notification_add: "Prie %{field} pridėta %{value}." + mail_body_security_notification_remove: "Iš %{field} pašalinta vertė %{value}." + mail_body_security_notification_notify_enabled: "Elektroninis paštas %{value} dabar gauna pranešimus." + mail_body_security_notification_notify_disabled: "Elektroninis paštas %{value} nebegauna pranešimų." + mail_body_settings_updated: "Tokie nustatymai buvo pakeisti:" + + field_name: Pavadinimas + field_description: Aprašas + field_summary: Santrauka + field_is_required: Reikalaujama + field_firstname: Vardas + field_lastname: Pavardė + field_mail: El. paštas + field_address: El. paštas + field_filename: Failas + field_filesize: Dydis + field_downloads: Atsiuntimai + field_author: Autorius + field_created_on: Sukurta + field_updated_on: Atnaujintas(a) + field_closed_on: Uždarytas + field_field_format: Formatas + field_is_for_all: Visiems projektams + field_possible_values: Galimos reikšmės + field_regexp: Pastovi išraiška + field_min_length: Minimalus ilgis + field_max_length: Maksimalus ilgis + field_value: Vertė + field_category: Kategorija + field_title: Pavadinimas + field_project: Projektas + field_issue: Darbas + field_status: Būsena + field_notes: Pastabos + field_is_closed: Darbas uždarytas + field_is_default: Numatytoji vertė + field_tracker: Pėdsekys + field_subject: Tema + field_due_date: Užbaigimo data + field_assigned_to: Paskirtas + field_priority: Prioritetas + field_fixed_version: Tikslinė versija + field_user: Vartotojas + field_principal: Vardas + field_role: Vaidmuo + field_homepage: Pagrindinis puslapis + field_is_public: Viešas + field_parent: Priklauso projektui + field_is_in_roadmap: Darbai rodomi veiklos grafike + field_login: Registracijos vardas + field_mail_notification: Elektroninio pašto pranešimai + field_admin: Administratorius + field_last_login_on: Paskutinis prisijungimas + field_language: Kalba + field_effective_date: Data + field_password: Slaptažodis + field_new_password: Naujas slaptažodis + field_password_confirmation: Patvirtinimas + field_version: Versija + field_type: Tipas + field_host: Pagrindinis kompiuteris + field_port: Prievadas + field_account: Paskyra + field_base_dn: Bazinis skiriamasis vardas (base DN) + field_attr_login: Registracijos vardo požymis (login) + field_attr_firstname: Vardo požymis + field_attr_lastname: Pavardės požymis + field_attr_mail: Elektroninio pašto požymis + field_onthefly: Automatinis vartotojų registravimas + field_start_date: Pradėti + field_done_ratio: "% atlikta" + field_auth_source: Autentiškumo nustatymo būdas + field_hide_mail: Slėpti mano elektroninio pašto adresą + field_comments: Komentaras + field_url: URL + field_start_page: Pradžios puslapis + field_subproject: Sub-projektas + field_hours: Valandos + field_activity: Veikla + field_spent_on: Data + field_identifier: Identifikatorius + field_is_filter: Naudojamas kaip filtras + field_issue_to: Susijęs darbas + field_delay: Užlaikymas + field_assignable: Darbai gali būti paskirti šiam vaidmeniui + field_redirect_existing_links: Peradresuokite egzistuojančias sąsajas + field_estimated_hours: Numatyta trukmė + field_column_names: Stulpeliai + field_time_entries: Praleistas laikas + field_time_zone: Laiko juosta + field_searchable: Randamas + field_default_value: Numatytoji vertė + field_comments_sorting: Rodyti komentarus + field_parent_title: Pagrindinis puslapis + field_editable: Redaguojamas + field_watcher: Stebėtojas + field_identity_url: OpenID URL + field_content: Turinys + field_group_by: Sugrupuoti pagal + field_sharing: Dalijimasis + field_parent_issue: Pagrindinė užduotis + field_member_of_group: "Priskirtojo grupė" + field_assigned_to_role: "Priskirtojo rolė" + field_text: Teksto laukas + field_visible: Matomas + field_warn_on_leaving_unsaved: "Įspėti mane, kai paliekamas puslapis su neišsaugotu tekstu" + field_issues_visibility: Darbų matomumas + field_is_private: Privatus + field_commit_logs_encoding: Commit žinučių koduotė + field_scm_path_encoding: SCM kelio koduotė + field_path_to_repository: Saugyklos kelias + field_root_directory: Šakninis katalogas + field_cvsroot: CVSROOT + field_cvs_module: Modulis + field_repository_is_default: Pagrindinė saugykla + field_multiple: Keletas reikšmių + field_auth_source_ldap_filter: LDAP filtras + field_core_fields: Standartiniai laukai + field_timeout: "Timeout (po sek.)" + field_board_parent: Pagrindinis forumas + field_private_notes: Privačios žinutės + field_inherit_members: Paveldėti narius + field_generate_password: Sugeneruoti slaptažodį + field_must_change_passwd: Privalo pakeisti slaptažodį kito prisijungimo metu + field_default_status: Numatytoji būsena + field_users_visibility: Vartotojų matomumas + field_time_entries_visibility: Laiko įrašų matomumas + field_total_estimated_hours: Visas įsivertinas laikas + field_default_version: Numatytoji versija + field_remote_ip: IP adresas + + setting_app_title: Programos pavadinimas + setting_app_subtitle: Programos paantraštė + setting_welcome_text: Pasveikinimas + setting_default_language: Numatytoji kalba + setting_login_required: Reikalingas autentiškumo nustatymas + setting_self_registration: Savi-registracija + setting_attachment_max_size: Priedo maksimalus dydis + setting_issues_export_limit: Darbų eksportavimo riba + setting_mail_from: Išleidimo elektroninio pašto adresas + setting_bcc_recipients: Nematomos kopijos (bcc) gavėjai + setting_plain_text_mail: Tik tekstas laiške (be HTML) + setting_host_name: Pagrindinio kompiuterio pavadinimas ir kelias + setting_text_formatting: Teksto formatavimas + setting_wiki_compression: Wiki istorijos suspaudimas + setting_feeds_limit: Maksimalus objektų kiekis Atom sklaidos kanale + setting_default_projects_public: Nauji projektai yra vieši pagal nutylėjimą + setting_autofetch_changesets: Automatinis pakeitimų atnaujinimas + setting_sys_api_enabled: Įgalinti WS saugyklos valdymui + setting_commit_ref_keywords: Nuoroda į reikšminius žodžius + setting_commit_fix_keywords: Reikšminių žodžių fiksavimas + setting_autologin: Automatinis prisijungimas + setting_date_format: Datos formatas + setting_time_format: Laiko formatas + setting_cross_project_issue_relations: Leisti tarp-projektinius darbų ryšius + setting_cross_project_subtasks: Leisti susieti skirtingų projektų užduočių dalis + setting_issue_list_default_columns: Numatytieji stulpeliai darbų sąraše + setting_repositories_encodings: Pridėtų failų ir saugyklų šifravimas + setting_emails_header: Laiško antraštė + setting_emails_footer: Laiško paraštė + setting_protocol: Protokolas + setting_per_page_options: Įrašų puslapyje nustatymas + setting_user_format: Vartotojo atvaizdavimo formatas + setting_activity_days_default: Atvaizduojamos dienos projekto veikloje + setting_display_subprojects_issues: Pagal nutylėjimą, rodyti sub-projektų darbus pagrindiniame projekte + setting_enabled_scm: Įgalinti SCM + setting_mail_handler_body_delimiters: "Trumpinti laiškus po vienos iš šių eilučių" + setting_mail_handler_api_enabled: Įgalinti WS įeinantiems laiškams + setting_mail_handler_api_key: Įeinančių laiškų WS API raktas + setting_sys_api_key: Repository management WS API key + setting_sequential_project_identifiers: Generuoti nuoseklius projekto identifikatorius + setting_gravatar_enabled: Naudoti Gravatar vartotojo paveiksliukus + setting_gravatar_default: Gravatar paveiksliukas pagal nutylėjimą + setting_diff_max_lines_displayed: Maksimalus rodomas pakeitimų eilučių skaičius + setting_file_max_size_displayed: Maksimalus tekstinių failų dydis rodomas vienoje eilutėje + setting_repository_log_display_limit: Maksimalus revizijų skaičius rodomas failo žurnale + setting_openid: Leisti OpenID prisijungimą ir registraciją + setting_password_max_age: Reikalauti slaptažodžio pakeitimo po + setting_password_min_length: Minimalus slaptažodžio ilgis + setting_lost_password: Leisti slaptažodžio atstatymą elektroninu laišku + setting_new_project_user_role_id: Vaidmuo suteiktas vartotojui, kuris nėra administratorius ir kuris sukuria projektą + setting_default_projects_modules: Pagal nutylėjimą naujame projekte įjungti moduliai + setting_issue_done_ratio: Darbo įvykdymo progresą skaičiuoti pagal + setting_issue_done_ratio_issue_field: Naudoti darbo lauką + setting_issue_done_ratio_issue_status: Naudoti darbo statusą + setting_start_of_week: Savaitės pradžios diena + setting_rest_api_enabled: Įjungti REST tinklo servisą (WS) + setting_cache_formatted_text: Laikyti atmintyje formatuotą tekstą + setting_default_notification_option: Numatytosios pranešimų nuostatos + setting_commit_logtime_enabled: Įjungti laiko registravimą + setting_commit_logtime_activity_id: Laiko įrašų veikla + setting_gantt_items_limit: Maksimalus rodmenų skaičius rodomas Gantt'o grafike + setting_issue_group_assignment: Leisti darbo priskirimą grupėms + setting_default_issue_start_date_to_creation_date: Naudoti dabartinę datą kaip naujų darbų pradžios datą + setting_commit_cross_project_ref: Leisti kurti nuorodą darbams iš visų kitų projektų + setting_unsubscribe: Leisti vartotojams panaikinti savo paskyrą + setting_session_lifetime: Sesijos maksimalus galiojimas + setting_session_timeout: Sesijos neveiklumo laiko tarpas + setting_thumbnails_enabled: Rodyti sumažintus priedų atvaizdus + setting_thumbnails_size: Sumažinto atvaizdo dydis (pikseliais) + setting_non_working_week_days: Nedarbo dienos + setting_jsonp_enabled: Įgalinti JSONP palaikymą + setting_default_projects_tracker_ids: Numatytieji pėdsekiai naujiems projektams + setting_mail_handler_excluded_filenames: Neįtraukti priedų su pavadinimu + setting_force_default_language_for_anonymous: Priverstinai nustatyti numatytąją kalbą anoniminiams vartotojams + setting_force_default_language_for_loggedin: Priverstinai nustatyti numatytąją kalbą prisijungusiems vartotojams + setting_link_copied_issue: Susieti darbus kopijavimo metu + setting_max_additional_emails: Maksimalus skaičius papildomų elektronikių laiškų adresų + setting_search_results_per_page: Paieškos rezultatai puslapyje + setting_attachment_extensions_allowed: Leistini plėtiniai + setting_attachment_extensions_denied: Neleistini plėtiniai + + permission_add_project: Sukurti projektą + permission_add_subprojects: Kurti sub-projektus + permission_edit_project: Redaguoti projektą + permission_close_project: Uždaryti / atkurti projektą + permission_select_project_modules: Parinkti projekto modulius + permission_manage_members: Valdyti narius + permission_manage_project_activities: Valdyti projekto veiklas + permission_manage_versions: Valdyti versijas + permission_manage_categories: Valdyti darbų kategorijas + permission_view_issues: Peržiūrėti Darbus + permission_add_issues: Sukurti darbus + permission_edit_issues: Redaguoti darbus + permission_copy_issues: Kopijuoti darbus + permission_manage_issue_relations: Valdyti darbų ryšius + permission_set_issues_private: Nustatyti darbą viešu ar privačiu + permission_set_own_issues_private: Nustatyti savo darbus viešais ar privačiais + permission_add_issue_notes: Rašyti pastabas + permission_edit_issue_notes: Redaguoti pastabas + permission_edit_own_issue_notes: Redaguoti savo pastabas + permission_view_private_notes: Matyti privačias pastabas + permission_set_notes_private: Nustatyti pastabas privačiomis + permission_move_issues: Perkelti darbus + permission_delete_issues: Pašalinti darbus + permission_manage_public_queries: Valdyti viešas užklausas + permission_save_queries: Išsaugoti užklausas + permission_view_gantt: Matyti Gantt grafiką + permission_view_calendar: Matyti kalendorių + permission_view_issue_watchers: Matyti stebėtojų sąrašą + permission_add_issue_watchers: Pridėti stebėtojus + permission_delete_issue_watchers: Pašalinti stebėtojus + permission_log_time: Regsitruoti dirbtą laiką + permission_view_time_entries: Matyti dirbtą laiką + permission_edit_time_entries: Redaguoti laiko įrašus + permission_edit_own_time_entries: Redaguoti savo laiko įrašus + permission_manage_news: Valdyti naujienas + permission_comment_news: Komentuoti naujienas + permission_view_documents: Matyti dokumentus + permission_add_documents: Pridėti dokumentus + permission_edit_documents: Redaguoti dokumentus + permission_delete_documents: Trinti dokumentus + permission_manage_files: Valdyti failus + permission_view_files: Matyti failus + permission_manage_wiki: Valdyti wiki + permission_rename_wiki_pages: Pervadinti wiki puslapius + permission_delete_wiki_pages: Pašalinti wiki puslapius + permission_view_wiki_pages: Matyti wiki + permission_view_wiki_edits: Matyti wiki istoriją + permission_edit_wiki_pages: Redaguoti wiki puslapius + permission_delete_wiki_pages_attachments: Pašalinti priedus + permission_protect_wiki_pages: Apsaugoti wiki puslapius + permission_manage_repository: Valdyti saugyklą + permission_browse_repository: Peržiūrėti saugyklą + permission_view_changesets: Matyti pakeitimus + permission_commit_access: Prieiga prie pakeitimų + permission_manage_boards: Valdyti forumus + permission_view_messages: Matyti pranešimus + permission_add_messages: Skelbti pranešimus + permission_edit_messages: Redaguoti pranešimus + permission_edit_own_messages: Redaguoti savo pranešimus + permission_delete_messages: Pašalinti pranešimus + permission_delete_own_messages: Pašalinti savo pranešimus + permission_export_wiki_pages: Eksportuoti wiki puslapius + permission_manage_subtasks: Valdyti darbo dalis + permission_manage_related_issues: Tvarkyti susietus darbus + permission_import_issues: Importuoti darbus + + project_module_issue_tracking: Darbų pėdsekys + project_module_time_tracking: Laiko pėdsekys + project_module_news: Naujienos + project_module_documents: Dokumentai + project_module_files: Failai + project_module_wiki: Wiki + project_module_repository: Saugykla + project_module_boards: Forumai + project_module_calendar: Kalendorius + project_module_gantt: Gantt + + label_user: Vartotojas + label_user_plural: Vartotojai + label_user_new: Naujas vartotojas + label_user_anonymous: Anonimas + label_project: Projektas + label_project_new: Naujas projektas + label_project_plural: Projektai + label_x_projects: + zero: nėra projektų + one: 1 projektas + other: "%{count} projektų(ai)" + label_project_all: Visi Projektai + label_project_latest: Naujausi projektai + label_issue: Darbas + label_issue_new: Naujas darbas + label_issue_plural: Darbai + label_issue_view_all: Peržiūrėti visus darbus + label_issues_by: "Darbai pagal %{value}" + label_issue_added: Darbas pridėtas + label_issue_updated: Darbas atnaujintas + label_issue_note_added: Pastaba pridėta + label_issue_status_updated: Statusas atnaujintas + label_issue_assigned_to_updated: Paskirtasis atnaujintas + label_issue_priority_updated: Prioritetas atnaujintas + label_document: Dokumentas + label_document_new: Naujas dokumentas + label_document_plural: Dokumentai + label_document_added: Dokumentas pridėtas + label_role: Vaidmuo + label_role_plural: Vaidmenys + label_role_new: Naujas vaidmuo + label_role_and_permissions: Vaidmenys ir leidimai + label_role_anonymous: Anonimas + label_role_non_member: Nėra narys + label_member: Narys + label_member_new: Naujas narys + label_member_plural: Nariai + label_tracker: Pėdsekys + label_tracker_plural: Pėdsekiai + label_tracker_new: Naujas pėdsekys + label_workflow: Darbų eiga + label_issue_status: Darbo būsena + label_issue_status_plural: Darbų būsenos + label_issue_status_new: Nauja būsena + label_issue_category: Darbo kategorija + label_issue_category_plural: Darbo kategorijos + label_issue_category_new: Nauja kategorija + label_custom_field: Kliento laukas + label_custom_field_plural: Kliento laukai + label_custom_field_new: Naujas kliento laukas + label_enumerations: Išvardinimai + label_enumeration_new: Nauja vertė + label_information: Informacija + label_information_plural: Informacija + label_please_login: Prašom prisijungti + label_register: Užsiregistruoti + label_login_with_open_id_option: arba prisijunkite su OpenID + label_password_lost: Prarastas slaptažodis + label_password_required: Norėdami tęsti, patvirtinkite savo slaptažodį + label_home: Pagrindinis + label_my_page: Mano puslapis + label_my_account: Mano paskyra + label_my_projects: Mano projektai + label_administration: Administravimas + label_login: Prisijungti + label_logout: Atsijungti + label_help: Pagalba + label_reported_issues: Pranešti darbai + label_assigned_issues: Priskirti darbai + label_assigned_to_me_issues: Darbai, priskirti man + label_last_login: Paskutinis prisijungimas + label_registered_on: Užregistruota + label_activity: Veikla + label_overall_activity: Visa veikla + label_user_activity: "%{value} veikla" + label_new: Naujas + label_logged_as: Prisijungęs kaip + label_environment: Aplinka + label_authentication: Autentiškumo nustatymas + label_auth_source: Autentiškumo nustatymo būdas + label_auth_source_new: Naujas autentiškumo nustatymo būdas + label_auth_source_plural: Autentiškumo nustatymo būdai + label_subproject_plural: Sub-projektai + label_subproject_new: Naujas sub-projektas + label_and_its_subprojects: "%{value} projektas ir jo sub-projektai" + label_min_max_length: Min - Maks ilgis + label_list: Sąrašas + label_date: Data + label_integer: Sveikasis skaičius + label_float: Slankiojo kablelio skaičius + label_boolean: BLoginis + label_string: Tekstas + label_text: Ilgas tekstas + label_attribute: Požymis + label_attribute_plural: Požymiai + label_no_data: Nėra ką atvaizduoti + label_change_status: Pakeitimo būsena + label_history: Istorija + label_attachment: Failas + label_attachment_new: Naujas failas + label_attachment_delete: Pašalinkite failą + label_attachment_plural: Failai + label_file_added: Failas pridėtas + label_report: Ataskaita + label_report_plural: Ataskaitos + label_news: Naujiena + label_news_new: Pridėti naujienas + label_news_plural: Naujienos + label_news_latest: Paskutinės naujienos + label_news_view_all: Peržiūrėti visas naujienas + label_news_added: Naujiena pridėta + label_news_comment_added: Prie naujienos pridėtas komentaras + label_settings: Nustatymai + label_overview: Apžvalga + label_version: Versija + label_version_new: Nauja versija + label_version_plural: Versijos + label_close_versions: Uždaryti užbaigtas versijas + label_confirmation: Patvirtinimas + label_export_to: 'Eksportuoti į:' + label_read: Skaitykite... + label_public_projects: Vieši projektai + label_open_issues: atidaryta + label_open_issues_plural: atidaryti + label_closed_issues: uždaryta + label_closed_issues_plural: uždaryti + label_x_open_issues_abbr: + zero: 0 atidarytų + one: 1 atidarytas + other: "%{count} atidarytų(i)" + label_x_closed_issues_abbr: + zero: 0 uždarytų + one: 1 uždarytas + other: "%{count} uždarytų(i)" + label_x_issues: + zero: 0 darbų + one: 1 darbas + other: "%{count} darbų(ai)" + label_total: Iš viso + label_total_plural: Iš viso + label_total_time: Visas laikas + label_permissions: Leidimai + label_current_status: Dabartinė būsena + label_new_statuses_allowed: Naujos būsenos galimos + label_all: visi + label_any: bet kuris + label_none: joks + label_nobody: niekas + label_next: Kitas + label_previous: Ankstesnis + label_used_by: Naudotas + label_details: Detalės + label_add_note: Pridėkite pastabą + label_calendar: Kalendorius + label_months_from: mėnesiai nuo + label_gantt: Gantt + label_internal: Vidinis + label_last_changes: "paskutiniai %{count} pokyčiai(-ių)" + label_change_view_all: Peržiūrėti visus pakeitimus + label_comment: Komentaras + label_comment_plural: Komentarai + label_x_comments: + zero: 0 komentarų + one: 1 komentaras + other: "%{count} komentarų(-ai)" + label_comment_add: Pridėkite komentarą + label_comment_added: Komentaras pridėtas + label_comment_delete: Pašalinti komentarus + label_query: Išsaugota užklausa + label_query_plural: Išsaugotos užklausos + label_query_new: Nauja užklausa + label_my_queries: Mano sukurtos užklausos + label_filter_add: Pridėti filtrą + label_filter_plural: Filtrai + label_equals: yra + label_not_equals: nėra + label_in_less_than: mažiau nei + label_in_more_than: daugiau nei + label_in_the_next_days: per ateinančias + label_in_the_past_days: per paskutines + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_between: tarp + label_in: per + label_today: šiandien + label_all_time: visas laikas + label_yesterday: vakar + label_this_week: šią savaitę + label_last_week: praeita savaitė + label_last_n_weeks: "paskutinės %{count} sav." + label_last_n_days: "paskutinės %{count} dienų" + label_this_month: šis mėnuo + label_last_month: praeitas mėnuo + label_this_year: šiemet + label_date_range: Dienų diapazonas + label_less_than_ago: vėliau nei prieš dienų + label_more_than_ago: anksčiau nei prieš dienų + label_ago: dienų prieš + label_contains: turi + label_not_contains: neturi + label_any_issues_in_project: bet kurie darbai projekte + label_any_issues_not_in_project: bet kurie ne projekto darbai + label_no_issues_in_project: projekte nėra darbų + label_any_open_issues: bet kurie atviri darbai + label_no_open_issues: nėra atvirų darbų + label_day_plural: dienų(-os) + label_repository: Saugykla + label_repository_new: Nauja saugykla + label_repository_plural: Saugyklos + label_browse: Naršyti + label_branch: Šaka + label_tag: Tag'as + label_revision: Revizija + label_revision_plural: Revizijos + label_revision_id: "Revizija %{value}" + label_associated_revisions: Susijusios revizijos + label_added: pridėtas + label_modified: pakeistas + label_copied: nukopijuotas + label_renamed: pervardintas + label_deleted: pašalintas + label_latest_revision: Paskutinė revizija + label_latest_revision_plural: Paskutinės revizijos + label_view_revisions: Peržiūrėti revizijas + label_view_all_revisions: Peržiūrėti visas revizijas + label_max_size: Maksimalus dydis + label_sort_highest: Perkelti į viršūnę + label_sort_higher: Perkelti į viršų + label_sort_lower: Perkelti žemyn + label_sort_lowest: Perkelti į apačią + label_roadmap: Veiklos grafikas + label_roadmap_due_in: "Baigiasi po %{value}" + label_roadmap_overdue: "%{value} vėluojama" + label_roadmap_no_issues: Šiai versijai nepriskirtas joks darbas + label_search: Ieškoti + label_result_plural: Rezultatai + label_all_words: Visi žodžiai + label_wiki: Wiki + label_wiki_edit: Wiki redakcija + label_wiki_edit_plural: Wiki redakcijos + label_wiki_page: Wiki puslapis + label_wiki_page_plural: Wiki puslapiai + label_index_by_title: Rūšiuoti pagal pavadinimą + label_index_by_date: Rūšiuoti pagal datą + label_current_version: Einamoji versija + label_preview: Peržiūra + label_feed_plural: Kanalai + label_changes_details: Visų pakeitimų detalės + label_issue_tracking: Darbų sekimas + label_spent_time: Dirbtas laikas + label_total_spent_time: Visas dirbtas laikas + label_overall_spent_time: Visas dirbtas laikas + label_f_hour: "%{value} valanda" + label_f_hour_plural: "%{value} valandų(-os)" + label_f_hour_short: "%{value} h" + label_time_tracking: Laiko apskaita + label_change_plural: Pakeitimai + label_statistics: Statistika + label_commits_per_month: Įkėlimai per mėnesį + label_commits_per_author: Įkėlimai pagal autorių + label_diff: skirt. + label_view_diff: Skirtumų peržiūra + label_diff_inline: įterptas + label_diff_side_by_side: šalia + label_options: Pasirinkimai + label_copy_workflow_from: Kopijuoti darbų eiga iš + label_permissions_report: Leidimų apžvalga + label_watched_issues: Stebimi darbai + label_related_issues: Susiję darbai + label_applied_status: Taikomoji būsena + label_loading: Kraunama... + label_relation_new: Naujas ryšys + label_relation_delete: Pašalinti ryšį + label_relates_to: Susietas su + label_duplicates: Dubliuoja + label_duplicated_by: Dubliuojasi su + label_blocks: Blokuoja + label_blocked_by: Blokuojamas + label_precedes: Pradedamas vėliau + label_follows: Užbaigiamas anksčiau + label_copied_to: Nukopijuota į + label_copied_from: Nukopijuota iš + label_stay_logged_in: Likti prisijungus + label_disabled: išjungta(-as) + label_show_completed_versions: Rodyti užbaigtas versijas + label_me: aš + label_board: Forumas + label_board_new: Naujas forumas + label_board_plural: Forumai + label_board_locked: Užrakinta + label_board_sticky: Lipnus + label_topic_plural: Temos + label_message_plural: Pranešimai + label_message_last: Paskutinis pranešimas + label_message_new: Naujas pranešimas + label_message_posted: Pranešimas pridėtas + label_reply_plural: Atsakymai + label_send_information: Nusiųsti vartotojui paskyros informaciją + label_year: Metai + label_month: Mėnuo + label_week: Savaitė + label_date_from: Nuo + label_date_to: Iki + label_language_based: Pagrįsta vartotojo kalba + label_sort_by: "Rūšiuoti pagal %{value}" + label_send_test_email: Nusiųsti bandomąjį laišką + label_feeds_access_key: Atom prieigos raktas + label_missing_feeds_access_key: Trūksta Atom prieigos rakto + label_feeds_access_key_created_on: "Atom prieigos raktas sukurtas prieš %{value}" + label_module_plural: Moduliai + label_added_time_by: "%{author} pridėjo prieš %{age}" + label_updated_time_by: "%{author} atnaujino prieš %{age}" + label_updated_time: "Atnaujinta prieš %{value}" + label_jump_to_a_project: Šuolis į projektą... + label_file_plural: Failai + label_changeset_plural: Pakeitimų rinkiniai + label_default_columns: Numatytieji stulpeliai + label_no_change_option: (Jokio pakeitimo) + label_bulk_edit_selected_issues: Masiškai redaguoti pasirinktus darbus + label_bulk_edit_selected_time_entries: Masiškai redaguotumėte pasirinktus laiko įrašus + label_theme: Tema + label_default: Numatyta(-as) + label_search_titles_only: Ieškoti tiktai pavadinimuose + label_user_mail_option_all: "Bet kokiam įvykiui visuose mano projektuose" + label_user_mail_option_selected: "Bet kokiam įvykiui tiktai pasirinktuose projektuose ..." + label_user_mail_option_none: "Jokių įvykių" + label_user_mail_option_only_my_events: "Tiktai dalykai, kuriuos stebiu arba esu įtrauktas" + label_user_mail_no_self_notified: "Nenoriu būti informuotas apie pakeitimus, kuriuos pats atlieku" + label_registration_activation_by_email: paskyros aktyvacija per e-paštą + label_registration_manual_activation: rankinė paskyros aktyvacija + label_registration_automatic_activation: automatinė paskyros aktyvacija + label_display_per_page: "%{value} įrašų puslapyje" + label_age: Amžius + label_change_properties: Pakeisti nustatymus + label_general: Bendri(-as) + label_scm: SCM + label_plugins: Įskiepiai + label_ldap_authentication: LDAP autentifikacija + label_downloads_abbr: Siunt. + label_optional_description: Laisvai pasirenkamas apibūdinimas + label_add_another_file: Pridėti kitą failą + label_preferences: Savybės + label_chronological_order: Chronologine tvarka + label_reverse_chronological_order: Atbuline chronologine tvarka + label_incoming_emails: Įeinantys laiškai + label_generate_key: Generuoti raktą + label_issue_watchers: Stebėtojai + label_example: Pavyzdys + label_display: Demonstruoti + label_sort: Rūšiuoti + label_ascending: Didėjantis + label_descending: Mažėjantis + label_date_from_to: Nuo %{start} iki %{end} + label_wiki_content_added: Wiki puslapis pridėtas + label_wiki_content_updated: Wiki puslapis atnaujintas + label_group: Grupė + label_group_plural: Grupės + label_group_new: Nauja grupė + label_group_anonymous: Anoniminiai vartotojai + label_group_non_member: Nepriklausantys projektui vartotojai + label_time_entry_plural: Sprendimo laikas + label_version_sharing_none: Nesidalinama + label_version_sharing_descendants: Su sub-projektais + label_version_sharing_hierarchy: Su projekto hierarchija + label_version_sharing_tree: Su projekto medžiu + label_version_sharing_system: Su visais projektais + label_update_issue_done_ratios: Atnaujinti darbo atlikimo progresą + label_copy_source: Šaltinis + label_copy_target: Tikslas + label_copy_same_as_target: Toks pat kaip tikslas + label_display_used_statuses_only: Rodyti tik tuos statusus, kurie naudojami šio pėdsekio + label_api_access_key: API prieigos raktas + label_missing_api_access_key: Trūksta API prieigos rakto + label_api_access_key_created_on: "API prieigos raktas sukurtas prieš %{value}" + label_profile: Profilis + label_subtask_plural: Darbo dalys + label_project_copy_notifications: Siųsti pranešimus į e-paštą kopijuojant projektą + label_principal_search: "Ieškoti vartotojo arba grupės:" + label_user_search: "Ieškoti vartotojo:" + label_additional_workflow_transitions_for_author: Papildomi darbų eigos variantai leistini, kai vartotojas yra darbo autorius + label_additional_workflow_transitions_for_assignee: Papildomi darbų eigos variantai leistini, kai darbas paskirtas vartotojui + label_issues_visibility_all: Visi darbai + label_issues_visibility_public: Visi vieši darbai + label_issues_visibility_own: Darbai, sukurti vartotojo arba jam priskirti + label_git_report_last_commit: Nurodyti paskutinį failų ir katalogų pakeitimą + label_parent_revision: Pirminė revizija + label_child_revision: Sekanti revizija + label_export_options: "%{export_format} eksportavimo nustatymai" + label_copy_attachments: Kopijuoti priedus + label_copy_subtasks: Kopijuoti darbo dalis + label_item_position: "%{position}/%{count}" + label_completed_versions: Užbaigtos versijos + label_search_for_watchers: Ieškoti vartotojų kuriuos įtraukti kaip stebėtojus + label_session_expiration: Baigėsi sujungimo sesija + label_show_closed_projects: Matyti uždarytus projektus + label_status_transitions: Darbų eiga + label_fields_permissions: Leidimai + label_readonly: Tik peržiūra + label_required: Privaloma(s) + label_hidden: Paslėptas + label_attribute_of_project: "Projekto %{name}" + label_attribute_of_issue: "Darbo %{name}" + label_attribute_of_author: "Autoriaus %{name}" + label_attribute_of_assigned_to: "Paskirto %{name}" + label_attribute_of_user: "Vartotojo %{name}" + label_attribute_of_fixed_version: "Versijos %{name}" + label_cross_project_descendants: Su sub-projektais + label_cross_project_tree: Su projekto medžiu + label_cross_project_hierarchy: Su projekto hierarchija + label_cross_project_system: Su visais projektais + label_gantt_progress_line: Progreso linija + label_visibility_private: tik man + label_visibility_roles: tik šioms rolėms + label_visibility_public: bet kuriam vartotojui + label_link: Nuoroda + label_only: tik + label_drop_down_list: pasirinkimų sąrašas + label_checkboxes: žymimieji langeliai + label_radio_buttons: akutės + label_link_values_to: Nuorodos vertės į URL + label_custom_field_select_type: Pasirinkite objektą, su kuriuo kliento laukas bus susietas + label_check_for_updates: Tikrinti, ar yra atnaujinimų + label_latest_compatible_version: Naujausia suderinama versija + label_unknown_plugin: Nežinomas įskiepis + label_add_projects: Pridėti projektus + label_users_visibility_all: Visi aktyvūs vartotojai + label_users_visibility_members_of_visible_projects: Visų prieinamų projektų vartotojai + label_edit_attachments: Redaguoti prisegtus failus + label_link_copied_issue: Susieti nukopijuotą darbą + label_ask: Klausti + label_search_attachments_yes: Ieškoti priedų pavadinimuose ir jų aprašymuose + label_search_attachments_no: Neieškoti prieduose + label_search_attachments_only: Ieškoti tik prieduose + label_search_open_issues_only: Tik atidaryti darbai + label_email_address_plural: E-paštai + label_email_address_add: E-pašto adresas + label_enable_notifications: Įjungti pranešimus + label_disable_notifications: Išjungti pranešimus + label_blank_value: tuščias(ia) + label_parent_task_attributes: Pagrindinės užduoties požymiai + label_parent_task_attributes_derived: Apskaičiuota iš darbo dalių + label_parent_task_attributes_independent: Nepriklauso nuo darbo dalių + label_time_entries_visibility_all: Visi laiko įrašai + label_time_entries_visibility_own: Laiko įrašai įrašyti vartotojo + label_member_management: Vartotojų valdymas + label_member_management_all_roles: Visos rolės + label_member_management_selected_roles_only: Tik šios rolės + label_import_issues: Importuoti darbus + label_select_file_to_import: Pasirinkite failą importavimui + label_fields_separator: Lauko skirtukas + label_fields_wrapper: Lauko aplankas + label_encoding: Kodavimas + label_comma_char: Kablelis + label_semi_colon_char: Kabliataškis + label_quote_char: Kabutės + label_double_quote_char: Apostrofas + label_fields_mapping: Laukų sujungimas + label_file_content_preview: Failo turinio peržiūra + label_create_missing_values: Sukurti trūkstamas reikšmes + label_api: API + label_field_format_enumeration: Raktas/reikšmė sąrašas + label_default_values_for_new_users: Numatytosios reikšmės naujiems vartotojams + + button_login: Prisijungti + button_submit: Pateikti + button_save: Išsaugoti + button_check_all: Žymėti visus + button_uncheck_all: Atžymėti visus + button_collapse_all: Sutraukti visus + button_expand_all: Išskleisti visus + button_delete: Pašalinti + button_create: Sukurti + button_create_and_continue: Sukurti ir tęsti + button_test: Testas + button_edit: Redaguoti + button_edit_associated_wikipage: "Redaguoti susijusį Wiki puslapį: %{page_title}" + button_add: Pridėti + button_change: Keisti + button_apply: Pritaikyti + button_clear: Išvalyti + button_lock: Rakinti + button_unlock: Atrakinti + button_download: Atsisiųsti + button_list: Sąrašas + button_view: Žiūrėti + button_move: Perkelti + button_move_and_follow: Perkelti ir sekti + button_back: Atgal + button_cancel: Atšaukti + button_activate: Aktyvinti + button_sort: Rūšiuoti + button_log_time: Registruoti laiką + button_rollback: Grąžinti į šią versiją + button_watch: Stebėti + button_unwatch: Nestebėti + button_reply: Atsakyti + button_archive: Archyvuoti + button_unarchive: Išpakuoti + button_reset: Atstatyti + button_rename: RPervadinti + button_change_password: Pakeisti slaptažodį + button_copy: Kopijuoti + button_copy_and_follow: Kopijuoti ir sekti + button_annotate: Rašyti pastabą + button_update: Atnaujinti + button_configure: Konfigūruoti + button_quote: Cituoti + button_duplicate: Dubliuoti + button_show: Rodyti + button_hide: Slėpti + button_edit_section: Redaguoti šį skirsnį + button_export: Eksportuoti + button_delete_my_account: Panaikinti savo paskyrą + button_close: Uždaryti + button_reopen: Atidaryti iš naujo + button_import: Importuoti + + status_active: aktyvus + status_registered: užregistruotas + status_locked: užrakintas + + project_status_active: aktyvus + project_status_closed: uždarytas + project_status_archived: archyvuotas + + version_status_open: atidaryta + version_status_locked: užrakinta + version_status_closed: uždaryta + + field_active: Aktyvus + + text_select_mail_notifications: Išrinkite veiksmus, apie kuriuos būtų pranešta elektroniniu paštu. + text_regexp_info: pvz. ^[A-Z0-9]+$ + text_min_max_length_info: 0 reiškia jokių apribojimų + text_project_destroy_confirmation: Ar esate įsitikinęs, kad norite pašalinti šį projektą ir visus susijusius duomenis? + text_subprojects_destroy_warning: "Šis(-ie) sub-projektas(-ai): %{value} bus taip pat pašalinti." + text_workflow_edit: Išrinkite vaidmenį ir pėdsekį, kad redaguotumėte darbų eigą + text_are_you_sure: Ar esate įsitikinęs? + text_journal_changed: "%{label} pakeistas(a) iš %{old} į %{new}" + text_journal_changed_no_detail: "%{label} atnaujintas(a)" + text_journal_set_to: "%{label} nustatytas(a) į %{value}" + text_journal_deleted: "%{label} ištrintas(a) (%{old})" + text_journal_added: "%{label} pridėtas(a) %{value}" + text_tip_issue_begin_day: užduotis, prasidedanti šią dieną + text_tip_issue_end_day: užduotis, pasibaigianti šią dieną + text_tip_issue_begin_end_day: užduotis, prasidedanti ir pasibaigianti šią dieną + text_project_identifier_info: 'Leistinos mažosios raidės (a-z), skaičiai, pabraukimai ir brūkšniai, bei turi prasidėti mažąja raide .
    Išsaugojus, identifikatorius negali būti keičiamas.' + text_caracters_maximum: "%{count} simbolių maksimumas." + text_caracters_minimum: "Turi būti mažiausiai %{count} simbolių ilgio." + text_length_between: "Ilgis tarp %{min} ir %{max} simbolių." + text_tracker_no_workflow: Jokia darbų eiga neparinkta šiam pėdsekiui + text_unallowed_characters: Neleistini simboliai + text_comma_separated: Leistinos kelios reikšmės (atskirtos kableliu). + text_line_separated: Galimos kelios reikšmės (viena linija vienai vertei). + text_issues_ref_in_commit_messages: Darbų susiejimas ir fiksavimas pavedimų žinutėse + text_issue_added: "%{author} užregistravo darbą %{id}." + text_issue_updated: "%{author} atnaujino darbą %{id}." + text_wiki_destroy_confirmation: Ar esate įsitikinęs, jog norite pašalinti šį wiki puslapį ir visą jo turinį? + text_issue_category_destroy_question: "Kai kurie darbai (%{count}) yra paskirti šiai kategorijai. Ką jūs norite daryti?" + text_issue_category_destroy_assignments: Pašalinti priskirimus kategorijai + text_issue_category_reassign_to: Iš naujo priskirti darbus šiai kategorijai + text_user_mail_option: "Nepasirinktiems projektams, jūs gausite pranešimus tiktai apie tuos įvykius, kuriuos jūs stebite, arba į kuriuos esate įtrauktas (pvz. darbai, kurių autorius esate ar kuriems esate priskirtas)." + text_no_configuration_data: "Vaidmenys, pėdsekiai, darbų būsenos ir darbų eiga dar nebuvo sukonfigūruota.\nGriežtai rekomenduojam užkrauti numatytąją (default) konfigūraciją. Užkrovus, galėsite ją modifikuoti." + text_load_default_configuration: Užkrauti numatytąją konfigūraciją + text_status_changed_by_changeset: "Pakeista %{value} revizijoje." + text_time_logged_by_changeset: "Pakeista %{value} revizijoje." + text_issues_destroy_confirmation: 'Ar jūs tikrai norite ištrinti pažymėtą(-us) darbą(-us)?' + text_issues_destroy_descendants_confirmation: "Taip pat bus ištrinta(-os) %{count} darbo dalis(ys)." + text_time_entries_destroy_confirmation: 'Ar jūs tikrai norite ištrinti pasirinktą(-us) laiko įrašą(-us)?' + text_select_project_modules: 'Parinkite modulius, kuriuos norite naudoti šiame projekte:' + text_default_administrator_account_changed: Administratoriaus numatytoji paskyra pakeista + text_file_repository_writable: Į failų saugyklą saugoti galima (RW) + text_plugin_assets_writable: Į įskiepių katalogą įrašyti galima + text_rmagick_available: RMagick pasiekiamas (pasirinktinai) + text_convert_available: ImageMagick konvertavimas galimas (pasirinktinai) + text_destroy_time_entries_question: "Naikinamam darbui priskirta %{hours} valandų. Ką norite su jomis daryti?" + text_destroy_time_entries: Ištrinti įrašytas valandas + text_assign_time_entries_to_project: Priskirti įrašytas valandas prie projekto + text_reassign_time_entries: 'Priskirti įrašytas valandas šiam darbui:' + text_user_wrote: "%{value} parašė:" + text_enumeration_destroy_question: "%{count} objektai(ų) priskirti šiai reikšmei “%{name}”." + text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:' + text_email_delivery_not_configured: "El.pašto siuntimas nesukonfigūruotas ir perspėjimai neaktyvus.\nSukonfigūruokite savo SMTP serverį byloje config/configuration.yml ir perleiskite programą norėdami pritaikyti pakeitimus." + text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos žurnale.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el. paštą yra automatiškai surišti." + text_diff_truncated: "... Šis diff'as sutrauktas, nes viršija maksimalų rodomų eilučių skaičių." + text_custom_field_possible_values_info: 'Po vieną eilutę kiekvienai reikšmei' + text_wiki_page_destroy_question: "Šis puslapis turi %{descendants} susijusių arba išvestinių puslapių. Ką norite daryti?" + text_wiki_page_nullify_children: "Palikti susijusius puslapius kaip pagrindinius puslapius" + text_wiki_page_destroy_children: "Pašalinti susijusius puslapius ir jų palikuonis" + text_wiki_page_reassign_children: "Priskirkite iš naujo 'susijusius' puslapius šiam pagrindiniam puslapiui" + text_own_membership_delete_confirmation: "Jūs tuoj panaikinsite dalį arba visus leidimus ir po šio pakeitimo galite prarasti šio projekto redagavimo galimybę.\nAr jūs tikrai norite tęsti?" + text_zoom_in: Priartinti + text_zoom_out: Nutolinti + text_warn_on_leaving_unsaved: "Dabartinis puslapis turi neišsaugoto teksto, kuris bus prarastas, jeigu paliksite šį puslapį." + text_scm_path_encoding_note: "Numatytasis: UTF-8" + text_subversion_repository_note: "Pavyzdžiai: file:///, http://, https://, svn://, svn+[tunnelscheme]://" + text_git_repository_note: Saugykla (repository) yra tuščia ir lokali (pvz. /gitrepo, c:\gitrepo) + text_mercurial_repository_note: Lokali saugykla (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Komanda + text_scm_command_version: Versija + text_scm_config: Jūs galite nustatyti SCM komandas config/configuration.yml faile. Prašome perkrauti programą po failo redagavimo, norint įgalinti pakeitimus. + text_scm_command_not_available: SCM komanda nepasiekiama. Patikrinkite nustatymus administravimo skyriuje. + text_issue_conflict_resolution_overwrite: Išsaugoti mano pakeitimus bet kuriuo atveju (ankstesni įrašai bus išsaugot, tačiau kai kurie pakeitimai bus perrašyti) + text_issue_conflict_resolution_add_notes: "Išsaugoti mano įrašus ir atmesti likusius mano pakeitimus" + text_issue_conflict_resolution_cancel: "Atmesti visus mano pakeitimus ir iš naujo rodyti %{link}" + text_account_destroy_confirmation: "Ar tikrai norite tęsti?\nJūsų paskyra bus negrįžtamai pašalinta be galimybės ją vėl aktyvuoti." + text_session_expiration_settings: "Įspėjimas: šių nustatymų pakeitimas gali nutraukti galiojančias sesijas, įskaitant jūsų." + text_project_closed: Šis projektas yra uždarytas ir prieinamas tik peržiūrai. + text_turning_multiple_off: "Jei jūs išjungsite kelių reikšmių pasirinkimą, visos išvardintos reikšmės bus pašalintos ir palikta tik viena reikšmė kiekvienam laukui." + + default_role_manager: Vadovas + default_role_developer: Projektuotojas + default_role_reporter: Pranešėjas + default_tracker_bug: Klaida + default_tracker_feature: Ypatybė + default_tracker_support: Palaikymas + default_issue_status_new: Naujas + default_issue_status_in_progress: Vykdomas + default_issue_status_resolved: Išspręstas + default_issue_status_feedback: Grįžtamasis ryšys + default_issue_status_closed: Uždarytas + default_issue_status_rejected: Atmestas + default_doc_category_user: Vartotojo dokumentacija + default_doc_category_tech: Techninė dokumentacija + default_priority_low: Žemas + default_priority_normal: Normalus + default_priority_high: Aukštas + default_priority_urgent: Skubus + default_priority_immediate: Neatidėliotinas + default_activity_design: Projektavimas + default_activity_development: Vystymas + + enumeration_issue_priorities: Darbo prioritetai + enumeration_doc_categories: Dokumento kategorijos + enumeration_activities: Veiklos (laiko) sekimas + enumeration_system_activity: Sistemos veikla + description_filter: Filtras + description_search: Paieškos laukas + description_choose_project: Projektai + description_project_scope: Paieškos sritis + description_notes: Pastabos + description_message_content: MŽinutės turinys + description_query_sort_criteria_attribute: Rūšiuoti atributą + description_query_sort_criteria_direction: Rūšiuoti kryptį + description_user_mail_notification: Pašto pranešimų nustatymai + description_available_columns: Galimi Stulpeliai + description_selected_columns: Pasirinkti Stulpeliai + description_all_columns: AVisi stulpeliai + description_issue_category_reassign: Pasirinkti darbo kategoriją + description_wiki_subpages_reassign: Pasirinkti naują pagrindinį puslapį + text_repository_identifier_info: 'Leidžiamos tik mažosios raidės (a-z), skaitmenys, brūkšneliai ir pabraukimo simboliai.
    Kartą išsaugojus pakeitimai negalimi' + label_wiki_page_new: Naujas wiki puslapis + label_relations: Ryšiai + button_filter: Filtras + mail_body_password_updated: Slaptažodis pakeistas. + label_no_preview: Peržiūra negalima + error_no_tracker_allowed_for_new_issue_in_project: Projektas neturi jokių pėdsekių, + kuriems galima būtų sukurti darbą + label_tracker_all: Visi pėdsekiai + label_new_project_issue_tab_enabled: Rodyti "Naujo darbo kortelę" + setting_new_item_menu_tab: Projekto meniu ąselė naujų objektų kūrimui + label_new_object_tab_enabled: Rodyti "+" išskleidžiąmąjį sąrašą + error_no_projects_with_tracker_allowed_for_new_issue: Nėra projektų su pėdsekiais, + kuriems galima būtų sukurti darbą + field_textarea_font: Šriftas naudojamas teksto sritims + label_font_default: Numatytasis šriftas + label_font_monospace: Lygiaplotis šriftas + label_font_proportional: Įvairiaplotis šriftas + setting_timespan_format: Laiko tarpo formatas + label_table_of_contents: Turinio lentelė + setting_commit_logs_formatting: Pritaikyti teksto formatavimą patvirtinimo žinutėms + setting_mail_handler_enable_regex_delimiters: Įjungti reguliariuosius reiškinius + error_move_of_child_not_possible: 'Darbo dalis %{child} negali būti perkelta į naują + projektą: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Dirbtas laikas negali būti + iš naujo paskirtas darbui, kuris bus ištrintas + setting_timelog_required_fields: Privalomi laukai laiko registracijai + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Tik dalykai, kuriuos stebiu arba esu įtrauktas + label_user_mail_option_only_owner: Tik dalykai, kuriuos stebiu arba esu jų savininkas + warning_fields_cleared_on_bulk_edit: Pakeitimai iššauks automatinį reikšmių + pašalinimą iš vieno arba kelių laukų pažymėtiems objektams + field_updated_by: Atnaujino + field_last_updated_by: Paskutinį kartą atnaujino + field_full_width_layout: Viso pločio išdėstymas + label_last_notes: Paskutinės pastabos + field_digest: Kontrolinė suma + field_default_assigned_to: Numatytasis paskirtasis + setting_show_custom_fields_on_registration: Rodyti individualizuotus laukus registracijoje + permission_view_news: Žiūrėti naujienas + label_no_preview_alternative_html: Peržiūra neprieinama. Naudokite failą %{link}. + label_no_preview_download: Atsisiųsti diff --git a/config/locales/lv.yml b/config/locales/lv.yml new file mode 100644 index 0000000..1db2ce0 --- /dev/null +++ b/config/locales/lv.yml @@ -0,0 +1,1224 @@ +# translated by Dzintars Bergs (dzintars.bergs@gmail.com) + +lv: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%d %b" + long: "%d %B %Y" + + day_names: [Svētdiena, Pirmdiena, Otrdiena, Trešdiena, Ceturtdiena, Piektdiena, Sestdiena] + abbr_day_names: [Sv, Pr, Ot, Tr, Ct, Pk, St] + + month_names: [~, Janvāris, Februāris, Marts, Aprīlis , Maijs, Jūnijs, Jūlijs, Augusts, Septembris, Oktobris, Novembris, Decembris] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Mai, Jūn, Jūl, Aug, Sep, Okt, Nov, Dec] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d %b %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d %b, %H:%M" + long: "%B %d, %Y %H:%M" + am: "rītā" + pm: "vakarā" + + datetime: + distance_in_words: + half_a_minute: "pus minūte" + less_than_x_seconds: + one: "mazāk kā 1 sekunde" + other: "mazāk kā %{count} sekundes" + x_seconds: + one: "1 sekunde" + other: "%{count} sekundes" + less_than_x_minutes: + one: "mazāk kā minūte" + other: "mazāk kā %{count} minūtes" + x_minutes: + one: "1 minūte" + other: "%{count} minūtes" + about_x_hours: + one: "aptuveni 1 stunda" + other: "aptuveni %{count} stundas" + x_hours: + one: "1 stunda" + other: "%{count} stundas" + x_days: + one: "1 diena" + other: "%{count} dienas" + about_x_months: + one: "aptuveni 1 mēnesis" + other: "aptuveni %{count} mēneši" + x_months: + one: "1 mēnesis" + other: "%{count} mēneši" + about_x_years: + one: "aptuveni 1 gads" + other: "aptuveni %{count} gadi" + over_x_years: + one: "ilgāk par 1 gadu" + other: "ilgāk par %{count} gadiem" + almost_x_years: + one: "gandrīz 1 gadu" + other: "gandrīz %{count} gadus" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: " " + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Baits" + other: "Baiti" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + support: + array: + sentence_connector: "un" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nav iekļauts sarakstā" + exclusion: "ir rezervēts" + invalid: "nederīgs" + confirmation: "apstiprinājums nesakrīt" + accepted: "jābūt akceptētam" + empty: "nevar būt tukšs" + blank: "nevar būt neaizpildīts" + too_long: "ir pārāk gara(š) (maksimālais garums ir %{count} simboli)" + too_short: "ir pārāk īsa(s) (minimālais garums ir %{count} simboli)" + wrong_length: "ir nepareiza garuma (vajadzētu būt %{count} simboli)" + taken: "eksistē" + not_a_number: "nav skaitlis" + not_a_date: "nav derīgs datums" + greater_than: "jābūt lielākam par %{count}" + greater_than_or_equal_to: "jābūt lielākam vai vienādam ar %{count}" + equal_to: "jābūt vienādam ar %{count}" + less_than: "jābūt mazākam kā %{count}" + less_than_or_equal_to: "jābūt mazākam vai vienādam ar %{count}" + odd: "jāatšķirās" + even: "jāsakrīt" + greater_than_start_date: "jābūt vēlākam par sākuma datumu" + not_same_project: "nepieder pie tā paša projekta" + circular_dependency: "Šī relācija radītu ciklisku atkarību" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Izvēlieties + + general_text_No: 'Nē' + general_text_Yes: 'Jā' + general_text_no: 'nē' + general_text_yes: 'jā' + general_lang_name: 'Latvian (Latviešu)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Konts tika atjaunots veiksmīgi. + notice_account_invalid_credentials: Nepareizs lietotāja vārds vai parole. + notice_account_password_updated: Parole tika veiksmīgi atjaunota. + notice_account_wrong_password: Nepareiza parole + notice_account_register_done: Konts veiksmīgi izveidots. Lai aktivizētu kontu, spiediet uz saites, kas Jums tika nosūtīta. + notice_account_unknown_email: Nezināms lietotājs + notice_can_t_change_password: Šis konts izmanto ārēju pilnvarošanas avotu. Nav iespējams nomainīt paroli. + notice_account_lost_email_sent: Jums tika nosūtīts e-pasts ar instrukcijām, kā izveidot jaunu paroli. + notice_account_activated: Jūsu konts ir aktivizēts. Varat pieslēgties sistēmai. + notice_successful_create: Veiksmīga izveide. + notice_successful_update: Veiksmīga atjaunošana. + notice_successful_delete: Veiksmīga dzēšana. + notice_successful_connection: Veiksmīgs savienojums. + notice_file_not_found: Lapa, ko Jūs mēģināt atvērt, neeksistē vai ir pārvietota. + notice_locking_conflict: Datus ir atjaunojis cits lietotājs. + notice_not_authorized: Jums nav tiesību piekļūt šai lapai. + notice_email_sent: "E-pasts tika nosūtīts uz %{value}" + notice_email_error: "Kļūda sūtot e-pastu (%{value})" + notice_feeds_access_key_reseted: Jūsu Atom pieejas atslēga tika iestatīta sākuma stāvoklī. + notice_api_access_key_reseted: Jūsu API pieejas atslēga tika iestatīta sākuma stāvoklī. + notice_failed_to_save_issues: "Neizdevās saglabāt %{count} uzdevumu(us) no %{total} izvēlēti: %{ids}." + notice_no_issue_selected: "Nav izvēlēts uzdevums! Lūdzu, atzīmējiet uzdevumus, kurus vēlaties rediģēt!" + notice_account_pending: "Jūsu konts tika izveidots un šobrīd gaida administratora apstiprinājumu." + notice_default_data_loaded: Noklusētā konfigurācija tika veiksmīgi ielādēta. + notice_unable_delete_version: Neizdevās dzēst versiju. + notice_issue_done_ratios_updated: Uzdevuma izpildes koeficients atjaunots. + + error_can_t_load_default_data: "Nevar ielādēt noklusētos konfigurācijas datus: %{value}" + error_scm_not_found: "Ieraksts vai versija nebija repozitorijā." + error_scm_command_failed: "Mēģinot piekļūt repozitorijam, notika kļūda: %{value}" + error_scm_annotate: "Ieraksts neeksistē vai tam nevar tikt pievienots paskaidrojums." + error_issue_not_found_in_project: 'Uzdevums netika atrasts vai nepieder šim projektam.' + error_no_tracker_in_project: 'Neviens trakeris nav saistīts ar šo projektu. Pārbaudiet projekta iestatījumus.' + error_no_default_issue_status: 'Nav definēts uzdevuma noklusētais statuss. Pārbaudiet konfigurāciju (Ejat uz: "Administrācija -> Uzdevumu statusi")!' + error_can_not_reopen_issue_on_closed_version: 'Nevar pievienot atsauksmi uzdevumam, kas saistīts ar slēgtu versiju.' + error_can_not_archive_project: Šis projekts nevar tikt arhivēts + error_issue_done_ratios_not_updated: "Uzdevuma izpildes koeficients nav atjaunots." + error_workflow_copy_source: 'Lūdzu izvēlieties avota trakeri vai lomu' + error_workflow_copy_target: 'Lūdzu izvēlēties mērķa trakeri(us) un lomu(as)' + + warning_attachments_not_saved: "%{count} datnes netika saglabātas." + + mail_subject_lost_password: "Jūsu %{value} parole" + mail_body_lost_password: 'Lai mainītu paroli, spiediet uz šīs saites:' + mail_subject_register: "Jūsu %{value} konta aktivizācija" + mail_body_register: 'Lai izveidotu kontu, spiediet uz šīs saites:' + mail_body_account_information_external: "Varat izmantot Jūsu %{value} kontu, lai pieslēgtos." + mail_body_account_information: Jūsu konta informācija + mail_subject_account_activation_request: "%{value} konta aktivizācijas pieprasījums" + mail_body_account_activation_request: "Jauns lietotājs (%{value}) ir reģistrēts. Lietotāja konts gaida Jūsu apstiprinājumu:" + mail_subject_reminder: "%{count} uzdevums(i) sagaidāms(i) tuvākajās %{days} dienās" + mail_body_reminder: "%{count} uzdevums(i), kurš(i) ir nozīmēts(i) Jums, sagaidāms(i) tuvākajās %{days} dienās:" + mail_subject_wiki_content_added: "'%{id}' Wiki lapa pievienota" + mail_body_wiki_content_added: "The '%{id}' Wiki lapu pievienojis %{author}." + mail_subject_wiki_content_updated: "'%{id}' Wiki lapa atjaunota" + mail_body_wiki_content_updated: "The '%{id}' Wiki lapu atjaunojis %{author}." + + + field_name: Nosaukums + field_description: Apraksts + field_summary: Kopsavilkums + field_is_required: Nepieciešams + field_firstname: Vārds + field_lastname: Uzvārds + field_mail: "E-pasts" + field_filename: Datne + field_filesize: Izmērs + field_downloads: Lejupielādes + field_author: Autors + field_created_on: Izveidots + field_updated_on: Atjaunots + field_field_format: Formāts + field_is_for_all: Visiem projektiem + field_possible_values: Iespējamās vērtības + field_regexp: Regulārā izteiksme + field_min_length: Minimālais garums + field_max_length: Maksimālais garums + field_value: Vērtība + field_category: Kategorija + field_title: Nosaukums + field_project: Projekts + field_issue: Uzdevums + field_status: Statuss + field_notes: Piezīmes + field_is_closed: Uzdevums slēgts + field_is_default: Noklusētā vērtība + field_tracker: Trakeris + field_subject: Temats + field_due_date: Sagaidāmais datums + field_assigned_to: Piešķirts + field_priority: Prioritāte + field_fixed_version: Mērķa versija + field_user: Lietotājs + field_role: Loma + field_homepage: Vietne + field_is_public: Publisks + field_parent: Apakšprojekts projektam + field_is_in_roadmap: Ceļvedī parādītie uzdevumi + field_login: Pieslēgties + field_mail_notification: "E-pasta paziņojumi" + field_admin: Administrators + field_last_login_on: Pēdējo reizi pieslēdzies + field_language: Valoda + field_effective_date: Datums + field_password: Parole + field_new_password: Janā parole + field_password_confirmation: Paroles apstiprinājums + field_version: Versija + field_type: Tips + field_host: Hosts + field_port: Ports + field_account: Konts + field_base_dn: Base DN + field_attr_login: Pieslēgšanās atribūts + field_attr_firstname: Vārda atribūts + field_attr_lastname: Uzvārda atribūts + field_attr_mail: "E-pasta atribūts" + field_onthefly: "Lietotāja izveidošana on-the-fly" + field_start_date: Sākuma datums + field_done_ratio: "% padarīti" + field_auth_source: Pilnvarošanas režīms + field_hide_mail: "Paslēpt manu e-pasta adresi" + field_comments: Komentārs + field_url: URL + field_start_page: Sākuma lapa + field_subproject: Apakšprojekts + field_hours: Stundas + field_activity: Aktivitāte + field_spent_on: Datums + field_identifier: Identifikators + field_is_filter: Izmantots kā filtrs + field_issue_to: Saistīts uzdevums + field_delay: Kavējums + field_assignable: Uzdevums var tikt piesaistīts šai lomai + field_redirect_existing_links: Pāradresēt eksistējošās saites + field_estimated_hours: Paredzētais laiks + field_column_names: Kolonnas + field_time_zone: Laika zona + field_searchable: Meklējams + field_default_value: Noklusētā vērtība + field_comments_sorting: Rādīt komentārus + field_parent_title: Vecāka lapa + field_editable: Rediģējams + field_watcher: Vērotājs + field_identity_url: OpenID URL + field_content: Saturs + field_group_by: Grupēt rezultātus pēc + field_sharing: Koplietošana + + setting_app_title: Programmas nosaukums + setting_app_subtitle: Programmas apakš-nosaukums + setting_welcome_text: Sveiciena teksts + setting_default_language: Noklusētā valoda + setting_login_required: Nepieciešama pilnvarošana + setting_self_registration: Pašreģistrēšanās + setting_attachment_max_size: Pielikuma maksimālais izmērs + setting_issues_export_limit: Uzdevumu eksporta ierobežojums + setting_mail_from: "E-pasta adrese informācijas nosūtīšanai" + setting_bcc_recipients: "Saņēmēju adreses neparādīsies citu saņēmēju vēstulēs (bcc)" + setting_plain_text_mail: "Vēstule brīvā tekstā (bez HTML)" + setting_host_name: Hosta nosaukums un piekļuves ceļš + setting_text_formatting: Teksta formatēšana + setting_wiki_compression: Wiki vēstures saspiešana + setting_feeds_limit: Barotnes satura ierobežojums + setting_default_projects_public: Jaunie projekti noklusēti ir publiski pieejami + setting_autofetch_changesets: "Automātiski lietot jaunāko versiju, pieslēdzoties repozitorijam (Autofetch)" + setting_sys_api_enabled: Ieslēgt WS repozitoriju menedžmentam + setting_commit_ref_keywords: Norādes atslēgvārdi + setting_commit_fix_keywords: Fiksējošie atslēgvārdi + setting_autologin: Automātiskā pieslēgšanās + setting_date_format: Datuma formāts + setting_time_format: Laika formāts + setting_cross_project_issue_relations: "Atļaut starp-projektu uzdevumu relācijas" + setting_issue_list_default_columns: Noklusēti rādītās kolonnas uzdevumu sarakstā + setting_emails_footer: "E-pastu kājene" + setting_protocol: Protokols + setting_per_page_options: Objekti vienā lapā + setting_user_format: Lietotāju rādīšanas formāts + setting_activity_days_default: Dienus skaits aktivitāšu rādīšanai aktivitāšu sadaļā + setting_display_subprojects_issues: Rādīt apakšprojekta uzdevumus galvenajā projektā pēc noklusējuma + setting_enabled_scm: Lietot SCM + setting_mail_handler_body_delimiters: "Saīsināt pēc vienas no šim rindām" + setting_mail_handler_api_enabled: "Lietot WS ienākošajiem e-pastiem" + setting_mail_handler_api_key: API atslēga + setting_sequential_project_identifiers: Ģenerēt secīgus projektu identifikatorus + setting_gravatar_enabled: Izmantot Gravatar lietotāju ikonas + setting_gravatar_default: Noklusētais Gravatar attēls + setting_diff_max_lines_displayed: Maksimālais rādīto diff rindu skaits + setting_file_max_size_displayed: Maksimālais izmērs iekļautajiem teksta failiem + setting_repository_log_display_limit: Maksimālais žurnāla datnē rādīto revīziju skaits + setting_openid: Atļaut OpenID pieslēgšanos un reģistrēšanos + setting_password_min_length: Minimālais paroles garums + setting_new_project_user_role_id: Loma, kura tiek piešķirta ne-administratora lietotājam, kurš izveido projektu + setting_default_projects_modules: Noklusētie lietotie moduļi jaunam projektam + setting_issue_done_ratio: Aprēķināt uzdevuma izpildes koeficientu ar + setting_issue_done_ratio_issue_field: uzdevuma lauku + setting_issue_done_ratio_issue_status: uzdevuma statusu + setting_start_of_week: Sākt kalendāru ar + setting_rest_api_enabled: Lietot REST web-servisu + setting_cache_formatted_text: Kešot formatētu tekstu + + permission_add_project: Izveidot projektu + permission_add_subprojects: Izveidot apakšprojektu + permission_edit_project: Rediģēt projektu + permission_select_project_modules: Izvēlēties projekta moduļus + permission_manage_members: Pārvaldīt dalībniekus + permission_manage_project_activities: Pārvaldīt projekta aktivitātes + permission_manage_versions: Pārvaldīt versijas + permission_manage_categories: Pārvaldīt uzdevumu kategorijas + permission_view_issues: Apskatīt uzdevumus + permission_add_issues: Pievienot uzdevumus + permission_edit_issues: Rediģēt uzdevumus + permission_manage_issue_relations: Pārvaldīt uzdevumu relācijas + permission_add_issue_notes: Pievienot piezīmes + permission_edit_issue_notes: Rediģēt piezīmes + permission_edit_own_issue_notes: Rediģēt paša piezīmes + permission_move_issues: Pārvietot uzdevumus + permission_delete_issues: Dzēst uzdevumus + permission_manage_public_queries: Pārvaldīt publiskos pieprasījumus + permission_save_queries: Saglabāt pieprasījumus + permission_view_gantt: Skatīt Ganta diagrammu + permission_view_calendar: Skatīt kalendāru + permission_view_issue_watchers: Skatīt vērotāju sarakstu + permission_add_issue_watchers: Pievienot vērotājus + permission_delete_issue_watchers: Dzēst vērotājus + permission_log_time: Piereģistrēt pavadīto laiku + permission_view_time_entries: Skatīt pavadīto laiku + permission_edit_time_entries: Rdiģēt laika reģistrus + permission_edit_own_time_entries: Rediģēt savus laika reģistrus + permission_manage_news: Pārvaldīt jaunumus + permission_comment_news: Komentēt jaunumus + permission_view_documents: Skatīt dokumentus + permission_manage_files: Pārvaldīt failus + permission_view_files: Skatīt failus + permission_manage_wiki: Pārvaldīt wiki + permission_rename_wiki_pages: Pārsaukt wiki lapas + permission_delete_wiki_pages: Dzēst wiki lapas + permission_view_wiki_pages: Skatīt wiki + permission_view_wiki_edits: Skatīt wiki vēsturi + permission_edit_wiki_pages: Rdiģēt wiki lapas + permission_delete_wiki_pages_attachments: Dzēst pielikumus + permission_protect_wiki_pages: Projekta wiki lapas + permission_manage_repository: Pārvaldīt repozitoriju + permission_browse_repository: Pārlūkot repozitoriju + permission_view_changesets: Skatīt izmaiņu kopumus + permission_commit_access: Atļaut piekļuvi + permission_manage_boards: Pārvaldīt ziņojumu dēļus + permission_view_messages: Skatīt ziņas + permission_add_messages: Publicēt ziņas + permission_edit_messages: Rediģēt ziņas + permission_edit_own_messages: Rediģēt savas ziņas + permission_delete_messages: Dzēst ziņas + permission_delete_own_messages: Dzēst savas ziņas + permission_export_wiki_pages: Eksportēt Wiki lapas + + project_module_issue_tracking: Uzdevumu uzskaite + project_module_time_tracking: Laika uzskaite + project_module_news: Jaunumi + project_module_documents: Dokumenti + project_module_files: Datnes + project_module_wiki: Wiki + project_module_repository: Repozitorijs + project_module_boards: Ziņojumu dēļi + + label_user: Lietotājs + label_user_plural: Lietotāji + label_user_new: Jauns lietotājs + label_user_anonymous: Anonīms + label_project: Projekts + label_project_new: Jauns projekts + label_project_plural: Projekti + label_x_projects: + zero: nav projektu + one: 1 projekts + other: "%{count} projekti" + label_project_all: Visi projekti + label_project_latest: Jaunākie projekti + label_issue: Uzdevums + label_issue_new: Jauns uzdevums + label_issue_plural: Uzdevumi + label_issue_view_all: Skatīt visus uzdevumus + label_issues_by: "Kārtot pēc %{value}" + label_issue_added: Uzdevums pievienots + label_issue_updated: Uzdevums atjaunots + label_document: Dokuments + label_document_new: Jauns dokuments + label_document_plural: Dokumenti + label_document_added: Dokuments pievienots + label_role: Loma + label_role_plural: Lomas + label_role_new: Jauna loma + label_role_and_permissions: Lomas un atļaujas + label_member: Dalībnieks + label_member_new: Jauns dalībnieks + label_member_plural: Dalībnieki + label_tracker: Trakeris + label_tracker_plural: Trakeri + label_tracker_new: Jauns trakeris + label_workflow: Darba gaita + label_issue_status: Uzdevuma statuss + label_issue_status_plural: Uzdevumu statusi + label_issue_status_new: Jauns statuss + label_issue_category: Uzdevuma kategorija + label_issue_category_plural: Uzdevumu kategorijas + label_issue_category_new: Jauna kategorija + label_custom_field: Pielāgojams lauks + label_custom_field_plural: Pielāgojami lauki + label_custom_field_new: Jauns pielāgojams lauks + label_enumerations: Uzskaitījumi + label_enumeration_new: Jauna vērtība + label_information: Informācija + label_information_plural: Informācija + label_please_login: Lūdzu pieslēdzieties + label_register: Reģistrēties + label_login_with_open_id_option: vai pieslēgties ar OpenID + label_password_lost: Nozaudēta parole + label_home: Sākums + label_my_page: Mana lapa + label_my_account: Mans konts + label_my_projects: Mani projekti + label_administration: Administrācija + label_login: Pieslēgties + label_logout: Atslēgties + label_help: Palīdzība + label_reported_issues: Ziņotie uzdevumi + label_assigned_to_me_issues: Man piesaistītie uzdevumi + label_last_login: Pēdējā pieslēgšanās + label_registered_on: Reģistrējies + label_activity: Aktivitāte + label_overall_activity: Kopējās aktivitātes + label_user_activity: "Lietotāja %{value} aktivitātes" + label_new: Jauns + label_logged_as: Pieslēdzies kā + label_environment: Vide + label_authentication: Pilnvarošana + label_auth_source: Pilnvarošanas režīms + label_auth_source_new: Jauns pilnvarošanas režīms + label_auth_source_plural: Pilnvarošanas režīmi + label_subproject_plural: Apakšprojekti + label_subproject_new: Jauns apakšprojekts + label_and_its_subprojects: "%{value} un tā apakšprojekti" + label_min_max_length: Minimālais - Maksimālais garums + label_list: Saraksts + label_date: Datums + label_integer: Vesels skaitlis + label_float: Decimālskaitlis + label_boolean: Patiesuma vērtība + label_string: Teksts + label_text: Garš teksts + label_attribute: Atribūts + label_attribute_plural: Atribūti + label_no_data: Nav datu, ko parādīt + label_change_status: Mainīt statusu + label_history: Vēsture + label_attachment: Pielikums + label_attachment_new: Jauns pielikums + label_attachment_delete: Dzēst pielikumu + label_attachment_plural: Pielikumi + label_file_added: Lauks pievienots + label_report: Atskaite + label_report_plural: Atskaites + label_news: Ziņa + label_news_new: Pievienot ziņu + label_news_plural: Ziņas + label_news_latest: Jaunākās ziņas + label_news_view_all: Skatīt visas ziņas + label_news_added: Ziņas pievienotas + label_settings: Iestatījumi + label_overview: Pārskats + label_version: Versija + label_version_new: Jauna versija + label_version_plural: Versijas + label_close_versions: Aizvērt pabeigtās versijas + label_confirmation: Apstiprinājums + label_export_to: 'Pieejams arī:' + label_read: Lasīt... + label_public_projects: Publiskie projekti + label_open_issues: atvērts + label_open_issues_plural: atvērti + label_closed_issues: slēgts + label_closed_issues_plural: slēgti + label_x_open_issues_abbr: + zero: 0 atvērti + one: 1 atvērts + other: "%{count} atvērti" + label_x_closed_issues_abbr: + zero: 0 slēgti + one: 1 slēgts + other: "%{count} slēgti" + label_total: Kopā + label_permissions: Atļaujas + label_current_status: Pašreizējais statuss + label_new_statuses_allowed: Jauni statusi atļauti + label_all: visi + label_none: neviens + label_nobody: nekas + label_next: Nākošais + label_previous: Iepriekšējais + label_used_by: Izmanto + label_details: Detaļas + label_add_note: Pievienot piezīmi + label_calendar: Kalendārs + label_months_from: mēneši no + label_gantt: Ganta diagramma + label_internal: Iekšējais + label_last_changes: "pēdējās %{count} izmaiņas" + label_change_view_all: Skatīt visas izmaiņas + label_comment: Komentārs + label_comment_plural: Komentāri + label_x_comments: + zero: nav komentāru + one: 1 komentārs + other: "%{count} komentāri" + label_comment_add: Pievienot komentāru + label_comment_added: Komentārs pievienots + label_comment_delete: Dzēst komentārus + label_query: Pielāgots pieprasījums + label_query_plural: Pielāgoti pieprasījumi + label_query_new: Jauns pieprasījums + label_filter_add: Pievienot filtru + label_filter_plural: Filtri + label_equals: ir + label_not_equals: nav + label_in_less_than: ir mazāk kā + label_in_more_than: ir vairāk kā + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: iekš + label_today: šodien + label_all_time: visu laiku + label_yesterday: vakar + label_this_week: šonedēļ + label_last_week: pagājušo šonedēļ + label_last_n_days: "pēdējās %{count} dienas" + label_this_month: šomēnes + label_last_month: pagājušo mēnes + label_this_year: šogad + label_date_range: Datumu apgabals + label_less_than_ago: mazāk kā dienas iepriekš + label_more_than_ago: vairāk kā dienas iepriekš + label_ago: dienas iepriekš + label_contains: satur + label_not_contains: nesatur + label_day_plural: dienas + label_repository: Repozitorijs + label_repository_plural: Repozitoriji + label_browse: Pārlūkot + label_branch: Zars + label_tag: Birka + label_revision: Revīzija + label_revision_plural: Revīzijas + label_revision_id: "Revīzija %{value}" + label_associated_revisions: Saistītās revīzijas + label_added: pievienots + label_modified: modificēts + label_copied: nokopēts + label_renamed: pārsaukts + label_deleted: dzēsts + label_latest_revision: Pēdējā revīzija + label_latest_revision_plural: Pēdējās revīzijas + label_view_revisions: Skatīt revīzijas + label_view_all_revisions: Skatīt visas revīzijas + label_max_size: Maksimālais izmērs + label_sort_highest: Pārvietot uz augšu + label_sort_higher: Pārvietot soli augšup + label_sort_lower: Pārvietot uz leju + label_sort_lowest: Pārvietot vienu soli uz leju + label_roadmap: Ceļvedis + label_roadmap_due_in: "Sagaidāms pēc %{value}" + label_roadmap_overdue: "nokavēts %{value}" + label_roadmap_no_issues: Šai versijai nav uzdevumu + label_search: Meklēt + label_result_plural: Rezultāti + label_all_words: Visi vārdi + label_wiki: Wiki + label_wiki_edit: Wiki labojums + label_wiki_edit_plural: Wiki labojumi + label_wiki_page: Wiki lapa + label_wiki_page_plural: Wiki lapas + label_index_by_title: Indeksēt pēc nosaukuma + label_index_by_date: Indeksēt pēc datuma + label_current_version: Tekošā versija + label_preview: Priekšskatījums + label_feed_plural: Barotnes + label_changes_details: Visu izmaiņu detaļas + label_issue_tracking: Uzdevumu uzskaite + label_spent_time: Pavadītais laiks + label_f_hour: "%{value} stunda" + label_f_hour_plural: "%{value} stundas" + label_time_tracking: Laika uzskaite + label_change_plural: Izmaiņas + label_statistics: Statistika + label_commits_per_month: Nodevumi mēnesī + label_commits_per_author: Nodevumi no autora + label_view_diff: Skatīt atšķirības + label_diff_inline: iekļauts + label_diff_side_by_side: blakus + label_options: Opcijas + label_copy_workflow_from: Kopēt darba plūsmu no + label_permissions_report: Atļauju atskaite + label_watched_issues: Vērotie uzdevumi + label_related_issues: Saistītie uzdevumi + label_applied_status: Piešķirtais statuss + label_loading: Lādējas... + label_relation_new: Jauna relācija + label_relation_delete: Dzēst relāciju + label_relates_to: saistīts ar + label_duplicates: Dublē uzdevumu + label_duplicated_by: Dublē uzdevums + label_blocks: Bloķē uzdevumu + label_blocked_by: Bloķē uzdevums + label_precedes: Pirms + label_follows: Seko pēc + label_stay_logged_in: Atcerēties mani + label_disabled: izslēgts + label_show_completed_versions: Rādīt pabeigtās versijas + label_me: es + label_board: Forums + label_board_new: Jauns forums + label_board_plural: Forumi + label_board_locked: Slēgts + label_board_sticky: Svarīgs + label_topic_plural: Tēmas + label_message_plural: Ziņas + label_message_last: Pēdējā ziņa + label_message_new: Jauna ziņa + label_message_posted: Ziņa pievienota + label_reply_plural: Atbildes + label_send_information: Sūtīt konta informāciju lietotājam + label_year: Gads + label_month: Mēnesis + label_week: Nedēļa + label_date_from: No + label_date_to: Kam + label_language_based: Izmantot lietotāja valodu + label_sort_by: "Kārtot pēc %{value}" + label_send_test_email: "Sūtīt testa e-pastu" + label_feeds_access_key: Atom piekļuves atslēga + label_missing_feeds_access_key: Trūkst Atom piekļuves atslēgas + label_feeds_access_key_created_on: "Atom piekļuves atslēga izveidota pirms %{value}" + label_module_plural: Moduļi + label_added_time_by: "Pievienojis %{author} pirms %{age}" + label_updated_time_by: "Atjaunojis %{author} pirms %{age}" + label_updated_time: "Atjaunots pirms %{value}" + label_jump_to_a_project: Pāriet uz projektu... + label_file_plural: Datnes + label_changeset_plural: Izmaiņu kopumi + label_default_columns: Noklusētās kolonnas + label_no_change_option: (Nav izmaiņu) + label_bulk_edit_selected_issues: Labot visus izvēlētos uzdevumus + label_theme: Tēma + label_default: Noklusēts + label_search_titles_only: Meklēt tikai nosaukumos + label_user_mail_option_all: "Par visiem notikumiem visos manos projektos" + label_user_mail_option_selected: "Par visiem notikumiem tikai izvēlētajos projektos..." + label_user_mail_no_self_notified: "Neziņot man par izmaiņām, kuras veicu es pats" + label_registration_activation_by_email: "konta aktivizācija caur e-pastu" + label_registration_manual_activation: manuālā konta aktivizācija + label_registration_automatic_activation: automātiskā konta aktivizācija + label_display_per_page: "Rādīt vienā lapā: %{value}" + label_age: Vecums + label_change_properties: Mainīt atribūtus + label_general: Galvenais + label_scm: SCM + label_plugins: Spraudņi + label_ldap_authentication: LDAP pilnvarošana + label_downloads_abbr: L-lād. + label_optional_description: "Apraksts (neobligāts)" + label_add_another_file: Pievienot citu failu + label_preferences: Priekšrocības + label_chronological_order: Hronoloģiskā kārtībā + label_reverse_chronological_order: Apgriezti hronoloģiskā kārtībā + label_incoming_emails: "Ienākošie e-pasti" + label_generate_key: Ģenerēt atslēgu + label_issue_watchers: Vērotāji + label_example: Piemērs + label_display: Rādīt + label_sort: Kārtot + label_ascending: Augoši + label_descending: Dilstoši + label_date_from_to: "No %{start} līdz %{end}" + label_wiki_content_added: Wiki lapa pievienota + label_wiki_content_updated: Wiki lapa atjaunota + label_group: Grupa + label_group_plural: Grupas + label_group_new: Jauna grupa + label_time_entry_plural: Pavadītais laiks + label_version_sharing_none: Nav koplietošanai + label_version_sharing_descendants: Ar apakšprojektiem + label_version_sharing_hierarchy: Ar projektu hierarhiju + label_version_sharing_tree: Ar projekta koku + label_version_sharing_system: Ar visiem projektiem + label_update_issue_done_ratios: Atjaunot uzdevuma veikuma attiecību + label_copy_source: Avots + label_copy_target: Mērķis + label_copy_same_as_target: Tāds pats kā mērķis + label_display_used_statuses_only: "Rādīt tikai statusus, ko lieto šis trakeris" + label_api_access_key: API pieejas atslēga + label_missing_api_access_key: Trūkst API pieejas atslēga + label_api_access_key_created_on: "API pieejas atslēga izveidota pirms %{value}" + + button_login: Pieslēgties + button_submit: Nosūtīt + button_save: Saglabāt + button_check_all: Atzīmēt visu + button_uncheck_all: Noņemt visus atzīmējumus + button_delete: Dzēst + button_create: Izveidot + button_create_and_continue: Izveidot un turpināt + button_test: Testēt + button_edit: Labot + button_add: Pievienot + button_change: Mainīt + button_apply: Apstiprināt + button_clear: Notīrīt + button_lock: Slēgt + button_unlock: Atslēgt + button_download: Lejuplādēt + button_list: Saraksts + button_view: Skats + button_move: Pārvietot + button_move_and_follow: Pārvietot un sekot + button_back: Atpakaļ + button_cancel: Atcelt + button_activate: Aktivizēt + button_sort: Kārtot + button_log_time: Reģistrēt laiku + button_rollback: Atjaunot uz šo versiju + button_watch: Vērot + button_unwatch: Nevērot + button_reply: Atbildēt + button_archive: Arhivēt + button_unarchive: Atarhivēt + button_reset: Atiestatīt + button_rename: Pārsaukt + button_change_password: Mainīt paroli + button_copy: Kopēt + button_copy_and_follow: Kopēt un sekot + button_annotate: Pierakstīt paskaidrojumu + button_update: Atjaunot + button_configure: Konfigurēt + button_quote: Citāts + button_duplicate: Dublēt + button_show: Rādīt + + status_active: aktīvs + status_registered: reģistrēts + status_locked: slēgts + + version_status_open: atvērta + version_status_locked: slēgta + version_status_closed: aizvērta + + field_active: Aktīvs + + text_select_mail_notifications: "Izvēlieties darbības, par kurām vēlaties saņemt ziņojumus e-pastā" + text_regexp_info: "piem. ^[A-Z0-9]+$" + text_min_max_length_info: "0 nozīmē, ka nav ierobežojumu" + text_project_destroy_confirmation: "Vai tiešām vēlaties dzēst šo projektu un ar to saistītos datus?" + text_subprojects_destroy_warning: "Tā apakšprojekts(i): %{value} arī tiks dzēsts(i)." + text_workflow_edit: Lai labotu darba plūsmu, izvēlieties lomu un trakeri + text_are_you_sure: "Vai esat pārliecināts?" + text_journal_changed: "%{label} mainīts no %{old} uz %{new}" + text_journal_set_to: "%{label} iestatīts uz %{value}" + text_journal_deleted: "%{label} dzēsts (%{old})" + text_journal_added: "%{label} %{value} pievienots" + text_tip_issue_begin_day: uzdevums sākas šodien + text_tip_issue_end_day: uzdevums beidzas šodien + text_tip_issue_begin_end_day: uzdevums sākas un beidzas šodien + text_caracters_maximum: "%{count} simboli maksimāli." + text_caracters_minimum: "Jābūt vismaz %{count} simbolu garumā." + text_length_between: "Garums starp %{min} un %{max} simboliem." + text_tracker_no_workflow: Šim trakerim nav definēta darba plūsma + text_unallowed_characters: Neatļauti simboli + text_comma_separated: "Atļautas vairākas vērtības (atdalīt ar komatu)." + text_line_separated: "Atļautas vairākas vērtības (rakstīt katru savā rindā)." + text_issues_ref_in_commit_messages: "Izmaiņu salīdzināšana izejot no ziņojumiem" + text_issue_added: "Uzdevumu %{id} pievienojis %{author}." + text_issue_updated: "Uzdevumu %{id} atjaunojis %{author}." + text_wiki_destroy_confirmation: "Vai esat drošs, ka vēlaties dzēst šo wiki un visu tās saturu?" + text_issue_category_destroy_question: "Daži uzdevumi (%{count}) ir nozīmēti šai kategorijai. Ko Jūs vēlaties darīt?" + text_issue_category_destroy_assignments: Dzēst kategoriju nozīmējumus + text_issue_category_reassign_to: Nozīmēt uzdevumus šai kategorijai + text_user_mail_option: "No neizvēlētajiem projektiem Jūs saņemsiet ziņojumus e-pastā tikai par notikumiem, kuriem Jūs sekojat vai kuros esat iesaistīts." + text_no_configuration_data: "Lomas, trakeri, uzdevumu statusi un darba plūsmas vēl nav konfigurētas.\nĻoti ieteicams ielādēt noklusēto konfigurāciju. Pēc ielādēšanas to būs iespējams modificēt." + text_load_default_configuration: Ielādēt noklusēto konfigurāciju + text_status_changed_by_changeset: "Apstiprināts izmaiņu kopumā %{value}." + text_issues_destroy_confirmation: 'Vai tiešām vēlaties dzēst izvēlēto uzdevumu(us)?' + text_select_project_modules: 'Izvēlieties moduļus šim projektam:' + text_default_administrator_account_changed: Noklusētais administratora konts mainīts + text_file_repository_writable: Pielikumu direktorijā atļauts rakstīt + text_plugin_assets_writable: Spraudņu kataloga direktorijā atļauts rakstīt + text_rmagick_available: "RMagick pieejams (neobligāts)" + text_destroy_time_entries_question: "%{hours} stundas tika ziņotas par uzdevumu, ko vēlaties dzēst. Ko darīt?" + text_destroy_time_entries: Dzēst ziņotās stundas + text_assign_time_entries_to_project: Piešķirt ziņotās stundas projektam + text_reassign_time_entries: 'Piešķirt ziņotās stundas uzdevumam:' + text_user_wrote: "%{value} rakstīja:" + text_enumeration_destroy_question: "%{count} objekti ir piešķirti šai vērtībai." + text_enumeration_category_reassign_to: 'Piešķirt tos šai vērtībai:' + text_email_delivery_not_configured: "E-pastu nosūtīšana nav konfigurēta, un ziņojumi ir izslēgti.\nKonfigurējiet savu SMTP serveri datnē config/configuration.yml un pārstartējiet lietotni." + text_repository_usernames_mapping: "Izvēlieties vai atjaunojiet Redmine lietotāju, saistītu ar katru lietotājvārdu, kas atrodams repozitorija žurnālā.\nLietotāji ar to pašu Redmine un repozitorija lietotājvārdu būs saistīti automātiski." + text_diff_truncated: '... Šis diff tika nošķelts, jo tas pārsniedz maksimālo izmēru, ko var parādīt.' + text_custom_field_possible_values_info: 'Katra vērtības savā rindā' + text_wiki_page_destroy_question: "Šij lapai ir %{descendants} apakšlapa(as) un pēcnācēji. Ko darīt?" + text_wiki_page_nullify_children: "Paturēt apakšlapas kā pamatlapas" + text_wiki_page_destroy_children: "Dzēst apakšlapas un visus pēcnācējus" + text_wiki_page_reassign_children: "Piešķirt apakšlapas šai lapai" + text_own_membership_delete_confirmation: "Jūs tūlīt dzēsīsiet dažas vai visas atļaujas, un Jums pēc tam var nebūt atļauja labot šo projektu.\nVai turpināt?" + + default_role_manager: Menedžeris + default_role_developer: Izstrādātājs + default_role_reporter: Ziņotājs + default_tracker_bug: Kļūda + default_tracker_feature: Iezīme + default_tracker_support: Atbalsts + default_issue_status_new: Jauns + default_issue_status_in_progress: Attīstībā + default_issue_status_resolved: Atrisināts + default_issue_status_feedback: Atsauksmes + default_issue_status_closed: Slēgts + default_issue_status_rejected: Noraidīts + default_doc_category_user: Lietotāja dokumentācija + default_doc_category_tech: Tehniskā dokumentācija + default_priority_low: Zema + default_priority_normal: Normāla + default_priority_high: Augsta + default_priority_urgent: Steidzama + default_priority_immediate: Tūlītēja + default_activity_design: Dizains + default_activity_development: Izstrādāšana + + enumeration_issue_priorities: Uzdevumu prioritātes + enumeration_doc_categories: Dokumentu kategorijas + enumeration_activities: Aktivitātes (laika uzskaite) + enumeration_system_activity: Sistēmas aktivitātes + + error_can_not_delete_custom_field: Unable to delete custom field + permission_manage_subtasks: Manage subtasks + label_profile: Profile + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + field_parent_issue: Parent task + error_unable_delete_issue_status: Unable to delete issue status + label_subtask_plural: Apakšuzdevumi + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + label_project_copy_notifications: Send email notifications during the project copy + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Tikai par uzdevumiem, kurus novēroju vai kuros esmu iesaistījies + label_user_mail_option_none: Ne par ko + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: Mani uzdevumu filtri + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Izvērst visu + button_collapse_all: Savērst visu + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Uzdevumu redzamība + label_issues_visibility_all: Visi uzdevumi + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Nodošanas ziņojumu kodējums + field_scm_path_encoding: Ceļa kodējums + text_scm_path_encoding_note: "Noklusējuma: UTF-8" + field_path_to_repository: Repozitorija ceļš + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 uzdevums + one: 1 uzdevums + other: "%{count} uzdevumi" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Aizvērt + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Kopēt apakšuzdevumus + label_copied_to: Kopēts uz + label_copied_from: Kopēts no + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: visi + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Ar apakšprojektiem + label_cross_project_tree: Ar projekta koku + label_cross_project_hierarchy: Ar projektu hierarhiju + label_cross_project_system: Ar visiem projektiem + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Kopā + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: "E-pasts" + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API atslēga + setting_lost_password: Nozaudēta parole + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/mk.yml b/config/locales/mk.yml new file mode 100644 index 0000000..d08789e --- /dev/null +++ b/config/locales/mk.yml @@ -0,0 +1,1230 @@ +mk: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d/%m/%Y" + short: "%d %b" + long: "%d %B, %Y" + + day_names: [недела, понеделник, вторник, среда, четврток, петок, сабота] + abbr_day_names: [нед, пон, вто, сре, чет, пет, саб] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, јануари, февруари, март, април, мај, јуни, јули, август, септември, октомври, ноември, декември] + abbr_month_names: [~, јан, фев, мар, апр, мај, јун, јул, авг, сеп, окт, ное, дек] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d/%m/%Y %H:%M" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "предпладне" + pm: "попладне" + + datetime: + distance_in_words: + half_a_minute: "пола минута" + less_than_x_seconds: + one: "помалку од 1 секунда" + other: "помалку од %{count} секунди" + x_seconds: + one: "1 секунда" + other: "%{count} секунди" + less_than_x_minutes: + one: "помалку од 1 минута" + other: "помалку од %{count} минути" + x_minutes: + one: "1 минута" + other: "%{count} минути" + about_x_hours: + one: "околу 1 час" + other: "околу %{count} часа" + x_hours: + one: "1 час" + other: "%{count} часа" + x_days: + one: "1 ден" + other: "%{count} дена" + about_x_months: + one: "околу 1 месец" + other: "околу %{count} месеци" + x_months: + one: "1 месец" + other: "%{count} месеци" + about_x_years: + one: "околу 1 година" + other: "околу %{count} години" + over_x_years: + one: "преку 1 година" + other: "преку %{count} години" + almost_x_years: + one: "скоро 1 година" + other: "скоро %{count} години" + + number: + # Default format for numbers + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "и" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "не е вклучено во листата" + exclusion: "е резервирано" + invalid: "е невалидно" + confirmation: "не се совпаѓа со потврдата" + accepted: "мора да е прифатено" + empty: "неможе да е празно" + blank: "неможе да е празно" + too_long: "е предолго (макс. %{count} знаци)" + too_short: "е прекратко (мин. %{count} знаци)" + wrong_length: "е погрешна должина (треба да е %{count} знаци)" + taken: "е веќе зафатено" + not_a_number: "не е број" + not_a_date: "не е валидна дата" + greater_than: "мора да е поголемо од %{count}" + greater_than_or_equal_to: "мора да е поголемо или еднакво на %{count}" + equal_to: "мора да е еднакво на %{count}" + less_than: "мора да е помало од %{count}" + less_than_or_equal_to: "мора да е помало или еднакво на %{count}" + odd: "мора да е непарно" + even: "мора да е парно" + greater_than_start_date: "мора да е поголема од почетната дата" + not_same_project: "не припаѓа на истиот проект" + circular_dependency: "Оваа врска ќе креира кружна зависност" + cant_link_an_issue_with_a_descendant: "Задача неможе да се поврзе со една од нејзините подзадачи" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Изберете + + general_text_No: 'Не' + general_text_Yes: 'Да' + general_text_no: 'не' + general_text_yes: 'да' + general_lang_name: 'Macedonian (Македонски)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Профилот е успешно ажуриран. + notice_account_invalid_credentials: Неточен корисник или лозинка + notice_account_password_updated: Лозинката е успешно ажурирана. + notice_account_wrong_password: Погрешна лозинка + notice_account_register_done: Профилот е успешно креиран. За активација, клкнете на врската што ви е пратена по е-пошта. + notice_account_unknown_email: Непознат корисник. + notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. + notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. + notice_account_activated: Your account has been activated. You can now log in. + notice_successful_create: Успешно креирање. + notice_successful_update: Успешно ажурирање. + notice_successful_delete: Успешно бришење. + notice_successful_connection: Успешна конекција. + notice_file_not_found: The page you were trying to access doesn't exist or has been removed. + notice_locking_conflict: Data has been updated by another user. + notice_not_authorized: You are not authorized to access this page. + notice_email_sent: "Е-порака е пратена на %{value}" + notice_email_error: "Се случи грешка при праќање на е-пораката (%{value})" + notice_feeds_access_key_reseted: Вашиот Atom клуч за пристап е reset. + notice_api_access_key_reseted: Вашиот API клуч за пристап е reset. + notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." + notice_account_pending: "Your account was created and is now pending administrator approval." + notice_default_data_loaded: Default configuration successfully loaded. + notice_unable_delete_version: Unable to delete version. + notice_unable_delete_time_entry: Unable to delete time log entry. + notice_issue_done_ratios_updated: Issue done ratios updated. + + error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" + error_scm_not_found: "The entry or revision was not found in the repository." + error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" + error_scm_annotate: "The entry does not exist or can not be annotated." + error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_delete_custom_field: Unable to delete custom field + error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." + error_can_not_remove_role: "This role is in use and can not be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' + error_can_not_archive_project: This project can not be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + error_unable_delete_issue_status: 'Unable to delete issue status' + error_unable_to_connect: "Unable to connect (%{value})" + warning_attachments_not_saved: "%{count} file(s) could not be saved." + + mail_subject_lost_password: "Вашата %{value} лозинка" + mail_body_lost_password: 'To change your password, click on the following link:' + mail_subject_register: "Your %{value} account activation" + mail_body_register: 'To activate your account, click on the following link:' + mail_body_account_information_external: "You can use your %{value} account to log in." + mail_body_account_information: Your account information + mail_subject_account_activation_request: "%{value} account activation request" + mail_body_account_activation_request: "Нов корисник (%{value}) е регистриран. The account is pending your approval:" + mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" + mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + + field_name: Име + field_description: Опис + field_summary: Краток опис + field_is_required: Задолжително + field_firstname: Име + field_lastname: Презиме + field_mail: Е-пошта + field_filename: Датотека + field_filesize: Големина + field_downloads: Превземања + field_author: Автор + field_created_on: Креиран + field_updated_on: Ажурирано + field_field_format: Формат + field_is_for_all: За сите проекти + field_possible_values: Можни вредности + field_regexp: Regular expression + field_min_length: Минимална должина + field_max_length: Максимална должина + field_value: Вредност + field_category: Категорија + field_title: Наслов + field_project: Проект + field_issue: Задача + field_status: Статус + field_notes: Белешки + field_is_closed: Задачата е затворена + field_is_default: Default value + field_tracker: Tracker + field_subject: Наслов + field_due_date: Краен рок + field_assigned_to: Доделена на + field_priority: Приоритет + field_fixed_version: Target version + field_user: Корисник + field_principal: Principal + field_role: Улога + field_homepage: Веб страна + field_is_public: Јавен + field_parent: Подпроект на + field_is_in_roadmap: Issues displayed in roadmap + field_login: Корисник + field_mail_notification: Известувања по e-пошта + field_admin: Администратор + field_last_login_on: Последна најава + field_language: Јазик + field_effective_date: Дата + field_password: Лозинка + field_new_password: Нова лозинка + field_password_confirmation: Потврда + field_version: Верзија + field_type: Тип + field_host: Хост + field_port: Порт + field_account: Account + field_base_dn: Base DN + field_attr_login: Login attribute + field_attr_firstname: Firstname attribute + field_attr_lastname: Lastname attribute + field_attr_mail: Email attribute + field_onthefly: Моментално (On-the-fly) креирање на корисници + field_start_date: Почеток + field_done_ratio: "% Завршено" + field_auth_source: Режим на автентикација + field_hide_mail: Криј ја мојата адреса на е-пошта + field_comments: Коментар + field_url: URL + field_start_page: Почетна страна + field_subproject: Подпроект + field_hours: Часови + field_activity: Активност + field_spent_on: Дата + field_identifier: Идентификатор + field_is_filter: Користи како филтер + field_issue_to: Поврзана задача + field_delay: Доцнење + field_assignable: На оваа улога може да се доделуваат задачи + field_redirect_existing_links: Пренасочи ги постоечките врски + field_estimated_hours: Проценето време + field_column_names: Колони + field_time_entries: Бележи време + field_time_zone: Временска зона + field_searchable: Може да се пребарува + field_default_value: Default value + field_comments_sorting: Прикажувај коментари + field_parent_title: Parent page + field_editable: Може да се уредува + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Содржина + field_group_by: Групирај ги резултатите според + field_sharing: Споделување + field_parent_issue: Parent task + + setting_app_title: Наслов на апликацијата + setting_app_subtitle: Поднаслов на апликацијата + setting_welcome_text: Текст за добредојде + setting_default_language: Default јазик + setting_login_required: Задолжителна автентикација + setting_self_registration: Само-регистрација + setting_attachment_max_size: Макс. големина на прилог + setting_issues_export_limit: Issues export limit + setting_mail_from: Emission email address + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Текстуални е-пораки (без HTML) + setting_host_name: Име на хост и патека + setting_text_formatting: Форматирање на текст + setting_wiki_compression: Компресија на историјата на вики + setting_feeds_limit: Feed content limit + setting_default_projects_public: Новите проекти се иницијално јавни + setting_autofetch_changesets: Autofetch commits + setting_sys_api_enabled: Enable WS for repository management + setting_commit_ref_keywords: Referencing keywords + setting_commit_fix_keywords: Fixing keywords + setting_autologin: Автоматска најава + setting_date_format: Формат на дата + setting_time_format: Формат на време + setting_cross_project_issue_relations: Дозволи релации на задачи меѓу проекти + setting_issue_list_default_columns: Default columns displayed on the issue list + setting_protocol: Протокол + setting_per_page_options: Objects per page options + setting_user_format: Приказ на корисниците + setting_activity_days_default: Денови прикажана во активноста на проектот + setting_display_subprojects_issues: Прикажи ги задачите на подпроектите во главните проекти + setting_enabled_scm: Овозможи SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API клуч + setting_sequential_project_identifiers: Генерирај последователни идентификатори на проекти + setting_gravatar_enabled: Користи Gravatar кориснички икони + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Max number of diff lines displayed + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Дозволи OpenID најава и регистрација + setting_password_min_length: Мин. должина на лозинка + setting_new_project_user_role_id: Улога доделена на неадминистраторски корисник кој креира проект + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + + permission_add_project: Креирај проекти + permission_add_subprojects: Креирај подпроекти + permission_edit_project: Уреди проект + permission_select_project_modules: Изберете модули за проект + permission_manage_members: Manage members + permission_manage_project_activities: Manage project activities + permission_manage_versions: Manage versions + permission_manage_categories: Manage issue categories + permission_view_issues: Прегледај задачи + permission_add_issues: Додавај задачи + permission_edit_issues: Уредувај задачи + permission_manage_issue_relations: Manage issue relations + permission_add_issue_notes: Додавај белешки + permission_edit_issue_notes: Уредувај белешки + permission_edit_own_issue_notes: Уредувај сопствени белешки + permission_move_issues: Преместувај задачи + permission_delete_issues: Бриши задачи + permission_manage_public_queries: Manage public queries + permission_save_queries: Save queries + permission_view_gantt: View gantt chart + permission_view_calendar: View calendar + permission_view_issue_watchers: View watchers list + permission_add_issue_watchers: Add watchers + permission_delete_issue_watchers: Delete watchers + permission_log_time: Бележи потрошено време + permission_view_time_entries: Прегледај потрошено време + permission_edit_time_entries: Уредувај белешки за потрошено време + permission_edit_own_time_entries: Уредувај сопствени белешки за потрошено време + permission_manage_news: Manage news + permission_comment_news: Коментирај на вести + permission_view_documents: Прегледувај документи + permission_manage_files: Manage files + permission_view_files: Прегледувај датотеки + permission_manage_wiki: Manage wiki + permission_rename_wiki_pages: Преименувај вики страници + permission_delete_wiki_pages: Бриши вики страници + permission_view_wiki_pages: Прегледувај вики + permission_view_wiki_edits: Прегледувај вики историја + permission_edit_wiki_pages: Уредувај вики страници + permission_delete_wiki_pages_attachments: Бриши прилози + permission_protect_wiki_pages: Заштитувај вики страници + permission_manage_repository: Manage repository + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Commit access + permission_manage_boards: Manage boards + permission_view_messages: View messages + permission_add_messages: Post messages + permission_edit_messages: Уредувај пораки + permission_edit_own_messages: Уредувај сопствени пораки + permission_delete_messages: Бриши пораки + permission_delete_own_messages: Бриши сопствени пораки + permission_export_wiki_pages: Export wiki pages + permission_manage_subtasks: Manage subtasks + + project_module_issue_tracking: Следење на задачи + project_module_time_tracking: Следење на време + project_module_news: Вести + project_module_documents: Документи + project_module_files: Датотеки + project_module_wiki: Вики + project_module_repository: Repository + project_module_boards: Форуми + project_module_calendar: Календар + project_module_gantt: Gantt + + label_user: Корисник + label_user_plural: Корисници + label_user_new: Нов корисник + label_user_anonymous: Анонимен + label_project: Проект + label_project_new: Нов проект + label_project_plural: Проекти + label_x_projects: + zero: нема проекти + one: 1 проект + other: "%{count} проекти" + label_project_all: Сите проекти + label_project_latest: Последните проекти + label_issue: Задача + label_issue_new: Нова задача + label_issue_plural: Задачи + label_issue_view_all: Прегледај ги сите задачи + label_issues_by: "Задачи по %{value}" + label_issue_added: Задачата е додадена + label_issue_updated: Задачата е ажурирана + label_document: Документ + label_document_new: Нов документ + label_document_plural: Документи + label_document_added: Документот е додаден + label_role: Улога + label_role_plural: Улоги + label_role_new: Нова улога + label_role_and_permissions: Улоги и овластувања + label_member: Член + label_member_new: Нов член + label_member_plural: Членови + label_tracker: Tracker + label_tracker_plural: Trackers + label_tracker_new: New tracker + label_workflow: Workflow + label_issue_status: Статус на задача + label_issue_status_plural: Статуси на задачи + label_issue_status_new: Нов статус + label_issue_category: Категорија на задача + label_issue_category_plural: Категории на задачи + label_issue_category_new: Нова категорија + label_custom_field: Прилагодено поле + label_custom_field_plural: Прилагодени полиња + label_custom_field_new: Ново прилагодено поле + label_enumerations: Enumerations + label_enumeration_new: Нова вредност + label_information: Информација + label_information_plural: Информации + label_please_login: Најави се + label_register: Регистрирај се + label_login_with_open_id_option: или најави се со OpenID + label_password_lost: Изгубена лозинка + label_home: Почетна + label_my_page: Мојата страна + label_my_account: Мојот профил + label_my_projects: Мои проекти + label_administration: Администрација + label_login: Најави се + label_logout: Одјави се + label_help: Помош + label_reported_issues: Пријавени задачи + label_assigned_to_me_issues: Задачи доделени на мене + label_last_login: Последна најава + label_registered_on: Регистриран на + label_activity: Активност + label_overall_activity: Севкупна активност + label_user_activity: "Активност на %{value}" + label_new: Нова + label_logged_as: Најавени сте како + label_environment: Опкружување + label_authentication: Автентикација + label_auth_source: Режим на автентикација + label_auth_source_new: Нов режим на автентикација + label_auth_source_plural: Режими на автентикација + label_subproject_plural: Подпроекти + label_subproject_new: Нов подпроект + label_and_its_subprojects: "%{value} и неговите подпроекти" + label_min_max_length: Мин. - Макс. должина + label_list: Листа + label_date: Дата + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Текст + label_text: Долг текст + label_attribute: Атрибут + label_attribute_plural: Атрибути + label_no_data: Нема податоци за прикажување + label_change_status: Промени статус + label_history: Историја + label_attachment: Датотека + label_attachment_new: Нова датотека + label_attachment_delete: Избриши датотека + label_attachment_plural: Датотеки + label_file_added: Датотеката е додадена + label_report: Извештај + label_report_plural: Извештаи + label_news: Новост + label_news_new: Додади новост + label_news_plural: Новости + label_news_latest: Последни новости + label_news_view_all: Прегледај ги сите новости + label_news_added: Новостта е додадена + label_settings: Settings + label_overview: Преглед + label_version: Верзија + label_version_new: Нова верзија + label_version_plural: Верзии + label_close_versions: Затвори ги завршените врзии + label_confirmation: Потврда + label_export_to: 'Достапно и во:' + label_read: Прочитај... + label_public_projects: Јавни проекти + label_open_issues: отворена + label_open_issues_plural: отворени + label_closed_issues: затворена + label_closed_issues_plural: затворени + label_x_open_issues_abbr: + zero: 0 отворени + one: 1 отворена + other: "%{count} отворени" + label_x_closed_issues_abbr: + zero: 0 затворени + one: 1 затворена + other: "%{count} затворени" + label_total: Вкупно + label_permissions: Овластувања + label_current_status: Моментален статус + label_new_statuses_allowed: Дозволени нови статуси + label_all: сите + label_none: ниеден + label_nobody: никој + label_next: Следно + label_previous: Претходно + label_used_by: Користено од + label_details: Детали + label_add_note: Додади белешка + label_calendar: Календар + label_months_from: месеци од + label_gantt: Gantt + label_internal: Internal + label_last_changes: "последни %{count} промени" + label_change_view_all: Прегледај ги сите промени + label_comment: Коментар + label_comment_plural: Коментари + label_x_comments: + zero: нема коментари + one: 1 коментар + other: "%{count} коментари" + label_comment_add: Додади коментар + label_comment_added: Коментарот е додаден + label_comment_delete: Избриши коментари + label_query: Custom query + label_query_plural: Custom queries + label_query_new: New query + label_filter_add: Додади филтер + label_filter_plural: Филтри + label_equals: е + label_not_equals: не е + label_in_less_than: за помалку од + label_in_more_than: за повеќе од + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: во + label_today: денес + label_all_time: цело време + label_yesterday: вчера + label_this_week: оваа недела + label_last_week: минатата недела + label_last_n_days: "последните %{count} дена" + label_this_month: овој месец + label_last_month: минатиот месец + label_this_year: оваа година + label_date_range: Date range + label_less_than_ago: пред помалку од денови + label_more_than_ago: пред повеќе од денови + label_ago: пред денови + label_contains: содржи + label_not_contains: не содржи + label_day_plural: денови + label_repository: Складиште + label_repository_plural: Складишта + label_browse: Прелистувај + label_branch: Гранка + label_tag: Tag + label_revision: Ревизија + label_revision_plural: Ревизии + label_revision_id: "Ревизија %{value}" + label_associated_revisions: Associated revisions + label_added: added + label_modified: modified + label_copied: copied + label_renamed: renamed + label_deleted: deleted + label_latest_revision: Последна ревизија + label_latest_revision_plural: Последни ревизии + label_view_revisions: Прегледај ги ревизиите + label_view_all_revisions: Прегледај ги сите ревизии + label_max_size: Макс. големина + label_sort_highest: Премести најгоре + label_sort_higher: Премести нагоре + label_sort_lower: Премести надоле + label_sort_lowest: Премести најдоле + label_roadmap: Roadmap + label_roadmap_due_in: "Due in %{value}" + label_roadmap_overdue: "Касни %{value}" + label_roadmap_no_issues: Нема задачи за оваа верзија + label_search: Барај + label_result_plural: Резултати + label_all_words: Сите зборови + label_wiki: Вики + label_wiki_edit: Вики уредување + label_wiki_edit_plural: Вики уредувања + label_wiki_page: Вики страница + label_wiki_page_plural: Вики страници + label_index_by_title: Индекс по наслов + label_index_by_date: Индекс по дата + label_current_version: Current version + label_preview: Preview + label_feed_plural: Feeds + label_changes_details: Детали за сите промени + label_issue_tracking: Следење на задачи + label_spent_time: Потрошено време + label_overall_spent_time: Вкупно потрошено време + label_f_hour: "%{value} час" + label_f_hour_plural: "%{value} часа" + label_time_tracking: Следење на време + label_change_plural: Промени + label_statistics: Статистики + label_commits_per_month: Commits per month + label_commits_per_author: Commits per author + label_view_diff: View differences + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: Опции + label_copy_workflow_from: Copy workflow from + label_permissions_report: Permissions report + label_watched_issues: Watched issues + label_related_issues: Поврзани задачи + label_applied_status: Applied status + label_loading: Loading... + label_relation_new: Нова релација + label_relation_delete: Избриши релација + label_relates_to: related to + label_duplicates: дупликати + label_duplicated_by: duplicated by + label_blocks: blocks + label_blocked_by: блокирано од + label_precedes: претходи + label_follows: следи + label_stay_logged_in: Останете најавени + label_disabled: disabled + label_show_completed_versions: Show completed versions + label_me: јас + label_board: Форум + label_board_new: Нов форум + label_board_plural: Форуми + label_board_locked: Заклучен + label_board_sticky: Sticky + label_topic_plural: Теми + label_message_plural: Пораки + label_message_last: Последна порака + label_message_new: Нова порака + label_message_posted: Поракате е додадена + label_reply_plural: Одговори + label_send_information: Испрати ги информациите за профилот на корисникот + label_year: Година + label_month: Месец + label_week: Недела + label_date_from: Од + label_date_to: До + label_language_based: Според јазикот на корисникот + label_sort_by: "Подреди според %{value}" + label_send_test_email: Испрати тест е-порака + label_feeds_access_key: Atom клуч за пристап + label_missing_feeds_access_key: Недостика Atom клуч за пристап + label_feeds_access_key_created_on: "Atom клучот за пристап креиран пред %{value}" + label_module_plural: Модули + label_added_time_by: "Додадено од %{author} пред %{age}" + label_updated_time_by: "Ажурирано од %{author} пред %{age}" + label_updated_time: "Ажурирано пред %{value}" + label_jump_to_a_project: Префрли се на проект... + label_file_plural: Датотеки + label_changeset_plural: Changesets + label_default_columns: Основни колони + label_no_change_option: (Без промена) + label_bulk_edit_selected_issues: Групно уредување на задачи + label_theme: Тема + label_default: Default + label_search_titles_only: Пребарувај само наслови + label_user_mail_option_all: "За било кој настан во сите мои проекти" + label_user_mail_option_selected: "За било кој настан само во избраните проекти..." + label_user_mail_no_self_notified: "Не ме известувај за промените што јас ги правам" + label_registration_activation_by_email: активација на профил преку е-пошта + label_registration_manual_activation: мануелна активација на профил + label_registration_automatic_activation: автоматска активација на профил + label_display_per_page: "По страна: %{value}" + label_age: Age + label_change_properties: Change properties + label_general: Општо + label_scm: SCM + label_plugins: Додатоци + label_ldap_authentication: LDAP автентикација + label_downloads_abbr: Превземања + label_optional_description: Опис (незадолжително) + label_add_another_file: Додади уште една датотека + label_preferences: Preferences + label_chronological_order: Во хронолошки ред + label_reverse_chronological_order: In reverse chronological order + label_incoming_emails: Дојдовни е-пораки + label_generate_key: Генерирај клуч + label_issue_watchers: Watchers + label_example: Пример + label_display: Прикажи + label_sort: Подреди + label_ascending: Растечки + label_descending: Опаѓачки + label_date_from_to: Од %{start} до %{end} + label_wiki_content_added: Вики страница додадена + label_wiki_content_updated: Вики страница ажурирана + label_group: Група + label_group_plural: Групи + label_group_new: Нова група + label_time_entry_plural: Потрошено време + label_version_sharing_none: Не споделено + label_version_sharing_descendants: Со сите подпроекти + label_version_sharing_hierarchy: Со хиерархијата на проектот + label_version_sharing_tree: Со дрвото на проектот + label_version_sharing_system: Со сите проекти + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Извор + label_copy_target: Дестинација + label_copy_same_as_target: Исто како дестинацијата + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API клуч за пристап + label_missing_api_access_key: Недостига API клуч за пристап + label_api_access_key_created_on: "API клучот за пристап е креиран пред %{value}" + label_profile: Профил + label_subtask_plural: Подзадачи + label_project_copy_notifications: Праќај известувања по е-пошта при копирање на проект + + button_login: Најави се + button_submit: Испрати + button_save: Зачувај + button_check_all: Штиклирај ги сите + button_uncheck_all: Одштиклирај ги сите + button_delete: Избриши + button_create: Креирај + button_create_and_continue: Креирај и продолжи + button_test: Тест + button_edit: Уреди + button_add: Додади + button_change: Промени + button_apply: Примени + button_clear: Избриши + button_lock: Заклучи + button_unlock: Отклучи + button_download: Превземи + button_list: List + button_view: Прегледај + button_move: Премести + button_move_and_follow: Премести и следи + button_back: Back + button_cancel: Откажи + button_activate: Активирај + button_sort: Подреди + button_log_time: Бележи време + button_rollback: Rollback to this version + button_watch: Следи + button_unwatch: Не следи + button_reply: Одговори + button_archive: Архивирај + button_unarchive: Одархивирај + button_reset: Reset + button_rename: Преименувај + button_change_password: Промени лозинка + button_copy: Копирај + button_copy_and_follow: Копирај и следи + button_annotate: Annotate + button_update: Ажурирај + button_configure: Конфигурирај + button_quote: Цитирај + button_duplicate: Копирај + button_show: Show + + status_active: активни + status_registered: регистрирани + status_locked: заклучени + + version_status_open: отворени + version_status_locked: заклучени + version_status_closed: затворени + + field_active: Active + + text_select_mail_notifications: Изберете за кои настани да се праќаат известувања по е-пошта да се праќаат. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 значи без ограничување + text_project_destroy_confirmation: Дали сте сигурни дека сакате да го избришете проектот и сите поврзани податоци? + text_subprojects_destroy_warning: "Неговите подпроекти: %{value} исто така ќе бидат избришани." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Дали сте сигурни? + text_journal_changed: "%{label} променето од %{old} во %{new}" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} избришан (%{old})" + text_journal_added: "%{label} %{value} додаден" + text_tip_issue_begin_day: задачи што почнуваат овој ден + text_tip_issue_end_day: задачи што завршуваат овој ден + text_tip_issue_begin_end_day: задачи што почнуваат и завршуваат овој ден + text_caracters_maximum: "%{count} знаци максимум." + text_caracters_minimum: "Мора да е најмалку %{count} знаци долго." + text_length_between: "Должина помеѓу %{min} и %{max} знаци." + text_tracker_no_workflow: No workflow defined for this tracker + text_unallowed_characters: Недозволени знаци + text_comma_separated: Дозволени се повеќе вредности (разделени со запирка). + text_line_separated: Дозволени се повеќе вредности (една линија за секоја вредност). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Задачата %{id} е пријавена од %{author}." + text_issue_updated: "Задачата %{id} е ажурирана од %{author}." + text_wiki_destroy_confirmation: Дали сте сигурни дека сакате да го избришете ова вики и целата негова содржина? + text_issue_category_destroy_question: "Некои задачи (%{count}) се доделени на оваа категорија. Што сакате да правите?" + text_issue_category_destroy_assignments: Remove category assignments + text_issue_category_reassign_to: Додели ги задачите на оваа категорија + text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Load the default configuration + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Дали сте сигурни дека сакате да ги избришете избраните задачи?' + text_select_project_modules: 'Изберете модули за овој проект:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Во папката за прилози може да се запишува + text_plugin_assets_writable: Во папката за додатоци може да се запишува + text_rmagick_available: RMagick available (незадолжително) + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do ?" + text_destroy_time_entries: Delete reported hours + text_assign_time_entries_to_project: Додели ги пријавените часови на проектот + text_reassign_time_entries: 'Reassign reported hours to this issue:' + text_user_wrote: "%{value} напиша:" + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_email_delivery_not_configured: "Доставата по е-пошта не е конфигурирана, и известувањата се оневозможени.\nКонфигурирајте го Вашиот SMTP сервер во config/configuration.yml и рестартирајте ја апликацијата." + text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + text_zoom_in: Zoom in + text_zoom_out: Zoom out + + default_role_manager: Менаџер + default_role_developer: Developer + default_role_reporter: Reporter + default_tracker_bug: Грешка + default_tracker_feature: Функционалност + default_tracker_support: Поддршка + default_issue_status_new: Нова + default_issue_status_in_progress: Во прогрес + default_issue_status_resolved: Разрешена + default_issue_status_feedback: Feedback + default_issue_status_closed: Затворена + default_issue_status_rejected: Одбиена + default_doc_category_user: Корисничка документација + default_doc_category_tech: Техничка документација + default_priority_low: Низок + default_priority_normal: Нормален + default_priority_high: Висок + default_priority_urgent: Итно + default_priority_immediate: Веднаш + default_activity_design: Дизајн + default_activity_development: Развој + + enumeration_issue_priorities: Приоритети на задача + enumeration_doc_categories: Категории на документ + enumeration_activities: Активности (следење на време) + enumeration_system_activity: Системска активност + + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 Задача + one: 1 Задача + other: "%{count} Задачи" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: сите + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Со сите подпроекти + label_cross_project_tree: Со дрвото на проектот + label_cross_project_hierarchy: Со хиерархијата на проектот + label_cross_project_system: Со сите проекти + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Вкупно + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_footer: Email footer + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Е-пошта + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Вкупно потрошено време + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API клуч + setting_lost_password: Изгубена лозинка + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/mn.yml b/config/locales/mn.yml new file mode 100644 index 0000000..d608b08 --- /dev/null +++ b/config/locales/mn.yml @@ -0,0 +1,1231 @@ +mn: + direction: ltr + jquery: + locale: "en" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y/%m/%d" + short: "%b %d" + long: "%Y, %B %d" + + day_names: [Даваа, Мягмар, Лхагва, Пүрэв, Баасан, Бямба, Ням] + abbr_day_names: [Дав, Мяг, Лха, Пүр, Бсн, Бям, Ням] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 1-р сар, 2-р сар, 3-р сар, 4-р сар, 5-р сар, 6-р сар, 7-р сар, 8-р сар, 9-р сар, 10-р сар, 11-р сар, 12-р сар] + abbr_month_names: [~, 1сар, 2сар, 3сар, 4сар, 5сар, 6сар, 7сар, 8сар, 9сар, 10сар, 11сар, 12сар] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%Y/%m/%d %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%Y, %B %d %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "хагас минут" + less_than_x_seconds: + one: "секунд орчим" + other: "%{count} секундээс бага хугацаа" + x_seconds: + one: "1 секунд" + other: "%{count} секунд" + less_than_x_minutes: + one: "минутаас бага хугацаа" + other: "%{count} минутаас бага хугацаа" + x_minutes: + one: "1 минут" + other: "%{count} минут" + about_x_hours: + one: "1 цаг орчим" + other: "ойролцоогоор %{count} цаг" + x_hours: + one: "1 цаг" + other: "%{count} цаг" + x_days: + one: "1 өдөр" + other: "%{count} өдөр" + about_x_months: + one: "1 сар орчим" + other: "ойролцоогоор %{count} сар" + x_months: + one: "1 сар" + other: "%{count} сар" + about_x_years: + one: "ойролцоогоор 1 жил" + other: "ойролцоогоор %{count} жил" + over_x_years: + one: "1 жилээс их" + other: "%{count} жилээс их" + almost_x_years: + one: "бараг 1 жил" + other: "бараг %{count} жил" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Байт" + other: "Байт" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "бас" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "жагсаалтад заагдаагүй байна" + exclusion: "нөөцлөгдсөн" + invalid: "буруу" + confirmation: "баталгаажсан өгөгдөлтэй таарахгүй байна" + accepted: "хүлээж авах ёстой" + empty: "хоосон байж болохгүй" + blank: "бланк байж болохгүй" + too_long: "дэндүү урт байна (хамгийн ихдээ %{count} тэмдэгт)" + too_short: "дэндүү богино байна (хамгийн багадаа %{count} тэмдэгт)" + wrong_length: "буруу урттай байна (заавал %{count} тэмдэгт)" + taken: "аль хэдийнэ авсан байна" + not_a_number: "тоо биш байна" + not_a_date: "зөв огноо биш байна" + greater_than: "%{count} их байх ёстой" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "заавал сондгой" + even: "заавал тэгш" + greater_than_start_date: "must be greater than start date" + not_same_project: "нэг ижил төсөлд хамаарахгүй байна" + circular_dependency: "Энэ харьцаа нь гинжин(рекурсив) харьцаа үүсгэх юм байна" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Сонгоно уу + + general_text_No: 'Үгүй' + general_text_Yes: 'Тийм' + general_text_no: 'үгүй' + general_text_yes: 'тийм' + general_lang_name: 'Mongolian (Монгол)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_updated: Дансыг амжилттай өөрчиллөө. + notice_account_invalid_credentials: Хэрэглэгчийн нэр эсвэл нууц үг буруу байна + notice_account_password_updated: Нууц үгийг амжилттай өөрчиллөө. + notice_account_wrong_password: Буруу нууц үг + notice_account_register_done: Шинэ хэрэглэгч амжилттай үүсгэлээ. Идэвхжүүлэхийн тулд, бидний тань луу илгээсэн мэйл дотор байгаа холбоос дээр дараарай. + notice_account_unknown_email: Үл мэдэгдэх хэрэглэгч. + notice_can_t_change_password: Энэ эрх гадаад нэвтрэлтэд ашигладаг учраас нууц үгийг өөрчлөх боломжгүй. + notice_account_lost_email_sent: Бид таньд мэйлээр нууц үгээ өөрчлөх зааврыг илгээсэн байгаа. + notice_account_activated: Таны данс идэвхжлээ. Одоо нэвтэрч орж болно. + notice_successful_create: Амжилттай үүсгэлээ. + notice_successful_update: Амжилттай өөрчиллөө. + notice_successful_delete: Амжилттай устгалаа. + notice_successful_connection: Амжилттай холбогдлоо. + notice_file_not_found: Таны үзэх гэсэн хуудас байхгүй юмуу устгагдсан байна. + notice_locking_conflict: Өгөгдлийг өөр хүн өөрчилсөн байна. + notice_not_authorized: Танд энэ хуудсыг үзэх эрх байхгүй байна. + notice_email_sent: "%{value} - руу мэйл илгээлээ" + notice_email_error: "Мэйл илгээхэд алдаа гарлаа (%{value})" + notice_feeds_access_key_reseted: Таны Atom хандалтын түлхүүрийг дахин эхлүүллээ. + notice_api_access_key_reseted: Your API access key was reset. + notice_failed_to_save_issues: "%{total} асуудал сонгогдсоноос %{count} асуудлыг нь хадгалахад алдаа гарлаа: %{ids}." + notice_no_issue_selected: "Ямар ч асуудал сонгогдоогүй байна! Засварлах асуудлуудаа сонгоно уу." + notice_account_pending: "Таны дансыг үүсгэж дууслаа, администратор баталгаажуулах хүртэл хүлээнэ үү." + notice_default_data_loaded: Стандарт тохиргоог амжилттай ачааллаа. + notice_unable_delete_version: Хувилбарыг устгах боломжгүй. + notice_issue_done_ratios_updated: Issue done ratios updated. + + error_can_t_load_default_data: "Стандарт тохиргоог ачаалж чадсангүй: %{value}" + error_scm_not_found: "Repository дотор тухайн бичлэг эсвэл хувилбарыг олсонгүй." + error_scm_command_failed: "Repository-д хандахад алдаа гарлаа: %{value}" + error_scm_annotate: "Бичлэг байхгүй байна, эсвэл бичлэгт тайлбар хавсаргаж болохгүй." + error_issue_not_found_in_project: 'Сонгосон асуудал энэ төсөлд хамаардаггүй юм уу эсвэл системд байхгүй байна.' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' + error_can_not_archive_project: This project can not be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + + warning_attachments_not_saved: "%{count} file(s) файлыг хадгалж чадсангүй." + + mail_subject_lost_password: "Таны %{value} нууц үг" + mail_body_lost_password: 'Нууц үгээ өөрчлөхийн тулд доорх холбоос дээр дарна уу:' + mail_subject_register: "Таны %{value} дансыг идэвхжүүлэх" + mail_body_register: 'Дансаа идэвхжүүлэхийн тулд доорх холбоос дээр дарна уу:' + mail_body_account_information_external: "Та өөрийнхөө %{value} дансыг ашиглаж холбогдож болно." + mail_body_account_information: Таны дансны тухай мэдээлэл + mail_subject_account_activation_request: "%{value} дансыг идэвхжүүлэх хүсэлт" + mail_body_account_activation_request: "Шинэ хэрэглэгч (%{value}) бүртгүүлсэн байна. Таны баталгаажуулахыг хүлээж байна:" + mail_subject_reminder: "Дараагийн өдрүүдэд %{count} асуудлыг шийдэх хэрэгтэй (%{days})" + mail_body_reminder: "Танд оноогдсон %{count} асуудлуудыг дараагийн %{days} өдрүүдэд шийдэх хэрэгтэй:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + + field_name: Нэр + field_description: Тайлбар + field_summary: Дүгнэлт + field_is_required: Зайлшгүй + field_firstname: Таны нэр + field_lastname: Овог + field_mail: Имэйл + field_filename: Файл + field_filesize: Хэмжээ + field_downloads: Татаж авах зүйлс + field_author: Зохиогч + field_created_on: Үүссэн + field_updated_on: Өөрчилсөн + field_field_format: Формат + field_is_for_all: Бүх төслийн хувьд + field_possible_values: Боломжтой утгууд + field_regexp: Энгийн илэрхийлэл + field_min_length: Минимум урт + field_max_length: Максимум урт + field_value: Утга + field_category: Төрөл + field_title: Гарчиг + field_project: Төсөл + field_issue: Асуудал + field_status: Төлөв + field_notes: Тэмдэглэлүүд + field_is_closed: Асуудал хаагдсан + field_is_default: Стандарт утга + field_tracker: Чиглэл + field_subject: Гарчиг + field_due_date: Дуусах огноо + field_assigned_to: Оноогдсон + field_priority: Зэрэглэл + field_fixed_version: Хувилбар + field_user: Хэрэглэгч + field_role: Хандалтын эрх + field_homepage: Нүүр хуудас + field_is_public: Олон нийтийн + field_parent: Эцэг төсөл нь + field_is_in_roadmap: Асуудлуудыг явцын зураг дээр харуулах + field_login: Нэвтрэх нэр + field_mail_notification: Имэйл мэдэгдлүүд + field_admin: Администратор + field_last_login_on: Сүүлийн холбоо + field_language: Хэл + field_effective_date: Огноо + field_password: Нууц үг + field_new_password: Шннэ нууц үг + field_password_confirmation: Баталгаажуулах + field_version: Хувилбар + field_type: Төрөл + field_host: Хост + field_port: Порт + field_account: Данс + field_base_dn: Үндсэн ДН + field_attr_login: Нэвтрэх аттрибут + field_attr_firstname: Таны нэр аттрибут + field_attr_lastname: Овог аттрибут + field_attr_mail: Имэйл аттрибут + field_onthefly: Хүссэн үедээ хэрэглэгч үүсгэх + field_start_date: Эхлэл + field_done_ratio: "%% Гүйцэтгэсэн" + field_auth_source: Нэвтрэх арга + field_hide_mail: Миний имэйл хаягийг нуу + field_comments: Тайлбар + field_url: URL Хаяг + field_start_page: Тэргүүн хуудас + field_subproject: Дэд төсөл + field_hours: Цаг + field_activity: Үйл ажиллагаа + field_spent_on: Огноо + field_identifier: Төслийн глобал нэр + field_is_filter: Шүүлтүүр болгон хэрэглэгддэг + field_issue_to: Хамаатай асуудал + field_delay: Хоцролт + field_assignable: Энэ хандалтын эрхэд асуудлуудыг оноож өгч болно + field_redirect_existing_links: Байгаа холбоосуудыг дахин чиглүүлэх + field_estimated_hours: Барагцаалсан цаг + field_column_names: Баганууд + field_time_zone: Цагын бүс + field_searchable: Хайж болох + field_default_value: Стандарт утга + field_comments_sorting: Тайлбаруудыг харуул + field_parent_title: Эцэг хуудас + field_editable: Засварлагдана + field_watcher: Харна + field_identity_url: OpenID URL + field_content: Агуулга + field_group_by: Үр дүнгээр бүлэглэх + field_sharing: Sharing + + setting_app_title: Программын гарчиг + setting_app_subtitle: Программын дэд гарчиг + setting_welcome_text: Мэндчилгээ + setting_default_language: Стандарт хэл + setting_login_required: Нэвтрэх шаардлагатай + setting_self_registration: Өөрийгөө бүртгүүлэх + setting_attachment_max_size: Хавсралт файлын дээд хэмжээ + setting_issues_export_limit: Асуудал экспортлох хязгаар + setting_mail_from: Ямар имэйл хаяг үүсгэх + setting_bcc_recipients: BCC талбарын хаягууд (bcc) + setting_plain_text_mail: дан текст мэйл (HTML биш) + setting_host_name: Хостын нэр болон зам + setting_text_formatting: Текст хэлбэржүүлэлт + setting_wiki_compression: Вики хуудсуудын түүх дээр шахалт хийх + setting_feeds_limit: Фийд агуулгын хязгаар + setting_default_projects_public: Шинэ төслүүд автоматаар олон нийтийнх байна + setting_autofetch_changesets: Комитуудыг автоматаар татаж авах + setting_sys_api_enabled: Репозитори менежментэд зориулан WS-ийг идэвхжүүлэх + setting_commit_ref_keywords: Хамааруулах түлхүүр үгс + setting_commit_fix_keywords: Зоолттой түлхүүр үгс + setting_autologin: Компьютер дээр санах + setting_date_format: Огнооны формат + setting_time_format: Цагийн формат + setting_cross_project_issue_relations: Төсөл хооронд асуудал хамааруулахыг зөвшөөрөх + setting_issue_list_default_columns: Асуудлуудыг харуулах стандарт баганууд + setting_emails_footer: Имэйлүүдийн хөл хэсэг + setting_protocol: Протокол + setting_per_page_options: Нэг хуудсанд байх обьектуудын тохиргоо + setting_user_format: Хэрэглэгчдийг харуулах формат + setting_activity_days_default: Төслийн үйл ажиллагаа хэсэгт үзүүлэх өдрийн тоо + setting_display_subprojects_issues: Дэд төслүүдийн асуудлуудыг автоматаар гол төсөл дээр харуулах + setting_enabled_scm: SCM - ийг идэвхжүүлэх + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Ирсэн мэйлүүдийн хувьд WS-ийг идэвхжүүлэх + setting_mail_handler_api_key: API түлхүүр + setting_sequential_project_identifiers: Дэс дараалсан төслийн глобал нэр үүсгэж байх + setting_gravatar_enabled: Gravatar дүрсүүдийг хэрэглэгчдэд хэрэглэж байх + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Ялгаатай мөрүүдийн тоо (дээд тал нь) + setting_file_max_size_displayed: Max size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + + permission_add_project: Create project + permission_add_subprojects: Create subprojects + permission_edit_project: Төслийг засварлах + permission_select_project_modules: Төслийн модулуудийг сонгоно уу + permission_manage_members: Системийн хэрэглэгчид + permission_manage_project_activities: Manage project activities + permission_manage_versions: Хувилбарууд + permission_manage_categories: Асуудлын ангиллууд + permission_view_issues: Асуудлуудыг харах + permission_add_issues: Асуудлууд нэмэх + permission_edit_issues: Асуудлуудыг засварлах + permission_manage_issue_relations: Асуудлын хамаарлыг зохицуулах + permission_add_issue_notes: Тэмдэглэл нэмэх + permission_edit_issue_notes: Тэмдэглэлүүд засварлах + permission_edit_own_issue_notes: Өөрийн үлдээсэн тэмдэглэлүүдийг засварлах + permission_move_issues: Асуудлуудыг зөөх + permission_delete_issues: Асуудлуудыг устгах + permission_manage_public_queries: Олон нийтийн асуултууд + permission_save_queries: Асуултуудыг хадгалах + permission_view_gantt: Гант диаграмыг үзэх + permission_view_calendar: Календарь үзэх + permission_view_issue_watchers: Ажиглагчдын жагсаалтыг харах + permission_add_issue_watchers: Ажиглагчид нэмэх + permission_delete_issue_watchers: Ажиглагчдыг устгах + permission_log_time: Зарцуулсан хугацааг лог хийх + permission_view_time_entries: Зарцуулсан хугацааг харах + permission_edit_time_entries: Хугацааны логуудыг засварлах + permission_edit_own_time_entries: Өөрийн хугацааны логуудыг засварлах + permission_manage_news: Мэдээ мэдээллүүд + permission_comment_news: Мэдээнд тайлбар үлдээх + permission_view_documents: Бичиг баримтуудыг харах + permission_manage_files: Файлууд + permission_view_files: Файлуудыг харах + permission_manage_wiki: Вики удирдах + permission_rename_wiki_pages: Вики хуудсуудыг дахиж нэрлэх + permission_delete_wiki_pages: Вики хуудсуудыг устгах + permission_view_wiki_pages: Вики үзэх + permission_view_wiki_edits: Вики түүх үзэх + permission_edit_wiki_pages: Вики хуудсуудыг засварлах + permission_delete_wiki_pages_attachments: Хавсралтуудыг устгах + permission_protect_wiki_pages: Вики хуудсуудыг хамгаалах + permission_manage_repository: Репозитори + permission_browse_repository: Репозиторийг үзэх + permission_view_changesets: Өөрчлөлтүүдийг харах + permission_commit_access: Коммит хандалт + permission_manage_boards: Самбарууд + permission_view_messages: Зурвасуудыг харах + permission_add_messages: Зурвас илгээх + permission_edit_messages: Зурвасуудыг засварлах + permission_edit_own_messages: Өөрийн зурвасуудыг засварлах + permission_delete_messages: Зурвасуудыг устгах + permission_delete_own_messages: Өөрийн зурвасуудыг устгах + permission_export_wiki_pages: Вики хуудсуудыг экспорт хийх + + project_module_issue_tracking: Асуудал хянах + project_module_time_tracking: Хугацаа хянах + project_module_news: Мэдээ мэдээллүүд + project_module_documents: Бичиг баримтууд + project_module_files: Файлууд + project_module_wiki: Вики + project_module_repository: Репозитори + project_module_boards: Самбарууд + + label_user: Хэрэглэгч + label_user_plural: Хэрэглэгчид + label_user_new: Шинэ хэрэглэгч + label_user_anonymous: Хамаагүй хэрэглэгч + label_project: Төсөл + label_project_new: Шинэ төсөл + label_project_plural: Төслүүд + label_x_projects: + zero: төсөл байхгүй + one: 1 төсөл + other: "%{count} төслүүд" + label_project_all: Бүх Төслүүд + label_project_latest: Сүүлийн үеийн төслүүд + label_issue: Асуудал + label_issue_new: Шинэ асуудал + label_issue_plural: Асуудлууд + label_issue_view_all: Бүх асуудлуудыг харах + label_issues_by: "%{value} - н асуудлууд" + label_issue_added: Асуудал нэмэгдлээ + label_issue_updated: Асуудал өөрчлөгдлөө + label_document: Бичиг баримт + label_document_new: Шинэ бичиг баримт + label_document_plural: Бичиг баримтууд + label_document_added: Бичиг баримт нэмэгдлээ + label_role: Хандалтын эрх + label_role_plural: Хандалтын эрхүүд + label_role_new: Шинэ хандалтын эрх + label_role_and_permissions: Хандалтын эрхүүд болон зөвшөөрлүүд + label_member: Гишүүн + label_member_new: Шинэ гишүүн + label_member_plural: Гишүүд + label_tracker: Чиглэл + label_tracker_plural: Чиглэлүүд + label_tracker_new: Шинэ чиглэл + label_workflow: Ажлын дараалал + label_issue_status: Асуудлын төлөв + label_issue_status_plural: Асуудлын төлвүүд + label_issue_status_new: Шинэ төлөв + label_issue_category: Асуудлын ангилал + label_issue_category_plural: Асуудлын ангиллууд + label_issue_category_new: Шинэ ангилал + label_custom_field: Хэрэглэгчийн тодорхойлсон талбар + label_custom_field_plural: Хэрэглэгчийн тодорхойлсон талбарууд + label_custom_field_new: Шинээр хэрэглэгчийн тодорхойлсон талбар үүсгэх + label_enumerations: Ангиллууд + label_enumeration_new: Шинэ утга + label_information: Мэдээлэл + label_information_plural: Мэдээллүүд + label_please_login: Нэвтэрч орно уу + label_register: Бүртгүүлэх + label_login_with_open_id_option: or login with OpenID + label_password_lost: Нууц үгээ алдсан + label_home: Нүүр + label_my_page: Миний хуудас + label_my_account: Миний данс + label_my_projects: Миний төслүүд + label_administration: Админ хэсэг + label_login: Нэвтрэх + label_logout: Гарах + label_help: Тусламж + label_reported_issues: Мэдэгдсэн асуудлууд + label_assigned_to_me_issues: Надад оноогдсон асуудлууд + label_last_login: Сүүлийн холболт + label_registered_on: Бүртгүүлсэн огноо + label_activity: Үйл ажиллагаа + label_overall_activity: Ерөнхий үйл ажиллагаа + label_user_activity: "%{value}-ийн үйл ажиллагаа" + label_new: Шинэ + label_logged_as: Холбогдсон нэр + label_environment: Орчин + label_authentication: Нэвтрэх + label_auth_source: Нэвтрэх арга + label_auth_source_new: Шинэ нэвтрэх арга + label_auth_source_plural: Нэвтрэх аргууд + label_subproject_plural: Дэд төслүүд + label_subproject_new: Шинэ дэд төсөл + label_and_its_subprojects: "%{value} болон холбогдох дэд төслүүд" + label_min_max_length: Дээд - Доод урт + label_list: Жагсаалт + label_date: Огноо + label_integer: Бүхэл тоо + label_float: Бутархай тоо + label_boolean: Үнэн худал утга + label_string: Текст + label_text: Урт текст + label_attribute: Аттрибут + label_attribute_plural: Аттрибутууд + label_no_data: Үзүүлэх өгөгдөл байхгүй байна + label_change_status: Төлвийг өөрчлөх + label_history: Түүх + label_attachment: Файл + label_attachment_new: Шинэ файл + label_attachment_delete: Файл устгах + label_attachment_plural: Файлууд + label_file_added: Файл нэмэгдлээ + label_report: Тайлан + label_report_plural: Тайлангууд + label_news: Мэдээ + label_news_new: Шинэ мэдээ + label_news_plural: Мэдээ + label_news_latest: Сүүлийн үеийн мэдээнүүд + label_news_view_all: Бүх мэдээг харах + label_news_added: Мэдээ нэмэгдлээ + label_settings: Тохиргоо + label_overview: Эхлэл + label_version: Хувилбар + label_version_new: Шинэ хувилбар + label_version_plural: Хувилбарууд + label_close_versions: Гүйцэт хувилбаруудыг хаалаа + label_confirmation: Баталгаажуулах + label_export_to: 'Өөр авч болох формат:' + label_read: Унших... + label_public_projects: Олон нийтийн төслүүд + label_open_issues: нээлттэй + label_open_issues_plural: нээлттэй + label_closed_issues: хаалттай + label_closed_issues_plural: хаалттай + label_x_open_issues_abbr: + zero: 0 нээлттэй + one: 1 нээлттэй + other: "%{count} нээлттэй" + label_x_closed_issues_abbr: + zero: 0 хаалттай + one: 1 хаалттай + other: "%{count} хаалттай" + label_total: Нийт + label_permissions: Зөвшөөрлүүд + label_current_status: Одоогийн төлөв + label_new_statuses_allowed: Шинээр олгож болох төлвүүд + label_all: бүгд + label_none: хоосон + label_nobody: хэн ч биш + label_next: Дараагийн + label_previous: Өмнөх + label_used_by: Хэрэглэгддэг + label_details: Дэлгэрэнгүй + label_add_note: Тэмдэглэл нэмэх + label_calendar: Календарь + label_months_from: Саруудыг хаанаас + label_gantt: Гант диаграм + label_internal: Дотоод + label_last_changes: "сүүлийн %{count} өөрчлөлтүүд" + label_change_view_all: Бүх өөрчлөлтүүдийг харах + label_comment: Тайлбар + label_comment_plural: Тайлбарууд + label_x_comments: + zero: сэтгэгдэл байхгүй + one: 1 сэтгэгдэлтэй + other: "%{count} сэтгэгдэлтэй" + label_comment_add: Тайлбар нэмэх + label_comment_added: Тайлбар нэмэгдлээ + label_comment_delete: Тайлбарууд устгах + label_query: Хэрэглэгчийн тодорхойлсон асуулт + label_query_plural: Хэрэглэгчийн тодорхойлсон асуултууд + label_query_new: Шинээр хэрэглэгчийн тодорхойлсон асуулт үүсгэх + label_filter_add: Шүүлтүүр нэмэх + label_filter_plural: Шүүлтүүрүүд + label_equals: бол + label_not_equals: биш + label_in_less_than: аас бага + label_in_more_than: аас их + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: дотор + label_today: өнөөдөр + label_all_time: бүх хугацаа + label_yesterday: өчигдөр + label_this_week: энэ долоо хоног + label_last_week: өнгөрсөн долоо хоног + label_last_n_days: "сүүлийн %{count} өдрүүд" + label_this_month: энэ сар + label_last_month: сүүлийн сар + label_this_year: энэ жил + label_date_range: Хязгаар огноо + label_less_than_ago: бага өдрийн дотор + label_more_than_ago: их өдрийн дотор + label_ago: өдрийн өмнө + label_contains: агуулж байгаа + label_not_contains: агуулаагүй + label_day_plural: өдрүүд + label_repository: Репозитори + label_repository_plural: Репозиторууд + label_browse: Үзэх + label_branch: Салбар + label_tag: Шошго + label_revision: Хувилбар + label_revision_plural: Хувилбарууд + label_revision_id: "%{value} Хувилбар" + label_associated_revisions: Хамааралтай хувилбарууд + label_added: нэмэгдсэн + label_modified: өөрчлөгдсөн + label_copied: хуулсан + label_renamed: нэрийг нь өөрчилсөн + label_deleted: устгасан + label_latest_revision: Сүүлийн үеийн хувилбар + label_latest_revision_plural: Сүүлийн үеийн хувилбарууд + label_view_revisions: Хувилбаруудыг харах + label_view_all_revisions: Бүх хувилбаруудыг харах + label_max_size: Maximum size + label_sort_highest: Хамгийн дээр + label_sort_higher: Дээш нь + label_sort_lower: Доош нь + label_sort_lowest: Хамгийн доор + label_roadmap: Хөтөч + label_roadmap_due_in: "%{value} дотор дуусгах" + label_roadmap_overdue: "%{value} оройтсон" + label_roadmap_no_issues: Энэ хувилбарт асуудал байхгүй байна + label_search: Хайх + label_result_plural: Үр дүн + label_all_words: Бүх үгс + label_wiki: Вики + label_wiki_edit: Вики засвар + label_wiki_edit_plural: Вики засварууд + label_wiki_page: Вики хуудас + label_wiki_page_plural: Вики хуудас + label_index_by_title: Гарчгаар эрэмбэлэх + label_index_by_date: Огноогоор эрэмбэлэх + label_current_version: Одоогийн хувилбар + label_preview: Ямар харагдахыг шалгах + label_feed_plural: Feeds + label_changes_details: Бүх өөрчлөлтүүдийн дэлгэрэнгүй + label_issue_tracking: Асуудал хянах + label_spent_time: Зарцуулсан хугацаа + label_f_hour: "%{value} цаг" + label_f_hour_plural: "%{value} цаг" + label_time_tracking: Хугацааг хянах + label_change_plural: Өөрчлөлтүүд + label_statistics: Статистик + label_commits_per_month: Сард хийсэн коммитын тоо + label_commits_per_author: Зохиогч бүрийн хувьд коммитын тоо + label_view_diff: Ялгаануудыг харах + label_diff_inline: дотор нь + label_diff_side_by_side: зэрэгцүүлж + label_options: Тохиргоо + label_copy_workflow_from: Ажлын дарааллыг хуулах + label_permissions_report: Зөвшөөрлүүдийн таблиц + label_watched_issues: Ажиглагдаж байгаа асуудлууд + label_related_issues: Хамааралтай асуудлууд + label_applied_status: Олгосон төлөв + label_loading: Ачаалж байна... + label_relation_new: Шинэ хамаарал + label_relation_delete: Хамаарлыг устгах + label_relates_to: энгийн хамааралтай + label_duplicates: хос хамааралтай + label_duplicated_by: давхардуулсан эзэн + label_blocks: шаардах хамааралтай + label_blocked_by: блоколсон эзэн + label_precedes: урьдчилах хамааралтай + label_follows: дагаж + label_stay_logged_in: Энэ комьютер дээр санах + label_disabled: идэвхгүй болсон + label_show_completed_versions: Гүйцэд хувилбаруудыг харуулах + label_me: би + label_board: Форум + label_board_new: Шинэ форум + label_board_plural: Форумууд + label_board_locked: Түгжээтэй + label_board_sticky: Sticky + label_topic_plural: Сэдвүүд + label_message_plural: Зурвасууд + label_message_last: Сүүлийн зурвас + label_message_new: Шинэ зурвас + label_message_posted: Зурвас нэмэгдлээ + label_reply_plural: Хариултууд + label_send_information: Дансны мэдээллийг хэрэглэгчид илгээх + label_year: Жил + label_month: Сар + label_week: Долоо хоног + label_date_from: Хэзээнээс + label_date_to: Хэдий хүртэл + label_language_based: Хэрэглэгчийн хэлнас шалтгаалан + label_sort_by: "%{value} талбараар нь эрэмбэлэх" + label_send_test_email: Турших мэйл илгээх + label_feeds_access_key: Atom хандах түлхүүр + label_missing_feeds_access_key: Atom хандах түлхүүр алга + label_feeds_access_key_created_on: "Atom хандалтын түлхүүр %{value}-ийн өмнө үүссэн" + label_module_plural: Модулууд + label_added_time_by: "%{author} %{age}-ийн өмнө нэмсэн" + label_updated_time_by: "%{author} %{age}-ийн өмнө өөрчилсөн" + label_updated_time: "%{value} -ийн өмнө өөрчлөгдсөн" + label_jump_to_a_project: Төсөл рүү очих... + label_file_plural: Файлууд + label_changeset_plural: Өөрчлөлтүүд + label_default_columns: Стандарт баганууд + label_no_change_option: (Өөрчлөлт байхгүй) + label_bulk_edit_selected_issues: Сонгогдсон асуудлуудыг бөөнөөр засварлах + label_theme: Системийн Дизайн + label_default: Стандарт + label_search_titles_only: Зөвхөн гарчиг хайх + label_user_mail_option_all: "Миний бүх төсөл дээрх бүх үзэгдлүүдийн хувьд" + label_user_mail_option_selected: "Сонгогдсон төслүүдийн хувьд бүх үзэгдэл дээр..." + label_user_mail_no_self_notified: "Миний өөрийн хийсэн өөрчлөлтүүдийн тухай надад мэдэгдэх хэрэггүй" + label_registration_activation_by_email: дансыг имэйлээр идэвхжүүлэх + label_registration_manual_activation: дансыг гараар идэвхжүүлэх + label_registration_automatic_activation: дансыг автоматаар идэвхжүүлэх + label_display_per_page: 'Нэг хуудсанд: %{value}' + label_age: Нас + label_change_properties: Тохиргоог өөрчлөх + label_general: Ерөнхий + label_scm: SCM + label_plugins: Модулууд + label_ldap_authentication: LDAP нэвтрэх горим + label_downloads_abbr: D/L + label_optional_description: Дурын тайлбар + label_add_another_file: Дахин файл нэмэх + label_preferences: Тохиргоо + label_chronological_order: Цагаан толгойн үсгийн дарааллаар + label_reverse_chronological_order: Урвуу цагаан толгойн үсгийн дарааллаар + label_incoming_emails: Ирсэн мэйлүүд + label_generate_key: Түлхүүр үүсгэх + label_issue_watchers: Ажиглагчид + label_example: Жишээ + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Groups + label_group_new: New group + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + + button_login: Нэвтрэх + button_submit: Илгээх + button_save: Хадгалах + button_check_all: Бүгдийг сонго + button_uncheck_all: Бүгдийг үл сонго + button_delete: Устгах + button_create: Үүсгэх + button_create_and_continue: Үүсгээд цааш үргэлжлүүлэх + button_test: Турших + button_edit: Засварлах + button_add: Нэмэх + button_change: Өөрчлөх + button_apply: Өөрчлөлтийг хадгалах + button_clear: Цэвэрлэх + button_lock: Түгжих + button_unlock: Түгжээг тайлах + button_download: Татах + button_list: Жагсаалт + button_view: Харах + button_move: Зөөх + button_move_and_follow: Зөө бас дага + button_back: Буцах + button_cancel: Болих + button_activate: Идэвхжүүлэх + button_sort: Эрэмбэлэх + button_log_time: Лог хийсэн хугацаа + button_rollback: Энэ хувилбар руу буцах + button_watch: Ажиглах + button_unwatch: Ажиглахаа болих + button_reply: Хариулах + button_archive: Архивлах + button_unarchive: Архивыг задлах + button_reset: Анхны утгууд + button_rename: Нэрийг нь солих + button_change_password: Нууц үгээ өөрчлөх + button_copy: Хуулах + button_copy_and_follow: Зөө бас дага + button_annotate: Тайлбар хавсаргах + button_update: Шинэчлэх + button_configure: Тохируулах + button_quote: Ишлэл + button_duplicate: Хуулбар + button_show: Үзэх + + status_active: идэвхтэй + status_registered: бүртгүүлсэн + status_locked: түгжээтэй + + version_status_open: нээлттэй + version_status_locked: түгжээтэй + version_status_closed: хаалттай + + field_active: идэвхтэй + + text_select_mail_notifications: Ямар үед имэйлээр мэдэгдэл илгээхийг сонгоно уу. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 гэвэл ямар ч хязгааргүй гэсэн үг + text_project_destroy_confirmation: Та энэ төсөл болоод бусад мэдээллийг нь үнэхээр устгамаар байна уу ? + text_subprojects_destroy_warning: "Уг төслийн дэд төслүүд : %{value} нь бас устгагдах болно." + text_workflow_edit: Ажлын дарааллыг өөрчлөхийн тулд хандалтын эрх болон асуудлын чиглэлийг сонгоно уу + text_are_you_sure: Та итгэлтэй байна уу ? + text_journal_changed: "%{label} %{old} байсан нь %{new} болов" + text_journal_set_to: "%{label} %{value} болгож өөрчиллөө" + text_journal_deleted: "%{label} устсан (%{old})" + text_journal_added: "%{label} %{value} нэмэгдсэн" + text_tip_issue_begin_day: энэ өдөр эхлэх ажил + text_tip_issue_end_day: энэ өдөр дуусах ажил + text_tip_issue_begin_end_day: энэ өдөр эхлээд мөн дуусч байгаа ажил + text_caracters_maximum: "дээд тал нь %{count} үсэг." + text_caracters_minimum: "Хамгийн багадаа ядаж %{count} тэмдэгт байх." + text_length_between: "Урт нь багадаа %{min}, ихдээ %{max} тэмдэгт." + text_tracker_no_workflow: Энэхүү асуудлын чиглэлд ямар ч ажлын дараалал тодорхойлогдоогүй байна + text_unallowed_characters: Хэрэглэж болохгүй тэмдэгтүүд + text_comma_separated: Таслалаар зааглан олон утга оруулж болно. + text_line_separated: Multiple values allowed (one line for each value). + text_issues_ref_in_commit_messages: Коммитийн зурвасуудад хамааруулсан болон байнгын асуудлууд + text_issue_added: "Асуудал %{id} - ийг хэрэглэгч %{author} мэдэгдсэн байна." + text_issue_updated: "Асуудал %{id} - ийг хэрэглэгч %{author} өөрчилсөн байна." + text_wiki_destroy_confirmation: Та энэ вики болон холбогдох бүх мэдээллийг үнэхээр устгамаар байна уу ? + text_issue_category_destroy_question: "Энэ ангилалд зарим асуудлууд (%{count}) орсон байна. Та яах вэ ?" + text_issue_category_destroy_assignments: Асуудлуудыг энэ ангиллаас авах + text_issue_category_reassign_to: Асуудлуудыг энэ ангилалд дахин оноох + text_user_mail_option: "Сонгогдоогүй төслүүдийн хувьд, та зөвхөн өөрийнхөө ажиглаж байгаа зүйлс юмуу танд хамаатай зүйлсийн талаар мэдэгдэл авах болно (Таны оруулсан асуудал, эсвэл танд оноосон гэх мэт)." + text_no_configuration_data: "Хандалтын эрхүүд, чиглэлүүд, асуудлын төлвүүд болон ажлын дарааллын тухай мэдээллийг хараахан оруулаагүй байна.\nТа стандарт өгөгдлүүдийг даруйхан оруулахыг зөвлөж байна, оруулсан хойно та засварлаж болно." + text_load_default_configuration: Стандарт өгөгдлийг ачаалах + text_status_changed_by_changeset: "%{value} өөрчлөлтөд хийгдсэн." + text_issues_destroy_confirmation: 'Та сонгогдсон асуудлуудыг үнэхээр устгамаар байна уу ?' + text_select_project_modules: 'Энэ төслийн хувьд идэвхжүүлэх модулуудаа сонгоно уу:' + text_default_administrator_account_changed: Стандарт администраторын бүртгэл өөрчлөгдлөө + text_file_repository_writable: Хавсралт файл хадгалах хавтас руу бичих эрхтэй + text_plugin_assets_writable: Плагин модулийн ассет хавтас руу бичих эрхтэй + text_rmagick_available: RMagick суулгагдсан (заавал биш) + text_destroy_time_entries_question: "Таны устгах гэж байгаа асуудлууд дээр нийт %{hours} цаг зарцуулсан юм байна, та яах вэ ?" + text_destroy_time_entries: Мэдэгдсэн цагуудыг устгах + text_assign_time_entries_to_project: Мэдэгдсэн асуудлуудыг төсөлд оноох + text_reassign_time_entries: 'Мэдэгдсэн асуудлуудыг энэ асуудалд дахин оноо:' + text_user_wrote: "%{value} бичихдээ:" + text_enumeration_destroy_question: "Энэ утгад %{count} обьект оноогдсон байна." + text_enumeration_category_reassign_to: 'Тэдгээрийг энэ утгад дахин оноо:' + text_email_delivery_not_configured: "Имэйлийн тохиргоог хараахан тохируулаагүй байна, тиймээс имэйл мэдэгдэл явуулах боломжгүй байна.\nSMTP сервэрээ config/configuration.yml файл дотор тохируулаад төслийн менежерээ дахиад эхлүүлээрэй." + text_repository_usernames_mapping: "Репозиторийн логд байгаа бүх хэрэглэгчийн нэрүүдэд харгалзсан Төслийн Менежер системд бүртгэлтэй хэрэглэгчдийг Сонгох юмуу шинэчилнэ үү.\nТөслийн менежер болон репозиторид байгаа ижилхэн нэр юмуу имэйлтэй хэрэглэгчид харилцан харгалзна." + text_diff_truncated: '... Файлын ялгаврын хэмжээ үзүүлэхэд дэндүү урт байгаа учраас төгсгөлөөс нь хасч үзүүлэв.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + + default_role_manager: Менежер + default_role_developer: Хөгжүүлэгч + default_role_reporter: Мэдэгдэгч + default_tracker_bug: Алдаа + default_tracker_feature: Онцлог + default_tracker_support: Тусламж + default_issue_status_new: Шинэ + default_issue_status_in_progress: Ахицтай + default_issue_status_assigned: Оноогдсон + default_issue_status_resolved: Шийдвэрлэгдсэн + default_issue_status_feedback: Feedback + default_issue_status_closed: Хаагдсан + default_issue_status_rejected: Хүлээж аваагүй + default_doc_category_user: Хэрэглэгчийн бичиг баримт + default_doc_category_tech: Техникийн бичиг баримт + default_priority_low: Бага + default_priority_normal: Хэвийн + default_priority_high: Өндөр + default_priority_urgent: Нэн яаралтай + default_priority_immediate: Нэн даруй + default_activity_design: Дизайн + default_activity_development: Хөгжүүлэлт + + enumeration_issue_priorities: Асуудлын зэрэглэлүүд + enumeration_doc_categories: Бичиг баримтын ангиллууд + enumeration_activities: Үйл ажиллагаанууд (хугацааг хянах) + enumeration_system_activity: Системийн үйл ажиллагаа + + permission_manage_subtasks: Manage subtasks + label_profile: Profile + field_parent_issue: Parent task + error_unable_delete_issue_status: Unable to delete issue status + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Коммит хийх үед харуулах текстүүдийн энкодинг + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 Асуудал + one: 1 Асуудал + other: "%{count} Асуудлууд" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: бүгд + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Нийт + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Имэйл + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API түлхүүр + setting_lost_password: Нууц үгээ алдсан + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/nl.yml b/config/locales/nl.yml new file mode 100644 index 0000000..2934549 --- /dev/null +++ b/config/locales/nl.yml @@ -0,0 +1,1205 @@ +nl: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d-%m-%Y" + short: "%e %b" + long: "%d %B, %Y" + + day_names: [zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag] + abbr_day_names: [zo, ma, di, wo, do, vr, za] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december] + abbr_month_names: [~, jan, feb, mar, apr, mei, jun, jul, aug, sep, okt, nov, dec] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%e %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "halve minuut" + less_than_x_seconds: + one: "minder dan een seconde" + other: "minder dan %{count} seconden" + x_seconds: + one: "1 seconde" + other: "%{count} seconden" + less_than_x_minutes: + one: "minder dan een minuut" + other: "minder dan %{count} minuten" + x_minutes: + one: "1 minuut" + other: "%{count} minuten" + about_x_hours: + one: "ongeveer 1 uur" + other: "ongeveer %{count} uren" + x_hours: + one: "1 uur" + other: "%{count} uren" + x_days: + one: "1 dag" + other: "%{count} dagen" + about_x_months: + one: "ongeveer 1 maand" + other: "ongeveer %{count} maanden" + x_months: + one: "1 maand" + other: "%{count} maanden" + about_x_years: + one: "ongeveer 1 jaar" + other: "ongeveer %{count} jaar" + over_x_years: + one: "meer dan 1 jaar" + other: "meer dan %{count} jaar" + almost_x_years: + one: "bijna 1 jaar" + other: "bijna %{count} jaar" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + precision: 3 + delimiter: "" + storage_units: + format: "%n %u" + units: + kb: KB + tb: TB + gb: GB + byte: + one: Byte + other: Bytes + mb: MB + +# Used in array.to_sentence. + support: + array: + sentence_connector: "en" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "Door een fout kon dit %{model} niet worden opgeslagen" + other: "Door %{count} fouten kon dit %{model} niet worden opgeslagen" + messages: + inclusion: "staat niet in de lijst" + exclusion: "is gereserveerd" + invalid: "is ongeldig" + confirmation: "komt niet overeen met bevestiging" + accepted: "moet geaccepteerd worden" + empty: "mag niet leeg zijn" + blank: "mag niet blanco zijn" + too_long: "is te lang (maximaal %{count} tekens)" + too_short: "is te kort (minimaal %{count} tekens)" + wrong_length: "heeft een onjuiste lengte" + taken: "is al in gebruik" + not_a_number: "is geen getal" + not_a_date: "is geen valide datum" + greater_than: "moet groter zijn dan %{count}" + greater_than_or_equal_to: "moet groter zijn of gelijk zijn aan %{count}" + equal_to: "moet gelijk zijn aan %{count}" + less_than: "moet minder zijn dan %{count}" + less_than_or_equal_to: "moet minder dan of gelijk zijn aan %{count}" + odd: "moet oneven zijn" + even: "moet even zijn" + greater_than_start_date: "moet na de startdatum liggen" + not_same_project: "hoort niet bij hetzelfde project" + circular_dependency: "Deze relatie zou een circulaire afhankelijkheid tot gevolg hebben" + cant_link_an_issue_with_a_descendant: "Een issue kan niet gelinked worden met een subtask" + earlier_than_minimum_start_date: "kan niet eerder zijn dan %{date} wegens voorafgaande issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Selecteren + + button_activate: Activeren + button_add: Toevoegen + button_annotate: Annoteren + button_apply: Toepassen + button_archive: Archiveren + button_back: Terug + button_cancel: Annuleren + button_change: Wijzigen + button_change_password: Wachtwoord wijzigen + button_check_all: Alles selecteren + button_clear: Leegmaken + button_configure: Configureren + button_copy: Kopiëren + button_create: Aanmaken + button_delete: Verwijderen + button_download: Download + button_edit: Bewerken + button_list: Lijst + button_lock: Vergrendelen + button_log_time: Tijd registreren + button_login: Inloggen + button_move: Verplaatsen + button_quote: Citeren + button_rename: Hernoemen + button_reply: Antwoorden + button_reset: Herstellen + button_rollback: Terugdraaien naar deze versie + button_save: Opslaan + button_sort: Sorteren + button_submit: Toevoegen + button_test: Testen + button_unarchive: Dearchiveren + button_uncheck_all: Deselecteren + button_unlock: Ontgrendelen + button_unwatch: Niet meer volgen + button_update: Bijwerken + button_view: Weergeven + button_watch: Volgen + default_activity_design: Ontwerp + default_activity_development: Ontwikkeling + default_doc_category_tech: Technische documentatie + default_doc_category_user: Gebruikersdocumentatie + default_issue_status_in_progress: In uitvoering + default_issue_status_closed: Gesloten + default_issue_status_feedback: Terugkoppeling + default_issue_status_new: Nieuw + default_issue_status_rejected: Afgewezen + default_issue_status_resolved: Opgelost + default_priority_high: Hoog + default_priority_immediate: Onmiddellijk + default_priority_low: Laag + default_priority_normal: Normaal + default_priority_urgent: Dringend + default_role_developer: Ontwikkelaar + default_role_manager: Manager + default_role_reporter: Rapporteur + default_tracker_bug: Bug + default_tracker_feature: Feature + default_tracker_support: Support + enumeration_activities: Activiteiten (tijdregistratie) + enumeration_doc_categories: Documentcategorieën + enumeration_issue_priorities: Issueprioriteiten + error_can_t_load_default_data: "De standaardconfiguratie kan niet worden geladen: %{value}" + error_issue_not_found_in_project: 'Deze issue kan niet gevonden worden of behoort niet toe aan dit project.' + error_scm_annotate: "Er kan geen commentaar toegevoegd worden." + error_scm_command_failed: "Er is een fout opgetreden tijdens het verbinding maken met de repository: %{value}" + error_scm_not_found: "Dit item of deze revisie bestaat niet in de repository." + field_account: Account + field_activity: Activiteit + field_admin: Beheerder + field_assignable: Issues kunnen aan deze rol toegewezen worden + field_assigned_to: Toegewezen aan + field_attr_firstname: Voornaamattribuut + field_attr_lastname: Achternaamattribuut + field_attr_login: Loginattribuut + field_attr_mail: E-mailattribuut + field_auth_source: Authenticatiemethode + field_author: Auteur + field_base_dn: Base DN + field_category: Categorie + field_column_names: Kolommen + field_comments: Commentaar + field_comments_sorting: Commentaar weergeven + field_created_on: Aangemaakt op + field_default_value: Standaardwaarde + field_delay: Vertraging + field_description: Beschrijving + field_done_ratio: "% voltooid" + field_downloads: Downloads + field_due_date: Verwachte einddatum + field_effective_date: Datum + field_estimated_hours: Geschatte tijd + field_field_format: Formaat + field_filename: Bestand + field_filesize: Grootte + field_firstname: Voornaam + field_fixed_version: Versie + field_hide_mail: Verberg mijn e-mailadres + field_homepage: Homepagina + field_host: Host + field_hours: Uren + field_identifier: Identificatiecode + field_is_closed: Issue gesloten + field_is_default: Standaard + field_is_filter: Als filter gebruiken + field_is_for_all: Voor alle projecten + field_is_in_roadmap: Issues weergegeven in roadmap + field_is_public: Openbaar + field_is_required: Verplicht + field_issue: Issue + field_issue_to: Gerelateerd issue + field_language: Taal + field_last_login_on: Laatste bezoek + field_lastname: Achternaam + field_login: Gebruikersnaam + field_mail: E-mail + field_mail_notification: E-mailnotificaties + field_max_length: Maximale lengte + field_min_length: Minimale lengte + field_name: Naam + field_new_password: Nieuw wachtwoord + field_notes: Notities + field_onthefly: On-the-fly aanmaken van een gebruiker + field_parent: Subproject van + field_parent_title: Bovenliggende pagina + field_password: Wachtwoord + field_password_confirmation: Bevestig wachtwoord + field_port: Poort + field_possible_values: Mogelijke waarden + field_priority: Prioriteit + field_project: Project + field_redirect_existing_links: Bestaande links doorverwijzen + field_regexp: Reguliere expressie + field_role: Rol + field_searchable: Doorzoekbaar + field_spent_on: Datum + field_start_date: Startdatum + field_start_page: Startpagina + field_status: Status + field_subject: Onderwerp + field_subproject: Subproject + field_summary: Samenvatting + field_time_zone: Tijdzone + field_title: Titel + field_tracker: Tracker + field_type: Type + field_updated_on: Laatst gewijzigd op + field_url: URL + field_user: Gebruiker + field_value: Waarde + field_version: Versie + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-1 + general_csv_separator: ';' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + general_lang_name: 'Dutch (Nederlands)' + general_text_No: 'Nee' + general_text_Yes: 'Ja' + general_text_no: 'nee' + general_text_yes: 'ja' + label_activity: Activiteit + label_add_another_file: Ander bestand toevoegen + label_add_note: Notitie toevoegen + label_added: toegevoegd + label_added_time_by: "Toegevoegd door %{author} %{age} geleden" + label_administration: Administratie + label_age: Leeftijd + label_ago: dagen geleden + label_all: alle + label_all_time: alles + label_all_words: Alle woorden + label_and_its_subprojects: "%{value} en de subprojecten." + label_applied_status: Toegekende status + label_assigned_to_me_issues: Aan mij toegewezen issues + label_associated_revisions: Geassociëerde revisies + label_attachment: Bestand + label_attachment_delete: Bestand verwijderen + label_attachment_new: Nieuw bestand + label_attachment_plural: Bestanden + label_attribute: Attribuut + label_attribute_plural: Attributen + label_auth_source: Authenticatiemodus + label_auth_source_new: Nieuwe authenticatiemodus + label_auth_source_plural: Authenticatiemodi + label_authentication: Authenticatie + label_blocked_by: geblokkeerd door + label_blocks: blokkeert + label_board: Forum + label_board_new: Nieuw forum + label_board_plural: Forums + label_boolean: Booleaanse waarde + label_browse: Bladeren + label_bulk_edit_selected_issues: Geselecteerde issues in bulk bewerken + label_calendar: Kalender + label_change_plural: Wijzigingen + label_change_properties: Eigenschappen wijzigen + label_change_status: Status wijzigen + label_change_view_all: Alle wijzigingen weergeven + label_changes_details: Details van alle wijzigingen + label_changeset_plural: Changesets + label_chronological_order: In chronologische volgorde + label_closed_issues: gesloten + label_closed_issues_plural: gesloten + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 gesloten + one: 1 gesloten + other: "%{count} gesloten" + label_comment: Commentaar + label_comment_add: Commentaar toevoegen + label_comment_added: Commentaar toegevoegd + label_comment_delete: Commentaar verwijderen + label_comment_plural: Commentaren + label_x_comments: + zero: geen commentaar + one: 1x commentaar + other: "%{count}x commentaar" + label_commits_per_author: Commits per auteur + label_commits_per_month: Commits per maand + label_confirmation: Bevestiging + label_contains: bevat + label_copied: gekopieerd + label_copy_workflow_from: Kopieer workflow van + label_current_status: Huidige status + label_current_version: Huidige versie + label_custom_field: Vrij veld + label_custom_field_new: Nieuw vrij veld + label_custom_field_plural: Vrije velden + label_date: Datum + label_date_from: Van + label_date_range: Datumbereik + label_date_to: Tot + label_day_plural: dagen + label_default: Standaard + label_default_columns: Standaardkolommen. + label_deleted: verwijderd + label_details: Details + label_diff_inline: inline + label_diff_side_by_side: naast elkaar + label_disabled: uitgeschakeld + label_display_per_page: "Per pagina: %{value}" + label_document: Document + label_document_added: Document toegevoegd + label_document_new: Nieuw document + label_document_plural: Documenten + label_downloads_abbr: D/L + label_duplicated_by: gedupliceerd door + label_duplicates: dupliceert + label_enumeration_new: Nieuwe waarde + label_enumerations: Enumeraties + label_environment: Omgeving + label_equals: is gelijk + label_example: Voorbeeld + label_export_to: Exporteer naar + label_f_hour: "%{value} uur" + label_f_hour_plural: "%{value} uren" + label_feed_plural: Feeds + label_feeds_access_key_created_on: "Atom-toegangssleutel %{value} geleden gemaakt" + label_file_added: Bestand toegevoegd + label_file_plural: Bestanden + label_filter_add: Filter toevoegen + label_filter_plural: Filters + label_float: Decimaal getal + label_follows: volgt op + label_gantt: Gantt + label_general: Algemeen + label_generate_key: Een sleutel genereren + label_help: Help + label_history: Geschiedenis + label_home: Home + label_in: in + label_in_less_than: in minder dan + label_in_more_than: in meer dan + label_incoming_emails: Inkomende e-mail + label_index_by_date: Indexeer op datum + label_index_by_title: Indexeer op titel + label_information: Informatie + label_information_plural: Informatie + label_integer: Getal + label_internal: Intern + label_issue: Issue + label_issue_added: Issue toegevoegd + label_issue_category: Issuecategorie + label_issue_category_new: Nieuwe categorie + label_issue_category_plural: Issuecategorieën + label_issue_new: Nieuw issue + label_issue_plural: Issues + label_issue_status: Issuestatus + label_issue_status_new: Nieuwe status + label_issue_status_plural: Issuestatussen + label_issue_tracking: Issue tracking + label_issue_updated: Issue bijgewerkt + label_issue_view_all: Alle issues bekijken + label_issue_watchers: Volgers + label_issues_by: "Issues door %{value}" + label_jump_to_a_project: Ga naar een project... + label_language_based: Taal gebaseerd + label_last_changes: "laatste %{count} wijzigingen" + label_last_login: Laatste bezoek + label_last_month: laatste maand + label_last_n_days: "%{count} dagen geleden" + label_last_week: vorige week + label_latest_revision: Meest recente revisie + label_latest_revision_plural: Meest recente revisies + label_ldap_authentication: LDAP authenticatie + label_less_than_ago: minder dan x dagen geleden + label_list: Lijst + label_loading: Bezig met laden... + label_logged_as: Ingelogd als + label_login: Inloggen + label_logout: Uitloggen + label_max_size: Maximumgrootte + label_me: mij + label_member: Lid + label_member_new: Nieuw lid + label_member_plural: Leden + label_message_last: Laatste bericht + label_message_new: Nieuw bericht + label_message_plural: Berichten + label_message_posted: Bericht toegevoegd + label_min_max_length: Min-max lengte + label_modified: gewijzigd + label_module_plural: Modules + label_month: Maand + label_months_from: maanden vanaf + label_more_than_ago: meer dan x dagen geleden + label_my_account: Mijn account + label_my_page: Mijn pagina + label_my_projects: Mijn projecten + label_new: Nieuw + label_new_statuses_allowed: Nieuw toegestane statussen + label_news: Nieuws + label_news_added: Nieuws toegevoegd + label_news_latest: Laatste nieuws + label_news_new: Nieuws toevoegen + label_news_plural: Nieuws + label_news_view_all: Alle nieuws weergeven + label_next: Volgende + label_no_change_option: (Geen wijziging) + label_no_data: Er zijn geen gegevens om weer te geven + label_nobody: niemand + label_none: geen + label_not_contains: bevat niet + label_not_equals: is niet gelijk + label_open_issues: open + label_open_issues_plural: open + label_optional_description: Optionele beschrijving + label_options: Opties + label_overall_activity: Activiteit + label_overview: Overzicht + label_password_lost: Wachtwoord vergeten + label_permissions: Permissies + label_permissions_report: Permissierapport + label_please_login: Gelieve in te loggen + label_plugins: Plugins + label_precedes: gaat vooraf aan + label_preferences: Voorkeuren + label_preview: Voorbeeldweergave + label_previous: Vorige + label_project: Project + label_project_all: Alle projecten + label_project_latest: Nieuwste projecten + label_project_new: Nieuw project + label_project_plural: Projecten + label_x_projects: + zero: geen projecten + one: 1 project + other: "%{count} projecten" + label_public_projects: Publieke projecten + label_query: Eigen zoekopdracht + label_query_new: Nieuwe zoekopdracht + label_query_plural: Eigen zoekopdrachten + label_read: Lees meer... + label_register: Registreren + label_registered_on: Geregistreerd op + label_registration_activation_by_email: accountactivering per e-mail + label_registration_automatic_activation: automatische accountactivering + label_registration_manual_activation: handmatige accountactivering + label_related_issues: Gerelateerde issues + label_relates_to: gerelateerd aan + label_relation_delete: Relatie verwijderen + label_relation_new: Nieuwe relatie + label_renamed: hernoemd + label_reply_plural: Antwoorden + label_report: Rapport + label_report_plural: Rapporten + label_reported_issues: Gemelde issues + label_repository: Repository + label_repository_plural: Repositories + label_result_plural: Resultaten + label_reverse_chronological_order: In omgekeerde chronologische volgorde + label_revision: Revisie + label_revision_plural: Revisies + label_roadmap: Roadmap + label_roadmap_due_in: "Voldaan in %{value}" + label_roadmap_no_issues: Geen issues voor deze versie + label_roadmap_overdue: "%{value} over tijd" + label_role: Rol + label_role_and_permissions: Rollen en permissies + label_role_new: Nieuwe rol + label_role_plural: Rollen + label_scm: SCM + label_search: Zoeken + label_search_titles_only: Enkel titels doorzoeken + label_send_information: Stuur accountinformatie naar de gebruiker + label_send_test_email: Stuur een e-mail om te testen + label_settings: Instellingen + label_show_completed_versions: Afgeronde versies weergeven + label_sort_by: "Sorteer op %{value}" + label_sort_higher: Verplaats naar boven + label_sort_highest: Verplaats naar begin + label_sort_lower: Verplaats naar beneden + label_sort_lowest: Verplaats naar einde + label_spent_time: Gespendeerde tijd + label_statistics: Statistieken + label_stay_logged_in: Ingelogd blijven + label_string: Tekst + label_subproject_plural: Subprojecten + label_text: Lange tekst + label_theme: Thema + label_this_month: deze maand + label_this_week: deze week + label_this_year: dit jaar + label_time_tracking: Tijdregistratie bijhouden + label_today: vandaag + label_topic_plural: Onderwerpen + label_total: Totaal + label_tracker: Tracker + label_tracker_new: Nieuwe tracker + label_tracker_plural: Trackers + label_updated_time: "%{value} geleden bijgewerkt" + label_updated_time_by: "%{age} geleden bijgewerkt door %{author}" + label_used_by: Gebruikt door + label_user: Gebruiker + label_user_activity: "%{value}'s activiteit" + label_user_mail_no_self_notified: Ik wil niet op de hoogte gehouden worden van mijn eigen wijzigingen + label_user_mail_option_all: "Bij elke gebeurtenis in al mijn projecten..." + label_user_mail_option_selected: "Enkel bij iedere gebeurtenis op het geselecteerde project..." + label_user_new: Nieuwe gebruiker + label_user_plural: Gebruikers + label_version: Versie + label_version_new: Nieuwe versie + label_version_plural: Versies + label_view_diff: Verschillen weergeven + label_view_revisions: Revisies weergeven + label_watched_issues: Gevolgde issues + label_week: Week + label_wiki: Wiki + label_wiki_edit: Wiki-aanpassing + label_wiki_edit_plural: Wiki-aanpassingen + label_wiki_page: Wikipagina + label_wiki_page_plural: Wikipagina's + label_workflow: Workflow + label_year: Jaar + label_yesterday: gisteren + mail_body_account_activation_request: "Een nieuwe gebruiker (%{value}) heeft zich geregistreerd. Zijn account wacht op uw akkoord:" + mail_body_account_information: Uw account gegevens + mail_body_account_information_external: "U kunt uw account (%{value}) gebruiken om in te loggen." + mail_body_lost_password: 'Gebruik volgende link om uw wachtwoord te wijzigen:' + mail_body_register: 'Gebruik volgende link om uw account te activeren:' + mail_body_reminder: "%{count} issue(s) die aan u toegewezen zijn en voldaan moeten zijn in de komende %{days} dagen:" + mail_subject_account_activation_request: "%{value} account activeringsverzoek" + mail_subject_lost_password: "uw %{value} wachtwoord" + mail_subject_register: "uw %{value} accountactivering" + mail_subject_reminder: "%{count} issue(s) die voldaan moeten zijn in de komende %{days} dagen." + notice_account_activated: Uw account is geactiveerd. U kunt nu inloggen. + notice_account_invalid_credentials: Incorrecte gebruikersnaam of wachtwoord + notice_account_lost_email_sent: Er is een e-mail naar u verzonden met instructies over de keuze van een nieuw wachtwoord. + notice_account_password_updated: Wachtwoord is met succes gewijzigd + notice_account_pending: Uw account is aangemaakt, maar wacht nog op goedkeuring van een beheerder. + notice_account_unknown_email: Onbekende gebruiker. + notice_account_updated: Account is succesvol gewijzigd + notice_account_wrong_password: Ongeldig wachtwoord + notice_can_t_change_password: Deze account gebruikt een externe authenticatiebron. Het is niet mogelijk om het wachtwoord te veranderen. + notice_default_data_loaded: Standaardconfiguratie succesvol geladen. + notice_email_error: "Er is een fout opgetreden bij het versturen van (%{value})" + notice_email_sent: "Een e-mail werd verstuurd naar %{value}" + notice_failed_to_save_issues: "Fout bij bewaren van %{count} issue(s) (%{total} geselecteerd): %{ids}." + notice_feeds_access_key_reseted: Uw Atom-toegangssleutel werd opnieuw ingesteld. + notice_file_not_found: De pagina, die u probeerde te benaderen, bestaat niet of is verwijderd. + notice_locking_conflict: De gegevens werden reeds eerder gewijzigd door een andere gebruiker. + notice_no_issue_selected: "Er is geen issue geselecteerd. Selecteer het issue dat u wil bewerken." + notice_not_authorized: U heeft niet de juiste machtigingen om deze pagina te raadplegen. + notice_successful_connection: Verbinding succesvol. + notice_successful_create: Succesvol aangemaakt. + notice_successful_delete: Succesvol verwijderd. + notice_successful_update: Succesvol gewijzigd. + notice_unable_delete_version: Het is niet mogelijk om deze versie te verwijderen. + permission_add_issue_notes: Notities toevoegen + permission_add_issue_watchers: Volgers toevoegen + permission_add_issues: Issues toevoegen + permission_add_messages: Berichten toevoegen + permission_browse_repository: Repository doorbladeren + permission_comment_news: Commentaar toevoegen bij nieuws + permission_commit_access: Commit-rechten + permission_delete_issues: Issues verwijderen + permission_delete_messages: Berichten verwijderen + permission_delete_own_messages: Eigen berichten verwijderen + permission_delete_wiki_pages: Wikipagina's verwijderen + permission_delete_wiki_pages_attachments: Bijlagen verwijderen + permission_edit_issue_notes: Notities bewerken + permission_edit_issues: Issues bewerken + permission_edit_messages: Berichten bewerken + permission_edit_own_issue_notes: Eigen notities bewerken + permission_edit_own_messages: Eigen berichten bewerken + permission_edit_own_time_entries: Eigen tijdregistraties bewerken + permission_edit_project: Project bewerken + permission_edit_time_entries: Tijdregistraties bewerken + permission_edit_wiki_pages: Wikipagina's bewerken + permission_log_time: Tijdregistraties boeken + permission_manage_boards: Forums beheren + permission_manage_categories: Issuecategorieën beheren + permission_manage_files: Bestanden beheren + permission_manage_issue_relations: Issuerelaties beheren + permission_manage_members: Leden beheren + permission_manage_news: Nieuws beheren + permission_manage_public_queries: Publieke queries beheren + permission_manage_repository: Repository beheren + permission_manage_versions: Versiebeheer + permission_manage_wiki: Wikibeheer + permission_move_issues: Issues verplaatsen + permission_protect_wiki_pages: Wikipagina's beschermen + permission_rename_wiki_pages: Wikipagina's hernoemen + permission_save_queries: Queries opslaan + permission_select_project_modules: Project modules selecteren + permission_view_calendar: Kalender bekijken + permission_view_changesets: Changesets bekijken + permission_view_documents: Documenten bekijken + permission_view_files: Bestanden bekijken + permission_view_gantt: Gantt-grafiek bekijken + permission_view_issue_watchers: Lijst met volgers bekijken + permission_view_messages: Berichten bekijken + permission_view_time_entries: Tijdregistraties bekijken + permission_view_wiki_edits: Wikihistorie bekijken + permission_view_wiki_pages: Wikipagina's bekijken + project_module_boards: Forums + project_module_documents: Documenten + project_module_files: Bestanden + project_module_issue_tracking: Issue tracking + project_module_news: Nieuws + project_module_repository: Repository + project_module_time_tracking: Tijdregistratie + project_module_wiki: Wiki + setting_activity_days_default: Aantal weergegeven dagen bij het tabblad "Activiteit" + setting_app_subtitle: Applicatieondertitel + setting_app_title: Applicatietitel + setting_attachment_max_size: Max. grootte bijlage + setting_autofetch_changesets: Commits automatisch ophalen + setting_autologin: Automatisch inloggen + setting_bcc_recipients: Blind carbon copy ontvangers (bcc) + setting_commit_fix_keywords: Vaste trefwoorden + setting_commit_ref_keywords: Refererende trefwoorden + setting_cross_project_issue_relations: Issuerelaties tussen projecten toelaten + setting_date_format: Datumformaat + setting_default_language: Standaardtaal + setting_default_projects_public: Nieuwe projecten zijn standaard openbaar + setting_diff_max_lines_displayed: Max aantal weergegeven diff regels + setting_display_subprojects_issues: Standaardissues van subproject weergeven + setting_emails_footer: Voettekst voor e-mails + setting_enabled_scm: SCM ingeschakeld + setting_feeds_limit: Feedinhoudlimiet + setting_gravatar_enabled: Gebruik Gravatar gebruikersiconen + setting_host_name: Hostnaam + setting_issue_list_default_columns: Zichtbare standaardkolommen in lijst met issues + setting_issues_export_limit: Max aantal te exporteren issues + setting_login_required: Authenticatie vereist + setting_mail_from: E-mailadres afzender + setting_mail_handler_api_enabled: Schakel WS in voor inkomende e-mail. + setting_mail_handler_api_key: API-sleutel + setting_per_page_options: Aantal objecten per pagina (opties) + setting_plain_text_mail: platte tekst (geen HTML) + setting_protocol: Protocol + setting_self_registration: Zelfregistratie toegestaan + setting_sequential_project_identifiers: Sequentiële projectidentiteiten genereren + setting_sys_api_enabled: Gebruik WS voor repository beheer + setting_text_formatting: Tekstformaat + setting_time_format: Tijdformaat + setting_user_format: Weergaveformaat gebruikers + setting_welcome_text: Welkomsttekst + setting_wiki_compression: Wikigeschiedenis comprimeren + status_active: actief + status_locked: vergrendeld + status_registered: geregistreerd + text_are_you_sure: Weet u het zeker? + text_assign_time_entries_to_project: Gerapporteerde uren aan dit project toevoegen + text_caracters_maximum: "%{count} van maximum aantal tekens." + text_caracters_minimum: "Moet minstens %{count} karakters lang zijn." + text_comma_separated: Meerdere waarden toegestaan (kommagescheiden). + text_default_administrator_account_changed: Standaard beheerderaccount gewijzigd + text_destroy_time_entries: Gerapporteerde uren verwijderen + text_destroy_time_entries_question: "%{hours} uren werden gerapporteerd op de issue(s) die u wilt verwijderen. Wat wilt u doen?" + text_diff_truncated: '... Deze diff werd ingekort omdat het de maximale weer te geven karakters overschrijdt.' + text_email_delivery_not_configured: "E-mailbezorging is niet geconfigureerd. Mededelingen zijn uitgeschakeld.\nConfigureer uw SMTP server in config/configuration.yml en herstart de applicatie om e-mailbezorging te activeren." + text_enumeration_category_reassign_to: 'Volgende waarde toewijzen:' + text_enumeration_destroy_question: "%{count} objecten zijn toegewezen aan deze waarde." + text_file_repository_writable: Bestandsrepository schrijfbaar + text_issue_added: "Issue %{id} is gerapporteerd (door %{author})." + text_issue_category_destroy_assignments: Toewijzingen aan deze categorie verwijderen + text_issue_category_destroy_question: "Er zijn issues (%{count}) aan deze categorie toegewezen. Wat wilt u doen?" + text_issue_category_reassign_to: Issues opnieuw aan deze categorie toewijzen + text_issue_updated: "Issue %{id} is gewijzigd (door %{author})." + text_issues_destroy_confirmation: 'Weet u zeker dat u deze issue(s) wilt verwijderen?' + text_issues_ref_in_commit_messages: Opzoeken en aanpassen van issues in commitberichten + text_length_between: "Lengte tussen %{min} en %{max} tekens." + text_load_default_configuration: Standaardconfiguratie laden + text_min_max_length_info: 0 betekent geen beperking + text_no_configuration_data: "Rollen, trackers, issuestatussen en workflows zijn nog niet geconfigureerd.\nHet is ten zeerste aangeraden om de standaardconfiguratie in te laden. U kunt deze aanpassen nadat deze is ingeladen." + text_plugin_assets_writable: Plugin assets map schrijfbaar + text_project_destroy_confirmation: Weet u zeker dat u dit project en alle gerelateerde gegevens wilt verwijderen? + text_project_identifier_info: 'Alleen kleine letters (a-z), cijfers, streepjes en liggende streepjes zijn toegestaan.
    Eenmaal opgeslagen kan de identifier niet worden gewijzigd.' + text_reassign_time_entries: 'Gerapporteerde uren opnieuw toewijzen:' + text_regexp_info: bv. ^[A-Z0-9]+$ + text_repository_usernames_mapping: "Koppel de Redmine-gebruikers aan gebruikers in de repository log.\nGebruikers met dezelfde Redmine en repository gebruikersnaam of e-mail worden automatisch gekoppeld." + text_rmagick_available: RMagick beschikbaar (optioneel) + text_select_mail_notifications: Selecteer acties waarvoor mededelingen via e-mail moeten worden verstuurd. + text_select_project_modules: 'Selecteer de modules die u wilt gebruiken voor dit project:' + text_status_changed_by_changeset: "Toegepast in changeset %{value}." + text_subprojects_destroy_warning: "De subprojecten: %{value} zullen ook verwijderd worden." + text_tip_issue_begin_day: issue begint op deze dag + text_tip_issue_begin_end_day: issue begint en eindigt op deze dag + text_tip_issue_end_day: issue eindigt op deze dag + text_tracker_no_workflow: Geen workflow gedefinieerd voor deze tracker + text_unallowed_characters: Ongeldige tekens + text_user_mail_option: "Bij niet-geselecteerde projecten zal u enkel mededelingen ontvangen voor issues die u volgt of waar u bij betrokken bent (als auteur of toegewezen persoon)." + text_user_wrote: "%{value} schreef:" + text_wiki_destroy_confirmation: Weet u zeker dat u deze wiki en de inhoud wenst te verwijderen? + text_workflow_edit: Selecteer een rol en een tracker om de workflow te wijzigen + warning_attachments_not_saved: "%{count} bestand(en) konden niet opgeslagen worden." + button_create_and_continue: Aanmaken en verdergaan + text_custom_field_possible_values_info: 'Per lijn een waarde' + label_display: Weergave + field_editable: Bewerkbaar + setting_repository_log_display_limit: Max aantal revisies zichbaar + setting_file_max_size_displayed: Max grootte van tekstbestanden inline zichtbaar + field_watcher: Volger + setting_openid: Sta OpenID login en registratie toe + field_identity_url: OpenID URL + label_login_with_open_id_option: of login met uw OpenID + field_content: Content + label_descending: Aflopend + label_sort: Sorteer + label_ascending: Oplopend + label_date_from_to: Van %{start} tot %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wat wilt u doen? + text_wiki_page_reassign_children: Alle subpagina's toewijzen aan deze hoofdpagina + text_wiki_page_nullify_children: Behoud subpagina's als hoofdpagina's + text_wiki_page_destroy_children: Verwijder alle subpagina's en onderliggende pagina's + setting_password_min_length: Minimum wachtwoordlengte + field_group_by: Groepeer resultaten per + mail_subject_wiki_content_updated: "'%{id}' wikipagina is bijgewerkt" + label_wiki_content_added: Wikipagina toegevoegd + mail_subject_wiki_content_added: "'%{id}' wikipagina is toegevoegd" + mail_body_wiki_content_added: De '%{id}' wikipagina is toegevoegd door %{author}. + label_wiki_content_updated: Wikipagina bijgewerkt + mail_body_wiki_content_updated: De '%{id}' wikipagina is bijgewerkt door %{author}. + permission_add_project: Maak project + setting_new_project_user_role_id: Rol van gebruiker die een project maakt + label_view_all_revisions: Alle revisies bekijken + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: Geen tracker is geassocieerd met dit project. Check de projectinstellingen. + error_no_default_issue_status: Geen standaard issuestatus ingesteld. Check de configuratie (Ga naar "Administratie -> Issuestatussen"). + text_journal_changed: "%{label} gewijzigd van %{old} naar %{new}" + text_journal_set_to: "%{label} gewijzigd naar %{value}" + text_journal_deleted: "%{label} verwijderd (%{old})" + label_group_plural: Groepen + label_group: Groep + label_group_new: Nieuwe groep + label_time_entry_plural: Tijdregistraties + text_journal_added: "%{label} %{value} toegevoegd" + field_active: Actief + enumeration_system_activity: Systeemactiviteit + permission_delete_issue_watchers: Volgers verwijderen + version_status_closed: gesloten + version_status_locked: vergrendeld + version_status_open: open + error_can_not_reopen_issue_on_closed_version: Een issue toegewezen aan een gesloten versie kan niet heropend worden + label_user_anonymous: Anoniem + button_move_and_follow: Verplaatsen en volgen + setting_default_projects_modules: Standaard geactiveerde modules voor nieuwe projecten + setting_gravatar_default: Standaard Gravatar plaatje + field_sharing: Delen + label_version_sharing_hierarchy: Met projecthiërarchie + label_version_sharing_system: Met alle projecten + label_version_sharing_descendants: Met subprojecten + label_version_sharing_tree: Met projectboom + label_version_sharing_none: Niet gedeeld + error_can_not_archive_project: Dit project kan niet worden gearchiveerd + button_duplicate: Dupliceer + button_copy_and_follow: Kopiëren en volgen + label_copy_source: Bron + setting_issue_done_ratio: Bereken voltooiingspercentage voor issue met + setting_issue_done_ratio_issue_status: Gebruik de issuestatus + error_issue_done_ratios_not_updated: Issue-voltooiingspercentage niet gewijzigd. + error_workflow_copy_target: Selecteer tracker(s) en rol(len) + setting_issue_done_ratio_issue_field: Gebruik het issue-veld + label_copy_same_as_target: Zelfde als doel + label_copy_target: Doel + notice_issue_done_ratios_updated: Issue-voltooiingspercentage aangepast. + error_workflow_copy_source: Selecteer een brontracker of rol + label_update_issue_done_ratios: Update issue-voltooiingspercentage + setting_start_of_week: Week begint op + permission_view_issues: Issues bekijken + label_display_used_statuses_only: Alleen statussen weergeven die gebruikt worden door deze tracker + label_revision_id: Revisie %{value} + label_api_access_key: API-toegangssleutel + label_api_access_key_created_on: "API-toegangssleutel %{value} geleden gemaakt" + label_feeds_access_key: Atom-toegangssleutel + notice_api_access_key_reseted: Uw API-toegangssleutel werd opnieuw ingesteld. + setting_rest_api_enabled: Activeer REST web service + label_missing_api_access_key: Geen API-toegangssleutel + label_missing_feeds_access_key: Geen Atom-toegangssleutel + button_show: Weergeven + text_line_separated: Meerdere waarden toegestaan (elke regel is een waarde). + setting_mail_handler_body_delimiters: E-mailverwerking afbreken na een van deze regels + permission_add_subprojects: Subprojecten aanmaken + label_subproject_new: Nieuw subproject + text_own_membership_delete_confirmation: |- + U staat op het punt om enkele van (of al) uw permissies te verwijderen, zodus het is mogelijk dat + u dit project hierna niet meer kan wijzigen. Wilt u doorgaan? + label_close_versions: Afgeronde versies sluiten + label_board_sticky: Vastgeplakt (sticky) + label_board_locked: Vergrendeld + permission_export_wiki_pages: Wikipagina's exporteren + setting_cache_formatted_text: Opgemaakte tekst cachen + permission_manage_project_activities: Projectactiviteiten beheren + error_unable_delete_issue_status: Verwijderen van issuestatus is niet gelukt + label_profile: Profiel + permission_manage_subtasks: Subtaken beheren + field_parent_issue: Hoofdissue + label_subtask_plural: Subtaken + label_project_copy_notifications: E-mailnotificaties voor de projectkopie sturen + error_can_not_delete_custom_field: Custom field verwijderen is niet mogelijk + error_unable_to_connect: Geen connectie (%{value}) + error_can_not_remove_role: Deze rol is in gebruik en kan niet worden verwijderd. + error_can_not_delete_tracker: Deze tracker bevat nog issues en kan niet verwijderd worden. + field_principal: Hoofd + notice_failed_to_save_members: "Het is niet gelukt om lid/leden op te slaan: %{errors}." + text_zoom_out: Uitzoomen + text_zoom_in: Inzoomen + notice_unable_delete_time_entry: Verwijderen van tijdregistratie is niet mogelijk. + label_overall_spent_time: Totaal gespendeerde tijd + field_time_entries: Tijdregistratie + project_module_gantt: Gantt + project_module_calendar: Kalender + button_edit_associated_wikipage: "Bijbehorende wikipagina bewerken: %{page_title}" + field_text: Tekstveld + setting_default_notification_option: Standaardinstelling voor mededelingen + label_user_mail_option_only_my_events: Alleen voor activiteiten die ik volg of waarbij ik betrokken ben + label_user_mail_option_none: Bij geen enkele activiteit + field_member_of_group: Groep van toegewezen persoon + field_assigned_to_role: Rol van toegewezen persoon + notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd. + label_principal_search: "Zoek naar gebruiker of groep:" + label_user_search: "Zoek naar gebruiker:" + field_visible: Zichtbaarheid + setting_commit_logtime_activity_id: Standaardactiviteit voor tijdregistratie + text_time_logged_by_changeset: Toegepast in changeset %{value}. + setting_commit_logtime_enabled: Tijdregistratie activeren + notice_gantt_chart_truncated: De Gantt-grafiek is ingekort omdat het meer objecten bevat dan kan worden weergegeven, (%{max}) + setting_gantt_items_limit: Max. aantal objecten op Gantt-grafiek + field_warn_on_leaving_unsaved: Waarschuw me wanneer ik een pagina verlaat waarvan de tekst niet is opgeslagen + text_warn_on_leaving_unsaved: De huidige pagina bevat tekst die niet is opgeslagen en zal verloren gaan als u deze pagina nu verlaat. + label_my_queries: Mijn aangepaste zoekopdrachten + text_journal_changed_no_detail: "%{label} gewijzigd" + label_news_comment_added: Commentaar aan een nieuwsitem toegevoegd + button_expand_all: Uitklappen + button_collapse_all: Inklappen + label_additional_workflow_transitions_for_assignee: Aanvullende veranderingen toegestaan wanneer de gebruiker de toegewezen persoon is + label_additional_workflow_transitions_for_author: Aanvullende veranderingen toegestaan wanneer de gebruiker de auteur is + label_bulk_edit_selected_time_entries: Alle geselecteerde tijdregistraties wijzigen? + text_time_entries_destroy_confirmation: Weet u zeker dat u de geselecteerde tijdregistratie(s) wilt verwijderen ? + label_role_anonymous: Anoniem + label_role_non_member: Geen lid + label_issue_note_added: Notitie toegevoegd + label_issue_status_updated: Status gewijzigd + label_issue_priority_updated: Prioriteit gewijzigd + label_issues_visibility_own: Issues aangemaakt door of toegewezen aan de gebruiker + field_issues_visibility: Issueweergave + label_issues_visibility_all: Alle issues + permission_set_own_issues_private: Eigen issues openbaar of privé maken + field_is_private: Privé + permission_set_issues_private: Issues openbaar of privé maken + label_issues_visibility_public: Alle niet privé-issues + text_issues_destroy_descendants_confirmation: Dit zal ook %{count} subtaken verwijderen. + field_commit_logs_encoding: Codering van commitberichten + field_scm_path_encoding: Padcodering + text_scm_path_encoding_note: "Standaard: UTF-8" + field_path_to_repository: Pad naar versieoverzicht + field_root_directory: Hoofdmap + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: "Lokale versieoverzicht (Voorbeeld: /hgrepo, c:\\hgrepo)" + text_scm_command: Commando + text_scm_command_version: Versie + label_git_report_last_commit: Laatste toevoegen voor bestanden en mappen rapporteren + text_scm_config: U kan de SCM-commando's instellen in config/configuration.yml. U moet de applicatie herstarten na de wijzigingen. + text_scm_command_not_available: SCM-commando is niet beschikbaar. Controleer de instellingen in het administratiepaneel. + notice_issue_successful_create: Issue %{id} aangemaakt. + label_between: tussen + setting_issue_group_assignment: Groepstoewijzingen toelaten + label_diff: diff + text_git_repository_note: "Lokaal versieoverzicht is leeg (Voorbeeld: /gitrepo, c:\\gitrepo)" + description_query_sort_criteria_direction: Sortering + description_project_scope: Zoekbereik + description_filter: Filteren + description_user_mail_notification: Instellingen voor e-mailnotificaties + description_message_content: Berichtinhoud + description_available_columns: Beschikbare kolommen + description_issue_category_reassign: Issuecategorie kiezen + description_search: Zoekveld + description_notes: Notities + description_choose_project: Projecten + description_query_sort_criteria_attribute: Attribuut sorteren + description_wiki_subpages_reassign: Nieuwe hoofdpagina kiezen + description_selected_columns: Geselecteerde kolommen + label_parent_revision: Hoofd + label_child_revision: Sub + error_scm_annotate_big_text_file: De vermelding kan niet worden geannoteerd, omdat het groter is dan de maximale toegewezen grootte. + setting_default_issue_start_date_to_creation_date: Huidige datum als startdatum gebruiken voor nieuwe issues. + button_edit_section: Deze sectie wijzigen + setting_repositories_encodings: Coderingen voor bijlagen en opgeslagen bestanden + description_all_columns: Alle kolommen + button_export: Exporteren + label_export_options: "%{export_format} export opties" + error_attachment_too_big: Dit bestand kan niet worden geüpload omdat het de maximaal toegestane grootte overschrijdt (%{max_size}) + notice_failed_to_save_time_entries: "Opslaan mislukt voor %{count} tijdregistratie(s) van %{total} geselecteerde: %{ids}." + label_x_issues: + zero: 0 issues + one: 1 issue + other: "%{count} issues" + label_repository_new: Nieuwe repository + field_repository_is_default: Hoofdrepository + label_copy_attachments: Kopieer bijlage(n) + label_item_position: "%{position}/%{count}" + label_completed_versions: Afgeronde versies + field_multiple: Meerdere waarden + setting_commit_cross_project_ref: Toestaan om issues van alle projecten te refereren en op te lossen + text_issue_conflict_resolution_add_notes: Mijn notities toevoegen en andere wijzigingen annuleren + text_issue_conflict_resolution_overwrite: Mijn wijzigingen alsnog toevoegen (voorgaande notities worden opgeslagen, + maar sommige notities kunnen overschreden worden) + notice_issue_update_conflict: Dit issue is reeds aangepast door een andere gebruiker terwijl u bezig was met wijzigingen + aan te brengen + text_issue_conflict_resolution_cancel: "Mijn wijzigingen annuleren en pagina opnieuw weergeven: %{link}" + permission_manage_related_issues: Gerelateerde issues beheren + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Klik om volgers toe te voegen + notice_account_deleted: Uw account is permanent verwijderd + setting_unsubscribe: Gebruikers toestaan hun eigen account te verwijderen + button_delete_my_account: Mijn account verwijderen + text_account_destroy_confirmation: |- + Weet u zeker dat u door wilt gaan? + Uw account wordt permanent verwijderd zonder enige mogelijkheid deze te heractiveren. + error_session_expired: Uw sessie is verlopen. Gelieve opnieuw in te loggen. + text_session_expiration_settings: "Opgelet: door het wijzigen van deze instelling zullen de huidige sessies verlopen, inclusief die van u." + setting_session_lifetime: Maximale sessieduur + setting_session_timeout: Sessie-inactiviteit timeout + label_session_expiration: Sessie verlopen + permission_close_project: Project sluiten/heropenen + label_show_closed_projects: Gesloten projecten weergeven + button_close: Sluiten + button_reopen: Heropenen + project_status_active: actief + project_status_closed: gesloten + project_status_archived: gearchiveerd + text_project_closed: Dit project is gesloten en kan alleen gelezen worden + notice_user_successful_create: Gebruiker %{id} aangemaakt. + field_core_fields: Standaardvelden + field_timeout: Timeout (in seconden) + setting_thumbnails_enabled: Miniaturen voor bijlagen weergeven + setting_thumbnails_size: Grootte miniaturen (in pixels) + label_status_transitions: Statustransitie + label_fields_permissions: Permissievelden + label_readonly: Alleen-lezen + label_required: Verplicht + text_repository_identifier_info: 'Alleen kleine letter (a-z), cijfers, streepjes en liggende streepjes zijn toegestaan.
    Eenmaal opgeslagen kan de identifier niet worden gewijzigd.' + field_board_parent: Hoofdforum + label_attribute_of_project: Project %{name} + label_attribute_of_author: Auteur(s) %{name} + label_attribute_of_assigned_to: Toegewezen %{name} + label_attribute_of_fixed_version: "%{name} van versie" + label_copy_subtasks: Subtaken kopiëren + label_copied_to: gekopieerd naar + label_copied_from: gekopieerd van + label_any_issues_in_project: alle issues in project + label_any_issues_not_in_project: alle issues niet in project + field_private_notes: Privénotities + permission_view_private_notes: Privénotities bekijken + permission_set_notes_private: Notities privé maken + label_no_issues_in_project: geen issues in project + label_any: alle + label_last_n_weeks: afgelopen %{count} weken + setting_cross_project_subtasks: Subtaken in andere projecten toelaten + label_cross_project_descendants: Met subprojecten + label_cross_project_tree: Met projectboom + label_cross_project_hierarchy: Met projecthiërarchie + label_cross_project_system: Met alle projecten + button_hide: Verberg + setting_non_working_week_days: Niet-werkdagen + label_in_the_next_days: in de volgende + label_in_the_past_days: in de afgelopen + label_attribute_of_user: Gebruikers %{name} + text_turning_multiple_off: "Bij het uitschakelen van meerdere waarden zal er maar één waarde bewaard blijven." + label_attribute_of_issue: Issues %{name} + permission_add_documents: Documenten toevoegen + permission_edit_documents: Documenten bewerken + permission_delete_documents: Documenten verwijderen + label_gantt_progress_line: Voortgangslijn + setting_jsonp_enabled: JSONP support inschakelen + field_inherit_members: Bovenliggende leden erven + field_closed_on: Gesloten + field_generate_password: Wachtwoord genereren + setting_default_projects_tracker_ids: Standaardtrackers voor nieuwe projecten + label_total_time: Totaal + setting_emails_header: E-mailhoofding + notice_account_not_activated_yet: U heeft uw account nog niet geactiveerd. Klik op deze link + om een nieuwe activeringsemail te versturen. + notice_account_locked: Uw account is vergrendeld. + notice_account_register_done: "Account aanmaken is gelukt. Een e-mail met instructies om uw account te activeren is verstuurd naar: %{email}." + label_hidden: Verborgen + label_visibility_private: voor mij alleen + label_visibility_roles: alleen voor deze rollen + label_visibility_public: voor elke gebruiker + field_must_change_passwd: Wachtwoord wijzigen bij eerstvolgende login + notice_new_password_must_be_different: Het nieuwe wachtwoord mag niet hetzelfde zijn als het huidige wachtwoord + setting_mail_handler_excluded_filenames: Bijlagen uitsluiten op basis van naam + text_convert_available: ImageMagick comversie beschikbaar (optioneel) + label_link: Link + label_only: enkel + label_drop_down_list: keuzelijst + label_checkboxes: keuzevakjes + label_link_values_to: Waarden koppelen aan URL + setting_force_default_language_for_anonymous: Standaardtaal voor anonieme gebruikers + setting_force_default_language_for_loggedin: Standaardtaal voor ingelogde gebruikers + label_custom_field_select_type: Selecteer het objecttype waaraan u het vrij veld wilt vasthangen + label_issue_assigned_to_updated: Toegewezen persoon gewijzigd + label_check_for_updates: Controleren of er updates beschikbaar zijn + label_latest_compatible_version: Laatste compatibele versie + label_unknown_plugin: Onbekende plugin + label_radio_buttons: selectieknoppen + label_group_anonymous: Anonieme gebruikers + label_group_non_member: Geen lid gebruikers + label_add_projects: Projecten toevoegen + field_default_status: Standaardstatus + text_subversion_repository_note: 'Voorbeelden: file:///, http://, https://, svn://, svn+[tunnelschema]://' + field_users_visibility: Gebruikersweergave + label_users_visibility_all: Alle actieve gebruikers + label_users_visibility_members_of_visible_projects: Gebruikers van zichtbare projecten + label_edit_attachments: Bijlagen bewerken + setting_link_copied_issue: Koppelen met issue bij kopiëren + label_link_copied_issue: Koppelen met issuekopie + label_ask: Vraag iedere keer + label_search_attachments_yes: Zoeken in bestandsnamen en beschrijvingen van bijlagen + label_search_attachments_no: Niet zoeken in bijlagen + label_search_attachments_only: Enkel zoeken in bijlagen + label_search_open_issues_only: Enkel openstaande issues + field_address: Adres + setting_max_additional_emails: Maximum aantal bijkomende e-mailadressen + label_email_address_plural: E-mails + label_email_address_add: Nieuw e-mailadres + label_enable_notifications: Notificaties inschakelen + label_disable_notifications: Notificaties uitschakelen + setting_search_results_per_page: Zoekresultaten per pagina + label_blank_value: leeg + permission_copy_issues: Issues kopiëren + error_password_expired: Uw wachtwoord is verlopen of moet gewijzigd worden op vraag van een beheerder. + field_time_entries_visibility: Tijdregistratieweergave + setting_password_max_age: Wachtwoord wijzigen verplicht na + label_parent_task_attributes: Attributen van bovenliggende taken + label_parent_task_attributes_derived: Berekend vanuit subtaken + label_parent_task_attributes_independent: Onafhankelijk van subtaken + label_time_entries_visibility_all: Alle tijdregistraties + label_time_entries_visibility_own: Tijdregistraties aangemaakt door gebruiker + label_member_management: Ledenbeheer + label_member_management_all_roles: Alle rollen + label_member_management_selected_roles_only: Enkel deze rollen + label_password_required: Bevestig uw wachtwoord om verder te gaan + label_total_spent_time: Totaal gespendeerde tijd + notice_import_finished: "%{count} items werden geïmporteerd" + notice_import_finished_with_errors: "%{count} van in totaal %{total} items kunnen niet geïmporteerd worden" + error_invalid_file_encoding: Het bestand is geen geldig geëncodeerd %{encoding} bestand + error_invalid_csv_file_or_settings: Het bestand is geen CSV-bestand of voldoet niet aan onderstaande instellingen + error_can_not_read_import_file: Er is een fout opgetreden bij het inlezen van het bestand + permission_import_issues: Issues importeren + label_import_issues: Issues importeren + label_select_file_to_import: Selecteer het bestand om te importeren + label_fields_separator: Scheidingsteken + label_fields_wrapper: Tekstscheidingsteken + label_encoding: Codering + label_comma_char: Komma + label_semi_colon_char: Puntkomma + label_quote_char: Enkel aanhalingsteken + label_double_quote_char: Dubbel aanhalingsteken + label_fields_mapping: Veldkoppeling + label_file_content_preview: Voorbeeld van bestandsinhoud + label_create_missing_values: Ontbrekende waarden invullen + button_import: Importeren + field_total_estimated_hours: Geschatte totaaltijd + label_api: API + label_total_plural: Totalen + label_assigned_issues: Toegewezen issues + label_field_format_enumeration: Sleutel/waarde lijst + label_f_hour_short: '%{value} u' + field_default_version: Standaardversie + error_attachment_extension_not_allowed: Bestandsextensie %{extension} van bijlage is niet toegelaten + setting_attachment_extensions_allowed: Toegelaten bestandsextensies + setting_attachment_extensions_denied: Niet toegelaten bestandsextensies + label_any_open_issues: alle open issues + label_no_open_issues: geen open issues + label_default_values_for_new_users: Standaardwaarden voor nieuwe gebruikers + error_ldap_bind_credentials: Ongeldige LDAP account/wachtwoord-combinatie + setting_sys_api_key: API-sleutel + setting_lost_password: Wachtwoord vergeten + mail_subject_security_notification: Beveiligingsnotificatie + mail_body_security_notification_change: ! '%{field} werd aangepast.' + mail_body_security_notification_change_to: ! '%{field} werd aangepast naar %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} werd toegevoegd.' + mail_body_security_notification_remove: ! '%{field} %{value} werd verwijderd.' + mail_body_security_notification_notify_enabled: E-mailadres %{value} ontvangt vanaf heden notificaties. + mail_body_security_notification_notify_disabled: E-mailadres %{value} ontvangt niet langer notificaties. + mail_body_settings_updated: ! 'Volgende instellingen werden gewijzigd:' + field_remote_ip: IP-adres + label_wiki_page_new: Nieuwe wikipagina + label_relations: Relaties + button_filter: Filteren + mail_body_password_updated: Uw wachtwoord werd gewijzigd. + label_no_preview: Geen voorbeeld beschikbaar + error_no_tracker_allowed_for_new_issue_in_project: Het project bevat geen tracker waarvoor u een + issue kan aanmaken + label_tracker_all: Alle trackers + setting_new_item_menu_tab: Projectmenu-tab om nieuwe objecten aan te maken + label_new_project_issue_tab_enabled: ! '"Nieuw issue"-tab weergeven' + label_new_object_tab_enabled: ! '"+"-tab met keuzelijst weergeven' + error_no_projects_with_tracker_allowed_for_new_issue: Er zijn geen projecten met trackers + waarvoor u een issue kan aanmaken + field_textarea_font: Lettertype voor tekstvelden + label_font_default: Standaardlettertype + label_font_monospace: Monospaced-lettertype + label_font_proportional: Proportioneel lettertype + setting_timespan_format: Tijdspanneformaat + label_table_of_contents: Inhoudsopgave + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/no.yml b/config/locales/no.yml new file mode 100644 index 0000000..54628ba --- /dev/null +++ b/config/locales/no.yml @@ -0,0 +1,1220 @@ +# Norwegian, norsk bokmål, by irb.no +"no": + support: + array: + sentence_connector: "og" + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%e. %b" + long: "%e. %B %Y" + day_names: [søndag, mandag, tirsdag, onsdag, torsdag, fredag, lørdag] + abbr_day_names: [søn, man, tir, ons, tor, fre, lør] + month_names: [~, januar, februar, mars, april, mai, juni, juli, august, september, oktober, november, desember] + abbr_month_names: [~, jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, des] + order: + - :day + - :month + - :year + time: + formats: + default: "%A, %e. %B %Y, %H:%M" + time: "%H:%M" + short: "%e. %B, %H:%M" + long: "%A, %e. %B %Y, %H:%M" + am: "" + pm: "" + datetime: + distance_in_words: + half_a_minute: "et halvt minutt" + less_than_x_seconds: + one: "mindre enn 1 sekund" + other: "mindre enn %{count} sekunder" + x_seconds: + one: "1 sekund" + other: "%{count} sekunder" + less_than_x_minutes: + one: "mindre enn 1 minutt" + other: "mindre enn %{count} minutter" + x_minutes: + one: "1 minutt" + other: "%{count} minutter" + about_x_hours: + one: "rundt 1 time" + other: "rundt %{count} timer" + x_hours: + one: "1 time" + other: "%{count} timer" + x_days: + one: "1 dag" + other: "%{count} dager" + about_x_months: + one: "rundt 1 måned" + other: "rundt %{count} måneder" + x_months: + one: "1 måned" + other: "%{count} måneder" + about_x_years: + one: "rundt 1 år" + other: "rundt %{count} år" + over_x_years: + one: "over 1 år" + other: "over %{count} år" + almost_x_years: + one: "nesten 1 år" + other: "nesten %{count} år" + number: + format: + precision: 3 + separator: "." + delimiter: "," + currency: + format: + unit: "kr" + format: "%n %u" + precision: + format: + delimiter: "" + precision: 4 + human: + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + activerecord: + errors: + template: + header: "kunne ikke lagre %{model} på grunn av %{count} feil." + body: "det oppstod problemer i følgende felt:" + messages: + inclusion: "er ikke inkludert i listen" + exclusion: "er reservert" + invalid: "er ugyldig" + confirmation: "passer ikke bekreftelsen" + accepted: "må være akseptert" + empty: "kan ikke være tom" + blank: "kan ikke være blank" + too_long: "er for lang (maksimum %{count} tegn)" + too_short: "er for kort (minimum %{count} tegn)" + wrong_length: "er av feil lengde (maksimum %{count} tegn)" + taken: "er allerede i bruk" + not_a_number: "er ikke et tall" + greater_than: "må være større enn %{count}" + greater_than_or_equal_to: "må være større enn eller lik %{count}" + equal_to: "må være lik %{count}" + less_than: "må være mindre enn %{count}" + less_than_or_equal_to: "må være mindre enn eller lik %{count}" + odd: "må være oddetall" + even: "må være partall" + greater_than_start_date: "må være større enn startdato" + not_same_project: "hører ikke til samme prosjekt" + circular_dependency: "Denne relasjonen ville lagd en sirkulær avhengighet" + cant_link_an_issue_with_a_descendant: "En sak kan ikke kobles mot en av sine undersaker" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + + actionview_instancetag_blank_option: Vennligst velg + + general_text_No: 'Nei' + general_text_Yes: 'Ja' + general_text_no: 'nei' + general_text_yes: 'ja' + general_lang_name: 'Norwegian (Norsk bokmål)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Kontoen er oppdatert. + notice_account_invalid_credentials: Feil brukernavn eller passord + notice_account_password_updated: Passordet er oppdatert. + notice_account_wrong_password: Feil passord + notice_account_register_done: Kontoen er opprettet. Klikk lenken som er sendt deg i e-post for å aktivere kontoen. + notice_account_unknown_email: Ukjent bruker. + notice_can_t_change_password: Denne kontoen bruker ekstern godkjenning. Passordet kan ikke endres. + notice_account_lost_email_sent: En e-post med instruksjoner for å velge et nytt passord er sendt til deg. + notice_account_activated: Din konto er aktivert. Du kan nå logge inn. + notice_successful_create: Opprettet. + notice_successful_update: Oppdatert. + notice_successful_delete: Slettet. + notice_successful_connection: Koblet opp. + notice_file_not_found: Siden du forsøkte å vise eksisterer ikke, eller er slettet. + notice_locking_conflict: Data har blitt oppdatert av en annen bruker. + notice_not_authorized: Du har ikke adgang til denne siden. + notice_email_sent: "En e-post er sendt til %{value}" + notice_email_error: "En feil oppstod under sending av e-post (%{value})" + notice_feeds_access_key_reseted: Din Atom-tilgangsnøkkel er nullstilt. + notice_failed_to_save_issues: "Lykkes ikke å lagre %{count} sak(er) på %{total} valgt: %{ids}." + notice_no_issue_selected: "Ingen sak valgt! Vennligst merk sakene du vil endre." + notice_account_pending: "Din konto ble opprettet og avventer nå administrativ godkjenning." + notice_default_data_loaded: Standardkonfigurasjonen lastet inn. + + error_can_t_load_default_data: "Standardkonfigurasjonen kunne ikke lastes inn: %{value}" + error_scm_not_found: "Elementet og/eller revisjonen eksisterer ikke i depoet." + error_scm_command_failed: "En feil oppstod under tilkobling til depoet: %{value}" + error_scm_annotate: "Elementet eksisterer ikke, eller kan ikke noteres." + error_issue_not_found_in_project: 'Saken eksisterer ikke, eller hører ikke til dette prosjektet' + + mail_subject_lost_password: "Ditt %{value} passord" + mail_body_lost_password: 'Klikk følgende lenke for å endre ditt passord:' + mail_subject_register: "%{value} kontoaktivering" + mail_body_register: 'Klikk følgende lenke for å aktivere din konto:' + mail_body_account_information_external: "Du kan bruke din %{value}-konto for å logge inn." + mail_body_account_information: Informasjon om din konto + mail_subject_account_activation_request: "%{value} kontoaktivering" + mail_body_account_activation_request: "En ny bruker (%{value}) er registrert, og avventer din godkjenning:" + mail_subject_reminder: "%{count} sak(er) har frist de kommende %{days} dagene" + mail_body_reminder: "%{count} sak(er) som er tildelt deg har frist de kommende %{days} dager:" + + + field_name: Navn + field_description: Beskrivelse + field_summary: Oppsummering + field_is_required: Kreves + field_firstname: Fornavn + field_lastname: Etternavn + field_mail: E-post + field_filename: Fil + field_filesize: Størrelse + field_downloads: Nedlastinger + field_author: Forfatter + field_created_on: Opprettet + field_updated_on: Oppdatert + field_field_format: Format + field_is_for_all: For alle prosjekter + field_possible_values: Lovlige verdier + field_regexp: Regular expression + field_min_length: Minimum lengde + field_max_length: Maksimum lengde + field_value: Verdi + field_category: Kategori + field_title: Tittel + field_project: Prosjekt + field_issue: Sak + field_status: Status + field_notes: Notater + field_is_closed: Lukker saken + field_is_default: Standardverdi + field_tracker: Sakstype + field_subject: Emne + field_due_date: Frist + field_assigned_to: Tildelt til + field_priority: Prioritet + field_fixed_version: Mål-versjon + field_user: Bruker + field_role: Rolle + field_homepage: Hjemmeside + field_is_public: Offentlig + field_parent: Underprosjekt av + field_is_in_roadmap: Vises i veikart + field_login: Brukernavn + field_mail_notification: E-post-varsling + field_admin: Administrator + field_last_login_on: Sist innlogget + field_language: Språk + field_effective_date: Dato + field_password: Passord + field_new_password: Nytt passord + field_password_confirmation: Bekreft passord + field_version: Versjon + field_type: Type + field_host: Vert + field_port: Port + field_account: Konto + field_base_dn: Base DN + field_attr_login: Brukernavnsattributt + field_attr_firstname: Fornavnsattributt + field_attr_lastname: Etternavnsattributt + field_attr_mail: E-post-attributt + field_onthefly: On-the-fly brukeropprettelse + field_start_date: Start + field_done_ratio: "% Ferdig" + field_auth_source: Autentiseringskilde + field_hide_mail: Skjul min epost-adresse + field_comments: Kommentarer + field_url: URL + field_start_page: Startside + field_subproject: Underprosjekt + field_hours: Timer + field_activity: Aktivitet + field_spent_on: Dato + field_identifier: Identifikasjon + field_is_filter: Brukes som filter + field_issue_to: Relaterte saker + field_delay: Forsinkelse + field_assignable: Saker kan tildeles denne rollen + field_redirect_existing_links: Viderekoble eksisterende lenker + field_estimated_hours: Estimert tid + field_column_names: Kolonner + field_time_zone: Tidssone + field_searchable: Søkbar + field_default_value: Standardverdi + field_comments_sorting: Vis kommentarer + + setting_app_title: Applikasjonstittel + setting_app_subtitle: Applikasjonens undertittel + setting_welcome_text: Velkomsttekst + setting_default_language: Standardspråk + setting_login_required: Krever innlogging + setting_self_registration: Selvregistrering + setting_attachment_max_size: Maks. størrelse vedlegg + setting_issues_export_limit: Eksportgrense for saker + setting_mail_from: Avsenders epost + setting_bcc_recipients: Blindkopi (bcc) til mottakere + setting_host_name: Vertsnavn + setting_text_formatting: Tekstformattering + setting_wiki_compression: Komprimering av Wiki-historikk + setting_feeds_limit: Innholdsgrense for Feed + setting_default_projects_public: Nye prosjekter er offentlige som standard + setting_autofetch_changesets: Autohenting av endringssett + setting_sys_api_enabled: Aktiver webservice for depot-administrasjon + setting_commit_ref_keywords: Nøkkelord for referanse + setting_commit_fix_keywords: Nøkkelord for retting + setting_autologin: Autoinnlogging + setting_date_format: Datoformat + setting_time_format: Tidsformat + setting_cross_project_issue_relations: Tillat saksrelasjoner på kryss av prosjekter + setting_issue_list_default_columns: Standardkolonner vist i sakslisten + setting_emails_footer: Epost-signatur + setting_protocol: Protokoll + setting_per_page_options: Alternativer, objekter pr. side + setting_user_format: Visningsformat, brukere + setting_activity_days_default: Dager vist på prosjektaktivitet + setting_display_subprojects_issues: Vis saker fra underprosjekter på hovedprosjekt som standard + setting_enabled_scm: Aktiviserte SCM + + project_module_issue_tracking: Sakshåndtering + project_module_time_tracking: Tidsregistrering + project_module_news: Nyheter + project_module_documents: Dokumenter + project_module_files: Filer + project_module_wiki: Wiki + project_module_repository: Depot + project_module_boards: Forumer + + label_user: Bruker + label_user_plural: Brukere + label_user_new: Ny bruker + label_project: Prosjekt + label_project_new: Nytt prosjekt + label_project_plural: Prosjekter + label_x_projects: + zero: ingen prosjekter + one: 1 prosjekt + other: "%{count} prosjekter" + label_project_all: Alle prosjekter + label_project_latest: Siste prosjekter + label_issue: Sak + label_issue_new: Ny sak + label_issue_plural: Saker + label_issue_view_all: Vis alle saker + label_issues_by: "Saker etter %{value}" + label_issue_added: Sak lagt til + label_issue_updated: Sak oppdatert + label_document: Dokument + label_document_new: Nytt dokument + label_document_plural: Dokumenter + label_document_added: Dokument lagt til + label_role: Rolle + label_role_plural: Roller + label_role_new: Ny rolle + label_role_and_permissions: Roller og rettigheter + label_member: Medlem + label_member_new: Nytt medlem + label_member_plural: Medlemmer + label_tracker: Sakstype + label_tracker_plural: Sakstyper + label_tracker_new: Ny sakstype + label_workflow: Arbeidsflyt + label_issue_status: Saksstatus + label_issue_status_plural: Saksstatuser + label_issue_status_new: Ny status + label_issue_category: Sakskategori + label_issue_category_plural: Sakskategorier + label_issue_category_new: Ny kategori + label_custom_field: Eget felt + label_custom_field_plural: Egne felt + label_custom_field_new: Nytt eget felt + label_enumerations: Listeverdier + label_enumeration_new: Ny verdi + label_information: Informasjon + label_information_plural: Informasjon + label_please_login: Vennlist logg inn + label_register: Registrer + label_password_lost: Mistet passord + label_home: Hjem + label_my_page: Min side + label_my_account: Min konto + label_my_projects: Mine prosjekter + label_administration: Administrasjon + label_login: Logg inn + label_logout: Logg ut + label_help: Hjelp + label_reported_issues: Rapporterte saker + label_assigned_to_me_issues: Saker tildelt meg + label_last_login: Sist innlogget + label_registered_on: Registrert + label_activity: Aktivitet + label_overall_activity: All aktivitet + label_new: Ny + label_logged_as: Innlogget som + label_environment: Miljø + label_authentication: Autentisering + label_auth_source: Autentiseringskilde + label_auth_source_new: Ny autentiseringskilde + label_auth_source_plural: Autentiseringskilder + label_subproject_plural: Underprosjekter + label_and_its_subprojects: "%{value} og dets underprosjekter" + label_min_max_length: Min.-maks. lengde + label_list: Liste + label_date: Dato + label_integer: Heltall + label_float: Kommatall + label_boolean: Sann/usann + label_string: Tekst + label_text: Lang tekst + label_attribute: Attributt + label_attribute_plural: Attributter + label_no_data: Ingen data å vise + label_change_status: Endre status + label_history: Historikk + label_attachment: Fil + label_attachment_new: Ny fil + label_attachment_delete: Slett fil + label_attachment_plural: Filer + label_file_added: Fil lagt til + label_report: Rapport + label_report_plural: Rapporter + label_news: Nyheter + label_news_new: Legg til nyhet + label_news_plural: Nyheter + label_news_latest: Siste nyheter + label_news_view_all: Vis alle nyheter + label_news_added: Nyhet lagt til + label_settings: Innstillinger + label_overview: Oversikt + label_version: Versjon + label_version_new: Ny versjon + label_version_plural: Versjoner + label_confirmation: Bekreftelse + label_export_to: Eksporter til + label_read: Leser... + label_public_projects: Offentlige prosjekt + label_open_issues: åpen + label_open_issues_plural: åpne + label_closed_issues: lukket + label_closed_issues_plural: lukkede + label_x_open_issues_abbr: + zero: 0 åpne + one: 1 åpen + other: "%{count} åpne" + label_x_closed_issues_abbr: + zero: 0 lukket + one: 1 lukket + other: "%{count} lukket" + label_total: Totalt + label_permissions: Rettigheter + label_current_status: Nåværende status + label_new_statuses_allowed: Tillate nye statuser + label_all: alle + label_none: ingen + label_nobody: ingen + label_next: Neste + label_previous: Forrige + label_used_by: Brukt av + label_details: Detaljer + label_add_note: Legg til notat + label_calendar: Kalender + label_months_from: måneder fra + label_gantt: Gantt + label_internal: Intern + label_last_changes: "siste %{count} endringer" + label_change_view_all: Vis alle endringer + label_comment: Kommentar + label_comment_plural: Kommentarer + label_x_comments: + zero: ingen kommentarer + one: 1 kommentar + other: "%{count} kommentarer" + label_comment_add: Legg til kommentar + label_comment_added: Kommentar lagt til + label_comment_delete: Slett kommentar + label_query: Egen spørring + label_query_plural: Egne spørringer + label_query_new: Ny spørring + label_filter_add: Legg til filter + label_filter_plural: Filtre + label_equals: er + label_not_equals: er ikke + label_in_less_than: er mindre enn + label_in_more_than: in mer enn + label_in: i + label_today: idag + label_all_time: all tid + label_yesterday: i går + label_this_week: denne uken + label_last_week: sist uke + label_last_n_days: "siste %{count} dager" + label_this_month: denne måneden + label_last_month: siste måned + label_this_year: dette året + label_date_range: Dato-spenn + label_less_than_ago: mindre enn dager siden + label_more_than_ago: mer enn dager siden + label_ago: dager siden + label_contains: inneholder + label_not_contains: ikke inneholder + label_day_plural: dager + label_repository: Depot + label_repository_plural: Depoter + label_browse: Utforsk + label_revision: Revisjon + label_revision_plural: Revisjoner + label_associated_revisions: Assosierte revisjoner + label_added: lagt til + label_modified: endret + label_deleted: slettet + label_latest_revision: Siste revisjon + label_latest_revision_plural: Siste revisjoner + label_view_revisions: Vis revisjoner + label_max_size: Maksimum størrelse + label_sort_highest: Flytt til toppen + label_sort_higher: Flytt opp + label_sort_lower: Flytt ned + label_sort_lowest: Flytt til bunnen + label_roadmap: Veikart + label_roadmap_due_in: "Frist om %{value}" + label_roadmap_overdue: "%{value} over fristen" + label_roadmap_no_issues: Ingen saker for denne versjonen + label_search: Søk + label_result_plural: Resultater + label_all_words: Alle ord + label_wiki: Wiki + label_wiki_edit: Wiki endring + label_wiki_edit_plural: Wiki endringer + label_wiki_page: Wiki-side + label_wiki_page_plural: Wiki-sider + label_index_by_title: Indekser etter tittel + label_index_by_date: Indekser etter dato + label_current_version: Gjeldende versjon + label_preview: Forhåndsvis + label_feed_plural: Feeder + label_changes_details: Detaljer om alle endringer + label_issue_tracking: Sakshåndtering + label_spent_time: Brukt tid + label_f_hour: "%{value} time" + label_f_hour_plural: "%{value} timer" + label_time_tracking: Tidsregistrering + label_change_plural: Endringer + label_statistics: Statistikk + label_commits_per_month: Innsendinger pr. måned + label_commits_per_author: Innsendinger pr. forfatter + label_view_diff: Vis forskjeller + label_diff_inline: i teksten + label_diff_side_by_side: side ved side + label_options: Alternativer + label_copy_workflow_from: Kopier arbeidsflyt fra + label_permissions_report: Rettighetsrapport + label_watched_issues: Overvåkede saker + label_related_issues: Relaterte saker + label_applied_status: Gitt status + label_loading: Laster... + label_relation_new: Ny relasjon + label_relation_delete: Slett relasjon + label_relates_to: relatert til + label_duplicates: dupliserer + label_duplicated_by: duplisert av + label_blocks: blokkerer + label_blocked_by: blokkert av + label_precedes: kommer før + label_follows: følger + label_stay_logged_in: Hold meg innlogget + label_disabled: avslått + label_show_completed_versions: Vis ferdige versjoner + label_me: meg + label_board: Forum + label_board_new: Nytt forum + label_board_plural: Forumer + label_topic_plural: Emner + label_message_plural: Meldinger + label_message_last: Siste melding + label_message_new: Ny melding + label_message_posted: Melding lagt til + label_reply_plural: Svar + label_send_information: Send kontoinformasjon til brukeren + label_year: År + label_month: Måned + label_week: Uke + label_date_from: Fra + label_date_to: Til + label_language_based: Basert på brukerens språk + label_sort_by: "Sorter etter %{value}" + label_send_test_email: Send en epost-test + label_feeds_access_key_created_on: "Atom tilgangsnøkkel opprettet for %{value} siden" + label_module_plural: Moduler + label_added_time_by: "Lagt til av %{author} for %{age} siden" + label_updated_time: "Oppdatert for %{value} siden" + label_jump_to_a_project: Gå til et prosjekt... + label_file_plural: Filer + label_changeset_plural: Endringssett + label_default_columns: Standardkolonner + label_no_change_option: (Ingen endring) + label_bulk_edit_selected_issues: Samlet endring av valgte saker + label_theme: Tema + label_default: Standard + label_search_titles_only: Søk bare i titler + label_user_mail_option_all: "For alle hendelser på mine prosjekter" + label_user_mail_option_selected: "For alle hendelser på valgte prosjekt..." + label_user_mail_no_self_notified: "Jeg vil ikke bli varslet om endringer jeg selv gjør" + label_registration_activation_by_email: kontoaktivering pr. e-post + label_registration_manual_activation: manuell kontoaktivering + label_registration_automatic_activation: automatisk kontoaktivering + label_display_per_page: "Pr. side: %{value}" + label_age: Alder + label_change_properties: Endre egenskaper + label_general: Generell + label_scm: SCM + label_plugins: Tillegg + label_ldap_authentication: LDAP-autentisering + label_downloads_abbr: Nedl. + label_optional_description: Valgfri beskrivelse + label_add_another_file: Legg til en fil til + label_preferences: Brukerinnstillinger + label_chronological_order: I kronologisk rekkefølge + label_reverse_chronological_order: I omvendt kronologisk rekkefølge + + button_login: Logg inn + button_submit: Send + button_save: Lagre + button_check_all: Merk alle + button_uncheck_all: Avmerk alle + button_delete: Slett + button_create: Opprett + button_test: Test + button_edit: Endre + button_add: Legg til + button_change: Endre + button_apply: Bruk + button_clear: Nullstill + button_lock: Lås + button_unlock: Lås opp + button_download: Last ned + button_list: Liste + button_view: Vis + button_move: Flytt + button_back: Tilbake + button_cancel: Avbryt + button_activate: Aktiver + button_sort: Sorter + button_log_time: Logg tid + button_rollback: Rull tilbake til denne versjonen + button_watch: Overvåk + button_unwatch: Stopp overvåkning + button_reply: Svar + button_archive: Arkiver + button_unarchive: Gjør om arkivering + button_reset: Nullstill + button_rename: Endre navn + button_change_password: Endre passord + button_copy: Kopier + button_annotate: Notér + button_update: Oppdater + button_configure: Konfigurer + + status_active: aktiv + status_registered: registrert + status_locked: låst + + text_select_mail_notifications: Velg hendelser som skal varsles med e-post. + text_regexp_info: f.eks. ^[A-Z0-9]+$ + text_min_max_length_info: 0 betyr ingen begrensning + text_project_destroy_confirmation: Er du sikker på at du vil slette dette prosjekter og alle relatert data ? + text_subprojects_destroy_warning: "Underprojekt(ene): %{value} vil også bli slettet." + text_workflow_edit: Velg en rolle og en sakstype for å endre arbeidsflyten + text_are_you_sure: Er du sikker ? + text_tip_issue_begin_day: oppgaven starter denne dagen + text_tip_issue_end_day: oppgaven avsluttes denne dagen + text_tip_issue_begin_end_day: oppgaven starter og avsluttes denne dagen + text_caracters_maximum: "%{count} tegn maksimum." + text_caracters_minimum: "Må være minst %{count} tegn langt." + text_length_between: "Lengde mellom %{min} og %{max} tegn." + text_tracker_no_workflow: Ingen arbeidsflyt definert for denne sakstypen + text_unallowed_characters: Ugyldige tegn + text_comma_separated: Flere verdier tillat (kommaseparert). + text_issues_ref_in_commit_messages: Referering og retting av saker i innsendingsmelding + text_issue_added: "Sak %{id} er innrapportert av %{author}." + text_issue_updated: "Sak %{id} er oppdatert av %{author}." + text_wiki_destroy_confirmation: Er du sikker på at du vil slette denne wikien og alt innholdet ? + text_issue_category_destroy_question: "Noen saker (%{count}) er lagt til i denne kategorien. Hva vil du gjøre ?" + text_issue_category_destroy_assignments: Fjern bruk av kategorier + text_issue_category_reassign_to: Overfør sakene til denne kategorien + text_user_mail_option: "For ikke-valgte prosjekter vil du bare motta varsling om ting du overvåker eller er involveret i (eks. saker du er forfatter av eller er tildelt)." + text_no_configuration_data: "Roller, arbeidsflyt, sakstyper og -statuser er ikke konfigurert enda.\nDet anbefales sterkt å laste inn standardkonfigurasjonen. Du vil kunne endre denne etter den er innlastet." + text_load_default_configuration: Last inn standardkonfigurasjonen + text_status_changed_by_changeset: "Brukt i endringssett %{value}." + text_issues_destroy_confirmation: 'Er du sikker på at du vil slette valgte sak(er) ?' + text_select_project_modules: 'Velg moduler du vil aktivere for dette prosjektet:' + text_default_administrator_account_changed: Standard administrator-konto er endret + text_file_repository_writable: Fil-arkivet er skrivbart + text_rmagick_available: RMagick er tilgjengelig (valgfritt) + text_destroy_time_entries_question: "%{hours} timer er ført på sakene du er i ferd med å slette. Hva vil du gjøre ?" + text_destroy_time_entries: Slett førte timer + text_assign_time_entries_to_project: Overfør førte timer til prosjektet + text_reassign_time_entries: 'Overfør førte timer til denne saken:' + text_user_wrote: "%{value} skrev:" + + default_role_manager: Leder + default_role_developer: Utvikler + default_role_reporter: Rapportør + default_tracker_bug: Feil + default_tracker_feature: Funksjon + default_tracker_support: Support + default_issue_status_new: Ny + default_issue_status_in_progress: Pågår + default_issue_status_resolved: Avklart + default_issue_status_feedback: Tilbakemelding + default_issue_status_closed: Lukket + default_issue_status_rejected: Avvist + default_doc_category_user: Brukerdokumentasjon + default_doc_category_tech: Teknisk dokumentasjon + default_priority_low: Lav + default_priority_normal: Normal + default_priority_high: Høy + default_priority_urgent: Haster + default_priority_immediate: Omgående + default_activity_design: Design + default_activity_development: Utvikling + + enumeration_issue_priorities: Sakssprioriteringer + enumeration_doc_categories: Dokumentkategorier + enumeration_activities: Aktiviteter (tidsregistrering) + text_enumeration_category_reassign_to: 'Endre dem til denne verdien:' + text_enumeration_destroy_question: "%{count} objekter er endret til denne verdien." + label_incoming_emails: Innkommende e-post + label_generate_key: Generer en nøkkel + setting_mail_handler_api_enabled: Skru på WS for innkommende epost + setting_mail_handler_api_key: API-nøkkel + text_email_delivery_not_configured: "Levering av epost er ikke satt opp, og varsler er skrudd av.\nStill inn din SMTP-tjener i config/configuration.yml og start programmet på nytt for å skru det på." + field_parent_title: Overordnet side + label_issue_watchers: Overvåkere + button_quote: Sitat + setting_sequential_project_identifiers: Generer sekvensielle prosjekt-IDer + notice_unable_delete_version: Kan ikke slette versjonen + label_renamed: gitt nytt navn + label_copied: kopiert + setting_plain_text_mail: kun ren tekst (ikke HTML) + permission_view_files: Vise filer + permission_edit_issues: Redigere saker + permission_edit_own_time_entries: Redigere egne timelister + permission_manage_public_queries: Administrere delte søk + permission_add_issues: Legge inn saker + permission_log_time: Loggføre timer + permission_view_changesets: Vise endringssett + permission_view_time_entries: Vise brukte timer + permission_manage_versions: Administrere versjoner + permission_manage_wiki: Administrere wiki + permission_manage_categories: Administrere kategorier for saker + permission_protect_wiki_pages: Beskytte wiki-sider + permission_comment_news: Kommentere nyheter + permission_delete_messages: Slette meldinger + permission_select_project_modules: Velge prosjektmoduler + permission_edit_wiki_pages: Redigere wiki-sider + permission_add_issue_watchers: Legge til overvåkere + permission_view_gantt: Vise gantt-diagram + permission_move_issues: Flytte saker + permission_manage_issue_relations: Administrere saksrelasjoner + permission_delete_wiki_pages: Slette wiki-sider + permission_manage_boards: Administrere forum + permission_delete_wiki_pages_attachments: Slette vedlegg + permission_view_wiki_edits: Vise wiki-historie + permission_add_messages: Sende meldinger + permission_view_messages: Vise meldinger + permission_manage_files: Administrere filer + permission_edit_issue_notes: Redigere notater + permission_manage_news: Administrere nyheter + permission_view_calendar: Vise kalender + permission_manage_members: Administrere medlemmer + permission_edit_messages: Redigere meldinger + permission_delete_issues: Slette saker + permission_view_issue_watchers: Vise liste over overvåkere + permission_manage_repository: Administrere depot + permission_commit_access: Tilgang til innsending + permission_browse_repository: Bla gjennom depot + permission_view_documents: Vise dokumenter + permission_edit_project: Redigere prosjekt + permission_add_issue_notes: Legge til notater + permission_save_queries: Lagre søk + permission_view_wiki_pages: Vise wiki + permission_rename_wiki_pages: Gi wiki-sider nytt navn + permission_edit_time_entries: Redigere timelister + permission_edit_own_issue_notes: Redigere egne notater + setting_gravatar_enabled: Bruk Gravatar-brukerikoner + label_example: Eksempel + text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + permission_edit_own_messages: Rediger egne meldinger + permission_delete_own_messages: Slett egne meldinger + label_user_activity: "%{value}s aktivitet" + label_updated_time_by: "Oppdatert av %{author} for %{age} siden" + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + setting_diff_max_lines_displayed: Max number of diff lines displayed + text_plugin_assets_writable: Plugin assets directory writable + warning_attachments_not_saved: "%{count} fil(er) kunne ikke lagres." + button_create_and_continue: Opprett og fortsett + text_custom_field_possible_values_info: 'En linje for hver verdi' + label_display: Visning + field_editable: Redigerbar + setting_repository_log_display_limit: Maks antall revisjoner vist i fil-loggen + setting_file_max_size_displayed: Max size of text files displayed inline + field_watcher: Overvåker + setting_openid: Tillat OpenID innlogging og registrering + field_identity_url: OpenID URL + label_login_with_open_id_option: eller logg inn med OpenID + field_content: Innhold + label_descending: Synkende + label_sort: Sorter + label_ascending: Stigende + label_date_from_to: Fra %{start} til %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Denne siden har %{descendants} underside(r). Hva ønsker du å gjøre? + text_wiki_page_reassign_children: Tilknytt undersider til denne overordnede siden + text_wiki_page_nullify_children: Behold undersider som rotsider + text_wiki_page_destroy_children: Slett undersider og alle deres underliggende sider + setting_password_min_length: Minimum passordlengde + field_group_by: Grupper resultater etter + mail_subject_wiki_content_updated: "Wiki-side '%{id}' er oppdatert" + label_wiki_content_added: Wiki-side opprettet + mail_subject_wiki_content_added: "Wiki-side '%{id}' er opprettet" + mail_body_wiki_content_added: Wiki-siden '%{id}' ble opprettet av %{author}. + label_wiki_content_updated: Wiki-side oppdatert + mail_body_wiki_content_updated: Wiki-siden '%{id}' ble oppdatert av %{author}. + permission_add_project: Opprett prosjekt + setting_new_project_user_role_id: Rolle gitt en ikke-administratorbruker som oppretter et prosjekt + label_view_all_revisions: Se alle revisjoner + label_tag: Tag + label_branch: Gren + error_no_tracker_in_project: Ingen sakstyper er tilknyttet dette prosjektet. Vennligst kontroller prosjektets innstillinger. + error_no_default_issue_status: Ingen standard saksstatus er angitt. Vennligst kontroller konfigurasjonen (Gå til "Administrasjon -> Saksstatuser"). + text_journal_changed: "%{label} endret fra %{old} til %{new}" + text_journal_set_to: "%{label} satt til %{value}" + text_journal_deleted: "%{label} slettet (%{old})" + label_group_plural: Grupper + label_group: Gruppe + label_group_new: Ny gruppe + label_time_entry_plural: Brukt tid + text_journal_added: "%{label} %{value} lagt til" + field_active: Aktiv + enumeration_system_activity: Systemaktivitet + permission_delete_issue_watchers: Slett overvåkere + version_status_closed: stengt + version_status_locked: låst + version_status_open: åpen + error_can_not_reopen_issue_on_closed_version: En sak tilknyttet en stengt versjon kan ikke gjenåpnes. + label_user_anonymous: Anonym + button_move_and_follow: Flytt og følg etter + setting_default_projects_modules: Standard aktiverte moduler for nye prosjekter + setting_gravatar_default: Standard Gravatar-bilde + field_sharing: Deling + label_version_sharing_hierarchy: Med prosjekt-hierarki + label_version_sharing_system: Med alle prosjekter + label_version_sharing_descendants: Med underprosjekter + label_version_sharing_tree: Med prosjekt-tre + label_version_sharing_none: Ikke delt + error_can_not_archive_project: Dette prosjektet kan ikke arkiveres + button_duplicate: Duplikat + button_copy_and_follow: Kopier og følg etter + label_copy_source: Kilde + setting_issue_done_ratio: Kalkuler ferdigstillingsprosent ut i fra + setting_issue_done_ratio_issue_status: Bruk saksstatuser + error_issue_done_ratios_not_updated: Ferdigstillingsprosent oppdateres ikke. + error_workflow_copy_target: Vennligst velg sakstype(r) og rolle(r) + setting_issue_done_ratio_issue_field: Bruk felt fra saker + label_copy_same_as_target: Samme som mål + label_copy_target: Mål + notice_issue_done_ratios_updated: Ferdigstillingsprosent oppdatert. + error_workflow_copy_source: Vennligst velg en kilde-sakstype eller rolle. + label_update_issue_done_ratios: Oppdatert ferdigstillingsprosent + setting_start_of_week: Start kalender på + permission_view_issues: Se på saker + label_display_used_statuses_only: Vis kun statuser som brukes av denne sakstypen + label_revision_id: Revision %{value} + label_api_access_key: API tilgangsnøkkel + label_api_access_key_created_on: API tilgangsnøkkel opprettet for %{value} siden + label_feeds_access_key: Atom tilgangsnøkkel + notice_api_access_key_reseted: Din API tilgangsnøkkel ble resatt. + setting_rest_api_enabled: Aktiver REST webservice + label_missing_api_access_key: Mangler en API tilgangsnøkkel + label_missing_feeds_access_key: Mangler en Atom tilgangsnøkkel + button_show: Vis + text_line_separated: Flere verdier er tillatt (en linje per verdi). + setting_mail_handler_body_delimiters: Avkort epost etter en av disse linjene + permission_add_subprojects: Opprett underprosjekt + label_subproject_new: Nytt underprosjekt + text_own_membership_delete_confirmation: |- + Du er i ferd med å fjerne noen eller alle rettigheter og vil kanskje ikke være i stand til å redigere dette prosjektet etterpå. + Er du sikker på at du vil fortsette? + label_close_versions: Steng fullførte versjoner + label_board_sticky: Fast + label_board_locked: Låst + permission_export_wiki_pages: Eksporter wiki-sider + setting_cache_formatted_text: Mellomlagre formattert tekst + permission_manage_project_activities: Administrere prosjektaktiviteter + error_unable_delete_issue_status: Kan ikke slette saksstatus + label_profile: Profil + permission_manage_subtasks: Administrere undersaker + field_parent_issue: Overordnet sak + label_subtask_plural: Undersaker + label_project_copy_notifications: Send epost-varslinger under prosjektkopiering + error_can_not_delete_custom_field: Kan ikke slette eget felt + error_unable_to_connect: Kunne ikke koble til (%{value}) + error_can_not_remove_role: Denne rollen er i bruk og kan ikke slettes. + error_can_not_delete_tracker: Denne sakstypen inneholder saker og kan ikke slettes. + field_principal: Principal + notice_failed_to_save_members: "Feil ved lagring av medlem(mer): %{errors}." + text_zoom_out: Zoom ut + text_zoom_in: Zoom inn + notice_unable_delete_time_entry: Kan ikke slette oppføring fra timeliste. + label_overall_spent_time: All tidsbruk + field_time_entries: Loggfør tid + project_module_gantt: Gantt + project_module_calendar: Kalender + button_edit_associated_wikipage: "Rediger tilhørende Wiki-side: %{page_title}" + field_text: Tekstfelt + setting_default_notification_option: Standardvalg for varslinger + label_user_mail_option_only_my_events: Kun for ting jeg overvåker eller er involvert i + label_user_mail_option_none: Ingen hendelser + field_member_of_group: Den tildeltes gruppe + field_assigned_to_role: Den tildeltes rolle + notice_not_authorized_archived_project: Prosjektet du forsøker å åpne er blitt arkivert. + label_principal_search: "Søk etter bruker eller gruppe:" + label_user_search: "Søk etter bruker:" + field_visible: Synlig + setting_emails_header: Eposthode + setting_commit_logtime_activity_id: Aktivitet for logget tid. + text_time_logged_by_changeset: Lagt til i endringssett %{value}. + setting_commit_logtime_enabled: Muliggjør loggføring av tid + notice_gantt_chart_truncated: Diagrammet ble avkortet fordi det overstiger det maksimale antall elementer som kan vises (%{max}) + setting_gantt_items_limit: Maksimalt antall elementer vist på gantt-diagrammet + field_warn_on_leaving_unsaved: Vis meg en advarsel når jeg forlater en side med ikke lagret tekst + text_warn_on_leaving_unsaved: Siden inneholder tekst som ikke er lagret og som vil bli tapt om du forlater denne siden. + label_my_queries: Mine egne spørringer + text_journal_changed_no_detail: "%{label} oppdatert" + label_news_comment_added: Kommentar lagt til en nyhet + button_expand_all: Utvid alle + button_collapse_all: Kollaps alle + label_additional_workflow_transitions_for_assignee: Ytterligere overganger tillatt når brukeren er den som er tildelt saken + label_additional_workflow_transitions_for_author: Ytterligere overganger tillatt når brukeren er den som har opprettet saken + label_bulk_edit_selected_time_entries: Masserediger valgte timeliste-oppføringer + text_time_entries_destroy_confirmation: Er du sikker på du vil slette de(n) valgte timeliste-oppføringen(e)? + label_role_anonymous: Anonym + label_role_non_member: Ikke medlem + label_issue_note_added: Notat lagt til + label_issue_status_updated: Status oppdatert + label_issue_priority_updated: Prioritet oppdatert + label_issues_visibility_own: Saker opprettet av eller tildelt brukeren + field_issues_visibility: Synlighet på saker + label_issues_visibility_all: Alle saker + permission_set_own_issues_private: Gjør egne saker offentlige eller private + field_is_private: Privat + permission_set_issues_private: Gjør saker offentlige eller private + label_issues_visibility_public: Alle ikke-private saker + text_issues_destroy_descendants_confirmation: Dette vil også slette %{count} undersak(er). + field_commit_logs_encoding: Tegnkoding for innsendingsmeldinger + field_scm_path_encoding: Koding av sti + text_scm_path_encoding_note: "Standard: UTF-8" + field_path_to_repository: Sti til depot + field_root_directory: Rotkatalog + field_cvs_module: Modul + field_cvsroot: CVSROOT + text_mercurial_repository_note: Lokalt depot (f.eks. /hgrepo, c:\hgrepo) + text_scm_command: Kommando + text_scm_command_version: Versjon + label_git_report_last_commit: Rapporter siste innsending for filer og kataloger + text_scm_config: Du kan konfigurere scm kommandoer i config/configuration.yml. Vennligst restart applikasjonen etter å ha redigert filen. + text_scm_command_not_available: Scm kommando er ikke tilgjengelig. Vennligst kontroller innstillingene i administrasjonspanelet. + + text_git_repository_note: Depot er bart og lokalt (f.eks. /gitrepo, c:\gitrepo) + + notice_issue_successful_create: Sak %{id} opprettet. + label_between: mellom + setting_issue_group_assignment: Tillat tildeling av saker til grupper + label_diff: diff + + description_query_sort_criteria_direction: Sorteringsretning + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Meldingsinnhold + description_available_columns: Tilgjengelige kolonner + description_issue_category_reassign: Choose issue category + description_search: Søkefelt + description_notes: Notes + description_choose_project: Prosjekter + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Velg ny overordnet side + description_selected_columns: Valgte kolonner + label_parent_revision: Overordnet + label_child_revision: Underordnet + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Bruk dagens dato som startdato for nye saker + button_edit_section: Rediger denne seksjonen + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: Alle kolonnene + button_export: Eksporter + label_export_options: "%{export_format} eksportvalg" + error_attachment_too_big: Filen overstiger maksimum filstørrelse (%{max_size}) og kan derfor ikke lastes opp + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 saker + one: 1 sak + other: "%{count} saker" + label_repository_new: Nytt depot + field_repository_is_default: Hoveddepot + label_copy_attachments: Kopier vedlegg + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Kun små bokstaver (a-z), tall, bindestrek (-) og "underscore" (_) er tillatt.
    Etter lagring er det ikke mulig å gjøre endringer. + field_multiple: Flere verdier + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: Saken ble oppdatert av en annen bruker mens du redigerte den. + text_issue_conflict_resolution_cancel: Forkast alle endringen mine og vis %{link} på nytt + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Din konto er ugjenkallelig slettet. + setting_unsubscribe: Tillat brukere å slette sin egen konto + button_delete_my_account: Slett kontoen min + text_account_destroy_confirmation: |- + Er du sikker på at du ønsker å fortsette? + Kontoen din vil bli ugjenkallelig slettet uten mulighet for å reaktiveres igjen. + error_session_expired: Økten har gått ut på tid. Vennligst logg på igjen. + text_session_expiration_settings: "Advarsel: ved å endre disse innstillingene kan aktive økter gå ut på tid, inkludert din egen." + setting_session_lifetime: Øktenes makslengde + setting_session_timeout: Økten er avsluttet på grunn av inaktivitet + label_session_expiration: Økten er avsluttet + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: kopiert til + label_copied_from: kopiert fra + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: alle + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Med underprosjekter + label_cross_project_tree: Med prosjekt-tre + label_cross_project_hierarchy: Med prosjekt-hierarki + label_cross_project_system: Med alle prosjekter + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Totalt + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: E-post + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: All tidsbruk + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API-nøkkel + setting_lost_password: Mistet passord + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/pl.yml b/config/locales/pl.yml new file mode 100644 index 0000000..81ab1e5 --- /dev/null +++ b/config/locales/pl.yml @@ -0,0 +1,1245 @@ +# Polish translations for Ruby on Rails +# by Jacek Becela (jacek.becela@gmail.com, http://github.com/ncr) +# by Krzysztof Podejma (kpodejma@customprojects.pl, http://www.customprojects.pl) + +pl: + number: + format: + separator: "," + delimiter: " " + precision: 2 + currency: + format: + format: "%n %u" + unit: "PLN" + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "B" + other: "B" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + direction: ltr + date: + formats: + default: "%Y-%m-%d" + short: "%d %b" + long: "%d %B %Y" + + day_names: [Niedziela, Poniedziałek, Wtorek, Środa, Czwartek, Piątek, Sobota] + abbr_day_names: [nie, pon, wto, śro, czw, pia, sob] + + month_names: [~, Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień] + abbr_month_names: [~, sty, lut, mar, kwi, maj, cze, lip, sie, wrz, paź, lis, gru] + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d %b, %H:%M" + long: "%d %B %Y, %H:%M" + am: "przed południem" + pm: "po południu" + + datetime: + distance_in_words: + half_a_minute: "pół minuty" + less_than_x_seconds: + one: "mniej niż sekundę" + few: "mniej niż %{count} sekundy" + other: "mniej niż %{count} sekund" + x_seconds: + one: "sekundę" + few: "%{count} sekundy" + other: "%{count} sekund" + less_than_x_minutes: + one: "mniej niż minutę" + few: "mniej niż %{count} minuty" + other: "mniej niż %{count} minut" + x_minutes: + one: "minutę" + few: "%{count} minuty" + other: "%{count} minut" + about_x_hours: + one: "około godziny" + other: "około %{count} godzin" + x_hours: + one: "1 godzina" + other: "%{count} godzin" + x_days: + one: "1 dzień" + other: "%{count} dni" + about_x_months: + one: "około miesiąca" + other: "około %{count} miesięcy" + x_months: + one: "1 miesiąc" + few: "%{count} miesiące" + other: "%{count} miesięcy" + about_x_years: + one: "około roku" + other: "około %{count} lat" + over_x_years: + one: "ponad rok" + few: "ponad %{count} lata" + other: "ponad %{count} lat" + almost_x_years: + one: "prawie 1 rok" + few: "prawie %{count} lata" + other: "prawie %{count} lat" + + activerecord: + errors: + template: + header: + one: "%{model} nie został zachowany z powodu jednego błędu" + other: "%{model} nie został zachowany z powodu %{count} błędów" + body: "Błędy dotyczą następujących pól:" + messages: + inclusion: "nie znajduje się na liście dopuszczalnych wartości" + exclusion: "znajduje się na liście zabronionych wartości" + invalid: "jest nieprawidłowe" + confirmation: "nie zgadza się z potwierdzeniem" + accepted: "musi być zaakceptowane" + empty: "nie może być puste" + blank: "nie może być puste" + too_long: "jest za długie (maksymalnie %{count} znaków)" + too_short: "jest za krótkie (minimalnie %{count} znaków)" + wrong_length: "jest nieprawidłowej długości (powinna wynosić %{count} znaków)" + taken: "jest już zajęte" + not_a_number: "nie jest liczbą" + greater_than: "musi być większe niż %{count}" + greater_than_or_equal_to: "musi być większe lub równe %{count}" + equal_to: "musi być równe %{count}" + less_than: "musi być mniejsze niż %{count}" + less_than_or_equal_to: "musi być mniejsze lub równe %{count}" + odd: "musi być nieparzyste" + even: "musi być parzyste" + greater_than_start_date: "musi być większe niż początkowa data" + not_same_project: "nie należy do tego samego projektu" + circular_dependency: "Ta relacja może wytworzyć zapętloną zależność" + cant_link_an_issue_with_a_descendant: "Zagadnienie nie może zostać powiązane z jednym z własnych podzagadnień" + earlier_than_minimum_start_date: "nie może być wcześniej niż %{date} z powodu poprzedających zagadnień" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + support: + array: + sentence_connector: "i" + skip_last_comma: true + + # Keep this line in order to avoid problems with Windows Notepad UTF-8 EF-BB-BFidea... + # Best regards from Lublin@Poland :-) + # PL translation by Mariusz@Olejnik.net, + # Wiktor Wandachowicz , 2010 + + actionview_instancetag_blank_option: Proszę wybrać + actionview_instancetag_blank_option: wybierz + + button_activate: Aktywuj + button_add: Dodaj + button_annotate: Adnotuj + button_apply: Ustaw + button_archive: Archiwizuj + button_back: Wstecz + button_cancel: Anuluj + button_change: Zmień + button_change_password: Zmień hasło + button_check_all: Zaznacz wszystko + button_clear: Wyczyść + button_configure: Konfiguruj + button_copy: Kopia + button_create: Stwórz + button_delete: Usuń + button_download: Pobierz + button_edit: Edytuj + button_list: Lista + button_lock: Zablokuj + button_log_time: Dziennik + button_login: Login + button_move: Przenieś + button_quote: Cytuj + button_rename: Zmień nazwę + button_reply: Odpowiedz + button_reset: Resetuj + button_rollback: Przywróć do tej wersji + button_save: Zapisz + button_sort: Sortuj + button_submit: Wyślij + button_test: Testuj + button_unarchive: Przywróć z archiwum + button_uncheck_all: Odznacz wszystko + button_unlock: Odblokuj + button_unwatch: Nie obserwuj + button_update: Uaktualnij + button_view: Pokaż + button_watch: Obserwuj + default_activity_design: Projektowanie + default_activity_development: Rozwój + default_doc_category_tech: Dokumentacja techniczna + default_doc_category_user: Dokumentacja użytkownika + default_issue_status_in_progress: W toku + default_issue_status_closed: Zamknięty + default_issue_status_feedback: Odpowiedź + default_issue_status_new: Nowy + default_issue_status_rejected: Odrzucony + default_issue_status_resolved: Rozwiązany + default_priority_high: Wysoki + default_priority_immediate: Natychmiastowy + default_priority_low: Niski + default_priority_normal: Normalny + default_priority_urgent: Pilny + default_role_developer: Programista + default_role_manager: Kierownik + default_role_reporter: Zgłaszający + default_tracker_bug: Błąd + default_tracker_feature: Zadanie + default_tracker_support: Wsparcie + enumeration_activities: Działania (śledzenie czasu) + enumeration_doc_categories: Kategorie dokumentów + enumeration_issue_priorities: Priorytety zagadnień + error_can_t_load_default_data: "Domyślna konfiguracja nie może być załadowana: %{value}" + error_issue_not_found_in_project: 'Zagadnienie nie zostało znalezione lub nie należy do tego projektu' + error_scm_annotate: "Wpis nie istnieje lub nie można do niego dodawać adnotacji." + error_scm_command_failed: "Wystąpił błąd przy próbie dostępu do repozytorium: %{value}" + error_scm_not_found: "Obiekt lub wersja nie zostały znalezione w repozytorium." + field_account: Konto + field_activity: Aktywność + field_admin: Administrator + field_assignable: Zagadnienia mogą być przypisane do tej roli + field_assigned_to: Przypisany do + field_attr_firstname: Imię atrybut + field_attr_lastname: Nazwisko atrybut + field_attr_login: Login atrybut + field_attr_mail: E-mail atrybut + field_auth_source: Tryb uwierzytelniania + field_author: Autor + field_base_dn: Base DN + field_category: Kategoria + field_column_names: Nazwy kolumn + field_comments: Komentarz + field_comments_sorting: Pokazuj komentarze + field_created_on: Data utworzenia + field_default_value: Domyślny + field_delay: Opóźnienie + field_description: Opis + field_done_ratio: "% Wykonania" + field_downloads: Pobrań + field_due_date: Data oddania + field_effective_date: Data + field_estimated_hours: Szacowany czas + field_field_format: Format + field_filename: Plik + field_filesize: Rozmiar + field_firstname: Imię + field_fixed_version: Wersja docelowa + field_hide_mail: Ukryj mój adres e-mail + field_homepage: Strona www + field_host: Host + field_hours: Godzin + field_identifier: Identyfikator + field_is_closed: Zagadnienie zamknięte + field_is_default: Domyślny status + field_is_filter: Atrybut filtrowania + field_is_for_all: Dla wszystkich projektów + field_is_in_roadmap: Zagadnienie pokazywane na mapie + field_is_public: Publiczny + field_is_required: Wymagane + field_issue: Zagadnienie + field_issue_to: Powiązania zagadnienia + field_language: Język + field_last_login_on: Ostatnie połączenie + field_lastname: Nazwisko + field_login: Login + field_mail: E-mail + field_mail_notification: Powiadomienia e-mail + field_max_length: Maksymalna długość + field_min_length: Minimalna długość + field_name: Nazwa + field_new_password: Nowe hasło + field_notes: Notatki + field_onthefly: Tworzenie użytkownika w locie + field_parent: Projekt nadrzędny + field_parent_title: Strona rodzica + field_password: Hasło + field_password_confirmation: Potwierdzenie + field_port: Port + field_possible_values: Możliwe wartości + field_priority: Priorytet + field_project: Projekt + field_redirect_existing_links: Przekierowanie istniejących odnośników + field_regexp: Wyrażenie regularne + field_role: Rola + field_searchable: Przeszukiwalne + field_spent_on: Data + field_start_date: Data rozpoczęcia + field_start_page: Strona startowa + field_status: Status + field_subject: Temat + field_subproject: Podprojekt + field_summary: Podsumowanie + field_time_zone: Strefa czasowa + field_title: Tytuł + field_tracker: Typ zagadnienia + field_type: Typ + field_updated_on: Data modyfikacji + field_url: URL + field_user: Użytkownik + field_value: Wartość + field_version: Wersja + field_vf_personnel: Personel + field_vf_watcher: Obserwator + general_csv_decimal_separator: ',' + general_csv_encoding: UTF-8 + general_csv_separator: ';' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + general_lang_name: 'Polish (Polski)' + general_text_No: 'Nie' + general_text_Yes: 'Tak' + general_text_no: 'nie' + general_text_yes: 'tak' + + label_activity: Aktywność + label_add_another_file: Dodaj kolejny plik + label_add_note: Dodaj notatkę + label_added: dodane + label_added_time_by: "Dodane przez %{author} %{age} temu" + label_administration: Administracja + label_age: Wiek + label_ago: dni temu + label_all: wszystko + label_all_time: cały czas + label_all_words: Wszystkie słowa + label_and_its_subprojects: "%{value} i podprojekty" + label_applied_status: Stosowany status + label_assigned_to_me_issues: Zagadnienia przypisane do mnie + label_associated_revisions: Skojarzone rewizje + label_attachment: Plik + label_attachment_delete: Usuń plik + label_attachment_new: Nowy plik + label_attachment_plural: Pliki + label_attribute: Atrybut + label_attribute_plural: Atrybuty + label_auth_source: Tryb uwierzytelniania + label_auth_source_new: Nowy tryb uwierzytelniania + label_auth_source_plural: Tryby uwierzytelniania + label_authentication: Uwierzytelnianie + label_blocked_by: blokowane przez + label_blocks: blokuje + label_board: Forum + label_board_new: Nowe forum + label_board_plural: Fora + label_boolean: Wartość logiczna + label_browse: Przegląd + label_bulk_edit_selected_issues: Zbiorowa edycja zagadnień + label_calendar: Kalendarz + label_change_plural: Zmiany + label_change_properties: Zmień właściwości + label_change_status: Status zmian + label_change_view_all: Pokaż wszystkie zmiany + label_changes_details: Szczegóły wszystkich zmian + label_changeset_plural: Zestawienia zmian + label_chronological_order: W kolejności chronologicznej + label_closed_issues: zamknięte + label_closed_issues_plural234: zamknięte + label_closed_issues_plural5: zamknięte + label_closed_issues_plural: zamknięte + label_x_open_issues_abbr: + zero: 0 otwartych + one: 1 otwarty + few: "%{count} otwarte" + other: "%{count} otwartych" + label_x_closed_issues_abbr: + zero: 0 zamkniętych + one: 1 zamknięty + few: "%{count} zamknięte" + other: "%{count} zamkniętych" + label_comment: Komentarz + label_comment_add: Dodaj komentarz + label_comment_added: Komentarz dodany + label_comment_delete: Usuń komentarze + label_comment_plural234: Komentarze + label_comment_plural5: Komentarzy + label_comment_plural: Komentarze + label_x_comments: + zero: brak komentarzy + one: 1 komentarz + few: "%{count} komentarze" + other: "%{count} komentarzy" + label_commits_per_author: Zatwierdzenia według autorów + label_commits_per_month: Zatwierdzenia według miesięcy + label_confirmation: Potwierdzenie + label_contains: zawiera + label_copied: skopiowano + label_copy_workflow_from: Kopiuj przepływ pracy z + label_current_status: Obecny status + label_current_version: Obecna wersja + label_custom_field: Pole niestandardowe + label_custom_field_new: Nowe pole niestandardowe + label_custom_field_plural: Pola niestandardowe + label_date: Data + label_date_from: Od + label_date_range: Zakres dat + label_date_to: Do + label_day_plural: dni + label_default: Domyślne + label_default_columns: Domyślne kolumny + label_deleted: usunięte + label_details: Szczegóły + label_diff_inline: w linii + label_diff_side_by_side: obok siebie + label_disabled: wyłaczone + label_display_per_page: "Na stronie: %{value}" + label_document: Dokument + label_document_added: Dodano dokument + label_document_new: Nowy dokument + label_document_plural: Dokumenty + label_downloads_abbr: Pobieranie + label_duplicated_by: zduplikowane przez + label_duplicates: duplikuje + label_enumeration_new: Nowa wartość + label_enumerations: Wyliczenia + label_environment: Środowisko + label_equals: równa się + label_example: Przykład + label_export_to: Eksportuj do + label_f_hour: "%{value} godzina" + label_f_hour_plural: "%{value} godzin" + label_feed_plural: Ilość Atom + label_feeds_access_key_created_on: "Klucz dostępu do kanału Atom stworzony %{value} temu" + label_file_added: Dodano plik + label_file_plural: Pliki + label_filter_add: Dodaj filtr + label_filter_plural: Filtry + label_float: Liczba zmiennoprzecinkowa + label_follows: następuje po + label_gantt: Gantt + label_general: Ogólne + label_generate_key: Wygeneruj klucz + label_help: Pomoc + label_history: Historia + label_home: Główna + label_in: w + label_in_less_than: mniejsze niż + label_in_more_than: większe niż + label_incoming_emails: Przychodząca poczta elektroniczna + label_index_by_date: Indeks wg daty + label_index_by_title: Indeks + label_information: Informacja + label_information_plural: Informacje + label_integer: Liczba całkowita + label_internal: Wewnętrzny + label_issue: Zagadnienie + label_issue_added: Dodano zagadnienie + label_issue_category: Kategoria zagadnienia + label_issue_category_new: Nowa kategoria + label_issue_category_plural: Kategorie zagadnień + label_issue_new: Nowe zagadnienie + label_issue_plural: Zagadnienia + label_issue_status: Status zagadnienia + label_issue_status_new: Nowy status + label_issue_status_plural: Statusy zagadnień + label_issue_tracking: Śledzenie zagadnień + label_issue_updated: Uaktualniono zagadnienie + label_issue_view_all: Zobacz wszystkie zagadnienia + label_issue_watchers: Obserwatorzy + label_issues_by: "Zagadnienia wprowadzone przez %{value}" + label_jump_to_a_project: Skocz do projektu... + label_language_based: Na podstawie języka + label_last_changes: "ostatnie %{count} zmian" + label_last_login: Ostatnie połączenie + label_last_month: ostatni miesiąc + label_last_n_days: "ostatnie %{count} dni" + label_last_week: ostatni tydzień + label_latest_revision: Najnowsza rewizja + label_latest_revision_plural: Najnowsze rewizje + label_ldap_authentication: Uwierzytelnianie LDAP + label_less_than_ago: dni temu + label_list: Lista + label_loading: Ładowanie... + label_logged_as: Zalogowany jako + label_login: Login + label_logout: Wylogowanie + label_max_size: Maksymalny rozmiar + label_me: ja + label_member: Uczestnik + label_member_new: Nowy uczestnik + label_member_plural: Uczestnicy + label_message_last: Ostatnia wiadomość + label_message_new: Nowa wiadomość + label_message_plural: Wiadomości + label_message_posted: Dodano wiadomość + label_min_max_length: Min - Maks długość + label_modified: zmodyfikowane + label_module_plural: Moduły + label_month: Miesiąc + label_months_from: miesiące od + label_more_than_ago: dni od teraz + label_my_account: Moje konto + label_my_page: Moja strona + label_my_projects: Moje projekty + label_new: Nowy + label_new_statuses_allowed: Uprawnione nowe statusy + label_news: Komunikat + label_news_added: Dodano komunikat + label_news_latest: Ostatnie komunikaty + label_news_new: Dodaj komunikat + label_news_plural: Komunikaty + label_news_view_all: Pokaż wszystkie komunikaty + label_next: Następne + label_no_change_option: (Bez zmian) + label_no_data: Brak danych do pokazania + label_nobody: nikt + label_none: brak + label_not_contains: nie zawiera + label_not_equals: różni się + label_open_issues: otwarte + label_open_issues_plural234: otwarte + label_open_issues_plural5: otwartych + label_open_issues_plural: otwarte + label_optional_description: Opcjonalny opis + label_options: Opcje + label_overall_activity: Ogólna aktywność + label_overview: Przegląd + label_password_lost: Zapomniane hasło + label_permissions: Uprawnienia + label_permissions_report: Raport uprawnień + label_please_login: Zaloguj się + label_plugins: Wtyczki + label_precedes: poprzedza + label_preferences: Preferencje + label_preview: Podgląd + label_previous: Poprzednie + label_project: Projekt + label_project_all: Wszystkie projekty + label_project_latest: Ostatnie projekty + label_project_new: Nowy projekt + label_project_plural234: Projekty + label_project_plural5: Projektów + label_project_plural: Projekty + label_x_projects: + zero: brak projektów + one: 1 projekt + few: "%{count} projekty" + other: "%{count} projektów" + label_public_projects: Projekty publiczne + label_query: Kwerenda + label_query_new: Nowa kwerenda + label_query_plural: Kwerendy + label_read: Czytanie... + label_register: Rejestracja + label_registered_on: Zarejestrowany + label_registration_activation_by_email: aktywacja konta przez e-mail + label_registration_automatic_activation: automatyczna aktywacja kont + label_registration_manual_activation: manualna aktywacja kont + label_related_issues: Powiązane zagadnienia + label_relates_to: powiązane z + label_relation_delete: Usuń powiązanie + label_relation_new: Nowe powiązanie + label_renamed: zmieniono nazwę + label_reply_plural: Odpowiedzi + label_report: Raport + label_report_plural: Raporty + label_reported_issues: Wprowadzone zagadnienia + label_repository: Repozytorium + label_repository_plural: Repozytoria + label_result_plural: Rezultatów + label_reverse_chronological_order: W kolejności odwrotnej do chronologicznej + label_revision: Rewizja + label_revision_plural: Rewizje + label_roadmap: Mapa + label_roadmap_due_in: W czasie + label_roadmap_no_issues: Brak zagadnień do tej wersji + label_roadmap_overdue: "%{value} spóźnienia" + label_role: Rola + label_role_and_permissions: Role i uprawnienia + label_role_new: Nowa rola + label_role_plural: Role + label_scm: SCM + label_search: Szukaj + label_search_titles_only: Przeszukuj tylko tytuły + label_send_information: Wyślij informację użytkownikowi + label_send_test_email: Wyślij próbny e-mail + label_settings: Ustawienia + label_show_completed_versions: Pokaż kompletne wersje + label_sort_by: "Sortuj po %{value}" + label_sort_higher: Do góry + label_sort_highest: Przesuń na górę + label_sort_lower: Do dołu + label_sort_lowest: Przesuń na dół + label_spent_time: Przepracowany czas + label_statistics: Statystyki + label_stay_logged_in: Pozostań zalogowany + label_string: Tekst + label_subproject_plural: Podprojekty + label_text: Długi tekst + label_theme: Motyw + label_this_month: ten miesiąc + label_this_week: ten tydzień + label_this_year: ten rok + label_time_tracking: Śledzenie czasu pracy + label_today: dzisiaj + label_topic_plural: Tematy + label_total: Ogółem + label_tracker: Typ zagadnienia + label_tracker_new: Nowy typ zagadnienia + label_tracker_plural: Typy zagadnień + label_updated_time: "Zaktualizowane %{value} temu" + label_used_by: Używane przez + label_user: Użytkownik + label_user_mail_no_self_notified: "Nie chcę powiadomień o zmianach, które sam wprowadzam." + label_user_mail_option_all: "Dla każdego zdarzenia w każdym moim projekcie" + label_user_mail_option_selected: "Dla każdego zdarzenia w wybranych projektach..." + label_user_new: Nowy użytkownik + label_user_plural: Użytkownicy + label_version: Wersja + label_version_new: Nowa wersja + label_version_plural: Wersje + label_view_diff: Pokaż różnice + label_view_revisions: Pokaż rewizje + label_watched_issues: Obserwowane zagadnienia + label_week: Tydzień + label_wiki: Wiki + label_wiki_edit: Edycja wiki + label_wiki_edit_plural: Edycje wiki + label_wiki_page: Strona wiki + label_wiki_page_plural: Strony wiki + label_workflow: Przepływ pracy + label_year: Rok + label_yesterday: wczoraj + mail_body_account_activation_request: "Zarejestrowano nowego użytkownika: (%{value}). Konto oczekuje na twoje zatwierdzenie:" + mail_body_account_information: Twoje konto + mail_body_account_information_external: "Możesz użyć Twojego konta %{value} do zalogowania." + mail_body_lost_password: 'W celu zmiany swojego hasła użyj poniższego odnośnika:' + mail_body_register: 'W celu aktywacji Twojego konta, użyj poniższego odnośnika:' + mail_body_reminder: "Wykaz przypisanych do Ciebie zagadnień (%{count}), których termin dobiega końca w ciągu następnych %{days} dni:" + mail_subject_account_activation_request: "Zapytanie aktywacyjne konta %{value}" + mail_subject_lost_password: "Twoje hasło do %{value}" + mail_subject_register: "Aktywacja konta w %{value}" + mail_subject_reminder: "Zagadnienia (%{count}) do obsłużenia w ciągu następnych %{days} dni" + notice_account_activated: Twoje konto zostało aktywowane. Możesz się zalogować. + notice_account_invalid_credentials: Zły użytkownik lub hasło + notice_account_lost_email_sent: E-mail z instrukcjami zmiany hasła został wysłany do Ciebie. + notice_account_password_updated: Hasło prawidłowo zmienione. + notice_account_pending: "Twoje konto zostało utworzone i oczekuje na zatwierdzenie administratora." + notice_account_unknown_email: Nieznany użytkownik. + notice_account_updated: Konto prawidłowo zaktualizowane. + notice_account_wrong_password: Złe hasło + notice_can_t_change_password: To konto ma zewnętrzne źródło uwierzytelniania. Nie możesz zmienić hasła. + notice_default_data_loaded: Domyślna konfiguracja została pomyślnie załadowana. + notice_email_error: "Wystąpił błąd w trakcie wysyłania e-maila (%{value})" + notice_email_sent: "E-mail został wysłany do %{value}" + notice_failed_to_save_issues: "Błąd podczas zapisu zagadnień %{count} z %{total} zaznaczonych: %{ids}." + notice_feeds_access_key_reseted: Twój klucz dostępu do kanału Atom został zresetowany. + notice_file_not_found: Strona do której próbujesz się dostać nie istnieje lub została usunięta. + notice_locking_conflict: Dane poprawione przez innego użytkownika. + notice_no_issue_selected: "Nie wybrano zagadnienia! Zaznacz zagadnienie, które chcesz edytować." + notice_not_authorized: Nie posiadasz autoryzacji do oglądania tej strony. + notice_successful_connection: Udane nawiązanie połączenia. + notice_successful_create: Utworzenie zakończone pomyślnie. + notice_successful_delete: Usunięcie zakończone pomyślnie. + notice_successful_update: Uaktualnienie zakończone pomyślnie. + notice_unable_delete_version: Nie można usunąć wersji + permission_add_issue_notes: Dodawanie notatek + permission_add_issue_watchers: Dodawanie obserwatorów + permission_add_issues: Dodawanie zagadnień + permission_add_messages: Dodawanie wiadomości + permission_browse_repository: Przeglądanie repozytorium + permission_comment_news: Komentowanie komunikatów + permission_commit_access: Wykonywanie zatwierdzeń + permission_delete_issues: Usuwanie zagadnień + permission_delete_messages: Usuwanie wiadomości + permission_delete_wiki_pages: Usuwanie stron wiki + permission_delete_wiki_pages_attachments: Usuwanie załączników + permission_delete_own_messages: Usuwanie własnych wiadomości + permission_edit_issue_notes: Edycja notatek + permission_edit_issues: Edycja zagadnień + permission_edit_messages: Edycja wiadomości + permission_edit_own_issue_notes: Edycja własnych notatek + permission_edit_own_messages: Edycja własnych wiadomości + permission_edit_own_time_entries: Edycja własnego dziennika + permission_edit_project: Edycja projektów + permission_edit_time_entries: Edycja wpisów dziennika + permission_edit_wiki_pages: Edycja stron wiki + permission_log_time: Zapisywanie przepracowanego czasu + permission_manage_boards: Zarządzanie forami + permission_manage_categories: Zarządzanie kategoriami zagadnień + permission_manage_files: Zarządzanie plikami + permission_manage_issue_relations: Zarządzanie powiązaniami zagadnień + permission_manage_members: Zarządzanie uczestnikami + permission_manage_news: Zarządzanie komunikatami + permission_manage_public_queries: Zarządzanie publicznymi kwerendami + permission_manage_repository: Zarządzanie repozytorium + permission_manage_versions: Zarządzanie wersjami + permission_manage_wiki: Zarządzanie wiki + permission_move_issues: Przenoszenie zagadnień + permission_protect_wiki_pages: Blokowanie stron wiki + permission_rename_wiki_pages: Zmiana nazw stron wiki + permission_save_queries: Zapisywanie kwerend + permission_select_project_modules: Wybieranie modułów projektu + permission_view_calendar: Podgląd kalendarza + permission_view_changesets: Podgląd zmian + permission_view_documents: Podgląd dokumentów + permission_view_files: Podgląd plików + permission_view_gantt: Podgląd diagramu Gantta + permission_view_issue_watchers: Podgląd listy obserwatorów + permission_view_messages: Podgląd wiadomości + permission_view_time_entries: Podgląd przepracowanego czasu + permission_view_wiki_edits: Podgląd historii wiki + permission_view_wiki_pages: Podgląd wiki + project_module_boards: Fora + project_module_documents: Dokumenty + project_module_files: Pliki + project_module_issue_tracking: Śledzenie zagadnień + project_module_news: Komunikaty + project_module_repository: Repozytorium + project_module_time_tracking: Śledzenie czasu pracy + project_module_wiki: Wiki + setting_activity_days_default: Dni wyświetlane w aktywności projektu + setting_app_subtitle: Podtytuł aplikacji + setting_app_title: Tytuł aplikacji + setting_attachment_max_size: Maks. rozm. załącznika + setting_autofetch_changesets: Automatyczne pobieranie zmian + setting_autologin: Automatyczne logowanie + setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc) + setting_commit_fix_keywords: Słowo zmieniające status + setting_commit_ref_keywords: Słowa tworzące powiązania + setting_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami + setting_date_format: Format daty + setting_default_language: Domyślny język + setting_default_projects_public: Nowe projekty są domyślnie publiczne + setting_display_subprojects_issues: Domyślnie pokazuj zagadnienia podprojektów w głównym projekcie + setting_emails_footer: Stopka e-mail + setting_enabled_scm: Dostępny SCM + setting_feeds_limit: Limit danych Atom + setting_gravatar_enabled: Używaj ikon użytkowników Gravatar + setting_host_name: Nazwa hosta i ścieżka + setting_issue_list_default_columns: Domyślne kolumny wyświetlane na liście zagadnień + setting_issues_export_limit: Limit eksportu zagadnień + setting_login_required: Wymagane zalogowanie + setting_mail_from: Adres e-mail wysyłki + setting_mail_handler_api_enabled: Uaktywnij usługi sieciowe (WebServices) dla poczty przychodzącej + setting_mail_handler_api_key: Klucz API + setting_per_page_options: Opcje ilości obiektów na stronie + setting_plain_text_mail: tylko tekst (bez HTML) + setting_protocol: Protokół + setting_self_registration: Samodzielna rejestracja użytkowników + setting_sequential_project_identifiers: Generuj sekwencyjne identyfikatory projektów + setting_sys_api_enabled: Włączenie WS do zarządzania repozytorium + setting_text_formatting: Formatowanie tekstu + setting_time_format: Format czasu + setting_user_format: Format wyświetlania użytkownika + setting_welcome_text: Tekst powitalny + setting_wiki_compression: Kompresja historii Wiki + status_active: aktywny + status_locked: zablokowany + status_registered: zarejestrowany + text_are_you_sure: Jesteś pewien ? + text_assign_time_entries_to_project: Przypisz wpisy dziennika do projektu + text_caracters_maximum: "%{count} znaków maksymalnie." + text_caracters_minimum: "Musi być nie krótsze niż %{count} znaków." + text_comma_separated: Dozwolone wielokrotne wartości (rozdzielone przecinkami). + text_default_administrator_account_changed: Zmieniono domyślne hasło administratora + text_destroy_time_entries: Usuń wpisy dziennika + text_destroy_time_entries_question: Przepracowano %{hours} godzin przy zagadnieniu, które chcesz usunąć. Co chcesz zrobić? + text_email_delivery_not_configured: "Dostarczanie poczty elektronicznej nie zostało skonfigurowane, więc powiadamianie jest nieaktywne.\nSkonfiguruj serwer SMTP w config/configuration.yml a następnie zrestartuj aplikację i uaktywnij to." + text_enumeration_category_reassign_to: 'Zmień przypisanie na tą wartość:' + text_enumeration_destroy_question: "%{count} obiektów jest przypisanych do tej wartości." + text_file_repository_writable: Zapisywalne repozytorium plików + text_issue_added: "Zagadnienie %{id} zostało wprowadzone (przez %{author})." + text_issue_category_destroy_assignments: Usuń przydziały kategorii + text_issue_category_destroy_question: "Do tej kategorii są przypisane zagadnienia (%{count}). Co chcesz zrobić?" + text_issue_category_reassign_to: Przydziel zagadnienie do tej kategorii + text_issue_updated: "Zagadnienie %{id} zostało zaktualizowane (przez %{author})." + text_issues_destroy_confirmation: 'Czy jesteś pewien, że chcesz usunąć wskazane zagadnienia?' + text_issues_ref_in_commit_messages: Odwołania do zagadnień Redmine w komentarzach w repozytorium + text_length_between: "Długość pomiędzy %{min} i %{max} znaków." + text_load_default_configuration: Załaduj domyślną konfigurację + text_min_max_length_info: 0 oznacza brak restrykcji + text_no_configuration_data: "Role użytkowników, typy zagadnień, statusy zagadnień oraz przepływ pracy nie zostały jeszcze skonfigurowane.\nWysoce zalecane jest by załadować domyślną konfigurację. Po załadowaniu będzie możliwość edycji tych danych." + text_project_destroy_confirmation: Jesteś pewien, że chcesz usunąć ten projekt i wszystkie powiązane dane? + text_reassign_time_entries: 'Przepnij przepracowany czas do tego zagadnienia:' + text_regexp_info: np. ^[A-Z0-9]+$ + text_repository_usernames_mapping: "Wybierz lub uaktualnij przyporządkowanie użytkowników Redmine do użytkowników repozytorium.\nUżytkownicy z taką samą nazwą lub adresem e-mail są przyporządkowani automatycznie." + text_rmagick_available: RMagick dostępne (opcjonalnie) + text_select_mail_notifications: Zaznacz czynności przy których użytkownik powinien być powiadomiony e-mailem. + text_select_project_modules: 'Wybierz moduły do aktywacji w tym projekcie:' + text_status_changed_by_changeset: "Zastosowane w zmianach %{value}." + text_subprojects_destroy_warning: "Podprojekt(y): %{value} zostaną także usunięte." + text_tip_issue_begin_day: zadanie zaczynające się dzisiaj + text_tip_issue_begin_end_day: zadanie zaczynające i kończące się dzisiaj + text_tip_issue_end_day: zadanie kończące się dzisiaj + text_tracker_no_workflow: Brak przepływu pracy zdefiniowanego dla tego typu zagadnienia + text_unallowed_characters: Niedozwolone znaki + text_user_mail_option: "W przypadku niezaznaczonych projektów, będziesz otrzymywał powiadomienia tylko na temat zagadnień które obserwujesz, lub w których bierzesz udział (np. jesteś autorem lub adresatem)." + text_user_wrote: "%{value} napisał(a):" + text_wiki_destroy_confirmation: Jesteś pewien, że chcesz usunąć to wiki i całą jego zawartość? + text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu pracy + + label_user_activity: "Aktywność: %{value}" + label_updated_time_by: "Uaktualnione przez %{author} %{age} temu" + text_diff_truncated: '... Ten plik różnic został przycięty ponieważ jest zbyt długi.' + setting_diff_max_lines_displayed: Maksymalna liczba linii różnicy do pokazania + text_plugin_assets_writable: Zapisywalny katalog zasobów wtyczek + warning_attachments_not_saved: "%{count} załącznik(ów) nie zostało zapisanych." + field_editable: Edytowalne + label_display: Wygląd + button_create_and_continue: Stwórz i dodaj kolejne + text_custom_field_possible_values_info: 'Każda wartość w osobnej linii' + setting_repository_log_display_limit: Maksymalna liczba rewizji pokazywanych w logu pliku + setting_file_max_size_displayed: Maksymalny rozmiar plików tekstowych osadzanych w stronie + field_watcher: Obserwator + setting_openid: Logowanie i rejestracja przy użyciu OpenID + field_identity_url: Identyfikator OpenID (URL) + label_login_with_open_id_option: albo użyj OpenID + field_content: Treść + label_descending: Malejąco + label_sort: Sortuj + label_ascending: Rosnąco + label_date_from_to: Od %{start} do %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Ta strona posiada podstrony (%{descendants}). Co chcesz zrobić? + text_wiki_page_reassign_children: Podepnij je do strony nadrzędnej względem usuwanej + text_wiki_page_nullify_children: Przesuń je na szczyt hierarchii + text_wiki_page_destroy_children: Usuń wszystkie podstrony + setting_password_min_length: Minimalna długość hasła + field_group_by: Grupuj wyniki wg + mail_subject_wiki_content_updated: "Strona wiki '%{id}' została uaktualniona" + label_wiki_content_added: Dodano stronę wiki + mail_subject_wiki_content_added: "Strona wiki '%{id}' została dodana" + mail_body_wiki_content_added: Strona wiki '%{id}' została dodana przez %{author}. + label_wiki_content_updated: Uaktualniono stronę wiki + mail_body_wiki_content_updated: Strona wiki '%{id}' została uaktualniona przez %{author}. + permission_add_project: Tworzenie projektu + setting_new_project_user_role_id: Rola nadawana twórcom projektów, którzy nie posiadają uprawnień administatora + label_view_all_revisions: Pokaż wszystkie rewizje + label_tag: Słowo kluczowe + label_branch: Gałąź + error_no_tracker_in_project: Projekt nie posiada powiązanych typów zagadnień. Sprawdź ustawienia projektu. + error_no_default_issue_status: Nie zdefiniowano domyślnego statusu zagadnień. Sprawdź konfigurację (Przejdź do "Administracja -> Statusy zagadnień"). + text_journal_changed: "Zmieniono %{label} z %{old} na %{new}" + text_journal_set_to: "Ustawiono %{label} na %{value}" + text_journal_deleted: "Usunięto %{label} (%{old})" + label_group_plural: Grupy + label_group: Grupa + label_group_new: Nowa grupa + label_time_entry_plural: Przepracowany czas + text_journal_added: "Dodano %{label} %{value}" + field_active: Aktywne + enumeration_system_activity: Aktywność systemowa + button_copy_and_follow: Kopiuj i przejdź do kopii zagadnienia + button_duplicate: Duplikuj + button_move_and_follow: Przenieś i przejdź do zagadnienia + button_show: Pokaż + error_can_not_archive_project: Ten projekt nie może zostać zarchiwizowany + error_can_not_reopen_issue_on_closed_version: Zagadnienie przydzielone do zakończonej wersji nie może zostać ponownie otwarte + error_issue_done_ratios_not_updated: "% wykonania zagadnienia nie został uaktualniony." + error_workflow_copy_source: Proszę wybrać źródłowy typ zagadnienia lub rolę + error_workflow_copy_target: Proszę wybrać docelowe typ(y) zagadnień i rolę(e) + field_sharing: Współdzielenie + label_api_access_key: Klucz dostępu do API + label_api_access_key_created_on: Klucz dostępu do API został utworzony %{value} temu + label_close_versions: Zamknij ukończone wersje + label_copy_same_as_target: Jak cel + label_copy_source: Źródło + label_copy_target: Cel + label_display_used_statuses_only: Wyświetlaj tylko statusy używane przez ten typ zagadnienia + label_feeds_access_key: Klucz dostępu do kanału Atom + label_missing_api_access_key: Brakuje klucza dostępu do API + label_missing_feeds_access_key: Brakuje klucza dostępu do kanału Atom + label_revision_id: Rewizja %{value} + label_subproject_new: Nowy podprojekt + label_update_issue_done_ratios: Uaktualnij % wykonania + label_user_anonymous: Anonimowy + label_version_sharing_descendants: Z podprojektami + label_version_sharing_hierarchy: Z hierarchią projektów + label_version_sharing_none: Brak współdzielenia + label_version_sharing_system: Ze wszystkimi projektami + label_version_sharing_tree: Z drzewem projektów + notice_api_access_key_reseted: Twój klucz dostępu do API został zresetowany. + notice_issue_done_ratios_updated: Uaktualnienie % wykonania zakończone pomyślnie. + permission_add_subprojects: Tworzenie podprojektów + permission_delete_issue_watchers: Usuń obserwatorów + permission_view_issues: Przeglądanie zagadnień + setting_default_projects_modules: Domyślnie włączone moduły dla nowo tworzonych projektów + setting_gravatar_default: Domyślny obraz Gravatar + setting_issue_done_ratio: Obliczaj postęp realizacji zagadnień za pomocą + setting_issue_done_ratio_issue_field: "% Wykonania zagadnienia" + setting_issue_done_ratio_issue_status: Statusu zagadnienia + setting_mail_handler_body_delimiters: Przycinaj e-maile po jednej z tych linii + setting_rest_api_enabled: Uaktywnij usługę sieciową REST + setting_start_of_week: Pierwszy dzień tygodnia + text_line_separated: Dozwolone jest wiele wartości (każda wartość w osobnej linii). + text_own_membership_delete_confirmation: |- + Masz zamiar usunąć niektóre lub wszystkie swoje uprawnienia. Po wykonaniu tej czynności możesz utracić możliwości edycji tego projektu. + Czy na pewno chcesz kontynuować? + version_status_closed: zamknięta + version_status_locked: zablokowana + version_status_open: otwarta + + label_board_sticky: Przyklejona + label_board_locked: Zamknięta + permission_export_wiki_pages: Eksport stron wiki + permission_manage_project_activities: Zarządzanie aktywnościami projektu + setting_cache_formatted_text: Buforuj sformatowany tekst + error_unable_delete_issue_status: Nie można usunąć statusu zagadnienia + label_profile: Profil + permission_manage_subtasks: Zarządzanie podzagadnieniami + field_parent_issue: Zagadnienie nadrzędne + label_subtask_plural: Podzagadnienia + label_project_copy_notifications: Wyślij powiadomienia e-mailowe przy kopiowaniu projektu + error_can_not_delete_custom_field: Nie można usunąć tego pola + error_unable_to_connect: Nie można połączyć (%{value}) + error_can_not_remove_role: Ta rola przypisana jest niektórym użytkownikom i nie może zostać usunięta. + error_can_not_delete_tracker: Ten typ przypisany jest do części zagadnień i nie może zostać usunięty. + field_principal: Przełożony + notice_failed_to_save_members: "Nie można zapisać uczestników: %{errors}." + text_zoom_out: Zmniejsz + text_zoom_in: Powiększ + notice_unable_delete_time_entry: Nie można usunąć wpisu z dziennika. + label_overall_spent_time: Przepracowany czas + field_time_entries: Dziennik + project_module_gantt: Diagram Gantta + project_module_calendar: Kalendarz + button_edit_associated_wikipage: "Edytuj powiązaną stronę Wiki: %{page_title}" + field_text: Text field + setting_default_notification_option: Domyślna opcja powiadomień + label_user_mail_option_only_my_events: "Tylko to, co obserwuję lub w czym biorę udział" + label_user_mail_option_none: "Brak powiadomień" + field_member_of_group: Grupa osoby przypisanej + field_assigned_to_role: Rola osoby przypisanej + notice_not_authorized_archived_project: "Projekt, do którego próbujesz uzyskać dostęp został zarchiwizowany." + label_principal_search: "Szukaj użytkownika lub grupy:" + label_user_search: "Szukaj użytkownika:" + field_visible: Widoczne + setting_commit_logtime_activity_id: Aktywność dla śledzonego czasu + text_time_logged_by_changeset: Zastosowane w zmianach %{value}. + setting_commit_logtime_enabled: Włącz śledzenie czasu + notice_gantt_chart_truncated: Liczba elementów wyświetlanych na diagramie została ograniczona z powodu przekroczenia dopuszczalnego limitu (%{max}). + setting_gantt_items_limit: Maksymalna liczba elementów wyświetlanych na diagramie Gantta + field_warn_on_leaving_unsaved: Ostrzegaj mnie, gdy opuszczam stronę z niezapisanym tekstem + text_warn_on_leaving_unsaved: Obecna strona zawiera niezapisany tekst, który zostanie utracony w przypadku jej opuszczenia. + label_my_queries: Moje kwerendy + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Dodano komentarz do komunikatu + button_expand_all: Rozwiń wszystkie + button_collapse_all: Zwiń wszystkie + label_additional_workflow_transitions_for_assignee: Dodatkowe przejścia stanów dozwolone, gdy użytkownik jest przypisany do zadania + label_additional_workflow_transitions_for_author: Dodatkowe przejścia stanów dozwolone, gdy użytkownik jest autorem zadania + label_bulk_edit_selected_time_entries: Zbiorowa edycja wpisów dziennika + text_time_entries_destroy_confirmation: Czy na pewno chcesz usunąć zaznaczon(y/e) wpis(y) dziennika? + label_role_anonymous: Anonimowy + label_role_non_member: Bez roli + label_issue_note_added: Dodano notatkę + label_issue_status_updated: Uaktualniono status + label_issue_priority_updated: Uaktualniono priorytet + label_issues_visibility_own: Utworzone lub przypisane do użytkownika + field_issues_visibility: Widoczne zagadnienia + label_issues_visibility_all: Wszystkie + permission_set_own_issues_private: Ustawianie własnych zagadnień jako prywatne/publiczne + field_is_private: Prywatne + permission_set_issues_private: Ustawianie zagadnień jako prywatne/publiczne + label_issues_visibility_public: Wszystkie nie prywatne + text_issues_destroy_descendants_confirmation: To spowoduje usunięcie również %{count} podzagadnień. + field_commit_logs_encoding: Kodowanie komentarzy zatwierdzeń + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Polecenie + text_scm_command_version: Wersja + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Zagadnienie %{id} utworzone. + label_between: pomiędzy + setting_issue_group_assignment: Zezwól przypisywać zagadnienia do grup + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Dostępne kolumny + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Wybrane kolumny + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Użyj bieżącej daty jako daty rozpoczęcia nowych zagadnień + button_edit_section: Edytuj tą sekcje + setting_repositories_encodings: Kodowanie znaków załączników i repozytoriów + description_all_columns: Wszystkie kolumny + button_export: Exportuj + label_export_options: "%{export_format} export options" + error_attachment_too_big: Plik nie może być przesłany, ponieważ przekracza maksymalny dopuszczalny rozmial (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 zagadnień + one: 1 zagadnienie + other: "%{count} zagadnienia" + label_repository_new: Nowe repozytorium + field_repository_is_default: Główne repozytorium + label_copy_attachments: Kopiuj załączniki + label_item_position: "%{position}/%{count}" + label_completed_versions: Zamknięte wersje + text_project_identifier_info: 'Dozwolone małe litery (a-z), liczby i myślniki.
    Raz zapisany, identyfikator nie może być zmieniony.' + field_multiple: Wielokrotne wartości + setting_commit_cross_project_ref: Zezwól na odwołania do innych projektów i zamykanie zagadnień innych projektów + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Zarządzanie powiązanymi zagadnieniami + field_auth_source_ldap_filter: Filtr LDAP + label_search_for_watchers: Wyszukaj obserwatorów do dodania + notice_account_deleted: Twoje konto zostało trwale usunięte. + setting_unsubscribe: Zezwól użytkownikom usuwać swoje konta + button_delete_my_account: Usuń moje konto + text_account_destroy_confirmation: |- + Czy jesteś pewien? + Twoje konto zostanie trwale usunięte, bez możliwości przywrócenia go. + error_session_expired: Twoja sesja wygasła. Zaloguj się ponownie. + text_session_expiration_settings: "Uwaga: zmiana tych ustawień może spowodować przeterminowanie sesji obecnie zalogowanych użytkowników, w tym twojej." + setting_session_lifetime: Maksymalny czas życia sesji + setting_session_timeout: Maksymalny czas życia nieaktywnej sesji + label_session_expiration: Przeterminowywanie sesji + permission_close_project: Zamykanie / otwieranie projektów + label_show_closed_projects: Przeglądanie zamkniętych projektów + button_close: Zamknij projekt + button_reopen: Otwórz projekt + project_status_active: aktywny + project_status_closed: zamknięty + project_status_archived: zarchiwizowany + text_project_closed: Ten projekt jest zamknięty i dostępny tylko do odczytu. + notice_user_successful_create: Utworzono użytkownika %{id}. + field_core_fields: Pola standardowe + field_timeout: Limit czasu (w sekundach) + setting_thumbnails_enabled: Wyświetlaj miniatury załączników + setting_thumbnails_size: Rozmiar minuatury (w pikselach) + label_status_transitions: Przejścia między statusami + label_fields_permissions: Uprawnienia do pól + label_readonly: Tylko do odczytu + label_required: Wymagane + text_repository_identifier_info: 'Dozwolone małe litery (a-z), liczby, myślniki i podkreślenia.
    Raz zapisany, identyfikator nie może być zmieniony.' + field_board_parent: Forum nadrzędne + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Kopiuj podzagadnienia + label_copied_to: skopiowane do + label_copied_from: skopiowane z + label_any_issues_in_project: dowolne zagadnienie w projekcie + label_any_issues_not_in_project: dowolne zagadnienie w innym projekcie + field_private_notes: Prywatne notatki + permission_view_private_notes: Podgląd prywatnych notatek + permission_set_notes_private: Ustawianie notatek jako prywatnych + label_no_issues_in_project: brak zagadnień w projekcie + label_any: wszystko + label_last_n_weeks: ostatnie %{count} tygodnie + setting_cross_project_subtasks: Powiązania zagadnień między projektami + label_cross_project_descendants: Z podprojektami + label_cross_project_tree: Z drzewem projektów + label_cross_project_hierarchy: Z hierarchią projektów + label_cross_project_system: Ze wszystkimi projektami + button_hide: Ukryj + setting_non_working_week_days: Dni nie-robocze + label_in_the_next_days: w ciągu następnych dni + label_in_the_past_days: w ciągu poprzednich dni + label_attribute_of_user: User's %{name} + text_turning_multiple_off: Jeśli wyłączysz wielokrotne wartości, istniejące wielokrotne wartości zostana usunięte w celu zachowania tylko jednej z nich dla każdego obiektu. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Dodawanie dokumentów + permission_edit_documents: Edycja dokumentów + permission_delete_documents: Usuwanie dokumentów + label_gantt_progress_line: Linia postępu + setting_jsonp_enabled: Uaktywnij wsparcie dla JSONP + field_inherit_members: Dziedziczenie uczestników + field_closed_on: Data zamknięcia + field_generate_password: Wygeneruj hasło + setting_default_projects_tracker_ids: Domyślne typy zagadnień dla nowych projektów + label_total_time: Ogółem + text_scm_config: Możesz skonfigurować polecenia SCM w pliku config/configuration.yml. Zrestartuj aplikację po wykonaniu zmian. + text_scm_command_not_available: Polecenie SCM nie jest dostępne. Proszę sprawdzić ustawienia w panelu administracyjnym. + setting_emails_header: Nagłówek e-maili + notice_account_not_activated_yet: Jeszcze nie aktywowałeś swojego konta. Jeśli chcesz + otrzymać nowy e-mail aktywanyjny, kliknij tutaj. + notice_account_locked: Twoje konto jest zablokowane. + notice_account_register_done: Konto zostało pomyślnie utworzone. E-mail zawierający + instrukcję aktywacji konta został wysłany na adres %{email}. + label_hidden: Ukryte + label_visibility_private: tylko dla mnie + label_visibility_roles: tylko dla ról + label_visibility_public: dla wszystkich + field_must_change_passwd: Musi zmienić hasło przy następnym logowaniu + notice_new_password_must_be_different: Nowe hasło musi być inne niż poprzednie + setting_mail_handler_excluded_filenames: Wyklucz załączniki wg nazwy + text_convert_available: Konwersja przez ImageMagick dostępna (optional) + label_link: Link + label_only: tylko + label_drop_down_list: lista rozwijana + label_checkboxes: pola wyboru + label_link_values_to: Linkuj wartości do URL + setting_force_default_language_for_anonymous: Wymuś domyślny język dla anonimowych użytkowników + setting_force_default_language_for_loggedin: Wymuś domyślny język dla zalogowanych użytkowników + label_custom_field_select_type: Wybierz typ obiektu, dla którego chcesz utworzyć pole niestandardowe + label_issue_assigned_to_updated: Uaktualniono osobę przypisaną + label_check_for_updates: Sprawdź aktualizacje + label_latest_compatible_version: Najnowsza kompatybilna wersja + label_unknown_plugin: Nieznany plugin + label_radio_buttons: pola opcji + label_group_anonymous: Anonimowi użytkownicy + label_group_non_member: Użytkownicy nie bedący uczestnikami + label_add_projects: Dodaj projekty + field_default_status: Domyślny status + text_subversion_repository_note: 'Przykłady: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Widoczni użytkownicy + label_users_visibility_all: Wszyscy aktywni użytkownicy + label_users_visibility_members_of_visible_projects: Uczestnicy widocznych projektów + label_edit_attachments: Edytuj załączone pliki + setting_link_copied_issue: Powiązywanie zagadnień podczas kopiowania + label_link_copied_issue: Powiąż kopiowane zagadnienia + label_ask: Pytaj + label_search_attachments_yes: Szukaj w nazwach i opisach załączników + label_search_attachments_no: Nie szukaj załączników + label_search_attachments_only: Szukaj tylko załączników + label_search_open_issues_only: Tylko otwarte zagadnienia + field_address: E-mail + setting_max_additional_emails: Maksymalna liczba dodatkowych adresów email + label_email_address_plural: Email + label_email_address_add: Dodaj adres email + label_enable_notifications: Włącz powiadomienia + label_disable_notifications: Wyłącz powiadomienia + setting_search_results_per_page: Limit wyników wyszukiwania na stronie + label_blank_value: blank + permission_copy_issues: Kopiowanie zagadnień + error_password_expired: Twoje hasło wygasło lub administrator wymaga jego zmiany. + field_time_entries_visibility: Widoczny przepracowany czas + setting_password_max_age: Wymagaj zmiany hasła po + label_parent_task_attributes: Atrybuty zagadnień nadrzędnych + label_parent_task_attributes_derived: Obliczone z podzagadnień + label_parent_task_attributes_independent: Niezależne od podzagadnień + label_time_entries_visibility_all: Wszystkie wpisy dziennika + label_time_entries_visibility_own: Wpisy dziennika utworzone przez użytkownika + label_member_management: Zarządzanie uczestnikami + label_member_management_all_roles: Wszystkimi rolami + label_member_management_selected_roles_only: Tylko tymi rolami + label_password_required: Potwierdź hasło aby kontynuować + label_total_spent_time: Przepracowany czas + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Całkowity szacowany czas + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: Klucz API + setting_lost_password: Zapomniane hasło + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml new file mode 100644 index 0000000..3f190ee --- /dev/null +++ b/config/locales/pt-BR.yml @@ -0,0 +1,1244 @@ +pt-BR: + direction: ltr + date: + formats: + default: "%d/%m/%Y" + short: "%d de %B" + long: "%d de %B de %Y" + only_day: "%d" + + day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado] + abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] + month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] + abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] + order: + - :day + - :month + - :year + + time: + formats: + default: "%A, %d de %B de %Y, %H:%M h" + time: "%H:%M h" + short: "%d/%m, %H:%M h" + long: "%A, %d de %B de %Y, %H:%M h" + only_second: "%S" + datetime: + formats: + default: "%Y-%m-%dT%H:%M:%S%Z" + am: '' + pm: '' + + # date helper distancia em palavras + datetime: + distance_in_words: + half_a_minute: 'meio minuto' + less_than_x_seconds: + one: 'menos de 1 segundo' + other: 'menos de %{count} segundos' + + x_seconds: + one: '1 segundo' + other: '%{count} segundos' + + less_than_x_minutes: + one: 'menos de um minuto' + other: 'menos de %{count} minutos' + + x_minutes: + one: '1 minuto' + other: '%{count} minutos' + + about_x_hours: + one: 'aproximadamente 1 hora' + other: 'aproximadamente %{count} horas' + x_hours: + one: "1 hora" + other: "%{count} horas" + + x_days: + one: '1 dia' + other: '%{count} dias' + + about_x_months: + one: 'aproximadamente 1 mês' + other: 'aproximadamente %{count} meses' + + x_months: + one: '1 mês' + other: '%{count} meses' + + about_x_years: + one: 'aproximadamente 1 ano' + other: 'aproximadamente %{count} anos' + + over_x_years: + one: 'mais de 1 ano' + other: 'mais de %{count} anos' + almost_x_years: + one: "quase 1 ano" + other: "quase %{count} anos" + + # numeros + number: + format: + precision: 3 + separator: ',' + delimiter: '.' + currency: + format: + unit: 'R$' + precision: 2 + format: '%u %n' + separator: ',' + delimiter: '.' + percentage: + format: + delimiter: '.' + precision: + format: + delimiter: '.' + human: + format: + precision: 3 + delimiter: '.' + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + support: + array: + sentence_connector: "e" + skip_last_comma: true + + # Active Record + activerecord: + errors: + template: + header: + one: "modelo não pode ser salvo: 1 erro" + other: "modelo não pode ser salvo: %{count} erros." + body: "Por favor, verifique os seguintes campos:" + messages: + inclusion: "não está incluso na lista" + exclusion: "não está disponível" + invalid: "não é válido" + confirmation: "não está de acordo com a confirmação" + accepted: "precisa ser aceito" + empty: "não pode ficar vazio" + blank: "não pode ficar vazio" + too_long: "é muito longo (máximo: %{count} caracteres)" + too_short: "é muito curto (mínimo: %{count} caracteres)" + wrong_length: "deve ter %{count} caracteres" + taken: "não está disponível" + not_a_number: "não é um número" + greater_than: "precisa ser maior do que %{count}" + greater_than_or_equal_to: "precisa ser maior ou igual a %{count}" + equal_to: "precisa ser igual a %{count}" + less_than: "precisa ser menor do que %{count}" + less_than_or_equal_to: "precisa ser menor ou igual a %{count}" + odd: "precisa ser ímpar" + even: "precisa ser par" + greater_than_start_date: "deve ser maior que a data inicial" + not_same_project: "não pertence ao mesmo projeto" + circular_dependency: "Esta relação geraria uma dependência circular" + cant_link_an_issue_with_a_descendant: "Uma tarefa não pode ser relacionada a uma de suas subtarefas" + earlier_than_minimum_start_date: "não pode ser anterior a %{date} por causa de tarefas anteriores" + not_a_regexp: "não é uma expressão regular válida" + open_issue_with_closed_parent: "Uma tarefa aberta não pode ser associada à uma tarefa pai fechada" + + actionview_instancetag_blank_option: Selecione + + general_text_No: 'Não' + general_text_Yes: 'Sim' + general_text_no: 'não' + general_text_yes: 'sim' + general_lang_name: 'Portuguese/Brazil (Português/Brasil)' + general_csv_separator: ';' + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Conta atualizada com sucesso. + notice_account_invalid_credentials: Usuário ou senha inválido. + notice_account_password_updated: Senha alterada com sucesso. + notice_account_wrong_password: Senha inválida. + notice_account_register_done: Conta criada com sucesso. Para ativar sua conta, clique no link que lhe foi enviado por e-mail. + notice_account_unknown_email: Usuário desconhecido. + notice_can_t_change_password: Esta conta utiliza autenticação externa. Não é possível alterar a senha. + notice_account_lost_email_sent: Um e-mail com instruções para escolher uma nova senha foi enviado para você. + notice_account_activated: Sua conta foi ativada. Você pode acessá-la agora. + notice_successful_create: Criado com sucesso. + notice_successful_update: Alterado com sucesso. + notice_successful_delete: Excluído com sucesso. + notice_successful_connection: Conectado com sucesso. + notice_file_not_found: A página que você está tentando acessar não existe ou foi excluída. + notice_locking_conflict: Os dados foram atualizados por outro usuário. + notice_not_authorized: Você não está autorizado a acessar esta página. + notice_email_sent: "Um e-mail foi enviado para %{value}" + notice_email_error: "Ocorreu um erro ao enviar o e-mail (%{value})" + notice_feeds_access_key_reseted: Sua chave Atom foi reconfigurada. + notice_failed_to_save_issues: "Problema ao salvar %{count} tarefa(s) de %{total} selecionadas: %{ids}." + notice_no_issue_selected: "Nenhuma tarefa selecionada! Por favor, marque as tarefas que você deseja editar." + notice_account_pending: "Sua conta foi criada e está aguardando aprovação do administrador." + notice_default_data_loaded: Configuração padrão carregada com sucesso. + + error_can_t_load_default_data: "A configuração padrão não pode ser carregada: %{value}" + error_scm_not_found: "A entrada e/ou a revisão não existe no repositório." + error_scm_command_failed: "Ocorreu um erro ao tentar acessar o repositório: %{value}" + error_scm_annotate: "Esta entrada não existe ou não pode ser anotada." + error_issue_not_found_in_project: 'A tarefa não foi encontrada ou não pertence a este projeto' + error_no_tracker_in_project: 'Não há um tipo de tarefa associado a este projeto. Favor verificar as configurações do projeto.' + error_no_default_issue_status: 'A situação padrão para tarefa não está definida. Favor verificar sua configuração (Vá em "Administração -> Situação da tarefa").' + error_ldap_bind_credentials: "Conta/Palavra-chave do LDAP não é válida" + + mail_subject_lost_password: "Sua senha do %{value}." + mail_body_lost_password: 'Para mudar sua senha, clique no link abaixo:' + mail_subject_register: "Ativação de conta do %{value}." + mail_body_register: 'Para ativar sua conta, clique no link abaixo:' + mail_body_account_information_external: "Você pode usar sua conta do %{value} para entrar." + mail_body_account_information: Informações sobre sua conta + mail_subject_account_activation_request: "%{value} - Requisição de ativação de conta" + mail_body_account_activation_request: "Um novo usuário (%{value}) se registrou. A conta está aguardando sua aprovação:" + mail_subject_reminder: "%{count} tarefa(s) com data prevista para os próximos %{days} dias" + mail_body_reminder: "%{count} tarefa(s) para você com data prevista para os próximos %{days} dias:" + + + field_name: Nome + field_description: Descrição + field_summary: Resumo + field_is_required: Obrigatório + field_firstname: Nome + field_lastname: Sobrenome + field_mail: E-mail + field_filename: Arquivo + field_filesize: Tamanho + field_downloads: Downloads + field_author: Autor + field_created_on: Criado em + field_updated_on: Alterado em + field_field_format: Formato + field_is_for_all: Para todos os projetos + field_possible_values: Possíveis valores + field_regexp: Expressão regular + field_min_length: Tamanho mínimo + field_max_length: Tamanho máximo + field_value: Valor + field_category: Categoria + field_title: Título + field_project: Projeto + field_issue: Tarefa + field_status: Situação + field_notes: Notas + field_is_closed: Tarefa fechada + field_is_default: Situação padrão + field_tracker: Tipo + field_subject: Título + field_due_date: Data prevista + field_assigned_to: Atribuído para + field_priority: Prioridade + field_fixed_version: Versão + field_user: Usuário + field_role: Cargo + field_homepage: Página do projeto + field_is_public: Público + field_parent: Subprojeto de + field_is_in_roadmap: Exibir no planejamento + field_login: Usuário + field_mail_notification: Notificações por e-mail + field_admin: Administrador + field_last_login_on: Última conexão + field_language: Idioma + field_effective_date: Data + field_password: Senha + field_new_password: Nova senha + field_password_confirmation: Confirmação + field_version: Versão + field_type: Tipo + field_host: Servidor + field_port: Porta + field_account: Conta + field_base_dn: DN Base + field_attr_login: Atributo para nome de usuário + field_attr_firstname: Atributo para nome + field_attr_lastname: Atributo para sobrenome + field_attr_mail: Atributo para e-mail + field_onthefly: Criar usuários dinamicamente ("on-the-fly") + field_start_date: Início + field_done_ratio: "% Terminado" + field_auth_source: Modo de autenticação + field_hide_mail: Ocultar meu e-mail + field_comments: Comentário + field_url: URL + field_start_page: Página inicial + field_subproject: Subprojeto + field_hours: Horas + field_activity: Atividade + field_spent_on: Data + field_identifier: Identificador + field_is_filter: É um filtro + field_issue_to: Tarefa relacionada + field_delay: Atraso + field_assignable: Tarefas podem ser atribuídas a este papel + field_redirect_existing_links: Redirecionar links existentes + field_estimated_hours: Tempo estimado + field_column_names: Colunas + field_time_zone: Fuso-horário + field_searchable: Pesquisável + field_default_value: Padrão + field_comments_sorting: Visualizar comentários + field_parent_title: Página pai + + setting_app_title: Título da aplicação + setting_app_subtitle: Subtítulo da aplicação + setting_welcome_text: Texto de boas-vindas + setting_default_language: Idioma padrão + setting_login_required: Exigir autenticação + setting_self_registration: Permitido Auto-registro + setting_attachment_max_size: Tamanho máximo do anexo + setting_issues_export_limit: Limite de exportação das tarefas + setting_mail_from: E-mail enviado de + setting_bcc_recipients: Enviar com cópia oculta (cco) + setting_host_name: Nome do Servidor e subdomínio + setting_text_formatting: Formatação do texto + setting_wiki_compression: Compactação de histórico do Wiki + setting_feeds_limit: Número de registros por Feed + setting_default_projects_public: Novos projetos são públicos por padrão + setting_autofetch_changesets: Obter commits automaticamente + setting_sys_api_enabled: Ativar WS para gerenciamento do repositório (SVN) + setting_commit_ref_keywords: Palavras-chave de referência + setting_commit_fix_keywords: Definição de palavras-chave + setting_autologin: Auto-login + setting_date_format: Formato da data + setting_time_format: Formato de hora + setting_cross_project_issue_relations: Permitir relacionar tarefas entre projetos + setting_issue_list_default_columns: Colunas na lista de tarefas por padrão + setting_emails_footer: Rodapé do e-mail + setting_protocol: Protocolo + setting_per_page_options: Número de itens exibidos por página + setting_user_format: Formato de exibição de nome de usuário + setting_activity_days_default: Dias visualizados na atividade do projeto + setting_display_subprojects_issues: Visualizar tarefas dos subprojetos nos projetos principais por padrão + setting_enabled_scm: SCM habilitados + setting_mail_handler_api_enabled: Habilitar WS para e-mails de entrada + setting_mail_handler_api_key: Chave de API + setting_sequential_project_identifiers: Gerar identificadores sequenciais de projeto + + project_module_issue_tracking: Gerenciamento de Tarefas + project_module_time_tracking: Gerenciamento de tempo + project_module_news: Notícias + project_module_documents: Documentos + project_module_files: Arquivos + project_module_wiki: Wiki + project_module_repository: Repositório + project_module_boards: Fóruns + + label_user: Usuário + label_user_plural: Usuários + label_user_new: Novo usuário + label_project: Projeto + label_project_new: Novo projeto + label_project_plural: Projetos + label_x_projects: + zero: nenhum projeto + one: 1 projeto + other: "%{count} projetos" + label_project_all: Todos os projetos + label_project_latest: Últimos projetos + label_issue: Tarefa + label_issue_new: Nova tarefa + label_issue_plural: Tarefas + label_issue_view_all: Ver todas as tarefas + label_issues_by: "Tarefas por %{value}" + label_issue_added: Tarefa adicionada + label_issue_updated: Tarefa atualizada + label_issue_note_added: Nota adicionada + label_issue_status_updated: Situação atualizada + label_issue_priority_updated: Prioridade atualizada + label_document: Documento + label_document_new: Novo documento + label_document_plural: Documentos + label_document_added: Documento adicionado + label_role: Papel + label_role_plural: Papéis + label_role_new: Novo papel + label_role_and_permissions: Papéis e permissões + label_member: Membro + label_member_new: Novo membro + label_member_plural: Membros + label_tracker: Tipo de tarefa + label_tracker_plural: Tipos de tarefas + label_tracker_new: Novo tipo + label_workflow: Fluxo de trabalho + label_issue_status: Situação da tarefa + label_issue_status_plural: Situação das tarefas + label_issue_status_new: Nova situação + label_issue_category: Categoria da tarefa + label_issue_category_plural: Categorias das tarefas + label_issue_category_new: Nova categoria + label_custom_field: Campo personalizado + label_custom_field_plural: Campos personalizados + label_custom_field_new: Novo campo personalizado + label_enumerations: 'Tipos & Categorias' + label_enumeration_new: Novo + label_information: Informação + label_information_plural: Informações + label_please_login: Efetue o login + label_register: Cadastre-se + label_password_lost: Perdi minha senha + label_home: Página inicial + label_my_page: Minha página + label_my_account: Minha conta + label_my_projects: Meus projetos + label_administration: Administração + label_login: Entrar + label_logout: Sair + label_help: Ajuda + label_reported_issues: Tarefas reportadas + label_assigned_to_me_issues: Minhas tarefas + label_last_login: Última conexão + label_registered_on: Registrado em + label_activity: Atividade + label_overall_activity: Atividades gerais + label_new: Novo + label_logged_as: "Acessando como:" + label_environment: Ambiente + label_authentication: Autenticação + label_auth_source: Modo de autenticação + label_auth_source_new: Novo modo de autenticação + label_auth_source_plural: Modos de autenticação + label_subproject_plural: Subprojetos + label_and_its_subprojects: "%{value} e seus subprojetos" + label_min_max_length: Tamanho mín-máx + label_list: Lista + label_date: Data + label_integer: Inteiro + label_float: Decimal + label_boolean: Booleano + label_string: Texto + label_text: Texto longo + label_attribute: Atributo + label_attribute_plural: Atributos + label_no_data: Nenhuma informação disponível + label_change_status: Alterar situação + label_history: Histórico + label_attachment: Arquivo + label_attachment_new: Novo arquivo + label_attachment_delete: Excluir arquivo + label_attachment_plural: Arquivos + label_file_added: Arquivo adicionado + label_report: Relatório + label_report_plural: Relatório + label_news: Notícia + label_news_new: Adicionar notícia + label_news_plural: Notícias + label_news_latest: Últimas notícias + label_news_view_all: Ver todas as notícias + label_news_added: Notícia adicionada + label_settings: Configurações + label_overview: Visão geral + label_version: Versão + label_version_new: Nova versão + label_version_plural: Versões + label_confirmation: Confirmação + label_export_to: Exportar para + label_read: Ler... + label_public_projects: Projetos públicos + label_open_issues: Aberta + label_open_issues_plural: Abertas + label_closed_issues: Fechada + label_closed_issues_plural: Fechadas + label_x_open_issues_abbr: + zero: 0 aberta + one: 1 aberta + other: "%{count} abertas" + label_x_closed_issues_abbr: + zero: 0 fechada + one: 1 fechada + other: "%{count} fechadas" + label_total: Total + label_permissions: Permissões + label_current_status: Situação atual + label_new_statuses_allowed: Nova situação permitida + label_all: todos + label_none: nenhum + label_nobody: ninguém + label_next: Próximo + label_previous: Anterior + label_used_by: Usado por + label_details: Detalhes + label_add_note: Adicionar nota + label_calendar: Calendário + label_months_from: meses a partir de + label_gantt: Gantt + label_internal: Interno + label_last_changes: "últimas %{count} alterações" + label_change_view_all: Mostrar todas as alterações + label_comment: Comentário + label_comment_plural: Comentários + label_x_comments: + zero: nenhum comentário + one: 1 comentário + other: "%{count} comentários" + label_comment_add: Adicionar comentário + label_comment_added: Comentário adicionado + label_comment_delete: Excluir comentário + label_query: Consulta personalizada + label_query_plural: Consultas personalizadas + label_query_new: Nova consulta + label_filter_add: Adicionar filtro + label_filter_plural: Filtros + label_equals: igual a + label_not_equals: diferente de + label_in_less_than: maior que + label_in_more_than: menor que + label_in: em + label_today: hoje + label_all_time: tudo + label_yesterday: ontem + label_this_week: esta semana + label_last_week: última semana + label_last_n_days: "últimos %{count} dias" + label_this_month: este mês + label_last_month: último mês + label_this_year: este ano + label_date_range: Período + label_less_than_ago: menos de + label_more_than_ago: mais de + label_ago: dias atrás + label_contains: contém + label_not_contains: não contém + label_day_plural: dias + label_repository: Repositório + label_repository_plural: Repositórios + label_browse: Procurar + label_revision: Revisão + label_revision_plural: Revisões + label_associated_revisions: Revisões associadas + label_added: adicionada + label_modified: alterada + label_deleted: excluída + label_latest_revision: Última revisão + label_latest_revision_plural: Últimas revisões + label_view_revisions: Ver revisões + label_max_size: Tamanho máximo + label_sort_highest: Mover para o início + label_sort_higher: Mover para cima + label_sort_lower: Mover para baixo + label_sort_lowest: Mover para o fim + label_roadmap: Planejamento + label_roadmap_due_in: "Previsto para %{value}" + label_roadmap_overdue: "%{value} atrasado" + label_roadmap_no_issues: Sem tarefas para esta versão + label_search: Busca + label_result_plural: Resultados + label_all_words: Todas as palavras + label_wiki: Wiki + label_wiki_edit: Editar Wiki + label_wiki_edit_plural: Edições Wiki + label_wiki_page: Página Wiki + label_wiki_page_plural: páginas Wiki + label_index_by_title: Índice por título + label_index_by_date: Índice por data + label_current_version: Versão atual + label_preview: Pré-visualizar + label_feed_plural: Feeds + label_changes_details: Detalhes de todas as alterações + label_issue_tracking: Tarefas + label_spent_time: Tempo gasto + label_f_hour: "%{value} hora" + label_f_hour_plural: "%{value} horas" + label_time_tracking: Registro de horas + label_change_plural: Alterações + label_statistics: Estatísticas + label_commits_per_month: Commits por mês + label_commits_per_author: Commits por autor + label_view_diff: Ver diferenças + label_diff_inline: em linha + label_diff_side_by_side: lado a lado + label_options: Opções + label_copy_workflow_from: Copiar fluxo de trabalho de + label_permissions_report: Relatório de permissões + label_watched_issues: Tarefas observadas + label_related_issues: Tarefas relacionadas + label_applied_status: Situação alterada + label_loading: Carregando... + label_relation_new: Nova relação + label_relation_delete: Excluir relação + label_relates_to: relacionado a + label_duplicates: duplica + label_duplicated_by: duplicado por + label_blocks: bloqueia + label_blocked_by: bloqueado por + label_precedes: precede + label_follows: segue + label_stay_logged_in: Permanecer logado + label_disabled: desabilitado + label_show_completed_versions: Exibir versões completas + label_me: mim + label_board: Fórum + label_board_new: Novo fórum + label_board_plural: Fóruns + label_topic_plural: Tópicos + label_message_plural: Mensagens + label_message_last: Última mensagem + label_message_new: Nova mensagem + label_message_posted: Mensagem enviada + label_reply_plural: Respostas + label_send_information: Enviar informação da nova conta para o usuário + label_year: Ano + label_month: Mês + label_week: Semana + label_date_from: De + label_date_to: Para + label_language_based: Com base no idioma do usuário + label_sort_by: "Ordenar por %{value}" + label_send_test_email: Enviar um e-mail de teste + label_feeds_access_key_created_on: "chave de acesso Atom criada %{value} atrás" + label_module_plural: Módulos + label_added_time_by: "Adicionado por %{author} %{age} atrás" + label_updated_time: "Atualizado %{value} atrás" + label_jump_to_a_project: Ir para o projeto... + label_file_plural: Arquivos + label_changeset_plural: Conjunto de alterações + label_default_columns: Colunas padrão + label_no_change_option: (Sem alteração) + label_bulk_edit_selected_issues: Edição em massa das tarefas selecionadas. + label_theme: Tema + label_default: Padrão + label_search_titles_only: Pesquisar somente títulos + label_user_mail_option_all: "Para qualquer evento em todos os meus projetos" + label_user_mail_option_selected: "Para qualquer evento somente no(s) projeto(s) selecionado(s)..." + label_user_mail_no_self_notified: "Eu não quero ser notificado de minhas próprias modificações" + label_registration_activation_by_email: ativação de conta por e-mail + label_registration_manual_activation: ativação manual de conta + label_registration_automatic_activation: ativação automática de conta + label_display_per_page: "Por página: %{value}" + label_age: Idade + label_change_properties: Alterar propriedades + label_general: Geral + label_scm: 'Controle de versão:' + label_plugins: Plugins + label_ldap_authentication: Autenticação LDAP + label_downloads_abbr: D/L + label_optional_description: Descrição opcional + label_add_another_file: Adicionar outro arquivo + label_preferences: Preferências + label_chronological_order: Em ordem cronológica + label_reverse_chronological_order: Em ordem cronológica inversa + label_incoming_emails: E-mails recebidos + label_generate_key: Gerar uma chave + label_issue_watchers: Observadores + + button_login: Entrar + button_submit: Enviar + button_save: Salvar + button_check_all: Marcar todos + button_uncheck_all: Desmarcar todos + button_delete: Excluir + button_create: Criar + button_test: Testar + button_edit: Editar + button_add: Adicionar + button_change: Alterar + button_apply: Aplicar + button_clear: Limpar + button_lock: Bloquear + button_unlock: Desbloquear + button_download: Baixar + button_list: Listar + button_view: Ver + button_move: Mover + button_back: Voltar + button_cancel: Cancelar + button_activate: Ativar + button_sort: Ordenar + button_log_time: Tempo de trabalho + button_rollback: Voltar para esta versão + button_watch: Observar + button_unwatch: Parar de observar + button_reply: Responder + button_archive: Arquivar + button_unarchive: Desarquivar + button_reset: Redefinir + button_rename: Renomear + button_change_password: Alterar senha + button_copy: Copiar + button_annotate: Anotar + button_update: Atualizar + button_configure: Configurar + button_quote: Responder + + status_active: ativo + status_registered: registrado + status_locked: bloqueado + + text_select_mail_notifications: Ações a serem notificadas por e-mail + text_regexp_info: ex. ^[A-Z0-9]+$ + text_min_max_length_info: 0 = sem restrição + text_project_destroy_confirmation: Você tem certeza que deseja excluir este projeto e todos os dados relacionados? + text_subprojects_destroy_warning: "Seu(s) subprojeto(s): %{value} também serão excluídos." + text_workflow_edit: Selecione um papel e um tipo de tarefa para editar o fluxo de trabalho + text_are_you_sure: Você tem certeza? + text_tip_issue_begin_day: tarefa inicia neste dia + text_tip_issue_end_day: tarefa termina neste dia + text_tip_issue_begin_end_day: tarefa inicia e termina neste dia + text_caracters_maximum: "máximo %{count} caracteres" + text_caracters_minimum: "deve ter ao menos %{count} caracteres." + text_length_between: "deve ter entre %{min} e %{max} caracteres." + text_tracker_no_workflow: Sem fluxo de trabalho definido para este tipo. + text_unallowed_characters: Caracteres não permitidos + text_comma_separated: Múltiplos valores são permitidos (separados por vírgula). + text_issues_ref_in_commit_messages: Referenciando tarefas nas mensagens de commit + text_issue_added: "Tarefa %{id} incluída (por %{author})." + text_issue_updated: "Tarefa %{id} alterada (por %{author})." + text_wiki_destroy_confirmation: Você tem certeza que deseja excluir este wiki e TODO o seu conteúdo? + text_issue_category_destroy_question: "Algumas tarefas (%{count}) estão atribuídas a esta categoria. O que você deseja fazer?" + text_issue_category_destroy_assignments: Remover atribuições da categoria + text_issue_category_reassign_to: Redefinir tarefas para esta categoria + text_user_mail_option: "Para projetos (não selecionados), você somente receberá notificações sobre o que você está observando ou está envolvido (ex. tarefas das quais você é o autor ou que estão atribuídas a você)" + text_no_configuration_data: "Os Papéis, tipos de tarefas, situação de tarefas e fluxos de trabalho não foram configurados ainda.\nÉ altamente recomendado carregar as configurações padrão. Você poderá modificar estas configurações assim que carregadas." + text_load_default_configuration: Carregar a configuração padrão + text_status_changed_by_changeset: "Aplicado no conjunto de alterações %{value}." + text_issues_destroy_confirmation: 'Você tem certeza que deseja excluir a(s) tarefa(s) selecionada(s)?' + text_select_project_modules: 'Selecione módulos para habilitar para este projeto:' + text_default_administrator_account_changed: Conta padrão do administrador alterada + text_file_repository_writable: Repositório com permissão de escrita + text_rmagick_available: RMagick disponível (opcional) + text_destroy_time_entries_question: "%{hours} horas de trabalho foram registradas nas tarefas que você está excluindo. O que você deseja fazer?" + text_destroy_time_entries: Excluir horas de trabalho + text_assign_time_entries_to_project: Atribuir estas horas de trabalho para outro projeto + text_reassign_time_entries: 'Atribuir horas reportadas para esta tarefa:' + text_user_wrote: "%{value} escreveu:" + text_enumeration_destroy_question: "%{count} objetos estão atribuídos a este valor." + text_enumeration_category_reassign_to: 'Reatribuí-los ao valor:' + text_email_delivery_not_configured: "O envio de e-mail não está configurado, e as notificações estão inativas.\nConfigure seu servidor SMTP no arquivo config/configuration.yml e reinicie a aplicação para ativá-las." + + default_role_manager: Gerente + default_role_developer: Desenvolvedor + default_role_reporter: Informante + default_tracker_bug: Defeito + default_tracker_feature: Funcionalidade + default_tracker_support: Suporte + default_issue_status_new: Nova + default_issue_status_in_progress: Em andamento + default_issue_status_resolved: Resolvida + default_issue_status_feedback: Feedback + default_issue_status_closed: Fechada + default_issue_status_rejected: Rejeitada + default_doc_category_user: Documentação do usuário + default_doc_category_tech: Documentação técnica + default_priority_low: Baixa + default_priority_normal: Normal + default_priority_high: Alta + default_priority_urgent: Urgente + default_priority_immediate: Imediata + default_activity_design: Design + default_activity_development: Desenvolvimento + + enumeration_issue_priorities: Prioridade das tarefas + enumeration_doc_categories: Categorias de documento + enumeration_activities: Atividades (registro de horas) + notice_unable_delete_version: Não foi possível excluir a versão + label_renamed: renomeado + label_copied: copiado + setting_plain_text_mail: Usar mensagem sem formatação HTML + permission_view_files: Ver arquivos + permission_edit_issues: Editar tarefas + permission_edit_own_time_entries: Editar o próprio tempo de trabalho + permission_manage_public_queries: Gerenciar consultas públicas + permission_add_issues: Adicionar tarefas + permission_log_time: Adicionar tempo gasto + permission_view_changesets: Ver conjunto de alterações + permission_view_time_entries: Ver tempo gasto + permission_manage_versions: Gerenciar versões + permission_manage_wiki: Gerenciar wiki + permission_manage_categories: Gerenciar categorias de tarefas + permission_protect_wiki_pages: Proteger páginas wiki + permission_comment_news: Comentar notícias + permission_delete_messages: Excluir mensagens + permission_select_project_modules: Selecionar módulos de projeto + permission_edit_wiki_pages: Editar páginas wiki + permission_add_issue_watchers: Adicionar observadores + permission_view_gantt: Ver gráfico gantt + permission_move_issues: Mover tarefas + permission_manage_issue_relations: Gerenciar relacionamentos de tarefas + permission_delete_wiki_pages: Excluir páginas wiki + permission_manage_boards: Gerenciar fóruns + permission_delete_wiki_pages_attachments: Excluir anexos + permission_view_wiki_edits: Ver histórico do wiki + permission_add_messages: Postar mensagens + permission_view_messages: Ver mensagens + permission_manage_files: Gerenciar arquivos + permission_edit_issue_notes: Editar notas + permission_manage_news: Gerenciar notícias + permission_view_calendar: Ver calendário + permission_manage_members: Gerenciar membros + permission_edit_messages: Editar mensagens + permission_delete_issues: Excluir tarefas + permission_view_issue_watchers: Ver lista de observadores + permission_manage_repository: Gerenciar repositório + permission_commit_access: Acesso do commit + permission_browse_repository: Pesquisar repositório + permission_view_documents: Ver documentos + permission_edit_project: Editar projeto + permission_add_issue_notes: Adicionar notas + permission_save_queries: Salvar consultas + permission_view_wiki_pages: Ver wiki + permission_rename_wiki_pages: Renomear páginas wiki + permission_edit_time_entries: Editar tempo gasto + permission_edit_own_issue_notes: Editar suas próprias notas + setting_gravatar_enabled: Usar ícones do Gravatar + label_example: Exemplo + text_repository_usernames_mapping: "Seleciona ou atualiza os usuários do Redmine mapeando para cada usuário encontrado no log do repositório.\nUsuários com o mesmo login ou e-mail no Redmine e no repositório serão mapeados automaticamente." + permission_edit_own_messages: Editar próprias mensagens + permission_delete_own_messages: Excluir próprias mensagens + label_user_activity: "Atividade de %{value}" + label_updated_time_by: "Atualizado por %{author} há %{age}" + text_diff_truncated: '... Este diff foi truncado porque excede o tamanho máximo que pode ser exibido.' + setting_diff_max_lines_displayed: Número máximo de linhas exibidas no diff + text_plugin_assets_writable: Diretório de plugins gravável + warning_attachments_not_saved: "%{count} arquivo(s) não puderam ser salvo(s)." + button_create_and_continue: Criar e continuar + text_custom_field_possible_values_info: 'Uma linha para cada valor' + label_display: Exibição + field_editable: Editável + setting_repository_log_display_limit: Número máximo de revisões exibidas no arquivo de log + setting_file_max_size_displayed: Tamanho máximo dos arquivos textos exibidos em linha + field_identity_urler: Observador + setting_openid: Permitir Login e Registro via OpenID + field_identity_url: OpenID URL + label_login_with_open_id_option: ou use o OpenID + field_content: Conteúdo + label_descending: Descendente + label_sort: Ordenar + label_ascending: Ascendente + label_date_from_to: De %{start} até %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Esta página tem %{descendants} página(s) filha(s) e descendente(s). O que você quer fazer? + text_wiki_page_reassign_children: Reatribuir páginas filhas para esta página pai + text_wiki_page_nullify_children: Manter as páginas filhas como páginas raízes + text_wiki_page_destroy_children: Excluir páginas filhas e todas suas descendentes + setting_password_min_length: Comprimento mínimo para senhas + field_group_by: Agrupar por + mail_subject_wiki_content_updated: "A página wiki '%{id}' foi atualizada" + label_wiki_content_added: Página wiki adicionada + mail_subject_wiki_content_added: "A página wiki '%{id}' foi adicionada" + mail_body_wiki_content_added: A página wiki '%{id}' foi adicionada por %{author}. + label_wiki_content_updated: Página wiki atualizada + mail_body_wiki_content_updated: A página wiki '%{id}' foi atualizada por %{author}. + permission_add_project: Criar projeto + setting_new_project_user_role_id: Papel atribuído a um usuário não-administrador que cria um projeto + label_view_all_revisions: Ver todas as revisões + label_tag: Tag + label_branch: Branch + text_journal_changed: "%{label} alterado de %{old} para %{new}" + text_journal_set_to: "%{label} ajustado para %{value}" + text_journal_deleted: "%{label} excluído (%{old})" + label_group_plural: Grupos + label_group: Grupo + label_group_new: Novo grupo + label_time_entry_plural: Tempos gastos + text_journal_added: "%{label} %{value} adicionado" + field_active: Ativo + enumeration_system_activity: Atividade do sistema + permission_delete_issue_watchers: Excluir observadores + version_status_closed: fechado + version_status_locked: bloqueado + version_status_open: aberto + error_can_not_reopen_issue_on_closed_version: Uma tarefa atribuída a uma versão fechada não pode ser reaberta + label_user_anonymous: Anônimo + button_move_and_follow: Mover e seguir + setting_default_projects_modules: Módulos habilitados por padrão para novos projetos + setting_gravatar_default: Imagem-padrão do Gravatar + field_sharing: Compartilhamento + label_version_sharing_hierarchy: Com a hierarquia do projeto + label_version_sharing_system: Com todos os projetos + label_version_sharing_descendants: Com subprojetos + label_version_sharing_tree: Com a árvore do projeto + label_version_sharing_none: Sem compartilhamento + error_can_not_archive_project: Este projeto não pode ser arquivado + button_duplicate: Duplicar + button_copy_and_follow: Copiar e seguir + label_copy_source: Origem + setting_issue_done_ratio: Calcular o percentual de conclusão da tarefa + setting_issue_done_ratio_issue_status: Usar a situação da tarefa + error_issue_done_ratios_not_updated: O percentual de conclusão das tarefas não foi atualizado. + error_workflow_copy_target: Por favor, selecione os tipos de tarefa e os papéis alvo + setting_issue_done_ratio_issue_field: Use o campo da tarefa + label_copy_same_as_target: Mesmo alvo + label_copy_target: Alvo + notice_issue_done_ratios_updated: Percentual de conclusão atualizados. + error_workflow_copy_source: Por favor, selecione um tipo de tarefa e papel de origem + label_update_issue_done_ratios: Atualizar percentual de conclusão das tarefas + setting_start_of_week: Início da semana + field_watcher: Observador + permission_view_issues: Ver tarefas + label_display_used_statuses_only: Somente exibir situações que são usadas por este tipo de tarefa + label_revision_id: Revisão %{value} + label_api_access_key: Chave de acesso à API + button_show: Exibir + label_api_access_key_created_on: Chave de acesso à API criado há %{value} atrás + label_feeds_access_key: Chave de acesso ao Atom + notice_api_access_key_reseted: Sua chave de acesso à API foi redefinida. + setting_rest_api_enabled: Habilitar a API REST + label_missing_api_access_key: Chave de acesso à API faltando + label_missing_feeds_access_key: Chave de acesso ao Atom faltando + text_line_separated: Múltiplos valores permitidos (uma linha para cada valor). + setting_mail_handler_body_delimiters: Truncar e-mails após uma destas linhas + permission_add_subprojects: Criar subprojetos + label_subproject_new: Novo subprojeto + text_own_membership_delete_confirmation: |- + Você irá excluir algumas de suas próprias permissões e não estará mais apto a editar este projeto após esta operação. + Você tem certeza que deseja continuar? + label_close_versions: Fechar versões concluídas + label_board_sticky: Marcado + label_board_locked: Bloqueado + permission_export_wiki_pages: Exportar páginas wiki + setting_cache_formatted_text: Realizar cache de texto formatado + permission_manage_project_activities: Gerenciar atividades do projeto + error_unable_delete_issue_status: Não foi possível excluir situação da tarefa + label_profile: Perfil + permission_manage_subtasks: Gerenciar subtarefas + field_parent_issue: Tarefa pai + label_subtask_plural: Subtarefas + label_project_copy_notifications: Enviar notificações por e-mail ao copiar projeto + error_can_not_delete_custom_field: Não foi possível excluir o campo personalizado + error_unable_to_connect: Não foi possível conectar (%{value}) + error_can_not_remove_role: Este papel está em uso e não pode ser excluído. + error_can_not_delete_tracker: Este tipo de tarefa está atribuído a alguma(s) tarefa(s) e não pode ser excluído. + field_principal: Principal + notice_failed_to_save_members: "Falha ao salvar membro(s): %{errors}." + text_zoom_out: Afastar zoom + text_zoom_in: Aproximar zoom + notice_unable_delete_time_entry: Não foi possível excluir a entrada no registro de horas trabalhadas. + label_overall_spent_time: Tempo gasto geral + field_time_entries: Registro de horas + project_module_gantt: Gantt + project_module_calendar: Calendário + button_edit_associated_wikipage: "Editar página wiki relacionada: %{page_title}" + field_text: Campo de texto + setting_default_notification_option: Opção padrão de notificação + label_user_mail_option_only_my_events: Somente de tarefas que observo ou que esteja envolvido + label_user_mail_option_none: Sem eventos + field_member_of_group: Responsável pelo grupo + field_assigned_to_role: Papel do responsável + notice_not_authorized_archived_project: O projeto que você está tentando acessar foi arquivado. + label_principal_search: "Pesquisar por usuários ou grupos:" + label_user_search: "Pesquisar por usuário:" + field_visible: Visível + setting_emails_header: Cabeçalho do e-mail + setting_commit_logtime_activity_id: Atividade para registrar horas + text_time_logged_by_changeset: Aplicado no conjunto de alterações %{value}. + setting_commit_logtime_enabled: Habilitar registro de horas + notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max}) + setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gantt + field_warn_on_leaving_unsaved: Alertar-me ao sair de uma página sem salvar o texto + text_warn_on_leaving_unsaved: A página atual contém texto que não foi salvo e será perdido se você sair desta página. + label_my_queries: Minhas consultas personalizadas + text_journal_changed_no_detail: "%{label} atualizado(a)" + label_news_comment_added: Notícia recebeu um comentário + button_expand_all: Expandir tudo + button_collapse_all: Recolher tudo + label_additional_workflow_transitions_for_assignee: Transições adicionais permitidas quando o usuário é o responsável pela tarefa + label_additional_workflow_transitions_for_author: Transições adicionais permitidas quando o usuário é o autor + + label_bulk_edit_selected_time_entries: Alteração em massa do registro de horas + text_time_entries_destroy_confirmation: Tem certeza que quer excluir o(s) registro(s) de horas selecionado(s)? + label_role_anonymous: Anônimo + label_role_non_member: Não Membro + label_issues_visibility_own: Tarefas criadas ou atribuídas ao usuário + field_issues_visibility: Visibilidade das tarefas + label_issues_visibility_all: Todas as tarefas + permission_set_own_issues_private: Alterar as próprias tarefas para públicas ou privadas + field_is_private: Privado + permission_set_issues_private: Alterar tarefas para públicas ou privadas + label_issues_visibility_public: Todas as tarefas não privadas + text_issues_destroy_descendants_confirmation: Isto também irá excluir %{count} subtarefa(s). + field_commit_logs_encoding: Codificação das mensagens de commit + field_scm_path_encoding: Codificação do caminho + text_scm_path_encoding_note: "Padrão: UTF-8" + field_path_to_repository: Caminho para o repositório + field_root_directory: Diretório raiz + field_cvs_module: Módulo + field_cvsroot: CVSROOT + text_mercurial_repository_note: "Repositório local (ex.: /hgrepo, c:\\hgrepo)" + text_scm_command: Comando + text_scm_command_version: Versão + label_git_report_last_commit: Relatar última alteração para arquivos e diretórios + text_scm_config: Você pode configurar seus comandos de versionamento em config/configurations.yml. Por favor reinicie a aplicação após alterá-lo. + text_scm_command_not_available: Comando de versionamento não disponível. Por favor verifique as configurações no painel de administração. + notice_issue_successful_create: Tarefa %{id} criada. + label_between: entre + setting_issue_group_assignment: Permitir atribuições de tarefas a grupos + label_diff: diff + text_git_repository_note: "Repositório esta vazio e é local (ex: /gitrepo, c:\\gitrepo)" + + description_query_sort_criteria_direction: Escolher ordenação + description_project_scope: Escopo da pesquisa + description_filter: Filtro + description_user_mail_notification: Configuração de notificações por e-mail + description_message_content: Conteúdo da mensagem + description_available_columns: Colunas disponíveis + description_issue_category_reassign: Escolha uma categoria de tarefas + description_search: Campo de busca + description_notes: Notas + description_choose_project: Projetos + description_query_sort_criteria_attribute: Atributo de ordenação + description_wiki_subpages_reassign: Escolha uma nova página pai + description_selected_columns: Colunas selecionadas + + label_parent_revision: Pai + label_child_revision: Filho + error_scm_annotate_big_text_file: A entrada não pode ser anotada, pois excede o tamanho máximo do arquivo de texto. + setting_default_issue_start_date_to_creation_date: Usar data corrente como data inicial para novas tarefas + button_edit_section: Editar esta seção + setting_repositories_encodings: Codificação dos repositórios e anexos + description_all_columns: Todas as colunas + button_export: Exportar + label_export_options: "Opções de exportação %{export_format}" + error_attachment_too_big: Este arquivo não pode ser enviado porque excede o tamanho máximo permitido (%{max_size}) + notice_failed_to_save_time_entries: "Falha ao salvar %{count} de %{total} horas trabalhadas: %{ids}." + label_x_issues: + zero: 0 tarefa + one: 1 tarefa + other: "%{count} tarefas" + label_repository_new: Novo repositório + field_repository_is_default: Repositório principal + label_copy_attachments: Copiar anexos + label_item_position: "%{position}/%{count}" + label_completed_versions: Versões concluídas + text_project_identifier_info: Somente letras minúsculas (a-z), números, traços e sublinhados são permitidos.
    Uma vez salvo, o identificador não pode ser alterado. + field_multiple: Múltiplos valores + setting_commit_cross_project_ref: Permitir que tarefas de todos os outros projetos sejam refenciadas e resolvidas + text_issue_conflict_resolution_add_notes: Adicionar minhas anotações e descartar minhas outras mudanças + text_issue_conflict_resolution_overwrite: Aplicar as minhas alterações de qualquer maneira (notas anteriores serão mantidas, mas algumas mudanças podem ser substituídas) + notice_issue_update_conflict: A tarefa foi atualizada por um outro usuário, enquanto você estava editando. + text_issue_conflict_resolution_cancel: Descartar todas as minhas mudanças e reexibir %{link} + permission_manage_related_issues: Gerenciar tarefas relacionadas + field_auth_source_ldap_filter: Filtro LDAP + label_search_for_watchers: Procurar por outros observadores para adicionar + notice_account_deleted: Sua conta foi excluída permanentemente. + setting_unsubscribe: Permitir aos usuários excluir sua própria conta + button_delete_my_account: Excluir minha conta + text_account_destroy_confirmation: |- + Tem certeza que quer continuar? + Sua conta será excluída permanentemente, sem qualquer forma de reativá-la. + error_session_expired: A sua sessão expirou. Por favor, faça login novamente. + text_session_expiration_settings: "Aviso: a alteração dessas configurações pode expirar as sessões atuais, incluindo a sua." + setting_session_lifetime: Duração máxima da sessão + setting_session_timeout: Tempo limite de inatividade da sessão + label_session_expiration: "Expiração da sessão" + permission_close_project: Fechar / reabrir o projeto + label_show_closed_projects: Visualizar projetos fechados + button_close: Fechar + button_reopen: Reabrir + project_status_active: ativo + project_status_closed: fechado + project_status_archived: arquivado + text_project_closed: Este projeto está fechado e somente leitura. + notice_user_successful_create: Usuário %{id} criado. + field_core_fields: campos padrão + field_timeout: Tempo de espera (em segundos) + setting_thumbnails_enabled: Exibir miniaturas de anexos + setting_thumbnails_size: Tamanho das miniaturas (em pixels) + label_status_transitions: Estados das transições + label_fields_permissions: Permissões de campos + label_readonly: somente leitura + label_required: Obrigatório + text_repository_identifier_info: Somente letras minúsculas (az), números, traços e sublinhados são permitidos
    Uma vez salvo, o identificador não pode ser alterado. + field_board_parent: Fórum Pai + label_attribute_of_project: "Projeto %{name}" + label_attribute_of_author: "autor %{name}" + label_attribute_of_assigned_to: "atribuído a %{name}" + label_attribute_of_fixed_version: "versão %{name}" + label_copy_subtasks: Copiar subtarefas + label_copied_to: copiada + label_copied_from: copiado + label_any_issues_in_project: qualquer tarefa do projeto + label_any_issues_not_in_project: qualquer tarefa que não está no projeto + field_private_notes: notas privadas + permission_view_private_notes: Ver notas privadas + permission_set_notes_private: Permitir alterar notas para privada + label_no_issues_in_project: sem tarefas no projeto + label_any: todos + label_last_n_weeks: "últimas %{count} semanas" + setting_cross_project_subtasks: Permitir subtarefas entre projetos + label_cross_project_descendants: com subprojetos + label_cross_project_tree: Com a árvore do Projeto + label_cross_project_hierarchy: Com uma hierarquia do Projeto + label_cross_project_system: Com todos os Projetos + button_hide: Omitir + setting_non_working_week_days: dias não úteis + label_in_the_next_days: nos próximos dias + label_in_the_past_days: nos dias anteriores + label_attribute_of_user: Usuário %{name} + text_turning_multiple_off: Se você desativar vários valores, eles serão removidos, a fim de preservar somente um valor por item. + label_attribute_of_issue: Tarefa %{name} + permission_add_documents: Adicionar documentos + permission_edit_documents: Editar documentos + permission_delete_documents: Excluir documentos + label_gantt_progress_line: Linha de progresso + setting_jsonp_enabled: Ativar suporte JSONP + field_inherit_members: Herdar membros + field_closed_on: Concluído + field_generate_password: Gerar senha + setting_default_projects_tracker_ids: Tipos padrões para novos projeto + label_total_time: Total + notice_account_not_activated_yet: Sua conta ainda não foi ativada. Se você deseja receber + um novo email de ativação, por favor clique aqui. + notice_account_locked: Sua conta está bloqueada. + label_hidden: Visibilidade + label_visibility_private: para mim + label_visibility_roles: para os papéis + label_visibility_public: para qualquer usuário + field_must_change_passwd: É necessário alterar sua senha na próxima vez que tentar acessar sua conta + notice_new_password_must_be_different: A nova senha deve ser diferente da senha atual + setting_mail_handler_excluded_filenames: Exclui anexos por nome + text_convert_available: Conversor ImageMagick disponível (opcional) + label_link: Link + label_only: somente + label_drop_down_list: lista suspensa + label_checkboxes: checkboxes + label_link_values_to: Valores do link para URL + setting_force_default_language_for_anonymous: Forçar linguagem padrão para usuários + anônimos + setting_force_default_language_for_loggedin: Forçar linguagem padrão para usuários + logados + label_custom_field_select_type: Selecione o tipo de objeto ao qual o campo personalizado + é para ser anexado + label_issue_assigned_to_updated: Atribuição atualizada + label_check_for_updates: Verificar atualizações + label_latest_compatible_version: Última versão compatível + label_unknown_plugin: Plugin desconhecido + label_radio_buttons: botões radio + label_group_anonymous: Usuários anônimos + label_group_non_member: Usuários não membros + label_add_projects: Adicionar projetos + field_default_status: Situação padrão + text_subversion_repository_note: 'Exemplos: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Visibilidade do usuário + label_users_visibility_all: Todos usuários ativos + label_users_visibility_members_of_visible_projects: Membros de projetos visíveis + label_edit_attachments: Editar arquivos anexados + setting_link_copied_issue: Relacionar tarefas copiadas + label_link_copied_issue: Relacionar tarefas copiadas + label_ask: Perguntar + label_search_attachments_yes: Procurar nome do arquivo e descrição anexados + label_search_attachments_no: Não procurar anexados + label_search_attachments_only: Procurar somente anexados + label_search_open_issues_only: Somente tarefas abertas + field_address: E-mail + setting_max_additional_emails: Número máximo de e-mails adicionais + label_email_address_plural: Emails + label_email_address_add: Adicionar endereço de email + label_enable_notifications: Habilitar notificações + label_disable_notifications: Desabilitar notificações + setting_search_results_per_page: Resultados de pesquisa por página + label_blank_value: Branco + permission_copy_issues: Copiar tarefas + error_password_expired: Sua senha expirou ou requer atualização + field_time_entries_visibility: Visibilidade do log de tempo + setting_password_max_age: Requer troca de senha depois + label_parent_task_attributes: Atributos das tarefas pai + label_parent_task_attributes_derived: Calculado das subtarefas + label_parent_task_attributes_independent: Independente das subtarefas + label_time_entries_visibility_all: Todas as entradas de tempo + label_time_entries_visibility_own: Entradas de tempo criadas pelo usuário + label_member_management: Gerenciamento de membros + label_member_management_all_roles: Todas os papéis + label_member_management_selected_roles_only: Somente esses papéis + label_password_required: Confirme sua senha para continuar + label_total_spent_time: Tempo gasto geral + notice_import_finished: "%{count} itens foram importados" + notice_import_finished_with_errors: "%{count} fora de %{total} não puderam ser importados" + error_invalid_file_encoding: O arquivo não é válido %{encoding} é a codificação do arquivo + error_invalid_csv_file_or_settings: O arquivo não é um arquivo CSV ou não corresponde às + definições abaixo + error_can_not_read_import_file: Ocorreu um erro ao ler o arquivo para importação + permission_import_issues: Importar tarefas + label_import_issues: Importar tarefas + label_select_file_to_import: Selecione o arquivo para importação + label_fields_separator: Campo separador + label_fields_wrapper: Field empacotador + label_encoding: Codificação + label_comma_char: Vírgula + label_semi_colon_char: Ponto e vírgula + label_quote_char: Citar + label_double_quote_char: Citação dupla + label_fields_mapping: Mapeamento de campos + label_file_content_preview: Pré-visualizar conteúdo do arquivo + label_create_missing_values: Criar valores em falta + button_import: Importar + field_total_estimated_hours: Tempo estimado geral + label_api: API + label_total_plural: Totais + label_assigned_issues: Tarefas atribuídas + label_field_format_enumeration: Chave/Lista de valores + label_f_hour_short: '%{value} h' + field_default_version: Versão padrão + error_attachment_extension_not_allowed: Extensão anexada %{extension} não é permitida + setting_attachment_extensions_allowed: Permitir extensões + setting_attachment_extensions_denied: Negar extensões + label_any_open_issues: Quaisquer tarefas abertas + label_no_open_issues: Sem tarefas abertas + label_default_values_for_new_users: Valores padrões para novos usuários + setting_sys_api_key: Chave de API + setting_lost_password: Perdi minha senha + mail_subject_security_notification: Notificação de segurança + mail_body_security_notification_change: ! '%{field} foi alterado.' + mail_body_security_notification_change_to: ! '%{field} foi alterado para %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} foi adicionado.' + mail_body_security_notification_remove: ! '%{field} %{value} foi excluído.' + mail_body_security_notification_notify_enabled: Endereço de e-mail %{value} agora recebe + notificações. + mail_body_security_notification_notify_disabled: Endereço de e-mail %{value} deixou de + receber notificações. + mail_body_settings_updated: ! 'As seguintes configurações foram alteradas:' + field_remote_ip: Endereço IP + label_wiki_page_new: Nova página wiki + label_relations: Relações + button_filter: Filtro + mail_body_password_updated: Sua senha foi alterada. + label_no_preview: Não há visualização disponível + error_no_tracker_allowed_for_new_issue_in_project: O projeto não tem nenhum tipo de tarefa + para o qual você pode criar um chamado + label_tracker_all: Todos os tipos de tarefa + label_new_project_issue_tab_enabled: Exibir "Nova tarefa" em aba + setting_new_item_menu_tab: Aba menu do projeto para criação de novos objetos + label_new_object_tab_enabled: Exibir o "+" suspenso + error_no_projects_with_tracker_allowed_for_new_issue: Não há projetos com tipos de tarefa para os quais você pode criar uma tarefa + field_textarea_font: Fonte usada para áreas de texto + label_font_default: Fonte padrão + label_font_monospace: Fonte monoespaçada + label_font_proportional: Fonte proporcional + setting_timespan_format: Formato de tempo + label_table_of_contents: Índice + setting_commit_logs_formatting: Aplicar formatação de texto às mensagens de commit + setting_mail_handler_enable_regex_delimiters: Ativar a utilização de expressões regulares + error_move_of_child_not_possible: 'A subtarefa %{child} não pode ser movida para o novo projeto: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: O tempo gasto não pode ser alterado numa tarefa que será apagada + setting_timelog_required_fields: Campos obrigatórios para registro de horas + label_attribute_of_object: '%{object_name} %{name}' + label_user_mail_option_only_assigned: Somente de tarefas que observo ou que estão atribuídas a mim + label_user_mail_option_only_owner: Somente de tarefas que observo ou que foram criadas por mim + warning_fields_cleared_on_bulk_edit: As alterações vão apagar valores de um ou mais campos nos objetos selecionados + field_updated_by: Atualizado por + field_last_updated_by: Última atualização por + field_full_width_layout: Layout utiliza toda a largura + label_last_notes: Últimas notas + field_digest: Verificador + field_default_assigned_to: Responsável padrão + setting_show_custom_fields_on_registration: Mostrar campos personalizados no registro + permission_view_news: Ver notícias + label_no_preview_alternative_html: Visualização não disponível. Faça o %{link} do arquivo. + label_no_preview_download: download diff --git a/config/locales/pt.yml b/config/locales/pt.yml new file mode 100644 index 0000000..1d7bda4 --- /dev/null +++ b/config/locales/pt.yml @@ -0,0 +1,1223 @@ +# Portuguese localization for Ruby on Rails +# by Ricardo Otero +# by Alberto Ferreira +# by: Pedro Araújo +# by Rui Rebelo +pt: + support: + array: + sentence_connector: "e" + skip_last_comma: true + + direction: ltr + date: + formats: + default: "%d/%m/%Y" + short: "%d de %B" + long: "%d de %B de %Y" + only_day: "%d" + day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado] + abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] + month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] + abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] + order: + - :day + - :month + - :year + + time: + formats: + default: "%A, %d de %B de %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d/%m, %H:%M hs" + long: "%A, %d de %B de %Y, %H:%Mh" + am: 'am' + pm: 'pm' + + datetime: + distance_in_words: + half_a_minute: "meio minuto" + less_than_x_seconds: + one: "menos de 1 segundo" + other: "menos de %{count} segundos" + x_seconds: + one: "1 segundo" + other: "%{count} segundos" + less_than_x_minutes: + one: "menos de 1 minuto" + other: "menos de %{count} minutos" + x_minutes: + one: "1 minuto" + other: "%{count} minutos" + about_x_hours: + one: "aproximadamente 1 hora" + other: "aproximadamente %{count} horas" + x_hours: + one: "1 hora" + other: "%{count} horas" + x_days: + one: "1 dia" + other: "%{count} dias" + about_x_months: + one: "aproximadamente 1 mês" + other: "aproximadamente %{count} meses" + x_months: + one: "1 mês" + other: "%{count} meses" + about_x_years: + one: "aproximadamente 1 ano" + other: "aproximadamente %{count} anos" + over_x_years: + one: "mais de 1 ano" + other: "mais de %{count} anos" + almost_x_years: + one: "quase 1 ano" + other: "quase %{count} anos" + + number: + format: + precision: 3 + separator: ',' + delimiter: '.' + currency: + format: + unit: '€' + precision: 2 + format: "%u %n" + separator: ',' + delimiter: '.' + percentage: + format: + delimiter: '' + precision: + format: + delimiter: '' + human: + format: + precision: 3 + delimiter: '' + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + activerecord: + errors: + template: + header: + one: "Não foi possível guardar este %{model}: 1 erro" + other: "Não foi possível guardar este %{model}: %{count} erros" + body: "Por favor, verifique os seguintes campos:" + messages: + inclusion: "não está incluído na lista" + exclusion: "não está disponível" + invalid: "não é válido" + confirmation: "não está de acordo com a confirmação" + accepted: "deve ser aceite" + empty: "não pode estar vazio" + blank: "não pode estar em branco" + too_long: "tem demasiados caráteres (máximo: %{count} caráteres)" + too_short: "tem poucos caráteres (mínimo: %{count} caráteres)" + wrong_length: "não é do tamanho correto (necessita de ter %{count} caráteres)" + taken: "não está disponível" + not_a_number: "não é um número" + greater_than: "tem de ser maior do que %{count}" + greater_than_or_equal_to: "tem de ser maior ou igual a %{count}" + equal_to: "tem de ser igual a %{count}" + less_than: "tem de ser menor do que %{count}" + less_than_or_equal_to: "tem de ser menor ou igual a %{count}" + odd: "deve ser ímpar" + even: "deve ser par" + greater_than_start_date: "deve ser maior que a data inicial" + not_same_project: "não pertence ao mesmo projeto" + circular_dependency: "Esta relação iria criar uma dependência circular" + cant_link_an_issue_with_a_descendant: "Não é possível ligar uma tarefa a uma sub-tarefa que lhe é pertencente" + earlier_than_minimum_start_date: "não pode ser antes de %{date} devido a tarefas precedentes" + not_a_regexp: "não é uma expressão regular válida" + open_issue_with_closed_parent: "Uma tarefa aberta não pode ser relacionada com uma tarefa pai fechada" + + actionview_instancetag_blank_option: Selecione + + general_text_No: 'Não' + general_text_Yes: 'Sim' + general_text_no: 'não' + general_text_yes: 'sim' + general_lang_name: 'Portuguese (Português)' + general_csv_separator: ';' + general_csv_decimal_separator: ',' + general_csv_encoding: ISO-8859-15 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: A conta foi atualizada com sucesso. + notice_account_invalid_credentials: Utilizador ou palavra-chave inválidos. + notice_account_password_updated: A palavra-chave foi alterada com sucesso. + notice_account_wrong_password: Palavra-chave errada. + notice_account_unknown_email: Utilizador desconhecido. + notice_can_t_change_password: Esta conta utiliza uma fonte de autenticação externa. Não é possível alterar a palavra-chave. + notice_account_lost_email_sent: Foi-lhe enviado um e-mail com as instruções para escolher uma nova palavra-chave. + notice_account_activated: A sua conta foi ativada. É agora possível autenticar-se. + notice_successful_create: Criado com sucesso. + notice_successful_update: Alterado com sucesso. + notice_successful_delete: Apagado com sucesso. + notice_successful_connection: Ligado com sucesso. + notice_file_not_found: A página que está a tentar aceder não existe ou foi removida. + notice_locking_conflict: Os dados foram atualizados por outro utilizador. + notice_not_authorized: Não está autorizado a visualizar esta página. + notice_email_sent: "Foi enviado um e-mail para %{value}" + notice_email_error: "Ocorreu um erro ao enviar o e-mail (%{value})" + notice_feeds_access_key_reseted: A sua chave de Atom foi inicializada. + notice_failed_to_save_issues: "Não foi possível guardar %{count} tarefa(s) das %{total} selecionadas: %{ids}." + notice_no_issue_selected: "Nenhuma tarefa selecionada! Por favor, selecione as tarefas que deseja editar." + notice_account_pending: "A sua conta foi criada e está agora à espera de aprovação do administrador." + notice_default_data_loaded: Configuração padrão carregada com sucesso. + notice_unable_delete_version: Não foi possível apagar a versão. + + error_can_t_load_default_data: "Não foi possível carregar a configuração padrão: %{value}" + error_scm_not_found: "A entrada ou revisão não foi encontrada no repositório." + error_scm_command_failed: "Ocorreu um erro ao tentar aceder ao repositório: %{value}" + error_scm_annotate: "A entrada não existe ou não pode ser anotada." + error_issue_not_found_in_project: 'A tarefa não foi encontrada ou não pertence a este projeto.' + error_ldap_bind_credentials: "Conta/Palavra-chave do LDAP não é válida" + + mail_subject_lost_password: "Palavra-chave de %{value}" + mail_body_lost_password: 'Para mudar a sua palavra-chave, clique na ligação abaixo:' + mail_subject_register: "Ativação de conta de %{value}" + mail_body_register: 'Para ativar a sua conta, clique na ligação abaixo:' + mail_body_account_information_external: "Pode utilizar a conta %{value} para autenticar-se." + mail_body_account_information: Informação da sua conta + mail_subject_account_activation_request: "Pedido de ativação da conta %{value}" + mail_body_account_activation_request: "Um novo utilizador (%{value}) registou-se. A sua conta está à espera de aprovação:" + mail_subject_reminder: "Tem %{count} tarefa(s) para entregar nos próximos %{days} dias" + mail_body_reminder: "%{count} tarefa(s) que estão atribuídas a si estão agendadas para serem terminadas nos próximos %{days} dias:" + + field_name: Nome + field_description: Descrição + field_summary: Sumário + field_is_required: Obrigatório + field_firstname: Nome + field_lastname: Apelido + field_mail: E-mail + field_filename: Ficheiro + field_filesize: Tamanho + field_downloads: Downloads + field_author: Autor + field_created_on: Criado + field_updated_on: Alterado + field_field_format: Formato + field_is_for_all: Para todos os projetos + field_possible_values: Valores possíveis + field_regexp: Expressão regular + field_min_length: Tamanho mínimo + field_max_length: Tamanho máximo + field_value: Valor + field_category: Categoria + field_title: Título + field_project: Projeto + field_issue: Tarefa + field_status: Estado + field_notes: Notas + field_is_closed: Tarefa fechada + field_is_default: Valor por omissão + field_tracker: Tipo + field_subject: Assunto + field_due_date: Data de fim + field_assigned_to: Atribuído a + field_priority: Prioridade + field_fixed_version: Versão + field_user: Utilizador + field_role: Função + field_homepage: Página + field_is_public: Público + field_parent: Sub-projeto de + field_is_in_roadmap: Tarefas mostradas no mapa de planificação + field_login: Nome de utilizador + field_mail_notification: Notificações por e-mail + field_admin: Administrador + field_last_login_on: Última visita + field_language: Língua + field_effective_date: Data + field_password: Palavra-chave + field_new_password: Nova palavra-chave + field_password_confirmation: Confirmação + field_version: Versão + field_type: Tipo + field_host: Servidor + field_port: Porta + field_account: Conta + field_base_dn: Base DN + field_attr_login: Atributo utilizador + field_attr_firstname: Atributo do nome próprio + field_attr_lastname: Atributo do último nome + field_attr_mail: Atributo e-mail + field_onthefly: Criação imediata de utilizadores + field_start_date: Data de início + field_done_ratio: "% Completo" + field_auth_source: Modo de autenticação + field_hide_mail: Esconder endereço de e-mail + field_comments: Comentário + field_url: URL + field_start_page: Página inicial + field_subproject: Subprojeto + field_hours: Horas + field_activity: Atividade + field_spent_on: Data + field_identifier: Identificador + field_is_filter: Utilizado como filtro + field_issue_to: Tarefa relacionada + field_delay: Atraso + field_assignable: As tarefas podem ser associadas a esta função + field_redirect_existing_links: Redirecionar ligações existentes + field_estimated_hours: Tempo estimado + field_column_names: Colunas + field_time_zone: Fuso horário + field_searchable: Pesquisável + field_default_value: Valor por omissão + field_comments_sorting: Mostrar comentários + field_parent_title: Página pai + + setting_app_title: Título da aplicação + setting_app_subtitle: Sub-título da aplicação + setting_welcome_text: Texto de boas vindas + setting_default_language: Língua por omissão + setting_login_required: Autenticação obrigatória + setting_self_registration: Auto-registo + setting_attachment_max_size: Tamanho máximo do anexo + setting_issues_export_limit: Limite de exportação das tarefas + setting_mail_from: E-mail enviado de + setting_bcc_recipients: Destinatários em BCC + setting_host_name: Hostname + setting_text_formatting: Formatação do texto + setting_wiki_compression: Compressão do histórico da Wiki + setting_feeds_limit: Limite de conteúdo do feed + setting_default_projects_public: Projetos novos são públicos por omissão + setting_autofetch_changesets: Procurar automaticamente por commits + setting_sys_api_enabled: Ativar Web Service para gestão do repositório + setting_commit_ref_keywords: Palavras-chave de referência + setting_commit_fix_keywords: Palavras-chave de fecho + setting_autologin: Login automático + setting_date_format: Formato da data + setting_time_format: Formato do tempo + setting_cross_project_issue_relations: Permitir relações entre tarefas de projetos diferentes + setting_issue_list_default_columns: Colunas na lista de tarefas por omissão + setting_emails_footer: Rodapé dos e-mails + setting_protocol: Protocolo + setting_per_page_options: Opções de objetos por página + setting_user_format: Formato de apresentação de utilizadores + setting_activity_days_default: Dias mostrados na atividade do projeto + setting_display_subprojects_issues: Mostrar as tarefas dos sub-projetos nos projetos principais + setting_enabled_scm: Ativar SCM + setting_mail_handler_api_enabled: Ativar Web Service para e-mails recebidos + setting_mail_handler_api_key: Chave da API + setting_sequential_project_identifiers: Gerar identificadores de projeto sequênciais + + project_module_issue_tracking: Tarefas + project_module_time_tracking: Registo de tempo + project_module_news: Notícias + project_module_documents: Documentos + project_module_files: Ficheiros + project_module_wiki: Wiki + project_module_repository: Repositório + project_module_boards: Fórum + + label_user: Utilizador + label_user_plural: Utilizadores + label_user_new: Novo utilizador + label_project: Projeto + label_project_new: Novo projeto + label_project_plural: Projetos + label_x_projects: + zero: sem projetos + one: 1 projeto + other: "%{count} projetos" + label_project_all: Todos os projetos + label_project_latest: Últimos projetos + label_issue: Tarefa + label_issue_new: Nova tarefa + label_issue_plural: Tarefas + label_issue_view_all: Ver todas as tarefas + label_issues_by: "Tarefas por %{value}" + label_issue_added: Tarefa adicionada + label_issue_updated: Tarefa atualizada + label_document: Documento + label_document_new: Novo documento + label_document_plural: Documentos + label_document_added: Documento adicionado + label_role: Função + label_role_plural: Funções + label_role_new: Nova função + label_role_and_permissions: Funções e permissões + label_member: Membro + label_member_new: Novo membro + label_member_plural: Membros + label_tracker: Tipo + label_tracker_plural: Tipos + label_tracker_new: Novo tipo + label_workflow: Fluxo de trabalho + label_issue_status: Estado da tarefa + label_issue_status_plural: Estados da tarefa + label_issue_status_new: Novo estado + label_issue_category: Categoria de tarefa + label_issue_category_plural: Categorias de tarefa + label_issue_category_new: Nova categoria + label_custom_field: Campo personalizado + label_custom_field_plural: Campos personalizados + label_custom_field_new: Novo campo personalizado + label_enumerations: Enumerações + label_enumeration_new: Novo valor + label_information: Informação + label_information_plural: Informações + label_please_login: Por favor autentique-se + label_register: Registar + label_password_lost: Perdi a palavra-chave + label_home: Página Inicial + label_my_page: Página Pessoal + label_my_account: Minha conta + label_my_projects: Meus projetos + label_administration: Administração + label_login: Entrar + label_logout: Sair + label_help: Ajuda + label_reported_issues: Tarefas criadas + label_assigned_to_me_issues: Tarefas atribuídas a mim + label_last_login: Último acesso + label_registered_on: Registado em + label_activity: Atividade + label_overall_activity: Atividade geral + label_new: Novo + label_logged_as: Ligado como + label_environment: Ambiente + label_authentication: Autenticação + label_auth_source: Modo de autenticação + label_auth_source_new: Novo modo de autenticação + label_auth_source_plural: Modos de autenticação + label_subproject_plural: Sub-projetos + label_and_its_subprojects: "%{value} e sub-projetos" + label_min_max_length: Tamanho mínimo-máximo + label_list: Lista + label_date: Data + label_integer: Inteiro + label_float: Decimal + label_boolean: Booleano + label_string: Texto + label_text: Texto longo + label_attribute: Atributo + label_attribute_plural: Atributos + label_no_data: Sem dados para mostrar + label_change_status: Mudar estado + label_history: Histórico + label_attachment: Ficheiro + label_attachment_new: Novo ficheiro + label_attachment_delete: Apagar ficheiro + label_attachment_plural: Ficheiros + label_file_added: Ficheiro adicionado + label_report: Relatório + label_report_plural: Relatórios + label_news: Notícia + label_news_new: Nova notícia + label_news_plural: Notícias + label_news_latest: Últimas notícias + label_news_view_all: Ver todas as notícias + label_news_added: Notícia adicionada + label_settings: Configurações + label_overview: Visão geral + label_version: Versão + label_version_new: Nova versão + label_version_plural: Versões + label_confirmation: Confirmação + label_export_to: 'Também disponível em:' + label_read: Ler... + label_public_projects: Projetos públicos + label_open_issues: aberto + label_open_issues_plural: abertos + label_closed_issues: fechado + label_closed_issues_plural: fechados + label_x_open_issues_abbr: + zero: 0 abertas + one: 1 aberta + other: "%{count} abertas" + label_x_closed_issues_abbr: + zero: 0 fechadas + one: 1 fechada + other: "%{count} fechadas" + label_total: Total + label_permissions: Permissões + label_current_status: Estado atual + label_new_statuses_allowed: Novos estados permitidos + label_all: todos + label_none: nenhum + label_nobody: ninguém + label_next: Próximo + label_previous: Anterior + label_used_by: Utilizado por + label_details: Detalhes + label_add_note: Adicionar nota + label_calendar: Calendário + label_months_from: meses desde + label_gantt: Gantt + label_internal: Interno + label_last_changes: "últimas %{count} alterações" + label_change_view_all: Ver todas as alterações + label_comment: Comentário + label_comment_plural: Comentários + label_x_comments: + zero: sem comentários + one: 1 comentário + other: "%{count} comentários" + label_comment_add: Adicionar comentário + label_comment_added: Comentário adicionado + label_comment_delete: Apagar comentários + label_query: Consulta personalizada + label_query_plural: Consultas personalizadas + label_query_new: Nova consulta + label_filter_add: Adicionar filtro + label_filter_plural: Filtros + label_equals: é + label_not_equals: não é + label_in_less_than: em menos de + label_in_more_than: em mais de + label_in: em + label_today: hoje + label_all_time: sempre + label_yesterday: ontem + label_this_week: esta semana + label_last_week: semana passada + label_last_n_days: "últimos %{count} dias" + label_this_month: este mês + label_last_month: mês passado + label_this_year: este ano + label_date_range: Intervalo de datas + label_less_than_ago: menos de dias atrás + label_more_than_ago: mais de dias atrás + label_ago: dias atrás + label_contains: contém + label_not_contains: não contém + label_day_plural: dias + label_repository: Repositório + label_repository_plural: Repositórios + label_browse: Navegar + label_revision: Revisão + label_revision_plural: Revisões + label_associated_revisions: Revisões associadas + label_added: adicionado + label_modified: modificado + label_copied: copiado + label_renamed: renomeado + label_deleted: apagado + label_latest_revision: Última revisão + label_latest_revision_plural: Últimas revisões + label_view_revisions: Ver revisões + label_max_size: Tamanho máximo + label_sort_highest: Mover para o início + label_sort_higher: Mover para cima + label_sort_lower: Mover para baixo + label_sort_lowest: Mover para o fim + label_roadmap: Planificação + label_roadmap_due_in: "Termina em %{value}" + label_roadmap_overdue: "Atrasado %{value}" + label_roadmap_no_issues: Sem tarefas para esta versão + label_search: Procurar + label_result_plural: Resultados + label_all_words: Todas as palavras + label_wiki: Wiki + label_wiki_edit: Edição da Wiki + label_wiki_edit_plural: Edições da Wiki + label_wiki_page: Página da Wiki + label_wiki_page_plural: Páginas da Wiki + label_index_by_title: Índice por título + label_index_by_date: Índice por data + label_current_version: Versão atual + label_preview: Pré-visualizar + label_feed_plural: Feeds + label_changes_details: Detalhes de todas as mudanças + label_issue_tracking: Tarefas + label_spent_time: Tempo gasto + label_f_hour: "%{value} hora" + label_f_hour_plural: "%{value} horas" + label_time_tracking: Registo de tempo + label_change_plural: Mudanças + label_statistics: Estatísticas + label_commits_per_month: Commits por mês + label_commits_per_author: Commits por autor + label_view_diff: Ver diferenças + label_diff_inline: inline + label_diff_side_by_side: lado a lado + label_options: Opções + label_copy_workflow_from: Copiar fluxo de trabalho de + label_permissions_report: Relatório de permissões + label_watched_issues: Tarefas observadas + label_related_issues: Tarefas relacionadas + label_applied_status: Estado aplicado + label_loading: A carregar... + label_relation_new: Nova relação + label_relation_delete: Apagar relação + label_relates_to: Relacionado a + label_duplicates: Duplica + label_duplicated_by: Duplicado por + label_blocks: Bloqueia + label_blocked_by: Bloqueada por + label_precedes: Precede + label_follows: Segue + label_stay_logged_in: Guardar sessão + label_disabled: desativado + label_show_completed_versions: Mostrar versões acabadas + label_me: eu + label_board: Fórum + label_board_new: Novo fórum + label_board_plural: Fórums + label_topic_plural: Tópicos + label_message_plural: Mensagens + label_message_last: Última mensagem + label_message_new: Nova mensagem + label_message_posted: Mensagem adicionada + label_reply_plural: Respostas + label_send_information: Enviar dados da conta para o utilizador + label_year: Ano + label_month: Mês + label_week: Semana + label_date_from: De + label_date_to: A + label_language_based: Baseado na língua do utilizador + label_sort_by: "Ordenar por %{value}" + label_send_test_email: Enviar um e-mail de teste + label_feeds_access_key_created_on: "Chave Atom criada há %{value} atrás" + label_module_plural: Módulos + label_added_time_by: "Adicionado por %{author} há %{age} atrás" + label_updated_time: "Alterado há %{value} atrás" + label_jump_to_a_project: Ir para o projeto... + label_file_plural: Ficheiros + label_changeset_plural: Commits + label_default_columns: Colunas por omissão + label_no_change_option: (sem alteração) + label_bulk_edit_selected_issues: Editar tarefas selecionadas em conjunto + label_theme: Tema + label_default: Padrão + label_search_titles_only: Procurar apenas em títulos + label_user_mail_option_all: "Qualquer evento em todos os meus projetos" + label_user_mail_option_selected: "Qualquer evento mas apenas nos projetos selecionados" + label_user_mail_no_self_notified: "Não quero ser notificado de alterações feitas por mim" + label_registration_activation_by_email: Ativação da conta por e-mail + label_registration_manual_activation: Ativação manual da conta + label_registration_automatic_activation: Ativação automática da conta + label_display_per_page: "Por página: %{value}" + label_age: Idade + label_change_properties: Mudar propriedades + label_general: Geral + label_scm: SCM + label_plugins: Extensões + label_ldap_authentication: Autenticação LDAP + label_downloads_abbr: D/L + label_optional_description: Descrição opcional + label_add_another_file: Adicionar outro ficheiro + label_preferences: Preferências + label_chronological_order: Em ordem cronológica + label_reverse_chronological_order: Em ordem cronológica inversa + label_incoming_emails: E-mails recebidos + label_generate_key: Gerar uma chave + label_issue_watchers: Observadores + + button_login: Entrar + button_submit: Submeter + button_save: Guardar + button_check_all: Marcar tudo + button_uncheck_all: Desmarcar tudo + button_delete: Apagar + button_create: Criar + button_test: Testar + button_edit: Editar + button_add: Adicionar + button_change: Alterar + button_apply: Aplicar + button_clear: Limpar + button_lock: Bloquear + button_unlock: Desbloquear + button_download: Download + button_list: Listar + button_view: Ver + button_move: Mover + button_back: Voltar + button_cancel: Cancelar + button_activate: Ativar + button_sort: Ordenar + button_log_time: Tempo de trabalho + button_rollback: Voltar para esta versão + button_watch: Observar + button_unwatch: Deixar de observar + button_reply: Responder + button_archive: Arquivar + button_unarchive: Desarquivar + button_reset: Reinicializar + button_rename: Renomear + button_change_password: Mudar palavra-chave + button_copy: Copiar + button_annotate: Anotar + button_update: Atualizar + button_configure: Configurar + button_quote: Citar + + status_active: ativo + status_registered: registado + status_locked: bloqueado + + text_select_mail_notifications: Selecionar as ações que originam uma notificação por e-mail. + text_regexp_info: ex. ^[A-Z0-9]+$ + text_min_max_length_info: 0 siginifica sem restrição + text_project_destroy_confirmation: Tem a certeza que deseja apagar o projeto e todos os dados relacionados? + text_subprojects_destroy_warning: "O(s) seu(s) sub-projeto(s): %{value} também será/serão apagado(s)." + text_workflow_edit: Selecione uma função e um tipo de tarefa para editar o fluxo de trabalho + text_are_you_sure: Tem a certeza? + text_tip_issue_begin_day: tarefa inicia neste dia + text_tip_issue_end_day: tarefa termina neste dia + text_tip_issue_begin_end_day: tarefa a iniciar e terminar neste dia + text_caracters_maximum: "máximo %{count} caráteres." + text_caracters_minimum: "Deve ter pelo menos %{count} caráteres." + text_length_between: "Deve ter entre %{min} e %{max} caráteres." + text_tracker_no_workflow: Sem fluxo de trabalho definido para este tipo de tarefa. + text_unallowed_characters: Caráteres não permitidos + text_comma_separated: Permitidos múltiplos valores (separados por vírgula). + text_issues_ref_in_commit_messages: Referenciar e fechar tarefas em mensagens de commit + text_issue_added: "A tarefa %{id} foi criada por %{author}." + text_issue_updated: "A tarefa %{id} foi atualizada por %{author}." + text_wiki_destroy_confirmation: Tem a certeza que deseja apagar esta wiki e todo o seu conteúdo? + text_issue_category_destroy_question: "Algumas tarefas (%{count}) estão atribuídas a esta categoria. O que deseja fazer?" + text_issue_category_destroy_assignments: Remover as atribuições à categoria + text_issue_category_reassign_to: Re-atribuir as tarefas para esta categoria + text_user_mail_option: "Para projetos não selecionados, apenas receberá notificações acerca de tarefas que está a observar ou que está envolvido (ex. tarefas das quais foi o criador ou lhes foram atribuídas)." + text_no_configuration_data: "Perfis, tipos de tarefas, estados das tarefas e workflows ainda não foram configurados.\nÉ extremamente recomendado carregar as configurações padrão. Será capaz de as modificar depois de estarem carregadas." + text_load_default_configuration: Carregar as configurações padrão + text_status_changed_by_changeset: "Aplicado no changeset %{value}." + text_issues_destroy_confirmation: 'Tem a certeza que deseja apagar a(s) tarefa(s) selecionada(s)?' + text_select_project_modules: 'Selecione os módulos a ativar para este projeto:' + text_default_administrator_account_changed: Conta por omissão de administrador alterada. + text_file_repository_writable: Repositório de ficheiros com permissões de escrita + text_rmagick_available: RMagick disponível (opcional) + text_destroy_time_entries_question: "%{hours} horas de trabalho foram atribuídas a estas tarefas que vai apagar. O que deseja fazer?" + text_destroy_time_entries: Apagar as horas + text_assign_time_entries_to_project: Atribuir as horas ao projeto + text_reassign_time_entries: 'Re-atribuir as horas para esta tarefa:' + text_user_wrote: "%{value} escreveu:" + text_enumeration_destroy_question: "%{count} objetos estão atribuídos a este valor." + text_enumeration_category_reassign_to: 'Re-atribuí-los para este valor:' + text_email_delivery_not_configured: "O envio de e-mail não está configurado, e as notificação estão desativadas.\nConfigure o seu servidor de SMTP em config/configuration.yml e reinicie a aplicação para ativar estas funcionalidades." + + default_role_manager: Gestor + default_role_developer: Programador + default_role_reporter: Repórter + default_tracker_bug: Bug + default_tracker_feature: Funcionalidade + default_tracker_support: Suporte + default_issue_status_new: Novo + default_issue_status_in_progress: Em curso + default_issue_status_resolved: Resolvido + default_issue_status_feedback: Feedback + default_issue_status_closed: Fechado + default_issue_status_rejected: Rejeitado + default_doc_category_user: Documentação de utilizador + default_doc_category_tech: Documentação técnica + default_priority_low: Baixa + default_priority_normal: Normal + default_priority_high: Alta + default_priority_urgent: Urgente + default_priority_immediate: Imediata + default_activity_design: Planeamento + default_activity_development: Desenvolvimento + + enumeration_issue_priorities: Prioridade de tarefas + enumeration_doc_categories: Categorias de documentos + enumeration_activities: Atividades (Registo de tempo) + setting_plain_text_mail: Apenas texto simples (sem HTML) + permission_view_files: Ver ficheiros + permission_edit_issues: Editar tarefas + permission_edit_own_time_entries: Editar horas pessoais + permission_manage_public_queries: Gerir consultas públicas + permission_add_issues: Adicionar tarefas + permission_log_time: Registar tempo gasto + permission_view_changesets: Ver commits + permission_view_time_entries: Ver tempo gasto + permission_manage_versions: Gerir versões + permission_manage_wiki: Gerir wiki + permission_manage_categories: Gerir categorias de tarefas + permission_protect_wiki_pages: Proteger páginas de wiki + permission_comment_news: Comentar notícias + permission_delete_messages: Apagar mensagens + permission_select_project_modules: Selecionar módulos do projeto + permission_edit_wiki_pages: Editar páginas da wiki + permission_add_issue_watchers: Adicionar observadores + permission_view_gantt: Ver diagrama de Gantt + permission_move_issues: Mover tarefas + permission_manage_issue_relations: Gerir relações de tarefas + permission_delete_wiki_pages: Apagar páginas de wiki + permission_manage_boards: Gerir fórums + permission_delete_wiki_pages_attachments: Apagar anexos + permission_view_wiki_edits: Ver histórico da wiki + permission_add_messages: Submeter mensagens + permission_view_messages: Ver mensagens + permission_manage_files: Gerir ficheiros + permission_edit_issue_notes: Editar notas de tarefas + permission_manage_news: Gerir notícias + permission_view_calendar: Ver calendário + permission_manage_members: Gerir membros + permission_edit_messages: Editar mensagens + permission_delete_issues: Apagar tarefas + permission_view_issue_watchers: Ver lista de observadores + permission_manage_repository: Gerir repositório + permission_commit_access: Acesso a commit + permission_browse_repository: Navegar em repositório + permission_view_documents: Ver documentos + permission_edit_project: Editar projeto + permission_add_issue_notes: Adicionar notas a tarefas + permission_save_queries: Guardar consultas + permission_view_wiki_pages: Ver wiki + permission_rename_wiki_pages: Renomear páginas de wiki + permission_edit_time_entries: Editar entradas de tempo + permission_edit_own_issue_notes: Editar as próprias notas + setting_gravatar_enabled: Utilizar ícones Gravatar + label_example: Exemplo + text_repository_usernames_mapping: "Selecionar ou atualizar o utilizador de Redmine mapeado a cada nome de utilizador encontrado no repositório.\nUtilizadores com o mesmo nome de utilizador ou e-mail no Redmine e no repositório são mapeados automaticamente." + permission_edit_own_messages: Editar as próprias mensagens + permission_delete_own_messages: Apagar as próprias mensagens + label_user_activity: "Atividade de %{value}" + label_updated_time_by: "Atualizado por %{author} há %{age}" + text_diff_truncated: '... Este diff foi truncado porque excede o tamanho máximo que pode ser mostrado.' + setting_diff_max_lines_displayed: Número máximo de linhas de diff mostradas + text_plugin_assets_writable: Escrita na pasta de ativos dos módulos de extensão possível + warning_attachments_not_saved: "Não foi possível gravar %{count} ficheiro(s) ." + button_create_and_continue: Criar e continuar + text_custom_field_possible_values_info: 'Uma linha para cada valor' + label_display: Mostrar + field_editable: Editável + setting_repository_log_display_limit: Número máximo de revisões exibido no relatório de ficheiro + setting_file_max_size_displayed: Tamanho máximo dos ficheiros de texto exibidos inline + field_watcher: Observador + setting_openid: Permitir início de sessão e registo com OpenID + field_identity_url: URL do OpenID + label_login_with_open_id_option: ou início de sessão com OpenID + field_content: Conteúdo + label_descending: Descendente + label_sort: Ordenar + label_ascending: Ascendente + label_date_from_to: De %{start} a %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Esta página tem %{descendants} página(s) subordinada(s) e descendente(s). O que deseja fazer? + text_wiki_page_reassign_children: Reatribuir páginas subordinadas a esta página principal + text_wiki_page_nullify_children: Manter páginas subordinadas como páginas raíz + text_wiki_page_destroy_children: Apagar as páginas subordinadas e todos os seus descendentes + setting_password_min_length: Tamanho mínimo de palavra-chave + field_group_by: Agrupar resultados por + mail_subject_wiki_content_updated: "A página Wiki '%{id}' foi atualizada" + label_wiki_content_added: Página Wiki adicionada + mail_subject_wiki_content_added: "A página Wiki '%{id}' foi adicionada" + mail_body_wiki_content_added: A página Wiki '%{id}' foi adicionada por %{author}. + label_wiki_content_updated: Página Wiki atualizada + mail_body_wiki_content_updated: A página Wiki '%{id}' foi atualizada por %{author}. + permission_add_project: Criar projeto + setting_new_project_user_role_id: Função atribuída a um utilizador não-administrador que cria um projeto + label_view_all_revisions: Ver todas as revisões + label_tag: Etiqueta + label_branch: Ramo + error_no_tracker_in_project: Este projeto não tem associado nenhum tipo de tarefas. Verifique as definições do projeto. + error_no_default_issue_status: Não está definido um estado padrão para as tarefas. Verifique a sua configuração (dirija-se a "Administração -> Estados da tarefa"). + label_group_plural: Grupos + label_group: Grupo + label_group_new: Novo grupo + label_time_entry_plural: Tempo registado + text_journal_changed: "%{label} alterado de %{old} para %{new}" + text_journal_set_to: "%{label} configurado como %{value}" + text_journal_deleted: "%{label} apagou (%{old})" + text_journal_added: "%{label} %{value} adicionado" + field_active: Ativo + enumeration_system_activity: Atividade do sistema + permission_delete_issue_watchers: Apagar observadores + version_status_closed: fechado + version_status_locked: protegido + version_status_open: aberto + error_can_not_reopen_issue_on_closed_version: Não é possível voltar a abrir uma tarefa atribuída a uma versão fechada + label_user_anonymous: Anónimo + button_move_and_follow: Mover e seguir + setting_default_projects_modules: Módulos ativos por predefinição para novos projetos + setting_gravatar_default: Imagem Gravatar predefinida + field_sharing: Partilha + label_version_sharing_hierarchy: Com hierarquia do projeto + label_version_sharing_system: Com todos os projetos + label_version_sharing_descendants: Com os sub-projetos + label_version_sharing_tree: Com árvore do projeto + label_version_sharing_none: Não partilhado + error_can_not_archive_project: Não é possível arquivar este projeto + button_duplicate: Duplicar + button_copy_and_follow: Copiar e seguir + label_copy_source: Origem + setting_issue_done_ratio: Calcular a percentagem de progresso da tarefa + setting_issue_done_ratio_issue_status: Através do estado da tarefa + error_issue_done_ratios_not_updated: Percentagens de progresso da tarefa não foram atualizadas. + error_workflow_copy_target: Selecione os tipos de tarefas e funções desejadas + setting_issue_done_ratio_issue_field: Através do campo da tarefa + label_copy_same_as_target: Mesmo que o alvo + label_copy_target: Alvo + notice_issue_done_ratios_updated: Percentagens de progresso da tarefa atualizadas. + error_workflow_copy_source: Selecione um tipo de tarefa ou função de origem + label_update_issue_done_ratios: Atualizar percentagens de progresso da tarefa + setting_start_of_week: Iniciar calendários a + permission_view_issues: Ver tarefas + label_display_used_statuses_only: Exibir apenas estados utilizados por este tipo de tarefa + label_revision_id: Revisão %{value} + label_api_access_key: Chave de acesso API + label_api_access_key_created_on: Chave de acesso API criada há %{value} + label_feeds_access_key: Chave de acesso Atom + notice_api_access_key_reseted: A sua chave de acesso API foi reinicializada. + setting_rest_api_enabled: Ativar serviço Web REST + label_missing_api_access_key: Chave de acesso API em falta + label_missing_feeds_access_key: Chave de acesso Atom em falta + button_show: Mostrar + text_line_separated: Vários valores permitidos (uma linha para cada valor). + setting_mail_handler_body_delimiters: Truncar mensagens de e-mail após uma destas linhas + permission_add_subprojects: Criar sub-projetos + label_subproject_new: Novo sub-projeto + text_own_membership_delete_confirmation: |- + Está prestes a eliminar parcial ou totalmente as suas permissões. É possível que não possa editar o projeto após esta acção. + Tem a certeza de que deseja continuar? + label_close_versions: Fechar versões completas + label_board_sticky: Fixar mensagem + label_board_locked: Proteger + permission_export_wiki_pages: Exportar páginas Wiki + setting_cache_formatted_text: Colocar formatação do texto na memória cache + permission_manage_project_activities: Gerir atividades do projeto + error_unable_delete_issue_status: Não foi possível apagar o estado da tarefa + label_profile: Perfil + permission_manage_subtasks: Gerir sub-tarefas + field_parent_issue: Tarefa principal + label_subtask_plural: Sub-tarefa + label_project_copy_notifications: Enviar notificações por e-mail durante a cópia do projeto + error_can_not_delete_custom_field: Não foi possível apagar o campo personalizado + error_unable_to_connect: Não foi possível ligar (%{value}) + error_can_not_remove_role: Esta função está atualmente em uso e não pode ser apagada. + error_can_not_delete_tracker: Existem ainda tarefas nesta categoria. Não é possível apagar este tipo de tarefa. + field_principal: Principal + notice_failed_to_save_members: "Erro ao guardar o(s) membro(s): %{errors}." + text_zoom_out: Reduzir + text_zoom_in: Ampliar + notice_unable_delete_time_entry: Não foi possível apagar a entrada de tempo registado. + label_overall_spent_time: Total de tempo registado + field_time_entries: Tempo registado + project_module_gantt: Gantt + project_module_calendar: Calendário + button_edit_associated_wikipage: "Editar página Wiki associada: %{page_title}" + field_text: Campo de texto + setting_default_notification_option: Opção predefinida de notificação + label_user_mail_option_only_my_events: Apenas para tarefas que observo ou em que estou envolvido + label_user_mail_option_none: Sem eventos + field_member_of_group: Grupo do titular + field_assigned_to_role: Função do titular + notice_not_authorized_archived_project: O projeto ao qual tentou aceder foi arquivado. + label_principal_search: "Procurar utilizador ou grupo:" + label_user_search: "Procurar utilizador:" + field_visible: Visível + setting_emails_header: Cabeçalho dos e-mails + setting_commit_logtime_activity_id: Atividade para tempo registado + text_time_logged_by_changeset: Aplicado no conjunto de commits %{value}. + setting_commit_logtime_enabled: Ativar registo de tempo + notice_gantt_chart_truncated: O gráfico foi truncado porque excede o número máximo de itens visíveis (%{max.}) + setting_gantt_items_limit: Número máximo de itens exibidos no gráfico Gantt + field_warn_on_leaving_unsaved: Avisar-me quando deixar uma página com texto por guardar + text_warn_on_leaving_unsaved: A página atual contém texto por salvar que será perdido caso saia desta página. + label_my_queries: As minhas consultas + text_journal_changed_no_detail: "%{label} atualizada" + label_news_comment_added: Comentário adicionado a uma notícia + button_expand_all: Expandir todos + button_collapse_all: Minimizar todos + label_additional_workflow_transitions_for_assignee: Transições adicionais permitidas quando a tarefa está atribuida ao utilizador + label_additional_workflow_transitions_for_author: Transições adicionais permitidas quando o utilizador é o autor da tarefa + label_bulk_edit_selected_time_entries: Edição em massa de registos de tempo + text_time_entries_destroy_confirmation: Têm a certeza que pretende apagar o(s) registo(s) de tempo selecionado(s)? + label_role_anonymous: Anónimo + label_role_non_member: Não membro + label_issue_note_added: Nota adicionada + label_issue_status_updated: Estado atualizado + label_issue_priority_updated: Prioridade adicionada + label_issues_visibility_own: Tarefas criadas ou atribuídas ao utilizador + field_issues_visibility: Visibilidade das tarefas + label_issues_visibility_all: Todas as tarefas + permission_set_own_issues_private: Configurar as suas tarefas como públicas ou privadas + field_is_private: Privado + permission_set_issues_private: Configurar tarefas como públicas ou privadas + label_issues_visibility_public: Todas as tarefas públicas + text_issues_destroy_descendants_confirmation: Irá apagar também %{count} sub-tarefa(s). + field_commit_logs_encoding: Codificação das mensagens de commit + field_scm_path_encoding: Codificação do caminho + text_scm_path_encoding_note: "Por omissão: UTF-8" + field_path_to_repository: Caminho para o repositório + field_root_directory: Raíz do diretório + field_cvs_module: Módulo + field_cvsroot: CVSROOT + text_mercurial_repository_note: "Repositório local (ex: /hgrepo, c:\\hgrepo)" + text_scm_command: Comando + text_scm_command_version: Versão + label_git_report_last_commit: Analisar último commit por ficheiros e pastas + text_scm_config: Pode configurar os comando SCM em config/configuration.yml. Por favor reinicie a aplicação depois de alterar o ficheiro. + text_scm_command_not_available: O comando SCM não está disponível. Por favor verifique as configurações no painel de administração. + notice_issue_successful_create: Tarefa %{id} criada. + label_between: entre + setting_issue_group_assignment: Permitir atribuir tarefas a grupos + label_diff: diferença + text_git_repository_note: O repositório é local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Direção da ordenação + description_project_scope: Âmbito da pesquisa + description_filter: Filtro + description_user_mail_notification: Configurações das notificações por e-mail + description_message_content: Conteúdo da mensagem + description_available_columns: Colunas disponíveis + description_issue_category_reassign: Escolha a categoria da tarefa + description_search: Campo de pesquisa + description_notes: Notas + description_choose_project: Projeto + description_query_sort_criteria_attribute: Ordenar atributos + description_wiki_subpages_reassign: Escolha nova página pai + description_selected_columns: Colunas selecionadas + label_parent_revision: Pai + label_child_revision: Filha + error_scm_annotate_big_text_file: Esta entrada não pode ser anotada pois excede o tamanho máximo para ficheiros de texto. + setting_default_issue_start_date_to_creation_date: Utilizar a data atual como data de início para novas tarefas + button_edit_section: Editar esta secção + setting_repositories_encodings: Codificação dos anexos e repositórios + description_all_columns: Todas as colunas + button_export: Exportar + label_export_options: "%{export_format} opções da exportação" + error_attachment_too_big: Este ficheiro não pode ser carregado pois excede o tamanho máximo permitido por ficheiro (%{max_size}) + notice_failed_to_save_time_entries: "Falha ao guardar %{count} registo(s) de tempo dos %{total} selecionados: %{ids}." + label_x_issues: + zero: 0 tarefas + one: 1 tarefa + other: "%{count} tarefas" + label_repository_new: Novo repositório + field_repository_is_default: Repositório principal + label_copy_attachments: Copiar anexos + label_item_position: "%{position}/%{count}" + label_completed_versions: Versões completas + text_project_identifier_info: Apenas letras minúsculas (a-z), números, traços e sublinhados são permitidos.
    Depois de guardar não é possível alterar. + field_multiple: Múltiplos valores + setting_commit_cross_project_ref: Permitir que tarefas dos restantes projetos sejam referenciadas e resolvidas + text_issue_conflict_resolution_add_notes: Adicionar as minhas notas e descartar as minhas restantes alterações + text_issue_conflict_resolution_overwrite: Aplicar as minhas alterações (notas antigas serão mantidas mas algumas alterações podem se perder) + notice_issue_update_conflict: Esta tarefa foi atualizada por outro utilizador enquanto estava a edita-la. + text_issue_conflict_resolution_cancel: Descartar todas as minhas alterações e atualizar %{link} + permission_manage_related_issues: Gerir tarefas relacionadas + field_auth_source_ldap_filter: Filtro LDAP + label_search_for_watchers: Pesquisar por observadores para adicionar + notice_account_deleted: A sua conta foi apagada permanentemente. + setting_unsubscribe: Permitir aos utilizadores apagarem a sua própria conta + button_delete_my_account: Apagar a minha conta + text_account_destroy_confirmation: |- + Têm a certeza que pretende avançar? + A sua conta vai ser permanentemente apagada, não será possível recupera-la. + error_session_expired: A sua sessão expirou. Por-favor autentique-se novamente. + text_session_expiration_settings: "Atenção: alterar estas configurações pode fazer expirar as sessões em curso, incluíndo a sua." + setting_session_lifetime: Duração máxima da sessão + setting_session_timeout: Tempo limite de inatividade da sessão + label_session_expiration: Expiração da sessão + permission_close_project: Fechar / re-abrir o projeto + label_show_closed_projects: Ver os projetos fechados + button_close: Fechar + button_reopen: Re-abrir + project_status_active: ativo + project_status_closed: fechado + project_status_archived: arquivado + text_project_closed: Este projeto está fechado e é apenas de leitura. + notice_user_successful_create: Utilizador %{id} criado. + field_core_fields: Campos padrão + field_timeout: Tempo limite (em segundos) + setting_thumbnails_enabled: Apresentar miniaturas dos anexos + setting_thumbnails_size: Tamanho das miniaturas (em pixeis) + label_status_transitions: Estado das transições + label_fields_permissions: Permissões do campo + label_readonly: Apenas de leitura + label_required: Obrigatório + text_repository_identifier_info: Apenas letras minúsculas (a-z), números, traços e sublinhados são permitidos.
    Depois de guardar não é possível alterar. + field_board_parent: Fórum pai + label_attribute_of_project: "%{name} do Projeto" + label_attribute_of_author: "%{name} do Autor" + label_attribute_of_assigned_to: "%{name} do utilizador titular" + label_attribute_of_fixed_version: "%{name} da Versão" + label_copy_subtasks: Copiar sub-tarefas + label_copied_to: Copiado para + label_copied_from: Copiado de + label_any_issues_in_project: tarefas do projeto + label_any_issues_not_in_project: tarefas sem projeto + field_private_notes: Notas privadas + permission_view_private_notes: Ver notas privadas + permission_set_notes_private: Configurar notas como privadas + label_no_issues_in_project: sem tarefas no projeto + label_any: todos + label_last_n_weeks: últimas %{count} semanas + setting_cross_project_subtasks: Permitir sub-tarefas entre projetos + label_cross_project_descendants: Com os sub-projetos + label_cross_project_tree: Com árvore do projeto + label_cross_project_hierarchy: Com hierarquia do projeto + label_cross_project_system: Com todos os projetos + button_hide: Esconder + setting_non_working_week_days: Dias não úteis + label_in_the_next_days: no futuro + label_in_the_past_days: no passado + label_attribute_of_user: Do utilizador %{name} + text_turning_multiple_off: Se desativar a escolha múltipla, + esta será apagada de modo a manter apenas um valor por item. + label_attribute_of_issue: Tarefa de %{name} + permission_add_documents: Adicionar documentos + permission_edit_documents: Editar documentos + permission_delete_documents: Apagar documentos + label_gantt_progress_line: Barra de progresso + setting_jsonp_enabled: Ativar suporte JSONP + field_inherit_members: Herdar membros + field_closed_on: Fechado + field_generate_password: Gerar palavra-chave + setting_default_projects_tracker_ids: Tipo de tarefa padrão para novos projetos + label_total_time: Total + notice_account_not_activated_yet: Ainda não ativou a sua conta. Se desejar + receber um novo e-mail de ativação, por favor clique nesta ligação. + notice_account_locked: A sua conta está bloqueada. + notice_account_register_done: A conta foi criada com sucesso! Um e-mail contendo as instruções para ativar a sua conta foi enviado para %{email}. + label_hidden: Escondido + label_visibility_private: apenas para mim + label_visibility_roles: apenas para estas funções + label_visibility_public: para qualquer utilizador + field_must_change_passwd: Deve alterar a palavra-chave no próximo início de sessão + notice_new_password_must_be_different: A nova palavra-chave deve ser diferente da atual + setting_mail_handler_excluded_filenames: Apagar anexos por nome + text_convert_available: Conversão ImageMagick disponível (opcional) + label_link: Link + label_only: apenas + label_drop_down_list: lista + label_checkboxes: caixa de seleção + label_link_values_to: Ligação de valores ao URL + setting_force_default_language_for_anonymous: Forçar língua por omissão para utilizadores anónimos + setting_force_default_language_for_loggedin: Forçar língua por omissão para utilizadores registados + label_custom_field_select_type: Selecione o tipo de objeto ao qual o campo personalizado será atribuído + label_issue_assigned_to_updated: Utilizador titular atualizado + label_check_for_updates: Verificar atualizações + label_latest_compatible_version: Última versão compatível + label_unknown_plugin: Extensão desconhecida + label_radio_buttons: radio buttons + label_group_anonymous: Utilizadores anónimos + label_group_non_member: Utilizadores não membros + label_add_projects: Adicionar projetos + field_default_status: Estado por omissão + text_subversion_repository_note: 'Exemplos: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Visibilidade dos utilizadores + label_users_visibility_all: Todos os utilizadores ativos + label_users_visibility_members_of_visible_projects: Utilizadores membros dos projetos visíveis + label_edit_attachments: Editar os ficheiros anexados + setting_link_copied_issue: Relacionar tarefas ao copiar + label_link_copied_issue: Relacionar tarefas copiadas + label_ask: Perguntar + label_search_attachments_yes: Pesquisar nome e descrição dos anexos + label_search_attachments_no: Não pesquisar anexos + label_search_attachments_only: Pesquisar apenas anexos + label_search_open_issues_only: Apenas tarefas abertas + field_address: e-mail + setting_max_additional_emails: Número máximo de endereços de e-mail adicionais + label_email_address_plural: e-mails + label_email_address_add: Adicionar endereços de e-mail + label_enable_notifications: Ativar notificações + label_disable_notifications: Desativar notificações + setting_search_results_per_page: Resultados de pesquisa por página + label_blank_value: vazio + permission_copy_issues: Copiar tarefas + error_password_expired: A sua palavra-chave expirou ou o administrador exige que a altere. + field_time_entries_visibility: Visibilidade dos registo de tempo + setting_password_max_age: Exigir palavra-chave após a alteração + label_parent_task_attributes: Atributos da tarefa-pai + label_parent_task_attributes_derived: Calculado a partir das sub-tarefas + label_parent_task_attributes_independent: Independente das sub-tarefas + label_time_entries_visibility_all: Todos os registos de tempo + label_time_entries_visibility_own: Registos de tempo criados pelo utilizador + label_member_management: Gestão de utilizadores + label_member_management_all_roles: Todas as funções + label_member_management_selected_roles_only: Apenas estas funções + label_password_required: Confirme a sua palavra-chave para continuar + label_total_spent_time: Total de tempo registado + notice_import_finished: "%{count} registos foram importados" + notice_import_finished_with_errors: "%{count} de %{total} registos não poderam ser importados" + error_invalid_file_encoding: 'O ficheiro não possui a codificação correcta: {encoding}' + error_invalid_csv_file_or_settings: O ficheiro não é um ficheiro CSV ou não respeita as definições abaixo + error_can_not_read_import_file: Ocorreu um erro ao ler o ficheiro a importar + permission_import_issues: Importar tarefas + label_import_issues: Importar tarefas + label_select_file_to_import: Selecione o ficheiro a importar + label_fields_separator: Separador de campos + label_fields_wrapper: Field wrapper + label_encoding: Codificação + label_comma_char: Vírgula + label_semi_colon_char: Ponto e vírgula + label_quote_char: Aspas + label_double_quote_char: Aspas duplas + label_fields_mapping: Mapeamento de campos + label_file_content_preview: Pré-visualização do conteúdo do ficheiro + label_create_missing_values: Criar os valores em falta + button_import: Importar + field_total_estimated_hours: Total de tempo estimado + label_api: API + label_total_plural: Totais + label_assigned_issues: Tarefas atribuídas + label_field_format_enumeration: Lista chave/valor + label_f_hour_short: '%{value} h' + field_default_version: Versão por defeito + error_attachment_extension_not_allowed: A extensão %{extension} do ficheiro anexado não é permitida + setting_attachment_extensions_allowed: Extensões permitidas + setting_attachment_extensions_denied: Extensões não permitidas + label_any_open_issues: Quaisquer tarefas abertas + label_no_open_issues: Sem tarefas abertas + label_default_values_for_new_users: Valores por defeito para novo utilizadores + setting_sys_api_key: Chave da API + setting_lost_password: Perdi a palavra-chave + mail_subject_security_notification: Notificação de segurança + mail_body_security_notification_change: ! '%{field} foi modificado.' + mail_body_security_notification_change_to: ! '%{field} foi modificado para %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} foi adicionado.' + mail_body_security_notification_remove: ! '%{field} %{value} foi removido.' + mail_body_security_notification_notify_enabled: O email %{value} agora recebe notificações. + mail_body_security_notification_notify_disabled: O email %{value} já não recebe notificações. + mail_body_settings_updated: ! 'As seguintes configurações foram modificadas:' + field_remote_ip: Endereço IP + label_wiki_page_new: Nova página wiki + label_relations: Relações + button_filter: Filtro + mail_body_password_updated: A sua palavra-chave foi atualizada. + label_no_preview: Sem pré-visualização disponível + error_no_tracker_allowed_for_new_issue_in_project: O projeto não possui nenhum tipo de tarefa para o qual você pode criar uma tarefa + label_tracker_all: Todos os tipos de tarefa + label_new_project_issue_tab_enabled: Apresentar a aba "Nova tarefa" + setting_new_item_menu_tab: Aba de Projeto para criar novos objetos + label_new_object_tab_enabled: Apresentar a aba "+" + error_no_projects_with_tracker_allowed_for_new_issue: Não há projetos com tipos de tarefa para os quais você pode criar uma tarefa + field_textarea_font: Fonte para áreas de texto + label_font_default: Default font + label_font_monospace: Fonte Monospaced + label_font_proportional: Fonte proporcional + setting_timespan_format: Formato de Data/Hora + label_table_of_contents: Índice + setting_commit_logs_formatting: Aplicar formatação de texto às mensagens de commit + setting_mail_handler_enable_regex_delimiters: Ativar a utilização de expressões regulares + error_move_of_child_not_possible: 'A sub-tarefa %{child} não pode ser movida para o novo + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: O tempo gasto não pode ser alterado numa tarefa que será apagada + setting_timelog_required_fields: Campos obrigatórios para o registo de tempo + label_attribute_of_object: '%{object_name} %{name}' + label_user_mail_option_only_assigned: Apenas para tarefas que observo ou que me estão atribuídas + label_user_mail_option_only_owner: Apenas para tarefas que observo ou que eu criei + warning_fields_cleared_on_bulk_edit: As alterações vão apagar valores de um ou mais campos nos objetos selecionados + field_updated_by: Atualizado por + field_last_updated_by: Última atualização por + field_full_width_layout: Layout utiliza toda a largura + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/ro.yml b/config/locales/ro.yml new file mode 100644 index 0000000..f364e46 --- /dev/null +++ b/config/locales/ro.yml @@ -0,0 +1,1225 @@ +ro: + direction: ltr + date: + formats: + default: "%d-%m-%Y" + short: "%d %b" + long: "%d %B %Y" + only_day: "%e" + + day_names: [Duminică, Luni, Marti, Miercuri, Joi, Vineri, Sâmbătă] + abbr_day_names: [Dum, Lun, Mar, Mie, Joi, Vin, Sâm] + + month_names: [~, Ianuarie, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie] + abbr_month_names: [~, Ian, Feb, Mar, Apr, Mai, Iun, Iul, Aug, Sep, Oct, Noi, Dec] + order: + - :day + - :month + - :year + + time: + formats: + default: "%m/%d/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "jumătate de minut" + less_than_x_seconds: + one: "mai puțin de o secundă" + other: "mai puțin de %{count} secunde" + x_seconds: + one: "o secundă" + other: "%{count} secunde" + less_than_x_minutes: + one: "mai puțin de un minut" + other: "mai puțin de %{count} minute" + x_minutes: + one: "un minut" + other: "%{count} minute" + about_x_hours: + one: "aproximativ o oră" + other: "aproximativ %{count} ore" + x_hours: + one: "1 oră" + other: "%{count} ore" + x_days: + one: "o zi" + other: "%{count} zile" + about_x_months: + one: "aproximativ o lună" + other: "aproximativ %{count} luni" + x_months: + one: "o luna" + other: "%{count} luni" + about_x_years: + one: "aproximativ un an" + other: "aproximativ %{count} ani" + over_x_years: + one: "peste un an" + other: "peste %{count} ani" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + precision: 3 + delimiter: "" + storage_units: + format: "%n %u" + units: + kb: KB + tb: TB + gb: GB + byte: + one: Byte + other: Bytes + mb: MB + +# Used in array.to_sentence. + support: + array: + sentence_connector: "și" + skip_last_comma: true + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nu este inclus în listă" + exclusion: "este rezervat" + invalid: "nu este valid" + confirmation: "nu este identică" + accepted: "trebuie acceptat" + empty: "trebuie completat" + blank: "nu poate fi gol" + too_long: "este prea lung" + too_short: "este prea scurt" + wrong_length: "nu are lungimea corectă" + taken: "a fost luat deja" + not_a_number: "nu este un număr" + not_a_date: "nu este o dată validă" + greater_than: "trebuie să fie mai mare de %{count}" + greater_than_or_equal_to: "trebuie să fie mai mare sau egal cu %{count}" + equal_to: "trebuie să fie egal cu {count}}" + less_than: "trebuie să fie mai mic decat %{count}" + less_than_or_equal_to: "trebuie să fie mai mic sau egal cu %{count}" + odd: "trebuie să fie impar" + even: "trebuie să fie par" + greater_than_start_date: "trebuie să fie după data de început" + not_same_project: "trebuie să aparțină aceluiași proiect" + circular_dependency: "Această relație ar crea o dependență circulară" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Selectați + + general_text_No: 'Nu' + general_text_Yes: 'Da' + general_text_no: 'nu' + general_text_yes: 'da' + general_lang_name: 'Romanian (Română)' + general_csv_separator: '.' + general_csv_decimal_separator: ',' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '2' + + notice_account_updated: Cont actualizat. + notice_account_invalid_credentials: Utilizator sau parola nevalidă + notice_account_password_updated: Parolă actualizată. + notice_account_wrong_password: Parolă greșită + notice_account_register_done: Contul a fost creat. Pentru activare, urmați legătura trimisă prin email. + notice_account_unknown_email: Utilizator necunoscut. + notice_can_t_change_password: Acest cont folosește o sursă externă de autentificare. Nu se poate schimba parola. + notice_account_lost_email_sent: S-a trimis un email cu instrucțiuni de schimbare a parolei. + notice_account_activated: Contul a fost activat. Vă puteți autentifica acum. + notice_successful_create: Creat. + notice_successful_update: Actualizat. + notice_successful_delete: Șters. + notice_successful_connection: Conectat. + notice_file_not_found: Pagina pe care doriți să o accesați nu există sau a fost ștearsă. + notice_locking_conflict: Datele au fost actualizate de alt utilizator. + notice_not_authorized: Nu sunteți autorizat sa accesați această pagină. + notice_email_sent: "S-a trimis un email către %{value}" + notice_email_error: "A intervenit o eroare la trimiterea de email (%{value})" + notice_feeds_access_key_reseted: Cheia de acces Atom a fost resetată. + notice_failed_to_save_issues: "Nu s-au putut salva %{count} tichete din cele %{total} selectate: %{ids}." + notice_no_issue_selected: "Niciun tichet selectat! Vă rugăm să selectați tichetele pe care doriți să le editați." + notice_account_pending: "Contul dumneavoastră a fost creat și așteaptă aprobarea administratorului." + notice_default_data_loaded: S-a încărcat configurația implicită. + notice_unable_delete_version: Nu se poate șterge versiunea. + + error_can_t_load_default_data: "Nu s-a putut încărca configurația implicită: %{value}" + error_scm_not_found: "Nu s-a găsit articolul sau revizia în depozit." + error_scm_command_failed: "A intervenit o eroare la accesarea depozitului: %{value}" + error_scm_annotate: "Nu există sau nu poate fi adnotată." + error_issue_not_found_in_project: 'Tichetul nu a fost găsit sau nu aparține acestui proiect' + + warning_attachments_not_saved: "Nu s-au putut salva %{count} fișiere." + + mail_subject_lost_password: "Parola dumneavoastră: %{value}" + mail_body_lost_password: 'Pentru a schimba parola, accesați:' + mail_subject_register: "Activarea contului %{value}" + mail_body_register: 'Pentru activarea contului, accesați:' + mail_body_account_information_external: "Puteți folosi contul „{value}}” pentru a vă autentifica." + mail_body_account_information: Informații despre contul dumneavoastră + mail_subject_account_activation_request: "Cerere de activare a contului %{value}" + mail_body_account_activation_request: "S-a înregistrat un utilizator nou (%{value}). Contul așteaptă aprobarea dumneavoastră:" + mail_subject_reminder: "%{count} tichete trebuie rezolvate în următoarele %{days} zile" + mail_body_reminder: "%{count} tichete atribuite dumneavoastră trebuie rezolvate în următoarele %{days} zile:" + + + field_name: Nume + field_description: Descriere + field_summary: Rezumat + field_is_required: Obligatoriu + field_firstname: Prenume + field_lastname: Nume + field_mail: Email + field_filename: Fișier + field_filesize: Mărime + field_downloads: Descărcări + field_author: Autor + field_created_on: Creat la + field_updated_on: Actualizat la + field_field_format: Format + field_is_for_all: Pentru toate proiectele + field_possible_values: Valori posibile + field_regexp: Expresie regulară + field_min_length: lungime minimă + field_max_length: lungime maximă + field_value: Valoare + field_category: Categorie + field_title: Titlu + field_project: Proiect + field_issue: Tichet + field_status: Stare + field_notes: Note + field_is_closed: Rezolvat + field_is_default: Implicit + field_tracker: Tip de tichet + field_subject: Subiect + field_due_date: Data finalizării + field_assigned_to: Atribuit + field_priority: Prioritate + field_fixed_version: Versiune țintă + field_user: Utilizator + field_role: Rol + field_homepage: Pagina principală + field_is_public: Public + field_parent: Sub-proiect al + field_is_in_roadmap: Tichete afișate în plan + field_login: Autentificare + field_mail_notification: Notificări prin e-mail + field_admin: Administrator + field_last_login_on: Ultima autentificare în + field_language: Limba + field_effective_date: Data + field_password: Parola + field_new_password: Parola nouă + field_password_confirmation: Confirmare + field_version: Versiune + field_type: Tip + field_host: Gazdă + field_port: Port + field_account: Cont + field_base_dn: Base DN + field_attr_login: Atribut autentificare + field_attr_firstname: Atribut prenume + field_attr_lastname: Atribut nume + field_attr_mail: Atribut email + field_onthefly: Creare utilizator pe loc + field_start_date: Data începerii + field_done_ratio: Realizat (%) + field_auth_source: Mod autentificare + field_hide_mail: Nu se afișează adresa de email + field_comments: Comentariu + field_url: URL + field_start_page: Pagina de start + field_subproject: Subproiect + field_hours: Ore + field_activity: Activitate + field_spent_on: Data + field_identifier: Identificator + field_is_filter: Filtru + field_issue_to: Tichet asociat + field_delay: Întârziere + field_assignable: Se pot atribui tichete acestui rol + field_redirect_existing_links: Redirecționează legăturile existente + field_estimated_hours: Timp estimat + field_column_names: Coloane + field_time_zone: Fus orar + field_searchable: Căutare + field_default_value: Valoare implicita + field_comments_sorting: Afișează comentarii + field_parent_title: Pagina superioara + field_editable: Modificabil + field_watcher: Urmărește + field_identity_url: URL OpenID + field_content: Conținut + + setting_app_title: Titlu aplicație + setting_app_subtitle: Subtitlu aplicație + setting_welcome_text: Text de întâmpinare + setting_default_language: Limba implicita + setting_login_required: Necesita autentificare + setting_self_registration: Înregistrare automată + setting_attachment_max_size: Mărime maxima atașament + setting_issues_export_limit: Limită de tichete exportate + setting_mail_from: Adresa de email a expeditorului + setting_bcc_recipients: Alți destinatari pentru email (BCC) + setting_plain_text_mail: Mesaje text (fără HTML) + setting_host_name: Numele gazdei și calea + setting_text_formatting: Formatare text + setting_wiki_compression: Comprimare istoric Wiki + setting_feeds_limit: Limita de actualizări din feed + setting_default_projects_public: Proiectele noi sunt implicit publice + setting_autofetch_changesets: Preluare automată a modificărilor din depozit + setting_sys_api_enabled: Activare WS pentru gestionat depozitul + setting_commit_ref_keywords: Cuvinte cheie pt. referire tichet + setting_commit_fix_keywords: Cuvinte cheie pt. rezolvare tichet + setting_autologin: Autentificare automată + setting_date_format: Format dată + setting_time_format: Format oră + setting_cross_project_issue_relations: Permite legături de tichete între proiecte + setting_issue_list_default_columns: Coloane implicite afișate în lista de tichete + setting_emails_footer: Subsol email + setting_protocol: Protocol + setting_per_page_options: Număr de obiecte pe pagină + setting_user_format: Stil de afișare pentru utilizator + setting_activity_days_default: Se afișează zile în jurnalul proiectului + setting_display_subprojects_issues: Afișează implicit tichetele sub-proiectelor în proiectele principale + setting_enabled_scm: SCM activat + setting_mail_handler_api_enabled: Activare WS pentru email primit + setting_mail_handler_api_key: cheie API + setting_sequential_project_identifiers: Generează secvențial identificatoarele de proiect + setting_gravatar_enabled: Folosește poze Gravatar pentru utilizatori + setting_diff_max_lines_displayed: Număr maxim de linii de diferență afișate + setting_file_max_size_displayed: Număr maxim de fișiere text afișate în pagină (inline) + setting_repository_log_display_limit: Număr maxim de revizii afișate în istoricul fișierului + setting_openid: Permite înregistrare și autentificare cu OpenID + + permission_edit_project: Editează proiectul + permission_select_project_modules: Alege module pentru proiect + permission_manage_members: Editează membri + permission_manage_versions: Editează versiuni + permission_manage_categories: Editează categorii + permission_add_issues: Adaugă tichete + permission_edit_issues: Editează tichete + permission_manage_issue_relations: Editează relații tichete + permission_add_issue_notes: Adaugă note + permission_edit_issue_notes: Editează note + permission_edit_own_issue_notes: Editează notele proprii + permission_move_issues: Mută tichete + permission_delete_issues: Șterge tichete + permission_manage_public_queries: Editează căutările implicite + permission_save_queries: Salvează căutările + permission_view_gantt: Afișează Gantt + permission_view_calendar: Afișează calendarul + permission_view_issue_watchers: Afișează lista de persoane interesate + permission_add_issue_watchers: Adaugă persoane interesate + permission_log_time: Înregistrează timpul de lucru + permission_view_time_entries: Afișează timpul de lucru + permission_edit_time_entries: Editează jurnalele cu timp de lucru + permission_edit_own_time_entries: Editează jurnalele proprii cu timpul de lucru + permission_manage_news: Editează știri + permission_comment_news: Comentează știrile + permission_view_documents: Afișează documente + permission_manage_files: Editează fișiere + permission_view_files: Afișează fișiere + permission_manage_wiki: Editează wiki + permission_rename_wiki_pages: Redenumește pagini wiki + permission_delete_wiki_pages: Șterge pagini wiki + permission_view_wiki_pages: Afișează wiki + permission_view_wiki_edits: Afișează istoricul wiki + permission_edit_wiki_pages: Editează pagini wiki + permission_delete_wiki_pages_attachments: Șterge atașamente + permission_protect_wiki_pages: Blochează pagini wiki + permission_manage_repository: Gestionează depozitul + permission_browse_repository: Răsfoiește depozitul + permission_view_changesets: Afișează modificările din depozit + permission_commit_access: Acces commit + permission_manage_boards: Editează forum + permission_view_messages: Afișează mesaje + permission_add_messages: Scrie mesaje + permission_edit_messages: Editează mesaje + permission_edit_own_messages: Editează mesajele proprii + permission_delete_messages: Șterge mesaje + permission_delete_own_messages: Șterge mesajele proprii + + project_module_issue_tracking: Tichete + project_module_time_tracking: Timp de lucru + project_module_news: Știri + project_module_documents: Documente + project_module_files: Fișiere + project_module_wiki: Wiki + project_module_repository: Depozit + project_module_boards: Forum + + label_user: Utilizator + label_user_plural: Utilizatori + label_user_new: Utilizator nou + label_project: Proiect + label_project_new: Proiect nou + label_project_plural: Proiecte + label_x_projects: + zero: niciun proiect + one: un proiect + other: "%{count} proiecte" + label_project_all: Toate proiectele + label_project_latest: Proiecte noi + label_issue: Tichet + label_issue_new: Tichet nou + label_issue_plural: Tichete + label_issue_view_all: Afișează toate tichetele + label_issues_by: "Sortează după %{value}" + label_issue_added: Adaugat + label_issue_updated: Actualizat + label_document: Document + label_document_new: Document nou + label_document_plural: Documente + label_document_added: Adăugat + label_role: Rol + label_role_plural: Roluri + label_role_new: Rol nou + label_role_and_permissions: Roluri și permisiuni + label_member: Membru + label_member_new: membru nou + label_member_plural: Membri + label_tracker: Tip de tichet + label_tracker_plural: Tipuri de tichete + label_tracker_new: Tip nou de tichet + label_workflow: Mod de lucru + label_issue_status: Stare tichet + label_issue_status_plural: Stare tichete + label_issue_status_new: Stare nouă + label_issue_category: Categorie de tichet + label_issue_category_plural: Categorii de tichete + label_issue_category_new: Categorie nouă + label_custom_field: Câmp personalizat + label_custom_field_plural: Câmpuri personalizate + label_custom_field_new: Câmp nou personalizat + label_enumerations: Enumerări + label_enumeration_new: Valoare nouă + label_information: Informație + label_information_plural: Informații + label_please_login: Vă rugăm să vă autentificați + label_register: Înregistrare + label_login_with_open_id_option: sau autentificare cu OpenID + label_password_lost: Parolă uitată + label_home: Acasă + label_my_page: Pagina mea + label_my_account: Contul meu + label_my_projects: Proiectele mele + label_administration: Administrare + label_login: Autentificare + label_logout: Ieșire din cont + label_help: Ajutor + label_reported_issues: Tichete + label_assigned_to_me_issues: Tichetele mele + label_last_login: Ultima conectare + label_registered_on: Înregistrat la + label_activity: Activitate + label_overall_activity: Activitate - vedere de ansamblu + label_user_activity: "Activitate %{value}" + label_new: Nou + label_logged_as: Autentificat ca + label_environment: Mediu + label_authentication: Autentificare + label_auth_source: Mod de autentificare + label_auth_source_new: Nou + label_auth_source_plural: Moduri de autentificare + label_subproject_plural: Sub-proiecte + label_and_its_subprojects: "%{value} și sub-proiecte" + label_min_max_length: lungime min - max + label_list: Listă + label_date: Dată + label_integer: Întreg + label_float: Zecimal + label_boolean: Valoare logică + label_string: Text + label_text: Text lung + label_attribute: Atribut + label_attribute_plural: Atribute + label_no_data: Nu există date de afișat + label_change_status: Schimbă starea + label_history: Istoric + label_attachment: Fișier + label_attachment_new: Fișier nou + label_attachment_delete: Șterge fișier + label_attachment_plural: Fișiere + label_file_added: Adăugat + label_report: Raport + label_report_plural: Rapoarte + label_news: Știri + label_news_new: Adaugă știre + label_news_plural: Știri + label_news_latest: Ultimele știri + label_news_view_all: Afișează toate știrile + label_news_added: Adăugat + label_settings: Setări + label_overview: Pagină proiect + label_version: Versiune + label_version_new: Versiune nouă + label_version_plural: Versiuni + label_confirmation: Confirmare + label_export_to: 'Disponibil și în:' + label_read: Citește... + label_public_projects: Proiecte publice + label_open_issues: deschis + label_open_issues_plural: deschise + label_closed_issues: închis + label_closed_issues_plural: închise + label_x_open_issues_abbr: + zero: 0 deschise + one: 1 deschis + other: "%{count} deschise" + label_x_closed_issues_abbr: + zero: 0 închise + one: 1 închis + other: "%{count} închise" + label_total: Total + label_permissions: Permisiuni + label_current_status: Stare curentă + label_new_statuses_allowed: Stări noi permise + label_all: toate + label_none: niciunul + label_nobody: nimeni + label_next: Înainte + label_previous: Înapoi + label_used_by: Folosit de + label_details: Detalii + label_add_note: Adaugă o notă + label_calendar: Calendar + label_months_from: luni de la + label_gantt: Gantt + label_internal: Intern + label_last_changes: "ultimele %{count} schimbări" + label_change_view_all: Afișează toate schimbările + label_comment: Comentariu + label_comment_plural: Comentarii + label_x_comments: + zero: fara comentarii + one: 1 comentariu + other: "%{count} comentarii" + label_comment_add: Adaugă un comentariu + label_comment_added: Adăugat + label_comment_delete: Șterge comentariul + label_query: Cautare personalizata + label_query_plural: Căutări personalizate + label_query_new: Căutare nouă + label_filter_add: Adaugă filtru + label_filter_plural: Filtre + label_equals: este + label_not_equals: nu este + label_in_less_than: în mai puțin de + label_in_more_than: în mai mult de + label_in: în + label_today: astăzi + label_all_time: oricând + label_yesterday: ieri + label_this_week: săptămâna aceasta + label_last_week: săptămâna trecută + label_last_n_days: "ultimele %{count} zile" + label_this_month: luna aceasta + label_last_month: luna trecută + label_this_year: anul acesta + label_date_range: Perioada + label_less_than_ago: mai puțin de ... zile + label_more_than_ago: mai mult de ... zile + label_ago: în urma + label_contains: conține + label_not_contains: nu conține + label_day_plural: zile + label_repository: Depozit + label_repository_plural: Depozite + label_browse: Afișează + label_revision: Revizie + label_revision_plural: Revizii + label_associated_revisions: Revizii asociate + label_added: adaugată + label_modified: modificată + label_copied: copiată + label_renamed: redenumită + label_deleted: ștearsă + label_latest_revision: Ultima revizie + label_latest_revision_plural: Ultimele revizii + label_view_revisions: Afișează revizii + label_max_size: Mărime maximă + label_sort_highest: Prima + label_sort_higher: În sus + label_sort_lower: În jos + label_sort_lowest: Ultima + label_roadmap: Planificare + label_roadmap_due_in: "De terminat în %{value}" + label_roadmap_overdue: "Întârziat cu %{value}" + label_roadmap_no_issues: Nu există tichete pentru această versiune + label_search: Caută + label_result_plural: Rezultate + label_all_words: toate cuvintele + label_wiki: Wiki + label_wiki_edit: Editare Wiki + label_wiki_edit_plural: Editări Wiki + label_wiki_page: Pagină Wiki + label_wiki_page_plural: Pagini Wiki + label_index_by_title: Sortează după titlu + label_index_by_date: Sortează după dată + label_current_version: Versiunea curentă + label_preview: Previzualizare + label_feed_plural: Feed-uri + label_changes_details: Detaliile tuturor schimbărilor + label_issue_tracking: Urmărire tichete + label_spent_time: Timp alocat + label_f_hour: "%{value} oră" + label_f_hour_plural: "%{value} ore" + label_time_tracking: Urmărire timp de lucru + label_change_plural: Schimbări + label_statistics: Statistici + label_commits_per_month: Commit pe luna + label_commits_per_author: Commit per autor + label_view_diff: Afișează diferențele + label_diff_inline: în linie + label_diff_side_by_side: una lângă alta + label_options: Opțiuni + label_copy_workflow_from: Copiază modul de lucru de la + label_permissions_report: Permisiuni + label_watched_issues: Tichete urmărite + label_related_issues: Tichete asociate + label_applied_status: Stare aplicată + label_loading: Încarcă... + label_relation_new: Asociere nouă + label_relation_delete: Șterge asocierea + label_relates_to: asociat cu + label_duplicates: duplicate + label_duplicated_by: la fel ca + label_blocks: blocări + label_blocked_by: blocat de + label_precedes: precede + label_follows: urmează + label_stay_logged_in: Păstrează autentificarea + label_disabled: dezactivat + label_show_completed_versions: Arată versiunile terminate + label_me: eu + label_board: Forum + label_board_new: Forum nou + label_board_plural: Forumuri + label_topic_plural: Subiecte + label_message_plural: Mesaje + label_message_last: Ultimul mesaj + label_message_new: Mesaj nou + label_message_posted: Adăugat + label_reply_plural: Răspunsuri + label_send_information: Trimite utilizatorului informațiile despre cont + label_year: An + label_month: Lună + label_week: Săptămână + label_date_from: De la + label_date_to: La + label_language_based: Un funcție de limba de afișare a utilizatorului + label_sort_by: "Sortează după %{value}" + label_send_test_email: Trimite email de test + label_feeds_access_key_created_on: "Cheie de acces creată acum %{value}" + label_module_plural: Module + label_added_time_by: "Adăugat de %{author} acum %{age}" + label_updated_time_by: "Actualizat de %{author} acum %{age}" + label_updated_time: "Actualizat acum %{value}" + label_jump_to_a_project: Alege proiectul... + label_file_plural: Fișiere + label_changeset_plural: Schimbări + label_default_columns: Coloane implicite + label_no_change_option: (fără schimbări) + label_bulk_edit_selected_issues: Editează toate tichetele selectate + label_theme: Tema + label_default: Implicită + label_search_titles_only: Caută numai în titluri + label_user_mail_option_all: "Pentru orice eveniment, în toate proiectele mele" + label_user_mail_option_selected: " Pentru orice eveniment, în proiectele selectate..." + label_user_mail_no_self_notified: "Nu trimite notificări pentru modificările mele" + label_registration_activation_by_email: activare cont prin email + label_registration_manual_activation: activare manuală a contului + label_registration_automatic_activation: activare automată a contului + label_display_per_page: "pe pagină: %{value}" + label_age: vechime + label_change_properties: Schimbă proprietățile + label_general: General + label_scm: SCM + label_plugins: Plugin-uri + label_ldap_authentication: autentificare LDAP + label_downloads_abbr: D/L + label_optional_description: Descriere (opțională) + label_add_another_file: Adaugă alt fișier + label_preferences: Preferințe + label_chronological_order: în ordine cronologică + label_reverse_chronological_order: În ordine invers cronologică + label_incoming_emails: Mesaje primite + label_generate_key: Generează o cheie + label_issue_watchers: Cine urmărește + label_example: Exemplu + label_display: Afișează + + label_sort: Sortează + label_ascending: Crescător + label_descending: Descrescător + label_date_from_to: De la %{start} la %{end} + + button_login: Autentificare + button_submit: Trimite + button_save: Salvează + button_check_all: Bifează tot + button_uncheck_all: Debifează tot + button_delete: Șterge + button_create: Creează + button_create_and_continue: Creează și continua + button_test: Testează + button_edit: Editează + button_add: Adaugă + button_change: Modifică + button_apply: Aplică + button_clear: Șterge + button_lock: Blochează + button_unlock: Deblochează + button_download: Descarcă + button_list: Listează + button_view: Afișează + button_move: Mută + button_back: Înapoi + button_cancel: Anulează + button_activate: Activează + button_sort: Sortează + button_log_time: Înregistrează timpul de lucru + button_rollback: Revenire la această versiune + button_watch: Urmăresc + button_unwatch: Nu urmăresc + button_reply: Răspunde + button_archive: Arhivează + button_unarchive: Dezarhivează + button_reset: Resetează + button_rename: Redenumește + button_change_password: Schimbare parolă + button_copy: Copiază + button_annotate: Adnotează + button_update: Actualizează + button_configure: Configurează + button_quote: Citează + + status_active: activ + status_registered: înregistrat + status_locked: blocat + + text_select_mail_notifications: Selectați acțiunile notificate prin email. + text_regexp_info: ex. ^[A-Z0-9]+$ + text_min_max_length_info: 0 înseamnă fără restricții + text_project_destroy_confirmation: Sigur doriți să ștergeți proiectul și toate datele asociate? + text_subprojects_destroy_warning: "Se vor șterge și sub-proiectele: %{value}." + text_workflow_edit: Selectați un rol și un tip de tichet pentru a edita modul de lucru + text_are_you_sure: Sunteți sigur(ă)? + text_tip_issue_begin_day: sarcină care începe în această zi + text_tip_issue_end_day: sarcină care se termină în această zi + text_tip_issue_begin_end_day: sarcină care începe și se termină în această zi + text_caracters_maximum: "maxim %{count} caractere." + text_caracters_minimum: "Trebuie să fie minim %{count} caractere." + text_length_between: "Lungime între %{min} și %{max} caractere." + text_tracker_no_workflow: Nu sunt moduri de lucru pentru acest tip de tichet + text_unallowed_characters: Caractere nepermise + text_comma_separated: Sunt permise mai multe valori (separate cu virgulă). + text_issues_ref_in_commit_messages: Referire la tichete și rezolvare în textul mesajului + text_issue_added: "Tichetul %{id} a fost adăugat de %{author}." + text_issue_updated: "Tichetul %{id} a fost actualizat de %{author}." + text_wiki_destroy_confirmation: Sigur doriți ștergerea Wiki și a conținutului asociat? + text_issue_category_destroy_question: "Această categorie conține (%{count}) tichete. Ce doriți să faceți?" + text_issue_category_destroy_assignments: Șterge apartenența la categorie. + text_issue_category_reassign_to: Atribuie tichetele la această categorie + text_user_mail_option: "Pentru proiectele care nu sunt selectate, veți primi notificări doar pentru ceea ce urmăriți sau în ce sunteți implicat (ex: tichete create de dumneavoastră sau care vă sunt atribuite)." + text_no_configuration_data: "Nu s-au configurat încă rolurile, stările tichetelor și modurile de lucru.\nEste recomandat să încărcați configurația implicită. O veți putea modifica ulterior." + text_load_default_configuration: Încarcă configurația implicită + text_status_changed_by_changeset: "Aplicat în setul %{value}." + text_issues_destroy_confirmation: 'Sigur doriți să ștergeți tichetele selectate?' + text_select_project_modules: 'Selectați modulele active pentru acest proiect:' + text_default_administrator_account_changed: S-a schimbat contul administratorului implicit + text_file_repository_writable: Se poate scrie în directorul de atașamente + text_plugin_assets_writable: Se poate scrie în directorul de plugin-uri + text_rmagick_available: Este disponibil RMagick (opțional) + text_destroy_time_entries_question: "%{hours} ore sunt înregistrate la tichetele pe care doriți să le ștergeți. Ce doriți sa faceți?" + text_destroy_time_entries: Șterge orele înregistrate + text_assign_time_entries_to_project: Atribuie orele la proiect + text_reassign_time_entries: 'Atribuie orele înregistrate la tichetul:' + text_user_wrote: "%{value} a scris:" + text_enumeration_destroy_question: "Această valoare are %{count} obiecte." + text_enumeration_category_reassign_to: 'Atribuie la această valoare:' + text_email_delivery_not_configured: "Trimiterea de emailuri nu este configurată și ca urmare, notificările sunt dezactivate.\nConfigurați serverul SMTP în config/configuration.yml și reporniți aplicația pentru a le activa." + text_repository_usernames_mapping: "Selectați sau modificați contul Redmine echivalent contului din istoricul depozitului.\nUtilizatorii cu un cont (sau e-mail) identic în Redmine și depozit sunt echivalate automat." + text_diff_truncated: '... Comparația a fost trunchiată pentru ca depășește lungimea maximă de text care poate fi afișat.' + text_custom_field_possible_values_info: 'O linie pentru fiecare valoare' + + default_role_manager: Manager + default_role_developer: Dezvoltator + default_role_reporter: Creator de rapoarte + default_tracker_bug: Defect + default_tracker_feature: Funcție + default_tracker_support: Suport + default_issue_status_new: Nou + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Rezolvat + default_issue_status_feedback: Așteaptă reacții + default_issue_status_closed: Închis + default_issue_status_rejected: Respins + default_doc_category_user: Documentație + default_doc_category_tech: Documentație tehnică + default_priority_low: mică + default_priority_normal: normală + default_priority_high: mare + default_priority_urgent: urgentă + default_priority_immediate: imediată + default_activity_design: Design + default_activity_development: Dezvoltare + + enumeration_issue_priorities: Priorități tichete + enumeration_doc_categories: Categorii documente + enumeration_activities: Activități (timp de lucru) + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Această pagină are %{descendants} pagini anterioare și descendenți. Ce doriți să faceți? + text_wiki_page_reassign_children: Atribuie paginile la această pagină + text_wiki_page_nullify_children: Menține paginile ca și pagini inițiale (root) + text_wiki_page_destroy_children: Șterge paginile și descendenții + setting_password_min_length: Lungime minimă parolă + field_group_by: Grupează după + mail_subject_wiki_content_updated: "Pagina wiki '%{id}' a fost actualizată" + label_wiki_content_added: Adăugat + mail_subject_wiki_content_added: "Pagina wiki '%{id}' a fost adăugată" + mail_body_wiki_content_added: Pagina wiki '%{id}' a fost adăugată de %{author}. + label_wiki_content_updated: Actualizat + mail_body_wiki_content_updated: Pagina wiki '%{id}' a fost actualizată de %{author}. + permission_add_project: Crează proiect + setting_new_project_user_role_id: Rol atribuit utilizatorului non-admin care crează un proiect. + label_view_all_revisions: Arată toate reviziile + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: Nu există un tracker asociat cu proiectul. Verificați vă rog setările proiectului. + error_no_default_issue_status: Nu există un status implicit al tichetelor. Verificați vă rog configurația (Mergeți la "Administrare -> Stări tichete"). + text_journal_changed: "%{label} schimbat din %{old} în %{new}" + text_journal_set_to: "%{label} setat ca %{value}" + text_journal_deleted: "%{label} șters (%{old})" + label_group_plural: Grupuri + label_group: Grup + label_group_new: Grup nou + label_time_entry_plural: Timp alocat + text_journal_added: "%{label} %{value} added" + field_active: Active + enumeration_system_activity: System Activity + permission_delete_issue_watchers: Delete watchers + version_status_closed: closed + version_status_locked: locked + version_status_open: open + error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened + label_user_anonymous: Anonymous + button_move_and_follow: Move and follow + setting_default_projects_modules: Default enabled modules for new projects + setting_gravatar_default: Default Gravatar image + field_sharing: Sharing + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_system: With all projects + label_version_sharing_descendants: With subprojects + label_version_sharing_tree: With project tree + label_version_sharing_none: Not shared + error_can_not_archive_project: This project can not be archived + button_duplicate: Duplicate + button_copy_and_follow: Copy and follow + label_copy_source: Source + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_status: Use the issue status + error_issue_done_ratios_not_updated: Issue done ratios not updated. + error_workflow_copy_target: Please select target tracker(s) and role(s) + setting_issue_done_ratio_issue_field: Use the issue field + label_copy_same_as_target: Same as target + label_copy_target: Target + notice_issue_done_ratios_updated: Issue done ratios updated. + error_workflow_copy_source: Please select a source tracker or role + label_update_issue_done_ratios: Update issue done ratios + setting_start_of_week: Start calendars on + permission_view_issues: View Issues + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_revision_id: Revision %{value} + label_api_access_key: API access key + label_api_access_key_created_on: API access key created %{value} ago + label_feeds_access_key: Atom access key + notice_api_access_key_reseted: Your API access key was reset. + setting_rest_api_enabled: Enable REST web service + label_missing_api_access_key: Missing an API access key + label_missing_feeds_access_key: Missing a Atom access key + button_show: Show + text_line_separated: Multiple values allowed (one line for each value). + setting_mail_handler_body_delimiters: Truncate emails after one of these lines + permission_add_subprojects: Create subprojects + label_subproject_new: New subproject + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_close_versions: Close completed versions + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Codare pentru mesaje + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 tichet + one: 1 tichet + other: "%{count} tichete" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: toate + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Total + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: cheie API + setting_lost_password: Parolă uitată + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/ru.yml b/config/locales/ru.yml new file mode 100644 index 0000000..f98311a --- /dev/null +++ b/config/locales/ru.yml @@ -0,0 +1,1329 @@ +# Russian localization for Ruby on Rails 2.2+ +# by Yaroslav Markin +# +# Be sure to check out "russian" gem (http://github.com/yaroslav/russian) for +# full Russian language support in Rails (month names, pluralization, etc). +# The following is an excerpt from that gem. +# +# Для полноценной поддержки русского языка (варианты названий месяцев, +# плюрализация и так далее) в Rails 2.2 нужно использовать gem "russian" +# (http://github.com/yaroslav/russian). Следующие данные -- выдержка их него, чтобы +# была возможность минимальной локализации приложения на русский язык. + +ru: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%d %b" + long: "%d %B %Y" + + day_names: [воскресенье, понедельник, вторник, среда, четверг, пятница, суббота] + standalone_day_names: [Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота] + abbr_day_names: [Вс, Пн, Вт, Ср, Чт, Пт, Сб] + + month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря] + # see russian gem for info on "standalone" day names + standalone_month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь] + abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.] + standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.] + + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d %b %Y, %H:%M:%S %z" + time: "%H:%M" + short: "%d %b, %H:%M" + long: "%d %B %Y, %H:%M" + + am: "утра" + pm: "вечера" + + number: + format: + separator: "," + delimiter: " " + precision: 3 + + currency: + format: + format: "%n %u" + unit: "руб." + separator: "." + delimiter: " " + precision: 2 + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 3 + # Rails 2.2 + # storage_units: [байт, КБ, МБ, ГБ, ТБ] + + # Rails 2.3 + storage_units: + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u" + units: + byte: + one: "байт" + few: "байта" + many: "байт" + other: "байта" + kb: "КБ" + mb: "МБ" + gb: "ГБ" + tb: "ТБ" + + datetime: + distance_in_words: + half_a_minute: "меньше минуты" + less_than_x_seconds: + one: "меньше %{count} секунды" + few: "меньше %{count} секунд" + many: "меньше %{count} секунд" + other: "меньше %{count} секунды" + x_seconds: + one: "%{count} секунда" + few: "%{count} секунды" + many: "%{count} секунд" + other: "%{count} секунды" + less_than_x_minutes: + one: "меньше %{count} минуты" + few: "меньше %{count} минут" + many: "меньше %{count} минут" + other: "меньше %{count} минуты" + x_minutes: + one: "%{count} минуту" + few: "%{count} минуты" + many: "%{count} минут" + other: "%{count} минуты" + about_x_hours: + one: "около %{count} часа" + few: "около %{count} часов" + many: "около %{count} часов" + other: "около %{count} часа" + x_hours: + one: "%{count} час" + few: "%{count} часа" + many: "%{count} часов" + other: "%{count} часа" + x_days: + one: "%{count} день" + few: "%{count} дня" + many: "%{count} дней" + other: "%{count} дня" + about_x_months: + one: "около %{count} месяца" + few: "около %{count} месяцев" + many: "около %{count} месяцев" + other: "около %{count} месяца" + x_months: + one: "%{count} месяц" + few: "%{count} месяца" + many: "%{count} месяцев" + other: "%{count} месяца" + about_x_years: + one: "около %{count} года" + few: "около %{count} лет" + many: "около %{count} лет" + other: "около %{count} лет" + over_x_years: + one: "больше %{count} года" + few: "больше %{count} лет" + many: "больше %{count} лет" + other: "больше %{count} лет" + almost_x_years: + one: "почти %{count} год" + few: "почти %{count} года" + many: "почти %{count} лет" + other: "почти %{count} года" + prompts: + year: "Год" + month: "Месяц" + day: "День" + hour: "Часов" + minute: "Минут" + second: "Секунд" + + activerecord: + errors: + template: + header: + one: "%{model}: сохранение не удалось из-за %{count} ошибки" + few: "%{model}: сохранение не удалось из-за %{count} ошибок" + many: "%{model}: сохранение не удалось из-за %{count} ошибок" + other: "%{model}: сохранение не удалось из-за %{count} ошибки" + + body: "Проблемы возникли со следующими полями:" + + messages: + inclusion: "имеет непредусмотренное значение" + exclusion: "имеет зарезервированное значение" + invalid: "имеет неверное значение" + confirmation: "не совпадает с подтверждением" + accepted: "нужно подтвердить" + empty: "не может быть пустым" + blank: "не может быть пустым" + too_long: + one: "слишком большой длины (не может быть больше чем %{count} символ)" + few: "слишком большой длины (не может быть больше чем %{count} символа)" + many: "слишком большой длины (не может быть больше чем %{count} символов)" + other: "слишком большой длины (не может быть больше чем %{count} символа)" + too_short: + one: "недостаточной длины (не может быть меньше %{count} символа)" + few: "недостаточной длины (не может быть меньше %{count} символов)" + many: "недостаточной длины (не может быть меньше %{count} символов)" + other: "недостаточной длины (не может быть меньше %{count} символа)" + wrong_length: + one: "неверной длины (может быть длиной ровно %{count} символ)" + few: "неверной длины (может быть длиной ровно %{count} символа)" + many: "неверной длины (может быть длиной ровно %{count} символов)" + other: "неверной длины (может быть длиной ровно %{count} символа)" + taken: "уже существует" + not_a_number: "не является числом" + greater_than: "может иметь значение большее %{count}" + greater_than_or_equal_to: "может иметь значение большее или равное %{count}" + equal_to: "может иметь лишь значение, равное %{count}" + less_than: "может иметь значение меньшее чем %{count}" + less_than_or_equal_to: "может иметь значение меньшее или равное %{count}" + odd: "может иметь лишь нечетное значение" + even: "может иметь лишь четное значение" + greater_than_start_date: "должна быть позднее даты начала" + not_same_project: "не относится к одному проекту" + circular_dependency: "Такая связь приведет к циклической зависимости" + cant_link_an_issue_with_a_descendant: "Задача не может быть связана со своей подзадачей" + earlier_than_minimum_start_date: "не может быть раньше %{date} из-за предыдущих задач" + not_a_regexp: "не является допустимым регулярным выражением" + open_issue_with_closed_parent: "Открытая задача не может быть добавлена к закрытой родительской задаче" + + support: + array: + # Rails 2.2 + sentence_connector: "и" + skip_last_comma: true + + # Rails 2.3 + words_connector: ", " + two_words_connector: " и " + last_word_connector: " и " + + actionview_instancetag_blank_option: Выберите + + button_activate: Активировать + button_add: Добавить + button_annotate: Авторство + button_apply: Применить + button_archive: Архивировать + button_back: Назад + button_cancel: Отмена + button_change_password: Изменить пароль + button_change: Изменить + button_check_all: Отметить все + button_clear: Очистить + button_configure: Параметры + button_copy: Копировать + button_create: Создать + button_create_and_continue: Создать и продолжить + button_delete: Удалить + button_download: Загрузить + button_edit: Редактировать + button_edit_associated_wikipage: "Редактировать связанную wiki-страницу: %{page_title}" + button_list: Список + button_lock: Заблокировать + button_login: Вход + button_log_time: Трудозатраты + button_move: Переместить + button_quote: Цитировать + button_rename: Переименовать + button_reply: Ответить + button_reset: Сбросить + button_rollback: Вернуться к данной версии + button_save: Сохранить + button_sort: Сортировать + button_submit: Принять + button_test: Проверить + button_unarchive: Разархивировать + button_uncheck_all: Очистить + button_unlock: Разблокировать + button_unwatch: Не следить + button_update: Обновить + button_view: Просмотреть + button_watch: Следить + + default_activity_design: Проектирование + default_activity_development: Разработка + default_doc_category_tech: Техническая документация + default_doc_category_user: Пользовательская документация + default_issue_status_in_progress: В работе + default_issue_status_closed: Закрыта + default_issue_status_feedback: Обратная связь + default_issue_status_new: Новая + default_issue_status_rejected: Отклонена + default_issue_status_resolved: Решена + default_priority_high: Высокий + default_priority_immediate: Немедленный + default_priority_low: Низкий + default_priority_normal: Нормальный + default_priority_urgent: Срочный + default_role_developer: Разработчик + default_role_manager: Менеджер + default_role_reporter: Репортёр + default_tracker_bug: Ошибка + default_tracker_feature: Улучшение + default_tracker_support: Поддержка + + enumeration_activities: Действия (учёт времени) + enumeration_doc_categories: Категории документов + enumeration_issue_priorities: Приоритеты задач + + error_can_not_remove_role: Эта роль используется и не может быть удалена. + error_can_not_delete_custom_field: Невозможно удалить настраиваемое поле + error_can_not_delete_tracker: Этот трекер содержит задачи и не может быть удален. + error_can_t_load_default_data: "Конфигурация по умолчанию не была загружена: %{value}" + error_issue_not_found_in_project: Задача не была найдена или не прикреплена к этому проекту + error_scm_annotate: "Данные отсутствуют или не могут быть подписаны." + error_scm_command_failed: "Ошибка доступа к хранилищу: %{value}" + error_scm_not_found: Хранилище не содержит записи и/или исправления. + error_unable_to_connect: Невозможно подключиться (%{value}) + error_unable_delete_issue_status: Невозможно удалить статус задачи + + field_account: Учётная запись + field_activity: Деятельность + field_admin: Администратор + field_assignable: Задача может быть назначена этой роли + field_assigned_to: Назначена + field_attr_firstname: Имя + field_attr_lastname: Фамилия + field_attr_login: Атрибут Login + field_attr_mail: email + field_author: Автор + field_auth_source: Режим аутентификации + field_base_dn: BaseDN + field_category: Категория + field_column_names: Столбцы + field_comments: Комментарий + field_comments_sorting: Отображение комментариев + field_content: Содержимое + field_created_on: Создано + field_default_value: Значение по умолчанию + field_delay: Отложить + field_description: Описание + field_done_ratio: Готовность + field_downloads: Загрузки + field_due_date: Срок завершения + field_editable: Редактируемое + field_effective_date: Дата + field_estimated_hours: Оценка временных затрат + field_field_format: Формат + field_filename: Файл + field_filesize: Размер + field_firstname: Имя + field_fixed_version: Версия + field_hide_mail: Скрывать мой email + field_homepage: Стартовая страница + field_host: Компьютер + field_hours: час(а,ов) + field_identifier: Уникальный идентификатор + field_identity_url: OpenID URL + field_is_closed: Задача закрыта + field_is_default: Значение по умолчанию + field_is_filter: Используется в качестве фильтра + field_is_for_all: Для всех проектов + field_is_in_roadmap: Задачи, отображаемые в оперативном плане + field_is_public: Общедоступный + field_is_required: Обязательное + field_issue_to: Связанные задачи + field_issue: Задача + field_language: Язык + field_last_login_on: Последнее подключение + field_lastname: Фамилия + field_login: Пользователь + field_mail: Email + field_mail_notification: Уведомления по email + field_max_length: Максимальная длина + field_min_length: Минимальная длина + field_name: Имя + field_new_password: Новый пароль + field_notes: Примечания + field_onthefly: Создание пользователя на лету + field_parent_title: Родительская страница + field_parent: Родительский проект + field_parent_issue: Родительская задача + field_password_confirmation: Подтверждение + field_password: Пароль + field_port: Порт + field_possible_values: Возможные значения + field_priority: Приоритет + field_project: Проект + field_redirect_existing_links: Перенаправить существующие ссылки + field_regexp: Регулярное выражение + field_role: Роль + field_searchable: Доступно для поиска + field_spent_on: Дата + field_start_date: Дата начала + field_start_page: Стартовая страница + field_status: Статус + field_subject: Тема + field_subproject: Подпроект + field_summary: Краткое описание + field_text: Текстовое поле + field_time_entries: Трудозатраты + field_time_zone: Часовой пояс + field_title: Заголовок + field_tracker: Трекер + field_type: Тип + field_updated_on: Обновлено + field_url: URL + field_user: Пользователь + field_value: Значение + field_version: Версия + field_watcher: Наблюдатель + + general_csv_decimal_separator: ',' + general_csv_encoding: UTF-8 + general_csv_separator: ';' + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + general_lang_name: 'Russian (Русский)' + general_text_no: 'нет' + general_text_No: 'Нет' + general_text_yes: 'да' + general_text_Yes: 'Да' + + label_activity: Действия + label_add_another_file: Добавить ещё один файл + label_added_time_by: "Добавил(а) %{author} %{age} назад" + label_added: добавлено + label_add_note: Добавить замечание + label_administration: Администрирование + label_age: Возраст + label_ago: дней(я) назад + label_all_time: всё время + label_all_words: Все слова + label_all: все + label_and_its_subprojects: "%{value} и все подпроекты" + label_applied_status: Применимый статус + label_ascending: По возрастанию + label_assigned_to_me_issues: Мои задачи + label_associated_revisions: Связанные редакции + label_attachment: Файл + label_attachment_delete: Удалить файл + label_attachment_new: Новый файл + label_attachment_plural: Файлы + label_attribute: Атрибут + label_attribute_plural: Атрибуты + label_authentication: Аутентификация + label_auth_source: Режим аутентификации + label_auth_source_new: Новый режим аутентификации + label_auth_source_plural: Режимы аутентификации + label_blocked_by: блокируется + label_blocks: блокирует + label_board: Форум + label_board_new: Новый форум + label_board_plural: Форумы + label_boolean: Логический + label_browse: Обзор + label_bulk_edit_selected_issues: Редактировать все выбранные задачи + label_calendar: Календарь + label_calendar_filter: Включая + label_calendar_no_assigned: не мои + label_change_plural: Правки + label_change_properties: Изменить свойства + label_change_status: Изменить статус + label_change_view_all: Просмотреть все изменения + label_changes_details: Подробности по всем изменениям + label_changeset_plural: Изменения + label_chronological_order: В хронологическом порядке + label_closed_issues: закрыто + label_closed_issues_plural: закрыто + label_closed_issues_plural2: закрыто + label_closed_issues_plural5: закрыто + label_comment: комментарий + label_comment_add: Оставить комментарий + label_comment_added: Добавленный комментарий + label_comment_delete: Удалить комментарии + label_comment_plural: Комментарии + label_comment_plural2: комментария + label_comment_plural5: комментариев + label_commits_per_author: Изменений на пользователя + label_commits_per_month: Изменений в месяц + label_confirmation: Подтверждение + label_contains: содержит + label_copied: скопировано + label_copy_workflow_from: Скопировать последовательность действий из + label_current_status: Текущий статус + label_current_version: Текущая версия + label_custom_field: Настраиваемое поле + label_custom_field_new: Новое настраиваемое поле + label_custom_field_plural: Настраиваемые поля + label_date_from: С + label_date_from_to: С %{start} по %{end} + label_date_range: временной интервал + label_date_to: по + label_date: Дата + label_day_plural: дней(я) + label_default: По умолчанию + label_default_columns: Столбцы по умолчанию + label_deleted: удалено + label_descending: По убыванию + label_details: Подробности + label_diff_inline: в тексте + label_diff_side_by_side: рядом + label_disabled: отключено + label_display: Отображение + label_display_per_page: "На страницу: %{value}" + label_document: Документ + label_document_added: Добавлен документ + label_document_new: Новый документ + label_document_plural: Документы + label_downloads_abbr: Скачиваний + label_duplicated_by: дублируется + label_duplicates: дублирует + label_enumeration_new: Новое значение + label_enumerations: Списки значений + label_environment: Окружение + label_equals: соответствует + label_example: Пример + label_export_to: Экспортировать в + label_feed_plural: Atom + label_feeds_access_key_created_on: "Ключ доступа Atom создан %{value} назад" + label_f_hour: "%{value} час" + label_f_hour_plural: "%{value} часов" + label_file_added: Добавлен файл + label_file_plural: Файлы + label_filter_add: Добавить фильтр + label_filter_plural: Фильтры + label_float: С плавающей точкой + label_follows: предыдущая + label_gantt: Диаграмма Ганта + label_general: Общее + label_generate_key: Сгенерировать ключ + label_greater_or_equal: ">=" + label_help: Помощь + label_history: История + label_home: Домашняя страница + label_incoming_emails: Приём сообщений + label_index_by_date: История страниц + label_index_by_title: Оглавление + label_information_plural: Информация + label_information: Информация + label_in_less_than: менее чем + label_in_more_than: более чем + label_integer: Целый + label_internal: Внутренний + label_in: в + label_issue: Задача + label_issue_added: Добавлена задача + label_issue_category_new: Новая категория + label_issue_category_plural: Категории задачи + label_issue_category: Категория задачи + label_issue_new: Новая задача + label_issue_plural: Задачи + label_issues_by: "Сортировать по %{value}" + label_issue_status_new: Новый статус + label_issue_status_plural: Статусы задач + label_issue_status: Статус задачи + label_issue_tracking: Задачи + label_issue_updated: Обновлена задача + label_issue_view_all: Просмотреть все задачи + label_issue_watchers: Наблюдатели + label_jump_to_a_project: Перейти к проекту... + label_language_based: На основе языка + label_last_changes: "менее %{count} изменений" + label_last_login: Последнее подключение + label_last_month: прошлый месяц + label_last_n_days: "последние %{count} дней" + label_last_week: прошлая неделя + label_latest_revision: Последняя редакция + label_latest_revision_plural: Последние редакции + label_ldap_authentication: Авторизация с помощью LDAP + label_less_or_equal: <= + label_less_than_ago: менее, чем дней(я) назад + label_list: Список + label_loading: Загрузка... + label_logged_as: Вошли как + label_login: Войти + label_login_with_open_id_option: или войти с помощью OpenID + label_logout: Выйти + label_max_size: Максимальный размер + label_member_new: Новый участник + label_member: Участник + label_member_plural: Участники + label_message_last: Последнее сообщение + label_message_new: Новое сообщение + label_message_plural: Сообщения + label_message_posted: Добавлено сообщение + label_me: мне + label_min_max_length: Минимальная - максимальная длина + label_modified: изменено + label_module_plural: Модули + label_months_from: месяцев(ца) с + label_month: Месяц + label_more_than_ago: более, чем дней(я) назад + label_my_account: Моя учётная запись + label_my_page: Моя страница + label_my_projects: Мои проекты + label_new: Новый + label_new_statuses_allowed: Разрешенные новые статусы + label_news_added: Добавлена новость + label_news_latest: Последние новости + label_news_new: Добавить новость + label_news_plural: Новости + label_news_view_all: Посмотреть все новости + label_news: Новости + label_next: Следующее + label_nobody: никто + label_no_change_option: (Нет изменений) + label_no_data: Нет данных для отображения + label_none: отсутствует + label_not_contains: не содержит + label_not_equals: не соответствует + label_open_issues: открыто + label_open_issues_plural: открыто + label_open_issues_plural2: открыто + label_open_issues_plural5: открыто + label_optional_description: Описание (необязательно) + label_options: Опции + label_overall_activity: Сводный отчёт действий + label_overview: Обзор + label_password_lost: Восстановление пароля + label_permissions_report: Отчёт по правам доступа + label_permissions: Права доступа + label_please_login: Пожалуйста, войдите. + label_plugins: Модули + label_precedes: следующая + label_preferences: Предпочтения + label_preview: Предпросмотр + label_previous: Предыдущее + label_profile: Профиль + label_project: Проект + label_project_all: Все проекты + label_project_copy_notifications: Отправлять уведомления по электронной почте при копировании проекта + label_project_latest: Последние проекты + label_project_new: Новый проект + label_project_plural: Проекты + label_project_plural2: проекта + label_project_plural5: проектов + label_public_projects: Общие проекты + label_query: Сохранённый запрос + label_query_new: Новый запрос + label_query_plural: Сохранённые запросы + label_read: Чтение... + label_register: Регистрация + label_registered_on: Зарегистрирован(а) + label_registration_activation_by_email: активация учётных записей по email + label_registration_automatic_activation: автоматическая активация учётных записей + label_registration_manual_activation: активировать учётные записи вручную + label_related_issues: Связанные задачи + label_relates_to: связана с + label_relation_delete: Удалить связь + label_relation_new: Новая связь + label_renamed: переименовано + label_reply_plural: Ответы + label_report: Отчёт + label_report_plural: Отчёты + label_reported_issues: Созданные задачи + label_repository: Хранилище + label_repository_plural: Хранилища + label_result_plural: Результаты + label_reverse_chronological_order: В обратном порядке + label_revision: Редакция + label_revision_plural: Редакции + label_roadmap: Оперативный план + label_roadmap_due_in: "В срок %{value}" + label_roadmap_no_issues: Нет задач для данной версии + label_roadmap_overdue: "опоздание %{value}" + label_role: Роль + label_role_and_permissions: Роли и права доступа + label_role_new: Новая роль + label_role_plural: Роли + label_scm: Тип хранилища + label_search: Поиск + label_search_titles_only: Искать только в названиях + label_send_information: Отправить пользователю информацию по учётной записи + label_send_test_email: Послать email для проверки + label_settings: Настройки + label_show_completed_versions: Показывать завершённые версии + label_sort: Сортировать + label_sort_by: "Сортировать по %{value}" + label_sort_higher: Вверх + label_sort_highest: В начало + label_sort_lower: Вниз + label_sort_lowest: В конец + label_spent_time: Трудозатраты + label_statistics: Статистика + label_stay_logged_in: Оставаться в системе + label_string: Текст + label_subproject_plural: Подпроекты + label_subtask_plural: Подзадачи + label_text: Длинный текст + label_theme: Тема + label_this_month: этот месяц + label_this_week: на этой неделе + label_this_year: этот год + label_time_tracking: Учёт времени + label_timelog_today: Расход времени на сегодня + label_today: сегодня + label_topic_plural: Темы + label_total: Всего + label_tracker: Трекер + label_tracker_new: Новый трекер + label_tracker_plural: Трекеры + label_updated_time: "Обновлено %{value} назад" + label_updated_time_by: "Обновлено %{author} %{age} назад" + label_used_by: Используется + label_user: Пользователь + label_user_activity: "Действия пользователя %{value}" + label_user_mail_no_self_notified: "Не извещать об изменениях, которые я сделал сам" + label_user_mail_option_all: "О всех событиях во всех моих проектах" + label_user_mail_option_selected: "О всех событиях только в выбранном проекте..." + label_user_mail_option_only_my_events: Только для объектов, которые я отслеживаю или в которых участвую + label_user_new: Новый пользователь + label_user_plural: Пользователи + label_version: Версия + label_version_new: Новая версия + label_version_plural: Версии + label_view_diff: Просмотреть отличия + label_view_revisions: Просмотреть редакции + label_watched_issues: Отслеживаемые задачи + label_week: Неделя + label_wiki: Wiki + label_wiki_edit: Редактирование Wiki + label_wiki_edit_plural: Wiki + label_wiki_page: Страница Wiki + label_wiki_page_plural: Страницы Wiki + label_workflow: Последовательность действий + label_x_closed_issues_abbr: + zero: "0 закрыто" + one: "%{count} закрыта" + few: "%{count} закрыто" + many: "%{count} закрыто" + other: "%{count} закрыто" + label_x_comments: + zero: "нет комментариев" + one: "%{count} комментарий" + few: "%{count} комментария" + many: "%{count} комментариев" + other: "%{count} комментариев" + label_x_open_issues_abbr: + zero: "0 открыто" + one: "%{count} открыта" + few: "%{count} открыто" + many: "%{count} открыто" + other: "%{count} открыто" + label_x_projects: + zero: "нет проектов" + one: "%{count} проект" + few: "%{count} проекта" + many: "%{count} проектов" + other: "%{count} проектов" + label_year: Год + label_yesterday: вчера + + mail_body_account_activation_request: "Зарегистрирован новый пользователь (%{value}). Учётная запись ожидает Вашего утверждения:" + mail_body_account_information: Информация о Вашей учётной записи + mail_body_account_information_external: "Вы можете использовать Вашу %{value} учётную запись для входа." + mail_body_lost_password: 'Для изменения пароля пройдите по следующей ссылке:' + mail_body_register: 'Для активации учётной записи пройдите по следующей ссылке:' + mail_body_reminder: "%{count} назначенных на Вас задач на следующие %{days} дней:" + mail_subject_account_activation_request: "Запрос на активацию пользователя в системе %{value}" + mail_subject_lost_password: "Ваш %{value} пароль" + mail_subject_register: "Активация учётной записи %{value}" + mail_subject_reminder: "%{count} назначенных на Вас задач в ближайшие %{days} дней" + + notice_account_activated: Ваша учётная запись активирована. Вы можете войти. + notice_account_invalid_credentials: Неправильное имя пользователя или пароль + notice_account_lost_email_sent: Вам отправлено письмо с инструкциями по выбору нового пароля. + notice_account_password_updated: Пароль успешно обновлён. + notice_account_pending: "Ваша учётная запись создана и ожидает подтверждения администратора." + notice_account_register_done: Учётная запись успешно создана. Для активации Вашей учётной записи пройдите по ссылке, которая выслана Вам по электронной почте. + notice_account_unknown_email: Неизвестный пользователь. + notice_account_updated: Учётная запись успешно обновлена. + notice_account_wrong_password: Неверный пароль + notice_can_t_change_password: Для данной учётной записи используется источник внешней аутентификации. Невозможно изменить пароль. + notice_default_data_loaded: Была загружена конфигурация по умолчанию. + notice_email_error: "Во время отправки письма произошла ошибка (%{value})" + notice_email_sent: "Отправлено письмо %{value}" + notice_failed_to_save_issues: "Не удалось сохранить %{count} пункт(ов) из %{total} выбранных: %{ids}." + notice_failed_to_save_members: "Не удалось сохранить участника(ов): %{errors}." + notice_feeds_access_key_reseted: Ваш ключ доступа Atom был сброшен. + notice_file_not_found: Страница, на которую Вы пытаетесь зайти, не существует или удалена. + notice_locking_conflict: Информация обновлена другим пользователем. + notice_no_issue_selected: "Не выбрано ни одной задачи! Пожалуйста, отметьте задачи, которые Вы хотите отредактировать." + notice_not_authorized: У Вас нет прав для посещения данной страницы. + notice_successful_connection: Подключение успешно установлено. + notice_successful_create: Создание успешно. + notice_successful_delete: Удаление успешно. + notice_successful_update: Обновление успешно. + notice_unable_delete_version: Невозможно удалить версию. + + permission_add_issues: Добавление задач + permission_add_issue_notes: Добавление примечаний + permission_add_issue_watchers: Добавление наблюдателей + permission_add_messages: Отправка сообщений + permission_browse_repository: Просмотр хранилища + permission_comment_news: Комментирование новостей + permission_commit_access: Изменение файлов в хранилище + permission_delete_issues: Удаление задач + permission_delete_messages: Удаление сообщений + permission_delete_own_messages: Удаление собственных сообщений + permission_delete_wiki_pages: Удаление wiki-страниц + permission_delete_wiki_pages_attachments: Удаление прикреплённых файлов + permission_edit_issue_notes: Редактирование примечаний + permission_edit_issues: Редактирование задач + permission_edit_messages: Редактирование сообщений + permission_edit_own_issue_notes: Редактирование собственных примечаний + permission_edit_own_messages: Редактирование собственных сообщений + permission_edit_own_time_entries: Редактирование собственного учёта времени + permission_edit_project: Редактирование проектов + permission_edit_time_entries: Редактирование учёта времени + permission_edit_wiki_pages: Редактирование wiki-страниц + permission_export_wiki_pages: Экспорт wiki-страниц + permission_log_time: Учёт трудозатрат + permission_view_changesets: Просмотр изменений хранилища + permission_view_time_entries: Просмотр трудозатрат + permission_manage_project_activities: Управление типами действий для проекта + permission_manage_boards: Управление форумами + permission_manage_categories: Управление категориями задач + permission_manage_files: Управление файлами + permission_manage_issue_relations: Управление связыванием задач + permission_manage_members: Управление участниками + permission_manage_news: Управление новостями + permission_manage_public_queries: Управление общими запросами + permission_manage_repository: Управление хранилищем + permission_manage_subtasks: Управление подзадачами + permission_manage_versions: Управление версиями + permission_manage_wiki: Управление Wiki + permission_move_issues: Перенос задач + permission_protect_wiki_pages: Блокирование wiki-страниц + permission_rename_wiki_pages: Переименование wiki-страниц + permission_save_queries: Сохранение запросов + permission_select_project_modules: Выбор модулей проекта + permission_view_calendar: Просмотр календаря + permission_view_documents: Просмотр документов + permission_view_files: Просмотр файлов + permission_view_gantt: Просмотр диаграммы Ганта + permission_view_issue_watchers: Просмотр списка наблюдателей + permission_view_messages: Просмотр сообщений + permission_view_wiki_edits: Просмотр истории Wiki + permission_view_wiki_pages: Просмотр Wiki + + project_module_boards: Форумы + project_module_documents: Документы + project_module_files: Файлы + project_module_issue_tracking: Задачи + project_module_news: Новости + project_module_repository: Хранилище + project_module_time_tracking: Учёт времени + project_module_wiki: Wiki + project_module_gantt: Диаграмма Ганта + project_module_calendar: Календарь + + setting_activity_days_default: Количество дней, отображаемых в Действиях + setting_app_subtitle: Подзаголовок приложения + setting_app_title: Название приложения + setting_attachment_max_size: Максимальный размер вложения + setting_autofetch_changesets: Автоматически следить за изменениями хранилища + setting_autologin: Автоматический вход + setting_bcc_recipients: Использовать скрытые копии (BCC) + setting_cache_formatted_text: Кешировать форматированный текст + setting_commit_fix_keywords: Назначение ключевых слов + setting_commit_ref_keywords: Ключевые слова для поиска + setting_cross_project_issue_relations: Разрешить пересечение задач по проектам + setting_date_format: Формат даты + setting_default_language: Язык по умолчанию + setting_default_notification_option: Способ оповещения по умолчанию + setting_default_projects_public: Новые проекты являются общедоступными + setting_diff_max_lines_displayed: Максимальное число строк для diff + setting_display_subprojects_issues: Отображение подпроектов по умолчанию + setting_emails_footer: Подстрочные примечания письма + setting_enabled_scm: Включённые SCM + setting_feeds_limit: Ограничение количества заголовков для Atom потока + setting_file_max_size_displayed: Максимальный размер текстового файла для отображения + setting_gravatar_enabled: Использовать аватар пользователя из Gravatar + setting_host_name: Имя компьютера + setting_issue_list_default_columns: Столбцы, отображаемые в списке задач по умолчанию + setting_issues_export_limit: Ограничение по экспортируемым задачам + setting_login_required: Необходима аутентификация + setting_mail_from: Исходящий email адрес + setting_mail_handler_api_enabled: Включить веб-сервис для входящих сообщений + setting_mail_handler_api_key: API ключ + setting_openid: Разрешить OpenID для входа и регистрации + setting_per_page_options: Количество записей на страницу + setting_plain_text_mail: Только простой текст (без HTML) + setting_protocol: Протокол + setting_repository_log_display_limit: Максимальное количество редакций, отображаемых в журнале изменений + setting_self_registration: Саморегистрация + setting_sequential_project_identifiers: Генерировать последовательные идентификаторы проектов + setting_sys_api_enabled: Включить веб-сервис для управления хранилищем + setting_text_formatting: Форматирование текста + setting_time_format: Формат времени + setting_user_format: Формат отображения имени + setting_welcome_text: Текст приветствия + setting_wiki_compression: Сжатие истории Wiki + + status_active: активен + status_locked: заблокирован + status_registered: зарегистрирован + + text_are_you_sure: Вы уверены? + text_assign_time_entries_to_project: Прикрепить зарегистрированное время к проекту + text_caracters_maximum: "Максимум %{count} символов(а)." + text_caracters_minimum: "Должно быть не менее %{count} символов." + text_comma_separated: Допустимы несколько значений (через запятую). + text_custom_field_possible_values_info: 'По одному значению в каждой строке' + text_default_administrator_account_changed: Учётная запись администратора по умолчанию изменена + text_destroy_time_entries_question: "На эту задачу зарегистрировано %{hours} часа(ов) трудозатрат. Что Вы хотите предпринять?" + text_destroy_time_entries: Удалить зарегистрированное время + text_diff_truncated: '... Этот diff ограничен, так как превышает максимальный отображаемый размер.' + text_email_delivery_not_configured: "Параметры работы с почтовым сервером не настроены и функция уведомления по email не активна.\nНастроить параметры для Вашего SMTP-сервера Вы можете в файле config/configuration.yml. Для применения изменений перезапустите приложение." + text_enumeration_category_reassign_to: 'Назначить им следующее значение:' + text_enumeration_destroy_question: "%{count} объект(а,ов) связаны с этим значением." + text_file_repository_writable: Хранилище файлов доступно для записи + text_issue_added: "Создана новая задача %{id} (%{author})." + text_issue_category_destroy_assignments: Удалить назначения категории + text_issue_category_destroy_question: "Несколько задач (%{count}) назначено в данную категорию. Что Вы хотите предпринять?" + text_issue_category_reassign_to: Переназначить задачи для данной категории + text_issues_destroy_confirmation: 'Вы уверены, что хотите удалить выбранные задачи?' + text_issues_ref_in_commit_messages: Сопоставление и изменение статуса задач исходя из текста сообщений + text_issue_updated: "Задача %{id} была обновлена (%{author})." + text_journal_changed: "Параметр %{label} изменился с %{old} на %{new}" + text_journal_deleted: "Значение %{old} параметра %{label} удалено" + text_journal_set_to: "Параметр %{label} изменился на %{value}" + text_length_between: "Длина между %{min} и %{max} символов." + text_load_default_configuration: Загрузить конфигурацию по умолчанию + text_min_max_length_info: 0 означает отсутствие ограничений + text_no_configuration_data: "Роли, трекеры, статусы задач и оперативный план не были сконфигурированы.\nНастоятельно рекомендуется загрузить конфигурацию по-умолчанию. Вы сможете её изменить потом." + text_plugin_assets_writable: Каталог ресурсов модулей доступен для записи + text_project_destroy_confirmation: Вы настаиваете на удалении данного проекта и всей относящейся к нему информации? + text_reassign_time_entries: 'Перенести зарегистрированное время на следующую задачу:' + text_regexp_info: "например: ^[A-Z0-9]+$" + text_repository_usernames_mapping: "Выберите или обновите пользователя Redmine, связанного с найденными именами в журнале хранилища.\nПользователи с одинаковыми именами или email в Redmine и хранилище связываются автоматически." + text_rmagick_available: Доступно использование RMagick (опционально) + text_select_mail_notifications: Выберите действия, при которых будет отсылаться уведомление на электронную почту. + text_select_project_modules: 'Выберите модули, которые будут использованы в проекте:' + text_status_changed_by_changeset: "Реализовано в %{value} редакции." + text_subprojects_destroy_warning: "Подпроекты: %{value} также будут удалены." + text_tip_issue_begin_day: дата начала задачи + text_tip_issue_begin_end_day: начало задачи и окончание её в этот же день + text_tip_issue_end_day: дата завершения задачи + text_tracker_no_workflow: Для этого трекера последовательность действий не определена + text_unallowed_characters: Запрещенные символы + text_user_mail_option: "Для невыбранных проектов, Вы будете получать уведомления только о том, что просматриваете или в чем участвуете (например, задачи, автором которых Вы являетесь, или которые Вам назначены)." + text_user_wrote: "%{value} писал(а):" + text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все её содержимое? + text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний + + warning_attachments_not_saved: "%{count} файл(ов) невозможно сохранить." + text_wiki_page_destroy_question: Эта страница имеет %{descendants} дочерних страниц и их потомков. Что вы хотите предпринять? + text_wiki_page_reassign_children: Переопределить дочерние страницы на текущую страницу + text_wiki_page_nullify_children: Сделать дочерние страницы главными страницами + text_wiki_page_destroy_children: Удалить дочерние страницы и всех их потомков + setting_password_min_length: Минимальная длина пароля + field_group_by: Группировать результаты по + mail_subject_wiki_content_updated: "Wiki-страница '%{id}' была обновлена" + label_wiki_content_added: Добавлена wiki-страница + mail_subject_wiki_content_added: "Wiki-страница '%{id}' была добавлена" + mail_body_wiki_content_added: "%{author} добавил(а) wiki-страницу '%{id}'." + label_wiki_content_updated: Обновлена wiki-страница + mail_body_wiki_content_updated: "%{author} обновил(а) wiki-страницу '%{id}'." + permission_add_project: Создание проекта + setting_new_project_user_role_id: Роль, назначаемая пользователю, создавшему проект + label_view_all_revisions: Показать все ревизии + label_tag: Метка + label_branch: Ветвь + error_no_tracker_in_project: С этим проектом не ассоциирован ни один трекер. Проверьте настройки проекта. + error_no_default_issue_status: Не определен статус задач по умолчанию. Проверьте настройки (см. "Администрирование -> Статусы задач"). + label_group_plural: Группы + label_group: Группа + label_group_new: Новая группа + label_time_entry_plural: Трудозатраты + text_journal_added: "%{label} %{value} добавлен" + field_active: Активно + enumeration_system_activity: Системное + permission_delete_issue_watchers: Удаление наблюдателей + version_status_closed: закрыт + version_status_locked: заблокирован + version_status_open: открыт + error_can_not_reopen_issue_on_closed_version: Задача, назначенная к закрытой версии, не сможет быть открыта снова + label_user_anonymous: Аноним + button_move_and_follow: Переместить и перейти + setting_default_projects_modules: Включенные по умолчанию модули для новых проектов + setting_gravatar_default: Изображение Gravatar по умолчанию + field_sharing: Совместное использование + label_version_sharing_hierarchy: С иерархией проектов + label_version_sharing_system: Со всеми проектами + label_version_sharing_descendants: С подпроектами + label_version_sharing_tree: С деревом проектов + label_version_sharing_none: Без совместного использования + error_can_not_archive_project: Этот проект не может быть заархивирован + button_duplicate: Дублировать + button_copy_and_follow: Копировать и продолжить + label_copy_source: Источник + setting_issue_done_ratio: Рассчитывать готовность задачи с помощью поля + setting_issue_done_ratio_issue_status: Статус задачи + error_issue_done_ratios_not_updated: Параметр готовность задач не обновлён + error_workflow_copy_target: Выберите целевые трекеры и роли + setting_issue_done_ratio_issue_field: Готовность задачи + label_copy_same_as_target: То же, что и у цели + label_copy_target: Цель + notice_issue_done_ratios_updated: Параметр «готовность» обновлён. + error_workflow_copy_source: Выберите исходный трекер или роль + label_update_issue_done_ratios: Обновить готовность задач + setting_start_of_week: День начала недели + label_api_access_key: Ключ доступа к API + text_line_separated: Разрешено несколько значений (по одному значению в строку). + label_revision_id: Ревизия %{value} + permission_view_issues: Просмотр задач + label_display_used_statuses_only: Отображать только те статусы, которые используются в этом трекере + label_api_access_key_created_on: Ключ доступ к API был создан %{value} назад + label_feeds_access_key: Ключ доступа к Atom + notice_api_access_key_reseted: Ваш ключ доступа к API был сброшен. + setting_rest_api_enabled: Включить веб-сервис REST + button_show: Показать + label_missing_api_access_key: Отсутствует ключ доступа к API + label_missing_feeds_access_key: Отсутствует ключ доступа к Atom + setting_mail_handler_body_delimiters: Урезать письмо после одной из этих строк + permission_add_subprojects: Создание подпроектов + label_subproject_new: Новый подпроект + text_own_membership_delete_confirmation: |- + Вы собираетесь удалить некоторые или все права, из-за чего могут пропасть права на редактирование этого проекта. + Продолжить? + label_close_versions: Закрыть завершённые версии + label_board_sticky: Прикреплена + label_board_locked: Заблокирована + field_principal: Имя + text_zoom_out: Отдалить + text_zoom_in: Приблизить + notice_unable_delete_time_entry: Невозможно удалить запись журнала. + label_overall_spent_time: Всего трудозатрат + label_user_mail_option_none: Нет событий + field_member_of_group: Группа назначенного + field_assigned_to_role: Роль назначенного + notice_not_authorized_archived_project: Запрашиваемый проект был архивирован. + label_principal_search: "Найти пользователя или группу:" + label_user_search: "Найти пользователя:" + field_visible: Видимое + setting_emails_header: Заголовок письма + + setting_commit_logtime_activity_id: Действие для учёта времени + text_time_logged_by_changeset: Учтено в редакции %{value}. + setting_commit_logtime_enabled: Включить учёт времени + notice_gantt_chart_truncated: Диаграмма будет усечена, поскольку превышено максимальное кол-во элементов, которые могут отображаться (%{max}) + setting_gantt_items_limit: Максимальное кол-во элементов отображаемых на диаграмме Ганта + field_warn_on_leaving_unsaved: Предупреждать при закрытии страницы с несохранённым текстом + text_warn_on_leaving_unsaved: Текущая страница содержит несохранённый текст, который будет потерян, если вы покинете эту страницу. + label_my_queries: Мои сохранённые запросы + text_journal_changed_no_detail: "%{label} обновлено" + label_news_comment_added: Добавлен комментарий к новости + button_expand_all: Развернуть все + button_collapse_all: Свернуть все + label_additional_workflow_transitions_for_assignee: Дополнительные переходы, когда пользователь является исполнителем + label_additional_workflow_transitions_for_author: Дополнительные переходы, когда пользователь является автором + label_bulk_edit_selected_time_entries: Массовое изменение выбранных записей трудозатрат + text_time_entries_destroy_confirmation: Вы уверены что хотите удалить выбранные трудозатраты? + label_role_anonymous: Аноним + label_role_non_member: Не участник + label_issue_note_added: Примечание добавлено + label_issue_status_updated: Статус обновлён + label_issue_priority_updated: Приоритет обновлён + label_issues_visibility_own: Задачи созданные или назначенные пользователю + field_issues_visibility: Видимость задач + label_issues_visibility_all: Все задачи + permission_set_own_issues_private: Установление видимости (общая/частная) для собственных задач + field_is_private: Частная + permission_set_issues_private: Установление видимости (общая/частная) для задач + label_issues_visibility_public: Только общие задачи + text_issues_destroy_descendants_confirmation: Так же будет удалено %{count} задач(и). + field_commit_logs_encoding: Кодировка комментариев в хранилище + field_scm_path_encoding: Кодировка пути + text_scm_path_encoding_note: "По умолчанию: UTF-8" + field_path_to_repository: Путь к хранилищу + field_root_directory: Корневая директория + field_cvs_module: Модуль + field_cvsroot: CVSROOT + text_mercurial_repository_note: Локальное хранилище (например, /hgrepo, c:\hgrepo) + text_scm_command: Команда + text_scm_command_version: Версия + label_git_report_last_commit: Указывать последнее изменения для файлов и директорий + text_scm_config: Вы можете настроить команды SCM в файле config/configuration.yml. Пожалуйста, перезапустите приложение после редактирования этого файла. + text_scm_command_not_available: Команда системы контроля версий недоступна. Пожалуйста, проверьте настройки в административной панели. + notice_issue_successful_create: Задача %{id} создана. + label_between: между + setting_issue_group_assignment: Разрешить назначение задач группам пользователей + label_diff: Разница(diff) + text_git_repository_note: Хранилище пустое и локальное (т.е. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Порядок сортировки + description_project_scope: Область поиска + description_filter: Фильтр + description_user_mail_notification: Настройки почтовых оповещений + description_message_content: Содержание сообщения + description_available_columns: Доступные столбцы + description_issue_category_reassign: Выберите категорию задачи + description_search: Поле поиска + description_notes: Примечания + description_choose_project: Проекты + description_query_sort_criteria_attribute: Критерий сортировки + description_wiki_subpages_reassign: Выбрать новую родительскую страницу + description_selected_columns: Выбранные столбцы + label_parent_revision: Родительский + label_child_revision: Дочерний + error_scm_annotate_big_text_file: Комментарий невозможен из-за превышения максимального размера текстового файла. + setting_default_issue_start_date_to_creation_date: Использовать текущую дату в качестве даты начала для новых задач + button_edit_section: Редактировать эту секцию + setting_repositories_encodings: Кодировка вложений и хранилищ + description_all_columns: Все столбцы + button_export: Экспорт + label_export_options: "%{export_format} параметры экспорта" + error_attachment_too_big: Этот файл нельзя загрузить из-за превышения максимального размера файла (%{max_size}) + notice_failed_to_save_time_entries: "Невозможно сохранить %{count} трудозатраты %{total} выбранных: %{ids}." + label_x_issues: + one: "%{count} задача" + few: "%{count} задачи" + many: "%{count} задач" + other: "%{count} Задачи" + label_repository_new: Новое хранилище + field_repository_is_default: Хранилище по умолчанию + label_copy_attachments: Копировать вложения + label_item_position: "%{position}/%{count}" + label_completed_versions: Завершенные версии + text_project_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.
    После сохранения идентификатор изменить нельзя. + field_multiple: Множественные значения + setting_commit_cross_project_ref: Разрешить ссылаться и исправлять задачи во всех остальных проектах + text_issue_conflict_resolution_add_notes: Добавить мои примечания и отказаться от моих изменений + text_issue_conflict_resolution_overwrite: Применить мои изменения (все предыдущие замечания будут сохранены, но некоторые изменения могут быть перезаписаны) + notice_issue_update_conflict: Кто-то изменил задачу, пока вы ее редактировали. + text_issue_conflict_resolution_cancel: Отменить мои изменения и показать задачу заново %{link} + permission_manage_related_issues: Управление связанными задачами + field_auth_source_ldap_filter: Фильтр LDAP + label_search_for_watchers: Найти наблюдателей + notice_account_deleted: "Ваша учетная запись полностью удалена" + setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" + button_delete_my_account: "Удалить мою учетную запись" + text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" + error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз + text_session_expiration_settings: "Внимание! Изменение этих настроек может привести к завершению текущих сессий, включая вашу." + setting_session_lifetime: Максимальная продолжительность сессии + setting_session_timeout: Таймаут сессии + label_session_expiration: Срок истечения сессии + permission_close_project: Закрывать / открывать проекты + label_show_closed_projects: Просматривать закрытые проекты + button_close: Сделать закрытым + button_reopen: Сделать открытым + project_status_active: открытые + project_status_closed: закрытые + project_status_archived: архивированные + text_project_closed: Проект закрыт и находится в режиме только для чтения. + notice_user_successful_create: Пользователь %{id} создан. + field_core_fields: Стандартные поля + field_timeout: Таймаут (в секундах) + setting_thumbnails_enabled: Отображать превью для вложений + setting_thumbnails_size: Размер первью (в пикселях) + label_status_transitions: Статус-переходы + label_fields_permissions: Права на изменения полей + label_readonly: Не изменяется + label_required: Обязательное + text_repository_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.
    После сохранения идентификатор изменить нельзя. + field_board_parent: Родительский форум + label_attribute_of_project: Проект %{name} + label_attribute_of_author: Имя автора %{name} + label_attribute_of_assigned_to: Назначена %{name} + label_attribute_of_fixed_version: Версия %{name} + label_copy_subtasks: Копировать подзадачи + label_copied_to: скопирована в + label_copied_from: скопирована с + label_any_issues_in_project: любые задачи в проекте + label_any_issues_not_in_project: любые задачи не в проекте + field_private_notes: Приватный комментарий + permission_view_private_notes: Просмотр приватных комментариев + permission_set_notes_private: Размещение приватных комментариев + label_no_issues_in_project: нет задач в проекте + label_any: все + label_last_n_weeks: + one: "прошлая %{count} неделя" + few: "прошлые %{count} недели" + many: "прошлые %{count} недель" + other: "прошлые %{count} недели" + setting_cross_project_subtasks: Разрешить подзадачи между проектами + label_cross_project_descendants: С подпроектами + label_cross_project_tree: С деревом проектов + label_cross_project_hierarchy: С иерархией проектов + label_cross_project_system: Со всеми проектами + button_hide: Скрыть + setting_non_working_week_days: Нерабочие дни + label_in_the_next_days: в следующие дни + label_in_the_past_days: в прошлые дни + label_attribute_of_user: Пользователь %{name} + text_turning_multiple_off: Если отключить множественные значения, лишние значения из списка будут удалены, чтобы осталось только по одному значению. + label_attribute_of_issue: Задача %{name} + permission_add_documents: Добавить документы + permission_edit_documents: Редактировать документы + permission_delete_documents: Удалить документы + label_gantt_progress_line: Линия прогресса + setting_jsonp_enabled: Поддержка JSONP + field_inherit_members: Наследовать участников + field_closed_on: Закрыта + field_generate_password: Создание пароля + setting_default_projects_tracker_ids: Трекеры по умолчанию для новых проектов + label_total_time: Общее время + notice_account_not_activated_yet: Вы пока не имеете активированных учетных записей. + Чтобы получить письмо с активацией, перейдите по ссылке. + notice_account_locked: Ваша учетная запись заблокирована. + label_hidden: Скрытый + label_visibility_private: только мне + label_visibility_roles: только этим ролям + label_visibility_public: всем пользователям + field_must_change_passwd: Изменить пароль при следующем входе + notice_new_password_must_be_different: Новый пароль должен отличаться от текущего + setting_mail_handler_excluded_filenames: Исключать вложения по имени + text_convert_available: Доступно использование ImageMagick (необязательно) + label_link: Ссылка + label_only: только + label_drop_down_list: выпадаюший список + label_checkboxes: чекбоксы + label_link_values_to: Значения ссылки для URL + setting_force_default_language_for_anonymous: Не определять язык для анонимных пользователей + setting_force_default_language_for_loggedin: Не определять язык для зарегистрированных пользователей + label_custom_field_select_type: Выберите тип объекта для которого будет создано настраиваемое поле + label_issue_assigned_to_updated: Исполнитель обновлен + label_check_for_updates: Проверить обновления + label_latest_compatible_version: Последняя совместимая версия + label_unknown_plugin: Неизвестный плагин + label_radio_buttons: radio buttons + label_group_anonymous: Анонимные пользователи + label_group_non_member: Не участвующие пользователи + label_add_projects: Добавить проекты + field_default_status: Статус по умолчанию + text_subversion_repository_note: 'Например: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Видимость пользователей + label_users_visibility_all: Все активные пользователи + label_users_visibility_members_of_visible_projects: Участники видимых проектов + label_edit_attachments: Редактировать прикреплённые файлы + setting_link_copied_issue: Связывать задачи при копировании + label_link_copied_issue: Связать скопированную задачу + label_ask: Спросить + label_search_attachments_yes: Искать в именах прикреплённых файлов и описаниях + label_search_attachments_no: Не искать в прикреплениях + label_search_attachments_only: Искать только в прикреплённых файлах + label_search_open_issues_only: Только в открытых задачах + field_address: Email + setting_max_additional_emails: Максимальное количество дополнительных email адресов + label_email_address_plural: Emails + label_email_address_add: Добавить email адрес + label_enable_notifications: Включить уведомления + label_disable_notifications: Выключить уведомления + setting_search_results_per_page: Количество найденных результатов на страницу + label_blank_value: пусто + permission_copy_issues: Копирование задач + error_password_expired: Время действия вашего пароля истекло или администратор потребовал сменить его. + field_time_entries_visibility: Видимость трудозатрат + setting_password_max_age: Требовать сменить пароль по истечении + label_parent_task_attributes: Атрибуты родительской задачи + label_parent_task_attributes_derived: С учётом подзадач + label_parent_task_attributes_independent: Без учёта подзадач + label_time_entries_visibility_all: Все трудозатраты + label_time_entries_visibility_own: Только собственные трудозатраты + label_member_management: Управление участниками + label_member_management_all_roles: Все роли + label_member_management_selected_roles_only: Только эти роли + label_password_required: Для продолжения введите свой пароль + label_total_spent_time: Всего затрачено времени + notice_import_finished: "%{count} элемент(а, ов) были импортированы" + notice_import_finished_with_errors: "%{count} из %{total} элемент(а, ов) не могут быть импортированы" + error_invalid_file_encoding: Кодировка файла не соответствует выбранной %{encoding} + error_invalid_csv_file_or_settings: Файл не является файлом CSV или не соответствует представленным настройкам + error_can_not_read_import_file: Во время чтения файла для импорта произошла ошибка + permission_import_issues: Импорт задач + label_import_issues: Импорт задач + label_select_file_to_import: Выберите файл для импорта + label_fields_separator: Разделитель + label_fields_wrapper: Ограничитель + label_encoding: Кодировка + label_comma_char: Запятая + label_semi_colon_char: Точка с запятой + label_quote_char: Кавычки + label_double_quote_char: Двойные кавычки + label_fields_mapping: Соответствие полей + label_file_content_preview: Предпросмотр содержимого файла + label_create_missing_values: Создать недостающие значения + button_import: Импорт + field_total_estimated_hours: Общая оценка временных затрат + label_api: API + label_total_plural: Итоги + label_assigned_issues: Назначенные задачи + label_field_format_enumeration: Список ключ/значение + label_f_hour_short: '%{value} ч' + field_default_version: Версия по умолчанию + error_attachment_extension_not_allowed: Расширение %{extension} запрещено + setting_attachment_extensions_allowed: Допустимые расширения + setting_attachment_extensions_denied: Запрещённые расширения + label_any_open_issues: любые открытые задачи + label_no_open_issues: нет открытых задач + label_default_values_for_new_users: Значения по умолчанию для новых пользователей + error_ldap_bind_credentials: Неправильная Учётная запись/Пароль LDAP + setting_sys_api_key: API ключ + setting_lost_password: Восстановление пароля + mail_subject_security_notification: Уведомление безопасности + mail_body_security_notification_change: ! '%{field} изменилось.' + mail_body_security_notification_change_to: ! '%{field} изменилось на %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} добавлено.' + mail_body_security_notification_remove: ! '%{field} %{value} удалено.' + mail_body_security_notification_notify_enabled: Email адрес %{value} сейчас получает + уведомления. + mail_body_security_notification_notify_disabled: Email адрес %{value} больше не + получает уведомления. + mail_body_settings_updated: ! 'Следующие настройки были изменены:' + field_remote_ip: IP адрес + label_wiki_page_new: Новая wiki-страница + label_relations: Связи + button_filter: Фильтр + mail_body_password_updated: Ваш пароль был изменён. + label_no_preview: Предпросмотр недоступен + error_no_tracker_allowed_for_new_issue_in_project: В проекте нет трекеров, + для которых можно создать задачу + label_tracker_all: Все трекеры + label_new_project_issue_tab_enabled: Отображать вкладку "Новая задача" + setting_new_item_menu_tab: Вкладка меню проекта для создания новых объектов + label_new_object_tab_enabled: Отображать выпадающий список "+" + error_no_projects_with_tracker_allowed_for_new_issue: Отсутствуют проекты, по трекерам которых вы можете создавать задачи + field_textarea_font: Шрифт для текстовых полей + label_font_default: Шрифт по умолчанию + label_font_monospace: Моноширинный шрифт + label_font_proportional: Пропорциональный шрифт + setting_timespan_format: Формат промежутка времени + label_table_of_contents: Содержание + setting_commit_logs_formatting: Использовать форматирование текста для комментариев хранилища + setting_mail_handler_enable_regex_delimiters: Использовать регулярные выражения + error_move_of_child_not_possible: 'Подзадача %{child} не может быть перемещена в новый + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Затраченное время не может быть переназначено на задачу, которая будет удалена + setting_timelog_required_fields: Обязательные поля для трудозатрат + label_attribute_of_object: '%{name} объекта %{object_name}' + label_user_mail_option_only_assigned: Только для объектов, которые я отслеживаю или которые мне назначены + label_user_mail_option_only_owner: Только для объектов, которые я отслеживаю или для которых я владелец + warning_fields_cleared_on_bulk_edit: Изменения приведут к удалению значений одного или нескольких полей выбранных объектов + field_updated_by: Кем изменено + field_last_updated_by: Последний изменивший + field_full_width_layout: Растягивать по ширине страницы + label_last_notes: Последние примечания + field_digest: Контрольная сумма + field_default_assigned_to: Назначать по умолчанию + setting_show_custom_fields_on_registration: Показывать настраиваемые поля при регистрации + permission_view_news: Просмотр новостей + label_no_preview_alternative_html: Предпросмотр недоступен. %{link} файл. + label_no_preview_download: Скачать diff --git a/config/locales/sk.yml b/config/locales/sk.yml new file mode 100644 index 0000000..bd3b977 --- /dev/null +++ b/config/locales/sk.yml @@ -0,0 +1,1220 @@ +# Slovak translation by Stanislav Pach | stano.pach@seznam.cz +# additions for Redmine 2.3.2 and proofreading by Katarína Nosková | noskova.katarina@gmail.com + +sk: + direction: ltr + date: + formats: + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Nedeľa, Pondelok, Utorok, Streda, Štvrtok, Piatok, Sobota] + abbr_day_names: [Ne, Po, Ut, St, Št, Pi, So] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Január, Február, Marec, Apríl, Máj, Jún, Júl, August, September, Október, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Máj, Jún, Júl, Aug, Sep, Okt, Nov, Dec] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "dopoludnia" + pm: "popoludní" + + datetime: + distance_in_words: + half_a_minute: "pol minúty" + less_than_x_seconds: + one: "menej ako 1 sekunda" + other: "menej ako %{count} sekúnd" + x_seconds: + one: "1 sekunda" + other: "%{count} sekúnd" + less_than_x_minutes: + one: "menej ako minúta" + other: "menej ako %{count} minút" + x_minutes: + one: "1 minúta" + other: "%{count} minút" + about_x_hours: + one: "približne 1 hodinu" + other: "približne %{count} hodín" + x_hours: + one: "1 hodina" + other: "%{count} hodín" + x_days: + one: "1 deň" + other: "%{count} dní" + about_x_months: + one: "približne 1 mesiac" + other: "približne %{count} mesiacov" + x_months: + one: "1 mesiac" + other: "%{count} mesiacov" + about_x_years: + one: "približne 1 rok" + other: "približne %{count} rokov" + over_x_years: + one: "viac ako 1 rok" + other: "viac ako %{count} rokov" + almost_x_years: + one: "takmer 1 rok" + other: "takmer %{count} rokov" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "a" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 chyba bráni uloženiu %{model}" + other: "%{count} chýb bráni uloženiu %{model}" + messages: + inclusion: "nie je zahrnuté v zozname" + exclusion: "nie je k dispozícii" + invalid: "je neplatné" + confirmation: "sa nezhoduje s potvrdením" + accepted: "musí byť akceptované" + empty: "nemôže byť prázdne" + blank: "nemôže byť prázdne" + too_long: "je príliš dlhé (maximálne %{count} znakov)" + too_short: "je príliš krátke (minimálne %{count} znakov)" + wrong_length: "má nesprávnu dĺžku (vyžaduje sa %{count} znakov)" + taken: "je už použité" + not_a_number: "nie je číslo" + not_a_date: "nie je platný dátum" + greater_than: "musí byť viac ako %{count}" + greater_than_or_equal_to: "musí byť viac alebo rovné %{count}" + equal_to: "musí byť rovné %{count}" + less_than: "musí byť menej ako %{count}" + less_than_or_equal_to: "musí byť menej alebo rovné %{count}" + odd: "musí byť nepárne" + even: "musí byť párne" + greater_than_start_date: "musí byť neskôr ako počiatočný dátum" + not_same_project: "nepatrí k rovnakému projektu" + circular_dependency: "Tento vzťah by vytvoril cyklickú závislosť" + cant_link_an_issue_with_a_descendant: "Nemožno prepojiť úlohu s niektorou z podúloh" + earlier_than_minimum_start_date: "nemôže byť skorší ako %{date} z dôvodu nadväznosti na predchádzajúce úlohy" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Vyberte + + general_text_No: 'Nie' + general_text_Yes: 'Áno' + general_text_no: 'nie' + general_text_yes: 'áno' + general_lang_name: 'Slovak (Slovenčina)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Účet bol úspešne zmenený. + notice_account_invalid_credentials: Nesprávne meno alebo heslo + notice_account_password_updated: Heslo bolo úspešne zmenené. + notice_account_wrong_password: Nesprávne heslo + notice_account_register_done: Účet bol úspešne vytvorený. Účet aktivujete kliknutím na odkaz v emaile, ktorý vám bol zaslaný na %{email}. + notice_account_unknown_email: Neznámy používateľ. + notice_can_t_change_password: Tento účet používa externú autentifikáciu. Nemôžete zmeniť heslo. + notice_account_lost_email_sent: Bol vám zaslaný email s inštrukciami, ako si nastaviť nové heslo. + notice_account_activated: Váš účet bol aktivovaný. Teraz se môžete prihlásiť. + notice_successful_create: Úspešne vytvorené. + notice_successful_update: Úspešne aktualizované. + notice_successful_delete: Úspešne odstránené. + notice_successful_connection: Úspešne pripojené. + notice_file_not_found: Stránka, ktorú se pokúšate zobraziť, neexistuje, alebo bola odstránená. + notice_locking_conflict: Údaje boli aktualizované iným používateľom. + notice_scm_error: Položka a/alebo revízia v repozitári neexistuje. + notice_not_authorized: Nemáte dostatočné oprávnenia na zobrazenie tejto stránky. + notice_email_sent: "Na adresu %{value} bol odoslaný email" + notice_email_error: "Pri odosielaní emailu sa vyskytla chyba (%{value})" + notice_feeds_access_key_reseted: Váš prístupový kľúč k Atomu bol resetovaný. + notice_failed_to_save_issues: "Nepodarilo sa uložiť %{count} úloh z %{total} vybraných: %{ids}." + notice_no_issue_selected: "Nebola vybraná žiadna úloha. Označte prosím úlohy, ktoré chcete upraviť." + notice_account_pending: "Váš účet bol vytvorený a čaká na schválenie administrátorom." + notice_default_data_loaded: Predvolená konfigurácia bola úspešne nahraná. + + error_can_t_load_default_data: "Predvolená konfigurácia nebola nahraná: %{value}" + error_scm_not_found: "Položka alebo revízia nebola v repozitári nájdená." + error_scm_command_failed: "Pri pokuse o prístup k repozitáru sa vyskytla chyba: %{value}" + error_issue_not_found_in_project: 'Úloha nebola nájdená, alebo nepatrí k tomuto projektu' + + mail_subject_lost_password: "Vaše heslo %{value}" + mail_body_lost_password: 'Na zmenu hesla kliknite na nasledujúci odkaz:' + mail_subject_register: "Aktivácia vášho účtu %{value}" + mail_body_register: 'Ak si želáte aktivovať váš účet, kliknite na nasledujúci odkaz:' + mail_body_account_information_external: "Môžete sa prihlásiť pomocou vášho účtu %{value}." + mail_body_account_information: Informácie o vašom účte + mail_subject_account_activation_request: "Požiadavka na aktiváciu účtu %{value}" + mail_body_account_activation_request: "Bol zaregistrovaný nový používateľ %{value}. Účet čaká na vaše schválenie:" + + + field_name: Meno + field_description: Popis + field_summary: Zhrnutie + field_is_required: Povinné pole + field_firstname: Meno + field_lastname: Priezvisko + field_mail: Email + field_filename: Súbor + field_filesize: Veľkosť + field_downloads: Stiahnuté + field_author: Autor + field_created_on: Vytvorené + field_updated_on: Aktualizované + field_field_format: Formát + field_is_for_all: Pre všetky projekty + field_possible_values: Možné hodnoty + field_regexp: Regulárny výraz + field_min_length: Minimálna dĺžka + field_max_length: Maximálna dĺžka + field_value: Hodnota + field_category: Kategória + field_title: Názov + field_project: Projekt + field_issue: Úloha + field_status: Stav + field_notes: Poznámky + field_is_closed: Úloha uzavretá + field_is_default: Predvolený stav + field_tracker: Front + field_subject: Predmet + field_due_date: Odovzdať do + field_assigned_to: Priradené + field_priority: Priorita + field_fixed_version: Cieľová verzia + field_user: Používateľ + field_role: Rola + field_homepage: Domovská stránka + field_is_public: Verejné + field_parent: Nadradený projekt + field_is_in_roadmap: Úlohy zobrazené v pláne + field_login: Prihlasovacie meno + field_mail_notification: Emailové upozornenie + field_admin: Administrátor + field_last_login_on: Posledné prihlásenie + field_language: Jazyk + field_effective_date: Dátum + field_password: Heslo + field_new_password: Nové heslo + field_password_confirmation: Potvrdenie hesla + field_version: Verzia + field_type: Typ + field_host: Host + field_port: Port + field_account: Účet + field_base_dn: Base DN + field_attr_login: Prihlásenie (atribút) + field_attr_firstname: Meno (atribút) + field_attr_lastname: Priezvisko (atribút) + field_attr_mail: Email (atribút) + field_onthefly: Okamžité vytváranie používateľov + field_start_date: Počiatočný dátum + field_done_ratio: "% hotovo" + field_auth_source: Autentifikačný mód + field_hide_mail: Nezobrazovať môj email + field_comments: Komentár + field_url: URL + field_start_page: Východzia stránka + field_subproject: Podprojekt + field_hours: Hodiny + field_activity: Aktivita + field_spent_on: Dátum + field_identifier: Identifikátor + field_is_filter: Použiť ako filter + field_issue_to: Súvisiaca úloha + field_delay: Oneskorenie + field_assignable: Úlohy môžu byť priradené tejto role + field_redirect_existing_links: Presmerovať existujúce odkazy + field_estimated_hours: Odhadovaný čas + field_column_names: Stĺpce + field_time_zone: Časové pásmo + field_searchable: Možné prehľadávanie + field_default_value: Predvolená hodnota + field_comments_sorting: Zobraziť komentáre + + setting_app_title: Názov aplikácie + setting_app_subtitle: Podtitulok aplikácie + setting_welcome_text: Uvítací text + setting_default_language: Predvolený jazyk + setting_login_required: Vyžadovaná autentifikácia + setting_self_registration: Povolená registrácia + setting_attachment_max_size: Maximálna veľkosť prílohy + setting_issues_export_limit: Maximálny počet úloh pri exporte + setting_mail_from: Odosielať emaily z adresy + setting_bcc_recipients: Príjemcov do skrytej kópie (bcc) + setting_host_name: Hostname a cesta + setting_text_formatting: Formátovanie textu + setting_wiki_compression: Kompresia histórie Wiki + setting_feeds_limit: Maximálny počet zobrazených položiek v Atom feed + setting_default_projects_public: Nové projekty nastavovať ako verejné + setting_autofetch_changesets: Automaticky vykonať commity + setting_sys_api_enabled: Povolit Webovú službu (WS) na správu repozitára + setting_commit_ref_keywords: Kľúčové slová pre referencie + setting_commit_fix_keywords: Kľúčové slová pre opravy + setting_autologin: Automatické prihlasovanie + setting_date_format: Formát dátumu + setting_time_format: Formát času + setting_cross_project_issue_relations: Povoliť prepojenia úloh naprieč projektmi + setting_issue_list_default_columns: Predvolené stĺpce zobrazené v zozname úloh + setting_emails_footer: Pätička emailu + setting_protocol: Protokol + setting_per_page_options: Povolené množstvo položiek na stránku + setting_user_format: Formát zobrazenia používateľa + setting_activity_days_default: "Počet zobrazených dní na stránku pri aktivitách projektu:" + setting_display_subprojects_issues: Predvolené zobrazovanie úloh podprojektov v hlavnom projekte + + project_module_issue_tracking: Sledovanie úloh + project_module_time_tracking: Sledovanie času + project_module_news: Novinky + project_module_documents: Dokumenty + project_module_files: Súbory + project_module_wiki: Wiki + project_module_repository: Repozitár + project_module_boards: Diskusné fóra + + label_user: Požívateľ + label_user_plural: Používatelia + label_user_new: Nový používateľ + label_project: Projekt + label_project_new: Nový projekt + label_project_plural: Projekty + label_x_projects: + zero: žiadne projekty + one: 1 projekt + other: "%{count} projektov" + label_project_all: Všetky projekty + label_project_latest: Posledné projekty + label_issue: Úloha + label_issue_new: Nová úloha + label_issue_plural: Úlohy + label_issue_view_all: Zobraziť všetky úlohy + label_issues_by: "Úlohy od používateľa %{value}" + label_issue_added: Úloha bola pridaná + label_issue_updated: Úloha bola aktualizovaná + label_document: Dokument + label_document_new: Nový dokument + label_document_plural: Dokumenty + label_document_added: Dokument bol pridaný + label_role: Rola + label_role_plural: Roly + label_role_new: Nová rola + label_role_and_permissions: Roly a oprávnenia + label_member: Člen + label_member_new: Nový člen + label_member_plural: Členovia + label_tracker: Front + label_tracker_plural: Fronty + label_tracker_new: Nový front + label_workflow: Pracovný postup (workflow) + label_issue_status: Stav úloh + label_issue_status_plural: Stavy úloh + label_issue_status_new: Nový stav + label_issue_category: Kategória úloh + label_issue_category_plural: Kategórie úloh + label_issue_category_new: Nová kategória + label_custom_field: Vlastné pole + label_custom_field_plural: Vlastné polia + label_custom_field_new: Nové pole + label_enumerations: Zoznamy + label_enumeration_new: Nová hodnota + label_information: Informácia + label_information_plural: Informácie + label_please_login: Prihláste sa prosím + label_register: Registrácia + label_password_lost: Zabudnuté heslo + label_home: Domov + label_my_page: Moja stránka + label_my_account: Môj účet + label_my_projects: Moje projekty + label_administration: Administrácia + label_login: Prihlásenie + label_logout: Odhlásenie + label_help: Pomoc + label_reported_issues: Nahlásené úlohy + label_assigned_to_me_issues: Moje úlohy + label_last_login: Posledné prihlásenie + label_registered_on: Dátum registrácie + label_activity: Aktivita + label_overall_activity: Celková aktivita + label_new: Nový + label_logged_as: Prihlásený ako + label_environment: Prostredie + label_authentication: Autentifikácia + label_auth_source: Autentifikačný mód + label_auth_source_new: Nový autentifikačný mód + label_auth_source_plural: Autentifikačné módy + label_subproject_plural: Podprojekty + label_min_max_length: Min. - max. dĺžka + label_list: Zoznam + label_date: Dátum + label_integer: Celé číslo + label_float: Desatinné číslo + label_boolean: Áno/Nie + label_string: Text + label_text: Dlhý text + label_attribute: Atribút + label_attribute_plural: Atribúty + label_no_data: Žiadne položky + label_change_status: Zmeniť stav + label_history: História + label_attachment: Súbor + label_attachment_new: Nový súbor + label_attachment_delete: Vymazať súbor + label_attachment_plural: Súbory + label_file_added: Súbor bol pridaný + label_report: Hlásenie + label_report_plural: Hlásenia + label_news: Novinky + label_news_new: Pridať novinku + label_news_plural: Novinky + label_news_latest: Posledné novinky + label_news_view_all: Zobraziť všetky novinky + label_news_added: Novinka bola pridaná + label_settings: Nastavenia + label_overview: Prehľad + label_version: Verzia + label_version_new: Nová verzia + label_version_plural: Verzie + label_confirmation: Potvrdenie + label_export_to: 'K dispozícii tiež ako:' + label_read: Načítava sa... + label_public_projects: Verejné projekty + label_open_issues: otvorená + label_open_issues_plural: otvorené + label_closed_issues: uzavretá + label_closed_issues_plural: uzavreté + label_x_open_issues_abbr: + zero: 0 otvorených + one: 1 otvorená + other: "%{count} otvorených" + label_x_closed_issues_abbr: + zero: 0 uzavretých + one: 1 uzavretá + other: "%{count} uzavretých" + label_total: Celkom + label_permissions: Oprávnenia + label_current_status: Aktuálny stav + label_new_statuses_allowed: Povolené nové stavy + label_all: všetko + label_none: nič + label_nobody: nikto + label_next: Ďalšie + label_previous: Predchádzajúce + label_used_by: Použité + label_details: Podrobnosti + label_add_note: Pridať poznámku + label_calendar: Kalendár + label_months_from: mesiacov od + label_gantt: Ganttov graf + label_internal: Interný + label_last_changes: "posledných %{count} zmien" + label_change_view_all: Zobraziť všetky zmeny + label_comment: Komentár + label_comment_plural: Komentáre + label_x_comments: + zero: žiadne komentáre + one: 1 komentár + other: "%{count} komentárov" + label_comment_add: Pridať komentár + label_comment_added: Komentár bol pridaný + label_comment_delete: Vymazať komentár + label_query: Vlastný filter + label_query_plural: Vlastné filtre + label_query_new: Nový filter vyhľadávania + label_filter_add: Pridať filter + label_filter_plural: Filtre + label_equals: je + label_not_equals: nie je + label_in_less_than: je menší ako + label_in_more_than: je väčší ako + label_in: v + label_today: dnes + label_all_time: vždy + label_yesterday: včera + label_this_week: tento týždeň + label_last_week: minulý týždeň + label_last_n_days: "v posledných %{count} dňoch" + label_this_month: tento mesiac + label_last_month: minulý mesiac + label_this_year: tento rok + label_date_range: Časový rozsah + label_less_than_ago: pred menej ako (dňami) + label_more_than_ago: pred viac ako (dňami) + label_ago: pred (dňami) + label_contains: obsahuje + label_not_contains: neobsahuje + label_day_plural: dní + label_repository: Repozitár + label_repository_plural: Repozitáre + label_browse: Prechádzať + label_revision: Revízia + label_revision_plural: Revízie + label_associated_revisions: Súvisiace revízie + label_added: pridané + label_modified: zmenené + label_deleted: vymazané + label_latest_revision: Posledná revízia + label_latest_revision_plural: Posledné revízie + label_view_revisions: Zobraziť revízie + label_max_size: Maximálna veľkosť + label_sort_highest: Presunúť na začiatok + label_sort_higher: Presunúť vyššie + label_sort_lower: Presunúť nižšie + label_sort_lowest: Presunúť na koniec + label_roadmap: Plán + label_roadmap_due_in: "Zostáva %{value}" + label_roadmap_overdue: "%{value} meškanie" + label_roadmap_no_issues: Pre túto verziu neexistujú žiadne úlohy + label_search: Hľadať + label_result_plural: Výsledky + label_all_words: Všetky slová + label_wiki: Wiki + label_wiki_edit: Wiki úprava + label_wiki_edit_plural: Wiki úpravy + label_wiki_page: Wiki stránka + label_wiki_page_plural: Wikistránky + label_index_by_title: Index podľa názvu + label_index_by_date: Index podľa dátumu + label_current_version: Aktuálna verzia + label_preview: Náhľad + label_feed_plural: Príspevky + label_changes_details: Detail všetkých zmien + label_issue_tracking: Sledovanie úloh + label_spent_time: Strávený čas + label_f_hour: "%{value} hodina" + label_f_hour_plural: "%{value} hodín" + label_time_tracking: Sledovanie času + label_change_plural: Zmeny + label_statistics: Štatistiky + label_commits_per_month: Commity za mesiac + label_commits_per_author: Commity podľa autora + label_view_diff: Zobraziť rozdiely + label_diff_inline: vo vnútri + label_diff_side_by_side: vedľa seba + label_options: Nastavenia + label_copy_workflow_from: Kopírovať pracovný postup (workflow) z + label_permissions_report: Prehľad oprávnení + label_watched_issues: Sledované úlohy + label_related_issues: Súvisiace úlohy + label_applied_status: Použitý stav + label_loading: Nahráva sa... + label_relation_new: Nové prepojenie + label_relation_delete: Odstrániť prepojenie + label_relates_to: Súvisiace s + label_duplicates: Duplikáty + label_blocks: Blokované + label_blocked_by: Zablokované používateľom + label_precedes: Predchádza + label_follows: Nasleduje po + label_stay_logged_in: Zostať prihlásený + label_disabled: zakázané + label_show_completed_versions: Ukázať dokončené verzie + label_me: ja + label_board: Fórum + label_board_new: Nové fórum + label_board_plural: Fóra + label_topic_plural: Témy + label_message_plural: Správy + label_message_last: Posledná správa + label_message_new: Nová správa + label_message_posted: Správa bola pridaná + label_reply_plural: Odpovede + label_send_information: Zaslať informácie o účte používateľa + label_year: Rok + label_month: Mesiac + label_week: Týždeň + label_date_from: Od + label_date_to: Do + label_language_based: Podľa jazyka používateľa + label_sort_by: "Zoradenie podľa %{value}" + label_send_test_email: Poslať testovací email + label_feeds_access_key_created_on: "Prístupový kľúč pre Atom bol vytvorený pred %{value}" + label_module_plural: Moduly + label_added_time_by: "Pridané používateľom %{author} pred %{age}" + label_updated_time: "Aktualizované pred %{value}" + label_jump_to_a_project: Prejsť na projekt... + label_file_plural: Súbory + label_changeset_plural: Súbory zmien + label_default_columns: Predvolené stĺpce + label_no_change_option: (bez zmeny) + label_bulk_edit_selected_issues: Hromadná úprava vybraných úloh + label_theme: Téma + label_default: Predvolené + label_search_titles_only: Vyhľadávať iba v názvoch + label_user_mail_option_all: "Pre všetky udalosti všetkých mojich projektov" + label_user_mail_option_selected: "Pre všetky udalosti vybraných projektov..." + label_user_mail_no_self_notified: "Nezasielať informácie o mnou vytvorených zmenách" + label_registration_activation_by_email: aktivácia účtu emailom + label_registration_manual_activation: manuálna aktivácia účtu + label_registration_automatic_activation: automatická aktivácia účtu + label_display_per_page: "%{value} na stránku" + label_age: Vek + label_change_properties: Zmeniť vlastnosti + label_general: Všeobecné + label_scm: SCM + label_plugins: Pluginy + label_ldap_authentication: Autentifikácia LDAP + label_downloads_abbr: D/L + label_optional_description: Voliteľný popis + label_add_another_file: Pridať ďalší súbor + label_preferences: Nastavenia + label_chronological_order: V chronologickom poradí + label_reverse_chronological_order: V obrátenom chronologickom poradí + + button_login: Prihlásiť + button_submit: Potvrdiť + button_save: Uložiť + button_check_all: Označiť všetko + button_uncheck_all: Zrušiť výber + button_delete: Odstrániť + button_create: Vytvoriť + button_test: Test + button_edit: Upraviť + button_add: Pridať + button_change: Zmeniť + button_apply: Použiť + button_clear: Späť na pôvodné + button_lock: Uzamknúť + button_unlock: Odomknúť + button_download: Stiahnuť + button_list: Vypísať + button_view: Zobraziť + button_move: Presunúť + button_back: Späť + button_cancel: Zrušiť + button_activate: Aktivovať + button_sort: Zoradiť + button_log_time: Pridať časový záznam + button_rollback: Naspäť na túto verziu + button_watch: Sledovať + button_unwatch: Nesledovať + button_reply: Odpovedať + button_archive: Archivovať + button_unarchive: zrušiť archiváciu + button_reset: Resetovať + button_rename: Premenovať + button_change_password: Zmeniť heslo + button_copy: Kopírovať + button_annotate: Komentovať + button_update: Aktualizovať + button_configure: Konfigurovať + + status_active: aktívny + status_registered: zaregistrovaný + status_locked: uzamknutý + + text_select_mail_notifications: Vyberte akciu, pri ktorej bude zaslané upozornenie emailom. + text_regexp_info: napr. ^[A-Z0-9]+$ + text_min_max_length_info: 0 znamená bez limitu + text_project_destroy_confirmation: Naozaj si želáte odstrániť tento projekt a všetky súvisiace údaje? + text_workflow_edit: Vyberte rolu a front na úpravu pracovného postupu (workflow) + text_are_you_sure: Naozaj si želáte vykonať túto akciu? + text_tip_issue_begin_day: úloha začína v tento deň + text_tip_issue_end_day: úloha končí v tento deň + text_tip_issue_begin_end_day: úloha začína a končí v tento deň + text_caracters_maximum: "Maximálne %{count} znakov." + text_caracters_minimum: "Dĺžka musí byť minimálne %{count} znakov." + text_length_between: "Dĺžka medzi %{min} až %{max} znakmi." + text_tracker_no_workflow: Pre tento front nie je definovaný žiadny pracovný postup (workflow) + text_unallowed_characters: Nepovolené znaky + text_comma_separated: Je povolených viacero hodnôt (navzájom oddelené čiarkou). + text_issues_ref_in_commit_messages: Referencie a opravy úloh v commitoch + text_issue_added: "úloha %{id} bola vytvorená používateľom %{author}." + text_issue_updated: "Úloha %{id} bola aktualizovaná používateľom %{author}." + text_wiki_destroy_confirmation: Naozaj si želáte vymazať túto Wiki a celý jej obsah? + text_issue_category_destroy_question: "Do tejto kategórie je zaradených niekoľko úloh (%{count}). Čo si želáte s nimi urobiť?" + text_issue_category_destroy_assignments: Zrušiť zaradenie do kategórie + text_issue_category_reassign_to: Preradiť úlohy do tejto kategórie + text_user_mail_option: "Pri projektoch, ktoré neboli vybrané, budete dostávať upozornenia týkajúce sa iba vašich alebo vami sledovaných vecí (napr. vecí, ktorých ste autor, alebo ku ktorým ste priradení)." + text_no_configuration_data: "Roly, fronty, stavy úloh ani pracovné postupy (workflow) neboli zatiaľ nakonfigurované.\nOdporúčame vám nahrať predvolenú konfiguráciu. Následne môžete všetky nastavenia upraviť." + text_load_default_configuration: Nahrať predvolenú konfiguráciu + text_status_changed_by_changeset: "Aplikované v súbore zmien %{value}." + text_issues_destroy_confirmation: 'Naozaj si želáte odstrániť všetky vybrané úlohy?' + text_select_project_modules: 'Vybrať moduly povolené v tomto projekte:' + text_default_administrator_account_changed: Predvolené nastavenie administrátorského účtu bolo zmenené + text_file_repository_writable: Povolený zápis do priečinka s prílohami + text_rmagick_available: RMagick k dispozícii (voliteľné) + text_destroy_time_entries_question: Pri úlohách, ktoré chcete odstrániť, je zaznamenaných %{hours} hodín práce. Čo si želáte urobiť? + text_destroy_time_entries: Odstrániť zaznamenané hodiny + text_assign_time_entries_to_project: Priradiť zaznamenané hodiny k projektu + text_reassign_time_entries: 'Preradiť zaznamenané hodiny k tejto úlohe:' + + default_role_manager: Manažér + default_role_developer: Vývojár + default_role_reporter: Reportér + default_tracker_bug: Chyba + default_tracker_feature: Funkcionalita + default_tracker_support: Podpora + default_issue_status_new: Nová + default_issue_status_in_progress: Rozpracovaná + default_issue_status_resolved: Vyriešená + default_issue_status_feedback: Čaká na odsúhlasenie + default_issue_status_closed: Uzavretá + default_issue_status_rejected: Odmietnutá + default_doc_category_user: Používateľská dokumentácia + default_doc_category_tech: Technická dokumentácia + default_priority_low: Nízká + default_priority_normal: Normálna + default_priority_high: Vysoká + default_priority_urgent: Urgentná + default_priority_immediate: Okamžitá + default_activity_design: Dizajn + default_activity_development: Vývoj + + enumeration_issue_priorities: Priority úloh + enumeration_doc_categories: Kategórie dokumentov + enumeration_activities: Aktivity (sledovanie času) + error_scm_annotate: "Položka neexistuje, alebo nemôže byť komentovaná." + text_subprojects_destroy_warning: "Jeho podprojekty: %{value} budú tiež vymazané." + label_and_its_subprojects: "%{value} a jeho podprojekty" + mail_body_reminder: "Nasledovné úlohy (%{count}), ktoré sú vám priradené, majú byť hotové za %{days} dní:" + mail_subject_reminder: "%{count} úlohy majú byť hotové za %{days} dní" + text_user_wrote: "Používateľ %{value} napísal:" + label_duplicated_by: Duplikoval + setting_enabled_scm: Povolené SCM + text_enumeration_category_reassign_to: 'Prenastaviť na túto hodnotu:' + text_enumeration_destroy_question: "%{count} objektov je nastavených na túto hodnotu." + label_incoming_emails: Prichádzajúce emaily + label_generate_key: Vygenerovať kľúč + setting_mail_handler_api_enabled: Zapnúť Webovú službu (WS) pre prichádzajúce emaily + setting_mail_handler_api_key: API kľúč + text_email_delivery_not_configured: "Doručovanie emailov nie je nastavené, notifikácie sú vypnuté.\nNastavte váš SMTP server v config/configuration.yml a reštartujte aplikáciu, čím funkciu aktivujete." + field_parent_title: Nadradená stránka + label_issue_watchers: Pozorovatelia + button_quote: Citácia + setting_sequential_project_identifiers: Generovať sekvenčné identifikátory projektov + notice_unable_delete_version: Verzia nemôže byť zmazaná. + label_renamed: premenované + label_copied: kopírované + setting_plain_text_mail: Len jednoduchý text (bez HTML) + permission_view_files: Zobrazenie súborov + permission_edit_issues: Úprava úloh + permission_edit_own_time_entries: Úprava vlastných záznamov o strávenom čase + permission_manage_public_queries: Správa verejných filtrov vyhľadávania + permission_add_issues: Pridávanie úloh + permission_log_time: Zaznamenávanie stráveného času + permission_view_changesets: Zobrazenie súborov zmien + permission_view_time_entries: Zobrazenie stráveného času + permission_manage_versions: Správa verzií + permission_manage_wiki: Správa Wiki + permission_manage_categories: Správa kategórií úloh + permission_protect_wiki_pages: Ochrana wikistránok + permission_comment_news: Komentovanie noviniek + permission_delete_messages: Mazanie správ + permission_select_project_modules: Voľba projektových modulov + permission_edit_wiki_pages: Úprava wikistránok + permission_add_issue_watchers: Pridávanie pozorovateľov + permission_view_gantt: Zobrazenie Ganttovho grafu + permission_move_issues: Presun úloh + permission_manage_issue_relations: Správa prepojení medzi úlohami + permission_delete_wiki_pages: Mazanie wikistránok + permission_manage_boards: Správa diskusií + permission_delete_wiki_pages_attachments: Mazanie wikipríloh + permission_view_wiki_edits: Zobrazenie wikiúprav + permission_add_messages: Pridávanie správ + permission_view_messages: Zobrazenie správ + permission_manage_files: Správa súborov + permission_edit_issue_notes: Úprava poznámok úlohy + permission_manage_news: Správa noviniek + permission_view_calendar: Zobrazenie kalendára + permission_manage_members: Správa členov + permission_edit_messages: Úprava správ + permission_delete_issues: Mazanie správ + permission_view_issue_watchers: Zobrazenie zoznamu pozorovateľov + permission_manage_repository: Správa repozitára + permission_commit_access: Prístup ku commitom + permission_browse_repository: Prechádzanie repozitára + permission_view_documents: Zobrazenie dokumentov + permission_edit_project: Úprava projektu + permission_add_issue_notes: Pridanie poznámky k úlohe + permission_save_queries: Ukladanie filtrov vyhľadávania + permission_view_wiki_pages: Zobrazenie wikistránok + permission_rename_wiki_pages: Premenovanie wikistránok + permission_edit_time_entries: Úprava záznamov o strávenom čase + permission_edit_own_issue_notes: Úprava vlastných poznámok k úlohe + setting_gravatar_enabled: Používať používateľské Gravatar ikonky + permission_edit_own_messages: Úprava vlastných správ + permission_delete_own_messages: Mazanie vlastných správ + text_repository_usernames_mapping: "Vyberte alebo aktualizujte priradenie používateľov systému Redmine k menám používateľov nájdených v logu repozitára.\nPoužívatelia s rovnakým prihlasovacím menom alebo emailom v systéme Redmine a repozitári sú priradení automaticky." + label_example: Príklad + label_user_activity: "Aktivita používateľa %{value}" + label_updated_time_by: "Aktualizované používateľom %{author} pred %{age}" + text_diff_truncated: '...Tento výpis rozdielov bol skrátený, pretože prekračuje maximálny počet riadkov, ktorý môže byť zobrazený.' + setting_diff_max_lines_displayed: Maximálny počet zobrazených riadkov výpisu rozdielov + text_plugin_assets_writable: Povolený zápis do priečinka pre pluginy + warning_attachments_not_saved: "%{count} súborov nemohlo byť uložených." + field_editable: Editovateľné + label_display: Zobrazenie + button_create_and_continue: Vytvoriť a pokračovať + text_custom_field_possible_values_info: 'Každá hodnota na samostatný riadok' + setting_repository_log_display_limit: Maximálny počet revízií zobrazených v log súbore + setting_file_max_size_displayed: Maximálna veľkosť textových súborov zobrazených priamo na stránke + field_watcher: Pozorovatelia + setting_openid: Povoliť prihlasovanie a registráciu pomocou OpenID + field_identity_url: OpenID URL + label_login_with_open_id_option: alebo sa prihlásiť pomocou OpenID + field_content: Obsah + label_descending: Zostupne + label_sort: Zoradenie + label_ascending: Vzostupne + label_date_from_to: Od %{start} do %{end} + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + text_wiki_page_destroy_question: Táto stránka má %{descendants} podstránok a potomkov. Čo si želáte urobiť? + text_wiki_page_reassign_children: Preradiť podstránky k tejto nadradenej stránke + text_wiki_page_nullify_children: Zachovať podstránky ako hlavné stránky + text_wiki_page_destroy_children: Vymazať podstránky a všetkých ich potomkov + setting_password_min_length: Minimálna dĺžka hesla + field_group_by: Zoskupiť výsledky podľa + mail_subject_wiki_content_updated: "Wikistránka '%{id}' bola aktualizovaná" + label_wiki_content_added: Wikistránka bola pridaná + mail_subject_wiki_content_added: "Bola pridaná wikistránka '%{id}'" + mail_body_wiki_content_added: Používateľ %{author} pridal wikistránku '%{id}'. + permission_add_project: Vytvorenie projektu + label_wiki_content_updated: Wikistránka bola aktualizovaná + mail_body_wiki_content_updated: Používateľ %{author} aktualizoval wikistránku '%{id}'. + setting_new_project_user_role_id: Rola non-admin používateľa, ktorý vytvorí projekt + label_view_all_revisions: Zobraziť všetky revízie + label_tag: Štítok + label_branch: Vetva + error_no_tracker_in_project: K tomuto projektu nie je priradený žiadny front. Skontrolujte prosím nastavenia projektu. + error_no_default_issue_status: Nie je definovaný predvolený stav úlohy. Skontrolujte prosím vašu konfiguráciu (choďte na "Administrácia -> Stavy úloh"). + text_journal_changed: "%{label} bolo zmenené z %{old} na %{new}" + text_journal_set_to: "%{label} bolo nastavené na %{value}" + text_journal_deleted: "%{label} bolo vymazané (%{old})" + label_group_plural: Skupiny + label_group: Skupina + label_group_new: Nová skupina + label_time_entry_plural: Strávený čas + text_journal_added: "%{label} %{value} bolo pridané" + field_active: Aktívne + enumeration_system_activity: Aktivita systému + permission_delete_issue_watchers: Odstránenie pozorovateľov + version_status_closed: uzavreté + version_status_locked: uzamknuté + version_status_open: otvorené + error_can_not_reopen_issue_on_closed_version: Nemožno opäť otvoriť úlohu, ktorá bola priradená uzavretej verzii + label_user_anonymous: Anonym + button_move_and_follow: Presunúť a sledovať + setting_default_projects_modules: Predvolené povolené moduly pre nové projekty + setting_gravatar_default: Predvolený Gravatar obrázok + field_sharing: Zdieľanie + label_version_sharing_hierarchy: S hierarchiou projektu + label_version_sharing_system: So všetkými projektmi + label_version_sharing_descendants: S podprojektmi + label_version_sharing_tree: S projektovým stromom + label_version_sharing_none: Nezdieľané + error_can_not_archive_project: Tento projekt nemôže byť archivovaný + button_duplicate: Duplikovať + button_copy_and_follow: Kopírovať a sledovať + label_copy_source: Zdroj + setting_issue_done_ratio: Vyrátať mieru vypracovania úlohy pomocou + setting_issue_done_ratio_issue_status: Použiť stav úlohy + error_issue_done_ratios_not_updated: Stav vypracovania úlohy nebol aktualizovaný. + error_workflow_copy_target: Vyberte prosím jednu alebo viaceré cieľové fronty a roly + setting_issue_done_ratio_issue_field: Použiť pole úlohy + label_copy_same_as_target: Rovnaké ako cieľ + label_copy_target: Cieľ + notice_issue_done_ratios_updated: Stav vypracovania úlohy bol aktualizovaný. + error_workflow_copy_source: Vyberte prosím zdrojový front alebo rolu + label_update_issue_done_ratios: Aktualizovať stav vypracovania úlohy + setting_start_of_week: Pracovný týždeň začína v + permission_view_issues: Zobrazenie úloh + label_display_used_statuses_only: Zobraziť len stavy, ktoré sú priradené k tomuto frontu + label_revision_id: "Revízia %{value}" + label_api_access_key: Prístupový kľúč API + label_api_access_key_created_on: "Prístupový kľúč API bol vytvorený pred %{value}" + label_feeds_access_key: Prístupový kľúč Atom + notice_api_access_key_reseted: Váš prístupový kľúč API bol resetovaný. + setting_rest_api_enabled: Zapnúť webovú službu REST + label_missing_api_access_key: Prístupový kľuč API nenájdený + label_missing_feeds_access_key: Prístupový kľúč Atom nenájdený + button_show: Zobraziť + text_line_separated: Je povolené zadať viaceré hodnoty (každú hodnotu na samostatný riadok). + setting_mail_handler_body_delimiters: "Orezať emaily po jednom z nasledovných riadkov" + permission_add_subprojects: Vytváranie podprojektov + label_subproject_new: Nový podprojekt + text_own_membership_delete_confirmation: "Pokúšate sa odstrániť niektoré alebo všetky svoje prístupové práva a je možné, že už nebudete mať možnosť naďalej upravovať tento projekt.\nNaozaj si želáte pokračovať?" + label_close_versions: Uzavrieť dokončené verzie + label_board_sticky: Dôležité + label_board_locked: Uzamknuté + permission_export_wiki_pages: Export wikistránok + setting_cache_formatted_text: Uložiť formátovaný text do vyrovnávacej pamäte + permission_manage_project_activities: Správa aktivít projektu + error_unable_delete_issue_status: 'Nie je možné vymazať stav úlohy' + label_profile: Profil + permission_manage_subtasks: Správa podúloh + field_parent_issue: Nadradená úloha + label_subtask_plural: Podúlohy + label_project_copy_notifications: Zaslať emailové upozornenie počas kopírovania projektu + error_can_not_delete_custom_field: Nie je možné vymazať vlastné pole + error_unable_to_connect: Nie je možné sa pripojiť (%{value}) + error_can_not_remove_role: "Táto rola sa používa a nemôže byť vymazaná." + error_can_not_delete_tracker: "Tento front obsahuje úlohy a nemôže byť vymazaný." + field_principal: Objednávateľ + notice_failed_to_save_members: "Nepodarilo sa uložiť členov: %{errors}." + text_zoom_out: Oddialiť + text_zoom_in: Priblížiť + notice_unable_delete_time_entry: Nie je možné vymazať časový záznam. + label_overall_spent_time: Celkový strávený čas + field_time_entries: Zaznamenaný čas + project_module_gantt: Ganttov graf + project_module_calendar: Kalendár + button_edit_associated_wikipage: "Upraviť súvisiacu wikistránku: %{page_title}" + field_text: Textové pole + setting_default_notification_option: Predvolené nastavenie upozornení + label_user_mail_option_only_my_events: Len pre veci, ktoré sledujem, alebo v ktorých som zapojený + label_user_mail_option_none: "Žiadne udalosti" + field_member_of_group: "Skupina priradeného používateľa" + field_assigned_to_role: "Rola priradeného používateľa" + notice_not_authorized_archived_project: Projekt, ku ktorému sa snažíte pristupovať, bol archivovaný. + label_principal_search: "Hľadať používateľa alebo skupinu:" + label_user_search: "Hľadať používateľa:" + field_visible: Viditeľné + setting_commit_logtime_activity_id: Aktivita pre zaznamenaný čas + text_time_logged_by_changeset: "Aplikované v súbore zmien %{value}." + setting_commit_logtime_enabled: Povoliť zaznamenávanie času + notice_gantt_chart_truncated: "Graf bol skrátený, pretože bol prekročený maximálny povolený počet zobrazených položiek (%{max})" + setting_gantt_items_limit: Maximálny počet položiek zobrazených na Ganttovom grafe + field_warn_on_leaving_unsaved: "Varovať ma, keď opúšťam stránku s neuloženým textom" + text_warn_on_leaving_unsaved: "Stránka, ktorú sa chystáte opustiť, obsahuje neuložený obsah. Ak stránku opustíte, neuložený obsah bude stratený." + label_my_queries: Moje filtre vyhľadávania + text_journal_changed_no_detail: "%{label} bolo aktualizované" + label_news_comment_added: Komentár k novinke bol pridaný + button_expand_all: Rozbaliť všetko + button_collapse_all: Zbaliť všetko + label_additional_workflow_transitions_for_assignee: Ďalšie zmeny stavu sú povolené, len ak je používateľ priradený + label_additional_workflow_transitions_for_author: Ďalšie zmeny stavu sú povolené, len ak je používateľ autorom + label_bulk_edit_selected_time_entries: Hromadne upraviť vybrané časové záznamy + text_time_entries_destroy_confirmation: 'Naozaj si želáte vymazať vybrané časové záznamy?' + label_role_anonymous: Anonymný + label_role_non_member: Nie je členom + label_issue_note_added: Poznámka bola pridaná + label_issue_status_updated: Stav bol aktualizovaný + label_issue_priority_updated: Priorita bola aktualizovaná + label_issues_visibility_own: Úlohy od používateľa alebo priradené používateľovi + field_issues_visibility: Viditeľnosť úloh + label_issues_visibility_all: Všetky úlohy + permission_set_own_issues_private: Nastavenie vlastných úloh ako verejné alebo súkromné + field_is_private: Súkromné + permission_set_issues_private: Nastavenie úloh ako verejné alebo súkromné + label_issues_visibility_public: Všetky úlohy, ktoré nie sú súkromné + text_issues_destroy_descendants_confirmation: "Týmto krokom vymažate aj %{count} podúloh." + field_commit_logs_encoding: Kódovanie komentárov ku kommitom + field_scm_path_encoding: Kódovanie cesty SCM + text_scm_path_encoding_note: "Predvolené: UTF-8" + field_path_to_repository: Cesta k repozitáru + field_root_directory: Koreňový adresár + field_cvs_module: Modul + field_cvsroot: CVSROOT + text_mercurial_repository_note: Lokálny repozitár (napr. /hgrepo, c:\hgrepo) + text_scm_command: Príkaz + text_scm_command_version: Verzia + label_git_report_last_commit: Hlásiť posledný commit pre súbory a priečinky + notice_issue_successful_create: "Úloha %{id} bola vytvorená." + label_between: medzi + setting_issue_group_assignment: Povoliť priradenie úlohy skupine + label_diff: rozdiely + text_git_repository_note: Repozitár je iba jeden a je lokálny (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Smer triedenia + description_project_scope: Rozsah vyhľadávania + description_filter: Filter + description_user_mail_notification: Nastavenia upozornení emailom + description_message_content: Obsah správy + description_available_columns: Dostupné stĺpce + description_issue_category_reassign: Vybrať kategóriu úlohy + description_search: Vyhľadávanie + description_notes: Poznámky + description_choose_project: Projekty + description_query_sort_criteria_attribute: Atribút triedenia + description_wiki_subpages_reassign: Vybrať novú nadradenú stránku + description_selected_columns: Vybrané stĺpce + label_parent_revision: Rodič + label_child_revision: Potomok + error_scm_annotate_big_text_file: "Komentár nemohol byť pridaný, pretože bola prekročená maximálna povolená veľkosť textového súboru." + setting_default_issue_start_date_to_creation_date: Použiť aktuálny dátum ako počiatočný dátum pri nových úlohách + button_edit_section: Upraviť túto sekciu + setting_repositories_encodings: Kódovania pre prílohy a repozitáre + description_all_columns: Všetky stĺpce + button_export: Export + label_export_options: "Nastavenia exportu do %{export_format}" + error_attachment_too_big: "Súbor nemožno nahrať, pretože prekračuje maximálnu povolenú veľkosť súboru (%{max_size})" + notice_failed_to_save_time_entries: "%{count} časových záznamov z %{total} vybraných nebolo uložených: %{ids}." + label_x_issues: + zero: 0 úloh + one: 1 úloha + other: "%{count} úloh" + label_repository_new: Nový repozitár + field_repository_is_default: Hlavný repozitár + label_copy_attachments: Kopírovať prílohy + label_item_position: "%{position} z %{count}" + label_completed_versions: Dokončené verzie + text_project_identifier_info: 'Sú povolené iba malé písmená (a-z), čísla, pomlčky a podčiarkovníky. Identifikátor musí začínať malým písmenom.
    Po uložení už nie je možné identifikátor zmeniť.' + field_multiple: Viacero hodnôt + setting_commit_cross_project_ref: Povoliť referencie a opravy úloh všetkých ostatných projektov + text_issue_conflict_resolution_add_notes: Pridať moje poznámky a zahodiť ostatné moje zmeny + text_issue_conflict_resolution_overwrite: "Napriek tomu aplikovať moje zmeny (predchádzajúce poznámky budú zachované, ale niektoré zmeny môžu byť prepísané)" + notice_issue_update_conflict: "Počas vašich úprav bola úloha aktualizovaná iným používateľom." + text_issue_conflict_resolution_cancel: "Zahodiť všetky moje zmeny a znovu zobraziť %{link}" + permission_manage_related_issues: Správa súvisiacich úloh + field_auth_source_ldap_filter: Filter LDAP + label_search_for_watchers: Hľadať pozorovateľov, ktorých chcete pridať + notice_account_deleted: "Váš účet bol natrvalo vymazaný." + setting_unsubscribe: Povoliť používateľom vymazať svoj vlastný účet + button_delete_my_account: Vymazať môj účet + text_account_destroy_confirmation: "Naozaj si želáte pokračovať?\nVáš účet bude natrvalo vymazaný, bez možnosti obnovenia." + error_session_expired: "Vaša relácia vypršala. Prihláste sa prosím znovu." + text_session_expiration_settings: "Varovanie: zmenou týchto nastavení môžu vypršať aktuálne relácie vrátane vašej." + setting_session_lifetime: Maximálny čas relácie + setting_session_timeout: Vypršanie relácie pri neaktivite + label_session_expiration: Vypršanie relácie + permission_close_project: Uzavretie / opätovné otvorenie projektu + label_show_closed_projects: Zobraziť uzavreté projekty + button_close: Uzavrieť + button_reopen: Opäť otvoriť + project_status_active: aktívny + project_status_closed: uzavretý + project_status_archived: archivovaný + text_project_closed: Tento projekt je uzavretý a prístupný iba na čítanie. + notice_user_successful_create: "Používateľ %{id} bol vytvorený." + field_core_fields: Štandardné polia + field_timeout: "Vypršanie (v sekundách)" + setting_thumbnails_enabled: Zobraziť miniatúry príloh + setting_thumbnails_size: Veľkosť miniatúry (v pixeloch) + label_status_transitions: Zmeny stavu + label_fields_permissions: Oprávnenia k poliam + label_readonly: Iba na čítanie + label_required: Povinné + text_repository_identifier_info: 'Sú povolené iba malé písmená (a-z), čísla, pomlčky a podčiarkovníky.
    Po uložení už nie je možné identifikátor zmeniť.' + field_board_parent: Nadradené fórum + label_attribute_of_project: "%{name} projektu" + label_attribute_of_author: "%{name} autora" + label_attribute_of_assigned_to: "%{name} priradeného používateľa" + label_attribute_of_fixed_version: "%{name} cieľovej verzie" + label_copy_subtasks: Kopírovať podúlohy + label_copied_to: Skopírované do + label_copied_from: Skopírované z + label_any_issues_in_project: všetky úlohy projektu + label_any_issues_not_in_project: všetky úlohy nepatriace do projektu + field_private_notes: Súkromné poznámky + permission_view_private_notes: Zobrazenie súkromných poznámok + permission_set_notes_private: Nastavenie poznámok ako súkromné + label_no_issues_in_project: žiadne úlohy projektu + label_any: všetko + label_last_n_weeks: "posledných %{count} týždňov" + setting_cross_project_subtasks: Povoliť podúlohy naprieč projektmi + label_cross_project_descendants: S podprojektmi + label_cross_project_tree: S projektovým stromom + label_cross_project_hierarchy: S hierarchiou projektu + label_cross_project_system: So všetkými projektmi + button_hide: Skryť + setting_non_working_week_days: Dni voľna + label_in_the_next_days: počas nasledujúcich + label_in_the_past_days: počas minulých + label_attribute_of_user: "%{name} používateľa" + text_turning_multiple_off: "Ak zakážete výber viacerých hodnôt, polia s výberom viacerých hodnôt budú vyčistené. Tým sa zaistí, aby bola pre každé pole vybraná vždy len jedna hodnota." + label_attribute_of_issue: "%{name} úlohy" + permission_add_documents: Pridávanie dokumentov + permission_edit_documents: Úprava dokumentov + permission_delete_documents: Mazanie dokumentov + label_gantt_progress_line: Indikátor napredovania + setting_jsonp_enabled: Povoliť podporu JSONP + field_inherit_members: Zdediť členov + field_closed_on: Uzavreté + field_generate_password: Vygenerovať heslo + setting_default_projects_tracker_ids: Predvolené fronty pri nových projektoch + label_total_time: Celkový čas + text_scm_config: Svoje príkazy SCM môžete konfigurovať v súbore config/configuration.yml. Po jeho úprave prosím reštartujte aplikáciu. + text_scm_command_not_available: Príkaz SCM nie je k dispozícii. Skontrolujte prosím nastavenia na administračnom paneli. + setting_emails_header: Hlavička emailu + notice_account_not_activated_yet: Váš účet ešte nebol aktivovaný. Ak potrebujete zaslať nový aktivačný email, kliknite prosím na tento odkaz. + notice_account_locked: Váš účet je uzamknutý. + label_hidden: Skryté + label_visibility_private: iba pre mňa + label_visibility_roles: iba pre tieto roly + label_visibility_public: pre všetkých používateľov + field_must_change_passwd: Pri najbližšom prihlásení je potrebné zmeniť heslo + notice_new_password_must_be_different: Nové heslo nesmie byť rovnaké ako súčasné heslo + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Celkový strávený čas + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API kľúč + setting_lost_password: Zabudnuté heslo + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/sl.yml b/config/locales/sl.yml new file mode 100644 index 0000000..672dd59 --- /dev/null +++ b/config/locales/sl.yml @@ -0,0 +1,1230 @@ +sl: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d.%m.%Y" + short: "%d. %b" + long: "%d. %B, %Y" + + day_names: [Nedelja, Ponedeljek, Torek, Sreda, Četrtek, Petek, Sobota] + abbr_day_names: [Ned, Pon, To, Sr, Čet, Pet, Sob] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, Januar, Februar, Marec, April, Maj, Junij, Julij, Avgust, September, Oktober, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Aug, Sep, Okt, Nov, Dec] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d. %b, %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d. %b %H:%M" + long: "%d. %B, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "pol minute" + less_than_x_seconds: + one: "manj kot 1. sekundo" + other: "manj kot %{count} sekund" + x_seconds: + one: "1. sekunda" + other: "%{count} sekund" + less_than_x_minutes: + one: "manj kot minuto" + other: "manj kot %{count} minut" + x_minutes: + one: "1 minuta" + other: "%{count} minut" + about_x_hours: + one: "okrog 1. ure" + other: "okrog %{count} ur" + x_hours: + one: "1 ura" + other: "%{count} ur" + x_days: + one: "1 dan" + other: "%{count} dni" + about_x_months: + one: "okrog 1. mesec" + other: "okrog %{count} mesecev" + x_months: + one: "1 mesec" + other: "%{count} mesecev" + about_x_years: + one: "okrog 1. leto" + other: "okrog %{count} let" + over_x_years: + one: "več kot 1. leto" + other: "več kot %{count} let" + almost_x_years: + one: "skoraj 1. leto" + other: "skoraj %{count} let" + + number: + format: + separator: "," + delimiter: "." + precision: 3 + human: + format: + precision: 3 + delimiter: "" + storage_units: + format: "%n %u" + units: + kb: KB + tb: TB + gb: GB + byte: + one: Byte + other: Bytes + mb: MB + +# Used in array.to_sentence. + support: + array: + sentence_connector: "in" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1. napaka je preprečila temu %{model} da bi se shranil" + other: "%{count} napak je preprečilo temu %{model} da bi se shranil" + messages: + inclusion: "ni vključen na seznamu" + exclusion: "je rezerviran" + invalid: "je napačen" + confirmation: "ne ustreza potrdilu" + accepted: "mora biti sprejet" + empty: "ne sme biti prazen" + blank: "ne sme biti neizpolnjen" + too_long: "je predolg" + too_short: "je prekratek" + wrong_length: "je napačne dolžine" + taken: "je že zaseden" + not_a_number: "ni število" + not_a_date: "ni veljaven datum" + greater_than: "mora biti večji kot %{count}" + greater_than_or_equal_to: "mora biti večji ali enak kot %{count}" + equal_to: "mora biti enak kot %{count}" + less_than: "mora biti manjši kot %{count}" + less_than_or_equal_to: "mora biti manjši ali enak kot %{count}" + odd: "mora biti sodo" + even: "mora biti liho" + greater_than_start_date: "mora biti kasnejši kot začetni datum" + not_same_project: "ne pripada istemu projektu" + circular_dependency: "Ta odnos bi povzročil krožno odvisnost" + cant_link_an_issue_with_a_descendant: "Zahtevek ne more biti povezan s svojo podnalogo" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Prosimo izberite + + general_text_No: 'Ne' + general_text_Yes: 'Da' + general_text_no: 'ne' + general_text_yes: 'da' + general_lang_name: 'Slovene (Slovenščina)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Račun je bil uspešno posodobljen. + notice_account_invalid_credentials: Napačno uporabniško ime ali geslo + notice_account_password_updated: Geslo je bilo uspešno posodobljeno. + notice_account_wrong_password: Napačno geslo + notice_account_register_done: Račun je bil uspešno ustvarjen. Za aktivacijo potrdite povezavo, ki vam je bila poslana v e-nabiralnik. + notice_account_unknown_email: Neznan uporabnik. + notice_can_t_change_password: Ta račun za overovljanje uporablja zunanji. Gesla ni mogoče spremeniti. + notice_account_lost_email_sent: Poslano vam je bilo e-pismo z navodili za izbiro novega gesla. + notice_account_activated: Vaš račun je bil aktiviran. Sedaj se lahko prijavite. + notice_successful_create: Ustvarjanje uspelo. + notice_successful_update: Posodobitev uspela. + notice_successful_delete: Izbris uspel. + notice_successful_connection: Povezava uspela. + notice_file_not_found: Stran na katero se želite povezati ne obstaja ali pa je bila umaknjena. + notice_locking_conflict: Drug uporabnik je posodobil podatke. + notice_not_authorized: Nimate privilegijev za dostop do te strani. + notice_email_sent: "E-poštno sporočilo je bilo poslano %{value}" + notice_email_error: "Ob pošiljanju e-sporočila je prišlo do napake (%{value})" + notice_feeds_access_key_reseted: Vaš Atom dostopni ključ je bil ponastavljen. + notice_failed_to_save_issues: "Neuspelo shranjevanje %{count} zahtevka na %{total} izbranem: %{ids}." + notice_no_issue_selected: "Izbran ni noben zahtevek! Prosimo preverite zahtevke, ki jih želite urediti." + notice_account_pending: "Vaš račun je bil ustvarjen in čaka na potrditev s strani administratorja." + notice_default_data_loaded: Privzete nastavitve so bile uspešno naložene. + notice_unable_delete_version: Verzije ni bilo mogoče izbrisati. + + error_can_t_load_default_data: "Privzetih nastavitev ni bilo mogoče naložiti: %{value}" + error_scm_not_found: "Vnos ali revizija v shrambi ni bila najdena ." + error_scm_command_failed: "Med vzpostavljem povezave s shrambo je prišlo do napake: %{value}" + error_scm_annotate: "Vnos ne obstaja ali pa ga ni mogoče komentirati." + error_issue_not_found_in_project: 'Zahtevek ni bil najden ali pa ne pripada temu projektu' + + mail_subject_lost_password: "Vaše %{value} geslo" + mail_body_lost_password: 'Za spremembo glesla kliknite na naslednjo povezavo:' + mail_subject_register: "Aktivacija %{value} vašega računa" + mail_body_register: 'Za aktivacijo vašega računa kliknite na naslednjo povezavo:' + mail_body_account_information_external: "Za prijavo lahko uporabite vaš %{value} račun." + mail_body_account_information: "Informacije o vašem računu. Za spremembo gesla sledite linku 'Spremeni geslo' na naslovu za prijavo, spodaj." + mail_subject_account_activation_request: "%{value} zahtevek za aktivacijo računa" + mail_body_account_activation_request: "Registriral se je nov uporabnik (%{value}). Račun čaka na vašo odobritev:" + mail_subject_reminder: "%{count} zahtevek(zahtevki) zapadejo v naslednjih %{days} dneh" + mail_body_reminder: "%{count} zahtevek(zahtevki), ki so vam dodeljeni bodo zapadli v naslednjih %{days} dneh:" + + + field_name: Ime + field_description: Opis + field_summary: Povzetek + field_is_required: Zahtevano + field_firstname: Ime + field_lastname: Priimek + field_mail: E-naslov + field_filename: Datoteka + field_filesize: Velikost + field_downloads: Prenosi + field_author: Avtor + field_created_on: Ustvarjen + field_updated_on: Posodobljeno + field_field_format: Format + field_is_for_all: Za vse projekte + field_possible_values: Možne vrednosti + field_regexp: Regularni izraz + field_min_length: Minimalna dolžina + field_max_length: Maksimalna dolžina + field_value: Vrednost + field_category: Kategorija + field_title: Naslov + field_project: Projekt + field_issue: Zahtevek + field_status: Status + field_notes: Zabeležka + field_is_closed: Zahtevek zaprt + field_is_default: Privzeta vrednost + field_tracker: Vrsta zahtevka + field_subject: Tema + field_due_date: Do datuma + field_assigned_to: Dodeljen + field_priority: Prioriteta + field_fixed_version: Ciljna verzija + field_user: Uporabnik + field_role: Vloga + field_homepage: Domača stran + field_is_public: Javno + field_parent: Podprojekt projekta + field_is_in_roadmap: Zahtevki prikazani na zemljevidu + field_login: Prijava + field_mail_notification: E-poštna oznanila + field_admin: Administrator + field_last_login_on: Zadnjič povezan(a) + field_language: Jezik + field_effective_date: Datum + field_password: Geslo + field_new_password: Novo geslo + field_password_confirmation: Potrditev + field_version: Verzija + field_type: Tip + field_host: Gostitelj + field_port: Vrata + field_account: Račun + field_base_dn: Bazni DN + field_attr_login: Oznaka za prijavo + field_attr_firstname: Oznaka za ime + field_attr_lastname: Oznaka za priimek + field_attr_mail: Oznaka za e-naslov + field_onthefly: Sprotna izdelava uporabnikov + field_start_date: Začetek + field_done_ratio: "% Narejeno" + field_auth_source: Način overovljanja + field_hide_mail: Skrij moj e-naslov + field_comments: Komentar + field_url: URL + field_start_page: Začetna stran + field_subproject: Podprojekt + field_hours: Ur + field_activity: Aktivnost + field_spent_on: Datum + field_identifier: Identifikator + field_is_filter: Uporabljen kot filter + field_issue_to: Povezan zahtevek + field_delay: Zamik + field_assignable: Zahtevki so lahko dodeljeni tej vlogi + field_redirect_existing_links: Preusmeri obstoječe povezave + field_estimated_hours: Ocenjen čas + field_column_names: Stolpci + field_time_zone: Časovni pas + field_searchable: Zmožen iskanja + field_default_value: Privzeta vrednost + field_comments_sorting: Prikaži komentarje + field_parent_title: Matična stran + + setting_app_title: Naslov aplikacije + setting_app_subtitle: Podnaslov aplikacije + setting_welcome_text: Pozdravno besedilo + setting_default_language: Privzeti jezik + setting_login_required: Zahtevano overovljanje + setting_self_registration: Samostojna registracija + setting_attachment_max_size: Maksimalna velikost priponk + setting_issues_export_limit: Skrajna meja za izvoz zahtevkov + setting_mail_from: E-naslov za emisijo + setting_bcc_recipients: Prejemniki slepih kopij (bcc) + setting_plain_text_mail: navadno e-sporočilo (ne HTML) + setting_host_name: Ime gostitelja in pot + setting_text_formatting: Oblikovanje besedila + setting_wiki_compression: Stiskanje Wiki zgodovine + setting_feeds_limit: Meja obsega Atom virov + setting_default_projects_public: Novi projekti so privzeto javni + setting_autofetch_changesets: Samodejni izvleček zapisa sprememb + setting_sys_api_enabled: Omogoči WS za upravljanje shrambe + setting_commit_ref_keywords: Sklicne ključne besede + setting_commit_fix_keywords: Urejanje ključne besede + setting_autologin: Avtomatska prijava + setting_date_format: Oblika datuma + setting_time_format: Oblika časa + setting_cross_project_issue_relations: Dovoli povezave zahtevkov med različnimi projekti + setting_issue_list_default_columns: Privzeti stolpci prikazani na seznamu zahtevkov + setting_emails_footer: Noga e-sporočil + setting_protocol: Protokol + setting_per_page_options: Število elementov na stran + setting_user_format: Oblika prikaza uporabnikov + setting_activity_days_default: Prikaz dni na aktivnost projekta + setting_display_subprojects_issues: Privzeti prikaz zahtevkov podprojektov v glavnem projektu + setting_enabled_scm: Omogočen SCM + setting_mail_handler_api_enabled: Omogoči WS za prihajajočo e-pošto + setting_mail_handler_api_key: API ključ + setting_sequential_project_identifiers: Generiraj projektne identifikatorje sekvenčno + setting_gravatar_enabled: Uporabljaj Gravatar ikone + setting_diff_max_lines_displayed: Maksimalno število prikazanih vrstic različnosti + + permission_edit_project: Uredi projekt + permission_select_project_modules: Izberi module projekta + permission_manage_members: Uredi člane + permission_manage_versions: Uredi verzije + permission_manage_categories: Urejanje kategorij zahtevkov + permission_add_issues: Dodaj zahtevke + permission_edit_issues: Uredi zahtevke + permission_manage_issue_relations: Uredi odnose med zahtevki + permission_add_issue_notes: Dodaj zabeležke + permission_edit_issue_notes: Uredi zabeležke + permission_edit_own_issue_notes: Uredi lastne zabeležke + permission_move_issues: Premakni zahtevke + permission_delete_issues: Izbriši zahtevke + permission_manage_public_queries: Uredi javna povpraševanja + permission_save_queries: Shrani povpraševanje + permission_view_gantt: Poglej gantogram + permission_view_calendar: Poglej koledar + permission_view_issue_watchers: Oglej si listo spremeljevalcev + permission_add_issue_watchers: Dodaj spremljevalce + permission_log_time: Beleži porabljen čas + permission_view_time_entries: Poglej porabljen čas + permission_edit_time_entries: Uredi beležko časa + permission_edit_own_time_entries: Uredi beležko lastnega časa + permission_manage_news: Uredi novice + permission_comment_news: Komentiraj novice + permission_view_documents: Poglej dokumente + permission_manage_files: Uredi datoteke + permission_view_files: Poglej datoteke + permission_manage_wiki: Uredi wiki + permission_rename_wiki_pages: Preimenuj wiki strani + permission_delete_wiki_pages: Izbriši wiki strani + permission_view_wiki_pages: Poglej wiki + permission_view_wiki_edits: Poglej wiki zgodovino + permission_edit_wiki_pages: Uredi wiki strani + permission_delete_wiki_pages_attachments: Izbriši priponke + permission_protect_wiki_pages: Zaščiti wiki strani + permission_manage_repository: Uredi shrambo + permission_browse_repository: Prebrskaj shrambo + permission_view_changesets: Poglej zapis sprememb + permission_commit_access: Dostop za predajo + permission_manage_boards: Uredi table + permission_view_messages: Poglej sporočila + permission_add_messages: Objavi sporočila + permission_edit_messages: Uredi sporočila + permission_edit_own_messages: Uredi lastna sporočila + permission_delete_messages: Izbriši sporočila + permission_delete_own_messages: Izbriši lastna sporočila + + project_module_issue_tracking: Sledenje zahtevkom + project_module_time_tracking: Sledenje časa + project_module_news: Novice + project_module_documents: Dokumenti + project_module_files: Datoteke + project_module_wiki: Wiki + project_module_repository: Shramba + project_module_boards: Table + + label_user: Uporabnik + label_user_plural: Uporabniki + label_user_new: Nov uporabnik + label_project: Projekt + label_project_new: Nov projekt + label_project_plural: Projekti + label_x_projects: + zero: ni projektov + one: 1 projekt + other: "%{count} projektov" + label_project_all: Vsi projekti + label_project_latest: Zadnji projekti + label_issue: Zahtevek + label_issue_new: Nov zahtevek + label_issue_plural: Zahtevki + label_issue_view_all: Poglej vse zahtevke + label_issues_by: "Zahtevki od %{value}" + label_issue_added: Zahtevek dodan + label_issue_updated: Zahtevek posodobljen + label_document: Dokument + label_document_new: Nov dokument + label_document_plural: Dokumenti + label_document_added: Dokument dodan + label_role: Vloga + label_role_plural: Vloge + label_role_new: Nova vloga + label_role_and_permissions: Vloge in dovoljenja + label_member: Član + label_member_new: Nov član + label_member_plural: Člani + label_tracker: Vrsta zahtevka + label_tracker_plural: Vrste zahtevkov + label_tracker_new: Nova vrsta zahtevka + label_workflow: Potek dela + label_issue_status: Stanje zahtevka + label_issue_status_plural: Stanje zahtevkov + label_issue_status_new: Novo stanje + label_issue_category: Kategorija zahtevka + label_issue_category_plural: Kategorije zahtevkov + label_issue_category_new: Nova kategorija + label_custom_field: Polje po meri + label_custom_field_plural: Polja po meri + label_custom_field_new: Novo polje po meri + label_enumerations: Seznami + label_enumeration_new: Nova vrednost + label_information: Informacija + label_information_plural: Informacije + label_please_login: Prosimo prijavite se + label_register: Registracija + label_password_lost: Spremeni geslo + label_home: Domov + label_my_page: Moja stran + label_my_account: Moj račun + label_my_projects: Moji projekti + label_administration: Upravljanje + label_login: Prijava + label_logout: Odjava + label_help: Pomoč + label_reported_issues: Prijavljeni zahtevki + label_assigned_to_me_issues: Zahtevki dodeljeni meni + label_last_login: Zadnja povezava + label_registered_on: Registriran + label_activity: Aktivnosti + label_overall_activity: Celotna aktivnost + label_user_activity: "Aktivnost %{value}" + label_new: Nov + label_logged_as: Prijavljen(a) kot + label_environment: Okolje + label_authentication: Overovitev + label_auth_source: Način overovitve + label_auth_source_new: Nov način overovitve + label_auth_source_plural: Načini overovitve + label_subproject_plural: Podprojekti + label_and_its_subprojects: "%{value} in njegovi podprojekti" + label_min_max_length: Min - Max dolžina + label_list: Seznam + label_date: Datum + label_integer: Celo število + label_float: Decimalno število + label_boolean: Boolean + label_string: Besedilo + label_text: Dolgo besedilo + label_attribute: Lastnost + label_attribute_plural: Lastnosti + label_no_data: Ni podatkov za prikaz + label_change_status: Spremeni stanje + label_history: Zgodovina + label_attachment: Datoteka + label_attachment_new: Nova datoteka + label_attachment_delete: Izbriši datoteko + label_attachment_plural: Datoteke + label_file_added: Datoteka dodana + label_report: Poročilo + label_report_plural: Poročila + label_news: Novica + label_news_new: Dodaj novico + label_news_plural: Novice + label_news_latest: Zadnje novice + label_news_view_all: Poglej vse novice + label_news_added: Dodane novice + label_settings: Nastavitve + label_overview: Povzetek + label_version: Verzija + label_version_new: Nova verzija + label_version_plural: Verzije + label_confirmation: Potrditev + label_export_to: 'Na razpolago tudi v:' + label_read: Preberi... + label_public_projects: Javni projekti + label_open_issues: odprt zahtevek + label_open_issues_plural: odprti zahtevki + label_closed_issues: zaprt zahtevek + label_closed_issues_plural: zaprti zahtevki + label_x_open_issues_abbr: + zero: 0 odprtih + one: 1 odprt + other: "%{count} odprtih" + label_x_closed_issues_abbr: + zero: 0 zaprtih + one: 1 zaprt + other: "%{count} zaprtih" + label_total: Skupaj + label_permissions: Dovoljenja + label_current_status: Trenutno stanje + label_new_statuses_allowed: Novi zahtevki dovoljeni + label_all: vsi + label_none: noben + label_nobody: nihče + label_next: Naslednji + label_previous: Prejšnji + label_used_by: V uporabi od + label_details: Podrobnosti + label_add_note: Dodaj zabeležko + label_calendar: Koledar + label_months_from: mesecev od + label_gantt: Gantogram + label_internal: Notranji + label_last_changes: "zadnjih %{count} sprememb" + label_change_view_all: Poglej vse spremembe + label_comment: Komentar + label_comment_plural: Komentarji + label_x_comments: + zero: ni komentarjev + one: 1 komentar + other: "%{count} komentarjev" + label_comment_add: Dodaj komentar + label_comment_added: Komentar dodan + label_comment_delete: Izbriši komentarje + label_query: Iskanje po meri + label_query_plural: Iskanja po meri + label_query_new: Novo iskanje + label_filter_add: Dodaj filter + label_filter_plural: Filtri + label_equals: je enako + label_not_equals: ni enako + label_in_less_than: v manj kot + label_in_more_than: v več kot + label_in: v + label_today: danes + label_all_time: v vsem času + label_yesterday: včeraj + label_this_week: ta teden + label_last_week: pretekli teden + label_last_n_days: "zadnjih %{count} dni" + label_this_month: ta mesec + label_last_month: zadnji mesec + label_this_year: to leto + label_date_range: Razpon datumov + label_less_than_ago: manj kot dni nazaj + label_more_than_ago: več kot dni nazaj + label_ago: dni nazaj + label_contains: vsebuje + label_not_contains: ne vsebuje + label_day_plural: dni + label_repository: Shramba + label_repository_plural: Shrambe + label_browse: Prebrskaj + label_revision: Revizija + label_revision_plural: Revizije + label_associated_revisions: Povezane revizije + label_added: dodano + label_modified: spremenjeno + label_copied: kopirano + label_renamed: preimenovano + label_deleted: izbrisano + label_latest_revision: Zadnja revizija + label_latest_revision_plural: Zadnje revizije + label_view_revisions: Poglej revizije + label_max_size: Največja velikost + label_sort_highest: Premakni na vrh + label_sort_higher: Premakni gor + label_sort_lower: Premakni dol + label_sort_lowest: Premakni na dno + label_roadmap: Načrt + label_roadmap_due_in: "Do %{value}" + label_roadmap_overdue: "%{value} zakasnel" + label_roadmap_no_issues: Ni zahtevkov za to verzijo + label_search: Išči + label_result_plural: Rezultati + label_all_words: Vse besede + label_wiki: Predstavitev + label_wiki_edit: Uredi stran + label_wiki_edit_plural: Uredi strani + label_wiki_page: Predstavitvena stran + label_wiki_page_plural: Predstavitvene strani + label_index_by_title: Razvrsti po naslovu + label_index_by_date: Razvrsti po datumu + label_current_version: Trenutna verzija + label_preview: Predogled + label_feed_plural: Atom viri + label_changes_details: Podrobnosti o vseh spremembah + label_issue_tracking: Sledenje zahtevkom + label_spent_time: Porabljen čas + label_f_hour: "%{value} ura" + label_f_hour_plural: "%{value} ur" + label_time_tracking: Sledenje času + label_change_plural: Spremembe + label_statistics: Statistika + label_commits_per_month: Predaj na mesec + label_commits_per_author: Predaj na avtorja + label_view_diff: Preglej razlike + label_diff_inline: znotraj + label_diff_side_by_side: vzporedno + label_options: Možnosti + label_copy_workflow_from: Kopiraj potek dela od + label_permissions_report: Poročilo o dovoljenjih + label_watched_issues: Spremljani zahtevki + label_related_issues: Povezani zahtevki + label_applied_status: Uveljavljeno stanje + label_loading: Nalaganje... + label_relation_new: Nova povezava + label_relation_delete: Izbriši povezavo + label_relates_to: povezan z + label_duplicates: duplikati + label_duplicated_by: dupliciral + label_blocks: blok + label_blocked_by: blokiral + label_precedes: ima prednost pred + label_follows: sledi + label_stay_logged_in: Ostani prijavljen(a) + label_disabled: onemogoči + label_show_completed_versions: Prikaži zaključene verzije + label_me: jaz + label_board: Forum + label_board_new: Nov forum + label_board_plural: Forumi + label_topic_plural: Teme + label_message_plural: Sporočila + label_message_last: Zadnje sporočilo + label_message_new: Novo sporočilo + label_message_posted: Sporočilo dodano + label_reply_plural: Odgovori + label_send_information: Pošlji informacijo o računu uporabniku + label_year: Leto + label_month: Mesec + label_week: Teden + label_date_from: Do + label_date_to: Do + label_language_based: Glede na uporabnikov jezik + label_sort_by: "Razporedi po %{value}" + label_send_test_email: Pošlji testno e-pismo + label_feeds_access_key_created_on: "Atom dostopni ključ narejen %{value} nazaj" + label_module_plural: Moduli + label_added_time_by: "Dodal %{author} %{age} nazaj" + label_updated_time_by: "Posodobil %{author} %{age} nazaj" + label_updated_time: "Posodobljeno %{value} nazaj" + label_jump_to_a_project: Skoči na projekt... + label_file_plural: Datoteke + label_changeset_plural: Zapisi sprememb + label_default_columns: Privzeti stolpci + label_no_change_option: (Ni spremembe) + label_bulk_edit_selected_issues: Uredi izbrane zahtevke skupaj + label_theme: Tema + label_default: Privzeto + label_search_titles_only: Preišči samo naslove + label_user_mail_option_all: "Za vsak dogodek v vseh mojih projektih" + label_user_mail_option_selected: "Za vsak dogodek samo na izbranih projektih..." + label_user_mail_no_self_notified: "Ne želim biti opozorjen(a) na spremembe, ki jih naredim sam(a)" + label_registration_activation_by_email: aktivacija računa po e-pošti + label_registration_manual_activation: ročna aktivacija računa + label_registration_automatic_activation: samodejna aktivacija računa + label_display_per_page: "Na stran: %{value}" + label_age: Starost + label_change_properties: Sprememba lastnosti + label_general: Splošno + label_scm: SCM + label_plugins: Vtičniki + label_ldap_authentication: LDAP overovljanje + label_downloads_abbr: D/L + label_optional_description: Neobvezen opis + label_add_another_file: Dodaj še eno datoteko + label_preferences: Preference + label_chronological_order: Kronološko + label_reverse_chronological_order: Obrnjeno kronološko + label_incoming_emails: Prihajajoča e-pošta + label_generate_key: Ustvari ključ + label_issue_watchers: Spremljevalci + label_example: Vzorec + + button_login: Prijavi se + button_submit: Pošlji + button_save: Shrani + button_check_all: Označi vse + button_uncheck_all: Odznači vse + button_delete: Izbriši + button_create: Ustvari + button_test: Testiraj + button_edit: Uredi + button_add: Dodaj + button_change: Spremeni + button_apply: Uporabi + button_clear: Počisti + button_lock: Zakleni + button_unlock: Odkleni + button_download: Prenesi + button_list: Seznam + button_view: Pogled + button_move: Premakni + button_back: Nazaj + button_cancel: Prekliči + button_activate: Aktiviraj + button_sort: Razvrsti + button_log_time: Beleži čas + button_rollback: Povrni na to verzijo + button_watch: Spremljaj + button_unwatch: Ne spremljaj + button_reply: Odgovori + button_archive: Arhiviraj + button_unarchive: Odarhiviraj + button_reset: Ponastavi + button_rename: Preimenuj + button_change_password: Spremeni geslo + button_copy: Kopiraj + button_annotate: Zapiši pripombo + button_update: Posodobi + button_configure: Konfiguriraj + button_quote: Citiraj + + status_active: aktivni + status_registered: registriran + status_locked: zaklenjen + + text_select_mail_notifications: Izberi dejanja za katera naj bodo poslana oznanila preko e-pošto. + text_regexp_info: npr. ^[A-Z0-9]+$ + text_min_max_length_info: 0 pomeni brez omejitev + text_project_destroy_confirmation: Ali ste prepričani da želite izbrisati izbrani projekt in vse z njim povezane podatke? + text_subprojects_destroy_warning: "Njegov(i) podprojekt(i): %{value} bodo prav tako izbrisani." + text_workflow_edit: Izberite vlogo in zahtevek za urejanje poteka dela + text_are_you_sure: Ali ste prepričani? + text_tip_issue_begin_day: naloga z začetkom na ta dan + text_tip_issue_end_day: naloga z zaključkom na ta dan + text_tip_issue_begin_end_day: naloga ki se začne in konča ta dan + text_caracters_maximum: "največ %{count} znakov." + text_caracters_minimum: "Mora biti vsaj dolg vsaj %{count} znakov." + text_length_between: "Dolžina med %{min} in %{max} znakov." + text_tracker_no_workflow: Potek dela za to vrsto zahtevka ni določen + text_unallowed_characters: Nedovoljeni znaki + text_comma_separated: Dovoljenih je več vrednosti (ločenih z vejico). + text_issues_ref_in_commit_messages: Zahtevki sklicev in popravkov v sporočilu predaje + text_issue_added: "Zahtevek %{id} je sporočil(a) %{author}." + text_issue_updated: "Zahtevek %{id} je posodobil(a) %{author}." + text_wiki_destroy_confirmation: Ali ste prepričani da želite izbrisati to wiki stran in vso njeno vsebino? + text_issue_category_destroy_question: "Nekateri zahtevki (%{count}) so dodeljeni tej kategoriji. Kaj želite storiti?" + text_issue_category_destroy_assignments: Odstrani naloge v kategoriji + text_issue_category_reassign_to: Ponovno dodeli zahtevke tej kategoriji + text_user_mail_option: "Na neizbrane projekte boste prejemali le obvestila o zadevah ki jih spremljate ali v katere ste vključeni (npr. zahtevki katerih avtor(ica) ste)" + text_no_configuration_data: "Vloge, vrste zahtevkov, statusi zahtevkov in potek dela še niso bili določeni. \nZelo priporočljivo je, da naložite privzeto konfiguracijo, ki jo lahko kasneje tudi prilagodite." + text_load_default_configuration: Naloži privzeto konfiguracijo + text_status_changed_by_changeset: "Dodano v zapis sprememb %{value}." + text_issues_destroy_confirmation: 'Ali ste prepričani, da želite izbrisati izbrani(e) zahtevek(ke)?' + text_select_project_modules: 'Izberite module, ki jih želite omogočiti za ta projekt:' + text_default_administrator_account_changed: Spremenjen privzeti administratorski račun + text_file_repository_writable: Omogočeno pisanje v shrambo datotek + text_rmagick_available: RMagick je na voljo(neobvezno) + text_destroy_time_entries_question: "%{hours} ur je bilo opravljenih na zahtevku, ki ga želite izbrisati. Kaj želite storiti?" + text_destroy_time_entries: Izbriši opravljene ure + text_assign_time_entries_to_project: Predaj opravljene ure projektu + text_reassign_time_entries: 'Prenesi opravljene ure na ta zahtevek:' + text_user_wrote: "%{value} je napisal(a):" + text_enumeration_destroy_question: "%{count} objektov je določenih tej vrednosti." + text_enumeration_category_reassign_to: 'Ponastavi jih na to vrednost:' + text_email_delivery_not_configured: "E-poštna dostava ni nastavljena in oznanila so onemogočena.\nNastavite vaš SMTP strežnik v config/configuration.yml in ponovno zaženite aplikacijo da ga omogočite.\n" + text_repository_usernames_mapping: "Izberite ali posodobite Redmine uporabnika dodeljenega vsakemu uporabniškemu imenu najdenemu v zapisniku shrambe.\n Uporabniki z enakim Redmine ali shrambinem uporabniškem imenu ali e-poštnem naslovu so samodejno dodeljeni." + text_diff_truncated: '... Ta sprememba je bila odsekana ker presega največjo velikost ki je lahko prikazana.' + + default_role_manager: Upravnik + default_role_developer: Razvijalec + default_role_reporter: Poročevalec + default_tracker_bug: Hrošč + default_tracker_feature: Funkcija + default_tracker_support: Podpora + default_issue_status_new: Nov + default_issue_status_in_progress: V teku + default_issue_status_resolved: Rešen + default_issue_status_feedback: Povratna informacija + default_issue_status_closed: Zaključen + default_issue_status_rejected: Zavrnjen + default_doc_category_user: Uporabniška dokumentacija + default_doc_category_tech: Tehnična dokumentacija + default_priority_low: Nizka + default_priority_normal: Običajna + default_priority_high: Visoka + default_priority_urgent: Urgentna + default_priority_immediate: Takojšnje ukrepanje + default_activity_design: Oblikovanje + default_activity_development: Razvoj + + enumeration_issue_priorities: Prioritete zahtevkov + enumeration_doc_categories: Kategorije dokumentov + enumeration_activities: Aktivnosti (sledenje časa) + warning_attachments_not_saved: "%{count} datotek(e) ni bilo mogoče shraniti." + field_editable: Uredljivo + text_plugin_assets_writable: Zapisljiva mapa za vtičnike + label_display: Prikaz + button_create_and_continue: Ustvari in nadaljuj + text_custom_field_possible_values_info: 'Ena vrstica za vsako vrednost' + setting_repository_log_display_limit: Največje število prikazanih revizij v log datoteki + setting_file_max_size_displayed: Največja velikost besedilnih datotek v vključenem prikazu + field_watcher: Opazovalec + setting_openid: Dovoli OpenID prijavo in registracijo + field_identity_url: OpenID URL + label_login_with_open_id_option: ali se prijavi z OpenID + field_content: Vsebina + label_descending: Padajoče + label_sort: Razvrsti + label_ascending: Naraščajoče + label_date_from_to: Od %{start} do %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Ta stran ima %{descendants} podstran(i) in naslednik(ov). Kaj želite storiti? + text_wiki_page_reassign_children: Znova dodeli podstrani tej glavni strani + text_wiki_page_nullify_children: Obdrži podstrani kot glavne strani + text_wiki_page_destroy_children: Izbriši podstrani in vse njihove naslednike + setting_password_min_length: Minimalna dolžina gesla + field_group_by: Združi rezultate po + mail_subject_wiki_content_updated: "'%{id}' wiki stran je bila posodobljena" + label_wiki_content_added: Wiki stran dodana + mail_subject_wiki_content_added: "'%{id}' wiki stran je bila dodana" + mail_body_wiki_content_added: "%{author} je dodal '%{id}' wiki stran" + label_wiki_content_updated: Wiki stran posodobljena + mail_body_wiki_content_updated: "%{author} je posodobil '%{id}' wiki stran." + permission_add_project: Ustvari projekt + setting_new_project_user_role_id: Vloga, dodeljena neadministratorskemu uporabniku, ki je ustvaril projekt + label_view_all_revisions: Poglej vse revizije + label_tag: Oznaka + label_branch: Veja + error_no_tracker_in_project: Noben sledilnik ni povezan s tem projektom. Prosimo preverite nastavitve projekta. + error_no_default_issue_status: Privzeti zahtevek ni definiran. Prosimo preverite svoje nastavitve (Pojdite na "Administracija -> Stanje zahtevkov"). + text_journal_changed: "%{label} se je spremenilo iz %{old} v %{new}" + text_journal_set_to: "%{label} nastavljeno na %{value}" + text_journal_deleted: "%{label} izbrisan (%{old})" + label_group_plural: Skupine + label_group: Skupina + label_group_new: Nova skupina + label_time_entry_plural: Porabljen čas + text_journal_added: "%{label} %{value} dodan" + field_active: Aktiven + enumeration_system_activity: Sistemska aktivnost + permission_delete_issue_watchers: Izbriši opazovalce + version_status_closed: zaprt + version_status_locked: zaklenjen + version_status_open: odprt + error_can_not_reopen_issue_on_closed_version: Zahtevek dodeljen zaprti verziji ne more biti ponovno odprt + label_user_anonymous: Anonimni + button_move_and_follow: Premakni in sledi + setting_default_projects_modules: Privzeti moduli za nove projekte + setting_gravatar_default: Privzeta Gravatar slika + field_sharing: Deljenje + label_version_sharing_hierarchy: S projektno hierarhijo + label_version_sharing_system: Z vsemi projekti + label_version_sharing_descendants: S podprojekti + label_version_sharing_tree: Z drevesom projekta + label_version_sharing_none: Ni deljeno + error_can_not_archive_project: Ta projekt ne more biti arhiviran + button_duplicate: Podvoji + button_copy_and_follow: Kopiraj in sledi + label_copy_source: Vir + setting_issue_done_ratio: Izračunaj razmerje opravljenega zahtevka z + setting_issue_done_ratio_issue_status: Uporabi stanje zahtevka + error_issue_done_ratios_not_updated: Razmerje opravljenega zahtevka ni bilo posodobljeno. + error_workflow_copy_target: Prosimo izberite ciljni(e) sledilnik(e) in vlogo(e) + setting_issue_done_ratio_issue_field: Uporabi polje zahtevka + label_copy_same_as_target: Enako kot cilj + label_copy_target: Cilj + notice_issue_done_ratios_updated: Razmerje opravljenega zahtevka posodobljeno. + error_workflow_copy_source: Prosimo izberite vir zahtevka ali vlogo + label_update_issue_done_ratios: Posodobi razmerje opravljenega zahtevka + setting_start_of_week: Začni koledarje z + permission_view_issues: Poglej zahtevke + label_display_used_statuses_only: Prikaži samo stanja ki uporabljajo ta sledilnik + label_revision_id: Revizija %{value} + label_api_access_key: API dostopni ključ + label_api_access_key_created_on: API dostopni ključ ustvarjen pred %{value} + label_feeds_access_key: Atom dostopni ključ + notice_api_access_key_reseted: Vaš API dostopni ključ je bil ponastavljen. + setting_rest_api_enabled: Omogoči REST spletni servis + label_missing_api_access_key: Manjkajoč API dostopni ključ + label_missing_feeds_access_key: Manjkajoč Atom dostopni ključ + button_show: Prikaži + text_line_separated: Dovoljenih več vrednosti (ena vrstica za vsako vrednost). + setting_mail_handler_body_delimiters: Odreži e-pošto po eni od teh vrstic + permission_add_subprojects: Ustvari podprojekte + label_subproject_new: Nov podprojekt + text_own_membership_delete_confirmation: |- + Odstranili boste nekatere ali vse od dovoljenj zaradi česar morda ne boste mogli več urejati tega projekta. + Ali ste prepričani, da želite nadaljevati? + label_close_versions: Zapri dokončane verzije + label_board_sticky: Lepljivo + label_board_locked: Zaklenjeno + permission_export_wiki_pages: Izvozi wiki strani + setting_cache_formatted_text: Predpomni oblikovano besedilo + permission_manage_project_activities: Uredi aktivnosti projekta + error_unable_delete_issue_status: Stanja zahtevka ni bilo možno spremeniti + label_profile: Profil + permission_manage_subtasks: Uredi podnaloge + field_parent_issue: Nadrejena naloga + label_subtask_plural: Podnaloge + label_project_copy_notifications: Med kopiranjem projekta pošlji e-poštno sporočilo + error_can_not_delete_custom_field: Polja po meri ni mogoče izbrisati + error_unable_to_connect: Povezava ni mogoča (%{value}) + error_can_not_remove_role: Ta vloga je v uporabi in je ni mogoče izbrisati. + error_can_not_delete_tracker: Ta sledilnik vsebuje zahtevke in se ga ne more izbrisati. + field_principal: Upravnik varnosti + notice_failed_to_save_members: "Shranjevanje uporabnika(ov) ni uspelo: %{errors}." + text_zoom_out: Približaj + text_zoom_in: Oddalji + notice_unable_delete_time_entry: Brisanje dnevnika porabljenaga časa ni mogoče. + label_overall_spent_time: Skupni porabljeni čas + field_time_entries: Beleži porabljeni čas + project_module_gantt: Gantogram + project_module_calendar: Koledear + button_edit_associated_wikipage: "Uredi povezano Wiki stran: %{page_title}" + field_text: Besedilno polje + setting_default_notification_option: Privzeta možnost obveščanja + label_user_mail_option_only_my_events: Samo za stvari, ki jih opazujem ali sem v njih vpleten + label_user_mail_option_none: Noben dogodek + field_member_of_group: Pooblaščenčeva skupina + field_assigned_to_role: Pooblaščenčeva vloga + notice_not_authorized_archived_project: Projekt, do katerega poskušate dostopati, je bil arhiviran. + label_principal_search: "Poišči uporabnika ali skupino:" + label_user_search: "Poišči uporabnikia:" + field_visible: Viden + setting_emails_header: Glava e-pošte + setting_commit_logtime_activity_id: Aktivnost zabeleženega časa + text_time_logged_by_changeset: Uporabljeno v spremembi %{value}. + setting_commit_logtime_enabled: Omogoči beleženje časa + notice_gantt_chart_truncated: Graf je bil odrezan, ker je prekoračil največje dovoljeno število elementov, ki se jih lahko prikaže (%{max}) + setting_gantt_items_limit: Največje število elementov prikazano na gantogramu + field_warn_on_leaving_unsaved: Opozori me, kadar zapuščam stran z neshranjenim besedilom + text_warn_on_leaving_unsaved: Trenutna stran vsebuje neshranjeno besedilo ki bo izgubljeno, če zapustite to stran. + label_my_queries: Moje poizvedbe po meri + text_journal_changed_no_detail: "%{label} posodobljen" + label_news_comment_added: Komentar dodan novici + button_expand_all: Razširi vse + button_collapse_all: Skrči vse + label_additional_workflow_transitions_for_assignee: Dovoljeni dodatni prehodi kadar je uporabnik pooblaščenec + label_additional_workflow_transitions_for_author: Dovoljeni dodatni prehodi kadar je uporabnik avtor + label_bulk_edit_selected_time_entries: Skupinsko urejanje izbranih časovnih zapisov + text_time_entries_destroy_confirmation: Ali ste prepričani, da želite izbristai izbran(e) časovn(i/e) zapis(e)? + label_role_anonymous: Anonimni + label_role_non_member: Nečlan + label_issue_note_added: Dodan zaznamek + label_issue_status_updated: Status posodobljen + label_issue_priority_updated: Prioriteta posodobljena + label_issues_visibility_own: Zahtevek ustvarjen s strani uporabnika ali dodeljen uporabniku + field_issues_visibility: Vidljivost zahtevkov + label_issues_visibility_all: Vsi zahtevki + permission_set_own_issues_private: Nastavi lastne zahtevke kot javne ali zasebne + field_is_private: Zaseben + permission_set_issues_private: Nastavi zahtevke kot javne ali zasebne + label_issues_visibility_public: Vsi nezasebni zahtevki + text_issues_destroy_descendants_confirmation: To bo izbrisalo tudi %{count} podnalog(o). + field_commit_logs_encoding: Kodiranje sporočil ob predaji + field_scm_path_encoding: Pot do kodiranja + text_scm_path_encoding_note: "Privzeto: UTF-8" + field_path_to_repository: Pot do shrambe + field_root_directory: Korenska mapa + field_cvs_module: Modul + field_cvsroot: CVSROOT + text_mercurial_repository_note: Lokalna shramba (npr. /hgrepo, c:\hgrepo) + text_scm_command: Ukaz + text_scm_command_version: Verzija + label_git_report_last_commit: Sporoči zadnje uveljavljanje datotek in map + text_scm_config: Svoje SCM ukaze lahko nastavite v datoteki config/configuration.yml. Po urejanju prosimo ponovno zaženite aplikacijo. + text_scm_command_not_available: SCM ukaz ni na voljo. Prosimo preverite nastavitve v upravljalskem podoknu. + + text_git_repository_note: Shramba je prazna in lokalna (npr. /gitrepo, c:\gitrepo) + + notice_issue_successful_create: Ustvarjen zahtevek %{id}. + label_between: med + setting_issue_group_assignment: Dovoli dodeljevanje zahtevka skupinam + label_diff: diff + + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 zahtevek + one: 1 zahtevek + other: "%{count} zahtevki" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: vsi + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: S podprojekti + label_cross_project_tree: Z drevesom projekta + label_cross_project_hierarchy: S projektno hierarhijo + label_cross_project_system: Z vsemi projekti + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Skupaj + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: E-naslov + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Skupni porabljeni čas + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API ključ + setting_lost_password: Spremeni geslo + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/sq.yml b/config/locales/sq.yml new file mode 100644 index 0000000..e0ea62e --- /dev/null +++ b/config/locales/sq.yml @@ -0,0 +1,1226 @@ +sq: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%m/%d/%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%m/%d/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_hours: + one: "1 ore" + other: "%{count} ore" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "dhe" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 gabim nuk lejon kete %{model} te ruhet" + other: "%{count} gabime nuk lejon kete %{model} te ruhet" + messages: + inclusion: "nuk eshte perfshire ne liste" + exclusion: "eshte i/e rezervuar" + invalid: "eshte invalid" + confirmation: "nuk perkon me konfirmimin" + accepted: "duhet pranuar" + empty: "nuk mund te jete bosh" + blank: "nuk mund te jete blank" + too_long: "eshte shume i gjate (maksimumi eshte %{count} karaktere)" + too_short: "eshte shume i gjate (minimumi eshte %{count} karaktere)" + wrong_length: "eshte gjatesi e gabuar (duhet te jete %{count} karaktere)" + taken: "eshte zene" + not_a_number: "nuk eshte numer" + not_a_date: "nuk eshte date e vlefshme" + greater_than: "duhet te jete me i/e madh(e) se %{count}" + greater_than_or_equal_to: "duhet te jete me i/e madh(e) se ose i/e barabarte me %{count}" + equal_to: "duhet te jete i/e barabarte me %{count}" + less_than: "duhet te jete me i/e vogel se %{count}" + less_than_or_equal_to: "duhet te jete me i/e vogel se ose i/e barabarte me %{count}" + odd: "duhet te jete tek" + even: "duhet te jete cift" + greater_than_start_date: "duhet te jete me i/e madh(e) se data e fillimit" + not_same_project: "nuk i perket te njejtit projekt" + circular_dependency: "Ky relacion do te krijoje nje varesi ciklike (circular dependency)" + cant_link_an_issue_with_a_descendant: "Nje ceshtje nuk mund te lidhet me nenceshtje" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Zgjidhni + + general_text_No: 'Jo' + general_text_Yes: 'Po' + general_text_no: 'jo' + general_text_yes: 'po' + general_lang_name: 'Albanian (Shqip)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '7' + + notice_account_updated: Llogaria u perditesua me sukses. + notice_account_invalid_credentials: Perdorues ose Fjalekalim i gabuar. + notice_account_password_updated: Fjalekalimi u ndryshua me sukses. + notice_account_wrong_password: Fjalekalim i gabuar + notice_account_register_done: Llogaria u krijua me sukses. Per te aktivizuar Llogarine tuaj, ndiqni link-un e derguar ne email-in tuaj. + notice_account_unknown_email: Perdorues i paidentifikuar. + notice_can_t_change_password: Kjo Llogari administrohet nga nje server tjeter. E pamundur te ndryshohet Fjalekalimi. + notice_account_lost_email_sent: Ju eshte derguar nje email me instruksionet per te zgjedhur nje Fjalekalim te ri. + notice_account_activated: Llogaria juaj u Aktivizua. Tani mund te beni Login. + notice_successful_create: Krijim me sukses. + notice_successful_update: Modifikim me sukses. + notice_successful_delete: Fshirje me sukses. + notice_successful_connection: Lidhje e suksesshme. + notice_file_not_found: Faqja qe po kerkoni te aksesoni nuk ekziston ose eshte shperngulur. + notice_locking_conflict: Te dhenat jane modifikuar nga nje Perdorues tjeter. + notice_not_authorized: Nuk jeni i autorizuar te aksesoni kete faqe. + notice_not_authorized_archived_project: Projekti, qe po tentoni te te aksesoni eshte arkivuar. + notice_email_sent: "Nje email eshte derguar ne %{value}" + notice_email_error: "Pati nje gabim gjate dergimit te email-it (%{value})" + notice_feeds_access_key_reseted: Your Atom access key was reset. + notice_api_access_key_reseted: Your API access key was reset. + notice_failed_to_save_issues: "Deshtoi ne ruajtjen e %{count} ceshtje(ve) ne %{total} te zgjedhura: %{ids}." + notice_failed_to_save_time_entries: "Deshtoi ne ruajtjen e %{count} time entrie(s) ne %{total} te zgjedhura: %{ids}." + notice_failed_to_save_members: "Deshtoi ne ruajtjen e member(s): %{errors}." + notice_no_issue_selected: "Nuk eshte zgjedhur asnje Ceshtje! Zgjidh Ceshtjen qe deshironi te modifikoni." + notice_account_pending: "Llogaria juaj u krijua dhe eshte ne pritje te aprovimit nga nje administrator." + notice_default_data_loaded: Konfigurimi i paracaktuar u ngarkua me sukses. + notice_unable_delete_version: E pamundur te fshije versionin. + notice_unable_delete_time_entry: E pamundur te fshije rekordin e log-ut. + notice_issue_done_ratios_updated: Issue done ratios updated. + notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})" + notice_issue_successful_create: "Ceshtja %{id} u krijua." + notice_issue_update_conflict: "Ceshtja eshte perditesuar nga Perdorues te tjere nderkohe qe ju po e modifikonit ate." + notice_account_deleted: "Llogaria juaj u fshi perfundimisht." + + error_can_t_load_default_data: "Konfigurimi i paracaktuar nuk mund te ngarkohet: %{value}" + error_scm_not_found: "The entry or revision was not found in the repository." + error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" + error_scm_annotate: "The entry does not exist or cannot be annotated." + error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size." + error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_delete_custom_field: Unable to delete custom field + error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." + error_can_not_remove_role: "This role is in use and cannot be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened' + error_can_not_archive_project: This project cannot be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + error_unable_delete_issue_status: 'Unable to delete issue status' + error_unable_to_connect: "Unable to connect (%{value})" + error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" + warning_attachments_not_saved: "%{count} file(s) could not be saved." + + mail_subject_lost_password: "Fjalekalimi %{value} i juaj" + mail_body_lost_password: 'Per te ndryshuar Fjalekalimin, ndiq link-un ne vijim:' + mail_subject_register: "Aktivizimi %{value} i Llogarise tuaj" + mail_body_register: 'Per te aktivizuar Llogarine tuaj, ndiqni link-un ne vijim:' + mail_body_account_information_external: "Mund te perdorni Llogarine tuaj %{value} per Login." + mail_body_account_information: Informacioni i Llogarise suaj + mail_subject_account_activation_request: "%{value} kerkesa aktivizimi Llogarije" + mail_body_account_activation_request: "Nje Perdorues i ri (%{value}) eshte regjistruar. Llogaria pret aprovimin tuaj:" + mail_subject_reminder: "%{count} Ceshtje te pritshme ne %{days} ditet pasardhese" + mail_body_reminder: "%{count} Ceshtje qe ju jane caktuar jane te pritshme ne %{days} ditet pasardhese:" + mail_subject_wiki_content_added: "'%{id}' wiki page eshte shtuar" + mail_body_wiki_content_added: "The '%{id}' wiki page eshte shtuar nga %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page eshte modifikuar" + mail_body_wiki_content_updated: "The '%{id}' wiki page eshte modifikuar nga %{author}." + + + field_name: Emri + field_description: Pershkrimi + field_summary: Permbledhje + field_is_required: E Detyrueshme + field_firstname: Emri + field_lastname: Mbiemri + field_mail: Email + field_filename: File + field_filesize: Madhesia + field_downloads: Shkarkime + field_author: Autori + field_created_on: Krijuar me + field_updated_on: Perditesuar me + field_field_format: Formati + field_is_for_all: Per te gjthe Projektet + field_possible_values: Vlera e Mundshme + field_regexp: Shprehja e Duhur + field_min_length: Gjatesia Minimale + field_max_length: Gjatesia Maksimale + field_value: Vlera + field_category: Kategoria + field_title: Titulli + field_project: Projekti + field_issue: Problemi + field_status: Statusi + field_notes: Shenime + field_is_closed: Problemet e Mbyllura + field_is_default: Vlera e Paracaktuar + field_tracker: Gjurmuesi + field_subject: Subjekti + field_due_date: Deri me + field_assigned_to: I Ngarkuari + field_priority: Prioriteti + field_fixed_version: Menyra e Etiketimit + field_user: Perdoruesi + field_principal: Kapitali + field_role: Roli + field_homepage: Faqja Kryesore + field_is_public: Publike + field_parent: Nenprojekti i + field_is_in_roadmap: Ceshtje e shfaqur ne roadmap + field_login: Login + field_mail_notification: Njoftim me Email + field_admin: Administratori + field_last_login_on: Lidhja e Fundit + field_language: Gjuha + field_effective_date: Data + field_password: Fjalekalimi + field_new_password: Fjalekalimi i Ri + field_password_confirmation: Konfirmim Fjalekalimi + field_version: Versioni + field_type: Type + field_host: Host + field_port: Port + field_account: Llogaria + field_base_dn: Base DN + field_attr_login: Login attribute + field_attr_firstname: Firstname attribute + field_attr_lastname: Lastname attribute + field_attr_mail: Email attribute + field_onthefly: On-the-fly user creation + field_start_date: Start date + field_done_ratio: "% Done" + field_auth_source: Authentication mode + field_hide_mail: Hide my email address + field_comments: Comment + field_url: URL + field_start_page: Start page + field_subproject: Subproject + field_hours: Hours + field_activity: Activity + field_spent_on: Date + field_identifier: Identifier + field_is_filter: Used as a filter + field_issue_to: Related issue + field_delay: Delay + field_assignable: Issues can be assigned to this role + field_redirect_existing_links: Redirect existing links + field_estimated_hours: Estimated time + field_column_names: Columns + field_time_entries: Log time + field_time_zone: Time zone + field_searchable: Searchable + field_default_value: Default value + field_comments_sorting: Display comments + field_parent_title: Parent page + field_editable: Editable + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Content + field_group_by: Group results by + field_sharing: Sharing + field_parent_issue: Parent task + field_member_of_group: "Assignee's group" + field_assigned_to_role: "Assignee's role" + field_text: Text field + field_visible: Visible + field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text" + field_issues_visibility: Issues visibility + field_is_private: Private + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvsroot: CVSROOT + field_cvs_module: Module + field_repository_is_default: Main repository + field_multiple: Multiple values + field_auth_source_ldap_filter: LDAP filter + + setting_app_title: Application title + setting_app_subtitle: Application subtitle + setting_welcome_text: Welcome text + setting_default_language: Default language + setting_login_required: Authentication required + setting_self_registration: Self-registration + setting_attachment_max_size: Maximum attachment size + setting_issues_export_limit: Issues export limit + setting_mail_from: Emission email address + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Plain text mail (no HTML) + setting_host_name: Host name and path + setting_text_formatting: Text formatting + setting_wiki_compression: Wiki history compression + setting_feeds_limit: Maximum number of items in Atom feeds + setting_default_projects_public: New projects are public by default + setting_autofetch_changesets: Fetch commits automatically + setting_sys_api_enabled: Enable WS for repository management + setting_commit_ref_keywords: Referencing keywords + setting_commit_fix_keywords: Fixing keywords + setting_autologin: Autologin + setting_date_format: Date format + setting_time_format: Time format + setting_cross_project_issue_relations: Allow cross-project issue relations + setting_issue_list_default_columns: Default columns displayed on the issue list + setting_repositories_encodings: Attachments and repositories encodings + setting_protocol: Protocol + setting_per_page_options: Objects per page options + setting_user_format: Users display format + setting_activity_days_default: Days displayed on project activity + setting_display_subprojects_issues: Display subprojects issues on main projects by default + setting_enabled_scm: Enabled SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: Generate sequential project identifiers + setting_gravatar_enabled: Use Gravatar user icons + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Maximum number of diff lines displayed + setting_file_max_size_displayed: Maximum size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + setting_default_notification_option: Default notification option + setting_commit_logtime_enabled: Enable time logging + setting_commit_logtime_activity_id: Activity for logged time + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + setting_issue_group_assignment: Allow issue assignment to groups + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + setting_unsubscribe: Allow users to delete their own account + + permission_add_project: Create project + permission_add_subprojects: Create subprojects + permission_edit_project: Edit project + permission_select_project_modules: Select project modules + permission_manage_members: Manage members + permission_manage_project_activities: Manage project activities + permission_manage_versions: Manage versions + permission_manage_categories: Manage issue categories + permission_view_issues: View Issues + permission_add_issues: Add issues + permission_edit_issues: Edit issues + permission_manage_issue_relations: Manage issue relations + permission_set_issues_private: Set issues public or private + permission_set_own_issues_private: Set own issues public or private + permission_add_issue_notes: Add notes + permission_edit_issue_notes: Edit notes + permission_edit_own_issue_notes: Edit own notes + permission_move_issues: Move issues + permission_delete_issues: Delete issues + permission_manage_public_queries: Manage public queries + permission_save_queries: Save queries + permission_view_gantt: View gantt chart + permission_view_calendar: View calendar + permission_view_issue_watchers: View watchers list + permission_add_issue_watchers: Add watchers + permission_delete_issue_watchers: Delete watchers + permission_log_time: Log spent time + permission_view_time_entries: View spent time + permission_edit_time_entries: Edit time logs + permission_edit_own_time_entries: Edit own time logs + permission_manage_news: Manage news + permission_comment_news: Comment news + permission_view_documents: View documents + permission_manage_files: Manage files + permission_view_files: View files + permission_manage_wiki: Manage wiki + permission_rename_wiki_pages: Rename wiki pages + permission_delete_wiki_pages: Delete wiki pages + permission_view_wiki_pages: View wiki + permission_view_wiki_edits: View wiki history + permission_edit_wiki_pages: Edit wiki pages + permission_delete_wiki_pages_attachments: Delete attachments + permission_protect_wiki_pages: Protect wiki pages + permission_manage_repository: Manage repository + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Commit access + permission_manage_boards: Manage forums + permission_view_messages: View messages + permission_add_messages: Post messages + permission_edit_messages: Edit messages + permission_edit_own_messages: Edit own messages + permission_delete_messages: Delete messages + permission_delete_own_messages: Delete own messages + permission_export_wiki_pages: Export wiki pages + permission_manage_subtasks: Manage subtasks + permission_manage_related_issues: Manage related issues + + project_module_issue_tracking: Issue tracking + project_module_time_tracking: Time tracking + project_module_news: News + project_module_documents: Documents + project_module_files: Files + project_module_wiki: Wiki + project_module_repository: Repository + project_module_boards: Forums + project_module_calendar: Calendar + project_module_gantt: Gantt + + label_user: Perdoruesi + label_user_plural: Perdoruesit + label_user_new: Perdorues i ri + label_user_anonymous: Anonim + label_project: Projekt + label_project_new: Projekt i ri + label_project_plural: Projekte + label_x_projects: + zero: asnje projekt + one: 1 projekt + other: "%{count} projekte" + label_project_all: Te gjithe Projektet + label_project_latest: Projektet me te fundit + label_issue: Ceshtje + label_issue_new: Ceshtje e re + label_issue_plural: Ceshtjet + label_issue_view_all: Shih te gjitha Ceshtjet + label_issues_by: "Ceshtje per %{value}" + label_issue_added: Ceshtje te shtuara + label_issue_updated: Ceshtje te modifikuara + label_issue_note_added: Shenime te shtuara + label_issue_status_updated: Statusi u modifikua + label_issue_priority_updated: Prioriteti u modifikua + label_document: Dokument + label_document_new: Dokument i ri + label_document_plural: Dokumente + label_document_added: Dokumente te shtuara + label_role: Roli + label_role_plural: Role + label_role_new: Rol i ri + label_role_and_permissions: Role dhe te Drejta + label_role_anonymous: Anonim + label_role_non_member: Jo Anetar + label_member: Anetar + label_member_new: Anetar i ri + label_member_plural: Anetare + label_tracker: Gjurmues + label_tracker_plural: Gjurmuesa + label_tracker_new: Gjurmues i ri + label_workflow: Workflow + label_issue_status: Statusi i Ceshtjes + label_issue_status_plural: Statuset e Ceshtjeve + label_issue_status_new: Statusi i ri + label_issue_category: Kategoria e Ceshtjes + label_issue_category_plural: Kategorite e Ceshtjeve + label_issue_category_new: Kategori e re + label_custom_field: Fushe e personalizuar + label_custom_field_plural: Fusha te personalizuara + label_custom_field_new: Fushe e personalizuar e re + label_enumerations: Enumerations + label_enumeration_new: Vlere e re + label_information: Informacion + label_information_plural: Informacione + label_please_login: Lutemi login + label_register: Regjistrohu + label_login_with_open_id_option: ose lidhu me OpenID + label_password_lost: Fjalekalim i humbur + label_home: Home + label_my_page: Faqja ime + label_my_account: Llogaria ime + label_my_projects: Projektet e mia + label_administration: Administrim + label_login: Login + label_logout: Dalje + label_help: Ndihme + label_reported_issues: Ceshtje te raportuara + label_assigned_to_me_issues: Ceshtje te caktuara mua + label_last_login: Hyrja e fundit + label_registered_on: Regjistruar me + label_activity: Aktiviteti + label_overall_activity: Aktiviteti i pergjithshem + label_user_activity: "Aktiviteti i %{value}" + label_new: Shto + label_logged_as: Lidhur si + label_environment: Ambienti + label_authentication: Authentikimi + label_auth_source: Menyra e Authentikimit + label_auth_source_new: Menyre e re Authentikimi + label_auth_source_plural: Menyrat e Authentikimit + label_subproject_plural: Nenprojekte + label_subproject_new: Nenprojekt i ri + label_and_its_subprojects: "%{value} dhe Nenprojektet e vet" + label_min_max_length: Gjatesia Min - Max + label_list: List + label_date: Date + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Text + label_text: Long text + label_attribute: Attribute + label_attribute_plural: Attributes + label_no_data: No data to display + label_change_status: Change status + label_history: Histori + label_attachment: File + label_attachment_new: File i ri + label_attachment_delete: Fshi file + label_attachment_plural: Files + label_file_added: File te shtuar + label_report: Raport + label_report_plural: Raporte + label_news: Lajm + label_news_new: Shto Lajm + label_news_plural: Lajme + label_news_latest: Lajmet e fundit + label_news_view_all: Veshtro gjithe Lajmet + label_news_added: Lajme te shtuara + label_news_comment_added: Komenti iu shtua Lajmeve + label_settings: Settings + label_overview: Overview + label_version: Version + label_version_new: Version i ri + label_version_plural: Versione + label_close_versions: Mbyll Versionet e perfunduara + label_confirmation: Konfirmim + label_export_to: 'Mund te gjendet gjithashtu ne:' + label_read: Lexim... + label_public_projects: Projekte publike + label_open_issues: e hapur + label_open_issues_plural: te hapura + label_closed_issues: e mbyllur + label_closed_issues_plural: te mbyllura + label_x_open_issues_abbr: + zero: 0 te hapura + one: 1 e hapur + other: "%{count} te hapura" + label_x_closed_issues_abbr: + zero: 0 te mbyllura + one: 1 e mbyllur + other: "%{count} te mbyllura" + label_x_issues: + zero: 0 ceshtje + one: 1 ceshtje + other: "%{count} ceshtje" + label_total: Total + label_permissions: Te drejta + label_current_status: Statusi aktual + label_new_statuses_allowed: Statuse te reja te lejuara + label_all: te gjitha + label_none: asnje + label_nobody: askush + label_next: Pasardhes + label_previous: Paraardhes + label_used_by: Perdorur nga + label_details: Detaje + label_add_note: Shto nje Shenim + label_calendar: Kalendar + label_months_from: muaj nga + label_gantt: Gantt + label_internal: I brendshem + label_last_changes: "%{count} ndryshimet e fundit" + label_change_view_all: Shih gjithe ndryshimet + label_comment: Koment + label_comment_plural: Komente + label_x_comments: + zero: asnje koment + one: 1 koment + other: "%{count} komente" + label_comment_add: Shto nje koment + label_comment_added: Komenti u shtua + label_comment_delete: Fshi komente + label_query: Custom query + label_query_plural: Custom queries + label_query_new: New query + label_my_queries: My custom queries + label_filter_add: Shto filter + label_filter_plural: Filtra + label_equals: eshte + label_not_equals: nuk eshte + label_in_less_than: ne me pak se + label_in_more_than: ne me shume se + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_between: ndermjet + label_in: ne + label_today: sot + label_all_time: cdo kohe + label_yesterday: dje + label_this_week: kete jave + label_last_week: javen e kaluar + label_last_n_days: "%{count} ditet e fundit" + label_this_month: kete muaj + label_last_month: muajin e kaluar + label_this_year: kete vit + label_date_range: Date range + label_less_than_ago: me pak se dite para + label_more_than_ago: me shume se dite para + label_ago: dite para + label_contains: permban + label_not_contains: nuk permban + label_day_plural: dite + label_repository: Repository + label_repository_new: New repository + label_repository_plural: Repositories + label_browse: Browse + label_branch: Dege + label_tag: Tag + label_revision: Revizion + label_revision_plural: Revizione + label_revision_id: "Revizion %{value}" + label_associated_revisions: Associated revisions + label_added: te shtuara + label_modified: te modifikuara + label_copied: te kopjuara + label_renamed: te riemeruara + label_deleted: te fshira + label_latest_revision: Revizioni i fundit + label_latest_revision_plural: Revizionet e fundit + label_view_revisions: Shih Revizionet + label_view_all_revisions: Shih te gjitha Revizionet + label_max_size: Maximum size + label_sort_highest: Coje ne krye + label_sort_higher: Coje lart + label_sort_lower: Coje poshte + label_sort_lowest: Coje ne fund + label_roadmap: Roadmap + label_roadmap_due_in: "E pritshme ne %{value}" + label_roadmap_overdue: "%{value} me vonese" + label_roadmap_no_issues: Asnje Ceshtje per kete version + label_search: Kerko + label_result_plural: Rezultatet + label_all_words: Te gjitha fjalet + label_wiki: Wiki + label_wiki_edit: Wiki edit + label_wiki_edit_plural: Wiki edits + label_wiki_page: Wiki page + label_wiki_page_plural: Wiki pages + label_index_by_title: Index by title + label_index_by_date: Index by date + label_current_version: Current version + label_preview: Preview + label_feed_plural: Feeds + label_changes_details: Details of all changes + label_issue_tracking: Issue tracking + label_spent_time: Spent time + label_overall_spent_time: Overall spent time + label_f_hour: "%{value} ore" + label_f_hour_plural: "%{value} ore" + label_time_tracking: Time tracking + label_change_plural: Ndryshimet + label_statistics: Statistika + label_commits_per_month: Commits per month + label_commits_per_author: Commits per author + label_diff: diff + label_view_diff: View differences + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: Options + label_copy_workflow_from: Copy workflow from + label_permissions_report: Permissions report + label_watched_issues: Watched issues + label_related_issues: Related issues + label_applied_status: Applied status + label_loading: Loading... + label_relation_new: New relation + label_relation_delete: Delete relation + label_relates_to: related to + label_duplicates: duplicates + label_duplicated_by: duplicated by + label_blocks: blocks + label_blocked_by: blocked by + label_precedes: precedes + label_follows: follows + label_stay_logged_in: Stay logged in + label_disabled: disabled + label_show_completed_versions: Show completed versions + label_me: me + label_board: Forum + label_board_new: New forum + label_board_plural: Forums + label_board_locked: Locked + label_board_sticky: Sticky + label_topic_plural: Topics + label_message_plural: Messages + label_message_last: Last message + label_message_new: New message + label_message_posted: Message added + label_reply_plural: Replies + label_send_information: Send account information to the user + label_year: Year + label_month: Month + label_week: Week + label_date_from: From + label_date_to: To + label_language_based: Based on user's language + label_sort_by: "Sort by %{value}" + label_send_test_email: Send a test email + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom access key created %{value} ago" + label_module_plural: Modules + label_added_time_by: "Added by %{author} %{age} ago" + label_updated_time_by: "Updated by %{author} %{age} ago" + label_updated_time: "Updated %{value} ago" + label_jump_to_a_project: Jump to a project... + label_file_plural: Files + label_changeset_plural: Changesets + label_default_columns: Default columns + label_no_change_option: (No change) + label_bulk_edit_selected_issues: Bulk edit selected issues + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + label_theme: Theme + label_default: Default + label_search_titles_only: Search titles only + label_user_mail_option_all: "For any event on all my projects" + label_user_mail_option_selected: "For any event on the selected projects only..." + label_user_mail_option_none: "No events" + label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" + label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" + label_registration_activation_by_email: account activation by email + label_registration_manual_activation: manual account activation + label_registration_automatic_activation: automatic account activation + label_display_per_page: "Per page: %{value}" + label_age: Age + label_change_properties: Change properties + label_general: General + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: LDAP authentication + label_downloads_abbr: D/L + label_optional_description: Optional description + label_add_another_file: Add another file + label_preferences: Preferences + label_chronological_order: In chronological order + label_reverse_chronological_order: In reverse chronological order + label_incoming_emails: Incoming emails + label_generate_key: Generate a key + label_issue_watchers: Watchers + label_example: Example + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Groups + label_group_new: New group + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + label_profile: Profile + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_issues_visibility_all: All issues + label_issues_visibility_public: All non private issues + label_issues_visibility_own: Issues created by or assigned to the user + label_git_report_last_commit: Report last commit for files and directories + label_parent_revision: Parent + label_child_revision: Child + label_export_options: "%{export_format} export options" + label_copy_attachments: Copy attachments + label_item_position: "%{position} of %{count}" + label_completed_versions: Completed versions + label_search_for_watchers: Search for watchers to add + + button_login: Login + button_submit: Submit + button_save: Save + button_check_all: Check all + button_uncheck_all: Uncheck all + button_collapse_all: Collapse all + button_expand_all: Expand all + button_delete: Delete + button_create: Create + button_create_and_continue: Create and continue + button_test: Test + button_edit: Edit + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + button_add: Add + button_change: Change + button_apply: Apply + button_clear: Clear + button_lock: Lock + button_unlock: Unlock + button_download: Download + button_list: List + button_view: View + button_move: Move + button_move_and_follow: Move and follow + button_back: Back + button_cancel: Cancel + button_activate: Activate + button_sort: Sort + button_log_time: Log time + button_rollback: Rollback to this version + button_watch: Watch + button_unwatch: Unwatch + button_reply: Reply + button_archive: Archive + button_unarchive: Unarchive + button_reset: Reset + button_rename: Rename + button_change_password: Change password + button_copy: Copy + button_copy_and_follow: Copy and follow + button_annotate: Annotate + button_update: Update + button_configure: Configure + button_quote: Quote + button_duplicate: Duplicate + button_show: Show + button_edit_section: Edit this section + button_export: Export + button_delete_my_account: Delete my account + + status_active: active + status_registered: registered + status_locked: locked + + version_status_open: open + version_status_locked: locked + version_status_closed: closed + + field_active: Active + + text_select_mail_notifications: Select actions for which email notifications should be sent. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 means no restriction + text_project_destroy_confirmation: Are you sure you want to delete this project and related data? + text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Are you sure? + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_changed_no_detail: "%{label} updated" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + text_journal_added: "%{label} %{value} added" + text_tip_issue_begin_day: issue beginning this day + text_tip_issue_end_day: issue ending this day + text_tip_issue_begin_end_day: issue beginning and ending this day + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' + text_caracters_maximum: "%{count} characters maximum." + text_caracters_minimum: "Must be at least %{count} characters long." + text_length_between: "Length between %{min} and %{max} characters." + text_tracker_no_workflow: No workflow defined for this tracker + text_unallowed_characters: Unallowed characters + text_comma_separated: Multiple values allowed (comma separated). + text_line_separated: Multiple values allowed (one line for each value). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Issue %{id} has been reported by %{author}." + text_issue_updated: "Issue %{id} has been updated by %{author}." + text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? + text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" + text_issue_category_destroy_assignments: Remove category assignments + text_issue_category_reassign_to: Reassign issues to this category + text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Load the default configuration + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_time_logged_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' + text_issues_destroy_descendants_confirmation: "This will also delete %{count} subtask(s)." + text_time_entries_destroy_confirmation: 'Are you sure you want to delete the selected time entr(y/ies)?' + text_select_project_modules: 'Select modules to enable for this project:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Attachments directory writable + text_plugin_assets_writable: Plugin assets directory writable + text_rmagick_available: RMagick available (optional) + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" + text_destroy_time_entries: Delete reported hours + text_assign_time_entries_to_project: Assign reported hours to the project + text_reassign_time_entries: 'Reassign reported hours to this issue:' + text_user_wrote: "%{value} wrote:" + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + text_zoom_in: Zoom in + text_zoom_out: Zoom out + text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page." + text_scm_path_encoding_note: "Default: UTF-8" + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + text_issue_conflict_resolution_overwrite: "Apply my changes anyway (previous notes will be kept but some changes may be overwritten)" + text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes" + text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}" + text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it." + + default_role_manager: Manager + default_role_developer: Developer + default_role_reporter: Reporter + default_tracker_bug: Bug + default_tracker_feature: Feature + default_tracker_support: Support + default_issue_status_new: New + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Resolved + default_issue_status_feedback: Feedback + default_issue_status_closed: Closed + default_issue_status_rejected: Rejected + default_doc_category_user: User documentation + default_doc_category_tech: Technical documentation + default_priority_low: Low + default_priority_normal: Normal + default_priority_high: High + default_priority_urgent: Urgent + default_priority_immediate: Immediate + default_activity_design: Design + default_activity_development: Development + + enumeration_issue_priorities: Issue priorities + enumeration_doc_categories: Document categories + enumeration_activities: Activities (time tracking) + enumeration_system_activity: System Activity + description_filter: Filter + description_search: Searchfield + description_choose_project: Projects + description_project_scope: Search scope + description_notes: Notes + description_message_content: Message content + description_query_sort_criteria_attribute: Sort attribute + description_query_sort_criteria_direction: Sort direction + description_user_mail_notification: Mail notification settings + description_available_columns: Available Columns + description_selected_columns: Selected Columns + description_all_columns: All Columns + description_issue_category_reassign: Choose issue category + description_wiki_subpages_reassign: Choose new parent page + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: te gjitha + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Total + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_footer: Email footer + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API key + setting_lost_password: Fjalekalim i humbur + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/sr-YU.yml b/config/locales/sr-YU.yml new file mode 100644 index 0000000..550886b --- /dev/null +++ b/config/locales/sr-YU.yml @@ -0,0 +1,1232 @@ +# Serbian translations for Redmine +# by Vladimir Medarović (vlada@medarovic.com) +sr-YU: + direction: ltr + jquery: + locale: "sr" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d.%m.%Y." + short: "%e %b" + long: "%B %e, %Y" + + day_names: [nedelja, ponedeljak, utorak, sreda, četvrtak, petak, subota] + abbr_day_names: [ned, pon, uto, sre, čet, pet, sub] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, januar, februar, mart, april, maj, jun, jul, avgust, septembar, oktobar, novembar, decembar] + abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, avg, sep, okt, nov, dec] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d.%m.%Y. u %H:%M" + time: "%H:%M" + short: "%d. %b u %H:%M" + long: "%d. %B %Y u %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "pola minuta" + less_than_x_seconds: + one: "manje od jedne sekunde" + other: "manje od %{count} sek." + x_seconds: + one: "jedna sekunda" + other: "%{count} sek." + less_than_x_minutes: + one: "manje od minuta" + other: "manje od %{count} min." + x_minutes: + one: "jedan minut" + other: "%{count} min." + about_x_hours: + one: "približno jedan sat" + other: "približno %{count} sati" + x_hours: + one: "1 sat" + other: "%{count} sati" + x_days: + one: "jedan dan" + other: "%{count} dana" + about_x_months: + one: "približno jedan mesec" + other: "približno %{count} meseci" + x_months: + one: "jedan mesec" + other: "%{count} meseci" + about_x_years: + one: "približno godinu dana" + other: "približno %{count} god." + over_x_years: + one: "preko godinu dana" + other: "preko %{count} god." + almost_x_years: + one: "skoro godinu dana" + other: "skoro %{count} god." + + number: + format: + separator: "," + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "i" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "nije uključen u spisak" + exclusion: "je rezervisan" + invalid: "je neispravan" + confirmation: "potvrda ne odgovara" + accepted: "mora biti prihvaćen" + empty: "ne može biti prazno" + blank: "ne može biti prazno" + too_long: "je predugačka (maksimum znakova je %{count})" + too_short: "je prekratka (minimum znakova je %{count})" + wrong_length: "je pogrešne dužine (broj znakova mora biti %{count})" + taken: "je već u upotrebi" + not_a_number: "nije broj" + not_a_date: "nije ispravan datum" + greater_than: "mora biti veći od %{count}" + greater_than_or_equal_to: "mora biti veći ili jednak %{count}" + equal_to: "mora biti jednak %{count}" + less_than: "mora biti manji od %{count}" + less_than_or_equal_to: "mora biti manji ili jednak %{count}" + odd: "mora biti paran" + even: "mora biti neparan" + greater_than_start_date: "mora biti veći od početnog datuma" + not_same_project: "ne pripada istom projektu" + circular_dependency: "Ova veza će stvoriti kružnu referencu" + cant_link_an_issue_with_a_descendant: "Problem ne može biti povezan sa jednim od svojih podzadataka" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Molim odaberite + + general_text_No: 'Ne' + general_text_Yes: 'Da' + general_text_no: 'ne' + general_text_yes: 'da' + general_lang_name: 'Serbian (Srpski)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Nalog je uspešno ažuriran. + notice_account_invalid_credentials: Neispravno korisničko ime ili lozinka. + notice_account_password_updated: Lozinka je uspešno ažurirana. + notice_account_wrong_password: Pogrešna lozinka + notice_account_register_done: Korisnički nalog je uspešno kreiran. Kliknite na link koji ste dobili u e-poruci za aktivaciju. + notice_account_unknown_email: Nepoznat korisnik. + notice_can_t_change_password: Ovaj korisnički nalog za potvrdu identiteta koristi spoljni izvor. Nemoguće je promeniti lozinku. + notice_account_lost_email_sent: Poslata vam je e-poruka sa uputstvom za izbor nove lozinke + notice_account_activated: Vaš korisnički nalog je aktiviran. Sada se možete prijaviti. + notice_successful_create: Uspešno kreiranje. + notice_successful_update: Uspešno ažuriranje. + notice_successful_delete: Uspešno brisanje. + notice_successful_connection: Uspešno povezivanje. + notice_file_not_found: Strana kojoj želite pristupiti ne postoji ili je uklonjena. + notice_locking_conflict: Podatak je ažuriran od strane drugog korisnika. + notice_not_authorized: Niste ovlašćeni za pristup ovoj strani. + notice_email_sent: "E-poruka je poslata na %{value}" + notice_email_error: "Dogodila se greška prilikom slanja e-poruke (%{value})" + notice_feeds_access_key_reseted: Vaš Atom pristupni ključ je poništen. + notice_api_access_key_reseted: Vaš API pristupni ključ je poništen. + notice_failed_to_save_issues: "Neuspešno snimanje %{count} problema od %{total} odabranih: %{ids}." + notice_failed_to_save_members: "Neuspešno snimanje člana(ova): %{errors}." + notice_no_issue_selected: "Ni jedan problem nije odabran! Molimo, odaberite problem koji želite da menjate." + notice_account_pending: "Vaš nalog je kreiran i čeka na odobrenje administratora." + notice_default_data_loaded: Podrazumevano konfigurisanje je uspešno učitano. + notice_unable_delete_version: Verziju je nemoguće izbrisati. + notice_unable_delete_time_entry: Stavku evidencije vremena je nemoguće izbrisati. + notice_issue_done_ratios_updated: Odnos rešenih problema je ažuriran. + + error_can_t_load_default_data: "Podrazumevano konfigurisanje je nemoguće učitati: %{value}" + error_scm_not_found: "Stavka ili ispravka nisu pronađene u spremištu." + error_scm_command_failed: "Greška se javila prilikom pokušaja pristupa spremištu: %{value}" + error_scm_annotate: "Stavka ne postoji ili ne može biti označena." + error_issue_not_found_in_project: 'Problem nije pronađen ili ne pripada ovom projektu.' + error_no_tracker_in_project: 'Ni jedno praćenje nije povezano sa ovim projektom. Molimo proverite podešavanja projekta.' + error_no_default_issue_status: 'Podrazumevani status problema nije definisan. Molimo proverite vaše konfigurisanje (idite na "Administracija -> Statusi problema").' + error_can_not_delete_custom_field: Nemoguće je izbrisati prilagođeno polje + error_can_not_delete_tracker: "Ovo praćenje sadrži probleme i ne može biti obrisano." + error_can_not_remove_role: "Ova uloga je u upotrebi i ne može biti obrisana." + error_can_not_reopen_issue_on_closed_version: 'Problem dodeljen zatvorenoj verziji ne može biti ponovo otvoren' + error_can_not_archive_project: Ovaj projekat se ne može arhivirati + error_issue_done_ratios_not_updated: "Odnos rešenih problema nije ažuriran." + error_workflow_copy_source: 'Molimo odaberite izvorno praćenje ili ulogu' + error_workflow_copy_target: 'Molimo odaberite odredišno praćenje i ulogu' + error_unable_delete_issue_status: 'Status problema je nemoguće obrisati' + error_unable_to_connect: "Povezivanje sa (%{value}) je nemoguće" + warning_attachments_not_saved: "%{count} datoteka ne može biti snimljena." + + mail_subject_lost_password: "Vaša %{value} lozinka" + mail_body_lost_password: 'Za promenu vaše lozinke, kliknite na sledeći link:' + mail_subject_register: "Aktivacija vašeg %{value} naloga" + mail_body_register: 'Za aktivaciju vašeg naloga, kliknite na sledeći link:' + mail_body_account_information_external: "Vaš nalog %{value} možete koristiti za prijavu." + mail_body_account_information: Informacije o vašem nalogu + mail_subject_account_activation_request: "Zahtev za aktivaciju naloga %{value}" + mail_body_account_activation_request: "Novi korisnik (%{value}) je registrovan. Nalog čeka na vaše odobrenje:" + mail_subject_reminder: "%{count} problema dospeva narednih %{days} dana" + mail_body_reminder: "%{count} problema dodeljenih vama dospeva u narednih %{days} dana:" + mail_subject_wiki_content_added: "Wiki stranica '%{id}' je dodata" + mail_body_wiki_content_added: "%{author} je dodao wiki stranicu '%{id}'." + mail_subject_wiki_content_updated: "Wiki stranica '%{id}' je ažurirana" + mail_body_wiki_content_updated: "%{author} je ažurirao wiki stranicu '%{id}'." + + + field_name: Naziv + field_description: Opis + field_summary: Rezime + field_is_required: Obavezno + field_firstname: Ime + field_lastname: Prezime + field_mail: E-adresa + field_filename: Datoteka + field_filesize: Veličina + field_downloads: Preuzimanja + field_author: Autor + field_created_on: Kreirano + field_updated_on: Ažurirano + field_field_format: Format + field_is_for_all: Za sve projekte + field_possible_values: Moguće vrednosti + field_regexp: Regularan izraz + field_min_length: Minimalna dužina + field_max_length: Maksimalna dužina + field_value: Vrednost + field_category: Kategorija + field_title: Naslov + field_project: Projekat + field_issue: Problem + field_status: Status + field_notes: Beleške + field_is_closed: Zatvoren problem + field_is_default: Podrazumevana vrednost + field_tracker: Praćenje + field_subject: Predmet + field_due_date: Krajnji rok + field_assigned_to: Dodeljeno + field_priority: Prioritet + field_fixed_version: Odredišna verzija + field_user: Korisnik + field_principal: Glavni + field_role: Uloga + field_homepage: Početna stranica + field_is_public: Javno objavljivanje + field_parent: Potprojekat od + field_is_in_roadmap: Problemi prikazani u planu rada + field_login: Korisničko ime + field_mail_notification: Obaveštenja putem e-pošte + field_admin: Administrator + field_last_login_on: Poslednje povezivanje + field_language: Jezik + field_effective_date: Datum + field_password: Lozinka + field_new_password: Nova lozinka + field_password_confirmation: Potvrda lozinke + field_version: Verzija + field_type: Tip + field_host: Glavni računar + field_port: Port + field_account: Korisnički nalog + field_base_dn: Bazni DN + field_attr_login: Atribut prijavljivanja + field_attr_firstname: Atribut imena + field_attr_lastname: Atribut prezimena + field_attr_mail: Atribut e-adrese + field_onthefly: Kreiranje korisnika u toku rada + field_start_date: Početak + field_done_ratio: "% urađeno" + field_auth_source: Režim potvrde identiteta + field_hide_mail: Sakrij moju e-adresu + field_comments: Komentar + field_url: URL + field_start_page: Početna stranica + field_subproject: Potprojekat + field_hours: sati + field_activity: Aktivnost + field_spent_on: Datum + field_identifier: Identifikator + field_is_filter: Upotrebi kao filter + field_issue_to: Srodni problemi + field_delay: Kašnjenje + field_assignable: Problem može biti dodeljen ovoj ulozi + field_redirect_existing_links: Preusmeri postojeće veze + field_estimated_hours: Procenjeno vreme + field_column_names: Kolone + field_time_zone: Vremenska zona + field_searchable: Može da se pretražuje + field_default_value: Podrazumevana vrednost + field_comments_sorting: Prikaži komentare + field_parent_title: Matična stranica + field_editable: Izmenljivo + field_watcher: Posmatrač + field_identity_url: OpenID URL + field_content: Sadržaj + field_group_by: Grupisanje rezultata po + field_sharing: Deljenje + field_parent_issue: Matični zadatak + + setting_app_title: Naslov aplikacije + setting_app_subtitle: Podnaslov aplikacije + setting_welcome_text: Tekst dobrodošlice + setting_default_language: Podrazumevani jezik + setting_login_required: Obavezna potvrda identiteta + setting_self_registration: Samoregistracija + setting_attachment_max_size: Maks. veličina priložene datoteke + setting_issues_export_limit: Ograničenje izvoza „problema“ + setting_mail_from: E-adresa pošiljaoca + setting_bcc_recipients: Primaoci „Bcc“ kopije + setting_plain_text_mail: Poruka sa čistim tekstom (bez HTML-a) + setting_host_name: Putanja i naziv glavnog računara + setting_text_formatting: Oblikovanje teksta + setting_wiki_compression: Kompresija Wiki istorije + setting_feeds_limit: Ograničenje sadržaja izvora vesti + setting_default_projects_public: Podrazumeva se javno prikazivanje novih projekata + setting_autofetch_changesets: Izvršavanje automatskog preuzimanja + setting_sys_api_enabled: Omogućavanje WS za upravljanje spremištem + setting_commit_ref_keywords: Referenciranje ključnih reči + setting_commit_fix_keywords: Popravljanje ključnih reči + setting_autologin: Automatska prijava + setting_date_format: Format datuma + setting_time_format: Format vremena + setting_cross_project_issue_relations: Dozvoli povezivanje problema iz unakrsnih projekata + setting_issue_list_default_columns: Podrazumevane kolone prikazane na spisku problema + setting_emails_footer: Podnožje stranice e-poruke + setting_protocol: Protokol + setting_per_page_options: Opcije prikaza objekata po stranici + setting_user_format: Format prikaza korisnika + setting_activity_days_default: Broj dana prikazanih na projektnoj aktivnosti + setting_display_subprojects_issues: Prikazuj probleme iz potprojekata na glavnom projektu, ukoliko nije drugačije navedeno + setting_enabled_scm: Omogućavanje SCM + setting_mail_handler_body_delimiters: "Skraćivanje e-poruke nakon jedne od ovih linija" + setting_mail_handler_api_enabled: Omogućavanje WS dolazne e-poruke + setting_mail_handler_api_key: API ključ + setting_sequential_project_identifiers: Generisanje sekvencijalnog imena projekta + setting_gravatar_enabled: Koristi Gravatar korisničke ikone + setting_gravatar_default: Podrazumevana Gravatar slika + setting_diff_max_lines_displayed: Maks. broj prikazanih različitih linija + setting_file_max_size_displayed: Maks. veličina tekst. datoteka prikazanih umetnuto + setting_repository_log_display_limit: Maks. broj revizija prikazanih u datoteci za evidenciju + setting_openid: Dozvoli OpenID prijavu i registraciju + setting_password_min_length: Minimalna dužina lozinke + setting_new_project_user_role_id: Kreatoru projekta (koji nije administrator) dodeljuje je uloga + setting_default_projects_modules: Podrazumevano omogućeni moduli za nove projekte + setting_issue_done_ratio: Izračunaj odnos rešenih problema + setting_issue_done_ratio_issue_field: koristeći polje problema + setting_issue_done_ratio_issue_status: koristeći status problema + setting_start_of_week: Prvi dan u sedmici + setting_rest_api_enabled: Omogući REST web usluge + setting_cache_formatted_text: Keširanje obrađenog teksta + + permission_add_project: Kreiranje projekta + permission_add_subprojects: Kreiranje potpojekta + permission_edit_project: Izmena projekata + permission_select_project_modules: Odabiranje modula projekta + permission_manage_members: Upravljanje članovima + permission_manage_project_activities: Upravljanje projektnim aktivnostima + permission_manage_versions: Upravljanje verzijama + permission_manage_categories: Upravljanje kategorijama problema + permission_view_issues: Pregled problema + permission_add_issues: Dodavanje problema + permission_edit_issues: Izmena problema + permission_manage_issue_relations: Upravljanje vezama između problema + permission_add_issue_notes: Dodavanje beleški + permission_edit_issue_notes: Izmena beleški + permission_edit_own_issue_notes: Izmena sopstvenih beleški + permission_move_issues: Pomeranje problema + permission_delete_issues: Brisanje problema + permission_manage_public_queries: Upravljanje javnim upitima + permission_save_queries: Snimanje upita + permission_view_gantt: Pregledanje Gantovog dijagrama + permission_view_calendar: Pregledanje kalendara + permission_view_issue_watchers: Pregledanje spiska posmatrača + permission_add_issue_watchers: Dodavanje posmatrača + permission_delete_issue_watchers: Brisanje posmatrača + permission_log_time: Beleženje utrošenog vremena + permission_view_time_entries: Pregledanje utrošenog vremena + permission_edit_time_entries: Izmena utrošenog vremena + permission_edit_own_time_entries: Izmena sopstvenog utrošenog vremena + permission_manage_news: Upravljanje vestima + permission_comment_news: Komentarisanje vesti + permission_view_documents: Pregledanje dokumenata + permission_manage_files: Upravljanje datotekama + permission_view_files: Pregledanje datoteka + permission_manage_wiki: Upravljanje wiki stranicama + permission_rename_wiki_pages: Promena imena wiki stranicama + permission_delete_wiki_pages: Brisanje wiki stranica + permission_view_wiki_pages: Pregledanje wiki stranica + permission_view_wiki_edits: Pregledanje wiki istorije + permission_edit_wiki_pages: Izmena wiki stranica + permission_delete_wiki_pages_attachments: Brisanje priloženih datoteka + permission_protect_wiki_pages: Zaštita wiki stranica + permission_manage_repository: Upravljanje spremištem + permission_browse_repository: Pregledanje spremišta + permission_view_changesets: Pregledanje skupa promena + permission_commit_access: Potvrda pristupa + permission_manage_boards: Upravljanje forumima + permission_view_messages: Pregledanje poruka + permission_add_messages: Slanje poruka + permission_edit_messages: Izmena poruka + permission_edit_own_messages: Izmena sopstvenih poruka + permission_delete_messages: Brisanje poruka + permission_delete_own_messages: Brisanje sopstvenih poruka + permission_export_wiki_pages: Izvoz wiki stranica + permission_manage_subtasks: Upravljanje podzadacima + + project_module_issue_tracking: Praćenje problema + project_module_time_tracking: Praćenje vremena + project_module_news: Vesti + project_module_documents: Dokumenti + project_module_files: Datoteke + project_module_wiki: Wiki + project_module_repository: Spremište + project_module_boards: Forumi + + label_user: Korisnik + label_user_plural: Korisnici + label_user_new: Novi korisnik + label_user_anonymous: Anoniman + label_project: Projekat + label_project_new: Novi projekat + label_project_plural: Projekti + label_x_projects: + zero: nema projekata + one: jedan projekat + other: "%{count} projekata" + label_project_all: Svi projekti + label_project_latest: Poslednji projekti + label_issue: Problem + label_issue_new: Novi problem + label_issue_plural: Problemi + label_issue_view_all: Prikaz svih problema + label_issues_by: "Problemi (%{value})" + label_issue_added: Problem je dodat + label_issue_updated: Problem je ažuriran + label_document: Dokument + label_document_new: Novi dokument + label_document_plural: Dokumenti + label_document_added: Dokument je dodat + label_role: Uloga + label_role_plural: Uloge + label_role_new: Nova uloga + label_role_and_permissions: Uloge i dozvole + label_member: Član + label_member_new: Novi član + label_member_plural: Članovi + label_tracker: Praćenje + label_tracker_plural: Praćenja + label_tracker_new: Novo praćenje + label_workflow: Tok posla + label_issue_status: Status problema + label_issue_status_plural: Statusi problema + label_issue_status_new: Novi status + label_issue_category: Kategorija problema + label_issue_category_plural: Kategorije problema + label_issue_category_new: Nova kategorija + label_custom_field: Prilagođeno polje + label_custom_field_plural: Prilagođena polja + label_custom_field_new: Novo prilagođeno polje + label_enumerations: Nabrojiva lista + label_enumeration_new: Nova vrednost + label_information: Informacija + label_information_plural: Informacije + label_please_login: Molimo, prijavite se + label_register: Registracija + label_login_with_open_id_option: ili prijava sa OpenID + label_password_lost: Izgubljena lozinka + label_home: Početak + label_my_page: Moja stranica + label_my_account: Moj nalog + label_my_projects: Moji projekti + label_administration: Administracija + label_login: Prijava + label_logout: Odjava + label_help: Pomoć + label_reported_issues: Prijavljeni problemi + label_assigned_to_me_issues: Problemi dodeljeni meni + label_last_login: Poslednje povezivanje + label_registered_on: Registrovan + label_activity: Aktivnost + label_overall_activity: Celokupna aktivnost + label_user_activity: "Aktivnost korisnika %{value}" + label_new: Novo + label_logged_as: Prijavljeni ste kao + label_environment: Okruženje + label_authentication: Potvrda identiteta + label_auth_source: Režim potvrde identiteta + label_auth_source_new: Novi režim potvrde identiteta + label_auth_source_plural: Režimi potvrde identiteta + label_subproject_plural: Potprojekti + label_subproject_new: Novi potprojekat + label_and_its_subprojects: "%{value} i njegovi potprojekti" + label_min_max_length: Min. - Maks. dužina + label_list: Spisak + label_date: Datum + label_integer: Ceo broj + label_float: Sa pokretnim zarezom + label_boolean: Logički operator + label_string: Tekst + label_text: Dugi tekst + label_attribute: Osobina + label_attribute_plural: Osobine + label_no_data: Nema podataka za prikazivanje + label_change_status: Promena statusa + label_history: Istorija + label_attachment: Datoteka + label_attachment_new: Nova datoteka + label_attachment_delete: Brisanje datoteke + label_attachment_plural: Datoteke + label_file_added: Datoteka je dodata + label_report: Izveštaj + label_report_plural: Izveštaji + label_news: Vesti + label_news_new: Dodavanje vesti + label_news_plural: Vesti + label_news_latest: Poslednje vesti + label_news_view_all: Prikaz svih vesti + label_news_added: Vesti su dodate + label_settings: Podešavanja + label_overview: Pregled + label_version: Verzija + label_version_new: Nova verzija + label_version_plural: Verzije + label_close_versions: Zatvori završene verzije + label_confirmation: Potvrda + label_export_to: 'Takođe dostupno i u varijanti:' + label_read: Čitanje... + label_public_projects: Javni projekti + label_open_issues: otvoren + label_open_issues_plural: otvorenih + label_closed_issues: zatvoren + label_closed_issues_plural: zatvorenih + label_x_open_issues_abbr: + zero: 0 otvorenih + one: 1 otvoren + other: "%{count} otvorenih" + label_x_closed_issues_abbr: + zero: 0 zatvorenih + one: 1 zatvoren + other: "%{count} zatvorenih" + label_total: Ukupno + label_permissions: Dozvole + label_current_status: Trenutni status + label_new_statuses_allowed: Novi statusi dozvoljeni + label_all: svi + label_none: nijedan + label_nobody: nikome + label_next: Sledeće + label_previous: Prethodno + label_used_by: Koristio + label_details: Detalji + label_add_note: Dodaj belešku + label_calendar: Kalendar + label_months_from: meseci od + label_gantt: Gantov dijagram + label_internal: Unutrašnji + label_last_changes: "poslednjih %{count} promena" + label_change_view_all: Prikaži sve promene + label_comment: Komentar + label_comment_plural: Komentari + label_x_comments: + zero: bez komentara + one: jedan komentar + other: "%{count} komentara" + label_comment_add: Dodaj komentar + label_comment_added: Komentar dodat + label_comment_delete: Obriši komentare + label_query: Prilagođen upit + label_query_plural: Prilagođeni upiti + label_query_new: Novi upit + label_filter_add: Dodavanje filtera + label_filter_plural: Filteri + label_equals: je + label_not_equals: nije + label_in_less_than: manje od + label_in_more_than: više od + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: u + label_today: danas + label_all_time: sve vreme + label_yesterday: juče + label_this_week: ove sedmice + label_last_week: poslednje sedmice + label_last_n_days: "poslednjih %{count} dana" + label_this_month: ovog meseca + label_last_month: poslednjeg meseca + label_this_year: ove godine + label_date_range: Vremenski period + label_less_than_ago: pre manje od nekoliko dana + label_more_than_ago: pre više od nekoliko dana + label_ago: pre nekoliko dana + label_contains: sadrži + label_not_contains: ne sadrži + label_day_plural: dana + label_repository: Spremište + label_repository_plural: Spremišta + label_browse: Pregledanje + label_branch: Grana + label_tag: Oznaka + label_revision: Revizija + label_revision_plural: Revizije + label_revision_id: "Revizija %{value}" + label_associated_revisions: Pridružene revizije + label_added: dodato + label_modified: promenjeno + label_copied: kopirano + label_renamed: preimenovano + label_deleted: izbrisano + label_latest_revision: Poslednja revizija + label_latest_revision_plural: Poslednje revizije + label_view_revisions: Pregled revizija + label_view_all_revisions: Pregled svih revizija + label_max_size: Maksimalna veličina + label_sort_highest: Premeštanje na vrh + label_sort_higher: Premeštanje na gore + label_sort_lower: Premeštanje na dole + label_sort_lowest: Premeštanje na dno + label_roadmap: Plan rada + label_roadmap_due_in: "Dospeva %{value}" + label_roadmap_overdue: "%{value} najkasnije" + label_roadmap_no_issues: Nema problema za ovu verziju + label_search: Pretraga + label_result_plural: Rezultati + label_all_words: Sve reči + label_wiki: Wiki + label_wiki_edit: Wiki izmena + label_wiki_edit_plural: Wiki izmene + label_wiki_page: Wiki stranica + label_wiki_page_plural: Wiki stranice + label_index_by_title: Indeksiranje po naslovu + label_index_by_date: Indeksiranje po datumu + label_current_version: Trenutna verzija + label_preview: Pregled + label_feed_plural: Izvori vesti + label_changes_details: Detalji svih promena + label_issue_tracking: Praćenje problema + label_spent_time: Utrošeno vreme + label_overall_spent_time: Celokupno utrošeno vreme + label_f_hour: "%{value} sat" + label_f_hour_plural: "%{value} sati" + label_time_tracking: Praćenje vremena + label_change_plural: Promene + label_statistics: Statistika + label_commits_per_month: Izvršenja mesečno + label_commits_per_author: Izvršenja po autoru + label_view_diff: Pogledaj razlike + label_diff_inline: unutra + label_diff_side_by_side: uporedo + label_options: Opcije + label_copy_workflow_from: Kopiranje toka posla od + label_permissions_report: Izveštaj o dozvolama + label_watched_issues: Posmatrani problemi + label_related_issues: Srodni problemi + label_applied_status: Primenjeni statusi + label_loading: Učitavanje... + label_relation_new: Nova relacija + label_relation_delete: Brisanje relacije + label_relates_to: srodnih sa + label_duplicates: dupliranih + label_duplicated_by: dupliranih od + label_blocks: odbijenih + label_blocked_by: odbijenih od + label_precedes: prethodi + label_follows: praćenih + label_stay_logged_in: Ostanite prijavljeni + label_disabled: onemogućeno + label_show_completed_versions: Prikazivanje završene verzije + label_me: meni + label_board: Forum + label_board_new: Novi forum + label_board_plural: Forumi + label_board_locked: Zaključana + label_board_sticky: Lepljiva + label_topic_plural: Teme + label_message_plural: Poruke + label_message_last: Poslednja poruka + label_message_new: Nova poruka + label_message_posted: Poruka je dodata + label_reply_plural: Odgovori + label_send_information: Pošalji korisniku detalje naloga + label_year: Godina + label_month: Mesec + label_week: Sedmica + label_date_from: Šalje + label_date_to: Prima + label_language_based: Bazirano na jeziku korisnika + label_sort_by: "Sortirano po %{value}" + label_send_test_email: Slanje probne e-poruke + label_feeds_access_key: Atom pristupni ključ + label_missing_feeds_access_key: Atom pristupni ključ nedostaje + label_feeds_access_key_created_on: "Atom pristupni ključ je napravljen pre %{value}" + label_module_plural: Moduli + label_added_time_by: "Dodao %{author} pre %{age}" + label_updated_time_by: "Ažurirao %{author} pre %{age}" + label_updated_time: "Ažurirano pre %{value}" + label_jump_to_a_project: Skok na projekat... + label_file_plural: Datoteke + label_changeset_plural: Skupovi promena + label_default_columns: Podrazumevane kolone + label_no_change_option: (Bez promena) + label_bulk_edit_selected_issues: Grupna izmena odabranih problema + label_theme: Tema + label_default: Podrazumevano + label_search_titles_only: Pretražuj samo naslove + label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" + label_user_mail_option_selected: "Za bilo koji događaj na samo odabranim projektima..." + label_user_mail_no_self_notified: "Ne želim biti obaveštavan za promene koje sam pravim" + label_registration_activation_by_email: aktivacija naloga putem e-poruke + label_registration_manual_activation: ručna aktivacija naloga + label_registration_automatic_activation: automatska aktivacija naloga + label_display_per_page: "Broj stavki po stranici: %{value}" + label_age: Starost + label_change_properties: Promeni svojstva + label_general: Opšti + label_scm: SCM + label_plugins: Dodatne komponente + label_ldap_authentication: LDAP potvrda identiteta + label_downloads_abbr: D/L + label_optional_description: Opciono opis + label_add_another_file: Dodaj još jednu datoteku + label_preferences: Podešavanja + label_chronological_order: po hronološkom redosledu + label_reverse_chronological_order: po obrnutom hronološkom redosledu + label_incoming_emails: Dolazne e-poruke + label_generate_key: Generisanje ključa + label_issue_watchers: Posmatrači + label_example: Primer + label_display: Prikaz + label_sort: Sortiranje + label_ascending: Rastući niz + label_descending: Opadajući niz + label_date_from_to: Od %{start} do %{end} + label_wiki_content_added: Wiki stranica je dodata + label_wiki_content_updated: Wiki stranica je ažurirana + label_group: Grupa + label_group_plural: Grupe + label_group_new: Nova grupa + label_time_entry_plural: Utrošeno vreme + label_version_sharing_none: Nije deljeno + label_version_sharing_descendants: Sa potprojektima + label_version_sharing_hierarchy: Sa hijerarhijom projekta + label_version_sharing_tree: Sa stablom projekta + label_version_sharing_system: Sa svim projektima + label_update_issue_done_ratios: Ažuriraj odnos rešenih problema + label_copy_source: Izvor + label_copy_target: Odredište + label_copy_same_as_target: Isto kao odredište + label_display_used_statuses_only: Prikazuj statuse korišćene samo od strane ovog praćenja + label_api_access_key: API pristupni ključ + label_missing_api_access_key: Nedostaje API pristupni ključ + label_api_access_key_created_on: "API pristupni ključ je kreiran pre %{value}" + label_profile: Profil + label_subtask_plural: Podzadatak + label_project_copy_notifications: Pošalji e-poruku sa obaveštenjem prilikom kopiranja projekta + + button_login: Prijava + button_submit: Pošalji + button_save: Snimi + button_check_all: Uključi sve + button_uncheck_all: Isključi sve + button_delete: Izbriši + button_create: Kreiraj + button_create_and_continue: Kreiraj i nastavi + button_test: Test + button_edit: Izmeni + button_add: Dodaj + button_change: Promeni + button_apply: Primeni + button_clear: Obriši + button_lock: Zaključaj + button_unlock: Otključaj + button_download: Preuzmi + button_list: Spisak + button_view: Prikaži + button_move: Pomeri + button_move_and_follow: Pomeri i prati + button_back: Nazad + button_cancel: Poništi + button_activate: Aktiviraj + button_sort: Sortiraj + button_log_time: Evidentiraj vreme + button_rollback: Povratak na ovu verziju + button_watch: Prati + button_unwatch: Ne prati više + button_reply: Odgovori + button_archive: Arhiviraj + button_unarchive: Vrati iz arhive + button_reset: Poništi + button_rename: Preimenuj + button_change_password: Promeni lozinku + button_copy: Kopiraj + button_copy_and_follow: Kopiraj i prati + button_annotate: Pribeleži + button_update: Ažuriraj + button_configure: Podesi + button_quote: Pod navodnicima + button_duplicate: Dupliraj + button_show: Prikaži + + status_active: aktivni + status_registered: registrovani + status_locked: zaključani + + version_status_open: otvoren + version_status_locked: zaključan + version_status_closed: zatvoren + + field_active: Aktivan + + text_select_mail_notifications: Odaberi akcije za koje će obaveštenje biti poslato putem e-pošte. + text_regexp_info: npr. ^[A-Z0-9]+$ + text_min_max_length_info: 0 znači bez ograničenja + text_project_destroy_confirmation: Jeste li sigurni da želite da izbrišete ovaj projekat i sve pripadajuće podatke? + text_subprojects_destroy_warning: "Potprojekti: %{value} će takođe biti izbrisan." + text_workflow_edit: Odaberite ulogu i praćenje za izmenu toka posla + text_are_you_sure: Jeste li sigurni? + text_journal_changed: "%{label} promenjen od %{old} u %{new}" + text_journal_set_to: "%{label} postavljen u %{value}" + text_journal_deleted: "%{label} izbrisano (%{old})" + text_journal_added: "%{label} %{value} dodato" + text_tip_issue_begin_day: zadatak počinje ovog dana + text_tip_issue_end_day: zadatak se završava ovog dana + text_tip_issue_begin_end_day: zadatak počinje i završava ovog dana + text_caracters_maximum: "Najviše %{count} znak(ova)." + text_caracters_minimum: "Broj znakova mora biti najmanje %{count}." + text_length_between: "Broj znakova mora biti između %{min} i %{max}." + text_tracker_no_workflow: Ovo praćenje nema definisan tok posla + text_unallowed_characters: Nedozvoljeni znakovi + text_comma_separated: Dozvoljene su višestruke vrednosti (odvojene zarezom). + text_line_separated: Dozvoljene su višestruke vrednosti (jedan red za svaku vrednost). + text_issues_ref_in_commit_messages: Referenciranje i popravljanje problema u izvršnim porukama + text_issue_added: "%{author} je prijavio problem %{id}." + text_issue_updated: "%{author} je ažurirao problem %{id}." + text_wiki_destroy_confirmation: Jeste li sigurni da želite da obrišete wiki i sav sadržaj? + text_issue_category_destroy_question: "Nekoliko problema (%{count}) je dodeljeno ovoj kategoriji. Šta želite da uradite?" + text_issue_category_destroy_assignments: Ukloni dodeljene kategorije + text_issue_category_reassign_to: Dodeli ponovo probleme ovoj kategoriji + text_user_mail_option: "Za neizabrane projekte, dobićete samo obaveštenje o stvarima koje pratite ili ste uključeni (npr. problemi čiji ste vi autor ili zastupnik)." + text_no_configuration_data: "Uloge, praćenja, statusi problema i toka posla još uvek nisu podešeni.\nPreporučljivo je da učitate podrazumevano konfigurisanje. Izmena je moguća nakon prvog učitavanja." + text_load_default_configuration: Učitaj podrazumevano konfigurisanje + text_status_changed_by_changeset: "Primenjeno u skupu sa promenama %{value}." + text_issues_destroy_confirmation: 'Jeste li sigurni da želite da izbrišete odabrane probleme?' + text_select_project_modules: 'Odaberite module koje želite omogućiti za ovaj projekat:' + text_default_administrator_account_changed: Podrazumevani administratorski nalog je promenjen + text_file_repository_writable: Fascikla priloženih datoteka je upisiva + text_plugin_assets_writable: Fascikla elemenata dodatnih komponenti je upisiva + text_rmagick_available: RMagick je dostupan (opciono) + text_destroy_time_entries_question: "%{hours} sati je prijavljeno za ovaj problem koji želite izbrisati. Šta želite da uradite?" + text_destroy_time_entries: Izbriši prijavljene sate + text_assign_time_entries_to_project: Dodeli prijavljene sate projektu + text_reassign_time_entries: 'Dodeli ponovo prijavljene sate ovom problemu:' + text_user_wrote: "%{value} je napisao:" + text_enumeration_destroy_question: "%{count} objekat(a) je dodeljeno ovoj vrednosti." + text_enumeration_category_reassign_to: 'Dodeli ih ponovo ovoj vrednosti:' + text_email_delivery_not_configured: "Isporuka e-poruka nije konfigurisana i obaveštenja su onemogućena.\nPodesite vaš SMTP server u config/configuration.yml i pokrenite ponovo aplikaciju za njihovo omogućavanje." + text_repository_usernames_mapping: "Odaberite ili ažurirajte Redmine korisnike mapiranjem svakog korisničkog imena pronađenog u evidenciji spremišta.\nKorisnici sa istim Redmine imenom i imenom spremišta ili e-adresom su automatski mapirani." + text_diff_truncated: '... Ova razlika je isečena jer je dostignuta maksimalna veličina prikaza.' + text_custom_field_possible_values_info: 'Jedan red za svaku vrednost' + text_wiki_page_destroy_question: "Ova stranica ima %{descendants} podređenih stranica i podstranica. Šta želite da uradite?" + text_wiki_page_nullify_children: "Zadrži podređene stranice kao korene stranice" + text_wiki_page_destroy_children: "Izbriši podređene stranice i sve njihove podstranice" + text_wiki_page_reassign_children: "Dodeli ponovo podređene stranice ovoj matičnoj stranici" + text_own_membership_delete_confirmation: "Nakon uklanjanja pojedinih ili svih vaših dozvola nećete više moći da uređujete ovaj projekat.\nŽelite li da nastavite?" + text_zoom_in: Uvećaj + text_zoom_out: Umanji + + default_role_manager: Menadžer + default_role_developer: Programer + default_role_reporter: Izveštač + default_tracker_bug: Greška + default_tracker_feature: Funkcionalnost + default_tracker_support: Podrška + default_issue_status_new: Novo + default_issue_status_in_progress: U toku + default_issue_status_resolved: Rešeno + default_issue_status_feedback: Povratna informacija + default_issue_status_closed: Zatvoreno + default_issue_status_rejected: Odbijeno + default_doc_category_user: Korisnička dokumentacija + default_doc_category_tech: Tehnička dokumentacija + default_priority_low: Nizak + default_priority_normal: Normalan + default_priority_high: Visok + default_priority_urgent: Hitno + default_priority_immediate: Neposredno + default_activity_design: Dizajn + default_activity_development: Razvoj + + enumeration_issue_priorities: Prioriteti problema + enumeration_doc_categories: Kategorije dokumenta + enumeration_activities: Aktivnosti (praćenje vremena) + enumeration_system_activity: Sistemska aktivnost + + field_time_entries: Vreme evidencije + project_module_gantt: Gantov dijagram + project_module_calendar: Kalendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Podrazumevana opcija za notifikaciju + label_user_mail_option_only_my_events: Za dogadjaje koje pratim ili sam u njih uključen + label_user_mail_option_none: Bez obaveštenja + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: Projekat kome pokušavate da pristupite je arhiviran + label_principal_search: "Traži korisnike ili grupe:" + label_user_search: "Traži korisnike:" + field_visible: Vidljivo + setting_emails_header: Email zaglavlje + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Omogući praćenje vremena + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maksimalan broj stavki na gant grafiku + field_warn_on_leaving_unsaved: Upozori me ako napuštam stranu sa tekstom koji nije snimljen + text_warn_on_leaving_unsaved: Strana sadrži tekst koji nije snimljen i biće izgubljen ako je napustite. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} ažuriran" + label_news_comment_added: Komentar dodat u novosti + button_expand_all: Proširi sve + button_collapse_all: Zatvori sve + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Da li ste sigurni da želite da obrišete selektovane stavke ? + label_role_anonymous: Anonimus + label_role_non_member: Nije član + label_issue_note_added: Nota dodana + label_issue_status_updated: Status ažuriran + label_issue_priority_updated: Prioritet ažuriran + label_issues_visibility_own: Problem kreiran od strane ili je dodeljen korisniku + field_issues_visibility: Vidljivost problema + label_issues_visibility_all: Svi problemi + permission_set_own_issues_private: Podesi sopstveni problem kao privatan ili javan + field_is_private: Privatno + permission_set_issues_private: Podesi problem kao privatan ili javan + label_issues_visibility_public: Svi javni problemi + text_issues_destroy_descendants_confirmation: Ova operacija će takođe obrisati %{count} podzadataka. + field_commit_logs_encoding: Kodiranje izvršnih poruka + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 problem + one: 1 problem + other: "%{count} problemi" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: svi + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Sa potprojektima + label_cross_project_tree: Sa stablom projekta + label_cross_project_hierarchy: Sa hijerarhijom projekta + label_cross_project_system: Sa svim projektima + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Ukupno + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: E-adresa + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Celokupno utrošeno vreme + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API ključ + setting_lost_password: Izgubljena lozinka + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/sr.yml b/config/locales/sr.yml new file mode 100644 index 0000000..293fb3f --- /dev/null +++ b/config/locales/sr.yml @@ -0,0 +1,1231 @@ +# Serbian translations for Redmine +# by Vladimir Medarović (vlada@medarovic.com) +sr: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d.%m.%Y." + short: "%e %b" + long: "%B %e, %Y" + + day_names: [недеља, понедељак, уторак, среда, четвртак, петак, субота] + abbr_day_names: [нед, пон, уто, сре, чет, пет, суб] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, јануар, фебруар, март, април, мај, јун, јул, август, септембар, октобар, новембар, децембар] + abbr_month_names: [~, јан, феб, мар, апр, мај, јун, јул, авг, сеп, окт, нов, дец] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%d.%m.%Y. у %H:%M" + time: "%H:%M" + short: "%d. %b у %H:%M" + long: "%d. %B %Y у %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "пола минута" + less_than_x_seconds: + one: "мање од једне секунде" + other: "мање од %{count} сек." + x_seconds: + one: "једна секунда" + other: "%{count} сек." + less_than_x_minutes: + one: "мање од минута" + other: "мање од %{count} мин." + x_minutes: + one: "један минут" + other: "%{count} мин." + about_x_hours: + one: "приближно један сат" + other: "приближно %{count} сати" + x_hours: + one: "1 сат" + other: "%{count} сати" + x_days: + one: "један дан" + other: "%{count} дана" + about_x_months: + one: "приближно један месец" + other: "приближно %{count} месеци" + x_months: + one: "један месец" + other: "%{count} месеци" + about_x_years: + one: "приближно годину дана" + other: "приближно %{count} год." + over_x_years: + one: "преко годину дана" + other: "преко %{count} год." + almost_x_years: + one: "скоро годину дана" + other: "скоро %{count} год." + + number: + format: + separator: "," + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + +# Used in array.to_sentence. + support: + array: + sentence_connector: "и" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "није укључен у списак" + exclusion: "је резервисан" + invalid: "је неисправан" + confirmation: "потврда не одговара" + accepted: "мора бити прихваћен" + empty: "не може бити празно" + blank: "не може бити празно" + too_long: "је предугачка (максимум знакова је %{count})" + too_short: "је прекратка (минимум знакова је %{count})" + wrong_length: "је погрешне дужине (број знакова мора бити %{count})" + taken: "је већ у употреби" + not_a_number: "није број" + not_a_date: "није исправан датум" + greater_than: "мора бити већи од %{count}" + greater_than_or_equal_to: "мора бити већи или једнак %{count}" + equal_to: "мора бити једнак %{count}" + less_than: "мора бити мањи од %{count}" + less_than_or_equal_to: "мора бити мањи или једнак %{count}" + odd: "мора бити паран" + even: "мора бити непаран" + greater_than_start_date: "мора бити већи од почетног датума" + not_same_project: "не припада истом пројекту" + circular_dependency: "Ова веза ће створити кружну референцу" + cant_link_an_issue_with_a_descendant: "Проблем не може бити повезан са једним од својих подзадатака" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: Молим одаберите + + general_text_No: 'Не' + general_text_Yes: 'Да' + general_text_no: 'не' + general_text_yes: 'да' + general_lang_name: 'Serbian Cyrillic (Српски)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Налог је успешно ажуриран. + notice_account_invalid_credentials: Неисправно корисничко име или лозинка. + notice_account_password_updated: Лозинка је успешно ажурирана. + notice_account_wrong_password: Погрешна лозинка + notice_account_register_done: Кориснички налог је успешно креиран. Кликните на линк који сте добили у е-поруци за активацију. + notice_account_unknown_email: Непознат корисник. + notice_can_t_change_password: Овај кориснички налог за потврду идентитета користи спољни извор. Немогуће је променити лозинку. + notice_account_lost_email_sent: Послата вам је е-порука са упутством за избор нове лозинке + notice_account_activated: Ваш кориснички налог је активиран. Сада се можете пријавити. + notice_successful_create: Успешно креирање. + notice_successful_update: Успешно ажурирање. + notice_successful_delete: Успешно брисање. + notice_successful_connection: Успешно повезивање. + notice_file_not_found: Страна којој желите приступити не постоји или је уклоњена. + notice_locking_conflict: Податак је ажуриран од стране другог корисника. + notice_not_authorized: Нисте овлашћени за приступ овој страни. + notice_email_sent: "E-порука је послата на %{value}" + notice_email_error: "Догодила се грешка приликом слања е-поруке (%{value})" + notice_feeds_access_key_reseted: Ваш Atom приступни кључ је поништен. + notice_api_access_key_reseted: Ваш API приступни кључ је поништен. + notice_failed_to_save_issues: "Неуспешно снимање %{count} проблема од %{total} одабраних: %{ids}." + notice_failed_to_save_members: "Неуспешно снимање члана(ова): %{errors}." + notice_no_issue_selected: "Ни један проблем није одабран! Молимо, одаберите проблем који желите да мењате." + notice_account_pending: "Ваш налог је креиран и чека на одобрење администратора." + notice_default_data_loaded: Подразумевано конфигурисање је успешно учитано. + notice_unable_delete_version: Верзију је немогуће избрисати. + notice_unable_delete_time_entry: Ставку евиденције времена је немогуће избрисати. + notice_issue_done_ratios_updated: Однос решених проблема је ажуриран. + + error_can_t_load_default_data: "Подразумевано конфигурисање је немогуће учитати: %{value}" + error_scm_not_found: "Ставка или исправка нису пронађене у спремишту." + error_scm_command_failed: "Грешка се јавила приликом покушаја приступа спремишту: %{value}" + error_scm_annotate: "Ставка не постоји или не може бити означена." + error_issue_not_found_in_project: 'Проблем није пронађен или не припада овом пројекту.' + error_no_tracker_in_project: 'Ни једно праћење није повезано са овим пројектом. Молимо проверите подешавања пројекта.' + error_no_default_issue_status: 'Подразумевани статус проблема није дефинисан. Молимо проверите ваше конфигурисање (идите на "Администрација -> Статуси проблема").' + error_can_not_delete_custom_field: Немогуће је избрисати прилагођено поље + error_can_not_delete_tracker: "Ово праћење садржи проблеме и не може бити обрисано." + error_can_not_remove_role: "Ова улога је у употреби и не може бити обрисана." + error_can_not_reopen_issue_on_closed_version: 'Проблем додељен затвореној верзији не може бити поново отворен' + error_can_not_archive_project: Овај пројекат се не може архивирати + error_issue_done_ratios_not_updated: "Однос решених проблема није ажуриран." + error_workflow_copy_source: 'Молимо одаберите изворно праћење или улогу' + error_workflow_copy_target: 'Молимо одаберите одредишно праћење и улогу' + error_unable_delete_issue_status: 'Статус проблема је немогуће обрисати' + error_unable_to_connect: "Повезивање са (%{value}) је немогуће" + warning_attachments_not_saved: "%{count} датотека не може бити снимљена." + + mail_subject_lost_password: "Ваша %{value} лозинка" + mail_body_lost_password: 'За промену ваше лозинке, кликните на следећи линк:' + mail_subject_register: "Активација вашег %{value} налога" + mail_body_register: 'За активацију вашег налога, кликните на следећи линк:' + mail_body_account_information_external: "Ваш налог %{value} можете користити за пријаву." + mail_body_account_information: Информације о вашем налогу + mail_subject_account_activation_request: "Захтев за активацију налога %{value}" + mail_body_account_activation_request: "Нови корисник (%{value}) је регистрован. Налог чека на ваше одобрење:" + mail_subject_reminder: "%{count} проблема доспева наредних %{days} дана" + mail_body_reminder: "%{count} проблема додељених вама доспева у наредних %{days} дана:" + mail_subject_wiki_content_added: "Wiki страница '%{id}' је додата" + mail_body_wiki_content_added: "%{author} је додао wiki страницу '%{id}'." + mail_subject_wiki_content_updated: "Wiki страница '%{id}' је ажурирана" + mail_body_wiki_content_updated: "%{author} је ажурирао wiki страницу '%{id}'." + + + field_name: Назив + field_description: Опис + field_summary: Резиме + field_is_required: Обавезно + field_firstname: Име + field_lastname: Презиме + field_mail: Е-адреса + field_filename: Датотека + field_filesize: Величина + field_downloads: Преузимања + field_author: Аутор + field_created_on: Креирано + field_updated_on: Ажурирано + field_field_format: Формат + field_is_for_all: За све пројекте + field_possible_values: Могуће вредности + field_regexp: Регуларан израз + field_min_length: Минимална дужина + field_max_length: Максимална дужина + field_value: Вредност + field_category: Категорија + field_title: Наслов + field_project: Пројекат + field_issue: Проблем + field_status: Статус + field_notes: Белешке + field_is_closed: Затворен проблем + field_is_default: Подразумевана вредност + field_tracker: Праћење + field_subject: Предмет + field_due_date: Крајњи рок + field_assigned_to: Додељено + field_priority: Приоритет + field_fixed_version: Одредишна верзија + field_user: Корисник + field_principal: Главни + field_role: Улога + field_homepage: Почетна страница + field_is_public: Јавно објављивање + field_parent: Потпројекат од + field_is_in_roadmap: Проблеми приказани у плану рада + field_login: Корисничко име + field_mail_notification: Обавештења путем е-поште + field_admin: Администратор + field_last_login_on: Последње повезивање + field_language: Језик + field_effective_date: Датум + field_password: Лозинка + field_new_password: Нова лозинка + field_password_confirmation: Потврда лозинке + field_version: Верзија + field_type: Тип + field_host: Главни рачунар + field_port: Порт + field_account: Кориснички налог + field_base_dn: Базни DN + field_attr_login: Атрибут пријављивања + field_attr_firstname: Атрибут имена + field_attr_lastname: Атрибут презимена + field_attr_mail: Атрибут е-адресе + field_onthefly: Креирање корисника у току рада + field_start_date: Почетак + field_done_ratio: "% урађено" + field_auth_source: Режим потврде идентитета + field_hide_mail: Сакриј моју е-адресу + field_comments: Коментар + field_url: URL + field_start_page: Почетна страница + field_subproject: Потпројекат + field_hours: сати + field_activity: Активност + field_spent_on: Датум + field_identifier: Идентификатор + field_is_filter: Употреби као филтер + field_issue_to: Сродни проблеми + field_delay: Кашњење + field_assignable: Проблем може бити додељен овој улози + field_redirect_existing_links: Преусмери постојеће везе + field_estimated_hours: Протекло време + field_column_names: Колоне + field_time_zone: Временска зона + field_searchable: Може да се претражује + field_default_value: Подразумевана вредност + field_comments_sorting: Прикажи коментаре + field_parent_title: Матична страница + field_editable: Изменљиво + field_watcher: Посматрач + field_identity_url: OpenID URL + field_content: Садржај + field_group_by: Груписање резултата по + field_sharing: Дељење + field_parent_issue: Матични задатак + + setting_app_title: Наслов апликације + setting_app_subtitle: Поднаслов апликације + setting_welcome_text: Текст добродошлице + setting_default_language: Подразумевани језик + setting_login_required: Обавезна потврда идентитета + setting_self_registration: Саморегистрација + setting_attachment_max_size: Макс. величина приложене датотеке + setting_issues_export_limit: Ограничење извоза „проблема“ + setting_mail_from: Е-адреса пошиљаоца + setting_bcc_recipients: Примаоци „Bcc“ копије + setting_plain_text_mail: Порука са чистим текстом (без HTML-а) + setting_host_name: Путања и назив главног рачунара + setting_text_formatting: Обликовање текста + setting_wiki_compression: Компресија Wiki историје + setting_feeds_limit: Ограничење садржаја извора вести + setting_default_projects_public: Подразумева се јавно приказивање нових пројеката + setting_autofetch_changesets: Извршавање аутоматског преузимања + setting_sys_api_enabled: Омогућавање WS за управљање спремиштем + setting_commit_ref_keywords: Референцирање кључних речи + setting_commit_fix_keywords: Поправљање кључних речи + setting_autologin: Аутоматска пријава + setting_date_format: Формат датума + setting_time_format: Формат времена + setting_cross_project_issue_relations: Дозволи повезивање проблема из унакрсних пројеката + setting_issue_list_default_columns: Подразумеване колоне приказане на списку проблема + setting_emails_footer: Подножје странице е-поруке + setting_protocol: Протокол + setting_per_page_options: Опције приказа објеката по страници + setting_user_format: Формат приказа корисника + setting_activity_days_default: Број дана приказаних на пројектној активности + setting_display_subprojects_issues: Приказуј проблеме из потпројеката на главном пројекту, уколико није другачије наведено + setting_enabled_scm: Омогућавање SCM + setting_mail_handler_body_delimiters: "Скраћивање е-поруке након једне од ових линија" + setting_mail_handler_api_enabled: Омогућавање WS долазне е-поруке + setting_mail_handler_api_key: API кључ + setting_sequential_project_identifiers: Генерисање секвенцијалног имена пројекта + setting_gravatar_enabled: Користи Gravatar корисничке иконе + setting_gravatar_default: Подразумевана Gravatar слика + setting_diff_max_lines_displayed: Макс. број приказаних различитих линија + setting_file_max_size_displayed: Макс. величина текст. датотека приказаних уметнуто + setting_repository_log_display_limit: Макс. број ревизија приказаних у датотеци за евиденцију + setting_openid: Дозволи OpenID пријаву и регистрацију + setting_password_min_length: Минимална дужина лозинке + setting_new_project_user_role_id: Креатору пројекта (који није администратор) додељује је улога + setting_default_projects_modules: Подразумевано омогућени модули за нове пројекте + setting_issue_done_ratio: Израчунај однос решених проблема + setting_issue_done_ratio_issue_field: користећи поље проблема + setting_issue_done_ratio_issue_status: користећи статус проблема + setting_start_of_week: Први дан у седмици + setting_rest_api_enabled: Омогући REST web услуге + setting_cache_formatted_text: Кеширање обрађеног текста + + permission_add_project: Креирање пројекта + permission_add_subprojects: Креирање потпојекта + permission_edit_project: Измена пројеката + permission_select_project_modules: Одабирање модула пројекта + permission_manage_members: Управљање члановима + permission_manage_project_activities: Управљање пројектним активностима + permission_manage_versions: Управљање верзијама + permission_manage_categories: Управљање категоријама проблема + permission_view_issues: Преглед проблема + permission_add_issues: Додавање проблема + permission_edit_issues: Измена проблема + permission_manage_issue_relations: Управљање везама између проблема + permission_add_issue_notes: Додавање белешки + permission_edit_issue_notes: Измена белешки + permission_edit_own_issue_notes: Измена сопствених белешки + permission_move_issues: Померање проблема + permission_delete_issues: Брисање проблема + permission_manage_public_queries: Управљање јавним упитима + permission_save_queries: Снимање упита + permission_view_gantt: Прегледање Гантовог дијаграма + permission_view_calendar: Прегледање календара + permission_view_issue_watchers: Прегледање списка посматрача + permission_add_issue_watchers: Додавање посматрача + permission_delete_issue_watchers: Брисање посматрача + permission_log_time: Бележење утрошеног времена + permission_view_time_entries: Прегледање утрошеног времена + permission_edit_time_entries: Измена утрошеног времена + permission_edit_own_time_entries: Измена сопственог утрошеног времена + permission_manage_news: Управљање вестима + permission_comment_news: Коментарисање вести + permission_view_documents: Прегледање докумената + permission_manage_files: Управљање датотекама + permission_view_files: Прегледање датотека + permission_manage_wiki: Управљање wiki страницама + permission_rename_wiki_pages: Промена имена wiki страницама + permission_delete_wiki_pages: Брисање wiki страница + permission_view_wiki_pages: Прегледање wiki страница + permission_view_wiki_edits: Прегледање wiki историје + permission_edit_wiki_pages: Измена wiki страница + permission_delete_wiki_pages_attachments: Брисање приложених датотека + permission_protect_wiki_pages: Заштита wiki страница + permission_manage_repository: Управљање спремиштем + permission_browse_repository: Прегледање спремишта + permission_view_changesets: Прегледање скупа промена + permission_commit_access: Потврда приступа + permission_manage_boards: Управљање форумима + permission_view_messages: Прегледање порука + permission_add_messages: Слање порука + permission_edit_messages: Измена порука + permission_edit_own_messages: Измена сопствених порука + permission_delete_messages: Брисање порука + permission_delete_own_messages: Брисање сопствених порука + permission_export_wiki_pages: Извоз wiki страница + permission_manage_subtasks: Управљање подзадацима + + project_module_issue_tracking: Праћење проблема + project_module_time_tracking: Праћење времена + project_module_news: Вести + project_module_documents: Документи + project_module_files: Датотеке + project_module_wiki: Wiki + project_module_repository: Спремиште + project_module_boards: Форуми + + label_user: Корисник + label_user_plural: Корисници + label_user_new: Нови корисник + label_user_anonymous: Анониман + label_project: Пројекат + label_project_new: Нови пројекат + label_project_plural: Пројекти + label_x_projects: + zero: нема пројеката + one: један пројекат + other: "%{count} пројеката" + label_project_all: Сви пројекти + label_project_latest: Последњи пројекти + label_issue: Проблем + label_issue_new: Нови проблем + label_issue_plural: Проблеми + label_issue_view_all: Приказ свих проблема + label_issues_by: "Проблеми (%{value})" + label_issue_added: Проблем је додат + label_issue_updated: Проблем је ажуриран + label_document: Документ + label_document_new: Нови документ + label_document_plural: Документи + label_document_added: Документ је додат + label_role: Улога + label_role_plural: Улоге + label_role_new: Нова улога + label_role_and_permissions: Улоге и дозволе + label_member: Члан + label_member_new: Нови члан + label_member_plural: Чланови + label_tracker: Праћење + label_tracker_plural: Праћења + label_tracker_new: Ново праћење + label_workflow: Ток посла + label_issue_status: Статус проблема + label_issue_status_plural: Статуси проблема + label_issue_status_new: Нови статус + label_issue_category: Категорија проблема + label_issue_category_plural: Категорије проблема + label_issue_category_new: Нова категорија + label_custom_field: Прилагођено поље + label_custom_field_plural: Прилагођена поља + label_custom_field_new: Ново прилагођено поље + label_enumerations: Набројива листа + label_enumeration_new: Нова вредност + label_information: Информација + label_information_plural: Информације + label_please_login: Молимо, пријавите се + label_register: Регистрација + label_login_with_open_id_option: или пријава са OpenID + label_password_lost: Изгубљена лозинка + label_home: Почетак + label_my_page: Моја страница + label_my_account: Мој налог + label_my_projects: Моји пројекти + label_administration: Администрација + label_login: Пријава + label_logout: Одјава + label_help: Помоћ + label_reported_issues: Пријављени проблеми + label_assigned_to_me_issues: Проблеми додељени мени + label_last_login: Последње повезивање + label_registered_on: Регистрован + label_activity: Активност + label_overall_activity: Целокупна активност + label_user_activity: "Активност корисника %{value}" + label_new: Ново + label_logged_as: Пријављени сте као + label_environment: Окружење + label_authentication: Потврда идентитета + label_auth_source: Режим потврде идентитета + label_auth_source_new: Нови режим потврде идентитета + label_auth_source_plural: Режими потврде идентитета + label_subproject_plural: Потпројекти + label_subproject_new: Нови потпројекат + label_and_its_subprojects: "%{value} и његови потпројекти" + label_min_max_length: Мин. - Макс. дужина + label_list: Списак + label_date: Датум + label_integer: Цео број + label_float: Са покретним зарезом + label_boolean: Логички оператор + label_string: Текст + label_text: Дуги текст + label_attribute: Особина + label_attribute_plural: Особине + label_no_data: Нема података за приказивање + label_change_status: Промена статуса + label_history: Историја + label_attachment: Датотека + label_attachment_new: Нова датотека + label_attachment_delete: Брисање датотеке + label_attachment_plural: Датотеке + label_file_added: Датотека је додата + label_report: Извештај + label_report_plural: Извештаји + label_news: Вести + label_news_new: Додавање вести + label_news_plural: Вести + label_news_latest: Последње вести + label_news_view_all: Приказ свих вести + label_news_added: Вести су додате + label_settings: Подешавања + label_overview: Преглед + label_version: Верзија + label_version_new: Нова верзија + label_version_plural: Верзије + label_close_versions: Затвори завршене верзије + label_confirmation: Потврда + label_export_to: 'Такође доступно и у варијанти:' + label_read: Читање... + label_public_projects: Јавни пројекти + label_open_issues: отворен + label_open_issues_plural: отворених + label_closed_issues: затворен + label_closed_issues_plural: затворених + label_x_open_issues_abbr: + zero: 0 отворених + one: 1 отворен + other: "%{count} отворених" + label_x_closed_issues_abbr: + zero: 0 затворених + one: 1 затворен + other: "%{count} затворених" + label_total: Укупно + label_permissions: Дозволе + label_current_status: Тренутни статус + label_new_statuses_allowed: Нови статуси дозвољени + label_all: сви + label_none: ниједан + label_nobody: никоме + label_next: Следеће + label_previous: Претходно + label_used_by: Користио + label_details: Детаљи + label_add_note: Додај белешку + label_calendar: Календар + label_months_from: месеци од + label_gantt: Гантов дијаграм + label_internal: Унутрашњи + label_last_changes: "последњих %{count} промена" + label_change_view_all: Прикажи све промене + label_comment: Коментар + label_comment_plural: Коментари + label_x_comments: + zero: без коментара + one: један коментар + other: "%{count} коментара" + label_comment_add: Додај коментар + label_comment_added: Коментар додат + label_comment_delete: Обриши коментаре + label_query: Прилагођен упит + label_query_plural: Прилагођени упити + label_query_new: Нови упит + label_filter_add: Додавање филтера + label_filter_plural: Филтери + label_equals: је + label_not_equals: није + label_in_less_than: мање од + label_in_more_than: више од + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: у + label_today: данас + label_all_time: све време + label_yesterday: јуче + label_this_week: ове седмице + label_last_week: последње седмице + label_last_n_days: "последњих %{count} дана" + label_this_month: овог месеца + label_last_month: последњег месеца + label_this_year: ове године + label_date_range: Временски период + label_less_than_ago: пре мање од неколико дана + label_more_than_ago: пре више од неколико дана + label_ago: пре неколико дана + label_contains: садржи + label_not_contains: не садржи + label_day_plural: дана + label_repository: Спремиште + label_repository_plural: Спремишта + label_browse: Прегледање + label_branch: Грана + label_tag: Ознака + label_revision: Ревизија + label_revision_plural: Ревизије + label_revision_id: "Ревизија %{value}" + label_associated_revisions: Придружене ревизије + label_added: додато + label_modified: промењено + label_copied: копирано + label_renamed: преименовано + label_deleted: избрисано + label_latest_revision: Последња ревизија + label_latest_revision_plural: Последње ревизије + label_view_revisions: Преглед ревизија + label_view_all_revisions: Преглед свих ревизија + label_max_size: Максимална величина + label_sort_highest: Премештање на врх + label_sort_higher: Премештање на горе + label_sort_lower: Премештање на доле + label_sort_lowest: Премештање на дно + label_roadmap: План рада + label_roadmap_due_in: "Доспева %{value}" + label_roadmap_overdue: "%{value} најкасније" + label_roadmap_no_issues: Нема проблема за ову верзију + label_search: Претрага + label_result_plural: Резултати + label_all_words: Све речи + label_wiki: Wiki + label_wiki_edit: Wiki измена + label_wiki_edit_plural: Wiki измене + label_wiki_page: Wiki страница + label_wiki_page_plural: Wiki странице + label_index_by_title: Индексирање по наслову + label_index_by_date: Индексирање по датуму + label_current_version: Тренутна верзија + label_preview: Преглед + label_feed_plural: Извори вести + label_changes_details: Детаљи свих промена + label_issue_tracking: Праћење проблема + label_spent_time: Утрошено време + label_overall_spent_time: Целокупно утрошено време + label_f_hour: "%{value} сат" + label_f_hour_plural: "%{value} сати" + label_time_tracking: Праћење времена + label_change_plural: Промене + label_statistics: Статистика + label_commits_per_month: Извршења месечно + label_commits_per_author: Извршења по аутору + label_view_diff: Погледај разлике + label_diff_inline: унутра + label_diff_side_by_side: упоредо + label_options: Опције + label_copy_workflow_from: Копирање тока посла од + label_permissions_report: Извештај о дозволама + label_watched_issues: Посматрани проблеми + label_related_issues: Сродни проблеми + label_applied_status: Примењени статуси + label_loading: Учитавање... + label_relation_new: Нова релација + label_relation_delete: Брисање релације + label_relates_to: сродних са + label_duplicates: дуплираних + label_duplicated_by: дуплираних од + label_blocks: одбијених + label_blocked_by: одбијених од + label_precedes: претходи + label_follows: праћених + label_stay_logged_in: Останите пријављени + label_disabled: онемогућено + label_show_completed_versions: Приказивање завршене верзије + label_me: мени + label_board: Форум + label_board_new: Нови форум + label_board_plural: Форуми + label_board_locked: Закључана + label_board_sticky: Лепљива + label_topic_plural: Теме + label_message_plural: Поруке + label_message_last: Последња порука + label_message_new: Нова порука + label_message_posted: Порука је додата + label_reply_plural: Одговори + label_send_information: Пошаљи кориснику детаље налога + label_year: Година + label_month: Месец + label_week: Седмица + label_date_from: Шаље + label_date_to: Прима + label_language_based: Базирано на језику корисника + label_sort_by: "Сортирано по %{value}" + label_send_test_email: Слање пробне е-поруке + label_feeds_access_key: Atom приступни кључ + label_missing_feeds_access_key: Atom приступни кључ недостаје + label_feeds_access_key_created_on: "Atom приступни кључ је направљен пре %{value}" + label_module_plural: Модули + label_added_time_by: "Додао %{author} пре %{age}" + label_updated_time_by: "Ажурирао %{author} пре %{age}" + label_updated_time: "Ажурирано пре %{value}" + label_jump_to_a_project: Скок на пројекат... + label_file_plural: Датотеке + label_changeset_plural: Скупови промена + label_default_columns: Подразумеване колоне + label_no_change_option: (Без промена) + label_bulk_edit_selected_issues: Групна измена одабраних проблема + label_theme: Тема + label_default: Подразумевано + label_search_titles_only: Претражуј само наслове + label_user_mail_option_all: "За било који догађај на свим мојим пројектима" + label_user_mail_option_selected: "За било који догађај на само одабраним пројектима..." + label_user_mail_no_self_notified: "Не желим бити обавештаван за промене које сам правим" + label_registration_activation_by_email: активација налога путем е-поруке + label_registration_manual_activation: ручна активација налога + label_registration_automatic_activation: аутоматска активација налога + label_display_per_page: "Број ставки по страници: %{value}" + label_age: Старост + label_change_properties: Промени својства + label_general: Општи + label_scm: SCM + label_plugins: Додатне компоненте + label_ldap_authentication: LDAP потврда идентитета + label_downloads_abbr: D/L + label_optional_description: Опционо опис + label_add_another_file: Додај још једну датотеку + label_preferences: Подешавања + label_chronological_order: по хронолошком редоследу + label_reverse_chronological_order: по обрнутом хронолошком редоследу + label_incoming_emails: Долазне е-поруке + label_generate_key: Генерисање кључа + label_issue_watchers: Посматрачи + label_example: Пример + label_display: Приказ + label_sort: Сортирање + label_ascending: Растући низ + label_descending: Опадајући низ + label_date_from_to: Од %{start} до %{end} + label_wiki_content_added: Wiki страница је додата + label_wiki_content_updated: Wiki страница је ажурирана + label_group: Група + label_group_plural: Групе + label_group_new: Нова група + label_time_entry_plural: Утрошено време + label_version_sharing_none: Није дељено + label_version_sharing_descendants: Са потпројектима + label_version_sharing_hierarchy: Са хијерархијом пројекта + label_version_sharing_tree: Са стаблом пројекта + label_version_sharing_system: Са свим пројектима + label_update_issue_done_ratios: Ажурирај однос решених проблема + label_copy_source: Извор + label_copy_target: Одредиште + label_copy_same_as_target: Исто као одредиште + label_display_used_statuses_only: Приказуј статусе коришћене само од стране овог праћења + label_api_access_key: API приступни кључ + label_missing_api_access_key: Недостаје API приступни кључ + label_api_access_key_created_on: "API приступни кључ је креиран пре %{value}" + label_profile: Профил + label_subtask_plural: Подзадатак + label_project_copy_notifications: Пошаљи е-поруку са обавештењем приликом копирања пројекта + + button_login: Пријава + button_submit: Пошаљи + button_save: Сними + button_check_all: Укључи све + button_uncheck_all: Искључи све + button_delete: Избриши + button_create: Креирај + button_create_and_continue: Креирај и настави + button_test: Тест + button_edit: Измени + button_add: Додај + button_change: Промени + button_apply: Примени + button_clear: Обриши + button_lock: Закључај + button_unlock: Откључај + button_download: Преузми + button_list: Списак + button_view: Прикажи + button_move: Помери + button_move_and_follow: Помери и прати + button_back: Назад + button_cancel: Поништи + button_activate: Активирај + button_sort: Сортирај + button_log_time: Евидентирај време + button_rollback: Повратак на ову верзију + button_watch: Прати + button_unwatch: Не прати више + button_reply: Одговори + button_archive: Архивирај + button_unarchive: Врати из архиве + button_reset: Поништи + button_rename: Преименуј + button_change_password: Промени лозинку + button_copy: Копирај + button_copy_and_follow: Копирај и прати + button_annotate: Прибележи + button_update: Ажурирај + button_configure: Подеси + button_quote: Под наводницима + button_duplicate: Дуплирај + button_show: Прикажи + + status_active: активни + status_registered: регистровани + status_locked: закључани + + version_status_open: отворен + version_status_locked: закључан + version_status_closed: затворен + + field_active: Активан + + text_select_mail_notifications: Одабери акције за које ће обавештење бити послато путем е-поште. + text_regexp_info: нпр. ^[A-Z0-9]+$ + text_min_max_length_info: 0 значи без ограничења + text_project_destroy_confirmation: Јесте ли сигурни да желите да избришете овај пројекат и све припадајуће податке? + text_subprojects_destroy_warning: "Потпројекти: %{value} ће такође бити избрисан." + text_workflow_edit: Одаберите улогу и праћење за измену тока посла + text_are_you_sure: Јесте ли сигурни? + text_journal_changed: "%{label} промењен од %{old} у %{new}" + text_journal_set_to: "%{label} постављен у %{value}" + text_journal_deleted: "%{label} избрисано (%{old})" + text_journal_added: "%{label} %{value} додато" + text_tip_issue_begin_day: задатак почиње овог дана + text_tip_issue_end_day: задатак се завршава овог дана + text_tip_issue_begin_end_day: задатак почиње и завршава овог дана + text_caracters_maximum: "Највише %{count} знак(ова)." + text_caracters_minimum: "Број знакова мора бити најмање %{count}." + text_length_between: "Број знакова мора бити између %{min} и %{max}." + text_tracker_no_workflow: Ово праћење нема дефинисан ток посла + text_unallowed_characters: Недозвољени знакови + text_comma_separated: Дозвољене су вишеструке вредности (одвојене зарезом). + text_line_separated: Дозвољене су вишеструке вредности (један ред за сваку вредност). + text_issues_ref_in_commit_messages: Референцирање и поправљање проблема у извршним порукама + text_issue_added: "%{author} је пријавио проблем %{id}." + text_issue_updated: "%{author} је ажурирао проблем %{id}." + text_wiki_destroy_confirmation: Јесте ли сигурни да желите да обришете wiki и сав садржај? + text_issue_category_destroy_question: "Неколико проблема (%{count}) је додељено овој категорији. Шта желите да урадите?" + text_issue_category_destroy_assignments: Уклони додељене категорије + text_issue_category_reassign_to: Додели поново проблеме овој категорији + text_user_mail_option: "За неизабране пројекте, добићете само обавештење о стварима које пратите или сте укључени (нпр. проблеми чији сте ви аутор или заступник)." + text_no_configuration_data: "Улоге, праћења, статуси проблема и тока посла још увек нису подешени.\nПрепоручљиво је да учитате подразумевано конфигурисање. Измена је могућа након првог учитавања." + text_load_default_configuration: Учитај подразумевано конфигурисање + text_status_changed_by_changeset: "Примењено у скупу са променама %{value}." + text_issues_destroy_confirmation: 'Јесте ли сигурни да желите да избришете одабране проблеме?' + text_select_project_modules: 'Одаберите модуле које желите омогућити за овај пројекат:' + text_default_administrator_account_changed: Подразумевани администраторски налог је промењен + text_file_repository_writable: Фасцикла приложених датотека је уписива + text_plugin_assets_writable: Фасцикла елемената додатних компоненти је уписива + text_rmagick_available: RMagick је доступан (опционо) + text_destroy_time_entries_question: "%{hours} сати је пријављено за овај проблем који желите избрисати. Шта желите да урадите?" + text_destroy_time_entries: Избриши пријављене сате + text_assign_time_entries_to_project: Додели пријављене сате пројекту + text_reassign_time_entries: 'Додели поново пријављене сате овом проблему:' + text_user_wrote: "%{value} је написао:" + text_enumeration_destroy_question: "%{count} објекат(а) је додељено овој вредности." + text_enumeration_category_reassign_to: 'Додели их поново овој вредности:' + text_email_delivery_not_configured: "Испорука е-порука није конфигурисана и обавештења су онемогућена.\nПодесите ваш SMTP сервер у config/configuration.yml и покрените поново апликацију за њихово омогућавање." + text_repository_usernames_mapping: "Одаберите или ажурирајте Redmine кориснике мапирањем сваког корисничког имена пронађеног у евиденцији спремишта.\nКорисници са истим Redmine именом и именом спремишта или е-адресом су аутоматски мапирани." + text_diff_truncated: '... Ова разлика је исечена јер је достигнута максимална величина приказа.' + text_custom_field_possible_values_info: 'Један ред за сваку вредност' + text_wiki_page_destroy_question: "Ова страница има %{descendants} подређених страница и подстраница. Шта желите да урадите?" + text_wiki_page_nullify_children: "Задржи подређене странице као корене странице" + text_wiki_page_destroy_children: "Избриши подређене странице и све њихове подстранице" + text_wiki_page_reassign_children: "Додели поново подређене странице овој матичној страници" + text_own_membership_delete_confirmation: "Након уклањања појединих или свих ваших дозвола нећете више моћи да уређујете овај пројекат.\nЖелите ли да наставите?" + text_zoom_in: Увећај + text_zoom_out: Умањи + + default_role_manager: Менаџер + default_role_developer: Програмер + default_role_reporter: Извештач + default_tracker_bug: Грешка + default_tracker_feature: Функционалност + default_tracker_support: Подршка + default_issue_status_new: Ново + default_issue_status_in_progress: У току + default_issue_status_resolved: Решено + default_issue_status_feedback: Повратна информација + default_issue_status_closed: Затворено + default_issue_status_rejected: Одбијено + default_doc_category_user: Корисничка документација + default_doc_category_tech: Техничка документација + default_priority_low: Низак + default_priority_normal: Нормалан + default_priority_high: Висок + default_priority_urgent: Хитно + default_priority_immediate: Непосредно + default_activity_design: Дизајн + default_activity_development: Развој + + enumeration_issue_priorities: Приоритети проблема + enumeration_doc_categories: Категорије документа + enumeration_activities: Активности (праћење времена) + enumeration_system_activity: Системска активност + + field_time_entries: Време евиденције + project_module_gantt: Гантов дијаграм + project_module_calendar: Календар + + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Кодирање извршних порука + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 Проблем + one: 1 Проблем + other: "%{count} Проблеми" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: сви + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: Са потпројектима + label_cross_project_tree: Са стаблом пројекта + label_cross_project_hierarchy: Са хијерархијом пројекта + label_cross_project_system: Са свим пројектима + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Укупно + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Е-адреса + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Целокупно утрошено време + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API кључ + setting_lost_password: Изгубљена лозинка + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/sv.yml b/config/locales/sv.yml new file mode 100644 index 0000000..27abe16 --- /dev/null +++ b/config/locales/sv.yml @@ -0,0 +1,1263 @@ +# Swedish translation for Ruby on Rails +# by Johan Lundström (johanlunds@gmail.com), +# with parts taken from http://github.com/daniel/swe_rails +# Update based on Redmine 2.6.0 by Khedron Wilk (khedron.wilk@gmail.com) 6th Dec 2014 +sv: + number: + # Used in number_with_delimiter() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "," + # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "." + # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) + precision: 2 + + # Used in number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%n %u" + unit: "kr" + # These three are to override number.format and are optional + # separator: "." + # delimiter: "," + # precision: 2 + + # Used in number_to_percentage() + percentage: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_precision() + precision: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_human_size() + human: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "en halv minut" + less_than_x_seconds: + one: "mindre än en sekund" + other: "mindre än %{count} sekunder" + x_seconds: + one: "en sekund" + other: "%{count} sekunder" + less_than_x_minutes: + one: "mindre än en minut" + other: "mindre än %{count} minuter" + x_minutes: + one: "en minut" + other: "%{count} minuter" + about_x_hours: + one: "ungefär en timme" + other: "ungefär %{count} timmar" + x_hours: + one: "1 timme" + other: "%{count} timmar" + x_days: + one: "en dag" + other: "%{count} dagar" + about_x_months: + one: "ungefär en månad" + other: "ungefär %{count} månader" + x_months: + one: "en månad" + other: "%{count} månader" + about_x_years: + one: "ungefär ett år" + other: "ungefär %{count} år" + over_x_years: + one: "mer än ett år" + other: "mer än %{count} år" + almost_x_years: + one: "nästan 1 år" + other: "nästan %{count} år" + + activerecord: + errors: + template: + header: + one: "Ett fel förhindrade denna %{model} från att sparas" + other: "%{count} fel förhindrade denna %{model} från att sparas" + # The variable :count is also available + body: "Det var problem med följande fält:" + # The values :model, :attribute and :value are always available for interpolation + # The value :count is available when applicable. Can be used for pluralization. + messages: + inclusion: "finns inte i listan" + exclusion: "är reserverat" + invalid: "är ogiltigt" + confirmation: "stämmer inte överens" + accepted : "måste vara accepterad" + empty: "får ej vara tom" + blank: "måste anges" + too_long: "är för lång (maximum är %{count} tecken)" + too_short: "är för kort (minimum är %{count} tecken)" + wrong_length: "har fel längd (ska vara %{count} tecken)" + taken: "har redan tagits" + not_a_number: "är inte ett nummer" + greater_than: "måste vara större än %{count}" + greater_than_or_equal_to: "måste vara större än eller lika med %{count}" + equal_to: "måste vara samma som" + less_than: "måste vara mindre än %{count}" + less_than_or_equal_to: "måste vara mindre än eller lika med %{count}" + odd: "måste vara udda" + even: "måste vara jämnt" + greater_than_start_date: "måste vara senare än startdatumet" + not_same_project: "tillhör inte samma projekt" + circular_dependency: "Denna relation skulle skapa ett cirkulärt beroende" + cant_link_an_issue_with_a_descendant: "Ett ärende kan inte länkas till ett av dess underärenden" + earlier_than_minimum_start_date: "kan inte vara tidigare än %{date} på grund av föregående ärenden" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%e %b" + long: "%e %B, %Y" + + day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag] + abbr_day_names: [sön, mån, tis, ons, tor, fre, lör] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december] + abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%Y-%m-%d %H:%M" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "" + pm: "" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "och" + skip_last_comma: true + + actionview_instancetag_blank_option: Var god välj + + general_text_No: 'Nej' + general_text_Yes: 'Ja' + general_text_no: 'nej' + general_text_yes: 'ja' + general_lang_name: 'Swedish (Svenska)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Kontot har uppdaterats + notice_account_invalid_credentials: Fel användarnamn eller lösenord + notice_account_password_updated: Lösenordet har uppdaterats + notice_account_wrong_password: Fel lösenord + notice_account_register_done: Kontot har skapats. För att aktivera kontot, klicka på länken i mailet som skickades till dig. + notice_account_unknown_email: Okänd användare. + notice_can_t_change_password: Detta konto använder en extern autentiseringskälla. Det går inte att byta lösenord. + notice_account_lost_email_sent: Ett mail med instruktioner om hur man väljer ett nytt lösenord har skickats till dig. + notice_account_activated: Ditt konto har blivit aktiverat. Du kan nu logga in. + notice_successful_create: Skapades korrekt. + notice_successful_update: Uppdatering lyckades. + notice_successful_delete: Borttagning lyckades. + notice_successful_connection: Uppkoppling lyckades. + notice_file_not_found: Sidan du försökte komma åt existerar inte eller är borttagen. + notice_locking_conflict: Data har uppdaterats av en annan användare. + notice_not_authorized: Du saknar behörighet att komma åt den här sidan. + notice_not_authorized_archived_project: Projektet du försöker komma åt har arkiverats. + notice_email_sent: "Ett mail skickades till %{value}" + notice_email_error: "Ett fel inträffade när mail skickades (%{value})" + notice_feeds_access_key_reseted: Din Atom-nyckel återställdes. + notice_api_access_key_reseted: Din API-nyckel återställdes. + notice_failed_to_save_issues: "Misslyckades med att spara %{count} ärende(n) på %{total} valda: %{ids}." + notice_failed_to_save_time_entries: "Misslyckades med att spara %{count} tidloggning(ar) på %{total} valda: %{ids}." + notice_failed_to_save_members: "Misslyckades med att spara medlem(mar): %{errors}." + notice_no_issue_selected: "Inget ärende är markerat! Var vänlig, markera de ärenden du vill ändra." + notice_account_pending: "Ditt konto skapades och avvaktar nu administratörens godkännande." + notice_default_data_loaded: Standardkonfiguration inläst. + notice_unable_delete_version: Denna version var inte möjlig att ta bort. + notice_unable_delete_time_entry: Tidloggning kunde inte tas bort. + notice_issue_done_ratios_updated: "% klart uppdaterade." + notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som kan visas (%{max})" + notice_issue_successful_create: "Ärende %{id} skapades." + notice_issue_update_conflict: "Detta ärende har uppdaterats av en annan användare samtidigt som du redigerade det." + notice_account_deleted: "Ditt konto har avslutats permanent." + notice_user_successful_create: "Användare %{id} skapad." + + error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}" + error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv." + error_scm_command_failed: "Ett fel inträffade vid försök att nå versionsarkivet: %{value}" + error_scm_annotate: "Inlägget existerar inte eller kan inte kommenteras." + error_scm_annotate_big_text_file: Inlägget kan inte annoteras eftersom det överskrider maximal storlek för textfiler. + error_issue_not_found_in_project: 'Ärendet hittades inte eller så tillhör det inte detta projekt' + error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.' + error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").' + error_can_not_delete_custom_field: Kan inte ta bort användardefinerat fält + error_can_not_delete_tracker: "Det finns ärenden av denna typ och den är därför inte möjlig att ta bort." + error_can_not_remove_role: "Denna roll används och den är därför inte möjlig att ta bort." + error_can_not_reopen_issue_on_closed_version: 'Ett ärende tilldelat en stängd version kan inte öppnas på nytt' + error_can_not_archive_project: Detta projekt kan inte arkiveras + error_issue_done_ratios_not_updated: "% klart inte uppdaterade." + error_workflow_copy_source: 'Vänligen välj källans ärendetyp eller roll' + error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål' + error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort' + error_unable_to_connect: "Kan inte ansluta (%{value})" + error_attachment_too_big: "Denna fil kan inte laddas upp eftersom den överstiger maximalt tillåten filstorlek (%{max_size})" + error_session_expired: "Din session har gått ut. Vänligen logga in på nytt." + warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas." + + mail_subject_lost_password: "Ditt %{value} lösenord" + mail_body_lost_password: 'För att ändra ditt lösenord, klicka på följande länk:' + mail_subject_register: "Din %{value} kontoaktivering" + mail_body_register: 'För att aktivera ditt konto, klicka på följande länk:' + mail_body_account_information_external: "Du kan använda ditt %{value}-konto för att logga in." + mail_body_account_information: Din kontoinformation + mail_subject_account_activation_request: "%{value} begäran om kontoaktivering" + mail_body_account_activation_request: "En ny användare (%{value}) har registrerat sig och avvaktar ditt godkännande:" + mail_subject_reminder: "%{count} ärende(n) har deadline under de kommande %{days} dagarna" + mail_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:" + mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till" + mail_body_wiki_content_added: "The '%{id}' wikisida has lagts till av %{author}." + mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats" + mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}." + + + field_name: Namn + field_description: Beskrivning + field_summary: Sammanfattning + field_is_required: Obligatorisk + field_firstname: Förnamn + field_lastname: Efternamn + field_mail: Mail + field_filename: Fil + field_filesize: Storlek + field_downloads: Nerladdningar + field_author: Författare + field_created_on: Skapad + field_updated_on: Uppdaterad + field_closed_on: Stängd + field_field_format: Format + field_is_for_all: För alla projekt + field_possible_values: Möjliga värden + field_regexp: Reguljärt uttryck + field_min_length: Minimilängd + field_max_length: Maxlängd + field_value: Värde + field_category: Kategori + field_title: Titel + field_project: Projekt + field_issue: Ärende + field_status: Status + field_notes: Anteckningar + field_is_closed: Ärendet är stängt + field_is_default: Standardvärde + field_tracker: Ärendetyp + field_subject: Ämne + field_due_date: Deadline + field_assigned_to: Tilldelad till + field_priority: Prioritet + field_fixed_version: Versionsmål + field_user: Användare + field_principal: Principal + field_role: Roll + field_homepage: Hemsida + field_is_public: Publik + field_parent: Underprojekt till + field_is_in_roadmap: Visa ärenden i roadmap + field_login: Användarnamn + field_mail_notification: Mailnotifieringar + field_admin: Administratör + field_last_login_on: Senaste inloggning + field_language: Språk + field_effective_date: Datum + field_password: Lösenord + field_new_password: Nytt lösenord + field_password_confirmation: Bekräfta lösenord + field_version: Version + field_type: Typ + field_host: Värddator + field_port: Port + field_account: Konto + field_base_dn: Bas-DN + field_attr_login: Inloggningsattribut + field_attr_firstname: Förnamnsattribut + field_attr_lastname: Efternamnsattribut + field_attr_mail: Mailattribut + field_onthefly: Skapa användare on-the-fly + field_start_date: Startdatum + field_done_ratio: "% Klart" + field_auth_source: Autentiseringsläge + field_hide_mail: Dölj min mailadress + field_comments: Kommentar + field_url: URL + field_start_page: Startsida + field_subproject: Underprojekt + field_hours: Timmar + field_activity: Aktivitet + field_spent_on: Datum + field_identifier: Identifierare + field_is_filter: Använd som filter + field_issue_to: Relaterade ärenden + field_delay: Fördröjning + field_assignable: Ärenden kan tilldelas denna roll + field_redirect_existing_links: Omdirigera existerande länkar + field_estimated_hours: Estimerad tid + field_column_names: Kolumner + field_time_entries: Spenderad tid + field_time_zone: Tidszon + field_searchable: Sökbar + field_default_value: Standardvärde + field_comments_sorting: Visa kommentarer + field_parent_title: Föräldersida + field_editable: Redigerbar + field_watcher: Bevakare + field_identity_url: OpenID URL + field_content: Innehåll + field_group_by: Gruppera resultat efter + field_sharing: Delning + field_parent_issue: Förälderaktivitet + field_member_of_group: "Tilldelad användares grupp" + field_assigned_to_role: "Tilldelad användares roll" + field_text: Textfält + field_visible: Synlig + field_warn_on_leaving_unsaved: Varna om jag lämnar en sida med osparad text + field_issues_visibility: Ärendesynlighet + field_is_private: Privat + field_commit_logs_encoding: Teckenuppsättning för commit-meddelanden + field_scm_path_encoding: Sökvägskodning + field_path_to_repository: Sökväg till versionsarkiv + field_root_directory: Rotmapp + field_cvsroot: CVSROOT + field_cvs_module: Modul + field_repository_is_default: Huvudarkiv + field_multiple: Flera värden + field_auth_source_ldap_filter: LDAP-filter + field_core_fields: Standardfält + field_timeout: "Timeout (i sekunder)" + field_board_parent: Förälderforum + field_private_notes: Privata anteckningar + field_inherit_members: Ärv medlemmar + field_generate_password: Generera lösenord + + setting_app_title: Applikationsrubrik + setting_app_subtitle: Applikationsunderrubrik + setting_welcome_text: Välkomsttext + setting_default_language: Standardspråk + setting_login_required: Kräver inloggning + setting_self_registration: Självregistrering + setting_attachment_max_size: Maxstorlek på bilaga + setting_issues_export_limit: Exportgräns för ärenden + setting_mail_from: Avsändaradress + setting_bcc_recipients: Hemlig kopia (bcc) till mottagare + setting_plain_text_mail: Oformaterad text i mail (ingen HTML) + setting_host_name: Värddatornamn + setting_text_formatting: Textformatering + setting_wiki_compression: Komprimering av wikihistorik + setting_feeds_limit: Innehållsgräns för Feed + setting_default_projects_public: Nya projekt är publika + setting_autofetch_changesets: Automatisk hämtning av commits + setting_sys_api_enabled: Aktivera WS för versionsarkivhantering + setting_commit_ref_keywords: Referens-nyckelord + setting_commit_fix_keywords: Fix-nyckelord + setting_autologin: Automatisk inloggning + setting_date_format: Datumformat + setting_time_format: Tidsformat + setting_cross_project_subtasks: Tillåt underaktiviteter mellan projekt + setting_cross_project_issue_relations: Tillåt ärenderelationer mellan projekt + setting_issue_list_default_columns: Standardkolumner i ärendelistan + setting_repositories_encodings: Encoding för bilagor och versionsarkiv + setting_emails_header: Mail-header + setting_emails_footer: Signatur + setting_protocol: Protokoll + setting_per_page_options: Alternativ, objekt per sida + setting_user_format: Visningsformat för användare + setting_activity_days_default: Dagar som visas på projektaktivitet + setting_display_subprojects_issues: Visa ärenden från underprojekt i huvudprojekt + setting_enabled_scm: Aktivera SCM + setting_mail_handler_body_delimiters: "Trunkera mail efter en av följande rader" + setting_mail_handler_api_enabled: Aktivera WS för inkommande mail + setting_mail_handler_api_key: API-nyckel + setting_sequential_project_identifiers: Generera projektidentifierare sekventiellt + setting_gravatar_enabled: Använd Gravatar-avatarer + setting_gravatar_default: Förvald Gravatar-bild + setting_diff_max_lines_displayed: Maximalt antal synliga rader i diff + setting_file_max_size_displayed: Maxstorlek på textfiler som visas inline + setting_repository_log_display_limit: Maximalt antal revisioner i filloggen + setting_openid: Tillåt inloggning och registrering med OpenID + setting_password_min_length: Minsta tillåtna lösenordslängd + setting_new_project_user_role_id: Tilldelad roll för en icke-administratör som skapar ett projekt + setting_default_projects_modules: Aktiverade moduler för nya projekt + setting_issue_done_ratio: Beräkna % klart med + setting_issue_done_ratio_issue_field: Använd ärendefältet + setting_issue_done_ratio_issue_status: Använd ärendestatus + setting_start_of_week: Första dagen i veckan + setting_rest_api_enabled: Aktivera REST webbtjänst + setting_cache_formatted_text: Cacha formaterad text + setting_default_notification_option: Standard notifieringsalternativ + setting_commit_logtime_enabled: Aktivera tidloggning + setting_commit_logtime_activity_id: Aktivitet för loggad tid + setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat + setting_issue_group_assignment: Tillåt att ärenden tilldelas till grupper + setting_default_issue_start_date_to_creation_date: Använd dagens datum som startdatum för nya ärenden + setting_commit_cross_project_ref: Tillåt ärende i alla de andra projekten att bli refererade och fixade + setting_unsubscribe: Tillåt användare att avsluta prenumereration + setting_session_lifetime: Maximal sessionslivslängd + setting_session_timeout: Tidsgräns för sessionsinaktivitet + setting_thumbnails_enabled: Visa miniatyrbilder av bilagor + setting_thumbnails_size: Storlek på miniatyrbilder (i pixlar) + setting_non_working_week_days: Lediga dagar + setting_jsonp_enabled: Aktivera JSONP-stöd + setting_default_projects_tracker_ids: Standardärendetyper för nya projekt + + permission_add_project: Skapa projekt + permission_add_subprojects: Skapa underprojekt + permission_edit_project: Ändra projekt + permission_close_project: Stänga / återöppna projektet + permission_select_project_modules: Välja projektmoduler + permission_manage_members: Hantera medlemmar + permission_manage_project_activities: Hantera projektaktiviteter + permission_manage_versions: Hantera versioner + permission_manage_categories: Hantera ärendekategorier + permission_add_issues: Lägga till ärenden + permission_edit_issues: Ändra ärenden + permission_view_issues: Visa ärenden + permission_manage_issue_relations: Hantera ärenderelationer + permission_set_issues_private: Sätta ärenden publika eller privata + permission_set_own_issues_private: Sätta egna ärenden publika eller privata + permission_add_issue_notes: Lägga till ärendeanteckning + permission_edit_issue_notes: Ändra ärendeanteckningar + permission_edit_own_issue_notes: Ändra egna ärendeanteckningar + permission_view_private_notes: Visa privata anteckningar + permission_set_notes_private: Ställa in anteckningar som privata + permission_move_issues: Flytta ärenden + permission_delete_issues: Ta bort ärenden + permission_manage_public_queries: Hantera publika frågor + permission_save_queries: Spara frågor + permission_view_gantt: Visa Gantt-schema + permission_view_calendar: Visa kalender + permission_view_issue_watchers: Visa bevakarlista + permission_add_issue_watchers: Lägga till bevakare + permission_delete_issue_watchers: Ta bort bevakare + permission_log_time: Logga spenderad tid + permission_view_time_entries: Visa spenderad tid + permission_edit_time_entries: Ändra tidloggningar + permission_edit_own_time_entries: Ändra egna tidloggningar + permission_manage_news: Hantera nyheter + permission_comment_news: Kommentera nyheter + permission_view_documents: Visa dokument + permission_add_documents: Lägga till dokument + permission_edit_documents: Ändra dokument + permission_delete_documents: Ta bort dokument + permission_manage_files: Hantera filer + permission_view_files: Visa filer + permission_manage_wiki: Hantera wiki + permission_rename_wiki_pages: Byta namn på wikisidor + permission_delete_wiki_pages: Ta bort wikisidor + permission_view_wiki_pages: Visa wiki + permission_view_wiki_edits: Visa wikihistorik + permission_edit_wiki_pages: Ändra wikisidor + permission_delete_wiki_pages_attachments: Ta bort bilagor + permission_protect_wiki_pages: Skydda wikisidor + permission_manage_repository: Hantera versionsarkiv + permission_browse_repository: Bläddra i versionsarkiv + permission_view_changesets: Visa changesets + permission_commit_access: Commit-åtkomst + permission_manage_boards: Hantera forum + permission_view_messages: Visa meddelanden + permission_add_messages: Lägg till meddelanden + permission_edit_messages: Ändra meddelanden + permission_edit_own_messages: Ändra egna meddelanden + permission_delete_messages: Ta bort meddelanden + permission_delete_own_messages: Ta bort egna meddelanden + permission_export_wiki_pages: Exportera wikisidor + permission_manage_subtasks: Hantera underaktiviteter + permission_manage_related_issues: Hantera relaterade ärenden + + project_module_issue_tracking: Ärendeuppföljning + project_module_time_tracking: Tidsuppföljning + project_module_news: Nyheter + project_module_documents: Dokument + project_module_files: Filer + project_module_wiki: Wiki + project_module_repository: Versionsarkiv + project_module_boards: Forum + project_module_calendar: Kalender + project_module_gantt: Gantt + + label_user: Användare + label_user_plural: Användare + label_user_new: Ny användare + label_user_anonymous: Anonym + label_project: Projekt + label_project_new: Nytt projekt + label_project_plural: Projekt + label_x_projects: + zero: inga projekt + one: 1 projekt + other: "%{count} projekt" + label_project_all: Alla projekt + label_project_latest: Senaste projekt + label_issue: Ärende + label_issue_new: Nytt ärende + label_issue_plural: Ärenden + label_issue_view_all: Visa alla ärenden + label_issues_by: "Ärenden %{value}" + label_issue_added: Ärende tillagt + label_issue_updated: Ärende uppdaterat + label_issue_note_added: Anteckning tillagd + label_issue_status_updated: Status uppdaterad + label_issue_priority_updated: Prioritet uppdaterad + label_document: Dokument + label_document_new: Nytt dokument + label_document_plural: Dokument + label_document_added: Dokument tillagt + label_role: Roll + label_role_plural: Roller + label_role_new: Ny roll + label_role_and_permissions: Roller och behörigheter + label_role_anonymous: Anonym + label_role_non_member: Icke-medlem + label_member: Medlem + label_member_new: Ny medlem + label_member_plural: Medlemmar + label_tracker: Ärendetyp + label_tracker_plural: Ärendetyper + label_tracker_new: Ny ärendetyp + label_workflow: Arbetsflöde + label_issue_status: Ärendestatus + label_issue_status_plural: Ärendestatus + label_issue_status_new: Ny status + label_issue_category: Ärendekategori + label_issue_category_plural: Ärendekategorier + label_issue_category_new: Ny kategori + label_custom_field: Användardefinerat fält + label_custom_field_plural: Användardefinerade fält + label_custom_field_new: Nytt användardefinerat fält + label_enumerations: Uppräkningar + label_enumeration_new: Nytt värde + label_information: Information + label_information_plural: Information + label_please_login: Var god logga in + label_register: Registrera + label_login_with_open_id_option: eller logga in med OpenID + label_password_lost: Glömt lösenord + label_home: Hem + label_my_page: Min sida + label_my_account: Mitt konto + label_my_projects: Mina projekt + label_administration: Administration + label_login: Logga in + label_logout: Logga ut + label_help: Hjälp + label_reported_issues: Rapporterade ärenden + label_assigned_to_me_issues: Ärenden tilldelade till mig + label_last_login: Senaste inloggning + label_registered_on: Registrerad + label_activity: Aktivitet + label_overall_activity: All aktivitet + label_user_activity: "Aktiviteter för %{value}" + label_new: Ny + label_logged_as: Inloggad som + label_environment: Miljö + label_authentication: Autentisering + label_auth_source: Autentiseringsläge + label_auth_source_new: Nytt autentiseringsläge + label_auth_source_plural: Autentiseringslägen + label_subproject_plural: Underprojekt + label_subproject_new: Nytt underprojekt + label_and_its_subprojects: "%{value} och dess underprojekt" + label_min_max_length: Min./Max.-längd + label_list: Lista + label_date: Datum + label_integer: Heltal + label_float: Flyttal + label_boolean: Boolean + label_string: Text + label_text: Lång text + label_attribute: Attribut + label_attribute_plural: Attribut + label_no_data: Ingen data att visa + label_change_status: Ändra status + label_history: Historia + label_attachment: Fil + label_attachment_new: Ny fil + label_attachment_delete: Ta bort fil + label_attachment_plural: Filer + label_file_added: Fil tillagd + label_report: Rapport + label_report_plural: Rapporter + label_news: Nyhet + label_news_new: Lägg till nyhet + label_news_plural: Nyheter + label_news_latest: Senaste nyheterna + label_news_view_all: Visa alla nyheter + label_news_added: Nyhet tillagd + label_news_comment_added: Kommentar tillagd till en nyhet + label_settings: Inställningar + label_overview: Översikt + label_version: Version + label_version_new: Ny version + label_version_plural: Versioner + label_close_versions: Stäng klara versioner + label_confirmation: Bekräftelse + label_export_to: 'Finns även som:' + label_read: Läs... + label_public_projects: Publika projekt + label_open_issues: öppen + label_open_issues_plural: öppna + label_closed_issues: stängd + label_closed_issues_plural: stängda + label_x_open_issues_abbr: + zero: 0 öppna + one: 1 öppen + other: "%{count} öppna" + label_x_closed_issues_abbr: + zero: 0 stängda + one: 1 stängd + other: "%{count} stängda" + label_x_issues: + zero: 0 ärenden + one: 1 ärende + other: "%{count} ärenden" + label_total: Total + label_total_time: Total tid + label_permissions: Behörigheter + label_current_status: Nuvarande status + label_new_statuses_allowed: Nya tillåtna statusvärden + label_all: alla + label_any: vad/vem som helst + label_none: inget/ingen + label_nobody: ingen + label_next: Nästa + label_previous: Föregående + label_used_by: Använd av + label_details: Detaljer + label_add_note: Lägg till anteckning + label_calendar: Kalender + label_months_from: månader från + label_gantt: Gantt + label_internal: Intern + label_last_changes: "senaste %{count} ändringar" + label_change_view_all: Visa alla ändringar + label_comment: Kommentar + label_comment_plural: Kommentarer + label_x_comments: + zero: inga kommentarer + one: 1 kommentar + other: "%{count} kommentarer" + label_comment_add: Lägg till kommentar + label_comment_added: Kommentar tillagd + label_comment_delete: Ta bort kommentar + label_query: Användardefinerad fråga + label_query_plural: Användardefinerade frågor + label_query_new: Ny fråga + label_my_queries: Mina egna frågor + label_filter_add: Lägg till filter + label_filter_plural: Filter + label_equals: är + label_not_equals: är inte + label_in_less_than: om mindre än + label_in_more_than: om mer än + label_in_the_next_days: under kommande + label_in_the_past_days: under föregående + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_between: mellan + label_in: om + label_today: idag + label_all_time: närsom + label_yesterday: igår + label_this_week: denna vecka + label_last_week: senaste veckan + label_last_n_weeks: "senaste %{count} veckorna" + label_last_n_days: "senaste %{count} dagarna" + label_this_month: denna månad + label_last_month: senaste månaden + label_this_year: detta året + label_date_range: Datumintervall + label_less_than_ago: mindre än dagar sedan + label_more_than_ago: mer än dagar sedan + label_ago: dagar sedan + label_contains: innehåller + label_not_contains: innehåller inte + label_any_issues_in_project: några ärenden i projektet + label_any_issues_not_in_project: några ärenden utanför projektet + label_no_issues_in_project: inga ärenden i projektet + label_day_plural: dagar + label_repository: Versionsarkiv + label_repository_new: Nytt versionsarkiv + label_repository_plural: Versionsarkiv + label_browse: Bläddra + label_branch: Branch + label_tag: Tag + label_revision: Revision + label_revision_plural: Revisioner + label_revision_id: "Revision %{value}" + label_associated_revisions: Associerade revisioner + label_added: tillagd + label_modified: modifierad + label_copied: kopierad + label_renamed: omdöpt + label_deleted: borttagen + label_latest_revision: Senaste revisionen + label_latest_revision_plural: Senaste revisionerna + label_view_revisions: Visa revisioner + label_view_all_revisions: Visa alla revisioner + label_max_size: Maxstorlek + label_sort_highest: Flytta till toppen + label_sort_higher: Flytta upp + label_sort_lower: Flytta ner + label_sort_lowest: Flytta till botten + label_roadmap: Roadmap + label_roadmap_due_in: "Färdig om %{value}" + label_roadmap_overdue: "%{value} sen" + label_roadmap_no_issues: Inga ärenden för denna version + label_search: Sök + label_result_plural: Resultat + label_all_words: Alla ord + label_wiki: Wiki + label_wiki_edit: Wikiändring + label_wiki_edit_plural: Wikiändringar + label_wiki_page: Wikisida + label_wiki_page_plural: Wikisidor + label_index_by_title: Innehåll efter titel + label_index_by_date: Innehåll efter datum + label_current_version: Nuvarande version + label_preview: Förhandsgranska + label_feed_plural: Feeds + label_changes_details: Detaljer om alla ändringar + label_issue_tracking: Ärendeuppföljning + label_spent_time: Spenderad tid + label_overall_spent_time: Total tid spenderad + label_f_hour: "%{value} timme" + label_f_hour_plural: "%{value} timmar" + label_time_tracking: Tidsuppföljning + label_change_plural: Ändringar + label_statistics: Statistik + label_commits_per_month: Commits per månad + label_commits_per_author: Commits per författare + label_diff: diff + label_view_diff: Visa skillnader + label_diff_inline: i texten + label_diff_side_by_side: sida vid sida + label_options: Inställningar + label_copy_workflow_from: Kopiera arbetsflöde från + label_permissions_report: Behörighetsrapport + label_watched_issues: Bevakade ärenden + label_related_issues: Relaterade ärenden + label_applied_status: Tilldelad status + label_loading: Laddar... + label_relation_new: Ny relation + label_relation_delete: Ta bort relation + label_relates_to: Relaterar till + label_duplicates: Kopierar + label_duplicated_by: Kopierad av + label_blocks: Blockerar + label_blocked_by: Blockerad av + label_precedes: Kommer före + label_follows: Följer + label_copied_to: Kopierad till + label_copied_from: Kopierad från + label_stay_logged_in: Förbli inloggad + label_disabled: inaktiverad + label_show_completed_versions: Visa färdiga versioner + label_me: mig + label_board: Forum + label_board_new: Nytt forum + label_board_plural: Forum + label_board_locked: Låst + label_board_sticky: Sticky + label_topic_plural: Ämnen + label_message_plural: Meddelanden + label_message_last: Senaste meddelande + label_message_new: Nytt meddelande + label_message_posted: Meddelande tillagt + label_reply_plural: Svar + label_send_information: Skicka kontoinformation till användaren + label_year: År + label_month: Månad + label_week: Vecka + label_date_from: Från + label_date_to: Till + label_language_based: Språkbaserad + label_sort_by: "Sortera på %{value}" + label_send_test_email: Skicka testmail + label_feeds_access_key: Atom-nyckel + label_missing_feeds_access_key: Saknar en Atom-nyckel + label_feeds_access_key_created_on: "Atom-nyckel skapad för %{value} sedan" + label_module_plural: Moduler + label_added_time_by: "Tillagd av %{author} för %{age} sedan" + label_updated_time_by: "Uppdaterad av %{author} för %{age} sedan" + label_updated_time: "Uppdaterad för %{value} sedan" + label_jump_to_a_project: Gå till projekt... + label_file_plural: Filer + label_changeset_plural: Changesets + label_default_columns: Standardkolumner + label_no_change_option: (Ingen ändring) + label_bulk_edit_selected_issues: Gemensam ändring av markerade ärenden + label_bulk_edit_selected_time_entries: Gruppredigera valda tidloggningar + label_theme: Tema + label_default: Standard + label_search_titles_only: Sök endast i titlar + label_user_mail_option_all: "För alla händelser i mina projekt" + label_user_mail_option_selected: "För alla händelser i markerade projekt..." + label_user_mail_option_none: "Inga händelser" + label_user_mail_option_only_my_events: "Endast för saker jag bevakar eller är inblandad i" + label_user_mail_no_self_notified: "Jag vill inte bli underrättad om ändringar som jag har gjort" + label_registration_activation_by_email: kontoaktivering med mail + label_registration_manual_activation: manuell kontoaktivering + label_registration_automatic_activation: automatisk kontoaktivering + label_display_per_page: "Per sida: %{value}" + label_age: Ålder + label_change_properties: Ändra inställningar + label_general: Allmänt + label_scm: SCM + label_plugins: Tillägg + label_ldap_authentication: LDAP-autentisering + label_downloads_abbr: Nerl. + label_optional_description: Valfri beskrivning + label_add_another_file: Lägg till ytterligare en fil + label_preferences: Användarinställningar + label_chronological_order: I kronologisk ordning + label_reverse_chronological_order: I omvänd kronologisk ordning + label_incoming_emails: Inkommande mail + label_generate_key: Generera en nyckel + label_issue_watchers: Bevakare + label_example: Exempel + label_display: Visa + label_sort: Sortera + label_descending: Fallande + label_ascending: Stigande + label_date_from_to: Från %{start} till %{end} + label_wiki_content_added: Wikisida tillagd + label_wiki_content_updated: Wikisida uppdaterad + label_group: Grupp + label_group_plural: Grupper + label_group_new: Ny grupp + label_time_entry_plural: Spenderad tid + label_version_sharing_none: Inte delad + label_version_sharing_descendants: Med underprojekt + label_version_sharing_hierarchy: Med projekthierarki + label_version_sharing_tree: Med projektträd + label_version_sharing_system: Med alla projekt + label_update_issue_done_ratios: Uppdatera % klart + label_copy_source: Källa + label_copy_target: Mål + label_copy_same_as_target: Samma som mål + label_display_used_statuses_only: Visa endast status som används av denna ärendetyp + label_api_access_key: API-nyckel + label_missing_api_access_key: Saknar en API-nyckel + label_api_access_key_created_on: "API-nyckel skapad för %{value} sedan" + label_profile: Profil + label_subtask_plural: Underaktiviteter + label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras + label_principal_search: "Sök efter användare eller grupp:" + label_user_search: "Sök efter användare:" + label_additional_workflow_transitions_for_author: Ytterligare övergångar tillåtna när användaren är den som skapat ärendet + label_additional_workflow_transitions_for_assignee: Ytterligare övergångar tillåtna när användaren är den som tilldelats ärendet + label_issues_visibility_all: Alla ärenden + label_issues_visibility_public: Alla icke-privata ärenden + label_issues_visibility_own: Ärenden skapade av eller tilldelade till användaren + label_git_report_last_commit: Rapportera senaste commit av filer och mappar + label_parent_revision: Förälder + label_child_revision: Barn + label_export_options: "%{export_format} exportalternativ" + label_copy_attachments: Kopiera bilagor + label_copy_subtasks: Kopiera underaktiviteter + label_item_position: "%{position}/%{count}" + label_completed_versions: Klara versioner + label_search_for_watchers: Sök efter bevakare att lägga till + label_session_expiration: Sessionsutgång + label_show_closed_projects: Visa stängda projekt + label_status_transitions: Statusövergångar + label_fields_permissions: Fältbehörigheter + label_readonly: Skrivskyddad + label_required: Nödvändig + label_attribute_of_project: Projektets %{name} + label_attribute_of_issue: Ärendets %{name} + label_attribute_of_author: Författarens %{name} + label_attribute_of_assigned_to: Tilldelad användares %{name} + label_attribute_of_user: Användarens %{name} + label_attribute_of_fixed_version: Målversionens %{name} + label_cross_project_descendants: Med underprojekt + label_cross_project_tree: Med projektträd + label_cross_project_hierarchy: Med projekthierarki + label_cross_project_system: Med alla projekt + label_gantt_progress_line: Framstegslinje + + button_login: Logga in + button_submit: Skicka + button_save: Spara + button_check_all: Markera alla + button_uncheck_all: Avmarkera alla + button_collapse_all: Kollapsa alla + button_expand_all: Expandera alla + button_delete: Ta bort + button_create: Skapa + button_create_and_continue: Skapa och fortsätt + button_test: Testa + button_edit: Ändra + button_edit_associated_wikipage: "Ändra associerad Wikisida: %{page_title}" + button_add: Lägg till + button_change: Ändra + button_apply: Verkställ + button_clear: Återställ + button_lock: Lås + button_unlock: Lås upp + button_download: Ladda ner + button_list: Lista + button_view: Visa + button_move: Flytta + button_move_and_follow: Flytta och följ efter + button_back: Tillbaka + button_cancel: Avbryt + button_activate: Aktivera + button_sort: Sortera + button_log_time: Logga tid + button_rollback: Återställ till denna version + button_watch: Bevaka + button_unwatch: Stoppa bevakning + button_reply: Svara + button_archive: Arkivera + button_unarchive: Ta bort från arkiv + button_reset: Återställ + button_rename: Byt namn + button_change_password: Ändra lösenord + button_copy: Kopiera + button_copy_and_follow: Kopiera och följ efter + button_annotate: Kommentera + button_update: Uppdatera + button_configure: Konfigurera + button_quote: Citera + button_duplicate: Duplicera + button_show: Visa + button_hide: Göm + button_edit_section: Redigera denna sektion + button_export: Exportera + button_delete_my_account: Ta bort mitt konto + button_close: Stäng + button_reopen: Återöppna + + status_active: aktiv + status_registered: registrerad + status_locked: låst + + project_status_active: aktiv + project_status_closed: stängd + project_status_archived: arkiverad + + version_status_open: öppen + version_status_locked: låst + version_status_closed: stängd + + field_active: Aktiv + + text_select_mail_notifications: Välj för vilka händelser mail ska skickas. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 betyder ingen gräns + text_project_destroy_confirmation: Är du säker på att du vill ta bort detta projekt och all relaterad data? + text_subprojects_destroy_warning: "Alla underprojekt: %{value} kommer också tas bort." + text_workflow_edit: Välj en roll och en ärendetyp för att ändra arbetsflöde + text_are_you_sure: Är du säker ? + text_journal_changed: "%{label} ändrad från %{old} till %{new}" + text_journal_changed_no_detail: "%{label} uppdaterad" + text_journal_set_to: "%{label} satt till %{value}" + text_journal_deleted: "%{label} borttagen (%{old})" + text_journal_added: "%{label} %{value} tillagd" + text_tip_issue_begin_day: ärende som börjar denna dag + text_tip_issue_end_day: ärende som slutar denna dag + text_tip_issue_begin_end_day: ärende som börjar och slutar denna dag + text_project_identifier_info: 'Endast gemener (a-z), siffror, streck och understreck är tillåtna, måste börja med en bokstav.
    När identifieraren sparats kan den inte ändras.' + text_caracters_maximum: "max %{count} tecken." + text_caracters_minimum: "Måste vara minst %{count} tecken lång." + text_length_between: "Längd mellan %{min} och %{max} tecken." + text_tracker_no_workflow: Inget arbetsflöde definerat för denna ärendetyp + text_unallowed_characters: Otillåtna tecken + text_comma_separated: Flera värden tillåtna (kommaseparerade). + text_line_separated: Flera värden tillåtna (ett värde per rad). + text_issues_ref_in_commit_messages: Referera och fixa ärenden i commit-meddelanden + text_issue_added: "Ärende %{id} har rapporterats (av %{author})." + text_issue_updated: "Ärende %{id} har uppdaterats (av %{author})." + text_wiki_destroy_confirmation: Är du säker på att du vill ta bort denna wiki och allt dess innehåll ? + text_issue_category_destroy_question: "Några ärenden (%{count}) är tilldelade till denna kategori. Vad vill du göra ?" + text_issue_category_destroy_assignments: Ta bort kategoritilldelningar + text_issue_category_reassign_to: Återtilldela ärenden till denna kategori + text_user_mail_option: "För omarkerade projekt kommer du bara bli underrättad om saker du bevakar eller är inblandad i (T.ex. ärenden du skapat eller tilldelats)." + text_no_configuration_data: "Roller, ärendetyper, ärendestatus och arbetsflöden har inte konfigurerats ännu.\nDet rekommenderas att läsa in standardkonfigurationen. Du kommer att kunna göra ändringar efter att den blivit inläst." + text_load_default_configuration: Läs in standardkonfiguration + text_status_changed_by_changeset: "Tilldelad i changeset %{value}." + text_time_logged_by_changeset: "Tilldelad i changeset %{value}." + text_issues_destroy_confirmation: 'Är du säker på att du vill radera markerade ärende(n) ?' + text_issues_destroy_descendants_confirmation: Detta kommer även ta bort %{count} underaktivitet(er). + text_time_entries_destroy_confirmation: Är du säker på att du vill ta bort valda tidloggningar? + text_select_project_modules: 'Välj vilka moduler som ska vara aktiva för projektet:' + text_default_administrator_account_changed: Standardadministratörens konto ändrat + text_file_repository_writable: Arkivet för bifogade filer är skrivbart + text_plugin_assets_writable: Arkivet för plug-ins är skrivbart + text_rmagick_available: RMagick tillgängligt (ej obligatoriskt) + text_destroy_time_entries_question: "%{hours} timmar har rapporterats på ärendena du är på väg att ta bort. Vad vill du göra ?" + text_destroy_time_entries: Ta bort rapporterade timmar + text_assign_time_entries_to_project: Tilldela rapporterade timmar till projektet + text_reassign_time_entries: 'Återtilldela rapporterade timmar till detta ärende:' + text_user_wrote: "%{value} skrev:" + text_enumeration_destroy_question: "%{count} objekt är tilldelade till detta värde." + text_enumeration_category_reassign_to: 'Återtilldela till detta värde:' + text_email_delivery_not_configured: "Mailfunktionen har inte konfigurerats, och notifieringar via mail kan därför inte skickas.\nKonfigurera din SMTP-server i config/configuration.yml och starta om applikationen för att aktivera dem." + text_repository_usernames_mapping: "Välj eller uppdatera den Redmine-användare som är mappad till varje användarnamn i versionarkivloggen.\nAnvändare med samma användarnamn eller mailadress i både Redmine och versionsarkivet mappas automatiskt." + text_diff_truncated: '... Denna diff har förminskats eftersom den överskrider den maximala storlek som kan visas.' + text_custom_field_possible_values_info: 'Ett värde per rad' + text_wiki_page_destroy_question: "Denna sida har %{descendants} underliggande sidor. Vad vill du göra?" + text_wiki_page_nullify_children: "Behåll undersidor som rotsidor" + text_wiki_page_destroy_children: "Ta bort alla underliggande sidor" + text_wiki_page_reassign_children: "Flytta undersidor till denna föräldersida" + text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?" + text_zoom_out: Zooma ut + text_zoom_in: Zooma in + text_warn_on_leaving_unsaved: "Nuvarande sida innehåller osparad text som kommer försvinna om du lämnar sidan." + text_scm_path_encoding_note: "Standard: UTF-8" + text_git_repository_note: Versionsarkiv är tomt och lokalt (t.ex. /gitrepo, c:\gitrepo) + text_mercurial_repository_note: Lokalt versionsarkiv (t.ex. /hgrepo, c:\hgrepo) + text_scm_command: Kommando + text_scm_command_version: Version + text_scm_config: Du kan konfigurera dina scm-kommando i config/configuration.yml. Vänligen starta om applikationen när ändringar gjorts. + text_scm_command_not_available: Scm-kommando är inte tillgängligt. Vänligen kontrollera inställningarna i administratörspanelen. + text_issue_conflict_resolution_overwrite: "Använd mina ändringar i alla fall (tidigare anteckningar kommer behållas men några ändringar kan bli överskrivna)" + text_issue_conflict_resolution_add_notes: "Lägg till mina anteckningar och kasta mina andra ändringar" + text_issue_conflict_resolution_cancel: "Kasta alla mina ändringar och visa igen %{link}" + text_account_destroy_confirmation: "Är du säker på att du vill fortsätta?\nDitt konto kommer tas bort permanent, utan möjlighet att återaktivera det." + text_session_expiration_settings: "Varning: ändring av dessa inställningar kan få alla nuvarande sessioner, inklusive din egen, att gå ut." + text_project_closed: Detta projekt är stängt och skrivskyddat. + text_turning_multiple_off: "Om du inaktiverar möjligheten till flera värden kommer endast ett värde per objekt behållas." + + default_role_manager: Projektledare + default_role_developer: Utvecklare + default_role_reporter: Rapportör + default_tracker_bug: Bugg + default_tracker_feature: Funktionalitet + default_tracker_support: Support + default_issue_status_new: Ny + default_issue_status_in_progress: Pågår + default_issue_status_resolved: Löst + default_issue_status_feedback: Återkoppling + default_issue_status_closed: Stängd + default_issue_status_rejected: Avslagen + default_doc_category_user: Användardokumentation + default_doc_category_tech: Teknisk dokumentation + default_priority_low: Låg + default_priority_normal: Normal + default_priority_high: Hög + default_priority_urgent: Brådskande + default_priority_immediate: Omedelbar + default_activity_design: Design + default_activity_development: Utveckling + + enumeration_issue_priorities: Ärendeprioriteter + enumeration_doc_categories: Dokumentkategorier + enumeration_activities: Aktiviteter (tidsuppföljning) + enumeration_system_activity: Systemaktivitet + description_filter: Filter + description_search: Sökfält + description_choose_project: Projekt + description_project_scope: Sökomfång + description_notes: Anteckningar + description_message_content: Meddelandeinnehåll + description_query_sort_criteria_attribute: Sorteringsattribut + description_query_sort_criteria_direction: Sorteringsriktning + description_user_mail_notification: Mailnotifieringsinställningar + description_available_columns: Tillgängliga Kolumner + description_selected_columns: Valda Kolumner + description_all_columns: Alla kolumner + description_issue_category_reassign: Välj ärendekategori + description_wiki_subpages_reassign: Välj ny föräldersida + text_repository_identifier_info: 'Endast gemener (a-z), siffror, streck och understreck är tillåtna.
    När identifieraren sparats kan den inte ändras.' + notice_account_not_activated_yet: Du har inte aktiverat ditt konto än. Om du vill få ett nytt aktiveringsbrev, klicka på denna länk . + notice_account_locked: Ditt konto är låst. + label_hidden: Dold + label_visibility_private: endast för mig + label_visibility_roles: endast för dessa roller + label_visibility_public: för alla användare + field_must_change_passwd: Måste byta lösenord vid nästa inloggning. + notice_new_password_must_be_different: Det nya lösenordet måste skilja sig från det nuvarande lösenordet + setting_mail_handler_excluded_filenames: Uteslut bilagor med namn + text_convert_available: ImageMagick-konvertering tillgänglig (valbart) + label_link: Länk + label_only: endast + label_drop_down_list: droppmeny + label_checkboxes: kryssrutor + label_link_values_to: Länka värden till URL + setting_force_default_language_for_anonymous: Lås till förvalt språk för anonyma användare + setting_force_default_language_for_loggedin: Lås till förvalt språk för inloggade användare + label_custom_field_select_type: Väljd den typ av objekt som det anpassade fältet skall användas för + label_issue_assigned_to_updated: Tilldelad har uppdaterats + label_check_for_updates: Leta efter uppdateringar + label_latest_compatible_version: Senaste kompatibla version + label_unknown_plugin: Okänt tillägg + label_radio_buttons: alternativknappar + label_group_anonymous: Anonyma användare + label_group_non_member: Icke-medlemsanvändare + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Mail + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Total tid spenderad + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API-nyckel + setting_lost_password: Glömt lösenord + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/th.yml b/config/locales/th.yml new file mode 100644 index 0000000..f97998a --- /dev/null +++ b/config/locales/th.yml @@ -0,0 +1,1227 @@ +th: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_hours: + one: "1 hour" + other: "%{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + precision: 3 + delimiter: "" + storage_units: + format: "%n %u" + units: + kb: KB + tb: TB + gb: GB + byte: + one: Byte + other: Bytes + mb: MB + +# Used in array.to_sentence. + support: + array: + sentence_connector: "and" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "ไม่อยู่ในรายการ" + exclusion: "ถูกสงวนไว้" + invalid: "ไม่ถูกต้อง" + confirmation: "พิมพ์ไม่เหมือนเดิม" + accepted: "ต้องยอมรับ" + empty: "ต้องเติม" + blank: "ต้องเติม" + too_long: "ยาวเกินไป" + too_short: "สั้นเกินไป" + wrong_length: "ความยาวไม่ถูกต้อง" + taken: "ถูกใช้ไปแล้ว" + not_a_number: "ไม่ใช่ตัวเลข" + not_a_date: "ไม่ใช่วันที่ ที่ถูกต้อง" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "must be odd" + even: "must be even" + greater_than_start_date: "ต้องมากกว่าวันเริ่ม" + not_same_project: "ไม่ได้อยู่ในโครงการเดียวกัน" + circular_dependency: "ความสัมพันธ์อ้างอิงเป็นวงกลม" + cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + actionview_instancetag_blank_option: กรุณาเลือก + + general_text_No: 'ไม่' + general_text_Yes: 'ใช่' + general_text_no: 'ไม่' + general_text_yes: 'ใช่' + general_lang_name: 'Thai (ไทย)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: Windows-874 + general_pdf_fontname: freeserif + general_pdf_monospaced_fontname: freeserif + general_first_day_of_week: '1' + + notice_account_updated: บัญชีได้ถูกปรับปรุงแล้ว. + notice_account_invalid_credentials: ชื้ผู้ใช้หรือรหัสผ่านไม่ถูกต้อง + notice_account_password_updated: รหัสได้ถูกปรับปรุงแล้ว. + notice_account_wrong_password: รหัสผ่านไม่ถูกต้อง + notice_account_register_done: บัญชีถูกสร้างแล้ว. กรุณาเช็คเมล์ แล้วคลิ๊กที่ลิงค์ในอีเมล์เพื่อเปิดใช้บัญชี + notice_account_unknown_email: ไม่มีผู้ใช้ที่ใช้อีเมล์นี้. + notice_can_t_change_password: บัญชีนี้ใช้การยืนยันตัวตนจากแหล่งภายนอก. ไม่สามารถปลี่ยนรหัสผ่านได้. + notice_account_lost_email_sent: เราได้ส่งอีเมล์พร้อมวิธีการสร้างรหัีสผ่านใหม่ให้คุณแล้ว กรุณาเช็คเมล์. + notice_account_activated: บัญชีของคุณได้เปิดใช้แล้ว. ตอนนี้คุณสามารถเข้าสู่ระบบได้แล้ว. + notice_successful_create: สร้างเสร็จแล้ว. + notice_successful_update: ปรับปรุงเสร็จแล้ว. + notice_successful_delete: ลบเสร็จแล้ว. + notice_successful_connection: ติดต่อสำเร็จแล้ว. + notice_file_not_found: หน้าที่คุณต้องการดูไม่มีอยู่จริง หรือถูกลบไปแล้ว. + notice_locking_conflict: ข้อมูลถูกปรับปรุงโดยผู้ใช้คนอื่น. + notice_not_authorized: คุณไม่มีสิทธิเข้าถึงหน้านี้. + notice_email_sent: "อีเมล์ได้ถูกส่งถึง %{value}" + notice_email_error: "เกิดความผิดพลาดขณะกำส่งอีเมล์ (%{value})" + notice_feeds_access_key_reseted: Atom access key ของคุณถูก reset แล้ว. + notice_failed_to_save_issues: "%{count} ปัญหาจาก %{total} ปัญหาที่ถูกเลือกไม่สามารถจัดเก็บ: %{ids}." + notice_no_issue_selected: "ไม่มีปัญหาที่ถูกเลือก! กรุณาเลือกปัญหาที่คุณต้องการแก้ไข." + notice_account_pending: "บัญชีของคุณสร้างเสร็จแล้ว ขณะนี้รอการอนุมัติจากผู้บริหารจัดการ." + notice_default_data_loaded: ค่าเริ่มต้นโหลดเสร็จแล้ว. + + error_can_t_load_default_data: "ค่าเริ่มต้นโหลดไม่สำเร็จ: %{value}" + error_scm_not_found: "ไม่พบรุ่นที่ต้องการในแหล่งเก็บต้นฉบับ." + error_scm_command_failed: "เกิดความผิดพลาดในการเข้าถึงแหล่งเก็บต้นฉบับ: %{value}" + error_scm_annotate: "entry ไม่มีอยู่จริง หรือไม่สามารถเขียนหมายเหตุประกอบ." + error_issue_not_found_in_project: 'ไม่พบปัญหานี้ หรือปัญหาไม่ได้อยู่ในโครงการนี้' + + mail_subject_lost_password: "รหัสผ่าน %{value} ของคุณ" + mail_body_lost_password: 'คลิ๊กที่ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่าน:' + mail_subject_register: "เปิดบัญชี %{value} ของคุณ" + mail_body_register: 'คลิ๊กที่ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่าน:' + mail_body_account_information_external: "คุณสามารถใช้บัญชี %{value} เพื่อเข้าสู่ระบบ." + mail_body_account_information: ข้อมูลบัญชีของคุณ + mail_subject_account_activation_request: "กรุณาเปิดบัญชี %{value}" + mail_body_account_activation_request: "ผู้ใช้ใหม่ (%{value}) ได้ลงทะเบียน. บัญชีของเขากำลังรออนุมัติ:" + + + field_name: ชื่อ + field_description: รายละเอียด + field_summary: สรุปย่อ + field_is_required: ต้องใส่ + field_firstname: ชื่อ + field_lastname: นามสกุล + field_mail: อีเมล์ + field_filename: แฟ้ม + field_filesize: ขนาด + field_downloads: ดาวน์โหลด + field_author: ผู้แต่ง + field_created_on: สร้าง + field_updated_on: ปรับปรุง + field_field_format: รูปแบบ + field_is_for_all: สำหรับทุกโครงการ + field_possible_values: ค่าที่เป็นไปได้ + field_regexp: Regular expression + field_min_length: สั้นสุด + field_max_length: ยาวสุด + field_value: ค่า + field_category: ประเภท + field_title: ชื่อเรื่อง + field_project: โครงการ + field_issue: ปัญหา + field_status: สถานะ + field_notes: บันทึก + field_is_closed: ปัญหาจบ + field_is_default: ค่าเริ่มต้น + field_tracker: การติดตาม + field_subject: เรื่อง + field_due_date: วันครบกำหนด + field_assigned_to: มอบหมายให้ + field_priority: ความสำคัญ + field_fixed_version: รุ่น + field_user: ผู้ใช้ + field_role: บทบาท + field_homepage: หน้าแรก + field_is_public: สาธารณะ + field_parent: โครงการย่อยของ + field_is_in_roadmap: ปัญหาแสดงใน แผนงาน + field_login: ชื่อที่ใช้เข้าระบบ + field_mail_notification: การแจ้งเตือนทางอีเมล์ + field_admin: ผู้บริหารจัดการ + field_last_login_on: เข้าระบบครั้งสุดท้าย + field_language: ภาษา + field_effective_date: วันที่ + field_password: รหัสผ่าน + field_new_password: รหัสผ่านใหม่ + field_password_confirmation: ยืนยันรหัสผ่าน + field_version: รุ่น + field_type: ชนิด + field_host: โฮสต์ + field_port: พอร์ต + field_account: บัญชี + field_base_dn: Base DN + field_attr_login: เข้าระบบ attribute + field_attr_firstname: ชื่อ attribute + field_attr_lastname: นามสกุล attribute + field_attr_mail: อีเมล์ attribute + field_onthefly: สร้างผู้ใช้ทันที + field_start_date: เริ่ม + field_done_ratio: "% สำเร็จ" + field_auth_source: วิธีการยืนยันตัวตน + field_hide_mail: ซ่อนอีเมล์ของฉัน + field_comments: ความเห็น + field_url: URL + field_start_page: หน้าเริ่มต้น + field_subproject: โครงการย่อย + field_hours: ชั่วโมง + field_activity: กิจกรรม + field_spent_on: วันที่ + field_identifier: ชื่อเฉพาะ + field_is_filter: ใช้เป็นตัวกรอง + field_issue_to: ปัญหาที่เกี่ยวข้อง + field_delay: เลื่อน + field_assignable: ปัญหาสามารถมอบหมายให้คนที่ทำบทบาทนี้ + field_redirect_existing_links: ย้ายจุดเชื่อมโยงนี้ + field_estimated_hours: เวลาที่ใช้โดยประมาณ + field_column_names: สดมภ์ + field_time_zone: ย่านเวลา + field_searchable: ค้นหาได้ + field_default_value: ค่าเริ่มต้น + field_comments_sorting: แสดงความเห็น + + setting_app_title: ชื่อโปรแกรม + setting_app_subtitle: ชื่อโปรแกรมรอง + setting_welcome_text: ข้อความต้อนรับ + setting_default_language: ภาษาเริ่มต้น + setting_login_required: ต้องป้อนผู้ใช้-รหัสผ่าน + setting_self_registration: ลงทะเบียนด้วยตนเอง + setting_attachment_max_size: ขนาดแฟ้มแนบสูงสุด + setting_issues_export_limit: การส่งออกปัญหาสูงสุด + setting_mail_from: อีเมล์ที่ใช้ส่ง + setting_bcc_recipients: ไม่ระบุชื่อผู้รับ (bcc) + setting_host_name: ชื่อโฮสต์ + setting_text_formatting: การจัดรูปแบบข้อความ + setting_wiki_compression: บีบอัดประวัติ Wiki + setting_feeds_limit: จำนวน Feed + setting_default_projects_public: โครงการใหม่มีค่าเริ่มต้นเป็น สาธารณะ + setting_autofetch_changesets: ดึง commits อัตโนมัติ + setting_sys_api_enabled: เปิดใช้ WS สำหรับการจัดการที่เก็บต้นฉบับ + setting_commit_ref_keywords: คำสำคัญ Referencing + setting_commit_fix_keywords: คำสำคัญ Fixing + setting_autologin: เข้าระบบอัตโนมัติ + setting_date_format: รูปแบบวันที่ + setting_time_format: รูปแบบเวลา + setting_cross_project_issue_relations: อนุญาตให้ระบุปัญหาข้ามโครงการ + setting_issue_list_default_columns: สดมภ์เริ่มต้นแสดงในรายการปัญหา + setting_emails_footer: คำลงท้ายอีเมล์ + setting_protocol: Protocol + setting_per_page_options: ตัวเลือกจำนวนต่อหน้า + setting_user_format: รูปแบบการแสดงชื่อผู้ใช้ + setting_activity_days_default: จำนวนวันที่แสดงในกิจกรรมของโครงการ + setting_display_subprojects_issues: แสดงปัญหาของโครงการย่อยในโครงการหลัก + + project_module_issue_tracking: การติดตามปัญหา + project_module_time_tracking: การใช้เวลา + project_module_news: ข่าว + project_module_documents: เอกสาร + project_module_files: แฟ้ม + project_module_wiki: Wiki + project_module_repository: ที่เก็บต้นฉบับ + project_module_boards: กระดานข้อความ + + label_user: ผู้ใช้ + label_user_plural: ผู้ใช้ + label_user_new: ผู้ใช้ใหม่ + label_project: โครงการ + label_project_new: โครงการใหม่ + label_project_plural: โครงการ + label_x_projects: + zero: no projects + one: 1 project + other: "%{count} projects" + label_project_all: โครงการทั้งหมด + label_project_latest: โครงการล่าสุด + label_issue: ปัญหา + label_issue_new: ปัญหาใหม่ + label_issue_plural: ปัญหา + label_issue_view_all: ดูปัญหาทั้งหมด + label_issues_by: "ปัญหาโดย %{value}" + label_issue_added: ปัญหาถูกเพิ่ม + label_issue_updated: ปัญหาถูกปรับปรุง + label_document: เอกสาร + label_document_new: เอกสารใหม่ + label_document_plural: เอกสาร + label_document_added: เอกสารถูกเพิ่ม + label_role: บทบาท + label_role_plural: บทบาท + label_role_new: บทบาทใหม่ + label_role_and_permissions: บทบาทและสิทธิ + label_member: สมาชิก + label_member_new: สมาชิกใหม่ + label_member_plural: สมาชิก + label_tracker: การติดตาม + label_tracker_plural: การติดตาม + label_tracker_new: การติดตามใหม่ + label_workflow: ลำดับงาน + label_issue_status: สถานะของปัญหา + label_issue_status_plural: สถานะของปัญหา + label_issue_status_new: สถานะใหม + label_issue_category: ประเภทของปัญหา + label_issue_category_plural: ประเภทของปัญหา + label_issue_category_new: ประเภทใหม่ + label_custom_field: เขตข้อมูลแบบระบุเอง + label_custom_field_plural: เขตข้อมูลแบบระบุเอง + label_custom_field_new: สร้างเขตข้อมูลแบบระบุเอง + label_enumerations: รายการ + label_enumeration_new: สร้างใหม่ + label_information: ข้อมูล + label_information_plural: ข้อมูล + label_please_login: กรุณาเข้าระบบก่อน + label_register: ลงทะเบียน + label_password_lost: ลืมรหัสผ่าน + label_home: หน้าแรก + label_my_page: หน้าของฉัน + label_my_account: บัญชีของฉัน + label_my_projects: โครงการของฉัน + label_administration: บริหารจัดการ + label_login: เข้าระบบ + label_logout: ออกระบบ + label_help: ช่วยเหลือ + label_reported_issues: ปัญหาที่แจ้งไว้ + label_assigned_to_me_issues: ปัญหาที่มอบหมายให้ฉัน + label_last_login: ติดต่อครั้งสุดท้าย + label_registered_on: ลงทะเบียนเมื่อ + label_activity: กิจกรรม + label_activity_plural: กิจกรรม + label_activity_latest: กิจกรรมล่าสุด + label_overall_activity: กิจกรรมโดยรวม + label_new: ใหม่ + label_logged_as: เข้าระบบในชื่อ + label_environment: สภาพแวดล้อม + label_authentication: การยืนยันตัวตน + label_auth_source: วิธีการการยืนยันตัวตน + label_auth_source_new: สร้างวิธีการยืนยันตัวตนใหม่ + label_auth_source_plural: วิธีการ Authentication + label_subproject_plural: โครงการย่อย + label_min_max_length: สั้น-ยาว สุดที่ + label_list: รายการ + label_date: วันที่ + label_integer: จำนวนเต็ม + label_float: จำนวนจริง + label_boolean: ถูกผิด + label_string: ข้อความ + label_text: ข้อความขนาดยาว + label_attribute: คุณลักษณะ + label_attribute_plural: คุณลักษณะ + label_no_data: จำนวนข้อมูลที่แสดง + label_change_status: เปลี่ยนสถานะ + label_history: ประวัติ + label_attachment: แฟ้ม + label_attachment_new: แฟ้มใหม่ + label_attachment_delete: ลบแฟ้ม + label_attachment_plural: แฟ้ม + label_file_added: แฟ้มถูกเพิ่ม + label_report: รายงาน + label_report_plural: รายงาน + label_news: ข่าว + label_news_new: เพิ่มข่าว + label_news_plural: ข่าว + label_news_latest: ข่าวล่าสุด + label_news_view_all: ดูข่าวทั้งหมด + label_news_added: ข่าวถูกเพิ่ม + label_settings: ปรับแต่ง + label_overview: ภาพรวม + label_version: รุ่น + label_version_new: รุ่นใหม่ + label_version_plural: รุ่น + label_confirmation: ยืนยัน + label_export_to: 'รูปแบบอื่นๆ :' + label_read: อ่าน... + label_public_projects: โครงการสาธารณะ + label_open_issues: เปิด + label_open_issues_plural: เปิด + label_closed_issues: ปิด + label_closed_issues_plural: ปิด + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_total: จำนวนรวม + label_permissions: สิทธิ + label_current_status: สถานะปัจจุบัน + label_new_statuses_allowed: อนุญาตให้มีสถานะใหม่ + label_all: ทั้งหมด + label_none: ไม่มี + label_nobody: ไม่มีใคร + label_next: ต่อไป + label_previous: ก่อนหน้า + label_used_by: ถูกใช้โดย + label_details: รายละเอียด + label_add_note: เพิ่มบันทึก + label_calendar: ปฏิทิน + label_months_from: เดือนจาก + label_gantt: Gantt + label_internal: ภายใน + label_last_changes: "last %{count} เปลี่ยนแปลง" + label_change_view_all: ดูการเปลี่ยนแปลงทั้งหมด + label_comment: ความเห็น + label_comment_plural: ความเห็น + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_comment_add: เพิ่มความเห็น + label_comment_added: ความเห็นถูกเพิ่ม + label_comment_delete: ลบความเห็น + label_query: แบบสอบถามแบบกำหนดเอง + label_query_plural: แบบสอบถามแบบกำหนดเอง + label_query_new: แบบสอบถามใหม่ + label_filter_add: เพิ่มตัวกรอง + label_filter_plural: ตัวกรอง + label_equals: คือ + label_not_equals: ไม่ใช่ + label_in_less_than: น้อยกว่า + label_in_more_than: มากกว่า + label_in: ในช่วง + label_today: วันนี้ + label_all_time: ตลอดเวลา + label_yesterday: เมื่อวาน + label_this_week: อาทิตย์นี้ + label_last_week: อาทิตย์ที่แล้ว + label_last_n_days: "%{count} วันย้อนหลัง" + label_this_month: เดือนนี้ + label_last_month: เดือนที่แล้ว + label_this_year: ปีนี้ + label_date_range: ช่วงวันที่ + label_less_than_ago: น้อยกว่าหนึ่งวัน + label_more_than_ago: มากกว่าหนึ่งวัน + label_ago: วันผ่านมาแล้ว + label_contains: มี... + label_not_contains: ไม่มี... + label_day_plural: วัน + label_repository: ที่เก็บต้นฉบับ + label_repository_plural: ที่เก็บต้นฉบับ + label_browse: เปิดหา + label_revision: การแก้ไข + label_revision_plural: การแก้ไข + label_associated_revisions: การแก้ไขที่เกี่ยวข้อง + label_added: ถูกเพิ่ม + label_modified: ถูกแก้ไข + label_deleted: ถูกลบ + label_latest_revision: รุ่นการแก้ไขล่าสุด + label_latest_revision_plural: รุ่นการแก้ไขล่าสุด + label_view_revisions: ดูการแก้ไข + label_max_size: ขนาดใหญ่สุด + label_sort_highest: ย้ายไปบนสุด + label_sort_higher: ย้ายขึ้น + label_sort_lower: ย้ายลง + label_sort_lowest: ย้ายไปล่างสุด + label_roadmap: แผนงาน + label_roadmap_due_in: "ถึงกำหนดใน %{value}" + label_roadmap_overdue: "%{value} ช้ากว่ากำหนด" + label_roadmap_no_issues: ไม่มีปัญหาสำหรับรุ่นนี้ + label_search: ค้นหา + label_result_plural: ผลการค้นหา + label_all_words: ทุกคำ + label_wiki: Wiki + label_wiki_edit: แก้ไข Wiki + label_wiki_edit_plural: แก้ไข Wiki + label_wiki_page: หน้า Wiki + label_wiki_page_plural: หน้า Wiki + label_index_by_title: เรียงตามชื่อเรื่อง + label_index_by_date: เรียงตามวัน + label_current_version: รุ่นปัจจุบัน + label_preview: ตัวอย่างก่อนจัดเก็บ + label_feed_plural: Feeds + label_changes_details: รายละเอียดการเปลี่ยนแปลงทั้งหมด + label_issue_tracking: ติดตามปัญหา + label_spent_time: เวลาที่ใช้ + label_f_hour: "%{value} ชั่วโมง" + label_f_hour_plural: "%{value} ชั่วโมง" + label_time_tracking: ติดตามการใช้เวลา + label_change_plural: เปลี่ยนแปลง + label_statistics: สถิติ + label_commits_per_month: Commits ต่อเดือน + label_commits_per_author: Commits ต่อผู้แต่ง + label_view_diff: ดูความแตกต่าง + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: ตัวเลือก + label_copy_workflow_from: คัดลอกลำดับงานจาก + label_permissions_report: รายงานสิทธิ + label_watched_issues: เฝ้าดูปัญหา + label_related_issues: ปัญหาที่เกี่ยวข้อง + label_applied_status: จัดเก็บสถานะ + label_loading: กำลังโหลด... + label_relation_new: ความสัมพันธ์ใหม่ + label_relation_delete: ลบความสัมพันธ์ + label_relates_to: สัมพันธ์กับ + label_duplicates: ซ้ำ + label_blocks: กีดกัน + label_blocked_by: กีดกันโดย + label_precedes: นำหน้า + label_follows: ตามหลัง + label_stay_logged_in: อยู่ในระบบต่อ + label_disabled: ไม่ใช้งาน + label_show_completed_versions: แสดงรุ่นที่สมบูรณ์ + label_me: ฉัน + label_board: สภากาแฟ + label_board_new: สร้างสภากาแฟ + label_board_plural: สภากาแฟ + label_topic_plural: หัวข้อ + label_message_plural: ข้อความ + label_message_last: ข้อความล่าสุด + label_message_new: เขียนข้อความใหม่ + label_message_posted: ข้อความถูกเพิ่มแล้ว + label_reply_plural: ตอบกลับ + label_send_information: ส่งรายละเอียดของบัญชีให้ผู้ใช้ + label_year: ปี + label_month: เดือน + label_week: สัปดาห์ + label_date_from: จาก + label_date_to: ถึง + label_language_based: ขึ้นอยู่กับภาษาของผู้ใช้ + label_sort_by: "เรียงโดย %{value}" + label_send_test_email: ส่งจดหมายทดสอบ + label_feeds_access_key_created_on: "Atom access key สร้างเมื่อ %{value} ที่ผ่านมา" + label_module_plural: ส่วนประกอบ + label_added_time_by: "เพิ่มโดย %{author} %{age} ที่ผ่านมา" + label_updated_time: "ปรับปรุง %{value} ที่ผ่านมา" + label_jump_to_a_project: ไปที่โครงการ... + label_file_plural: แฟ้ม + label_changeset_plural: กลุ่มการเปลี่ยนแปลง + label_default_columns: สดมภ์เริ่มต้น + label_no_change_option: (ไม่เปลี่ยนแปลง) + label_bulk_edit_selected_issues: แก้ไขปัญหาที่เลือกทั้งหมด + label_theme: ชุดรูปแบบ + label_default: ค่าเริ่มต้น + label_search_titles_only: ค้นหาจากชื่อเรื่องเท่านั้น + label_user_mail_option_all: "ทุกๆ เหตุการณ์ในโครงการของฉัน" + label_user_mail_option_selected: "ทุกๆ เหตุการณ์ในโครงการที่เลือก..." + label_user_mail_no_self_notified: "ฉันไม่ต้องการได้รับการแจ้งเตือนในสิ่งที่ฉันทำเอง" + label_registration_activation_by_email: เปิดบัญชีผ่านอีเมล์ + label_registration_manual_activation: อนุมัติโดยผู้บริหารจัดการ + label_registration_automatic_activation: เปิดบัญชีอัตโนมัติ + label_display_per_page: "ต่อหน้า: %{value}" + label_age: อายุ + label_change_properties: เปลี่ยนคุณสมบัติ + label_general: ทั่วๆ ไป + label_scm: ตัวจัดการต้นฉบับ + label_plugins: ส่วนเสริม + label_ldap_authentication: การยืนยันตัวตนโดยใช้ LDAP + label_downloads_abbr: D/L + label_optional_description: รายละเอียดเพิ่มเติม + label_add_another_file: เพิ่มแฟ้มอื่นๆ + label_preferences: ค่าที่ชอบใจ + label_chronological_order: เรียงจากเก่าไปใหม่ + label_reverse_chronological_order: เรียงจากใหม่ไปเก่า + + button_login: เข้าระบบ + button_submit: จัดส่งข้อมูล + button_save: จัดเก็บ + button_check_all: เลือกทั้งหมด + button_uncheck_all: ไม่เลือกทั้งหมด + button_delete: ลบ + button_create: สร้าง + button_test: ทดสอบ + button_edit: แก้ไข + button_add: เพิ่ม + button_change: เปลี่ยนแปลง + button_apply: ประยุกต์ใช้ + button_clear: ล้างข้อความ + button_lock: ล็อค + button_unlock: ยกเลิกการล็อค + button_download: ดาวน์โหลด + button_list: รายการ + button_view: มุมมอง + button_move: ย้าย + button_back: กลับ + button_cancel: ยกเลิก + button_activate: เปิดใช้ + button_sort: จัดเรียง + button_log_time: บันทึกเวลา + button_rollback: ถอยกลับมาที่รุ่นนี้ + button_watch: เฝ้าดู + button_unwatch: เลิกเฝ้าดู + button_reply: ตอบกลับ + button_archive: เก็บเข้าโกดัง + button_unarchive: เอาออกจากโกดัง + button_reset: เริ่มใหมท + button_rename: เปลี่ยนชื่อ + button_change_password: เปลี่ยนรหัสผ่าน + button_copy: คัดลอก + button_annotate: หมายเหตุประกอบ + button_update: ปรับปรุง + button_configure: ปรับแต่ง + + status_active: เปิดใช้งานแล้ว + status_registered: รอการอนุมัติ + status_locked: ล็อค + + text_select_mail_notifications: เลือกการกระทำที่ต้องการให้ส่งอีเมล์แจ้ง. + text_regexp_info: ตัวอย่าง ^[A-Z0-9]+$ + text_min_max_length_info: 0 หมายถึงไม่จำกัด + text_project_destroy_confirmation: คุณแน่ใจไหมว่าต้องการลบโครงการและข้อมูลที่เกี่ยวข้่อง ? + text_subprojects_destroy_warning: "โครงการย่อย: %{value} จะถูกลบด้วย." + text_workflow_edit: เลือกบทบาทและการติดตาม เพื่อแก้ไขลำดับงาน + text_are_you_sure: คุณแน่ใจไหม ? + text_tip_issue_begin_day: งานที่เริ่มวันนี้ + text_tip_issue_end_day: งานที่จบวันนี้ + text_tip_issue_begin_end_day: งานที่เริ่มและจบวันนี้ + text_caracters_maximum: "สูงสุด %{count} ตัวอักษร." + text_caracters_minimum: "ต้องยาวอย่างน้อย %{count} ตัวอักษร." + text_length_between: "ความยาวระหว่าง %{min} ถึง %{max} ตัวอักษร." + text_tracker_no_workflow: ไม่ได้บัญญัติลำดับงานสำหรับการติดตามนี้ + text_unallowed_characters: ตัวอักษรต้องห้าม + text_comma_separated: ใส่ได้หลายค่า โดยคั่นด้วยลูกน้ำ( ,). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "ปัญหา %{id} ถูกแจ้งโดย %{author}." + text_issue_updated: "ปัญหา %{id} ถูกปรับปรุงโดย %{author}." + text_wiki_destroy_confirmation: คุณแน่ใจหรือว่าต้องการลบ wiki นี้พร้อมทั้งเนี้อหา? + text_issue_category_destroy_question: "บางปัญหา (%{count}) อยู่ในประเภทนี้. คุณต้องการทำอย่างไร ?" + text_issue_category_destroy_assignments: ลบประเภทนี้ + text_issue_category_reassign_to: ระบุปัญหาในประเภทนี้ + text_user_mail_option: "ในโครงการที่ไม่ได้เลือก, คุณจะได้รับการแจ้งเกี่ยวกับสิ่งที่คุณเฝ้าดูหรือมีส่วนเกี่ยวข้อง (เช่นปัญหาที่คุณแจ้งไว้หรือได้รับมอบหมาย)." + text_no_configuration_data: "บทบาท, การติดตาม, สถานะปัญหา และลำดับงานยังไม่ได้ถูกตั้งค่า.\nขอแนะนำให้โหลดค่าเริ่มต้น. คุณสามารถแก้ไขค่าได้หลังจากโหลดแล้ว." + text_load_default_configuration: โหลดค่าเริ่มต้น + text_status_changed_by_changeset: "ประยุกต์ใช้ในกลุ่มการเปลี่ยนแปลง %{value}." + text_issues_destroy_confirmation: 'คุณแน่ใจไหมว่าต้องการลบปัญหา(ทั้งหลาย)ที่เลือกไว้?' + text_select_project_modules: 'เลือกส่วนประกอบที่ต้องการใช้งานสำหรับโครงการนี้:' + text_default_administrator_account_changed: ค่าเริ่มต้นของบัญชีผู้บริหารจัดการถูกเปลี่ยนแปลง + text_file_repository_writable: ที่เก็บต้นฉบับสามารถเขียนได้ + text_rmagick_available: RMagick มีให้ใช้ (เป็นตัวเลือก) + text_destroy_time_entries_question: "%{hours} ชั่วโมงที่ถูกแจ้งในปัญหานี้จะโดนลบ. คุณต้องการทำอย่างไร?" + text_destroy_time_entries: ลบเวลาที่รายงานไว้ + text_assign_time_entries_to_project: ระบุเวลาที่ใช้ในโครงการนี้ + text_reassign_time_entries: 'ระบุเวลาที่ใช้ในโครงการนี่อีกครั้ง:' + + default_role_manager: ผู้จัดการ + default_role_developer: ผู้พัฒนา + default_role_reporter: ผู้รายงาน + default_tracker_bug: บั๊ก + default_tracker_feature: ลักษณะเด่น + default_tracker_support: สนับสนุน + default_issue_status_new: เกิดขึ้น + default_issue_status_in_progress: In Progress + default_issue_status_resolved: ดำเนินการ + default_issue_status_feedback: รอคำตอบ + default_issue_status_closed: จบ + default_issue_status_rejected: ยกเลิก + default_doc_category_user: เอกสารของผู้ใช้ + default_doc_category_tech: เอกสารทางเทคนิค + default_priority_low: ต่ำ + default_priority_normal: ปกติ + default_priority_high: สูง + default_priority_urgent: เร่งด่วน + default_priority_immediate: ด่วนมาก + default_activity_design: ออกแบบ + default_activity_development: พัฒนา + + enumeration_issue_priorities: ความสำคัญของปัญหา + enumeration_doc_categories: ประเภทเอกสาร + enumeration_activities: กิจกรรม (ใช้ในการติดตามเวลา) + label_and_its_subprojects: "%{value} and its subprojects" + mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" + mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" + text_user_wrote: "%{value} wrote:" + label_duplicated_by: duplicated by + setting_enabled_scm: Enabled SCM + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + label_incoming_emails: Incoming emails + label_generate_key: Generate a key + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API key + text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + field_parent_title: Parent page + label_issue_watchers: Watchers + button_quote: Quote + setting_sequential_project_identifiers: Generate sequential project identifiers + notice_unable_delete_version: Unable to delete version + label_renamed: renamed + label_copied: copied + setting_plain_text_mail: plain text only (no HTML) + permission_view_files: View files + permission_edit_issues: Edit issues + permission_edit_own_time_entries: Edit own time logs + permission_manage_public_queries: Manage public queries + permission_add_issues: Add issues + permission_log_time: Log spent time + permission_view_changesets: View changesets + permission_view_time_entries: View spent time + permission_manage_versions: Manage versions + permission_manage_wiki: Manage wiki + permission_manage_categories: Manage issue categories + permission_protect_wiki_pages: Protect wiki pages + permission_comment_news: Comment news + permission_delete_messages: Delete messages + permission_select_project_modules: Select project modules + permission_edit_wiki_pages: Edit wiki pages + permission_add_issue_watchers: Add watchers + permission_view_gantt: View gantt chart + permission_move_issues: Move issues + permission_manage_issue_relations: Manage issue relations + permission_delete_wiki_pages: Delete wiki pages + permission_manage_boards: Manage boards + permission_delete_wiki_pages_attachments: Delete attachments + permission_view_wiki_edits: View wiki history + permission_add_messages: Post messages + permission_view_messages: View messages + permission_manage_files: Manage files + permission_edit_issue_notes: Edit notes + permission_manage_news: Manage news + permission_view_calendar: View calendrier + permission_manage_members: Manage members + permission_edit_messages: Edit messages + permission_delete_issues: Delete issues + permission_view_issue_watchers: View watchers list + permission_manage_repository: Manage repository + permission_commit_access: Commit access + permission_browse_repository: Browse repository + permission_view_documents: View documents + permission_edit_project: Edit project + permission_add_issue_notes: Add notes + permission_save_queries: Save queries + permission_view_wiki_pages: View wiki + permission_rename_wiki_pages: Rename wiki pages + permission_edit_time_entries: Edit time logs + permission_edit_own_issue_notes: Edit own notes + setting_gravatar_enabled: Use Gravatar user icons + label_example: Example + text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + permission_edit_own_messages: Edit own messages + permission_delete_own_messages: Delete own messages + label_user_activity: "%{value}'s activity" + label_updated_time_by: "Updated by %{author} %{age} ago" + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + setting_diff_max_lines_displayed: Max number of diff lines displayed + text_plugin_assets_writable: Plugin assets directory writable + warning_attachments_not_saved: "%{count} file(s) could not be saved." + button_create_and_continue: Create and continue + text_custom_field_possible_values_info: 'One line for each value' + label_display: Display + field_editable: Editable + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_file_max_size_displayed: Max size of text files displayed inline + field_watcher: Watcher + setting_openid: Allow OpenID login and registration + field_identity_url: OpenID URL + label_login_with_open_id_option: or login with OpenID + field_content: Content + label_descending: Descending + label_sort: Sort + label_ascending: Ascending + label_date_from_to: From %{start} to %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do? + text_wiki_page_reassign_children: Reassign child pages to this parent page + text_wiki_page_nullify_children: Keep child pages as root pages + text_wiki_page_destroy_children: Delete child pages and all their descendants + setting_password_min_length: Minimum password length + field_group_by: Group results by + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + label_wiki_content_added: Wiki page added + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}. + label_wiki_content_updated: Wiki page updated + mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}. + permission_add_project: Create project + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + label_view_all_revisions: View all revisions + label_tag: Tag + label_branch: Branch + error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. + error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses"). + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + label_group_plural: Groups + label_group: Group + label_group_new: New group + label_time_entry_plural: Spent time + text_journal_added: "%{label} %{value} added" + field_active: Active + enumeration_system_activity: System Activity + permission_delete_issue_watchers: Delete watchers + version_status_closed: closed + version_status_locked: locked + version_status_open: open + error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened + label_user_anonymous: Anonymous + button_move_and_follow: Move and follow + setting_default_projects_modules: Default enabled modules for new projects + setting_gravatar_default: Default Gravatar image + field_sharing: Sharing + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_system: With all projects + label_version_sharing_descendants: With subprojects + label_version_sharing_tree: With project tree + label_version_sharing_none: Not shared + error_can_not_archive_project: This project can not be archived + button_duplicate: Duplicate + button_copy_and_follow: Copy and follow + label_copy_source: Source + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_status: Use the issue status + error_issue_done_ratios_not_updated: Issue done ratios not updated. + error_workflow_copy_target: Please select target tracker(s) and role(s) + setting_issue_done_ratio_issue_field: Use the issue field + label_copy_same_as_target: Same as target + label_copy_target: Target + notice_issue_done_ratios_updated: Issue done ratios updated. + error_workflow_copy_source: Please select a source tracker or role + label_update_issue_done_ratios: Update issue done ratios + setting_start_of_week: Start calendars on + permission_view_issues: View Issues + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_revision_id: Revision %{value} + label_api_access_key: API access key + label_api_access_key_created_on: API access key created %{value} ago + label_feeds_access_key: Atom access key + notice_api_access_key_reseted: Your API access key was reset. + setting_rest_api_enabled: Enable REST web service + label_missing_api_access_key: Missing an API access key + label_missing_feeds_access_key: Missing a Atom access key + button_show: Show + text_line_separated: Multiple values allowed (one line for each value). + setting_mail_handler_body_delimiters: Truncate emails after one of these lines + permission_add_subprojects: Create subprojects + label_subproject_new: New subproject + text_own_membership_delete_confirmation: |- + You are about to remove some or all of your permissions and may no longer be able to edit this project after that. + Are you sure you want to continue? + label_close_versions: Close completed versions + label_board_sticky: Sticky + label_board_locked: Locked + permission_export_wiki_pages: Export wiki pages + setting_cache_formatted_text: Cache formatted text + permission_manage_project_activities: Manage project activities + error_unable_delete_issue_status: Unable to delete issue status + label_profile: Profile + permission_manage_subtasks: Manage subtasks + field_parent_issue: Parent task + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + error_can_not_delete_custom_field: Unable to delete custom field + error_unable_to_connect: Unable to connect (%{value}) + error_can_not_remove_role: This role is in use and can not be deleted. + error_can_not_delete_tracker: This tracker contains issues and cannot be deleted. + field_principal: Principal + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + text_zoom_out: Zoom out + text_zoom_in: Zoom in + notice_unable_delete_time_entry: Unable to delete time log entry. + label_overall_spent_time: Overall spent time + field_time_entries: Log time + project_module_gantt: Gantt + project_module_calendar: Calendar + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + field_text: Text field + setting_default_notification_option: Default notification option + label_user_mail_option_only_my_events: Only for things I watch or I'm involved in + label_user_mail_option_none: No events + field_member_of_group: Assignee's group + field_assigned_to_role: Assignee's role + notice_not_authorized_archived_project: The project you're trying to access has been archived. + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + field_visible: Visible + setting_commit_logtime_activity_id: Activity for logged time + text_time_logged_by_changeset: Applied in changeset %{value}. + setting_commit_logtime_enabled: Enable time logging + notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text + text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. + label_my_queries: My custom queries + text_journal_changed_no_detail: "%{label} updated" + label_news_comment_added: Comment added to a news + button_expand_all: Expand all + button_collapse_all: Collapse all + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_issues_visibility_own: Issues created by or assigned to the user + field_issues_visibility: Issues visibility + label_issues_visibility_all: All issues + permission_set_own_issues_private: Set own issues public or private + field_is_private: Private + permission_set_issues_private: Set issues public or private + label_issues_visibility_public: All non private issues + text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + text_scm_path_encoding_note: "Default: UTF-8" + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + label_git_report_last_commit: Report last commit for files and directories + notice_issue_successful_create: Issue %{id} created. + label_between: between + setting_issue_group_assignment: Allow issue assignment to groups + label_diff: diff + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sort direction + description_project_scope: Search scope + description_filter: Filter + description_user_mail_notification: Mail notification settings + description_message_content: Message content + description_available_columns: Available Columns + description_issue_category_reassign: Choose issue category + description_search: Searchfield + description_notes: Notes + description_choose_project: Projects + description_query_sort_criteria_attribute: Sort attribute + description_wiki_subpages_reassign: Choose new parent page + description_selected_columns: Selected Columns + label_parent_revision: Parent + label_child_revision: Child + error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + button_edit_section: Edit this section + setting_repositories_encodings: Attachments and repositories encodings + description_all_columns: All Columns + button_export: Export + label_export_options: "%{export_format} export options" + error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_x_issues: + zero: 0 ปัญหา + one: 1 ปัญหา + other: "%{count} ปัญหา" + label_repository_new: New repository + field_repository_is_default: Main repository + label_copy_attachments: Copy attachments + label_item_position: "%{position}/%{count}" + label_completed_versions: Completed versions + text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_multiple: Multiple values + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes + text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) + notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. + text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} + permission_manage_related_issues: Manage related issues + field_auth_source_ldap_filter: LDAP filter + label_search_for_watchers: Search for watchers to add + notice_account_deleted: Your account has been permanently deleted. + setting_unsubscribe: Allow users to delete their own account + button_delete_my_account: Delete my account + text_account_destroy_confirmation: |- + Are you sure you want to proceed? + Your account will be permanently deleted, with no way to reactivate it. + error_session_expired: Your session has expired. Please login again. + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + label_session_expiration: Session expiration + permission_close_project: Close / reopen the project + label_show_closed_projects: View closed projects + button_close: Close + button_reopen: Reopen + project_status_active: active + project_status_closed: closed + project_status_archived: archived + text_project_closed: This project is closed and read-only. + notice_user_successful_create: User %{id} created. + field_core_fields: Standard fields + field_timeout: Timeout (in seconds) + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. + field_board_parent: Parent forum + label_attribute_of_project: Project's %{name} + label_attribute_of_author: Author's %{name} + label_attribute_of_assigned_to: Assignee's %{name} + label_attribute_of_fixed_version: Target version's %{name} + label_copy_subtasks: Copy subtasks + label_copied_to: copied to + label_copied_from: copied from + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + field_private_notes: Private notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + label_no_issues_in_project: no issues in project + label_any: ทั้งหมด + label_last_n_weeks: last %{count} weeks + setting_cross_project_subtasks: Allow cross-project subtasks + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + button_hide: Hide + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + label_gantt_progress_line: Progress line + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: Closed + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: จำนวนรวม + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: อีเมล์ + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Overall spent time + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API key + setting_lost_password: ลืมรหัสผ่าน + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/tr.yml b/config/locales/tr.yml new file mode 100644 index 0000000..f7af97b --- /dev/null +++ b/config/locales/tr.yml @@ -0,0 +1,1238 @@ +# Turkish translations for Ruby on Rails +# by Ozgun Ataman (ozataman@gmail.com) +# by Burak Yigit Kaya (ben@byk.im) +# by Mert Salih Kaplan (mail@mertskaplan.com) + +tr: + direction: ltr + date: + formats: + default: "%d.%m.%Y" + short: "%e %b" + long: "%e %B %Y, %A" + only_day: "%e" + + day_names: [Pazar, Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi] + abbr_day_names: [Pzr, Pzt, Sal, Çrş, Prş, Cum, Cts] + month_names: [~, Ocak, Şubat, Mart, Nisan, Mayıs, Haziran, Temmuz, Ağustos, Eylül, Ekim, Kasım, Aralık] + abbr_month_names: [~, Oca, Şub, Mar, Nis, May, Haz, Tem, Ağu, Eyl, Eki, Kas, Ara] + order: + - :day + - :month + - :year + + time: + formats: + default: "%a %d.%b.%y %H:%M" + short: "%e %B, %H:%M" + long: "%e %B %Y, %A, %H:%M" + time: "%H:%M" + + am: "öğleden önce" + pm: "öğleden sonra" + + datetime: + distance_in_words: + half_a_minute: 'yarım dakika' + less_than_x_seconds: + zero: '1 saniyeden az' + one: '1 saniyeden az' + other: '%{count} saniyeden az' + x_seconds: + one: '1 saniye' + other: '%{count} saniye' + less_than_x_minutes: + zero: '1 dakikadan az' + one: '1 dakikadan az' + other: '%{count} dakikadan az' + x_minutes: + one: '1 dakika' + other: '%{count} dakika' + about_x_hours: + one: 'yaklaşık 1 saat' + other: 'yaklaşık %{count} saat' + x_hours: + one: "1 saat" + other: "%{count} saat" + x_days: + one: '1 gün' + other: '%{count} gün' + about_x_months: + one: 'yaklaşık 1 ay' + other: 'yaklaşık %{count} ay' + x_months: + one: '1 ay' + other: '%{count} ay' + about_x_years: + one: 'yaklaşık 1 yıl' + other: 'yaklaşık %{count} yıl' + over_x_years: + one: '1 yıldan fazla' + other: '%{count} yıldan fazla' + almost_x_years: + one: "neredeyse 1 Yıl" + other: "neredeyse %{count} yıl" + + number: + format: + precision: 2 + separator: ',' + delimiter: '.' + currency: + format: + unit: 'TRY' + format: '%n%u' + separator: ',' + delimiter: '.' + precision: 2 + percentage: + format: + delimiter: '.' + precision: + format: + delimiter: '.' + human: + format: + delimiter: '.' + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Byte" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + support: + array: + sentence_connector: "ve" + skip_last_comma: true + + activerecord: + errors: + template: + header: + one: "%{model} girişi kaydedilemedi: 1 hata." + other: "%{model} girişi kadedilemedi: %{count} hata." + body: "Lütfen aşağıdaki hataları düzeltiniz:" + + messages: + inclusion: "kabul edilen bir kelime değil" + exclusion: "kullanılamaz" + invalid: "geçersiz" + confirmation: "teyidi uyuşmamakta" + accepted: "kabul edilmeli" + empty: "doldurulmalı" + blank: "doldurulmalı" + too_long: "çok uzun (en fazla %{count} karakter)" + too_short: "çok kısa (en az %{count} karakter)" + wrong_length: "yanlış uzunlukta (tam olarak %{count} karakter olmalı)" + taken: "hali hazırda kullanılmakta" + not_a_number: "geçerli bir sayı değil" + greater_than: "%{count} sayısından büyük olmalı" + greater_than_or_equal_to: "%{count} sayısına eşit veya büyük olmalı" + equal_to: "tam olarak %{count} olmalı" + less_than: "%{count} sayısından küçük olmalı" + less_than_or_equal_to: "%{count} sayısına eşit veya küçük olmalı" + odd: "tek olmalı" + even: "çift olmalı" + greater_than_start_date: "başlangıç tarihinden büyük olmalı" + not_same_project: "aynı projeye ait değil" + circular_dependency: "Bu ilişki döngüsel bağımlılık meydana getirecektir" + cant_link_an_issue_with_a_descendant: "Bir iş, alt işlerinden birine bağlanamaz" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + models: + + actionview_instancetag_blank_option: Lütfen Seçin + + general_text_No: 'Hayır' + general_text_Yes: 'Evet' + general_text_no: 'hayır' + general_text_yes: 'evet' + general_lang_name: 'Turkish (Türkçe)' + general_csv_separator: ',' + general_csv_encoding: ISO-8859-9 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Hesap başarıyla güncelleştirildi. + notice_account_invalid_credentials: Geçersiz kullanıcı ya da parola + notice_account_password_updated: Parola başarıyla güncellendi. + notice_account_wrong_password: Yanlış parola + notice_account_register_done: Hesap başarıyla oluşturuldu. Hesabınızı etkinleştirmek için, size gönderilen e-postadaki bağlantıya tıklayın. + notice_account_unknown_email: Tanınmayan kullanıcı. + notice_can_t_change_password: Bu hesap harici bir denetim kaynağı kullanıyor. Parolayı değiştirmek mümkün değil. + notice_account_lost_email_sent: Yeni parola seçme talimatlarını içeren e-postanız gönderildi. + notice_account_activated: Hesabınız etkinleştirildi. Şimdi giriş yapabilirsiniz. + notice_successful_create: Başarıyla oluşturuldu. + notice_successful_update: Başarıyla güncellendi. + notice_successful_delete: Başarıyla silindi. + notice_successful_connection: Bağlantı başarılı. + notice_file_not_found: Erişmek istediğiniz sayfa mevcut değil ya da kaldırılmış. + notice_locking_conflict: Veri başka bir kullanıcı tarafından güncellendi. + notice_not_authorized: Bu sayfaya erişme yetkiniz yok. + notice_email_sent: "E-posta gönderildi %{value}" + notice_email_error: "E-posta gönderilirken bir hata oluştu (%{value})" + notice_feeds_access_key_reseted: Atom erişim anahtarınız sıfırlandı. + notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." + notice_no_issue_selected: "Seçili iş yok! Lütfen, düzenlemek istediğiniz işleri işaretleyin." + notice_account_pending: "Hesabınız oluşturuldu ve yönetici onayı bekliyor." + notice_default_data_loaded: Varasayılan konfigürasyon başarılıyla yüklendi. + + error_can_t_load_default_data: "Varsayılan konfigürasyon yüklenemedi: %{value}" + error_scm_not_found: "Depoda, giriş ya da değişiklik yok." + error_scm_command_failed: "Depoya erişmeye çalışırken bir hata meydana geldi: %{value}" + error_scm_annotate: "Giriş mevcut değil veya izah edilemedi." + error_issue_not_found_in_project: 'İş bilgisi bulunamadı veya bu projeye ait değil' + + mail_subject_lost_password: "Parolanız %{value}" + mail_body_lost_password: 'Parolanızı değiştirmek için, aşağıdaki bağlantıya tıklayın:' + mail_subject_register: "%{value} hesap aktivasyonu" + mail_body_register: 'Hesabınızı etkinleştirmek için, aşağıdaki bağlantıya tıklayın:' + mail_body_account_information_external: "Hesabınızı %{value} giriş yapmak için kullanabilirsiniz." + mail_body_account_information: Hesap bilgileriniz + mail_subject_account_activation_request: "%{value} hesabı etkinleştirme isteği" + mail_body_account_activation_request: "Yeni bir kullanıcı (%{value}) kaydedildi. Hesap onaylanmayı bekliyor:" + + + field_name: İsim + field_description: Yorum + field_summary: Özet + field_is_required: Gerekli + field_firstname: Ad + field_lastname: Soyad + field_mail: E-Posta + field_filename: Dosya + field_filesize: Boyut + field_downloads: İndirilenler + field_author: Oluşturan + field_created_on: Oluşturulma + field_updated_on: Güncellenme + field_field_format: Biçim + field_is_for_all: Tüm projeler için + field_possible_values: Kullanılabilir değerler + field_regexp: Düzenli ifadeler + field_min_length: En az uzunluk + field_max_length: En çok uzunluk + field_value: Değer + field_category: Kategori + field_title: Başlık + field_project: Proje + field_issue: İş + field_status: Durum + field_notes: Notlar + field_is_closed: İş kapatıldı + field_is_default: Varsayılan Değer + field_tracker: İş tipi + field_subject: Konu + field_due_date: Bitiş Tarihi + field_assigned_to: Atanan + field_priority: Öncelik + field_fixed_version: Hedef Sürüm + field_user: Kullanıcı + field_role: Rol + field_homepage: Anasayfa + field_is_public: Genel + field_parent: 'Üst proje: ' + field_is_in_roadmap: Yol haritasında gösterilen işler + field_login: Giriş + field_mail_notification: E-posta uyarıları + field_admin: Yönetici + field_last_login_on: Son Bağlantı + field_language: Dil + field_effective_date: Tarih + field_password: Parola + field_new_password: Yeni Parola + field_password_confirmation: Parola Doğrulama + field_version: Sürüm + field_type: Tip + field_host: Host + field_port: Port + field_account: Hesap + field_base_dn: Base DN + field_attr_login: Giriş Niteliği + field_attr_firstname: Ad Niteliği + field_attr_lastname: Soyad Niteliği + field_attr_mail: E-Posta Niteliği + field_onthefly: Anında kullanıcı oluşturma + field_start_date: Başlangıç Tarihi + field_done_ratio: Tamamlanma yüzdesi + field_auth_source: Kimlik Denetim Modu + field_hide_mail: E-posta adresimi gizle + field_comments: Yorumlar + field_url: URL + field_start_page: Başlangıç Sayfası + field_subproject: Alt Proje + field_hours: Saat + field_activity: Faaliyet + field_spent_on: Tarih + field_identifier: Tanımlayıcı + field_is_filter: süzgeç olarak kullanılmış + field_issue_to: İlişkili iş + field_delay: Gecikme + field_assignable: Bu role atanabilecek işler + field_redirect_existing_links: Mevcut bağlantıları yönlendir + field_estimated_hours: Kalan zaman + field_column_names: Sütunlar + field_time_zone: Saat dilimi + field_searchable: Aranabilir + field_default_value: Varsayılan değer + field_comments_sorting: Yorumları göster + + setting_app_title: Uygulama Bağlığı + setting_app_subtitle: Uygulama alt başlığı + setting_welcome_text: Hoşgeldin Mesajı + setting_default_language: Varsayılan Dil + setting_login_required: Kimlik denetimi gerekli mi + setting_self_registration: Otomatik kayıt + setting_attachment_max_size: Maksimum ek boyutu + setting_issues_export_limit: İşlerin dışa aktarılma sınırı + setting_mail_from: Gönderici e-posta adresi + setting_bcc_recipients: Alıcıları birbirinden gizle (bcc) + setting_host_name: Host adı + setting_text_formatting: Metin biçimi + setting_wiki_compression: Wiki geçmişini sıkıştır + setting_feeds_limit: Haber yayını içerik limiti + setting_default_projects_public: Yeni projeler varsayılan olarak herkese açık + setting_autofetch_changesets: Otomatik gönderi al + setting_sys_api_enabled: Depo yönetimi için WS'yi etkinleştir + setting_commit_ref_keywords: Başvuru Kelimeleri + setting_commit_fix_keywords: Sabitleme kelimeleri + setting_autologin: Otomatik Giriş + setting_date_format: Tarih Formati + setting_time_format: Zaman Formatı + setting_cross_project_issue_relations: Çapraz-Proje iş ilişkilendirmesine izin ver + setting_issue_list_default_columns: İş listesinde gösterilen varsayılan sütunlar + setting_emails_footer: E-posta dip not + setting_protocol: Protokol + setting_per_page_options: Sayfada başına öğe sayısı + setting_user_format: Kullanıcı gösterim biçimi + setting_activity_days_default: Proje faaliyetlerinde gösterilen gün sayısı + setting_display_subprojects_issues: Varsayılan olarak ana projenin iş listesinde alt proje işlerini göster + + project_module_issue_tracking: İş Takibi + project_module_time_tracking: Zaman Takibi + project_module_news: Haberler + project_module_documents: Belgeler + project_module_files: Dosyalar + project_module_wiki: Wiki + project_module_repository: Depo + project_module_boards: Tartışma Alanı + + label_user: Kullanıcı + label_user_plural: Kullanıcılar + label_user_new: Yeni Kullanıcı + label_project: Proje + label_project_new: Yeni proje + label_project_plural: Projeler + label_x_projects: + zero: hiç proje yok + one: 1 proje + other: "%{count} proje" + label_project_all: Tüm Projeler + label_project_latest: En son projeler + label_issue: İş + label_issue_new: Yeni İş + label_issue_plural: İşler + label_issue_view_all: Tüm işleri izle + label_issues_by: "%{value} tarafından gönderilmiş işler" + label_issue_added: İş eklendi + label_issue_updated: İş güncellendi + label_document: Belge + label_document_new: Yeni belge + label_document_plural: Belgeler + label_document_added: Belge eklendi + label_role: Rol + label_role_plural: Roller + label_role_new: Yeni rol + label_role_and_permissions: Roller ve izinler + label_member: Üye + label_member_new: Yeni üye + label_member_plural: Üyeler + label_tracker: İş tipi + label_tracker_plural: İş tipleri + label_tracker_new: Yeni iş tipi + label_workflow: İş akışı + label_issue_status: İş durumu + label_issue_status_plural: İş durumları + label_issue_status_new: Yeni durum + label_issue_category: İş kategorisi + label_issue_category_plural: İş kategorileri + label_issue_category_new: Yeni kategori + label_custom_field: Özel alan + label_custom_field_plural: Özel alanlar + label_custom_field_new: Yeni özel alan + label_enumerations: Numaralandırmalar + label_enumeration_new: Yeni değer + label_information: Bilgi + label_information_plural: Bilgi + label_please_login: Lütfen giriş yapın + label_register: Kayıt + label_password_lost: Parolamı unuttum + label_home: Anasayfa + label_my_page: Kişisel Sayfam + label_my_account: Hesabım + label_my_projects: Projelerim + label_administration: Yönetim + label_login: Giriş + label_logout: Çıkış + label_help: Yardım + label_reported_issues: Rapor edilmiş işler + label_assigned_to_me_issues: Bana atanmış işler + label_last_login: Son bağlantı + label_registered_on: Kayıt tarihi + label_activity: Faaliyet + label_overall_activity: Tüm faaliyetler + label_new: Yeni + label_logged_as: "Kullanıcı :" + label_environment: Çevre + label_authentication: Kimlik Denetimi + label_auth_source: Kimlik Denetim Modu + label_auth_source_new: Yeni Denetim Modu + label_auth_source_plural: Denetim Modları + label_subproject_plural: Alt Projeler + label_min_max_length: Min - Maks uzunluk + label_list: Liste + label_date: Tarih + label_integer: Tam sayı + label_float: Ondalıklı sayı + label_boolean: "Evet/Hayır" + label_string: Metin + label_text: Uzun Metin + label_attribute: Nitelik + label_attribute_plural: Nitelikler + label_no_data: Gösterilecek veri yok + label_change_status: Değişim Durumu + label_history: Geçmiş + label_attachment: Dosya + label_attachment_new: Yeni Dosya + label_attachment_delete: Dosyayı Sil + label_attachment_plural: Dosyalar + label_file_added: Eklenen Dosyalar + label_report: Rapor + label_report_plural: Raporlar + label_news: Haber + label_news_new: Haber ekle + label_news_plural: Haber + label_news_latest: Son Haberler + label_news_view_all: Tüm haberleri oku + label_news_added: Haber eklendi + label_settings: Ayarlar + label_overview: Genel + label_version: Sürüm + label_version_new: Yeni sürüm + label_version_plural: Sürümler + label_confirmation: Doğrulamama + label_export_to: "Diğer uygun kaynaklar:" + label_read: "Oku..." + label_public_projects: Genel Projeler + label_open_issues: açık + label_open_issues_plural: açık + label_closed_issues: kapalı + label_closed_issues_plural: kapalı + label_x_open_issues_abbr: + zero: hiç açık yok + one: 1 açık + other: "%{count} açık" + label_x_closed_issues_abbr: + zero: hiç kapalı yok + one: 1 kapalı + other: "%{count} kapalı" + label_total: Toplam + label_permissions: İzinler + label_current_status: Mevcut Durum + label_new_statuses_allowed: Yeni durumlara izin verildi + label_all: Hepsi + label_none: Hiçbiri + label_nobody: Hiçkimse + label_next: Sonraki + label_previous: Önceki + label_used_by: 'Kullanan: ' + label_details: Ayrıntılar + label_add_note: Not ekle + label_calendar: Takvim + label_months_from: ay öncesinden itibaren + label_gantt: İş-Zaman Çizelgesi + label_internal: Dahili + label_last_changes: "Son %{count} değişiklik" + label_change_view_all: Tüm Değişiklikleri göster + label_comment: Yorum + label_comment_plural: Yorumlar + label_x_comments: + zero: hiç yorum yok + one: 1 yorum + other: "%{count} yorum" + label_comment_add: Yorum Ekle + label_comment_added: Yorum Eklendi + label_comment_delete: Yorumları sil + label_query: Özel Sorgu + label_query_plural: Özel Sorgular + label_query_new: Yeni Sorgu + label_filter_add: Süzgeç ekle + label_filter_plural: Süzgeçler + label_equals: Eşit + label_not_equals: Eşit değil + label_in_less_than: küçüktür + label_in_more_than: büyüktür + label_in: içinde + label_today: bugün + label_all_time: Tüm Zamanlar + label_yesterday: Dün + label_this_week: Bu hafta + label_last_week: Geçen hafta + label_last_n_days: "Son %{count} gün" + label_this_month: Bu ay + label_last_month: Geçen ay + label_this_year: Bu yıl + label_date_range: Tarih aralığı + label_less_than_ago: günler öncesinden az + label_more_than_ago: günler öncesinden fazla + label_ago: gün önce + label_contains: içeriyor + label_not_contains: içermiyor + label_day_plural: Günler + label_repository: Depo + label_repository_plural: Depolar + label_browse: Gözat + label_revision: Değişiklik + label_revision_plural: Değişiklikler + label_associated_revisions: Birleştirilmiş değişiklikler + label_added: eklendi + label_modified: güncellendi + label_deleted: silindi + label_latest_revision: En son değişiklik + label_latest_revision_plural: En son değişiklikler + label_view_revisions: Değişiklikleri izle + label_max_size: En büyük boyut + label_sort_highest: Üste taşı + label_sort_higher: Yukarı taşı + label_sort_lower: Aşağı taşı + label_sort_lowest: Dibe taşı + label_roadmap: Yol Haritası + label_roadmap_due_in: "%{value} içinde bitmeli" + label_roadmap_overdue: "%{value} geç" + label_roadmap_no_issues: Bu sürüm için iş yok + label_search: Ara + label_result_plural: Sonuçlar + label_all_words: Tüm Kelimeler + label_wiki: Wiki + label_wiki_edit: Wiki düzenleme + label_wiki_edit_plural: Wiki düzenlemeleri + label_wiki_page: Wiki sayfası + label_wiki_page_plural: Wiki sayfaları + label_index_by_title: Başlığa göre diz + label_index_by_date: Tarihe göre diz + label_current_version: Güncel sürüm + label_preview: Önizleme + label_feed_plural: Beslemeler + label_changes_details: Bütün değişikliklerin detayları + label_issue_tracking: İş Takibi + label_spent_time: Harcanan zaman + label_f_hour: "%{value} saat" + label_f_hour_plural: "%{value} saat" + label_time_tracking: Zaman Takibi + label_change_plural: Değişiklikler + label_statistics: İstatistikler + label_commits_per_month: Aylık commit + label_commits_per_author: Oluşturan başına commit + label_view_diff: Farkları izle + label_diff_inline: satır içi + label_diff_side_by_side: Yan yana + label_options: Tercihler + label_copy_workflow_from: İşakışı kopyala + label_permissions_report: İzin raporu + label_watched_issues: İzlenmiş işler + label_related_issues: İlişkili işler + label_applied_status: uygulanmış işler + label_loading: Yükleniyor... + label_relation_new: Yeni ilişki + label_relation_delete: İlişkiyi sil + label_relates_to: ilişkili + label_duplicates: yinelenmiş + label_blocks: Engeller + label_blocked_by: Engelleyen + label_precedes: önce gelir + label_follows: sonra gelir + label_stay_logged_in: Sürekli bağlı kal + label_disabled: Devredışı + label_show_completed_versions: Tamamlanmış sürümleri göster + label_me: Ben + label_board: Tartışma Alanı + label_board_new: Yeni alan + label_board_plural: Tartışma alanları + label_topic_plural: Konular + label_message_plural: Mesajlar + label_message_last: Son mesaj + label_message_new: Yeni mesaj + label_message_posted: Mesaj eklendi + label_reply_plural: Cevaplar + label_send_information: Hesap bilgisini kullanıcıya gönder + label_year: Yıl + label_month: Ay + label_week: Hafta + label_date_from: Başlangıç + label_date_to: Bitiş + label_language_based: Kullanıcı dili bazlı + label_sort_by: "%{value} göre sırala" + label_send_test_email: Test e-postası gönder + label_feeds_access_key_created_on: "Atom erişim anahtarı %{value} önce oluşturuldu" + label_module_plural: Modüller + label_added_time_by: "%{author} tarafından %{age} önce eklendi" + label_updated_time: "%{value} önce güncellendi" + label_jump_to_a_project: Projeye git... + label_file_plural: Dosyalar + label_changeset_plural: Değişiklik Listeleri + label_default_columns: Varsayılan Sütunlar + label_no_change_option: (Değişiklik yok) + label_bulk_edit_selected_issues: Seçili işleri toplu olarak düzenle + label_theme: Tema + label_default: Varsayılan + label_search_titles_only: Sadece başlıkları ara + label_user_mail_option_all: "Tüm projelerimdeki herhangi bir olay için" + label_user_mail_option_selected: "Sadece seçili projelerdeki herhangi bir olay için" + label_user_mail_no_self_notified: "Kendi yaptığım değişikliklerden haberdar olmak istemiyorum" + label_registration_activation_by_email: e-posta ile hesap etkinleştirme + label_registration_manual_activation: Elle hesap etkinleştirme + label_registration_automatic_activation: Otomatik hesap etkinleştirme + label_display_per_page: "Sayfa başına: %{value}" + label_age: Yaş + label_change_properties: Özellikleri değiştir + label_general: Genel + label_scm: KY + label_plugins: Eklentiler + label_ldap_authentication: LDAP Denetimi + label_downloads_abbr: D/L + label_optional_description: İsteğe bağlı açıklama + label_add_another_file: Bir dosya daha ekle + label_preferences: Tercihler + label_chronological_order: Tarih sırasına göre + label_reverse_chronological_order: Ters tarih sırasına göre + + button_login: Giriş + button_submit: Gönder + button_save: Kaydet + button_check_all: Hepsini işaretle + button_uncheck_all: Tüm işaretleri kaldır + button_delete: Sil + button_create: Oluştur + button_test: Sına + button_edit: Düzenle + button_add: Ekle + button_change: Değiştir + button_apply: Uygula + button_clear: Temizle + button_lock: Kilitle + button_unlock: Kilidi aç + button_download: İndir + button_list: Listele + button_view: Bak + button_move: Taşı + button_back: Geri + button_cancel: İptal + button_activate: Etkinleştir + button_sort: Sırala + button_log_time: Zaman kaydı + button_rollback: Bu sürüme geri al + button_watch: İzle + button_unwatch: İzlemeyi iptal et + button_reply: Cevapla + button_archive: Arşivle + button_unarchive: Arşivlemeyi kaldır + button_reset: Sıfırla + button_rename: Yeniden adlandır + button_change_password: Parolayı değiştir + button_copy: Kopyala + button_annotate: Değişiklik geçmişine göre göster + button_update: Güncelle + button_configure: Yapılandır + + status_active: faal + status_registered: kayıtlı + status_locked: kilitli + + text_select_mail_notifications: Gönderilecek e-posta uyarısına göre hareketi seçin. + text_regexp_info: örn. ^[A-Z0-9]+$ + text_min_max_length_info: 0 sınırlama yok demektir + text_project_destroy_confirmation: Bu projeyi ve bağlantılı verileri silmek istediğinizden emin misiniz? + text_subprojects_destroy_warning: "Ayrıca %{value} alt proje silinecek." + text_workflow_edit: İşakışını düzenlemek için bir rol ve iş tipi seçin + text_are_you_sure: Emin misiniz ? + text_tip_issue_begin_day: Bugün başlayan görevler + text_tip_issue_end_day: Bugün sona eren görevler + text_tip_issue_begin_end_day: Bugün başlayan ve sona eren görevler + text_caracters_maximum: "En çok %{count} karakter." + text_caracters_minimum: "En az %{count} karakter uzunluğunda olmalı." + text_length_between: "%{min} ve %{max} karakterleri arasındaki uzunluk." + text_tracker_no_workflow: Bu iş tipi için işakışı tanımlanmamış + text_unallowed_characters: Yasaklı karakterler + text_comma_separated: Çoklu değer girilebilir(Virgül ile ayrılmış). + text_issues_ref_in_commit_messages: Teslim mesajlarındaki işleri çözme ve başvuruda bulunma + text_issue_added: "İş %{id}, %{author} tarafından rapor edildi." + text_issue_updated: "İş %{id}, %{author} tarafından güncellendi." + text_wiki_destroy_confirmation: bu wikiyi ve tüm içeriğini silmek istediğinizden emin misiniz? + text_issue_category_destroy_question: "Bazı işler (%{count}) bu kategoriye atandı. Ne yapmak istersiniz?" + text_issue_category_destroy_assignments: Kategori atamalarını kaldır + text_issue_category_reassign_to: İşleri bu kategoriye tekrar ata + text_user_mail_option: "Seçili olmayan projeler için, sadece dahil olduğunuz (oluşturan veya atanan) ya da izlediğiniz öğeler hakkında uyarılar alacaksınız." + text_no_configuration_data: "Roller, iş tipleri, iş durumları ve işakışı henüz yapılandırılmadı.\nVarsayılan yapılandırılmanın yüklenmesi şiddetle tavsiye edilir. Bir kez yüklendiğinde yapılandırmayı değiştirebileceksiniz." + text_load_default_configuration: Varsayılan yapılandırmayı yükle + text_status_changed_by_changeset: "Değişiklik listesi %{value} içinde uygulandı." + text_issues_destroy_confirmation: 'Seçili işleri silmek istediğinizden emin misiniz ?' + text_select_project_modules: 'Bu proje için etkinleştirmek istediğiniz modülleri seçin:' + text_default_administrator_account_changed: Varsayılan yönetici hesabı değişti + text_file_repository_writable: Dosya deposu yazılabilir + text_rmagick_available: RMagick Kullanılabilir (isteğe bağlı) + text_destroy_time_entries_question: Silmek üzere olduğunuz işler üzerine %{hours} saat raporlandı.Ne yapmak istersiniz ? + text_destroy_time_entries: Raporlanmış süreleri sil + text_assign_time_entries_to_project: Raporlanmış süreleri projeye ata + text_reassign_time_entries: 'Raporlanmış süreleri bu işe tekrar ata:' + + default_role_manager: Yönetici + default_role_developer: Geliştirici + default_role_reporter: Raporlayıcı + default_tracker_bug: Hata + default_tracker_feature: Özellik + default_tracker_support: Destek + default_issue_status_new: Yeni + default_issue_status_in_progress: Yapılıyor + default_issue_status_resolved: Çözüldü + default_issue_status_feedback: Geribildirim + default_issue_status_closed: "Kapatıldı" + default_issue_status_rejected: Reddedildi + default_doc_category_user: Kullanıcı Dökümantasyonu + default_doc_category_tech: Teknik Dökümantasyon + default_priority_low: Düşük + default_priority_normal: Normal + default_priority_high: Yüksek + default_priority_urgent: Acil + default_priority_immediate: Derhal + default_activity_design: Tasarım + default_activity_development: Geliştirme + + enumeration_issue_priorities: İş önceliği + enumeration_doc_categories: Belge Kategorileri + enumeration_activities: Faaliyetler (zaman takibi) + button_quote: Alıntı + setting_enabled_scm: KKY Açık + label_incoming_emails: "Gelen e-postalar" + label_generate_key: "Anahtar oluştur" + setting_sequential_project_identifiers: "Sıralı proje tanımlayıcıları oluştur" + field_parent_title: Üst sayfa + text_email_delivery_not_configured: "E-posta gönderme yapılandırılmadı ve bildirimler devre dışı.\nconfig/configuration.yml içinden SMTP sunucusunu yapılandırın ve uygulamayı yeniden başlatın." + text_enumeration_category_reassign_to: 'Hepsini şuna çevir:' + label_issue_watchers: Takipçiler + mail_body_reminder: "Size atanmış olan %{count} iş %{days} gün içerisinde bitirilmeli:" + label_duplicated_by: yineleyen + text_enumeration_destroy_question: "Bu nesneye %{count} değer bağlanmış." + text_user_wrote: "%{value} demiş ki:" + setting_mail_handler_api_enabled: Gelen e-postalar için WS'yi aç + label_and_its_subprojects: "%{value} ve alt projeleri" + mail_subject_reminder: "%{count} iş bir kaç güne bitecek" + setting_mail_handler_api_key: API anahtarı + setting_commit_logs_encoding: Gönderim mesajlarının kodlaması (UTF-8 vs.) + general_csv_decimal_separator: '.' + notice_unable_delete_version: Sürüm silinemiyor + label_renamed: yeniden adlandırılmış + label_copied: kopyalanmış + setting_plain_text_mail: sadece düz metin (HTML yok) + permission_view_files: Dosyaları gösterme + permission_edit_issues: İşleri düzenleme + permission_edit_own_time_entries: Kendi zaman girişlerini düzenleme + permission_manage_public_queries: Herkese açık sorguları yönetme + permission_add_issues: İş ekleme + permission_log_time: Harcanan zamanı kaydetme + permission_view_changesets: Değişimleri gösterme(SVN, vs.) + permission_view_time_entries: Harcanan zamanı gösterme + permission_manage_versions: Sürümleri yönetme + permission_manage_wiki: Wiki'yi yönetme + permission_manage_categories: İş kategorilerini yönetme + permission_protect_wiki_pages: Wiki sayfalarını korumaya alma + permission_comment_news: Haberlere yorum yapma + permission_delete_messages: Mesaj silme + permission_select_project_modules: Proje modüllerini seçme + permission_edit_wiki_pages: Wiki sayfalarını düzenleme + permission_add_issue_watchers: Takipçi ekleme + permission_view_gantt: İş-Zaman çizelgesi gösterme + permission_move_issues: İşlerin yerini değiştirme + permission_manage_issue_relations: İşlerin biribiriyle bağlantılarını yönetme + permission_delete_wiki_pages: Wiki sayfalarını silme + permission_manage_boards: Panoları yönetme + permission_delete_wiki_pages_attachments: Ekleri silme + permission_view_wiki_edits: Wiki geçmişini gösterme + permission_add_messages: Mesaj gönderme + permission_view_messages: Mesajları gösterme + permission_manage_files: Dosyaları yönetme + permission_edit_issue_notes: Notları düzenleme + permission_manage_news: Haberleri yönetme + permission_view_calendar: Takvimleri gösterme + permission_manage_members: Üyeleri yönetme + permission_edit_messages: Mesajları düzenleme + permission_delete_issues: İşleri silme + permission_view_issue_watchers: Takipçi listesini gösterme + permission_manage_repository: Depo yönetimi + permission_commit_access: Gönderme erişimi + permission_browse_repository: Depoya gözatma + permission_view_documents: Belgeleri gösterme + permission_edit_project: Projeyi düzenleme + permission_add_issue_notes: Not ekleme + permission_save_queries: Sorgu kaydetme + permission_view_wiki_pages: Wiki gösterme + permission_rename_wiki_pages: Wiki sayfasının adını değiştirme + permission_edit_time_entries: Zaman kayıtlarını düzenleme + permission_edit_own_issue_notes: Kendi notlarını düzenleme + setting_gravatar_enabled: Kullanıcı resimleri için Gravatar kullan + label_example: Örnek + text_repository_usernames_mapping: "Redmine kullanıcı adlarını depo değişiklik kayıtlarındaki kullanıcı adlarıyla eşleştirin veya eşleştirmeleri güncelleyin.\nRedmine kullanıcı adları ile depo kullanıcı adları aynı olan kullanıcılar otomatik olarak eşlendirilecektir." + permission_edit_own_messages: Kendi mesajlarını düzenleme + permission_delete_own_messages: Kendi mesajlarını silme + label_user_activity: "%{value} kullanıcısının faaliyetleri" + label_updated_time_by: "%{author} tarafından %{age} önce güncellendi" + text_diff_truncated: '... Bu fark tam olarak gösterilemiyor çünkü gösterim için ayarlanmış üst sınırı aşıyor.' + setting_diff_max_lines_displayed: Gösterilebilecek maksimumu fark satırı + text_plugin_assets_writable: Eklenti yardımcı dosya dizini yazılabilir + warning_attachments_not_saved: "%{count} adet dosya kaydedilemedi." + button_create_and_continue: Oluştur ve devam et + text_custom_field_possible_values_info: 'Her değer için bir satır' + label_display: Göster + field_editable: Düzenlenebilir + setting_repository_log_display_limit: Dosya kaydında gösterilecek maksimum değişim sayısı + setting_file_max_size_displayed: Dahili olarak gösterilecek metin dosyaları için maksimum satır sayısı + field_watcher: Takipçi + setting_openid: Kayıt ve giriş için OpenID'ye izin ver + field_identity_url: OpenID URL + label_login_with_open_id_option: veya OpenID kullanın + field_content: İçerik + label_descending: Azalan + label_sort: Sırala + label_ascending: Artan + label_date_from_to: "%{start} - %{end} arası" + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Bu sayfanın %{descendants} adet alt sayfası var. Ne yapmak istersiniz? + text_wiki_page_reassign_children: Alt sayfaları bu sayfanın altına bağla + text_wiki_page_nullify_children: Alt sayfaları ana sayfa olarak sakla + text_wiki_page_destroy_children: Alt sayfaları ve onların alt sayfalarını tamamen sil + setting_password_min_length: Minimum parola uzunluğu + field_group_by: Sonuçları grupla + mail_subject_wiki_content_updated: "'%{id}' wiki sayfası güncellendi" + label_wiki_content_added: Wiki sayfası eklendi + mail_subject_wiki_content_added: "'%{id}' wiki sayfası eklendi" + mail_body_wiki_content_added: "'%{id}' wiki sayfası, %{author} tarafından eklendi." + label_wiki_content_updated: Wiki sayfası güncellendi + mail_body_wiki_content_updated: "'%{id}' wiki sayfası, %{author} tarafından güncellendi." + permission_add_project: Proje oluştur + setting_new_project_user_role_id: Yönetici olmayan ancak proje yaratabilen kullanıcıya verilen rol + label_view_all_revisions: Tüm değişiklikleri göster + label_tag: Etiket + label_branch: Kol + error_no_tracker_in_project: Bu projeye bağlanmış bir iş tipi yok. Lütfen proje ayarlarını kontrol edin. + error_no_default_issue_status: Varsayılan iş durumu tanımlanmamış. Lütfen ayarlarınızı kontrol edin ("Yönetim -> İş durumları" sayfasına gidin). + label_group_plural: Gruplar + label_group: Grup + label_group_new: Yeni grup + label_time_entry_plural: Harcanan zaman + text_journal_changed: "%{label}: %{old} -> %{new}" + text_journal_set_to: "%{label} %{value} yapıldı" + text_journal_deleted: "%{label} silindi (%{old})" + text_journal_added: "%{label} %{value} eklendi" + field_active: Etkin + enumeration_system_activity: Sistem Faaliyetleri + permission_delete_issue_watchers: İzleyicileri sil + version_status_closed: kapalı + version_status_locked: kilitli + version_status_open: açık + error_can_not_reopen_issue_on_closed_version: Kapatılmış bir sürüme ait işler tekrar açılamaz + label_user_anonymous: Anonim + button_move_and_follow: Yerini değiştir ve takip et + setting_default_projects_modules: Yeni projeler için varsayılan modüller + setting_gravatar_default: Varsayılan Gravatar resmi + field_sharing: Paylaşım + label_version_sharing_hierarchy: Proje hiyerarşisi ile + label_version_sharing_system: Tüm projeler ile + label_version_sharing_descendants: Alt projeler ile + label_version_sharing_tree: Proje ağacı ile + label_version_sharing_none: Paylaşılmamış + error_can_not_archive_project: Bu proje arşivlenemez + button_duplicate: Yinele + button_copy_and_follow: Kopyala ve takip et + label_copy_source: Kaynak + setting_issue_done_ratio: İş tamamlanma oranını şununla hesapla + setting_issue_done_ratio_issue_status: İş durumunu kullan + error_issue_done_ratios_not_updated: İş tamamlanma oranları güncellenmedi. + error_workflow_copy_target: Lütfen hedef iş tipi ve rolleri seçin + setting_issue_done_ratio_issue_field: İşteki alanı kullan + label_copy_same_as_target: Hedef ile aynı + label_copy_target: Hedef + notice_issue_done_ratios_updated: İş tamamlanma oranları güncellendi. + error_workflow_copy_source: Lütfen kaynak iş tipi ve rolleri seçin + label_update_issue_done_ratios: İş tamamlanma oranlarını güncelle + setting_start_of_week: Takvimleri şundan başlat + permission_view_issues: İşleri Göster + label_display_used_statuses_only: Sadece bu iş tipi tarafından kullanılan durumları göster + label_revision_id: Değişiklik %{value} + label_api_access_key: API erişim anahtarı + label_api_access_key_created_on: API erişim anahtarı %{value} önce oluşturuldu + label_feeds_access_key: Atom erişim anahtarı + notice_api_access_key_reseted: API erişim anahtarınız sıfırlandı. + setting_rest_api_enabled: REST web servisini etkinleştir + label_missing_api_access_key: Bir API erişim anahtarı eksik + label_missing_feeds_access_key: Bir Atom erişim anahtarı eksik + button_show: Göster + text_line_separated: Çoklu değer girilebilir (her satıra bir değer). + setting_mail_handler_body_delimiters: Şu satırların birinden sonra e-postayı sonlandır + permission_add_subprojects: Alt proje yaratma + label_subproject_new: Yeni alt proje + text_own_membership_delete_confirmation: "Projeyi daha sonra düzenleyememenize sebep olacak bazı yetkilerinizi kaldırmak üzeresiniz.\nDevam etmek istediğinize emin misiniz?" + label_close_versions: Tamamlanmış sürümleri kapat + label_board_sticky: Yapışkan + label_board_locked: Kilitli + permission_export_wiki_pages: Wiki sayfalarını dışarı aktar + setting_cache_formatted_text: Biçimlendirilmiş metni önbelleğe al + permission_manage_project_activities: Proje faaliyetlerini yönetme + error_unable_delete_issue_status: İş durumu silinemiyor + label_profile: Profil + permission_manage_subtasks: Alt işleri yönetme + field_parent_issue: Üst iş + label_subtask_plural: Alt işler + label_project_copy_notifications: Proje kopyalaması esnasında bilgilendirme e-postaları gönder + error_can_not_delete_custom_field: Özel alan silinemiyor + error_unable_to_connect: Bağlanılamıyor (%{value}) + error_can_not_remove_role: Bu rol kullanımda olduğundan silinemez. + error_can_not_delete_tracker: Bu iş tipi içerisinde iş barındırdığından silinemiyor. + field_principal: Temel + notice_failed_to_save_members: "Üyeler kaydedilemiyor: %{errors}." + text_zoom_out: Uzaklaş + text_zoom_in: Yakınlaş + notice_unable_delete_time_entry: Zaman kayıt girdisi silinemiyor. + label_overall_spent_time: Toplam harcanan zaman + field_time_entries: Zaman Kayıtları + project_module_gantt: İş-Zaman Çizelgesi + project_module_calendar: Takvim + button_edit_associated_wikipage: "İlişkilendirilmiş Wiki sayfasını düzenle: %{page_title}" + field_text: Metin alanı + setting_default_notification_option: Varsayılan bildirim seçeneği + label_user_mail_option_only_my_events: Sadece takip ettiğim ya da içinde olduğum şeyler için + label_user_mail_option_none: Hiç bir şey için + field_member_of_group: Atananın grubu + field_assigned_to_role: Atananın rolü + notice_not_authorized_archived_project: Erişmeye çalıştığınız proje arşive kaldırılmış. + label_principal_search: "Kullanıcı ya da grup ara:" + label_user_search: "Kullanıcı ara:" + field_visible: Görünür + setting_emails_header: "E-Posta başlığı" + setting_commit_logtime_activity_id: Kaydedilen zaman için faaliyet + text_time_logged_by_changeset: Değişiklik uygulandı %{value}. + setting_commit_logtime_enabled: Zaman kaydını etkinleştir + notice_gantt_chart_truncated: Görüntülenebilir öğelerin sayısını aştığı için tablo kısaltıldı (%{max}) + setting_gantt_items_limit: İş-Zaman çizelgesinde gösterilecek en fazla öğe sayısı + field_warn_on_leaving_unsaved: Kaydedilmemiş metin bulunan bir sayfadan çıkarken beni uyar + text_warn_on_leaving_unsaved: Bu sayfada terkettiğiniz takdirde kaybolacak kaydedilmemiş metinler var. + label_my_queries: Özel sorgularım + text_journal_changed_no_detail: "%{label} güncellendi" + label_news_comment_added: Bir habere yorum eklendi + button_expand_all: Tümünü genişlet + button_collapse_all: Tümünü daralt + label_additional_workflow_transitions_for_assignee: Kullanıcı atanan olduğu zaman tanınacak ek yetkiler + label_additional_workflow_transitions_for_author: Kullanıcı oluşturan olduğu zaman tanınacak ek yetkiler + label_bulk_edit_selected_time_entries: Seçilen zaman kayıtlarını toplu olarak düzenle + text_time_entries_destroy_confirmation: Seçilen zaman kaydını/kayıtlarını silmek istediğinize emin misiniz? + label_role_anonymous: Anonim + label_role_non_member: Üye Değil + label_issue_note_added: Not eklendi + label_issue_status_updated: Durum güncellendi + label_issue_priority_updated: Öncelik güncellendi + label_issues_visibility_own: Kullanıcı tarafından oluşturulmuş ya da kullanıcıya atanmış sorunlar + field_issues_visibility: İşlerin görünürlüğü + label_issues_visibility_all: Tüm işler + permission_set_own_issues_private: Kendi işlerini özel ya da genel olarak işaretle + field_is_private: Özel + permission_set_issues_private: İşleri özel ya da genel olarak işaretleme + label_issues_visibility_public: Özel olmayan tüm işler + text_issues_destroy_descendants_confirmation: "%{count} alt görev de silinecek." + field_commit_logs_encoding: Değişiklik mesajı kodlaması(encoding) + field_scm_path_encoding: Yol kodlaması(encoding) + text_scm_path_encoding_note: "Varsayılan: UTF-8" + field_path_to_repository: Depo yolu + field_root_directory: Ana dizin + field_cvs_module: Modül + field_cvsroot: CVSROOT + text_mercurial_repository_note: Yerel depo (ör. /hgrepo, c:\hgrepo) + text_scm_command: Komut + text_scm_command_version: Sürüm + label_git_report_last_commit: Son gönderilen dosya ve dizinleri raporla + notice_issue_successful_create: İş %{id} oluşturuldu. + label_between: arasında + setting_issue_group_assignment: Gruplara iş atanmasına izin ver + label_diff: farklar + text_git_repository_note: Depo yalın halde (bare) ve yerel sistemde bulunuyor. (örn. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sıralama yönü + description_project_scope: Arama kapsamı + description_filter: Süzgeç + description_user_mail_notification: E-posta bildirim ayarları + description_message_content: Mesaj içeriği + description_available_columns: Kullanılabilir Sütunlar + description_issue_category_reassign: İş kategorisini seçin + description_search: Arama alanı + description_notes: Notlar + description_choose_project: Projeler + description_query_sort_criteria_attribute: Sıralama ölçütü + description_wiki_subpages_reassign: Yeni üst sayfa seç + description_selected_columns: Seçilmiş Sütunlar + label_parent_revision: Üst + label_child_revision: Alt + error_scm_annotate_big_text_file: Girdi maksimum metin dosyası boyutundan büyük olduğu için ek açıklama girilemiyor. + setting_default_issue_start_date_to_creation_date: Geçerli tarihi yeni işler için başlangıç tarihi olarak kullan + button_edit_section: Bölümü düzenle + setting_repositories_encodings: Eklerin ve depoların kodlamaları + description_all_columns: Tüm sütunlar + button_export: Dışarı aktar + label_export_options: "%{export_format} dışa aktarım seçenekleri" + error_attachment_too_big: İzin verilen maksimum dosya boyutunu (%{max_size}) aştığı için dosya yüklenemedi. + notice_failed_to_save_time_entries: "Seçilen %{total} adet zaman girdisinden %{count} tanesi kaydedilemedi: %{ids}." + label_x_issues: + zero: 0 İş + one: 1 İş + other: "%{count} İşler" + label_repository_new: Yeni depo + field_repository_is_default: Ana depo + label_copy_attachments: Ekleri kopyala + label_item_position: "%{position}/%{count}" + label_completed_versions: Tamamlanmış sürümler + text_project_identifier_info: Yalnızca küçük harfler (a-z), sayılar, tire ve alt tire kullanılabilir.
    Kaydedilen tanımlayıcı daha sonra değiştirilemez. + field_multiple: Çoklu değer + setting_commit_cross_project_ref: Diğer bütün projelerdeki iş kayıtlarının kaynak gösterilmesine ve kayıtların kapatılabilmesine izin ver + text_issue_conflict_resolution_add_notes: Notlarımı ekle ve diğer değişikliklerimi iptal et + text_issue_conflict_resolution_overwrite: Değişikliklerimi yine de uygula (önceki notlar saklanacak ancak bazı değişikliklerin üzerine yazılabilir) + notice_issue_update_conflict: Düzenleme yaparken başka bir kullanıcı tarafından sorun güncellendi. + text_issue_conflict_resolution_cancel: Tüm değişiklikleri iptal et ve yeniden görüntüle %{link} + permission_manage_related_issues: Benzer sorunları yönet + field_auth_source_ldap_filter: LDAP süzgeçi + label_search_for_watchers: Takipçi eklemek için ara + notice_account_deleted: Hesabınız kalıcı olarak silinmiştir. + setting_unsubscribe: Kullanıcıların kendi hesaplarını silebilmesine izin ver + button_delete_my_account: Hesabımı sil + text_account_destroy_confirmation: |- + Devam etmek istediğinize emin misiniz? + Hesabınız tekrar açılmamak üzere kalıcı olarak silinecektir. + error_session_expired: Oturum zaman aşımına uğradı. Lütfen tekrar giriş yapın. + text_session_expiration_settings: "Uyarı: Bu ayarları değiştirmek (sizinki de dahil) tüm oturumları sonlandırabilir." + setting_session_lifetime: Maksimum oturum süresi + setting_session_timeout: Maksimum hareketsizlik zaman aşımı + label_session_expiration: Oturum süre sonu + permission_close_project: Projeyi kapat/yeniden aç + label_show_closed_projects: Kapatılmış projeleri göster + button_close: Kapat + button_reopen: Yeniden aç + project_status_active: etkin + project_status_closed: kapalı + project_status_archived: arşivlenmiş + text_project_closed: Proje kapatıldı ve artık değiştirilemez. + notice_user_successful_create: Kullanıcı %{id} yaratıldı. + field_core_fields: Standart alanlar + field_timeout: Zaman aşımı (saniye olarak) + setting_thumbnails_enabled: Küçük resmi görüntüle + setting_thumbnails_size: Küçük resim boyutu (pixel olarak) + label_status_transitions: Durum değiştirme + label_fields_permissions: Alan izinleri + label_readonly: Salt okunur + label_required: Zorunlu + text_repository_identifier_info: Yalnızca küçük harfler (a-z), sayılar, tire ve alt tire kullanılabilir.
    Kaydedilen tanımlayıcı daha sonra değiştirilemez. + field_board_parent: Üst forum + label_attribute_of_project: Proje %{name} + label_attribute_of_author: Oluşturan %{name} + label_attribute_of_assigned_to: Atanan %{name} + label_attribute_of_fixed_version: Hedef sürüm %{name} + label_copy_subtasks: Alt görevi kopyala + label_copied_to: Kopyalama hedefi + label_copied_from: Kopyalanacak kaynak + label_any_issues_in_project: projedeki herhangi bir sorun + label_any_issues_not_in_project: projede olmayan herhangi bir sorun + field_private_notes: Özel notlar + permission_view_private_notes: Özel notları görüntüle + permission_set_notes_private: Notları özel olarak işaretle + label_no_issues_in_project: projede hiçbir sorun yok + label_any: Hepsi + label_last_n_weeks: son %{count} hafta + setting_cross_project_subtasks: Projeler arası alt işlere izin ver + label_cross_project_descendants: Alt projeler ile + label_cross_project_tree: Proje ağacı ile + label_cross_project_hierarchy: Proje hiyerarşisi ile + label_cross_project_system: Tüm projeler ile + button_hide: Gizle + setting_non_working_week_days: Tatil günleri + label_in_the_next_days: gelecekte + label_in_the_past_days: geçmişte + label_attribute_of_user: Kullanıcı %{name} + text_turning_multiple_off: Çoklu değer seçimini devre dışı bırakırsanız, çoklu değer içeren alanlar, her alan için yalnızca tek değer girilecek şekilde düzenlenecektir. + label_attribute_of_issue: Sorun %{name} + permission_add_documents: Belgeleri ekle + permission_edit_documents: Belgeleri düzenle + permission_delete_documents: Belgeleri sil + label_gantt_progress_line: İlerleme çizgisi + setting_jsonp_enabled: JSONP desteğini etkinleştir + field_inherit_members: Devralan kullanıcılar + field_closed_on: Kapanış tarihi + field_generate_password: Parola oluştur + setting_default_projects_tracker_ids: Yeni projeler için varsayılan iş tipi + label_total_time: Toplam + text_scm_config: config/configuration.yml içinden SCM komutlarını yapılandırabilirsiniz. Lütfen yapılandırmadan sonra uygulamayı tekrar başlatın. + text_scm_command_not_available: SCM komutu kullanılamıyor. Lütfen yönetim panelinden ayarları kontrol edin. + notice_account_not_activated_yet: Hesabınız henüz etkinleştirilmedi. Yeni bir hesap etkinleştirme e-postası istiyorsanız, lütfen buraya tıklayınız.. + notice_account_locked: Hesabınız kilitlendi. + label_hidden: Gizle + label_visibility_private: yalnız benim için + label_visibility_roles: yalnız bu roller için + label_visibility_public: herhangi bir kullanıcı için + field_must_change_passwd: Bir sonraki girişinizde şifrenizi değiştirmeniz gerekir. + notice_new_password_must_be_different: Yeni parola geçerli paroladan + farklı olmalı + setting_mail_handler_excluded_filenames: Dosya adı belirtilen ekleri hariç tut + text_convert_available: ImageMagick dönüştürmesi kullanılabilir (isteğe bağlı) + label_link: Bağlantı + label_only: sadece + label_drop_down_list: seçme listesi + label_checkboxes: kutucuk + label_link_values_to: Değerleri URLye bağla + setting_force_default_language_for_anonymous: Anonim kullanıcılar için zorunlu dil + seç + setting_force_default_language_for_loggedin: Giriş yapmış kullanıcılar için zorunlu dil + seç + label_custom_field_select_type: Özel alanın bağlı olacağı obje tipini + seçin + label_issue_assigned_to_updated: Atanan güncellendi + label_check_for_updates: Güncellemeleri kontrol et + label_latest_compatible_version: Son uyumlul sürüm + label_unknown_plugin: Bilinmeyen eklenti + label_radio_buttons: radyo butonları + label_group_anonymous: Anonim kullanıcı + label_group_non_member: Üye olmayan kullanıcılar + label_add_projects: Proje ekle + field_default_status: Öntanımlı durum + text_subversion_repository_note: 'Örnek: file:///, http://, https://, svn://, svn+[tünelmetodu]://' + field_users_visibility: Kullanıcı görünürlüğü + label_users_visibility_all: Tüm aktif kullanıcılar + label_users_visibility_members_of_visible_projects: Görünür projelerin kullanıcıları + label_edit_attachments: Ekli dosyaları düzenle + setting_link_copied_issue: Kopyalamada işleri ilişkilendir + label_link_copied_issue: Kopyalanmış iş ile ilişkilendir + label_ask: Sor + label_search_attachments_yes: Ekli dosyalarada ve açıklamalarında arama yap + label_search_attachments_no: Ekler içinde arama yapma + label_search_attachments_only: Sadece ekleri ara + label_search_open_issues_only: Sadece açık işler + field_address: E-Posta + setting_max_additional_emails: Maksimum ek e-posta adresleri + label_email_address_plural: E-postalar + label_email_address_add: E-posta adresi ekle + label_enable_notifications: Bildirimleri aç + label_disable_notifications: Bildirimleri kapat + setting_search_results_per_page: Sayfa başına arama sonucu sayısı + label_blank_value: boş + permission_copy_issues: İşleri kopyala + error_password_expired: Parolanızın süresi dolmuş veya yönetici parolanızı değiştirmenizi + talep etmiş. + field_time_entries_visibility: Zaman kaydı görünürlüğü + setting_password_max_age: Bu kadar zaman sonra şifre dğiştirmeye zorla + label_parent_task_attributes: Üst iş özellikleri + label_parent_task_attributes_derived: Alt işlerden hesalanır + label_parent_task_attributes_independent: Alt işlerden bağımsız + label_time_entries_visibility_all: Tüm zaman kayıtları + label_time_entries_visibility_own: Kullanıcı tarafında yaratılmış zaman kayıtları + label_member_management: Üye yönetimi + label_member_management_all_roles: Tüm roller + label_member_management_selected_roles_only: Sadece bu roller + label_password_required: Devam etmek için şifrenizi doğrulayın + label_total_spent_time: Toplam harcanan zaman + notice_import_finished: "%{count} kayıt içeri aktarıldı" + notice_import_finished_with_errors: "%{total} kayıttan %{count} tanesi aktarılamadı" + error_invalid_file_encoding: Dosyanın karakter kodlaması geçerli bir %{encoding} kodlaması değil. + error_invalid_csv_file_or_settings: Dosya CSV dosyası değil veya aşağıdaki ayarlara uymuyor + error_can_not_read_import_file: İçeri aktarılacak dosyayı okurken bir hata oluştu + permission_import_issues: İşleri içeri aktarma + label_import_issues: İşleri içeri aktar + label_select_file_to_import: İçeri aktarılacak dosyayı seçiniz + label_fields_separator: Alan ayracı + label_fields_wrapper: Alan kılıfı + label_encoding: Karakter kodlaması + label_comma_char: Virgül + label_semi_colon_char: Noktalı virgül + label_quote_char: Tek tırnak işareti + label_double_quote_char: Çift tırnak işareti + label_fields_mapping: Alan eşleştirme + label_file_content_preview: Dosya içeriği önizlemesi + label_create_missing_values: Eşleşlmeyen alanları oluştur + button_import: İçeri aktar + field_total_estimated_hours: Toplam tahmini zaman + label_api: API + label_total_plural: Toplamlar + label_assigned_issues: Atanan işler + label_field_format_enumeration: Anahtar/Değer listesi + label_f_hour_short: '%{value} s' + field_default_version: Ön tanımlı versiyon + error_attachment_extension_not_allowed: Dosya uzantısına izin verilmiyor; %{extension} + setting_attachment_extensions_allowed: İzin verilen dosya uzantıları + setting_attachment_extensions_denied: Yasaklı dosya uzantıları + label_any_open_issues: herhangi bir açık iş + label_no_open_issues: hiçbir açık iş + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: API anahtarı + setting_lost_password: Parolamı unuttum + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/uk.yml b/config/locales/uk.yml new file mode 100644 index 0000000..40e02bf --- /dev/null +++ b/config/locales/uk.yml @@ -0,0 +1,1226 @@ +uk: + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [неділя, понеділок, вівторок, середа, четвер, пятниця, субота] + abbr_day_names: [Нд, Пн, Вт, Ср, Чт, Пт, Сб] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, січня, лютого, березня, квітня, травня, червня, липня, серпня, вересня, жовтня, листопада, грудня] + abbr_month_names: [~, січ., лют., бер., квіт., трав., чер., лип., серп., вер., жовт., лист., груд.] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "ранку" + pm: "вечора" + + datetime: + distance_in_words: + half_a_minute: "менше хвилини" + less_than_x_seconds: + one: "менше ніж за 1 секунду" + few: "менш %{count} секунд" + many: "менш %{count} секунд" + other: "менше ніж за %{count} секунди" + x_seconds: + one: "1 секунда" + few: "%{count} секунди" + many: "%{count} секунд" + other: "%{count} секунд" + less_than_x_minutes: + one: "менше ніж за хвилину" + few: "менше %{count} хвилин" + many: "менше %{count} хвилин" + other: "менш ніж за %{count} хвилин" + x_minutes: + one: "1 хвилина" + few: "%{count} хвилини" + many: "%{count} хвилин" + other: "%{count} хвилини" + about_x_hours: + one: "близько 1 години" + other: "близько %{count} годин" + x_hours: + one: "1 година" + few: "%{count} години" + many: "%{count} годин" + other: "%{count} години" + x_days: + one: "1 день" + few: "%{count} дня" + many: "%{count} днів" + other: "%{count} днів" + about_x_months: + one: "близько 1 місяця" + other: "близько %{count} місяців" + x_months: + one: "1 місяць" + few: "%{count} місяця" + many: "%{count} місяців" + other: "%{count} місяців" + about_x_years: + one: "близько 1 року" + other: "близько %{count} років" + over_x_years: + one: "більше 1 року" + other: "більше %{count} років" + almost_x_years: + one: "майже 1 рік" + few: "майже %{count} року" + many: "майже %{count} років" + other: "майже %{count} років" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + precision: 3 + delimiter: "" + storage_units: + format: "%n %u" + units: + kb: КБ + tb: ТБ + gb: ГБ + byte: + one: Байт + other: Байтів + mb: МБ + +# Used in array.to_sentence. + support: + array: + sentence_connector: "і" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 помилка не дозволяє зберегти %{model}" + other: "%{count} помилок не дозволяють зберегти %{model}" + messages: + inclusion: "немає в списку" + exclusion: "зарезервовано" + invalid: "невірне" + confirmation: "не збігається з підтвердженням" + accepted: "необхідно прийняти" + empty: "не може бути порожнім" + blank: "не може бути незаповненим" + too_long: "дуже довге" + too_short: "дуже коротке" + wrong_length: "не відповідає довжині" + taken: "вже використовується" + not_a_number: "не є числом" + not_a_date: "є недійсною датою" + greater_than: "значення має бути більшим ніж %{count}" + greater_than_or_equal_to: "значення має бути більшим або дорівнювати %{count}" + equal_to: "значення має дорівнювати %{count}" + less_than: "значення має бути меншим ніж %{count}" + less_than_or_equal_to: "значення має бути меншим або дорівнювати %{count}" + odd: "може мати тільки непарне значення" + even: "може мати тільки парне значення" + greater_than_start_date: "повинна бути пізніша за дату початку" + not_same_project: "не відносяться до одного проекту" + circular_dependency: "Такий зв'язок приведе до циклічної залежності" + cant_link_an_issue_with_a_descendant: "Задача не може бути зв'язана зі своїми підзадачами" + earlier_than_minimum_start_date: "не може бути раніше ніж %{date} через попередні задачі" + not_a_regexp: "недопустимий регулярний вираз" + open_issue_with_closed_parent: "Відкрите завдання не може бути приєднано до закритого батьківського завдання" + + actionview_instancetag_blank_option: Оберіть + + general_text_No: 'Ні' + general_text_Yes: 'Так' + general_text_no: 'Ні' + general_text_yes: 'Так' + general_lang_name: 'Ukrainian (Українська)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: freesans + general_pdf_monospaced_fontname: freemono + general_first_day_of_week: '1' + + notice_account_updated: Обліковий запис успішно оновлений. + notice_account_invalid_credentials: Неправильне ім'я користувача або пароль + notice_account_password_updated: Пароль успішно оновлений. + notice_account_wrong_password: Невірний пароль + notice_account_register_done: Обліковий запис успішно створений. Для активації Вашого облікового запису зайдіть по посиланню, яке відіслане вам електронною поштою. + notice_account_unknown_email: Невідомий користувач. + notice_can_t_change_password: Для даного облікового запису використовується джерело зовнішньої аутентифікації. Неможливо змінити пароль. + notice_account_lost_email_sent: Вам відправлений лист з інструкціями по вибору нового пароля. + notice_account_activated: Ваш обліковий запис активований. Ви можете увійти. + notice_successful_create: Створення успішно завершене. + notice_successful_update: Оновлення успішно завершене. + notice_successful_delete: Видалення успішно завершене. + notice_successful_connection: Підключення успішно встановлене. + notice_file_not_found: Сторінка, на яку ви намагаєтеся зайти, не існує або видалена. + notice_locking_conflict: Дані оновлено іншим користувачем. + notice_scm_error: Запису та/або виправлення немає в репозиторії. + notice_not_authorized: У вас немає прав для відвідини даної сторінки. + notice_email_sent: "Відправлено листа %{value}" + notice_email_error: "Під час відправки листа відбулася помилка (%{value})" + notice_feeds_access_key_reseted: Ваш ключ доступу Atom було скинуто. + notice_failed_to_save_issues: "Не вдалося зберегти %{count} пункт(ів) з %{total} вибраних: %{ids}." + notice_no_issue_selected: "Не вибрано жодної задачі! Будь ласка, відзначте задачу, яку ви хочете відредагувати." + notice_account_pending: "Ваш обліковий запис створено і він чекає на підтвердження адміністратором." + + mail_subject_lost_password: "Ваш %{value} пароль" + mail_body_lost_password: 'Для зміни пароля, зайдіть за наступним посиланням:' + mail_subject_register: "Активація облікового запису %{value}" + mail_body_register: 'Для активації облікового запису, зайдіть за наступним посиланням:' + mail_body_account_information_external: "Ви можете використовувати ваш %{value} обліковий запис для входу." + mail_body_account_information: Інформація по Вашому обліковому запису + mail_subject_account_activation_request: "Запит на активацію облікового запису %{value}" + mail_body_account_activation_request: "Новий користувач (%{value}) зареєструвався. Його обліковий запис чекає на ваше підтвердження:" + + + field_name: Ім'я + field_description: Опис + field_summary: Короткий опис + field_is_required: Необхідно + field_firstname: Ім'я + field_lastname: Прізвище + field_mail: Ел. пошта + field_filename: Файл + field_filesize: Розмір + field_downloads: Завантаження + field_author: Автор + field_created_on: Створено + field_updated_on: Оновлено + field_field_format: Формат + field_is_for_all: Для усіх проектів + field_possible_values: Можливі значення + field_regexp: Регулярний вираз + field_min_length: Мінімальна довжина + field_max_length: Максимальна довжина + field_value: Значення + field_category: Категорія + field_title: Назва + field_project: Проект + field_issue: Питання + field_status: Статус + field_notes: Примітки + field_is_closed: Питання закрито + field_is_default: Типове значення + field_tracker: Координатор + field_subject: Тема + field_due_date: Дата виконання + field_assigned_to: Призначена до + field_priority: Пріоритет + field_fixed_version: Версія + field_user: Користувач + field_role: Роль + field_homepage: Домашня сторінка + field_is_public: Публічний + field_parent: Підпроект + field_is_in_roadmap: Питання, що відображаються в оперативному плані + field_login: Вхід + field_mail_notification: Повідомлення за електронною поштою + field_admin: Адміністратор + field_last_login_on: Останнє підключення + field_language: Мова + field_effective_date: Дата + field_password: Пароль + field_new_password: Новий пароль + field_password_confirmation: Підтвердження + field_version: Версія + field_type: Тип + field_host: Машина + field_port: Порт + field_account: Обліковий запис + field_base_dn: Базове відмітне ім'я + field_attr_login: Атрибут Реєстрація + field_attr_firstname: Атрибут Ім'я + field_attr_lastname: Атрибут Прізвище + field_attr_mail: Атрибут Email + field_onthefly: Створення користувача на льоту + field_start_date: Початок + field_done_ratio: "% зроблено" + field_auth_source: Режим аутентифікації + field_hide_mail: Приховувати мій email + field_comments: Коментар + field_url: URL + field_start_page: Стартова сторінка + field_subproject: Підпроект + field_hours: Годин(и/а) + field_activity: Діяльність + field_spent_on: Дата + field_identifier: Ідентифікатор + field_is_filter: Використовується як фільтр + field_issue_to: Зв'язані задачі + field_delay: Відкласти + field_assignable: Задача може бути призначена цій ролі + field_redirect_existing_links: Перенаправити існуючі посилання + field_estimated_hours: Оцінний час + field_column_names: Колонки + field_time_zone: Часовий пояс + field_searchable: Вживається у пошуку + + setting_app_title: Назва додатку + setting_app_subtitle: Підзаголовок додатку + setting_welcome_text: Текст привітання + setting_default_language: Стандартна мова + setting_login_required: Необхідна аутентифікація + setting_self_registration: Можлива само-реєстрація + setting_attachment_max_size: Максимальний размір вкладення + setting_issues_export_limit: Обмеження по задачах, що експортуються + setting_mail_from: email адреса для передачі інформації + setting_bcc_recipients: Отримувачі сліпої копії (bcc) + setting_host_name: Им'я машини + setting_text_formatting: Форматування тексту + setting_wiki_compression: Стиснення історії Wiki + setting_feeds_limit: Обмеження змісту подачі + setting_autofetch_changesets: Автоматично доставати доповнення + setting_sys_api_enabled: Дозволити WS для управління репозиторієм + setting_commit_ref_keywords: Ключові слова для посилання + setting_commit_fix_keywords: Призначення ключових слів + setting_autologin: Автоматичний вхід + setting_date_format: Формат дати + setting_time_format: Формат часу + setting_cross_project_issue_relations: Дозволити міжпроектні відносини між питаннями + setting_issue_list_default_columns: Колонки, що відображаються за умовчанням в списку питань + setting_emails_footer: Підпис до електронної пошти + setting_protocol: Протокол + + label_user: Користувач + label_user_plural: Користувачі + label_user_new: Новий користувач + label_project: Проект + label_project_new: Новий проект + label_project_plural: Проекти + label_x_projects: + zero: немає проектів + one: 1 проект + other: "%{count} проектів" + label_project_all: Усі проекти + label_project_latest: Останні проекти + label_issue: Питання + label_issue_new: Нові питання + label_issue_plural: Питання + label_issue_view_all: Проглянути всі питання + label_issues_by: "Питання за %{value}" + label_document: Документ + label_document_new: Новий документ + label_document_plural: Документи + label_role: Роль + label_role_plural: Ролі + label_role_new: Нова роль + label_role_and_permissions: Ролі і права доступу + label_member: Учасник + label_member_new: Новий учасник + label_member_plural: Учасники + label_tracker: Координатор + label_tracker_plural: Координатори + label_tracker_new: Новий Координатор + label_workflow: Послідовність дій + label_issue_status: Статус питання + label_issue_status_plural: Статуси питань + label_issue_status_new: Новий статус + label_issue_category: Категорія питання + label_issue_category_plural: Категорії питань + label_issue_category_new: Нова категорія + label_custom_field: Поле клієнта + label_custom_field_plural: Поля клієнта + label_custom_field_new: Нове поле клієнта + label_enumerations: Довідники + label_enumeration_new: Нове значення + label_information: Інформація + label_information_plural: Інформація + label_please_login: Будь ласка, увійдіть + label_register: Зареєструватися + label_password_lost: Забули пароль + label_home: Домашня сторінка + label_my_page: Моя сторінка + label_my_account: Мій обліковий запис + label_my_projects: Мої проекти + label_administration: Адміністрування + label_login: Увійти + label_logout: Вийти + label_help: Допомога + label_reported_issues: Створені питання + label_assigned_to_me_issues: Мої питання + label_last_login: Останнє підключення + label_registered_on: Зареєстрований(а) + label_activity: Активність + label_new: Новий + label_logged_as: Увійшов як + label_environment: Оточення + label_authentication: Аутентифікація + label_auth_source: Режим аутентифікації + label_auth_source_new: Новий режим аутентифікації + label_auth_source_plural: Режими аутентифікації + label_subproject_plural: Підпроекти + label_min_max_length: Мінімальна - максимальна довжина + label_list: Список + label_date: Дата + label_integer: Цілий + label_float: З плаваючою крапкою + label_boolean: Логічний + label_string: Текст + label_text: Довгий текст + label_attribute: Атрибут + label_attribute_plural: атрибути + label_no_data: Немає даних для відображення + label_change_status: Змінити статус + label_history: Історія + label_attachment: Файл + label_attachment_new: Новий файл + label_attachment_delete: Видалити файл + label_attachment_plural: Файли + label_report: Звіт + label_report_plural: Звіти + label_news: Новини + label_news_new: Додати новину + label_news_plural: Новини + label_news_latest: Останні новини + label_news_view_all: Подивитися всі новини + label_settings: Налаштування + label_overview: Перегляд + label_version: Версія + label_version_new: Нова версія + label_version_plural: Версії + label_confirmation: Підтвердження + label_export_to: Експортувати в + label_read: Читання... + label_public_projects: Публічні проекти + label_open_issues: відкрите + label_open_issues_plural: відкриті + label_closed_issues: закрите + label_closed_issues_plural: закриті + label_x_open_issues_abbr: + zero: 0 відкрито + one: 1 відкрита + other: "%{count} відкрито" + label_x_closed_issues_abbr: + zero: 0 закрито + one: 1 закрита + other: "%{count} закрито" + label_total: Всього + label_permissions: Права доступу + label_current_status: Поточний статус + label_new_statuses_allowed: Дозволені нові статуси + label_all: Усі + label_none: Нікому + label_nobody: Ніхто + label_next: Наступний + label_previous: Попередній + label_used_by: Використовується + label_details: Подробиці + label_add_note: Додати зауваження + label_calendar: Календар + label_months_from: місяців(ця) з + label_gantt: Діаграма Ганта + label_internal: Внутрішній + label_last_changes: "останні %{count} змін" + label_change_view_all: Проглянути всі зміни + label_comment: Коментувати + label_comment_plural: Коментарі + label_x_comments: + zero: немає коментарів + one: 1 коментар + other: "%{count} коментарів" + label_comment_add: Залишити коментар + label_comment_added: Коментар додано + label_comment_delete: Видалити коментарі + label_query: Запит клієнта + label_query_plural: Запити клієнтів + label_query_new: Новий запит + label_filter_add: Додати фільтр + label_filter_plural: Фільтри + label_equals: є + label_not_equals: немає + label_in_less_than: менш ніж + label_in_more_than: більш ніж + label_in: у + label_today: сьогодні + label_this_week: цього тижня + label_less_than_ago: менш ніж днів(я) назад + label_more_than_ago: більш ніж днів(я) назад + label_ago: днів(я) назад + label_contains: містить + label_not_contains: не містить + label_day_plural: днів(я) + label_repository: Репозиторій + label_browse: Проглянути + label_revision: Версія + label_revision_plural: Версій + label_added: додано + label_modified: змінене + label_deleted: видалено + label_latest_revision: Остання версія + label_latest_revision_plural: Останні версії + label_view_revisions: Проглянути версії + label_max_size: Максимальний розмір + label_sort_highest: У початок + label_sort_higher: Вгору + label_sort_lower: Вниз + label_sort_lowest: У кінець + label_roadmap: Оперативний план + label_roadmap_due_in: "Строк %{value}" + label_roadmap_overdue: "%{value} запізнення" + label_roadmap_no_issues: Немає питань для даної версії + label_search: Пошук + label_result_plural: Результати + label_all_words: Всі слова + label_wiki: Wiki + label_wiki_edit: Редагування Wiki + label_wiki_edit_plural: Редагування Wiki + label_wiki_page: Сторінка Wiki + label_wiki_page_plural: Сторінки Wiki + label_index_by_title: Індекс за назвою + label_index_by_date: Індекс за датою + label_current_version: Поточна версія + label_preview: Попередній перегляд + label_feed_plural: Подання + label_changes_details: Подробиці по всіх змінах + label_issue_tracking: Координація питань + label_spent_time: Витрачений час + label_f_hour: "%{value} година" + label_f_hour_plural: "%{value} годин(и)" + label_time_tracking: Облік часу + label_change_plural: Зміни + label_statistics: Статистика + label_commits_per_month: Подань на місяць + label_commits_per_author: Подань на користувача + label_view_diff: Проглянути відмінності + label_diff_inline: підключений + label_diff_side_by_side: поряд + label_options: Опції + label_copy_workflow_from: Скопіювати послідовність дій з + label_permissions_report: Звіт про права доступу + label_watched_issues: Проглянуті питання + label_related_issues: Зв'язані питання + label_applied_status: Застосовний статус + label_loading: Завантаження... + label_relation_new: Новий зв'язок + label_relation_delete: Видалити зв'язок + label_relates_to: пов'язане з + label_duplicates: дублює + label_blocks: блокує + label_blocked_by: заблоковане + label_precedes: передує + label_follows: наступний за + label_stay_logged_in: Залишатися в системі + label_disabled: відключений + label_show_completed_versions: Показати завершені версії + label_me: мене + label_board: Форум + label_board_new: Новий форум + label_board_plural: Форуми + label_topic_plural: Теми + label_message_plural: Повідомлення + label_message_last: Останнє повідомлення + label_message_new: Нове повідомлення + label_reply_plural: Відповіді + label_send_information: Відправити користувачеві інформацію з облікового запису + label_year: Рік + label_month: Місяць + label_week: Неділя + label_date_from: З + label_date_to: Кому + label_language_based: На основі мови користувача + label_sort_by: "Сортувати за %{value}" + label_send_test_email: Послати email для перевірки + label_feeds_access_key_created_on: "Ключ доступу Atom створений %{value} назад " + label_module_plural: Модулі + label_added_time_by: "Доданий %{author} %{age} назад" + label_updated_time: "Оновлений %{value} назад" + label_jump_to_a_project: Перейти до проекту... + label_file_plural: Файли + label_changeset_plural: Набори змін + label_default_columns: Типові колонки + label_no_change_option: (Немає змін) + label_bulk_edit_selected_issues: Редагувати всі вибрані питання + label_theme: Тема + label_default: Типовий + label_search_titles_only: Шукати тільки в назвах + label_user_mail_option_all: "Для всіх подій у всіх моїх проектах" + label_user_mail_option_selected: "Для всіх подій тільки у вибраному проекті..." + label_user_mail_no_self_notified: "Не сповіщати про зміни, які я зробив сам" + label_registration_activation_by_email: активація облікового запису електронною поштою + label_registration_manual_activation: ручна активація облікового запису + label_registration_automatic_activation: автоматична активація облыкового + label_my_time_report: Мій звіт витраченого часу + + button_login: Вхід + button_submit: Відправити + button_save: Зберегти + button_check_all: Відзначити все + button_uncheck_all: Очистити + button_delete: Видалити + button_create: Створити + button_test: Перевірити + button_edit: Редагувати + button_add: Додати + button_change: Змінити + button_apply: Застосувати + button_clear: Очистити + button_lock: Заблокувати + button_unlock: Разблокувати + button_download: Завантажити + button_list: Список + button_view: Переглянути + button_move: Перемістити + button_back: Назад + button_cancel: Відмінити + button_activate: Активувати + button_sort: Сортувати + button_log_time: Записати час + button_rollback: Відкотити до даної версії + button_watch: Дивитися + button_unwatch: Не дивитися + button_reply: Відповісти + button_archive: Архівувати + button_unarchive: Розархівувати + button_reset: Перезапустити + button_rename: Перейменувати + button_change_password: Змінити пароль + button_copy: Копіювати + button_annotate: Анотувати + + status_active: Активний + status_registered: Зареєстрований + status_locked: Заблокований + + text_select_mail_notifications: Виберіть дії, на які відсилатиметься повідомлення на електронну пошту. + text_regexp_info: наприклад ^[A-Z0-9]+$ + text_min_max_length_info: 0 означає відсутність заборон + text_project_destroy_confirmation: Ви наполягаєте на видаленні цього проекту і всієї інформації, що відноситься до нього? + text_workflow_edit: Виберіть роль і координатор для редагування послідовності дій + text_are_you_sure: Ви впевнені? + text_tip_issue_begin_day: день початку задачі + text_tip_issue_end_day: день завершення задачі + text_tip_issue_begin_end_day: початок задачі і закінчення цього дня + text_caracters_maximum: "%{count} символів(а) максимум." + text_caracters_minimum: "Повинно мати якнайменше %{count} символів(а) у довжину." + text_length_between: "Довжина між %{min} і %{max} символів." + text_tracker_no_workflow: Для цього координатора послідовність дій не визначена + text_unallowed_characters: Заборонені символи + text_comma_separated: Допустимі декілька значень (розділені комою). + text_issues_ref_in_commit_messages: Посилання та зміна питань у повідомленнях до подавань + text_issue_added: "Задача %{id} була додана %{author}." + text_issue_updated: "Задача %{id} була оновлена %{author}." + text_wiki_destroy_confirmation: Ви впевнені, що хочете видалити цю wiki і весь зміст? + text_issue_category_destroy_question: "Декілька питань (%{count}) призначено в цю категорію. Що ви хочете зробити?" + text_issue_category_destroy_assignments: Видалити призначення категорії + text_issue_category_reassign_to: Перепризначити задачі до даної категорії + text_user_mail_option: "Для невибраних проектів ви отримуватимете повідомлення тільки про те, що проглядаєте або в чому берете участь (наприклад, питання автором яких ви є або які вам призначені)." + + default_role_manager: Менеджер + default_role_developer: Розробник + default_role_reporter: Репортер + # default_tracker_bug: Bug + # звітів default_tracker_bug: Помилка + default_tracker_bug: Помилка + default_tracker_feature: Властивість + default_tracker_support: Підтримка + default_issue_status_new: Новий + default_issue_status_in_progress: В процесі + default_issue_status_resolved: Вирішено + default_issue_status_feedback: Зворотний зв'язок + default_issue_status_closed: Зачинено + default_issue_status_rejected: Відмовлено + default_doc_category_user: Документація користувача + default_doc_category_tech: Технічна документація + default_priority_low: Низький + default_priority_normal: Нормальний + default_priority_high: Високий + default_priority_urgent: Терміновий + default_priority_immediate: Негайний + default_activity_design: Проектування + default_activity_development: Розробка + + enumeration_issue_priorities: Пріоритети питань + enumeration_doc_categories: Категорії документів + enumeration_activities: Дії (облік часу) + text_status_changed_by_changeset: "Реалізовано в редакції %{value}." + label_display_per_page: "На сторінку: %{value}" + label_issue_added: Задача додана + label_issue_updated: Задача оновлена + setting_per_page_options: Кількість записів на сторінку + notice_default_data_loaded: Конфігурація по замовчуванню була завантажена. + error_scm_not_found: "Сховище не містить записів і/чи виправлень." + label_associated_revisions: Пов'язані редакції + label_document_added: Документ додано + label_message_posted: Повідомлення додано + text_issues_destroy_confirmation: 'Ви впевнені, що хочете видалити вибрані задачі?' + error_scm_command_failed: "Помилка доступу до сховища: %{value}" + setting_user_format: Формат відображення часу + label_age: Вік + label_file_added: Файл додано + field_default_value: Значення по замовчуванню + label_scm: Тип сховища + label_general: Загальне + button_update: Оновити + text_select_project_modules: 'Виберіть модулі, які будуть використані в проекті:' + label_change_properties: Змінити властивості + text_load_default_configuration: Завантажити Конфігурацію по замовчуванню + text_no_configuration_data: "Ролі, трекери, статуси задач і оперативний план не були сконфігуровані.\nНаполегливо рекомендується завантажити конфігурацію по-замовчуванню. Ви зможете її змінити згодом." + label_news_added: Додана новина + label_repository_plural: Сховища + error_can_t_load_default_data: "Конфігурація по замовчуванню не може бути завантажена: %{value}" + project_module_boards: Форуми + project_module_issue_tracking: Задачі + project_module_wiki: Wiki + project_module_files: Файли + project_module_documents: Документи + project_module_repository: Сховище + project_module_news: Новини + project_module_time_tracking: Відстеження часу + text_file_repository_writable: Сховище файлів доступне для записів + text_default_administrator_account_changed: Обліковий запис адміністратора по замовчуванню змінений + text_rmagick_available: Доступно використання RMagick (опційно) + button_configure: Налаштування + label_plugins: Модулі + label_ldap_authentication: Авторизація за допомогою LDAP + label_downloads_abbr: Завантажень + label_this_month: цей місяць + label_last_n_days: "останні %{count} днів" + label_all_time: весь час + label_this_year: цей рік + label_date_range: інтервал часу + label_last_week: попередній тиждень + label_yesterday: вчора + label_last_month: попередній місяць + label_add_another_file: Додати ще один файл + label_optional_description: Опис (не обов'язково) + text_destroy_time_entries_question: "На дану задачу зареєстровано %{hours} години(ин) трудовитрат. Що Ви хочете зробити?" + error_issue_not_found_in_project: 'Задача не була знайдена або не стосується даного проекту' + text_assign_time_entries_to_project: Додати зареєстрований час до проекту + text_destroy_time_entries: Видалити зареєстрований час + text_reassign_time_entries: 'Перенести зареєстрований час на наступну задачу:' + setting_activity_days_default: Кількість днів, відображених в Діях + label_chronological_order: В хронологічному порядку + field_comments_sorting: Відображення коментарів + label_reverse_chronological_order: В зворотньому порядку + label_preferences: Переваги + setting_display_subprojects_issues: Відображення підпроектів по замовчуванню + label_overall_activity: Зведений звіт дій + setting_default_projects_public: Нові проекти є загальнодоступними + error_scm_annotate: "Коментар неможливий через перевищення максимального розміру текстового файлу." + text_subprojects_destroy_warning: "Підпроекти: %{value} також будуть видалені." + label_and_its_subprojects: "%{value} і всі підпроекти" + mail_body_reminder: "%{count} призначених на Вас задач на наступні %{days} днів:" + mail_subject_reminder: "%{count} призначених на Вас задач в найближчі %{days} дні" + text_user_wrote: "%{value} писав(ла):" + label_duplicated_by: дублюється + setting_enabled_scm: Увімкнені SCM + text_enumeration_category_reassign_to: 'Надати їм наступне значення:' + text_enumeration_destroy_question: "%{count} об'єкт(а,ів) зв'язані з цим значенням." + label_incoming_emails: Прийом повідомлень + label_generate_key: Згенерувати ключ + setting_mail_handler_api_enabled: Увімкнути веб-сервіс для вхідних повідомлень + setting_mail_handler_api_key: API ключ + text_email_delivery_not_configured: "Параметри роботи з поштовим сервером не налаштовані і функція сповіщення по email не активна.\nНалаштувати параметри для Вашого SMTP-сервера Ви можете в файлі config/configuration.yml. Для застосування змін перезапустіть програму." + field_parent_title: Домашня сторінка + label_issue_watchers: Спостерігачі + button_quote: Цитувати + setting_sequential_project_identifiers: Генерувати послідовні ідентифікатори проектів + notice_unable_delete_version: Неможливо видалити версію. + label_renamed: перейменовано + label_copied: скопійовано в + setting_plain_text_mail: Тільки простий текст (без HTML) + permission_view_files: Перегляд файлів + permission_edit_issues: Редагування задач + permission_edit_own_time_entries: Редагування власного обліку часу + permission_manage_public_queries: Управління загальними запитами + permission_add_issues: Додавання задач + permission_log_time: Облік трудовитрат + permission_view_changesets: Перегляд змін сховища + permission_view_time_entries: Перегляд трудовитрат + permission_manage_versions: Управління версіями + permission_manage_wiki: Управління wiki + permission_manage_categories: Управління категоріями задач + permission_protect_wiki_pages: Блокування wiki-сторінок + permission_comment_news: Коментування новин + permission_delete_messages: Видалення повідомлень + permission_select_project_modules: Вибір модулів проекту + permission_edit_wiki_pages: Редагування wiki-сторінок + permission_add_issue_watchers: Додати спостерігачів + permission_view_gantt: Перегляд діаграми Ганта + permission_move_issues: Перенесення задач + permission_manage_issue_relations: Управління зв'язуванням задач + permission_delete_wiki_pages: Видалення wiki-сторінок + permission_manage_boards: Управління форумами + permission_delete_wiki_pages_attachments: Видалення прикріплених файлів + permission_view_wiki_edits: Перегляд історії wiki + permission_add_messages: Відправка повідомлень + permission_view_messages: Перегляд повідомлень + permission_manage_files: Управління файлами + permission_edit_issue_notes: Редагування нотаток + permission_manage_news: Управління новинами + permission_view_calendar: Перегляд календаря + permission_manage_members: Управління учасниками + permission_edit_messages: Редагування повідомлень + permission_delete_issues: Видалення задач + permission_view_issue_watchers: Перегляд списку спостерігачів + permission_manage_repository: Управління сховищем + permission_commit_access: Зміна файлів в сховищі + permission_browse_repository: Перегляд сховища + permission_view_documents: Перегляд документів + permission_edit_project: Редагування проектів + permission_add_issue_notes: Додавання нотаток + permission_save_queries: Збереження запитів + permission_view_wiki_pages: Перегляд wiki + permission_rename_wiki_pages: Перейменування wiki-сторінок + permission_edit_time_entries: Редагування обліку часу + permission_edit_own_issue_notes: Редагування власних нотаток + setting_gravatar_enabled: Використовувати аватар користувача із Gravatar + label_example: Зразок + text_repository_usernames_mapping: "Виберіть або оновіть користувача Redmine, пов'язаного зі знайденими іменами в журналі сховища.\nКористувачі з одинаковими іменами або email в Redmine і сховищі пов'язуються автоматично." + permission_edit_own_messages: Редагування власних повідомлень + permission_delete_own_messages: Видалення власних повідомлень + label_user_activity: "Дії користувача %{value}" + label_updated_time_by: "Оновлено %{author} %{age} назад" + text_diff_truncated: '... Цей diff обмежений, так як перевищує максимальний розмір, що може бути відображений.' + setting_diff_max_lines_displayed: Максимальна кількість рядків для diff + text_plugin_assets_writable: Каталог ресурсів модулів доступний для запису + warning_attachments_not_saved: "%{count} файл(ів) неможливо зберегти." + button_create_and_continue: Створити та продовжити + text_custom_field_possible_values_info: 'По одному значенню в кожному рядку' + label_display: Відображення + field_editable: Доступно до редагування + setting_repository_log_display_limit: Максимальна кількість редакцій, відображених в журналі змін + setting_file_max_size_displayed: Максимальний розмір текстового файлу для відображення + field_watcher: Спостерігач + setting_openid: Дозволити OpenID для входу та реєстрації + field_identity_url: OpenID URL + label_login_with_open_id_option: або війти з допомогою OpenID + field_content: Вміст + label_descending: За спаданням + label_sort: Сортувати + label_ascending: За зростанням + label_date_from_to: З %{start} по %{end} + label_greater_or_equal: ">=" + label_less_or_equal: <= + text_wiki_page_destroy_question: Ця сторінка має %{descendants} дочірних сторінок і їх нащадків. Що Ви хочете зробити? + text_wiki_page_reassign_children: Переоприділити дочірні сторінки та поточту сторінку + text_wiki_page_nullify_children: Зробити дочірні сторінки головними сторінками + text_wiki_page_destroy_children: Видалити дочірні сторінки і всіх їх нащадків + setting_password_min_length: Мінімальна довжина паролю + field_group_by: Групувати результати по + mail_subject_wiki_content_updated: "Wiki-сторінка '%{id}' була оновлена" + label_wiki_content_added: Wiki-сторінка додана + mail_subject_wiki_content_added: "Wiki-сторінка '%{id}' була додана" + mail_body_wiki_content_added: "%{author} додав(ла) wiki-сторінку %{id}." + label_wiki_content_updated: Wiki-сторінка оновлена + mail_body_wiki_content_updated: "%{author} оновив(ла) wiki-сторінку %{id}." + permission_add_project: Створення проекту + setting_new_project_user_role_id: Роль, що призначається користувачу, створившому проект + label_view_all_revisions: Показати всі ревізії + label_tag: Мітка + label_branch: Гілка + error_no_tracker_in_project: З цим проектом не асоційований ні один трекер. Будь ласка, перевірте налаштування проекту. + error_no_default_issue_status: Не визначений статус задач за замовчуванням. Будь ласка, перевірте налаштування (див. "Адміністрування -> Статуси задач"). + text_journal_changed: "Параметр %{label} змінився з %{old} на %{new}" + text_journal_set_to: "Параметр %{label} змінився на %{value}" + text_journal_deleted: "Значення %{old} параметру %{label} видалено" + label_group_plural: Групи + label_group: Група + label_group_new: Нова група + label_time_entry_plural: Трудовитрати + text_journal_added: "%{label} %{value} доданий" + field_active: Активно + enumeration_system_activity: Системне + permission_delete_issue_watchers: Видалення спостерігачів + version_status_closed: закритий + version_status_locked: заблокований + version_status_open: відкритий + error_can_not_reopen_issue_on_closed_version: Задача, призначена до закритої версії, не зможе бути відкрита знову + label_user_anonymous: Анонім + button_move_and_follow: Перемістити і перейти + setting_default_projects_modules: Включені по замовчуванню модулі для нових проектів + setting_gravatar_default: Зображення Gravatar за замовчуванням + field_sharing: Сумісне використання + label_version_sharing_hierarchy: З ієрархією пректів + label_version_sharing_system: З усіма проектами + label_version_sharing_descendants: З підпроектами + label_version_sharing_tree: З деревом проектів + label_version_sharing_none: Без сумісного доступу + error_can_not_archive_project: Цей проект не може бути заархівований + button_duplicate: Дублювати + button_copy_and_follow: Скопіювати та продовжити + label_copy_source: Джерело + setting_issue_done_ratio: Розраховувати готовність задачі з допомогою поля + setting_issue_done_ratio_issue_status: Статус задачі + error_issue_done_ratios_not_updated: Параметр готовність задач не оновлений. + error_workflow_copy_target: Оберіть цільові трекери і ролі + setting_issue_done_ratio_issue_field: Готовність задачі + label_copy_same_as_target: Те саме, що і у цілі + label_copy_target: Ціль + notice_issue_done_ratios_updated: Параметр «готовність» оновлений. + error_workflow_copy_source: Будь ласка, виберіть початковий трекер або роль + label_update_issue_done_ratios: Оновити готовність задач + setting_start_of_week: День початку тижня + permission_view_issues: Перегляд задач + label_display_used_statuses_only: Відображати тільки ті статуси, які використовуються в цьому трекері + label_revision_id: Ревізія %{value} + label_api_access_key: Ключ доступу до API + label_api_access_key_created_on: Ключ доступу до API створено %{value} назад + label_feeds_access_key: Ключ доступу до Atom + notice_api_access_key_reseted: Ваш ключ доступу до API був скинутий. + setting_rest_api_enabled: Включити веб-сервіс REST + label_missing_api_access_key: Відсутній ключ доступу до API + label_missing_feeds_access_key: Відсутній ключ доступу до Atom + button_show: Показати + text_line_separated: Дозволено кілька значень (по одному значенню в рядок). + setting_mail_handler_body_delimiters: Урізати лист після одного з цих рядків + permission_add_subprojects: Створення підпроектів + label_subproject_new: Новий підпроект + text_own_membership_delete_confirmation: |- + Ви збираєтесь видалити деякі або всі права, через що можуть зникнути права на редагування цього проекту. + Ви впевнені що хочете продовжити? + label_close_versions: Закрити завершені версії + label_board_sticky: Прикріплена + label_board_locked: Заблокована + permission_export_wiki_pages: Експорт wiki-сторінок + setting_cache_formatted_text: Кешувати форматований текст + permission_manage_project_activities: Управління типами дій для проекту + error_unable_delete_issue_status: Неможливо видалити статус задачі + label_profile: Профіль + permission_manage_subtasks: Управління підзадачами + field_parent_issue: Батьківська задача + label_subtask_plural: Підзадачі + label_project_copy_notifications: Відправляти сповіщення по електронній пошті при копіюванні проекту + error_can_not_delete_custom_field: Неможливо видалити налаштовуване поле + error_unable_to_connect: Неможливо підключитись (%{value}) + error_can_not_remove_role: Ця роль використовується і не може бути видалена. + error_can_not_delete_tracker: Цей трекер містить задачі і не може бути видалений. + field_principal: Ім'я + notice_failed_to_save_members: "Не вдалось зберегти учасника(ів): %{errors}." + text_zoom_out: Віддалити + text_zoom_in: Наблизити + notice_unable_delete_time_entry: Неможливо видалити запис журналу. + label_overall_spent_time: Всього витраченого часу (трудовитрати) + field_time_entries: Видимість трудовитрат + project_module_gantt: Діаграма Ганта + project_module_calendar: Календар + button_edit_associated_wikipage: "Редагувати пов'язану Wiki сторінку: %{page_title}" + field_text: Текстове поле + setting_default_notification_option: Спосіб сповіщення за замовчуванням + label_user_mail_option_only_my_events: Тільки для задач, які я відслідковую чи беру участь + label_user_mail_option_none: Немає подій + field_member_of_group: Група виконавця + field_assigned_to_role: Роль виконавця + notice_not_authorized_archived_project: Даний проект заархівований. + label_principal_search: "Знайти користувача або групу:" + label_user_search: "Знайти користувача:" + field_visible: Видимий + setting_commit_logtime_activity_id: Для для обліку часу + text_time_logged_by_changeset: Взято до уваги в редакції %{value}. + setting_commit_logtime_enabled: Включити облік часу + notice_gantt_chart_truncated: Діаграма буде обрізана, так як перевищено максимальну к-сть елементів для відображення (%{max}) + setting_gantt_items_limit: Максимальна к-сть елементів для відображення на діаграмі Ганта + field_warn_on_leaving_unsaved: Попереджувати при закритті сторінки з незбереженим текстом + text_warn_on_leaving_unsaved: Дана сторінка містить незбережений текст, який буде втрачено при закритті сторінки. + label_my_queries: Мої збережені запити + text_journal_changed_no_detail: "%{label} оновлено" + label_news_comment_added: Добавлено новий коментар до новини + button_expand_all: Розвернути все + button_collapse_all: Звернути все + label_additional_workflow_transitions_for_assignee: Додаткові переходи дозволені користувачу, який є виконавцем + label_additional_workflow_transitions_for_author: Додаткові переходи дозволені користувачу, який є автором + label_bulk_edit_selected_time_entries: Масова зміна вибраних записів трудовитрат + text_time_entries_destroy_confirmation: Ви впевнені, що хочете видалити вибрати трудовитрати? + label_role_anonymous: Анонім + label_role_non_member: Не учасник + label_issue_note_added: Примітку додано + label_issue_status_updated: Статус оновлено + label_issue_priority_updated: Пріоритет оновлено + label_issues_visibility_own: Створені або призначені задачі для користувача + field_issues_visibility: Видимість задач + label_issues_visibility_all: Всі задачі + permission_set_own_issues_private: Встановити видимість (повна/чаткова) для власних задач + field_is_private: Приватна + permission_set_issues_private: Встановити видимість (повна/чаткова) для задач + label_issues_visibility_public: Тільки загальні задачі + text_issues_destroy_descendants_confirmation: Також буде видалено %{count} задача(і). + field_commit_logs_encoding: Кодування коментарів у сховищі + field_scm_path_encoding: Кодування шляху + text_scm_path_encoding_note: "По замовчуванню: UTF-8" + field_path_to_repository: Шлях до сховища + field_root_directory: Коренева директорія + field_cvs_module: Модуль + field_cvsroot: CVSROOT + text_mercurial_repository_note: Локальне сховище (наприклад. /hgrepo, c:\hgrepo) + text_scm_command: Команда + text_scm_command_version: Версія + label_git_report_last_commit: Зазначати останні зміни для файлів та директорій + notice_issue_successful_create: Задача %{id} створена. + label_between: між + setting_issue_group_assignment: Надавати доступ до створення задача групам користувачів + label_diff: різниця + text_git_repository_note: Сховище пусте та локальнеl (тобто. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Порядок сортування + description_project_scope: Область пошуку + description_filter: Фільтр + description_user_mail_notification: Настройки поштових сповіщень + description_message_content: Зміст повідомлення + description_available_columns: Доступні колонки + description_issue_category_reassign: Виберіть категорію задачі + description_search: Поле пошуку + description_notes: Примітки + description_choose_project: Проекти + description_query_sort_criteria_attribute: Критерій сортування + description_wiki_subpages_reassign: Виберіть батьківську сторінку + description_selected_columns: Вибрані колонки + label_parent_revision: Батьківський + label_child_revision: Підпорядкований + error_scm_annotate_big_text_file: Неможливо додати коментарій через перевищення максимального розміру текстового файлу. + setting_default_issue_start_date_to_creation_date: Використовувати поточну дату, як дату початку нових задач + button_edit_section: Редагувати дану секцію + setting_repositories_encodings: Кодування вкладень та сховищ + description_all_columns: Всі колонки + button_export: Експорт + label_export_options: "%{export_format} параметри екпортування" + error_attachment_too_big: Неможливо завантажити файл, він перевищує максимальний дозволений розмір (%{max_size}) + notice_failed_to_save_time_entries: "Не вдалось зберегти %{count} трудовитрати %{total} вибраних: %{ids}." + label_x_issues: + zero: 0 Питання + one: 1 Питання + other: "%{count} Питання" + label_repository_new: Нове сховище + field_repository_is_default: Сховище за замовчуванням + label_copy_attachments: Скопіювати вкладення + label_item_position: "%{position}/%{count}" + label_completed_versions: Завершені версії + text_project_identifier_info: Допускаються тільки рядкові малі букви (a-z), цифри, тире та підкреслення (нижнє тире).
    Після збереження ідентифікатор заборонено редагувати. + field_multiple: Множинні значення + setting_commit_cross_project_ref: Дозволяти посилання та редагування задач у всіх інших проектах + text_issue_conflict_resolution_add_notes: Додати мої примітки та відмовитись від моїх змін + text_issue_conflict_resolution_overwrite: Застосувати мої зміни (всі попередні примітки будуть збережені, але деякі зміни зможуть бути перезаписані) + notice_issue_update_conflict: Хтось змінив задачу, поки ви її редагували + text_issue_conflict_resolution_cancel: Скасувати мої зміни та показати та повторно показати задачу %{link} + permission_manage_related_issues: Управління пов'язаними задачами + field_auth_source_ldap_filter: Фільтр LDAP + label_search_for_watchers: Знайти спостерігачів + notice_account_deleted: "Ваш обліковій запис повністю видалений" + setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи" + button_delete_my_account: "Видалити мій обліковий запис" + text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи впевнені, що бажаете продовжити?" + error_session_expired: Сеанс вичерпано. Будь ласка, ввійдіть ще раз. + text_session_expiration_settings: "Увага!: зміна даних налаштувань може спричинити завершення поточного сеансу, включаючи поточний." + setting_session_lifetime: Максимальна тривалість сеансу + setting_session_timeout: Таймаут сеансу + label_session_expiration: Термін закінчення сеансу + permission_close_project: Закривати/відкривати проекти + label_show_closed_projects: Переглянути закриті проекти + button_close: Закрити + button_reopen: Відкрити + project_status_active: Відкриті(ий) + project_status_closed: Закриті(ий) + project_status_archived: Заархівовані(ий) + text_project_closed: Проект закрито. Доступний лише в режимі читання. + notice_user_successful_create: Користувача %{id} створено. + field_core_fields: Стандартні поля + field_timeout: Таймаут (в секундах) + setting_thumbnails_enabled: Відображати попередній перегляд для вкладень + setting_thumbnails_size: Розмір попереднього перегляду (в пікселях) + label_status_transitions: Статус-переходи + label_fields_permissions: Права на редагування полів + label_readonly: Тільки для перегляду + label_required: Обов'язкове + text_repository_identifier_info: Допускаються тільки рядкові малі букви (a-z), цифри, тире та підкреслення (нижнє тире).
    Після збереження ідентифікатор заборонено редагувати. + field_board_parent: Батьківський форум + label_attribute_of_project: Проект %{name} + label_attribute_of_author: Ім'я автора %{name} + label_attribute_of_assigned_to: Призначено %{name} + label_attribute_of_fixed_version: Версія %{name} + label_copy_subtasks: Скопіювати підзадачі + label_copied_to: Скопійовано в + label_copied_from: Скопійовано з + label_any_issues_in_project: будь-які задачі в проекті + label_any_issues_not_in_project: будь-які задачі не в проекті + field_private_notes: Приватні коментарі + permission_view_private_notes: Перегляд приватних коментарів + permission_set_notes_private: Розміщення приватних коментарів + label_no_issues_in_project: в проекті немає задач + label_any: Усі + label_last_n_weeks: минулий(і) %{count} тиждень(ні) + setting_cross_project_subtasks: Дозволити підзадачі між проектами + label_cross_project_descendants: З підпроектами + label_cross_project_tree: З деревом проектів + label_cross_project_hierarchy: З ієрархією проектів + label_cross_project_system: З усіма проектами + button_hide: Сховати + setting_non_working_week_days: Неробочі дні + label_in_the_next_days: в наступні дні + label_in_the_past_days: минулі дні + label_attribute_of_user: Користувач %{name} + text_turning_multiple_off: Якщо відключити множинні значення, зайві значення будуть видалені зі списку, так аби залишилось тільки по одному значенню. + label_attribute_of_issue: Задача %{name} + permission_add_documents: Додати документи + permission_edit_documents: Редагувати документи + permission_delete_documents: Видалити документи + label_gantt_progress_line: Лінія прогресу + setting_jsonp_enabled: Включити JSONP підтримку + field_inherit_members: Наслідувати учасників + field_closed_on: Закрито + field_generate_password: Створити пароль + setting_default_projects_tracker_ids: Трекери по замовчуванню для нових проектів + label_total_time: Всього + text_scm_config: Ви можете налаштувати команди SCM в файлі config/configuration.yml. Будь ласка, перезавантажте додаток після редагування даного файлу. + text_scm_command_not_available: SCM команада недоступна. Будь ласка, перевірте налаштування в адміністративній панелі. + setting_emails_header: Заголовок листа + notice_account_not_activated_yet: Поки що ви не маєте активованих облікових записів. Для того аби отримати лист з активацією, перейдіть по click this link. + notice_account_locked: Ваш обліковий запис заблоковано. + label_hidden: Схований + label_visibility_private: тільки для мене + label_visibility_roles: тільки для даних ролей + label_visibility_public: всім користувачам + field_must_change_passwd: Змінити пароль при наступному вході + notice_new_password_must_be_different: Новий пароль повинен відрізнятись від існуючого + setting_mail_handler_excluded_filenames: Виключити вкладення по імені + text_convert_available: ImageMagick використання доступно (опціонально) + label_link: Посилання + label_only: тільки + label_drop_down_list: випадаючий список + label_checkboxes: чекбокси + label_link_values_to: Значення посилань для URL + setting_force_default_language_for_anonymous: Не визначати мову для анонімних користувачів + setting_force_default_language_for_loggedin: Не визначати мову для зареєстрованих користувачів + label_custom_field_select_type: Виберіть тип об'єкта, для якого буде створено поле для налаштування + label_issue_assigned_to_updated: Виконавець оновлений + label_check_for_updates: Перевірити оновлення + label_latest_compatible_version: Остання сумісна версія + label_unknown_plugin: Невідомий плагін + label_radio_buttons: радіо-кнопки + label_group_anonymous: Анонімні користувачі + label_group_non_member: Користувачі неучасники + label_add_projects: Додати проекти + field_default_status: Статус по замовчуванню + text_subversion_repository_note: 'наприклад:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Видимість користувачів + label_users_visibility_all: Всі активні користувачі + label_users_visibility_members_of_visible_projects: Учасники видимих проектів + label_edit_attachments: Редагувати прикріплені файли + setting_link_copied_issue: Зв'язати задачі при копіюванні + label_link_copied_issue: Зв'язати скопійовану задачу + label_ask: Спитати + label_search_attachments_yes: Шукати в назвах прикріплених файлів та описах + label_search_attachments_no: Не шукати в прикріплених файлах + label_search_attachments_only: Шукати тільки в прикріплених файлах + label_search_open_issues_only: Тільки у відкритих задачах + field_address: Ел. пошта + setting_max_additional_emails: Максимальна кількість додаткрвих email адрес + label_email_address_plural: Emails + label_email_address_add: Додати email адреси + label_enable_notifications: Увімкнути сповіщення + label_disable_notifications: Вимкнути сповіщення + setting_search_results_per_page: Кількість знайдених результатів на сторінку + label_blank_value: пусто + permission_copy_issues: Копіювання задач + error_password_expired: Термін дії вашого паролю закінчився або адміністратор запросив поміняти його. + field_time_entries_visibility: Видимість трудовитрат + setting_password_max_age: Портребувати заміну пароля по завершенню + label_parent_task_attributes: Атрибути батьківської задачі + label_parent_task_attributes_derived: З урахуванням підзадач + label_parent_task_attributes_independent: Без урахування підзадач + label_time_entries_visibility_all: Всі трудовитрати + label_time_entries_visibility_own: Тільки власні трудовитрати + label_member_management: Управління учасниками + label_member_management_all_roles: Всі ролі + label_member_management_selected_roles_only: Тільки дані ролі + label_password_required: Підтвердіть ваш пароль для продовження + label_total_spent_time: Всього затрачено часу + notice_import_finished: "%{count} елементи(ів) було імпортовано" + notice_import_finished_with_errors: "%{count} з %{total} елементи(ів) неможливо імпортувати" + error_invalid_file_encoding: Кодування файлу не відповідає видраній(ому) %{encoding} + error_invalid_csv_file_or_settings: Файл не є файлом CSV або не відповідає вибраним налаштуванням + error_can_not_read_import_file: Під час читання файлу для імпорту виникла помилка + permission_import_issues: Імпорт задач + label_import_issues: Імпорт задач + label_select_file_to_import: Виберіть файл для імпорту + label_fields_separator: Розділювач + label_fields_wrapper: Обмежувач + label_encoding: Кодування + label_comma_char: Кома + label_semi_colon_char: Крапка з комою + label_quote_char: Дужки + label_double_quote_char: Подвійні дужки + label_fields_mapping: Відповідність полів + label_file_content_preview: Попередній перегляд вмісту файлу + label_create_missing_values: Створити відсутні значення + button_import: Імпорт + field_total_estimated_hours: Всього залишилось часу + label_api: API + label_total_plural: Висновки + label_assigned_issues: Призначені задачі + label_field_format_enumeration: Ключ/значення список + label_f_hour_short: '%{value} г' + field_default_version: Версія за замовчуванням + error_attachment_extension_not_allowed: Дане розширення %{extension} заборонено + setting_attachment_extensions_allowed: Дозволені розширенні + setting_attachment_extensions_denied: Заборонені розширення + label_any_open_issues: будь-які відкриті задачі + label_no_open_issues: немає відкритих задач + label_default_values_for_new_users: Значення за замовчуванням для нових користувачів + error_ldap_bind_credentials: Неправильний обліковий запис LDAP /Пароль + setting_sys_api_key: API ключ + setting_lost_password: Забули пароль + mail_subject_security_notification: Сповіщення безпеки + mail_body_security_notification_change: ! '%{field} змінено.' + mail_body_security_notification_change_to: ! '%{field} було змінено на %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} додано.' + mail_body_security_notification_remove: ! '%{field} %{value} видалено.' + mail_body_security_notification_notify_enabled: Email адреса %{value} зараз отримує сповіщення. + mail_body_security_notification_notify_disabled: Email адреса %{value} більше не отримує сповіщення. + mail_body_settings_updated: ! 'Наступні налаштування було змінено:' + field_remote_ip: IP адреси + label_wiki_page_new: Нова wiki сторінка + label_relations: Зв'язки + button_filter: Фільтр + mail_body_password_updated: Ваш пароль змінено. + label_no_preview: Попередній перегляд недоступний + error_no_tracker_allowed_for_new_issue_in_project: Проект не містить трекерів, для яких можна створити задачу + label_tracker_all: Всі трекери + label_new_project_issue_tab_enabled: Відображати вкладку "Нова задача" + setting_new_item_menu_tab: Вкладка "меню проекту" для створення нових об'єктів + label_new_object_tab_enabled: Відображати випадаючий список "+" + error_no_projects_with_tracker_allowed_for_new_issue: Немає проектів з трекерами, для яких можна було б створити задачу + field_textarea_font: Шрифт, який використовується для текстових полів + label_font_default: Шрифт за замовчуванням + label_font_monospace: Моноширинний шрифт + label_font_proportional: Пропорційний шрифт + setting_timespan_format: Формат часового діапазону + label_table_of_contents: Зміст + setting_commit_logs_formatting: Застосувати форматування тексту для повідомлення + setting_mail_handler_enable_regex_delimiters: Використовувати регулярні вирази + error_move_of_child_not_possible: 'Підзадача %{child} не може бути перенесена в новий проект: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Витрачений час не можна перенести на задачу, яка має бути видалена + setting_timelog_required_fields: Обов'язкові поля для журналу часу + label_attribute_of_object: '%{object_name}''s %{name}' + warning_fields_cleared_on_bulk_edit: Зміни приведуть до автоматичного видалення значень з одного або декількох полів на обраних об'єктах + field_updated_by: Оновлено + field_last_updated_by: Востаннє оновлено + field_full_width_layout: Макет на повну ширину + label_user_mail_option_only_assigned: Лише для об'єктів за якими я спостерігаю або до яких прикріплений + label_user_mail_option_only_owner: Лише для об'єктів за якими я спостерігаю або є власником + label_last_notes: Останні коментарі + field_digest: Контрольна сума + field_default_assigned_to: Призначити по замовчуванню + setting_show_custom_fields_on_registration: Показувати додаткові поля при реєстрації + permission_view_news: Переглядати новини + label_no_preview_alternative_html: Попередній перегляд недоступний. %{link} файл натомість. + label_no_preview_download: Завантажити diff --git a/config/locales/vi.yml b/config/locales/vi.yml new file mode 100644 index 0000000..561b802 --- /dev/null +++ b/config/locales/vi.yml @@ -0,0 +1,1283 @@ +# Vietnamese translation for Ruby on Rails +# by +# Do Hai Bac (dohaibac@gmail.com) +# Dao Thanh Ngoc (ngocdaothanh@gmail.com, http://github.com/ngocdaothanh/rails-i18n/tree/master) +# Nguyen Minh Thien (thiencdcn@gmail.com, http://www.eDesignLab.org) + +vi: + number: + # Used in number_with_delimiter() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "," + # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "." + # Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00) + precision: 3 + + # Used in number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%n %u" + unit: "đồng" + # These three are to override number.format and are optional + separator: "," + delimiter: "." + precision: 2 + + # Used in number_to_percentage() + percentage: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_precision() + precision: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + # precision: + + # Used in number_to_human_size() + human: + format: + # These three are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "30 giây" + less_than_x_seconds: + one: "chưa tới 1 giây" + other: "chưa tới %{count} giây" + x_seconds: + one: "1 giây" + other: "%{count} giây" + less_than_x_minutes: + one: "chưa tới 1 phút" + other: "chưa tới %{count} phút" + x_minutes: + one: "1 phút" + other: "%{count} phút" + about_x_hours: + one: "khoảng 1 giờ" + other: "khoảng %{count} giờ" + x_hours: + one: "1 giờ" + other: "%{count} giờ" + x_days: + one: "1 ngày" + other: "%{count} ngày" + about_x_months: + one: "khoảng 1 tháng" + other: "khoảng %{count} tháng" + x_months: + one: "1 tháng" + other: "%{count} tháng" + about_x_years: + one: "khoảng 1 năm" + other: "khoảng %{count} năm" + over_x_years: + one: "hơn 1 năm" + other: "hơn %{count} năm" + almost_x_years: + one: "gần 1 năm" + other: "gần %{count} năm" + prompts: + year: "Năm" + month: "Tháng" + day: "Ngày" + hour: "Giờ" + minute: "Phút" + second: "Giây" + + activerecord: + errors: + template: + header: + one: "1 lỗi ngăn không cho lưu %{model} này" + other: "%{count} lỗi ngăn không cho lưu %{model} này" + # The variable :count is also available + body: "Có lỗi với các mục sau:" + + # The values :model, :attribute and :value are always available for interpolation + # The value :count is available when applicable. Can be used for pluralization. + messages: + inclusion: "không có trong danh sách" + exclusion: "đã được giành trước" + invalid: "không hợp lệ" + confirmation: "không khớp với xác nhận" + accepted: "phải được đồng ý" + empty: "không thể rỗng" + blank: "không thể để trắng" + too_long: "quá dài (tối đa %{count} ký tự)" + too_short: "quá ngắn (tối thiểu %{count} ký tự)" + wrong_length: "độ dài không đúng (phải là %{count} ký tự)" + taken: "đã có" + not_a_number: "không phải là số" + greater_than: "phải lớn hơn %{count}" + greater_than_or_equal_to: "phải lớn hơn hoặc bằng %{count}" + equal_to: "phải bằng %{count}" + less_than: "phải nhỏ hơn %{count}" + less_than_or_equal_to: "phải nhỏ hơn hoặc bằng %{count}" + odd: "phải là số chẵn" + even: "phải là số lẻ" + greater_than_start_date: "phải đi sau ngày bắt đầu" + not_same_project: "không thuộc cùng dự án" + circular_dependency: "quan hệ có thể gây ra lặp vô tận" + cant_link_an_issue_with_a_descendant: "Một vấn đề không thể liên kết tới một trong số những tác vụ con của nó" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%d-%m-%Y" + short: "%d %b" + long: "%d %B, %Y" + + day_names: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"] + abbr_day_names: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"] + abbr_month_names: [~, "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"] + # Used in date_select and datime_select. + order: + - :day + - :month + - :year + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + time: "%H:%M" + short: "%d %b %H:%M" + long: "%d %B, %Y %H:%M" + am: "sáng" + pm: "chiều" + + # Used in array.to_sentence. + support: + array: + words_connector: ", " + two_words_connector: " và " + last_word_connector: ", và " + + actionview_instancetag_blank_option: Vui lòng chọn + + general_text_No: 'Không' + general_text_Yes: 'Có' + general_text_no: 'không' + general_text_yes: 'có' + general_lang_name: 'Vietnamese (Tiếng Việt)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: UTF-8 + general_pdf_fontname: DejaVuSans + general_pdf_monospaced_fontname: DejaVuSans + general_first_day_of_week: '1' + + notice_account_updated: Cập nhật tài khoản thành công. + notice_account_invalid_credentials: Tài khoản hoặc mật mã không hợp lệ + notice_account_password_updated: Cập nhật mật mã thành công. + notice_account_wrong_password: Sai mật mã + notice_account_register_done: Tài khoản được tạo thành công. Để kích hoạt vui lòng làm theo hướng dẫn trong email gửi đến bạn. + notice_account_unknown_email: Không rõ tài khoản. + notice_can_t_change_password: Tài khoản được chứng thực từ nguồn bên ngoài. Không thể đổi mật mã cho loại chứng thực này. + notice_account_lost_email_sent: Thông tin để đổi mật mã mới đã gửi đến bạn qua email. + notice_account_activated: Tài khoản vừa được kích hoạt. Bây giờ bạn có thể đăng nhập. + notice_successful_create: Tạo thành công. + notice_successful_update: Cập nhật thành công. + notice_successful_delete: Xóa thành công. + notice_successful_connection: Kết nối thành công. + notice_file_not_found: Trang bạn cố xem không tồn tại hoặc đã chuyển. + notice_locking_conflict: Thông tin đang được cập nhật bởi người khác. Hãy chép nội dung cập nhật của bạn vào clipboard. + notice_not_authorized: Bạn không có quyền xem trang này. + notice_email_sent: "Email đã được gửi tới %{value}" + notice_email_error: "Lỗi xảy ra khi gửi email (%{value})" + notice_feeds_access_key_reseted: Mã số chứng thực Atom đã được tạo lại. + notice_failed_to_save_issues: "Thất bại khi lưu %{count} vấn đề trong %{total} lựa chọn: %{ids}." + notice_no_issue_selected: "Không có vấn đề được chọn! Vui lòng kiểm tra các vấn đề bạn cần chỉnh sửa." + notice_account_pending: "Thông tin tài khoản đã được tạo ra và đang chờ chứng thực từ ban quản trị." + notice_default_data_loaded: Đã nạp cấu hình mặc định. + notice_unable_delete_version: Không thể xóa phiên bản. + + error_can_t_load_default_data: "Không thể nạp cấu hình mặc định: %{value}" + error_scm_not_found: "Không tìm thấy dữ liệu trong kho chứa." + error_scm_command_failed: "Lỗi xảy ra khi truy cập vào kho lưu trữ: %{value}" + error_scm_annotate: "Đầu vào không tồn tại hoặc không thể chú thích." + error_issue_not_found_in_project: 'Vấn đề không tồn tại hoặc không thuộc dự án' + + mail_subject_lost_password: "%{value}: mật mã của bạn" + mail_body_lost_password: "Để đổi mật mã, hãy click chuột vào liên kết sau:" + mail_subject_register: "%{value}: kích hoạt tài khoản" + mail_body_register: "Để kích hoạt tài khoản, hãy click chuột vào liên kết sau:" + mail_body_account_information_external: " Bạn có thể dùng tài khoản %{value} để đăng nhập." + mail_body_account_information: Thông tin về tài khoản + mail_subject_account_activation_request: "%{value}: Yêu cầu chứng thực tài khoản" + mail_body_account_activation_request: "Người dùng (%{value}) mới đăng ký và cần bạn xác nhận:" + mail_subject_reminder: "%{count} vấn đề hết hạn trong các %{days} ngày tới" + mail_body_reminder: "%{count} công việc bạn được phân công sẽ hết hạn trong %{days} ngày tới:" + + field_name: Tên dự án + field_description: Mô tả + field_summary: Tóm tắt + field_is_required: Bắt buộc + field_firstname: Tên đệm và Tên + field_lastname: Họ + field_mail: Email + field_filename: Tập tin + field_filesize: Cỡ + field_downloads: Tải về + field_author: Tác giả + field_created_on: Tạo + field_updated_on: Cập nhật + field_field_format: Định dạng + field_is_for_all: Cho mọi dự án + field_possible_values: Giá trị hợp lệ + field_regexp: Biểu thức chính quy + field_min_length: Chiều dài tối thiểu + field_max_length: Chiều dài tối đa + field_value: Giá trị + field_category: Chủ đề + field_title: Tiêu đề + field_project: Dự án + field_issue: Vấn đề + field_status: Trạng thái + field_notes: Ghi chú + field_is_closed: Vấn đề đóng + field_is_default: Giá trị mặc định + field_tracker: Kiểu vấn đề + field_subject: Chủ đề + field_due_date: Hết hạn + field_assigned_to: Phân công cho + field_priority: Mức ưu tiên + field_fixed_version: Phiên bản + field_user: Người dùng + field_role: Quyền + field_homepage: Trang chủ + field_is_public: Công cộng + field_parent: Dự án con của + field_is_in_roadmap: Có thể thấy trong Kế hoạch + field_login: Đăng nhập + field_mail_notification: Thông báo qua email + field_admin: Quản trị + field_last_login_on: Kết nối cuối + field_language: Ngôn ngữ + field_effective_date: Ngày + field_password: Mật khẩu + field_new_password: Mật khẩu mới + field_password_confirmation: Nhập lại mật khẩu + field_version: Phiên bản + field_type: Kiểu + field_host: Host + field_port: Cổng + field_account: Tài khoản + field_base_dn: Base DN + field_attr_login: Thuộc tính đăng nhập + field_attr_firstname: Thuộc tính tên đệm và Tên + field_attr_lastname: Thuộc tính Họ + field_attr_mail: Thuộc tính Email + field_onthefly: Tạo người dùng tức thì + field_start_date: Bắt đầu + field_done_ratio: Tiến độ + field_auth_source: Chế độ xác thực + field_hide_mail: Không hiện email của tôi + field_comments: Bình luận + field_url: URL + field_start_page: Trang bắt đầu + field_subproject: Dự án con + field_hours: Giờ + field_activity: Hoạt động + field_spent_on: Ngày + field_identifier: Mã nhận dạng + field_is_filter: Dùng như bộ lọc + field_issue_to: Vấn đề liên quan + field_delay: Độ trễ + field_assignable: Vấn đề có thể gán cho vai trò này + field_redirect_existing_links: Chuyển hướng trang đã có + field_estimated_hours: Thời gian ước lượng + field_column_names: Cột + field_time_zone: Múi giờ + field_searchable: Tìm kiếm được + field_default_value: Giá trị mặc định + field_comments_sorting: Liệt kê bình luận + field_parent_title: Trang mẹ + + setting_app_title: Tựa đề ứng dụng + setting_app_subtitle: Tựa đề nhỏ của ứng dụng + setting_welcome_text: Thông điệp chào mừng + setting_default_language: Ngôn ngữ mặc định + setting_login_required: Cần đăng nhập + setting_self_registration: Tự chứng thực + setting_attachment_max_size: Cỡ tối đa của tập tin đính kèm + setting_issues_export_limit: Giới hạn Export vấn đề + setting_mail_from: Địa chỉ email gửi thông báo + setting_bcc_recipients: Tạo bản CC bí mật (bcc) + setting_host_name: Tên miền và đường dẫn + setting_text_formatting: Định dạng bài viết + setting_wiki_compression: Nén lịch sử Wiki + setting_feeds_limit: Giới hạn nội dung của feed + setting_default_projects_public: Dự án mặc định là public + setting_autofetch_changesets: Tự động tìm nạp commits + setting_sys_api_enabled: Cho phép WS quản lý kho chứa + setting_commit_ref_keywords: Từ khóa tham khảo + setting_commit_fix_keywords: Từ khóa chỉ vấn đề đã giải quyết + setting_autologin: Tự động đăng nhập + setting_date_format: Định dạng ngày + setting_time_format: Định dạng giờ + setting_cross_project_issue_relations: Cho phép quan hệ chéo giữa các dự án + setting_issue_list_default_columns: Các cột mặc định hiển thị trong danh sách vấn đề + setting_emails_footer: Chữ ký cuối thư + setting_protocol: Giao thức + setting_per_page_options: Tùy chọn đối tượng mỗi trang + setting_user_format: Định dạng hiển thị người dùng + setting_activity_days_default: Ngày hiển thị hoạt động của dự án + setting_display_subprojects_issues: Hiển thị mặc định vấn đề của dự án con ở dự án chính + setting_enabled_scm: Cho phép SCM + setting_mail_handler_api_enabled: Cho phép WS cho các email tới + setting_mail_handler_api_key: Mã số API + setting_sequential_project_identifiers: Tự sinh chuỗi ID dự án + + project_module_issue_tracking: Theo dõi vấn đề + project_module_time_tracking: Theo dõi thời gian + project_module_news: Tin tức + project_module_documents: Tài liệu + project_module_files: Tập tin + project_module_wiki: Wiki + project_module_repository: Kho lưu trữ + project_module_boards: Diễn đàn + + label_user: Tài khoản + label_user_plural: Tài khoản + label_user_new: Tài khoản mới + label_project: Dự án + label_project_new: Dự án mới + label_project_plural: Dự án + label_x_projects: + zero: không có dự án + one: một dự án + other: "%{count} dự án" + label_project_all: Mọi dự án + label_project_latest: Dự án mới nhất + label_issue: Vấn đề + label_issue_new: Tạo vấn đề mới + label_issue_plural: Vấn đề + label_issue_view_all: Tất cả vấn đề + label_issues_by: "Vấn đề của %{value}" + label_issue_added: Đã thêm vấn đề + label_issue_updated: Vấn đề được cập nhật + label_document: Tài liệu + label_document_new: Tài liệu mới + label_document_plural: Tài liệu + label_document_added: Đã thêm tài liệu + label_role: Vai trò + label_role_plural: Vai trò + label_role_new: Vai trò mới + label_role_and_permissions: Vai trò và Quyền hạn + label_member: Thành viên + label_member_new: Thành viên mới + label_member_plural: Thành viên + label_tracker: Kiểu vấn đề + label_tracker_plural: Kiểu vấn đề + label_tracker_new: Tạo kiểu vấn đề mới + label_workflow: Quy trình làm việc + label_issue_status: Trạng thái vấn đề + label_issue_status_plural: Trạng thái vấn đề + label_issue_status_new: Thêm trạng thái + label_issue_category: Chủ đề + label_issue_category_plural: Chủ đề + label_issue_category_new: Chủ đề mới + label_custom_field: Trường tùy biến + label_custom_field_plural: Trường tùy biến + label_custom_field_new: Thêm Trường tùy biến + label_enumerations: Liệt kê + label_enumeration_new: Thêm giá trị + label_information: Thông tin + label_information_plural: Thông tin + label_please_login: Vui lòng đăng nhập + label_register: Đăng ký + label_password_lost: Phục hồi mật mã + label_home: Trang chính + label_my_page: Trang riêng + label_my_account: Cá nhân + label_my_projects: Dự án của bạn + label_administration: Quản trị + label_login: Đăng nhập + label_logout: Thoát + label_help: Giúp đỡ + label_reported_issues: Công việc bạn phân công + label_assigned_to_me_issues: Công việc được phân công + label_last_login: Kết nối cuối + label_registered_on: Ngày tham gia + label_activity: Hoạt động + label_overall_activity: Tất cả hoạt động + label_new: Mới + label_logged_as: Tài khoản » + label_environment: Môi trường + label_authentication: Xác thực + label_auth_source: Chế độ xác thực + label_auth_source_new: Chế độ xác thực mới + label_auth_source_plural: Chế độ xác thực + label_subproject_plural: Dự án con + label_and_its_subprojects: "%{value} và dự án con" + label_min_max_length: Độ dài nhỏ nhất - lớn nhất + label_list: Danh sách + label_date: Ngày + label_integer: Số nguyên + label_float: Số thực + label_boolean: Boolean + label_string: Văn bản + label_text: Văn bản dài + label_attribute: Thuộc tính + label_attribute_plural: Các thuộc tính + label_no_data: Chưa có thông tin gì + label_change_status: Đổi trạng thái + label_history: Lược sử + label_attachment: Tập tin + label_attachment_new: Thêm tập tin mới + label_attachment_delete: Xóa tập tin + label_attachment_plural: Tập tin + label_file_added: Đã thêm tập tin + label_report: Báo cáo + label_report_plural: Báo cáo + label_news: Tin tức + label_news_new: Thêm tin + label_news_plural: Tin tức + label_news_latest: Tin mới + label_news_view_all: Xem mọi tin + label_news_added: Đã thêm tin + label_settings: Thiết lập + label_overview: Tóm tắt + label_version: Phiên bản + label_version_new: Phiên bản mới + label_version_plural: Phiên bản + label_confirmation: Khẳng định + label_export_to: 'Định dạng khác của trang này:' + label_read: Đọc... + label_public_projects: Các dự án công cộng + label_open_issues: mở + label_open_issues_plural: mở + label_closed_issues: đóng + label_closed_issues_plural: đóng + label_x_open_issues_abbr: + zero: 0 mở + one: 1 mở + other: "%{count} mở" + label_x_closed_issues_abbr: + zero: 0 đóng + one: 1 đóng + other: "%{count} đóng" + label_total: Tổng cộng + label_permissions: Quyền + label_current_status: Trạng thái hiện tại + label_new_statuses_allowed: Trạng thái mới được phép + label_all: Tất cả + label_none: không + label_nobody: Chẳng ai + label_next: Sau + label_previous: Trước + label_used_by: Được dùng bởi + label_details: Chi tiết + label_add_note: Thêm ghi chú + label_calendar: Lịch + label_months_from: tháng từ + label_gantt: Biểu đồ sự kiện + label_internal: Nội bộ + label_last_changes: "%{count} thay đổi cuối" + label_change_view_all: Xem mọi thay đổi + label_comment: Bình luận + label_comment_plural: Bình luận + label_x_comments: + zero: không có bình luận + one: 1 bình luận + other: "%{count} bình luận" + label_comment_add: Thêm bình luận + label_comment_added: Đã thêm bình luận + label_comment_delete: Xóa bình luận + label_query: Truy vấn riêng + label_query_plural: Truy vấn riêng + label_query_new: Truy vấn mới + label_filter_add: Thêm lọc + label_filter_plural: Bộ lọc + label_equals: là + label_not_equals: không là + label_in_less_than: ít hơn + label_in_more_than: nhiều hơn + label_in: trong + label_today: hôm nay + label_all_time: mọi thời gian + label_yesterday: hôm qua + label_this_week: tuần này + label_last_week: tuần trước + label_last_n_days: "%{count} ngày cuối" + label_this_month: tháng này + label_last_month: tháng cuối + label_this_year: năm này + label_date_range: Thời gian + label_less_than_ago: cách đây dưới + label_more_than_ago: cách đây hơn + label_ago: cách đây + label_contains: chứa + label_not_contains: không chứa + label_day_plural: ngày + label_repository: Kho lưu trữ + label_repository_plural: Kho lưu trữ + label_browse: Duyệt + label_revision: Bản điều chỉnh + label_revision_plural: Bản điều chỉnh + label_associated_revisions: Các bản điều chỉnh được ghép + label_added: thêm + label_modified: đổi + label_copied: chép + label_renamed: đổi tên + label_deleted: xóa + label_latest_revision: Bản điều chỉnh cuối cùng + label_latest_revision_plural: Bản điều chỉnh cuối cùng + label_view_revisions: Xem các bản điều chỉnh + label_max_size: Dung lượng tối đa + label_sort_highest: Lên trên cùng + label_sort_higher: Dịch lên + label_sort_lower: Dịch xuống + label_sort_lowest: Xuống dưới cùng + label_roadmap: Kế hoạch + label_roadmap_due_in: "Hết hạn trong %{value}" + label_roadmap_overdue: "Trễ %{value}" + label_roadmap_no_issues: Không có vấn đề cho phiên bản này + label_search: Tìm + label_result_plural: Kết quả + label_all_words: Mọi từ + label_wiki: Wiki + label_wiki_edit: Sửa Wiki + label_wiki_edit_plural: Thay đổi wiki + label_wiki_page: Trang wiki + label_wiki_page_plural: Trang wiki + label_index_by_title: Danh sách theo tên + label_index_by_date: Danh sách theo ngày + label_current_version: Bản hiện tại + label_preview: Xem trước + label_feed_plural: Nguồn cấp tin + label_changes_details: Chi tiết của mọi thay đổi + label_issue_tracking: Vấn đề + label_spent_time: Thời gian + label_f_hour: "%{value} giờ" + label_f_hour_plural: "%{value} giờ" + label_time_tracking: Theo dõi thời gian + label_change_plural: Thay đổi + label_statistics: Thống kê + label_commits_per_month: Commits mỗi tháng + label_commits_per_author: Commits mỗi tác giả + label_view_diff: So sánh + label_diff_inline: inline + label_diff_side_by_side: bên cạnh nhau + label_options: Tùy chọn + label_copy_workflow_from: Sao chép quy trình từ + label_permissions_report: Thống kê các quyền + label_watched_issues: Chủ đề đang theo dõi + label_related_issues: Liên quan + label_applied_status: Trạng thái áp dụng + label_loading: Đang xử lý... + label_relation_new: Quan hệ mới + label_relation_delete: Xóa quan hệ + label_relates_to: liên quan + label_duplicates: trùng với + label_duplicated_by: bị trùng bởi + label_blocks: chặn + label_blocked_by: chặn bởi + label_precedes: đi trước + label_follows: đi sau + label_stay_logged_in: Lưu thông tin đăng nhập + label_disabled: Bị vô hiệu + label_show_completed_versions: Xem phiên bản đã hoàn thành + label_me: tôi + label_board: Diễn đàn + label_board_new: Tạo diễn đàn mới + label_board_plural: Diễn đàn + label_topic_plural: Chủ đề + label_message_plural: Diễn đàn + label_message_last: Bài cuối + label_message_new: Tạo bài mới + label_message_posted: Đã thêm bài viết + label_reply_plural: Hồi âm + label_send_information: Gửi thông tin đến người dùng qua email + label_year: Năm + label_month: Tháng + label_week: Tuần + label_date_from: Từ + label_date_to: Đến + label_language_based: Theo ngôn ngữ người dùng + label_sort_by: "Sắp xếp theo %{value}" + label_send_test_email: Gửi một email kiểm tra + label_feeds_access_key_created_on: "Mã chứng thực Atom được tạo ra cách đây %{value}" + label_module_plural: Module + label_added_time_by: "Thêm bởi %{author} cách đây %{age}" + label_updated_time: "Cập nhật cách đây %{value}" + label_jump_to_a_project: Nhảy đến dự án... + label_file_plural: Tập tin + label_changeset_plural: Thay đổi + label_default_columns: Cột mặc định + label_no_change_option: (không đổi) + label_bulk_edit_selected_issues: Sửa nhiều vấn đề + label_theme: Giao diện + label_default: Mặc định + label_search_titles_only: Chỉ tìm trong tựa đề + label_user_mail_option_all: "Mọi sự kiện trên mọi dự án của tôi" + label_user_mail_option_selected: "Mọi sự kiện trên các dự án được chọn..." + label_user_mail_no_self_notified: "Đừng gửi email về các thay đổi do chính tôi thực hiện" + label_registration_activation_by_email: kích hoạt tài khoản qua email + label_registration_manual_activation: kích hoạt tài khoản thủ công + label_registration_automatic_activation: kích hoạt tài khoản tự động + label_display_per_page: "mỗi trang: %{value}" + label_age: Thời gian + label_change_properties: Thay đổi thuộc tính + label_general: Tổng quan + label_scm: SCM + label_plugins: Module + label_ldap_authentication: Chứng thực LDAP + label_downloads_abbr: Số lượng Download + label_optional_description: Mô tả bổ sung + label_add_another_file: Thêm tập tin khác + label_preferences: Cấu hình + label_chronological_order: Bài cũ xếp trước + label_reverse_chronological_order: Bài mới xếp trước + label_incoming_emails: Nhận mail + label_generate_key: Tạo mã + label_issue_watchers: Theo dõi + + button_login: Đăng nhập + button_submit: Gửi + button_save: Lưu + button_check_all: Đánh dấu tất cả + button_uncheck_all: Bỏ dấu tất cả + button_delete: Xóa + button_create: Tạo + button_test: Kiểm tra + button_edit: Sửa + button_add: Thêm + button_change: Đổi + button_apply: Áp dụng + button_clear: Xóa + button_lock: Khóa + button_unlock: Mở khóa + button_download: Tải về + button_list: Liệt kê + button_view: Xem + button_move: Chuyển + button_back: Quay lại + button_cancel: Bỏ qua + button_activate: Kích hoạt + button_sort: Sắp xếp + button_log_time: Thêm thời gian + button_rollback: Quay trở lại phiên bản này + button_watch: Theo dõi + button_unwatch: Bỏ theo dõi + button_reply: Trả lời + button_archive: Đóng băng + button_unarchive: Xả băng + button_reset: Tạo lại + button_rename: Đổi tên + button_change_password: Đổi mật mã + button_copy: Sao chép + button_annotate: Chú giải + button_update: Cập nhật + button_configure: Cấu hình + button_quote: Trích dẫn + + status_active: Đang hoạt động + status_registered: Mới đăng ký + status_locked: Đã khóa + + text_select_mail_notifications: Chọn hành động đối với mỗi email sẽ gửi. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 để chỉ không hạn chế + text_project_destroy_confirmation: Bạn có chắc chắn muốn xóa dự án này và các dữ liệu liên quan ? + text_subprojects_destroy_warning: "Dự án con của : %{value} cũng sẽ bị xóa." + text_workflow_edit: Chọn một vai trò và một vấn đề để sửa quy trình + text_are_you_sure: Bạn chắc chứ? + text_tip_issue_begin_day: ngày bắt đầu + text_tip_issue_end_day: ngày kết thúc + text_tip_issue_begin_end_day: bắt đầu và kết thúc cùng ngày + text_caracters_maximum: "Tối đa %{count} ký tự." + text_caracters_minimum: "Phải gồm ít nhất %{count} ký tự." + text_length_between: "Chiều dài giữa %{min} và %{max} ký tự." + text_tracker_no_workflow: Không có quy trình được định nghĩa cho theo dõi này + text_unallowed_characters: Ký tự không hợp lệ + text_comma_separated: Nhiều giá trị được phép (cách nhau bởi dấu phẩy). + text_issues_ref_in_commit_messages: Vấn đề tham khảo và cố định trong ghi chú commit + text_issue_added: "Vấn đề %{id} đã được báo cáo bởi %{author}." + text_issue_updated: "Vấn đề %{id} đã được cập nhật bởi %{author}." + text_wiki_destroy_confirmation: Bạn có chắc chắn muốn xóa trang wiki này và tất cả nội dung của nó ? + text_issue_category_destroy_question: "Một số vấn đề (%{count}) được gán cho danh mục này. Bạn muốn làm gì ?" + text_issue_category_destroy_assignments: Gỡ bỏ danh mục được phân công + text_issue_category_reassign_to: Gán lại vấn đề cho danh mục này + text_user_mail_option: "Với các dự án không được chọn, bạn chỉ có thể nhận được thông báo về các vấn đề bạn đăng ký theo dõi hoặc có liên quan đến bạn (chẳng hạn, vấn đề được gán cho bạn)." + text_no_configuration_data: "Quyền, theo dõi, tình trạng vấn đề và quy trình chưa được cấu hình.\nBắt buộc phải nạp cấu hình mặc định. Bạn sẽ thay đổi nó được sau khi đã nạp." + text_load_default_configuration: Nạp lại cấu hình mặc định + text_status_changed_by_changeset: "Áp dụng trong changeset : %{value}." + text_issues_destroy_confirmation: 'Bạn có chắc chắn muốn xóa các vấn đề đã chọn ?' + text_select_project_modules: 'Chọn các module cho dự án:' + text_default_administrator_account_changed: Thay đổi tài khoản quản trị mặc định + text_file_repository_writable: Cho phép ghi thư mục đính kèm + text_rmagick_available: Trạng thái RMagick + text_destroy_time_entries_question: "Thời gian %{hours} giờ đã báo cáo trong vấn đề bạn định xóa. Bạn muốn làm gì tiếp ?" + text_destroy_time_entries: Xóa thời gian báo cáo + text_assign_time_entries_to_project: Gán thời gian báo cáo cho dự án + text_reassign_time_entries: 'Gán lại thời gian báo cáo cho Vấn đề này:' + text_user_wrote: "%{value} đã viết:" + text_enumeration_destroy_question: "%{count} đối tượng được gán giá trị này." + text_enumeration_category_reassign_to: 'Gán lại giá trị này:' + text_email_delivery_not_configured: "Cấu hình gửi Email chưa được đặt, và chức năng thông báo bị loại bỏ.\nCấu hình máy chủ SMTP của bạn ở file config/configuration.yml và khởi động lại để kích hoạt chúng." + + default_role_manager: 'Điều hành ' + default_role_developer: 'Phát triển ' + default_role_reporter: Báo cáo + default_tracker_bug: Lỗi + default_tracker_feature: Tính năng + default_tracker_support: Hỗ trợ + default_issue_status_new: Mới + default_issue_status_in_progress: Đang tiến hành + default_issue_status_resolved: Đã được giải quyết + default_issue_status_feedback: Phản hồi + default_issue_status_closed: Đã đóng + default_issue_status_rejected: Từ chối + default_doc_category_user: Tài liệu người dùng + default_doc_category_tech: Tài liệu kỹ thuật + default_priority_low: Thấp + default_priority_normal: Bình thường + default_priority_high: Cao + default_priority_urgent: Khẩn cấp + default_priority_immediate: Trung bình + default_activity_design: Thiết kế + default_activity_development: Phát triển + + enumeration_issue_priorities: Mức độ ưu tiên vấn đề + enumeration_doc_categories: Danh mục tài liệu + enumeration_activities: Hoạt động + + setting_plain_text_mail: Mail dạng text đơn giản (không dùng HTML) + setting_gravatar_enabled: Dùng biểu tượng Gravatar + permission_edit_project: Chỉnh dự án + permission_select_project_modules: Chọn Module + permission_manage_members: Quản lý thành viên + permission_manage_versions: Quản lý phiên bản + permission_manage_categories: Quản lý chủ đề + permission_add_issues: Thêm vấn đề + permission_edit_issues: Sửa vấn đề + permission_manage_issue_relations: Quản lý quan hệ vấn đề + permission_add_issue_notes: Thêm chú thích + permission_edit_issue_notes: Sửa chú thích + permission_edit_own_issue_notes: Sửa chú thích cá nhân + permission_move_issues: Chuyển vấn đề + permission_delete_issues: Xóa vấn đề + permission_manage_public_queries: Quản lý truy vấn công cộng + permission_save_queries: Lưu truy vấn + permission_view_gantt: Xem biểu đồ sự kiện + permission_view_calendar: Xem lịch + permission_view_issue_watchers: Xem những người theo dõi + permission_add_issue_watchers: Thêm người theo dõi + permission_log_time: Lưu thời gian đã qua + permission_view_time_entries: Xem thời gian đã qua + permission_edit_time_entries: Xem nhật ký thời gian + permission_edit_own_time_entries: Sửa thời gian đã lưu + permission_manage_news: Quản lý tin mới + permission_comment_news: Chú thích vào tin mới + permission_view_documents: Xem tài liệu + permission_manage_files: Quản lý tập tin + permission_view_files: Xem tập tin + permission_manage_wiki: Quản lý wiki + permission_rename_wiki_pages: Đổi tên trang wiki + permission_delete_wiki_pages: Xóa trang wiki + permission_view_wiki_pages: Xem wiki + permission_view_wiki_edits: Xem lược sử trang wiki + permission_edit_wiki_pages: Sửa trang wiki + permission_delete_wiki_pages_attachments: Xóa tệp đính kèm + permission_protect_wiki_pages: Bảo vệ trang wiki + permission_manage_repository: Quản lý kho lưu trữ + permission_browse_repository: Duyệt kho lưu trữ + permission_view_changesets: Xem các thay đổi + permission_commit_access: Truy cập commit + permission_manage_boards: Quản lý diễn đàn + permission_view_messages: Xem bài viết + permission_add_messages: Gửi bài viết + permission_edit_messages: Sửa bài viết + permission_edit_own_messages: Sửa bài viết cá nhân + permission_delete_messages: Xóa bài viết + permission_delete_own_messages: Xóa bài viết cá nhân + label_example: Ví dụ + text_repository_usernames_mapping: "Lựa chọn hoặc cập nhật ánh xạ người dùng hệ thống với người dùng trong kho lưu trữ.\nKhi người dùng trùng hợp về tên và email sẽ được tự động ánh xạ." + permission_delete_own_messages: Xóa thông điệp + label_user_activity: "%{value} hoạt động" + label_updated_time_by: "Cập nhật bởi %{author} cách đây %{age}" + text_diff_truncated: '... Thay đổi này đã được cắt bớt do nó vượt qua giới hạn kích thước có thể hiển thị.' + setting_diff_max_lines_displayed: Số dòng thay đổi tối đa được hiển thị + text_plugin_assets_writable: Cho phép ghi thư mục Plugin + warning_attachments_not_saved: "%{count} file không được lưu." + button_create_and_continue: Tạo và tiếp tục + text_custom_field_possible_values_info: 'Một dòng cho mỗi giá trị' + label_display: Hiển thị + field_editable: Có thể sửa được + setting_repository_log_display_limit: Số lượng tối đa các bản điều chỉnh hiển thị trong file log + setting_file_max_size_displayed: Kích thước tối đa của tệp tin văn bản + field_watcher: Người quan sát + setting_openid: Cho phép đăng nhập và đăng ký dùng OpenID + field_identity_url: OpenID URL + label_login_with_open_id_option: hoặc đăng nhập với OpenID + field_content: Nội dung + label_descending: Giảm dần + label_sort: Sắp xếp + label_ascending: Tăng dần + label_date_from_to: "Từ %{start} tới %{end}" + label_greater_or_equal: ">=" + label_less_or_equal: "<=" + text_wiki_page_destroy_question: "Trang này có %{descendants} trang con và trang cháu. Bạn muốn làm gì tiếp?" + text_wiki_page_reassign_children: Gán lại trang con vào trang mẹ này + text_wiki_page_nullify_children: Giữ trang con như trang gốc + text_wiki_page_destroy_children: Xóa trang con và tất cả trang con cháu của nó + setting_password_min_length: Chiều dài tối thiểu của mật khẩu + field_group_by: Nhóm kết quả bởi + mail_subject_wiki_content_updated: "%{id} trang wiki đã được cập nhật" + label_wiki_content_added: Đã thêm trang Wiki + mail_subject_wiki_content_added: "%{id} trang wiki đã được thêm vào" + mail_body_wiki_content_added: "Có %{id} trang wiki đã được thêm vào bởi %{author}." + label_wiki_content_updated: Trang Wiki đã được cập nhật + mail_body_wiki_content_updated: "Có %{id} trang wiki đã được cập nhật bởi %{author}." + permission_add_project: Tạo dự án + setting_new_project_user_role_id: Quyền được gán cho người dùng không phải quản trị viên khi tạo dự án mới + label_view_all_revisions: Xem tất cả bản điều chỉnh + label_tag: Thẻ + label_branch: Nhánh + error_no_tracker_in_project: Không có ai theo dõi dự án này. Hãy kiểm tra lại phần thiết lập cho dự án. + error_no_default_issue_status: Không có vấn đề mặc định được định nghĩa. Vui lòng kiểm tra cấu hình của bạn (Vào "Quản trị -> Trạng thái vấn đề"). + text_journal_changed: "%{label} thay đổi từ %{old} tới %{new}" + text_journal_set_to: "%{label} gán cho %{value}" + text_journal_deleted: "%{label} xóa (%{old})" + label_group_plural: Các nhóm + label_group: Nhóm + label_group_new: Thêm nhóm + label_time_entry_plural: Thời gian đã sử dụng + text_journal_added: "%{label} %{value} được thêm" + field_active: Tích cực + enumeration_system_activity: Hoạt động hệ thống + permission_delete_issue_watchers: Xóa người quan sát + version_status_closed: đóng + version_status_locked: khóa + version_status_open: mở + error_can_not_reopen_issue_on_closed_version: Một vấn đề được gán cho phiên bản đã đóng không thể mở lại được + label_user_anonymous: Ẩn danh + button_move_and_follow: Di chuyển và theo + setting_default_projects_modules: Các Module được kích hoạt mặc định cho dự án mới + setting_gravatar_default: Ảnh Gravatar mặc định + field_sharing: Chia sẻ + label_version_sharing_hierarchy: Với thứ bậc dự án + label_version_sharing_system: Với tất cả dự án + label_version_sharing_descendants: Với dự án con + label_version_sharing_tree: Với cây dự án + label_version_sharing_none: Không chia sẻ + error_can_not_archive_project: Dựa án này không thể lưu trữ được + button_duplicate: Nhân đôi + button_copy_and_follow: Sao chép và theo + label_copy_source: Nguồn + setting_issue_done_ratio: Tính toán tỷ lệ hoàn thành vấn đề với + setting_issue_done_ratio_issue_status: Sử dụng trạng thái của vấn đề + error_issue_done_ratios_not_updated: Tỷ lệ hoàn thành vấn đề không được cập nhật. + error_workflow_copy_target: Vui lòng lựa chọn đích của theo dấu và quyền + setting_issue_done_ratio_issue_field: Dùng trường vấn đề + label_copy_same_as_target: Tương tự như đích + label_copy_target: Đích + notice_issue_done_ratios_updated: Tỷ lệ hoàn thành vấn đề được cập nhật. + error_workflow_copy_source: Vui lòng lựa chọn nguồn của theo dấu hoặc quyền + label_update_issue_done_ratios: Cập nhật tỷ lệ hoàn thành vấn đề + setting_start_of_week: Định dạng lịch + permission_view_issues: Xem Vấn đề + label_display_used_statuses_only: Chỉ hiển thị trạng thái đã được dùng bởi theo dõi này + label_revision_id: "Bản điều chỉnh %{value}" + label_api_access_key: Khoá truy cập API + label_api_access_key_created_on: "Khoá truy cập API đựơc tạo cách đây %{value}. Khóa này được dùng cho eDesignLab Client." + label_feeds_access_key: Khoá truy cập Atom + notice_api_access_key_reseted: Khoá truy cập API của bạn đã được đặt lại. + setting_rest_api_enabled: Cho phép dịch vụ web REST + label_missing_api_access_key: Mất Khoá truy cập API + label_missing_feeds_access_key: Mất Khoá truy cập Atom + button_show: Hiện + text_line_separated: Nhiều giá trị được phép(mỗi dòng một giá trị). + setting_mail_handler_body_delimiters: "Cắt bớt email sau những dòng :" + permission_add_subprojects: Tạo Dự án con + label_subproject_new: Thêm dự án con + text_own_membership_delete_confirmation: |- + Bạn đang cố gỡ bỏ một số hoặc tất cả quyền của bạn với dự án này và có thể sẽ mất quyền thay đổi nó sau đó. + Bạn có muốn tiếp tục? + label_close_versions: Đóng phiên bản đã hoàn thành + label_board_sticky: Chú ý + label_board_locked: Đã khóa + permission_export_wiki_pages: Xuất trang wiki + setting_cache_formatted_text: Cache định dạng các ký tự + permission_manage_project_activities: Quản lý hoạt động của dự án + error_unable_delete_issue_status: Không thể xóa trạng thái vấn đề + label_profile: Hồ sơ + permission_manage_subtasks: Quản lý tác vụ con + field_parent_issue: Tác vụ cha + label_subtask_plural: Tác vụ con + label_project_copy_notifications: Gửi email thông báo trong khi dự án được sao chép + error_can_not_delete_custom_field: Không thể xóa trường tùy biến + error_unable_to_connect: "Không thể kết nối (%{value})" + error_can_not_remove_role: Quyền này đang được dùng và không thể xóa được. + error_can_not_delete_tracker: Theo dõi này chứa vấn đề và không thể xóa được. + field_principal: Chủ yếu + notice_failed_to_save_members: "Thất bại khi lưu thành viên : %{errors}." + text_zoom_out: Thu nhỏ + text_zoom_in: Phóng to + notice_unable_delete_time_entry: Không thể xóa mục time log. + label_overall_spent_time: Tổng thời gian sử dụng + field_time_entries: Log time + project_module_gantt: Biểu đồ Gantt + project_module_calendar: Lịch + button_edit_associated_wikipage: "Chỉnh sửa trang Wiki liên quan: %{page_title}" + text_are_you_sure_with_children: Xóa vấn đề và tất cả vấn đề con? + field_text: Trường văn bản + setting_default_notification_option: Tuỳ chọn thông báo mặc định + label_user_mail_option_only_my_events: Chỉ những thứ tôi theo dõi hoặc liên quan + label_user_mail_option_none: Không có sự kiện + field_member_of_group: Nhóm thụ hưởng + field_assigned_to_role: Quyền thụ hưởng + notice_not_authorized_archived_project: Dự án bạn đang có truy cập đã được lưu trữ. + label_principal_search: "Tìm kiếm người dùng hoặc nhóm:" + label_user_search: "Tìm kiếm người dùng:" + field_visible: Nhìn thấy + setting_emails_header: Tiêu đề Email + setting_commit_logtime_activity_id: Cho phép ghi lại thời gian + text_time_logged_by_changeset: "Áp dụng trong changeset : %{value}." + setting_commit_logtime_enabled: Cho phép time logging + notice_gantt_chart_truncated: "Đồ thị đã được cắt bớt bởi vì nó đã vượt qua lượng thông tin tối đa có thể hiển thị :(%{max})" + setting_gantt_items_limit: Lượng thông tin tối đa trên đồ thị gantt + description_selected_columns: Các cột được lựa chọn + field_warn_on_leaving_unsaved: Cảnh báo tôi khi rời một trang có các nội dung chưa lưu + text_warn_on_leaving_unsaved: Trang hiện tại chứa nội dung chưa lưu và sẽ bị mất nếu bạn rời trang này. + label_my_queries: Các truy vấn tùy biến + text_journal_changed_no_detail: "%{label} cập nhật" + label_news_comment_added: Bình luận đã được thêm cho một tin tức + button_expand_all: Mở rộng tất cả + button_collapse_all: Thu gọn tất cả + label_additional_workflow_transitions_for_assignee: Chuyển đổi bổ sung cho phép khi người sử dụng là người nhận chuyển nhượng + label_additional_workflow_transitions_for_author: Các chuyển đổi bổ xung được phép khi người dùng là tác giả + label_bulk_edit_selected_time_entries: Sửa nhiều mục đã chọn + text_time_entries_destroy_confirmation: Bạn có chắc chắn muốn xóa bỏ các mục đã chọn? + label_role_anonymous: Ẩn danh + label_role_non_member: Không là thành viên + label_issue_note_added: Ghi chú được thêm + label_issue_status_updated: Trạng thái cập nhật + label_issue_priority_updated: Cập nhật ưu tiên + label_issues_visibility_own: Vấn đề tạo bởi hoặc gán cho người dùng + field_issues_visibility: Vấn đề được nhìn thấy + label_issues_visibility_all: Tất cả vấn đề + permission_set_own_issues_private: Đặt vấn đề sở hữu là riêng tư hoặc công cộng + field_is_private: Riêng tư + permission_set_issues_private: Gán vấn đề là riêng tư hoặc công cộng + label_issues_visibility_public: Tất cả vấn đề không riêng tư + text_issues_destroy_descendants_confirmation: "Hành động này sẽ xóa %{count} tác vụ con." + field_commit_logs_encoding: Mã hóa ghi chú Commit + field_scm_path_encoding: Mã hóa đường dẫn + text_scm_path_encoding_note: "Mặc định: UTF-8" + field_path_to_repository: Đường dẫn tới kho chứa + field_root_directory: Thư mục gốc + field_cvs_module: Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: Kho chứa cục bộ (vd. /hgrepo, c:\hgrepo) + text_scm_command: Lệnh + text_scm_command_version: Phiên bản + label_git_report_last_commit: Báo cáo lần Commit cuối cùng cho file và thư mục + text_scm_config: Bạn có thể cấu hình lệnh Scm trong file config/configuration.yml. Vui lòng khởi động lại ứng dụng sau khi chỉnh sửa nó. + text_scm_command_not_available: Lệnh Scm không có sẵn. Vui lòng kiểm tra lại thiết đặt trong phần Quản trị. + notice_issue_successful_create: "Vấn đề %{id} đã được tạo." + label_between: Ở giữa + setting_issue_group_assignment: Cho phép gán vấn đề đến các nhóm + label_diff: Sự khác nhau + text_git_repository_note: Kho chứa cục bộ và công cộng (vd. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Chiều sắp xếp + description_project_scope: Phạm vi tìm kiếm + description_filter: Lọc + description_user_mail_notification: Thiết lập email thông báo + description_message_content: Nội dung thông điệp + description_available_columns: Các cột có sẵn + description_issue_category_reassign: Chọn danh mục vấn đề + description_search: Trường tìm kiếm + description_notes: Các chú ý + description_choose_project: Các dự án + description_query_sort_criteria_attribute: Sắp xếp thuộc tính + description_wiki_subpages_reassign: Chọn một trang cấp trên + label_parent_revision: Cha + label_child_revision: Con + error_scm_annotate_big_text_file: Các mục không được chú thích, vì nó vượt quá kích thước tập tin văn bản tối đa. + setting_default_issue_start_date_to_creation_date: Sử dụng thời gian hiện tại khi tạo vấn đề mới + button_edit_section: Soạn thảo sự lựa chọn này + setting_repositories_encodings: Mã hóa kho chứa + description_all_columns: Các cột + button_export: Export + label_export_options: "%{export_format} tùy chọn Export" + error_attachment_too_big: "File này không thể tải lên vì nó vượt quá kích thước cho phép : (%{max_size})" + notice_failed_to_save_time_entries: "Lỗi khi lưu %{count} lần trên %{total} sự lựa chọn : %{ids}." + label_x_issues: + zero: 0 vấn đề + one: 1 vấn đề + other: "%{count} vấn đề" + label_repository_new: Kho lưu trữ mới + field_repository_is_default: Kho lưu trữ chính + label_copy_attachments: Copy các file đính kèm + label_item_position: "%{position}/%{count}" + label_completed_versions: Các phiên bản hoàn thành + text_project_identifier_info: Chỉ cho phép chữ cái thường (a-z), con số và dấu gạch ngang.
    Sau khi lưu, chỉ số ID không thể thay đổi. + field_multiple: Nhiều giá trị + setting_commit_cross_project_ref: Sử dụng thời gian hiện tại khi tạo vấn đề mới + text_issue_conflict_resolution_add_notes: Thêm ghi chú của tôi và loại bỏ các thay đổi khác + text_issue_conflict_resolution_overwrite: Áp dụng thay đổi bằng bất cứ giá nào, ghi chú trước đó có thể bị ghi đè + notice_issue_update_conflict: Vấn đề này đã được cập nhật bởi một người dùng khác trong khi bạn đang chỉnh sửa nó. + text_issue_conflict_resolution_cancel: "Loại bỏ tất cả các thay đổi và hiển thị lại %{link}" + permission_manage_related_issues: Quản lý các vấn đề liên quan + field_auth_source_ldap_filter: Bộ lọc LDAP + label_search_for_watchers: Tìm kiếm người theo dõi để thêm + notice_account_deleted: Tài khoản của bạn đã được xóa vĩnh viễn. + button_delete_my_account: Xóa tài khoản của tôi + setting_unsubscribe: Cho phép người dùng xóa Account + text_account_destroy_confirmation: |- + Bạn đồng ý không ? + Tài khoản của bạn sẽ bị xóa vĩnh viễn, không thể khôi phục lại! + error_session_expired: Phiên làm việc của bạn bị quá hạn, hãy đăng nhập lại + text_session_expiration_settings: "Chú ý : Thay đổi các thiết lập này có thể gây vô hiệu hóa Session hiện tại" + setting_session_lifetime: Thời gian tồn tại lớn nhất của Session + setting_session_timeout: Thời gian vô hiệu hóa Session + label_session_expiration: Phiên làm việc bị quá hạn + permission_close_project: Đóng / Mở lại dự án + label_show_closed_projects: Xem các dự án đã đóng + button_close: Đóng + button_reopen: Mở lại + project_status_active: Kích hoạt + project_status_closed: Đã đóng + project_status_archived: Lưu trữ + text_project_closed: Dự án này đã đóng và chỉ đọc + notice_user_successful_create: "Người dùng %{id} đã được tạo." + field_core_fields: Các trường tiêu chuẩn + field_timeout: Quá hạn + setting_thumbnails_enabled: Hiển thị các thumbnail đính kèm + setting_thumbnails_size: Kích thước Thumbnails(pixel) + setting_session_lifetime: Thời gian tồn tại lớn nhất của Session + setting_session_timeout: Thời gian vô hiệu hóa Session + label_status_transitions: Trạng thái chuyển tiếp + label_fields_permissions: Cho phép các trường + label_readonly: Chỉ đọc + label_required: Yêu cầu + text_repository_identifier_info: Chỉ có các chữ thường (a-z), các số (0-9), dấu gạch ngang và gạch dưới là hợp lệ.
    Khi đã lưu, tên định danh sẽ không thể thay đổi. + field_board_parent: Diễn đàn cha + label_attribute_of_project: "Của dự án : %{name}" + label_attribute_of_author: "Của tác giả : %{name}" + label_attribute_of_assigned_to: "Được phân công bởi %{name}" + label_attribute_of_fixed_version: "Phiên bản mục tiêu của %{name}" + label_copy_subtasks: Sao chép các nhiệm vụ con + label_copied_to: Sao chép đến + label_copied_from: Sao chép từ + label_any_issues_in_project: Bất kỳ vấn đề nào trong dự án + label_any_issues_not_in_project: Bất kỳ vấn đề nào không thuộc dự án + field_private_notes: Ghi chú riêng tư + permission_view_private_notes: Xem ghi chú riêng tư + permission_set_notes_private: Đặt ghi chú thành riêng tư + label_no_issues_in_project: Không có vấn đề nào trong dự án + label_any: tất cả + label_last_n_weeks: "%{count} tuần qua" + setting_cross_project_subtasks: Cho phép các nhiệm vụ con liên dự án + label_cross_project_descendants: Trong các dự án con + label_cross_project_tree: Trong cùng cây dự án + label_cross_project_hierarchy: Trong dự án cùng cấp bậc + label_cross_project_system: Trong tất cả các dự án + button_hide: Ẩn + setting_non_working_week_days: Các ngày không làm việc + label_in_the_next_days: Trong tương lai + label_in_the_past_days: Trong quá khứ + label_attribute_of_user: "Của người dùng %{name}" + text_turning_multiple_off: Nếu bạn vô hiệu hóa nhiều giá trị, chúng sẽ bị loại bỏ để duy trì chỉ có một giá trị cho mỗi mục. + label_attribute_of_issue: "Vấn đề của %{name}" + permission_add_documents: Thêm tài liệu + permission_edit_documents: Soạn thảo tài liệu + permission_delete_documents: Xóa tài liệu + label_gantt_progress_line: Tiến độ + setting_jsonp_enabled: Cho phép trợ giúp JSONP + field_inherit_members: Các thành viên kế thừa + field_closed_on: Đã đóng + field_generate_password: Generate password + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: Tổng cộng + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) + label_link: Link + label_only: only + label_drop_down_list: drop-down list + label_checkboxes: checkboxes + label_link_values_to: Link values to URL + setting_force_default_language_for_anonymous: Force default language for anonymous + users + setting_force_default_language_for_loggedin: Force default language for logged-in + users + label_custom_field_select_type: Select the type of object to which the custom field + is to be attached + label_issue_assigned_to_updated: Assignee updated + label_check_for_updates: Check for updates + label_latest_compatible_version: Latest compatible version + label_unknown_plugin: Unknown plugin + label_radio_buttons: radio buttons + label_group_anonymous: Anonymous users + label_group_non_member: Non member users + label_add_projects: Add projects + field_default_status: Default status + text_subversion_repository_note: 'Examples: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: Users visibility + label_users_visibility_all: All active users + label_users_visibility_members_of_visible_projects: Members of visible projects + label_edit_attachments: Edit attached files + setting_link_copied_issue: Link issues on copy + label_link_copied_issue: Link copied issue + label_ask: Ask + label_search_attachments_yes: Search attachment filenames and descriptions + label_search_attachments_no: Do not search attachments + label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only + field_address: Email + setting_max_additional_emails: Maximum number of additional email addresses + label_email_address_plural: Emails + label_email_address_add: Add email address + label_enable_notifications: Enable notifications + label_disable_notifications: Disable notifications + setting_search_results_per_page: Search results per page + label_blank_value: blank + permission_copy_issues: Copy issues + error_password_expired: Your password has expired or the administrator requires you + to change it. + field_time_entries_visibility: Time logs visibility + setting_password_max_age: Require password change after + label_parent_task_attributes: Parent tasks attributes + label_parent_task_attributes_derived: Calculated from subtasks + label_parent_task_attributes_independent: Independent of subtasks + label_time_entries_visibility_all: All time entries + label_time_entries_visibility_own: Time entries created by the user + label_member_management: Member management + label_member_management_all_roles: All roles + label_member_management_selected_roles_only: Only these roles + label_password_required: Confirm your password to continue + label_total_spent_time: Tổng thời gian sử dụng + notice_import_finished: "%{count} items have been imported" + notice_import_finished_with_errors: "%{count} out of %{total} items could not be imported" + error_invalid_file_encoding: The file is not a valid %{encoding} encoded file + error_invalid_csv_file_or_settings: The file is not a CSV file or does not match the + settings below + error_can_not_read_import_file: An error occurred while reading the file to import + permission_import_issues: Import issues + label_import_issues: Import issues + label_select_file_to_import: Select the file to import + label_fields_separator: Field separator + label_fields_wrapper: Field wrapper + label_encoding: Encoding + label_comma_char: Comma + label_semi_colon_char: Semicolon + label_quote_char: Quote + label_double_quote_char: Double quote + label_fields_mapping: Fields mapping + label_file_content_preview: File content preview + label_create_missing_values: Create missing values + button_import: Import + field_total_estimated_hours: Total estimated time + label_api: API + label_total_plural: Totals + label_assigned_issues: Assigned issues + label_field_format_enumeration: Key/value list + label_f_hour_short: '%{value} h' + field_default_version: Default version + error_attachment_extension_not_allowed: Attachment extension %{extension} is not allowed + setting_attachment_extensions_allowed: Allowed extensions + setting_attachment_extensions_denied: Disallowed extensions + label_any_open_issues: any open issues + label_no_open_issues: no open issues + label_default_values_for_new_users: Default values for new users + error_ldap_bind_credentials: Invalid LDAP Account/Password + setting_sys_api_key: Mã số API + setting_lost_password: Phục hồi mật mã + mail_subject_security_notification: Security notification + mail_body_security_notification_change: ! '%{field} was changed.' + mail_body_security_notification_change_to: ! '%{field} was changed to %{value}.' + mail_body_security_notification_add: ! '%{field} %{value} was added.' + mail_body_security_notification_remove: ! '%{field} %{value} was removed.' + mail_body_security_notification_notify_enabled: Email address %{value} now receives + notifications. + mail_body_security_notification_notify_disabled: Email address %{value} no longer + receives notifications. + mail_body_settings_updated: ! 'The following settings were changed:' + field_remote_ip: IP address + label_wiki_page_new: New wiki page + label_relations: Relations + button_filter: Filter + mail_body_password_updated: Your password has been changed. + label_no_preview: No preview available + error_no_tracker_allowed_for_new_issue_in_project: The project doesn't have any trackers + for which you can create an issue + label_tracker_all: All trackers + label_new_project_issue_tab_enabled: Display the "New issue" tab + setting_new_item_menu_tab: Project menu tab for creating new objects + label_new_object_tab_enabled: Display the "+" drop-down + error_no_projects_with_tracker_allowed_for_new_issue: There are no projects with trackers + for which you can create an issue + field_textarea_font: Font used for text areas + label_font_default: Default font + label_font_monospace: Monospaced font + label_font_proportional: Proportional font + setting_timespan_format: Time span format + label_table_of_contents: Table of contents + setting_commit_logs_formatting: Apply text formatting to commit messages + setting_mail_handler_enable_regex_delimiters: Enable regular expressions + error_move_of_child_not_possible: 'Subtask %{child} could not be moved to the new + project: %{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: Spent time cannot + be reassigned to an issue that is about to be deleted + setting_timelog_required_fields: Required fields for time logs + label_attribute_of_object: '%{object_name}''s %{name}' + label_user_mail_option_only_assigned: Only for things I watch or I am assigned to + label_user_mail_option_only_owner: Only for things I watch or I am the owner of + warning_fields_cleared_on_bulk_edit: Changes will result in the automatic deletion + of values from one or more fields on the selected objects + field_updated_by: Updated by + field_last_updated_by: Last updated by + field_full_width_layout: Full width layout + label_last_notes: Last notes + field_digest: Checksum + field_default_assigned_to: Default assignee + setting_show_custom_fields_on_registration: Show custom fields on registration + permission_view_news: View news + label_no_preview_alternative_html: No preview available. %{link} the file instead. + label_no_preview_download: Download diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml new file mode 100644 index 0000000..5f0389f --- /dev/null +++ b/config/locales/zh-TW.yml @@ -0,0 +1,1297 @@ +# Chinese (Taiwan) translations for Ruby on Rails +# by tsechingho (http://github.com/tsechingho) +# See http://github.com/svenfuchs/rails-i18n/ for details. + +"zh-TW": + direction: ltr + jquery: + locale: "zh-TW" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b%d日" + long: "%Y年%b%d日" + + day_names: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] + abbr_day_names: [日, 一, 二, 三, 四, 五, 六] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + # 使用於 date_select 與 datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y年%b%d日 %A %H:%M:%S %Z" + time: "%H:%M" + short: "%b%d日 %H:%M" + long: "%Y年%b%d日 %H:%M" + am: "AM" + pm: "PM" + +# 使用於 array.to_sentence. + support: + array: + words_connector: ", " + two_words_connector: " 和 " + last_word_connector: ", 和 " + sentence_connector: "且" + skip_last_comma: false + + number: + # 使用於 number_with_delimiter() + # 同時也是 'currency', 'percentage', 'precision', 與 'human' 的預設值 + format: + # 設定小數點分隔字元,以使用更高的準確度 (例如: 1.0 / 2.0 == 0.5) + separator: "." + # 千分位符號 (例如:一百萬是 1,000,000) (均以三個位數來分組) + delimiter: "," + # 小數點分隔字元後之精確位數 (數字 1 搭配 2 位精確位數為: 1.00) + precision: 3 + + # 使用於 number_to_currency() + currency: + format: + # 貨幣符號的位置? %u 是貨幣符號, %n 是數值 (預設值: $5.00) + format: "%u%n" + unit: "NT$" + # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 + separator: "." + delimiter: "," + precision: 2 + + # 使用於 number_to_percentage() + percentage: + format: + # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 + # separator: + delimiter: "" + # precision: + + # 使用於 number_to_precision() + precision: + format: + # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 + # separator: + delimiter: "" + # precision: + + # 使用於 number_to_human_size() + human: + format: + # 下列三個選項設定, 若有設定值將會取代 number.format 成為預設值 + # separator: + delimiter: "" + precision: 3 + # 儲存單位輸出格式. + # %u 是儲存單位, %n 是數值 (預設值: 2 MB) + storage_units: + format: "%n %u" + units: + byte: + one: "位元組 (B)" + other: "位元組 (B)" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + # 使用於 distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "半分鐘" + less_than_x_seconds: + one: "小於 1 秒" + other: "小於 %{count} 秒" + x_seconds: + one: "1 秒" + other: "%{count} 秒" + less_than_x_minutes: + one: "小於 1 分鐘" + other: "小於 %{count} 分鐘" + x_minutes: + one: "1 分鐘" + other: "%{count} 分鐘" + about_x_hours: + one: "約 1 小時" + other: "約 %{count} 小時" + x_hours: + one: "1 小時" + other: "%{count} 小時" + x_days: + one: "1 天" + other: "%{count} 天" + about_x_months: + one: "約 1 個月" + other: "約 %{count} 個月" + x_months: + one: "1 個月" + other: "%{count} 個月" + about_x_years: + one: "約 1 年" + other: "約 %{count} 年" + over_x_years: + one: "超過 1 年" + other: "超過 %{count} 年" + almost_x_years: + one: "將近 1 年" + other: "將近 %{count} 年" + prompts: + year: "年" + month: "月" + day: "日" + hour: "時" + minute: "分" + second: "秒" + + activerecord: + errors: + template: + header: + one: "有 1 個錯誤發生使得「%{model}」無法被儲存。" + other: "有 %{count} 個錯誤發生使得「%{model}」無法被儲存。" + # The variable :count is also available + body: "下面所列欄位有問題:" + # The values :model, :attribute and :value are always available for interpolation + # The value :count is available when applicable. Can be used for pluralization. + messages: + inclusion: "沒有包含在列表中" + exclusion: "是被保留的" + invalid: "是無效的" + confirmation: "不符合確認值" + accepted: "必须是可被接受的" + empty: "不能留空" + blank: "不能是空白字元" + too_long: "過長(最長是 %{count} 個字)" + too_short: "過短(最短是 %{count} 個字)" + wrong_length: "字數錯誤(必須是 %{count} 個字)" + taken: "已經被使用" + not_a_number: "不是數字" + greater_than: "必須大於 %{count}" + greater_than_or_equal_to: "必須大於或等於 %{count}" + equal_to: "必須等於 %{count}" + less_than: "必須小於 %{count}" + less_than_or_equal_to: "必須小於或等於 %{count}" + odd: "必須是奇數" + even: "必須是偶數" + # Append your own errors here or at the model/attributes scope. + greater_than_start_date: "必須在開始日期之後" + not_same_project: "不屬於同一個專案" + circular_dependency: "這個關聯會導致環狀相依" + cant_link_an_issue_with_a_descendant: "議題無法被連結至自己的子任務" + earlier_than_minimum_start_date: "不能早於 %{date} 因為有前置議題" + not_a_regexp: "is not a valid regular expression" + open_issue_with_closed_parent: "An open issue cannot be attached to a closed parent task" + + # You can define own errors for models or model attributes. + # The values :model, :attribute and :value are always available for interpolation. + # + # For example, + # models: + # user: + # blank: "This is a custom blank message for %{model}: %{attribute}" + # attributes: + # login: + # blank: "This is a custom blank message for User login" + # Will define custom blank validation message for User model and + # custom blank validation message for login attribute of User model. + #models: + + # Translate model names. Used in Model.human_name(). + #models: + # For example, + # user: "Dude" + # will translate User model name to "Dude" + + # Translate model attribute names. Used in Model.human_attribute_name(attribute). + #attributes: + # For example, + # user: + # login: "Handle" + # will translate User attribute "login" as "Handle" + + actionview_instancetag_blank_option: 請選擇 + + general_text_No: '否' + general_text_Yes: '是' + general_text_no: '否' + general_text_yes: '是' + general_lang_name: 'Traditional Chinese (繁體中文)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: Big5 + general_pdf_fontname: msungstdlight + general_pdf_monospaced_fontname: msungstdlight + general_first_day_of_week: '7' + + notice_account_updated: 帳戶更新資訊已儲存 + notice_account_invalid_credentials: 帳戶或密碼不正確 + notice_account_password_updated: 帳戶新密碼已儲存 + notice_account_wrong_password: 密碼不正確 + notice_account_register_done: 帳號已建立成功。欲啟用您的帳號,請點擊系統確認信函中的啟用連結。 + notice_account_unknown_email: 未知的使用者 + notice_account_not_activated_yet: 您尚未完成啟用您的帳號。若您要索取新的帳號啟用 Email ,請 點擊此連結 。 + notice_account_locked: 您的帳號已被鎖定。 + notice_can_t_change_password: 這個帳號使用外部認證方式,無法變更其密碼。 + notice_account_lost_email_sent: 包含選擇新密碼指示的電子郵件,已經寄出給您。 + notice_account_activated: 您的帳號已經啟用,可用它登入系統。 + notice_successful_create: 建立成功 + notice_successful_update: 更新成功 + notice_successful_delete: 刪除成功 + notice_successful_connection: 連線成功 + notice_file_not_found: 您想要存取的頁面已經不存在或被搬移至其他位置。 + notice_locking_conflict: 資料已被其他使用者更新。 + notice_not_authorized: 你未被授權存取此頁面。 + notice_not_authorized_archived_project: 您欲存取的專案已經被封存。 + notice_email_sent: "郵件已經成功寄送至以下收件者: %{value}" + notice_email_error: "寄送郵件的過程中發生錯誤 (%{value})" + notice_feeds_access_key_reseted: 您的 Atom 存取金鑰已被重新設定。 + notice_api_access_key_reseted: 您的 API 存取金鑰已被重新設定。 + notice_failed_to_save_issues: "無法儲存 %{count} 議題到下列所選取的 %{total} 個項目中: %{ids}。" + notice_failed_to_save_time_entries: "無法儲存 %{count} 個工時到下列所選取的 %{total} 個項目中: %{ids}。" + notice_failed_to_save_members: "成員儲存失敗: %{errors}." + notice_no_issue_selected: "未選擇任何議題!請勾選您想要編輯的議題。" + notice_account_pending: "您的帳號已經建立,正在等待管理員的審核。" + notice_default_data_loaded: 預設組態已載入成功。 + notice_unable_delete_version: 無法刪除版本。 + notice_unable_delete_time_entry: 無法刪除工時記錄項目。 + notice_issue_done_ratios_updated: 議題完成百分比已更新。 + notice_gantt_chart_truncated: "由於項目數量超過可顯示數量的最大值 (%{max}),故此甘特圖尾部已被截斷" + notice_issue_successful_create: "議題 %{id} 已建立。" + notice_issue_update_conflict: "當您正在編輯這個議題的時候,它已經被其他人搶先一步更新過。" + notice_account_deleted: "您的帳戶已被永久刪除。" + notice_user_successful_create: "已建立用戶 %{id}。" + notice_new_password_must_be_different: 新舊密碼必須相異 + notice_import_finished: "已成功匯入所有的項目共 %{count} 個" + notice_import_finished_with_errors: "無法匯入 %{count} 個項目 (全部共 %{total} 個)" + + error_can_t_load_default_data: "無法載入預設組態: %{value}" + error_scm_not_found: "在儲存機制中找不到這個項目或修訂版。" + error_scm_command_failed: "嘗試存取儲存機制時發生錯誤: %{value}" + error_scm_annotate: "項目不存在或項目無法被加上附註。" + error_scm_annotate_big_text_file: 此項目無法被標註,因為它已經超過最大的文字檔大小。 + error_issue_not_found_in_project: '該議題不存在或不屬於此專案' + error_no_tracker_in_project: '此專案尚未指定追蹤標籤。請檢查專案的設定資訊。' + error_no_default_issue_status: '尚未定義議題狀態的預設值。請您前往「網站管理」->「議題狀態清單」頁面,檢查相關組態設定。' + error_can_not_delete_custom_field: 無法刪除自訂欄位 + error_can_not_delete_tracker: "此追蹤標籤已包含議題,無法被刪除。" + error_can_not_remove_role: "此角色已被使用,無法將其刪除。" + error_can_not_reopen_issue_on_closed_version: '分派給「已結束」版本的議題,無法再將其狀態變更為「進行中」' + error_can_not_archive_project: 此專案無法被封存 + error_issue_done_ratios_not_updated: "議題完成百分比未更新。" + error_workflow_copy_source: '請選擇一個來源議題追蹤標籤或角色' + error_workflow_copy_target: '請選擇一個(或多個)目的議題追蹤標籤或角色' + error_unable_delete_issue_status: '無法刪除議題狀態' + error_unable_to_connect: "無法連線至(%{value})" + error_attachment_too_big: "這個檔案無法被上傳,因為它已經超過最大的檔案大小 (%{max_size})" + error_session_expired: "您的工作階段已經過期。請重新登入。" + warning_attachments_not_saved: "%{count} 個附加檔案無法被儲存。" + error_password_expired: "您的密碼已經過期或是管理員要求您變更密碼." + error_invalid_file_encoding: "這個檔案不是一個有效的 %{encoding} 編碼檔案" + error_invalid_csv_file_or_settings: "這個檔案不是一個 CSV 檔案,或是未符合下面所列之設定值" + error_can_not_read_import_file: "讀取匯入檔案時發生錯誤" + error_attachment_extension_not_allowed: "附件之附檔名不允許使用 %{extension}" + error_ldap_bind_credentials: "無效的 LDAP 帳號/密碼" + error_no_tracker_allowed_for_new_issue_in_project: "此專案沒有您可用來建立新議題的追蹤標籤" + error_no_projects_with_tracker_allowed_for_new_issue: "此追蹤標籤沒有您可用來建立新議題的專案" + error_move_of_child_not_possible: "子任務 %{child} 無法被搬移至新的專案: %{errors}" + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: "無法將耗用工時重新分配給即將被刪除的問題" + warning_fields_cleared_on_bulk_edit: "選取物件的變更將導致一個或多個欄位之內容值被自動刪除" + + mail_subject_lost_password: 您的 Redmine 網站密碼 + mail_body_lost_password: '欲變更您的 Redmine 網站密碼, 請點選以下鏈結:' + mail_subject_register: 啟用您的 Redmine 帳號 + mail_body_register: '欲啟用您的 Redmine 帳號, 請點選以下鏈結:' + mail_body_account_information_external: "您可以使用 %{value} 帳號登入 Redmine 網站。" + mail_body_account_information: 您的 Redmine 帳號資訊 + mail_subject_account_activation_request: Redmine 帳號啟用需求通知 + mail_body_account_activation_request: "有位新用戶 (%{value}) 已經完成註冊,正等候您的審核:" + mail_subject_reminder: "您有 %{count} 個議題即將到期 (%{days})" + mail_body_reminder: "%{count} 個分派給您的議題,將於 %{days} 天之內到期:" + mail_subject_wiki_content_added: "'%{id}' wiki 頁面已被新增" + mail_body_wiki_content_added: "此 '%{id}' wiki 頁面已被 %{author} 新增。" + mail_subject_wiki_content_updated: "'%{id}' wiki 頁面已被更新" + mail_body_wiki_content_updated: "此 '%{id}' wiki 頁面已被 %{author} 更新。" + mail_subject_security_notification: "安全性通知" + mail_body_security_notification_change: "%{field} 已變更。" + mail_body_security_notification_change_to: "%{field} 已變更為 %{value}。" + mail_body_security_notification_add: "%{field} %{value} 已新增。" + mail_body_security_notification_remove: "%{field} %{value} 已移除。" + mail_body_security_notification_notify_enabled: "電子郵件地址 %{value} 已開始接收通知。" + mail_body_security_notification_notify_disabled: "電子郵件地址 %{value} 已不再接收通知。" + mail_body_settings_updated: "下列設定已變更:" + mail_body_password_updated: "您的密碼已變更。" + + field_name: 名稱 + field_description: 概述 + field_summary: 摘要 + field_is_required: 必填 + field_firstname: 名字 + field_lastname: 姓氏 + field_mail: 電子郵件 + field_address: 電子郵件地址 + field_filename: 檔案名稱 + field_filesize: 大小 + field_downloads: 下載次數 + field_author: 作者 + field_created_on: 建立日期 + field_updated_on: 更新日期 + field_closed_on: 結束日期 + field_field_format: 格式 + field_is_for_all: 給全部的專案 + field_possible_values: 可能值 + field_regexp: 正規表示式 + field_min_length: 最小長度 + field_max_length: 最大長度 + field_value: 值 + field_category: 分類 + field_title: 標題 + field_project: 專案 + field_issue: 議題 + field_status: 狀態 + field_notes: 筆記 + field_is_closed: 議題已結束 + field_is_default: 預設值 + field_tracker: 追蹤標籤 + field_subject: 主旨 + field_due_date: 完成日期 + field_assigned_to: 被分派者 + field_priority: 優先權 + field_fixed_version: 版本 + field_user: 用戶 + field_principal: 原則 + field_role: 角色 + field_homepage: 網站首頁 + field_is_public: 公開 + field_parent: 父專案 + field_is_in_roadmap: 議題顯示於版本藍圖中 + field_login: 帳戶名稱 + field_mail_notification: 電子郵件提醒選項 + field_admin: 管理者 + field_last_login_on: 最近連線日期 + field_language: 語言 + field_effective_date: 日期 + field_password: 目前密碼 + field_new_password: 新密碼 + field_password_confirmation: 確認新密碼 + field_version: 版本 + field_type: Type + field_host: Host + field_port: 連接埠 + field_account: 帳戶 + field_base_dn: Base DN + field_attr_login: 登入屬性 + field_attr_firstname: 名字屬性 + field_attr_lastname: 姓氏屬性 + field_attr_mail: 電子郵件信箱屬性 + field_onthefly: 即時建立使用者 + field_start_date: 開始日期 + field_done_ratio: 完成百分比 + field_auth_source: 認證模式 + field_hide_mail: 隱藏我的電子郵件 + field_comments: 回應 + field_url: 網址 + field_start_page: 首頁 + field_subproject: 子專案 + field_hours: 小時 + field_activity: 活動 + field_spent_on: 日期 + field_identifier: 代碼 + field_is_filter: 用來作為篩選器 + field_issue_to: 相關議題 + field_delay: 逾期 + field_assignable: 議題可被分派至此角色 + field_redirect_existing_links: 重新導向現有連結 + field_estimated_hours: 預估工時 + field_column_names: 欄位 + field_time_entries: 耗用工時 + field_time_zone: 時區 + field_searchable: 可用做搜尋條件 + field_default_value: 預設值 + field_comments_sorting: 回應排序 + field_parent_title: 父頁面 + field_editable: 可編輯 + field_watcher: 觀察者 + field_identity_url: OpenID 網址 + field_content: 內容 + field_group_by: 結果分組方式 + field_sharing: 共用 + field_parent_issue: 父議題 + field_member_of_group: "被分派者的群組" + field_assigned_to_role: "被分派者的角色" + field_text: 內容文字 + field_visible: 可被看見 + field_warn_on_leaving_unsaved: "提醒我將要離開的頁面中尚有未儲存的資料" + field_issues_visibility: 議題可見度 + field_is_private: 私人 + field_commit_logs_encoding: 認可訊息編碼 + field_scm_path_encoding: 路徑編碼 + field_path_to_repository: 儲存機制路徑 + field_root_directory: 根資料夾 + field_cvsroot: CVSROOT + field_cvs_module: 模組 + field_repository_is_default: 主要儲存機制 + field_multiple: 多重值 + field_auth_source_ldap_filter: LDAP 篩選器 + field_core_fields: 標準欄位 + field_timeout: "逾時 (單位: 秒)" + field_board_parent: 父論壇 + field_private_notes: 私人筆記 + field_inherit_members: 繼承父專案成員 + field_generate_password: 產生密碼 + field_must_change_passwd: 必須在下次登入時變更密碼 + field_default_status: 預設狀態 + field_users_visibility: 用戶可見度 + field_time_entries_visibility: 工時紀錄可見度 + field_total_estimated_hours: 預估工時總計 + field_default_version: 預設版本 + field_remote_ip: IP 位址 + field_textarea_font: 文字區域使用的字型 + field_updated_by: 更新者 + field_last_updated_by: 上次更新者 + field_full_width_layout: 全寬度式版面配置 + field_digest: 總和檢查碼 + field_default_assigned_to: 預設被分派者 + + setting_app_title: 標題 + setting_app_subtitle: 副標題 + setting_welcome_text: 歡迎詞 + setting_default_language: 預設語言 + setting_login_required: 需要驗證 + setting_self_registration: 註冊選項 + setting_show_custom_fields_on_registration: 註冊時顯示自訂欄位 + setting_attachment_max_size: 附件大小限制 + setting_issues_export_limit: 議題匯出限制 + setting_mail_from: 寄件者電子郵件 + setting_bcc_recipients: 使用密件副本 (BCC) + setting_plain_text_mail: 純文字郵件 (不含 HTML) + setting_host_name: 主機名稱 + setting_text_formatting: 文字格式 + setting_wiki_compression: 壓縮 Wiki 歷史文章 + setting_feeds_limit: Atom 新聞限制 + setting_autofetch_changesets: 自動擷取認可 + setting_default_projects_public: 新建立之專案預設為「公開」 + setting_sys_api_enabled: 啟用管理儲存機制的網頁服務 (Web Service) + setting_commit_ref_keywords: 認可用於參照之關鍵字 + setting_commit_fix_keywords: 認可用於修正之關鍵字 + setting_autologin: 自動登入 + setting_date_format: 日期格式 + setting_time_format: 時間格式 + setting_timespan_format: 時間範圍格式 + setting_cross_project_issue_relations: 允許關聯至其它專案的議題 + setting_cross_project_subtasks: 允許跨專案的子任務 + setting_issue_list_default_columns: 預設顯示於議題清單的欄位 + setting_repositories_encodings: 附加檔案與儲存機制的編碼 + setting_emails_header: 電子郵件前頭說明 + setting_emails_footer: 電子郵件附帶說明 + setting_protocol: 協定 + setting_per_page_options: 每頁顯示個數選項 + setting_user_format: 用戶顯示格式 + setting_activity_days_default: 專案活動顯示天數 + setting_display_subprojects_issues: 預設於父專案中顯示子專案的議題 + setting_enabled_scm: 啟用的 SCM + setting_mail_handler_body_delimiters: "截去郵件中包含下列值之後的內容" + setting_mail_handler_enable_regex_delimiters: "啟用規則運算式" + setting_mail_handler_api_enabled: 啟用處理傳入電子郵件的服務 + setting_mail_handler_api_key: 傳入電子郵件網頁服務 API 金鑰 + setting_sys_api_key: 儲存機制管理網頁服務 API 金鑰 + setting_sequential_project_identifiers: 循序產生專案識別碼 + setting_gravatar_enabled: 啟用 Gravatar 全球認證大頭像 + setting_gravatar_default: 預設全球認證大頭像圖片 + setting_diff_max_lines_displayed: 差異顯示行數之最大值 + setting_file_max_size_displayed: 檔案內容顯示大小之最大值 + setting_repository_log_display_limit: 修訂版顯示數目之最大值 + setting_openid: 允許使用 OpenID 登入與註冊 + setting_password_max_age: 必須在多少天後變更密碼 + setting_password_min_length: 密碼最小長度 + setting_lost_password: 允許使用電子郵件重新設定密碼 + setting_new_project_user_role_id: 管理者以外之用戶建立新專案時,將被分派的角色 + setting_default_projects_modules: 新專案預設啟用的模組 + setting_issue_done_ratio: 計算議題完成百分比之方式 + setting_issue_done_ratio_issue_field: 依據議題完成百分比欄位 + setting_issue_done_ratio_issue_status: 依據議題狀態 + setting_start_of_week: 週的第一天 + setting_rest_api_enabled: 啟用 REST 網路服務技術(Web Service) + setting_cache_formatted_text: 快取已格式化文字 + setting_default_notification_option: 預設通知選項 + setting_commit_logtime_enabled: 啟用認可中的時間記錄 + setting_commit_logtime_activity_id: 時間記錄對應的活動 + setting_gantt_items_limit: 甘特圖中項目顯示數量的最大值 + setting_issue_group_assignment: 允許議題被分派至群組 + setting_default_issue_start_date_to_creation_date: 設定新議題的起始日期為今天的日期 + setting_commit_cross_project_ref: 允許關聯並修正其他專案的議題 + setting_unsubscribe: 允許用戶取消註冊(刪除帳戶) + setting_session_lifetime: 工作階段存留時間最大值 + setting_session_timeout: 工作階段無活動逾時時間 + setting_thumbnails_enabled: 顯示附加檔案的縮圖 + setting_thumbnails_size: "縮圖大小 (單位: 像素 pixels)" + setting_non_working_week_days: 非工作日 + setting_jsonp_enabled: 啟用 JSONP 支援 + setting_default_projects_tracker_ids: 新專案預設使用的追蹤標籤 + setting_mail_handler_excluded_filenames: 移除符合下列名稱的附件 + setting_force_default_language_for_anonymous: 強迫匿名用戶使用預設語言 + setting_force_default_language_for_loggedin: 強迫已登入用戶使用預設語言 + setting_link_copied_issue: 複製時連結議題 + setting_max_additional_emails: 其他電子郵件地址的最大值 + setting_search_results_per_page: 每一頁的搜尋結果數目 + setting_attachment_extensions_allowed: 允許使用的附檔名 + setting_attachment_extensions_denied: 禁止使用的副檔名 + setting_new_item_menu_tab: 建立新物件的專案功能分頁 + setting_commit_logs_formatting: 套用文字格式至認可訊息 + setting_timelog_required_fields: 工時記錄必填欄位 + + permission_add_project: 建立專案 + permission_add_subprojects: 建立子專案 + permission_edit_project: 編輯專案 + permission_close_project: 關閉 / 重新開啟專案 + permission_select_project_modules: 選擇專案模組 + permission_manage_members: 管理成員 + permission_manage_project_activities: 管理專案活動 + permission_manage_versions: 管理版本 + permission_manage_categories: 管理議題分類 + permission_view_issues: 檢視議題 + permission_add_issues: 新增議題 + permission_edit_issues: 編輯議題 + permission_copy_issues: 複製議題 + permission_manage_issue_relations: 管理議題關聯 + permission_set_issues_private: 設定議題為公開或私人 + permission_set_own_issues_private: 設定自己的議題為公開或私人 + permission_add_issue_notes: 新增筆記 + permission_edit_issue_notes: 編輯筆記 + permission_edit_own_issue_notes: 編輯自己的筆記 + permission_view_private_notes: 檢視私人筆記 + permission_set_notes_private: 設定筆記為私人筆記 + permission_move_issues: 搬移議題 + permission_delete_issues: 刪除議題 + permission_manage_public_queries: 管理公開查詢 + permission_save_queries: 儲存查詢 + permission_view_gantt: 檢視甘特圖 + permission_view_calendar: 檢視日曆 + permission_view_issue_watchers: 檢視監看者清單 + permission_add_issue_watchers: 新增監看者 + permission_delete_issue_watchers: 刪除監看者 + permission_log_time: 紀錄耗用工時 + permission_view_time_entries: 檢視耗用工時 + permission_edit_time_entries: 編輯工時紀錄 + permission_edit_own_time_entries: 編輯自己的工時記錄 + permission_view_news: 檢視新聞 + permission_manage_news: 管理新聞 + permission_comment_news: 回應新聞 + permission_view_documents: 檢視文件 + permission_add_documents: 新增文件 + permission_edit_documents: 編輯文件 + permission_delete_documents: 刪除文件 + permission_manage_files: 管理檔案 + permission_view_files: 檢視檔案 + permission_manage_wiki: 管理 wiki + permission_rename_wiki_pages: 重新命名 wiki 頁面 + permission_delete_wiki_pages: 刪除 wiki 頁面 + permission_view_wiki_pages: 檢視 wiki + permission_view_wiki_edits: 檢視 wiki 歷史 + permission_edit_wiki_pages: 編輯 wiki 頁面 + permission_delete_wiki_pages_attachments: 刪除附件 + permission_protect_wiki_pages: 專案 wiki 頁面 + permission_manage_repository: 管理儲存機制 + permission_browse_repository: 瀏覽儲存機制 + permission_view_changesets: 檢視變更集 + permission_commit_access: 存取認可 + permission_manage_boards: 管理討論版 + permission_view_messages: 檢視訊息 + permission_add_messages: 新增訊息 + permission_edit_messages: 編輯訊息 + permission_edit_own_messages: 編輯自己的訊息 + permission_delete_messages: 刪除訊息 + permission_delete_own_messages: 刪除自己的訊息 + permission_export_wiki_pages: 匯出 wiki 頁面 + permission_manage_subtasks: 管理子任務 + permission_manage_related_issues: 管理相關議題 + permission_import_issues: 匯入議題 + + project_module_issue_tracking: 議題追蹤 + project_module_time_tracking: 工時追蹤 + project_module_news: 新聞 + project_module_documents: 文件 + project_module_files: 檔案 + project_module_wiki: Wiki + project_module_repository: 版本控管 + project_module_boards: 討論區 + project_module_calendar: 日曆 + project_module_gantt: 甘特圖 + + label_user: 用戶 + label_user_plural: 用戶清單 + label_user_new: 建立新用戶 + label_user_anonymous: 匿名用戶 + label_project: 專案 + label_project_new: 建立新專案 + label_project_plural: 專案清單 + label_x_projects: + zero: 無專案 + one: 1 個專案 + other: "%{count} 個專案" + label_project_all: 全部的專案 + label_project_latest: 最近的專案 + label_issue: 議題 + label_issue_new: 建立新議題 + label_issue_plural: 議題清單 + label_issue_view_all: 檢視所有議題 + label_issues_by: "議題按 %{value} 分組顯示" + label_issue_added: 議題已新增 + label_issue_updated: 議題已更新 + label_issue_note_added: 筆記已新增 + label_issue_status_updated: 狀態已更新 + label_issue_assigned_to_updated: 被分派者已更新 + label_issue_priority_updated: 優先權已更新 + label_document: 文件 + label_document_new: 建立新文件 + label_document_plural: 文件 + label_document_added: 文件已新增 + label_role: 角色 + label_role_plural: 角色 + label_role_new: 建立新角色 + label_role_and_permissions: 角色與權限 + label_role_anonymous: 匿名者 + label_role_non_member: 非會員 + label_member: 成員 + label_member_new: 建立新成員 + label_member_plural: 成員 + label_tracker: 追蹤標籤 + label_tracker_plural: 追蹤標籤清單 + label_tracker_all: 所有的追蹤標籤 + label_tracker_new: 建立新的追蹤標籤 + label_workflow: 流程 + label_issue_status: 議題狀態 + label_issue_status_plural: 議題狀態清單 + label_issue_status_new: 建立新狀態 + label_issue_category: 議題分類 + label_issue_category_plural: 議題分類清單 + label_issue_category_new: 建立新分類 + label_custom_field: 自訂欄位 + label_custom_field_plural: 自訂欄位清單 + label_custom_field_new: 建立新自訂欄位 + label_enumerations: 列舉值清單 + label_enumeration_new: 建立新列舉值 + label_information: 資訊 + label_information_plural: 資訊 + label_please_login: 請先登入 + label_register: 註冊 + label_login_with_open_id_option: 或使用 OpenID 登入 + label_password_lost: 遺失密碼 + label_password_required: 確認您的密碼後繼續 + label_home: 網站首頁 + label_my_page: 帳戶首頁 + label_my_account: 我的帳戶 + label_my_projects: 我的專案 + label_administration: 網站管理 + label_login: 登入 + label_logout: 登出 + label_help: 說明 + label_reported_issues: 我通報的議題 + label_assigned_issues: 我被分派的議題 + label_assigned_to_me_issues: 分派給我的議題 + label_last_login: 最近一次連線 + label_registered_on: 註冊於 + label_activity: 活動 + label_overall_activity: 整體活動 + label_user_activity: "%{value} 的活動" + label_new: 建立新的... + label_logged_as: 目前登入 + label_environment: 環境 + label_authentication: 認證 + label_auth_source: 認證模式 + label_auth_source_new: 建立新認證模式 + label_auth_source_plural: 認證模式清單 + label_subproject_plural: 子專案 + label_subproject_new: 建立子專案 + label_and_its_subprojects: "%{value} 與其子專案" + label_min_max_length: 最小 - 最大 長度 + label_list: 清單 + label_date: 日期 + label_integer: 整數 + label_float: 浮點數 + label_boolean: 布林 + label_string: 文字 + label_text: 長文字 + label_attribute: 屬性 + label_attribute_plural: 屬性 + label_no_data: 沒有任何資料可供顯示 + label_no_preview: 無法預覽 + label_no_preview_alternative_html: 無法預覽. 請改為使用 %{link} 此檔案. + label_no_preview_download: 下載 + label_change_status: 變更狀態 + label_history: 歷史 + label_attachment: 檔案 + label_attachment_new: 建立新檔案 + label_attachment_delete: 刪除檔案 + label_attachment_plural: 檔案 + label_file_added: 檔案已新增 + label_report: 報告 + label_report_plural: 報告 + label_news: 新聞 + label_news_new: 建立新聞 + label_news_plural: 新聞 + label_news_latest: 最近新聞 + label_news_view_all: 檢視全部的新聞 + label_news_added: 新聞已新增 + label_news_comment_added: 回應已加入新聞 + label_settings: 設定 + label_overview: 概觀 + label_version: 版本 + label_version_new: 建立新版本 + label_version_plural: 版本 + label_close_versions: 結束已完成的版本 + label_confirmation: 確認 + label_export_to: 匯出至 + label_read: 讀取... + label_public_projects: 公開專案 + label_open_issues: 進行中 + label_open_issues_plural: 進行中 + label_closed_issues: 已結束 + label_closed_issues_plural: 已結束 + label_x_open_issues_abbr: + zero: 0 進行中 + one: 1 進行中 + other: "%{count} 進行中" + label_x_closed_issues_abbr: + zero: 0 已結束 + one: 1 已結束 + other: "%{count} 已結束" + label_x_issues: + zero: 0 個議題 + one: 1 個議題 + other: "%{count} 個議題" + label_total: 總計 + label_total_plural: 總計 + label_total_time: 工時總計 + label_permissions: 權限 + label_current_status: 目前狀態 + label_new_statuses_allowed: 可變更至以下狀態 + label_all: 全部 + label_any: 任意一個 + label_none: 空值 + label_nobody: 無名 + label_next: 下一頁 + label_previous: 上一頁 + label_used_by: 已使用專案 + label_details: 明細 + label_add_note: 加入一個新筆記 + label_calendar: 日曆 + label_months_from: 個月, 開始月份 + label_gantt: 甘特圖 + label_internal: 內部 + label_last_changes: "最近 %{count} 個變更" + label_change_view_all: 檢視全部的變更 + label_comment: 回應 + label_comment_plural: 回應 + label_x_comments: + zero: 無回應 + one: 1 個回應 + other: "%{count} 個回應" + label_comment_add: 加入新回應 + label_comment_added: 新回應已加入 + label_comment_delete: 刪除回應 + label_query: 自訂查詢 + label_query_plural: 自訂查詢 + label_query_new: 建立新查詢 + label_my_queries: 我的自訂查詢 + label_filter_add: 加入新篩選條件 + label_filter_plural: 篩選條件 + label_equals: 等於 + label_not_equals: 不等於 + label_in_less_than: 在小於 + label_in_more_than: 在大於 + label_in_the_next_days: 在未來幾天之內 + label_in_the_past_days: 在過去幾天之內 + label_greater_or_equal: "大於等於 (>=)" + label_less_or_equal: "小於等於 (<=)" + label_between: 區間 + label_in: 在 + label_today: 今天 + label_all_time: 全部 + label_yesterday: 昨天 + label_this_week: 本週 + label_last_week: 上週 + label_last_n_weeks: "過去 %{count} 週" + label_last_n_days: "過去 %{count} 天" + label_this_month: 這個月 + label_last_month: 上個月 + label_this_year: 今年 + label_date_range: 日期區間 + label_less_than_ago: 小於幾天之前 + label_more_than_ago: 大於幾天之前 + label_ago: 天以前 + label_contains: 包含 + label_not_contains: 不包含 + label_any_issues_in_project: 在專案中的任意議題 + label_any_issues_not_in_project: 不在專案中的任意議題 + label_no_issues_in_project: 沒有議題在專案中 + label_any_open_issues: 任意進行中之議題 + label_no_open_issues: 任意非進行中之議題 + label_day_plural: 天 + label_repository: 儲存機制 + label_repository_new: 建立新儲存機制 + label_repository_plural: 儲存機制清單 + label_browse: 瀏覽 + label_branch: 分支 + label_tag: 標籤 + label_revision: 修訂版 + label_revision_plural: 修訂版清單 + label_revision_id: "修訂版 %{value}" + label_associated_revisions: 關聯的修訂版 + label_added: 已新增 + label_modified: 已修改 + label_copied: 已複製 + label_renamed: 已重新命名 + label_deleted: 已刪除 + label_latest_revision: 最新的修訂版 + label_latest_revision_plural: 最新的修訂版清單 + label_view_revisions: 檢視修訂版清單 + label_view_all_revisions: 檢視所有的的修訂版清單 + label_max_size: 最大長度 + label_sort_highest: 移動至開頭 + label_sort_higher: 往上移動 + label_sort_lower: 往下移動 + label_sort_lowest: 移動至結尾 + label_roadmap: 版本藍圖 + label_roadmap_due_in: "剩餘 %{value}" + label_roadmap_overdue: "逾期 %{value}" + label_roadmap_no_issues: 此版本尚未包含任何議題 + label_search: 搜尋 + label_result_plural: 結果 + label_all_words: 包含全部的字詞 + label_wiki: Wiki + label_wiki_edit: Wiki 編輯 + label_wiki_edit_plural: Wiki 編輯 + label_wiki_page: Wiki 網頁 + label_wiki_page_plural: Wiki 網頁 + label_wiki_page_new: 新增 Wiki 頁面 + label_index_by_title: 依標題索引 + label_index_by_date: 依日期索引 + label_current_version: 現行版本 + label_preview: 預覽 + label_feed_plural: Feeds + label_changes_details: 所有變更的明細 + label_issue_tracking: 議題追蹤 + label_spent_time: 耗用工時 + label_total_spent_time: 耗用工時總計 + label_overall_spent_time: 整體耗用工時 + label_f_hour: "%{value} 小時" + label_f_hour_plural: "%{value} 小時" + label_f_hour_short: "%{value} 小時" + label_time_tracking: 工時追蹤 + label_change_plural: 變更 + label_statistics: 統計資訊 + label_commits_per_month: 依月份統計認可 + label_commits_per_author: 依作者統計認可 + label_view_diff: 檢視差異 + label_diff: 差異 + label_diff_inline: 直列 + label_diff_side_by_side: 並排 + label_options: 選項清單 + label_copy_workflow_from: 從以下追蹤標籤複製工作流程 + label_permissions_report: 權限報表 + label_watched_issues: 監看中的議題清單 + label_related_issues: 相關的議題清單 + label_applied_status: 已套用狀態 + label_loading: 載入中... + label_relation_new: 建立新關聯 + label_relation_delete: 刪除關聯 + label_relates_to: 關聯至 + label_duplicates: 已重複 + label_duplicated_by: 與後面所列議題重複 + label_blocks: 阻擋 + label_blocked_by: 被阻擋 + label_precedes: 優先於 + label_follows: 跟隨於 + label_copied_to: 複製到 + label_copied_from: 複製於 + label_stay_logged_in: 維持已登入狀態 + label_disabled: 關閉 + label_show_completed_versions: 顯示已完成的版本 + label_me: 我自己 + label_board: 論壇 + label_board_new: 建立新論壇 + label_board_plural: 論壇 + label_board_locked: 鎖定 + label_board_sticky: 置頂 + label_topic_plural: 討論主題 + label_message_plural: 訊息 + label_message_last: 上一封訊息 + label_message_new: 建立新訊息 + label_message_posted: 訊息已新增 + label_reply_plural: 回應 + label_send_information: 寄送帳戶資訊電子郵件給用戶 + label_year: 年 + label_month: 月 + label_week: 週 + label_date_from: 開始 + label_date_to: 結束 + label_language_based: 依用戶之語言決定 + label_sort_by: "按 %{value} 排序" + label_send_test_email: 寄送測試郵件 + label_feeds_access_key: Atom 存取金鑰 + label_missing_feeds_access_key: 找不到 Atom 存取金鑰 + label_feeds_access_key_created_on: "Atom 存取鍵建立於 %{value} 之前" + label_module_plural: 模組 + label_added_time_by: "是由 %{author} 於 %{age} 前加入" + label_updated_time_by: "是由 %{author} 於 %{age} 前更新" + label_updated_time: "於 %{value} 前更新" + label_jump_to_a_project: 選擇欲前往的專案... + label_file_plural: 檔案清單 + label_changeset_plural: 變更集清單 + label_default_columns: 預設欄位清單 + label_no_change_option: (維持不變) + label_bulk_edit_selected_issues: 大量編輯選取的議題 + label_bulk_edit_selected_time_entries: 大量編輯選取的工時項目 + label_theme: 畫面主題 + label_default: 預設 + label_search_titles_only: 僅搜尋標題 + label_user_mail_option_all: "提醒與我的專案有關的全部事件" + label_user_mail_option_selected: "只提醒我所選擇專案中的事件..." + label_user_mail_option_none: "取消提醒" + label_user_mail_option_only_my_events: "只提醒我觀察中或參與中的事物" + label_user_mail_option_only_assigned: "只提醒我觀察中或分派給我的事物" + label_user_mail_option_only_owner: "只提醒我觀察中或擁有者為我的事物" + label_user_mail_no_self_notified: "不提醒我自己所做的變更" + label_registration_activation_by_email: 透過電子郵件啟用帳戶 + label_registration_manual_activation: 手動啟用帳戶 + label_registration_automatic_activation: 自動啟用帳戶 + label_display_per_page: "每頁顯示: %{value} 個" + label_age: 年齡 + label_change_properties: 變更屬性 + label_general: 一般 + label_scm: 版本控管 + label_plugins: 外掛程式 + label_ldap_authentication: LDAP 認證 + label_downloads_abbr: 下載 + label_optional_description: 額外的說明 + label_add_another_file: 增加其他檔案 + label_preferences: 偏好選項 + label_chronological_order: 以時間由遠至近排序 + label_reverse_chronological_order: 以時間由近至遠排序 + label_incoming_emails: 傳入的電子郵件 + label_generate_key: 產生金鑰 + label_issue_watchers: 監看者 + label_example: 範例 + label_display: 顯示 + label_sort: 排序 + label_ascending: 遞增排序 + label_descending: 遞減排序 + label_date_from_to: 起 %{start} 迄 %{end} + label_wiki_content_added: Wiki 頁面已新增 + label_wiki_content_updated: Wiki 頁面已更新 + label_group: 群組 + label_group_plural: 群組清單 + label_group_new: 建立新群組 + label_group_anonymous: 匿名用戶 + label_group_non_member: 非成員用戶 + label_time_entry_plural: 耗用工時 + label_version_sharing_none: 不共用 + label_version_sharing_descendants: 與子專案共用 + label_version_sharing_hierarchy: 與專案階層架構共用 + label_version_sharing_tree: 與專案樹共用 + label_version_sharing_system: 與全部的專案共用 + label_update_issue_done_ratios: 更新議題完成百分比 + label_copy_source: 來源 + label_copy_target: 目的地 + label_copy_same_as_target: 與目的地相同 + label_display_used_statuses_only: 僅顯示此追蹤標籤所使用之狀態 + label_api_access_key: API 存取金鑰 + label_missing_api_access_key: 找不到 API 存取金鑰 + label_api_access_key_created_on: "API 存取金鑰建立於 %{value} 之前" + label_profile: 配置概況 + label_subtask_plural: 子任務 + label_project_copy_notifications: 在複製專案的過程中,傳送通知郵件 + label_principal_search: "搜尋用戶或群組:" + label_user_search: "搜尋用戶:" + label_additional_workflow_transitions_for_author: 用戶為作者時額外允許的流程轉換 + label_additional_workflow_transitions_for_assignee: 用戶為被分派者時額外允許的流程轉換 + label_issues_visibility_all: 所有議題 + label_issues_visibility_public: 所有非私人議題 + label_issues_visibility_own: 使用者所建立的或被分派的議題 + label_git_report_last_commit: 報告最後認可的文件和目錄 + label_parent_revision: 父項 + label_child_revision: 子項 + label_export_options: "%{export_format} 匯出選項" + label_copy_attachments: 複製附件 + label_copy_subtasks: 複製子任務 + label_item_position: "%{position} / %{count}" + label_completed_versions: 已完成版本 + label_search_for_watchers: 搜尋可供加入的監看者 + label_session_expiration: 工作階段逾期 + label_show_closed_projects: 檢視已關閉的專案 + label_status_transitions: 狀態轉換 + label_fields_permissions: 欄位權限 + label_readonly: 唯讀 + label_required: 必填 + label_hidden: 隱藏 + label_attribute_of_project: "專案的 %{name}" + label_attribute_of_issue: "議題的 %{name}" + label_attribute_of_author: "作者的 %{name}" + label_attribute_of_assigned_to: "被分派者的 %{name}" + label_attribute_of_user: "用戶的 %{name}" + label_attribute_of_fixed_version: "版本的 %{name}" + label_attribute_of_object: "%{object_name}的 %{name}" + label_cross_project_descendants: 與子專案共用 + label_cross_project_tree: 與專案樹共用 + label_cross_project_hierarchy: 與專案階層架構共用 + label_cross_project_system: 與全部的專案共用 + label_gantt_progress_line: 進度線 + label_visibility_private: 僅我自己可見 + label_visibility_roles: 僅選取之角色可見 + label_visibility_public: 任何用戶均可見 + label_link: 連結 + label_only: 僅於 + label_drop_down_list: 下拉式清單 + label_checkboxes: 核取方塊 + label_radio_buttons: 選項按鈕 + label_link_values_to: 連結欄位值至此網址 + label_custom_field_select_type: 請選擇連結此自訂欄位的物件類型 + label_check_for_updates: 檢查更新 + label_latest_compatible_version: 最新的相容版本 + label_unknown_plugin: 無法辨識的外掛程式 + label_add_projects: 加入專案 + label_users_visibility_all: 所有活動中的用戶 + label_users_visibility_members_of_visible_projects: 可見專案中的成員 + label_edit_attachments: 編輯附加檔案 + label_link_copied_issue: 連結到被複製的議題 + label_ask: 詢問 + label_search_attachments_yes: 搜尋附加檔案的檔案名稱與說明 + label_search_attachments_no: 不搜尋附加檔案 + label_search_attachments_only: 僅搜尋附加檔案 + label_search_open_issues_only: 僅搜尋進行中的議題 + label_email_address_plural: 電子郵件 + label_email_address_add: 新增電子郵件地址 + label_enable_notifications: 啟用通知 + label_disable_notifications: 停用通知 + label_blank_value: 空白 + label_parent_task_attributes: 父議題屬性 + label_parent_task_attributes_derived: 從子任務計算導出 + label_parent_task_attributes_independent: 與子任務無關 + label_time_entries_visibility_all: 所有工時紀錄 + label_time_entries_visibility_own: 用戶自己建立的工時紀錄 + label_member_management: 成員管理 + label_member_management_all_roles: 所有角色 + label_member_management_selected_roles_only: 僅限下列角色 + label_import_issues: 匯入議題 + label_select_file_to_import: 選取要匯入的檔案 + label_fields_separator: 欄位分隔符號 + label_fields_wrapper: 欄位包裝識別符號 + label_encoding: 編碼 + label_comma_char: 逗號(,) + label_semi_colon_char: 分號(;) + label_quote_char: 引號(') + label_double_quote_char: 雙引號(") + label_fields_mapping: 欄位對應 + label_file_content_preview: 檔案內容預覽 + label_create_missing_values: 建立缺少的數值 + label_api: API + label_field_format_enumeration: 鍵/值 清單 + label_default_values_for_new_users: 新用戶使用之預設值 + label_relations: 關聯 + label_new_project_issue_tab_enabled: 顯示「建立新議題」標籤頁面 + label_new_object_tab_enabled: 顯示 "+" 下拉功能表 + label_table_of_contents: 目錄 + label_font_default: 預設字型 + label_font_monospace: 等寬字型 + label_font_proportional: 調和間距字型 + label_last_notes: 最後一則筆記 + + button_login: 登入 + button_submit: 送出 + button_save: 儲存 + button_check_all: 全選 + button_uncheck_all: 全不選 + button_collapse_all: 全部摺疊 + button_expand_all: 全部展開 + button_delete: 刪除 + button_create: 建立 + button_create_and_continue: 繼續建立 + button_test: 測試 + button_edit: 編輯 + button_edit_associated_wikipage: "編輯相關 Wiki 頁面: %{page_title}" + button_add: 新增 + button_change: 修改 + button_apply: 套用 + button_clear: 清除 + button_lock: 鎖定 + button_unlock: 解除鎖定 + button_download: 下載 + button_list: 清單 + button_view: 檢視 + button_move: 移動 + button_move_and_follow: 移動後跟隨 + button_back: 返回 + button_cancel: 取消 + button_activate: 啟用 + button_sort: 排序 + button_log_time: 記錄時間 + button_rollback: 還原至此版本 + button_watch: 觀察 + button_unwatch: 取消觀察 + button_reply: 回應 + button_archive: 封存 + button_unarchive: 取消封存 + button_reset: 回復 + button_rename: 重新命名 + button_change_password: 變更密碼 + button_copy: 複製 + button_copy_and_follow: 複製後跟隨 + button_annotate: 註解 + button_update: 更新 + button_configure: 設定 + button_quote: 引用 + button_duplicate: 重製 + button_show: 顯示 + button_hide: 隱藏 + button_edit_section: 編輯此區塊 + button_export: 匯出 + button_delete_my_account: 刪除我的帳戶 + button_close: 關閉 + button_reopen: 重新開啟 + button_import: 匯入 + button_filter: 篩選器 + + status_active: 活動中 + status_registered: 註冊完成 + status_locked: 鎖定中 + + project_status_active: 使用中 + project_status_closed: 已關閉 + project_status_archived: 已封存 + + version_status_open: 進行中 + version_status_locked: 已鎖定 + version_status_closed: 已結束 + + field_active: 活動中 + + text_select_mail_notifications: 選擇欲寄送提醒通知郵件之動作 + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 代表「不限制」 + text_project_destroy_confirmation: 您確定要刪除這個專案和其他相關資料? + text_subprojects_destroy_warning: "下列子專案: %{value} 將一併被刪除。" + text_workflow_edit: 選擇角色與追蹤標籤以設定其工作流程 + text_are_you_sure: 確定執行? + text_journal_changed: "%{label} 從 %{old} 變更為 %{new}" + text_journal_changed_no_detail: "%{label} 已更新" + text_journal_set_to: "%{label} 設定為 %{value}" + text_journal_deleted: "%{label} 已刪除 (%{old})" + text_journal_added: "%{label} %{value} 已新增" + text_tip_issue_begin_day: 今天起始的議題 + text_tip_issue_end_day: 今天截止的的議題 + text_tip_issue_begin_end_day: 今天起始與截止的議題 + text_project_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。
    一旦儲存之後, 代碼便無法再次被更改。' + text_caracters_maximum: "最多 %{count} 個字元." + text_caracters_minimum: "長度必須大於 %{count} 個字元." + text_length_between: "長度必須介於 %{min} 至 %{max} 個字元之間." + text_tracker_no_workflow: 此追蹤標籤尚未定義工作流程 + text_unallowed_characters: 不允許的字元 + text_comma_separated: 可輸入多個值(須以逗號分隔)。 + text_line_separated: 可輸入多個值(須以換行符號分隔,即每列只能輸入一個值)。 + text_issues_ref_in_commit_messages: 認可訊息中參照(或修正)議題之關鍵字 + text_issue_added: "議題 %{id} 已被 %{author} 通報。" + text_issue_updated: "議題 %{id} 已被 %{author} 更新。" + text_wiki_destroy_confirmation: 您確定要刪除這個 wiki 和其中的所有內容? + text_issue_category_destroy_question: "有 (%{count}) 個議題被分派到此分類. 請選擇您想要的動作?" + text_issue_category_destroy_assignments: 移除這些議題的分類 + text_issue_category_reassign_to: 重新分派這些議題至其它分類 + text_user_mail_option: "對於那些未被選擇的專案,將只會接收到您正在觀察中,或是參與中的議題通知。(「參與中的議題」包含您建立的或是分派給您的議題)" + text_no_configuration_data: "角色、追蹤標籤、議題狀態與流程尚未被設定完成。\n強烈建議您先載入預設的組態。將預設組態載入之後,您可再變更其中之值。" + text_load_default_configuration: 載入預設組態 + text_status_changed_by_changeset: "已套用至變更集 %{value}." + text_time_logged_by_changeset: "紀錄於變更集 %{value}." + text_issues_destroy_confirmation: '確定刪除已選擇的議題?' + text_issues_destroy_descendants_confirmation: "這麼做將會一併刪除 %{count} 子任務。" + text_time_entries_destroy_confirmation: 您確定要刪除所選擇的工時紀錄? + text_select_project_modules: '選擇此專案可使用之模組:' + text_default_administrator_account_changed: 已變更預設管理員帳號內容 + text_file_repository_writable: 可寫入附加檔案目錄 + text_plugin_assets_writable: 可寫入外掛程式目錄 + text_rmagick_available: 可使用 RMagick (選配) + text_convert_available: 可使用 ImageMagick 轉換圖片格式 (選配) + text_destroy_time_entries_question: 您即將刪除的議題已報工 %{hours} 小時. 您的選擇是? + text_destroy_time_entries: 刪除已報工的時數 + text_assign_time_entries_to_project: 指定已報工的時數至專案中 + text_reassign_time_entries: '重新指定已報工的時數至此議題:' + text_user_wrote: "%{value} 先前提到:" + text_enumeration_destroy_question: "目前有 %{count} 個物件使用此列舉值。" + text_enumeration_category_reassign_to: '重新設定其列舉值為:' + text_email_delivery_not_configured: "您尚未設定電子郵件傳送方式,因此提醒選項已被停用。\n請在 config/configuration.yml 中設定 SMTP 之後,重新啟動 Redmine,以啟用電子郵件提醒選項。" + text_repository_usernames_mapping: "選擇或更新 Redmine 使用者與儲存機制紀錄使用者之對應關係。\n儲存機制中之使用者帳號或電子郵件信箱,與 Redmine 設定相同者,將自動產生對應關係。" + text_diff_truncated: '... 這份差異已被截短以符合顯示行數之最大值' + text_custom_field_possible_values_info: '一列輸入一個值' + text_wiki_page_destroy_question: "此頁面包含 %{descendants} 個子頁面及延伸頁面。 請選擇您想要的動作?" + text_wiki_page_nullify_children: "保留所有子頁面當作根頁面" + text_wiki_page_destroy_children: "刪除所有子頁面及其延伸頁面" + text_wiki_page_reassign_children: "重新指定所有的子頁面之父頁面至此頁面" + text_own_membership_delete_confirmation: "您在專案中,所擁有的部分或全部權限即將被移除,在這之後可能無法再次編輯此專案。\n您確定要繼續執行這個動作?" + text_zoom_in: 放大 + text_zoom_out: 縮小 + text_warn_on_leaving_unsaved: "若您離開這個頁面,此頁面所包含的未儲存資料將會遺失。" + text_scm_path_encoding_note: "預設: UTF-8" + text_subversion_repository_note: "範例: file:///, http://, https://, svn://, svn+[tunnelscheme]://" + text_git_repository_note: 儲存機制是本機的空(bare)目錄 (即: /gitrepo, c:\gitrepo) + text_mercurial_repository_note: 本機儲存機制 (即: /hgrepo, c:\hgrepo) + text_scm_command: 命令 + text_scm_command_version: 版本 + text_scm_config: 您可以在 config/configuration.yml 中設定 SCM 命令。請在編輯該檔案之後重新啟動 Redmine 應用程式。 + text_scm_command_not_available: SCM 命令無法使用。請檢查管理面板中的設定。 + text_issue_conflict_resolution_overwrite: "直接套用我的變更 (先前的筆記將會被保留,但是某些變更可能會被複寫)" + text_issue_conflict_resolution_add_notes: "新增我的筆記並捨棄我其他的變更" + text_issue_conflict_resolution_cancel: "捨棄我全部的變更並重新顯示 %{link}" + text_account_destroy_confirmation: |- + 您確定要繼續這個動作嗎? + 您的帳戶將會被永久刪除,且無法被重新啟用。 + text_session_expiration_settings: "警告:變更這些設定將會導致包含您在內的所有工作階段過期。" + text_project_closed: 此專案已被關閉,僅供唯讀使用。 + text_turning_multiple_off: "若您停用多重值設定,重複的值將會被移除,以使每個項目僅保留一個值。" + + default_role_manager: 管理人員 + default_role_developer: 開發人員 + default_role_reporter: 報告人員 + default_tracker_bug: 臭蟲 + default_tracker_feature: 功能 + default_tracker_support: 支援 + default_issue_status_new: 新建立 + default_issue_status_in_progress: 實作中 + default_issue_status_resolved: 已解決 + default_issue_status_feedback: 已回應 + default_issue_status_closed: 已結束 + default_issue_status_rejected: 已拒絕 + default_doc_category_user: 使用手冊 + default_doc_category_tech: 技術文件 + default_priority_low: 低 + default_priority_normal: 正常 + default_priority_high: 高 + default_priority_urgent: 速 + default_priority_immediate: 急 + default_activity_design: 設計 + default_activity_development: 開發 + + enumeration_issue_priorities: 議題優先權 + enumeration_doc_categories: 文件分類 + enumeration_activities: 活動 (時間追蹤) + enumeration_system_activity: 系統活動 + description_filter: 篩選條件 + description_search: 搜尋欄位 + description_choose_project: 專案清單 + description_project_scope: 搜尋範圍 + description_notes: 筆記 + description_message_content: 訊息內容 + description_query_sort_criteria_attribute: 排序屬性 + description_query_sort_criteria_direction: 排列順序 + description_user_mail_notification: 郵件通知設定 + description_available_columns: 可用欄位 + description_selected_columns: 已選取的欄位 + description_all_columns: 所有欄位 + description_issue_category_reassign: 選擇議題分類 + description_wiki_subpages_reassign: 選擇新的父頁面 + text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。
    一旦儲存之後, 代碼便無法再次被更改。' diff --git a/config/locales/zh.yml b/config/locales/zh.yml new file mode 100644 index 0000000..ada1915 --- /dev/null +++ b/config/locales/zh.yml @@ -0,0 +1,1219 @@ +# Chinese (China) translations for Ruby on Rails +# by tsechingho (http://github.com/tsechingho) +zh: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + jquery: + locale: "zh-CN" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b%d日" + long: "%Y年%b%d日" + + day_names: [星期天, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] + abbr_day_names: [日, 一, 二, 三, 四, 五, 六] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y年%b%d日 %A %H:%M:%S" + time: "%H:%M" + short: "%b%d日 %H:%M" + long: "%Y年%b%d日 %H:%M" + am: "上午" + pm: "下午" + + datetime: + distance_in_words: + half_a_minute: "半分钟" + less_than_x_seconds: + one: "一秒内" + other: "少于 %{count} 秒" + x_seconds: + one: "一秒" + other: "%{count} 秒" + less_than_x_minutes: + one: "一分钟内" + other: "少于 %{count} 分钟" + x_minutes: + one: "一分钟" + other: "%{count} 分钟" + about_x_hours: + one: "大约一小时" + other: "大约 %{count} 小时" + x_hours: + one: "1 小时" + other: "%{count} 小时" + x_days: + one: "一天" + other: "%{count} 天" + about_x_months: + one: "大约一个月" + other: "大约 %{count} 个月" + x_months: + one: "一个月" + other: "%{count} 个月" + about_x_years: + one: "大约一年" + other: "大约 %{count} 年" + over_x_years: + one: "超过一年" + other: "超过 %{count} 年" + almost_x_years: + one: "将近 1 年" + other: "将近 %{count} 年" + + number: + # Default format for numbers + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "和" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "由于发生了一个错误 %{model} 无法保存" + other: "%{count} 个错误使得 %{model} 无法保存" + messages: + inclusion: "不包含于列表中" + exclusion: "是保留关键字" + invalid: "是无效的" + confirmation: "与确认值不匹配" + accepted: "必须是可被接受的" + empty: "不能留空" + blank: "不能为空字符" + too_long: "过长(最长为 %{count} 个字符)" + too_short: "过短(最短为 %{count} 个字符)" + wrong_length: "长度非法(必须为 %{count} 个字符)" + taken: "已经被使用" + not_a_number: "不是数字" + not_a_date: "不是合法日期" + greater_than: "必须大于 %{count}" + greater_than_or_equal_to: "必须大于或等于 %{count}" + equal_to: "必须等于 %{count}" + less_than: "必须小于 %{count}" + less_than_or_equal_to: "必须小于或等于 %{count}" + odd: "必须为单数" + even: "必须为双数" + greater_than_start_date: "必须在起始日期之后" + not_same_project: "不属于同一个项目" + circular_dependency: "此关联将导致循环依赖" + cant_link_an_issue_with_a_descendant: "问题不能关联到它的子任务" + earlier_than_minimum_start_date: "不能早于 %{date} 由于有前置问题" + not_a_regexp: "不是一个合法的正则表达式" + open_issue_with_closed_parent: "无法将一个打开的问题关联至一个被关闭的父任务" + + actionview_instancetag_blank_option: 请选择 + + general_text_No: '否' + general_text_Yes: '是' + general_text_no: '否' + general_text_yes: '是' + general_lang_name: 'Simplified Chinese (简体中文)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: gb18030 + general_pdf_fontname: stsongstdlight + general_pdf_monospaced_fontname: stsongstdlight + general_first_day_of_week: '7' + + notice_account_updated: 帐号更新成功 + notice_account_invalid_credentials: 无效的用户名或密码 + notice_account_password_updated: 密码更新成功 + notice_account_wrong_password: 密码错误 + notice_account_register_done: 帐号创建成功,请使用注册确认邮件中的链接来激活您的帐号。 + notice_account_unknown_email: 未知用户 + notice_can_t_change_password: 该帐号使用了外部认证,因此无法更改密码。 + notice_account_lost_email_sent: 系统已将引导您设置新密码的邮件发送给您。 + notice_account_activated: 您的帐号已被激活。您现在可以登录了。 + notice_successful_create: 创建成功 + notice_successful_update: 更新成功 + notice_successful_delete: 删除成功 + notice_successful_connection: 连接成功 + notice_file_not_found: 您访问的页面不存在或已被删除。 + notice_locking_conflict: 数据已被另一位用户更新 + notice_not_authorized: 对不起,您无权访问此页面。 + notice_not_authorized_archived_project: 要访问的项目已经归档。 + notice_email_sent: "邮件已发送至 %{value}" + notice_email_error: "发送邮件时发生错误 (%{value})" + notice_feeds_access_key_reseted: 您的Atom存取键已被重置。 + notice_api_access_key_reseted: 您的API访问键已被重置。 + notice_failed_to_save_issues: "%{count} 个问题保存失败(共选择 %{total} 个问题):%{ids}." + notice_failed_to_save_members: "成员保存失败: %{errors}." + notice_no_issue_selected: "未选择任何问题!请选择您要编辑的问题。" + notice_account_pending: "您的帐号已被成功创建,正在等待管理员的审核。" + notice_default_data_loaded: 成功载入默认设置。 + notice_unable_delete_version: 无法删除版本 + notice_unable_delete_time_entry: 无法删除工时 + notice_issue_done_ratios_updated: 问题完成度已更新。 + notice_gantt_chart_truncated: "由于项目数量超过可显示的最大值 (%{max}),故此甘特图将截断超出部分" + + error_can_t_load_default_data: "无法载入默认设置:%{value}" + error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。" + error_scm_command_failed: "访问版本库时发生错误:%{value}" + error_scm_annotate: "该条目不存在或无法追溯。" + error_issue_not_found_in_project: '问题不存在或不属于此项目' + error_no_tracker_in_project: 该项目未设定跟踪标签,请检查项目配置。 + error_no_default_issue_status: 未设置默认的问题状态。请检查系统设置("管理" -> "问题状态")。 + error_can_not_delete_custom_field: 无法删除自定义属性 + error_can_not_delete_tracker: "该跟踪标签已包含问题,无法删除" + error_can_not_remove_role: "该角色正在使用中,无法删除" + error_can_not_reopen_issue_on_closed_version: 该问题被关联到一个已经关闭的版本,因此无法重新打开。 + error_can_not_archive_project: 该项目无法被存档 + error_issue_done_ratios_not_updated: 问题完成度未能被更新。 + error_workflow_copy_source: 请选择一个源跟踪标签或者角色 + error_workflow_copy_target: 请选择目标跟踪标签和角色 + error_unable_delete_issue_status: '无法删除问题状态' + error_unable_to_connect: "无法连接 (%{value})" + warning_attachments_not_saved: "%{count} 个文件保存失败" + + mail_subject_lost_password: "您的 %{value} 密码" + mail_body_lost_password: '请点击以下链接来修改您的密码:' + mail_subject_register: "%{value}帐号激活" + mail_body_register: '请点击以下链接来激活您的帐号:' + mail_body_account_information_external: "您可以使用您的 %{value} 帐号来登录。" + mail_body_account_information: 您的帐号信息 + mail_subject_account_activation_request: "%{value}帐号激活请求" + mail_body_account_activation_request: "新用户(%{value})已完成注册,正在等候您的审核:" + mail_subject_reminder: "%{count} 个问题需要尽快解决 (%{days})" + mail_body_reminder: "指派给您的 %{count} 个问题需要在 %{days} 天内完成:" + mail_subject_wiki_content_added: "'%{id}' wiki页面已添加" + mail_body_wiki_content_added: "'%{id}' wiki页面已由 %{author} 添加。" + mail_subject_wiki_content_updated: "'%{id}' wiki页面已更新。" + mail_body_wiki_content_updated: "'%{id}' wiki页面已由 %{author} 更新。" + + + field_name: 名称 + field_description: 描述 + field_summary: 摘要 + field_is_required: 必填 + field_firstname: 名字 + field_lastname: 姓氏 + field_mail: 邮件地址 + field_filename: 文件 + field_filesize: 大小 + field_downloads: 下载次数 + field_author: 作者 + field_created_on: 创建于 + field_updated_on: 更新于 + field_field_format: 格式 + field_is_for_all: 用于所有项目 + field_possible_values: 可能的值 + field_regexp: 正则表达式 + field_min_length: 最小长度 + field_max_length: 最大长度 + field_value: 值 + field_category: 类别 + field_title: 标题 + field_project: 项目 + field_issue: 问题 + field_status: 状态 + field_notes: 说明 + field_is_closed: 已关闭的问题 + field_is_default: 默认值 + field_tracker: 跟踪 + field_subject: 主题 + field_due_date: 计划完成日期 + field_assigned_to: 指派给 + field_priority: 优先级 + field_fixed_version: 目标版本 + field_user: 用户 + field_principal: 用户/用户组 + field_role: 角色 + field_homepage: 主页 + field_is_public: 公开 + field_parent: 上级项目 + field_is_in_roadmap: 在路线图中显示 + field_login: 登录名 + field_mail_notification: 邮件通知 + field_admin: 管理员 + field_last_login_on: 最后登录 + field_language: 语言 + field_effective_date: 截止日期 + field_password: 密码 + field_new_password: 新密码 + field_password_confirmation: 确认 + field_version: 版本 + field_type: 类型 + field_host: 主机 + field_port: 端口 + field_account: 帐号 + field_base_dn: Base DN + field_attr_login: 登录名属性 + field_attr_firstname: 名字属性 + field_attr_lastname: 姓氏属性 + field_attr_mail: 邮件属性 + field_onthefly: 即时用户生成 + field_start_date: 开始日期 + field_done_ratio: "% 完成" + field_auth_source: 认证模式 + field_hide_mail: 隐藏我的邮件地址 + field_comments: 注释 + field_url: URL + field_start_page: 起始页 + field_subproject: 子项目 + field_hours: 小时 + field_activity: 活动 + field_spent_on: 日期 + field_identifier: 标识 + field_is_filter: 作为过滤条件 + field_issue_to: 相关问题 + field_delay: 延期 + field_assignable: 问题可指派给此角色 + field_redirect_existing_links: 重定向到现有链接 + field_estimated_hours: 预期时间 + field_column_names: 列 + field_time_entries: 工时 + field_time_zone: 时区 + field_searchable: 可用作搜索条件 + field_default_value: 默认值 + field_comments_sorting: 显示注释 + field_parent_title: 上级页面 + field_editable: 可编辑 + field_watcher: 关注者 + field_identity_url: OpenID URL + field_content: 内容 + field_group_by: 根据此条件分组 + field_sharing: 共享 + field_parent_issue: 父任务 + field_member_of_group: 用户组的成员 + field_assigned_to_role: 角色的成员 + field_text: 文本字段 + field_visible: 可见的 + + setting_app_title: 应用程序标题 + setting_app_subtitle: 应用程序子标题 + setting_welcome_text: 欢迎文字 + setting_default_language: 默认语言 + setting_login_required: 要求认证 + setting_self_registration: 允许自注册 + setting_attachment_max_size: 附件大小限制 + setting_issues_export_limit: 问题导出条目的限制 + setting_mail_from: 邮件发件人地址 + setting_bcc_recipients: 使用密件抄送 (bcc) + setting_plain_text_mail: 纯文本(无HTML) + setting_host_name: 主机名称 + setting_text_formatting: 文本格式 + setting_wiki_compression: 压缩Wiki历史文档 + setting_feeds_limit: Atom Feed内容条数限制 + setting_default_projects_public: 新建项目默认为公开项目 + setting_autofetch_changesets: 自动获取程序变更 + setting_sys_api_enabled: 启用用于版本库管理的Web Service + setting_commit_ref_keywords: 用于引用问题的关键字 + setting_commit_fix_keywords: 用于解决问题的关键字 + setting_autologin: 自动登录 + setting_date_format: 日期格式 + setting_time_format: 时间格式 + setting_cross_project_issue_relations: 允许不同项目之间的问题关联 + setting_issue_list_default_columns: 问题列表中显示的默认列 + setting_emails_header: 邮件头 + setting_emails_footer: 邮件签名 + setting_protocol: 协议 + setting_per_page_options: 每页显示条目个数的设置 + setting_user_format: 用户显示格式 + setting_activity_days_default: 在项目活动中显示的天数 + setting_display_subprojects_issues: 在项目页面上默认显示子项目的问题 + setting_enabled_scm: 启用 SCM + setting_mail_handler_body_delimiters: 在这些行之后截断邮件 + setting_mail_handler_api_enabled: 启用用于接收邮件的服务 + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: 顺序产生项目标识 + setting_gravatar_enabled: 使用Gravatar用户头像 + setting_gravatar_default: 默认的Gravatar头像 + setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数 + setting_file_max_size_displayed: 允许直接显示的最大文本文件 + setting_repository_log_display_limit: 在文件变更记录页面上显示的最大修订版本数量 + setting_openid: 允许使用OpenID登录和注册 + setting_password_min_length: 最短密码长度 + setting_new_project_user_role_id: 非管理员用户新建项目时将被赋予的(在该项目中的)角色 + setting_default_projects_modules: 新建项目默认启用的模块 + setting_issue_done_ratio: 计算问题完成度: + setting_issue_done_ratio_issue_field: 使用问题(的完成度)属性 + setting_issue_done_ratio_issue_status: 使用问题状态 + setting_start_of_week: 日历开始于 + setting_rest_api_enabled: 启用REST web service + setting_cache_formatted_text: 缓存格式化文字 + setting_default_notification_option: 默认提醒选项 + setting_commit_logtime_enabled: 激活时间日志 + setting_commit_logtime_activity_id: 记录的活动 + setting_gantt_items_limit: 在甘特图上显示的最大记录数 + + permission_add_project: 新建项目 + permission_add_subprojects: 新建子项目 + permission_edit_project: 编辑项目 + permission_select_project_modules: 选择项目模块 + permission_manage_members: 管理成员 + permission_manage_project_activities: 管理项目活动 + permission_manage_versions: 管理版本 + permission_manage_categories: 管理问题类别 + permission_view_issues: 查看问题 + permission_add_issues: 新建问题 + permission_edit_issues: 更新问题 + permission_manage_issue_relations: 管理问题关联 + permission_add_issue_notes: 添加说明 + permission_edit_issue_notes: 编辑说明 + permission_edit_own_issue_notes: 编辑自己的说明 + permission_move_issues: 移动问题 + permission_delete_issues: 删除问题 + permission_manage_public_queries: 管理公开的查询 + permission_save_queries: 保存查询 + permission_view_gantt: 查看甘特图 + permission_view_calendar: 查看日历 + permission_view_issue_watchers: 查看关注者列表 + permission_add_issue_watchers: 添加关注者 + permission_delete_issue_watchers: 删除关注者 + permission_log_time: 登记工时 + permission_view_time_entries: 查看耗时 + permission_edit_time_entries: 编辑耗时 + permission_edit_own_time_entries: 编辑自己的耗时 + permission_manage_news: 管理新闻 + permission_comment_news: 为新闻添加评论 + permission_view_documents: 查看文档 + permission_manage_files: 管理文件 + permission_view_files: 查看文件 + permission_manage_wiki: 管理Wiki + permission_rename_wiki_pages: 重定向/重命名Wiki页面 + permission_delete_wiki_pages: 删除Wiki页面 + permission_view_wiki_pages: 查看Wiki + permission_view_wiki_edits: 查看Wiki历史记录 + permission_edit_wiki_pages: 编辑Wiki页面 + permission_delete_wiki_pages_attachments: 删除附件 + permission_protect_wiki_pages: 保护Wiki页面 + permission_manage_repository: 管理版本库 + permission_browse_repository: 浏览版本库 + permission_view_changesets: 查看变更 + permission_commit_access: 访问提交信息 + permission_manage_boards: 管理讨论区 + permission_view_messages: 查看帖子 + permission_add_messages: 发表帖子 + permission_edit_messages: 编辑帖子 + permission_edit_own_messages: 编辑自己的帖子 + permission_delete_messages: 删除帖子 + permission_delete_own_messages: 删除自己的帖子 + permission_export_wiki_pages: 导出 wiki 页面 + permission_manage_subtasks: 管理子任务 + + project_module_issue_tracking: 问题跟踪 + project_module_time_tracking: 时间跟踪 + project_module_news: 新闻 + project_module_documents: 文档 + project_module_files: 文件 + project_module_wiki: Wiki + project_module_repository: 版本库 + project_module_boards: 讨论区 + project_module_calendar: 日历 + project_module_gantt: 甘特图 + + label_user: 用户 + label_user_plural: 用户 + label_user_new: 新建用户 + label_user_anonymous: 匿名用户 + label_project: 项目 + label_project_new: 新建项目 + label_project_plural: 项目 + label_x_projects: + zero: 无项目 + one: 1 个项目 + other: "%{count} 个项目" + label_project_all: 所有的项目 + label_project_latest: 最近的项目 + label_issue: 问题 + label_issue_new: 新建问题 + label_issue_plural: 问题 + label_issue_view_all: 查看所有问题 + label_issues_by: "按 %{value} 分组显示问题" + label_issue_added: 问题已添加 + label_issue_updated: 问题已更新 + label_document: 文档 + label_document_new: 新建文档 + label_document_plural: 文档 + label_document_added: 文档已添加 + label_role: 角色 + label_role_plural: 角色 + label_role_new: 新建角色 + label_role_and_permissions: 角色和权限 + label_member: 成员 + label_member_new: 新建成员 + label_member_plural: 成员 + label_tracker: 跟踪标签 + label_tracker_plural: 跟踪标签 + label_tracker_new: 新建跟踪标签 + label_workflow: 工作流程 + label_issue_status: 问题状态 + label_issue_status_plural: 问题状态 + label_issue_status_new: 新建问题状态 + label_issue_category: 问题类别 + label_issue_category_plural: 问题类别 + label_issue_category_new: 新建问题类别 + label_custom_field: 自定义属性 + label_custom_field_plural: 自定义属性 + label_custom_field_new: 新建自定义属性 + label_enumerations: 枚举值 + label_enumeration_new: 新建枚举值 + label_information: 信息 + label_information_plural: 信息 + label_please_login: 请登录 + label_register: 注册 + label_login_with_open_id_option: 或使用OpenID登录 + label_password_lost: 忘记密码 + label_home: 主页 + label_my_page: 我的工作台 + label_my_account: 我的帐号 + label_my_projects: 我的项目 + label_administration: 管理 + label_login: 登录 + label_logout: 退出 + label_help: 帮助 + label_reported_issues: 已报告的问题 + label_assigned_to_me_issues: 指派给我的问题 + label_last_login: 最后登录 + label_registered_on: 注册于 + label_activity: 活动 + label_overall_activity: 活动概览 + label_user_activity: "%{value} 的活动" + label_new: 新建 + label_logged_as: 登录为 + label_environment: 环境 + label_authentication: 认证 + label_auth_source: 认证模式 + label_auth_source_new: 新建认证模式 + label_auth_source_plural: 认证模式 + label_subproject_plural: 子项目 + label_subproject_new: 新建子项目 + label_and_its_subprojects: "%{value} 及其子项目" + label_min_max_length: 最小 - 最大 长度 + label_list: 列表 + label_date: 日期 + label_integer: 整数 + label_float: 浮点数 + label_boolean: 布尔值 + label_string: 字符串 + label_text: 文本 + label_attribute: 属性 + label_attribute_plural: 属性 + label_no_data: 没有任何数据可供显示 + label_change_status: 变更状态 + label_history: 历史记录 + label_attachment: 文件 + label_attachment_new: 新建文件 + label_attachment_delete: 删除文件 + label_attachment_plural: 文件 + label_file_added: 文件已添加 + label_report: 报表 + label_report_plural: 报表 + label_news: 新闻 + label_news_new: 添加新闻 + label_news_plural: 新闻 + label_news_latest: 最近的新闻 + label_news_view_all: 查看所有新闻 + label_news_added: 新闻已添加 + label_settings: 配置 + label_overview: 概述 + label_version: 版本 + label_version_new: 新建版本 + label_version_plural: 版本 + label_close_versions: 关闭已完成的版本 + label_confirmation: 确认 + label_export_to: 导出 + label_read: 读取... + label_public_projects: 公开的项目 + label_open_issues: 打开 + label_open_issues_plural: 打开 + label_closed_issues: 已关闭 + label_closed_issues_plural: 已关闭 + label_x_open_issues_abbr: + zero: 0 打开 + one: 1 打开 + other: "%{count} 打开" + label_x_closed_issues_abbr: + zero: 0 已关闭 + one: 1 已关闭 + other: "%{count} 已关闭" + label_total: 合计 + label_permissions: 权限 + label_current_status: 当前状态 + label_new_statuses_allowed: 允许的新状态 + label_all: 全部 + label_none: 无 + label_nobody: 无人 + label_next: 下一页 + label_previous: 上一页 + label_used_by: 使用中 + label_details: 详情 + label_add_note: 添加说明 + label_calendar: 日历 + label_months_from: 个月以来 + label_gantt: 甘特图 + label_internal: 内部 + label_last_changes: "最近的 %{count} 次变更" + label_change_view_all: 查看所有变更 + label_comment: 评论 + label_comment_plural: 评论 + label_x_comments: + zero: 无评论 + one: 1 条评论 + other: "%{count} 条评论" + label_comment_add: 添加评论 + label_comment_added: 评论已添加 + label_comment_delete: 删除评论 + label_query: 自定义查询 + label_query_plural: 自定义查询 + label_query_new: 新建查询 + label_filter_add: 增加过滤器 + label_filter_plural: 过滤器 + label_equals: 等于 + label_not_equals: 不等于 + label_in_less_than: 剩余天数小于 + label_in_more_than: 剩余天数大于 + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: 剩余天数 + label_today: 今天 + label_all_time: 全部时间 + label_yesterday: 昨天 + label_this_week: 本周 + label_last_week: 上周 + label_last_n_days: "最后 %{count} 天" + label_this_month: 本月 + label_last_month: 上月 + label_this_year: 今年 + label_date_range: 日期范围 + label_less_than_ago: 之前天数少于 + label_more_than_ago: 之前天数大于 + label_ago: 之前天数 + label_contains: 包含 + label_not_contains: 不包含 + label_day_plural: 天 + label_repository: 版本库 + label_repository_plural: 版本库 + label_browse: 浏览 + label_branch: 分支 + label_tag: 标签 + label_revision: 修订 + label_revision_plural: 修订 + label_revision_id: 修订 %{value} + label_associated_revisions: 相关修订版本 + label_added: 已添加 + label_modified: 已修改 + label_copied: 已复制 + label_renamed: 已重命名 + label_deleted: 已删除 + label_latest_revision: 最近的修订版本 + label_latest_revision_plural: 最近的修订版本 + label_view_revisions: 查看修订 + label_view_all_revisions: 查看所有修订 + label_max_size: 最大尺寸 + label_sort_highest: 置顶 + label_sort_higher: 上移 + label_sort_lower: 下移 + label_sort_lowest: 置底 + label_roadmap: 路线图 + label_roadmap_due_in: "截止日期到 %{value}" + label_roadmap_overdue: "%{value} 延期" + label_roadmap_no_issues: 该版本没有问题 + label_search: 搜索 + label_result_plural: 结果 + label_all_words: 所有单词 + label_wiki: Wiki + label_wiki_edit: Wiki 编辑 + label_wiki_edit_plural: Wiki 编辑记录 + label_wiki_page: Wiki 页面 + label_wiki_page_plural: Wiki 页面 + label_index_by_title: 按标题索引 + label_index_by_date: 按日期索引 + label_current_version: 当前版本 + label_preview: 预览 + label_feed_plural: Feeds + label_changes_details: 所有变更的详情 + label_issue_tracking: 问题跟踪 + label_spent_time: 耗时 + label_overall_spent_time: 总体耗时 + label_f_hour: "%{value} 小时" + label_f_hour_plural: "%{value} 小时" + label_time_tracking: 时间跟踪 + label_change_plural: 变更 + label_statistics: 统计 + label_commits_per_month: 每月提交次数 + label_commits_per_author: 每用户提交次数 + label_view_diff: 查看差别 + label_diff_inline: 直列 + label_diff_side_by_side: 并排 + label_options: 选项 + label_copy_workflow_from: 从以下选项复制工作流程 + label_permissions_report: 权限报表 + label_watched_issues: 关注的问题 + label_related_issues: 相关的问题 + label_applied_status: 应用后的状态 + label_loading: 载入中... + label_relation_new: 新建关联 + label_relation_delete: 删除关联 + label_relates_to: 关联到 + label_duplicates: 重复 + label_duplicated_by: 与其重复 + label_blocks: 阻挡 + label_blocked_by: 被阻挡 + label_precedes: 优先于 + label_follows: 跟随于 + label_stay_logged_in: 保持登录状态 + label_disabled: 禁用 + label_show_completed_versions: 显示已完成的版本 + label_me: 我 + label_board: 讨论区 + label_board_new: 新建讨论区 + label_board_plural: 讨论区 + label_board_locked: 锁定 + label_board_sticky: 置顶 + label_topic_plural: 主题 + label_message_plural: 帖子 + label_message_last: 最新的帖子 + label_message_new: 新贴 + label_message_posted: 发帖成功 + label_reply_plural: 回复 + label_send_information: 给用户发送帐号信息 + label_year: 年 + label_month: 月 + label_week: 周 + label_date_from: 从 + label_date_to: 到 + label_language_based: 根据用户的语言 + label_sort_by: "根据 %{value} 排序" + label_send_test_email: 发送测试邮件 + label_feeds_access_key: Atom存取键 + label_missing_feeds_access_key: 缺少Atom存取键 + label_feeds_access_key_created_on: "Atom存取键是在 %{value} 之前建立的" + label_module_plural: 模块 + label_added_time_by: "由 %{author} 在 %{age} 之前添加" + label_updated_time: " 更新于 %{value} 之前" + label_updated_time_by: "由 %{author} 更新于 %{age} 之前" + label_jump_to_a_project: 选择一个项目... + label_file_plural: 文件 + label_changeset_plural: 变更 + label_default_columns: 默认列 + label_no_change_option: (不变) + label_bulk_edit_selected_issues: 批量修改选中的问题 + label_theme: 主题 + label_default: 默认 + label_search_titles_only: 仅在标题中搜索 + label_user_mail_option_all: "收取我的项目的所有通知" + label_user_mail_option_selected: "收取选中项目的所有通知..." + label_user_mail_option_none: "不收取任何通知" + label_user_mail_option_only_my_events: "只收取我关注或参与的项目的通知" + label_user_mail_no_self_notified: "不要发送对我自己提交的修改的通知" + label_registration_activation_by_email: 通过邮件认证激活帐号 + label_registration_manual_activation: 手动激活帐号 + label_registration_automatic_activation: 自动激活帐号 + label_display_per_page: "每页显示:%{value}" + label_age: 提交时间 + label_change_properties: 修改属性 + label_general: 一般 + label_scm: SCM + label_plugins: 插件 + label_ldap_authentication: LDAP 认证 + label_downloads_abbr: D/L + label_optional_description: 可选的描述 + label_add_another_file: 添加其它文件 + label_preferences: 首选项 + label_chronological_order: 按时间顺序 + label_reverse_chronological_order: 按时间顺序(倒序) + label_incoming_emails: 接收邮件 + label_generate_key: 生成一个key + label_issue_watchers: 关注者 + label_example: 示例 + label_display: 显示 + label_sort: 排序 + label_ascending: 升序 + label_descending: 降序 + label_date_from_to: 从 %{start} 到 %{end} + label_wiki_content_added: Wiki 页面已添加 + label_wiki_content_updated: Wiki 页面已更新 + label_group: 组 + label_group_plural: 组 + label_group_new: 新建组 + label_time_entry_plural: 耗时 + label_version_sharing_none: 不共享 + label_version_sharing_descendants: 与子项目共享 + label_version_sharing_hierarchy: 与项目继承层次共享 + label_version_sharing_tree: 与项目树共享 + label_version_sharing_system: 与所有项目共享 + label_update_issue_done_ratios: 更新问题的完成度 + label_copy_source: 源 + label_copy_target: 目标 + label_copy_same_as_target: 与目标一致 + label_display_used_statuses_only: 只显示被此跟踪标签使用的状态 + label_api_access_key: API访问键 + label_missing_api_access_key: 缺少API访问键 + label_api_access_key_created_on: API访问键是在 %{value} 之前建立的 + label_profile: 简介 + label_subtask_plural: 子任务 + label_project_copy_notifications: 复制项目时发送邮件通知 + label_principal_search: "搜索用户或组:" + label_user_search: "搜索用户:" + + button_login: 登录 + button_submit: 提交 + button_save: 保存 + button_check_all: 全选 + button_uncheck_all: 清除 + button_delete: 删除 + button_create: 创建 + button_create_and_continue: 创建并继续 + button_test: 测试 + button_edit: 编辑 + button_edit_associated_wikipage: "编辑相关wiki页面: %{page_title}" + button_add: 新增 + button_change: 修改 + button_apply: 应用 + button_clear: 清除 + button_lock: 锁定 + button_unlock: 解锁 + button_download: 下载 + button_list: 列表 + button_view: 查看 + button_move: 移动 + button_move_and_follow: 移动并转到新问题 + button_back: 返回 + button_cancel: 取消 + button_activate: 激活 + button_sort: 排序 + button_log_time: 登记工时 + button_rollback: 恢复到这个版本 + button_watch: 关注 + button_unwatch: 取消关注 + button_reply: 回复 + button_archive: 存档 + button_unarchive: 取消存档 + button_reset: 重置 + button_rename: 重命名/重定向 + button_change_password: 修改密码 + button_copy: 复制 + button_copy_and_follow: 复制并转到新问题 + button_annotate: 追溯 + button_update: 更新 + button_configure: 配置 + button_quote: 引用 + button_duplicate: 副本 + button_show: 显示 + + status_active: 活动的 + status_registered: 已注册 + status_locked: 已锁定 + + version_status_open: 打开 + version_status_locked: 锁定 + version_status_closed: 关闭 + + field_active: 活动 + + text_select_mail_notifications: 选择需要发送邮件通知的动作 + text_regexp_info: 例如:^[A-Z0-9]+$ + text_min_max_length_info: 0 表示没有限制 + text_project_destroy_confirmation: 您确信要删除这个项目以及所有相关的数据吗? + text_subprojects_destroy_warning: "以下子项目也将被同时删除:%{value}" + text_workflow_edit: 选择角色和跟踪标签来编辑工作流程 + text_are_you_sure: 您确定? + text_journal_changed: "%{label} 从 %{old} 变更为 %{new}" + text_journal_set_to: "%{label} 被设置为 %{value}" + text_journal_deleted: "%{label} 已删除 (%{old})" + text_journal_added: "%{label} %{value} 已添加" + text_tip_issue_begin_day: 今天开始的任务 + text_tip_issue_end_day: 今天结束的任务 + text_tip_issue_begin_end_day: 今天开始并结束的任务 + text_caracters_maximum: "最多 %{count} 个字符。" + text_caracters_minimum: "至少需要 %{count} 个字符。" + text_length_between: "长度必须在 %{min} 到 %{max} 个字符之间。" + text_tracker_no_workflow: 此跟踪标签未定义工作流程 + text_unallowed_characters: 非法字符 + text_comma_separated: 可以使用多个值(用逗号,分开)。 + text_line_separated: 可以使用多个值(每行一个值)。 + text_issues_ref_in_commit_messages: 在提交信息中引用和解决问题 + text_issue_added: "问题 %{id} 已由 %{author} 提交。" + text_issue_updated: "问题 %{id} 已由 %{author} 更新。" + text_wiki_destroy_confirmation: 您确定要删除这个 wiki 及其所有内容吗? + text_issue_category_destroy_question: "有一些问题(%{count} 个)属于此类别。您想进行哪种操作?" + text_issue_category_destroy_assignments: 删除问题的所属类别(问题变为无类别) + text_issue_category_reassign_to: 为问题选择其它类别 + text_user_mail_option: "对于没有选中的项目,您将只会收到您关注或参与的项目的通知(比如说,您是问题的报告者, 或被指派解决此问题)。" + text_no_configuration_data: "角色、跟踪标签、问题状态和工作流程还没有设置。\n强烈建议您先载入默认设置,然后在此基础上进行修改。" + text_load_default_configuration: 载入默认设置 + text_status_changed_by_changeset: "已应用到变更列表 %{value}." + text_time_logged_by_changeset: "已应用到修订版本 %{value}." + text_issues_destroy_confirmation: '您确定要删除选中的问题吗?' + text_select_project_modules: '请选择此项目可以使用的模块:' + text_default_administrator_account_changed: 默认的管理员帐号已改变 + text_file_repository_writable: 附件路径可写 + text_plugin_assets_writable: 插件的附件路径可写 + text_rmagick_available: RMagick 可用(可选的) + text_destroy_time_entries_question: 您要删除的问题已经上报了 %{hours} 小时的工作量。您想进行那种操作? + text_destroy_time_entries: 删除上报的工作量 + text_assign_time_entries_to_project: 将已上报的工作量提交到项目中 + text_reassign_time_entries: '将已上报的工作量指定到此问题:' + text_user_wrote: "%{value} 写到:" + text_enumeration_destroy_question: "%{count} 个对象被关联到了这个枚举值。" + text_enumeration_category_reassign_to: '将它们关联到新的枚举值:' + text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/configuration.yml中配置您的SMTP服务器信息并重新启动以使其生效。" + text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Redmine用户。\n版本库中与Redmine中的同名用户将被自动对应。" + text_diff_truncated: '... 差别内容超过了可显示的最大行数并已被截断' + text_custom_field_possible_values_info: '每项数值一行' + text_wiki_page_destroy_question: 此页面有 %{descendants} 个子页面和下级页面。您想进行那种操作? + text_wiki_page_nullify_children: 将子页面保留为根页面 + text_wiki_page_destroy_children: 删除子页面及其所有下级页面 + text_wiki_page_reassign_children: 将子页面的上级页面设置为 + text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗? + text_zoom_in: 放大 + text_zoom_out: 缩小 + + default_role_manager: 管理人员 + default_role_developer: 开发人员 + default_role_reporter: 报告人员 + default_tracker_bug: 错误 + default_tracker_feature: 功能 + default_tracker_support: 支持 + default_issue_status_new: 新建 + default_issue_status_in_progress: 进行中 + default_issue_status_resolved: 已解决 + default_issue_status_feedback: 反馈 + default_issue_status_closed: 已关闭 + default_issue_status_rejected: 已拒绝 + default_doc_category_user: 用户文档 + default_doc_category_tech: 技术文档 + default_priority_low: 低 + default_priority_normal: 普通 + default_priority_high: 高 + default_priority_urgent: 紧急 + default_priority_immediate: 立刻 + default_activity_design: 设计 + default_activity_development: 开发 + + enumeration_issue_priorities: 问题优先级 + enumeration_doc_categories: 文档类别 + enumeration_activities: 活动(时间跟踪) + enumeration_system_activity: 系统活动 + + field_warn_on_leaving_unsaved: 当离开未保存内容的页面时,提示我 + text_warn_on_leaving_unsaved: 若离开当前页面,则该页面内未保存的内容将丢失。 + label_my_queries: 我的自定义查询 + text_journal_changed_no_detail: "%{label} 已更新。" + label_news_comment_added: 添加到新闻的评论 + button_expand_all: 展开所有 + button_collapse_all: 合拢所有 + label_additional_workflow_transitions_for_assignee: 当用户是问题的指派对象时所允许的问题状态转换 + label_additional_workflow_transitions_for_author: 当用户是问题作者时所允许的问题状态转换 + label_bulk_edit_selected_time_entries: 批量修改选定的时间条目 + text_time_entries_destroy_confirmation: 是否确定要删除选定的时间条目? + label_role_anonymous: 匿名用户 + label_role_non_member: 非成员用户 + label_issue_note_added: 问题备注已添加 + label_issue_status_updated: 问题状态更新 + label_issue_priority_updated: 问题优先级更新 + label_issues_visibility_own: 用户创建或被指派的问题 + field_issues_visibility: 问题可见度 + label_issues_visibility_all: 全部问题 + permission_set_own_issues_private: 设置自己的问题为公开或私有 + field_is_private: 私有 + permission_set_issues_private: 设置问题为公开或私有 + label_issues_visibility_public: 全部非私有问题 + text_issues_destroy_descendants_confirmation: 此操作同时会删除 %{count} 个子任务。 + + field_commit_logs_encoding: 提交注释的编码 + field_scm_path_encoding: 路径编码 + text_scm_path_encoding_note: "默认: UTF-8" + field_path_to_repository: 库路径 + field_root_directory: 根目录 + field_cvs_module: CVS 模块 + field_cvsroot: CVSROOT + text_mercurial_repository_note: 本地库 (e.g. /hgrepo, c:\hgrepo) + text_scm_command: 命令 + text_scm_command_version: 版本 + label_git_report_last_commit: 报告最后一次文件/目录提交 + text_scm_config: 您可以在config/configuration.yml中配置您的SCM命令。 请在编辑后,重启Redmine应用。 + text_scm_command_not_available: Scm命令不可用。 请检查管理面板的配置。 + text_git_repository_note: 库中无内容。(e.g. /gitrepo, c:\gitrepo) + notice_issue_successful_create: 问题 %{id} 已创建。 + label_between: 介于 + setting_issue_group_assignment: 允许将问题指派给组 + label_diff: 差异 + description_query_sort_criteria_direction: 排序方式 + description_project_scope: 搜索范围 + description_filter: 过滤器 + description_user_mail_notification: 邮件通知设置 + description_message_content: 信息内容 + description_available_columns: 备选列 + description_issue_category_reassign: 选择问题类别 + description_search: 搜索字段 + description_notes: 批注 + description_choose_project: 项目 + description_query_sort_criteria_attribute: 排序方式 + description_wiki_subpages_reassign: 选择父页面 + description_selected_columns: 已选列 + label_parent_revision: 父修订 + label_child_revision: 子修订 + error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。 + setting_default_issue_start_date_to_creation_date: 使用当前日期作为新问题的开始日期 + button_edit_section: 编辑此区域 + setting_repositories_encodings: 附件和版本库编码 + description_all_columns: 所有列 + button_export: 导出 + label_export_options: "%{export_format} 导出选项" + error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size}) + notice_failed_to_save_time_entries: "无法保存下列所选取的 %{total} 个项目中的 %{count} 工时: %{ids}。" + label_x_issues: + zero: 0 问题 + one: 1 问题 + other: "%{count} 问题" + label_repository_new: 新建版本库 + field_repository_is_default: 主版本库 + label_copy_attachments: 复制附件 + label_item_position: "%{position}/%{count}" + label_completed_versions: 已完成的版本 + text_project_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。
    一旦保存,标识无法修改。 + field_multiple: 多重取值 + setting_commit_cross_project_ref: 允许引用/修复所有其他项目的问题 + text_issue_conflict_resolution_add_notes: 添加说明并取消我的其他变更处理。 + text_issue_conflict_resolution_overwrite: 直接套用我的变更 (先前的说明将被保留,但是某些变更内容可能会被覆盖) + notice_issue_update_conflict: 当您正在编辑这个问题的时候,它已经被其他人抢先一步更新过了。 + text_issue_conflict_resolution_cancel: 取消我所有的变更并重新刷新显示 %{link} 。 + permission_manage_related_issues: 相关问题管理 + field_auth_source_ldap_filter: LDAP 过滤器 + label_search_for_watchers: 通过查找方式添加关注者 + notice_account_deleted: 您的账号已被永久删除(账号已无法恢复)。 + setting_unsubscribe: 允许用户退订 + button_delete_my_account: 删除我的账号 + text_account_destroy_confirmation: |- + 确定继续处理? + 您的账号一旦删除,将无法再次激活使用。 + error_session_expired: 您的会话已过期。请重新登陆。 + text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。" + setting_session_lifetime: 会话最大有效时间 + setting_session_timeout: 会话闲置超时 + label_session_expiration: 会话过期 + permission_close_project: 关闭/重开项目 + label_show_closed_projects: 查看已关闭的项目 + button_close: 关闭 + button_reopen: 重开 + project_status_active: 已激活 + project_status_closed: 已关闭 + project_status_archived: 已存档 + text_project_closed: 当前项目已被关闭。当前项目只读。 + notice_user_successful_create: 用户 %{id} 已创建。 + field_core_fields: 标准字段 + field_timeout: 超时 (秒) + setting_thumbnails_enabled: 显示附件略缩图 + setting_thumbnails_size: 略缩图尺寸 (像素) + label_status_transitions: 状态转换 + label_fields_permissions: 字段权限 + label_readonly: 只读 + label_required: 必填 + text_repository_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。
    一旦保存,标识无法修改。 + field_board_parent: 父论坛 + label_attribute_of_project: 项目 %{name} + label_attribute_of_author: 作者 %{name} + label_attribute_of_assigned_to: 指派给 %{name} + label_attribute_of_fixed_version: 目标版本 %{name} + label_copy_subtasks: 复制子任务 + label_copied_to: 复制到 + label_copied_from: 复制于 + label_any_issues_in_project: 项目内任意问题 + label_any_issues_not_in_project: 项目外任意问题 + field_private_notes: 私有注解 + permission_view_private_notes: 查看私有注解 + permission_set_notes_private: 设置为私有注解 + label_no_issues_in_project: 项目内无相关问题 + label_any: 全部 + label_last_n_weeks: 上 %{count} 周前 + setting_cross_project_subtasks: 支持跨项目子任务 + label_cross_project_descendants: 与子项目共享 + label_cross_project_tree: 与项目树共享 + label_cross_project_hierarchy: 与项目继承层次共享 + label_cross_project_system: 与所有项目共享 + button_hide: 隐藏 + setting_non_working_week_days: 非工作日 + label_in_the_next_days: 在未来几天之内 + label_in_the_past_days: 在过去几天之内 + label_attribute_of_user: 用户是 %{name} + text_turning_multiple_off: 如果您停用多重值设定,重复的值将被移除,以使每个项目仅保留一个值 + label_attribute_of_issue: 问题是 %{name} + permission_add_documents: 添加文档 + permission_edit_documents: 编辑文档 + permission_delete_documents: 删除文档 + label_gantt_progress_line: 进度线 + setting_jsonp_enabled: 启用JSONP支持 + field_inherit_members: 继承父项目成员 + field_closed_on: 结束日期 + field_generate_password: 生成密码 + setting_default_projects_tracker_ids: 新建项目默认跟踪标签 + label_total_time: 合计 + notice_account_not_activated_yet: 您的账号尚未激活. 若您要重新收取激活邮件, 请单击此链接. + notice_account_locked: 您的帐号已被锁定 + label_hidden: 隐藏 + label_visibility_private: 仅对我可见 + label_visibility_roles: 仅对选取角色可见 + label_visibility_public: 对任何人可见 + field_must_change_passwd: 下次登录时必须修改密码 + notice_new_password_must_be_different: 新密码必须和旧密码不同 + setting_mail_handler_excluded_filenames: 移除符合下列名称的附件 + text_convert_available: 可使用 ImageMagick 转换图片格式 (可选) + label_link: 连接 + label_only: 仅于 + label_drop_down_list: 下拉列表 + label_checkboxes: 复选框 + label_link_values_to: 链接数值至此网址 + setting_force_default_language_for_anonymous: 强制匿名用户使用默认语言 + setting_force_default_language_for_loggedin: 强制已登录用户使用默认语言 + label_custom_field_select_type: 请选择需要关联自定义属性的类型 + label_issue_assigned_to_updated: 指派人已更新 + label_check_for_updates: 检查更新 + label_latest_compatible_version: 最新兼容版本 + label_unknown_plugin: 未知插件 + label_radio_buttons: 单选按钮 + label_group_anonymous: 匿名用户 + label_group_non_member: 非成员用户 + label_add_projects: 加入项目 + field_default_status: 默认状态 + text_subversion_repository_note: '示例: file:///, http://, https://, svn://, svn+[tunnelscheme]://' + field_users_visibility: 用户可见度 + label_users_visibility_all: 所有活动用户 + label_users_visibility_members_of_visible_projects: 可见项目中的成员 + label_edit_attachments: 编辑附件 + setting_link_copied_issue: 复制时关联问题 + label_link_copied_issue: 关联已复制的问题 + label_ask: 询问 + label_search_attachments_yes: 搜索附件的文件名和描述 + label_search_attachments_no: 不搜索附件 + label_search_attachments_only: 只搜索附件 + label_search_open_issues_only: 只搜索进行中的问题 + field_address: 邮件地址 + setting_max_additional_emails: 其它电子邮件地址上限 + label_email_address_plural: 电子邮件 + label_email_address_add: 增加电子邮件地址 + label_enable_notifications: 启用通知 + label_disable_notifications: 禁用通知 + setting_search_results_per_page: 每一页的搜索结果数 + label_blank_value: 空白 + permission_copy_issues: 复制问题 + error_password_expired: 您的密码已经过期或是管理员要求您修改密码. + field_time_entries_visibility: 工时记录可见度 + setting_password_max_age: 密码有效期 + label_parent_task_attributes: 父问题属性 + label_parent_task_attributes_derived: 从子任务计算导出 + label_parent_task_attributes_independent: 与子任务无关 + label_time_entries_visibility_all: 所有工时记录 + label_time_entries_visibility_own: 用户自己创建的工时记录 + label_member_management: 成员管理 + label_member_management_all_roles: 所有角色 + label_member_management_selected_roles_only: 只限下列角色 + label_password_required: 确认您的密码后继续 + label_total_spent_time: 总体耗时 + notice_import_finished: 成功导入 %{count} 个项目 + notice_import_finished_with_errors: 有 %{count} 个项目无法导入(共计 %{total} 个) + error_invalid_file_encoding: 这不是一个有效的 %{encoding} 编码文件 + error_invalid_csv_file_or_settings: 这不是一个CSV文件或者不符合以下设置 + error_can_not_read_import_file: 读取导入文件时发生错误 + permission_import_issues: 问题导入 + label_import_issues: 问题导入 + label_select_file_to_import: 选择要导入的文件 + label_fields_separator: 字段分隔符 + label_fields_wrapper: 字段包装识别符 + label_encoding: 编码 + label_comma_char: 逗号(,) + label_semi_colon_char: 分号(;) + label_quote_char: 单引号(') + label_double_quote_char: 双引号(") + label_fields_mapping: 字段映射 + label_file_content_preview: 文件内容预览 + label_create_missing_values: 创建缺失的数值 + button_import: 导入 + field_total_estimated_hours: 预估工时统计 + label_api: API + label_total_plural: 总计 + label_assigned_issues: 被指派的问题 + label_field_format_enumeration: 键/值 清单 + label_f_hour_short: '%{value} 小时' + field_default_version: 默认版本 + error_attachment_extension_not_allowed: 不允许上传此类型 %{extension} 附件 + setting_attachment_extensions_allowed: 允许上传的附件类型 + setting_attachment_extensions_denied: 禁止上传的附件类型 + label_any_open_issues: 任意进行中的问题 + label_no_open_issues: 任意已关闭的问题 + label_default_values_for_new_users: 新用户默认值 + error_ldap_bind_credentials: 无效的LDAP账号或密码 + setting_sys_api_key: 版本库管理网页服务 API 密钥 + setting_lost_password: 忘记密码 + mail_subject_security_notification: 安全通知 + mail_body_security_notification_change: "%{field} 已变更." + mail_body_security_notification_change_to: "%{field} 已变更为 %{value}." + mail_body_security_notification_add: "%{field} %{value} 已增加." + mail_body_security_notification_remove: "%{field} %{value} 已移除." + mail_body_security_notification_notify_enabled: 邮件地址 %{value} 开始接收通知. + mail_body_security_notification_notify_disabled: 邮件地址 %{value} 不再接收通知. + mail_body_settings_updated: "下列设置已更新:" + field_remote_ip: IP 地址 + label_wiki_page_new: 新建Wiki页面 + label_relations: 相关的问题 + button_filter: 设置为过滤条件 + mail_body_password_updated: 您的密码已经变更。 + label_no_preview: 没有可以显示的预览内容 + error_no_tracker_allowed_for_new_issue_in_project: 项目没有任何跟踪标签,您不能创建一个问题 + label_tracker_all: 所有跟踪标签 + label_new_project_issue_tab_enabled: 显示“新建问题”标签 + setting_new_item_menu_tab: 建立新对象条目的项目菜单栏目 + label_new_object_tab_enabled: 显示 "+" 为下拉列表 + error_no_projects_with_tracker_allowed_for_new_issue: 当前项目中不包含对应的跟踪类型,不能创建该类型的工作项。 + field_textarea_font: 用于文本区域的字体 + label_font_default: 默认字体 + label_font_monospace: 等宽字体 + label_font_proportional: 比例字体 + setting_timespan_format: 时间格式设置 + label_table_of_contents: 目录 + setting_commit_logs_formatting: 在提交日志消息时,应用文本格式 + setting_mail_handler_enable_regex_delimiters: 启用正则表达式 + error_move_of_child_not_possible: '子任务 %{child} 不能移动到新项目:%{errors}' + error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted: 已用耗时不能重新分配到即将被删除的任务里。 + setting_timelog_required_fields: 工时登记必填字段 + label_attribute_of_object: '%{object_name} 的 %{name} 属性' + label_user_mail_option_only_assigned: 只发送我关注或指派给我的相关信息 + label_user_mail_option_only_owner: 只发送我关注或我创建的相关信息 + warning_fields_cleared_on_bulk_edit: 修改将导致所选内容的一个或多个字段值被自动删除。 + field_updated_by: 更新人 + field_last_updated_by: 最近更新人 + field_full_width_layout: 全宽布局 + label_last_notes: 最近批注 + field_digest: 校验和 + field_default_assigned_to: 默认指派给 + setting_show_custom_fields_on_registration: 注册时显示自定义字段 + permission_view_news: 查看新闻 + label_no_preview_alternative_html: 无法预览。请使用文件 %{link} 查阅。 + label_no_preview_download: 下载 diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..d28b6af --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,392 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Rails.application.routes.draw do + root :to => 'welcome#index', :as => 'home' + + match 'login', :to => 'account#login', :as => 'signin', :via => [:get, :post] + match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post] + match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register' + match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password' + match 'account/activate', :to => 'account#activate', :via => :get + get 'account/activation_email', :to => 'account#activation_email', :as => 'activation_email' + + match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news', :via => [:get, :post, :put, :patch] + match '/issues/preview/new/:project_id', :to => 'previews#issue', :as => 'preview_new_issue', :via => [:get, :post, :put, :patch] + match '/issues/preview/edit/:id', :to => 'previews#issue', :as => 'preview_edit_issue', :via => [:get, :post, :put, :patch] + match '/issues/preview', :to => 'previews#issue', :as => 'preview_issue', :via => [:get, :post, :put, :patch] + + match 'projects/:id/wiki', :to => 'wikis#edit', :via => :post + match 'projects/:id/wiki/destroy', :to => 'wikis#destroy', :via => [:get, :post] + + match 'boards/:board_id/topics/new', :to => 'messages#new', :via => [:get, :post], :as => 'new_board_message' + get 'boards/:board_id/topics/:id', :to => 'messages#show', :as => 'board_message' + match 'boards/:board_id/topics/quote/:id', :to => 'messages#quote', :via => [:get, :post] + get 'boards/:board_id/topics/:id/edit', :to => 'messages#edit' + + post 'boards/:board_id/topics/preview', :to => 'messages#preview', :as => 'preview_board_message' + post 'boards/:board_id/topics/:id/replies', :to => 'messages#reply' + post 'boards/:board_id/topics/:id/edit', :to => 'messages#edit' + post 'boards/:board_id/topics/:id/destroy', :to => 'messages#destroy' + + # Misc issue routes. TODO: move into resources + match '/issues/auto_complete', :to => 'auto_completes#issues', :via => :get, :as => 'auto_complete_issues' + match '/issues/context_menu', :to => 'context_menus#issues', :as => 'issues_context_menu', :via => [:get, :post] + match '/issues/changes', :to => 'journals#index', :as => 'issue_changes', :via => :get + match '/issues/:id/quoted', :to => 'journals#new', :id => /\d+/, :via => :post, :as => 'quoted_issue' + + resources :journals, :only => [:edit, :update] do + member do + get 'diff' + end + end + + get '/projects/:project_id/issues/gantt', :to => 'gantts#show', :as => 'project_gantt' + get '/issues/gantt', :to => 'gantts#show' + + get '/projects/:project_id/issues/calendar', :to => 'calendars#show', :as => 'project_calendar' + get '/issues/calendar', :to => 'calendars#show' + + get 'projects/:id/issues/report', :to => 'reports#issue_report', :as => 'project_issues_report' + get 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :as => 'project_issues_report_details' + + get '/issues/imports/new', :to => 'imports#new', :as => 'new_issues_import' + post '/imports', :to => 'imports#create', :as => 'imports' + get '/imports/:id', :to => 'imports#show', :as => 'import' + match '/imports/:id/settings', :to => 'imports#settings', :via => [:get, :post], :as => 'import_settings' + match '/imports/:id/mapping', :to => 'imports#mapping', :via => [:get, :post], :as => 'import_mapping' + match '/imports/:id/run', :to => 'imports#run', :via => [:get, :post], :as => 'import_run' + + match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :post] + match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post] + match 'my/page', :controller => 'my', :action => 'page', :via => :get + post 'my/page', :to => 'my#update_page' + match 'my', :controller => 'my', :action => 'index', :via => :get # Redirects to my/page + get 'my/api_key', :to => 'my#show_api_key', :as => 'my_api_key' + post 'my/api_key', :to => 'my#reset_api_key' + post 'my/rss_key', :to => 'my#reset_rss_key', :as => 'my_rss_key' + match 'my/password', :controller => 'my', :action => 'password', :via => [:get, :post] + match 'my/add_block', :controller => 'my', :action => 'add_block', :via => :post + match 'my/remove_block', :controller => 'my', :action => 'remove_block', :via => :post + match 'my/order_blocks', :controller => 'my', :action => 'order_blocks', :via => :post + + resources :users do + resources :memberships, :controller => 'principal_memberships' + resources :email_addresses, :only => [:index, :create, :update, :destroy] + end + + post 'watchers/watch', :to => 'watchers#watch', :as => 'watch' + delete 'watchers/watch', :to => 'watchers#unwatch' + get 'watchers/new', :to => 'watchers#new', :as => 'new_watchers' + post 'watchers', :to => 'watchers#create' + post 'watchers/append', :to => 'watchers#append' + delete 'watchers', :to => 'watchers#destroy' + get 'watchers/autocomplete_for_user', :to => 'watchers#autocomplete_for_user' + # Specific routes for issue watchers API + post 'issues/:object_id/watchers', :to => 'watchers#create', :object_type => 'issue' + delete 'issues/:object_id/watchers/:user_id' => 'watchers#destroy', :object_type => 'issue' + + resources :projects do + collection do + get 'autocomplete' + end + + member do + get 'settings(/:tab)', :action => 'settings', :as => 'settings' + post 'modules' + post 'archive' + post 'unarchive' + post 'close' + post 'reopen' + match 'copy', :via => [:get, :post] + end + + shallow do + resources :memberships, :controller => 'members' do + collection do + get 'autocomplete' + end + end + end + + resource :enumerations, :controller => 'project_enumerations', :only => [:update, :destroy] + + get 'issues/:copy_from/copy', :to => 'issues#new', :as => 'copy_issue' + resources :issues, :only => [:index, :new, :create] + # Used when updating the form of a new issue + post 'issues/new', :to => 'issues#new' + + resources :files, :only => [:index, :new, :create] + + resources :versions, :except => [:index, :show, :edit, :update, :destroy] do + collection do + put 'close_completed' + end + end + get 'versions.:format', :to => 'versions#index' + get 'roadmap', :to => 'versions#index', :format => false + get 'versions', :to => 'versions#index' + + resources :news, :except => [:show, :edit, :update, :destroy] + resources :time_entries, :controller => 'timelog', :except => [:show, :edit, :update, :destroy] do + get 'report', :on => :collection + end + resources :queries, :only => [:new, :create] + shallow do + resources :issue_categories + end + resources :documents, :except => [:show, :edit, :update, :destroy] + resources :boards + shallow do + resources :repositories, :except => [:index, :show] do + member do + match 'committers', :via => [:get, :post] + end + end + end + + match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get + resources :wiki, :except => [:index, :create], :as => 'wiki_page' do + member do + get 'rename' + post 'rename' + get 'history' + get 'diff' + match 'preview', :via => [:post, :put, :patch] + post 'protect' + post 'add_attachment' + end + collection do + get 'export' + get 'date_index' + post 'new' + end + end + match 'wiki', :controller => 'wiki', :action => 'show', :via => :get + get 'wiki/:id/:version', :to => 'wiki#show', :constraints => {:version => /\d+/} + delete 'wiki/:id/:version', :to => 'wiki#destroy_version' + get 'wiki/:id/:version/annotate', :to => 'wiki#annotate' + get 'wiki/:id/:version/diff', :to => 'wiki#diff' + end + + resources :issues do + member do + # Used when updating the form of an existing issue + patch 'edit', :to => 'issues#edit' + end + collection do + match 'bulk_edit', :via => [:get, :post] + post 'bulk_update' + end + resources :time_entries, :controller => 'timelog', :only => [:new, :create] + shallow do + resources :relations, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy] + end + end + # Used when updating the form of a new issue outside a project + post '/issues/new', :to => 'issues#new' + match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete + + resources :queries, :except => [:show] + get '/queries/filter', :to => 'queries#filter', :as => 'queries_filter' + + resources :news, :only => [:index, :show, :edit, :update, :destroy] + match '/news/:id/comments', :to => 'comments#create', :via => :post + match '/news/:id/comments/:comment_id', :to => 'comments#destroy', :via => :delete + + resources :versions, :only => [:show, :edit, :update, :destroy] do + post 'status_by', :on => :member + end + + resources :documents, :only => [:show, :edit, :update, :destroy] do + post 'add_attachment', :on => :member + end + + match '/time_entries/context_menu', :to => 'context_menus#time_entries', :as => :time_entries_context_menu, :via => [:get, :post] + + resources :time_entries, :controller => 'timelog', :except => :destroy do + member do + # Used when updating the edit form of an existing time entry + patch 'edit', :to => 'timelog#edit' + end + collection do + get 'report' + get 'bulk_edit' + post 'bulk_update' + end + end + match '/time_entries/:id', :to => 'timelog#destroy', :via => :delete, :id => /\d+/ + # TODO: delete /time_entries for bulk deletion + match '/time_entries/destroy', :to => 'timelog#destroy', :via => :delete + # Used to update the new time entry form + post '/time_entries/new', :to => 'timelog#new' + + get 'projects/:id/activity', :to => 'activities#index', :as => :project_activity + get 'activity', :to => 'activities#index' + + # repositories routes + get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats' + get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph' + + get 'projects/:id/repository/:repository_id/changes(/*path)', + :to => 'repositories#changes', + :format => false + + get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision' + get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision' + post 'projects/:id/repository/:repository_id/revisions/:rev/issues', :to => 'repositories#add_related_issue' + delete 'projects/:id/repository/:repository_id/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue' + get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions' + %w(browse show entry raw annotate diff).each do |action| + get "projects/:id/repository/:repository_id/revisions/:rev/#{action}(/*path)", + :controller => 'repositories', + :action => action, + :format => false, + :constraints => {:rev => /[a-z0-9\.\-_]+/} + end + + get 'projects/:id/repository/statistics', :to => 'repositories#stats' + get 'projects/:id/repository/graph', :to => 'repositories#graph' + + get 'projects/:id/repository/changes(/*path)', + :to => 'repositories#changes', + :format => false + + get 'projects/:id/repository/revisions', :to => 'repositories#revisions' + get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision' + get 'projects/:id/repository/revision', :to => 'repositories#revision' + post 'projects/:id/repository/revisions/:rev/issues', :to => 'repositories#add_related_issue' + delete 'projects/:id/repository/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue' + %w(browse show entry raw annotate diff).each do |action| + get "projects/:id/repository/revisions/:rev/#{action}(/*path)", + :controller => 'repositories', + :action => action, + :format => false, + :constraints => {:rev => /[a-z0-9\.\-_]+/} + end + %w(browse entry raw changes annotate diff).each do |action| + get "projects/:id/repository/:repository_id/#{action}(/*path)", + :controller => 'repositories', + :action => action, + :format => false + end + %w(browse entry raw changes annotate diff).each do |action| + get "projects/:id/repository/#{action}(/*path)", + :controller => 'repositories', + :action => action, + :format => false + end + + get 'projects/:id/repository/:repository_id/show/*path', :to => 'repositories#show', :format => false + get 'projects/:id/repository/show/*path', :to => 'repositories#show', :format => false + + get 'projects/:id/repository/:repository_id', :to => 'repositories#show', :path => nil + get 'projects/:id/repository', :to => 'repositories#show', :path => nil + + # additional routes for having the file name at the end of url + get 'attachments/:id/:filename', :to => 'attachments#show', :id => /\d+/, :filename => /.*/, :as => 'named_attachment' + get 'attachments/download/:id/:filename', :to => 'attachments#download', :id => /\d+/, :filename => /.*/, :as => 'download_named_attachment' + get 'attachments/download/:id', :to => 'attachments#download', :id => /\d+/ + get 'attachments/thumbnail/:id(/:size)', :to => 'attachments#thumbnail', :id => /\d+/, :size => /\d+/, :as => 'thumbnail' + resources :attachments, :only => [:show, :update, :destroy] + get 'attachments/:object_type/:object_id/edit', :to => 'attachments#edit_all', :as => :object_attachments_edit + patch 'attachments/:object_type/:object_id', :to => 'attachments#update_all', :as => :object_attachments + + resources :groups do + resources :memberships, :controller => 'principal_memberships' + member do + get 'autocomplete_for_user' + end + end + + get 'groups/:id/users/new', :to => 'groups#new_users', :id => /\d+/, :as => 'new_group_users' + post 'groups/:id/users', :to => 'groups#add_users', :id => /\d+/, :as => 'group_users' + delete 'groups/:id/users/:user_id', :to => 'groups#remove_user', :id => /\d+/, :as => 'group_user' + + resources :trackers, :except => :show do + collection do + match 'fields', :via => [:get, :post] + end + end + resources :issue_statuses, :except => :show do + collection do + post 'update_issue_done_ratio' + end + end + resources :custom_fields, :except => :show do + resources :enumerations, :controller => 'custom_field_enumerations', :except => [:show, :new, :edit] + put 'enumerations', :to => 'custom_field_enumerations#update_each' + end + resources :roles do + collection do + match 'permissions', :via => [:get, :post] + end + end + resources :enumerations, :except => :show + match 'enumerations/:type', :to => 'enumerations#index', :via => :get + + get 'projects/:id/search', :controller => 'search', :action => 'index' + get 'search', :controller => 'search', :action => 'index' + + + get 'mail_handler', :to => 'mail_handler#new' + post 'mail_handler', :to => 'mail_handler#index' + + get 'admin', :to => 'admin#index' + get 'admin/projects', :to => 'admin#projects' + get 'admin/plugins', :to => 'admin#plugins' + get 'admin/info', :to => 'admin#info' + post 'admin/test_email', :to => 'admin#test_email', :as => 'test_email' + post 'admin/default_configuration', :to => 'admin#default_configuration' + + resources :auth_sources do + member do + get 'test_connection', :as => 'try_connection' + end + collection do + get 'autocomplete_for_new_user' + end + end + + match 'workflows', :controller => 'workflows', :action => 'index', :via => :get + match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post] + match 'workflows/permissions', :controller => 'workflows', :action => 'permissions', :via => [:get, :post] + match 'workflows/copy', :controller => 'workflows', :action => 'copy', :via => [:get, :post] + match 'settings', :controller => 'settings', :action => 'index', :via => :get + match 'settings/edit', :controller => 'settings', :action => 'edit', :via => [:get, :post] + match 'settings/plugin/:id', :controller => 'settings', :action => 'plugin', :via => [:get, :post], :as => 'plugin_settings' + + match 'sys/projects', :to => 'sys#projects', :via => :get + match 'sys/projects/:id/repository', :to => 'sys#create_project_repository', :via => :post + match 'sys/fetch_changesets', :to => 'sys#fetch_changesets', :via => [:get, :post] + + match 'uploads', :to => 'attachments#upload', :via => :post + + get 'robots.txt', :to => 'welcome#robots' + + Dir.glob File.expand_path("#{Redmine::Plugin.directory}/*") do |plugin_dir| + file = File.join(plugin_dir, "config/routes.rb") + if File.exists?(file) + begin + instance_eval File.read(file) + rescue Exception => e + puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}." + exit 1 + end + end + end +end diff --git a/config/secrets.yml.sample b/config/secrets.yml.sample deleted file mode 100644 index 196f834..0000000 --- a/config/secrets.yml.sample +++ /dev/null @@ -1,2 +0,0 @@ -production: - secret_key_base: "" diff --git a/config/settings.yml b/config/settings.yml new file mode 100644 index 0000000..a646977 --- /dev/null +++ b/config/settings.yml @@ -0,0 +1,292 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# DO NOT MODIFY THIS FILE !!! +# Settings can be defined through the application in Admin -> Settings + +app_title: + default: Redmine +app_subtitle: + default: Project management +welcome_text: + default: +login_required: + default: 0 + security_notifications: 1 +self_registration: + default: '2' + security_notifications: 1 +show_custom_fields_on_registration: + default: 1 +lost_password: + default: 1 + security_notifications: 1 +unsubscribe: + default: 1 +password_min_length: + format: int + default: 8 + security_notifications: 1 +# Maximum password age in days +password_max_age: + format: int + default: 0 + security_notifications: 1 +# Maximum number of additional email addresses per user +max_additional_emails: + format: int + default: 5 +# Maximum lifetime of user sessions in minutes +session_lifetime: + format: int + default: 0 + security_notifications: 1 +# User session timeout in minutes +session_timeout: + format: int + default: 0 + security_notifications: 1 +attachment_max_size: + format: int + default: 5120 +attachment_extensions_allowed: + default: +attachment_extensions_denied: + default: +issues_export_limit: + format: int + default: 500 +activity_days_default: + format: int + default: 30 +per_page_options: + default: '25,50,100' +search_results_per_page: + default: 10 +mail_from: + default: redmine@example.net +bcc_recipients: + default: 1 +plain_text_mail: + default: 0 +text_formatting: + default: textile +cache_formatted_text: + default: 0 +wiki_compression: + default: "" +default_language: + default: en +force_default_language_for_anonymous: + default: 0 +force_default_language_for_loggedin: + default: 0 +host_name: + default: localhost:3000 +protocol: + default: http + security_notifications: 1 +feeds_limit: + format: int + default: 15 +gantt_items_limit: + format: int + default: 500 +# Maximum size of files that can be displayed +# inline through the file viewer (in KB) +file_max_size_displayed: + format: int + default: 512 +diff_max_lines_displayed: + format: int + default: 1500 +enabled_scm: + serialized: true + default: + - Subversion + - Darcs + - Mercurial + - Cvs + - Bazaar + - Git + security_notifications: 1 +autofetch_changesets: + default: 1 +sys_api_enabled: + default: 0 + security_notifications: 1 +sys_api_key: + default: '' + security_notifications: 1 +commit_cross_project_ref: + default: 0 +commit_ref_keywords: + default: 'refs,references,IssueID' +commit_update_keywords: + serialized: true + default: [] +commit_logtime_enabled: + default: 0 +commit_logtime_activity_id: + format: int + default: 0 +# autologin duration in days +# 0 means autologin is disabled +autologin: + format: int + default: 0 +# date format +date_format: + default: '' +time_format: + default: '' +timespan_format: + default: 'decimal' +user_format: + default: :firstname_lastname + format: symbol +cross_project_issue_relations: + default: 0 +# Enables subtasks to be in other projects +cross_project_subtasks: + default: 'tree' +parent_issue_dates: + default: 'derived' +parent_issue_priority: + default: 'derived' +parent_issue_done_ratio: + default: 'derived' +link_copied_issue: + default: 'ask' +issue_group_assignment: + default: 0 +default_issue_start_date_to_creation_date: + default: 1 +notified_events: + serialized: true + default: + - issue_added + - issue_updated +mail_handler_body_delimiters: + default: '' +mail_handler_enable_regex_delimiters: + default: 0 +mail_handler_excluded_filenames: + default: '' +mail_handler_api_enabled: + default: 0 + security_notifications: 1 +mail_handler_api_key: + default: + security_notifications: 1 +issue_list_default_columns: + serialized: true + default: + - tracker + - status + - priority + - subject + - assigned_to + - updated_on +issue_list_default_totals: + serialized: true + default: [] +display_subprojects_issues: + default: 1 +issue_done_ratio: + default: 'issue_field' +default_projects_public: + default: 1 +default_projects_modules: + serialized: true + default: + - issue_tracking + - time_tracking + - news + - documents + - files + - wiki + - repository + - boards + - calendar + - gantt +default_projects_tracker_ids: + serialized: true + default: +# Role given to a non-admin user who creates a project +new_project_user_role_id: + format: int + default: '' +sequential_project_identifiers: + default: 0 +# encodings used to convert repository files content to UTF-8 +# multiple values accepted, comma separated +default_users_hide_mail: + default: 1 +default_users_time_zone: + default: "" +repositories_encodings: + default: '' +# encoding used to convert commit logs to UTF-8 +commit_logs_encoding: + default: 'UTF-8' +commit_logs_formatting: + default: 1 +repository_log_display_limit: + format: int + default: 100 +ui_theme: + default: '' +emails_footer: + default: |- + You have received this notification because you have either subscribed to it, or are involved in it. + To change your notification preferences, please click here: http://hostname/my/account +gravatar_enabled: + default: 0 +openid: + default: 0 + security_notifications: 1 +gravatar_default: + default: '' +start_of_week: + default: '' +rest_api_enabled: + default: 0 + security_notifications: 1 +jsonp_enabled: + default: 0 + security_notifications: 1 +default_notification_option: + default: 'only_my_events' +emails_header: + default: '' +thumbnails_enabled: + default: 0 +thumbnails_size: + format: int + default: 100 +non_working_week_days: + serialized: true + default: + - '6' + - '7' +new_item_menu_tab: + default: 2 +timelog_required_fields: + serialized: true + default: [] diff --git a/db/migrate/001_setup.rb b/db/migrate/001_setup.rb new file mode 100644 index 0000000..15d783c --- /dev/null +++ b/db/migrate/001_setup.rb @@ -0,0 +1,329 @@ +# Redmine - project management software +# Copyright (C) 2006 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Setup < ActiveRecord::Migration + + class User < ActiveRecord::Base + attr_protected :id + end + + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + create_table "attachments", :force => true do |t| + t.column "container_id", :integer, :default => 0, :null => false + t.column "container_type", :string, :limit => 30, :default => "", :null => false + t.column "filename", :string, :default => "", :null => false + t.column "disk_filename", :string, :default => "", :null => false + t.column "filesize", :integer, :default => 0, :null => false + t.column "content_type", :string, :limit => 60, :default => "" + t.column "digest", :string, :limit => 40, :default => "", :null => false + t.column "downloads", :integer, :default => 0, :null => false + t.column "author_id", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + end + + create_table "auth_sources", :force => true do |t| + t.column "type", :string, :limit => 30, :default => "", :null => false + t.column "name", :string, :limit => 60, :default => "", :null => false + t.column "host", :string, :limit => 60 + t.column "port", :integer + t.column "account", :string, :limit => 60 + t.column "account_password", :string, :limit => 60 + t.column "base_dn", :string, :limit => 255 + t.column "attr_login", :string, :limit => 30 + t.column "attr_firstname", :string, :limit => 30 + t.column "attr_lastname", :string, :limit => 30 + t.column "attr_mail", :string, :limit => 30 + t.column "onthefly_register", :boolean, :default => false, :null => false + end + + create_table "custom_fields", :force => true do |t| + t.column "type", :string, :limit => 30, :default => "", :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "field_format", :string, :limit => 30, :default => "", :null => false + t.column "possible_values", :text + t.column "regexp", :string, :default => "" + t.column "min_length", :integer, :default => 0, :null => false + t.column "max_length", :integer, :default => 0, :null => false + t.column "is_required", :boolean, :default => false, :null => false + t.column "is_for_all", :boolean, :default => false, :null => false + end + + create_table "custom_fields_projects", :id => false, :force => true do |t| + t.column "custom_field_id", :integer, :default => 0, :null => false + t.column "project_id", :integer, :default => 0, :null => false + end + + create_table "custom_fields_trackers", :id => false, :force => true do |t| + t.column "custom_field_id", :integer, :default => 0, :null => false + t.column "tracker_id", :integer, :default => 0, :null => false + end + + create_table "custom_values", :force => true do |t| + t.column "customized_type", :string, :limit => 30, :default => "", :null => false + t.column "customized_id", :integer, :default => 0, :null => false + t.column "custom_field_id", :integer, :default => 0, :null => false + t.column "value", :text + end + + create_table "documents", :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "category_id", :integer, :default => 0, :null => false + t.column "title", :string, :limit => 60, :default => "", :null => false + t.column "description", :text + t.column "created_on", :timestamp + end + + add_index "documents", ["project_id"], :name => "documents_project_id" + + create_table "enumerations", :force => true do |t| + t.column "opt", :string, :limit => 4, :default => "", :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + end + + create_table "issue_categories", :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + end + + add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" + + create_table "issue_histories", :force => true do |t| + t.column "issue_id", :integer, :default => 0, :null => false + t.column "status_id", :integer, :default => 0, :null => false + t.column "author_id", :integer, :default => 0, :null => false + t.column "notes", :text + t.column "created_on", :timestamp + end + + add_index "issue_histories", ["issue_id"], :name => "issue_histories_issue_id" + + create_table "issue_statuses", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "is_closed", :boolean, :default => false, :null => false + t.column "is_default", :boolean, :default => false, :null => false + t.column "html_color", :string, :limit => 6, :default => "FFFFFF", :null => false + end + + create_table "issues", :force => true do |t| + t.column "tracker_id", :integer, :default => 0, :null => false + t.column "project_id", :integer, :default => 0, :null => false + t.column "subject", :string, :default => "", :null => false + t.column "description", :text + t.column "due_date", :date + t.column "category_id", :integer + t.column "status_id", :integer, :default => 0, :null => false + t.column "assigned_to_id", :integer + t.column "priority_id", :integer, :default => 0, :null => false + t.column "fixed_version_id", :integer + t.column "author_id", :integer, :default => 0, :null => false + t.column "lock_version", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + add_index "issues", ["project_id"], :name => "issues_project_id" + + create_table "members", :force => true do |t| + t.column "user_id", :integer, :default => 0, :null => false + t.column "project_id", :integer, :default => 0, :null => false + t.column "role_id", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + end + + create_table "news", :force => true do |t| + t.column "project_id", :integer + t.column "title", :string, :limit => 60, :default => "", :null => false + t.column "summary", :string, :limit => 255, :default => "" + t.column "description", :text + t.column "author_id", :integer, :default => 0, :null => false + t.column "created_on", :timestamp + end + + add_index "news", ["project_id"], :name => "news_project_id" + + create_table "permissions", :force => true do |t| + t.column "controller", :string, :limit => 30, :default => "", :null => false + t.column "action", :string, :limit => 30, :default => "", :null => false + t.column "description", :string, :limit => 60, :default => "", :null => false + t.column "is_public", :boolean, :default => false, :null => false + t.column "sort", :integer, :default => 0, :null => false + t.column "mail_option", :boolean, :default => false, :null => false + t.column "mail_enabled", :boolean, :default => false, :null => false + end + + create_table "permissions_roles", :id => false, :force => true do |t| + t.column "permission_id", :integer, :default => 0, :null => false + t.column "role_id", :integer, :default => 0, :null => false + end + + add_index "permissions_roles", ["role_id"], :name => "permissions_roles_role_id" + + create_table "projects", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "description", :string, :default => "", :null => false + t.column "homepage", :string, :limit => 60, :default => "" + t.column "is_public", :boolean, :default => true, :null => false + t.column "parent_id", :integer + t.column "projects_count", :integer, :default => 0 + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + create_table "roles", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + end + + create_table "tokens", :force => true do |t| + t.column "user_id", :integer, :default => 0, :null => false + t.column "action", :string, :limit => 30, :default => "", :null => false + t.column "value", :string, :limit => 40, :default => "", :null => false + t.column "created_on", :datetime, :null => false + end + + create_table "trackers", :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "is_in_chlog", :boolean, :default => false, :null => false + end + + create_table "users", :force => true do |t| + t.column "login", :string, :limit => 30, :default => "", :null => false + t.column "hashed_password", :string, :limit => 40, :default => "", :null => false + t.column "firstname", :string, :limit => 30, :default => "", :null => false + t.column "lastname", :string, :limit => 30, :default => "", :null => false + t.column "mail", :string, :limit => 60, :default => "", :null => false + t.column "mail_notification", :boolean, :default => true, :null => false + t.column "admin", :boolean, :default => false, :null => false + t.column "status", :integer, :default => 1, :null => false + t.column "last_login_on", :datetime + t.column "language", :string, :limit => 2, :default => "" + t.column "auth_source_id", :integer + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + create_table "versions", :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "description", :string, :default => "" + t.column "effective_date", :date + t.column "created_on", :timestamp + t.column "updated_on", :timestamp + end + + add_index "versions", ["project_id"], :name => "versions_project_id" + + create_table "workflows", :force => true do |t| + t.column "tracker_id", :integer, :default => 0, :null => false + t.column "old_status_id", :integer, :default => 0, :null => false + t.column "new_status_id", :integer, :default => 0, :null => false + t.column "role_id", :integer, :default => 0, :null => false + end + + # project + Permission.create :controller => "projects", :action => "show", :description => "label_overview", :sort => 100, :is_public => true + Permission.create :controller => "projects", :action => "changelog", :description => "label_change_log", :sort => 105, :is_public => true + Permission.create :controller => "reports", :action => "issue_report", :description => "label_report_plural", :sort => 110, :is_public => true + Permission.create :controller => "projects", :action => "settings", :description => "label_settings", :sort => 150 + Permission.create :controller => "projects", :action => "edit", :description => "button_edit", :sort => 151 + # members + Permission.create :controller => "projects", :action => "list_members", :description => "button_list", :sort => 200, :is_public => true + Permission.create :controller => "projects", :action => "add_member", :description => "button_add", :sort => 220 + Permission.create :controller => "members", :action => "edit", :description => "button_edit", :sort => 221 + Permission.create :controller => "members", :action => "destroy", :description => "button_delete", :sort => 222 + # versions + Permission.create :controller => "projects", :action => "add_version", :description => "button_add", :sort => 320 + Permission.create :controller => "versions", :action => "edit", :description => "button_edit", :sort => 321 + Permission.create :controller => "versions", :action => "destroy", :description => "button_delete", :sort => 322 + # issue categories + Permission.create :controller => "projects", :action => "add_issue_category", :description => "button_add", :sort => 420 + Permission.create :controller => "issue_categories", :action => "edit", :description => "button_edit", :sort => 421 + Permission.create :controller => "issue_categories", :action => "destroy", :description => "button_delete", :sort => 422 + # issues + Permission.create :controller => "projects", :action => "list_issues", :description => "button_list", :sort => 1000, :is_public => true + Permission.create :controller => "projects", :action => "export_issues_csv", :description => "label_export_csv", :sort => 1001, :is_public => true + Permission.create :controller => "issues", :action => "show", :description => "button_view", :sort => 1005, :is_public => true + Permission.create :controller => "issues", :action => "download", :description => "button_download", :sort => 1010, :is_public => true + Permission.create :controller => "projects", :action => "add_issue", :description => "button_add", :sort => 1050, :mail_option => 1, :mail_enabled => 1 + Permission.create :controller => "issues", :action => "edit", :description => "button_edit", :sort => 1055 + Permission.create :controller => "issues", :action => "change_status", :description => "label_change_status", :sort => 1060, :mail_option => 1, :mail_enabled => 1 + Permission.create :controller => "issues", :action => "destroy", :description => "button_delete", :sort => 1065 + Permission.create :controller => "issues", :action => "add_attachment", :description => "label_attachment_new", :sort => 1070 + Permission.create :controller => "issues", :action => "destroy_attachment", :description => "label_attachment_delete", :sort => 1075 + # news + Permission.create :controller => "projects", :action => "list_news", :description => "button_list", :sort => 1100, :is_public => true + Permission.create :controller => "news", :action => "show", :description => "button_view", :sort => 1101, :is_public => true + Permission.create :controller => "projects", :action => "add_news", :description => "button_add", :sort => 1120 + Permission.create :controller => "news", :action => "edit", :description => "button_edit", :sort => 1121 + Permission.create :controller => "news", :action => "destroy", :description => "button_delete", :sort => 1122 + # documents + Permission.create :controller => "projects", :action => "list_documents", :description => "button_list", :sort => 1200, :is_public => true + Permission.create :controller => "documents", :action => "show", :description => "button_view", :sort => 1201, :is_public => true + Permission.create :controller => "documents", :action => "download", :description => "button_download", :sort => 1202, :is_public => true + Permission.create :controller => "projects", :action => "add_document", :description => "button_add", :sort => 1220 + Permission.create :controller => "documents", :action => "edit", :description => "button_edit", :sort => 1221 + Permission.create :controller => "documents", :action => "destroy", :description => "button_delete", :sort => 1222 + Permission.create :controller => "documents", :action => "add_attachment", :description => "label_attachment_new", :sort => 1223 + Permission.create :controller => "documents", :action => "destroy_attachment", :description => "label_attachment_delete", :sort => 1224 + # files + Permission.create :controller => "projects", :action => "list_files", :description => "button_list", :sort => 1300, :is_public => true + Permission.create :controller => "versions", :action => "download", :description => "button_download", :sort => 1301, :is_public => true + Permission.create :controller => "projects", :action => "add_file", :description => "button_add", :sort => 1320 + Permission.create :controller => "versions", :action => "destroy_file", :description => "button_delete", :sort => 1322 + + # create default administrator account + user = User.new :firstname => "Redmine", + :lastname => "Admin", + :mail => "admin@example.net", + :mail_notification => true, + :status => 1 + user.login = 'admin' + user.hashed_password = "d033e22ae348aeb5660fc2140aec35850c4da997" + user.admin = true + user.save + + + end + + def self.down + drop_table :attachments + drop_table :auth_sources + drop_table :custom_fields + drop_table :custom_fields_projects + drop_table :custom_fields_trackers + drop_table :custom_values + drop_table :documents + drop_table :enumerations + drop_table :issue_categories + drop_table :issue_histories + drop_table :issue_statuses + drop_table :issues + drop_table :members + drop_table :news + drop_table :permissions + drop_table :permissions_roles + drop_table :projects + drop_table :roles + drop_table :trackers + drop_table :tokens + drop_table :users + drop_table :versions + drop_table :workflows + end +end diff --git a/db/migrate/002_issue_move.rb b/db/migrate/002_issue_move.rb new file mode 100644 index 0000000..98e95d3 --- /dev/null +++ b/db/migrate/002_issue_move.rb @@ -0,0 +1,12 @@ +class IssueMove < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "move_issues", :description => "button_move", :sort => 1061, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'projects', 'move_issues').first.destroy + end +end diff --git a/db/migrate/003_issue_add_note.rb b/db/migrate/003_issue_add_note.rb new file mode 100644 index 0000000..dabdb85 --- /dev/null +++ b/db/migrate/003_issue_add_note.rb @@ -0,0 +1,12 @@ +class IssueAddNote < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "issues", :action => "add_note", :description => "label_add_note", :sort => 1057, :mail_option => 1, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'issues', 'add_note').first.destroy + end +end diff --git a/db/migrate/004_export_pdf.rb b/db/migrate/004_export_pdf.rb new file mode 100644 index 0000000..8d4ba0b --- /dev/null +++ b/db/migrate/004_export_pdf.rb @@ -0,0 +1,14 @@ +class ExportPdf < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "export_issues_pdf", :description => "label_export_pdf", :sort => 1002, :is_public => true, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "issues", :action => "export_pdf", :description => "label_export_pdf", :sort => 1015, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'projects', 'export_issues_pdf').first.destroy + Permission.where("controller=? and action=?", 'issues', 'export_pdf').first.destroy + end +end diff --git a/db/migrate/005_issue_start_date.rb b/db/migrate/005_issue_start_date.rb new file mode 100644 index 0000000..3d1693f --- /dev/null +++ b/db/migrate/005_issue_start_date.rb @@ -0,0 +1,11 @@ +class IssueStartDate < ActiveRecord::Migration + def self.up + add_column :issues, :start_date, :date + add_column :issues, :done_ratio, :integer, :default => 0, :null => false + end + + def self.down + remove_column :issues, :start_date + remove_column :issues, :done_ratio + end +end diff --git a/db/migrate/006_calendar_and_activity.rb b/db/migrate/006_calendar_and_activity.rb new file mode 100644 index 0000000..a30979a --- /dev/null +++ b/db/migrate/006_calendar_and_activity.rb @@ -0,0 +1,16 @@ +class CalendarAndActivity < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "activity", :description => "label_activity", :sort => 160, :is_public => true, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "projects", :action => "calendar", :description => "label_calendar", :sort => 165, :is_public => true, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "projects", :action => "gantt", :description => "label_gantt", :sort => 166, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'projects', 'activity').first.destroy + Permission.where("controller=? and action=?", 'projects', 'calendar').first.destroy + Permission.where("controller=? and action=?", 'projects', 'gantt').first.destroy + end +end diff --git a/db/migrate/007_create_journals.rb b/db/migrate/007_create_journals.rb new file mode 100644 index 0000000..63bdd23 --- /dev/null +++ b/db/migrate/007_create_journals.rb @@ -0,0 +1,56 @@ +class CreateJournals < ActiveRecord::Migration + + # model removed, but needed for data migration + class IssueHistory < ActiveRecord::Base; belongs_to :issue; end + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + create_table :journals, :force => true do |t| + t.column "journalized_id", :integer, :default => 0, :null => false + t.column "journalized_type", :string, :limit => 30, :default => "", :null => false + t.column "user_id", :integer, :default => 0, :null => false + t.column "notes", :text + t.column "created_on", :datetime, :null => false + end + create_table :journal_details, :force => true do |t| + t.column "journal_id", :integer, :default => 0, :null => false + t.column "property", :string, :limit => 30, :default => "", :null => false + t.column "prop_key", :string, :limit => 30, :default => "", :null => false + t.column "old_value", :string + t.column "value", :string + end + + # indexes + add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" + add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" + + Permission.create :controller => "issues", :action => "history", :description => "label_history", :sort => 1006, :is_public => true, :mail_option => 0, :mail_enabled => 0 + + # data migration + IssueHistory.all.each {|h| + j = Journal.new(:journalized => h.issue, :user_id => h.author_id, :notes => h.notes, :created_on => h.created_on) + j.details << JournalDetail.new(:property => 'attr', :prop_key => 'status_id', :value => h.status_id) + j.save + } + + drop_table :issue_histories + end + + def self.down + drop_table :journal_details + drop_table :journals + + create_table "issue_histories", :force => true do |t| + t.column "issue_id", :integer, :default => 0, :null => false + t.column "status_id", :integer, :default => 0, :null => false + t.column "author_id", :integer, :default => 0, :null => false + t.column "notes", :text, :default => "" + t.column "created_on", :timestamp + end + + add_index "issue_histories", ["issue_id"], :name => "issue_histories_issue_id" + + Permission.where("controller=? and action=?", 'issues', 'history').first.destroy + end +end diff --git a/db/migrate/008_create_user_preferences.rb b/db/migrate/008_create_user_preferences.rb new file mode 100644 index 0000000..80ae1cd --- /dev/null +++ b/db/migrate/008_create_user_preferences.rb @@ -0,0 +1,12 @@ +class CreateUserPreferences < ActiveRecord::Migration + def self.up + create_table :user_preferences do |t| + t.column "user_id", :integer, :default => 0, :null => false + t.column "others", :text + end + end + + def self.down + drop_table :user_preferences + end +end diff --git a/db/migrate/009_add_hide_mail_pref.rb b/db/migrate/009_add_hide_mail_pref.rb new file mode 100644 index 0000000..a22eafd --- /dev/null +++ b/db/migrate/009_add_hide_mail_pref.rb @@ -0,0 +1,9 @@ +class AddHideMailPref < ActiveRecord::Migration + def self.up + add_column :user_preferences, :hide_mail, :boolean, :default => false + end + + def self.down + remove_column :user_preferences, :hide_mail + end +end diff --git a/db/migrate/010_create_comments.rb b/db/migrate/010_create_comments.rb new file mode 100644 index 0000000..29e1116 --- /dev/null +++ b/db/migrate/010_create_comments.rb @@ -0,0 +1,16 @@ +class CreateComments < ActiveRecord::Migration + def self.up + create_table :comments do |t| + t.column :commented_type, :string, :limit => 30, :default => "", :null => false + t.column :commented_id, :integer, :default => 0, :null => false + t.column :author_id, :integer, :default => 0, :null => false + t.column :comments, :text + t.column :created_on, :datetime, :null => false + t.column :updated_on, :datetime, :null => false + end + end + + def self.down + drop_table :comments + end +end diff --git a/db/migrate/011_add_news_comments_count.rb b/db/migrate/011_add_news_comments_count.rb new file mode 100644 index 0000000..a247439 --- /dev/null +++ b/db/migrate/011_add_news_comments_count.rb @@ -0,0 +1,9 @@ +class AddNewsCommentsCount < ActiveRecord::Migration + def self.up + add_column :news, :comments_count, :integer, :default => 0, :null => false + end + + def self.down + remove_column :news, :comments_count + end +end diff --git a/db/migrate/012_add_comments_permissions.rb b/db/migrate/012_add_comments_permissions.rb new file mode 100644 index 0000000..91eed64 --- /dev/null +++ b/db/migrate/012_add_comments_permissions.rb @@ -0,0 +1,14 @@ +class AddCommentsPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "news", :action => "add_comment", :description => "label_comment_add", :sort => 1130, :is_public => false, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "news", :action => "destroy_comment", :description => "label_comment_delete", :sort => 1133, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'news', 'add_comment').first.destroy + Permission.where("controller=? and action=?", 'news', 'destroy_comment').first.destroy + end +end diff --git a/db/migrate/013_create_queries.rb b/db/migrate/013_create_queries.rb new file mode 100644 index 0000000..e0e8c90 --- /dev/null +++ b/db/migrate/013_create_queries.rb @@ -0,0 +1,15 @@ +class CreateQueries < ActiveRecord::Migration + def self.up + create_table :queries, :force => true do |t| + t.column "project_id", :integer + t.column "name", :string, :default => "", :null => false + t.column "filters", :text + t.column "user_id", :integer, :default => 0, :null => false + t.column "is_public", :boolean, :default => false, :null => false + end + end + + def self.down + drop_table :queries + end +end diff --git a/db/migrate/014_add_queries_permissions.rb b/db/migrate/014_add_queries_permissions.rb new file mode 100644 index 0000000..ae1f245 --- /dev/null +++ b/db/migrate/014_add_queries_permissions.rb @@ -0,0 +1,12 @@ +class AddQueriesPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "add_query", :description => "button_create", :sort => 600, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'projects', 'add_query').first.destroy + end +end diff --git a/db/migrate/015_create_repositories.rb b/db/migrate/015_create_repositories.rb new file mode 100644 index 0000000..d8c0524 --- /dev/null +++ b/db/migrate/015_create_repositories.rb @@ -0,0 +1,12 @@ +class CreateRepositories < ActiveRecord::Migration + def self.up + create_table :repositories, :force => true do |t| + t.column "project_id", :integer, :default => 0, :null => false + t.column "url", :string, :default => "", :null => false + end + end + + def self.down + drop_table :repositories + end +end diff --git a/db/migrate/016_add_repositories_permissions.rb b/db/migrate/016_add_repositories_permissions.rb new file mode 100644 index 0000000..9fcddb0 --- /dev/null +++ b/db/migrate/016_add_repositories_permissions.rb @@ -0,0 +1,22 @@ +class AddRepositoriesPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "repositories", :action => "show", :description => "button_view", :sort => 1450, :is_public => true + Permission.create :controller => "repositories", :action => "browse", :description => "label_browse", :sort => 1460, :is_public => true + Permission.create :controller => "repositories", :action => "entry", :description => "entry", :sort => 1462, :is_public => true + Permission.create :controller => "repositories", :action => "revisions", :description => "label_view_revisions", :sort => 1470, :is_public => true + Permission.create :controller => "repositories", :action => "revision", :description => "label_view_revisions", :sort => 1472, :is_public => true + Permission.create :controller => "repositories", :action => "diff", :description => "diff", :sort => 1480, :is_public => true + end + + def self.down + Permission.where("controller=? and action=?", 'repositories', 'show').first.destroy + Permission.where("controller=? and action=?", 'repositories', 'browse').first.destroy + Permission.where("controller=? and action=?", 'repositories', 'entry').first.destroy + Permission.where("controller=? and action=?", 'repositories', 'revisions').first.destroy + Permission.where("controller=? and action=?", 'repositories', 'revision').first.destroy + Permission.where("controller=? and action=?", 'repositories', 'diff').first.destroy + end +end diff --git a/db/migrate/017_create_settings.rb b/db/migrate/017_create_settings.rb new file mode 100644 index 0000000..99f96ad --- /dev/null +++ b/db/migrate/017_create_settings.rb @@ -0,0 +1,12 @@ +class CreateSettings < ActiveRecord::Migration + def self.up + create_table :settings, :force => true do |t| + t.column "name", :string, :limit => 30, :default => "", :null => false + t.column "value", :text + end + end + + def self.down + drop_table :settings + end +end diff --git a/db/migrate/018_set_doc_and_files_notifications.rb b/db/migrate/018_set_doc_and_files_notifications.rb new file mode 100644 index 0000000..f260beb --- /dev/null +++ b/db/migrate/018_set_doc_and_files_notifications.rb @@ -0,0 +1,18 @@ +class SetDocAndFilesNotifications < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.where(:controller => "projects", :action => "add_file").each {|p| p.update_attribute(:mail_option, true)} + Permission.where(:controller => "projects", :action => "add_document").each {|p| p.update_attribute(:mail_option, true)} + Permission.where(:controller => "documents", :action => "add_attachment").each {|p| p.update_attribute(:mail_option, true)} + Permission.where(:controller => "issues", :action => "add_attachment").each {|p| p.update_attribute(:mail_option, true)} + end + + def self.down + Permission.where(:controller => "projects", :action => "add_file").each {|p| p.update_attribute(:mail_option, false)} + Permission.where(:controller => "projects", :action => "add_document").each {|p| p.update_attribute(:mail_option, false)} + Permission.where(:controller => "documents", :action => "add_attachment").each {|p| p.update_attribute(:mail_option, false)} + Permission.where(:controller => "issues", :action => "add_attachment").each {|p| p.update_attribute(:mail_option, false)} + end +end diff --git a/db/migrate/019_add_issue_status_position.rb b/db/migrate/019_add_issue_status_position.rb new file mode 100644 index 0000000..012f97c --- /dev/null +++ b/db/migrate/019_add_issue_status_position.rb @@ -0,0 +1,10 @@ +class AddIssueStatusPosition < ActiveRecord::Migration + def self.up + add_column :issue_statuses, :position, :integer, :default => 1 + IssueStatus.all.each_with_index {|status, i| status.update_attribute(:position, i+1)} + end + + def self.down + remove_column :issue_statuses, :position + end +end diff --git a/db/migrate/020_add_role_position.rb b/db/migrate/020_add_role_position.rb new file mode 100644 index 0000000..48ac89a --- /dev/null +++ b/db/migrate/020_add_role_position.rb @@ -0,0 +1,10 @@ +class AddRolePosition < ActiveRecord::Migration + def self.up + add_column :roles, :position, :integer, :default => 1 + Role.all.each_with_index {|role, i| role.update_attribute(:position, i+1)} + end + + def self.down + remove_column :roles, :position + end +end diff --git a/db/migrate/021_add_tracker_position.rb b/db/migrate/021_add_tracker_position.rb new file mode 100644 index 0000000..5fa8a31 --- /dev/null +++ b/db/migrate/021_add_tracker_position.rb @@ -0,0 +1,10 @@ +class AddTrackerPosition < ActiveRecord::Migration + def self.up + add_column :trackers, :position, :integer, :default => 1 + Tracker.all.each_with_index {|tracker, i| tracker.update_attribute(:position, i+1)} + end + + def self.down + remove_column :trackers, :position + end +end diff --git a/db/migrate/022_serialize_possibles_values.rb b/db/migrate/022_serialize_possibles_values.rb new file mode 100644 index 0000000..3e9fed0 --- /dev/null +++ b/db/migrate/022_serialize_possibles_values.rb @@ -0,0 +1,13 @@ +class SerializePossiblesValues < ActiveRecord::Migration + def self.up + CustomField.all.each do |field| + if field.possible_values and field.possible_values.is_a? String + field.possible_values = field.possible_values.split('|') + field.save + end + end + end + + def self.down + end +end diff --git a/db/migrate/023_add_tracker_is_in_roadmap.rb b/db/migrate/023_add_tracker_is_in_roadmap.rb new file mode 100644 index 0000000..82ef87b --- /dev/null +++ b/db/migrate/023_add_tracker_is_in_roadmap.rb @@ -0,0 +1,9 @@ +class AddTrackerIsInRoadmap < ActiveRecord::Migration + def self.up + add_column :trackers, :is_in_roadmap, :boolean, :default => true, :null => false + end + + def self.down + remove_column :trackers, :is_in_roadmap + end +end diff --git a/db/migrate/024_add_roadmap_permission.rb b/db/migrate/024_add_roadmap_permission.rb new file mode 100644 index 0000000..f521e60 --- /dev/null +++ b/db/migrate/024_add_roadmap_permission.rb @@ -0,0 +1,12 @@ +class AddRoadmapPermission < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "roadmap", :description => "label_roadmap", :sort => 107, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where("controller=? and action=?", 'projects', 'roadmap').first.destroy + end +end diff --git a/db/migrate/025_add_search_permission.rb b/db/migrate/025_add_search_permission.rb new file mode 100644 index 0000000..7f1c5c6 --- /dev/null +++ b/db/migrate/025_add_search_permission.rb @@ -0,0 +1,12 @@ +class AddSearchPermission < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "search", :description => "label_search", :sort => 130, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "projects", :action => "search").each {|p| p.destroy} + end +end diff --git a/db/migrate/026_add_repository_login_and_password.rb b/db/migrate/026_add_repository_login_and_password.rb new file mode 100644 index 0000000..5fc9197 --- /dev/null +++ b/db/migrate/026_add_repository_login_and_password.rb @@ -0,0 +1,11 @@ +class AddRepositoryLoginAndPassword < ActiveRecord::Migration + def self.up + add_column :repositories, :login, :string, :limit => 60, :default => "" + add_column :repositories, :password, :string, :limit => 60, :default => "" + end + + def self.down + remove_column :repositories, :login + remove_column :repositories, :password + end +end diff --git a/db/migrate/027_create_wikis.rb b/db/migrate/027_create_wikis.rb new file mode 100644 index 0000000..284eee2 --- /dev/null +++ b/db/migrate/027_create_wikis.rb @@ -0,0 +1,14 @@ +class CreateWikis < ActiveRecord::Migration + def self.up + create_table :wikis do |t| + t.column :project_id, :integer, :null => false + t.column :start_page, :string, :limit => 255, :null => false + t.column :status, :integer, :default => 1, :null => false + end + add_index :wikis, :project_id, :name => :wikis_project_id + end + + def self.down + drop_table :wikis + end +end diff --git a/db/migrate/028_create_wiki_pages.rb b/db/migrate/028_create_wiki_pages.rb new file mode 100644 index 0000000..e228212 --- /dev/null +++ b/db/migrate/028_create_wiki_pages.rb @@ -0,0 +1,14 @@ +class CreateWikiPages < ActiveRecord::Migration + def self.up + create_table :wiki_pages do |t| + t.column :wiki_id, :integer, :null => false + t.column :title, :string, :limit => 255, :null => false + t.column :created_on, :datetime, :null => false + end + add_index :wiki_pages, [:wiki_id, :title], :name => :wiki_pages_wiki_id_title + end + + def self.down + drop_table :wiki_pages + end +end diff --git a/db/migrate/029_create_wiki_contents.rb b/db/migrate/029_create_wiki_contents.rb new file mode 100644 index 0000000..5b6a22f --- /dev/null +++ b/db/migrate/029_create_wiki_contents.rb @@ -0,0 +1,30 @@ +class CreateWikiContents < ActiveRecord::Migration + def self.up + create_table :wiki_contents do |t| + t.column :page_id, :integer, :null => false + t.column :author_id, :integer + t.column :text, :text + t.column :comments, :string, :limit => 255, :default => "" + t.column :updated_on, :datetime, :null => false + t.column :version, :integer, :null => false + end + add_index :wiki_contents, :page_id, :name => :wiki_contents_page_id + + create_table :wiki_content_versions do |t| + t.column :wiki_content_id, :integer, :null => false + t.column :page_id, :integer, :null => false + t.column :author_id, :integer + t.column :data, :binary + t.column :compression, :string, :limit => 6, :default => "" + t.column :comments, :string, :limit => 255, :default => "" + t.column :updated_on, :datetime, :null => false + t.column :version, :integer, :null => false + end + add_index :wiki_content_versions, :wiki_content_id, :name => :wiki_content_versions_wcid + end + + def self.down + drop_table :wiki_contents + drop_table :wiki_content_versions + end +end diff --git a/db/migrate/030_add_projects_feeds_permissions.rb b/db/migrate/030_add_projects_feeds_permissions.rb new file mode 100644 index 0000000..866cc39 --- /dev/null +++ b/db/migrate/030_add_projects_feeds_permissions.rb @@ -0,0 +1,12 @@ +class AddProjectsFeedsPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "projects", :action => "feeds", :description => "label_feed_plural", :sort => 132, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "projects", :action => "feeds").each {|p| p.destroy} + end +end diff --git a/db/migrate/031_add_repository_root_url.rb b/db/migrate/031_add_repository_root_url.rb new file mode 100644 index 0000000..df57809 --- /dev/null +++ b/db/migrate/031_add_repository_root_url.rb @@ -0,0 +1,9 @@ +class AddRepositoryRootUrl < ActiveRecord::Migration + def self.up + add_column :repositories, :root_url, :string, :limit => 255, :default => "" + end + + def self.down + remove_column :repositories, :root_url + end +end diff --git a/db/migrate/032_create_time_entries.rb b/db/migrate/032_create_time_entries.rb new file mode 100644 index 0000000..9b9a54e --- /dev/null +++ b/db/migrate/032_create_time_entries.rb @@ -0,0 +1,24 @@ +class CreateTimeEntries < ActiveRecord::Migration + def self.up + create_table :time_entries do |t| + t.column :project_id, :integer, :null => false + t.column :user_id, :integer, :null => false + t.column :issue_id, :integer + t.column :hours, :float, :null => false + t.column :comments, :string, :limit => 255 + t.column :activity_id, :integer, :null => false + t.column :spent_on, :date, :null => false + t.column :tyear, :integer, :null => false + t.column :tmonth, :integer, :null => false + t.column :tweek, :integer, :null => false + t.column :created_on, :datetime, :null => false + t.column :updated_on, :datetime, :null => false + end + add_index :time_entries, [:project_id], :name => :time_entries_project_id + add_index :time_entries, [:issue_id], :name => :time_entries_issue_id + end + + def self.down + drop_table :time_entries + end +end diff --git a/db/migrate/033_add_timelog_permissions.rb b/db/migrate/033_add_timelog_permissions.rb new file mode 100644 index 0000000..58e2c43 --- /dev/null +++ b/db/migrate/033_add_timelog_permissions.rb @@ -0,0 +1,12 @@ +class AddTimelogPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "timelog", :action => "edit", :description => "button_log_time", :sort => 1520, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "timelog", :action => "edit").each {|p| p.destroy} + end +end diff --git a/db/migrate/034_create_changesets.rb b/db/migrate/034_create_changesets.rb new file mode 100644 index 0000000..612fd46 --- /dev/null +++ b/db/migrate/034_create_changesets.rb @@ -0,0 +1,16 @@ +class CreateChangesets < ActiveRecord::Migration + def self.up + create_table :changesets do |t| + t.column :repository_id, :integer, :null => false + t.column :revision, :integer, :null => false + t.column :committer, :string, :limit => 30 + t.column :committed_on, :datetime, :null => false + t.column :comments, :text + end + add_index :changesets, [:repository_id, :revision], :unique => true, :name => :changesets_repos_rev + end + + def self.down + drop_table :changesets + end +end diff --git a/db/migrate/035_create_changes.rb b/db/migrate/035_create_changes.rb new file mode 100644 index 0000000..fa0cfac --- /dev/null +++ b/db/migrate/035_create_changes.rb @@ -0,0 +1,16 @@ +class CreateChanges < ActiveRecord::Migration + def self.up + create_table :changes do |t| + t.column :changeset_id, :integer, :null => false + t.column :action, :string, :limit => 1, :default => "", :null => false + t.column :path, :string, :default => "", :null => false + t.column :from_path, :string + t.column :from_revision, :integer + end + add_index :changes, [:changeset_id], :name => :changesets_changeset_id + end + + def self.down + drop_table :changes + end +end diff --git a/db/migrate/036_add_changeset_commit_date.rb b/db/migrate/036_add_changeset_commit_date.rb new file mode 100644 index 0000000..b9cc49b --- /dev/null +++ b/db/migrate/036_add_changeset_commit_date.rb @@ -0,0 +1,10 @@ +class AddChangesetCommitDate < ActiveRecord::Migration + def self.up + add_column :changesets, :commit_date, :date + Changeset.update_all "commit_date = committed_on" + end + + def self.down + remove_column :changesets, :commit_date + end +end diff --git a/db/migrate/037_add_project_identifier.rb b/db/migrate/037_add_project_identifier.rb new file mode 100644 index 0000000..0fd8c75 --- /dev/null +++ b/db/migrate/037_add_project_identifier.rb @@ -0,0 +1,9 @@ +class AddProjectIdentifier < ActiveRecord::Migration + def self.up + add_column :projects, :identifier, :string, :limit => 20 + end + + def self.down + remove_column :projects, :identifier + end +end diff --git a/db/migrate/038_add_custom_field_is_filter.rb b/db/migrate/038_add_custom_field_is_filter.rb new file mode 100644 index 0000000..519ee0b --- /dev/null +++ b/db/migrate/038_add_custom_field_is_filter.rb @@ -0,0 +1,9 @@ +class AddCustomFieldIsFilter < ActiveRecord::Migration + def self.up + add_column :custom_fields, :is_filter, :boolean, :null => false, :default => false + end + + def self.down + remove_column :custom_fields, :is_filter + end +end diff --git a/db/migrate/039_create_watchers.rb b/db/migrate/039_create_watchers.rb new file mode 100644 index 0000000..9579e19 --- /dev/null +++ b/db/migrate/039_create_watchers.rb @@ -0,0 +1,13 @@ +class CreateWatchers < ActiveRecord::Migration + def self.up + create_table :watchers do |t| + t.column :watchable_type, :string, :default => "", :null => false + t.column :watchable_id, :integer, :default => 0, :null => false + t.column :user_id, :integer + end + end + + def self.down + drop_table :watchers + end +end diff --git a/db/migrate/040_create_changesets_issues.rb b/db/migrate/040_create_changesets_issues.rb new file mode 100644 index 0000000..494d3cc --- /dev/null +++ b/db/migrate/040_create_changesets_issues.rb @@ -0,0 +1,13 @@ +class CreateChangesetsIssues < ActiveRecord::Migration + def self.up + create_table :changesets_issues, :id => false do |t| + t.column :changeset_id, :integer, :null => false + t.column :issue_id, :integer, :null => false + end + add_index :changesets_issues, [:changeset_id, :issue_id], :unique => true, :name => :changesets_issues_ids + end + + def self.down + drop_table :changesets_issues + end +end diff --git a/db/migrate/041_rename_comment_to_comments.rb b/db/migrate/041_rename_comment_to_comments.rb new file mode 100644 index 0000000..93677e5 --- /dev/null +++ b/db/migrate/041_rename_comment_to_comments.rb @@ -0,0 +1,13 @@ +class RenameCommentToComments < ActiveRecord::Migration + def self.up + rename_column(:comments, :comment, :comments) if ActiveRecord::Base.connection.columns(Comment.table_name).detect{|c| c.name == "comment"} + rename_column(:wiki_contents, :comment, :comments) if ActiveRecord::Base.connection.columns(WikiContent.table_name).detect{|c| c.name == "comment"} + rename_column(:wiki_content_versions, :comment, :comments) if ActiveRecord::Base.connection.columns(WikiContent.versioned_table_name).detect{|c| c.name == "comment"} + rename_column(:time_entries, :comment, :comments) if ActiveRecord::Base.connection.columns(TimeEntry.table_name).detect{|c| c.name == "comment"} + rename_column(:changesets, :comment, :comments) if ActiveRecord::Base.connection.columns(Changeset.table_name).detect{|c| c.name == "comment"} + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/042_create_issue_relations.rb b/db/migrate/042_create_issue_relations.rb new file mode 100644 index 0000000..802c124 --- /dev/null +++ b/db/migrate/042_create_issue_relations.rb @@ -0,0 +1,14 @@ +class CreateIssueRelations < ActiveRecord::Migration + def self.up + create_table :issue_relations do |t| + t.column :issue_from_id, :integer, :null => false + t.column :issue_to_id, :integer, :null => false + t.column :relation_type, :string, :default => "", :null => false + t.column :delay, :integer + end + end + + def self.down + drop_table :issue_relations + end +end diff --git a/db/migrate/043_add_relations_permissions.rb b/db/migrate/043_add_relations_permissions.rb new file mode 100644 index 0000000..3c86d7e --- /dev/null +++ b/db/migrate/043_add_relations_permissions.rb @@ -0,0 +1,14 @@ +class AddRelationsPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "issue_relations", :action => "new", :description => "label_relation_new", :sort => 1080, :is_public => false, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "issue_relations", :action => "destroy", :description => "label_relation_delete", :sort => 1085, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "issue_relations", :action => "new").each {|p| p.destroy} + Permission.where(:controller => "issue_relations", :action => "destroy").each {|p| p.destroy} + end +end diff --git a/db/migrate/044_set_language_length_to_five.rb b/db/migrate/044_set_language_length_to_five.rb new file mode 100644 index 0000000..a417f7d --- /dev/null +++ b/db/migrate/044_set_language_length_to_five.rb @@ -0,0 +1,9 @@ +class SetLanguageLengthToFive < ActiveRecord::Migration + def self.up + change_column :users, :language, :string, :limit => 5, :default => "" + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/045_create_boards.rb b/db/migrate/045_create_boards.rb new file mode 100644 index 0000000..17f2bbb --- /dev/null +++ b/db/migrate/045_create_boards.rb @@ -0,0 +1,18 @@ +class CreateBoards < ActiveRecord::Migration + def self.up + create_table :boards do |t| + t.column :project_id, :integer, :null => false + t.column :name, :string, :default => "", :null => false + t.column :description, :string + t.column :position, :integer, :default => 1 + t.column :topics_count, :integer, :default => 0, :null => false + t.column :messages_count, :integer, :default => 0, :null => false + t.column :last_message_id, :integer + end + add_index :boards, [:project_id], :name => :boards_project_id + end + + def self.down + drop_table :boards + end +end diff --git a/db/migrate/046_create_messages.rb b/db/migrate/046_create_messages.rb new file mode 100644 index 0000000..d99aaf8 --- /dev/null +++ b/db/migrate/046_create_messages.rb @@ -0,0 +1,21 @@ +class CreateMessages < ActiveRecord::Migration + def self.up + create_table :messages do |t| + t.column :board_id, :integer, :null => false + t.column :parent_id, :integer + t.column :subject, :string, :default => "", :null => false + t.column :content, :text + t.column :author_id, :integer + t.column :replies_count, :integer, :default => 0, :null => false + t.column :last_reply_id, :integer + t.column :created_on, :datetime, :null => false + t.column :updated_on, :datetime, :null => false + end + add_index :messages, [:board_id], :name => :messages_board_id + add_index :messages, [:parent_id], :name => :messages_parent_id + end + + def self.down + drop_table :messages + end +end diff --git a/db/migrate/047_add_boards_permissions.rb b/db/migrate/047_add_boards_permissions.rb new file mode 100644 index 0000000..1a9f095 --- /dev/null +++ b/db/migrate/047_add_boards_permissions.rb @@ -0,0 +1,16 @@ +class AddBoardsPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => "boards", :action => "new", :description => "button_add", :sort => 2000, :is_public => false, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "boards", :action => "edit", :description => "button_edit", :sort => 2005, :is_public => false, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => "boards", :action => "destroy", :description => "button_delete", :sort => 2010, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "boards", :action => "new").each {|p| p.destroy} + Permission.where(:controller => "boards", :action => "edit").each {|p| p.destroy} + Permission.where(:controller => "boards", :action => "destroy").each {|p| p.destroy} + end +end diff --git a/db/migrate/048_allow_null_version_effective_date.rb b/db/migrate/048_allow_null_version_effective_date.rb new file mode 100644 index 0000000..82d2a33 --- /dev/null +++ b/db/migrate/048_allow_null_version_effective_date.rb @@ -0,0 +1,9 @@ +class AllowNullVersionEffectiveDate < ActiveRecord::Migration + def self.up + change_column :versions, :effective_date, :date, :default => nil, :null => true + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/049_add_wiki_destroy_page_permission.rb b/db/migrate/049_add_wiki_destroy_page_permission.rb new file mode 100644 index 0000000..803d357 --- /dev/null +++ b/db/migrate/049_add_wiki_destroy_page_permission.rb @@ -0,0 +1,12 @@ +class AddWikiDestroyPagePermission < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => 'wiki', :action => 'destroy', :description => 'button_delete', :sort => 1740, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "wiki", :action => "destroy").each {|p| p.destroy} + end +end diff --git a/db/migrate/050_add_wiki_attachments_permissions.rb b/db/migrate/050_add_wiki_attachments_permissions.rb new file mode 100644 index 0000000..e87a46b --- /dev/null +++ b/db/migrate/050_add_wiki_attachments_permissions.rb @@ -0,0 +1,14 @@ +class AddWikiAttachmentsPermissions < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => 'wiki', :action => 'add_attachment', :description => 'label_attachment_new', :sort => 1750, :is_public => false, :mail_option => 0, :mail_enabled => 0 + Permission.create :controller => 'wiki', :action => 'destroy_attachment', :description => 'label_attachment_delete', :sort => 1755, :is_public => false, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "wiki", :action => "add_attachment").each {|p| p.destroy} + Permission.where(:controller => "wiki", :action => "destroy_attachment").each {|p| p.destroy} + end +end diff --git a/db/migrate/051_add_project_status.rb b/db/migrate/051_add_project_status.rb new file mode 100644 index 0000000..fba36d2 --- /dev/null +++ b/db/migrate/051_add_project_status.rb @@ -0,0 +1,9 @@ +class AddProjectStatus < ActiveRecord::Migration + def self.up + add_column :projects, :status, :integer, :default => 1, :null => false + end + + def self.down + remove_column :projects, :status + end +end diff --git a/db/migrate/052_add_changes_revision.rb b/db/migrate/052_add_changes_revision.rb new file mode 100644 index 0000000..6f58c1a --- /dev/null +++ b/db/migrate/052_add_changes_revision.rb @@ -0,0 +1,9 @@ +class AddChangesRevision < ActiveRecord::Migration + def self.up + add_column :changes, :revision, :string + end + + def self.down + remove_column :changes, :revision + end +end diff --git a/db/migrate/053_add_changes_branch.rb b/db/migrate/053_add_changes_branch.rb new file mode 100644 index 0000000..998ce2b --- /dev/null +++ b/db/migrate/053_add_changes_branch.rb @@ -0,0 +1,9 @@ +class AddChangesBranch < ActiveRecord::Migration + def self.up + add_column :changes, :branch, :string + end + + def self.down + remove_column :changes, :branch + end +end diff --git a/db/migrate/054_add_changesets_scmid.rb b/db/migrate/054_add_changesets_scmid.rb new file mode 100644 index 0000000..188fa6e --- /dev/null +++ b/db/migrate/054_add_changesets_scmid.rb @@ -0,0 +1,9 @@ +class AddChangesetsScmid < ActiveRecord::Migration + def self.up + add_column :changesets, :scmid, :string + end + + def self.down + remove_column :changesets, :scmid + end +end diff --git a/db/migrate/055_add_repositories_type.rb b/db/migrate/055_add_repositories_type.rb new file mode 100644 index 0000000..f5a7162 --- /dev/null +++ b/db/migrate/055_add_repositories_type.rb @@ -0,0 +1,11 @@ +class AddRepositoriesType < ActiveRecord::Migration + def self.up + add_column :repositories, :type, :string + # Set class name for existing SVN repositories + Repository.update_all "type = 'Subversion'" + end + + def self.down + remove_column :repositories, :type + end +end diff --git a/db/migrate/056_add_repositories_changes_permission.rb b/db/migrate/056_add_repositories_changes_permission.rb new file mode 100644 index 0000000..00252db --- /dev/null +++ b/db/migrate/056_add_repositories_changes_permission.rb @@ -0,0 +1,12 @@ +class AddRepositoriesChangesPermission < ActiveRecord::Migration + # model removed + class Permission < ActiveRecord::Base; end + + def self.up + Permission.create :controller => 'repositories', :action => 'changes', :description => 'label_change_plural', :sort => 1475, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.where(:controller => "repositories", :action => "changes").each {|p| p.destroy} + end +end diff --git a/db/migrate/057_add_versions_wiki_page_title.rb b/db/migrate/057_add_versions_wiki_page_title.rb new file mode 100644 index 0000000..58b8fd9 --- /dev/null +++ b/db/migrate/057_add_versions_wiki_page_title.rb @@ -0,0 +1,9 @@ +class AddVersionsWikiPageTitle < ActiveRecord::Migration + def self.up + add_column :versions, :wiki_page_title, :string + end + + def self.down + remove_column :versions, :wiki_page_title + end +end diff --git a/db/migrate/058_add_issue_categories_assigned_to_id.rb b/db/migrate/058_add_issue_categories_assigned_to_id.rb new file mode 100644 index 0000000..8653532 --- /dev/null +++ b/db/migrate/058_add_issue_categories_assigned_to_id.rb @@ -0,0 +1,9 @@ +class AddIssueCategoriesAssignedToId < ActiveRecord::Migration + def self.up + add_column :issue_categories, :assigned_to_id, :integer + end + + def self.down + remove_column :issue_categories, :assigned_to_id + end +end diff --git a/db/migrate/059_add_roles_assignable.rb b/db/migrate/059_add_roles_assignable.rb new file mode 100644 index 0000000..a1ba796 --- /dev/null +++ b/db/migrate/059_add_roles_assignable.rb @@ -0,0 +1,9 @@ +class AddRolesAssignable < ActiveRecord::Migration + def self.up + add_column :roles, :assignable, :boolean, :default => true + end + + def self.down + remove_column :roles, :assignable + end +end diff --git a/db/migrate/060_change_changesets_committer_limit.rb b/db/migrate/060_change_changesets_committer_limit.rb new file mode 100644 index 0000000..b050963 --- /dev/null +++ b/db/migrate/060_change_changesets_committer_limit.rb @@ -0,0 +1,9 @@ +class ChangeChangesetsCommitterLimit < ActiveRecord::Migration + def self.up + change_column :changesets, :committer, :string, :limit => nil + end + + def self.down + change_column :changesets, :committer, :string, :limit => 30 + end +end diff --git a/db/migrate/061_add_roles_builtin.rb b/db/migrate/061_add_roles_builtin.rb new file mode 100644 index 0000000..a8d6fe9 --- /dev/null +++ b/db/migrate/061_add_roles_builtin.rb @@ -0,0 +1,9 @@ +class AddRolesBuiltin < ActiveRecord::Migration + def self.up + add_column :roles, :builtin, :integer, :default => 0, :null => false + end + + def self.down + remove_column :roles, :builtin + end +end diff --git a/db/migrate/062_insert_builtin_roles.rb b/db/migrate/062_insert_builtin_roles.rb new file mode 100644 index 0000000..ae3a706 --- /dev/null +++ b/db/migrate/062_insert_builtin_roles.rb @@ -0,0 +1,16 @@ +class InsertBuiltinRoles < ActiveRecord::Migration + def self.up + Role.reset_column_information + nonmember = Role.new(:name => 'Non member', :position => 0) + nonmember.builtin = Role::BUILTIN_NON_MEMBER + nonmember.save + + anonymous = Role.new(:name => 'Anonymous', :position => 0) + anonymous.builtin = Role::BUILTIN_ANONYMOUS + anonymous.save + end + + def self.down + Role.where('builtin <> 0').destroy_all + end +end diff --git a/db/migrate/063_add_roles_permissions.rb b/db/migrate/063_add_roles_permissions.rb new file mode 100644 index 0000000..107a3af --- /dev/null +++ b/db/migrate/063_add_roles_permissions.rb @@ -0,0 +1,9 @@ +class AddRolesPermissions < ActiveRecord::Migration + def self.up + add_column :roles, :permissions, :text + end + + def self.down + remove_column :roles, :permissions + end +end diff --git a/db/migrate/064_drop_permissions.rb b/db/migrate/064_drop_permissions.rb new file mode 100644 index 0000000..f4ca470 --- /dev/null +++ b/db/migrate/064_drop_permissions.rb @@ -0,0 +1,10 @@ +class DropPermissions < ActiveRecord::Migration + def self.up + drop_table :permissions + drop_table :permissions_roles + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/065_add_settings_updated_on.rb b/db/migrate/065_add_settings_updated_on.rb new file mode 100644 index 0000000..1fa0027 --- /dev/null +++ b/db/migrate/065_add_settings_updated_on.rb @@ -0,0 +1,11 @@ +class AddSettingsUpdatedOn < ActiveRecord::Migration + def self.up + add_column :settings, :updated_on, :timestamp + # set updated_on + Setting.all.each(&:save) + end + + def self.down + remove_column :settings, :updated_on + end +end diff --git a/db/migrate/066_add_custom_value_customized_index.rb b/db/migrate/066_add_custom_value_customized_index.rb new file mode 100644 index 0000000..1f4c40d --- /dev/null +++ b/db/migrate/066_add_custom_value_customized_index.rb @@ -0,0 +1,9 @@ +class AddCustomValueCustomizedIndex < ActiveRecord::Migration + def self.up + add_index :custom_values, [:customized_type, :customized_id], :name => :custom_values_customized + end + + def self.down + remove_index :custom_values, :name => :custom_values_customized + end +end diff --git a/db/migrate/067_create_wiki_redirects.rb b/db/migrate/067_create_wiki_redirects.rb new file mode 100644 index 0000000..dda6ba6 --- /dev/null +++ b/db/migrate/067_create_wiki_redirects.rb @@ -0,0 +1,15 @@ +class CreateWikiRedirects < ActiveRecord::Migration + def self.up + create_table :wiki_redirects do |t| + t.column :wiki_id, :integer, :null => false + t.column :title, :string + t.column :redirects_to, :string + t.column :created_on, :datetime, :null => false + end + add_index :wiki_redirects, [:wiki_id, :title], :name => :wiki_redirects_wiki_id_title + end + + def self.down + drop_table :wiki_redirects + end +end diff --git a/db/migrate/068_create_enabled_modules.rb b/db/migrate/068_create_enabled_modules.rb new file mode 100644 index 0000000..88005cd --- /dev/null +++ b/db/migrate/068_create_enabled_modules.rb @@ -0,0 +1,18 @@ +class CreateEnabledModules < ActiveRecord::Migration + def self.up + create_table :enabled_modules do |t| + t.column :project_id, :integer + t.column :name, :string, :null => false + end + add_index :enabled_modules, [:project_id], :name => :enabled_modules_project_id + + # Enable all modules for existing projects + Project.all.each do |project| + project.enabled_module_names = Redmine::AccessControl.available_project_modules + end + end + + def self.down + drop_table :enabled_modules + end +end diff --git a/db/migrate/069_add_issues_estimated_hours.rb b/db/migrate/069_add_issues_estimated_hours.rb new file mode 100644 index 0000000..90b86e2 --- /dev/null +++ b/db/migrate/069_add_issues_estimated_hours.rb @@ -0,0 +1,9 @@ +class AddIssuesEstimatedHours < ActiveRecord::Migration + def self.up + add_column :issues, :estimated_hours, :float + end + + def self.down + remove_column :issues, :estimated_hours + end +end diff --git a/db/migrate/070_change_attachments_content_type_limit.rb b/db/migrate/070_change_attachments_content_type_limit.rb new file mode 100644 index 0000000..ebf6d08 --- /dev/null +++ b/db/migrate/070_change_attachments_content_type_limit.rb @@ -0,0 +1,9 @@ +class ChangeAttachmentsContentTypeLimit < ActiveRecord::Migration + def self.up + change_column :attachments, :content_type, :string, :limit => nil + end + + def self.down + change_column :attachments, :content_type, :string, :limit => 60 + end +end diff --git a/db/migrate/071_add_queries_column_names.rb b/db/migrate/071_add_queries_column_names.rb new file mode 100644 index 0000000..acaf4da --- /dev/null +++ b/db/migrate/071_add_queries_column_names.rb @@ -0,0 +1,9 @@ +class AddQueriesColumnNames < ActiveRecord::Migration + def self.up + add_column :queries, :column_names, :text + end + + def self.down + remove_column :queries, :column_names + end +end diff --git a/db/migrate/072_add_enumerations_position.rb b/db/migrate/072_add_enumerations_position.rb new file mode 100644 index 0000000..2834abe --- /dev/null +++ b/db/migrate/072_add_enumerations_position.rb @@ -0,0 +1,15 @@ +class AddEnumerationsPosition < ActiveRecord::Migration + def self.up + add_column(:enumerations, :position, :integer, :default => 1) unless Enumeration.column_names.include?('position') + Enumeration.all.group_by(&:opt).each do |opt, enums| + enums.each_with_index do |enum, i| + # do not call model callbacks + Enumeration.where({:id => enum.id}).update_all(:position => (i+1)) + end + end + end + + def self.down + remove_column :enumerations, :position + end +end diff --git a/db/migrate/073_add_enumerations_is_default.rb b/db/migrate/073_add_enumerations_is_default.rb new file mode 100644 index 0000000..7365a14 --- /dev/null +++ b/db/migrate/073_add_enumerations_is_default.rb @@ -0,0 +1,9 @@ +class AddEnumerationsIsDefault < ActiveRecord::Migration + def self.up + add_column :enumerations, :is_default, :boolean, :default => false, :null => false + end + + def self.down + remove_column :enumerations, :is_default + end +end diff --git a/db/migrate/074_add_auth_sources_tls.rb b/db/migrate/074_add_auth_sources_tls.rb new file mode 100644 index 0000000..3987f70 --- /dev/null +++ b/db/migrate/074_add_auth_sources_tls.rb @@ -0,0 +1,9 @@ +class AddAuthSourcesTls < ActiveRecord::Migration + def self.up + add_column :auth_sources, :tls, :boolean, :default => false, :null => false + end + + def self.down + remove_column :auth_sources, :tls + end +end diff --git a/db/migrate/075_add_members_mail_notification.rb b/db/migrate/075_add_members_mail_notification.rb new file mode 100644 index 0000000..d83ba8d --- /dev/null +++ b/db/migrate/075_add_members_mail_notification.rb @@ -0,0 +1,9 @@ +class AddMembersMailNotification < ActiveRecord::Migration + def self.up + add_column :members, :mail_notification, :boolean, :default => false, :null => false + end + + def self.down + remove_column :members, :mail_notification + end +end diff --git a/db/migrate/076_allow_null_position.rb b/db/migrate/076_allow_null_position.rb new file mode 100644 index 0000000..afb9381 --- /dev/null +++ b/db/migrate/076_allow_null_position.rb @@ -0,0 +1,16 @@ +class AllowNullPosition < ActiveRecord::Migration + def self.up + Enumeration.reset_column_information + + # removes the 'not null' constraint on position fields + change_column :issue_statuses, :position, :integer, :default => 1, :null => true + change_column :roles, :position, :integer, :default => 1, :null => true + change_column :trackers, :position, :integer, :default => 1, :null => true + change_column :boards, :position, :integer, :default => 1, :null => true + change_column :enumerations, :position, :integer, :default => 1, :null => true + end + + def self.down + # nothing to do + end +end diff --git a/db/migrate/077_remove_issue_statuses_html_color.rb b/db/migrate/077_remove_issue_statuses_html_color.rb new file mode 100644 index 0000000..a3e2c3f --- /dev/null +++ b/db/migrate/077_remove_issue_statuses_html_color.rb @@ -0,0 +1,9 @@ +class RemoveIssueStatusesHtmlColor < ActiveRecord::Migration + def self.up + remove_column :issue_statuses, :html_color + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/078_add_custom_fields_position.rb b/db/migrate/078_add_custom_fields_position.rb new file mode 100644 index 0000000..a03db46 --- /dev/null +++ b/db/migrate/078_add_custom_fields_position.rb @@ -0,0 +1,15 @@ +class AddCustomFieldsPosition < ActiveRecord::Migration + def self.up + add_column(:custom_fields, :position, :integer, :default => 1) + CustomField.all.group_by(&:type).each do |t, fields| + fields.each_with_index do |field, i| + # do not call model callbacks + CustomField.where({:id => field.id}).update_all(:position => (i+1)) + end + end + end + + def self.down + remove_column :custom_fields, :position + end +end diff --git a/db/migrate/079_add_user_preferences_time_zone.rb b/db/migrate/079_add_user_preferences_time_zone.rb new file mode 100644 index 0000000..9e36790 --- /dev/null +++ b/db/migrate/079_add_user_preferences_time_zone.rb @@ -0,0 +1,9 @@ +class AddUserPreferencesTimeZone < ActiveRecord::Migration + def self.up + add_column :user_preferences, :time_zone, :string + end + + def self.down + remove_column :user_preferences, :time_zone + end +end diff --git a/db/migrate/080_add_users_type.rb b/db/migrate/080_add_users_type.rb new file mode 100644 index 0000000..c907b47 --- /dev/null +++ b/db/migrate/080_add_users_type.rb @@ -0,0 +1,10 @@ +class AddUsersType < ActiveRecord::Migration + def self.up + add_column :users, :type, :string + User.update_all "type = 'User'" + end + + def self.down + remove_column :users, :type + end +end diff --git a/db/migrate/081_create_projects_trackers.rb b/db/migrate/081_create_projects_trackers.rb new file mode 100644 index 0000000..ddb801d --- /dev/null +++ b/db/migrate/081_create_projects_trackers.rb @@ -0,0 +1,19 @@ +class CreateProjectsTrackers < ActiveRecord::Migration + def self.up + create_table :projects_trackers, :id => false do |t| + t.column :project_id, :integer, :default => 0, :null => false + t.column :tracker_id, :integer, :default => 0, :null => false + end + add_index :projects_trackers, :project_id, :name => :projects_trackers_project_id + + # Associates all trackers to all projects (as it was before) + tracker_ids = Tracker.all.collect(&:id) + Project.all.each do |project| + project.tracker_ids = tracker_ids + end + end + + def self.down + drop_table :projects_trackers + end +end diff --git a/db/migrate/082_add_messages_locked.rb b/db/migrate/082_add_messages_locked.rb new file mode 100644 index 0000000..20a1725 --- /dev/null +++ b/db/migrate/082_add_messages_locked.rb @@ -0,0 +1,9 @@ +class AddMessagesLocked < ActiveRecord::Migration + def self.up + add_column :messages, :locked, :boolean, :default => false + end + + def self.down + remove_column :messages, :locked + end +end diff --git a/db/migrate/083_add_messages_sticky.rb b/db/migrate/083_add_messages_sticky.rb new file mode 100644 index 0000000..8fd5d2c --- /dev/null +++ b/db/migrate/083_add_messages_sticky.rb @@ -0,0 +1,9 @@ +class AddMessagesSticky < ActiveRecord::Migration + def self.up + add_column :messages, :sticky, :integer, :default => 0 + end + + def self.down + remove_column :messages, :sticky + end +end diff --git a/db/migrate/084_change_auth_sources_account_limit.rb b/db/migrate/084_change_auth_sources_account_limit.rb new file mode 100644 index 0000000..cc127b4 --- /dev/null +++ b/db/migrate/084_change_auth_sources_account_limit.rb @@ -0,0 +1,9 @@ +class ChangeAuthSourcesAccountLimit < ActiveRecord::Migration + def self.up + change_column :auth_sources, :account, :string, :limit => nil + end + + def self.down + change_column :auth_sources, :account, :string, :limit => 60 + end +end diff --git a/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb b/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb new file mode 100644 index 0000000..a59135b --- /dev/null +++ b/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb @@ -0,0 +1,9 @@ +class AddRoleTrackerOldStatusIndexToWorkflows < ActiveRecord::Migration + def self.up + add_index :workflows, [:role_id, :tracker_id, :old_status_id], :name => :wkfs_role_tracker_old_status + end + + def self.down + remove_index(:workflows, :name => :wkfs_role_tracker_old_status); rescue + end +end diff --git a/db/migrate/086_add_custom_fields_searchable.rb b/db/migrate/086_add_custom_fields_searchable.rb new file mode 100644 index 0000000..53158d1 --- /dev/null +++ b/db/migrate/086_add_custom_fields_searchable.rb @@ -0,0 +1,9 @@ +class AddCustomFieldsSearchable < ActiveRecord::Migration + def self.up + add_column :custom_fields, :searchable, :boolean, :default => false + end + + def self.down + remove_column :custom_fields, :searchable + end +end diff --git a/db/migrate/087_change_projects_description_to_text.rb b/db/migrate/087_change_projects_description_to_text.rb new file mode 100644 index 0000000..132e921 --- /dev/null +++ b/db/migrate/087_change_projects_description_to_text.rb @@ -0,0 +1,8 @@ +class ChangeProjectsDescriptionToText < ActiveRecord::Migration + def self.up + change_column :projects, :description, :text, :null => true, :default => nil + end + + def self.down + end +end diff --git a/db/migrate/088_add_custom_fields_default_value.rb b/db/migrate/088_add_custom_fields_default_value.rb new file mode 100644 index 0000000..33a39ec --- /dev/null +++ b/db/migrate/088_add_custom_fields_default_value.rb @@ -0,0 +1,9 @@ +class AddCustomFieldsDefaultValue < ActiveRecord::Migration + def self.up + add_column :custom_fields, :default_value, :text + end + + def self.down + remove_column :custom_fields, :default_value + end +end diff --git a/db/migrate/089_add_attachments_description.rb b/db/migrate/089_add_attachments_description.rb new file mode 100644 index 0000000..411dfe4 --- /dev/null +++ b/db/migrate/089_add_attachments_description.rb @@ -0,0 +1,9 @@ +class AddAttachmentsDescription < ActiveRecord::Migration + def self.up + add_column :attachments, :description, :string + end + + def self.down + remove_column :attachments, :description + end +end diff --git a/db/migrate/090_change_versions_name_limit.rb b/db/migrate/090_change_versions_name_limit.rb new file mode 100644 index 0000000..2764297 --- /dev/null +++ b/db/migrate/090_change_versions_name_limit.rb @@ -0,0 +1,9 @@ +class ChangeVersionsNameLimit < ActiveRecord::Migration + def self.up + change_column :versions, :name, :string, :limit => nil + end + + def self.down + change_column :versions, :name, :string, :limit => 30 + end +end diff --git a/db/migrate/091_change_changesets_revision_to_string.rb b/db/migrate/091_change_changesets_revision_to_string.rb new file mode 100644 index 0000000..6498806 --- /dev/null +++ b/db/migrate/091_change_changesets_revision_to_string.rb @@ -0,0 +1,32 @@ +class ChangeChangesetsRevisionToString < ActiveRecord::Migration + def self.up + # Some backends (eg. SQLServer 2012) do not support changing the type + # of an indexed column so the index needs to be dropped first + # BUT this index is renamed with some backends (at least SQLite3) for + # some (unknown) reasons, thus we check for the other name as well + # so we don't end up with 2 identical indexes + if index_exists? :changesets, [:repository_id, :revision], :name => :changesets_repos_rev + remove_index :changesets, :name => :changesets_repos_rev + end + if index_exists? :changesets, [:repository_id, :revision], :name => :altered_changesets_repos_rev + remove_index :changesets, :name => :altered_changesets_repos_rev + end + + change_column :changesets, :revision, :string, :null => false + + add_index :changesets, [:repository_id, :revision], :unique => true, :name => :changesets_repos_rev + end + + def self.down + if index_exists? :changesets, :changesets_repos_rev + remove_index :changesets, :name => :changesets_repos_rev + end + if index_exists? :changesets, [:repository_id, :revision], :name => :altered_changesets_repos_rev + remove_index :changesets, :name => :altered_changesets_repos_rev + end + + change_column :changesets, :revision, :integer, :null => false + + add_index :changesets, [:repository_id, :revision], :unique => true, :name => :changesets_repos_rev + end +end diff --git a/db/migrate/092_change_changes_from_revision_to_string.rb b/db/migrate/092_change_changes_from_revision_to_string.rb new file mode 100644 index 0000000..b298a3f --- /dev/null +++ b/db/migrate/092_change_changes_from_revision_to_string.rb @@ -0,0 +1,9 @@ +class ChangeChangesFromRevisionToString < ActiveRecord::Migration + def self.up + change_column :changes, :from_revision, :string + end + + def self.down + change_column :changes, :from_revision, :integer + end +end diff --git a/db/migrate/093_add_wiki_pages_protected.rb b/db/migrate/093_add_wiki_pages_protected.rb new file mode 100644 index 0000000..49720fb --- /dev/null +++ b/db/migrate/093_add_wiki_pages_protected.rb @@ -0,0 +1,9 @@ +class AddWikiPagesProtected < ActiveRecord::Migration + def self.up + add_column :wiki_pages, :protected, :boolean, :default => false, :null => false + end + + def self.down + remove_column :wiki_pages, :protected + end +end diff --git a/db/migrate/094_change_projects_homepage_limit.rb b/db/migrate/094_change_projects_homepage_limit.rb new file mode 100644 index 0000000..98374aa --- /dev/null +++ b/db/migrate/094_change_projects_homepage_limit.rb @@ -0,0 +1,9 @@ +class ChangeProjectsHomepageLimit < ActiveRecord::Migration + def self.up + change_column :projects, :homepage, :string, :limit => nil, :default => '' + end + + def self.down + change_column :projects, :homepage, :string, :limit => 60, :default => '' + end +end diff --git a/db/migrate/095_add_wiki_pages_parent_id.rb b/db/migrate/095_add_wiki_pages_parent_id.rb new file mode 100644 index 0000000..36b922e --- /dev/null +++ b/db/migrate/095_add_wiki_pages_parent_id.rb @@ -0,0 +1,9 @@ +class AddWikiPagesParentId < ActiveRecord::Migration + def self.up + add_column :wiki_pages, :parent_id, :integer, :default => nil + end + + def self.down + remove_column :wiki_pages, :parent_id + end +end diff --git a/db/migrate/096_add_commit_access_permission.rb b/db/migrate/096_add_commit_access_permission.rb new file mode 100644 index 0000000..39642cd --- /dev/null +++ b/db/migrate/096_add_commit_access_permission.rb @@ -0,0 +1,13 @@ +class AddCommitAccessPermission < ActiveRecord::Migration + def self.up + Role.all.select { |r| not r.builtin? }.each do |r| + r.add_permission!(:commit_access) + end + end + + def self.down + Role.all.select { |r| not r.builtin? }.each do |r| + r.remove_permission!(:commit_access) + end + end +end diff --git a/db/migrate/097_add_view_wiki_edits_permission.rb b/db/migrate/097_add_view_wiki_edits_permission.rb new file mode 100644 index 0000000..cd25f3c --- /dev/null +++ b/db/migrate/097_add_view_wiki_edits_permission.rb @@ -0,0 +1,13 @@ +class AddViewWikiEditsPermission < ActiveRecord::Migration + def self.up + Role.all.each do |r| + r.add_permission!(:view_wiki_edits) if r.has_permission?(:view_wiki_pages) + end + end + + def self.down + Role.all.each do |r| + r.remove_permission!(:view_wiki_edits) + end + end +end diff --git a/db/migrate/098_set_topic_authors_as_watchers.rb b/db/migrate/098_set_topic_authors_as_watchers.rb new file mode 100644 index 0000000..1a15295 --- /dev/null +++ b/db/migrate/098_set_topic_authors_as_watchers.rb @@ -0,0 +1,15 @@ +class SetTopicAuthorsAsWatchers < ActiveRecord::Migration + def self.up + # Sets active users who created/replied a topic as watchers of the topic + # so that the new watch functionality at topic level doesn't affect notifications behaviour + Message.connection.execute("INSERT INTO #{Watcher.table_name} (watchable_type, watchable_id, user_id)" + + " SELECT DISTINCT 'Message', COALESCE(m.parent_id, m.id), m.author_id" + + " FROM #{Message.table_name} m, #{User.table_name} u" + + " WHERE m.author_id = u.id AND u.status = 1") + end + + def self.down + # Removes all message watchers + Watcher.where("watchable_type = 'Message'").delete_all + end +end diff --git a/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb b/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb new file mode 100644 index 0000000..475e4d0 --- /dev/null +++ b/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb @@ -0,0 +1,13 @@ +class AddDeleteWikiPagesAttachmentsPermission < ActiveRecord::Migration + def self.up + Role.all.each do |r| + r.add_permission!(:delete_wiki_pages_attachments) if r.has_permission?(:edit_wiki_pages) + end + end + + def self.down + Role.all.each do |r| + r.remove_permission!(:delete_wiki_pages_attachments) + end + end +end diff --git a/db/migrate/100_add_changesets_user_id.rb b/db/migrate/100_add_changesets_user_id.rb new file mode 100644 index 0000000..9b25fd7 --- /dev/null +++ b/db/migrate/100_add_changesets_user_id.rb @@ -0,0 +1,9 @@ +class AddChangesetsUserId < ActiveRecord::Migration + def self.up + add_column :changesets, :user_id, :integer, :default => nil + end + + def self.down + remove_column :changesets, :user_id + end +end diff --git a/db/migrate/101_populate_changesets_user_id.rb b/db/migrate/101_populate_changesets_user_id.rb new file mode 100644 index 0000000..566363f --- /dev/null +++ b/db/migrate/101_populate_changesets_user_id.rb @@ -0,0 +1,18 @@ +class PopulateChangesetsUserId < ActiveRecord::Migration + def self.up + committers = Changeset.connection.select_values("SELECT DISTINCT committer FROM #{Changeset.table_name}") + committers.each do |committer| + next if committer.blank? + if committer.strip =~ /^([^<]+)(<(.*)>)?$/ + username, email = $1.strip, $3 + u = User.find_by_login(username) + u ||= User.find_by_mail(email) unless email.blank? + Changeset.where(["committer = ?", committer]).update_all("user_id = #{u.id}") unless u.nil? + end + end + end + + def self.down + Changeset.update_all('user_id = NULL') + end +end diff --git a/db/migrate/102_add_custom_fields_editable.rb b/db/migrate/102_add_custom_fields_editable.rb new file mode 100644 index 0000000..949f9db --- /dev/null +++ b/db/migrate/102_add_custom_fields_editable.rb @@ -0,0 +1,9 @@ +class AddCustomFieldsEditable < ActiveRecord::Migration + def self.up + add_column :custom_fields, :editable, :boolean, :default => true + end + + def self.down + remove_column :custom_fields, :editable + end +end diff --git a/db/migrate/103_set_custom_fields_editable.rb b/db/migrate/103_set_custom_fields_editable.rb new file mode 100644 index 0000000..937649e --- /dev/null +++ b/db/migrate/103_set_custom_fields_editable.rb @@ -0,0 +1,9 @@ +class SetCustomFieldsEditable < ActiveRecord::Migration + def self.up + UserCustomField.update_all("editable = #{CustomField.connection.quoted_false}") + end + + def self.down + UserCustomField.update_all("editable = #{CustomField.connection.quoted_true}") + end +end diff --git a/db/migrate/104_add_projects_lft_and_rgt.rb b/db/migrate/104_add_projects_lft_and_rgt.rb new file mode 100644 index 0000000..8952c16 --- /dev/null +++ b/db/migrate/104_add_projects_lft_and_rgt.rb @@ -0,0 +1,11 @@ +class AddProjectsLftAndRgt < ActiveRecord::Migration + def self.up + add_column :projects, :lft, :integer + add_column :projects, :rgt, :integer + end + + def self.down + remove_column :projects, :lft + remove_column :projects, :rgt + end +end diff --git a/db/migrate/105_build_projects_tree.rb b/db/migrate/105_build_projects_tree.rb new file mode 100644 index 0000000..cd35373 --- /dev/null +++ b/db/migrate/105_build_projects_tree.rb @@ -0,0 +1,8 @@ +class BuildProjectsTree < ActiveRecord::Migration + def self.up + Project.rebuild_tree! + end + + def self.down + end +end diff --git a/db/migrate/106_remove_projects_projects_count.rb b/db/migrate/106_remove_projects_projects_count.rb new file mode 100644 index 0000000..68bb3d1 --- /dev/null +++ b/db/migrate/106_remove_projects_projects_count.rb @@ -0,0 +1,9 @@ +class RemoveProjectsProjectsCount < ActiveRecord::Migration + def self.up + remove_column :projects, :projects_count + end + + def self.down + add_column :projects, :projects_count, :integer, :default => 0 + end +end diff --git a/db/migrate/107_add_open_id_authentication_tables.rb b/db/migrate/107_add_open_id_authentication_tables.rb new file mode 100644 index 0000000..caae0d8 --- /dev/null +++ b/db/migrate/107_add_open_id_authentication_tables.rb @@ -0,0 +1,20 @@ +class AddOpenIdAuthenticationTables < ActiveRecord::Migration + def self.up + create_table :open_id_authentication_associations, :force => true do |t| + t.integer :issued, :lifetime + t.string :handle, :assoc_type + t.binary :server_url, :secret + end + + create_table :open_id_authentication_nonces, :force => true do |t| + t.integer :timestamp, :null => false + t.string :server_url, :null => true + t.string :salt, :null => false + end + end + + def self.down + drop_table :open_id_authentication_associations + drop_table :open_id_authentication_nonces + end +end diff --git a/db/migrate/108_add_identity_url_to_users.rb b/db/migrate/108_add_identity_url_to_users.rb new file mode 100644 index 0000000..f5af77b --- /dev/null +++ b/db/migrate/108_add_identity_url_to_users.rb @@ -0,0 +1,9 @@ +class AddIdentityUrlToUsers < ActiveRecord::Migration + def self.up + add_column :users, :identity_url, :string + end + + def self.down + remove_column :users, :identity_url + end +end diff --git a/db/migrate/20090214190337_add_watchers_user_id_type_index.rb b/db/migrate/20090214190337_add_watchers_user_id_type_index.rb new file mode 100644 index 0000000..7ff4e54 --- /dev/null +++ b/db/migrate/20090214190337_add_watchers_user_id_type_index.rb @@ -0,0 +1,9 @@ +class AddWatchersUserIdTypeIndex < ActiveRecord::Migration + def self.up + add_index :watchers, [:user_id, :watchable_type], :name => :watchers_user_id_type + end + + def self.down + remove_index :watchers, :name => :watchers_user_id_type + end +end diff --git a/db/migrate/20090312172426_add_queries_sort_criteria.rb b/db/migrate/20090312172426_add_queries_sort_criteria.rb new file mode 100644 index 0000000..743ed42 --- /dev/null +++ b/db/migrate/20090312172426_add_queries_sort_criteria.rb @@ -0,0 +1,9 @@ +class AddQueriesSortCriteria < ActiveRecord::Migration + def self.up + add_column :queries, :sort_criteria, :text + end + + def self.down + remove_column :queries, :sort_criteria + end +end diff --git a/db/migrate/20090312194159_add_projects_trackers_unique_index.rb b/db/migrate/20090312194159_add_projects_trackers_unique_index.rb new file mode 100644 index 0000000..f4e3a26 --- /dev/null +++ b/db/migrate/20090312194159_add_projects_trackers_unique_index.rb @@ -0,0 +1,21 @@ +class AddProjectsTrackersUniqueIndex < ActiveRecord::Migration + def self.up + remove_duplicates + add_index :projects_trackers, [:project_id, :tracker_id], :name => :projects_trackers_unique, :unique => true + end + + def self.down + remove_index :projects_trackers, :name => :projects_trackers_unique + end + + # Removes duplicates in projects_trackers table + def self.remove_duplicates + Project.all.each do |project| + ids = project.trackers.collect(&:id) + unless ids == ids.uniq + project.trackers.clear + project.tracker_ids = ids.uniq + end + end + end +end diff --git a/db/migrate/20090318181151_extend_settings_name.rb b/db/migrate/20090318181151_extend_settings_name.rb new file mode 100644 index 0000000..eca03d5 --- /dev/null +++ b/db/migrate/20090318181151_extend_settings_name.rb @@ -0,0 +1,9 @@ +class ExtendSettingsName < ActiveRecord::Migration + def self.up + change_column :settings, :name, :string, :limit => 255, :default => '', :null => false + end + + def self.down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20090323224724_add_type_to_enumerations.rb b/db/migrate/20090323224724_add_type_to_enumerations.rb new file mode 100644 index 0000000..c2aef5e --- /dev/null +++ b/db/migrate/20090323224724_add_type_to_enumerations.rb @@ -0,0 +1,9 @@ +class AddTypeToEnumerations < ActiveRecord::Migration + def self.up + add_column :enumerations, :type, :string + end + + def self.down + remove_column :enumerations, :type + end +end diff --git a/db/migrate/20090401221305_update_enumerations_to_sti.rb b/db/migrate/20090401221305_update_enumerations_to_sti.rb new file mode 100644 index 0000000..031dd46 --- /dev/null +++ b/db/migrate/20090401221305_update_enumerations_to_sti.rb @@ -0,0 +1,11 @@ +class UpdateEnumerationsToSti < ActiveRecord::Migration + def self.up + Enumeration.where("opt = 'IPRI'").update_all("type = 'IssuePriority'") + Enumeration.where("opt = 'DCAT'").update_all("type = 'DocumentCategory'") + Enumeration.where("opt = 'ACTI'").update_all("type = 'TimeEntryActivity'") + end + + def self.down + # no-op + end +end diff --git a/db/migrate/20090401231134_add_active_field_to_enumerations.rb b/db/migrate/20090401231134_add_active_field_to_enumerations.rb new file mode 100644 index 0000000..55824fa --- /dev/null +++ b/db/migrate/20090401231134_add_active_field_to_enumerations.rb @@ -0,0 +1,9 @@ +class AddActiveFieldToEnumerations < ActiveRecord::Migration + def self.up + add_column :enumerations, :active, :boolean, :default => true, :null => false + end + + def self.down + remove_column :enumerations, :active + end +end diff --git a/db/migrate/20090403001910_add_project_to_enumerations.rb b/db/migrate/20090403001910_add_project_to_enumerations.rb new file mode 100644 index 0000000..a3db6d5 --- /dev/null +++ b/db/migrate/20090403001910_add_project_to_enumerations.rb @@ -0,0 +1,11 @@ +class AddProjectToEnumerations < ActiveRecord::Migration + def self.up + add_column :enumerations, :project_id, :integer, :null => true, :default => nil + add_index :enumerations, :project_id + end + + def self.down + remove_index :enumerations, :project_id + remove_column :enumerations, :project_id + end +end diff --git a/db/migrate/20090406161854_add_parent_id_to_enumerations.rb b/db/migrate/20090406161854_add_parent_id_to_enumerations.rb new file mode 100644 index 0000000..2c1b178 --- /dev/null +++ b/db/migrate/20090406161854_add_parent_id_to_enumerations.rb @@ -0,0 +1,9 @@ +class AddParentIdToEnumerations < ActiveRecord::Migration + def self.up + add_column :enumerations, :parent_id, :integer, :null => true, :default => nil + end + + def self.down + remove_column :enumerations, :parent_id + end +end diff --git a/db/migrate/20090425161243_add_queries_group_by.rb b/db/migrate/20090425161243_add_queries_group_by.rb new file mode 100644 index 0000000..1405f3d --- /dev/null +++ b/db/migrate/20090425161243_add_queries_group_by.rb @@ -0,0 +1,9 @@ +class AddQueriesGroupBy < ActiveRecord::Migration + def self.up + add_column :queries, :group_by, :string + end + + def self.down + remove_column :queries, :group_by + end +end diff --git a/db/migrate/20090503121501_create_member_roles.rb b/db/migrate/20090503121501_create_member_roles.rb new file mode 100644 index 0000000..38519ea --- /dev/null +++ b/db/migrate/20090503121501_create_member_roles.rb @@ -0,0 +1,12 @@ +class CreateMemberRoles < ActiveRecord::Migration + def self.up + create_table :member_roles do |t| + t.column :member_id, :integer, :null => false + t.column :role_id, :integer, :null => false + end + end + + def self.down + drop_table :member_roles + end +end diff --git a/db/migrate/20090503121505_populate_member_roles.rb b/db/migrate/20090503121505_populate_member_roles.rb new file mode 100644 index 0000000..285d7e5 --- /dev/null +++ b/db/migrate/20090503121505_populate_member_roles.rb @@ -0,0 +1,12 @@ +class PopulateMemberRoles < ActiveRecord::Migration + def self.up + MemberRole.delete_all + Member.all.each do |member| + MemberRole.create!(:member_id => member.id, :role_id => member.role_id) + end + end + + def self.down + MemberRole.delete_all + end +end diff --git a/db/migrate/20090503121510_drop_members_role_id.rb b/db/migrate/20090503121510_drop_members_role_id.rb new file mode 100644 index 0000000..c281199 --- /dev/null +++ b/db/migrate/20090503121510_drop_members_role_id.rb @@ -0,0 +1,9 @@ +class DropMembersRoleId < ActiveRecord::Migration + def self.up + remove_column :members, :role_id + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/20090614091200_fix_messages_sticky_null.rb b/db/migrate/20090614091200_fix_messages_sticky_null.rb new file mode 100644 index 0000000..fcb8b45 --- /dev/null +++ b/db/migrate/20090614091200_fix_messages_sticky_null.rb @@ -0,0 +1,9 @@ +class FixMessagesStickyNull < ActiveRecord::Migration + def self.up + Message.where('sticky IS NULL').update_all('sticky = 0') + end + + def self.down + # nothing to do + end +end diff --git a/db/migrate/20090704172350_populate_users_type.rb b/db/migrate/20090704172350_populate_users_type.rb new file mode 100644 index 0000000..e7c72d5 --- /dev/null +++ b/db/migrate/20090704172350_populate_users_type.rb @@ -0,0 +1,8 @@ +class PopulateUsersType < ActiveRecord::Migration + def self.up + Principal.where("type IS NULL").update_all("type = 'User'") + end + + def self.down + end +end diff --git a/db/migrate/20090704172355_create_groups_users.rb b/db/migrate/20090704172355_create_groups_users.rb new file mode 100644 index 0000000..9ce03b9 --- /dev/null +++ b/db/migrate/20090704172355_create_groups_users.rb @@ -0,0 +1,13 @@ +class CreateGroupsUsers < ActiveRecord::Migration + def self.up + create_table :groups_users, :id => false do |t| + t.column :group_id, :integer, :null => false + t.column :user_id, :integer, :null => false + end + add_index :groups_users, [:group_id, :user_id], :unique => true, :name => :groups_users_ids + end + + def self.down + drop_table :groups_users + end +end diff --git a/db/migrate/20090704172358_add_member_roles_inherited_from.rb b/db/migrate/20090704172358_add_member_roles_inherited_from.rb new file mode 100644 index 0000000..4ffa523 --- /dev/null +++ b/db/migrate/20090704172358_add_member_roles_inherited_from.rb @@ -0,0 +1,9 @@ +class AddMemberRolesInheritedFrom < ActiveRecord::Migration + def self.up + add_column :member_roles, :inherited_from, :integer + end + + def self.down + remove_column :member_roles, :inherited_from + end +end diff --git a/db/migrate/20091010093521_fix_users_custom_values.rb b/db/migrate/20091010093521_fix_users_custom_values.rb new file mode 100644 index 0000000..93c5cfb --- /dev/null +++ b/db/migrate/20091010093521_fix_users_custom_values.rb @@ -0,0 +1,11 @@ +class FixUsersCustomValues < ActiveRecord::Migration + def self.up + CustomValue.where("customized_type = 'User'"). + update_all("customized_type = 'Principal'") + end + + def self.down + CustomValue.where("customized_type = 'Principal'"). + update_all("customized_type = 'User'") + end +end diff --git a/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb b/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb new file mode 100644 index 0000000..13fa013 --- /dev/null +++ b/db/migrate/20091017212227_add_missing_indexes_to_workflows.rb @@ -0,0 +1,13 @@ +class AddMissingIndexesToWorkflows < ActiveRecord::Migration + def self.up + add_index :workflows, :old_status_id + add_index :workflows, :role_id + add_index :workflows, :new_status_id + end + + def self.down + remove_index :workflows, :old_status_id + remove_index :workflows, :role_id + remove_index :workflows, :new_status_id + end +end diff --git a/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb b/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb new file mode 100644 index 0000000..b95f543 --- /dev/null +++ b/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToCustomFieldsProjects < ActiveRecord::Migration + def self.up + add_index :custom_fields_projects, [:custom_field_id, :project_id] + end + + def self.down + remove_index :custom_fields_projects, :column => [:custom_field_id, :project_id] + end +end diff --git a/db/migrate/20091017212644_add_missing_indexes_to_messages.rb b/db/migrate/20091017212644_add_missing_indexes_to_messages.rb new file mode 100644 index 0000000..23c2729 --- /dev/null +++ b/db/migrate/20091017212644_add_missing_indexes_to_messages.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToMessages < ActiveRecord::Migration + def self.up + add_index :messages, :last_reply_id + add_index :messages, :author_id + end + + def self.down + remove_index :messages, :last_reply_id + remove_index :messages, :author_id + end +end diff --git a/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb b/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb new file mode 100644 index 0000000..b9f43b6 --- /dev/null +++ b/db/migrate/20091017212938_add_missing_indexes_to_repositories.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToRepositories < ActiveRecord::Migration + def self.up + add_index :repositories, :project_id + end + + def self.down + remove_index :repositories, :project_id + end +end diff --git a/db/migrate/20091017213027_add_missing_indexes_to_comments.rb b/db/migrate/20091017213027_add_missing_indexes_to_comments.rb new file mode 100644 index 0000000..2a1ed27 --- /dev/null +++ b/db/migrate/20091017213027_add_missing_indexes_to_comments.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToComments < ActiveRecord::Migration + def self.up + add_index :comments, [:commented_id, :commented_type] + add_index :comments, :author_id + end + + def self.down + remove_index :comments, :column => [:commented_id, :commented_type] + remove_index :comments, :author_id + end +end diff --git a/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb b/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb new file mode 100644 index 0000000..85dedf8 --- /dev/null +++ b/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToEnumerations < ActiveRecord::Migration + def self.up + add_index :enumerations, [:id, :type] + end + + def self.down + remove_index :enumerations, :column => [:id, :type] + end +end diff --git a/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb b/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb new file mode 100644 index 0000000..7fab09e --- /dev/null +++ b/db/migrate/20091017213151_add_missing_indexes_to_wiki_pages.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToWikiPages < ActiveRecord::Migration + def self.up + add_index :wiki_pages, :wiki_id + add_index :wiki_pages, :parent_id + end + + def self.down + remove_index :wiki_pages, :wiki_id + remove_index :wiki_pages, :parent_id + end +end diff --git a/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb b/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb new file mode 100644 index 0000000..618e1cd --- /dev/null +++ b/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToWatchers < ActiveRecord::Migration + def self.up + add_index :watchers, :user_id + add_index :watchers, [:watchable_id, :watchable_type] + end + + def self.down + remove_index :watchers, :user_id + remove_index :watchers, :column => [:watchable_id, :watchable_type] + end +end diff --git a/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb b/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb new file mode 100644 index 0000000..ccd4f04 --- /dev/null +++ b/db/migrate/20091017213257_add_missing_indexes_to_auth_sources.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToAuthSources < ActiveRecord::Migration + def self.up + add_index :auth_sources, [:id, :type] + end + + def self.down + remove_index :auth_sources, :column => [:id, :type] + end +end diff --git a/db/migrate/20091017213332_add_missing_indexes_to_documents.rb b/db/migrate/20091017213332_add_missing_indexes_to_documents.rb new file mode 100644 index 0000000..f519018 --- /dev/null +++ b/db/migrate/20091017213332_add_missing_indexes_to_documents.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToDocuments < ActiveRecord::Migration + def self.up + add_index :documents, :category_id + end + + def self.down + remove_index :documents, :category_id + end +end diff --git a/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb b/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb new file mode 100644 index 0000000..f0979f2 --- /dev/null +++ b/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToTokens < ActiveRecord::Migration + def self.up + add_index :tokens, :user_id + end + + def self.down + remove_index :tokens, :user_id + end +end diff --git a/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb b/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb new file mode 100644 index 0000000..303be83 --- /dev/null +++ b/db/migrate/20091017213536_add_missing_indexes_to_changesets.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToChangesets < ActiveRecord::Migration + def self.up + add_index :changesets, :user_id + add_index :changesets, :repository_id + end + + def self.down + remove_index :changesets, :user_id + remove_index :changesets, :repository_id + end +end diff --git a/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb b/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb new file mode 100644 index 0000000..3f5b2b1 --- /dev/null +++ b/db/migrate/20091017213642_add_missing_indexes_to_issue_categories.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToIssueCategories < ActiveRecord::Migration + def self.up + add_index :issue_categories, :assigned_to_id + end + + def self.down + remove_index :issue_categories, :assigned_to_id + end +end diff --git a/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb b/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb new file mode 100644 index 0000000..e9ff62d --- /dev/null +++ b/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToMemberRoles < ActiveRecord::Migration + def self.up + add_index :member_roles, :member_id + add_index :member_roles, :role_id + end + + def self.down + remove_index :member_roles, :member_id + remove_index :member_roles, :role_id + end +end diff --git a/db/migrate/20091017213757_add_missing_indexes_to_boards.rb b/db/migrate/20091017213757_add_missing_indexes_to_boards.rb new file mode 100644 index 0000000..d3e9422 --- /dev/null +++ b/db/migrate/20091017213757_add_missing_indexes_to_boards.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToBoards < ActiveRecord::Migration + def self.up + add_index :boards, :last_message_id + end + + def self.down + remove_index :boards, :last_message_id + end +end diff --git a/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb b/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb new file mode 100644 index 0000000..f3a8ccb --- /dev/null +++ b/db/migrate/20091017213835_add_missing_indexes_to_user_preferences.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToUserPreferences < ActiveRecord::Migration + def self.up + add_index :user_preferences, :user_id + end + + def self.down + remove_index :user_preferences, :user_id + end +end diff --git a/db/migrate/20091017213910_add_missing_indexes_to_issues.rb b/db/migrate/20091017213910_add_missing_indexes_to_issues.rb new file mode 100644 index 0000000..d651a54 --- /dev/null +++ b/db/migrate/20091017213910_add_missing_indexes_to_issues.rb @@ -0,0 +1,21 @@ +class AddMissingIndexesToIssues < ActiveRecord::Migration + def self.up + add_index :issues, :status_id + add_index :issues, :category_id + add_index :issues, :assigned_to_id + add_index :issues, :fixed_version_id + add_index :issues, :tracker_id + add_index :issues, :priority_id + add_index :issues, :author_id + end + + def self.down + remove_index :issues, :status_id + remove_index :issues, :category_id + remove_index :issues, :assigned_to_id + remove_index :issues, :fixed_version_id + remove_index :issues, :tracker_id + remove_index :issues, :priority_id + remove_index :issues, :author_id + end +end diff --git a/db/migrate/20091017214015_add_missing_indexes_to_members.rb b/db/migrate/20091017214015_add_missing_indexes_to_members.rb new file mode 100644 index 0000000..5fdf560 --- /dev/null +++ b/db/migrate/20091017214015_add_missing_indexes_to_members.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToMembers < ActiveRecord::Migration + def self.up + add_index :members, :user_id + add_index :members, :project_id + end + + def self.down + remove_index :members, :user_id + remove_index :members, :project_id + end +end diff --git a/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb b/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb new file mode 100644 index 0000000..18be0b4 --- /dev/null +++ b/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToCustomFields < ActiveRecord::Migration + def self.up + add_index :custom_fields, [:id, :type] + end + + def self.down + remove_index :custom_fields, :column => [:id, :type] + end +end diff --git a/db/migrate/20091017214136_add_missing_indexes_to_queries.rb b/db/migrate/20091017214136_add_missing_indexes_to_queries.rb new file mode 100644 index 0000000..414b1ad --- /dev/null +++ b/db/migrate/20091017214136_add_missing_indexes_to_queries.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToQueries < ActiveRecord::Migration + def self.up + add_index :queries, :project_id + add_index :queries, :user_id + end + + def self.down + remove_index :queries, :project_id + remove_index :queries, :user_id + end +end diff --git a/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb b/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb new file mode 100644 index 0000000..cffc528 --- /dev/null +++ b/db/migrate/20091017214236_add_missing_indexes_to_time_entries.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToTimeEntries < ActiveRecord::Migration + def self.up + add_index :time_entries, :activity_id + add_index :time_entries, :user_id + end + + def self.down + remove_index :time_entries, :activity_id + remove_index :time_entries, :user_id + end +end diff --git a/db/migrate/20091017214308_add_missing_indexes_to_news.rb b/db/migrate/20091017214308_add_missing_indexes_to_news.rb new file mode 100644 index 0000000..808eb62 --- /dev/null +++ b/db/migrate/20091017214308_add_missing_indexes_to_news.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToNews < ActiveRecord::Migration + def self.up + add_index :news, :author_id + end + + def self.down + remove_index :news, :author_id + end +end diff --git a/db/migrate/20091017214336_add_missing_indexes_to_users.rb b/db/migrate/20091017214336_add_missing_indexes_to_users.rb new file mode 100644 index 0000000..c5a5095 --- /dev/null +++ b/db/migrate/20091017214336_add_missing_indexes_to_users.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToUsers < ActiveRecord::Migration + def self.up + add_index :users, [:id, :type] + add_index :users, :auth_source_id + end + + def self.down + remove_index :users, :column => [:id, :type] + remove_index :users, :auth_source_id + end +end diff --git a/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb b/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb new file mode 100644 index 0000000..d22fc98 --- /dev/null +++ b/db/migrate/20091017214406_add_missing_indexes_to_attachments.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToAttachments < ActiveRecord::Migration + def self.up + add_index :attachments, [:container_id, :container_type] + add_index :attachments, :author_id + end + + def self.down + remove_index :attachments, :column => [:container_id, :container_type] + remove_index :attachments, :author_id + end +end diff --git a/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb b/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb new file mode 100644 index 0000000..454e4c5 --- /dev/null +++ b/db/migrate/20091017214440_add_missing_indexes_to_wiki_contents.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToWikiContents < ActiveRecord::Migration + def self.up + add_index :wiki_contents, :author_id + end + + def self.down + remove_index :wiki_contents, :author_id + end +end diff --git a/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb b/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb new file mode 100644 index 0000000..b192a7e --- /dev/null +++ b/db/migrate/20091017214519_add_missing_indexes_to_custom_values.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToCustomValues < ActiveRecord::Migration + def self.up + add_index :custom_values, :custom_field_id + end + + def self.down + remove_index :custom_values, :custom_field_id + end +end diff --git a/db/migrate/20091017214611_add_missing_indexes_to_journals.rb b/db/migrate/20091017214611_add_missing_indexes_to_journals.rb new file mode 100644 index 0000000..2667f40 --- /dev/null +++ b/db/migrate/20091017214611_add_missing_indexes_to_journals.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToJournals < ActiveRecord::Migration + def self.up + add_index :journals, :user_id + add_index :journals, :journalized_id + end + + def self.down + remove_index :journals, :user_id + remove_index :journals, :journalized_id + end +end diff --git a/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb b/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb new file mode 100644 index 0000000..fc57f18 --- /dev/null +++ b/db/migrate/20091017214644_add_missing_indexes_to_issue_relations.rb @@ -0,0 +1,11 @@ +class AddMissingIndexesToIssueRelations < ActiveRecord::Migration + def self.up + add_index :issue_relations, :issue_from_id + add_index :issue_relations, :issue_to_id + end + + def self.down + remove_index :issue_relations, :issue_from_id + remove_index :issue_relations, :issue_to_id + end +end diff --git a/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb b/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb new file mode 100644 index 0000000..7442a54 --- /dev/null +++ b/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToWikiRedirects < ActiveRecord::Migration + def self.up + add_index :wiki_redirects, :wiki_id + end + + def self.down + remove_index :wiki_redirects, :wiki_id + end +end diff --git a/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb b/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb new file mode 100644 index 0000000..c398b79 --- /dev/null +++ b/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb @@ -0,0 +1,9 @@ +class AddMissingIndexesToCustomFieldsTrackers < ActiveRecord::Migration + def self.up + add_index :custom_fields_trackers, [:custom_field_id, :tracker_id] + end + + def self.down + remove_index :custom_fields_trackers, :column => [:custom_field_id, :tracker_id] + end +end diff --git a/db/migrate/20091025163651_add_activity_indexes.rb b/db/migrate/20091025163651_add_activity_indexes.rb new file mode 100644 index 0000000..f180593 --- /dev/null +++ b/db/migrate/20091025163651_add_activity_indexes.rb @@ -0,0 +1,25 @@ +class AddActivityIndexes < ActiveRecord::Migration + def self.up + add_index :journals, :created_on + add_index :changesets, :committed_on + add_index :wiki_content_versions, :updated_on + add_index :messages, :created_on + add_index :issues, :created_on + add_index :news, :created_on + add_index :attachments, :created_on + add_index :documents, :created_on + add_index :time_entries, :created_on + end + + def self.down + remove_index :journals, :created_on + remove_index :changesets, :committed_on + remove_index :wiki_content_versions, :updated_on + remove_index :messages, :created_on + remove_index :issues, :created_on + remove_index :news, :created_on + remove_index :attachments, :created_on + remove_index :documents, :created_on + remove_index :time_entries, :created_on + end +end diff --git a/db/migrate/20091108092559_add_versions_status.rb b/db/migrate/20091108092559_add_versions_status.rb new file mode 100644 index 0000000..99f5f5a --- /dev/null +++ b/db/migrate/20091108092559_add_versions_status.rb @@ -0,0 +1,10 @@ +class AddVersionsStatus < ActiveRecord::Migration + def self.up + add_column :versions, :status, :string, :default => 'open' + Version.update_all("status = 'open'") + end + + def self.down + remove_column :versions, :status + end +end diff --git a/db/migrate/20091114105931_add_view_issues_permission.rb b/db/migrate/20091114105931_add_view_issues_permission.rb new file mode 100644 index 0000000..6f700cd --- /dev/null +++ b/db/migrate/20091114105931_add_view_issues_permission.rb @@ -0,0 +1,15 @@ +class AddViewIssuesPermission < ActiveRecord::Migration + def self.up + Role.reset_column_information + Role.all.each do |r| + r.add_permission!(:view_issues) + end + end + + def self.down + Role.reset_column_information + Role.all.each do |r| + r.remove_permission!(:view_issues) + end + end +end diff --git a/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb b/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb new file mode 100644 index 0000000..0ce6721 --- /dev/null +++ b/db/migrate/20091123212029_add_default_done_ratio_to_issue_status.rb @@ -0,0 +1,9 @@ +class AddDefaultDoneRatioToIssueStatus < ActiveRecord::Migration + def self.up + add_column :issue_statuses, :default_done_ratio, :integer + end + + def self.down + remove_column :issue_statuses, :default_done_ratio + end +end diff --git a/db/migrate/20091205124427_add_versions_sharing.rb b/db/migrate/20091205124427_add_versions_sharing.rb new file mode 100644 index 0000000..3c28e11 --- /dev/null +++ b/db/migrate/20091205124427_add_versions_sharing.rb @@ -0,0 +1,10 @@ +class AddVersionsSharing < ActiveRecord::Migration + def self.up + add_column :versions, :sharing, :string, :default => 'none', :null => false + add_index :versions, :sharing + end + + def self.down + remove_column :versions, :sharing + end +end diff --git a/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb b/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb new file mode 100644 index 0000000..1c0b4b3 --- /dev/null +++ b/db/migrate/20091220183509_add_lft_and_rgt_indexes_to_projects.rb @@ -0,0 +1,11 @@ +class AddLftAndRgtIndexesToProjects < ActiveRecord::Migration + def self.up + add_index :projects, :lft + add_index :projects, :rgt + end + + def self.down + remove_index :projects, :lft + remove_index :projects, :rgt + end +end diff --git a/db/migrate/20091220183727_add_index_to_settings_name.rb b/db/migrate/20091220183727_add_index_to_settings_name.rb new file mode 100644 index 0000000..e6c96ec --- /dev/null +++ b/db/migrate/20091220183727_add_index_to_settings_name.rb @@ -0,0 +1,9 @@ +class AddIndexToSettingsName < ActiveRecord::Migration + def self.up + add_index :settings, :name + end + + def self.down + remove_index :settings, :name + end +end diff --git a/db/migrate/20091220184736_add_indexes_to_issue_status.rb b/db/migrate/20091220184736_add_indexes_to_issue_status.rb new file mode 100644 index 0000000..2497a1e --- /dev/null +++ b/db/migrate/20091220184736_add_indexes_to_issue_status.rb @@ -0,0 +1,13 @@ +class AddIndexesToIssueStatus < ActiveRecord::Migration + def self.up + add_index :issue_statuses, :position + add_index :issue_statuses, :is_closed + add_index :issue_statuses, :is_default + end + + def self.down + remove_index :issue_statuses, :position + remove_index :issue_statuses, :is_closed + remove_index :issue_statuses, :is_default + end +end diff --git a/db/migrate/20091225164732_remove_enumerations_opt.rb b/db/migrate/20091225164732_remove_enumerations_opt.rb new file mode 100644 index 0000000..2a445dd --- /dev/null +++ b/db/migrate/20091225164732_remove_enumerations_opt.rb @@ -0,0 +1,12 @@ +class RemoveEnumerationsOpt < ActiveRecord::Migration + def self.up + remove_column :enumerations, :opt + end + + def self.down + add_column :enumerations, :opt, :string, :limit => 4, :default => '', :null => false + Enumeration.where("type = 'IssuePriority'").update_all("opt = 'IPRI'") + Enumeration.where("type = 'DocumentCategory'").update_all("opt = 'DCAT'") + Enumeration.where("type = 'TimeEntryActivity'").update_all("opt = 'ACTI'") + end +end diff --git a/db/migrate/20091227112908_change_wiki_contents_text_limit.rb b/db/migrate/20091227112908_change_wiki_contents_text_limit.rb new file mode 100644 index 0000000..225f71e --- /dev/null +++ b/db/migrate/20091227112908_change_wiki_contents_text_limit.rb @@ -0,0 +1,16 @@ +class ChangeWikiContentsTextLimit < ActiveRecord::Migration + def self.up + # Migrates MySQL databases only + # Postgres would raise an error (see http://dev.rubyonrails.org/ticket/3818) + # Not fixed in Rails 2.3.5 + if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + max_size = 16.megabytes + change_column :wiki_contents, :text, :text, :limit => max_size + change_column :wiki_content_versions, :data, :binary, :limit => max_size + end + end + + def self.down + # no-op + end +end diff --git a/db/migrate/20100129193402_change_users_mail_notification_to_string.rb b/db/migrate/20100129193402_change_users_mail_notification_to_string.rb new file mode 100644 index 0000000..518a450 --- /dev/null +++ b/db/migrate/20100129193402_change_users_mail_notification_to_string.rb @@ -0,0 +1,21 @@ +class ChangeUsersMailNotificationToString < ActiveRecord::Migration + def self.up + rename_column :users, :mail_notification, :mail_notification_bool + add_column :users, :mail_notification, :string, :default => '', :null => false + User.where("mail_notification_bool = #{connection.quoted_true}"). + update_all("mail_notification = 'all'") + User.where("EXISTS (SELECT 1 FROM #{Member.table_name} WHERE #{Member.table_name}.mail_notification = #{connection.quoted_true} AND #{Member.table_name}.user_id = #{User.table_name}.id)"). + update_all("mail_notification = 'selected'") + User.where("mail_notification NOT IN ('all', 'selected')"). + update_all("mail_notification = 'only_my_events'") + remove_column :users, :mail_notification_bool + end + + def self.down + rename_column :users, :mail_notification, :mail_notification_char + add_column :users, :mail_notification, :boolean, :default => true, :null => false + User.where("mail_notification_char <> 'all'"). + update_all("mail_notification = #{connection.quoted_false}") + remove_column :users, :mail_notification_char + end +end diff --git a/db/migrate/20100129193813_update_mail_notification_values.rb b/db/migrate/20100129193813_update_mail_notification_values.rb new file mode 100644 index 0000000..a8a45ad --- /dev/null +++ b/db/migrate/20100129193813_update_mail_notification_values.rb @@ -0,0 +1,11 @@ +# Patch the data from a boolean change. +class UpdateMailNotificationValues < ActiveRecord::Migration + def self.up + # No-op + # See 20100129193402_change_users_mail_notification_to_string.rb + end + + def self.down + # No-op + end +end diff --git a/db/migrate/20100221100219_add_index_on_changesets_scmid.rb b/db/migrate/20100221100219_add_index_on_changesets_scmid.rb new file mode 100644 index 0000000..96d85a3 --- /dev/null +++ b/db/migrate/20100221100219_add_index_on_changesets_scmid.rb @@ -0,0 +1,9 @@ +class AddIndexOnChangesetsScmid < ActiveRecord::Migration + def self.up + add_index :changesets, [:repository_id, :scmid], :name => :changesets_repos_scmid + end + + def self.down + remove_index :changesets, :name => :changesets_repos_scmid + end +end diff --git a/db/migrate/20100313132032_add_issues_nested_sets_columns.rb b/db/migrate/20100313132032_add_issues_nested_sets_columns.rb new file mode 100644 index 0000000..2467f6f --- /dev/null +++ b/db/migrate/20100313132032_add_issues_nested_sets_columns.rb @@ -0,0 +1,17 @@ +class AddIssuesNestedSetsColumns < ActiveRecord::Migration + def self.up + add_column :issues, :parent_id, :integer, :default => nil + add_column :issues, :root_id, :integer, :default => nil + add_column :issues, :lft, :integer, :default => nil + add_column :issues, :rgt, :integer, :default => nil + + Issue.update_all("parent_id = NULL, root_id = id, lft = 1, rgt = 2") + end + + def self.down + remove_column :issues, :parent_id + remove_column :issues, :root_id + remove_column :issues, :lft + remove_column :issues, :rgt + end +end diff --git a/db/migrate/20100313171051_add_index_on_issues_nested_set.rb b/db/migrate/20100313171051_add_index_on_issues_nested_set.rb new file mode 100644 index 0000000..4dc9480 --- /dev/null +++ b/db/migrate/20100313171051_add_index_on_issues_nested_set.rb @@ -0,0 +1,9 @@ +class AddIndexOnIssuesNestedSet < ActiveRecord::Migration + def self.up + add_index :issues, [:root_id, :lft, :rgt] + end + + def self.down + remove_index :issues, [:root_id, :lft, :rgt] + end +end diff --git a/db/migrate/20100705164950_change_changes_path_length_limit.rb b/db/migrate/20100705164950_change_changes_path_length_limit.rb new file mode 100644 index 0000000..e00b69d --- /dev/null +++ b/db/migrate/20100705164950_change_changes_path_length_limit.rb @@ -0,0 +1,14 @@ +class ChangeChangesPathLengthLimit < ActiveRecord::Migration + def self.up + # these are two steps to please MySQL 5 on Win32 + change_column :changes, :path, :text, :default => nil, :null => true + change_column :changes, :path, :text, :null => false + + change_column :changes, :from_path, :text + end + + def self.down + change_column :changes, :path, :string, :default => "", :null => false + change_column :changes, :from_path, :string + end +end diff --git a/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb b/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb new file mode 100644 index 0000000..6071adf --- /dev/null +++ b/db/migrate/20100819172912_enable_calendar_and_gantt_modules_where_appropriate.rb @@ -0,0 +1,12 @@ +class EnableCalendarAndGanttModulesWhereAppropriate < ActiveRecord::Migration + def self.up + EnabledModule.where(:name => 'issue_tracking').each do |e| + EnabledModule.create(:name => 'calendar', :project_id => e.project_id) + EnabledModule.create(:name => 'gantt', :project_id => e.project_id) + end + end + + def self.down + EnabledModule.where("name = 'calendar' OR name = 'gantt'").delete_all + end +end diff --git a/db/migrate/20101104182107_add_unique_index_on_members.rb b/db/migrate/20101104182107_add_unique_index_on_members.rb new file mode 100644 index 0000000..eabdad8 --- /dev/null +++ b/db/migrate/20101104182107_add_unique_index_on_members.rb @@ -0,0 +1,22 @@ +class AddUniqueIndexOnMembers < ActiveRecord::Migration + def self.up + # Clean and reassign MemberRole rows if needed + MemberRole.where("member_id NOT IN (SELECT id FROM #{Member.table_name})").delete_all + MemberRole.update_all("member_id =" + + " (SELECT min(m2.id) FROM #{Member.table_name} m1, #{Member.table_name} m2" + + " WHERE m1.user_id = m2.user_id AND m1.project_id = m2.project_id" + + " AND m1.id = #{MemberRole.table_name}.member_id)") + # Remove duplicates + Member.connection.select_values("SELECT m.id FROM #{Member.table_name} m" + + " WHERE m.id > (SELECT min(m1.id) FROM #{Member.table_name} m1 WHERE m1.user_id = m.user_id AND m1.project_id = m.project_id)").each do |i| + Member.where(["id = ?", i]).delete_all + end + + # Then add a unique index + add_index :members, [:user_id, :project_id], :unique => true + end + + def self.down + remove_index :members, [:user_id, :project_id] + end +end diff --git a/db/migrate/20101107130441_add_custom_fields_visible.rb b/db/migrate/20101107130441_add_custom_fields_visible.rb new file mode 100644 index 0000000..9d59fae --- /dev/null +++ b/db/migrate/20101107130441_add_custom_fields_visible.rb @@ -0,0 +1,10 @@ +class AddCustomFieldsVisible < ActiveRecord::Migration + def self.up + add_column :custom_fields, :visible, :boolean, :null => false, :default => true + CustomField.update_all("visible = #{CustomField.connection.quoted_true}") + end + + def self.down + remove_column :custom_fields, :visible + end +end diff --git a/db/migrate/20101114115114_change_projects_name_limit.rb b/db/migrate/20101114115114_change_projects_name_limit.rb new file mode 100644 index 0000000..fabc3c9 --- /dev/null +++ b/db/migrate/20101114115114_change_projects_name_limit.rb @@ -0,0 +1,9 @@ +class ChangeProjectsNameLimit < ActiveRecord::Migration + def self.up + change_column :projects, :name, :string, :limit => nil, :default => '', :null => false + end + + def self.down + change_column :projects, :name, :string, :limit => 30, :default => '', :null => false + end +end diff --git a/db/migrate/20101114115359_change_projects_identifier_limit.rb b/db/migrate/20101114115359_change_projects_identifier_limit.rb new file mode 100644 index 0000000..79426fa --- /dev/null +++ b/db/migrate/20101114115359_change_projects_identifier_limit.rb @@ -0,0 +1,9 @@ +class ChangeProjectsIdentifierLimit < ActiveRecord::Migration + def self.up + change_column :projects, :identifier, :string, :limit => nil + end + + def self.down + change_column :projects, :identifier, :string, :limit => 20 + end +end diff --git a/db/migrate/20110220160626_add_workflows_assignee_and_author.rb b/db/migrate/20110220160626_add_workflows_assignee_and_author.rb new file mode 100644 index 0000000..448ac63 --- /dev/null +++ b/db/migrate/20110220160626_add_workflows_assignee_and_author.rb @@ -0,0 +1,14 @@ +class AddWorkflowsAssigneeAndAuthor < ActiveRecord::Migration + def self.up + add_column :workflows, :assignee, :boolean, :null => false, :default => false + add_column :workflows, :author, :boolean, :null => false, :default => false + + WorkflowRule.update_all(:assignee => false) + WorkflowRule.update_all(:author => false) + end + + def self.down + remove_column :workflows, :assignee + remove_column :workflows, :author + end +end diff --git a/db/migrate/20110223180944_add_users_salt.rb b/db/migrate/20110223180944_add_users_salt.rb new file mode 100644 index 0000000..f1cf648 --- /dev/null +++ b/db/migrate/20110223180944_add_users_salt.rb @@ -0,0 +1,9 @@ +class AddUsersSalt < ActiveRecord::Migration + def self.up + add_column :users, :salt, :string, :limit => 64 + end + + def self.down + remove_column :users, :salt + end +end diff --git a/db/migrate/20110223180953_salt_user_passwords.rb b/db/migrate/20110223180953_salt_user_passwords.rb new file mode 100644 index 0000000..9f017db --- /dev/null +++ b/db/migrate/20110223180953_salt_user_passwords.rb @@ -0,0 +1,13 @@ +class SaltUserPasswords < ActiveRecord::Migration + + def self.up + say_with_time "Salting user passwords, this may take some time..." do + User.salt_unsalted_passwords! + end + end + + def self.down + # Unsalted passwords can not be restored + raise ActiveRecord::IrreversibleMigration, "Can't decypher salted passwords. This migration can not be rollback'ed." + end +end diff --git a/db/migrate/20110224000000_add_repositories_path_encoding.rb b/db/migrate/20110224000000_add_repositories_path_encoding.rb new file mode 100644 index 0000000..253d7a6 --- /dev/null +++ b/db/migrate/20110224000000_add_repositories_path_encoding.rb @@ -0,0 +1,9 @@ +class AddRepositoriesPathEncoding < ActiveRecord::Migration + def self.up + add_column :repositories, :path_encoding, :string, :limit => 64, :default => nil + end + + def self.down + remove_column :repositories, :path_encoding + end +end diff --git a/db/migrate/20110226120112_change_repositories_password_limit.rb b/db/migrate/20110226120112_change_repositories_password_limit.rb new file mode 100644 index 0000000..1ad937c --- /dev/null +++ b/db/migrate/20110226120112_change_repositories_password_limit.rb @@ -0,0 +1,9 @@ +class ChangeRepositoriesPasswordLimit < ActiveRecord::Migration + def self.up + change_column :repositories, :password, :string, :limit => nil, :default => '' + end + + def self.down + change_column :repositories, :password, :string, :limit => 60, :default => '' + end +end diff --git a/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb b/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb new file mode 100644 index 0000000..b1cd80a --- /dev/null +++ b/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb @@ -0,0 +1,9 @@ +class ChangeAuthSourcesAccountPasswordLimit < ActiveRecord::Migration + def self.up + change_column :auth_sources, :account_password, :string, :limit => nil, :default => '' + end + + def self.down + change_column :auth_sources, :account_password, :string, :limit => 60, :default => '' + end +end diff --git a/db/migrate/20110227125750_change_journal_details_values_to_text.rb b/db/migrate/20110227125750_change_journal_details_values_to_text.rb new file mode 100644 index 0000000..2588657 --- /dev/null +++ b/db/migrate/20110227125750_change_journal_details_values_to_text.rb @@ -0,0 +1,11 @@ +class ChangeJournalDetailsValuesToText < ActiveRecord::Migration + def self.up + change_column :journal_details, :old_value, :text + change_column :journal_details, :value, :text + end + + def self.down + change_column :journal_details, :old_value, :string + change_column :journal_details, :value, :string + end +end diff --git a/db/migrate/20110228000000_add_repositories_log_encoding.rb b/db/migrate/20110228000000_add_repositories_log_encoding.rb new file mode 100644 index 0000000..85cadaf --- /dev/null +++ b/db/migrate/20110228000000_add_repositories_log_encoding.rb @@ -0,0 +1,9 @@ +class AddRepositoriesLogEncoding < ActiveRecord::Migration + def self.up + add_column :repositories, :log_encoding, :string, :limit => 64, :default => nil + end + + def self.down + remove_column :repositories, :log_encoding + end +end diff --git a/db/migrate/20110228000100_copy_repositories_log_encoding.rb b/db/migrate/20110228000100_copy_repositories_log_encoding.rb new file mode 100644 index 0000000..48d3871 --- /dev/null +++ b/db/migrate/20110228000100_copy_repositories_log_encoding.rb @@ -0,0 +1,12 @@ +class CopyRepositoriesLogEncoding < ActiveRecord::Migration + def self.up + encoding = Setting.commit_logs_encoding.to_s.strip + encoding = encoding.blank? ? 'UTF-8' : encoding + # encoding is NULL by default + Repository.where("type IN ('Bazaar', 'Cvs', 'Darcs')"). + update_all(["log_encoding = ?", encoding]) + end + + def self.down + end +end diff --git a/db/migrate/20110401192910_add_index_to_users_type.rb b/db/migrate/20110401192910_add_index_to_users_type.rb new file mode 100644 index 0000000..b9f5011 --- /dev/null +++ b/db/migrate/20110401192910_add_index_to_users_type.rb @@ -0,0 +1,9 @@ +class AddIndexToUsersType < ActiveRecord::Migration + def self.up + add_index :users, :type + end + + def self.down + remove_index :users, :type + end +end diff --git a/db/migrate/20110408103312_add_roles_issues_visibility.rb b/db/migrate/20110408103312_add_roles_issues_visibility.rb new file mode 100644 index 0000000..1e6b29a --- /dev/null +++ b/db/migrate/20110408103312_add_roles_issues_visibility.rb @@ -0,0 +1,9 @@ +class AddRolesIssuesVisibility < ActiveRecord::Migration + def self.up + add_column :roles, :issues_visibility, :string, :limit => 30, :default => 'default', :null => false + end + + def self.down + remove_column :roles, :issues_visibility + end +end diff --git a/db/migrate/20110412065600_add_issues_is_private.rb b/db/migrate/20110412065600_add_issues_is_private.rb new file mode 100644 index 0000000..2cc4e4b --- /dev/null +++ b/db/migrate/20110412065600_add_issues_is_private.rb @@ -0,0 +1,9 @@ +class AddIssuesIsPrivate < ActiveRecord::Migration + def self.up + add_column :issues, :is_private, :boolean, :default => false, :null => false + end + + def self.down + remove_column :issues, :is_private + end +end diff --git a/db/migrate/20110511000000_add_repositories_extra_info.rb b/db/migrate/20110511000000_add_repositories_extra_info.rb new file mode 100644 index 0000000..a5280dc --- /dev/null +++ b/db/migrate/20110511000000_add_repositories_extra_info.rb @@ -0,0 +1,9 @@ +class AddRepositoriesExtraInfo < ActiveRecord::Migration + def self.up + add_column :repositories, :extra_info, :text + end + + def self.down + remove_column :repositories, :extra_info + end +end diff --git a/db/migrate/20110902000000_create_changeset_parents.rb b/db/migrate/20110902000000_create_changeset_parents.rb new file mode 100644 index 0000000..e679d3f --- /dev/null +++ b/db/migrate/20110902000000_create_changeset_parents.rb @@ -0,0 +1,14 @@ +class CreateChangesetParents < ActiveRecord::Migration + def self.up + create_table :changeset_parents, :id => false do |t| + t.column :changeset_id, :integer, :null => false + t.column :parent_id, :integer, :null => false + end + add_index :changeset_parents, [:changeset_id], :unique => false, :name => :changeset_parents_changeset_ids + add_index :changeset_parents, [:parent_id], :unique => false, :name => :changeset_parents_parent_ids + end + + def self.down + drop_table :changeset_parents + end +end diff --git a/db/migrate/20111201201315_add_unique_index_to_issue_relations.rb b/db/migrate/20111201201315_add_unique_index_to_issue_relations.rb new file mode 100644 index 0000000..1bee49a --- /dev/null +++ b/db/migrate/20111201201315_add_unique_index_to_issue_relations.rb @@ -0,0 +1,16 @@ +class AddUniqueIndexToIssueRelations < ActiveRecord::Migration + def self.up + + # Remove duplicates + IssueRelation.connection.select_values("SELECT r.id FROM #{IssueRelation.table_name} r" + + " WHERE r.id > (SELECT min(r1.id) FROM #{IssueRelation.table_name} r1 WHERE r1.issue_from_id = r.issue_from_id AND r1.issue_to_id = r.issue_to_id)").each do |i| + IssueRelation.where(["id = ?", i]).delete_all + end + + add_index :issue_relations, [:issue_from_id, :issue_to_id], :unique => true + end + + def self.down + remove_index :issue_relations, :column => [:issue_from_id, :issue_to_id] + end +end diff --git a/db/migrate/20120115143024_add_repositories_identifier.rb b/db/migrate/20120115143024_add_repositories_identifier.rb new file mode 100644 index 0000000..b54ebd1 --- /dev/null +++ b/db/migrate/20120115143024_add_repositories_identifier.rb @@ -0,0 +1,9 @@ +class AddRepositoriesIdentifier < ActiveRecord::Migration + def self.up + add_column :repositories, :identifier, :string + end + + def self.down + remove_column :repositories, :identifier + end +end diff --git a/db/migrate/20120115143100_add_repositories_is_default.rb b/db/migrate/20120115143100_add_repositories_is_default.rb new file mode 100644 index 0000000..87f0181 --- /dev/null +++ b/db/migrate/20120115143100_add_repositories_is_default.rb @@ -0,0 +1,9 @@ +class AddRepositoriesIsDefault < ActiveRecord::Migration + def self.up + add_column :repositories, :is_default, :boolean, :default => false + end + + def self.down + remove_column :repositories, :is_default + end +end diff --git a/db/migrate/20120115143126_set_default_repositories.rb b/db/migrate/20120115143126_set_default_repositories.rb new file mode 100644 index 0000000..38e06f0 --- /dev/null +++ b/db/migrate/20120115143126_set_default_repositories.rb @@ -0,0 +1,14 @@ +class SetDefaultRepositories < ActiveRecord::Migration + def self.up + Repository.update_all(["is_default = ?", false]) + # Sets the last repository as default in case multiple repositories exist for the same project + Repository.connection.select_values("SELECT r.id FROM #{Repository.table_name} r" + + " WHERE r.id = (SELECT max(r1.id) FROM #{Repository.table_name} r1 WHERE r1.project_id = r.project_id)").each do |i| + Repository.where(["id = ?", i]).update_all(["is_default = ?", true]) + end + end + + def self.down + Repository.update_all(["is_default = ?", false]) + end +end diff --git a/db/migrate/20120127174243_add_custom_fields_multiple.rb b/db/migrate/20120127174243_add_custom_fields_multiple.rb new file mode 100644 index 0000000..caee40b --- /dev/null +++ b/db/migrate/20120127174243_add_custom_fields_multiple.rb @@ -0,0 +1,9 @@ +class AddCustomFieldsMultiple < ActiveRecord::Migration + def self.up + add_column :custom_fields, :multiple, :boolean, :default => false + end + + def self.down + remove_column :custom_fields, :multiple + end +end diff --git a/db/migrate/20120205111326_change_users_login_limit.rb b/db/migrate/20120205111326_change_users_login_limit.rb new file mode 100644 index 0000000..4508a5c --- /dev/null +++ b/db/migrate/20120205111326_change_users_login_limit.rb @@ -0,0 +1,9 @@ +class ChangeUsersLoginLimit < ActiveRecord::Migration + def self.up + change_column :users, :login, :string, :limit => nil, :default => '', :null => false + end + + def self.down + change_column :users, :login, :string, :limit => 30, :default => '', :null => false + end +end diff --git a/db/migrate/20120223110929_change_attachments_container_defaults.rb b/db/migrate/20120223110929_change_attachments_container_defaults.rb new file mode 100644 index 0000000..be720aa --- /dev/null +++ b/db/migrate/20120223110929_change_attachments_container_defaults.rb @@ -0,0 +1,25 @@ +class ChangeAttachmentsContainerDefaults < ActiveRecord::Migration + def self.up + # Need to drop the index otherwise the following error occurs in Rails 3.1.3: + # + # Index name 'temp_index_altered_attachments_on_container_id_and_container_type' on + # table 'altered_attachments' is too long; the limit is 64 characters + remove_index :attachments, [:container_id, :container_type] + + change_column :attachments, :container_id, :integer, :default => nil, :null => true + change_column :attachments, :container_type, :string, :limit => 30, :default => nil, :null => true + Attachment.where("container_id = 0").update_all("container_id = NULL") + Attachment.where("container_type = ''").update_all("container_type = NULL") + + add_index :attachments, [:container_id, :container_type] + end + + def self.down + remove_index :attachments, [:container_id, :container_type] + + change_column :attachments, :container_id, :integer, :default => 0, :null => false + change_column :attachments, :container_type, :string, :limit => 30, :default => "", :null => false + + add_index :attachments, [:container_id, :container_type] + end +end diff --git a/db/migrate/20120301153455_add_auth_sources_filter.rb b/db/migrate/20120301153455_add_auth_sources_filter.rb new file mode 100644 index 0000000..617b3b7 --- /dev/null +++ b/db/migrate/20120301153455_add_auth_sources_filter.rb @@ -0,0 +1,9 @@ +class AddAuthSourcesFilter < ActiveRecord::Migration + def self.up + add_column :auth_sources, :filter, :string + end + + def self.down + remove_column :auth_sources, :filter + end +end diff --git a/db/migrate/20120422150750_change_repositories_to_full_sti.rb b/db/migrate/20120422150750_change_repositories_to_full_sti.rb new file mode 100644 index 0000000..d0de7ba --- /dev/null +++ b/db/migrate/20120422150750_change_repositories_to_full_sti.rb @@ -0,0 +1,22 @@ +class ChangeRepositoriesToFullSti < ActiveRecord::Migration + def up + Repository.connection. + select_rows("SELECT id, type FROM #{Repository.table_name}"). + each do |repository_id, repository_type| + unless repository_type =~ /^Repository::/ + Repository.where(["id = ?", repository_id]). + update_all(["type = ?", "Repository::#{repository_type}"]) + end + end + end + + def down + Repository.connection. + select_rows("SELECT id, type FROM #{Repository.table_name}"). + each do |repository_id, repository_type| + if repository_type =~ /^Repository::(.+)$/ + Repository.where(["id = ?", repository_id]).update_all(["type = ?", $1]) + end + end + end +end diff --git a/db/migrate/20120705074331_add_trackers_fields_bits.rb b/db/migrate/20120705074331_add_trackers_fields_bits.rb new file mode 100644 index 0000000..5d84583 --- /dev/null +++ b/db/migrate/20120705074331_add_trackers_fields_bits.rb @@ -0,0 +1,9 @@ +class AddTrackersFieldsBits < ActiveRecord::Migration + def self.up + add_column :trackers, :fields_bits, :integer, :default => 0 + end + + def self.down + remove_column :trackers, :fields_bits + end +end diff --git a/db/migrate/20120707064544_add_auth_sources_timeout.rb b/db/migrate/20120707064544_add_auth_sources_timeout.rb new file mode 100644 index 0000000..40f4678 --- /dev/null +++ b/db/migrate/20120707064544_add_auth_sources_timeout.rb @@ -0,0 +1,9 @@ +class AddAuthSourcesTimeout < ActiveRecord::Migration + def up + add_column :auth_sources, :timeout, :integer + end + + def self.down + remove_column :auth_sources, :timeout + end +end diff --git a/db/migrate/20120714122000_add_workflows_type.rb b/db/migrate/20120714122000_add_workflows_type.rb new file mode 100644 index 0000000..f263f25 --- /dev/null +++ b/db/migrate/20120714122000_add_workflows_type.rb @@ -0,0 +1,9 @@ +class AddWorkflowsType < ActiveRecord::Migration + def up + add_column :workflows, :type, :string, :limit => 30 + end + + def down + remove_column :workflows, :type + end +end diff --git a/db/migrate/20120714122100_update_workflows_to_sti.rb b/db/migrate/20120714122100_update_workflows_to_sti.rb new file mode 100644 index 0000000..8ee5c6d --- /dev/null +++ b/db/migrate/20120714122100_update_workflows_to_sti.rb @@ -0,0 +1,9 @@ +class UpdateWorkflowsToSti < ActiveRecord::Migration + def up + WorkflowRule.update_all "type = 'WorkflowTransition'" + end + + def down + WorkflowRule.update_all "type = NULL" + end +end diff --git a/db/migrate/20120714122200_add_workflows_rule_fields.rb b/db/migrate/20120714122200_add_workflows_rule_fields.rb new file mode 100644 index 0000000..6e9c7df --- /dev/null +++ b/db/migrate/20120714122200_add_workflows_rule_fields.rb @@ -0,0 +1,11 @@ +class AddWorkflowsRuleFields < ActiveRecord::Migration + def up + add_column :workflows, :field_name, :string, :limit => 30 + add_column :workflows, :rule, :string, :limit => 30 + end + + def down + remove_column :workflows, :field_name + remove_column :workflows, :rule + end +end diff --git a/db/migrate/20120731164049_add_boards_parent_id.rb b/db/migrate/20120731164049_add_boards_parent_id.rb new file mode 100644 index 0000000..c9ce47f --- /dev/null +++ b/db/migrate/20120731164049_add_boards_parent_id.rb @@ -0,0 +1,9 @@ +class AddBoardsParentId < ActiveRecord::Migration + def up + add_column :boards, :parent_id, :integer + end + + def down + remove_column :boards, :parent_id + end +end diff --git a/db/migrate/20120930112914_add_journals_private_notes.rb b/db/migrate/20120930112914_add_journals_private_notes.rb new file mode 100644 index 0000000..41eb0e9 --- /dev/null +++ b/db/migrate/20120930112914_add_journals_private_notes.rb @@ -0,0 +1,9 @@ +class AddJournalsPrivateNotes < ActiveRecord::Migration + def up + add_column :journals, :private_notes, :boolean, :default => false, :null => false + end + + def down + remove_column :journals, :private_notes + end +end diff --git a/db/migrate/20121026002032_add_enumerations_position_name.rb b/db/migrate/20121026002032_add_enumerations_position_name.rb new file mode 100644 index 0000000..52cbe08 --- /dev/null +++ b/db/migrate/20121026002032_add_enumerations_position_name.rb @@ -0,0 +1,9 @@ +class AddEnumerationsPositionName < ActiveRecord::Migration + def up + add_column :enumerations, :position_name, :string, :limit => 30 + end + + def down + remove_column :enumerations, :position_name + end +end diff --git a/db/migrate/20121026003537_populate_enumerations_position_name.rb b/db/migrate/20121026003537_populate_enumerations_position_name.rb new file mode 100644 index 0000000..31777b7 --- /dev/null +++ b/db/migrate/20121026003537_populate_enumerations_position_name.rb @@ -0,0 +1,9 @@ +class PopulateEnumerationsPositionName < ActiveRecord::Migration + def up + IssuePriority.compute_position_names + end + + def down + IssuePriority.clear_position_names + end +end diff --git a/db/migrate/20121209123234_add_queries_type.rb b/db/migrate/20121209123234_add_queries_type.rb new file mode 100644 index 0000000..202d524 --- /dev/null +++ b/db/migrate/20121209123234_add_queries_type.rb @@ -0,0 +1,9 @@ +class AddQueriesType < ActiveRecord::Migration + def up + add_column :queries, :type, :string + end + + def down + remove_column :queries, :type + end +end diff --git a/db/migrate/20121209123358_update_queries_to_sti.rb b/db/migrate/20121209123358_update_queries_to_sti.rb new file mode 100644 index 0000000..d8dea40 --- /dev/null +++ b/db/migrate/20121209123358_update_queries_to_sti.rb @@ -0,0 +1,9 @@ +class UpdateQueriesToSti < ActiveRecord::Migration + def up + ::Query.update_all :type => 'IssueQuery' + end + + def down + ::Query.update_all :type => nil + end +end diff --git a/db/migrate/20121213084931_add_attachments_disk_directory.rb b/db/migrate/20121213084931_add_attachments_disk_directory.rb new file mode 100644 index 0000000..d11fcad --- /dev/null +++ b/db/migrate/20121213084931_add_attachments_disk_directory.rb @@ -0,0 +1,9 @@ +class AddAttachmentsDiskDirectory < ActiveRecord::Migration + def up + add_column :attachments, :disk_directory, :string + end + + def down + remove_column :attachments, :disk_directory + end +end diff --git a/db/migrate/20130110122628_split_documents_permissions.rb b/db/migrate/20130110122628_split_documents_permissions.rb new file mode 100644 index 0000000..0e010aa --- /dev/null +++ b/db/migrate/20130110122628_split_documents_permissions.rb @@ -0,0 +1,23 @@ +class SplitDocumentsPermissions < ActiveRecord::Migration + def up + # :manage_documents permission split into 3 permissions: + # :add_documents, :edit_documents and :delete_documents + Role.all.each do |role| + if role.has_permission?(:manage_documents) + role.add_permission! :add_documents, :edit_documents, :delete_documents + role.remove_permission! :manage_documents + end + end + end + + def down + Role.all.each do |role| + if role.has_permission?(:add_documents) || + role.has_permission?(:edit_documents) || + role.has_permission?(:delete_documents) + role.remove_permission! :add_documents, :edit_documents, :delete_documents + role.add_permission! :manage_documents + end + end + end +end diff --git a/db/migrate/20130201184705_add_unique_index_on_tokens_value.rb b/db/migrate/20130201184705_add_unique_index_on_tokens_value.rb new file mode 100644 index 0000000..fdec9f8 --- /dev/null +++ b/db/migrate/20130201184705_add_unique_index_on_tokens_value.rb @@ -0,0 +1,15 @@ +class AddUniqueIndexOnTokensValue < ActiveRecord::Migration + def up + say_with_time "Adding unique index on tokens, this may take some time..." do + # Just in case + duplicates = Token.connection.select_values("SELECT value FROM #{Token.table_name} GROUP BY value HAVING COUNT(id) > 1") + Token.where(:value => duplicates).delete_all + + add_index :tokens, :value, :unique => true, :name => 'tokens_value' + end + end + + def down + remove_index :tokens, :name => 'tokens_value' + end +end diff --git a/db/migrate/20130202090625_add_projects_inherit_members.rb b/db/migrate/20130202090625_add_projects_inherit_members.rb new file mode 100644 index 0000000..9cf5bad --- /dev/null +++ b/db/migrate/20130202090625_add_projects_inherit_members.rb @@ -0,0 +1,9 @@ +class AddProjectsInheritMembers < ActiveRecord::Migration + def up + add_column :projects, :inherit_members, :boolean, :default => false, :null => false + end + + def down + remove_column :projects, :inherit_members + end +end diff --git a/db/migrate/20130207175206_add_unique_index_on_custom_fields_trackers.rb b/db/migrate/20130207175206_add_unique_index_on_custom_fields_trackers.rb new file mode 100644 index 0000000..9977dcd --- /dev/null +++ b/db/migrate/20130207175206_add_unique_index_on_custom_fields_trackers.rb @@ -0,0 +1,24 @@ +class AddUniqueIndexOnCustomFieldsTrackers < ActiveRecord::Migration + def up + table_name = "#{CustomField.table_name_prefix}custom_fields_trackers#{CustomField.table_name_suffix}" + duplicates = CustomField.connection.select_rows("SELECT custom_field_id, tracker_id FROM #{table_name} GROUP BY custom_field_id, tracker_id HAVING COUNT(*) > 1") + duplicates.each do |custom_field_id, tracker_id| + # Removes duplicate rows + CustomField.connection.execute("DELETE FROM #{table_name} WHERE custom_field_id=#{custom_field_id} AND tracker_id=#{tracker_id}") + # And insert one + CustomField.connection.execute("INSERT INTO #{table_name} (custom_field_id, tracker_id) VALUES (#{custom_field_id}, #{tracker_id})") + end + + if index_exists? :custom_fields_trackers, [:custom_field_id, :tracker_id] + remove_index :custom_fields_trackers, [:custom_field_id, :tracker_id] + end + add_index :custom_fields_trackers, [:custom_field_id, :tracker_id], :unique => true + end + + def down + if index_exists? :custom_fields_trackers, [:custom_field_id, :tracker_id] + remove_index :custom_fields_trackers, [:custom_field_id, :tracker_id] + end + add_index :custom_fields_trackers, [:custom_field_id, :tracker_id] + end +end diff --git a/db/migrate/20130207181455_add_unique_index_on_custom_fields_projects.rb b/db/migrate/20130207181455_add_unique_index_on_custom_fields_projects.rb new file mode 100644 index 0000000..223818d --- /dev/null +++ b/db/migrate/20130207181455_add_unique_index_on_custom_fields_projects.rb @@ -0,0 +1,24 @@ +class AddUniqueIndexOnCustomFieldsProjects < ActiveRecord::Migration + def up + table_name = "#{CustomField.table_name_prefix}custom_fields_projects#{CustomField.table_name_suffix}" + duplicates = CustomField.connection.select_rows("SELECT custom_field_id, project_id FROM #{table_name} GROUP BY custom_field_id, project_id HAVING COUNT(*) > 1") + duplicates.each do |custom_field_id, project_id| + # Removes duplicate rows + CustomField.connection.execute("DELETE FROM #{table_name} WHERE custom_field_id=#{custom_field_id} AND project_id=#{project_id}") + # And insert one + CustomField.connection.execute("INSERT INTO #{table_name} (custom_field_id, project_id) VALUES (#{custom_field_id}, #{project_id})") + end + + if index_exists? :custom_fields_projects, [:custom_field_id, :project_id] + remove_index :custom_fields_projects, [:custom_field_id, :project_id] + end + add_index :custom_fields_projects, [:custom_field_id, :project_id], :unique => true + end + + def down + if index_exists? :custom_fields_projects, [:custom_field_id, :project_id] + remove_index :custom_fields_projects, [:custom_field_id, :project_id] + end + add_index :custom_fields_projects, [:custom_field_id, :project_id] + end +end diff --git a/db/migrate/20130215073721_change_users_lastname_length_to_255.rb b/db/migrate/20130215073721_change_users_lastname_length_to_255.rb new file mode 100644 index 0000000..7d68e37 --- /dev/null +++ b/db/migrate/20130215073721_change_users_lastname_length_to_255.rb @@ -0,0 +1,9 @@ +class ChangeUsersLastnameLengthTo255 < ActiveRecord::Migration + def self.up + change_column :users, :lastname, :string, :limit => 255, :default => '', :null => false + end + + def self.down + change_column :users, :lastname, :string, :limit => 30, :default => '', :null => false + end +end diff --git a/db/migrate/20130215111127_add_issues_closed_on.rb b/db/migrate/20130215111127_add_issues_closed_on.rb new file mode 100644 index 0000000..2670deb --- /dev/null +++ b/db/migrate/20130215111127_add_issues_closed_on.rb @@ -0,0 +1,9 @@ +class AddIssuesClosedOn < ActiveRecord::Migration + def up + add_column :issues, :closed_on, :datetime, :default => nil + end + + def down + remove_column :issues, :closed_on + end +end diff --git a/db/migrate/20130215111141_populate_issues_closed_on.rb b/db/migrate/20130215111141_populate_issues_closed_on.rb new file mode 100644 index 0000000..19313d4 --- /dev/null +++ b/db/migrate/20130215111141_populate_issues_closed_on.rb @@ -0,0 +1,26 @@ +class PopulateIssuesClosedOn < ActiveRecord::Migration + def up + closed_status_ids = IssueStatus.where(:is_closed => true).pluck(:id) + if closed_status_ids.any? + # First set closed_on for issues that have been closed once + closed_status_values = closed_status_ids.map {|status_id| "'#{status_id}'"}.join(',') + subselect = "SELECT MAX(#{Journal.table_name}.created_on)" + + " FROM #{Journal.table_name}, #{JournalDetail.table_name}" + + " WHERE #{Journal.table_name}.id = #{JournalDetail.table_name}.journal_id" + + " AND #{Journal.table_name}.journalized_type = 'Issue' AND #{Journal.table_name}.journalized_id = #{Issue.table_name}.id" + + " AND #{JournalDetail.table_name}.property = 'attr' AND #{JournalDetail.table_name}.prop_key = 'status_id'" + + " AND #{JournalDetail.table_name}.old_value NOT IN (#{closed_status_values})" + + " AND #{JournalDetail.table_name}.value IN (#{closed_status_values})" + Issue.update_all "closed_on = (#{subselect})" + + # Then set closed_on for closed issues that weren't up updated by the above UPDATE + # No journal was found so we assume that they were closed on creation + Issue.where({:status_id => closed_status_ids, :closed_on => nil}). + update_all("closed_on = created_on") + end + end + + def down + Issue.update_all :closed_on => nil + end +end diff --git a/db/migrate/20130217094251_remove_issues_default_fk_values.rb b/db/migrate/20130217094251_remove_issues_default_fk_values.rb new file mode 100644 index 0000000..9345cf0 --- /dev/null +++ b/db/migrate/20130217094251_remove_issues_default_fk_values.rb @@ -0,0 +1,19 @@ +class RemoveIssuesDefaultFkValues < ActiveRecord::Migration + def up + change_column_default :issues, :tracker_id, nil + change_column_default :issues, :project_id, nil + change_column_default :issues, :status_id, nil + change_column_default :issues, :assigned_to_id, nil + change_column_default :issues, :priority_id, nil + change_column_default :issues, :author_id, nil + end + + def down + change_column_default :issues, :tracker_id, 0 + change_column_default :issues, :project_id, 0 + change_column_default :issues, :status_id, 0 + change_column_default :issues, :assigned_to_id, 0 + change_column_default :issues, :priority_id, 0 + change_column_default :issues, :author_id, 0 + end +end diff --git a/db/migrate/20130602092539_create_queries_roles.rb b/db/migrate/20130602092539_create_queries_roles.rb new file mode 100644 index 0000000..7713a7a --- /dev/null +++ b/db/migrate/20130602092539_create_queries_roles.rb @@ -0,0 +1,13 @@ +class CreateQueriesRoles < ActiveRecord::Migration + def self.up + create_table :queries_roles, :id => false do |t| + t.column :query_id, :integer, :null => false + t.column :role_id, :integer, :null => false + end + add_index :queries_roles, [:query_id, :role_id], :unique => true, :name => :queries_roles_ids + end + + def self.down + drop_table :queries_roles + end +end diff --git a/db/migrate/20130710182539_add_queries_visibility.rb b/db/migrate/20130710182539_add_queries_visibility.rb new file mode 100644 index 0000000..d6cd1a7 --- /dev/null +++ b/db/migrate/20130710182539_add_queries_visibility.rb @@ -0,0 +1,13 @@ +class AddQueriesVisibility < ActiveRecord::Migration + def up + add_column :queries, :visibility, :integer, :default => 0 + Query.where(:is_public => true).update_all(:visibility => 2) + remove_column :queries, :is_public + end + + def down + add_column :queries, :is_public, :boolean, :default => true, :null => false + Query.where('visibility <> ?', 2).update_all(:is_public => false) + remove_column :queries, :visibility + end +end diff --git a/db/migrate/20130713104233_create_custom_fields_roles.rb b/db/migrate/20130713104233_create_custom_fields_roles.rb new file mode 100644 index 0000000..e9eeccc --- /dev/null +++ b/db/migrate/20130713104233_create_custom_fields_roles.rb @@ -0,0 +1,14 @@ +class CreateCustomFieldsRoles < ActiveRecord::Migration + def self.up + create_table :custom_fields_roles, :id => false do |t| + t.column :custom_field_id, :integer, :null => false + t.column :role_id, :integer, :null => false + end + add_index :custom_fields_roles, [:custom_field_id, :role_id], :unique => true, :name => :custom_fields_roles_ids + CustomField.where({:type => 'IssueCustomField'}).update_all({:visible => true}) + end + + def self.down + drop_table :custom_fields_roles + end +end diff --git a/db/migrate/20130713111657_add_queries_options.rb b/db/migrate/20130713111657_add_queries_options.rb new file mode 100644 index 0000000..f203b11 --- /dev/null +++ b/db/migrate/20130713111657_add_queries_options.rb @@ -0,0 +1,9 @@ +class AddQueriesOptions < ActiveRecord::Migration + def up + add_column :queries, :options, :text + end + + def down + remove_column :queries, :options + end +end diff --git a/db/migrate/20130729070143_add_users_must_change_passwd.rb b/db/migrate/20130729070143_add_users_must_change_passwd.rb new file mode 100644 index 0000000..13c2929 --- /dev/null +++ b/db/migrate/20130729070143_add_users_must_change_passwd.rb @@ -0,0 +1,9 @@ +class AddUsersMustChangePasswd < ActiveRecord::Migration + def up + add_column :users, :must_change_passwd, :boolean, :default => false, :null => false + end + + def down + remove_column :users, :must_change_passwd + end +end diff --git a/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb b/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb new file mode 100644 index 0000000..d2f8281 --- /dev/null +++ b/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb @@ -0,0 +1,12 @@ +class RemoveEolsFromAttachmentsFilename < ActiveRecord::Migration + def up + Attachment.where("filename like ? or filename like ?", "%\r%", "%\n%").each do |attachment| + filename = attachment.filename.to_s.tr("\r\n", "_") + Attachment.where(:id => attachment.id).update_all(:filename => filename) + end + end + + def down + # nop + end +end diff --git a/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb b/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb new file mode 100644 index 0000000..3610428 --- /dev/null +++ b/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb @@ -0,0 +1,17 @@ +class SupportForMultipleCommitKeywords < ActiveRecord::Migration + def up + # Replaces commit_fix_keywords, commit_fix_status_id, commit_fix_done_ratio settings + # with commit_update_keywords setting + keywords = Setting.where(:name => 'commit_fix_keywords').limit(1).pluck(:value).first + status_id = Setting.where(:name => 'commit_fix_status_id').limit(1).pluck(:value).first + done_ratio = Setting.where(:name => 'commit_fix_done_ratio').limit(1).pluck(:value).first + if keywords.present? + Setting.commit_update_keywords = [{'keywords' => keywords, 'status_id' => status_id, 'done_ratio' => done_ratio}] + end + Setting.where(:name => %w(commit_fix_keywords commit_fix_status_id commit_fix_done_ratio)).delete_all + end + + def down + Setting.where(:name => 'commit_update_keywords').delete_all + end +end diff --git a/db/migrate/20131005100610_add_repositories_created_on.rb b/db/migrate/20131005100610_add_repositories_created_on.rb new file mode 100644 index 0000000..1f98221 --- /dev/null +++ b/db/migrate/20131005100610_add_repositories_created_on.rb @@ -0,0 +1,9 @@ +class AddRepositoriesCreatedOn < ActiveRecord::Migration + def up + add_column :repositories, :created_on, :timestamp + end + + def down + remove_column :repositories, :created_on + end +end diff --git a/db/migrate/20131124175346_add_custom_fields_format_store.rb b/db/migrate/20131124175346_add_custom_fields_format_store.rb new file mode 100644 index 0000000..47c7b31 --- /dev/null +++ b/db/migrate/20131124175346_add_custom_fields_format_store.rb @@ -0,0 +1,9 @@ +class AddCustomFieldsFormatStore < ActiveRecord::Migration + def up + add_column :custom_fields, :format_store, :text + end + + def down + remove_column :custom_fields, :format_store + end +end diff --git a/db/migrate/20131210180802_add_custom_fields_description.rb b/db/migrate/20131210180802_add_custom_fields_description.rb new file mode 100644 index 0000000..8a5d980 --- /dev/null +++ b/db/migrate/20131210180802_add_custom_fields_description.rb @@ -0,0 +1,9 @@ +class AddCustomFieldsDescription < ActiveRecord::Migration + def up + add_column :custom_fields, :description, :text + end + + def down + remove_column :custom_fields, :description + end +end diff --git a/db/migrate/20131214094309_remove_custom_fields_min_max_length_default_values.rb b/db/migrate/20131214094309_remove_custom_fields_min_max_length_default_values.rb new file mode 100644 index 0000000..d7111c1 --- /dev/null +++ b/db/migrate/20131214094309_remove_custom_fields_min_max_length_default_values.rb @@ -0,0 +1,15 @@ +class RemoveCustomFieldsMinMaxLengthDefaultValues < ActiveRecord::Migration + def up + change_column :custom_fields, :min_length, :int, :default => nil, :null => true + change_column :custom_fields, :max_length, :int, :default => nil, :null => true + CustomField.where(:min_length => 0).update_all(:min_length => nil) + CustomField.where(:max_length => 0).update_all(:max_length => nil) + end + + def self.down + CustomField.where(:min_length => nil).update_all(:min_length => 0) + CustomField.where(:max_length => nil).update_all(:max_length => 0) + change_column :custom_fields, :min_length, :int, :default => 0, :null => false + change_column :custom_fields, :max_length, :int, :default => 0, :null => false + end +end diff --git a/db/migrate/20131215104612_store_relation_type_in_journal_details.rb b/db/migrate/20131215104612_store_relation_type_in_journal_details.rb new file mode 100644 index 0000000..3fa6b1f --- /dev/null +++ b/db/migrate/20131215104612_store_relation_type_in_journal_details.rb @@ -0,0 +1,26 @@ +class StoreRelationTypeInJournalDetails < ActiveRecord::Migration + + MAPPING = { + "label_relates_to" => "relates", + "label_duplicates" => "duplicates", + "label_duplicated_by" => "duplicated", + "label_blocks" => "blocks", + "label_blocked_by" => "blocked", + "label_precedes" => "precedes", + "label_follows" => "follows", + "label_copied_to" => "copied_to", + "label_copied_from" => "copied_from" + } + + def up + StoreRelationTypeInJournalDetails::MAPPING.each do |prop_key, replacement| + JournalDetail.where(:property => 'relation', :prop_key => prop_key).update_all(:prop_key => replacement) + end + end + + def down + StoreRelationTypeInJournalDetails::MAPPING.each do |prop_key, replacement| + JournalDetail.where(:property => 'relation', :prop_key => replacement).update_all(:prop_key => prop_key) + end + end +end diff --git a/db/migrate/20131218183023_delete_orphan_time_entries_custom_values.rb b/db/migrate/20131218183023_delete_orphan_time_entries_custom_values.rb new file mode 100644 index 0000000..f4e5935 --- /dev/null +++ b/db/migrate/20131218183023_delete_orphan_time_entries_custom_values.rb @@ -0,0 +1,9 @@ +class DeleteOrphanTimeEntriesCustomValues < ActiveRecord::Migration + def up + CustomValue.where("customized_type = ? AND NOT EXISTS (SELECT 1 FROM #{TimeEntry.table_name} t WHERE t.id = customized_id)", "TimeEntry").delete_all + end + + def down + # nop + end +end diff --git a/db/migrate/20140228130325_change_changesets_comments_limit.rb b/db/migrate/20140228130325_change_changesets_comments_limit.rb new file mode 100644 index 0000000..dccc237 --- /dev/null +++ b/db/migrate/20140228130325_change_changesets_comments_limit.rb @@ -0,0 +1,12 @@ +class ChangeChangesetsCommentsLimit < ActiveRecord::Migration + def up + if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + max_size = 16.megabytes + change_column :changesets, :comments, :text, :limit => max_size + end + end + + def down + # no-op + end +end diff --git a/db/migrate/20140903143914_add_password_changed_at_to_user.rb b/db/migrate/20140903143914_add_password_changed_at_to_user.rb new file mode 100644 index 0000000..508b9d8 --- /dev/null +++ b/db/migrate/20140903143914_add_password_changed_at_to_user.rb @@ -0,0 +1,5 @@ +class AddPasswordChangedAtToUser < ActiveRecord::Migration + def change + add_column :users, :passwd_changed_on, :datetime + end +end diff --git a/db/migrate/20140920094058_insert_builtin_groups.rb b/db/migrate/20140920094058_insert_builtin_groups.rb new file mode 100644 index 0000000..ec505af --- /dev/null +++ b/db/migrate/20140920094058_insert_builtin_groups.rb @@ -0,0 +1,21 @@ +class InsertBuiltinGroups < ActiveRecord::Migration + def up + Group.reset_column_information + + unless GroupAnonymous.any? + g = GroupAnonymous.new(:lastname => 'Anonymous users') + g.status = 1 + g.save :validate => false + end + unless GroupNonMember.any? + g = GroupNonMember.new(:lastname => 'Non member users') + g.status = 1 + g.save :validate => false + end + end + + def down + GroupAnonymous.delete_all + GroupNonMember.delete_all + end +end diff --git a/db/migrate/20141029181752_add_trackers_default_status_id.rb b/db/migrate/20141029181752_add_trackers_default_status_id.rb new file mode 100644 index 0000000..c0315df --- /dev/null +++ b/db/migrate/20141029181752_add_trackers_default_status_id.rb @@ -0,0 +1,15 @@ +class AddTrackersDefaultStatusId < ActiveRecord::Migration + def up + add_column :trackers, :default_status_id, :integer + + status_id = IssueStatus.where(:is_default => true).pluck(:id).first + status_id ||= IssueStatus.order(:position).pluck(:id).first + if status_id + Tracker.update_all :default_status_id => status_id + end + end + + def down + remove_column :trackers, :default_status_id + end +end diff --git a/db/migrate/20141029181824_remove_issue_statuses_is_default.rb b/db/migrate/20141029181824_remove_issue_statuses_is_default.rb new file mode 100644 index 0000000..c5c813d --- /dev/null +++ b/db/migrate/20141029181824_remove_issue_statuses_is_default.rb @@ -0,0 +1,12 @@ +class RemoveIssueStatusesIsDefault < ActiveRecord::Migration + def up + remove_column :issue_statuses, :is_default + end + + def down + add_column :issue_statuses, :is_default, :boolean, :null => false, :default => false + # Restores the first status as default + default_status_id = IssueStatus.order(:position).pluck(:id).first + IssueStatus.where(:id => default_status_id).update_all(:is_default => true) + end +end diff --git a/db/migrate/20141109112308_add_roles_users_visibility.rb b/db/migrate/20141109112308_add_roles_users_visibility.rb new file mode 100644 index 0000000..05c4b6c --- /dev/null +++ b/db/migrate/20141109112308_add_roles_users_visibility.rb @@ -0,0 +1,9 @@ +class AddRolesUsersVisibility < ActiveRecord::Migration + def self.up + add_column :roles, :users_visibility, :string, :limit => 30, :default => 'all', :null => false + end + + def self.down + remove_column :roles, :users_visibility + end +end diff --git a/db/migrate/20141122124142_add_wiki_redirects_redirects_to_wiki_id.rb b/db/migrate/20141122124142_add_wiki_redirects_redirects_to_wiki_id.rb new file mode 100644 index 0000000..6dfbd0e --- /dev/null +++ b/db/migrate/20141122124142_add_wiki_redirects_redirects_to_wiki_id.rb @@ -0,0 +1,11 @@ +class AddWikiRedirectsRedirectsToWikiId < ActiveRecord::Migration + def self.up + add_column :wiki_redirects, :redirects_to_wiki_id, :integer + WikiRedirect.update_all "redirects_to_wiki_id = wiki_id" + change_column :wiki_redirects, :redirects_to_wiki_id, :integer, :null => false + end + + def self.down + remove_column :wiki_redirects, :redirects_to_wiki_id + end +end diff --git a/db/migrate/20150113194759_create_email_addresses.rb b/db/migrate/20150113194759_create_email_addresses.rb new file mode 100644 index 0000000..a0babce --- /dev/null +++ b/db/migrate/20150113194759_create_email_addresses.rb @@ -0,0 +1,12 @@ +class CreateEmailAddresses < ActiveRecord::Migration + def change + create_table :email_addresses do |t| + t.column :user_id, :integer, :null => false + t.column :address, :string, :null => false + t.column :is_default, :boolean, :null => false, :default => false + t.column :notify, :boolean, :null => false, :default => true + t.column :created_on, :timestamp, :null => false + t.column :updated_on, :timestamp, :null => false + end + end +end diff --git a/db/migrate/20150113211532_populate_email_addresses.rb b/db/migrate/20150113211532_populate_email_addresses.rb new file mode 100644 index 0000000..80a5fb0 --- /dev/null +++ b/db/migrate/20150113211532_populate_email_addresses.rb @@ -0,0 +1,14 @@ +class PopulateEmailAddresses < ActiveRecord::Migration + def self.up + t = EmailAddress.connection.quoted_true + n = EmailAddress.connection.quoted_date(Time.now) + + sql = "INSERT INTO #{EmailAddress.table_name} (user_id, address, is_default, notify, created_on, updated_on)" + + " SELECT id, mail, #{t}, #{t}, '#{n}', '#{n}' FROM #{User.table_name} WHERE type = 'User' ORDER BY id" + EmailAddress.connection.execute(sql) + end + + def self.down + EmailAddress.delete_all + end +end diff --git a/db/migrate/20150113213922_remove_users_mail.rb b/db/migrate/20150113213922_remove_users_mail.rb new file mode 100644 index 0000000..81bbcf1 --- /dev/null +++ b/db/migrate/20150113213922_remove_users_mail.rb @@ -0,0 +1,13 @@ +class RemoveUsersMail < ActiveRecord::Migration + def self.up + remove_column :users, :mail + end + + def self.down + add_column :users, :mail, :string, :limit => 60, :default => '', :null => false + + EmailAddress.where(:is_default => true).each do |a| + User.where(:id => a.user_id).update_all(:mail => a.address) + end + end +end diff --git a/db/migrate/20150113213955_add_email_addresses_user_id_index.rb b/db/migrate/20150113213955_add_email_addresses_user_id_index.rb new file mode 100644 index 0000000..b7fb90c --- /dev/null +++ b/db/migrate/20150113213955_add_email_addresses_user_id_index.rb @@ -0,0 +1,9 @@ +class AddEmailAddressesUserIdIndex < ActiveRecord::Migration + def up + add_index :email_addresses, :user_id + end + + def down + remove_index :email_addresses, :user_id + end +end diff --git a/db/migrate/20150208105930_replace_move_issues_permission.rb b/db/migrate/20150208105930_replace_move_issues_permission.rb new file mode 100644 index 0000000..18578f7 --- /dev/null +++ b/db/migrate/20150208105930_replace_move_issues_permission.rb @@ -0,0 +1,19 @@ +class ReplaceMoveIssuesPermission < ActiveRecord::Migration + def self.up + Role.all.each do |role| + if role.has_permission?(:edit_issues) && !role.has_permission?(:move_issues) + # inserts one ligne per trakcer and status + rule = WorkflowPermission.connection.quote_column_name('rule') # rule is a reserved keyword in SQLServer + WorkflowPermission.connection.execute( + "INSERT INTO #{WorkflowPermission.table_name} (tracker_id, old_status_id, role_id, type, field_name, #{rule})" + + " SELECT t.id, s.id, #{role.id}, 'WorkflowPermission', 'project_id', 'readonly'" + + " FROM #{Tracker.table_name} t, #{IssueStatus.table_name} s" + ) + end + end + end + + def self.down + raise IrreversibleMigration + end +end diff --git a/db/migrate/20150510083747_change_documents_title_limit.rb b/db/migrate/20150510083747_change_documents_title_limit.rb new file mode 100644 index 0000000..6e30903 --- /dev/null +++ b/db/migrate/20150510083747_change_documents_title_limit.rb @@ -0,0 +1,9 @@ +class ChangeDocumentsTitleLimit < ActiveRecord::Migration + def self.up + change_column :documents, :title, :string, :limit => nil, :default => '', :null => false + end + + def self.down + change_column :documents, :title, :string, :limit => 60, :default => '', :null => false + end +end diff --git a/db/migrate/20150525103953_clear_estimated_hours_on_parent_issues.rb b/db/migrate/20150525103953_clear_estimated_hours_on_parent_issues.rb new file mode 100644 index 0000000..c00ada0 --- /dev/null +++ b/db/migrate/20150525103953_clear_estimated_hours_on_parent_issues.rb @@ -0,0 +1,15 @@ +class ClearEstimatedHoursOnParentIssues < ActiveRecord::Migration + def self.up + # Clears estimated hours on parent issues + Issue.where("rgt > lft + 1 AND estimated_hours > 0").update_all :estimated_hours => nil + end + + def self.down + table_name = Issue.table_name + leaves_sum_select = "SELECT SUM(leaves.estimated_hours) FROM (SELECT * FROM #{table_name}) AS leaves" + + " WHERE leaves.root_id = #{table_name}.root_id AND leaves.lft > #{table_name}.lft AND leaves.rgt < #{table_name}.rgt" + + " AND leaves.rgt = leaves.lft + 1" + + Issue.where("rgt > lft + 1").update_all "estimated_hours = (#{leaves_sum_select})" + end +end diff --git a/db/migrate/20150526183158_add_roles_time_entries_visibility.rb b/db/migrate/20150526183158_add_roles_time_entries_visibility.rb new file mode 100644 index 0000000..991a14f --- /dev/null +++ b/db/migrate/20150526183158_add_roles_time_entries_visibility.rb @@ -0,0 +1,9 @@ +class AddRolesTimeEntriesVisibility < ActiveRecord::Migration + def self.up + add_column :roles, :time_entries_visibility, :string, :limit => 30, :default => 'all', :null => false + end + + def self.down + remove_column :roles, :time_entries_visibility + end +end diff --git a/db/migrate/20150528084820_add_roles_all_roles_managed.rb b/db/migrate/20150528084820_add_roles_all_roles_managed.rb new file mode 100644 index 0000000..c4e2b9b --- /dev/null +++ b/db/migrate/20150528084820_add_roles_all_roles_managed.rb @@ -0,0 +1,5 @@ +class AddRolesAllRolesManaged < ActiveRecord::Migration + def change + add_column :roles, :all_roles_managed, :boolean, :default => true, :null => false + end +end diff --git a/db/migrate/20150528092912_create_roles_managed_roles.rb b/db/migrate/20150528092912_create_roles_managed_roles.rb new file mode 100644 index 0000000..94e5ee2 --- /dev/null +++ b/db/migrate/20150528092912_create_roles_managed_roles.rb @@ -0,0 +1,8 @@ +class CreateRolesManagedRoles < ActiveRecord::Migration + def change + create_table :roles_managed_roles, :id => false do |t| + t.integer :role_id, :null => false + t.integer :managed_role_id, :null => false + end + end +end diff --git a/db/migrate/20150528093249_add_unique_index_on_roles_managed_roles.rb b/db/migrate/20150528093249_add_unique_index_on_roles_managed_roles.rb new file mode 100644 index 0000000..74dc64b --- /dev/null +++ b/db/migrate/20150528093249_add_unique_index_on_roles_managed_roles.rb @@ -0,0 +1,5 @@ +class AddUniqueIndexOnRolesManagedRoles < ActiveRecord::Migration + def change + add_index :roles_managed_roles, [:role_id, :managed_role_id], :unique => true + end +end diff --git a/db/migrate/20150725112753_insert_allowed_statuses_for_new_issues.rb b/db/migrate/20150725112753_insert_allowed_statuses_for_new_issues.rb new file mode 100644 index 0000000..dec3bdd --- /dev/null +++ b/db/migrate/20150725112753_insert_allowed_statuses_for_new_issues.rb @@ -0,0 +1,23 @@ +class InsertAllowedStatusesForNewIssues < ActiveRecord::Migration + def self.up + # Adds the default status for all trackers and roles + sql = "INSERT INTO #{WorkflowTransition.table_name} (tracker_id, old_status_id, new_status_id, role_id, type)" + + " SELECT t.id, 0, t.default_status_id, r.id, 'WorkflowTransition'" + + " FROM #{Tracker.table_name} t, #{Role.table_name} r" + WorkflowTransition.connection.execute(sql) + + # Adds other statuses that are reachable with one transition + # to preserve previous behaviour as default + sql = "INSERT INTO #{WorkflowTransition.table_name} (tracker_id, old_status_id, new_status_id, role_id, type)" + + " SELECT t.id, 0, w.new_status_id, w.role_id, 'WorkflowTransition'" + + " FROM #{Tracker.table_name} t" + + " JOIN #{IssueStatus.table_name} s on s.id = t.default_status_id" + + " JOIN #{WorkflowTransition.table_name} w on w.tracker_id = t.id and w.old_status_id = s.id and w.type = 'WorkflowTransition'" + + " WHERE w.new_status_id <> t.default_status_id" + WorkflowTransition.connection.execute(sql) + end + + def self.down + WorkflowTransition.where(:old_status_id => 0).delete_all + end +end diff --git a/db/migrate/20150730122707_create_imports.rb b/db/migrate/20150730122707_create_imports.rb new file mode 100644 index 0000000..b6bedfc --- /dev/null +++ b/db/migrate/20150730122707_create_imports.rb @@ -0,0 +1,13 @@ +class CreateImports < ActiveRecord::Migration + def change + create_table :imports do |t| + t.string :type + t.integer :user_id, :null => false + t.string :filename + t.text :settings + t.integer :total_items + t.boolean :finished, :null => false, :default => false + t.timestamps :null => false + end + end +end diff --git a/db/migrate/20150730122735_create_import_items.rb b/db/migrate/20150730122735_create_import_items.rb new file mode 100644 index 0000000..7e9cfb7 --- /dev/null +++ b/db/migrate/20150730122735_create_import_items.rb @@ -0,0 +1,10 @@ +class CreateImportItems < ActiveRecord::Migration + def change + create_table :import_items do |t| + t.integer :import_id, :null => false + t.integer :position, :null => false + t.integer :obj_id + t.text :message + end + end +end diff --git a/db/migrate/20150921204850_change_time_entries_comments_limit_to_1024.rb b/db/migrate/20150921204850_change_time_entries_comments_limit_to_1024.rb new file mode 100644 index 0000000..8366e8f --- /dev/null +++ b/db/migrate/20150921204850_change_time_entries_comments_limit_to_1024.rb @@ -0,0 +1,9 @@ +class ChangeTimeEntriesCommentsLimitTo1024 < ActiveRecord::Migration + def self.up + change_column :time_entries, :comments, :string, :limit => 1024 + end + + def self.down + change_column :time_entries, :comments, :string, :limit => 255 + end +end diff --git a/db/migrate/20150921210243_change_wiki_contents_comments_limit_to_1024.rb b/db/migrate/20150921210243_change_wiki_contents_comments_limit_to_1024.rb new file mode 100644 index 0000000..5a35b03 --- /dev/null +++ b/db/migrate/20150921210243_change_wiki_contents_comments_limit_to_1024.rb @@ -0,0 +1,11 @@ +class ChangeWikiContentsCommentsLimitTo1024 < ActiveRecord::Migration + def self.up + change_column :wiki_content_versions, :comments, :string, :limit => 1024, :default => '' + change_column :wiki_contents, :comments, :string, :limit => 1024, :default => '' + end + + def self.down + change_column :wiki_content_versions, :comments, :string, :limit => 255, :default => '' + change_column :wiki_contents, :comments, :string, :limit => 255, :default => '' + end +end diff --git a/db/migrate/20151020182334_change_attachments_filesize_limit_to_8.rb b/db/migrate/20151020182334_change_attachments_filesize_limit_to_8.rb new file mode 100644 index 0000000..a58e571 --- /dev/null +++ b/db/migrate/20151020182334_change_attachments_filesize_limit_to_8.rb @@ -0,0 +1,9 @@ +class ChangeAttachmentsFilesizeLimitTo8 < ActiveRecord::Migration + def self.up + change_column :attachments, :filesize, :integer, :limit => 8, :default => 0, :null => false + end + + def self.down + change_column :attachments, :filesize, :integer, :limit => 4, :default => 0, :null => false + end +end diff --git a/db/migrate/20151020182731_fix_comma_in_user_format_setting_value.rb b/db/migrate/20151020182731_fix_comma_in_user_format_setting_value.rb new file mode 100644 index 0000000..751ff21 --- /dev/null +++ b/db/migrate/20151020182731_fix_comma_in_user_format_setting_value.rb @@ -0,0 +1,13 @@ +class FixCommaInUserFormatSettingValue < ActiveRecord::Migration + def self.up + Setting. + where(:name => 'user_format', :value => 'lastname_coma_firstname'). + update_all(:value => 'lastname_comma_firstname') + end + + def self.down + Setting. + where(:name => 'user_format', :value => 'lastname_comma_firstname'). + update_all(:value => 'lastname_coma_firstname') + end +end diff --git a/db/migrate/20151021184614_change_issue_categories_name_limit_to_60.rb b/db/migrate/20151021184614_change_issue_categories_name_limit_to_60.rb new file mode 100644 index 0000000..b9c971e --- /dev/null +++ b/db/migrate/20151021184614_change_issue_categories_name_limit_to_60.rb @@ -0,0 +1,9 @@ +class ChangeIssueCategoriesNameLimitTo60 < ActiveRecord::Migration + def self.up + change_column :issue_categories, :name, :string, :limit => 60, :default => "", :null => false + end + + def self.down + change_column :issue_categories, :name, :string, :limit => 30, :default => "", :null => false + end +end diff --git a/db/migrate/20151021185456_change_auth_sources_filter_to_text.rb b/db/migrate/20151021185456_change_auth_sources_filter_to_text.rb new file mode 100644 index 0000000..344f9fa --- /dev/null +++ b/db/migrate/20151021185456_change_auth_sources_filter_to_text.rb @@ -0,0 +1,9 @@ +class ChangeAuthSourcesFilterToText < ActiveRecord::Migration + def self.up + change_column :auth_sources, :filter, :text + end + + def self.down + change_column :auth_sources, :filter, :string + end +end diff --git a/db/migrate/20151021190616_change_user_preferences_hide_mail_default_to_true.rb b/db/migrate/20151021190616_change_user_preferences_hide_mail_default_to_true.rb new file mode 100644 index 0000000..fc5d268 --- /dev/null +++ b/db/migrate/20151021190616_change_user_preferences_hide_mail_default_to_true.rb @@ -0,0 +1,9 @@ +class ChangeUserPreferencesHideMailDefaultToTrue < ActiveRecord::Migration + def self.up + change_column :user_preferences, :hide_mail, :boolean, :default => true + end + + def self.down + change_column :user_preferences, :hide_mail, :boolean, :default => false + end +end diff --git a/db/migrate/20151024082034_add_tokens_updated_on.rb b/db/migrate/20151024082034_add_tokens_updated_on.rb new file mode 100644 index 0000000..0af28dc --- /dev/null +++ b/db/migrate/20151024082034_add_tokens_updated_on.rb @@ -0,0 +1,10 @@ +class AddTokensUpdatedOn < ActiveRecord::Migration + def self.up + add_column :tokens, :updated_on, :timestamp + Token.update_all("updated_on = created_on") + end + + def self.down + remove_column :tokens, :updated_on + end +end diff --git a/db/migrate/20151025072118_create_custom_field_enumerations.rb b/db/migrate/20151025072118_create_custom_field_enumerations.rb new file mode 100644 index 0000000..ea2e510 --- /dev/null +++ b/db/migrate/20151025072118_create_custom_field_enumerations.rb @@ -0,0 +1,10 @@ +class CreateCustomFieldEnumerations < ActiveRecord::Migration + def change + create_table :custom_field_enumerations do |t| + t.integer :custom_field_id, :null => false + t.string :name, :null => false + t.boolean :active, :default => true, :null => false + t.integer :position, :default => 1, :null => false + end + end +end diff --git a/db/migrate/20151031095005_add_projects_default_version_id.rb b/db/migrate/20151031095005_add_projects_default_version_id.rb new file mode 100644 index 0000000..7d38f36 --- /dev/null +++ b/db/migrate/20151031095005_add_projects_default_version_id.rb @@ -0,0 +1,12 @@ +class AddProjectsDefaultVersionId < ActiveRecord::Migration + def self.up + # Don't try to add the column if redmine_default_version plugin was used + unless column_exists?(:projects, :default_version_id, :integer) + add_column :projects, :default_version_id, :integer, :default => nil + end + end + + def self.down + remove_column :projects, :default_version_id + end +end diff --git a/db/migrate/20160404080304_force_password_reset_during_setup.rb b/db/migrate/20160404080304_force_password_reset_during_setup.rb new file mode 100644 index 0000000..d80057a --- /dev/null +++ b/db/migrate/20160404080304_force_password_reset_during_setup.rb @@ -0,0 +1,9 @@ +class ForcePasswordResetDuringSetup < ActiveRecord::Migration + def up + User.where(login: "admin", last_login_on: nil).update_all(must_change_passwd: true) + end + + def down + User.where(login: "admin", last_login_on: nil, must_change_passwd: true).update_all(must_change_passwd: false) + end +end diff --git a/db/migrate/20160416072926_remove_position_defaults.rb b/db/migrate/20160416072926_remove_position_defaults.rb new file mode 100644 index 0000000..ab3af14 --- /dev/null +++ b/db/migrate/20160416072926_remove_position_defaults.rb @@ -0,0 +1,13 @@ +class RemovePositionDefaults < ActiveRecord::Migration + def up + [Board, CustomField, Enumeration, IssueStatus, Role, Tracker].each do |klass| + change_column klass.table_name, :position, :integer, :default => nil + end + end + + def down + [Board, CustomField, Enumeration, IssueStatus, Role, Tracker].each do |klass| + change_column klass.table_name, :position, :integer, :default => 1 + end + end +end diff --git a/db/migrate/20160529063352_add_roles_settings.rb b/db/migrate/20160529063352_add_roles_settings.rb new file mode 100644 index 0000000..a4d18fc --- /dev/null +++ b/db/migrate/20160529063352_add_roles_settings.rb @@ -0,0 +1,5 @@ +class AddRolesSettings < ActiveRecord::Migration + def change + add_column :roles, :settings, :text + end +end diff --git a/db/migrate/20161001122012_add_tracker_id_index_to_workflows.rb b/db/migrate/20161001122012_add_tracker_id_index_to_workflows.rb new file mode 100644 index 0000000..10c4dd9 --- /dev/null +++ b/db/migrate/20161001122012_add_tracker_id_index_to_workflows.rb @@ -0,0 +1,9 @@ +class AddTrackerIdIndexToWorkflows < ActiveRecord::Migration + def self.up + add_index :workflows, :tracker_id + end + + def self.down + remove_index :workflows, :tracker_id + end +end diff --git a/db/migrate/20161002133421_add_index_on_member_roles_inherited_from.rb b/db/migrate/20161002133421_add_index_on_member_roles_inherited_from.rb new file mode 100644 index 0000000..2a06a9e --- /dev/null +++ b/db/migrate/20161002133421_add_index_on_member_roles_inherited_from.rb @@ -0,0 +1,5 @@ +class AddIndexOnMemberRolesInheritedFrom < ActiveRecord::Migration + def change + add_index :member_roles, :inherited_from + end +end diff --git a/db/migrate/20161010081301_change_issues_description_limit.rb b/db/migrate/20161010081301_change_issues_description_limit.rb new file mode 100644 index 0000000..0f20466 --- /dev/null +++ b/db/migrate/20161010081301_change_issues_description_limit.rb @@ -0,0 +1,12 @@ +class ChangeIssuesDescriptionLimit < ActiveRecord::Migration + def up + if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + max_size = 16.megabytes + change_column :issues, :description, :text, :limit => max_size + end + end + + def down + # no-op + end +end diff --git a/db/migrate/20161010081528_change_journal_details_value_limit.rb b/db/migrate/20161010081528_change_journal_details_value_limit.rb new file mode 100644 index 0000000..2314dd5 --- /dev/null +++ b/db/migrate/20161010081528_change_journal_details_value_limit.rb @@ -0,0 +1,13 @@ +class ChangeJournalDetailsValueLimit < ActiveRecord::Migration + def up + if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + max_size = 16.megabytes + change_column :journal_details, :value, :text, :limit => max_size + change_column :journal_details, :old_value, :text, :limit => max_size + end + end + + def down + # no-op + end +end diff --git a/db/migrate/20161010081600_change_journals_notes_limit.rb b/db/migrate/20161010081600_change_journals_notes_limit.rb new file mode 100644 index 0000000..8a2ba9b --- /dev/null +++ b/db/migrate/20161010081600_change_journals_notes_limit.rb @@ -0,0 +1,12 @@ +class ChangeJournalsNotesLimit < ActiveRecord::Migration + def up + if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + max_size = 16.megabytes + change_column :journals, :notes, :text, :limit => max_size + end + end + + def down + # no-op + end +end diff --git a/db/migrate/20161126094932_add_index_on_changesets_issues_issue_id.rb b/db/migrate/20161126094932_add_index_on_changesets_issues_issue_id.rb new file mode 100644 index 0000000..dae7725 --- /dev/null +++ b/db/migrate/20161126094932_add_index_on_changesets_issues_issue_id.rb @@ -0,0 +1,5 @@ +class AddIndexOnChangesetsIssuesIssueId < ActiveRecord::Migration + def change + add_index :changesets_issues, :issue_id + end +end diff --git a/db/migrate/20161220091118_add_index_on_issues_parent_id.rb b/db/migrate/20161220091118_add_index_on_issues_parent_id.rb new file mode 100644 index 0000000..1cc94b0 --- /dev/null +++ b/db/migrate/20161220091118_add_index_on_issues_parent_id.rb @@ -0,0 +1,5 @@ +class AddIndexOnIssuesParentId < ActiveRecord::Migration + def change + add_index :issues, :parent_id + end +end diff --git a/db/migrate/20170207050700_add_index_on_disk_filename_to_attachments.rb b/db/migrate/20170207050700_add_index_on_disk_filename_to_attachments.rb new file mode 100644 index 0000000..6f41a9c --- /dev/null +++ b/db/migrate/20170207050700_add_index_on_disk_filename_to_attachments.rb @@ -0,0 +1,5 @@ +class AddIndexOnDiskFilenameToAttachments < ActiveRecord::Migration + def change + add_index :attachments, :disk_filename + end +end diff --git a/db/migrate/20170302015225_change_attachments_digest_limit_to_64.rb b/db/migrate/20170302015225_change_attachments_digest_limit_to_64.rb new file mode 100644 index 0000000..df710e8 --- /dev/null +++ b/db/migrate/20170302015225_change_attachments_digest_limit_to_64.rb @@ -0,0 +1,8 @@ +class ChangeAttachmentsDigestLimitTo64 < ActiveRecord::Migration + def up + change_column :attachments, :digest, :string, limit: 64 + end + def down + change_column :attachments, :digest, :string, limit: 40 + end +end diff --git a/db/migrate/20170309214320_add_project_default_assigned_to_id.rb b/db/migrate/20170309214320_add_project_default_assigned_to_id.rb new file mode 100644 index 0000000..97a4b19 --- /dev/null +++ b/db/migrate/20170309214320_add_project_default_assigned_to_id.rb @@ -0,0 +1,13 @@ +class AddProjectDefaultAssignedToId < ActiveRecord::Migration + def up + add_column :projects, :default_assigned_to_id, :integer, :default => nil + # Try to copy existing settings from the plugin if redmine_default_assign plugin was used + if column_exists?(:projects, :default_assignee_id, :integer) + Project.update_all('default_assigned_to_id = default_assignee_id') + end + end + + def down + remove_column :projects, :default_assigned_to_id + end +end diff --git a/db/migrate/20170320051650_change_repositories_extra_info_limit.rb b/db/migrate/20170320051650_change_repositories_extra_info_limit.rb new file mode 100644 index 0000000..3b5654a --- /dev/null +++ b/db/migrate/20170320051650_change_repositories_extra_info_limit.rb @@ -0,0 +1,12 @@ +class ChangeRepositoriesExtraInfoLimit < ActiveRecord::Migration + def up + if ActiveRecord::Base.connection.adapter_name =~ /mysql/i + max_size = 16.megabytes + change_column :repositories, :extra_info, :text, :limit => max_size + end + end + + def down + # no-op + end +end diff --git a/db/migrate/20170418090031_add_view_news_to_all_existing_roles.rb b/db/migrate/20170418090031_add_view_news_to_all_existing_roles.rb new file mode 100644 index 0000000..6f851a1 --- /dev/null +++ b/db/migrate/20170418090031_add_view_news_to_all_existing_roles.rb @@ -0,0 +1,9 @@ +class AddViewNewsToAllExistingRoles < ActiveRecord::Migration + def up + Role.all.each { |role| role.add_permission! :view_news } + end + + def down + # nothing to revert + end +end diff --git a/db/migrate/20170419144536_add_view_messages_to_all_existing_roles.rb b/db/migrate/20170419144536_add_view_messages_to_all_existing_roles.rb new file mode 100644 index 0000000..d010ba4 --- /dev/null +++ b/db/migrate/20170419144536_add_view_messages_to_all_existing_roles.rb @@ -0,0 +1,9 @@ +class AddViewMessagesToAllExistingRoles < ActiveRecord::Migration + def up + Role.all.each { |role| role.add_permission! :view_messages } + end + + def down + # nothing to revert + end +end diff --git a/doc/CHANGELOG b/doc/CHANGELOG new file mode 100644 index 0000000..e26763f --- /dev/null +++ b/doc/CHANGELOG @@ -0,0 +1,4394 @@ +== Redmine changelog + +Redmine - project management software +Copyright (C) 2006-2017 Jean-Philippe Lang +http://www.redmine.org/ + +== 2019-12-20 v3.4.13 + +=== [Attachments] + +* Defect #20277: "Couldn't find template for digesting" error in the log when sending a thumbnail or an attachment + +=== [Gems support] + +* Patch #32592: Require 'mocha/minitest' instead of deprecated 'mocha/setup' + +=== [Text formatting] + +* Patch #25742: Improper markup sanitization in user content for space separated attribute values and different quoting styles + +== 2019-10-19 v3.4.12 + +=== [Code cleanup/refactoring] + +* Defect #32022: IssueSubtaskingTest fails with high probability + +=== [Documentation] + +* Defect #32170: Text enclosed in pre tag in Wiki formatting reference is not displayed in monospaced font in Chrome +* Defect #32184: Incorrect headings example in Textile help + +=== [Gems support] + +* Defect #32300: Don't use sprockets 4.0.0 in order to avoid Sprockets::Railtie::ManifestNeededError +* Patch #32294: Update ruby-openid to 2.9.2 + +=== [Issues] + +* Defect #31778: Total estimated time issue query column and issue field might leak information + +=== [Issues list] + +* Defect #31779: Total estimated time column shown even when estimated time field is deactivated + +=== [Translations] + +* Defect #32290: Typo in Russian translation for label_in_the_next_days + +=== [UI] + +* Defect #32012: Broken JavaScript icon in the repository view +* Defect #32024: Broken gzip icon in the repository view + +== 2019-06-10 v3.4.11 + +=== [Administration] + +* Defect #31125: Don't output ImageMagick version information to stdout + +=== [Code cleanup/refactoring] + +* Defect #30811: "rake db:fixtures:load" does not work + +=== [Email receiving] + +* Defect #30457: MailHandler.safe_receive does not output any error log +* Defect #31503: Undefined local variable sender_email in MailHandler#receive_message_reply + +=== [Issues filter] + +* Patch #31276: Serialize group_by and totalable_names in Query#as_params + +=== [SCM] + +* Defect #31120: Garbage lines in the output of 'git branch' break git adapter + +=== [Security] + +* Defect #31520: Persistent XSS in textile formatting + +=== [Translations] + +* Defect #31264: Conflicting translation between "track" and "watch" in Simplified Chinese + +=== [UI - Responsive] + +* Defect #31153: Display horizontal scroll bar of files table when overflow occurs on small screen +* Defect #31311: admin/info page: text cut off in pre tag on mobile + +=== [Wiki] + +* Patch #31334: Do not lose content when updating a wiki page that has been renamed in the meantime + +== 2019-03-31 v3.4.10 + +=== [Administration] + +* Defect #30939: Timeout for "Check for updates" on Plugins page is too short + +=== [Files] + +* Defect #31087: Deleting a version silently deletes its attachments + +=== [Issues filter] + +* Defect #30367: "Last updated by" filter causes an SQL error with MariaDB + +=== [REST API] + +* Defect #29055: Searching for issue number with REST API redirects to issue HTML page + +=== [Rails support] + +* Feature #31027: Upgrade to Rails 4.2.11.1 + +=== [Search engine] + +* Defect #30923: Project search should select subprojects scope when the project has subprojects + +=== [UI] + +* Defect #30872: Copyright is outdated + +== 2019-02-21 v3.4.9 + +=== [Gems support] + +* Defect #30114: Installing xpath with Bundler fails in Ruby <=2.2 +* Patch #30821: Stay in RMagick 2.16.0 and don't update to 3.0.0 + +=== [UI] + +* Patch #30818: Issues autocomplete should respond with content type json + +== 2019-01-20 v3.4.8 + +=== [Code cleanup/refactoring] + +* Patch #30413: Add ".ruby-version" to svn:ignore, .git:ignore, and .hgignore + +=== [Database] + +* Defect #30171: Decrypting LDAP and SCM passwords fail if the plaintext password is longer than 31 bytes + +=== [Gems support] + +* Defect #30353: Installing rails with Bundler 2.0 fails in 3.x + +=== [Importers] + +* Patch #30412: Import UTF-8 issue CSV files with BOM and quoted strings + +=== [Translations] + +* Patch #30293: Ukrainian translation update for 3.4-stable + +=== [UI] + +* Defect #30426: Table rows are not highlighted on mouseover on some pages +* Patch #29951: Quick design fix/proposals for projects index page + +== 2018-12-09 v3.4.7 + +=== [Custom fields] + +* Defect #8317: Strip whitespace from integer custom field +* Defect #28925: Custom field values for enumerations not saved +* Patch #29674: Missing validation for custom field formats based on RecordList + +=== [Email receiving] + +* Defect #28576: Attachments are added even if validation fails when updating an issue via email +* Defect #29191: Cannot set no_notification option when receiving emails via IMAP or POP3 + +=== [Importers] + +* Defect #30001: CSV importer ignores shared version names of other projects + +=== [Issues] + +* Defect #28946: If assignee is locked subtasks don't get copied +* Defect #30009: Empty sort criteria for issue query gives error +* Defect #30027: Some styles (for ex: borders for tables) in a custom field with text formatting enabled are not displayed + +=== [Issues filter] + +* Defect #26785: Wrong columns after CSV export + +=== [PDF export] + +* Defect #28125: PNG images on a wiki page don't appear in exported PDF +* Defect #28565: PDF export has too many whitespaces + +=== [REST API] + +* Defect #20788: REST API with JSON content missing attributes with false values + +=== [Rails support] + +* Feature #30043: Update Rails to 4.2.11 + +=== [SCM] + +* Defect #29413: Mercurial 4.7 compatibility + +=== [Search engine] + +* Defect #28636: Cannot find an issue from a closed subproject when search scope is Project and its subprojects + +=== [Text formatting] + +* Defect #8395: Tags start with 'pre' are handled as 'pre' tag in Textile +* Defect #29038: Thumbnail macro causes attachment file not found and broken filename and link +* Defect #29247: Textile phrase modifiers break wiki macros +* Defect #29756: \f or \v character in Textile markup may cause RegexpError exception + +=== [Time tracking] + +* Patch #29308: Time entry creation: preserve 'spent on' value when using 'Create and Continue' + +=== [Translations] + +* Patch #29702: Brazilian wiki help translation update +* Patch #29703: Brazilian translation (jstoolbar-pt-br.js) update +* Patch #29718: Brazilian translation update for 3.4-stable +* Patch #29735: Galician translation fix for the words empty, blank, and key +* Patch #29736: Galician translation update for 3.4-stable + +=== [UI] + +* Defect #29918: Related issues section ignores the date format setting +* Defect #29950: Fix list rendering inside project description in projects#index + +=== [UI - Responsive] + +* Defect #24309: Setting page for repository does not scroll horizontally on small screens + +=== [Wiki] + +* Feature #29791: Hide "Files" section in wiki pages when printing + +== 2018-06-10 v3.4.6 + +=== [Issues] + +* Defect #27863: If version is closed or locked subtasks don't get copied +* Defect #28765: Copying an issue fails if the issue is watched by a locked user +* Patch #28649: Log automatic rescheduling of following issues to journal + +=== [Permissions and roles] + +* Defect #28693: Irrelevant permission is required to access some tabs in project settings page + +=== [Project settings] + +* Defect #27122: Filter for version name should be case-insensitive + +=== [SCM] + +* Defect #28725: Mercurial 4.6 compatibility + +=== [Text formatting] + +* Defect #28469: Syntax highlighter does not work if language name is single-quoted + +=== [Translations] + +* Patch #28881: Fix Japanese mistranslation for label_comment_added + +=== [UI] + +* Defect #22023: Issue id input should get focus after adding related issue + +=== [UI - Responsive] + +* Defect #28523: Display horizontal scroll bar of plugins table when overflow occurs on small screen + +=== [Wiki] + +* Patch #27090: Show the number of attachments on wiki pages + +== 2018-04-07 v3.4.5 + +=== [Custom fields] + +* Defect #28393: Sort issue custom fields by position in tracker UI + +=== [Email notifications] + +* Defect #28302: Security notification when changing password on password forgotten is empty + +=== [Gantt] + +* Defect #28204: Too large avatar breaks gantt when assignee is a group + +=== [Issues] + +* Defect #27862: Preformatted text overflows in preview +* Patch #28168: Allow context-menu edit of % done and priority of parent issues if the fields are not derived + +=== [Issues filter] + +* Defect #28180: Role-base cross-project issue query visibility calculated incorrectly + +=== [Plugin API] + +* Patch #27963: Remove 'unloadable' from bundled sample plugin + +=== [Security] + +* Defect #26857: Fix for CVE-2015-9251 in JQuery 1.11.1 + +=== [Text formatting] + +* Defect #27884: RTL wiki class broken in Redmine 3.2.6 +* Defect #28331: h4, h5 and h6 headings on wiki pages should have a paragraph mark +* Patch #28119: Enable lax_spacing for markdown formatting in order to allow markdown blocks not surrounded by empty lines + +=== [Time tracking] + +* Defect #28110: Don't allow reassigning reported hours to the project if issue is a required field for time logs + +=== [Translations] + +* Defect #28109: Incorrect interpolation in Swedish locale +* Defect #28113: Fix typo in German label_font_default +* Defect #28192: Fix typo in German label_font_monospace +* Patch #27994: Galician translation update (jstoolbar-gl.js) +* Patch #28102: Fix typo in Lithuanian label_version_sharing_tree + +=== [UI] + +* Defect #28079: The green tick is positioned after the label in the new member modals +* Defect #28208: Anonymous icon is wrongly displayed when assignee is a group +* Defect #28259: attachments_fields id to class change not properly reflected in all CSS + +=== [Wiki] + +* Defect #25299: Markdown pre-block could derive incorrect wiki sections + +== 2018-01-08 v3.4.4 + +=== [Accounts / authentication] + +* Defect #22532: Strip whitespace from login on login page +* Defect #27754: Strip whitespace from email addresses on lost password page + +=== [Administration] + +* Defect #27586: "Uncheck all" icon at the upper left corner in workflow status transitions page is not working + +=== [Calendar] + +* Defect #27153: Custom query breaks calendar view with error 500 +* Patch #27139: Fix for project link background in calendar tooltips + +=== [Custom fields] + +* Defect #26705: Unable to download file if custom field is not defined as visible to any users + +=== [Email receiving] + +* Patch #27885: Empty email attachments are imported to Redmine, creating broken DB records + +=== [Gantt] + +* Defect #26410: Gravatar icon is misaligned in gantt + +=== [Gems support] + +* Defect #27206: cannot install public_suffix if ruby < 2.1 +* Defect #27505: Cannot install nokogiri 1.7 on Windows Ruby 2.4 + +=== [Issues] + +* Defect #26880: Cannot clear all watchers when copying an issue +* Defect #27110: Changing the tracker to a tracker with the tracker field set to read-only won't work +* Defect #27881: No validation errors when entering an invalid "Estimate hours" value +* Patch #27663: Same relates relation can be created twice +* Patch #27695: Fix ActiveRecord::RecordNotUnique errors when trying to add certain issue relations + +=== [Issues list] + +* Defect #27533: Cannot change the priority of the parent issue in issue query context menu when parent priority is independent of children + +=== [Plugin API] + +* Defect #20513: Unloadable plugin convention breaks with Rails 4.2.3 + +=== [SCM] + +* Defect #27333: Switching SCM fails after validation error in "New repository" page + +=== [Security] + +* Defect #27516: Remote command execution through mercurial adapter + +=== [Translations] + +* Patch #27502: Lithuanian translation for 3.4-stable +* Patch #27620: Brazilian translation update +* Patch #27642: Spanish translation update (jstoolbar-es.js) +* Patch #27649: Spanish/Panama translation update (jstoolbar-es-pa.js) +* Patch #27767: Czech translation for 3.4-stable + +=== [UI] + +* Defect #19578: Issues reports table header overlaping +* Defect #26699: Anonymous user should have their icon + +== 2017-10-15 v3.4.3 + +=== [Administration] + +* Defect #26564: Enumerations sorting does not work + +=== [Custom fields] + +* Defect #26468: Using custom fields of type "File" leads to unsolvable error if filetype is not allowed + +=== [Issues] + +* Defect #26627: Editing issues no longer sends notifications to previous assignee + +=== [Issues list] + +* Defect #26471: Issue Query: inconsistency between spent_hours sum and sum of shown spent_hours values + +=== [PDF export] + +* Defect #25702: Exporting wiki page with specific table to PDF causes 500 + +=== [Roadmap] + +* Patch #26492: % is not valid without a format specifier + +=== [SCM] + +* Defect #26403: The second and subsequent lines of commit messages are not displayed in repository browser +* Defect #26645: git 2.14 compatibility + +=== [Text formatting] + +* Patch #26682: URL-escape the ! character in generated markup for dropped uploads + +=== [Time tracking] + +* Defect #26520: Blank "Issue" field on the "Log time" from the "Spent time - Details" page for an issue +* Defect #26667: Filtering time entries after issue's target version doesn't work as expected in some cases +* Defect #26780: Translation for label_week in time report is not working + +=== [Translations] + +* Patch #26703: German translations in 3.4-stable +* Patch #27034: Patch for updated Chinese translation + +=== [UI] + +* Defect #26568: Multiple Selection List Filter View - items are cut off from view +* Patch #26395: Jump to project autocomplete: focus selected project +* Patch #26689: Add title to author's and assignee's icon + +=== [Wiki] + +* Defect #26599: Corrupted file name when exporting a wiki page with Non-ASCII title using Microsoft's browsers + +=== [Security] + +* Defect #27186: XSS vulnerabilities + +== 2017-07-16 v3.4.2 + +=== [Administration] + +* Defect #26393: Error when unchecking all settings on some plugins configurations + +=== [Attachments] + +* Defect #26379: Fix thumbnail rendering for images with height >> width + +=== [Time tracking] + +* Defect #26387: Error displaying time entries filtered by Activity + +=== [UI] + +* Defect #26445: Text formatting not applied to commit messages even if enabled in settings +* Patch #26424: Avatar Spacing in Headlines + +== 2017-07-09 v3.4.1 + +=== [Issues list] + +* Defect #26364: Sort is not reflected when export CSV of issues list + +=== [Projects] + +* Defect #26376: Wrong issue counts and spent time on project overview + +=== [Translations] + +* Patch #26344: Bulgarian translation +* Patch #26365: Traditional Chinese translation + +=== [UI] + +* Defect #26325: Wrong CSS syntax +* Defect #26350: Don't display file download button while on repository directory entries + +== 2017-07-02 v3.4.0 + +=== [Accounts / authentication] + +* Defect #13741: Not landing on home page on login after visiting lost password page +* Feature #10840: Allow "Stay logged in" from multiple browsers +* Feature #25253: Password reset should count as a password change for User#must_change_passwd +* Feature #26190: Add setting to hide optional user custom fields on registration form +* Patch #25483: Forbid to edit/update/delete the anonymous user + +=== [Activity view] + +* Patch #18399: Missing "next" pagination link when looking at yesterday's activity + +=== [Administration] + +* Defect #7577: "Send account information to the user" only works when password is set +* Defect #25289: Adding a principal to 2 projects with member inheritance leads to an error +* Feature #12598: Add tooltip on Workflow matrix for helping in big ones +* Feature #16484: Add default timezone for new users +* Feature #24780: Add tooltip on Permissions report matrix +* Feature #24790: Add tooltip on trackers summary matrix + +=== [Attachments] + +* Defect #24308: Allow Journal to return empty Array instead nil in Journal#attachments +* Feature #13072: Delete multiple attachments with one action +* Patch #22941: Allow thumbnails on documents, messages and wiki pages +* Patch #24186: Restrict the length attachment filenames on disk +* Patch #25215: Re-use existing identical disk files for new attachments +* Patch #25240: Use SHA256 for attachment digest computation +* Patch #25295: Use path instead of URL of image in preview + +=== [Code cleanup/refactoring] + +* Defect #24928: Wrong text in log/delete.me +* Defect #25563: Remove is_binary_data? from String +* Feature #15361: Use css pseudo-classes instead of cycle("odd", "even") +* Patch #24313: Use the regular "icon icon-*" classes for all elements with icons +* Patch #24382: More readable regex for parse_redmine_links +* Patch #24523: Source: ignore .idea +* Patch #24578: Remove unused CSS class ".icon-details" +* Patch #24643: Rename "issue" to "item" in query helpers +* Patch #24713: Remove iteration in ApplicationHelper#syntax_highlight_lines +* Patch #24832: Remove instance variable which is unused after r9603 +* Patch #24899: Remove unused "description_date_*" from locale files +* Patch #24900: Remove unused "label_planning" from locale files +* Patch #24901: Remove unused "label_more" from locale files +* Patch #26149: Remove duplicate method shell_quote + +=== [Core Plugins] + +* Feature #24167: Rebuild a single nested set with nested_set plugin + +=== [Custom fields] + +* Feature #6719: File format for custom fields (specific file uploads) +* Feature #16549: Set multiple values in emails for list custom fields +* Feature #23265: Group versions by status in version custom field filter +* Patch #21705: Option for long text custom fields to be displayed using full width +* Patch #24801: Flash messages on CustomFields destroy + +=== [Database] + +* Defect #23347: MySQL: You can't specify target table for update in FROM clause +* Defect #25416: "My account" broken with MySQL 8.0 (keyword admin should be escaped) + +=== [Documentation] + +* Defect #21375: Working external URL prefixes (protocols and 'www' host part) not documented in wiki syntax +* Feature #25616: Change format of the changelog (both on redmine.org and in the shipped changelog file) +* Patch #24800: Remove internal style sheet duplication and obsoleted meta tag from wiki_syntax_* documentation. +* Patch #26188: Documentation (detailed syntax help & code) additions/improvements + +=== [Email notifications] + +* Feature #25842: Add table border to email notifications +* Patch #23978: Make the email notifications for adding/updating issues more readable/clear + +=== [Email receiving] + +* Defect #25256: Mail parts with empty content should be ignored +* Feature #5864: Regex Text on Receiver Email +* Patch #17718: Body delimiters to truncate emails do not take uncommon whitespace into account + +=== [Forums] + +* Patch #24535: Flash messages on Board destroy + +=== [Gantt] + +* Patch #25876: Gantt chart shows % done even if the field is disabled for the tracker + +=== [Gems support] + +* Feature #23932: Update TinyTds to recent version (1.0.5) +* Feature #25781: Markdown: Upgrade redcarpet gem to 3.4 + +=== [Hook requests] + +* Patch #23545: Add before_render hook to WikiController#show + +=== [I18n] + +* Defect #24616: Should not replace all invalid utf8 characters (e.g in mail) +* Patch #24938: Update tr.yml for general_first_day_of_week +* Patch #25014: redmine/i18n.rb - languages_lookup class variable is rebuilt every time + +=== [Importers] + +* Feature #22701: Allow forward reference to parent when importing issues + +=== [Issues] + +* Defect #5385: Status filter should show statuses related to project trackers only +* Defect #15226: Searching for issues with "updated = none" always returns zero results +* Defect #16260: Add Subtask does not work correctly from tasks with Parent Task field disabled +* Defect #17632: Users can't see private notes created by themselves if "Mark notes as private" is set but "View private notes" is not +* Defect #17762: When copying an issue and changing the project, the list of watchers is not updated +* Defect #20127: The description column in the issues table is too short (MySQL) +* Defect #21579: The cancel operation in the issue edit mode doesn't work +* Defect #23511: Progress of parent task should be calculated using total estimated hours of children +* Defect #23755: Bulk edit form not show fields based on target tracker and status +* Feature #482: Default assignee on each project +* Feature #3425: View progress bar of related issues +* Feature #10460: Option to copy watchers when copying issues +* Feature #10989: Prevent parent issue from being closed if a child issue is open +* Feature #12706: Ability to change the private flag when editing a note +* Feature #20279: Allow to filter issues with "Any" or "None" target version defined when viewing all issues +* Feature #21623: Journalize values that are cleared after project or tracker change +* Feature #22600: Add warning when loosing data from custom fields when bulk editing issues +* Feature #23610: Reset status when copying issues +* Feature #24015: Do not hide estimated_hours label when value is nil +* Feature #25052: Allow to disable description field in tracker setting +* Patch #23888: Show an error message when changing an issue's project fails due to errors in child issues +* Patch #24692: Issue destroy : Reassign time issue autocomplete +* Patch #24877: Filter parent task issues in auto complete by open/closed status depending on the subtask status +* Patch #25055: Filter out current issue from the related issues autocomplete + +=== [Issues filter] + +* Defect #24769: User custom field filter lists only "Me" on cross project issue list +* Defect #24907: Issue queries: "Default columns" option conflicts with "Show description" +* Defect #25077: Issue description filter's 'none' operator does not match issues with blank descriptions +* Feature #2783: Filter issues by attachments +* Feature #10412: Target version filter shoud group versions by status +* Feature #15773: Filtering out specific subprojects (using 'is not' operator) +* Feature #17720: Filter issues by "Updated by" and "Last updated by" +* Feature #21249: Ability to filter issues by attributes of a version custom field (e.g. release date) +* Feature #23215: Add the possibility to filter issues after Target Version's Status and Due Date + +=== [Issues list] + +* Feature #1474: Show last comment/notes in the issue list +* Feature #6375: Last updated by colum in issue list +* Feature #25515: View attachments on the issue list +* Patch #24649: Make Spent time clickable in issue lists + +=== [Issues workflow] + +* Defect #14696: Limited status when copying an issue +* Patch #24281: Workflow editing shows statuses of irrelevant roles + +=== [My page] + +* Feature #1565: Custom query on My page +* Feature #7769: Sortable columns in issue lists on "My page" +* Feature #8761: My page - Spent time section only display 7 days, make it a parameter +* Feature #23459: Columns selection on the issues lists on "My page" +* Feature #25297: In place editing of "My page" layout + +=== [Performance] + +* Defect #24433: The changeset display is slow when changeset_issues has very many records +* Feature #23743: Add index to workflows.tracker_id +* Feature #23987: Add an index on issues.parent_id +* Patch #21608: Project#allowed_to_condition performance +* Patch #22850: Speedup remove_inherited_roles +* Patch #23519: Don't preload projects and roles on Principal#memberships association +* Patch #24587: Improve custom fields list performance +* Patch #24787: Don't preload all filter values when displaying issues/time entries +* Patch #24839: Minor performance improvement - Replace count by exists? +* Patch #24865: Load associations of query results more efficiently +* Patch #25022: Add an index on attachments.disk_filename + +=== [Permissions and roles] + +* Feature #4866: New permission: view forum +* Feature #7068: New permission: view news + +=== [Project settings] + +* Defect #23470: Disable "Select project modules" permission does not apply to the new project form +* Feature #22608: Enable filtering versions on Project -> Settings -> Versions +* Feature #24011: Add option to set a new version as default directly from New Version page + +=== [REST API] + +* Defect #23921: REST API Issue PUT responds 200 OK even when it can't set assigned_to_id +* Feature #7506: Include allowed activities list in "project" API response +* Feature #12181: Add attachment information to issues.xml in REST API +* Feature #23566: REST API should return attachment's id in addition to token +* Patch #19116: Files REST API +* Patch #22356: Add support for updating attachments over REST API +* Patch #22795: Render custom field values of enumerations in API requests + +=== [Roadmap] + +* Defect #23377: Don't show "status" field when creating a new version +* Feature #23137: Completed versions on Roadmap: Sort it so that recently created versions are on top + +=== [Ruby support] + +* Feature #25048: Ruby 2.4 support + +=== [SCM] + +* Defect #14626: Repositories' extra_info column is too short with MySQL + +=== [SCM extra] + +* Defect #23865: Typo: s/projet/project/ in Redmine.pm comments + +=== [Search engine] + +* Feature #9909: Search in project and its subprojects by default + +=== [Text formatting] + +* Defect #26310: "attachment:filename" should generate a link to preview instead of download +* Feature #4179: Link to user in wiki syntax +* Feature #22758: Make text formatting of commit messages optional +* Feature #24922: Support high resolution images in formatted content +* Patch #26157: Render all possible inline textile images + +=== [Themes] + +* Defect #25118: ThemesTest#test_without_theme_js may fail if third-party theme is installed + +=== [Time tracking] + +* Defect #13653: Keep displaying spent time page when switching project via dropdown menu +* Defect #23912: No validation error when date value is invalid in time entries filter +* Defect #24041: Issue subject is not updated when you select another issue in the new "Log time" page +* Feature #588: Move timelog between projects +* Feature #13558: Add version filter in spent time report +* Feature #14790: Ability to save spent time query filters +* Feature #16843: Enable grouping on time entries list +* Feature #23401: Add tracker and status columns/filters to detailed timelog +* Feature #24157: Make project custom fields available in timelogs columns +* Feature #24577: Settings to make the issue and/or comment fields mandatory for time logs +* Patch #24189: Time entry form - limit issue autocomplete to already selected project + +=== [Translations] + +* Defect #25470: Fix Japanese mistranslation for field_base_dn +* Defect #25687: Bad translation in french for indentation +* Patch #23108: Change Japanese translation for text_git_repository_note +* Patch #23250: Fixes issues with Catalan translation +* Patch #23359: Change Japanese translation for label_commits_per_author +* Patch #23388: German translation change +* Patch #23419: Change Japanese translation for label_display_used_statuses_only +* Patch #23659: Change Japanese translation for label_enumerations +* Patch #23806: Fix Japanese translation inconsistency of label_tracker_new and label_custom_field_new +* Patch #24174: Change Japanese translation for "format" +* Patch #24177: Change translation for label_user_mail_option_only_(assigned|owner) +* Patch #24268: Wrong German translation of logging time error message +* Patch #24407: Dutch (NL) translation enhancements and complete review (major update) +* Patch #24494: Spanish Panama "label_issue_new" translation change +* Patch #24518: Spanish translation change (adding accent mark and caps) +* Patch #24572: Spanish label_search_open_issues_only: translation change +* Patch #24750: Change Japanese translation for setting_text_formatting and setting_cache_formatted_text +* Patch #24891: Change Japanese translation for "items" +* Patch #25019: Localization for Ukrainian language - completed +* Patch #25204: Portuguese translation file +* Patch #25392: Change Russian translation for field_due_date and label_relation_new +* Patch #25609: Change Japanese translation for field_attr_* +* Patch #25628: Better wording for issue update conflict resolution in German +* Patch #26180: Change Russian translation for "Estimated time" + +=== [UI] + +* Defect #23575: Issue subjects are truncated at 60 characters on activity page +* Defect #23840: Reduce the maximum height of the issue description field +* Defect #23979: Elements are not aligned properly in issues table for some cases +* Defect #24617: Browser js/css cache remains after upgrade +* Feature #5920: Unify and improve cross-project views layout +* Feature #9850: Differentiate shared versions in version-format custom field drop-downs by prepending its project name +* Feature #10250: Renaming "duplicates" and "duplicated by" to something less confusing +* Feature #23310: Improved "jump to project" drop-down +* Feature #23311: New "Spent time" menu tab when spent time module is enabled on project +* Feature #23653: User preference for monospaced / variable-width font in textareas +* Feature #23996: Introduce a setting to change the display format of timespans to HH:MM +* Feature #24720: Move all 'new item' links in project settings to above the item tables +* Feature #24927: Render high resolution Gravatars and Thumbnails +* Feature #25988: Preview files by default instead of downloading them +* Feature #25999: View repository content by default (instead of the history) +* Feature #26035: More visually consistent download links +* Feature #26071: Generate markup for uploaded image dropped into wiki-edit textarea +* Feature #26189: For 3 comments or more on news items and forum messages, show reply link at top of comments as well +* Patch #23146: Show revision details using the same structure and look from the journals details +* Patch #23192: Add the new pagination style in the activity page +* Patch #23639: Add "Log time" to global button menu (+) +* Patch #23998: Added link to author in Repository +* Patch #24776: UI inconsistencies on /enumerations/index view +* Patch #24833: Always show "Jump to project" drop-down +* Patch #25320: Remove initial indentation of blockquotes for better readability +* Patch #25775: Show assignee's icon in addition to author's icon + +=== [Wiki] + +* Feature #12183: Hide attachments by default on wiki pages +* Feature #23179: Add heading to table of contents macro + +== 2017-07-02 v3.3.4 + +=== [Accounts / authentication] + +* Patch #25653: Fix NoMethodError on HEAD requests to AccountController#register + +=== [Code cleanup/refactoring] + +* Defect #26055: Three issues with Redmine::SyntaxHighlighting::CodeRay.language_supported? + +=== [Gems support] + +* Defect #25829: mysql2 0.3 gem doesn't properly close connections + +=== [Importers] + +* Patch #25861: CSV Importer - handle UndefinedConversionErrors + +=== [Issues] + +* Defect #26072: Set default assignee before validation + +=== [Issues filter] + +* Defect #25212: User profile should link to issues assigned to user or his groups + +=== [Issues permissions] + +* Defect #25791: Bypass Tracker role-based permissions when copying issues + +=== [Security] + +* Defect #26183: Use Nokogiri 1.7.2 + +=== [Text formatting] + +* Defect #25634: Highlight language aliases are no more supported + +=== [Translations] + +* Patch #26264: Simplified Chinese translation for 3.3-stable + +=== [UI] + +* Defect #25760: Clicking custom field label should not check the first option + +=== [UI - Responsive] + +* Defect #25064: Issue description edit link corrupted in low resolution +* Patch #25745: Optimize Gantt Charts for mobile screens + +== 2017-04-09 v3.3.3 + +* Defect #22335: Images with non-ASCII file names are not shown in PDF +* Defect #24271: htmlentities warning +* Defect #24869: Circular inclusion detected when including a wiki page with the same name +* Defect #24875: Issues API does not respect time_entries_visibility +* Defect #24999: Mercurial 4.1 compatibility +* Defect #25371: Git 2.9 compatibility +* Defect #25478: Related to "no open issues" shows all issues +* Defect #25501: Time entries query through multiple projects by issue custom field not possible anymore +* Patch #20661: Show visible spent time link for users allowed to view time entries. +* Patch #24778: Czech localisation for 3.3-stable +* Patch #24824: Traditional Chinese translation (to r16179) +* Patch #24885: Japanese translation for 3.3-stable +* Patch #24948: Bulgarian translation for 3.3-stable +* Patch #25459: Portuguese translation for 3.3-stable +* Patch #25502: Russian translation for 3.3-stable +* Patch #25115: Support upload of empty files and fix invalid API response +* Patch #25526: Revert API change in spent_hours field in issue#show +* Defect #23793: Information leak when rendering of Wiki links +* Defect #23803: Information leak when rendering Time Entry activities +* Defect #24199: Stored XSS with SVG attachments +* Defect #24307: Redmine.pm doesn't check that the repository module is enabled on project +* Defect #24416: Use redirect to prevent password reset tokens in referers +* Defect #25503: Improper markup sanitization in user content + +== 2017-01-07 v3.3.2 + +* Defect #13622: "Clear" button in Spent Time Report tab also clears global filters +* Defect #14658: Wrong activity timezone on user page +* Defect #14817: Redmine loses filters after deleting a spent time +* Defect #22034: Locked users disappear from project settings +* Defect #23922: Time Entries context menu/bulk edit shows activities not available for the time entry's project +* Defect #24000: z-index children menu should be greater than content +* Defect #24092: bundler error: selenium-webdriver requires Ruby version >= 2.0. +* Defect #24156: Redmine might create many AnonymousUser and AnonymousGroup entries +* Defect #24274: Query totals and query buttons overlaps on small screens +* Defect #24297: Show action not allowed for time entries in closed projects +* Defect #24311: Project field disappears when target project disallows user to edit the project +* Defect #24348: acts_as_versioned use old style (Rails 2.x) of method call for #all +* Defect #24595: Unarchive link for a subproject of a closed project does not work +* Defect #24646: X-Sendfile is missing in response headers +* Defect #24693: Spent time on subtasks should also be reassigned when deleting an issue +* Defect #24718: Prevent from reassigning spent time to an issue that is going to be deleted +* Defect #24722: Error when trying to reassign spent time when deleting issues from different projects +* Patch #24003: Catalan Translation +* Patch #24004: Spanish & Spanish (PA) Translation +* Patch #24062: Allow only vertical reorderingin sortable lists +* Patch #24283: Validate length of string fields +* Patch #24296: Add tablename to siblings query to prevent AmbiguousColumn errors + +== 2016-10-10 v3.3.1 + +* Defect #23067: Custom field List Link values to URL breaks on entries with spaces +* Defect #23655: Restricted permissions for non member/anonymous on a given project not working +* Defect #23839: "Invalid query" (Error 500) message with MS SQL when displaying an issue from a list grouped and sorted by fixed version +* Defect #23841: Custom field URL spaces not decoded properly +* Defect #22123: Totals cannot be removed completely if some columns are set in the global settings +* Defect #23054: Clearing time entry custom fields while bulk editing results in values set to __none__ +* Defect #23206: Wrong filters are applied when exporting issues to CSV with blank filter +* Defect #23246: Saving an empty Markdown image tag in Wiki pages causes internal server error +* Defect #23829: Wrong allow-override example in rdm-mailhandler.rb +* Defect #23152: Distinguish closed subprojects on the project overview +* Defect #23172: Tickets can be assigned to users who are not available in specific tracker +* Defect #23242: thumbnail macro does not render when displaying wiki content version +* Defect #23369: encoding error in locales de.yml +* Defect #23391: Wrong CSS classes in subtasks tree +* Defect #23410: Error if create new issue and there is no project +* Defect #23472: Show open issues only in "Reported Issues" on My page +* Defect #23558: IssueImportTest#test_should_not_import_with_default_tracker_when_tracker_is_invalid fails randomly +* Defect #23596: Filter on issue ID with between/lesser/greater operator does not work +* Defect #23700: Creating a wiki page named "Sidebar" without proper permission raises an exception +* Defect #23751: Tab buttons appear on pages that have no tabs +* Defect #23766: API : creating issues with project identifier no longer possible +* Defect #23878: Closing all subtasks causes error if default priority is not defined and priority is derived from subtasks +* Defect #23969: Edit/delete links displayed on issue even if project is closed +* Defect #24014: Custom fields not used in project should not be visible in spent time report +* Patch #23117: Traditional Chinese textile and markdown help translation +* Patch #23387: Traditional Chinese textile and markdown detailed help translation (to r15723) +* Patch #23764: closed_on field of copied issue is always set to source issue's value +* Patch #23269: Fix for Error: Unable to autoload constant Redmine::Version when accessing the time report in first request +* Patch #23278: When creating issues by receiving an email, watchers created via CC in the mail don't get an email notification +* Patch #23389: Print Styles get overriden by responsive media query +* Patch #23708: Too long words in subtasks break layout +* Patch #23883: iOS 10 ignore disabled Zoom +* Patch #23134: Updated Korean locale +* Patch #23153: Plugin hooks for custom search results +* Patch #23171: Simplified Chinese translation for 3.3-stable +* Patch #23180: Make the issue id from email notifications linkable to issue page +* Patch #23334: Issue#editable_custom_field_values very slow for issues with many custom fields +* Patch #23346: Set user's localization before redirecting on forced password change to generate flash message in current user's language +* Patch #23376: Downloading of attachments with MIME type text/javascript fails +* Patch #23497: Russian translation for 3.3.0 +* Patch #23587: Sudo-Mode refinements +* Patch #23725: Updated Brazilian translation for 3.3.0.stable +* Patch #23745: German translation for 3.3-stable + +== 2016-06-19 v3.3.0 + +* Defect #5880: Only consider open subtasks when computing the priority of a parent issue +* Defect #8628: "Related to" reference may yield circular dependency error message +* Defect #12893: Copying an issue does not copy parent task id +* Defect #13654: Can't set parent issue when issue relations among child issues are present +* Defect #15777: Watched issues count on "My page" is shown for all issues instead of only open ones +* Defect #17580: After copying a task, setting the parent as the orignal task's parent triggers an error +* Defect #19924: Adding subtask takes very long +* Defect #20882: % done: progress bar blocked at 80 in the issue list +* Defect #21037: Issue show : bullet points not aligned if sub-task is in a different project +* Defect #21433: "version-completed" class is never set when version has no due date +* Defect #21674: The LDAP connection test does not check the credentials +* Defect #21695: Warning "Can't mass-assign protected attributes for IssueRelation: issue_to_id" +* Defect #21742: Received text attachments doesn't hold the original encoding on Ruby >= 2.1 +* Defect #21855: Gravatar get images over http instead https +* Defect #21856: I18n backend does not support original i18n Pluralization +* Defect #21861: typo: s/creditentials/credentials/ +* Defect #22059: Issue percentage selector extends screen border +* Defect #22115: Text in the "removed" part of a wiki diff is double-escaped +* Defect #22123: Totals cannot be removed completely if some columns are set in the global settings +* Defect #22135: Semi colon is spelled semicolon +* Defect #22405: SQL server: non ASCII filter does not work +* Defect #22493: Test code bug in application_helper_test +* Defect #22745: Rest API for Custom Fields does not return keys for key/value types +* Defect #23044: Typo in Azerbaijani general_lang_name +* Defect #23054: Clearing time entry custom fields while bulk editing results in values set to __none__ +* Defect #23067: Custom field List Link values to URL breaks on entries with spaces +* Feature #285: Tracker role-based permissioning +* Feature #1725: Delete button on comments +* Feature #4266: Display changeset comment on repository diff view. +* Feature #4806: Filter the issue list by issue ids +* Feature #5536: Simplify Wiki Page creation ("Add Page" link) +* Feature #5754: Allow addition of watchers via bulk edit context menu +* Feature #6204: Make the "New issue" menu item optional +* Feature #7017: Add watchers from To and Cc fields in issue replies +* Feature #7839: Limit trackers for new issue to certain roles +* Feature #12456: Add units in history for estimated time +* Feature #12909: Drag'n'drop order configuration for statuses, trackers, roles... +* Feature #13718: Accept dots in JSONP callback +* Feature #14462: Previous/next links may be lost after editing the issue +* Feature #14574: "I don't want to be notified of changes that I make myself" as Default for all User +* Feature #14830: REST API : Add support for attaching file to Wiki pages +* Feature #14937: Code highlighting toolbar button +* Feature #15880: Consistent, global button/menu to add new content +* Feature #20985: Include private_notes property in xml/json Journals output +* Feature #21125: Removing attachment after rollback transaction +* Feature #21421: Security Notifications when security related things are changed +* Feature #21500: Add the "Hide my email address" option on the registration form +* Feature #21757: Add Total spent hours and Estimated hours to the REST API response +* Feature #22018: Add id and class for easier styling of query filters +* Feature #22058: Show image attachments and repo entries instead of downloading them +* Feature #22147: Change "Related issues" label for generic grouped query filters +* Feature #22381: Require password reset on initial setup for default admin account +* Feature #22383: Support of default Active Record (I18n) transliteration paths +* Feature #22482: Respond with "No preview available" instead of sending the file when no preview is available +* Feature #22951: Make Tracker and Status map-able for CSV import +* Feature #22987: Ruby 2.3 support +* Feature #23020: Default assigned_to when receiving emails +* Feature #23107: Update CodeRay to v1.1.1. +* Patch #3551: Additional case of USER_FORMAT, #{lastname}#{firstname} without any sperator +* Patch #6277: REST API for Search +* Patch #14680: Change Simplified Chinese translation for version 'field_effective_date' +* Patch #14828: Patch to add support for deleting attachments via API +* Patch #19468: Replace jQuery UI Datepicker with native browser date fields when available +* Patch #20632: Tab left/right buttons for project menu +* Patch #21256: Use CSS instead of image_tag() to show icons for better theming support +* Patch #21282: Remove left position from gantt issue tooltip +* Patch #21434: Additional CSS class for version status +* Patch #21474: Adding issue css classes to subtasks and relations tr +* Patch #21497: Tooltip on progress bar +* Patch #21541: Russian translation improvement +* Patch #21582: Performance in User#roles_for_project +* Patch #21583: Use association instead of a manual JOIN in Project#rolled_up_trackers +* Patch #21587: Additional view hook for body_top +* Patch #21611: Do not collect ids of subtree in Query#project_statement +* Patch #21628: Correct Turkish translation +* Patch #21632: Updated Estonian translation +* Patch #21663: Wrap textilizable with DIV containing wiki class +* Patch #21678: Add missing wiki container for news comments +* Patch #21685: Change Spanish Panama thousand delimiters and separator +* Patch #21738: Add .sql to mime-types +* Patch #21747: Catalan translation +* Patch #21776: Add status, assigned_to and done_ratio classes to issue subtasks +* Patch #21805: Improve accessibility for icon-only links +* Patch #21931: Simplified Chinese translation for 3.3 (some fixes) +* Patch #21942: Fix Czech translation of field_time_entries_visibility +* Patch #21944: Bugfix: Hide custom field link values from being shown when value is empty +* Patch #21947: Improve page header title for deeply nested project structures (+ improved XSS resilience) +* Patch #21963: German translations change +* Patch #21985: Increase space between menu items +* Patch #21991: Japanese wiki_syntax_detailed_textile.html translation improvement +* Patch #22078: Incorrect French translation of :setting_issue_group_assignment +* Patch #22126: Update for Lithuanian translation +* Patch #22138: fix Korean translation typo +* Patch #22277: Add id to issue query forms to ease styling within themes +* Patch #22309: Add styles for blockquote in email notifications +* Patch #22315: Change English translation for field_effective_date: "Date" to "Due date" +* Patch #22320: Respect user's timezone when comparing / parsing Dates +* Patch #22345: Trackers that have parent_issue_id in their disabled_core_fields should not be selectable for new child issues +* Patch #22376: Change Japanese translation for label_issue_watchers +* Patch #22401: Notify the user of missing attachments +* Patch #22496: Add text wrap for multiple value list custom fields +* Patch #22506: Updated Korean locale data +* Patch #22693: Add styles for pre in email notifications +* Patch #22724: Change Japanese translation for "last name" and "first name" +* Patch #22756: Edit versions links on the roadmap +* Patch #23021: fix Russian "setting_thumbnails_enabled" misspelling +* Patch #23065: Fix confusing Japanese translation for permission_manage_related_issues +* Patch #23083: Allow filtering for system-shared versions in version custom fields in the global issues view + +== 2016-06-05 v3.2.3 + +* Defect #22808: Malformed SQL query with SQLServer when grouping and sorting by fixed version +* Defect #22912: Selecting a new filter on Activities should not reset the date range +* Defect #22924: Persistent XSS in Markdown parsing +* Defect #22925: Persistent XSS in project homepage field +* Defect #22926: Persistent XSS in Textile parsing +* Defect #22932: "Group by" row from issues listing has the colspan attribute bigger with one than the number of columns from the table +* Patch #22427: pt-BR translation for 3.2.stable +* Patch #22761: Korean translation for 3.2-stable +* Patch #22898: !>image.png! generates invalid HTML +* Patch #22911: Error raised when importing issue with Key/Value List custom field + +== 2016-05-05 v3.2.2 + +* Defect #5156: Bulk edit form lacks estimated time field +* Defect #22105: Responsive layout. Change menu selector in responsive.js. +* Defect #22134: HTML markup discrepancy ol and ul at app/views/imports/show.html.erb +* Defect #22196: Improve positioning of issue history and changesets on small screens +* Defect #22305: Highlighting of required and read-only custom fields broken in Workflow editor +* Defect #22331: bundler error: Ruby 1.9.3 = "mime-types-data requires Ruby version >= 2.0." +* Defect #22342: When copying issues to a different project, subtasks /w custom fields not copied over +* Defect #22354: Sort criteria defined in custom queries are not applied when exporting to CSV +* Defect #22583: CSV import delimiter detection broken +* Patch #22278: Revision Graph and Table should work with vertical-align: middle +* Patch #22296: Add collision option to autocomplete initialization +* Patch #22319: Fix German "error_invalid_csv_file_or_settings" typo +* Patch #22336: Revision Table does not scroll horizontally on small screens +* Patch #22721: Check that the file is actually an image before generating the thumbnail + +== 2016-03-13 v3.2.1 + +* Defect #21588: Simplified Chinese "field_cvs_module" translation has problem (Patch #21430) +* Defect #21656: Fix Non ASCII attachment filename encoding broken (MOJIBAKE) in Microsoft Edge Explorer +* Defect #22072: Private notes get copied without private flag to Duplicate issues +* Defect #22127: Issues can be assigned to any user +* Defect #21219: Date pickers images for start/due date fields are not shown for issues with subtasks +* Defect #21477: Assign to "Anonymous" doesn't make much sense +* Defect #21488: Don't use past start date as default due date in the date picker +* Defect #21504: IssuePriority.position_name not recalculated every time it should +* Defect #21551: Private note flag disappears in issue update conflict +* Defect #21843: Nokogiri security issue +* Defect #21900: Moving a page with a child raises an error if target wiki contains a page with the same name as the child +* Defect #20988: % done field shown on issue show subtree even if deactivated for that tracker +* Defect #21263: Wiki lists in the sidebar are broken +* Defect #21453: LDAP account creation fails when first name/last name contain non ASCII +* Defect #21531: rdm-mailhandler with project-from-subaddress fails +* Defect #21534: Backtrace cleaner should not clean plugin paths +* Defect #21535: Moving a custom field value in the order switches in the edit view +* Defect #21775: Field "Done" from issue subtasks table overlaps the layout in responsive mode, width 400 +* Defect #22108: Issues filter for CSV Export are not applied +* Defect #22178: Grouping issues by key/value custom field raises error 500 +* Feature #21447: Option to show email adresses by default +* Patch #21650: Simplified Chinese translation of wiki formating for 2.6-stable +* Patch #21881: Russian wiki translation for 2.6-stable +* Patch #21898: Catalan wiki translation for 2.6-stable +* Patch #21456: Simplified Chinese translation of wiki formating for 3.1-stable +* Patch #21686: Russian translation for 3.1-stable +* Patch #21687: German translations for 3.1-stable +* Patch #21689: Turkish translation for 3.1-stable +* Patch #21882: Russian wiki translation for 3.1-stable +* Patch #21899: Catalan wiki translation for 3.1-stable +* Patch #22131: German translations for 3.1-stable +* Patch #22139: Japanese wiki syntax (Markdown) translation for 3.1-stable +* Patch #21436: Prevent admins from sending themselves their own password +* Patch #21454: Simplified Chinese translation for 3.2.0 +* Patch #21487: Larger font for email notifications +* Patch #21521: Updated Spanish and Spanish Panama Translations +* Patch #21522: Simplified Chinese translation for r14976 +* Patch #21527: Russian translation for 3.2.0 +* Patch #21593: Add class to contextual edit button that relates to heading on wiki pages +* Patch #21620: Turkish translation for 3.2-stable +* Patch #21635: German translations for 3.2 +* Patch #21740: Fixes misspelled word "RMagcik" in configuration.yml.example +* Patch #21847: Let mobile header be fixed +* Patch #21867: Add column `estimated_hours` for CSV import. +* Patch #21883: Russian wiki translation for 3.2-stable +* Patch #22009: Japanese wiki syntax (Markdown) translation for 3.2-stable +* Patch #22074: Prevent username from overlapping in mobile menu +* Patch #22101: Set max-with to 100% for input, select and textea +* Patch #22104: Prevent font scaling in landscape mode on webkit +* Patch #22128: Attachment form too wide on small screens +* Patch #22132: German translations for 3.2-stable + +== 2015-12-06 v3.2.0 + +* Defect #17403: Unknown file size while downloading attachment +* Defect #18223: Table renders wrong if a trailing space is after | symbol +* Defect #19017: Wiki PDF Export:
     not rendered with monospaced font
    +* Defect #19271: Configuration of which versions are shown in version-format custom fields should not affect issue query filter
    +* Defect #19304:  tag without attributes in description results in undefined method + for nil:NilClass
    +* Defect #19403: Mistake in Polish Translation file.
    +* Defect #19657: Can't reorder activities after disabling activities on a project
    +* Defect #20117: Activities set as inactive missing in spent time report filter
    +* Defect #20296: Double full stops in Japanese
    +* Defect #20361: Project copy does not update custom field of version type values
    +* Defect #20438: Subject filter doesn't work with non ASCII uppercase symbols
    +* Defect #20463: Internal error when moving an issue to a project without selected trackers and active issue tracking
    +* Defect #20501: Empty divs when there are no custom fields on the issue form
    +* Defect #20543: Mail handler: don't allow override of some attributes by default
    +* Defect #20551: Typo "coma" (correct: "comma")
    +* Defect #20565: Search and get a 404 page when adding a new project
    +* Defect #20583: Setting Category/Version as a required field causes error in projects without categories/versions
    +* Defect #20995: Automatic done ratio calculation in issue tree is wrong in some cases
    +* Defect #21012: Link custom fields with long URLs are distorting issue detail view
    +* Defect #21069: Hard-coded label for hour
    +* Defect #21074: When changing the tracker of an existing issue, new custom fields are not initialized with their default value
    +* Defect #21175: Unused strings: label_(start|end)_to_(start|end)
    +* Defect #21182: Project.uniq.visible raises an SQL error under certain conditions
    +* Defect #21226: Some log messages are missing the "MailHandler" prefix
    +* Defect #21382: Watcher deletion of inactive user not possible for non-admin users
    +* Feature #950: Import Issues from delimited/CSV file
    +* Feature #1159: Allow issue description to be searchable as a filter
    +* Feature #1561: Totals for estimated/spent time and numeric custom fields on the issue list
    +* Feature #1605: Activity page to remember user's selection of activities
    +* Feature #1828: Default target version for new issues
    +* Feature #3034: Add day numbers to gantt
    +* Feature #3398: Link to assigned issues on user profiles
    +* Feature #4285: Add cancel button during edition of the wiki
    +* Feature #5816: New issue initial status should be settable in workflow
    +* Feature #7346: Allow a default version to be set on the command line for incoming emails
    +* Feature #8335: Email styles inline
    +* Feature #10672: Extend Filesize in the attachments table for files with size > 2147483647 bytes
    +* Feature #13429: Include attachment thumbnails in issue history
    +* Feature #13946: Add tracker name to Redmine issue link titles
    +* Feature #16072: Markdown footnote support
    +* Feature #16621: Ability to filter issues blocked by any/no open issues
    +* Feature #16941: Do not clear category on project change if category with same exists
    +* Feature #17618: Upgrade net-ldap version to 0.12.0
    +* Feature #19097: Responsive layout for mobile devices
    +* Feature #19885: Raise time entries comments limit to 1024
    +* Feature #19886: Raise wiki edits comments limit to 1024
    +* Feature #20008: Files upload Restriction by files extensions
    +* Feature #20221: Time entry query : column week
    +* Feature #20388: Removing attachment after commit transaction
    +* Feature #20929: Raise maximum length of LDAP filter
    +* Feature #20933: Options for shorter session maximum lifetime
    +* Feature #20935: Set autologin cookie as secure by default when using https
    +* Feature #20991: Raise maximum length of category name to 60
    +* Feature #21042: Check "Hide my email address" by default for new users
    +* Feature #21058: Keep track of valid user sessions
    +* Feature #21060: Custom field format with possible values stored as records
    +* Feature #21148: Remove "Latest Projects" from Home page
    +* Feature #21361: Plugins ui tests rake task
    +* Patch #20271: Fix for multiple tabs on the same page
    +* Patch #20288: Finalize CodeRay 1.1.0 upgrade
    +* Patch #20298: "div" tag around revision details
    +* Patch #20338: Turkish "activity" translation change
    +* Patch #20368: Make corners rounded
    +* Patch #20369: Use String#casecmp for case insensitive comparison
    +* Patch #20370: Lighter colors for journal details in issue history
    +* Patch #20411: Change Japanese translation for "view"
    +* Patch #20413: Use a table instead of an unordered list in "Issue tracking" box
    +* Patch #20496: Change Japanese translation for "time tracking"
    +* Patch #20506: redmine I18n autoload instead of require
    +* Patch #20507: ThemesHelper reopening ApplicationHelper is problem with autoloading
    +* Patch #20508: Required file lib/redmine/hook.rb is patching autoloaded ApplicationHelper
    +* Patch #20589: Activate sudo mode after password based login
    +* Patch #20720: Traditional Chinese "issue" translation change
    +* Patch #20732: MailHandler: Select project by subaddress (redmine+project@example.com)
    +* Patch #20740: Confusing name: test public query called "private"
    +* Patch #21033: Polish translation change
    +* Patch #21110: Keep anchor (i.e. to a specific issue note) throughout login
    +* Patch #21119: Give numbers in query sort criteria consistent width for non-monospaced fonts
    +* Patch #21126: Change Japanese translation for "List"
    +* Patch #21137: Rescue network level errors with LDAP auth
    +* Patch #21159: Hide empty 
      on project overview +* Patch #21169: Use config.relative_url_root as the default path for session and autologin cookies +* Patch #21176: Japanese translation change (Blocks / Blocked by) +* Patch #21258: Use
        to do pagination, styling in a GitHub like manner with improved handling in responsive mode +* Patch #21280: Change Japanese translation for text_user_wrote + +== 2015-12-05 v3.1.3 + +* Defect #16948: Broken anonymous repository access for public projects with Apache 2.4 (redmine.pm) +* Defect #21328: pdf: Vietnamese Italic is not shown +* Defect #21419: Information leak in Atom feed +* Patch #21312: Fix exception in Redmine.pm when authenticating anonymous users +* Patch #21430: Simplified Chinese translation + +== 2015-11-14 v3.1.2 + +* Defect #20992: Parent priority "Independent of subtasks" setting doesn't work +* Defect #20360: Project copy does not copy custom field settings +* Defect #20380: Cannot assign users to projects with IE set to compatibility mode +* Defect #20591: PDF export does not determine picture (.png) height correctly +* Defect #20677: Custom fields with multiple values required by worklow can be blank +* Defect #20811: long
         lines are missing from PDF export of wiki pages
        +* Defect #21136: Issues API may disclose changeset messages that are not visible
        +* Defect #21150: Time logging form may disclose subjects of issues that are not visible
        +* Defect #21155: Deleting invalid wiki page version deletes whole page content
        +* Defect #20282: Error message when editing a child project without add project/subprojects permissions
        +* Defect #20730: Fix tokenization of phrases with non-ascii chars
        +* Defect #21071: find_referenced_issue_by_id fails with RangeError for large numbers
        +* Patch #21031: Polish translation update for 3.0-stable
        +* Patch #21105: Japanese wiki_syntax_detailed_textile.html translation for 3.0-stable
        +* Patch #20785: Polish translation update for 3.1-stable
        +* Patch #20837: Bulgarian translation
        +* Patch #20892: Spanish translation for r14637
        +* Patch #20906: Fix mulitple tab navigation highlighting and content hiding
        +* Patch #21019: Traditional Chinese translation (to r14689)
        +* Patch #21076: Move inline CSS to application.css for private checkbox
        +* Patch #21085: Optimize issue edit description link
        +
        +== 2015-09-20 v3.1.1
        +
        +* Feature #11253: Total time spent from subtasks on the issue list
        +* Feature #20688: Add Total estimated hours column on issue list
        +* Feature #20738: Upgrade Rails 4.2.4
        +* Defect #19577: Open redirect vulnerability
        +* Defect #20761: Fix typo of Japanese translation for notice_gantt_chart_truncated
        +* Defect #20427: Cannot create a custom query visibility is "to these roles only"
        +* Defect #20454: Mail handler: unwanted assignment to a group occurs
        +* Defect #20278: Wrong syntax for resizing inline images will throw a 500 error
        +* Defect #20401: "Spent time" panel: columns not wrapping
        +* Defect #20407: Monospace font-family values are differ between application.css and scm.css
        +* Defect #20456: 3.1-stable/3.1.0: missing commits (omitted from being merged from trunk)
        +* Defect #20466: Broken email notification layout in Outlook
        +* Defect #20490: WARNING: Can't mass-assign protected attributes for User
        +* Defect #20633: Help cursor showing up since r14154
        +* Patch #20293: Russian translation for 2.6-stable
        +* Patch #20294: Russian translation for 2.6-stable
        +* Patch #20408: Turkish translation for 2.6-stable
        +* Patch #20557: Czech translation for 2.6-stable
        +* Patch #20735: Markdown: Upgrade redcarpet gem to 3.3 (ruby 1.9 and higher)
        +* Patch #20745: Portuguese translation for 2.6-stable
        +* Patch #20512: Project.copy_from deletes enabled_modules on source
        +* Patch #20737: Czech translation for 3.0-stable
        +* Patch #20746: Portuguese translation for 3.0-stable
        +* Patch #20243: Use https links instead of http links in ApplicationHelper#avatar_edit_link and Redmine::Info class methods
        +* Patch #20410: Turkish translation for 3.1-stable
        +* Patch #20452: Czech localisation update
        +* Patch #20731: Change Japanese translation for "spent time"
        +* Patch #20747: Portuguese translation for 3.1-stable
        +
        +== 2015-07-26 v3.1.0
        +
        +* Defect #4334: "Watch"ing an issue doesn't update watchers list
        +* Defect #13924: Error when using views/issues/index.api.rsb in a plugin
        +* Defect #14881: Issue journals should be ordered by created_on, not id
        +* Defect #15716: Scraped emails include CSS from HTML emails
        +* Defect #19243: Ambiguous date format options (eg. 03/03/2015) in settings
        +* Defect #19656: Activities do not correspont to project when adding time from my page.
        +* Defect #19737: HTML Sanitizer not working for Outlook mails
        +* Defect #19740: "Truncate emails after one of these lines" setting is not working
        +* Defect #19995: Can't apply textile modifiers to 1 non-ASCII character
        +* Defect #20141: Sync #wiki_format_provider plugin API shortcut with changes to Redmine::WikiFormatting.register from r12450 and r14313
        +* Defect #20159: Disallow users to delete a version referenced by a custom field
        +* Defect #20206: Members w/o view issues permission are able to list issues on public projects if the non member role has the permission
        +* Defect #20372: Contents inside 
         are not rendered as monospace font in Chrome for Mac
        +* Feature #5418: Add Gravatar and edit link to "My account" page
        +* Feature #5490: Option for independent subtask priority/start date/due date/done ratio
        +* Feature #6118: Filter by parent task or subtasks
        +* Feature #7037: CSV export encoding and excel. UTF-8 and BOM
        +* Feature #8424: Add private issue option to receiving emails
        +* Feature #8929: Permission to view only your own time logs
        +* Feature #11253: Total time spent from subtasks on the issue list
        +* Feature #12312: Raise 60-character limit for document titles
        +* Feature #16373: TextFormatting help for Markdown formatting
        +* Feature #16535: Set a max width to html email content
        +* Feature #16962: Better handle html-only emails
        +* Feature #19182: Patch to the Redmine Mail Handler for specifying a custom CA bundle
        +* Feature #19458: Add the ability to expire passwords after a configurable number of days
        +* Feature #19707: Ability to limit member management to certain roles
        +* Feature #19851: Sudo mode: Require password re-entry for sensitive actions (optional)
        +* Patch #5770: Welcome text misses wiki formatting
        +* Patch #14402: Plugin migration directory should use plugin directory
        +* Patch #19296: Include custom fields description in project settings and issue view
        +* Patch #19339: Put news articles into 
        tags +* Patch #19341: Put roadmap versions in
        tags +* Patch #19455: Replace manual query in version helper +* Patch #19509: Change Japanese translation for field_login +* Patch #19546: Change default display mode for PDF Export to OneColumn +* Patch #19991: Japanese translation change +* Patch #19993: Change csv separators of Spanish/Panama +* Patch #20130: Bulgarian translation change +* Patch #20174: Add missing member_role to fixtures +* Patch #20180: Make the updateIssueFrom(url) function return the XMLHttpRequest object + +== 2015-07-07 v3.0.4 + +* Defect #17757: Link with hash does not work on Firefox +* Defect #19095: PDF is broken on iOS +* Defect #19485: Column 'address' in where clause may be ambiguous +* Defect #19815: Bulk issue copy copies subtasks and attachments even if option is unchecked +* Defect #19835: Newlines stripped from CVS commit messages +* Defect #19840: Missing validation for description size of versions +* Defect #19842: User allowed to manage public queries in any project, can create public query visible to everyone for ALL projects +* Defect #19844: Roles are not aligned on new member form +* Defect #19956: Connection leak on svn/redmine integration +* Defect #19957: acts_as_versioned not compatible with ActiveRecord 4.2.1 +* Defect #20066: List of groups sorted in desc by default +* Defect #20118: Missing row in PDF if issue description contains '<'-character +* Feature #19364: Images and Thumbnail are not interpreted in table while exporting PDF +* Feature #20142: Update Gemfile to require rbpdf ~>1.18.6 +* Patch #19825: Russian translation update +* Patch #20035: Italian translation update +* Patch #20203: The test email action should use POST only (CSRF protection) + +== 2015-05-10 v3.0.3 + +* Defect #18580: Can't bulk edit own time entries with "Edit own time entries" +* Defect #19731: Issue validation fails if % done field is deactivated +* Defect #19735: Email addresses with slashes are not linked correctly +* Patch #19655: Set a back_url when forcing new login after session expiration +* Patch #19706: Issue show : optimizations +* Patch #19793: Adding flash messages to files_controller#create + +== 2015-04-26 v3.0.2 + +* Defect #19297: Custom fields with hidden/read-only combination displayed in Issue Edit Form +* Defect #19400: Possibility of having 2 (or more) repositories with empty identifier +* Defect #19444: Fix typo in wiki_syntax_detailed.html +* Defect #19538: Keywords in commit messages: journal entries are created even if nothing was changed +* Defect #19569: Field permissions not working properly with inherited memberships +* Defect #19580: "Required" and "Read-only" rules on "Fields Permissions" screen are not colored +* Defect #13583: Space between lines in nested lists not equal +* Defect #19161: 500 Internal error: sorting for column mail at Administration/User +* Defect #19163: Bulk edit form shows additional custom fields +* Defect #19168: Activity: changes made to tickets are shown multiple times +* Defect #19185: Update Install/Upgrade guide for 3.x version and get gid of DEPRECATION WARNING: You didn't set config.secret_key_base +* Defect #19276: Creating new issues with invalid project_id should return 422 instead of 403 error +* Defect #19405: Setting config.logger.level in additional_environment.rb has no effect +* Defect #19464: Possible to log time on project without time tracking +* Defect #19482: Custom field (long text format) displayed even if empty +* Defect #19537: Broken HTML sanitizer refence breaks email receiving +* Defect #19544: Malformed SQL query with SQLServer when grouping issues +* Defect #19553: When create by copying the issue, status can not be changed to default +* Defect #19558: Mail handler should not ignore emails with x-auto-response-suppress header +* Defect #19606: Issue Estimated Time not updated on tracker change +* Feature #19437: Upgrade to Rails 4.2.1 +* Feature #19489: Translation for Spanish Panama +* Patch #19570: Spanish translation updated + +== 2015-03-16 v3.0.1 + +* Defect #19197: Missing notification if assignee was a group +* Defect #19260: Non-default identifier-less git repositories are undeletable +* Defect #19305: settings: incompatible character encodings: UTF-8 and ASCII-8BIT: yaml generated on ruby 1.8 +* Defect #19313: Attached inline images with non-ascii file name can not be seen when text formatting is Makdown +* Defect #19348: Project name is missing for versions from sub-projects +* Defect #19381: Wrong syntax for wiki macros in wiki_syntax_detailed.html +* Defect #19172: "gem update bundler" suggestion for "`x64_mingw` is not a valid platform" +* Defect #19218: Wrong name for pt-BR in language drop-down +* Defect #19225: When deleting one item from multivalued custom field / list of users, name of removed user is not visible in history +* Defect #19232: IMAP STARTTLS options typo :tls +* Defect #19253: Repository users broken if only one committer exists +* Defect #19316: CustomField#possible_values may raise undefined method `force_encoding' error +* Defect #19320: Spent time (last 7 days) in My page not updated +* Defect #19323: Incorrect links generated in emails if host setup uses other port (":" symbol) +* Defect #19325: ActionController::UnknownFormat: error for PDF request and unknown user +* Defect #19354: Unexpected milliseconds in JSON time attributes +* Defect #19368: Creating an issue without tracker_id attribute ignores custom field values +* Patch #19233: Change 20150113213922_remove_users_mail.rb from Irreversible to Reversible +* Patch #19322: Allow to ignore auto reply messages from Exchange server + +== 2015-02-19 v3.0.0 + +* Defect #2573: Latest projects list: no space after lists in project description +* Defect #6579: Tree hierachy being currupted on multiple submissions of an issue +* Defect #14151: Grammer problem with German x_days +* Defect #15789: Users can see all groups when adding a filter "Assignee's Group" +* Defect #15988: Unexpected behaviour on issue fields for users that have multiple roles +* Defect #18237: From a rake task context, impossible to create an IssueRelation normally +* Defect #18265: Wrong csv separator in Croatian +* Defect #18301: Revision shortlink at end of URL breaks URL autolinking +* Defect #18314: German Translation - button_update +* Defect #18605: Wrong usage of logger.info to test log level +* Defect #18654: Custom field is rendered, even if its value is empty (for multiple) +* Defect #18711: Respect cross-project subtask setting on issue bulk edit form +* Defect #18781: Redmine::FieldFormat::IntFormat does not accept "real" Integer values +* Defect #18832: Activity Stream Filter missing on right hand side due to permission +* Defect #18855: User with only Move Issue rights in the project can still create issues using mass copy! +* Defect #18918: Grouping label for "none" should be changed to "null", "No Value", or" (blank) ". +* Defect #19024: link_to in Redmine::Hook::ViewListener omits url root +* Defect #19030: Links to completed versions on the roadmap page might lead to a "403 not authorized page" +* Defect #19039: Mail notification is formatting dates with changer's locale +* Defect #19040: Potential DB deadlocks on concurrent issue creation +* Defect #19055: 'label_per_page' is no longer used +* Defect #19111: Bad spelling in Spanish "mail_body_reminder" +* Feature #992: Option to search open issues only +* Feature #1326: Add / edit an attachment description after upload +* Feature #1415: Let system administrator limit repositories valid sources +* Feature #4244: Multiple email addresses for each user +* Feature #4383: Search Names of Files Attached to Issues +* Feature #4518: Wiki formatting documentation for nested lists +* Feature #5450: Move wiki page to other project +* Feature #5991: Tracker should have it's own default issue status +* Feature #6426: MenuManager::MenuItem should support a named route as a url +* Feature #7249: Custom fields for Documents +* Feature #8121: Allow overriding direction of part of text +* Feature #8818: Repository user-mapping with multiple email addresses +* Feature #11702: Add user/group to multiple projects at once +* Feature #11724: Prevent users from seeing other users based on their project membership +* Feature #12097: Multi Thread Support +* Feature #12734: Add table reference to textile help +* Feature #13051: Support any macro in (pdf) export for wiki's and issues +* Feature #13425: Ignore X-Autoreply mails +* Feature #13497: Document all available Redmine links properly +* Feature #13849: Grouped filters in the filter drop-down +* Feature #14371: Drop Ruby 1.8.7 support +* Feature #14534: Upgrade to Rails 4.2 +* Feature #15236: Propose diff view for long text custom fields +* Feature #16823: IMAP STARTTLS support +* Feature #17354: User detail : show user login to admins +* Feature #17763: Ability to render multiple partials with view hook +* Feature #18500: Optional linking when copying issues +* Feature #18571: Tab "New Issue" should not be displayed if a project has no trackers +* Feature #18631: Better search results pagination +* Feature #18801: Support for accent insensitive search with PostgreSQL +* Feature #18860: Replace awesome_nested_set gem with a custom implementation of nested sets +* Feature #18947: Ruby 2.2 support +* Feature #19131: Use a better content type for attachments created with application/octet-stream +* Patch #6586: Calendar view hook Request +* Patch #13120: Translation in language selection +* Patch #18182: Latvian translation update +* Patch #18261: Japanese translation change (fix terms mismatch "default") +* Patch #18276: Allow queries captions to be dynamic +* Patch #18290: Issue performance patch +* Patch #18390: Better RTL css for the system +* Patch #18392: German translation: Self-registration +* Patch #18565: html improvements on project landing page +* Patch #18659: Do not truncate subissue/related issues titles on single issue view +* Patch #18671: Japanese translation change (fix misspelled word) +* Patch #18679: LabelledFormBuilder#label outputs 2 label elements +* Patch #18692: Access keys for previous (p)/next (n) links +* Patch #18707: Allow attachment thumbnails from REST api +* Patch #18817: Sort helper undefined to_a for string +* Patch #18818: TimeEntry acts_as_activity_provider scope should joins(:project) +* Patch #18983: Allow filtering of Redmine Reminders by Version +* Patch #19005: Make search results per page configurable +* Patch #19035: Japanese translation fix (label_age) + +== 2015-02-19 v2.6.2 + +* Defect #10681: Export to Persian PDF problem +* Defect #17722: Plugin update check not working if redmine is viewed over https +* Defect #18586: Arabic PDF +* Defect #18632: PDF Export has no left padding for tables +* Defect #18883: Slow rendering of large textile tables +* Defect #18894: Grouping of Boolean field: Both "No" and "blank" tickets are grouped in "none" groups +* Defect #18896: Grouping of Boolean field in Query: group not displayed for "No" value if the group is in first position +* Defect #18922: rdm-mailhandler.rb should catch EOFError +* Defect #18961: {{macro_list}} error when choose markdown as wiki language +* Defect #19065: API: issue details created_on timestamp not formatted as expected +* Defect #19120: Wrap parent task title on the issue list +* Defect #19117: Potential XSS vulnerability in some flash messages rendering + +== 2015-01-11 v2.6.1 + +* Defect #13608: Parent column in CSV export should include issue id only +* Defect #13673: Parent issue column includes issue subject (making issue list unworkable wide) +* Defect #14699: Cannot change "From" header in email notifications +* Defect #17744: Disabling fields in tracker keeps attached workflow permissions +* Defect #18060: Selected projects in email notifications on "my account" are lost when the page is redisplayed after a validation error +* Defect #18176: PDF: long text is corrupt +* Defect #18269: Timelog CSV export missing tracker name and issue name +* Defect #18280: closed_on missing when closed status of issue status changed +* Defect #18349: URL not rendered as a link when followed by a line break and another URL +* Defect #18464: Use of PRE tag in Issue description results in wrapped text with latest Google Chrome +* Defect #18499: Localisation not set correctly on authenticity token errors +* Defect #18501: Textile bold highlighting problem +* Defect #18629: PDF Export removes separating space after tables +* Defect #18665: Internal Server Error when adding user to group where he is already assigned +* Defect #18667: Attachment content type not set when uploading attachment +* Defect #18685: Plugin migration confuses two plugins with similar names +* Defect #18734: Select / case is missing a break in application.js +* Defect #18769: Reordering roles, trackers or statuses always redirects to the first page +* Defect #18777: Moving column to top of "Select Columns" results in loss of all other column selections +* Feature #8817: Attachments/Plugin assets directory writable errors +* Patch #17705: MailHandler should ignore bogus issue strings [some-string#1234] in subject +* Patch #18051: Cancel button on issue edit view +* Patch #18156: Spanish translation file +* Patch #18157: German translation +* Patch #18252: Japanese wiki_syntax_detailed.html translation update +* Patch #18357: Improvement of column selection: allow to move multiple columns in selection list +* Patch #18410: Spent hours should be cleared on #reload +* Patch #18534: Galician (gl) translation for 2.6-stable +* Patch #18587: Swedish translation (updated) +* Patch #18782: Fix ui tests broken by undefined method error +* Patch #18789: UI tests and capybara version + +== 2014-10-21 v2.6.0 + +* Defect #8753: PDF export for Hebrew is reversed +* Defect #8758: Ignore email keywords after delimiter +* Defect #9660: Issues counters in roadmap only link to issues in the same project +* Defect #11788: Export to PDF: align right in table doesn't work +* Defect #12580: long hyperlinks inserted in task description breaks right frame boundary +* Defect #12934: PDF export: No images in tables +* Defect #13487: Honor committer => user mapping in repository statistics +* Defect #13642: PDF bookmark not displayed when contain a non-ascii character +* Defect #13781: CJK(Chinese/Japanese/Korean) characters are not shown in PDF on non CJK locales +* Defect #13860: Text of custom fields is not wrapped in PDF exports of issues +* Defect #14281: Parent issue autocomplete does not follow to the "Allow cross-project subtasks" setting +* Defect #14466: Wrap long issue fields in issue pdf header +* Defect #14491: MailHandler: Unable to determine target project (when allow_override=project and project=unassigned is used) +* Defect #14737: Gantt, completed % truncated instead of rounded +* Defect #14917: Bad table formatting in pdf export +* Defect #16496: Link custom field are not displayed as links on the issue list +* Defect #17023: The error flash message on session expiration is not in the language of the user but of the user of the previous request +* Defect #17202: Copying Project Fails to Copy Queries with visibility == VISIBILITY_ROLES +* Defect #17322: Long strings such as URL break out of box +* Defect #17484: Custom fields added to "spent time" don't show in context menu +* Defect #17828: Could not find gem 'mocha (~> 1.0.0) ruby' +* Defect #17931: note "Applied in changeset" generated multiple times for the same repo +* Defect #17954: /time_entries/new can't derive project from issue +* Defect #17959: Issue notes not previewed when project is changed +* Defect #18041: Wiki, Pdf export, Table,
        +* Defect #18110: Extraction of list of available locales is probe to bad gems
        +* Defect #18119: Thumbnail image path without HTTPS
        +* Defect #18144: German translation on "delete my account" page showing a "\n"
        +* Feature #10914: Include is_private setting in xml/json output
        +* Feature #12447: Support for PNG with alpha channel in pdf export
        +* Feature #14008: Add a warning if 2 plugins have the same settings partial name
        +* Feature #14030: Allow plugins to put gems inside PluginGemfile
        +* Feature #14599: Support 16-bit depth PNG images in PDF export
        +* Feature #16164: Bulk edit workflows for multiple trackers/roles
        +* Feature #16362: Option to send email on "Assignee updated"
        +* Feature #16707: Integrate support of SSL for POP3 incoming emails
        +* Feature #17077: fetch_changesets should use POST method too
        +* Feature #17380: Move project sidebar content to a partial
        +* Feature #17431: Display a target version's date if available in issue forms, as a tooltip
        +* Feature #17570: use rbpdf gem instead of bundled rfpdf
        +* Feature #17628: Expose project is_public property via API
        +* Feature #17955: Add link to /time_entries/new from My Page Spent Time block
        +* Feature #17976: Custom permissions per project for non member and anonymous users
        +* Feature #17993: Issues list : css tags to get sort orders
        +* Patch #6498: Make options parameter optional in User#allowed_to_globally?
        +* Patch #13589: Wiki PDF export for 2 column tables
        +* Patch #16190: Relax rejections based on Auto-Submitted header
        +* Patch #16240: Private notes should be marked more clearly
        +* Patch #16536: Japanese translation update (email notification)
        +* Patch #16556: Traditional Chinese "field_assigned_to" translation change
        +* Patch #16685: Introduce the request_store gem to hold User.current and prevent data leakage in error messages
        +* Patch #16704: Persian Translation
        +* Patch #16878: Parse configuration file for ERB
        +* Patch #16905: Count users with a single query on group list
        +* Patch #16925: Improve performance of Principal.member_of scope
        +* Patch #17308: Japanese translation change (fix terms mismatch in workflow)
        +* Patch #17346: Japanese translation change (followed updates of en.yml)
        +* Patch #17400: Typo in Changelog
        +* Patch #17401: Better fix for r13159 issue #16708
        +* Patch #17456: Japanese translation change (custom fields)
        +* Patch #17492: Lowering configuration.example.yml confusion
        +* Patch #17552: Bringing together of the translation of Members at Polish translation
        +* Patch #17563: Fixes some issues in the Galician (gl) translation
        +* Patch #17602: Include enabled modules in projects API
        +* Patch #17717: Password/Email address change should invalidate security tokens
        +* Patch #17796: Expire all other sessions on password change
        +* Patch #17847: Wiki extended help macros do not reflect basic Redmine macros
        +* Patch #17853: Portuguese translation file
        +* Patch #18047: MailHandler: Don't use String#respond_to?(:force_encoding) to differentiate between Ruby 1.8 and Ruby 1.9
        +
        +== 2014-07-06 v2.5.2
        +
        +* Defect #3483: Relative url for source links in notifications
        +* Defect #16415: Users get e-mail notification twice, if they are watchers and assignees at the same time.
        +* Defect #16519: Generating a spent time report on a list type custom field with multiple values causes an invalid SQL error
        +* Defect #16564: Repository identifiers can be reserved words
        +* Defect #16619: Mailer.token_for generates invalid message_id when using from address with full name
        +* Defect #16655: start_date not set despite settings[default_issue_start_date_to_creation_date] being set.
        +* Defect #16668: Redmine links broken when object name contains special characters
        +* Defect #16669: Markdown formatter should use the :no_intra_emphasis extension
        +* Defect #16708: Form is submitted when switching tab
        +* Defect #16739: custom_fields.json only returns single tracker instead of array of trackers
        +* Defect #16747: Remove useless settings when editing a query from the gantt
        +* Defect #16755: Field set as read-only still available in the issues list context menu
        +* Defect #16795: Member#destroy triggers after_destroy callbacks twice
        +* Defect #16798: Custom field - list type - checkboxes - unchecking all - does not save
        +* Defect #16926: Custom field referencing deleted value trigger an error on display
        +* Defect #16989: Inline images in email does not appear when thumbnail macro is used.
        +* Defect #17003: Option to display bool custom fields as a single checkbox
        +* Feature #3177: Add "Check for updates" functionality to installed plugins
        +* Feature #16194: Ruby 2.1 support
        +* Patch #16566: French "text_git_repository_note" translation
        +* Patch #16700: Blank content type for attachments attached via Ajax file upload
        +* Patch #16710: Support for the 1.x versions of mime-types gem
        +* Patch #16781: Crash in markdown formatter causes ruby process to end
        +* Patch #17166: Japanese translation update (plugin update check)
        +* Patch #17301: Czech plugin strings
        +
        +== 2014-03-29 v2.5.1
        +
        +* Defect #14298: Error generated on 'search for watchers to add' after clicking add without selected users
        +* Defect #16236: Right-aligned table of contents (TOC) not working with markdown
        +* Defect #16255: Internal Error for specific version of non-existent wiki page
        +* Defect #16259: Changing Tracker value on new issue form makes hidden fields appearing after hitting F5
        +* Defect #16321: Custom Fields with "Link values to URL" set are displayed as escaped html in email
        +* Defect #16338: Can't choose an issue of a different project when updating time entries
        +* Defect #16353: Regexp bug in JournalsController regexp handling when quoting existing journal entries
        +* Feature #16326: Custom queries, buttons to move column to top and bottom
        +* Patch #16291: Japanese translation update
        +* Patch #16319: Random crash when using custom fields
        +* Patch #16320: Turkish typo fix
        +* Patch #16334: Korean Translation
        +* Patch #16336: Russian translation
        +* Patch #16356: Spanish Translation: label_custom_field_select_type
        +* Patch #16368: Polish translation update
        +* Patch #16381: Extract code to render project context links to helper
        +* Patch #16453: Czech localisation
        +* Defect #16466: Fixed back url verification
        +
        +== 2014-03-02 v2.5.0
        +
        +* Defect #3163: Large inline images overflow
        +* Defect #13385: Searchable checkbox displayed on edit form for not-searchable custom field formats.
        +* Defect #13396: Updating an issue with user or list format custom field, currently having value that is locked or removed, clears that field
        +* Defect #14361: Mercurial commit ids are short (12 digits) on database
        +* Defect #15377: bundle install --without development test fails
        +* Defect #15381: Error pages improvement
        +* Defect #15485: HTML 5 validation multiple ids
        +* Defect #15551: Validating a Setting with invalid name triggers an error
        +* Defect #15552: Preferences are not preserved after adding user with validation error
        +* Defect #15704: Journal for relation should store relation type instead of i18n key
        +* Defect #15709: TimeEntry custom_values are not deleted from the database when destroying the associated project
        +* Defect #15831: Successful update notice for workflows
        +* Defect #15848: REST API: Cannot retrieve memberships of closed projects
        +* Defect #15929: REST API: Integer custom field validation fails when using non-string values
        +* Defect #15947: Deadlock when delete issues in same time on multiple sessions
        +* Defect #15983: Project.activities returns different types depending on context
        +* Defect #16077: Table of contents macro conflicts with collapse macro
        +* Defect #16091: Export CSV with many custom field runs many queries
        +* Defect #16107: ApplicationController mishandles non-Basic authentication information, causing an internal error
        +* Defect #16143: Can't insert too long comment field from repository (MySQL)
        +* Feature #1179: Optionally allow Text and Long Text custom fields support wiki formatting
        +* Feature #1358: Link_to for Custom Field
        +* Feature #2083: CustomField of type "external-link-to" with configurable URL prefix
        +* Feature #2549: Enable the watching of news
        +* Feature #2691: Option to disable automated language-guessing based on HTTP_ACCEPT_LANGUAGE HTTP-header
        +* Feature #8152: Render Version and User custom fields as links
        +* Feature #8562: Watchers list too big in new issue form
        +* Feature #8572: Configuration of which versions (by version-status) are shown in version-format custom fields
        +* Feature #8842: REST API: Filter issues created/updated before or after specific timestamp
        +* Feature #13134: Focus first text field automatically
        +* Feature #14309: Add favicon to Atom feeds
        +* Feature #15275: Improve usage of label "button_update"
        +* Feature #15362: Wrap filters, options and buttons with extra div on the issue list
        +* Feature #15520: Markdown formatting
        +* Feature #15699: Description for custom fields
        +* Feature #15701: Add project identifier substitution option to the URL-pattern property of link format custom fields
        +* Feature #15790: Use the mime-types gem to get mime type for unknown extension
        +* Feature #15815: REST API : Add project status in API response
        +* Feature #15926: Redirect to back_url or referer when clicking "Sign in" while already logged-in
        +* Patch #12753: Update config.i18n.load_path for plugin-supplied locales
        +* Patch #13774: Show warning if CSV-Export exceeds limit
        +* Patch #14766: Better block detection on my page
        +* Patch #15403: Czech "message" and "changeset" translation change
        +* Patch #15420: Don't create duplicate wikis in tests
        +* Patch #15689: Make favicon themeable
        +* Patch #15785: Support more character encodings in incoming emails
        +
        +== 2014-03-02 v2.4.4
        +
        +* Defect #16081: Export CSV - Custom field true/false not using translation
        +* Defect #16161: Parent task search and datepicker not available after changing status
        +* Defect #16169: Wrong validation when updating integer custom field with spaces
        +* Defect #16177: Mercurial 2.9 compatibility
        +
        +== 2014-02-08 v2.4.3
        +
        +* Defect #13544: Commit reference: autogenerated issue note has wrong commit link syntax in multi-repo or cross-project context
        +* Defect #15664: Unable to upload attachments without add_issues, edit_issues or add_issue_notes permission
        +* Defect #15756: 500 on admin info/settings page on development environment
        +* Defect #15781: Customfields have a noticable impact on search performance due to slow database COUNT
        +* Defect #15849: Redmine:Fetch_Changesets Single-inheritance issue in subclass "Repository:Git"
        +* Defect #15870: Parent task completion is 104% after update of subtasks
        +* Defect #16032: Repository.fetch_changesets > app/models/repository/git.rb:137:in `[]=': string not matched (IndexError)
        +* Defect #16038: Issue#css_classes corrupts user.groups association cache
        +* Patch #15960: pt-BR translation for 2.4-stable
        +
        +Additional note:
        +
        +#15781 was forgotten to merge to v2.4.3.
        +It is in v2.5.0.
        +
        +== 2013-12-23 v2.4.2
        +
        +* Defect #15398: HTML 5 invalid 
        tag +* Defect #15523: CSS class for done ratio is not properly generated +* Defect #15623: Timelog filtering by activity field does not handle project activity overrides +* Defect #15677: Links for relations in notifications do not include hostname +* Defect #15684: MailHandler : text/plain attachments are added to description +* Defect #15714: Notification on loosing assignment does not work +* Defect #15735: OpenID login fails due to CSRF verification +* Defect #15741: Multiple scrollbars in project selection tree +* Patch #9442: Russian wiki syntax help translations +* Patch #15524: Japanese translation update (r12278) +* Patch #15601: Turkish translation update +* Patch #15688: Spanish translation updated +* Patch #15696: Russian translation update + +== 2013-11-23 v2.4.1 + +* Defect #15401: Wiki syntax "bold italic" is incorrect +* Defect #15414: Empty sidebar should not be displayed in project overview +* Defect #15427: REST API POST and PUT broken +* Patch #15376: Traditional Chinese translation (to r12295) +* Patch #15395: German "ImageMagick convert available" translation +* Patch #15400: Czech Wiki syntax traslation +* Patch #15402: Czech translation for 2.4-stable + +== 2013-11-17 v2.4.0 + +* Defect #1983: statistics get rather cramped with more than 15 or so contributers +* Defect #7335: Sorting issues in gantt by date, not by id +* Defect #12681: Treat group assignments as assigned to me +* Defect #12824: Useless "edit" link in workflow menu +* Defect #13260: JQuery Datepicker popup is missing multiple month/year modifiers +* Defect #13537: Filters will show issues with unused custom fields. +* Defect #13829: Favicon bug in IE8 +* Defect #13949: Handling of attachment uploads when 'Maximum attachment size' is set to 0 +* Defect #13989: Trac and Mantis importers reset global notification settings +* Defect #13990: Trac importer breaks on exotic filenames and ruby 1.9+ +* Defect #14028: Plugins Gemfiles loading breaks __FILE__ +* Defect #14086: Better handling of issue start date validation +* Defect #14206: Synchronize the lang attribute of the HTML with the display language +* Defect #14403: No error message if notification mail could not delivered +* Defect #14516: Missing Sort Column Label and Center Align on Admin-Enumerations +* Defect #14517: Missing Html Tile on Admin (Groups, LDAP and Plugins) +* Defect #14598: Wrong test with logger.info in model mail_handler +* Defect #14615: Warn me when leaving a page with unsaved text doesn't work when editing an update note +* Defect #14621: AJAX call on the issue form resets data entered during the request +* Defect #14657: Wrong German translation for member inheritance +* Defect #14773: ActiveRecord::Acts::Versioned::ActMethods#next_version Generates ArgumentError +* Defect #14819: Newlines in attachment filename causes crash +* Defect #14986: 500 error when viewing a wiki page without WikiContent +* Defect #14995: Japanese "notice_not_authorized" translation is incorrect +* Defect #15044: Patch for giving controller_issues_edit_after_save api hook the correct context +* Defect #15050: redmine:migrate_from_mantis fails to migrate projects with all upper case name +* Defect #15058: Project authorization EnabledModule N+1 queries +* Defect #15113: The mail method should return a Mail::Message +* Defect #15135: Issue#update_nested_set_attributes comparing nil with empty string +* Defect #15191: HTML 5 validation failures +* Defect #15227: Custom fields in issue form - splitting is incorrect +* Defect #15307: HTML 5 deprecates width and align attributes +* Feature #1005: Add the addition/removal/change of related issues to the history +* Feature #1019: Role based custom queries +* Feature #1391: Ability to force user to change password +* Feature #2199: Ability to clear dates and text fields when bulk editing issues +* Feature #2427: Document horizontal rule syntax +* Feature #2795: Add a "Cancel" button to the "Delete" project page when deleting a project. +* Feature #2865: One click filter in search view +* Feature #3413: Exclude attachments from incoming emails based on file name +* Feature #3872: New user password - better functionality +* Feature #4911: Multiple issue update rules with different keywords in commit messages +* Feature #5037: Role-based issue custom field visibility +* Feature #7590: Different commit Keywords for each tracker +* Feature #7836: Ability to save Gantt query filters +* Feature #8253: Update CodeRay to 1.1 final +* Feature #11159: REST API for getting CustomField definitions +* Feature #12293: Add links to attachments in new issue email notification +* Feature #12912: Issue-notes Redmine links: append actual note reference to rendered links +* Feature #13157: Link on "My Page" to view all my spent time +* Feature #13746: Highlighting of source link target line +* Feature #13943: Better handling of validation errors when bulk editing issues +* Feature #13945: Disable autofetching of repository changesets if projects are closed +* Feature #14024: Default of issue start and due date +* Feature #14060: Enable configuration of OpenIdAuthentication.store +* Feature #14228: Registered users should have a way to get a new action email +* Feature #14614: View hooks for user preferences +* Feature #14630: wiki_syntax.html per language (wiki help localization mechanism) +* Feature #15136: Activate Custom Fields on a selection of projects directly from Custom fields page +* Feature #15182: Return to section anchor after wiki section edit +* Feature #15218: Update Rails 3.2.15 +* Feature #15311: Add an indication to admin/info whether or not ImageMagick convert is available +* Patch #6689: Document project-links in parse_redmine_links +* Patch #13460: All translations: RSS -> Atom +* Patch #13482: Do not add empty header/footer to notification emails +* Patch #13528: Traditional Chinese "label_total_time" translation +* Patch #13551: update Dutch translations - March 2013 +* Patch #13577: Japanese translation improvement ("done ratio") +* Patch #13646: Fix handling multiple text parts in email +* Patch #13674: Lithuanian translation +* Patch #13687: Favicon bug in opera browser +* Patch #13697: Back-button on diff page is not working when I'm directed from email +* Patch #13745: Correct translation for member save button +* Patch #13808: Changed Bulgarian "label_statistics" translation +* Patch #13825: German translation: jquery.ui.datepicker-de.js +* Patch #13900: Update URL when changing tab +* Patch #13931: Error and inconsistencies in Croatian translation +* Patch #13948: REST API should return user.status +* Patch #13988: Enhanced Arabic translation +* Patch #14138: Output changeset comment in html title +* Patch #14180: Improve pt-BR translation +* Patch #14222: German translation: grammar + spelling +* Patch #14223: Fix icon transparency issues +* Patch #14360: Slovene language translation +* Patch #14767: More CSS classes on various fields +* Patch #14901: Slovak translation +* Patch #14920: Russian numeric translation +* Patch #14981: Italian translation +* Patch #15072: Optimization of issues journal custom fields display +* Patch #15073: list custom fields : multiple select filter wider +* Patch #15075: Fix typo in the Dutch "label_user_mail_option_all" translation +* Patch #15277: Accept custom field format added at runtime +* Patch #15295: Log error messages when moving attachements in sub-directories +* Patch #15369: Bulgarian translation (r12278) + +== 2013-11-17 v2.3.4 + +* Defect #13348: Repository tree can't handle two loading at once +* Defect #13632: Empty page attached when exporting PDF +* Defect #14590: migrate_from_trac.rake does not import Trac users, uses too short password +* Defect #14656: JRuby: Encoding error when creating issues +* Defect #14883: Update activerecord-jdbc-adapter +* Defect #14902: Potential invalid SQL error with invalid group_ids +* Defect #14931: SCM annotate with non ASCII author +* Defect #14960: migrate_from_mantis.rake does not import Mantis users, uses too short password +* Defect #14977: Internal Server Error while uploading file +* Defect #15190: JS-error while using a global custom query w/ project filter in a project context +* Defect #15235: Wiki Pages REST API with version returns wrong comments +* Defect #15344: Default status always inserted to allowed statuses when changing status +* Feature #14919: Update ruby-openid version above 2.3.0 +* Patch #14592: migrate_from_trac.rake does not properly parse First Name and Last Name +* Patch #14886: Norweigan - label_copied_to and label_copied_from translated +* Patch #15185: Simplified Chinese translation for 2.3-stable + +== 2013-09-14 v2.3.3 + +* Defect #13008: Usage of attribute_present? in UserPreference +* Defect #14340: Autocomplete fields rendering issue with alternate theme +* Defect #14366: Spent Time report sorting on custom fields causes error +* Defect #14369: Open/closed issue counts on issues summary are not displayed with SQLServer +* Defect #14401: Filtering issues on "related to" may ignore other filters +* Defect #14415: Spent time details and report should ignore 'Setting.display_subprojects_issues?' when 'Subproject' filter is enabled. +* Defect #14422: CVS root_url not recognized when connection string does not include port +* Defect #14447: Additional status transitions for assignees do not work if assigned to a group +* Defect #14511: warning: class variable access from toplevel on Ruby 2.0 +* Defect #14562: diff of CJK (Chinese/Japanese/Korean) is broken on Ruby 1.8 +* Defect #14584: Standard fields disabled for certain trackers still appear in email notifications +* Defect #14607: rake redmine:load_default_data Error +* Defect #14697: Wrong Russian translation in close project message +* Defect #14798: Wrong done_ratio calculation for parent with subtask having estimated_hours=0 +* Patch #14485: Traditional Chinese translation for 2.3-stable +* Patch #14502: Russian translation for 2.3-stable +* Patch #14531: Spanish translations for 2.3.x +* Patch #14686: Portuguese translation for 2.3-stable + +== 2013-07-14 v2.3.2 + +* Defect #9996: configuration.yml in documentation , but redmine ask me to create email.yml +* Defect #13692: warning: already initialized constant on Ruby 1.8.7 +* Defect #13783: Internal error on time tracking activity enumeration deletion +* Defect #13821: "obj" parameter is not defined for macros used in description of documents +* Defect #13850: Unable to set custom fields for versions using the REST API +* Defect #13910: Values of custom fields are not kept in issues when copying a project +* Defect #13950: Duplicate Lithuanian "error_attachment_too_big" translation keys +* Defect #14015: Ruby hangs when adding a subtask +* Defect #14020: Locking and unlocking a user resets the email notification checkbox +* Defect #14023: Can't delete relation when Redmine runs in a subpath +* Defect #14051: Filtering issues with custom field in date format with NULL(empty) value +* Defect #14178: PDF API broken in version 2.3.1 +* Defect #14186: Project name is not properly escaped in issue filters JSON +* Defect #14242: Project auto generation fails when projects created in the same time +* Defect #14245: Gem::InstallError: nokogiri requires Ruby version >= 1.9.2. +* Defect #14346: Latvian translation for "Log time" +* Feature #12888: Adding markings to emails generated by Private comments +* Feature #14419: Include RUBY_PATCHLEVEL and RUBY_RELEASE_DATE in info.rb +* Patch #14005: Swedish Translation for 2.3-stable +* Patch #14101: Receive IMAP by uid's +* Patch #14103: Disconnect and logout from IMAP after mail receive +* Patch #14145: German translation of x_hours +* Patch #14182: pt-BR translation for 2.3-stable +* Patch #14196: Italian translation for 2.3-stable +* Patch #14221: Translation of x_hours for many languages + +== 2013-05-01 v2.3.1 + +* Defect #12650: Lost text after selection in issue list with IE +* Defect #12684: Hotkey for Issue-Edit doesn't work as expected +* Defect #13405: Commit link title is escaped twice when using "commit:" prefix +* Defect #13541: Can't access SCM when log/production.scm.stderr.log is not writable +* Defect #13579: Datepicker uses Simplified Chinese in Traditional Chinese locale +* Defect #13584: Missing Portuguese jQuery UI date picker +* Defect #13586: Circular loop testing prevents precedes/follows relation between subtasks +* Defect #13618: CSV export of spent time ignores filters and columns selection +* Defect #13630: PDF export generates the issue id twice +* Defect #13644: Diff - Internal Error +* Defect #13712: Fix email rake tasks to also support no_account_notice and default_group options +* Defect #13811: Broken javascript in IE7 ; recurrence of #12195 +* Defect #13823: Trailing comma in javascript files +* Patch #13531: Traditional Chinese translation for 2.3-stable +* Patch #13552: Dutch translations for 2.3-stable +* Patch #13678: Lithuanian translation for 2.3-stable + +== 2013-03-19 v2.3.0 + +* Defect #3107: Issue with two digit year on Logtime +* Defect #3371: Autologin does not work when using openid +* Defect #3676: www. generates broken link in formatted text +* Defect #4700: Adding news does not send notification to all project members +* Defect #5329: Time entries report broken on first week of year +* Defect #8794: Circular loop when using relations and subtasks +* Defect #9475: German Translation "My custom queries" and "Custom queries" +* Defect #9549: Only 100 users are displayed when adding new project members +* Defect #10277: Redmine wikitext URL-into-link creation with hyphen is wrong +* Defect #10364: Custom field float separator in CSV export +* Defect #10930: rake redmine:load_default_data error in 2.0 with SQLServer +* Defect #10977: Redmine shouldn't require all database gems +* Defect #12528: Handle temporary failures gracefully in the external mail handler script +* Defect #12629: Wrong German "label_issues_by" translation +* Defect #12641: Diff outputs become ??? in some non ASCII words. +* Defect #12707: Typo in app/models/tracker.rb +* Defect #12716: Attachment description lost when issue validation fails +* Defect #12735: Negative duration allowed +* Defect #12736: Negative start/due dates allowed +* Defect #12968: Subtasks don't resepect following/precedes +* Defect #13006: Filter "Assignee's group" doesn't work with group assignments +* Defect #13022: Image pointing towards /logout signs out user +* Defect #13059: Custom fields are listed two times in workflow/Fields permission +* Defect #13076: Project overview page shows trackers from subprojects with disabled issue module +* Defect #13119: custom_field_values are not reloaded on #reload +* Defect #13154: After upgrade to 2.2.2 ticket list on some projects fails +* Defect #13188: Forms are not updated after changing the status field without "Add issues" permission +* Defect #13251: Adding a "follows" relation may not refresh relations list +* Defect #13272: translation missing: setting_default_projects_tracker_ids +* Defect #13328: Copying an issue as a child of itself creates an extra issue +* Defect #13335: Autologin does not work with custom autologin cookie name +* Defect #13350: Japanese mistranslation fix +* Feature #824: Add "closed_on" issue field (storing time of last closing) & add it as a column and filter on the issue list. +* Feature #1766: Custom fields should become addable to Spent Time list/report +* Feature #3436: Show relations in Gantt diagram +* Feature #3957: Ajax file upload with progress bar +* Feature #5298: Store attachments in sub directories +* Feature #5605: Subprojects should (optionally) inherit Members from their parent +* Feature #6727: Add/remove issue watchers via REST API +* Feature #7159: Bulk watch/unwatch issues from the context menu +* Feature #8529: Get the API key of the user through REST API +* Feature #8579: Multiple file upload with HTML5 / Drag-and-Drop +* Feature #10191: Add Filters For Spent time's Details and Report +* Feature #10286: Auto-populate fields while creating a new user with LDAP +* Feature #10352: Preview should already display the freshly attached images +* Feature #11498: Add --no-account-notice option for the mail handler script +* Feature #12122: Gantt progress lines (html only) +* Feature #12228: JRuby 1.7.2 support +* Feature #12251: Custom fields: 'Multiple values' should be able to be checked and then unchecked +* Feature #12401: Split "Manage documents" permission into create, edit and delete permissions +* Feature #12542: Group events in the activity view +* Feature #12665: Link to a file in a repository branch +* Feature #12713: Microsoft SQLServer support +* Feature #12787: Remove "Warning - iconv will be deprecated in the future, use String#encode instead." +* Feature #12843: Add links to projects in Group projects list +* Feature #12898: Handle GET /issues/context_menu parameters nicely to prevent returning error 500 to crawlers +* Feature #12992: Make JSONP support optional and disabled by default +* Feature #13174: Raise group name maximum length to 255 characters +* Feature #13175: Possibility to define the default enable trackers when creating a project +* Feature #13329: Ruby 2.0 support +* Feature #13337: Split translation "label_total" +* Feature #13340: Mail handler: option to add created user to default group +* Feature #13341: Mail handler: --no-notification option to disable notifications to the created user +* Patch #7202: Polish translation for v1.0.4 +* Patch #7851: Italian translation for 'issue' +* Patch #9225: Generate project identifier automatically with JavaScript +* Patch #10916: Optimisation in issues relations display +* Patch #12485: Don't force english language for default admin account +* Patch #12499: Use lambda in model scopes +* Patch #12611: Login link unexpected logs you out +* Patch #12626: Updated Japanese translations for button_view and permission_commit_access +* Patch #12640: Russian "about_x_hours" translation change +* Patch #12645: Russian numeric translation +* Patch #12660: Consistent German translation for my page +* Patch #12708: Restructured german translation (Cleanup) +* Patch #12721: Optimize MenuManager a bit +* Patch #12725: Change pourcent to percent (#12724) +* Patch #12754: Updated Japanese translation for notice_account_register_done +* Patch #12788: Copyright for 2013 +* Patch #12806: Serbian translation change +* Patch #12810: Swedish Translation change +* Patch #12910: Plugin settings div should perhaps have 'settings' CSS class +* Patch #12911: Fix 500 error for requests to the settings path for non-configurable plugins +* Patch #12926: Bulgarian translation (r11218) +* Patch #12927: Swedish Translation for r11244 +* Patch #12967: Change Spanish login/logout translations +* Patch #12988: Russian translation for trunk +* Patch #13080: German translation of label_in +* Patch #13098: Small datepicker improvements +* Patch #13152: Locale file for Azerbaijanian language +* Patch #13155: Add login to /users/:id API for current user +* Patch #13173: Put source :rubygems url HTTP secure +* Patch #13190: Bulgarian translation (r11404) +* Patch #13198: Traditional Chinese language file (to r11426) +* Patch #13203: German translation change for follow and precedes is inconsitent +* Patch #13206: Portuguese translation file +* Patch #13246: Some german translation patches +* Patch #13280: German translation (r11478) +* Patch #13301: Performance: avoid querying all memberships in User#roles_for_project +* Patch #13309: Add "tracker-[id]" CSS class to issues +* Patch #13324: fixing some pt-br locales +* Patch #13339: Complete language Vietnamese file +* Patch #13391: Czech translation update +* Patch #13399: Fixed some wrong or confusing translation in Korean locale +* Patch #13414: Bulgarian translation (r11567) +* Patch #13420: Korean translation for 2.3 (r11583) +* Patch #13437: German translation of setting_emails_header +* Patch #13438: English translation +* Patch #13447: German translation - some patches +* Patch #13450: Czech translation +* Patch #13475: fixing some pt-br locales +* Patch #13514: fixing some pt-br locales + +== 2013-03-19 v2.2.4 + +* Upgrade to Rails 3.2.13 +* Defect #12243: Ordering forum replies by last reply date is broken +* Defect #13127: h1 multiple lined titles breaks into main menu +* Defect #13138: Generating PDF of issue causes UndefinedConversionError with htmlentities gem +* Defect #13165: rdm-mailhandler.rb: initialize_http_header override basic auth +* Defect #13232: Link to topic in nonexistent forum causes error 500 +* Patch #13181: Bulgarian translation of jstoolbar-bg.js +* Patch #13207: Portuguese translation for 2.2-stable +* Patch #13310: pt-BR label_last_n_weeks translation +* Patch #13325: pt-BR translation for 2.2-stable +* Patch #13343: Vietnamese translation for 2.2-stable +* Patch #13398: Czech translation for 2.2-stable + +== 2013-02-12 v2.2.3 + +* Upgrade to Rails 3.2.12 +* Defect #11987: pdf: Broken new line in table +* Defect #12930: 404 Error when referencing different project source files in the wiki syntax +* Defect #12979: Wiki link syntax commit:repo_a:abcd doesn't work +* Defect #13075: Can't clear custom field value through context menu in the issue list +* Defect #13097: Project copy fails when wiki module is disabled +* Defect #13126: Issue view: estimated time vs. spent time +* Patch #12922: Update Spanish translation +* Patch #12928: Bulgarian translation for 2.2-stable +* Patch #12987: Russian translation for 2.2-stable + +== 2013-01-20 v2.2.2 + +* Defect #7510: Link to attachment should return latest attachment +* Defect #9842: {{toc}} is not replaced by table of content when exporting wiki page to pdf +* Defect #12749: Plugins cannot route wiki page sub-path +* Defect #12799: Cannot edit a wiki section which title starts with a tab +* Defect #12801: Viewing the history of a wiki page with attachments raises an error +* Defect #12833: Input fields restricted on length should have maxlength parameter set +* Defect #12838: Blank page when clicking Add with no block selected on my page layout +* Defect #12851: "Parent task is invalid" while editing child issues by Role with restricted Issues Visibility +* Patch #12800: Serbian Latin translation patch (sr-YU.yml) +* Patch #12809: Swedish Translation for r11162 +* Patch #12818: Minor swedish translation fix + +== 2013-01-09 v2.2.1 + +* Upgrade to Rails 3.2.11 +* Defect #12652: "Copy ticket" selects "new ticket" +* Defect #12691: Textile Homepage Dead? +* Defect #12711: incorrect fix of lib/SVG/Graph/TimeSeries.rb +* Defect #12744: Unable to call a macro with a name that contains uppercase letters +* Defect #12776: Security vulnerability in Rails 3.2.10 (CVE-2013-0156) +* Patch #12630: Russian "x_hours" translation + +== 2012-12-18 v2.2.0 + +* Defect #4787: Gannt to PNG - CJK (Chinese, Japanese and Korean) characters appear as ? +* Defect #8106: Issues by Category should show tasks without category +* Defect #8373: i18n string text_are_you_sure_with_children no longer used +* Defect #11426: Filtering with Due Date in less than N days should show overdue issues +* Defect #11834: Bazaar: "???" instead of non ASCII character in paths on non UTF-8 locale +* Defect #11868: Git and Mercurial diff displays deleted files as /dev/null +* Defect #11979: No validation errors when entering an invalid "Parent task" +* Defect #12012: Redmine::VERSION.revision method does not work on Subversion 1.7 working copy +* Defect #12018: Issue filter select box order changes randomly +* Defect #12090: email recipients not written to action_mailer log if BCC recipients setting is checked +* Defect #12092: Issue "start date" validation does not work correctly +* Defect #12285: Some unit and functional tests miss fixtures and break when run alone +* Defect #12286: Emails of private notes are sent to watcher users regardless of viewing permissions +* Defect #12310: Attachments may not be displayed in the order they were selected +* Defect #12356: Issue "Update" link broken focus +* Defect #12397: Error in Textile conversion of HTTP links, containing russian letters +* Defect #12434: Respond with 404 instead of 500 when requesting a wiki diff with invalid versions +* Feature #1554: Private comments in tickets +* Feature #2161: Time tracking code should respect weekends as "no work" days +* Feature #3239: Show related issues on the Issues Listing +* Feature #3265: Filter on issue relations +* Feature #3447: Option to display the issue descriptions on the issues list +* Feature #3511: Ability to sort issues by grouped column +* Feature #4590: Precede-Follow relation should move following issues when rescheduling issue earlier +* Feature #5487: Allow subtasks to cross projects +* Feature #6899: Add a relation between the original and copied issue +* Feature #7082: Rest API for wiki +* Feature #9835: REST API - List priorities +* Feature #10789: Macros {{child_pages}} with depth parameter +* Feature #10852: Ability to delete a version from a wiki page history +* Feature #10937: new user format #{lastname} +* Feature #11502: Expose roles details via REST API +* Feature #11755: Impersonate user through REST API auth +* Feature #12085: New user name format: firstname + first letter of lastname +* Feature #12125: Set filename used to store attachment updloaded via the REST API +* Feature #12167: Macro for inserting collapsible block of text +* Feature #12211: Wrap issue description and its contextual menu in a div +* Feature #12216: Textual CSS class for priorities +* Feature #12299: Redmine version requirement improvements (in plugins) +* Feature #12393: Upgrade to Rails 3.2.9 +* Feature #12475: Lazy loading of translation files for faster startup +* Patch #11846: Fill username when authentification failed +* Patch #11862: Add "last 2 weeks" preset to time entries reporting +* Patch #11992: Japanese translation about issue relations improved +* Patch #12027: Incorrect Spanish "September" month name +* Patch #12061: Japanese translation improvement (permission names) +* Patch #12078: User#allowed_to? should return true or false +* Patch #12117: Change Japanese translation of "admin" +* Patch #12142: Updated translation in Lithuanian +* Patch #12232: German translation enhancements +* Patch #12316: Fix Lithuanian numeral translation +* Patch #12494: Bulgarian "button_submit" translation change +* Patch #12514: Updated translation in Lithuanian +* Patch #12602: Korean translation update for 2.2-stable +* Patch #12608: Norwegian translation changed +* Patch #12619: Russian translation change + +== 2012-12-18 v2.1.5 + +* Defect #12400: Validation fails when receiving an email with list custom fields +* Defect #12451: Macros.rb extract_macro_options should use lazy search +* Defect #12513: Grouping of issues by custom fields not correct in PDF export +* Defect #12566: Issue history notes previews are broken +* Defect #12568: Clicking "edit" on a journal multiple times shows multiple forms +* Patch #12605: Norwegian translation for 1.4-stable update +* Patch #12614: Dutch translation +* Patch #12615: Russian translation + +== 2012-11-24 v2.1.4 + +* Defect #12274: Wiki export from Index by title is truncated +* Defect #12298: Right-click context menu unable to batch/bulk update (IE8) +* Defect #12332: Repository identifier does not display on Project/Settings/Repositories +* Defect #12396: Error when receiving an email without subject header +* Defect #12399: Non ASCII attachment filename encoding broken (MOJIBAKE) in receiving mail on Ruby 1.8 +* Defect #12409: Git: changesets aren't read after clear_changesets call +* Defect #12431: Project.rebuild! sorts root projects by id instead of name + +== 2012-11-17 v2.1.3 + +* Defect #12050: :export links to repository files lead to a 404 error +* Defect #12189: Missing tmp/pdf directory +* Defect #12195: Javascript error with IE7 / IE8 on new issue form +* Defect #12196: "Page not found" on OK button in SCM "View all revisions" page +* Defect #12199: Confirmation message displayed when clicking a disabled delete link in the context menu +* Defect #12231: Hardcoded "Back" in Repository +* Defect #12294: Incorrect german translation for "registered" users filter +* Defect #12349: Watchers auto-complete search on non-latin chars +* Defect #12358: 'None' grouped issue list section should be translated +* Defect #12359: Version date field regex validation accepts invalid date +* Defect #12375: Receiving mail subject encoding broken (MOJIBAKE) in some cases on Ruby 1.8 +* Patch #9732: German translations +* Patch #12021: Russian locale translations +* Patch #12188: Simplified Chinese translation with zh.yml file based on Rev:10681 +* Patch #12235: German translation for 2.1-stable +* Patch #12237: Added German Translation + +== 2012-09-30 v2.1.2 + +* Defect #11929: XSS vulnerability in Redmine 2.1.x + +== 2012-09-30 v2.1.1 + +* Defect #11290: ParseDate missing in Ruby 1.9x +* Defect #11844: "load_default_data" rake task fails to print the error message if one occurs +* Defect #11850: Can't create a user from ldap by on-the-fly on the redmine server using URI prefix +* Defect #11872: Private issue visible to anonymous users after its author is deleted +* Defect #11885: Filter misses Selectionfield on IE8 +* Defect #11893: New relation form Cancel link is broken with Chrome 21 +* Defect #11905: Potential "can't dup NilClass" error in UserPreference +* Defect #11909: Autocomplete results not reset after clearing search field +* Defect #11922: bs.yml and de.yml lead to error by number_to_currency() +* Defect #11945: rake task prints "can't convert Errno::EACCES into String" in case of no permission of public/plugin_assets +* Defect #11975: Undefined status transitions allowed in workflow (author of issue changes when selecting a new status) +* Defect #11982: SCM diff view generates extra parameter for switching mode +* Patch #11897: Traditional Chinese language file (to r10433) + +== 2012-09-16 v2.1.0 + +* Defect #2071: Reordering priority-enumerations breaks alternate-theme's issue-colouring +* Defect #2190: Month names not translated to german +* Defect #8978: LDAP timeout if an LDAP auth provider is unreachable +* Defect #9839: Gantt abbr of weekday should not be necessarily the first letter of the long day name +* Defect #10928: Documentation about generating a plugin is not up-to-date +* Defect #11034: TLS configuration documentation for Rails 3 +* Defect #11073: UserCustomField order_statement returns wrong output +* Defect #11153: Default sorting for target version is DESC instead of ASC +* Defect #11207: Issues associated with a locked version are not copied when copying a project +* Defect #11304: Issue-class: status-1, status-2 etc. refer to status position instead of status id +* Defect #11331: Openid registration form should not require user to enter password +* Defect #11345: Context menu should show shared versions when editing issues from different projects +* Defect #11355: Plain text notification emails content is HTML escaped +* Defect #11388: Updating a version through rest API returns invalid JSON +* Defect #11389: Warning in awesome_nested_set.rb +* Defect #11503: Accessing /projects/:project/wiki/something.png fails with error 500 +* Defect #11506: Versions that are not shared should not be assignable when selecting another project +* Defect #11508: Projects not ordered alphabetically after renaming project +* Defect #11540: Roadmap anchor links can be ambigous +* Defect #11545: Overwriting existing method Issue.open +* Defect #11552: MailHandler does not match assignee name with spaces +* Defect #11571: Custom fields of type version not proper handled in receiving e-mails +* Defect #11577: Can't use non-latin anchor in wiki +* Defect #11612: Revision graph sometimes broken due to raphael.js error +* Defect #11621: Redmine MIME Detection Of Javascript Files Non-Standard +* Defect #11633: Macro arguments should not be parsed by text formatters +* Defect #11662: Invalid query returned from Issues.visible scope after accessing User#projects_by_role with a role that is not present +* Defect #11691: 404 response when deleting a user from the edit page +* Defect #11723: redmine:send_reminders notification misses if assignee is a group +* Defect #11738: Batch update of issues clears project path +* Defect #11749: Redmine.pm: HEAD is not considered as a read-only method +* Defect #11814: Date picker does not respect week start setting +* Feature #703: Configurable required fields per tracker/status/role +* Feature #1006: Display thumbnails of attached images +* Feature #1091: Disabling default ticket fields per tracker +* Feature #1360: Permission for adding an issue to a version. +* Feature #3061: Let macros optionally match over multiple lines and ignore single curly braces +* Feature #3510: Inserting image thumbnails inside the wiki +* Feature #3521: Permissions for roles to change fields per tracker/status +* Feature #3640: Freeze / Close Projects +* Feature #3831: Support for subforums +* Feature #6597: Configurable session lifetime and timeout +* Feature #6965: Option to Copy Subtasks when copying an issue +* Feature #8161: Ability to filter issues on project custom fields +* Feature #8577: "Private" column and filter on the issue list +* Feature #8981: REST Api for Groups +* Feature #9258: Create role by copy +* Feature #9419: Group/sort the issue list by user/version-format custom fields +* Feature #10362: Show images in repositories inline when clicking the 'View' link +* Feature #10419: Upgrade raphael.js (2.1.0) +* Feature #11068: Ability to set default column order in issue list +* Feature #11102: Add autocomplete to "Related issue" field on revision +* Feature #11109: Repository Identifier should be frozen +* Feature #11181: Additional "Log time" link on project overview +* Feature #11205: Reversed order of priorities on the issue summary page +* Feature #11445: Switch from Prototype to JQuery +* Feature #11469: JSONP support +* Feature #11475: Redmine.pm: Allow fallback to other Apache auth providers +* Feature #11494: Don't turn #nnn with leading zeros into links +* Feature #11539: Display a projects tree instead of a flat list in notification preferences +* Feature #11578: Option to pass whole arguments to a macro without splitting them +* Feature #11595: Missing mime type for svg files +* Feature #11758: Upgrade to Rails 3.2.8 +* Patch #4905: Redmine.pm: add support for Git's smart HTTP protocol +* Patch #10988: New Korean translation patch +* Patch #11201: Korean translation special update +* Patch #11401: Fix Japanese mistranslation for "button_submit" +* Patch #11402: Japanese translation added for default role names +* Patch #11411: Fix disordered use of long sound in Japanese "user" translation +* Patch #11412: Unnatural Japanese message when users failed to login +* Patch #11419: Fix wrong Japanese "label_attachment" translation +* Patch #11496: Make labels clickable in Adminstration/Settings +* Patch #11704: Avoid the use of tag("...", "...", true) in layout +* Patch #11818: Redmine.pm fails when permissions are NULL + +== 2012-09-16 v2.0.4 + +* Defect #10818: Running rake in test environment causes exception +* Defect #11209: Wiki diff may generate broken HTML +* Defect #11217: Project names in drop-down are escaped twice +* Defect #11262: Link is escaped in wiki added/updated notification email +* Defect #11307: Can't filter for negative numeric custom fields +* Defect #11325: Unified diff link broken on specific file/revision diff view +* Defect #11341: Escaped link in conflict resolution form +* Defect #11365: Attachment description length is not validated +* Defect #11511: Confirmation page has broken HTML when a project folding sub project is deleted +* Defect #11533: rake redmine:plugins:test doesn't run tests in subdirectories +* Defect #11541: Version sharing is missing in the REST API +* Defect #11550: Issue reminder doesn't work when using asynchronous delivery +* Defect #11776: Can't override mailer views inside redmine plugin. +* Defect #11789: Edit section links broken with h5/h6 headings +* Feature #11338: Exclude emails with auto-submitted => auto-generated +* Patch #11299: redmine:plugins:migrate should update db/schema.rb +* Patch #11328: Fix Japanese mistranslation for 'label_language_based' +* Patch #11448: Russian translation for 1.4-stable and 2.0-stable +* Patch #11600: Fix plural form of the abbreviation for hours in Brazilian Portuguese + +== 2012-06-18 v2.0.3 + +* Defect #10688: PDF export from Wiki - Problems with tables +* Defect #11061: Cannot choose commit versions to view differences in Git/Mercurial repository view +* Defect #11065: E-Mail submitted tickets: German umlauts in 'Subject' get malformed (ruby 1.8) +* Defect #11098: Default priorities have the same position and can't be reordered +* Defect #11105: <% content_for :header_tags do %> doesn't work inside hook +* Defect #11112: REST API - custom fields in POST/PUT ignored for time_entries +* Defect #11118: "Maximum file size" displayed on upload forms is incorrect +* Defect #11124: Link to user is escaped in activity title +* Defect #11133: Wiki-page section edit link can point to incorrect section +* Defect #11160: SQL Error on time report if a custom field has multiple values for an entry +* Defect #11170: Topics sort order is broken in Redmine 2.x +* Defect #11178: Spent time sorted by date-descending order lists same-date entries in physical order (not-reverse) +* Defect #11185: Redmine fails to delete a project with parent/child task +* Feature #11162: Upgrade to Rails 3.2.6 +* Patch #11113: Small glitch in German localization + +== 2012-06-05 v2.0.2 + +* Defect #11032: Project list is not shown when "For any event on the selected projects only..." is selected on user edit panel +* Defect #11038: "Create and continue" should preserve project, issue and activity when logging time +* Defect #11046: Redmine.pm does not support "bind as user" ldap authentication +* Defect #11051: reposman.rb fails in 1.4.2 because of missing require for rubygems +* Defect #11085: Wiki start page can't be changed +* Feature #11084: Update Rails to 3.2.5 + +== 2012-05-28 v2.0.1 + +* Defect #10923: After creating a new Version Redmine jumps back to "Information" +* Defect #10932: Links to delete watchers are escaped when gravatars are enabled +* Defect #10964: Updated column doesn't get updated on issues +* Defect #10965: rake yard does not work for generating documentation. +* Defect #10972: Columns selection not displayed on the custom query form +* Defect #10991: My page > Spent time 'project' column is html-encoded +* Defect #10996: Time zones lost when upgrading from Redmine 1.4 to 2.0 +* Defect #11013: Fetching Email from IMAP/POP3 - uninitialized constant RAILS_DEFAULT_LOGGER error +* Defect #11024: redmine_plugin_model generator does not create the migration +* Defect #11027: Saving new query without name causes escaping of input field +* Defect #11028: Project identifier can be updated + +== 2012-05-15 v2.0.0 + +* Feature #4796: Rails 3 support +* Feature #7720: Limit the pagination-limit when max-results is fewer than max-pagination-limit +* Feature #9034: Add an id to the flash messages +* Patch #10782: Better translation for Estonian language + +== 2012-05-13 v1.4.2 + +* Defect #10744: rake task redmine:email:test broken +* Defect #10787: "Allow users to unsubscribe" option is confusing +* Defect #10827: Cannot access Repositories page and Settings in a Project - Error 500 +* Defect #10829: db:migrate fails 0.8.2 -> 1.4.1 +* Defect #10832: REST Uploads fail with fastcgi +* Defect #10837: reposman and rdm-mailhandler not working with ruby 1.9.x +* Defect #10856: can not load translations from hr.yml with ruby1.9.3-p194 +* Defect #10865: Filter reset when deleting locked user +* Feature #9790: Allow filtering text custom fields on "is null" and "is not null" +* Feature #10778: svn:ignore for config/additional_environment.rb +* Feature #10875: Partial Albanian Translations +* Feature #10888: Bring back List-Id to help aid Gmail filtering +* Patch #10733: Traditional Chinese language file (to r9502) +* Patch #10745: Japanese translation update (r9519) +* Patch #10750: Swedish Translation for r9522 +* Patch #10785: Bulgarian translation (jstoolbar) +* Patch #10800: Simplified Chinese translation + +== 2012-04-20 v1.4.1 + +* Defect #8574: Time report: date range fields not enabled when using the calendar popup +* Defect #10642: Nested textile ol/ul lists generate invalid HTML +* Defect #10668: RSS key is generated twice when user is not reloaded +* Defect #10669: Token.destroy_expired should not delete API tokens +* Defect #10675: "Submit and continue" is broken +* Defect #10711: User cannot change account details with "Login has already been taken" error +* Feature #10664: Unsubscribe Own User Account +* Patch #10693: German Translation Update + +== 2012-04-14 v1.4.0 + +* Defect #2719: Increase username length limit from 30 to 60 +* Defect #3087: Revision referring to issues across all projects +* Defect #4824: Unable to connect (can't convert Net::LDAP::LdapError into String) +* Defect #5058: reminder mails are not sent when delivery_method is :async_smtp +* Defect #6859: Moving issues to a tracker with different custom fields should let fill these fields +* Defect #7398: Error when trying to quick create a version with required custom field +* Defect #7495: Python multiline comments highlighting problem in Repository browser +* Defect #7826: bigdecimal-segfault-fix.rb must be removed for Oracle +* Defect #7920: Attempted to update a stale object when copying a project +* Defect #8857: Git: Too long in fetching repositories after upgrade from 1.1 or new branch at first time +* Defect #9472: The git scm module causes an excess amount of DB traffic. +* Defect #9685: Adding multiple times the same related issue relation is possible +* Defect #9798: Release 1.3.0 does not detect rubytree under ruby 1.9.3p0 / rails 2.3.14 +* Defect #9978: Japanese "permission_add_issue_watchers" is wrong +* Defect #10006: Email reminders are sent for closed issues +* Defect #10150: CSV export and spent time: rounding issue +* Defect #10168: CSV export breaks custom columns +* Defect #10181: Issue context menu and bulk edit form show irrelevant statuses +* Defect #10198: message_id regex in pop3.rb only recognizes Message-ID header (not Message-Id) +* Defect #10251: Description diff link in note details is relative when received by email +* Defect #10272: Ruby 1.9.3: "incompatible character encoding" with LDAP auth +* Defect #10275: Message object not passed to wiki macros for head topic and in preview edit mode +* Defect #10334: Full name is not unquoted when creating users from emails +* Defect #10410: [Localization] Grammar issue of Simplified Chinese in zh.yml +* Defect #10442: Ruby 1.9.3 Time Zone setting Internal error. +* Defect #10467: Confusing behavior while moving issue to a project with disabled Issues module +* Defect #10575: Uploading of attachments which filename contains non-ASCII chars fails with Ruby 1.9 +* Defect #10590: WikiContent::Version#text return string with # when uncompressed +* Defect #10593: Error: 'incompatible character encodings: UTF-8 and ASCII-8BIT' (old annoing issue) on ruby-1.9.3 +* Defect #10600: Watchers search generates an Internal error +* Defect #10605: Bulk edit selected issues does not allow selection of blank values for custom fields +* Defect #10619: When changing status before tracker, it shows improper status +* Feature #779: Multiple SCM per project +* Feature #971: Add "Spent time" column to query +* Feature #1060: Add a LDAP-filter using external auth sources +* Feature #1102: Shortcut for assigning an issue to me +* Feature #1189: Multiselect custom fields +* Feature #1363: Allow underscores in project identifiers +* Feature #1913: LDAP - authenticate as user +* Feature #1972: Attachments for News +* Feature #2009: Manually add related revisions +* Feature #2323: Workflow permissions for administrators +* Feature #2416: {background:color} doesn't work in text formatting +* Feature #2694: Notification on loosing assignment +* Feature #2715: "Magic links" to notes +* Feature #2850: Add next/previous navigation to issue +* Feature #3055: Option to copy attachments when copying an issue +* Feature #3108: set parent automatically for new pages +* Feature #3463: Export all wiki pages to PDF +* Feature #4050: Ruby 1.9 support +* Feature #4769: Ability to move an issue to a different project from the update form +* Feature #4774: Change the hyperlink for file attachment to view and download +* Feature #5159: Ability to add Non-Member watchers to the watch list +* Feature #5638: Use Bundler (Gemfile) for gem management +* Feature #5643: Add X-Redmine-Sender header to email notifications +* Feature #6296: Bulk-edit custom fields through context menu +* Feature #6386: Issue mail should render the HTML version of the issue details +* Feature #6449: Edit a wiki page's parent on the edit page +* Feature #6555: Double-click on "Submit" and "Save" buttons should not send two requests to server +* Feature #7361: Highlight active query in the side bar +* Feature #7420: Rest API for projects members +* Feature #7603: Please make editing issues more obvious than "Change properties (More)" +* Feature #8171: Adding attachments through the REST API +* Feature #8691: Better handling of issue update conflict +* Feature #9803: Change project through REST API issue update +* Feature #9923: User type custom fields should be filterable by "Me". +* Feature #9985: Group time report by the Status field +* Feature #9995: Time entries insertion, "Create and continue" button +* Feature #10020: Enable global time logging at /time_entries/new +* Feature #10042: Bulk change private flag +* Feature #10126: Add members of subprojects in the assignee and author filters +* Feature #10131: Include custom fiels in time entries API responses +* Feature #10207: Git: use default branch from HEAD +* Feature #10208: Estonian translation +* Feature #10253: Better handling of attachments when validation fails +* Feature #10350: Bulk copy should allow for changing the target version +* Feature #10607: Ignore out-of-office incoming emails +* Feature #10635: Adding time like "123 Min" is invalid +* Patch #9998: Make attachement "Optional Description" less wide +* Patch #10066: i18n not working with russian gem +* Patch #10128: Disable IE 8 compatibility mode to fix wrong div.autoscroll scroll bar behaviour +* Patch #10155: Russian translation changed +* Patch #10464: Enhanced PDF output for Issues list +* Patch #10470: Efficiently process new git revisions in a single batch +* Patch #10513: Dutch translation improvement + +== 2012-04-14 v1.3.3 + +* Defect #10505: Error when exporting to PDF with NoMethodError (undefined method `downcase' for nil:NilClass) +* Defect #10554: Defect symbols when exporting tasks in pdf +* Defect #10564: Unable to change locked, sticky flags and board when editing a message +* Defect #10591: Dutch "label_file_added" translation is wrong +* Defect #10622: "Default administrator account changed" is always true +* Patch #10555: rake redmine:send_reminders aborted if issue assigned to group +* Patch #10611: Simplified Chinese translations for 1.3-stable + +== 2012-03-11 v1.3.2 + +* Defect #8194: {{toc}} uses identical anchors for subsections with the same name +* Defect #9143: Partial diff comparison should be done on actual code, not on html +* Defect #9523: {{toc}} does not display headers with @ code markup +* Defect #9815: Release 1.3.0 does not detect rubytree with rubgems 1.8 +* Defect #10053: undefined method `<=>' for nil:NilClass when accessing the settings of a project +* Defect #10135: ActionView::TemplateError (can't convert Fixnum into String) +* Defect #10193: Unappropriate icons in highlighted code block +* Defect #10199: No wiki section edit when title contains code +* Defect #10218: Error when creating a project with a version custom field +* Defect #10241: "get version by ID" fails with "401 not authorized" error when using API access key +* Defect #10284: Note added by commit from a subproject does not contain project identifier +* Defect #10374: User list is empty when adding users to project / group if remaining users are added late +* Defect #10390: Mass assignment security vulnerability +* Patch #8413: Confirmation message before deleting a relationship +* Patch #10160: Bulgarian translation (r8777) +* Patch #10242: Migrate Redmine.pm from Digest::Sha1 to Digest::Sha +* Patch #10258: Italian translation for 1.3-stable + +== 2012-02-06 v1.3.1 + +* Defect #9775: app/views/repository/_revision_graph.html.erb sets window.onload directly.. +* Defect #9792: Ruby 1.9: [v1.3.0] Error: incompatible character encodings for it translation on Calendar page +* Defect #9793: Bad spacing between numbered list and heading (recently broken). +* Defect #9795: Unrelated error message when creating a group with an invalid name +* Defect #9832: Revision graph height should depend on height of rows in revisions table +* Defect #9937: Repository settings are not saved when all SCM are disabled +* Defect #9961: Ukrainian "default_tracker_bug" is wrong +* Defect #10013: Rest API - Create Version -> Internal server error 500 +* Defect #10115: Javascript error - Can't attach more than 1 file on IE 6 and 7 +* Defect #10130: Broken italic text style in edited comment preview +* Defect #10152: Attachment diff type is not saved in user preference +* Feature #9943: Arabic translation +* Patch #9874: pt-BR translation updates +* Patch #9922: Spanish translation updated +* Patch #10137: Korean language file ko.yml updated to Redmine 1.3.0 + +== 2011-12-10 v1.3.0 + +* Defect #2109: Context menu is being submitted twice per right click +* Defect #7717: MailHandler user creation for unknown_user impossible due to diverging length-limits of login and email fields +* Defect #7917: Creating users via email fails if user real name containes special chars +* Defect #7966: MailHandler does not include JournalDetail for attached files +* Defect #8368: Bad decimal separator in time entry CSV +* Defect #8371: MySQL error when filtering a custom field using the REST api +* Defect #8549: Export CSV has character encoding error +* Defect #8573: Do not show inactive Enumerations where not needed +* Defect #8611: rake/rdoctask is deprecated +* Defect #8751: Email notification: bug, when number of recipients more then 8 +* Defect #8894: Private issues - make it more obvious in the UI? +* Defect #8994: Hardcoded French string "anonyme" +* Defect #9043: Hardcoded string "diff" in Wiki#show and Repositories_Helper +* Defect #9051: wrong "text_issue_added" in russian translation. +* Defect #9108: Custom query not saving status filter +* Defect #9252: Regression: application title escaped 2 times +* Defect #9264: Bad Portuguese translation +* Defect #9470: News list is missing Avatars +* Defect #9471: Inline markup broken in Wiki link labels +* Defect #9489: Label all input field and control tags +* Defect #9534: Precedence: bulk email header is non standard and discouraged +* Defect #9540: Issue filter by assigned_to_role is not project specific +* Defect #9619: Time zone ignored when logging time while editing ticket +* Defect #9638: Inconsistent image filename extensions +* Defect #9669: Issue list doesn't sort assignees/authors regarding user display format +* Defect #9672: Message-quoting in forums module broken +* Defect #9719: Filtering by numeric custom field types broken after update to master +* Defect #9724: Can't remote add new categories +* Defect #9738: Setting of cross-project custom query is not remembered inside project +* Defect #9748: Error about configuration.yml validness should mention file path +* Feature #69: Textilized description in PDF +* Feature #401: Add pdf export for WIKI page +* Feature #1567: Make author column sortable and groupable +* Feature #2222: Single section edit. +* Feature #2269: Default issue start date should become configurable. +* Feature #2371: character encoding for attachment file +* Feature #2964: Ability to assign issues to groups +* Feature #3033: Bug Reporting: Using "Create and continue" should show bug id of saved bug +* Feature #3261: support attachment images in PDF export +* Feature #4264: Update CodeRay to 1.0 final +* Feature #4324: Redmine renames my files, it shouldn't. +* Feature #4729: Add Date-Based Filters for Issues List +* Feature #4742: CSV export: option to export selected or all columns +* Feature #4976: Allow rdm-mailhandler to read the API key from a file +* Feature #5501: Git: Mercurial: Adding visual merge/branch history to repository view +* Feature #5634: Export issue to PDF does not include Subtasks and Related Issues +* Feature #5670: Cancel option for file upload +* Feature #5737: Custom Queries available through the REST Api +* Feature #6180: Searchable custom fields do not provide adequate operators +* Feature #6954: Filter from date to date +* Feature #7180: List of statuses in REST API +* Feature #7181: List of trackers in REST API +* Feature #7366: REST API for Issue Relations +* Feature #7403: REST API for Versions +* Feature #7671: REST API for reading attachments +* Feature #7832: Ability to assign issue categories to groups +* Feature #8420: Consider removing #7013 workaround +* Feature #9196: Improve logging in MailHandler when user creation fails +* Feature #9496: Adds an option in mailhandler to disable server certificate verification +* Feature #9553: CRUD operations for "Issue categories" in REST API +* Feature #9593: HTML title should be reordered +* Feature #9600: Wiki links for news and forums +* Feature #9607: Filter for issues without start date (or any another field based on date type) +* Feature #9609: Upgrade to Rails 2.3.14 +* Feature #9612: "side by side" and "inline" patch view for attachments +* Feature #9667: Check attachment size before upload +* Feature #9690: Link in notification pointing to the actual update +* Feature #9720: Add note number for single issue's PDF +* Patch #8617: Indent subject of subtask ticket in exported issues PDF +* Patch #8778: Traditional Chinese 'issue' translation change +* Patch #9053: Fix up Russian translation +* Patch #9129: Improve wording of Git repository note at project setting +* Patch #9148: Better handling of field_due_date italian translation +* Patch #9273: Fix typos in russian localization +* Patch #9484: Limit SCM annotate to text files under the maximum file size for viewing +* Patch #9659: Indexing rows in auth_sources/index view +* Patch #9692: Fix Textilized description in PDF for CodeRay + +== 2011-12-10 v1.2.3 + +* Defect #8707: Reposman: wrong constant name +* Defect #8809: Table in timelog report overflows +* Defect #9055: Version files in Files module cannot be downloaded if issue tracking is disabled +* Defect #9137: db:encrypt fails to handle repositories with blank password +* Defect #9394: Custom date field only validating on regex and not a valid date +* Defect #9405: Any user with :log_time permission can edit time entries via context menu +* Defect #9448: The attached images are not shown in documents +* Defect #9520: Copied private query not visible after project copy +* Defect #9552: Error when reading ciphered text from the database without cipher key configured +* Defect #9566: Redmine.pm considers all projects private when login_required is enabled +* Defect #9567: Redmine.pm potential security issue with cache credential enabled and subversion +* Defect #9577: Deleting a subtasks doesn't update parent's rgt & lft values +* Defect #9597: Broken version links in wiki annotate history +* Defect #9682: Wiki HTML Export only useful when Access history is accessible +* Defect #9737: Custom values deleted before issue submit +* Defect #9741: calendar-hr.js (Croatian) is not UTF-8 +* Patch #9558: Simplified Chinese translation for 1.2.2 updated +* Patch #9695: Bulgarian translation (r7942) + +== 2011-11-11 v1.2.2 + +* Defect #3276: Incorrect handling of anchors in Wiki to HTML export +* Defect #7215: Wiki formatting mangles links to internal headers +* Defect #7613: Generated test instances may share the same attribute value object +* Defect #8411: Can't remove "Project" column on custom query +* Defect #8615: Custom 'version' fields don't show shared versions +* Defect #8633: Pagination counts non visible issues +* Defect #8651: Email attachments are not added to issues any more in v1.2 +* Defect #8825: JRuby + Windows: SCMs do not work on Redmine 1.2 +* Defect #8836: Additional workflow transitions not available when set to both author and assignee +* Defect #8865: Custom field regular expression is not validated +* Defect #8880: Error deleting issue with grandchild +* Defect #8884: Assignee is cleared when updating issue with locked assignee +* Defect #8892: Unused fonts in rfpdf plugin folder +* Defect #9161: pt-BR field_warn_on_leaving_unsaved has a small gramatical error +* Defect #9308: Search fails when a role haven't "view wiki" permission +* Defect #9465: Mercurial: can't browse named branch below Mercurial 1.5 + +== 2011-07-11 v1.2.1 + +* Defect #5089: i18N error on truncated revision diff view +* Defect #7501: Search options get lost after clicking on a specific result type +* Defect #8229: "project.xml" response does not include the parent ID +* Defect #8449: Wiki annotated page does not display author of version 1 +* Defect #8467: Missing german translation - Warn me when leaving a page with unsaved text +* Defect #8468: No warning when leaving page with unsaved text that has not lost focus +* Defect #8472: Private checkbox ignored on issue creation with "Set own issues public or private" permission +* Defect #8510: JRuby: Can't open administrator panel if scm command is not available +* Defect #8512: Syntax highlighter on Welcome page +* Defect #8554: Translation missing error on custom field validation +* Defect #8565: JRuby: Japanese PDF export error +* Defect #8566: Exported PDF UTF-8 Vietnamese not correct +* Defect #8569: JRuby: PDF export error with TypeError +* Defect #8576: Missing german translation - different things +* Defect #8616: Circular relations +* Defect #8646: Russian translation "label_follows" and "label_follows" are wrong +* Defect #8712: False 'Description updated' journal details messages +* Defect #8729: Not-public queries are not private +* Defect #8737: Broken line of long issue description on issue PDF. +* Defect #8738: Missing revision number/id of associated revisions on issue PDF +* Defect #8739: Workflow copy does not copy advanced workflow settings +* Defect #8759: Setting issue attributes from mail should be case-insensitive +* Defect #8777: Mercurial: Not able to Resetting Redmine project respository + +== 2011-05-30 v1.2.0 + +* Defect #61: Broken character encoding in pdf export +* Defect #1965: Redmine is not Tab Safe +* Defect #2274: Filesystem Repository path encoding of non UTF-8 characters +* Defect #2664: Mercurial: Repository path encoding of non UTF-8 characters +* Defect #3421: Mercurial reads files from working dir instead of changesets +* Defect #3462: CVS: Repository path encoding of non UTF-8 characters +* Defect #3715: Login page should not show projects link and search box if authentication is required +* Defect #3724: Mercurial repositories display revision ID instead of changeset ID +* Defect #3761: Most recent CVS revisions are missing in "revisions" view +* Defect #4270: CVS Repository view in Project doesn't show Author, Revision, Comment +* Defect #5138: Don't use Ajax for pagination +* Defect #5152: Cannot use certain characters for user and role names. +* Defect #5251: Git: Repository path encoding of non UTF-8 characters +* Defect #5373: Translation missing when adding invalid watchers +* Defect #5817: Shared versions not shown in subproject's gantt chart +* Defect #6013: git tab,browsing, very slow -- even after first time +* Defect #6148: Quoting, newlines, and nightmares... +* Defect #6256: Redmine considers non ASCII and UTF-16 text files as binary in SCM +* Defect #6476: Subproject's issues are not shown in the subproject's gantt +* Defect #6496: Remove i18n 0.3.x/0.4.x hack for Rails 2.3.5 +* Defect #6562: Context-menu deletion of issues deletes all subtasks too without explicit prompt +* Defect #6604: Issues targeted at parent project versions' are not shown on gantt chart +* Defect #6706: Resolving issues with the commit message produces the wrong comment with CVS +* Defect #6901: Copy/Move an issue does not give any history of who actually did the action. +* Defect #6905: Specific heading-content breaks CSS +* Defect #7000: Project filter not applied on versions in Gantt chart +* Defect #7097: Starting day of week cannot be set to Saturday +* Defect #7114: New gantt doesn't display some projects +* Defect #7146: Git adapter lost commits before 7 days from database latest changeset +* Defect #7218: Date range error on issue query +* Defect #7257: "Issues by" version links bad criterias +* Defect #7279: CSS class ".icon-home" is not used. +* Defect #7320: circular dependency >2 issues +* Defect #7352: Filters not working in Gantt charts +* Defect #7367: Receiving pop3 email should not output debug messages +* Defect #7373: Error with PDF output and ruby 1.9.2 +* Defect #7379: Remove extraneous hidden_field on wiki history +* Defect #7516: Redmine does not work with RubyGems 1.5.0 +* Defect #7518: Mercurial diff can be wrong if the previous changeset isn't the parent +* Defect #7581: Not including a spent time value on the main issue update screen causes silent data loss +* Defect #7582: hiding form pages from search engines +* Defect #7597: Subversion and Mercurial log have the possibility to miss encoding +* Defect #7604: ActionView::TemplateError (undefined method `name' for nil:NilClass) +* Defect #7605: Using custom queries always redirects to "Issues" tab +* Defect #7615: CVS diffs do not handle new files properly +* Defect #7618: SCM diffs do not handle one line new files properly +* Defect #7639: Some date fields do not have requested format. +* Defect #7657: Wrong commit range in git log command on Windows +* Defect #7818: Wiki pages don't use the local timezone to display the "Updated ? hours ago" mouseover +* Defect #7821: Git "previous" and "next" revisions are incorrect +* Defect #7827: CVS: Age column on repository view is off by timezone delta +* Defect #7843: Add a relation between issues = explicit login window ! (basic authentication popup is prompted on AJAX request) +* Defect #8011: {{toc}} does not display headlines with inline code markup +* Defect #8029: List of users for adding to a group may be empty if 100 first users have been added +* Defect #8064: Text custom fields do not wrap on the issue list +* Defect #8071: Watching a subtask from the context menu updates main issue watch link +* Defect #8072: Two untranslatable default role names +* Defect #8075: Some "notifiable" names are not i18n-enabled +* Defect #8081: GIT: Commits missing when user has the "decorate" git option enabled +* Defect #8088: Colorful indentation of subprojects must be on right in RTL locales +* Defect #8239: notes field is not propagated during issue copy +* Defect #8356: GET /time_entries.xml ignores limit/offset parameters +* Defect #8432: Private issues information shows up on Activity page for unauthorized users +* Feature #746: Versioned issue descriptions +* Feature #1067: Differentiate public/private saved queries in the sidebar +* Feature #1236: Make destination folder for attachment uploads configurable +* Feature #1735: Per project repository log encoding setting +* Feature #1763: Autologin-cookie should be configurable +* Feature #1981: display mercurial tags +* Feature #2074: Sending email notifications when comments are added in the news section +* Feature #2096: Custom fields referencing system tables (users and versions) +* Feature #2732: Allow additional workflow transitions for author and assignee +* Feature #2910: Warning on leaving edited issue/wiki page without saving +* Feature #3396: Git: use --encoding=UTF-8 in "git log" +* Feature #4273: SCM command availability automatic check in administration panel +* Feature #4477: Use mime types in downloading from repository +* Feature #5518: Graceful fallback for "missing translation" needed +* Feature #5520: Text format buttons and preview link missing when editing comment +* Feature #5831: Parent Task to Issue Bulk Edit +* Feature #6887: Upgrade to Rails 2.3.11 +* Feature #7139: Highlight changes inside diff lines +* Feature #7236: Collapse All for Groups +* Feature #7246: Handle "named branch" for mercurial +* Feature #7296: Ability for admin to delete users +* Feature #7318: Add user agent to Redmine Mailhandler +* Feature #7408: Add an application configuration file +* Feature #7409: Cross project Redmine links +* Feature #7410: Add salt to user passwords +* Feature #7411: Option to cipher LDAP ans SCM passwords stored in the database +* Feature #7412: Add an issue visibility level to each role +* Feature #7414: Private issues +* Feature #7517: Configurable path of executable for scm adapters +* Feature #7640: Add "mystery man" gravatar to options +* Feature #7858: RubyGems 1.6 support +* Feature #7893: Group filter on the users list +* Feature #7899: Box for editing comments should open with the formatting toolbar +* Feature #7921: issues by pulldown should have 'status' option +* Feature #7996: Bulk edit and context menu for time entries +* Feature #8006: Right click context menu for Related Issues +* Feature #8209: I18n YAML files not parsable with psych yaml library +* Feature #8345: Link to user profile from account page +* Feature #8365: Git: per project setting to report last commit or not in repository tree +* Patch #5148: metaKey not handled in issues selection +* Patch #5629: Wrap text fields properly in PDF +* Patch #7418: Redmine Persian Translation +* Patch #8295: Wrap title fields properly in PDF +* Patch #8310: fixes automatic line break problem with TCPDF +* Patch #8312: Switch to TCPDF from FPDF for PDF export + +== 2011-04-29 v1.1.3 + +* Defect #5773: Email reminders are sent to locked users +* Defect #6590: Wrong file list link in email notification on new file upload +* Defect #7589: Wiki page with backslash in title can not be found +* Defect #7785: Mailhandler keywords are not removed when updating issues +* Defect #7794: Internal server error on formatting an issue as a PDF in Japanese +* Defect #7838: Gantt- Issues does not show up in green when start and end date are the same +* Defect #7846: Headers (h1, etc.) containing backslash followed by a digit are not displayed correctly +* Defect #7875: CSV export separators in polish locale (pl.yml) +* Defect #7890: Internal server error when referencing an issue without project in commit message +* Defect #7904: Subprojects not properly deleted when deleting a parent project +* Defect #7939: Simultaneous Wiki Updates Cause Internal Error +* Defect #7951: Atom links broken on wiki index +* Defect #7954: IE 9 can not select issues, does not display context menu +* Defect #7985: Trying to do a bulk edit results in "Internal Error" +* Defect #8003: Error raised by reposman.rb under Windows server 2003 +* Defect #8012: Wrong selection of modules when adding new project after validation error +* Defect #8038: Associated Revisions OL/LI items are not styled properly in issue view +* Defect #8067: CSV exporting in Italian locale +* Defect #8235: bulk edit issues and copy issues error in es, gl and ca locales +* Defect #8244: selected modules are not activated when copying a project +* Patch #7278: Update Simplified Chinese translation to 1.1 +* Patch #7390: Fixes in Czech localization +* Patch #7963: Reminder email: Link for show all issues does not sort + +== 2011-03-07 v1.1.2 + +* Defect #3132: Bulk editing menu non-functional in Opera browser +* Defect #6090: Most binary files become corrupted when downloading from CVS repository browser when Redmine is running on a Windows server +* Defect #7280: Issues subjects wrap in Gantt +* Defect #7288: Non ASCII filename downloaded from repo is broken on Internet Explorer. +* Defect #7317: Gantt tab gives internal error due to nil avatar icon +* Defect #7497: Aptana Studio .project file added to version 1.1.1-stable +* Defect #7611: Workflow summary shows X icon for workflow with exactly 1 status transition +* Defect #7625: Syntax highlighting unavailable from board new topic or topic edit preview +* Defect #7630: Spent time in commits not recognized +* Defect #7656: MySQL SQL Syntax Error when filtering issues by Assignee's Group +* Defect #7718: Minutes logged in commit message are converted to hours +* Defect #7763: Email notification are sent to watchers even if 'No events' setting is chosen +* Feature #7608: Add "retro" gravatars +* Patch #7598: Extensible MailHandler +* Patch #7795: Internal server error at journals#index with custom fields + +== 2011-01-30 v1.1.1 + +* Defect #4899: Redmine fails to list files for darcs repository +* Defect #7245: Wiki fails to find pages with cyrillic characters using postgresql +* Defect #7256: redmine/public/.htaccess must be moved for non-fastcgi installs/upgrades +* Defect #7258: Automatic spent time logging does not work properly with SQLite3 +* Defect #7259: Released 1.1.0 uses "devel" label inside admin information +* Defect #7265: "Loading..." icon does not disappear after add project member +* Defect #7266: Test test_due_date_distance_in_words fail due to undefined locale +* Defect #7274: CSV value separator in dutch locale +* Defect #7277: Enabling gravatas causes usernames to overlap first name field in user list +* Defect #7294: "Notifiy for only project I select" is not available anymore in 1.1.0 +* Defect #7307: HTTP 500 error on query for empty revision +* Defect #7313: Label not translated in french in Settings/Email Notification tab +* Defect #7329: with long strings may hang server +* Defect #7337: My page french translation +* Defect #7348: French Translation of "Connection" +* Defect #7385: Error when viewing an issue which was related to a deleted subtask +* Defect #7386: NoMethodError on pdf export +* Defect #7415: Darcs adapter recognizes new files as modified files above Darcs 2.4 +* Defect #7421: no email sent with 'Notifiy for any event on the selected projects only' +* Feature #5344: Update to latest CodeRay 0.9.x + +== 2011-01-09 v1.1.0 + +* Defect #2038: Italics in wiki headers show-up wrong in the toc +* Defect #3449: Redmine Takes Too Long On Large Mercurial Repository +* Defect #3567: Sorting for changesets might go wrong on Mercurial repos +* Defect #3707: {{toc}} doesn't work with {{include}} +* Defect #5096: Redmine hangs up while browsing Git repository +* Defect #6000: Safe Attributes prevents plugin extension of Issue model... +* Defect #6064: Modules not assigned to projects created via API +* Defect #6110: MailHandler should allow updating Issue Priority and Custom fields +* Defect #6136: JSON API holds less information than XML API +* Defect #6345: xml used by rest API is invalid +* Defect #6348: Gantt chart PDF rendering errors +* Defect #6403: Updating an issue with custom fields fails +* Defect #6467: "Member of role", "Member of group" filter not work correctly +* Defect #6473: New gantt broken after clearing issue filters +* Defect #6541: Email notifications send to everybody +* Defect #6549: Notification settings not migrated properly +* Defect #6591: Acronyms must have a minimum of three characters +* Defect #6674: Delete time log broken after changes to REST +* Defect #6681: Mercurial, Bazaar and Darcs auto close issue text should be commit id instead of revision number +* Defect #6724: Wiki uploads does not work anymore (SVN 4266) +* Defect #6746: Wiki links are broken on Activity page +* Defect #6747: Wiki diff does not work since r4265 +* Defect #6763: New gantt charts: subject displayed twice on issues +* Defect #6826: Clicking "Add" twice creates duplicate member record +* Defect #6844: Unchecking status filter on the issue list has no effect +* Defect #6895: Wrong Polish translation of "blocks" +* Defect #6943: Migration from boolean to varchar fails on PostgreSQL 8.1 +* Defect #7064: Mercurial adapter does not recognize non alphabetic nor numeric in UTF-8 copied files +* Defect #7128: New gantt chart does not render subtasks under parent task +* Defect #7135: paging mechanism returns the same last page forever +* Defect #7188: Activity page not refreshed when changing language +* Defect #7195: Apply CLI-supplied defaults for incoming mail only to new issues not replies +* Defect #7197: Tracker reset to default when replying to an issue email +* Defect #7213: Copy project does not copy all roles and permissions +* Defect #7225: Project settings: Trackers & Custom fields only relevant if module Issue tracking is active +* Feature #630: Allow non-unique names for projects +* Feature #1738: Add a "Visible" flag to project/user custom fields +* Feature #2803: Support for Javascript in Themes +* Feature #2852: Clean Incoming Email of quoted text "----- Reply above this line ------" +* Feature #2995: Improve error message when trying to access an archived project +* Feature #3170: Autocomplete issue relations on subject +* Feature #3503: Administrator Be Able To Modify Email settings Of Users +* Feature #4155: Automatic spent time logging from commit messages +* Feature #5136: Parent select on Wiki rename page +* Feature #5338: Descendants (subtasks) should be available via REST API +* Feature #5494: Wiki TOC should display heading from level 4 +* Feature #5594: Improve MailHandler's keyword handling +* Feature #5622: Allow version to be set via incoming email +* Feature #5712: Reload themes +* Feature #5869: Issue filters by Group and Role +* Feature #6092: Truncate Git revision labels in Activity page/feed and allow configurable length +* Feature #6112: Accept localized keywords when receiving emails +* Feature #6140: REST issues response with issue count limit and offset +* Feature #6260: REST API for Users +* Feature #6276: Gantt Chart rewrite +* Feature #6446: Remove length limits on project identifier and name +* Feature #6628: Improvements in truncate email +* Feature #6779: Project JSON API +* Feature #6823: REST API for time tracker. +* Feature #7072: REST API for news +* Feature #7111: Expose more detail on journal entries +* Feature #7141: REST API: get information about current user +* Patch #4807: Allow to set the done_ratio field with the incoming mail system +* Patch #5441: Initialize TimeEntry attributes with params[:time_entry] +* Patch #6762: Use GET instead of POST to retrieve context_menu +* Patch #7160: French translation ofr "not_a_date" is missing +* Patch #7212: Missing remove_index in AddUniqueIndexOnMembers down migration + + +== 2010-12-23 v1.0.5 + +* #6656: Mercurial adapter loses seconds of commit times +* #6996: Migration trac(sqlite3) -> redmine(postgresql) doesnt escape ' char +* #7013: v-1.0.4 trunk - see {{count}} in page display rather than value +* #7016: redundant 'field_start_date' in ja.yml +* #7018: 'undefined method `reschedule_after' for nil:NilClass' on new issues +* #7024: E-mail notifications about Wiki changes. +* #7033: 'class' attribute of
         tag shouldn't be truncate
        +* #7035: CSV value separator in russian
        +* #7122: Issue-description Quote-button missing
        +* #7144: custom queries making use of deleted custom fields cause a 500 error
        +* #7162: Multiply defined label in french translation
        +
        +== 2010-11-28 v1.0.4
        +
        +* #5324: Git not working if color.ui is enabled
        +* #6447: Issues API doesn't allow full key auth for all actions
        +* #6457: Edit User group problem
        +* #6575: start date being filled with current date even when blank value is submitted
        +* #6740: Max attachment size, incorrect usage of 'KB'
        +* #6760: Select box sorted by ID instead of name in Issue Category
        +* #6766: Changing target version name can cause an internal error
        +* #6784: Redmine not working with i18n gem 0.4.2
        +* #6839: Hardcoded absolute links in my/page_layout
        +* #6841: Projects API doesn't allow full key auth for all actions
        +* #6860: svn: Write error: Broken pipe when browsing repository
        +* #6874: API should return XML description when creating a project
        +* #6932: submitting wrong parent task input creates a 500 error
        +* #6966: Records of Forums are remained, deleting project
        +* #6990: Layout problem in workflow overview
        +* #5117: mercurial_adapter should ensure the right LANG environment variable
        +* #6782: Traditional Chinese language file (to r4352)
        +* #6783: Swedish Translation for r4352
        +* #6804: Bugfix: spelling fixes
        +* #6814: Japanese Translation for r4362
        +* #6948: Bulgarian translation
        +* #6973: Update es.yml
        +
        +== 2010-10-31 v1.0.3
        +
        +* #4065: Redmine.pm doesn't work with LDAPS and a non-standard port
        +* #4416: Link from version details page to edit the wiki.
        +* #5484: Add new issue as subtask to an existing ticket
        +* #5948: Update help/wiki_syntax_detailed.html with more link options
        +* #6494: Typo in pt_BR translation for 1.0.2
        +* #6508: Japanese translation update
        +* #6509: Localization pt-PT (new strings)
        +* #6511: Rake task to test email
        +* #6525: Traditional Chinese language file (to r4225)
        +* #6536: Patch for swedish translation
        +* #6548: Rake tasks to add/remove i18n strings
        +* #6569: Updated Hebrew translation
        +* #6570: Japanese Translation for r4231
        +* #6596: pt-BR translation updates
        +* #6629: Change field-name of issues start date
        +* #6669: Bulgarian translation
        +* #6731: Macedonian translation fix
        +* #6732: Japanese Translation for r4287
        +* #6735: Add user-agent to reposman
        +* #6736: Traditional Chinese language file (to r4288)
        +* #6739: Swedish Translation for r4288
        +* #6765: Traditional Chinese language file (to r4302)
        +* Fixed #5324: Git not working if color.ui is enabled
        +* Fixed #5652: Bad URL parsing in the wiki when it ends with right-angle-bracket(greater-than mark).
        +* Fixed #5803: Precedes/Follows Relationships Broke
        +* Fixed #6435: Links to wikipages bound to versions do not respect version-sharing in Settings -> Versions
        +* Fixed #6438: Autologin cannot be disabled again once it's enabled
        +* Fixed #6513: "Move" and "Copy" are not displayed when deployed in subdirectory
        +* Fixed #6521: Tooltip/label for user "search-refinment" field on group/project member list
        +* Fixed #6563: i18n-issues on calendar view
        +* Fixed #6598: Wrong caption for button_create_and_continue in German language file
        +* Fixed #6607: Unclear caption for german button_update
        +* Fixed #6612: SortHelper missing from CalendarsController
        +* Fixed #6740: Max attachment size, incorrect usage of 'KB'
        +* Fixed #6750: ActionView::TemplateError (undefined method `empty?' for nil:NilClass) on line #12 of app/views/context_menus/issues.html.erb:
        +
        +== 2010-09-26 v1.0.2
        +
        +* #2285: issue-refinement: pressing enter should result to an "apply"
        +* #3411: Allow mass status update trough context menu
        +* #5929: https-enabled gravatars when called over https
        +* #6189: Japanese Translation for r4011
        +* #6197: Traditional Chinese language file (to r4036)
        +* #6198: Updated german translation
        +* #6208: Macedonian translation
        +* #6210: Swedish Translation for r4039
        +* #6248: nl translation update for r4050
        +* #6263: Catalan translation update
        +* #6275: After submitting a related issue, the Issue field should be re-focused
        +* #6289: Checkboxes in issues list shouldn't be displayed when printing
        +* #6290: Make journals theming easier
        +* #6291: User#allowed_to? is not tested
        +* #6306: Traditional Chinese language file (to r4061)
        +* #6307: Korean translation update for 4066(4061)
        +* #6316: pt_BR update
        +* #6339: SERBIAN Updated
        +* #6358: Updated Polish translation
        +* #6363: Japanese Translation for r4080
        +* #6365: Traditional Chinese language file (to r4081)
        +* #6382: Issue PDF export variable usage
        +* #6428: Interim solution for i18n >= 0.4
        +* #6441: Japanese Translation for r4162
        +* #6451: Traditional Chinese language file (to r4167)
        +* #6465: Japanese Translation for r4171
        +* #6466: Traditional Chinese language file (to r4171)
        +* #6490: pt-BR translation for 1.0.2
        +* Fixed #3935: stylesheet_link_tag with plugin doesn't take into account relative_url_root
        +* Fixed #4998: Global issue list's context menu has enabled options for parent menus but there are no valid selections
        +* Fixed #5170: Done ratio can not revert to 0% if status is used for done ratio
        +* Fixed #5608: broken with i18n 0.4.0
        +* Fixed #6054: Error 500 on filenames with whitespace in git reposities
        +* Fixed #6135: Default logger configuration grows without bound.
        +* Fixed #6191: Deletion of a main task deletes all subtasks
        +* Fixed #6195: Missing move issues between projects
        +* Fixed #6242: can't switch between inline and side-by-side diff
        +* Fixed #6249: Create and continue returns 404
        +* Fixed #6267: changing the authentication mode from ldap to internal with setting the password
        +* Fixed #6270: diff coderay malformed in the "news" page
        +* Fixed #6278: missing "cant_link_an_issue_with_a_descendant"from locale files
        +* Fixed #6333: Create and continue results in a 404 Error
        +* Fixed #6346: Age column on repository view is skewed for git, probably CVS too
        +* Fixed #6351: Context menu on roadmap broken
        +* Fixed #6388: New Subproject leads to a 404
        +* Fixed #6392: Updated/Created links to activity broken
        +* Fixed #6413: Error in SQL
        +* Fixed #6443: Redirect to project settings after Copying a Project
        +* Fixed #6448: Saving a wiki page with no content has a translation missing
        +* Fixed #6452: Unhandled exception on creating File
        +* Fixed #6471: Typo in label_report in Czech translation
        +* Fixed #6479: Changing tracker type will lose watchers
        +* Fixed #6499: Files with leading or trailing whitespace are not shown in git.
        +
        +== 2010-08-22 v1.0.1
        +
        +* #819: Add a body ID and class to all pages
        +* #871: Commit new CSS styles!
        +* #3301: Add favicon to base layout
        +* #4656: On Issue#show page, clicking on "Add related issue" should focus on the input
        +* #4896: Project identifier should be a limited field
        +* #5084: Filter all isssues by projects
        +* #5477: Replace Test::Unit::TestCase with ActiveSupport::TestCase
        +* #5591: 'calendar' action is used with 'issue' controller in issue/sidebar
        +* #5735: Traditional Chinese language file (to r3810)
        +* #5740: Swedish Translation for r3810
        +* #5785: pt-BR translation update
        +* #5898: Projects should be displayed as links in users/memberships
        +* #5910: Chinese translation to redmine-1.0.0
        +* #5912: Translation update for french locale
        +* #5962: Hungarian translation update to r3892
        +* #5971: Remove falsly applied chrome on revision links
        +* #5972: Updated Hebrew translation for 1.0.0
        +* #5982: Updated german translation
        +* #6008: Move admin_menu to Redmine::MenuManager
        +* #6012: RTL layout
        +* #6021: Spanish translation 1.0.0-RC
        +* #6025: nl translation updated for r3905
        +* #6030: Japanese Translation for r3907
        +* #6074: sr-CY.yml contains DOS-type newlines (\r\n)
        +* #6087: SERBIAN translation updated
        +* #6093: Updated italian translation
        +* #6142: Swedish Translation for r3940
        +* #6153: Move view_calendar and view_gantt to own modules
        +* #6169: Add issue status to issue tooltip
        +* Fixed #3834: Add a warning when not choosing a member role
        +* Fixed #3922: Bad english arround "Assigned to" text in journal entries
        +* Fixed #5158: Simplified Chinese language file zh.yml updated to r3608
        +* Fixed #5162: translation missing: zh-TW, field_time_entrie
        +* Fixed #5297: openid not validated correctly
        +* Fixed #5628: Wrong commit range in git log command
        +* Fixed #5760: Assigned_to and author filters in "Projects>View all issues" should be based on user's project visibility
        +* Fixed #5771: Problem when importing git repository
        +* Fixed #5775: ldap authentication in admin menu should have an icon
        +* Fixed #5811: deleting statuses doesnt delete workflow entries
        +* Fixed #5834: Emails with trailing spaces incorrectly detected as invalid
        +* Fixed #5846: ChangeChangesPathLengthLimit does not remove default for MySQL
        +* Fixed #5861: Vertical scrollbar always visible in Wiki "code" blocks in Chrome.
        +* Fixed #5883: correct label_project_latest Chinese translation
        +* Fixed #5892: Changing status from contextual menu opens the ticket instead
        +* Fixed #5904: Global gantt PDF and PNG should display project names
        +* Fixed #5925: parent task's priority edit should be disabled through shortcut menu in issues list page
        +* Fixed #5935: Add Another file to ticket doesn't work in IE Internet Explorer
        +* Fixed #5937: Harmonize french locale "zero" translation with other locales
        +* Fixed #5945: Forum message permalinks don't take pagination into account
        +* Fixed #5978: Debug code still remains
        +* Fixed #6009: When using "English (British)", the repository browser (svn) shows files over 1000 bytes as floating point (2.334355)
        +* Fixed #6045: Repository file Diff view sometimes shows more than selected file
        +* Fixed #6079: German Translation error in TimeEntryActivity
        +* Fixed #6100: User's profile should display all visible projects
        +* Fixed #6132: Allow Key based authentication in the Boards atom feed
        +* Fixed #6163: Bad CSS class for calendar project menu_item
        +* Fixed #6172: Browsing to a missing user's page shows the admin sidebar
        +
        +== 2010-07-18 v1.0.0 (Release candidate)
        +
        +* #443: Adds context menu to the roadmap issue lists
        +* #443: Subtasking
        +* #741: Description preview while editing an issue
        +* #1131: Add support for alternate (non-LDAP) authentication
        +* #1214: REST API for Issues
        +* #1223: File upload on wiki edit form
        +* #1755: add "blocked by" as a related issues option
        +* #2420: Fetching emails from an POP server
        +* #2482: Named scopes in Issue and ActsAsWatchable plus some view refactoring (logic extraction).
        +* #2924: Make the right click menu more discoverable using a cursor property
        +* #2985: Make syntax highlighting pluggable
        +* #3201: Workflow Check/Uncheck All Rows/Columns
        +* #3359: Update CodeRay 0.9
        +* #3706: Allow assigned_to field configuration on Issue creation by email
        +* #3936: configurable list of models to include in search
        +* #4480: Create a link to the user profile from the administration interface
        +* #4482: Cache textile rendering
        +* #4572: Make it harder to ruin your database
        +* #4573: Move github gems to Gemcutter
        +* #4664: Add pagination to forum threads
        +* #4732: Make login case-insensitive also for PostgreSQL
        +* #4812: Create links to other projects
        +* #4819: Replace images with smushed ones for speed
        +* #4945: Allow custom fields attached to project to be searchable
        +* #5121: Fix issues list layout overflow
        +* #5169: Issue list view hook request
        +* #5208: Aibility to edit wiki sidebar
        +* #5281: Remove empty ul tags in the issue history
        +* #5291: Updated basque translations
        +* #5328: Automatically add "Repository" menu_item after repository creation
        +* #5415: Fewer SQL statements generated for watcher_recipients
        +* #5416: Exclude "fields_for" from overridden methods in TabularFormBuilder
        +* #5573: Allow issue assignment in email
        +* #5595: Allow start date and due dates to be set via incoming email
        +* #5752: The projects view (/projects) renders ul's wrong
        +* #5781: Allow to use more macros on the welcome page and project list
        +* Fixed #1288: Unable to past escaped wiki syntax in an issue description
        +* Fixed #1334: Wiki formatting character *_ and _*
        +* Fixed #1416: Inline code with less-then/greater-than produces @lt; and @gt; respectively
        +* Fixed #2473: Login and mail should not be case sensitive
        +* Fixed #2990: Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate
        +* Fixed #3089: Text formatting sometimes breaks when combined
        +* Fixed #3690: Status change info duplicates on the issue screen
        +* Fixed #3691: Redmine allows two files with the same file name to be uploaded to the same issue
        +* Fixed #3764: ApplicationHelperTest fails with JRuby
        +* Fixed #4265: Unclosed code tags in issue descriptions affects main UI
        +* Fixed #4745: Bug in index.xml.builder (issues)
        +* Fixed #4852: changing user/roles of project member not possible without javascript
        +* Fixed #4857: Week number calculation in date picker is wrong if a week starts with Sunday
        +* Fixed #4883: Bottom "contextual" placement in issue with associated changeset
        +* Fixed #4918: Revisions r3453 and r3454 broke On-the-fly user creation with LDAP
        +* Fixed #4935: Navigation to the Master Timesheet page (time_entries)
        +* Fixed #5043: Flash messages are not displayed after the project settings[module/activity] saved
        +* Fixed #5081: Broken links on public/help/wiki_syntax_detailed.html
        +* Fixed #5104: Description of document not wikified on documents index
        +* Fixed #5108: Issue linking fails inside of []s
        +* Fixed #5199: diff code coloring using coderay
        +* Fixed #5233: Add a hook to the issue report (Summary) view
        +* Fixed #5265: timetracking: subtasks time is added to the main task
        +* Fixed #5343: acts_as_event Doesn't Accept Outside URLs
        +* Fixed #5440: UI Inconsistency : Administration > Enumerations table row headers should be enclosed in 
        +* Fixed #5463: 0.9.4 INSTALL and/or UPGRADE, missing session_store.rb
        +* Fixed #5524: Update_parent_attributes doesn't work for the old parent issue when reparenting
        +* Fixed #5548: SVN Repository: Can not list content of a folder which includes square brackets.
        +* Fixed #5589: "with subproject" malfunction
        +* Fixed #5676: Search for Numeric Value
        +* Fixed #5696: Redmine + PostgreSQL 8.4.4 fails on _dir_list_content.rhtml
        +* Fixed #5698: redmine:email:receive_imap fails silently for mails with subject longer than 255 characters
        +* Fixed #5700: TimelogController#destroy assumes success
        +* Fixed #5751: developer role is mispelled
        +* Fixed #5769: Popup Calendar doesn't Advance in Chrome
        +* Fixed #5771: Problem when importing git repository
        +* Fixed #5823: Error in comments in plugin.rb
        +
        +
        +== 2010-07-07 v0.9.6
        +
        +* Fixed: Redmine.pm access by unauthorized users
        +
        +== 2010-06-24 v0.9.5
        +
        +* Linkify folder names on revision view
        +* "fiters" and "options" should be hidden in print view via css
        +* Fixed: NoMethodError when no issue params are submitted
        +* Fixed: projects.atom with required authentication
        +* Fixed: External links not correctly displayed in Wiki TOC
        +* Fixed: Member role forms in project settings are not hidden after member added
        +* Fixed: pre can't be inside p
        +* Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT
        +* Fixed: mail handler fails when the from address is empty
        +
        +
        +== 2010-05-01 v0.9.4
        +
        +* Filters collapsed by default on issues index page for a saved query
        +* Fixed: When categories list is too big the popup menu doesn't adjust (ex. in the issue list)
        +* Fixed: remove "main-menu" div when the menu is empty
        +* Fixed: Code syntax highlighting not working in Document page
        +* Fixed: Git blame/annotate fails on moved files
        +* Fixed: Failing test in test_show_atom
        +* Fixed: Migrate from trac - not displayed Wikis
        +* Fixed: Email notifications on file upload sent to empty recipient list
        +* Fixed: Migrating from trac is not possible, fails to allocate memory
        +* Fixed: Lost password no longer flashes a confirmation message
        +* Fixed: Crash while deleting in-use enumeration
        +* Fixed: Hard coded English string at the selection of issue watchers
        +* Fixed: Bazaar v2.1.0 changed behaviour
        +* Fixed: Roadmap display can raise an exception if no trackers are selected
        +* Fixed: Gravatar breaks layout of "logged in" page
        +* Fixed: Reposman.rb on Windows
        +* Fixed: Possible error 500 while moving an issue to another project with SQLite
        +* Fixed: backslashes in issue description/note should be escaped when quoted
        +* Fixed: Long text in 
         disrupts Associated revisions
        +* Fixed: Links to missing wiki pages not red on project overview page
        +* Fixed: Cannot delete a project with subprojects that shares versions
        +* Fixed: Update of Subversion changesets broken under Solaris
        +* Fixed: "Move issues" permission not working for Non member
        +* Fixed: Sidebar overlap on Users tab of Group editor
        +* Fixed: Error on db:migrate with table prefix set (hardcoded name in principal.rb)
        +* Fixed: Report shows sub-projects for non-members
        +* Fixed: 500 internal error when browsing any Redmine page in epiphany
        +* Fixed: Watchers selection lost when issue creation fails
        +* Fixed: When copying projects, redmine should not generate an email to people who created issues
        +* Fixed: Issue "#" table cells should have a class attribute to enable fine-grained CSS theme
        +* Fixed: Plugin generators should display help if no parameter is given
        +
        +
        +== 2010-02-28 v0.9.3
        +
        +* Adds filter for system shared versions on the cross project issue list
        +* Makes project identifiers searchable
        +* Remove invalid utf8 sequences from commit comments and author name
        +* Fixed: Wrong link when "http" not included in project "Homepage" link
        +* Fixed: Escaping in html email templates
        +* Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki
        +* Fixed: Deselecting textile text formatting causes interning empty string errors
        +* Fixed: error with postgres when entering a non-numeric id for an issue relation
        +* Fixed: div.task incorrectly wrapping on Gantt Chart
        +* Fixed: Project copy loses wiki pages hierarchy
        +* Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project
        +* Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects
        +* Fixed: Duplicated project name for subproject version on gantt chart
        +* Fixed: roadmap shows subprojects issues even if subprojects is unchecked
        +* Fixed: IndexError if all the :last menu items are deleted from a menu
        +* Fixed: Very high CPU usage for a long time when fetching commits from a large Git repository
        +
        +
        +== 2010-02-07 v0.9.2
        +
        +* Fixed: Sub-project repository commits not displayed on parent project issues
        +* Fixed: Potential security leak on my page calendar
        +* Fixed: Project tree structure is broken by deleting the project with the subproject
        +* Fixed: Error message shown duplicated when creating a new group
        +* Fixed: Firefox cuts off large pages
        +* Fixed: Invalid format parameter returns a DoubleRenderError on issues index
        +* Fixed: Unnecessary Quote button on locked forum message
        +* Fixed: Error raised when trying to view the gantt or calendar with a grouped query
        +* Fixed: PDF support for Korean locale
        +* Fixed: Deprecation warning in extra/svn/reposman.rb
        +
        +
        +== 2010-01-30 v0.9.1
        +
        +* Vertical alignment for inline images in formatted text set to 'middle'
        +* Fixed: Redmine.pm error "closing dbh with active statement handles at /usr/lib/perl5/Apache/Redmine.pm"
        +* Fixed: copyright year in footer set to 2010
        +* Fixed: Trac migration script may not output query lines
        +* Fixed: Email notifications may affect language of notice messages on the UI
        +* Fixed: Can not search for 2 letters word
        +* Fixed: Attachments get saved on issue update even if validation fails
        +* Fixed: Tab's 'border-bottom' not absent when selected
        +* Fixed: Issue summary tables that list by user are not sorted
        +* Fixed: Issue pdf export fails if target version is set
        +* Fixed: Issue list export to PDF breaks when issues are sorted by a custom field
        +* Fixed: SQL error when adding a group
        +* Fixes: Min password length during password reset always displays as 4 chars
        +
        +
        +== 2010-01-09 v0.9.0 (Release candidate)
        +
        +* Unlimited subproject nesting
        +* Multiple roles per user per project
        +* User groups
        +* Inheritence of versions
        +* OpenID login
        +* "Watched by me" issue filter
        +* Project copy
        +* Project creation by non admin users
        +* Accept emails from anyone on a private project
        +* Add email notification on Wiki changes
        +* Make issue description non-required field
        +* Custom fields for Versions
        +* Being able to sort the issue list by custom fields
        +* Ability to close versions
        +* User display/editing of custom fields attached to their user profile
        +* Add "follows" issue relation
        +* Copy workflows between trackers and roles
        +* Defaults enabled modules list for project creation
        +* Weighted version completion percentage on the roadmap
        +* Autocreate user account when user submits email that creates new issue
        +* CSS class on overdue issues on the issue list
        +* Enable tracker update on issue edit form
        +* Remove issue watchers
        +* Ability to move threads between project forums
        +* Changed custom field "Possible values" to a textarea
        +* Adds projects association on tracker form
        +* Set session store to cookie store by default
        +* Set a default wiki page on project creation
        +* Roadmap for main project should see Roadmaps for sub projects
        +* Ticket grouping on the issue list
        +* Hierarchical Project links in the page header
        +* Allow My Page blocks to be added to from a plugin
        +* Sort issues by multiple columns
        +* Filters of saved query are now visible and be adjusted without editing the query
        +* Saving "sort order" in custom queries
        +* Url to fetch changesets for a repository
        +* Managers able to create subprojects
        +* Issue Totals on My Page Modules
        +* Convert Enumerations to single table inheritance (STI)
        +* Allow custom my_page blocks to define drop-down names
        +* "View Issues" user permission added
        +* Ask user what to do with child pages when deleting a parent wiki page
        +* Contextual quick search
        +* Allow resending of password by email
        +* Change reply subject to be a link to the reply itself
        +* Include Logged Time as part of the project's Activity history
        +* REST API for authentication
        +* Browse through Git branches
        +* Setup Object Daddy to replace test fixtures
        +* Setup shoulda to make it easier to test
        +* Custom fields and overrides on Enumerations
        +* Add or remove columns from the issue list
        +* Ability to add new version from issues screen
        +* Setting to choose which day calendars start
        +* Asynchronous email delivery method
        +* RESTful URLs for (almost) everything
        +* Include issue status in search results and activity pages
        +* Add email to admin user search filter
        +* Proper content type for plain text mails
        +* Default value of project jump box
        +* Tree based menus
        +* Ability to use issue status to update percent done
        +* Second set of issue "Action Links" at the bottom of an issue page
        +* Proper exist status code for rdm-mailhandler.rb
        +* Remove incoming email body via a delimiter
        +* Fixed: Custom querry 'Export to PDF' ignores field selection
        +* Fixed: Related e-mail notifications aren't threaded
        +* Fixed: No warning when the creation of a categories from the issue form fails
        +* Fixed: Actually block issues from closing when relation 'blocked by' isn't closed
        +* Fixed: Include both first and last name when sorting by users
        +* Fixed: Table cell with multiple line text
        +* Fixed: Project overview page shows disabled trackers
        +* Fixed: Cross project issue relations and user permissions
        +* Fixed: My page shows tickets the user doesn't have access to
        +* Fixed: TOC does not parse wiki page reference links with description
        +* Fixed: Target version-list on bulk edit form is incorrectly sorted
        +* Fixed: Cannot modify/delete project named "Documents"
        +* Fixed: Email address in brackets breaks html
        +* Fixed: Timelog detail loose issue filter passing to report tab
        +* Fixed: Inform about custom field's name maximum length
        +* Fixed: Activity page and Atom feed links contain project id instead of identifier
        +* Fixed: no Atom key for forums with only 1 forum
        +* Fixed: When reading RSS feed in MS Outlook, the inline links are broken.
        +* Fixed: Sometimes new posts don't show up in the topic list of a forum.
        +* Fixed: The all/active filter selection in the project view does not stick.
        +* Fixed: Login box has Different width
        +* Fixed: User removed from project - still getting project update emails
        +* Fixed: Project with the identifier of 'new' cannot be viewed
        +* Fixed: Artefacts in search view (Cyrillic)
        +* Fixed: Allow [#id] as subject to reply by email
        +* Fixed: Wrong language used when closing an issue via a commit message
        +* Fixed: email handler drops emails for new issues with no subject
        +* Fixed: Calendar misspelled under Roles/Permissions
        +* Fixed: Emails from no-reply redmine's address hell cycle
        +* Fixed: child_pages macro fails on wiki page history
        +* Fixed: Pre-filled time tracking date ignores timezone
        +* Fixed: Links on locked users lead to 404 page
        +* Fixed: Page changes in issue-list when using context menu
        +* Fixed: diff parser removes lines starting with multiple dashes
        +* Fixed: Quoting in forums resets message subject
        +* Fixed: Editing issue comment removes quote link
        +* Fixed: Redmine.pm ignore browse_repository permission
        +* Fixed: text formatting breaks on [msg1][msg2]
        +* Fixed: Spent Time Default Value of 0.0
        +* Fixed: Wiki pages in search results are referenced by project number, not by project identifier.
        +* Fixed: When logging in via an autologin cookie the user's last_login_on should be updated
        +* Fixed: 50k users cause problems in project->settings->members screen
        +* Fixed: Document timestamp needs to show updated timestamps
        +* Fixed: Users getting notifications for issues they are no longer allowed to view
        +* Fixed: issue summary counts should link to the issue list without subprojects
        +* Fixed: 'Delete' link on LDAP list has no effect
        +
        +
        +== 2009-11-15 v0.8.7
        +
        +* Fixed: Hide paragraph terminator at the end of headings on html export
        +* Fixed: pre tags containing "
        +          ...
        +        
        +      
        +    
        +"""
        +import re, time, cgi, urllib
        +from mercurial import cmdutil, commands, node, error, hg, registrar
        +
        +cmdtable = {}
        +command = registrar.command(cmdtable) if hasattr(registrar, 'command') else cmdutil.command(cmdtable)
        +
        +_x = cgi.escape
        +_u = lambda s: cgi.escape(urllib.quote(s))
        +
        +def _changectx(repo, rev):
        +    if isinstance(rev, str):
        +       rev = repo.lookup(rev)
        +    if hasattr(repo, 'changectx'):
        +        return repo.changectx(rev)
        +    else:
        +        return repo[rev]
        +
        +def _tip(ui, repo):
        +    # see mercurial/commands.py:tip
        +    def tiprev():
        +        try:
        +            return len(repo) - 1
        +        except TypeError:  # Mercurial < 1.1
        +            return repo.changelog.count() - 1
        +    tipctx = _changectx(repo, tiprev())
        +    ui.write('\n'
        +             % (tipctx.rev(), _x(node.hex(tipctx.node()))))
        +
        +_SPECIAL_TAGS = ('tip',)
        +
        +def _tags(ui, repo):
        +    # see mercurial/commands.py:tags
        +    for t, n in reversed(repo.tagslist()):
        +        if t in _SPECIAL_TAGS:
        +            continue
        +        try:
        +            r = repo.changelog.rev(n)
        +        except error.LookupError:
        +            continue
        +        ui.write('\n'
        +                 % (r, _x(node.hex(n)), _x(t)))
        +
        +def _branches(ui, repo):
        +    # see mercurial/commands.py:branches
        +    def iterbranches():
        +        if getattr(repo, 'branchtags', None) is not None:
        +            # Mercurial < 2.9
        +            for t, n in repo.branchtags().iteritems():
        +                yield t, n, repo.changelog.rev(n)
        +        else:
        +            for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
        +                yield tag, tip, repo.changelog.rev(tip)
        +    def branchheads(branch):
        +        try:
        +            return repo.branchheads(branch, closed=False)
        +        except TypeError:  # Mercurial < 1.2
        +            return repo.branchheads(branch)
        +    def lookup(rev, n):
        +        try:
        +            return repo.lookup(rev)
        +        except RuntimeError:
        +            return n
        +    for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True):
        +        if lookup(r, n) in branchheads(t):
        +            ui.write('\n'
        +                     % (r, _x(node.hex(n)), _x(t)))
        +
        +def _manifest(ui, repo, path, rev):
        +    ctx = _changectx(repo, rev)
        +    ui.write('\n'
        +             % (ctx.rev(), _u(path)))
        +
        +    known = set()
        +    pathprefix = (path.rstrip('/') + '/').lstrip('/')
        +    for f, n in sorted(ctx.manifest().iteritems(), key=lambda e: e[0]):
        +        if not f.startswith(pathprefix):
        +            continue
        +        name = re.sub(r'/.*', '/', f[len(pathprefix):])
        +        if name in known:
        +            continue
        +        known.add(name)
        +
        +        if name.endswith('/'):
        +            ui.write('\n'
        +                     % _x(urllib.quote(name[:-1])))
        +        else:
        +            fctx = repo.filectx(f, fileid=n)
        +            tm, tzoffset = fctx.date()
        +            ui.write('\n'
        +                     % (_u(name), fctx.rev(), _x(node.hex(fctx.node())),
        +                        tm, fctx.size(), ))
        +
        +    ui.write('\n')
        +
        +@command('rhannotate',
        +         [('r', 'rev', '', 'revision'),
        +          ('u', 'user', None, 'list the author (long with -v)'),
        +          ('n', 'number', None, 'list the revision number (default)'),
        +          ('c', 'changeset', None, 'list the changeset'),
        +         ],
        +         'hg rhannotate [-r REV] [-u] [-n] [-c] FILE...')
        +def rhannotate(ui, repo, *pats, **opts):
        +    rev = urllib.unquote_plus(opts.pop('rev', None))
        +    opts['rev'] = rev
        +    return commands.annotate(ui, repo, *map(urllib.unquote_plus, pats), **opts)
        +
        +@command('rhcat',
        +               [('r', 'rev', '', 'revision')],
        +               'hg rhcat ([-r REV] ...) FILE...')
        +def rhcat(ui, repo, file1, *pats, **opts):
        +    rev = urllib.unquote_plus(opts.pop('rev', None))
        +    opts['rev'] = rev
        +    return commands.cat(ui, repo, urllib.unquote_plus(file1), *map(urllib.unquote_plus, pats), **opts)
        +
        +@command('rhdiff',
        +               [('r', 'rev', [], 'revision'),
        +                ('c', 'change', '', 'change made by revision')],
        +               'hg rhdiff ([-c REV] | [-r REV] ...) [FILE]...')
        +def rhdiff(ui, repo, *pats, **opts):
        +    """diff repository (or selected files)"""
        +    change = opts.pop('change', None)
        +    if change:  # add -c option for Mercurial<1.1
        +        base = _changectx(repo, change).parents()[0].rev()
        +        opts['rev'] = [str(base), change]
        +    opts['nodates'] = True
        +    return commands.diff(ui, repo, *map(urllib.unquote_plus, pats), **opts)
        +
        +@command('rhlog',
        +                   [
        +                    ('r', 'rev', [], 'show the specified revision'),
        +                    ('b', 'branch', [],
        +                       'show changesets within the given named branch'),
        +                    ('l', 'limit', '',
        +                         'limit number of changes displayed'),
        +                    ('d', 'date', '',
        +                         'show revisions matching date spec'),
        +                    ('u', 'user', [],
        +                      'revisions committed by user'),
        +                    ('', 'from', '',
        +                      ''),
        +                    ('', 'to', '',
        +                      ''),
        +                    ('', 'rhbranch', '',
        +                      ''),
        +                    ('', 'template', '',
        +                       'display with template')],
        +                   'hg rhlog [OPTION]... [FILE]')
        +def rhlog(ui, repo, *pats, **opts):
        +    rev      = opts.pop('rev')
        +    bra0     = opts.pop('branch')
        +    from_rev = urllib.unquote_plus(opts.pop('from', None))
        +    to_rev   = urllib.unquote_plus(opts.pop('to'  , None))
        +    bra      = urllib.unquote_plus(opts.pop('rhbranch', None))
        +    from_rev = from_rev.replace('"', '\\"')
        +    to_rev   = to_rev.replace('"', '\\"')
        +    if hg.util.version() >= '1.6':
        +      opts['rev'] = ['"%s":"%s"' % (from_rev, to_rev)]
        +    else:
        +      opts['rev'] = ['%s:%s' % (from_rev, to_rev)]
        +    opts['branch'] = [bra]
        +    return commands.log(ui, repo, *map(urllib.unquote_plus, pats), **opts)
        +
        +@command('rhmanifest',
        +                   [('r', 'rev', '', 'show the specified revision')],
        +                   'hg rhmanifest [-r REV] [PATH]')
        +def rhmanifest(ui, repo, path='', **opts):
        +    """output the sub-manifest of the specified directory"""
        +    ui.write('\n')
        +    ui.write('\n')
        +    ui.write('\n' % _u(repo.root))
        +    try:
        +        _manifest(ui, repo, urllib.unquote_plus(path), urllib.unquote_plus(opts.get('rev')))
        +    finally:
        +        ui.write('\n')
        +        ui.write('\n')
        +
        +@command('rhsummary',[], 'hg rhsummary')
        +def rhsummary(ui, repo, **opts):
        +    """output the summary of the repository"""
        +    ui.write('\n')
        +    ui.write('\n')
        +    ui.write('\n' % _u(repo.root))
        +    try:
        +        _tip(ui, repo)
        +        _tags(ui, repo)
        +        _branches(ui, repo)
        +        # TODO: bookmarks in core (Mercurial>=1.8)
        +    finally:
        +        ui.write('\n')
        +        ui.write('\n')
        +
        diff --git a/lib/redmine/scm/adapters/mercurial_adapter.rb b/lib/redmine/scm/adapters/mercurial_adapter.rb
        new file mode 100644
        index 0000000..599c3a4
        --- /dev/null
        +++ b/lib/redmine/scm/adapters/mercurial_adapter.rb
        @@ -0,0 +1,345 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'redmine/scm/adapters/abstract_adapter'
        +require 'cgi'
        +
        +module Redmine
        +  module Scm
        +    module Adapters
        +      class MercurialAdapter < AbstractAdapter
        +
        +        # Mercurial executable name
        +        HG_BIN = Redmine::Configuration['scm_mercurial_command'] || "hg"
        +        HELPERS_DIR = File.dirname(__FILE__) + "/mercurial"
        +        HG_HELPER_EXT = "#{HELPERS_DIR}/redminehelper.py"
        +        TEMPLATE_NAME = "hg-template"
        +        TEMPLATE_EXTENSION = "tmpl"
        +
        +        # raised if hg command exited with error, e.g. unknown revision.
        +        class HgCommandAborted < CommandFailed; end
        +        # raised if bad command argument detected before executing hg.
        +        class HgCommandArgumentError < CommandFailed; end
        +
        +        class << self
        +          def client_command
        +            @@bin    ||= HG_BIN
        +          end
        +
        +          def sq_bin
        +            @@sq_bin ||= shell_quote_command
        +          end
        +
        +          def client_version
        +            @@client_version ||= (hgversion || [])
        +          end
        +
        +          def client_available
        +            client_version_above?([1, 2])
        +          end
        +
        +          def hgversion
        +            # The hg version is expressed either as a
        +            # release number (eg 0.9.5 or 1.0) or as a revision
        +            # id composed of 12 hexa characters.
        +            theversion = hgversion_from_command_line.dup.force_encoding('ASCII-8BIT')
        +            if m = theversion.match(%r{\A(.*?)((\d+\.)+\d+)})
        +              m[2].scan(%r{\d+}).collect(&:to_i)
        +            end
        +          end
        +
        +          def hgversion_from_command_line
        +            shellout("#{sq_bin} --version") { |io| io.read }.to_s
        +          end
        +
        +          def template_path
        +            @@template_path ||= template_path_for(client_version)
        +          end
        +
        +          def template_path_for(version)
        +            "#{HELPERS_DIR}/#{TEMPLATE_NAME}-1.0.#{TEMPLATE_EXTENSION}"
        +          end
        +        end
        +
        +        def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil)
        +          super
        +          @path_encoding = path_encoding.blank? ? 'UTF-8' : path_encoding
        +        end
        +
        +        def path_encoding
        +          @path_encoding
        +        end
        +
        +        def info
        +          tip = summary['repository']['tip']
        +          Info.new(:root_url => CGI.unescape(summary['repository']['root']),
        +                   :lastrev => Revision.new(:revision => tip['revision'],
        +                                            :scmid => tip['node']))
        +        # rescue HgCommandAborted
        +        rescue Exception => e
        +          logger.error "hg: error during getting info: #{e.message}"
        +          nil
        +        end
        +
        +        def tags
        +          as_ary(summary['repository']['tag']).map { |e| e['name'] }
        +        end
        +
        +        # Returns map of {'tag' => 'nodeid', ...}
        +        def tagmap
        +          alist = as_ary(summary['repository']['tag']).map do |e|
        +            e.values_at('name', 'node')
        +          end
        +          Hash[*alist.flatten]
        +        end
        +
        +        def branches
        +          brs = []
        +          as_ary(summary['repository']['branch']).each do |e|
        +            br = Branch.new(e['name'])
        +            br.revision =  e['revision']
        +            br.scmid    =  e['node']
        +            brs << br
        +          end
        +          brs
        +        end
        +
        +        # Returns map of {'branch' => 'nodeid', ...}
        +        def branchmap
        +          alist = as_ary(summary['repository']['branch']).map do |e|
        +            e.values_at('name', 'node')
        +          end
        +          Hash[*alist.flatten]
        +        end
        +
        +        def summary
        +          return @summary if @summary
        +          hg 'rhsummary' do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              @summary = parse_xml(output)['rhsummary']
        +            rescue
        +            end
        +          end
        +        end
        +        private :summary
        +
        +        def entries(path=nil, identifier=nil, options={})
        +          p1 = scm_iconv(@path_encoding, 'UTF-8', path)
        +          manifest = hg('rhmanifest', "-r#{CGI.escape(hgrev(identifier))}",
        +                        '--', CGI.escape(without_leading_slash(p1.to_s))) do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              parse_xml(output)['rhmanifest']['repository']['manifest']
        +            rescue
        +            end
        +          end
        +          path_prefix = path.blank? ? '' : with_trailling_slash(path)
        +
        +          entries = Entries.new
        +          as_ary(manifest['dir']).each do |e|
        +            n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name']))
        +            p = "#{path_prefix}#{n}"
        +            entries << Entry.new(:name => n, :path => p, :kind => 'dir')
        +          end
        +
        +          as_ary(manifest['file']).each do |e|
        +            n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name']))
        +            p = "#{path_prefix}#{n}"
        +            lr = Revision.new(:revision => e['revision'], :scmid => e['node'],
        +                              :identifier => e['node'],
        +                              :time => Time.at(e['time'].to_i))
        +            entries << Entry.new(:name => n, :path => p, :kind => 'file',
        +                                 :size => e['size'].to_i, :lastrev => lr)
        +          end
        +
        +          entries
        +        rescue HgCommandAborted
        +          nil  # means not found
        +        end
        +
        +        def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
        +          revs = Revisions.new
        +          each_revision(path, identifier_from, identifier_to, options) { |e| revs << e }
        +          revs
        +        end
        +
        +        # Iterates the revisions by using a template file that
        +        # makes Mercurial produce a xml output.
        +        def each_revision(path=nil, identifier_from=nil, identifier_to=nil, options={})
        +          hg_args = ['log', '--debug', '-C', "--style=#{self.class.template_path}"]
        +          hg_args << "-r#{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
        +          hg_args << "--limit=#{options[:limit]}" if options[:limit]
        +          hg_args << '--' << hgtarget(path) unless path.blank?
        +          log = hg(*hg_args) do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              # Mercurial < 1.5 does not support footer template for ''
        +              parse_xml("#{output}")['log']
        +            rescue
        +            end
        +          end
        +          as_ary(log['logentry']).each do |le|
        +            cpalist = as_ary(le['paths']['path-copied']).map do |e|
        +              [e['__content__'], e['copyfrom-path']].map do |s|
        +                scm_iconv('UTF-8', @path_encoding, CGI.unescape(s))
        +              end
        +            end
        +            cpmap = Hash[*cpalist.flatten]
        +            paths = as_ary(le['paths']['path']).map do |e|
        +              p = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['__content__']) )
        +              {:action        => e['action'],
        +               :path          => with_leading_slash(p),
        +               :from_path     => (cpmap.member?(p) ? with_leading_slash(cpmap[p]) : nil),
        +               :from_revision => (cpmap.member?(p) ? le['node'] : nil)}
        +            end.sort { |a, b| a[:path] <=> b[:path] }
        +            parents_ary = []
        +            as_ary(le['parents']['parent']).map do |par|
        +              parents_ary << par['__content__'] if par['__content__'] != "0000000000000000000000000000000000000000"
        +            end
        +            yield Revision.new(:revision => le['revision'],
        +                               :scmid    => le['node'],
        +                               :author   => (le['author']['__content__'] rescue ''),
        +                               :time     => Time.parse(le['date']['__content__']),
        +                               :message  => le['msg']['__content__'],
        +                               :paths    => paths,
        +                               :parents  => parents_ary)
        +          end
        +          self
        +        end
        +
        +        # Returns list of nodes in the specified branch
        +        def nodes_in_branch(branch, options={})
        +          hg_args = ['rhlog', '--template={node}\n', "--rhbranch=#{CGI.escape(branch)}"]
        +          hg_args << "--from=#{CGI.escape(branch)}"
        +          hg_args << '--to=0'
        +          hg_args << "--limit=#{options[:limit]}" if options[:limit]
        +          hg(*hg_args) { |io| io.readlines.map { |e| e.chomp } }
        +        end
        +
        +        def diff(path, identifier_from, identifier_to=nil)
        +          hg_args = %w|rhdiff|
        +          if identifier_to
        +            hg_args << "-r#{hgrev(identifier_to)}" << "-r#{hgrev(identifier_from)}"
        +          else
        +            hg_args << "-c#{hgrev(identifier_from)}"
        +          end
        +          unless path.blank?
        +            p = scm_iconv(@path_encoding, 'UTF-8', path)
        +            hg_args << '--' << CGI.escape(hgtarget(p))
        +          end
        +          diff = []
        +          hg *hg_args do |io|
        +            io.each_line do |line|
        +              diff << line
        +            end
        +          end
        +          diff
        +        rescue HgCommandAborted
        +          nil  # means not found
        +        end
        +
        +        def cat(path, identifier=nil)
        +          p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path))
        +          hg 'rhcat', "-r#{CGI.escape(hgrev(identifier))}", '--', hgtarget(p) do |io|
        +            io.binmode
        +            io.read
        +          end
        +        rescue HgCommandAborted
        +          nil  # means not found
        +        end
        +
        +        def annotate(path, identifier=nil)
        +          p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path))
        +          blame = Annotate.new
        +          hg 'rhannotate', '-ncu', "-r#{CGI.escape(hgrev(identifier))}", '--', hgtarget(p) do |io|
        +            io.each_line do |line|
        +              line.force_encoding('ASCII-8BIT')
        +              next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$}
        +              r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3,
        +                               :identifier => $3)
        +              blame.add_line($4.rstrip, r)
        +            end
        +          end
        +          blame
        +        rescue HgCommandAborted
        +          # means not found or cannot be annotated
        +          Annotate.new
        +        end
        +
        +        class Revision < Redmine::Scm::Adapters::Revision
        +          # Returns the readable identifier
        +          def format_identifier
        +            "#{revision}:#{scmid}"
        +          end
        +        end
        +
        +        # command options which may be processed earlier, by faulty parser in hg
        +        HG_EARLY_BOOL_ARG = /^--(debugger|profile|traceback)$/
        +        HG_EARLY_LIST_ARG = /^(--(config|cwd|repo(sitory)?)\b|-R)/
        +        private_constant :HG_EARLY_BOOL_ARG, :HG_EARLY_LIST_ARG
        +
        +        # Runs 'hg' command with the given args
        +        def hg(*args, &block)
        +          # as of hg 4.4.1, early parsing of bool options is not terminated at '--'
        +          if args.any? { |s| s =~ HG_EARLY_BOOL_ARG }
        +            raise HgCommandArgumentError, "malicious command argument detected"
        +          end
        +          if args.take_while { |s| s != '--' }.any? { |s| s =~ HG_EARLY_LIST_ARG }
        +            raise HgCommandArgumentError, "malicious command argument detected"
        +          end
        +
        +          repo_path = root_url || url
        +          full_args = ["-R#{repo_path}", '--encoding=utf-8']
        +          # don't use "--config=" form for compatibility with ancient Mercurial
        +          full_args << '--config' << "extensions.redminehelper=#{HG_HELPER_EXT}"
        +          full_args << '--config' << 'diff.git=false'
        +          full_args += args
        +          ret = shellout(
        +                   self.class.sq_bin + ' ' + full_args.map { |e| shell_quote e.to_s }.join(' '),
        +                   &block
        +                   )
        +          if $? && $?.exitstatus != 0
        +            raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}"
        +          end
        +          ret
        +        end
        +        private :hg
        +
        +        # Returns correct revision identifier
        +        def hgrev(identifier, sq=false)
        +          rev = identifier.blank? ? 'tip' : identifier.to_s
        +          rev = shell_quote(rev) if sq
        +          rev
        +        end
        +        private :hgrev
        +
        +        def hgtarget(path)
        +          path ||= ''
        +          root_url + '/' + without_leading_slash(path)
        +        end
        +        private :hgtarget
        +
        +        def as_ary(o)
        +          return [] unless o
        +          o.is_a?(Array) ? o : Array[o]
        +        end
        +        private :as_ary
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/scm/adapters/subversion_adapter.rb b/lib/redmine/scm/adapters/subversion_adapter.rb
        new file mode 100644
        index 0000000..318f045
        --- /dev/null
        +++ b/lib/redmine/scm/adapters/subversion_adapter.rb
        @@ -0,0 +1,276 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'redmine/scm/adapters/abstract_adapter'
        +require 'uri'
        +
        +module Redmine
        +  module Scm
        +    module Adapters
        +      class SubversionAdapter < AbstractAdapter
        +
        +        # SVN executable name
        +        SVN_BIN = Redmine::Configuration['scm_subversion_command'] || "svn"
        +
        +        class << self
        +          def client_command
        +            @@bin    ||= SVN_BIN
        +          end
        +
        +          def sq_bin
        +            @@sq_bin ||= shell_quote_command
        +          end
        +
        +          def client_version
        +            @@client_version ||= (svn_binary_version || [])
        +          end
        +
        +          def client_available
        +            # --xml options are introduced in 1.3.
        +            # http://subversion.apache.org/docs/release-notes/1.3.html
        +            client_version_above?([1, 3])
        +          end
        +
        +          def svn_binary_version
        +            scm_version = scm_version_from_command_line.dup.force_encoding('ASCII-8BIT')
        +            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
        +              m[2].scan(%r{\d+}).collect(&:to_i)
        +            end
        +          end
        +
        +          def scm_version_from_command_line
        +            shellout("#{sq_bin} --version") { |io| io.read }.to_s
        +          end
        +        end
        +
        +        # Get info about the svn repository
        +        def info
        +          cmd = "#{self.class.sq_bin} info --xml #{target}"
        +          cmd << credentials_string
        +          info = nil
        +          shellout(cmd) do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              doc = parse_xml(output)
        +              # root_url = doc.elements["info/entry/repository/root"].text
        +              info = Info.new({:root_url => doc['info']['entry']['repository']['root']['__content__'],
        +                               :lastrev => Revision.new({
        +                                 :identifier => doc['info']['entry']['commit']['revision'],
        +                                 :time => Time.parse(doc['info']['entry']['commit']['date']['__content__']).localtime,
        +                                 :author => (doc['info']['entry']['commit']['author'] ? doc['info']['entry']['commit']['author']['__content__'] : "")
        +                               })
        +                             })
        +            rescue
        +            end
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          info
        +        rescue CommandFailed
        +          return nil
        +        end
        +
        +        # Returns an Entries collection
        +        # or nil if the given path doesn't exist in the repository
        +        def entries(path=nil, identifier=nil, options={})
        +          path ||= ''
        +          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
        +          entries = Entries.new
        +          cmd = "#{self.class.sq_bin} list --xml #{target(path)}@#{identifier}"
        +          cmd << credentials_string
        +          shellout(cmd) do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              doc = parse_xml(output)
        +              each_xml_element(doc['lists']['list'], 'entry') do |entry|
        +                commit = entry['commit']
        +                commit_date = commit['date']
        +                # Skip directory if there is no commit date (usually that
        +                # means that we don't have read access to it)
        +                next if entry['kind'] == 'dir' && commit_date.nil?
        +                name = entry['name']['__content__']
        +                entries << Entry.new({:name => URI.unescape(name),
        +                            :path => ((path.empty? ? "" : "#{path}/") + name),
        +                            :kind => entry['kind'],
        +                            :size => ((s = entry['size']) ? s['__content__'].to_i : nil),
        +                            :lastrev => Revision.new({
        +                              :identifier => commit['revision'],
        +                              :time => Time.parse(commit_date['__content__'].to_s).localtime,
        +                              :author => ((a = commit['author']) ? a['__content__'] : nil)
        +                              })
        +                            })
        +              end
        +            rescue Exception => e
        +              logger.error("Error parsing svn output: #{e.message}")
        +              logger.error("Output was:\n #{output}")
        +            end
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
        +          entries.sort_by_name
        +        end
        +
        +        def properties(path, identifier=nil)
        +          # proplist xml output supported in svn 1.5.0 and higher
        +          return nil unless self.class.client_version_above?([1, 5, 0])
        +
        +          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
        +          cmd = "#{self.class.sq_bin} proplist --verbose --xml #{target(path)}@#{identifier}"
        +          cmd << credentials_string
        +          properties = {}
        +          shellout(cmd) do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              doc = parse_xml(output)
        +              each_xml_element(doc['properties']['target'], 'property') do |property|
        +                properties[ property['name'] ] = property['__content__'].to_s
        +              end
        +            rescue
        +            end
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          properties
        +        end
        +
        +        def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
        +          path ||= ''
        +          identifier_from = (identifier_from && identifier_from.to_i > 0) ? identifier_from.to_i : "HEAD"
        +          identifier_to = (identifier_to && identifier_to.to_i > 0) ? identifier_to.to_i : 1
        +          revisions = Revisions.new
        +          cmd = "#{self.class.sq_bin} log --xml -r #{identifier_from}:#{identifier_to}"
        +          cmd << credentials_string
        +          cmd << " --verbose " if  options[:with_paths]
        +          cmd << " --limit #{options[:limit].to_i}" if options[:limit]
        +          cmd << ' ' + target(path)
        +          shellout(cmd) do |io|
        +            output = io.read.force_encoding('UTF-8')
        +            begin
        +              doc = parse_xml(output)
        +              each_xml_element(doc['log'], 'logentry') do |logentry|
        +                paths = []
        +                each_xml_element(logentry['paths'], 'path') do |path|
        +                  paths << {:action => path['action'],
        +                            :path => path['__content__'],
        +                            :from_path => path['copyfrom-path'],
        +                            :from_revision => path['copyfrom-rev']
        +                            }
        +                end if logentry['paths'] && logentry['paths']['path']
        +                paths.sort! { |x,y| x[:path] <=> y[:path] }
        +
        +                revisions << Revision.new({:identifier => logentry['revision'],
        +                              :author => (logentry['author'] ? logentry['author']['__content__'] : ""),
        +                              :time => Time.parse(logentry['date']['__content__'].to_s).localtime,
        +                              :message => logentry['msg']['__content__'],
        +                              :paths => paths
        +                            })
        +              end
        +            rescue
        +            end
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          revisions
        +        end
        +
        +        def diff(path, identifier_from, identifier_to=nil)
        +          path ||= ''
        +          identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : ''
        +
        +          identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : (identifier_from.to_i - 1)
        +
        +          cmd = "#{self.class.sq_bin} diff -r "
        +          cmd << "#{identifier_to}:"
        +          cmd << "#{identifier_from}"
        +          cmd << " #{target(path)}@#{identifier_from}"
        +          cmd << credentials_string
        +          diff = []
        +          shellout(cmd) do |io|
        +            io.each_line do |line|
        +              diff << line
        +            end
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          diff
        +        end
        +
        +        def cat(path, identifier=nil)
        +          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
        +          cmd = "#{self.class.sq_bin} cat #{target(path)}@#{identifier}"
        +          cmd << credentials_string
        +          cat = nil
        +          shellout(cmd) do |io|
        +            io.binmode
        +            cat = io.read
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          cat
        +        end
        +
        +        def annotate(path, identifier=nil)
        +          identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
        +          cmd = "#{self.class.sq_bin} blame #{target(path)}@#{identifier}"
        +          cmd << credentials_string
        +          blame = Annotate.new
        +          shellout(cmd) do |io|
        +            io.each_line do |line|
        +              next unless line =~ %r{^\s*(\d+)\s*(\S+)\s(.*)$}
        +              rev = $1
        +              blame.add_line($3.rstrip,
        +                   Revision.new(
        +                      :identifier => rev,
        +                      :revision   => rev,
        +                      :author     => $2.strip
        +                      ))
        +            end
        +          end
        +          return nil if $? && $?.exitstatus != 0
        +          blame
        +        end
        +
        +        private
        +
        +        def credentials_string
        +          str = ''
        +          str << " --username #{shell_quote(@login)}" unless @login.blank?
        +          str << " --password #{shell_quote(@password)}" unless @login.blank? || @password.blank?
        +          str << " --no-auth-cache --non-interactive"
        +          str
        +        end
        +
        +        # Helper that iterates over the child elements of a xml node
        +        # MiniXml returns a hash when a single child is found
        +        # or an array of hashes for multiple children
        +        def each_xml_element(node, name)
        +          if node && node[name]
        +            if node[name].is_a?(Hash)
        +              yield node[name]
        +            else
        +              node[name].each do |element|
        +                yield element
        +              end
        +            end
        +          end
        +        end
        +
        +        def target(path = '')
        +          base = path.match(/^\//) ? root_url : url
        +          uri = "#{base}/#{path}"
        +          uri = URI.escape(URI.escape(uri), '[]')
        +          shell_quote(uri.gsub(/[?<>\*]/, ''))
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/scm/base.rb b/lib/redmine/scm/base.rb
        new file mode 100644
        index 0000000..b33a9cf
        --- /dev/null
        +++ b/lib/redmine/scm/base.rb
        @@ -0,0 +1,23 @@
        +module Redmine
        +  module Scm
        +    class Base
        +      class << self
        +
        +        def all
        +          @scms || []
        +        end
        +
        +        # Add a new SCM adapter and repository
        +        def add(scm_name)
        +          @scms ||= []
        +          @scms << scm_name
        +        end
        +
        +        # Remove a SCM adapter from Redmine's list of supported scms
        +        def delete(scm_name)
        +          @scms.delete(scm_name)
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/search.rb b/lib/redmine/search.rb
        new file mode 100644
        index 0000000..dce36a7
        --- /dev/null
        +++ b/lib/redmine/search.rb
        @@ -0,0 +1,173 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module Search
        +
        +    mattr_accessor :available_search_types
        +    @@available_search_types = []
        +
        +    class << self
        +      def map(&block)
        +        yield self
        +      end
        +
        +      # Registers a search provider
        +      def register(search_type, options={})
        +        search_type = search_type.to_s
        +        @@available_search_types << search_type unless @@available_search_types.include?(search_type)
        +      end
        +
        +      # Returns the cache store for search results
        +      # Can be configured with config.redmine_search_cache_store= in config/application.rb
        +      def cache_store
        +        @@cache_store ||= begin
        +          # if config.search_cache_store was not previously set, a no method error would be raised
        +          config = Rails.application.config.redmine_search_cache_store rescue :memory_store
        +          if config
        +            ActiveSupport::Cache.lookup_store config
        +          end
        +        end
        +      end
        +    end
        +
        +    class Fetcher
        +      attr_reader :tokens
        +
        +      def initialize(question, user, scope, projects, options={})
        +        @user = user
        +        @question = question.strip
        +        @scope = scope
        +        @projects = projects
        +        @cache = options.delete(:cache)
        +        @options = options
        +
        +        # extract tokens from the question
        +        # eg. hello "bye bye" => ["hello", "bye bye"]
        +        @tokens = @question.scan(%r{((\s|^)"[^"]+"(\s|$)|\S+)}).collect {|m| m.first.gsub(%r{(^\s*"\s*|\s*"\s*$)}, '')}
        +        # tokens must be at least 2 characters long
        +        @tokens = @tokens.uniq.select {|w| w.length > 1 }
        +        # no more than 5 tokens to search for
        +        @tokens.slice! 5..-1
        +      end
        +
        +      # Returns the total result count
        +      def result_count
        +        result_ids.size
        +      end
        +
        +      # Returns the result count by type
        +      def result_count_by_type
        +        ret = Hash.new {|h,k| h[k] = 0}
        +        result_ids.group_by(&:first).each do |scope, ids|
        +          ret[scope] += ids.size
        +        end
        +        ret
        +      end
        +
        +      # Returns the results for the given offset and limit
        +      def results(offset, limit)
        +        result_ids_to_load = result_ids[offset, limit] || []
        +  
        +        results_by_scope = Hash.new {|h,k| h[k] = []}
        +        result_ids_to_load.group_by(&:first).each do |scope, scope_and_ids|
        +          klass = scope.singularize.camelcase.constantize
        +          results_by_scope[scope] += klass.search_results_from_ids(scope_and_ids.map(&:last))
        +        end
        +  
        +        result_ids_to_load.map do |scope, id|
        +          results_by_scope[scope].detect {|record| record.id == id}
        +        end.compact
        +      end
        +
        +      # Returns the results ids, sorted by rank
        +      def result_ids
        +        @ranks_and_ids ||= load_result_ids_from_cache
        +      end
        +
        +      private
        +
        +      def project_ids
        +        Array.wrap(@projects).map(&:id)
        +      end
        +
        +      def load_result_ids_from_cache
        +        if Redmine::Search.cache_store
        +          cache_key = ActiveSupport::Cache.expand_cache_key(
        +            [@question, @user.id, @scope.sort, @options, project_ids.sort]
        +          )
        +  
        +          Redmine::Search.cache_store.fetch(cache_key, :force => !@cache) do
        +            load_result_ids
        +          end
        +        else
        +          load_result_ids
        +        end
        +      end
        +
        +      def load_result_ids
        +        ret = []
        +        # get all the results ranks and ids
        +        @scope.each do |scope|
        +          klass = scope.singularize.camelcase.constantize
        +          ranks_and_ids_in_scope = klass.search_result_ranks_and_ids(@tokens, User.current, @projects, @options)
        +          ret += ranks_and_ids_in_scope.map {|rs| [scope, rs]}
        +        end
        +        # sort results, higher rank and id first
        +        ret.sort! {|a,b| b.last <=> a.last}
        +        # only keep ids now that results are sorted
        +        ret.map! {|scope, r| [scope, r.last]}
        +        ret
        +      end
        +    end
        +
        +    module Controller
        +      def self.included(base)
        +        base.extend(ClassMethods)
        +      end
        +
        +      module ClassMethods
        +        @@default_search_scopes = Hash.new {|hash, key| hash[key] = {:default => nil, :actions => {}}}
        +        mattr_accessor :default_search_scopes
        +
        +        # Set the default search scope for a controller or specific actions
        +        # Examples:
        +        #   * search_scope :issues # => sets the search scope to :issues for the whole controller
        +        #   * search_scope :issues, :only => :index
        +        #   * search_scope :issues, :only => [:index, :show]
        +        def default_search_scope(id, options = {})
        +          if actions = options[:only]
        +            actions = [] << actions unless actions.is_a?(Array)
        +            actions.each {|a| default_search_scopes[controller_name.to_sym][:actions][a.to_sym] = id.to_s}
        +          else
        +            default_search_scopes[controller_name.to_sym][:default] = id.to_s
        +          end
        +        end
        +      end
        +
        +      def default_search_scopes
        +        self.class.default_search_scopes
        +      end
        +
        +      # Returns the default search scope according to the current action
        +      def default_search_scope
        +        @default_search_scope ||= default_search_scopes[controller_name.to_sym][:actions][action_name.to_sym] ||
        +                                  default_search_scopes[controller_name.to_sym][:default]
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/sort_criteria.rb b/lib/redmine/sort_criteria.rb
        new file mode 100644
        index 0000000..d8fa3ee
        --- /dev/null
        +++ b/lib/redmine/sort_criteria.rb
        @@ -0,0 +1,105 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  class SortCriteria < Array
        +    def initialize(arg=nil)
        +      super()
        +      if arg.is_a?(Array)
        +        replace arg
        +      elsif arg.is_a?(String)
        +        replace arg.split(',').collect {|s| s.split(':')[0..1]}
        +      elsif arg.respond_to?(:values)
        +        replace arg.values
        +      elsif arg
        +        raise ArgumentError.new("SortCriteria#new takes an Array, String or Hash, not a #{arg.class.name}.")
        +      end
        +      normalize!
        +    end
        +
        +    def to_param
        +      self.collect {|k,o| k + (o == 'desc' ? ':desc' : '')}.join(',')
        +    end
        +
        +    def to_a
        +      Array.new(self)
        +    end
        +
        +    def add!(key, asc)
        +      key = key.to_s
        +      delete_if {|k,o| k == key}
        +      prepend([key, asc])
        +      normalize!
        +    end
        +
        +    def add(*args)
        +      self.class.new(self).add!(*args)
        +    end
        +
        +    def first_key
        +      first.try(:first)
        +    end
        +
        +    def first_asc?
        +      first.try(:last) == 'asc'
        +    end
        +
        +    def key_at(arg)
        +      self[arg].try(:first)
        +    end
        +
        +    def order_at(arg)
        +      self[arg].try(:last)
        +    end
        +
        +    def order_for(key)
        +      detect {|k, order| key.to_s == k}.try(:last)
        +    end
        +
        +    def sort_clause(sortable_columns)
        +      if sortable_columns.is_a?(Array)
        +        sortable_columns = sortable_columns.inject({}) {|h,k| h[k]=k; h}
        +      end
        +
        +      sql = self.collect do |k,o|
        +        if s = sortable_columns[k]
        +          s = [s] unless s.is_a?(Array)
        +          s.collect {|c| append_order(c, o)}
        +        end
        +      end.flatten.compact
        +      sql.blank? ? nil : sql
        +    end
        +
        +    private
        +
        +    def normalize!
        +      self.reject! {|s| s.first.blank? }
        +      self.collect! {|s| s = Array(s); [s.first, (s.last == false || s.last.to_s == 'desc') ? 'desc' : 'asc']}
        +      self.slice!(3)
        +      self
        +    end
        +
        +    # Appends ASC/DESC to the sort criterion unless it has a fixed order
        +    def append_order(criterion, order)
        +      if criterion =~ / (asc|desc)$/i
        +        criterion
        +      else
        +        "#{criterion} #{order.to_s.upcase}"
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/subclass_factory.rb b/lib/redmine/subclass_factory.rb
        new file mode 100644
        index 0000000..c1936b2
        --- /dev/null
        +++ b/lib/redmine/subclass_factory.rb
        @@ -0,0 +1,47 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module SubclassFactory
        +    def self.included(base) 
        +      base.extend ClassMethods
        +    end 
        +
        +    module ClassMethods
        +      def get_subclass(class_name)
        +        klass = nil
        +        begin
        +          klass = class_name.to_s.classify.constantize
        +        rescue
        +          # invalid class name
        +        end
        +        unless subclasses.include? klass
        +          klass = nil
        +        end
        +        klass
        +      end
        +
        +      # Returns an instance of the given subclass name
        +      def new_subclass_instance(class_name, *args)
        +        klass = get_subclass(class_name)
        +        if klass
        +          klass.new(*args)
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/sudo_mode.rb b/lib/redmine/sudo_mode.rb
        new file mode 100644
        index 0000000..eddbc04
        --- /dev/null
        +++ b/lib/redmine/sudo_mode.rb
        @@ -0,0 +1,224 @@
        +require 'active_support/core_ext/object/to_query'
        +require 'rack/utils'
        +
        +module Redmine
        +  module SudoMode
        +
        +    class SudoRequired < StandardError
        +    end
        +
        +
        +    class Form
        +      include ActiveModel::Validations
        +
        +      attr_accessor :password, :original_fields
        +      validate :check_password
        +
        +      def initialize(password = nil)
        +        self.password = password
        +      end
        +
        +      def check_password
        +        unless password.present? && User.current.check_password?(password)
        +          errors[:password] << :invalid
        +        end
        +      end
        +    end
        +
        +
        +    module Helper
        +      # Represents params data from hash as hidden fields
        +      #
        +      # taken from https://github.com/brianhempel/hash_to_hidden_fields
        +      def hash_to_hidden_fields(hash)
        +        cleaned_hash = hash.reject { |k, v| v.nil? }
        +        pairs = cleaned_hash.to_query.split(Rack::Utils::DEFAULT_SEP)
        +        tags = pairs.map do |pair|
        +          key, value = pair.split('=', 2).map { |str| Rack::Utils.unescape(str) }
        +          hidden_field_tag(key, value)
        +        end
        +        tags.join("\n").html_safe
        +      end
        +    end
        +
        +
        +    module Controller
        +      extend ActiveSupport::Concern
        +
        +      included do
        +        around_action :sudo_mode
        +      end
        +
        +      # Sudo mode Around Filter
        +      #
        +      # Checks the 'last used' timestamp from session and sets the
        +      # SudoMode::active? flag accordingly.
        +      #
        +      # After the request refreshes the timestamp if sudo mode was used during
        +      # this request.
        +      def sudo_mode
        +        if sudo_timestamp_valid?
        +          SudoMode.active!
        +        end
        +        yield
        +        update_sudo_timestamp! if SudoMode.was_used?
        +      end
        +
        +      # This renders the sudo mode form / handles sudo form submission.
        +      #
        +      # Call this method in controller actions if sudo permissions are required
        +      # for processing this request. This approach is good in cases where the
        +      # action needs to be protected in any case or where the check is simple.
        +      #
        +      # In cases where this decision depends on complex conditions in the model,
        +      # consider the declarative approach using the require_sudo_mode class
        +      # method and a corresponding declaration in the model that causes it to throw
        +      # a SudoRequired Error when necessary.
        +      #
        +      # All parameter names given are included as hidden fields to be resubmitted
        +      # along with the password.
        +      #
        +      # Returns true when processing the action should continue, false otherwise.
        +      # If false is returned, render has already been called for display of the
        +      # password form.
        +      #
        +      # if @user.mail_changed?
        +      #   require_sudo_mode :user or return
        +      # end
        +      #
        +      def require_sudo_mode(*param_names)
        +        return true if SudoMode.active?
        +
        +        if param_names.blank?
        +          param_names = params.keys - %w(id action controller sudo_password _method authenticity_token utf8)
        +        end
        +
        +        process_sudo_form
        +
        +        if SudoMode.active?
        +          true
        +        else
        +          render_sudo_form param_names
        +          false
        +        end
        +      end
        +
        +      # display the sudo password form
        +      def render_sudo_form(param_names)
        +        @sudo_form ||= SudoMode::Form.new
        +        @sudo_form.original_fields = params.slice( *param_names )
        +        # a simple 'render "sudo_mode/new"' works when used directly inside an
        +        # action, but not when called from a before_action:
        +        respond_to do |format|
        +          format.html { render 'sudo_mode/new' }
        +          format.js   { render 'sudo_mode/new' }
        +        end
        +      end
        +
        +      # handle sudo password form submit
        +      def process_sudo_form
        +        if params[:sudo_password]
        +          @sudo_form = SudoMode::Form.new(params[:sudo_password])
        +          if @sudo_form.valid?
        +            SudoMode.active!
        +          else
        +            flash.now[:error] = l(:notice_account_wrong_password)
        +          end
        +        end
        +      end
        +
        +      def sudo_timestamp_valid?
        +        session[:sudo_timestamp].to_i > SudoMode.timeout.ago.to_i
        +      end
        +
        +      def update_sudo_timestamp!(new_value = Time.now.to_i)
        +        session[:sudo_timestamp] = new_value
        +      end
        +
        +      # Before Filter which is used by the require_sudo_mode class method.
        +      class SudoRequestFilter < Struct.new(:parameters, :request_methods)
        +        def before(controller)
        +          method_matches = request_methods.blank? || request_methods.include?(controller.request.method_symbol)
        +          if controller.api_request?
        +            true
        +          elsif SudoMode.possible? && method_matches
        +            controller.require_sudo_mode( *parameters )
        +          else
        +            true
        +          end
        +        end
        +      end
        +
        +      module ClassMethods
        +
        +        # Handles sudo requirements for the given actions, preserving the named
        +        # parameters, or any parameters if you omit the :parameters option.
        +        #
        +        # Sudo enforcement by default is active for all requests to an action
        +        # but may be limited to a certain subset of request methods via the
        +        # :only option.
        +        #
        +        # Examples:
        +        #
        +        # require_sudo_mode :account, only: :post
        +        # require_sudo_mode :update, :create, parameters: %w(role)
        +        # require_sudo_mode :destroy
        +        #
        +        def require_sudo_mode(*args)
        +          actions = args.dup
        +          options = actions.extract_options!
        +          filter = SudoRequestFilter.new Array(options[:parameters]), Array(options[:only])
        +          before_action filter, only: actions
        +        end
        +      end
        +    end
        +
        +
        +    # true if the sudo mode state was queried during this request
        +    def self.was_used?
        +      !!RequestStore.store[:sudo_mode_was_used]
        +    end
        +
        +    # true if sudo mode is currently active.
        +    #
        +    # Calling this method also turns was_used? to true, therefore
        +    # it is important to only call this when sudo is actually needed, as the last
        +    # condition to determine whether a change can be done or not.
        +    #
        +    # If you do it wrong, timeout of the sudo mode will happen too late or not at
        +    # all.
        +    def self.active?
        +      if !!RequestStore.store[:sudo_mode]
        +        RequestStore.store[:sudo_mode_was_used] = true
        +      end
        +    end
        +
        +    def self.active!
        +      RequestStore.store[:sudo_mode] = true
        +    end
        +
        +    def self.possible?
        +      enabled? && User.current.logged?
        +    end
        +
        +    # Turn off sudo mode (never require password entry).
        +    def self.disable!
        +      RequestStore.store[:sudo_mode_disabled] = true
        +    end
        +
        +    # Turn sudo mode back on
        +    def self.enable!
        +      RequestStore.store[:sudo_mode_disabled] = nil
        +    end
        +
        +    def self.enabled?
        +      Redmine::Configuration['sudo_mode'] && !RequestStore.store[:sudo_mode_disabled]
        +    end
        +
        +    # Timespan after which sudo mode expires when unused.
        +    def self.timeout
        +      m = Redmine::Configuration['sudo_mode_timeout'].to_i
        +      (m > 0 ? m : 15).minutes
        +    end
        +  end
        +end
        diff --git a/lib/redmine/syntax_highlighting.rb b/lib/redmine/syntax_highlighting.rb
        new file mode 100644
        index 0000000..49d9f41
        --- /dev/null
        +++ b/lib/redmine/syntax_highlighting.rb
        @@ -0,0 +1,93 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module SyntaxHighlighting
        +
        +    class << self
        +      attr_reader :highlighter
        +
        +      def highlighter=(name)
        +        if name.is_a?(Module)
        +          @highlighter = name
        +        else
        +          @highlighter = const_get(name)
        +        end
        +      end
        +
        +      def highlight_by_filename(text, filename)
        +        highlighter.highlight_by_filename(text, filename)
        +      rescue
        +        ERB::Util.h(text)
        +      end
        +
        +      def highlight_by_language(text, language)
        +        highlighter.highlight_by_language(text, language)
        +      rescue
        +        ERB::Util.h(text)
        +      end
        +
        +      def language_supported?(language)
        +        if highlighter.respond_to? :language_supported?
        +          highlighter.language_supported? language
        +        else
        +          true
        +        end
        +      rescue
        +        false
        +      end
        +    end
        +
        +    module CodeRay
        +      require 'coderay'
        +
        +      def self.retrieve_supported_languages
        +        ::CodeRay::Scanners.list +
        +        # Add CodeRay scanner aliases
        +        ::CodeRay::Scanners.plugin_hash.keys.map(&:to_sym) -
        +        # Remove internal CodeRay scanners
        +        %w(debug default raydebug scanner).map(&:to_sym)
        +      end
        +      private_class_method :retrieve_supported_languages
        +
        +      SUPPORTED_LANGUAGES = retrieve_supported_languages
        +
        +      class << self
        +        # Highlights +text+ as the content of +filename+
        +        # Should not return line numbers nor outer pre tag
        +        def highlight_by_filename(text, filename)
        +          language = ::CodeRay::FileType[filename]
        +          language ? ::CodeRay.scan(text, language).html(:break_lines => true) : ERB::Util.h(text)
        +        end
        +
        +        # Highlights +text+ using +language+ syntax
        +        # Should not return outer pre tag
        +        def highlight_by_language(text, language)
        +          ::CodeRay.scan(text, language).html(:wrap => :span)
        +        end
        +
        +        def language_supported?(language)
        +          SUPPORTED_LANGUAGES.include?(language.to_s.downcase.to_sym)
        +        rescue
        +          false
        +        end
        +      end
        +    end
        +  end
        +
        +  SyntaxHighlighting.highlighter = 'CodeRay'
        +end
        diff --git a/lib/redmine/themes.rb b/lib/redmine/themes.rb
        new file mode 100644
        index 0000000..75e1f4c
        --- /dev/null
        +++ b/lib/redmine/themes.rb
        @@ -0,0 +1,143 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module Themes
        +
        +    # Return an array of installed themes
        +    def self.themes
        +      @@installed_themes ||= scan_themes
        +    end
        +
        +    # Rescan themes directory
        +    def self.rescan
        +      @@installed_themes = scan_themes
        +    end
        +
        +    # Return theme for given id, or nil if it's not found
        +    def self.theme(id, options={})
        +      return nil if id.blank?
        +
        +      found = themes.find {|t| t.id == id}
        +      if found.nil? && options[:rescan] != false
        +        rescan
        +        found = theme(id, :rescan => false)
        +      end
        +      found
        +    end
        +
        +    # Class used to represent a theme
        +    class Theme
        +      attr_reader :path, :name, :dir
        +
        +      def initialize(path)
        +        @path = path
        +        @dir = File.basename(path)
        +        @name = @dir.humanize
        +        @stylesheets = nil
        +        @javascripts = nil
        +      end
        +
        +      # Directory name used as the theme id
        +      def id; dir end
        +
        +      def ==(theme)
        +        theme.is_a?(Theme) && theme.dir == dir
        +      end
        +
        +      def <=>(theme)
        +        name <=> theme.name
        +      end
        +
        +      def stylesheets
        +        @stylesheets ||= assets("stylesheets", "css")
        +      end
        +
        +      def images
        +        @images ||= assets("images")
        +      end
        +
        +      def javascripts
        +        @javascripts ||= assets("javascripts", "js")
        +      end
        +
        +      def favicons
        +        @favicons ||= assets("favicon")
        +      end
        +
        +      def favicon
        +        favicons.first
        +      end
        +
        +      def favicon?
        +        favicon.present?
        +      end
        +
        +      def stylesheet_path(source)
        +        "/themes/#{dir}/stylesheets/#{source}"
        +      end
        +
        +      def image_path(source)
        +        "/themes/#{dir}/images/#{source}"
        +      end
        +
        +      def javascript_path(source)
        +        "/themes/#{dir}/javascripts/#{source}"
        +      end
        +
        +      def favicon_path
        +        "/themes/#{dir}/favicon/#{favicon}"
        +      end
        +
        +      private
        +
        +      def assets(dir, ext=nil)
        +        if ext
        +          Dir.glob("#{path}/#{dir}/*.#{ext}").collect {|f| File.basename(f).gsub(/\.#{ext}$/, '')}
        +        else
        +          Dir.glob("#{path}/#{dir}/*").collect {|f| File.basename(f)}
        +        end
        +      end
        +    end
        +
        +    module Helper
        +      def current_theme
        +        unless instance_variable_defined?(:@current_theme)
        +          @current_theme = Redmine::Themes.theme(Setting.ui_theme)
        +        end
        +        @current_theme
        +      end
        +    
        +      # Returns the header tags for the current theme
        +      def heads_for_theme
        +        if current_theme && current_theme.javascripts.include?('theme')
        +          javascript_include_tag current_theme.javascript_path('theme')
        +        end
        +      end
        +    end
        +
        +    private
        +
        +    def self.scan_themes
        +      dirs = Dir.glob("#{Rails.public_path}/themes/*").select do |f|
        +        # A theme should at least override application.css
        +        File.directory?(f) && File.exist?("#{f}/stylesheets/application.css")
        +      end
        +      dirs.collect {|dir| Theme.new(dir)}.sort
        +    end
        +  end
        +end
        diff --git a/lib/redmine/thumbnail.rb b/lib/redmine/thumbnail.rb
        new file mode 100644
        index 0000000..e4ae768
        --- /dev/null
        +++ b/lib/redmine/thumbnail.rb
        @@ -0,0 +1,66 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'fileutils'
        +require 'mimemagic'
        +
        +module Redmine
        +  module Thumbnail
        +    extend Redmine::Utils::Shell
        +
        +    CONVERT_BIN = (Redmine::Configuration['imagemagick_convert_command'] || 'convert').freeze
        +    ALLOWED_TYPES = %w(image/bmp image/gif image/jpeg image/png)
        +
        +    # Generates a thumbnail for the source image to target
        +    def self.generate(source, target, size)
        +      return nil unless convert_available?
        +      unless File.exists?(target)
        +        # Make sure we only invoke Imagemagick if the file type is allowed
        +        unless File.open(source) {|f| ALLOWED_TYPES.include? MimeMagic.by_magic(f).try(:type) }
        +          return nil
        +        end
        +        directory = File.dirname(target)
        +        unless File.exists?(directory)
        +          FileUtils.mkdir_p directory
        +        end
        +        size_option = "#{size}x#{size}>"
        +        cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -thumbnail #{shell_quote size_option} #{shell_quote target}"
        +        unless system(cmd)
        +          logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}")
        +          return nil
        +        end
        +      end
        +      target
        +    end
        +
        +    def self.convert_available?
        +      return @convert_available if defined?(@convert_available)
        +      begin
        +        `#{shell_quote CONVERT_BIN} -version`
        +        @convert_available = $?.success?
        +      rescue
        +        @convert_available = false
        +      end
        +      logger.warn("Imagemagick's convert binary (#{CONVERT_BIN}) not available") unless @convert_available
        +      @convert_available
        +    end
        +
        +    def self.logger
        +      Rails.logger
        +    end
        +  end
        +end
        diff --git a/lib/redmine/unified_diff.rb b/lib/redmine/unified_diff.rb
        new file mode 100644
        index 0000000..7e2e202
        --- /dev/null
        +++ b/lib/redmine/unified_diff.rb
        @@ -0,0 +1,284 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  # Class used to parse unified diffs
        +  class UnifiedDiff < Array
        +    attr_reader :diff_type, :diff_style
        +
        +    def initialize(diff, options={})
        +      options.assert_valid_keys(:type, :style, :max_lines)
        +      diff = diff.split("\n") if diff.is_a?(String)
        +      @diff_type = options[:type] || 'inline'
        +      @diff_style = options[:style]
        +      lines = 0
        +      @truncated = false
        +      diff_table = DiffTable.new(diff_type, diff_style)
        +      diff.each do |line_raw|
        +        line = Redmine::CodesetUtil.to_utf8_by_setting(line_raw)
        +        unless diff_table.add_line(line)
        +          self << diff_table if diff_table.length > 0
        +          diff_table = DiffTable.new(diff_type, diff_style)
        +        end
        +        lines += 1
        +        if options[:max_lines] && lines > options[:max_lines]
        +          @truncated = true
        +          break
        +        end
        +      end
        +      self << diff_table unless diff_table.empty?
        +      self
        +    end
        +
        +    def truncated?; @truncated; end
        +  end
        +
        +  # Class that represents a file diff
        +  class DiffTable < Array
        +    attr_reader :file_name
        +
        +    # Initialize with a Diff file and the type of Diff View
        +    # The type view must be inline or sbs (side_by_side)
        +    def initialize(type="inline", style=nil)
        +      @parsing = false
        +      @added = 0
        +      @removed = 0
        +      @type = type
        +      @style = style
        +      @file_name = nil
        +      @git_diff = false
        +    end
        +
        +    # Function for add a line of this Diff
        +    # Returns false when the diff ends
        +    def add_line(line)
        +      unless @parsing
        +        if line =~ /^(---|\+\+\+) (.*)$/
        +          self.file_name = $2
        +        elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
        +          @line_num_l = $2.to_i
        +          @line_num_r = $5.to_i
        +          @parsing = true
        +        end
        +      else
        +        if line =~ %r{^[^\+\-\s@\\]}
        +          @parsing = false
        +          return false
        +        elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
        +          @line_num_l = $2.to_i
        +          @line_num_r = $5.to_i
        +        else
        +          parse_line(line, @type)
        +        end
        +      end
        +      return true
        +    end
        +
        +    def each_line
        +      prev_line_left, prev_line_right = nil, nil
        +      each do |line|
        +        spacing = prev_line_left && prev_line_right && (line.nb_line_left != prev_line_left+1) && (line.nb_line_right != prev_line_right+1)
        +        yield spacing, line
        +        prev_line_left = line.nb_line_left.to_i if line.nb_line_left.to_i > 0
        +        prev_line_right = line.nb_line_right.to_i if line.nb_line_right.to_i > 0
        +      end
        +    end
        +
        +    def inspect
        +      puts '### DIFF TABLE ###'
        +      puts "file : #{file_name}"
        +      self.each do |d|
        +        d.inspect
        +      end
        +    end
        +
        +    private
        +
        +    def file_name=(arg)
        +      both_git_diff = false
        +      if file_name.nil?
        +        @git_diff = true if arg =~ %r{^(a/|/dev/null)}
        +      else
        +        both_git_diff = (@git_diff && arg =~ %r{^(b/|/dev/null)})
        +      end
        +      if both_git_diff
        +        if file_name && arg == "/dev/null"
        +          # keep the original file name
        +          @file_name = file_name.sub(%r{^a/}, '')
        +        else
        +          # remove leading b/
        +          @file_name = arg.sub(%r{^b/}, '')
        +        end
        +      elsif @style == "Subversion"
        +        # removing trailing "(revision nn)"
        +        @file_name = arg.sub(%r{\t+\(.*\)$}, '')
        +      else
        +        @file_name = arg
        +      end
        +    end
        +
        +    def diff_for_added_line
        +      if @type == 'sbs' && @removed > 0 && @added < @removed
        +        self[-(@removed - @added)]
        +      else
        +        diff = Diff.new
        +        self << diff
        +        diff
        +      end
        +    end
        +
        +    def parse_line(line, type="inline")
        +      if line[0, 1] == "+"
        +        diff = diff_for_added_line
        +        diff.line_right = line[1..-1]
        +        diff.nb_line_right = @line_num_r
        +        diff.type_diff_right = 'diff_in'
        +        @line_num_r += 1
        +        @added += 1
        +        true
        +      elsif line[0, 1] == "-"
        +        diff = Diff.new
        +        diff.line_left = line[1..-1]
        +        diff.nb_line_left = @line_num_l
        +        diff.type_diff_left = 'diff_out'
        +        self << diff
        +        @line_num_l += 1
        +        @removed += 1
        +        true
        +      else
        +        write_offsets
        +        if line[0, 1] =~ /\s/
        +          diff = Diff.new
        +          diff.line_right = line[1..-1]
        +          diff.nb_line_right = @line_num_r
        +          diff.line_left = line[1..-1]
        +          diff.nb_line_left = @line_num_l
        +          self << diff
        +          @line_num_l += 1
        +          @line_num_r += 1
        +          true
        +        elsif line[0, 1] = "\\"
        +          true
        +        else
        +          false
        +        end
        +      end
        +    end
        +
        +    def write_offsets
        +      if @added > 0 && @added == @removed
        +        @added.times do |i|
        +          line = self[-(1 + i)]
        +          removed = (@type == 'sbs') ? line : self[-(1 + @added + i)]
        +          offsets = offsets(removed.line_left, line.line_right)
        +          removed.offsets = line.offsets = offsets
        +        end
        +      end
        +      @added = 0
        +      @removed = 0
        +    end
        +
        +    def offsets(line_left, line_right)
        +      if line_left.present? && line_right.present? && line_left != line_right
        +        max = [line_left.size, line_right.size].min
        +        starting = 0
        +        while starting < max && line_left[starting] == line_right[starting]
        +          starting += 1
        +        end
        +        ending = -1
        +        while ending >= -(max - starting) && (line_left[ending] == line_right[ending])
        +          ending -= 1
        +        end
        +        unless starting == 0 && ending == -1
        +          [starting, ending]
        +        end
        +      end
        +    end
        +  end
        +
        +  # A line of diff
        +  class Diff
        +    attr_accessor :nb_line_left
        +    attr_accessor :line_left
        +    attr_accessor :nb_line_right
        +    attr_accessor :line_right
        +    attr_accessor :type_diff_right
        +    attr_accessor :type_diff_left
        +    attr_accessor :offsets
        +
        +    def initialize()
        +      self.nb_line_left = ''
        +      self.nb_line_right = ''
        +      self.line_left = ''
        +      self.line_right = ''
        +      self.type_diff_right = ''
        +      self.type_diff_left = ''
        +    end
        +
        +    def type_diff
        +      type_diff_right == 'diff_in' ? type_diff_right : type_diff_left
        +    end
        +
        +    def line
        +      type_diff_right == 'diff_in' ? line_right : line_left
        +    end
        +
        +    def html_line_left
        +      line_to_html(line_left, offsets)
        +    end
        +
        +    def html_line_right
        +      line_to_html(line_right, offsets)
        +    end
        +
        +    def html_line
        +      line_to_html(line, offsets)
        +    end
        +
        +    def inspect
        +      puts '### Start Line Diff ###'
        +      puts self.nb_line_left
        +      puts self.line_left
        +      puts self.nb_line_right
        +      puts self.line_right
        +    end
        +
        +    private
        +
        +    def line_to_html(line, offsets)
        +      html = line_to_html_raw(line, offsets)
        +      html.force_encoding('UTF-8')
        +      html
        +    end
        +
        +    def line_to_html_raw(line, offsets)
        +      if offsets
        +        s = ''
        +        unless offsets.first == 0
        +          s << CGI.escapeHTML(line[0..offsets.first-1])
        +        end
        +        s << '' + CGI.escapeHTML(line[offsets.first..offsets.last]) + ''
        +        unless offsets.last == -1
        +          s << CGI.escapeHTML(line[offsets.last+1..-1])
        +        end
        +        s
        +      else
        +        CGI.escapeHTML(line)
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/utils.rb b/lib/redmine/utils.rb
        new file mode 100644
        index 0000000..d255dfa
        --- /dev/null
        +++ b/lib/redmine/utils.rb
        @@ -0,0 +1,150 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'fileutils'
        +
        +module Redmine
        +  module Utils
        +    class << self
        +      # Returns the relative root url of the application
        +      def relative_url_root
        +        ActionController::Base.respond_to?('relative_url_root') ?
        +          ActionController::Base.relative_url_root.to_s :
        +          ActionController::Base.config.relative_url_root.to_s
        +      end
        +
        +      # Sets the relative root url of the application
        +      def relative_url_root=(arg)
        +        if ActionController::Base.respond_to?('relative_url_root=')
        +          ActionController::Base.relative_url_root=arg
        +        else
        +          ActionController::Base.config.relative_url_root = arg
        +        end
        +      end
        +
        +      # Generates a n bytes random hex string
        +      # Example:
        +      #   random_hex(4) # => "89b8c729"
        +      def random_hex(n)
        +        SecureRandom.hex(n)
        +      end
        +
        +      def save_upload(upload, path)
        +        directory = File.dirname(path)
        +        unless File.exists?(directory)
        +          FileUtils.mkdir_p directory
        +        end
        +        File.open(path, "wb") do |f|
        +          if upload.respond_to?(:read)
        +            buffer = ""
        +            while (buffer = upload.read(8192))
        +              f.write(buffer)
        +              yield buffer if block_given?
        +            end
        +          else
        +            f.write(upload)
        +            yield upload if block_given?
        +          end
        +        end
        +      end
        +    end
        +
        +    module Shell
        +
        +      module_function
        +
        +      def shell_quote(str)
        +        if Redmine::Platform.mswin?
        +          '"' + str.gsub(/"/, '\\"') + '"'
        +        else
        +          "'" + str.gsub(/'/, "'\"'\"'") + "'"
        +        end
        +      end
        +
        +      def shell_quote_command(command)
        +        if Redmine::Platform.mswin? && RUBY_PLATFORM == 'java'
        +          command
        +        else
        +          shell_quote(command)
        +        end
        +      end
        +    end
        +
        +    module DateCalculation
        +      # Returns the number of working days between from and to
        +      def working_days(from, to)
        +        days = (to - from).to_i
        +        if days > 0
        +          weeks = days / 7
        +          result = weeks * (7 - non_working_week_days.size)
        +          days_left = days - weeks * 7
        +          start_cwday = from.cwday
        +          days_left.times do |i|
        +            unless non_working_week_days.include?(((start_cwday + i - 1) % 7) + 1)
        +              result += 1
        +            end
        +          end
        +          result
        +        else
        +          0
        +        end
        +      end
        +
        +      # Adds working days to the given date
        +      def add_working_days(date, working_days)
        +        if working_days > 0
        +          weeks = working_days / (7 - non_working_week_days.size)
        +          result = weeks * 7
        +          days_left = working_days - weeks * (7 - non_working_week_days.size)
        +          cwday = date.cwday
        +          while days_left > 0
        +            cwday += 1
        +            unless non_working_week_days.include?(((cwday - 1) % 7) + 1)
        +              days_left -= 1
        +            end
        +            result += 1
        +          end
        +          next_working_date(date + result)
        +        else
        +          date
        +        end
        +      end
        +
        +      # Returns the date of the first day on or after the given date that is a working day
        +      def next_working_date(date)
        +        cwday = date.cwday
        +        days = 0
        +        while non_working_week_days.include?(((cwday + days - 1) % 7) + 1)
        +          days += 1
        +        end
        +        date + days
        +      end
        +
        +      # Returns the index of non working week days (1=monday, 7=sunday)
        +      def non_working_week_days
        +        @non_working_week_days ||= begin
        +          days = Setting.non_working_week_days
        +          if days.is_a?(Array) && days.size < 7
        +            days.map(&:to_i)
        +          else
        +            []
        +          end
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb
        new file mode 100644
        index 0000000..1d50076
        --- /dev/null
        +++ b/lib/redmine/version.rb
        @@ -0,0 +1,37 @@
        +require 'rexml/document'
        +
        +module Redmine
        +  module VERSION #:nodoc:
        +    MAJOR = 3
        +    MINOR = 4
        +    TINY  = 13
        +
        +    # Branch values:
        +    # * official release: nil
        +    # * stable branch:    stable
        +    # * trunk:            devel
        +    BRANCH = 'stable'
        +
        +    # Retrieves the revision from the working copy
        +    def self.revision
        +      if File.directory?(File.join(Rails.root, '.svn'))
        +        begin
        +          path = Redmine::Scm::Adapters::AbstractAdapter.shell_quote(Rails.root.to_s)
        +          if `svn info --xml #{path}` =~ /revision="(\d+)"/
        +            return $1.to_i
        +          end
        +        rescue
        +          # Could not find the current revision
        +        end
        +      end
        +      nil
        +    end
        +
        +    REVISION = self.revision
        +    ARRAY    = [MAJOR, MINOR, TINY, BRANCH, REVISION].compact
        +    STRING   = ARRAY.join('.')
        +
        +    def self.to_a; ARRAY  end
        +    def self.to_s; STRING end
        +  end
        +end
        diff --git a/lib/redmine/views/api_template_handler.rb b/lib/redmine/views/api_template_handler.rb
        new file mode 100644
        index 0000000..357badb
        --- /dev/null
        +++ b/lib/redmine/views/api_template_handler.rb
        @@ -0,0 +1,26 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module Views
        +    class ApiTemplateHandler
        +      def self.call(template)
        +        "Redmine::Views::Builders.for(params[:format], request, response) do |api|; #{template.source}; self.output_buffer = api.output; end"
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/views/builders.rb b/lib/redmine/views/builders.rb
        new file mode 100644
        index 0000000..fd98e6d
        --- /dev/null
        +++ b/lib/redmine/views/builders.rb
        @@ -0,0 +1,38 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'redmine/views/builders/json'
        +require 'redmine/views/builders/xml'
        +
        +module Redmine
        +  module Views
        +    module Builders
        +      def self.for(format, request, response, &block)
        +        builder = case format
        +          when 'xml',  :xml;  Builders::Xml.new(request, response)
        +          when 'json', :json; Builders::Json.new(request, response)
        +          else; raise "No builder for format #{format}"
        +        end
        +        if block
        +          block.call(builder)
        +        else
        +          builder
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/views/builders/json.rb b/lib/redmine/views/builders/json.rb
        new file mode 100644
        index 0000000..97ac125
        --- /dev/null
        +++ b/lib/redmine/views/builders/json.rb
        @@ -0,0 +1,45 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'redmine/views/builders/structure'
        +
        +module Redmine
        +  module Views
        +    module Builders
        +      class Json < Structure
        +        attr_accessor :jsonp
        +
        +        def initialize(request, response)
        +          super
        +          callback = request.params[:callback] || request.params[:jsonp]
        +          if callback && Setting.jsonp_enabled?
        +            self.jsonp = callback.to_s.gsub(/[^a-zA-Z0-9_.]/, '')
        +          end
        +        end
        +
        +        def output
        +          json = @struct.first.to_json
        +          if jsonp.present?
        +            json = "#{jsonp}(#{json})"
        +            response.content_type = 'application/javascript'
        +          end
        +          json
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/views/builders/structure.rb b/lib/redmine/views/builders/structure.rb
        new file mode 100644
        index 0000000..7c79279
        --- /dev/null
        +++ b/lib/redmine/views/builders/structure.rb
        @@ -0,0 +1,94 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'blankslate'
        +
        +module Redmine
        +  module Views
        +    module Builders
        +      class Structure < BlankSlate
        +        attr_accessor :request, :response
        +
        +        def initialize(request, response)
        +          @struct = [{}]
        +          self.request = request
        +          self.response = response
        +        end
        +
        +        def array(tag, options={}, &block)
        +          @struct << []
        +          block.call(self)
        +          ret = @struct.pop
        +          @struct.last[tag] = ret
        +          @struct.last.merge!(options) if options
        +        end
        +
        +        def encode_value(value)
        +          if value.is_a?(Time)
        +            # Rails uses a global setting to format JSON times
        +            # Don't rely on it for the API as it could have been changed
        +            value.xmlschema(0)
        +          else
        +            value
        +          end
        +        end
        +
        +        def method_missing(sym, *args, &block)
        +          if args.count > 0
        +            if args.first.is_a?(Hash)
        +              if @struct.last.is_a?(Array)
        +                @struct.last << args.first unless block
        +              else
        +                @struct.last[sym] = args.first
        +              end
        +            else
        +              value = encode_value(args.first)
        +              if @struct.last.is_a?(Array)
        +                if args.size == 1 && !block_given?
        +                  @struct.last << value
        +                else
        +                  @struct.last << (args.last || {}).merge(:value => value)
        +                end
        +              else
        +                @struct.last[sym] = value
        +              end
        +            end
        +          end
        +
        +          if block
        +            @struct << (args.first.is_a?(Hash) ? args.first : {})
        +            block.call(self)
        +            ret = @struct.pop
        +            if @struct.last.is_a?(Array)
        +              @struct.last << ret
        +            else
        +              if @struct.last.has_key?(sym) && @struct.last[sym].is_a?(Hash)
        +                @struct.last[sym].merge! ret
        +              else
        +                @struct.last[sym] = ret
        +              end
        +            end
        +          end
        +        end
        +
        +        def output
        +          raise "Need to implement #{self.class.name}#output"
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/views/builders/xml.rb b/lib/redmine/views/builders/xml.rb
        new file mode 100644
        index 0000000..162de7a
        --- /dev/null
        +++ b/lib/redmine/views/builders/xml.rb
        @@ -0,0 +1,48 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'builder'
        +
        +module Redmine
        +  module Views
        +    module Builders
        +      class Xml < ::Builder::XmlMarkup
        +        def initialize(request, response)
        +          super()
        +          instruct!
        +        end
        +
        +        def output
        +          target!
        +        end
        +
        +        # Overrides Builder::XmlBase#tag! to format timestamps in ISO 8601
        +        def tag!(sym, *args, &block)
        +          if args.size == 1 && args.first.is_a?(::Time)
        +            tag! sym, args.first.xmlschema, &block
        +          else
        +            super
        +          end
        +        end
        +
        +        def array(name, options={}, &block)
        +          __send__ name, (options || {}).merge(:type => 'array'), &block
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/views/labelled_form_builder.rb b/lib/redmine/views/labelled_form_builder.rb
        new file mode 100644
        index 0000000..7481d79
        --- /dev/null
        +++ b/lib/redmine/views/labelled_form_builder.rb
        @@ -0,0 +1,64 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'action_view/helpers/form_helper'
        +
        +class Redmine::Views::LabelledFormBuilder < ActionView::Helpers::FormBuilder
        +  include Redmine::I18n
        +
        +  (field_helpers.map(&:to_s) - %w(radio_button hidden_field fields_for check_box label) +
        +        %w(date_select)).each do |selector|
        +    src = <<-END_SRC
        +    def #{selector}(field, options = {})
        +      label_for_field(field, options) + super(field, options.except(:label)).html_safe
        +    end
        +    END_SRC
        +    class_eval src, __FILE__, __LINE__
        +  end
        +
        +  def check_box(field, options={}, checked_value="1", unchecked_value="0")
        +    label_for_field(field, options) + super(field, options.except(:label), checked_value, unchecked_value).html_safe
        +  end
        +
        +  def select(field, choices, options = {}, html_options = {})
        +    label_for_field(field, options) + super(field, choices, options, html_options.except(:label)).html_safe
        +  end
        +
        +  def time_zone_select(field, priority_zones = nil, options = {}, html_options = {})
        +    label_for_field(field, options) + super(field, priority_zones, options, html_options.except(:label)).html_safe
        +  end
        +
        +  # A field for entering hours value
        +  def hours_field(field, options={})
        +    # display the value before type cast when the entered value is not valid
        +    if @object.errors[field].blank?
        +      options = options.merge(:value => format_hours(@object.send field))
        +    end
        +    text_field field, options
        +  end
        +
        +  # Returns a label tag for the given field
        +  def label_for_field(field, options = {})
        +    return ''.html_safe if options.delete(:no_label)
        +    text = options[:label].is_a?(Symbol) ? l(options[:label]) : options[:label]
        +    text ||= l(("field_" + field.to_s.gsub(/\_id$/, "")).to_sym)
        +    text += @template.content_tag("span", " *", :class => "required") if options.delete(:required)
        +    @template.content_tag("label", text.html_safe,
        +                                   :class => (@object && @object.errors[field].present? ? "error" : nil),
        +                                   :for => (@object_name.to_s + "_" + field.to_s))
        +  end
        +end
        diff --git a/lib/redmine/views/other_formats_builder.rb b/lib/redmine/views/other_formats_builder.rb
        new file mode 100644
        index 0000000..c022055
        --- /dev/null
        +++ b/lib/redmine/views/other_formats_builder.rb
        @@ -0,0 +1,43 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module Views
        +    class OtherFormatsBuilder
        +      def initialize(view)
        +        @view = view
        +      end
        +
        +      def link_to(name, options={})
        +        url = { :format => name.to_s.downcase }.merge(options.delete(:url) || {}).except('page')
        +        caption = options.delete(:caption) || name
        +        html_options = { :class => name.to_s.downcase, :rel => 'nofollow' }.merge(options)
        +        @view.content_tag('span', @view.link_to(caption, url, html_options))
        +      end
        +
        +      # Preserves query parameters
        +      def link_to_with_query_parameters(name, url={}, options={})
        +        params = @view.request.query_parameters.except(:page, :format).except(*url.keys)
        +        url = {:params => params, :page => nil, :format => name.to_s.downcase}.merge(url)
        +
        +        caption = options.delete(:caption) || name
        +        html_options = { :class => name.to_s.downcase, :rel => 'nofollow' }.merge(options)
        +        @view.content_tag('span', @view.link_to(caption, url, html_options))
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/wiki_formatting.rb b/lib/redmine/wiki_formatting.rb
        new file mode 100644
        index 0000000..bb90892
        --- /dev/null
        +++ b/lib/redmine/wiki_formatting.rb
        @@ -0,0 +1,200 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'digest/md5'
        +
        +module Redmine
        +  module WikiFormatting
        +    class StaleSectionError < Exception; end
        +
        +    @@formatters = {}
        +
        +    class << self
        +      def map
        +        yield self
        +      end
        +
        +      def register(name, *args)
        +        options = args.last.is_a?(Hash) ? args.pop : {}
        +        name = name.to_s
        +        raise ArgumentError, "format name '#{name}' is already taken" if @@formatters[name]
        +
        +        formatter, helper, parser = args.any? ?
        +          args :
        +          %w(Formatter Helper HtmlParser).map {|m| "Redmine::WikiFormatting::#{name.classify}::#{m}".constantize rescue nil}
        +
        +        raise "A formatter class is required" if formatter.nil?
        +
        +        @@formatters[name] = {
        +          :formatter => formatter,
        +          :helper => helper,
        +          :html_parser => parser,
        +          :label => options[:label] || name.humanize
        +        }
        +      end
        +
        +      def formatter
        +        formatter_for(Setting.text_formatting)
        +      end
        +
        +      def html_parser
        +        html_parser_for(Setting.text_formatting)
        +      end
        +
        +      def formatter_for(name)
        +        entry = @@formatters[name.to_s]
        +        (entry && entry[:formatter]) || Redmine::WikiFormatting::NullFormatter::Formatter
        +      end
        +
        +      def helper_for(name)
        +        entry = @@formatters[name.to_s]
        +        (entry && entry[:helper]) || Redmine::WikiFormatting::NullFormatter::Helper
        +      end
        +
        +      def html_parser_for(name)
        +        entry = @@formatters[name.to_s]
        +        (entry && entry[:html_parser]) || Redmine::WikiFormatting::HtmlParser
        +      end
        +
        +      def format_names
        +        @@formatters.keys.map
        +      end
        +
        +      def formats_for_select
        +        @@formatters.map {|name, options| [options[:label], name]}
        +      end
        +
        +      def to_html(format, text, options = {})
        +        text = if Setting.cache_formatted_text? && text.size > 2.kilobyte && cache_store && cache_key = cache_key_for(format, text, options[:object], options[:attribute])
        +          # Text retrieved from the cache store may be frozen
        +          # We need to dup it so we can do in-place substitutions with gsub!
        +          cache_store.fetch cache_key do
        +            formatter_for(format).new(text).to_html
        +          end.dup
        +        else
        +          formatter_for(format).new(text).to_html
        +        end
        +        text
        +      end
        +
        +      # Returns true if the text formatter supports single section edit
        +      def supports_section_edit?
        +        (formatter.instance_methods & ['update_section', :update_section]).any?
        +      end
        +
        +      # Returns a cache key for the given text +format+, +text+, +object+ and +attribute+ or nil if no caching should be done
        +      def cache_key_for(format, text, object, attribute)
        +        if object && attribute && !object.new_record? && format.present?
        +          "formatted_text/#{format}/#{object.class.model_name.cache_key}/#{object.id}-#{attribute}-#{Digest::MD5.hexdigest text}"
        +        end
        +      end
        +
        +      # Returns the cache store used to cache HTML output
        +      def cache_store
        +        ActionController::Base.cache_store
        +      end
        +    end
        +
        +    module LinksHelper
        +      AUTO_LINK_RE = %r{
        +                      (                          # leading text
        +                        <\w+[^>]*?>|             # leading HTML tag, or
        +                        [\s\(\[,;]|              # leading punctuation, or
        +                        ^                        # beginning of line
        +                      )
        +                      (
        +                        (?:https?://)|           # protocol spec, or
        +                        (?:s?ftps?://)|
        +                        (?:www\.)                # www.*
        +                      )
        +                      (
        +                        ([^<]\S*?)               # url
        +                        (\/)?                    # slash
        +                      )
        +                      ((?:>)?|[^[:alnum:]_\=\/;\(\)]*?)               # post
        +                      (?=<|\s|$)
        +                     }x unless const_defined?(:AUTO_LINK_RE)
        +
        +      # Destructively replaces urls into clickable links
        +      def auto_link!(text)
        +        text.gsub!(AUTO_LINK_RE) do
        +          all, leading, proto, url, post = $&, $1, $2, $3, $6
        +          if leading =~ /=]?/
        +            # don't replace URLs that are already linked
        +            # and URLs prefixed with ! !> !< != (textile images)
        +            all
        +          else
        +            # Idea below : an URL with unbalanced parenthesis and
        +            # ending by ')' is put into external parenthesis
        +            if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) )
        +              url=url[0..-2] # discard closing parenthesis from url
        +              post = ")"+post # add closing parenthesis to post
        +            end
        +            content = proto + url
        +            href = "#{proto=="www."?"http://www.":proto}#{url}"
        +            %(#{leading}#{ERB::Util.html_escape content}#{post}).html_safe
        +          end
        +        end
        +      end
        +
        +      # Destructively replaces email addresses into clickable links
        +      def auto_mailto!(text)
        +        text.gsub!(/((?]*>(.*)(#{Regexp.escape(mail)})(.*)<\/a>/)
        +            mail
        +          else
        +            %().html_safe
        +          end
        +        end
        +      end
        +    end
        +
        +    # Default formatter module
        +    module NullFormatter
        +      class Formatter
        +        include ActionView::Helpers::TagHelper
        +        include ActionView::Helpers::TextHelper
        +        include ActionView::Helpers::UrlHelper
        +        include Redmine::WikiFormatting::LinksHelper
        +
        +        def initialize(text)
        +          @text = text
        +        end
        +
        +        def to_html(*args)
        +          t = CGI::escapeHTML(@text)
        +          auto_link!(t)
        +          auto_mailto!(t)
        +          simple_format(t, {}, :sanitize => false)
        +        end
        +      end
        +
        +      module Helper
        +        def wikitoolbar_for(field_id)
        +        end
        +
        +        def heads_for_wiki_formatter
        +        end
        +
        +        def initial_page_content(page)
        +          page.pretty_title.to_s
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/wiki_formatting/html_parser.rb b/lib/redmine/wiki_formatting/html_parser.rb
        new file mode 100644
        index 0000000..da8ce81
        --- /dev/null
        +++ b/lib/redmine/wiki_formatting/html_parser.rb
        @@ -0,0 +1,62 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +require 'loofah/helpers'
        +
        +module Redmine
        +  module WikiFormatting
        +    class HtmlParser
        +
        +      class_attribute :tags
        +      self.tags = {
        +        'br' => {:post => "\n"},
        +        'style' => ''
        +      }
        +
        +      def self.to_text(html)
        +        html = html.gsub(/[\n\r]/, '').squeeze(' ')
        +    
        +        doc = Loofah.document(html)
        +        doc.scrub!(WikiTags.new(tags))
        +        doc.scrub!(:newline_block_elements)
        +    
        +        Loofah::Helpers.remove_extraneous_whitespace(doc.text).strip
        +      end
        +
        +      class WikiTags < ::Loofah::Scrubber
        +        def initialize(tags_to_text)
        +          @direction = :bottom_up
        +          @tags_to_text = tags_to_text || {}
        +        end
        +    
        +        def scrub(node)
        +          formatting = @tags_to_text[node.name]
        +          case formatting
        +          when Hash
        +            node.add_next_sibling Nokogiri::XML::Text.new("#{formatting[:pre]}#{node.content}#{formatting[:post]}", node.document)
        +            node.remove
        +          when String
        +            node.add_next_sibling Nokogiri::XML::Text.new(formatting, node.document)
        +            node.remove
        +          else
        +            CONTINUE
        +          end
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/wiki_formatting/macros.rb b/lib/redmine/wiki_formatting/macros.rb
        new file mode 100644
        index 0000000..f4700f2
        --- /dev/null
        +++ b/lib/redmine/wiki_formatting/macros.rb
        @@ -0,0 +1,256 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module WikiFormatting
        +    module Macros
        +      module Definitions
        +        # Returns true if +name+ is the name of an existing macro
        +        def macro_exists?(name)
        +          Redmine::WikiFormatting::Macros.available_macros.key?(name.to_sym)
        +        end
        +
        +        def exec_macro(name, obj, args, text)
        +          macro_options = Redmine::WikiFormatting::Macros.available_macros[name.to_sym]
        +          return unless macro_options
        +
        +          method_name = "macro_#{name}"
        +          unless macro_options[:parse_args] == false
        +            args = args.split(',').map(&:strip)
        +          end
        +
        +          begin
        +            if self.class.instance_method(method_name).arity == 3
        +              send(method_name, obj, args, text)
        +            elsif text
        +              raise "This macro does not accept a block of text"
        +            else
        +              send(method_name, obj, args)
        +            end
        +          rescue => e
        +            "
        Error executing the #{h name} macro (#{h e.to_s})
        ".html_safe + end + end + + def extract_macro_options(args, *keys) + options = {} + while args.last.to_s.strip =~ %r{^(.+?)\=(.+)$} && keys.include?($1.downcase.to_sym) + options[$1.downcase.to_sym] = $2 + args.pop + end + return [args, options] + end + end + + @@available_macros = {} + mattr_accessor :available_macros + + class << self + # Plugins can use this method to define new macros: + # + # Redmine::WikiFormatting::Macros.register do + # desc "This is my macro" + # macro :my_macro do |obj, args| + # "My macro output" + # end + # + # desc "This is my macro that accepts a block of text" + # macro :my_macro do |obj, args, text| + # "My macro output" + # end + # end + def register(&block) + class_eval(&block) if block_given? + end + + # Defines a new macro with the given name, options and block. + # + # Options: + # * :desc - A description of the macro + # * :parse_args => false - Disables arguments parsing (the whole arguments + # string is passed to the macro) + # + # Macro blocks accept 2 or 3 arguments: + # * obj: the object that is rendered (eg. an Issue, a WikiContent...) + # * args: macro arguments + # * text: the block of text given to the macro (should be present only if the + # macro accepts a block of text). text is a String or nil if the macro is + # invoked without a block of text. + # + # Examples: + # By default, when the macro is invoked, the comma separated list of arguments + # is split and passed to the macro block as an array. If no argument is given + # the macro will be invoked with an empty array: + # + # macro :my_macro do |obj, args| + # # args is an array + # # and this macro do not accept a block of text + # end + # + # You can disable arguments spliting with the :parse_args => false option. In + # this case, the full string of arguments is passed to the macro: + # + # macro :my_macro, :parse_args => false do |obj, args| + # # args is a string + # end + # + # Macro can optionally accept a block of text: + # + # macro :my_macro do |obj, args, text| + # # this macro accepts a block of text + # end + # + # Macros are invoked in formatted text using double curly brackets. Arguments + # must be enclosed in parenthesis if any. A new line after the macro name or the + # arguments starts the block of text that will be passe to the macro (invoking + # a macro that do not accept a block of text with some text will fail). + # Examples: + # + # No arguments: + # {{my_macro}} + # + # With arguments: + # {{my_macro(arg1, arg2)}} + # + # With a block of text: + # {{my_macro + # multiple lines + # of text + # }} + # + # With arguments and a block of text + # {{my_macro(arg1, arg2) + # multiple lines + # of text + # }} + # + # If a block of text is given, the closing tag }} must be at the start of a new line. + def macro(name, options={}, &block) + options.assert_valid_keys(:desc, :parse_args) + unless name.to_s.match(/\A\w+\z/) + raise "Invalid macro name: #{name} (only 0-9, A-Z, a-z and _ characters are accepted)" + end + unless block_given? + raise "Can not create a macro without a block!" + end + name = name.to_s.downcase.to_sym + available_macros[name] = {:desc => @@desc || ''}.merge(options) + @@desc = nil + Definitions.send :define_method, "macro_#{name}", &block + end + + # Sets description for the next macro to be defined + def desc(txt) + @@desc = txt + end + end + + # Builtin macros + desc "Sample macro." + macro :hello_world do |obj, args, text| + h("Hello world! Object: #{obj.class.name}, " + + (args.empty? ? "Called with no argument" : "Arguments: #{args.join(', ')}") + + " and " + (text.present? ? "a #{text.size} bytes long block of text." : "no block of text.") + ) + end + + desc "Displays a list of all available macros, including description if available." + macro :macro_list do |obj, args| + out = ''.html_safe + @@available_macros.each do |macro, options| + out << content_tag('dt', content_tag('code', macro.to_s)) + out << content_tag('dd', content_tag('pre', options[:desc])) + end + content_tag('dl', out) + end + + desc "Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:\n\n" + + "{{child_pages}} -- can be used from a wiki page only\n" + + "{{child_pages(depth=2)}} -- display 2 levels nesting only\n" + + "{{child_pages(Foo)}} -- lists all children of page Foo\n" + + "{{child_pages(Foo, parent=1)}} -- same as above with a link to page Foo" + macro :child_pages do |obj, args| + args, options = extract_macro_options(args, :parent, :depth) + options[:depth] = options[:depth].to_i if options[:depth].present? + + page = nil + if args.size > 0 + page = Wiki.find_page(args.first.to_s, :project => @project) + elsif obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version) + page = obj.page + else + raise 'With no argument, this macro can be called from wiki pages only.' + end + raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project) + pages = page.self_and_descendants(options[:depth]).group_by(&:parent_id) + render_page_hierarchy(pages, options[:parent] ? page.parent_id : page.id) + end + + desc "Includes a wiki page. Examples:\n\n" + + "{{include(Foo)}}\n" + + "{{include(projectname:Foo)}} -- to include a page of a specific project wiki" + macro :include do |obj, args| + page = Wiki.find_page(args.first.to_s, :project => @project) + raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project) + @included_wiki_pages ||= [] + raise 'Circular inclusion detected' if @included_wiki_pages.include?(page.id) + @included_wiki_pages << page.id + out = textilizable(page.content, :text, :attachments => page.attachments, :headings => false) + @included_wiki_pages.pop + out + end + + desc "Inserts of collapsed block of text. Examples:\n\n" + + "{{collapse\nThis is a block of text that is collapsed by default.\nIt can be expanded by clicking a link.\n}}\n\n" + + "{{collapse(View details...)\nWith custom link text.\n}}" + macro :collapse do |obj, args, text| + html_id = "collapse-#{Redmine::Utils.random_hex(4)}" + show_label = args[0] || l(:button_show) + hide_label = args[1] || args[0] || l(:button_hide) + js = "$('##{html_id}-show, ##{html_id}-hide').toggle(); $('##{html_id}').fadeToggle(150);" + out = ''.html_safe + out << link_to_function(show_label, js, :id => "#{html_id}-show", :class => 'collapsible collapsed') + out << link_to_function(hide_label, js, :id => "#{html_id}-hide", :class => 'collapsible', :style => 'display:none;') + out << content_tag('div', textilizable(text, :object => obj, :headings => false), :id => html_id, :class => 'collapsed-text', :style => 'display:none;') + out + end + + desc "Displays a clickable thumbnail of an attached image. Examples:\n\n" + + "{{thumbnail(image.png)}}\n" + + "{{thumbnail(image.png, size=300, title=Thumbnail)}} -- with custom title and size" + macro :thumbnail do |obj, args| + args, options = extract_macro_options(args, :size, :title) + filename = args.first + raise 'Filename required' unless filename.present? + size = options[:size] + raise 'Invalid size parameter' unless size.nil? || size.match(/^\d+$/) + size = size.to_i + size = nil unless size > 0 + if obj && obj.respond_to?(:attachments) && attachment = Attachment.latest_attach(obj.attachments, filename) + title = options[:title] || attachment.title + thumbnail_url = url_for(:controller => 'attachments', :action => 'thumbnail', :id => attachment, :size => size, :only_path => @only_path) + image_url = url_for(:controller => 'attachments', :action => 'show', :id => attachment, :only_path => @only_path) + + img = image_tag(thumbnail_url, :alt => attachment.filename) + link_to(img, image_url, :class => 'thumbnail', :title => title) + else + raise "Attachment #{filename} not found" + end + end + end + end +end diff --git a/lib/redmine/wiki_formatting/markdown/formatter.rb b/lib/redmine/wiki_formatting/markdown/formatter.rb new file mode 100644 index 0000000..c7611d9 --- /dev/null +++ b/lib/redmine/wiki_formatting/markdown/formatter.rb @@ -0,0 +1,150 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'cgi' + +module Redmine + module WikiFormatting + module Markdown + class HTML < Redcarpet::Render::HTML + include ActionView::Helpers::TagHelper + include Redmine::Helpers::URL + + def link(link, title, content) + return nil unless uri_with_safe_scheme?(link) + + css = nil + unless link && link.starts_with?('/') + css = 'external' + end + content_tag('a', content.to_s.html_safe, :href => link, :title => title, :class => css) + end + + def block_code(code, language) + if language.present? && Redmine::SyntaxHighlighting.language_supported?(language) + "
        " +
        +              Redmine::SyntaxHighlighting.highlight_by_language(code, language) +
        +              "
        " + else + "
        " + CGI.escapeHTML(code) + "
        " + end + end + + def image(link, title, alt_text) + return unless uri_with_safe_scheme?(link) + + tag('img', :src => link, :alt => alt_text || "", :title => title) + end + end + + class Formatter + def initialize(text) + @text = text + end + + def to_html(*args) + html = formatter.render(@text) + # restore wiki links eg. [[Foo]] + html.gsub!(%r{\[(.*?)\]}) do + "[[#{$2}]]" + end + # restore Redmine links with double-quotes, eg. version:"1.0" + html.gsub!(/(\w):"(.+?)"/) do + "#{$1}:\"#{$2}\"" + end + # restore user links with @ in login name eg. [@jsmith@somenet.foo] + html.gsub!(%r{[@\A](.*?)}) do + "@#{$2}" + end + html + end + + def get_section(index) + section = extract_sections(index)[1] + hash = Digest::MD5.hexdigest(section) + return section, hash + end + + def update_section(index, update, hash=nil) + t = extract_sections(index) + if hash.present? && hash != Digest::MD5.hexdigest(t[1]) + raise Redmine::WikiFormatting::StaleSectionError + end + t[1] = update unless t[1].blank? + t.reject(&:blank?).join "\n\n" + end + + def extract_sections(index) + sections = ['', '', ''] + offset = 0 + i = 0 + l = 1 + inside_pre = false + @text.split(/(^(?:.+\r?\n\r?(?:\=+|\-+)|#+.+|(?:~~~|```).*)\s*$)/).each do |part| + level = nil + if part =~ /\A(~{3,}|`{3,})(\S+)?\s*$/ + if !inside_pre + inside_pre = true + elsif !$2 + inside_pre = false + end + elsif inside_pre + # nop + elsif part =~ /\A(#+).+/ + level = $1.size + elsif part =~ /\A.+\r?\n\r?(\=+|\-+)\s*$/ + level = $1.include?('=') ? 1 : 2 + end + if level + i += 1 + if offset == 0 && i == index + # entering the requested section + offset = 1 + l = level + elsif offset == 1 && i > index && level <= l + # leaving the requested section + offset = 2 + end + end + sections[offset] << part + end + sections.map(&:strip) + end + + private + + def formatter + @@formatter ||= Redcarpet::Markdown.new( + Redmine::WikiFormatting::Markdown::HTML.new( + :filter_html => true, + :hard_wrap => true + ), + :autolink => true, + :fenced_code_blocks => true, + :space_after_headers => true, + :tables => true, + :strikethrough => true, + :superscript => true, + :no_intra_emphasis => true, + :footnotes => true, + :lax_spacing => true + ) + end + end + end + end +end diff --git a/lib/redmine/wiki_formatting/markdown/helper.rb b/lib/redmine/wiki_formatting/markdown/helper.rb new file mode 100644 index 0000000..f41fee6 --- /dev/null +++ b/lib/redmine/wiki_formatting/markdown/helper.rb @@ -0,0 +1,47 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module Redmine + module WikiFormatting + module Markdown + module Helper + def wikitoolbar_for(field_id) + heads_for_wiki_formatter + url = "#{Redmine::Utils.relative_url_root}/help/#{current_language.to_s.downcase}/wiki_syntax_markdown.html" + javascript_tag("var wikiToolbar = new jsToolBar(document.getElementById('#{field_id}')); wikiToolbar.setHelpLink('#{escape_javascript url}'); wikiToolbar.draw();") + end + + def initial_page_content(page) + "# #{@page.pretty_title}" + end + + def heads_for_wiki_formatter + unless @heads_for_wiki_formatter_included + content_for :header_tags do + javascript_include_tag('jstoolbar/jstoolbar') + + javascript_include_tag('jstoolbar/markdown') + + javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") + + javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};") + + stylesheet_link_tag('jstoolbar') + end + @heads_for_wiki_formatter_included = true + end + end + end + end + end +end diff --git a/lib/redmine/wiki_formatting/markdown/html_parser.rb b/lib/redmine/wiki_formatting/markdown/html_parser.rb new file mode 100644 index 0000000..cee3a2f --- /dev/null +++ b/lib/redmine/wiki_formatting/markdown/html_parser.rb @@ -0,0 +1,39 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module Redmine + module WikiFormatting + module Markdown + class HtmlParser < Redmine::WikiFormatting::HtmlParser + + self.tags = tags.merge( + 'b' => {:pre => '**', :post => '**'}, + 'strong' => {:pre => '**', :post => '**'}, + 'i' => {:pre => '_', :post => '_'}, + 'em' => {:pre => '_', :post => '_'}, + 'strike' => {:pre => '~~', :post => '~~'}, + 'h1' => {:pre => "\n\n# ", :post => "\n\n"}, + 'h2' => {:pre => "\n\n## ", :post => "\n\n"}, + 'h3' => {:pre => "\n\n### ", :post => "\n\n"}, + 'h4' => {:pre => "\n\n#### ", :post => "\n\n"}, + 'h5' => {:pre => "\n\n##### ", :post => "\n\n"}, + 'h6' => {:pre => "\n\n###### ", :post => "\n\n"} + ) + end + end + end +end diff --git a/lib/redmine/wiki_formatting/textile/formatter.rb b/lib/redmine/wiki_formatting/textile/formatter.rb new file mode 100644 index 0000000..eef2253 --- /dev/null +++ b/lib/redmine/wiki_formatting/textile/formatter.rb @@ -0,0 +1,141 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../redcloth3', __FILE__) +require 'digest/md5' + +module Redmine + module WikiFormatting + module Textile + class Formatter < RedCloth3 + include ActionView::Helpers::TagHelper + include Redmine::WikiFormatting::LinksHelper + + alias :inline_auto_link :auto_link! + alias :inline_auto_mailto :auto_mailto! + + # auto_link rule after textile rules so that it doesn't break !image_url! tags + RULES = [:textile, :block_markdown_rule, :inline_auto_link, :inline_auto_mailto] + + def initialize(*args) + super + self.hard_breaks=true + self.no_span_caps=true + self.filter_styles=false + end + + def to_html(*rules) + @toc = [] + super(*RULES).to_s + end + + def get_section(index) + section = extract_sections(index)[1] + hash = Digest::MD5.hexdigest(section) + return section, hash + end + + def update_section(index, update, hash=nil) + t = extract_sections(index) + if hash.present? && hash != Digest::MD5.hexdigest(t[1]) + raise Redmine::WikiFormatting::StaleSectionError + end + t[1] = update unless t[1].blank? + t.reject(&:blank?).join "\n\n" + end + + def extract_sections(index) + @pre_list = [] + text = self.dup + rip_offtags text, false, false + before = '' + s = '' + after = '' + i = 0 + l = 1 + started = false + ended = false + text.scan(/(((?:.*?)(\A|\r?\n\s*\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))?[ \t](.*?)$)|.*)/m).each do |all, content, lf, heading, level| + if heading.nil? + if ended + after << all + elsif started + s << all + else + before << all + end + break + end + i += 1 + if ended + after << all + elsif i == index + l = level.to_i + before << content + s << heading + started = true + elsif i > index + s << content + if level.to_i > l + s << heading + else + after << heading + ended = true + end + else + before << all + end + end + sections = [before.strip, s.strip, after.strip] + sections.each {|section| smooth_offtags_without_code_highlighting section} + sections + end + + private + + # Patch for RedCloth. Fixed in RedCloth r128 but _why hasn't released it yet. + # http://code.whytheluckystiff.net/redcloth/changeset/128 + def hard_break( text ) + text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1
        " ) if hard_breaks + end + + alias :smooth_offtags_without_code_highlighting :smooth_offtags + # Patch to add code highlighting support to RedCloth + def smooth_offtags( text ) + unless @pre_list.empty? + ## replace
         content
        +            text.gsub!(//) do
        +              content = @pre_list[$1.to_i]
        +              # This regex must match any data produced by RedCloth3#rip_offtags
        +              if content.match(/\s?(.*)/m)
        +                language = $1 || $2
        +                text = $3
        +                if Redmine::SyntaxHighlighting.language_supported?(language)
        +                  content = "" +
        +                    Redmine::SyntaxHighlighting.highlight_by_language(text, language)
        +                else
        +                  content = "#{ERB::Util.h(text)}"
        +                end
        +              end
        +              content
        +            end
        +          end
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/wiki_formatting/textile/helper.rb b/lib/redmine/wiki_formatting/textile/helper.rb
        new file mode 100644
        index 0000000..92c7c88
        --- /dev/null
        +++ b/lib/redmine/wiki_formatting/textile/helper.rb
        @@ -0,0 +1,47 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module WikiFormatting
        +    module Textile
        +      module Helper
        +        def wikitoolbar_for(field_id)
        +          heads_for_wiki_formatter
        +          # Is there a simple way to link to a public resource?
        +          url = "#{Redmine::Utils.relative_url_root}/help/#{current_language.to_s.downcase}/wiki_syntax_textile.html"
        +          javascript_tag("var wikiToolbar = new jsToolBar(document.getElementById('#{field_id}')); wikiToolbar.setHelpLink('#{escape_javascript url}'); wikiToolbar.draw();")
        +        end
        +
        +        def initial_page_content(page)
        +          "h1. #{@page.pretty_title}"
        +        end
        +
        +        def heads_for_wiki_formatter
        +          unless @heads_for_wiki_formatter_included
        +            content_for :header_tags do
        +              javascript_include_tag('jstoolbar/jstoolbar-textile.min') +
        +              javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
        +              javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};") +
        +              stylesheet_link_tag('jstoolbar')
        +            end
        +            @heads_for_wiki_formatter_included = true
        +          end
        +        end
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/wiki_formatting/textile/html_parser.rb b/lib/redmine/wiki_formatting/textile/html_parser.rb
        new file mode 100644
        index 0000000..3d3cd59
        --- /dev/null
        +++ b/lib/redmine/wiki_formatting/textile/html_parser.rb
        @@ -0,0 +1,40 @@
        +# Redmine - project management software
        +# Copyright (C) 2006-2017  Jean-Philippe Lang
        +#
        +# This program is free software; you can redistribute it and/or
        +# modify it under the terms of the GNU General Public License
        +# as published by the Free Software Foundation; either version 2
        +# of the License, or (at your option) any later version.
        +#
        +# This program is distributed in the hope that it will be useful,
        +# but WITHOUT ANY WARRANTY; without even the implied warranty of
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        +# GNU General Public License for more details.
        +#
        +# You should have received a copy of the GNU General Public License
        +# along with this program; if not, write to the Free Software
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
        +
        +module Redmine
        +  module WikiFormatting
        +    module Textile
        +      class HtmlParser < Redmine::WikiFormatting::HtmlParser
        +
        +        self.tags = tags.merge(
        +          'b' => {:pre => '*', :post => '*'},
        +          'strong' => {:pre => '*', :post => '*'},
        +          'i' => {:pre => '_', :post => '_'},
        +          'em' => {:pre => '_', :post => '_'},
        +          'u' => {:pre => '+', :post => '+'},
        +          'strike' => {:pre => '-', :post => '-'},
        +          'h1' => {:pre => "\n\nh1. ", :post => "\n\n"},
        +          'h2' => {:pre => "\n\nh2. ", :post => "\n\n"},
        +          'h3' => {:pre => "\n\nh3. ", :post => "\n\n"},
        +          'h4' => {:pre => "\n\nh4. ", :post => "\n\n"},
        +          'h5' => {:pre => "\n\nh5. ", :post => "\n\n"},
        +          'h6' => {:pre => "\n\nh6. ", :post => "\n\n"}
        +        )
        +      end
        +    end
        +  end
        +end
        diff --git a/lib/redmine/wiki_formatting/textile/redcloth3.rb b/lib/redmine/wiki_formatting/textile/redcloth3.rb
        new file mode 100644
        index 0000000..5716e7d
        --- /dev/null
        +++ b/lib/redmine/wiki_formatting/textile/redcloth3.rb
        @@ -0,0 +1,1225 @@
        +#                                vim:ts=4:sw=4:
        +# = RedCloth - Textile and Markdown Hybrid for Ruby
        +#
        +# Homepage::  http://whytheluckystiff.net/ruby/redcloth/
        +# Author::    why the lucky stiff (http://whytheluckystiff.net/)
        +# Copyright:: (cc) 2004 why the lucky stiff (and his puppet organizations.)
        +# License::   BSD
        +#
        +# (see http://hobix.com/textile/ for a Textile Reference.)
        +#
        +# Based on (and also inspired by) both:
        +#
        +# PyTextile: http://diveintomark.org/projects/textile/textile.py.txt
        +# Textism for PHP: http://www.textism.com/tools/textile/
        +#
        +#
        +
        +# = RedCloth
        +#
        +# RedCloth is a Ruby library for converting Textile and/or Markdown
        +# into HTML.  You can use either format, intermingled or separately.
        +# You can also extend RedCloth to honor your own custom text stylings.
        +#
        +# RedCloth users are encouraged to use Textile if they are generating
        +# HTML and to use Markdown if others will be viewing the plain text.
        +#
        +# == What is Textile?
        +#
        +# Textile is a simple formatting style for text
        +# documents, loosely based on some HTML conventions.
        +#
        +# == Sample Textile Text
        +#
        +#  h2. This is a title
        +#
        +#  h3. This is a subhead
        +#
        +#  This is a bit of paragraph.
        +#
        +#  bq. This is a blockquote.
        +#
        +# = Writing Textile
        +#
        +# A Textile document consists of paragraphs.  Paragraphs
        +# can be specially formatted by adding a small instruction
        +# to the beginning of the paragraph.
        +#
        +#  h[n].   Header of size [n].
        +#  bq.     Blockquote.
        +#  #       Numeric list.
        +#  *       Bulleted list.
        +#
        +# == Quick Phrase Modifiers
        +#
        +# Quick phrase modifiers are also included, to allow formatting
        +# of small portions of text within a paragraph.
        +#
        +#  \_emphasis\_
        +#  \_\_italicized\_\_
        +#  \*strong\*
        +#  \*\*bold\*\*
        +#  ??citation??
        +#  -deleted text-
        +#  +inserted text+
        +#  ^superscript^
        +#  ~subscript~
        +#  @code@
        +#  %(classname)span%
        +#
        +#  ==notextile== (leave text alone)
        +#
        +# == Links
        +#
        +# To make a hypertext link, put the link text in "quotation 
        +# marks" followed immediately by a colon and the URL of the link.
        +# 
        +# Optional: text in (parentheses) following the link text, 
        +# but before the closing quotation mark, will become a Title 
        +# attribute for the link, visible as a tool tip when a cursor is above it.
        +# 
        +# Example:
        +#
        +#  "This is a link (This is a title) ":http://www.textism.com
        +# 
        +# Will become:
        +# 
        +#  This is a link
        +#
        +# == Images
        +#
        +# To insert an image, put the URL for the image inside exclamation marks.
        +#
        +# Optional: text that immediately follows the URL in (parentheses) will 
        +# be used as the Alt text for the image. Images on the web should always 
        +# have descriptive Alt text for the benefit of readers using non-graphical 
        +# browsers.
        +#
        +# Optional: place a colon followed by a URL immediately after the 
        +# closing ! to make the image into a link.
        +# 
        +# Example:
        +#
        +#  !http://www.textism.com/common/textist.gif(Textist)!
        +#
        +# Will become:
        +#
        +#  Textist
        +#
        +# With a link:
        +#
        +#  !/common/textist.gif(Textist)!:http://textism.com
        +#
        +# Will become:
        +#
        +#  Textist
        +#
        +# == Defining Acronyms
        +#
        +# HTML allows authors to define acronyms via the tag. The definition appears as a 
        +# tool tip when a cursor hovers over the acronym. A crucial aid to clear writing, 
        +# this should be used at least once for each acronym in documents where they appear.
        +#
        +# To quickly define an acronym in Textile, place the full text in (parentheses) 
        +# immediately following the acronym.
        +# 
        +# Example:
        +#
        +#  ACLU(American Civil Liberties Union)
        +#
        +# Will become:
        +#
        +#  ACLU
        +#
        +# == Adding Tables
        +#
        +# In Textile, simple tables can be added by separating each column by
        +# a pipe.
        +#
        +#     |a|simple|table|row|
        +#     |And|Another|table|row|
        +#
        +# Attributes are defined by style definitions in parentheses.
        +#
        +#     table(border:1px solid black).
        +#     (background:#ddd;color:red). |{}| | | |
        +#
        +# == Using RedCloth
        +# 
        +# RedCloth is simply an extension of the String class, which can handle
        +# Textile formatting.  Use it like a String and output HTML with its
        +# RedCloth#to_html method.
        +#
        +#  doc = RedCloth.new "
        +#
        +#  h2. Test document
        +#
        +#  Just a simple test."
        +#
        +#  puts doc.to_html
        +#
        +# By default, RedCloth uses both Textile and Markdown formatting, with
        +# Textile formatting taking precedence.  If you want to turn off Markdown
        +# formatting, to boost speed and limit the processor:
        +#
        +#  class RedCloth::Textile.new( str )
        +
        +class RedCloth3 < String
        +    include Redmine::Helpers::URL
        +
        +    VERSION = '3.0.4'
        +    DEFAULT_RULES = [:textile, :markdown]
        +
        +    #
        +    # Two accessor for setting security restrictions.
        +    #
        +    # This is a nice thing if you're using RedCloth for
        +    # formatting in public places (e.g. Wikis) where you
        +    # don't want users to abuse HTML for bad things.
        +    #
        +    # If +:filter_html+ is set, HTML which wasn't
        +    # created by the Textile processor will be escaped.
        +    #
        +    # If +:filter_styles+ is set, it will also disable
        +    # the style markup specifier. ('{color: red}')
        +    #
        +    attr_accessor :filter_html, :filter_styles
        +
        +    #
        +    # Accessor for toggling hard breaks.
        +    #
        +    # If +:hard_breaks+ is set, single newlines will
        +    # be converted to HTML break tags.  This is the
        +    # default behavior for traditional RedCloth.
        +    #
        +    attr_accessor :hard_breaks
        +
        +    # Accessor for toggling lite mode.
        +    #
        +    # In lite mode, block-level rules are ignored.  This means
        +    # that tables, paragraphs, lists, and such aren't available.
        +    # Only the inline markup for bold, italics, entities and so on.
        +    #
        +    #   r = RedCloth.new( "And then? She *fell*!", [:lite_mode] )
        +    #   r.to_html
        +    #   #=> "And then? She fell!"
        +    #
        +    attr_accessor :lite_mode
        +
        +    #
        +    # Accessor for toggling span caps.
        +    #
        +    # Textile places `span' tags around capitalized
        +    # words by default, but this wreaks havoc on Wikis.
        +    # If +:no_span_caps+ is set, this will be
        +    # suppressed.
        +    #
        +    attr_accessor :no_span_caps
        +
        +    #
        +    # Establishes the markup predence.  Available rules include:
        +    #
        +    # == Textile Rules
        +    #
        +    # The following textile rules can be set individually.  Or add the complete
        +    # set of rules with the single :textile rule, which supplies the rule set in
        +    # the following precedence:
        +    #
        +    # refs_textile::          Textile references (i.e. [hobix]http://hobix.com/)
        +    # block_textile_table::   Textile table block structures
        +    # block_textile_lists::   Textile list structures
        +    # block_textile_prefix::  Textile blocks with prefixes (i.e. bq., h2., etc.)
        +    # inline_textile_image::  Textile inline images
        +    # inline_textile_link::   Textile inline links
        +    # inline_textile_span::   Textile inline spans
        +    # glyphs_textile:: Textile entities (such as em-dashes and smart quotes)
        +    #
        +    # == Markdown
        +    #
        +    # refs_markdown::         Markdown references (for example: [hobix]: http://hobix.com/)
        +    # block_markdown_setext:: Markdown setext headers
        +    # block_markdown_atx::    Markdown atx headers
        +    # block_markdown_rule::   Markdown horizontal rules
        +    # block_markdown_bq::     Markdown blockquotes
        +    # block_markdown_lists::  Markdown lists
        +    # inline_markdown_link::  Markdown links
        +    attr_accessor :rules
        +
        +    # Returns a new RedCloth object, based on _string_ and
        +    # enforcing all the included _restrictions_.
        +    #
        +    #   r = RedCloth.new( "h1. A bold man", [:filter_html] )
        +    #   r.to_html
        +    #     #=>"

        A <b>bold</b> man

        " + # + def initialize( string, restrictions = [] ) + restrictions.each { |r| method( "#{ r }=" ).call( true ) } + super( string ) + end + + # + # Generates HTML from the Textile contents. + # + # r = RedCloth.new( "And then? She *fell*!" ) + # r.to_html( true ) + # #=>"And then? She fell!" + # + def to_html( *rules ) + rules = DEFAULT_RULES if rules.empty? + # make our working copy + text = self.dup + + @urlrefs = {} + @shelf = [] + textile_rules = [:block_textile_table, :block_textile_lists, + :block_textile_prefix, :inline_textile_image, :inline_textile_link, + :inline_textile_code, :inline_textile_span, :glyphs_textile] + markdown_rules = [:refs_markdown, :block_markdown_setext, :block_markdown_atx, :block_markdown_rule, + :block_markdown_bq, :block_markdown_lists, + :inline_markdown_reflink, :inline_markdown_link] + @rules = rules.collect do |rule| + case rule + when :markdown + markdown_rules + when :textile + textile_rules + else + rule + end + end.flatten + + # standard clean up + incoming_entities text + clean_white_space text + + # start processor + @pre_list = [] + rip_offtags text + no_textile text + escape_html_tags text + # need to do this before #hard_break and #blocks + block_textile_quotes text unless @lite_mode + hard_break text + unless @lite_mode + refs text + blocks text + end + inline text + smooth_offtags text + + retrieve text + + text.gsub!( /<\/?notextile>/, '' ) + text.gsub!( /x%x%/, '&' ) + clean_html text if filter_html + text.strip! + text + + end + + ####### + private + ####### + # + # Mapping of 8-bit ASCII codes to HTML numerical entity equivalents. + # (from PyTextile) + # + TEXTILE_TAGS = + + [[128, 8364], [129, 0], [130, 8218], [131, 402], [132, 8222], [133, 8230], + [134, 8224], [135, 8225], [136, 710], [137, 8240], [138, 352], [139, 8249], + [140, 338], [141, 0], [142, 0], [143, 0], [144, 0], [145, 8216], [146, 8217], + [147, 8220], [148, 8221], [149, 8226], [150, 8211], [151, 8212], [152, 732], + [153, 8482], [154, 353], [155, 8250], [156, 339], [157, 0], [158, 0], [159, 376]]. + + collect! do |a, b| + [a.chr, ( b.zero? and "" or "&#{ b };" )] + end + + # + # Regular expressions to convert to HTML. + # + A_HLGN = /(?:(?:<>|<|>|\=|[()]+)+)/ + A_VLGN = /[\-^~]/ + C_CLAS = '(?:\([^")]+\))' + C_LNGE = '(?:\[[a-z\-_]+\])' + C_STYL = '(?:\{[^{][^"}]+\})' + S_CSPN = '(?:\\\\\d+)' + S_RSPN = '(?:/\d+)' + A = "(?:#{A_HLGN}?#{A_VLGN}?|#{A_VLGN}?#{A_HLGN}?)" + S = "(?:#{S_CSPN}?#{S_RSPN}|#{S_RSPN}?#{S_CSPN}?)" + C = "(?:#{C_CLAS}?#{C_STYL}?#{C_LNGE}?|#{C_STYL}?#{C_LNGE}?#{C_CLAS}?|#{C_LNGE}?#{C_STYL}?#{C_CLAS}?)" + # PUNCT = Regexp::quote( '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' ) + PUNCT = Regexp::quote( '!"#$%&\'*+,-./:;=?@\\^_`|~' ) + PUNCT_NOQ = Regexp::quote( '!"#$&\',./:;=?@\\`|' ) + PUNCT_Q = Regexp::quote( '*-_+^~%' ) + HYPERLINK = '(\S+?)([^\w\s/;=\?]*?)(?=\s|<|$)' + + # Text markup tags, don't conflict with block tags + SIMPLE_HTML_TAGS = [ + 'tt', 'b', 'i', 'big', 'small', 'em', 'strong', 'dfn', 'code', + 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'br', + 'br', 'map', 'q', 'sub', 'sup', 'span', 'bdo' + ] + + QTAGS = [ + ['**', 'b', :limit], + ['*', 'strong', :limit], + ['??', 'cite', :limit], + ['-', 'del', :limit], + ['__', 'i', :limit], + ['_', 'em', :limit], + ['%', 'span', :limit], + ['+', 'ins', :limit], + ['^', 'sup', :limit], + ['~', 'sub', :limit] + ] + QTAGS_JOIN = QTAGS.map {|rc, ht, rtype| Regexp::quote rc}.join('|') + + QTAGS.collect! do |rc, ht, rtype| + rcq = Regexp::quote rc + re = + case rtype + when :limit + /(^|[>\s\(]) # sta + (?!\-\-) + (#{QTAGS_JOIN}|) # oqs + (#{rcq}) # qtag + ([[:word:]]|[^\s].*?[^\s]) # content + (?!\-\-) + #{rcq} + (#{QTAGS_JOIN}|) # oqa + (?=[[:punct:]]|<|\s|\)|$)/x + else + /(#{rcq}) + (#{C}) + (?::(\S+))? + ([[:word:]]|[^\s\-].*?[^\s\-]) + #{rcq}/xm + end + [rc, ht, re, rtype] + end + + # Elements to handle + GLYPHS = [ + # [ /([^\s\[{(>])?\'([dmst]\b|ll\b|ve\b|\s|:|$)/, '\1’\2' ], # single closing + # [ /([^\s\[{(>#{PUNCT_Q}][#{PUNCT_Q}]*)\'/, '\1’' ], # single closing + # [ /\'(?=[#{PUNCT_Q}]*(s\b|[\s#{PUNCT_NOQ}]))/, '’' ], # single closing + # [ /\'/, '‘' ], # single opening + # [ //, '>' ], # greater-than + # [ /([^\s\[{(])?"(\s|:|$)/, '\1”\2' ], # double closing + # [ /([^\s\[{(>#{PUNCT_Q}][#{PUNCT_Q}]*)"/, '\1”' ], # double closing + # [ /"(?=[#{PUNCT_Q}]*[\s#{PUNCT_NOQ}])/, '”' ], # double closing + # [ /"/, '“' ], # double opening + # [ /\b( )?\.{3}/, '\1…' ], # ellipsis + # [ /\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/, '\1' ], # 3+ uppercase acronym + # [ /(^|[^"][>\s])([A-Z][A-Z0-9 ]+[A-Z0-9])([^\2\3', :no_span_caps ], # 3+ uppercase caps + # [ /(\.\s)?\s?--\s?/, '\1—' ], # em dash + # [ /\s->\s/, ' → ' ], # right arrow + # [ /\s-\s/, ' – ' ], # en dash + # [ /(\d+) ?x ?(\d+)/, '\1×\2' ], # dimension sign + # [ /\b ?[(\[]TM[\])]/i, '™' ], # trademark + # [ /\b ?[(\[]R[\])]/i, '®' ], # registered + # [ /\b ?[(\[]C[\])]/i, '©' ] # copyright + ] + + H_ALGN_VALS = { + '<' => 'left', + '=' => 'center', + '>' => 'right', + '<>' => 'justify' + } + + V_ALGN_VALS = { + '^' => 'top', + '-' => 'middle', + '~' => 'bottom' + } + + # + # Flexible HTML escaping + # + def htmlesc( str, mode=:Quotes ) + if str + str.gsub!( '&', '&' ) + str.gsub!( '"', '"' ) if mode != :NoQuotes + str.gsub!( "'", ''' ) if mode == :Quotes + str.gsub!( '<', '<') + str.gsub!( '>', '>') + end + str + end + + # Search and replace for Textile glyphs (quotes, dashes, other symbols) + def pgl( text ) + #GLYPHS.each do |re, resub, tog| + # next if tog and method( tog ).call + # text.gsub! re, resub + #end + text.gsub!(/\b([A-Z][A-Z0-9]{1,})\b(?:[(]([^)]*)[)])/) do |m| + "#{$1}" + end + end + + # Parses Textile attribute lists and builds an HTML attribute string + def pba( text_in, element = "" ) + + return '' unless text_in + + style = [] + text = text_in.dup + if element == 'td' + colspan = $1 if text =~ /\\(\d+)/ + rowspan = $1 if text =~ /\/(\d+)/ + style << "vertical-align:#{ v_align( $& ) };" if text =~ A_VLGN + end + + if text.sub!( /\{([^"}]*)\}/, '' ) && !filter_styles + sanitized = sanitize_styles($1) + style << "#{ sanitized };" unless sanitized.blank? + end + + lang = $1 if + text.sub!( /\[([a-z\-_]+?)\]/, '' ) + + cls = $1 if + text.sub!( /\(([^()]+?)\)/, '' ) + + style << "padding-left:#{ $1.length }em;" if + text.sub!( /([(]+)/, '' ) + + style << "padding-right:#{ $1.length }em;" if text.sub!( /([)]+)/, '' ) + + style << "text-align:#{ h_align( $& ) };" if text =~ A_HLGN + + cls, id = $1, $2 if cls =~ /^(.*?)#(.*)$/ + + # add wiki-class- and wiki-id- to classes and ids to prevent setting of + # arbitrary classes and ids + cls = cls.split(/\s+/).map do |c| + c.starts_with?('wiki-class-') ? c : "wiki-class-#{c}" + end.join(' ') if cls + + id = id.starts_with?('wiki-id-') ? id : "wiki-id-#{id}" if id + + atts = '' + atts << " style=\"#{ style.join }\"" unless style.empty? + atts << " class=\"#{ cls }\"" unless cls.to_s.empty? + atts << " lang=\"#{ lang }\"" if lang + atts << " id=\"#{ id }\"" if id + atts << " colspan=\"#{ colspan }\"" if colspan + atts << " rowspan=\"#{ rowspan }\"" if rowspan + + atts + end + + STYLES_RE = /^(color|width|height|border|background|padding|margin|font|text|float)(-[a-z]+)*:\s*((\d+%?|\d+px|\d+(\.\d+)?em|#[0-9a-f]+|[a-z]+)\s*)+$/i + + def sanitize_styles(str) + styles = str.split(";").map(&:strip) + styles.reject! do |style| + !style.match(STYLES_RE) + end + styles.join(";") + end + + TABLE_RE = /^(?:table(_?#{S}#{A}#{C})\. ?\n)?^(#{A}#{C}\.? ?\|.*?\|)(\n\n|\Z)/m + + # Parses a Textile table block, building HTML from the result. + def block_textile_table( text ) + text.gsub!( TABLE_RE ) do |matches| + + tatts, fullrow = $~[1..2] + tatts = pba( tatts, 'table' ) + tatts = shelve( tatts ) if tatts + rows = [] + fullrow.gsub!(/([^|\s])\s*\n/, "\\1
        ") + fullrow.each_line do |row| + ratts, row = pba( $1, 'tr' ), $2 if row =~ /^(#{A}#{C}\. )(.*)/m + cells = [] + # the regexp prevents wiki links with a | from being cut as cells + row.scan(/\|(_?#{S}#{A}#{C}\. ?)?((\[\[[^|\]]*\|[^|\]]*\]\]|[^|])*?)(?=\|)/) do |modifiers, cell| + ctyp = 'd' + ctyp = 'h' if modifiers && modifiers =~ /^_/ + + catts = nil + catts = pba( modifiers, 'td' ) if modifiers + + catts = shelve( catts ) if catts + cells << "\t\t\t#{ cell }" + end + ratts = shelve( ratts ) if ratts + rows << "\t\t\n#{ cells.join( "\n" ) }\n\t\t" + end + "\t\n#{ rows.join( "\n" ) }\n\t\n\n" + end + end + + LISTS_RE = /^([#*]+?#{C} .*?)$(?![^#*])/m + LISTS_CONTENT_RE = /^([#*]+)(#{A}#{C}) (.*)$/m + + # Parses Textile lists and generates HTML + def block_textile_lists( text ) + text.gsub!( LISTS_RE ) do |match| + lines = match.split( /\n/ ) + last_line = -1 + depth = [] + lines.each_with_index do |line, line_id| + if line =~ LISTS_CONTENT_RE + tl,atts,content = $~[1..3] + if depth.last + if depth.last.length > tl.length + (depth.length - 1).downto(0) do |i| + break if depth[i].length == tl.length + lines[line_id - 1] << "\n\t\n\t" + depth.pop + end + end + if depth.last and depth.last.length == tl.length + lines[line_id - 1] << '' + end + end + unless depth.last == tl + depth << tl + atts = pba( atts ) + atts = shelve( atts ) if atts + lines[line_id] = "\t<#{ lT(tl) }l#{ atts }>\n\t
      • #{ content }" + else + lines[line_id] = "\t\t
      • #{ content }" + end + last_line = line_id + + else + last_line = line_id + end + if line_id - last_line > 1 or line_id == lines.length - 1 + while v = depth.pop + lines[last_line] << "
      • \n\t" + end + end + end + lines.join( "\n" ) + end + end + + QUOTES_RE = /(^>+([^\n]*?)(\n|$))+/m + QUOTES_CONTENT_RE = /^([> ]+)(.*)$/m + + def block_textile_quotes( text ) + text.gsub!( QUOTES_RE ) do |match| + lines = match.split( /\n/ ) + quotes = '' + indent = 0 + lines.each do |line| + line =~ QUOTES_CONTENT_RE + bq,content = $1, $2 + l = bq.count('>') + if l != indent + quotes << ("\n\n" + (l>indent ? '
        ' * (l-indent) : '
        ' * (indent-l)) + "\n\n") + indent = l + end + quotes << (content + "\n") + end + quotes << ("\n" + '' * indent + "\n\n") + quotes + end + end + + CODE_RE = /(\W) + @ + (?:\|(\w+?)\|)? + (.+?) + @ + (?=\W)/x + + def inline_textile_code( text ) + text.gsub!( CODE_RE ) do |m| + before,lang,code,after = $~[1..4] + lang = " lang=\"#{ lang }\"" if lang + rip_offtags( "#{ before }#{ code }
        #{ after }", false ) + end + end + + def lT( text ) + text =~ /\#$/ ? 'o' : 'u' + end + + def hard_break( text ) + text.gsub!( /(.)\n(?!\Z| *([#*=]+(\s|$)|[{|]))/, "\\1
        " ) if hard_breaks + end + + BLOCKS_GROUP_RE = /\n{2,}(?! )/m + + def blocks( text, deep_code = false ) + text.replace( text.split( BLOCKS_GROUP_RE ).collect do |blk| + plain = blk !~ /\A[#*> ]/ + + # skip blocks that are complex HTML + if blk =~ /^<\/?(\w+).*>/ and not SIMPLE_HTML_TAGS.include? $1 + blk + else + # search for indentation levels + blk.strip! + if blk.empty? + blk + else + code_blk = nil + blk.gsub!( /((?:\n(?:\n^ +[^\n]*)+)+)/m ) do |iblk| + flush_left iblk + blocks iblk, plain + iblk.gsub( /^(\S)/, "\t\\1" ) + if plain + code_blk = iblk; "" + else + iblk + end + end + + block_applied = 0 + @rules.each do |rule_name| + block_applied += 1 if ( rule_name.to_s.match /^block_/ and method( rule_name ).call( blk ) ) + end + if block_applied.zero? + if deep_code + blk = "\t
        #{ blk }
        " + else + blk = "\t

        #{ blk }

        " + end + end + # hard_break blk + blk + "\n#{ code_blk }" + end + end + + end.join( "\n\n" ) ) + end + + def textile_bq( tag, atts, cite, content ) + cite, cite_title = check_refs( cite ) + cite = " cite=\"#{ cite }\"" if cite + atts = shelve( atts ) if atts + "\t\n\t\t#{ content }

        \n\t" + end + + def textile_p( tag, atts, cite, content ) + atts = shelve( atts ) if atts + "\t<#{ tag }#{ atts }>#{ content }" + end + + alias textile_h1 textile_p + alias textile_h2 textile_p + alias textile_h3 textile_p + alias textile_h4 textile_p + alias textile_h5 textile_p + alias textile_h6 textile_p + + def textile_fn_( tag, num, atts, cite, content ) + atts << " id=\"fn#{ num }\" class=\"footnote\"" + content = "#{ num } #{ content }" + atts = shelve( atts ) if atts + "\t#{ content }

        " + end + + BLOCK_RE = /^(([a-z]+)(\d*))(#{A}#{C})\.(?::(\S+))? (.*)$/m + + def block_textile_prefix( text ) + if text =~ BLOCK_RE + tag,tagpre,num,atts,cite,content = $~[1..6] + atts = pba( atts ) + + # pass to prefix handler + replacement = nil + if respond_to? "textile_#{ tag }", true + replacement = method( "textile_#{ tag }" ).call( tag, atts, cite, content ) + elsif respond_to? "textile_#{ tagpre }_", true + replacement = method( "textile_#{ tagpre }_" ).call( tagpre, num, atts, cite, content ) + end + text.gsub!( $& ) { replacement } if replacement + end + end + + SETEXT_RE = /\A(.+?)\n([=-])[=-]* *$/m + def block_markdown_setext( text ) + if text =~ SETEXT_RE + tag = if $2 == "="; "h1"; else; "h2"; end + blk, cont = "<#{ tag }>#{ $1 }", $' + blocks cont + text.replace( blk + cont ) + end + end + + ATX_RE = /\A(\#{1,6}) # $1 = string of #'s + [ ]* + (.+?) # $2 = Header text + [ ]* + \#* # optional closing #'s (not counted) + $/x + def block_markdown_atx( text ) + if text =~ ATX_RE + tag = "h#{ $1.length }" + blk, cont = "<#{ tag }>#{ $2 }\n\n", $' + blocks cont + text.replace( blk + cont ) + end + end + + MARKDOWN_BQ_RE = /\A(^ *> ?.+$(.+\n)*\n*)+/m + + def block_markdown_bq( text ) + text.gsub!( MARKDOWN_BQ_RE ) do |blk| + blk.gsub!( /^ *> ?/, '' ) + flush_left blk + blocks blk + blk.gsub!( /^(\S)/, "\t\\1" ) + "
        \n#{ blk }\n
        \n\n" + end + end + + MARKDOWN_RULE_RE = /^(#{ + ['*', '-', '_'].collect { |ch| ' ?(' + Regexp::quote( ch ) + ' ?){3,}' }.join( '|' ) + })$/ + + def block_markdown_rule( text ) + text.gsub!( MARKDOWN_RULE_RE ) do |blk| + "
        " + end + end + + # XXX TODO XXX + def block_markdown_lists( text ) + end + + def inline_textile_span( text ) + QTAGS.each do |qtag_rc, ht, qtag_re, rtype| + text.gsub!( qtag_re ) do |m| + + case rtype + when :limit + sta,oqs,qtag,content,oqa = $~[1..6] + atts = nil + if content =~ /^(#{C})(.+)$/ + atts, content = $~[1..2] + end + else + qtag,atts,cite,content = $~[1..4] + sta = '' + end + atts = pba( atts ) + atts = shelve( atts ) if atts + + "#{ sta }#{ oqs }<#{ ht }#{ atts }>#{ content }#{ oqa }" + + end + end + end + + LINK_RE = / + ( + ([\s\[{(]|[#{PUNCT}])? # $pre + " # start + (#{C}) # $atts + ([^"\n]+?) # $text + \s? + (?:\(([^)]+?)\)(?="))? # $title + ": + ( # $url + (\/|[a-zA-Z]+:\/\/|www\.|mailto:) # $proto + [[:alnum:]_\/]\S+? + ) + (\/)? # $slash + ([^[:alnum:]_\=\/;\(\)]*?) # $post + ) + (?=<|\s|$) + /x +#" + def inline_textile_link( text ) + text.gsub!( LINK_RE ) do |m| + all,pre,atts,text,title,url,proto,slash,post = $~[1..9] + if text.include?('
        ') + all + else + url, url_title = check_refs( url ) + title ||= url_title + + # Idea below : an URL with unbalanced parethesis and + # ending by ')' is put into external parenthesis + if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) ) + url=url[0..-2] # discard closing parenth from url + post = ")"+post # add closing parenth to post + end + atts = pba( atts ) + atts = " href=\"#{ htmlesc url }#{ slash }\"#{ atts }" + atts << " title=\"#{ htmlesc title }\"" if title + atts = shelve( atts ) if atts + + external = (url =~ /^https?:\/\//) ? ' class="external"' : '' + + "#{ pre }#{ text }#{ post }" + end + end + end + + MARKDOWN_REFLINK_RE = / + \[([^\[\]]+)\] # $text + [ ]? # opt. space + (?:\n[ ]*)? # one optional newline followed by spaces + \[(.*?)\] # $id + /x + + def inline_markdown_reflink( text ) + text.gsub!( MARKDOWN_REFLINK_RE ) do |m| + text, id = $~[1..2] + + if id.empty? + url, title = check_refs( text ) + else + url, title = check_refs( id ) + end + + atts = " href=\"#{ url }\"" + atts << " title=\"#{ title }\"" if title + atts = shelve( atts ) + + "#{ text }" + end + end + + MARKDOWN_LINK_RE = / + \[([^\[\]]+)\] # $text + \( # open paren + [ \t]* # opt space + ? # $href + [ \t]* # opt space + (?: # whole title + (['"]) # $quote + (.*?) # $title + \3 # matching quote + )? # title is optional + \) + /x + + def inline_markdown_link( text ) + text.gsub!( MARKDOWN_LINK_RE ) do |m| + text, url, quote, title = $~[1..4] + + atts = " href=\"#{ url }\"" + atts << " title=\"#{ title }\"" if title + atts = shelve( atts ) + + "#{ text }" + end + end + + TEXTILE_REFS_RE = /(^ *)\[([^\[\n]+?)\](#{HYPERLINK})(?=\s|$)/ + MARKDOWN_REFS_RE = /(^ *)\[([^\n]+?)\]:\s+?(?:\s+"((?:[^"]|\\")+)")?(?=\s|$)/m + + def refs( text ) + @rules.each do |rule_name| + method( rule_name ).call( text ) if rule_name.to_s.match /^refs_/ + end + end + + def refs_textile( text ) + text.gsub!( TEXTILE_REFS_RE ) do |m| + flag, url = $~[2..3] + @urlrefs[flag.downcase] = [url, nil] + nil + end + end + + def refs_markdown( text ) + text.gsub!( MARKDOWN_REFS_RE ) do |m| + flag, url = $~[2..3] + title = $~[6] + @urlrefs[flag.downcase] = [url, title] + nil + end + end + + def check_refs( text ) + ret = @urlrefs[text.downcase] if text + ret || [text, nil] + end + + IMAGE_RE = / + (>|\s|^) # start of line? + \! # opening + (\<|\=|\>)? # optional alignment atts + (#{C}) # optional style,class atts + (?:\. )? # optional dot-space + ([^\s(!]+?) # presume this is the src + \s? # optional space + (?:\(((?:[^\(\)]|\([^\)]+\))+?)\))? # optional title + \! # closing + (?::#{ HYPERLINK })? # optional href + /x + + def inline_textile_image( text ) + text.gsub!( IMAGE_RE ) do |m| + stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8] + htmlesc title + atts = pba( atts ) + atts = " src=\"#{ htmlesc url.dup }\"#{ atts }" + atts << " title=\"#{ title }\"" if title + atts << " alt=\"#{ title }\"" + # size = @getimagesize($url); + # if($size) $atts.= " $size[3]"; + + href, alt_title = check_refs( href ) if href + url, url_title = check_refs( url ) + + next m unless uri_with_safe_scheme?(url) + + out = '' + out << "" if href + out << "" + out << "#{ href_a1 }#{ href_a2 }" if href + + if algn + algn = h_align( algn ) + if stln == "

        " + out = "

        #{ out }" + else + out = "#{ stln }#{ out }" + end + else + out = stln + out + end + + out + end + end + + def shelve( val ) + @shelf << val + " :redsh##{ @shelf.length }:" + end + + def retrieve( text ) + text.gsub!(/ :redsh#(\d+):/) do + @shelf[$1.to_i - 1] || $& + end + end + + def incoming_entities( text ) + ## turn any incoming ampersands into a dummy character for now. + ## This uses a negative lookahead for alphanumerics followed by a semicolon, + ## implying an incoming html entity, to be skipped + + text.gsub!( /&(?![#a-z0-9]+;)/i, "x%x%" ) + end + + def no_textile( text ) + text.gsub!( /(^|\s)==([^=]+.*?)==(\s|$)?/, + '\1\2\3' ) + text.gsub!( /^ *==([^=]+.*?)==/m, + '\1\2\3' ) + end + + def clean_white_space( text ) + # normalize line breaks + text.gsub!( /\r\n/, "\n" ) + text.gsub!( /\r/, "\n" ) + text.gsub!( /\t/, ' ' ) + text.gsub!( /^ +$/, '' ) + text.gsub!( /\n{3,}/, "\n\n" ) + text.gsub!( /"$/, "\" " ) + + # if entire document is indented, flush + # to the left side + flush_left text + end + + def flush_left( text ) + indt = 0 + if text =~ /^ / + while text !~ /^ {#{indt}}[^ ]/ + indt += 1 + end unless text.empty? + if indt.nonzero? + text.gsub!( /^ {#{indt}}/, '' ) + end + end + end + + def footnote_ref( text ) + text.gsub!( /\b\[([0-9]+?)\](\s)?/, + '\1\2' ) + end + + OFFTAGS = /(code|pre|kbd|notextile)/ + OFFTAG_MATCH = /(?:(<\/#{ OFFTAGS }\b>)|(<#{ OFFTAGS }\b[^>]*>))(.*?)(?=<\/?#{ OFFTAGS }\b\W|\Z)/mi + OFFTAG_OPEN = /<#{ OFFTAGS }/ + OFFTAG_CLOSE = /<\/?#{ OFFTAGS }/ + HASTAG_MATCH = /(<\/?\w[^\n]*?>)/m + ALLTAG_MATCH = /(<\/?\w[^\n]*?>)|.*?(?=<\/?\w[^\n]*?>|$)/m + + def glyphs_textile( text, level = 0 ) + if text !~ HASTAG_MATCH + pgl text + footnote_ref text + else + codepre = 0 + text.gsub!( ALLTAG_MATCH ) do |line| + ## matches are off if we're between ,

         etc.
        +                if $1
        +                    if line =~ OFFTAG_OPEN
        +                        codepre += 1
        +                    elsif line =~ OFFTAG_CLOSE
        +                        codepre -= 1
        +                        codepre = 0 if codepre < 0
        +                    end 
        +                elsif codepre.zero?
        +                    glyphs_textile( line, level + 1 )
        +                else
        +                    htmlesc( line, :NoQuotes )
        +                end
        +                # p [level, codepre, line]
        +
        +                line
        +            end
        +        end
        +    end
        +
        +    def rip_offtags( text, escape_aftertag=true, escape_line=true )
        +        if text =~ /<.*>/
        +            ## strip and encode 
         content
        +            codepre, used_offtags = 0, {}
        +            text.gsub!( OFFTAG_MATCH ) do |line|
        +                if $3
        +                    first, offtag, aftertag = $3, $4, $5
        +                    codepre += 1
        +                    used_offtags[offtag] = true
        +                    if codepre - used_offtags.length > 0
        +                        htmlesc( line, :NoQuotes ) if escape_line
        +                        @pre_list.last << line
        +                        line = ""
        +                    else
        +                        ### htmlesc is disabled between CODE tags which will be parsed with highlighter
        +                        ### Regexp in formatter.rb is : /\s?(.+)/m
        +                        ### NB: some changes were made not to use $N variables, because we use "match"
        +                        ###   and it breaks following lines
        +                        htmlesc( aftertag, :NoQuotes ) if aftertag && escape_aftertag && !first.match(//)
        +                        line = ""
        +                        first.match(/<#{ OFFTAGS }([^>]*)>/)
        +                        tag = $1
        +                        $2.to_s.match(/(class\=("[^"]+"|'[^']+'))/i)
        +                        tag << " #{$1}" if $1 && tag == 'code'
        +                        @pre_list << "<#{ tag }>#{ aftertag }"
        +                    end
        +                elsif $1 and codepre > 0
        +                    if codepre - used_offtags.length > 0
        +                        htmlesc( line, :NoQuotes ) if escape_line
        +                        @pre_list.last << line
        +                        line = ""
        +                    end
        +                    codepre -= 1 unless codepre.zero?
        +                    used_offtags = {} if codepre.zero?
        +                end 
        +                line
        +            end
        +        end
        +        text
        +    end
        +
        +    def smooth_offtags( text )
        +        unless @pre_list.empty?
        +            ## replace 
         content
        +            text.gsub!( // ) { @pre_list[$1.to_i] }
        +        end
        +    end
        +
        +    def inline( text ) 
        +        [/^inline_/, /^glyphs_/].each do |meth_re|
        +            @rules.each do |rule_name|
        +                method( rule_name ).call( text ) if rule_name.to_s.match( meth_re )
        +            end
        +        end
        +    end
        +
        +    def h_align( text ) 
        +        H_ALGN_VALS[text]
        +    end
        +
        +    def v_align( text ) 
        +        V_ALGN_VALS[text]
        +    end
        +
        +    def textile_popup_help( name, windowW, windowH )
        +        ' ' + name + '
        ' + end + + # HTML cleansing stuff + BASIC_TAGS = { + 'a' => ['href', 'title'], + 'img' => ['src', 'alt', 'title'], + 'br' => [], + 'i' => nil, + 'u' => nil, + 'b' => nil, + 'pre' => nil, + 'kbd' => nil, + 'code' => ['lang'], + 'cite' => nil, + 'strong' => nil, + 'em' => nil, + 'ins' => nil, + 'sup' => nil, + 'sub' => nil, + 'del' => nil, + 'table' => nil, + 'tr' => nil, + 'td' => ['colspan', 'rowspan'], + 'th' => nil, + 'ol' => nil, + 'ul' => nil, + 'li' => nil, + 'p' => nil, + 'h1' => nil, + 'h2' => nil, + 'h3' => nil, + 'h4' => nil, + 'h5' => nil, + 'h6' => nil, + 'blockquote' => ['cite'] + } + + def clean_html( text, tags = BASIC_TAGS ) + text.gsub!( /]*)>/ ) do + raw = $~ + tag = raw[2].downcase + if tags.has_key? tag + pcs = [tag] + tags[tag].each do |prop| + ['"', "'", ''].each do |q| + q2 = ( q != '' ? q : '\s' ) + if raw[3] =~ /#{prop}\s*=\s*#{q}([^#{q2}]+)#{q}/i + attrv = $1 + next if prop == 'src' and attrv =~ %r{^(?!http)\w+:} + pcs << "#{prop}=\"#{$1.gsub('"', '\\"')}\"" + break + end + end + end if tags[tag] + "<#{raw[1]}#{pcs.join " "}>" + else + " " + end + end + end + + + ALLOWED_TAGS = %w(redpre pre code kbd notextile) + def escape_html_tags(text) + text.gsub!(%r{<(\/?([!\w]+)[^<>\n]*)(>?)}) do |m| + if ALLOWED_TAGS.include?($2) && $3.present? + "<#{$1}#{$3}" + else + "<#{$1}#{'>' unless $3.blank?}" + end + end + end +end + diff --git a/lib/tasks/ci.rake b/lib/tasks/ci.rake new file mode 100644 index 0000000..8c7f8b6 --- /dev/null +++ b/lib/tasks/ci.rake @@ -0,0 +1,97 @@ +desc "Run the Continuous Integration tests for Redmine" +task :ci do + # RAILS_ENV and ENV[] can diverge so force them both to test + ENV['RAILS_ENV'] = 'test' + RAILS_ENV = 'test' + Rake::Task["ci:setup"].invoke + Rake::Task["ci:build"].invoke + Rake::Task["ci:teardown"].invoke +end + +namespace :ci do + desc "Display info about the build environment" + task :about do + puts "Ruby version: #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]" + end + + desc "Setup Redmine for a new build" + task :setup do + Rake::Task["tmp:clear"].invoke + Rake::Task["log:clear"].invoke + Rake::Task["db:create:all"].invoke + Rake::Task["db:migrate"].invoke + Rake::Task["db:schema:dump"].invoke + if scms = ENV['SCMS'] + scms.split(',').each do |scm| + Rake::Task["test:scm:setup:#{scm}"].invoke + end + else + Rake::Task["test:scm:setup:all"].invoke + end + Rake::Task["test:scm:update"].invoke + end + + desc "Build Redmine" + task :build do + if test_suite = ENV['TEST_SUITE'] + Rake::Task["test:#{test_suite}"].invoke + else + Rake::Task["test"].invoke + end + # Rake::Task["test:ui"].invoke + end + + desc "Finish the build" + task :teardown do + end +end + +desc "Creates database.yml for the CI server" +file 'config/database.yml' do + require 'yaml' + database = ENV['DATABASE_ADAPTER'] + ruby = ENV['RUBY_VER'].gsub('.', '').gsub('-', '') + branch = ENV['BRANCH'].gsub('.', '').gsub('-', '') + dev_db_name = "ci_#{branch}_#{ruby}_dev" + test_db_name = "ci_#{branch}_#{ruby}_test" + + case database + when /(mysql|mariadb)/ + dev_conf = {'adapter' => 'mysql2', + 'database' => dev_db_name, 'host' => 'localhost', + 'encoding' => 'utf8'} + if ENV['RUN_ON_NOT_OFFICIAL'] + dev_conf['username'] = 'root' + else + dev_conf['username'] = 'jenkins' + dev_conf['password'] = 'jenkins' + end + test_conf = dev_conf.merge('database' => test_db_name) + when /postgresql/ + dev_conf = {'adapter' => 'postgresql', 'database' => dev_db_name, + 'host' => 'localhost'} + if ENV['RUN_ON_NOT_OFFICIAL'] + dev_conf['username'] = 'postgres' + else + dev_conf['username'] = 'jenkins' + dev_conf['password'] = 'jenkins' + end + test_conf = dev_conf.merge('database' => test_db_name) + when /sqlite3/ + dev_conf = {'adapter' => (Object.const_defined?(:JRUBY_VERSION) ? + 'jdbcsqlite3' : 'sqlite3'), + 'database' => "db/#{dev_db_name}.sqlite3"} + test_conf = dev_conf.merge('database' => "db/#{test_db_name}.sqlite3") + when 'sqlserver' + dev_conf = {'adapter' => 'sqlserver', 'database' => dev_db_name, + 'host' => 'mssqlserver', 'port' => 1433, + 'username' => 'jenkins', 'password' => 'jenkins'} + test_conf = dev_conf.merge('database' => test_db_name) + else + abort "Unknown database" + end + + File.open('config/database.yml', 'w') do |f| + f.write YAML.dump({'development' => dev_conf, 'test' => test_conf}) + end +end diff --git a/lib/tasks/ciphering.rake b/lib/tasks/ciphering.rake new file mode 100644 index 0000000..2b11833 --- /dev/null +++ b/lib/tasks/ciphering.rake @@ -0,0 +1,35 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +namespace :db do + desc 'Encrypts SCM and LDAP passwords in the database.' + task :encrypt => :environment do + unless (Repository.encrypt_all(:password) && + AuthSource.encrypt_all(:account_password)) + raise "Some objects could not be saved after encryption, update was rolled back." + end + end + + desc 'Decrypts SCM and LDAP passwords in the database.' + task :decrypt => :environment do + unless (Repository.decrypt_all(:password) && + AuthSource.decrypt_all(:account_password)) + raise "Some objects could not be saved after decryption, update was rolled back." + end + end +end diff --git a/lib/tasks/deprecated.rake b/lib/tasks/deprecated.rake new file mode 100644 index 0000000..c62579d --- /dev/null +++ b/lib/tasks/deprecated.rake @@ -0,0 +1,13 @@ +def deprecated_task(name, new_name) + task name=>new_name do + $stderr.puts "\nNote: The rake task #{name} has been deprecated, please use the replacement version #{new_name}" + end +end + +deprecated_task :load_default_data, "redmine:load_default_data" +deprecated_task :migrate_from_mantis, "redmine:migrate_from_mantis" +deprecated_task :migrate_from_trac, "redmine:migrate_from_trac" +deprecated_task "db:migrate_plugins", "redmine:plugins:migrate" +deprecated_task "db:migrate:plugin", "redmine:plugins:migrate" +deprecated_task :generate_session_store, :generate_secret_token +deprecated_task "test:rdm_routing", "test:routing" diff --git a/lib/tasks/email.rake b/lib/tasks/email.rake new file mode 100644 index 0000000..305a3e5 --- /dev/null +++ b/lib/tasks/email.rake @@ -0,0 +1,171 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +namespace :redmine do + namespace :email do + + desc <<-END_DESC +Read an email from standard input. + +See redmine:email:receive_imap for more options and examples. +END_DESC + + task :read => :environment do + Mailer.with_synched_deliveries do + MailHandler.receive(STDIN.read, MailHandler.extract_options_from_env(ENV)) + end + end + + desc <<-END_DESC +Read emails from an IMAP server. + +Available IMAP options: + host=HOST IMAP server host (default: 127.0.0.1) + port=PORT IMAP server port (default: 143) + ssl=SSL Use SSL/TLS? (default: false) + starttls=STARTTLS Use STARTTLS? (default: false) + username=USERNAME IMAP account + password=PASSWORD IMAP password + folder=FOLDER IMAP folder to read (default: INBOX) + +Processed emails control options: + move_on_success=MAILBOX move emails that were successfully received + to MAILBOX instead of deleting them + move_on_failure=MAILBOX move emails that were ignored to MAILBOX + +User and permissions options: + unknown_user=ACTION how to handle emails from an unknown user + ACTION can be one of the following values: + ignore: email is ignored (default) + accept: accept as anonymous user + create: create a user account + no_permission_check=1 disable permission checking when receiving + the email + no_account_notice=1 disable new user account notification + default_group=foo,bar adds created user to foo and bar groups + +Issue attributes control options: + project=PROJECT identifier of the target project + status=STATUS name of the target status + tracker=TRACKER name of the target tracker + category=CATEGORY name of the target category + priority=PRIORITY name of the target priority + assigned_to=ASSIGNEE assignee (username or group name) + fixed_version=VERSION name of the target version + private create new issues as private + allow_override=ATTRS allow email content to set attributes values + ATTRS is a comma separated list of attributes + or 'all' to allow all attributes to be overridable + (see below for details) + +Overrides: + ATTRS is a comma separated list of attributes among: + * project, tracker, status, priority, category, assigned_to, fixed_version, + start_date, due_date, estimated_hours, done_ratio + * custom fields names with underscores instead of spaces (case insensitive) + + Example: allow_override=project,priority,my_custom_field + + If the project option is not set, project is overridable by default for + emails that create new issues. + + You can use allow_override=all to allow all attributes to be overridable. + +Examples: + # No project specified. Emails MUST contain the 'Project' keyword: + + rake redmine:email:receive_imap RAILS_ENV="production" \\ + host=imap.foo.bar username=redmine@example.net password=xxx + + + # Fixed project and default tracker specified, but emails can override + # both tracker and priority attributes: + + rake redmine:email:receive_imap RAILS_ENV="production" \\ + host=imap.foo.bar username=redmine@example.net password=xxx ssl=1 \\ + project=foo \\ + tracker=bug \\ + allow_override=tracker,priority +END_DESC + + task :receive_imap => :environment do + imap_options = {:host => ENV['host'], + :port => ENV['port'], + :ssl => ENV['ssl'], + :starttls => ENV['starttls'], + :username => ENV['username'], + :password => ENV['password'], + :folder => ENV['folder'], + :move_on_success => ENV['move_on_success'], + :move_on_failure => ENV['move_on_failure']} + + Mailer.with_synched_deliveries do + Redmine::IMAP.check(imap_options, MailHandler.extract_options_from_env(ENV)) + end + end + + desc <<-END_DESC +Read emails from an POP3 server. + +Available POP3 options: + host=HOST POP3 server host (default: 127.0.0.1) + port=PORT POP3 server port (default: 110) + username=USERNAME POP3 account + password=PASSWORD POP3 password + apop=1 use APOP authentication (default: false) + ssl=SSL Use SSL? (default: false) + delete_unprocessed=1 delete messages that could not be processed + successfully from the server (default + behaviour is to leave them on the server) + +See redmine:email:receive_imap for more options and examples. +END_DESC + + task :receive_pop3 => :environment do + pop_options = {:host => ENV['host'], + :port => ENV['port'], + :apop => ENV['apop'], + :ssl => ENV['ssl'], + :username => ENV['username'], + :password => ENV['password'], + :delete_unprocessed => ENV['delete_unprocessed']} + + Mailer.with_synched_deliveries do + Redmine::POP3.check(pop_options, MailHandler.extract_options_from_env(ENV)) + end + end + + desc "Send a test email to the user with the provided login name" + task :test, [:login] => :environment do |task, args| + include Redmine::I18n + abort l(:notice_email_error, "Please include the user login to test with. Example: rake redmine:email:test[login]") if args[:login].blank? + + user = User.find_by_login(args[:login]) + abort l(:notice_email_error, "User #{args[:login]} not found") unless user && user.logged? + + ActionMailer::Base.raise_delivery_errors = true + begin + Mailer.with_synched_deliveries do + Mailer.test_email(user).deliver + end + puts l(:notice_email_sent, user.mail) + rescue Exception => e + abort l(:notice_email_error, e.message) + end + end + end +end diff --git a/lib/tasks/extract_fixtures.rake b/lib/tasks/extract_fixtures.rake new file mode 100644 index 0000000..65f5293 --- /dev/null +++ b/lib/tasks/extract_fixtures.rake @@ -0,0 +1,22 @@ +desc 'Create YAML test fixtures from data in an existing database. +Defaults to development database. Set RAILS_ENV to override.' + +task :extract_fixtures => :environment do + sql = "SELECT * FROM %s" + skip_tables = ["schema_info"] + ActiveRecord::Base.establish_connection + (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name| + i = "000" + File.open("#{Rails.root}/#{table_name}.yml", 'w' ) do |file| + data = ActiveRecord::Base.connection.select_all(sql % table_name) + file.write data.inject({}) { |hash, record| + # cast extracted values + ActiveRecord::Base.connection.columns(table_name).each { |col| + record[col.name] = col.type_cast(record[col.name]) if record[col.name] + } + hash["#{table_name}_#{i.succ!}"] = record + hash + }.to_yaml + end + end +end diff --git a/lib/tasks/initializers.rake b/lib/tasks/initializers.rake new file mode 100644 index 0000000..6da60c1 --- /dev/null +++ b/lib/tasks/initializers.rake @@ -0,0 +1,24 @@ +desc 'Generates a secret token for the application.' + +file 'config/initializers/secret_token.rb' do + path = File.join(Rails.root, 'config', 'initializers', 'secret_token.rb') + secret = SecureRandom.hex(40) + File.open(path, 'w') do |f| + f.write <<"EOF" +# This file was generated by 'rake generate_secret_token', and should +# not be made visible to public. +# If you have a load-balancing Redmine cluster, you will need to use the +# same version of this file on each machine. And be sure to restart your +# server when you modify this file. +# +# Your secret key for verifying cookie session data integrity. If you +# change this key, all old sessions will become invalid! Make sure the +# secret is at least 30 characters and all random, no regular words or +# you'll be exposed to dictionary attacks. +RedmineApp::Application.config.secret_key_base = '#{secret}' +EOF + end +end + +desc 'Generates a secret token for the application.' +task :generate_secret_token => ['config/initializers/secret_token.rb'] diff --git a/lib/tasks/load_default_data.rake b/lib/tasks/load_default_data.rake new file mode 100644 index 0000000..bcfff7c --- /dev/null +++ b/lib/tasks/load_default_data.rake @@ -0,0 +1,36 @@ +desc 'Load Redmine default configuration data. Language is chosen interactively or by setting REDMINE_LANG environment variable.' + +namespace :redmine do + task :load_default_data => :environment do + require 'custom_field' + include Redmine::I18n + set_language_if_valid('en') + + envlang = ENV['REDMINE_LANG'] + if !envlang || !set_language_if_valid(envlang) + puts + while true + print "Select language: " + print valid_languages.collect(&:to_s).sort.join(", ") + print " [#{current_language}] " + STDOUT.flush + lang = STDIN.gets.chomp! + break if lang.empty? + break if set_language_if_valid(lang) + puts "Unknown language!" + end + STDOUT.flush + puts "====================================" + end + + begin + Redmine::DefaultData::Loader.load(current_language) + puts "Default configuration data loaded." + rescue Redmine::DefaultData::DataAlreadyLoaded => error + puts error.message + rescue => error + puts "Error: " + error.message + puts "Default configuration data was not loaded." + end + end +end diff --git a/lib/tasks/locales.rake b/lib/tasks/locales.rake new file mode 100644 index 0000000..028a251 --- /dev/null +++ b/lib/tasks/locales.rake @@ -0,0 +1,180 @@ +desc 'Updates and checks locales against en.yml' +task :locales do + %w(locales:update locales:check_interpolation).collect do |task| + Rake::Task[task].invoke + end +end + +namespace :locales do + desc 'Updates language files based on en.yml content (only works for new top level keys).' + task :update do + dir = ENV['DIR'] || './config/locales' + + en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en'] + + files = Dir.glob(File.join(dir,'*.{yaml,yml}')) + files.sort.each do |file| + puts "Updating file #{file}" + file_strings = YAML.load(File.read(file)) + file_strings = file_strings[file_strings.keys.first] + + missing_keys = en_strings.keys - file_strings.keys + next if missing_keys.empty? + + puts "==> Missing #{missing_keys.size} keys (#{missing_keys.join(', ')})" + lang = File.open(file, 'a') + + missing_keys.each do |key| + {key => en_strings[key]}.to_yaml.each_line do |line| + next if line =~ /^---/ || line.empty? + puts " #{line}" + lang << " #{line}" + end + end + + lang.close + end + end + + desc 'Checks interpolation arguments in locals against en.yml' + task :check_interpolation do + dir = ENV['DIR'] || './config/locales' + en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en'] + files = Dir.glob(File.join(dir,'*.{yaml,yml}')) + files.sort.each do |file| + puts "parsing #{file}..." + file_strings = YAML.load_file(file) + unless file_strings.is_a?(Hash) + puts "#{file}: content is not a Hash (#{file_strings.class.name})" + next + end + unless file_strings.keys.size == 1 + puts "#{file}: content has multiple keys (#{file_strings.keys.size})" + next + end + file_strings = file_strings[file_strings.keys.first] + + file_strings.each do |key, string| + next unless string.is_a?(String) + string.scan /%\{\w+\}/ do |match| + unless en_strings[key].nil? || en_strings[key].include?(match) + puts "#{file}: #{key} uses #{match} not found in en.yml" + end + end + end + end + end + + desc <<-END_DESC +Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows). + +Options: + key=key_1,key_2 Comma-separated list of keys to delete + skip=en,de Comma-separated list of locale files to ignore (filename without extension) +END_DESC + + task :remove_key do + dir = ENV['DIR'] || './config/locales' + files = Dir.glob(File.join(dir,'*.yml')) + skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil + deletes = ENV['key'] ? Regexp.union(ENV['key'].split(',')) : nil + # Ignore multiline keys (begin with | or >) and keys with children (nothing meaningful after :) + delete_regex = /\A #{deletes}: +[^\|>\s#].*\z/ + + files.each do |path| + # Skip certain locales + (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips + puts "Deleting selected keys from #{path}" + orig_content = File.open(path, 'r') {|file| file.read} + File.open(path, 'w') {|file| orig_content.each_line {|line| file.puts line unless line.chomp =~ delete_regex}} + end + end + + desc <<-END_DESC +Adds a new top-level translation string to all locale file (only works for childless keys, probably doesn\'t work on windows, doesn't check for duplicates). + +Options: + key="some_key=foo" + key1="another_key=bar" + key_fb="foo=bar" Keys to add in the form key=value, every option of the form key[,\\d,_*] will be recognised + skip=en,de Comma-separated list of locale files to ignore (filename without extension) +END_DESC + + task :add_key do + dir = ENV['DIR'] || './config/locales' + files = Dir.glob(File.join(dir,'*.yml')) + skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil + keys_regex = /\Akey(\d+|_.+)?\z/ + adds = ENV.reject {|k,v| !(k =~ keys_regex)}.values.collect {|v| Array.new v.split("=",2)} + key_list = adds.collect {|v| v[0]}.join(", ") + + files.each do |path| + # Skip certain locales + (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips + # TODO: Check for duplicate/existing keys + puts "Adding #{key_list} to #{path}" + File.open(path, 'a') do |file| + adds.each do |kv| + Hash[*kv].to_yaml.each_line do |line| + file.puts " #{line}" unless (line =~ /^---/ || line.empty?) + end + end + end + end + end + + desc 'Duplicates a key. Exemple rake locales:dup key=foo new_key=bar' + task :dup do + dir = ENV['DIR'] || './config/locales' + files = Dir.glob(File.join(dir,'*.yml')) + skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil + key = ENV['key'] + new_key = ENV['new_key'] + abort "Missing key argument" if key.blank? + abort "Missing new_key argument" if new_key.blank? + + files.each do |path| + # Skip certain locales + (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips + puts "Adding #{new_key} to #{path}" + + strings = File.read(path) + unless strings =~ /^( #{key}: .+)$/ + puts "Key not found in #{path}" + next + end + line = $1 + + File.open(path, 'a') do |file| + file.puts(line.sub(key, new_key)) + end + end + end + + desc 'Check parsing yaml by psych library on Ruby 1.9.' + + # On Fedora 12 and 13, if libyaml-devel is available, + # in case of installing by rvm, + # Ruby 1.9 default yaml library is psych. + + task :check_parsing_by_psych do + begin + require 'psych' + parser = Psych::Parser.new + dir = ENV['DIR'] || './config/locales' + files = Dir.glob(File.join(dir,'*.yml')) + files.sort.each do |filename| + next if File.directory? filename + puts "parsing #{filename}..." + begin + parser.parse File.open(filename) + rescue Exception => e1 + puts(e1.message) + puts("") + end + end + rescue Exception => e + puts(e.message) + end + end +end diff --git a/lib/tasks/metrics.rake b/lib/tasks/metrics.rake new file mode 100644 index 0000000..214cc99 --- /dev/null +++ b/lib/tasks/metrics.rake @@ -0,0 +1,6 @@ +begin + require 'metric_fu' +rescue LoadError + # Metric-fu not installed + # http://metric-fu.rubyforge.org/ +end diff --git a/lib/tasks/migrate_from_mantis.rake b/lib/tasks/migrate_from_mantis.rake new file mode 100644 index 0000000..61c4232 --- /dev/null +++ b/lib/tasks/migrate_from_mantis.rake @@ -0,0 +1,516 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +desc 'Mantis migration script' + +require 'active_record' +require 'pp' + +namespace :redmine do +task :migrate_from_mantis => :environment do + + module MantisMigrate + + new_status = IssueStatus.find_by_position(1) + assigned_status = IssueStatus.find_by_position(2) + resolved_status = IssueStatus.find_by_position(3) + feedback_status = IssueStatus.find_by_position(4) + closed_status = IssueStatus.where(:is_closed => true).first + STATUS_MAPPING = {10 => new_status, # new + 20 => feedback_status, # feedback + 30 => new_status, # acknowledged + 40 => new_status, # confirmed + 50 => assigned_status, # assigned + 80 => resolved_status, # resolved + 90 => closed_status # closed + } + + priorities = IssuePriority.all + DEFAULT_PRIORITY = priorities[2] + PRIORITY_MAPPING = {10 => priorities[1], # none + 20 => priorities[1], # low + 30 => priorities[2], # normal + 40 => priorities[3], # high + 50 => priorities[4], # urgent + 60 => priorities[5] # immediate + } + + TRACKER_BUG = Tracker.find_by_position(1) + TRACKER_FEATURE = Tracker.find_by_position(2) + + roles = Role.where(:builtin => 0).order('position ASC').all + manager_role = roles[0] + developer_role = roles[1] + DEFAULT_ROLE = roles.last + ROLE_MAPPING = {10 => DEFAULT_ROLE, # viewer + 25 => DEFAULT_ROLE, # reporter + 40 => DEFAULT_ROLE, # updater + 55 => developer_role, # developer + 70 => manager_role, # manager + 90 => manager_role # administrator + } + + CUSTOM_FIELD_TYPE_MAPPING = {0 => 'string', # String + 1 => 'int', # Numeric + 2 => 'int', # Float + 3 => 'list', # Enumeration + 4 => 'string', # Email + 5 => 'bool', # Checkbox + 6 => 'list', # List + 7 => 'list', # Multiselection list + 8 => 'date', # Date + } + + RELATION_TYPE_MAPPING = {1 => IssueRelation::TYPE_RELATES, # related to + 2 => IssueRelation::TYPE_RELATES, # parent of + 3 => IssueRelation::TYPE_RELATES, # child of + 0 => IssueRelation::TYPE_DUPLICATES, # duplicate of + 4 => IssueRelation::TYPE_DUPLICATES # has duplicate + } + + class MantisUser < ActiveRecord::Base + self.table_name = :mantis_user_table + + def firstname + @firstname = realname.blank? ? username : realname.split.first[0..29] + @firstname + end + + def lastname + @lastname = realname.blank? ? '-' : realname.split[1..-1].join(' ')[0..29] + @lastname = '-' if @lastname.blank? + @lastname + end + + def email + if read_attribute(:email).match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) && + !User.find_by_mail(read_attribute(:email)) + @email = read_attribute(:email) + else + @email = "#{username}@foo.bar" + end + end + + def username + read_attribute(:username)[0..29].gsub(/[^a-zA-Z0-9_\-@\.]/, '-') + end + end + + class MantisProject < ActiveRecord::Base + self.table_name = :mantis_project_table + has_many :versions, :class_name => "MantisVersion", :foreign_key => :project_id + has_many :categories, :class_name => "MantisCategory", :foreign_key => :project_id + has_many :news, :class_name => "MantisNews", :foreign_key => :project_id + has_many :members, :class_name => "MantisProjectUser", :foreign_key => :project_id + + def identifier + read_attribute(:name).downcase.gsub(/[^a-z0-9\-]+/, '-').slice(0, Project::IDENTIFIER_MAX_LENGTH) + end + end + + class MantisVersion < ActiveRecord::Base + self.table_name = :mantis_project_version_table + + def version + read_attribute(:version)[0..29] + end + + def description + read_attribute(:description)[0..254] + end + end + + class MantisCategory < ActiveRecord::Base + self.table_name = :mantis_project_category_table + end + + class MantisProjectUser < ActiveRecord::Base + self.table_name = :mantis_project_user_list_table + end + + class MantisBug < ActiveRecord::Base + self.table_name = :mantis_bug_table + belongs_to :bug_text, :class_name => "MantisBugText", :foreign_key => :bug_text_id + has_many :bug_notes, :class_name => "MantisBugNote", :foreign_key => :bug_id + has_many :bug_files, :class_name => "MantisBugFile", :foreign_key => :bug_id + has_many :bug_monitors, :class_name => "MantisBugMonitor", :foreign_key => :bug_id + end + + class MantisBugText < ActiveRecord::Base + self.table_name = :mantis_bug_text_table + + # Adds Mantis steps_to_reproduce and additional_information fields + # to description if any + def full_description + full_description = description + full_description += "\n\n*Steps to reproduce:*\n\n#{steps_to_reproduce}" unless steps_to_reproduce.blank? + full_description += "\n\n*Additional information:*\n\n#{additional_information}" unless additional_information.blank? + full_description + end + end + + class MantisBugNote < ActiveRecord::Base + self.table_name = :mantis_bugnote_table + belongs_to :bug, :class_name => "MantisBug", :foreign_key => :bug_id + belongs_to :bug_note_text, :class_name => "MantisBugNoteText", :foreign_key => :bugnote_text_id + end + + class MantisBugNoteText < ActiveRecord::Base + self.table_name = :mantis_bugnote_text_table + end + + class MantisBugFile < ActiveRecord::Base + self.table_name = :mantis_bug_file_table + + def size + filesize + end + + def original_filename + MantisMigrate.encode(filename) + end + + def content_type + file_type + end + + def read(*args) + if @read_finished + nil + else + @read_finished = true + content + end + end + end + + class MantisBugRelationship < ActiveRecord::Base + self.table_name = :mantis_bug_relationship_table + end + + class MantisBugMonitor < ActiveRecord::Base + self.table_name = :mantis_bug_monitor_table + end + + class MantisNews < ActiveRecord::Base + self.table_name = :mantis_news_table + end + + class MantisCustomField < ActiveRecord::Base + self.table_name = :mantis_custom_field_table + set_inheritance_column :none + has_many :values, :class_name => "MantisCustomFieldString", :foreign_key => :field_id + has_many :projects, :class_name => "MantisCustomFieldProject", :foreign_key => :field_id + + def format + read_attribute :type + end + + def name + read_attribute(:name)[0..29] + end + end + + class MantisCustomFieldProject < ActiveRecord::Base + self.table_name = :mantis_custom_field_project_table + end + + class MantisCustomFieldString < ActiveRecord::Base + self.table_name = :mantis_custom_field_string_table + end + + def self.migrate + + # Users + print "Migrating users" + User.where("login <> 'admin'").delete_all + users_map = {} + users_migrated = 0 + MantisUser.all.each do |user| + u = User.new :firstname => encode(user.firstname), + :lastname => encode(user.lastname), + :mail => user.email, + :last_login_on => user.last_visit + u.login = user.username + u.password = 'mantis' + u.status = User::STATUS_LOCKED if user.enabled != 1 + u.admin = true if user.access_level == 90 + next unless u.save! + users_migrated += 1 + users_map[user.id] = u.id + print '.' + end + puts + + # Projects + print "Migrating projects" + Project.destroy_all + projects_map = {} + versions_map = {} + categories_map = {} + MantisProject.all.each do |project| + p = Project.new :name => encode(project.name), + :description => encode(project.description) + p.identifier = project.identifier + next unless p.save + projects_map[project.id] = p.id + p.enabled_module_names = ['issue_tracking', 'news', 'wiki'] + p.trackers << TRACKER_BUG unless p.trackers.include?(TRACKER_BUG) + p.trackers << TRACKER_FEATURE unless p.trackers.include?(TRACKER_FEATURE) + print '.' + + # Project members + project.members.each do |member| + m = Member.new :user => User.find_by_id(users_map[member.user_id]), + :roles => [ROLE_MAPPING[member.access_level] || DEFAULT_ROLE] + m.project = p + m.save + end + + # Project versions + project.versions.each do |version| + v = Version.new :name => encode(version.version), + :description => encode(version.description), + :effective_date => (version.date_order ? version.date_order.to_date : nil) + v.project = p + v.save + versions_map[version.id] = v.id + end + + # Project categories + project.categories.each do |category| + g = IssueCategory.new :name => category.category[0,30] + g.project = p + g.save + categories_map[category.category] = g.id + end + end + puts + + # Bugs + print "Migrating bugs" + Issue.destroy_all + issues_map = {} + keep_bug_ids = (Issue.count == 0) + MantisBug.find_each(:batch_size => 200) do |bug| + next unless projects_map[bug.project_id] && users_map[bug.reporter_id] + i = Issue.new :project_id => projects_map[bug.project_id], + :subject => encode(bug.summary), + :description => encode(bug.bug_text.full_description), + :priority => PRIORITY_MAPPING[bug.priority] || DEFAULT_PRIORITY, + :created_on => bug.date_submitted, + :updated_on => bug.last_updated + i.author = User.find_by_id(users_map[bug.reporter_id]) + i.category = IssueCategory.find_by_project_id_and_name(i.project_id, bug.category[0,30]) unless bug.category.blank? + i.fixed_version = Version.find_by_project_id_and_name(i.project_id, bug.fixed_in_version) unless bug.fixed_in_version.blank? + i.tracker = (bug.severity == 10 ? TRACKER_FEATURE : TRACKER_BUG) + i.status = STATUS_MAPPING[bug.status] || i.status + i.id = bug.id if keep_bug_ids + next unless i.save + issues_map[bug.id] = i.id + print '.' + STDOUT.flush + + # Assignee + # Redmine checks that the assignee is a project member + if (bug.handler_id && users_map[bug.handler_id]) + i.assigned_to = User.find_by_id(users_map[bug.handler_id]) + i.save(:validate => false) + end + + # Bug notes + bug.bug_notes.each do |note| + next unless users_map[note.reporter_id] + n = Journal.new :notes => encode(note.bug_note_text.note), + :created_on => note.date_submitted + n.user = User.find_by_id(users_map[note.reporter_id]) + n.journalized = i + n.save + end + + # Bug files + bug.bug_files.each do |file| + a = Attachment.new :created_on => file.date_added + a.file = file + a.author = User.first + a.container = i + a.save + end + + # Bug monitors + bug.bug_monitors.each do |monitor| + next unless users_map[monitor.user_id] + i.add_watcher(User.find_by_id(users_map[monitor.user_id])) + end + end + + # update issue id sequence if needed (postgresql) + Issue.connection.reset_pk_sequence!(Issue.table_name) if Issue.connection.respond_to?('reset_pk_sequence!') + puts + + # Bug relationships + print "Migrating bug relations" + MantisBugRelationship.all.each do |relation| + next unless issues_map[relation.source_bug_id] && issues_map[relation.destination_bug_id] + r = IssueRelation.new :relation_type => RELATION_TYPE_MAPPING[relation.relationship_type] + r.issue_from = Issue.find_by_id(issues_map[relation.source_bug_id]) + r.issue_to = Issue.find_by_id(issues_map[relation.destination_bug_id]) + pp r unless r.save + print '.' + STDOUT.flush + end + puts + + # News + print "Migrating news" + News.destroy_all + MantisNews.where('project_id > 0').all.each do |news| + next unless projects_map[news.project_id] + n = News.new :project_id => projects_map[news.project_id], + :title => encode(news.headline[0..59]), + :description => encode(news.body), + :created_on => news.date_posted + n.author = User.find_by_id(users_map[news.poster_id]) + n.save + print '.' + STDOUT.flush + end + puts + + # Custom fields + print "Migrating custom fields" + IssueCustomField.destroy_all + MantisCustomField.all.each do |field| + f = IssueCustomField.new :name => field.name[0..29], + :field_format => CUSTOM_FIELD_TYPE_MAPPING[field.format], + :min_length => field.length_min, + :max_length => field.length_max, + :regexp => field.valid_regexp, + :possible_values => field.possible_values.split('|'), + :is_required => field.require_report? + next unless f.save + print '.' + STDOUT.flush + # Trackers association + f.trackers = Tracker.all + + # Projects association + field.projects.each do |project| + f.projects << Project.find_by_id(projects_map[project.project_id]) if projects_map[project.project_id] + end + + # Values + field.values.each do |value| + v = CustomValue.new :custom_field_id => f.id, + :value => value.value + v.customized = Issue.find_by_id(issues_map[value.bug_id]) if issues_map[value.bug_id] + v.save + end unless f.new_record? + end + puts + + puts + puts "Users: #{users_migrated}/#{MantisUser.count}" + puts "Projects: #{Project.count}/#{MantisProject.count}" + puts "Memberships: #{Member.count}/#{MantisProjectUser.count}" + puts "Versions: #{Version.count}/#{MantisVersion.count}" + puts "Categories: #{IssueCategory.count}/#{MantisCategory.count}" + puts "Bugs: #{Issue.count}/#{MantisBug.count}" + puts "Bug notes: #{Journal.count}/#{MantisBugNote.count}" + puts "Bug files: #{Attachment.count}/#{MantisBugFile.count}" + puts "Bug relations: #{IssueRelation.count}/#{MantisBugRelationship.count}" + puts "Bug monitors: #{Watcher.count}/#{MantisBugMonitor.count}" + puts "News: #{News.count}/#{MantisNews.count}" + puts "Custom fields: #{IssueCustomField.count}/#{MantisCustomField.count}" + end + + def self.encoding(charset) + @charset = charset + end + + def self.establish_connection(params) + constants.each do |const| + klass = const_get(const) + next unless klass.respond_to? 'establish_connection' + klass.establish_connection params + end + end + + def self.encode(text) + text.to_s.force_encoding(@charset).encode('UTF-8') + end + end + + puts + if Redmine::DefaultData::Loader.no_data? + puts "Redmine configuration need to be loaded before importing data." + puts "Please, run this first:" + puts + puts " rake redmine:load_default_data RAILS_ENV=\"#{ENV['RAILS_ENV']}\"" + exit + end + + puts "WARNING: Your Redmine data will be deleted during this process." + print "Are you sure you want to continue ? [y/N] " + STDOUT.flush + break unless STDIN.gets.match(/^y$/i) + + # Default Mantis database settings + db_params = {:adapter => 'mysql2', + :database => 'bugtracker', + :host => 'localhost', + :username => 'root', + :password => '' } + + puts + puts "Please enter settings for your Mantis database" + [:adapter, :host, :database, :username, :password].each do |param| + print "#{param} [#{db_params[param]}]: " + value = STDIN.gets.chomp! + db_params[param] = value unless value.blank? + end + + while true + print "encoding [UTF-8]: " + STDOUT.flush + encoding = STDIN.gets.chomp! + encoding = 'UTF-8' if encoding.blank? + break if MantisMigrate.encoding encoding + puts "Invalid encoding!" + end + puts + + # Make sure bugs can refer bugs in other projects + Setting.cross_project_issue_relations = 1 if Setting.respond_to? 'cross_project_issue_relations' + + old_notified_events = Setting.notified_events + old_password_min_length = Setting.password_min_length + begin + # Turn off email notifications temporarily + Setting.notified_events = [] + Setting.password_min_length = 4 + # Run the migration + MantisMigrate.establish_connection db_params + MantisMigrate.migrate + ensure + # Restore previous settings + Setting.notified_events = old_notified_events + Setting.password_min_length = old_password_min_length + end + +end +end diff --git a/lib/tasks/migrate_from_trac.rake b/lib/tasks/migrate_from_trac.rake new file mode 100644 index 0000000..2b8eeea --- /dev/null +++ b/lib/tasks/migrate_from_trac.rake @@ -0,0 +1,777 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'active_record' +require 'pp' + +namespace :redmine do + desc 'Trac migration script' + task :migrate_from_trac => :environment do + + module TracMigrate + TICKET_MAP = [] + + new_status = IssueStatus.find_by_position(1) + assigned_status = IssueStatus.find_by_position(2) + resolved_status = IssueStatus.find_by_position(3) + feedback_status = IssueStatus.find_by_position(4) + closed_status = IssueStatus.where(:is_closed => true).first + STATUS_MAPPING = {'new' => new_status, + 'reopened' => feedback_status, + 'assigned' => assigned_status, + 'closed' => closed_status + } + + priorities = IssuePriority.all + DEFAULT_PRIORITY = priorities[0] + PRIORITY_MAPPING = {'lowest' => priorities[0], + 'low' => priorities[0], + 'normal' => priorities[1], + 'high' => priorities[2], + 'highest' => priorities[3], + # --- + 'trivial' => priorities[0], + 'minor' => priorities[1], + 'major' => priorities[2], + 'critical' => priorities[3], + 'blocker' => priorities[4] + } + + TRACKER_BUG = Tracker.find_by_position(1) + TRACKER_FEATURE = Tracker.find_by_position(2) + DEFAULT_TRACKER = TRACKER_BUG + TRACKER_MAPPING = {'defect' => TRACKER_BUG, + 'enhancement' => TRACKER_FEATURE, + 'task' => TRACKER_FEATURE, + 'patch' =>TRACKER_FEATURE + } + + roles = Role.where(:builtin => 0).order('position ASC').all + manager_role = roles[0] + developer_role = roles[1] + DEFAULT_ROLE = roles.last + ROLE_MAPPING = {'admin' => manager_role, + 'developer' => developer_role + } + + class ::Time + class << self + alias :real_now :now + def now + real_now - @fake_diff.to_i + end + def fake(time) + @fake_diff = real_now - time + res = yield + @fake_diff = 0 + res + end + end + end + + class TracComponent < ActiveRecord::Base + self.table_name = :component + end + + class TracMilestone < ActiveRecord::Base + self.table_name = :milestone + # If this attribute is set a milestone has a defined target timepoint + def due + if read_attribute(:due) && read_attribute(:due) > 0 + Time.at(read_attribute(:due)).to_date + else + nil + end + end + # This is the real timepoint at which the milestone has finished. + def completed + if read_attribute(:completed) && read_attribute(:completed) > 0 + Time.at(read_attribute(:completed)).to_date + else + nil + end + end + + def description + # Attribute is named descr in Trac v0.8.x + has_attribute?(:descr) ? read_attribute(:descr) : read_attribute(:description) + end + end + + class TracTicketCustom < ActiveRecord::Base + self.table_name = :ticket_custom + end + + class TracAttachment < ActiveRecord::Base + self.table_name = :attachment + set_inheritance_column :none + + def time; Time.at(read_attribute(:time)) end + + def original_filename + filename + end + + def content_type + '' + end + + def exist? + File.file? trac_fullpath + end + + def open + File.open("#{trac_fullpath}", 'rb') {|f| + @file = f + yield self + } + end + + def read(*args) + @file.read(*args) + end + + def description + read_attribute(:description).to_s.slice(0,255) + end + + private + def trac_fullpath + attachment_type = read_attribute(:type) + #replace exotic characters with their hex representation to avoid invalid filenames + trac_file = filename.gsub( /[^a-zA-Z0-9\-_\.!~*']/n ) do |x| + codepoint = x.codepoints.to_a[0] + sprintf('%%%02x', codepoint) + end + "#{TracMigrate.trac_attachments_directory}/#{attachment_type}/#{id}/#{trac_file}" + end + end + + class TracTicket < ActiveRecord::Base + self.table_name = :ticket + set_inheritance_column :none + + # ticket changes: only migrate status changes and comments + has_many :ticket_changes, :class_name => "TracTicketChange", :foreign_key => :ticket + has_many :customs, :class_name => "TracTicketCustom", :foreign_key => :ticket + + def attachments + TracMigrate::TracAttachment.all(:conditions => ["type = 'ticket' AND id = ?", self.id.to_s]) + end + + def ticket_type + read_attribute(:type) + end + + def summary + read_attribute(:summary).blank? ? "(no subject)" : read_attribute(:summary) + end + + def description + read_attribute(:description).blank? ? summary : read_attribute(:description) + end + + def time; Time.at(read_attribute(:time)) end + def changetime; Time.at(read_attribute(:changetime)) end + end + + class TracTicketChange < ActiveRecord::Base + self.table_name = :ticket_change + + def self.columns + # Hides Trac field 'field' to prevent clash with AR field_changed? method (Rails 3.0) + super.select {|column| column.name.to_s != 'field'} + end + + def time; Time.at(read_attribute(:time)) end + end + + TRAC_WIKI_PAGES = %w(InterMapTxt InterTrac InterWiki RecentChanges SandBox TracAccessibility TracAdmin TracBackup TracBrowser TracCgi TracChangeset \ + TracEnvironment TracFastCgi TracGuide TracImport TracIni TracInstall TracInterfaceCustomization \ + TracLinks TracLogging TracModPython TracNotification TracPermissions TracPlugins TracQuery \ + TracReports TracRevisionLog TracRoadmap TracRss TracSearch TracStandalone TracSupport TracSyntaxColoring TracTickets \ + TracTicketsCustomFields TracTimeline TracUnicode TracUpgrade TracWiki WikiDeletePage WikiFormatting \ + WikiHtml WikiMacros WikiNewPage WikiPageNames WikiProcessors WikiRestructuredText WikiRestructuredTextLinks \ + CamelCase TitleIndex) + + class TracWikiPage < ActiveRecord::Base + self.table_name = :wiki + set_primary_key :name + + def self.columns + # Hides readonly Trac field to prevent clash with AR readonly? method (Rails 2.0) + super.select {|column| column.name.to_s != 'readonly'} + end + + def attachments + TracMigrate::TracAttachment.all(:conditions => ["type = 'wiki' AND id = ?", self.id.to_s]) + end + + def time; Time.at(read_attribute(:time)) end + end + + class TracPermission < ActiveRecord::Base + self.table_name = :permission + end + + class TracSessionAttribute < ActiveRecord::Base + self.table_name = :session_attribute + end + + def self.find_or_create_user(username, project_member = false) + return User.anonymous if username.blank? + + u = User.find_by_login(username) + if !u + # Create a new user if not found + mail = username[0, User::MAIL_LENGTH_LIMIT] + if mail_attr = TracSessionAttribute.find_by_sid_and_name(username, 'email') + mail = mail_attr.value + end + mail = "#{mail}@foo.bar" unless mail.include?("@") + + name = username + if name_attr = TracSessionAttribute.find_by_sid_and_name(username, 'name') + name = name_attr.value + end + name =~ (/(\w+)(\s+\w+)?/) + fn = ($1 || "-").strip + ln = ($2 || '-').strip + + u = User.new :mail => mail.gsub(/[^-@a-z0-9\.]/i, '-'), + :firstname => fn[0, limit_for(User, 'firstname')], + :lastname => ln[0, limit_for(User, 'lastname')] + + u.login = username[0, User::LOGIN_LENGTH_LIMIT].gsub(/[^a-z0-9_\-@\.]/i, '-') + u.password = 'trac' + u.admin = true if TracPermission.find_by_username_and_action(username, 'admin') + # finally, a default user is used if the new user is not valid + u = User.first unless u.save + end + # Make sure user is a member of the project + if project_member && !u.member_of?(@target_project) + role = DEFAULT_ROLE + if u.admin + role = ROLE_MAPPING['admin'] + elsif TracPermission.find_by_username_and_action(username, 'developer') + role = ROLE_MAPPING['developer'] + end + Member.create(:user => u, :project => @target_project, :roles => [role]) + u.reload + end + u + end + + # Basic wiki syntax conversion + def self.convert_wiki_text(text) + # Titles + text = text.gsub(/^(\=+)\s(.+)\s(\=+)/) {|s| "\nh#{$1.length}. #{$2}\n"} + # External Links + text = text.gsub(/\[(http[^\s]+)\s+([^\]]+)\]/) {|s| "\"#{$2}\":#{$1}"} + # Ticket links: + # [ticket:234 Text],[ticket:234 This is a test] + text = text.gsub(/\[ticket\:([^\ ]+)\ (.+?)\]/, '"\2":/issues/show/\1') + # ticket:1234 + # #1 is working cause Redmine uses the same syntax. + text = text.gsub(/ticket\:([^\ ]+)/, '#\1') + # Milestone links: + # [milestone:"0.1.0 Mercury" Milestone 0.1.0 (Mercury)] + # The text "Milestone 0.1.0 (Mercury)" is not converted, + # cause Redmine's wiki does not support this. + text = text.gsub(/\[milestone\:\"([^\"]+)\"\ (.+?)\]/, 'version:"\1"') + # [milestone:"0.1.0 Mercury"] + text = text.gsub(/\[milestone\:\"([^\"]+)\"\]/, 'version:"\1"') + text = text.gsub(/milestone\:\"([^\"]+)\"/, 'version:"\1"') + # milestone:0.1.0 + text = text.gsub(/\[milestone\:([^\ ]+)\]/, 'version:\1') + text = text.gsub(/milestone\:([^\ ]+)/, 'version:\1') + # Internal Links + text = text.gsub(/\[\[BR\]\]/, "\n") # This has to go before the rules below + text = text.gsub(/\[\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} + text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} + text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} + text = text.gsub(/\[wiki:([^\s\]]+)\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"} + text = text.gsub(/\[wiki:([^\s\]]+)\s(.*)\]/) {|s| "[[#{$1.delete(',./?;|:')}|#{$2.delete(',./?;|:')}]]"} + + # Links to pages UsingJustWikiCaps + text = text.gsub(/([^!]|^)(^| )([A-Z][a-z]+[A-Z][a-zA-Z]+)/, '\\1\\2[[\3]]') + # Normalize things that were supposed to not be links + # like !NotALink + text = text.gsub(/(^| )!([A-Z][A-Za-z]+)/, '\1\2') + # Revisions links + text = text.gsub(/\[(\d+)\]/, 'r\1') + # Ticket number re-writing + text = text.gsub(/#(\d+)/) do |s| + if $1.length < 10 +# TICKET_MAP[$1.to_i] ||= $1 + "\##{TICKET_MAP[$1.to_i] || $1}" + else + s + end + end + # We would like to convert the Code highlighting too + # This will go into the next line. + shebang_line = false + # Regular expression for start of code + pre_re = /\{\{\{/ + # Code highlighting... + shebang_re = /^\#\!([a-z]+)/ + # Regular expression for end of code + pre_end_re = /\}\}\}/ + + # Go through the whole text..extract it line by line + text = text.gsub(/^(.*)$/) do |line| + m_pre = pre_re.match(line) + if m_pre + line = '
        '
        +          else
        +            m_sl = shebang_re.match(line)
        +            if m_sl
        +              shebang_line = true
        +              line = ''
        +            end
        +            m_pre_end = pre_end_re.match(line)
        +            if m_pre_end
        +              line = '
        ' + if shebang_line + line = '' + line + end + end + end + line + end + + # Highlighting + text = text.gsub(/'''''([^\s])/, '_*\1') + text = text.gsub(/([^\s])'''''/, '\1*_') + text = text.gsub(/'''/, '*') + text = text.gsub(/''/, '_') + text = text.gsub(/__/, '+') + text = text.gsub(/~~/, '-') + text = text.gsub(/`/, '@') + text = text.gsub(/,,/, '~') + # Lists + text = text.gsub(/^([ ]+)\* /) {|s| '*' * $1.length + " "} + + text + end + + def self.migrate + establish_connection + + # Quick database test + TracComponent.count + + migrated_components = 0 + migrated_milestones = 0 + migrated_tickets = 0 + migrated_custom_values = 0 + migrated_ticket_attachments = 0 + migrated_wiki_edits = 0 + migrated_wiki_attachments = 0 + + #Wiki system initializing... + @target_project.wiki.destroy if @target_project.wiki + @target_project.reload + wiki = Wiki.new(:project => @target_project, :start_page => 'WikiStart') + wiki_edit_count = 0 + + # Components + print "Migrating components" + issues_category_map = {} + TracComponent.all.each do |component| + print '.' + STDOUT.flush + c = IssueCategory.new :project => @target_project, + :name => encode(component.name[0, limit_for(IssueCategory, 'name')]) + next unless c.save + issues_category_map[component.name] = c + migrated_components += 1 + end + puts + + # Milestones + print "Migrating milestones" + version_map = {} + TracMilestone.all.each do |milestone| + print '.' + STDOUT.flush + # First we try to find the wiki page... + p = wiki.find_or_new_page(milestone.name.to_s) + p.content = WikiContent.new(:page => p) if p.new_record? + p.content.text = milestone.description.to_s + p.content.author = find_or_create_user('trac') + p.content.comments = 'Milestone' + p.save + + v = Version.new :project => @target_project, + :name => encode(milestone.name[0, limit_for(Version, 'name')]), + :description => nil, + :wiki_page_title => milestone.name.to_s, + :effective_date => milestone.completed + + next unless v.save + version_map[milestone.name] = v + migrated_milestones += 1 + end + puts + + # Custom fields + # TODO: read trac.ini instead + print "Migrating custom fields" + custom_field_map = {} + TracTicketCustom.find_by_sql("SELECT DISTINCT name FROM #{TracTicketCustom.table_name}").each do |field| + print '.' + STDOUT.flush + # Redmine custom field name + field_name = encode(field.name[0, limit_for(IssueCustomField, 'name')]).humanize + # Find if the custom already exists in Redmine + f = IssueCustomField.find_by_name(field_name) + # Or create a new one + f ||= IssueCustomField.create(:name => encode(field.name[0, limit_for(IssueCustomField, 'name')]).humanize, + :field_format => 'string') + + next if f.new_record? + f.trackers = Tracker.all + f.projects << @target_project + custom_field_map[field.name] = f + end + puts + + # Trac 'resolution' field as a Redmine custom field + r = IssueCustomField.where(:name => "Resolution").first + r = IssueCustomField.new(:name => 'Resolution', + :field_format => 'list', + :is_filter => true) if r.nil? + r.trackers = Tracker.all + r.projects << @target_project + r.possible_values = (r.possible_values + %w(fixed invalid wontfix duplicate worksforme)).flatten.compact.uniq + r.save! + custom_field_map['resolution'] = r + + # Tickets + print "Migrating tickets" + TracTicket.find_each(:batch_size => 200) do |ticket| + print '.' + STDOUT.flush + i = Issue.new :project => @target_project, + :subject => encode(ticket.summary[0, limit_for(Issue, 'subject')]), + :description => convert_wiki_text(encode(ticket.description)), + :priority => PRIORITY_MAPPING[ticket.priority] || DEFAULT_PRIORITY, + :created_on => ticket.time + i.author = find_or_create_user(ticket.reporter) + i.category = issues_category_map[ticket.component] unless ticket.component.blank? + i.fixed_version = version_map[ticket.milestone] unless ticket.milestone.blank? + i.tracker = TRACKER_MAPPING[ticket.ticket_type] || DEFAULT_TRACKER + i.status = STATUS_MAPPING[ticket.status] || i.default_status + i.id = ticket.id unless Issue.exists?(ticket.id) + next unless Time.fake(ticket.changetime) { i.save } + TICKET_MAP[ticket.id] = i.id + migrated_tickets += 1 + + # Owner + unless ticket.owner.blank? + i.assigned_to = find_or_create_user(ticket.owner, true) + Time.fake(ticket.changetime) { i.save } + end + + # Comments and status/resolution changes + ticket.ticket_changes.group_by(&:time).each do |time, changeset| + status_change = changeset.select {|change| change.field == 'status'}.first + resolution_change = changeset.select {|change| change.field == 'resolution'}.first + comment_change = changeset.select {|change| change.field == 'comment'}.first + + n = Journal.new :notes => (comment_change ? convert_wiki_text(encode(comment_change.newvalue)) : ''), + :created_on => time + n.user = find_or_create_user(changeset.first.author) + n.journalized = i + if status_change && + STATUS_MAPPING[status_change.oldvalue] && + STATUS_MAPPING[status_change.newvalue] && + (STATUS_MAPPING[status_change.oldvalue] != STATUS_MAPPING[status_change.newvalue]) + n.details << JournalDetail.new(:property => 'attr', + :prop_key => 'status_id', + :old_value => STATUS_MAPPING[status_change.oldvalue].id, + :value => STATUS_MAPPING[status_change.newvalue].id) + end + if resolution_change + n.details << JournalDetail.new(:property => 'cf', + :prop_key => custom_field_map['resolution'].id, + :old_value => resolution_change.oldvalue, + :value => resolution_change.newvalue) + end + n.save unless n.details.empty? && n.notes.blank? + end + + # Attachments + ticket.attachments.each do |attachment| + next unless attachment.exist? + attachment.open { + a = Attachment.new :created_on => attachment.time + a.file = attachment + a.author = find_or_create_user(attachment.author) + a.container = i + a.description = attachment.description + migrated_ticket_attachments += 1 if a.save + } + end + + # Custom fields + custom_values = ticket.customs.inject({}) do |h, custom| + if custom_field = custom_field_map[custom.name] + h[custom_field.id] = custom.value + migrated_custom_values += 1 + end + h + end + if custom_field_map['resolution'] && !ticket.resolution.blank? + custom_values[custom_field_map['resolution'].id] = ticket.resolution + end + i.custom_field_values = custom_values + i.save_custom_field_values + end + + # update issue id sequence if needed (postgresql) + Issue.connection.reset_pk_sequence!(Issue.table_name) if Issue.connection.respond_to?('reset_pk_sequence!') + puts + + # Wiki + print "Migrating wiki" + if wiki.save + TracWikiPage.order('name, version').all.each do |page| + # Do not migrate Trac manual wiki pages + next if TRAC_WIKI_PAGES.include?(page.name) + wiki_edit_count += 1 + print '.' + STDOUT.flush + p = wiki.find_or_new_page(page.name) + p.content = WikiContent.new(:page => p) if p.new_record? + p.content.text = page.text + p.content.author = find_or_create_user(page.author) unless page.author.blank? || page.author == 'trac' + p.content.comments = page.comment + Time.fake(page.time) { p.new_record? ? p.save : p.content.save } + + next if p.content.new_record? + migrated_wiki_edits += 1 + + # Attachments + page.attachments.each do |attachment| + next unless attachment.exist? + next if p.attachments.find_by_filename(attachment.filename.gsub(/^.*(\\|\/)/, '').gsub(/[^\w\.\-]/,'_')) #add only once per page + attachment.open { + a = Attachment.new :created_on => attachment.time + a.file = attachment + a.author = find_or_create_user(attachment.author) + a.description = attachment.description + a.container = p + migrated_wiki_attachments += 1 if a.save + } + end + end + + wiki.reload + wiki.pages.each do |page| + page.content.text = convert_wiki_text(page.content.text) + Time.fake(page.content.updated_on) { page.content.save } + end + end + puts + + puts + puts "Components: #{migrated_components}/#{TracComponent.count}" + puts "Milestones: #{migrated_milestones}/#{TracMilestone.count}" + puts "Tickets: #{migrated_tickets}/#{TracTicket.count}" + puts "Ticket files: #{migrated_ticket_attachments}/" + TracAttachment.count(:conditions => {:type => 'ticket'}).to_s + puts "Custom values: #{migrated_custom_values}/#{TracTicketCustom.count}" + puts "Wiki edits: #{migrated_wiki_edits}/#{wiki_edit_count}" + puts "Wiki files: #{migrated_wiki_attachments}/" + TracAttachment.count(:conditions => {:type => 'wiki'}).to_s + end + + def self.limit_for(klass, attribute) + klass.columns_hash[attribute.to_s].limit + end + + def self.encoding(charset) + @charset = charset + end + + def self.set_trac_directory(path) + @@trac_directory = path + raise "This directory doesn't exist!" unless File.directory?(path) + raise "#{trac_attachments_directory} doesn't exist!" unless File.directory?(trac_attachments_directory) + @@trac_directory + rescue Exception => e + puts e + return false + end + + def self.trac_directory + @@trac_directory + end + + def self.set_trac_adapter(adapter) + return false if adapter.blank? + raise "Unknown adapter: #{adapter}!" unless %w(sqlite3 mysql postgresql).include?(adapter) + # If adapter is sqlite or sqlite3, make sure that trac.db exists + raise "#{trac_db_path} doesn't exist!" if %w(sqlite3).include?(adapter) && !File.exist?(trac_db_path) + @@trac_adapter = adapter + rescue Exception => e + puts e + return false + end + + def self.set_trac_db_host(host) + return nil if host.blank? + @@trac_db_host = host + end + + def self.set_trac_db_port(port) + return nil if port.to_i == 0 + @@trac_db_port = port.to_i + end + + def self.set_trac_db_name(name) + return nil if name.blank? + @@trac_db_name = name + end + + def self.set_trac_db_username(username) + @@trac_db_username = username + end + + def self.set_trac_db_password(password) + @@trac_db_password = password + end + + def self.set_trac_db_schema(schema) + @@trac_db_schema = schema + end + + mattr_reader :trac_directory, :trac_adapter, :trac_db_host, :trac_db_port, :trac_db_name, :trac_db_schema, :trac_db_username, :trac_db_password + + def self.trac_db_path; "#{trac_directory}/db/trac.db" end + def self.trac_attachments_directory; "#{trac_directory}/attachments" end + + def self.target_project_identifier(identifier) + project = Project.find_by_identifier(identifier) + if !project + # create the target project + project = Project.new :name => identifier.humanize, + :description => '' + project.identifier = identifier + puts "Unable to create a project with identifier '#{identifier}'!" unless project.save + # enable issues and wiki for the created project + project.enabled_module_names = ['issue_tracking', 'wiki'] + else + puts + puts "This project already exists in your Redmine database." + print "Are you sure you want to append data to this project ? [Y/n] " + STDOUT.flush + exit if STDIN.gets.match(/^n$/i) + end + project.trackers << TRACKER_BUG unless project.trackers.include?(TRACKER_BUG) + project.trackers << TRACKER_FEATURE unless project.trackers.include?(TRACKER_FEATURE) + @target_project = project.new_record? ? nil : project + @target_project.reload + end + + def self.connection_params + if trac_adapter == 'sqlite3' + {:adapter => 'sqlite3', + :database => trac_db_path} + else + {:adapter => trac_adapter, + :database => trac_db_name, + :host => trac_db_host, + :port => trac_db_port, + :username => trac_db_username, + :password => trac_db_password, + :schema_search_path => trac_db_schema + } + end + end + + def self.establish_connection + constants.each do |const| + klass = const_get(const) + next unless klass.respond_to? 'establish_connection' + klass.establish_connection connection_params + end + end + + def self.encode(text) + text.to_s.force_encoding(@charset).encode('UTF-8') + end + end + + puts + if Redmine::DefaultData::Loader.no_data? + puts "Redmine configuration need to be loaded before importing data." + puts "Please, run this first:" + puts + puts " rake redmine:load_default_data RAILS_ENV=\"#{ENV['RAILS_ENV']}\"" + exit + end + + puts "WARNING: a new project will be added to Redmine during this process." + print "Are you sure you want to continue ? [y/N] " + STDOUT.flush + break unless STDIN.gets.match(/^y$/i) + puts + + def prompt(text, options = {}, &block) + default = options[:default] || '' + while true + print "#{text} [#{default}]: " + STDOUT.flush + value = STDIN.gets.chomp! + value = default if value.blank? + break if yield value + end + end + + DEFAULT_PORTS = {'mysql' => 3306, 'postgresql' => 5432} + + prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory.strip} + prompt('Trac database adapter (sqlite3, mysql2, postgresql)', :default => 'sqlite3') {|adapter| TracMigrate.set_trac_adapter adapter} + unless %w(sqlite3).include?(TracMigrate.trac_adapter) + prompt('Trac database host', :default => 'localhost') {|host| TracMigrate.set_trac_db_host host} + prompt('Trac database port', :default => DEFAULT_PORTS[TracMigrate.trac_adapter]) {|port| TracMigrate.set_trac_db_port port} + prompt('Trac database name') {|name| TracMigrate.set_trac_db_name name} + prompt('Trac database schema', :default => 'public') {|schema| TracMigrate.set_trac_db_schema schema} + prompt('Trac database username') {|username| TracMigrate.set_trac_db_username username} + prompt('Trac database password') {|password| TracMigrate.set_trac_db_password password} + end + prompt('Trac database encoding', :default => 'UTF-8') {|encoding| TracMigrate.encoding encoding} + prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier} + puts + + old_notified_events = Setting.notified_events + old_password_min_length = Setting.password_min_length + begin + # Turn off email notifications temporarily + Setting.notified_events = [] + Setting.password_min_length = 4 + # Run the migration + TracMigrate.migrate + ensure + # Restore previous settings + Setting.notified_events = old_notified_events + Setting.password_min_length = old_password_min_length + end + end +end diff --git a/lib/tasks/permissions.rake b/lib/tasks/permissions.rake new file mode 100644 index 0000000..02ce1b2 --- /dev/null +++ b/lib/tasks/permissions.rake @@ -0,0 +1,9 @@ +namespace :redmine do + desc "List all permissions and the actions registered with them" + task :permissions => :environment do + puts "Permission Name - controller/action pairs" + Redmine::AccessControl.permissions.sort {|a,b| a.name.to_s <=> b.name.to_s }.each do |permission| + puts ":#{permission.name} - #{permission.actions.join(', ')}" + end + end +end diff --git a/lib/tasks/redmine.rake b/lib/tasks/redmine.rake new file mode 100644 index 0000000..fa4b02b --- /dev/null +++ b/lib/tasks/redmine.rake @@ -0,0 +1,194 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +namespace :redmine do + namespace :attachments do + desc 'Removes uploaded files left unattached after one day.' + task :prune => :environment do + Attachment.prune + end + + desc 'Moves attachments stored at the root of the file directory (ie. created before Redmine 2.3) to their subdirectories' + task :move_to_subdirectories => :environment do + Attachment.move_from_root_to_target_directory + end + + desc 'Updates attachment digests to SHA256' + task :update_digests => :environment do + Attachment.update_digests_to_sha256 + end + end + + namespace :tokens do + desc 'Removes expired tokens.' + task :prune => :environment do + Token.destroy_expired + end + end + + namespace :watchers do + desc 'Removes watchers from what they can no longer view.' + task :prune => :environment do + Watcher.prune + end + end + + desc 'Fetch changesets from the repositories' + task :fetch_changesets => :environment do + Repository.fetch_changesets + end + + desc 'Migrates and copies plugins assets.' + task :plugins do + Rake::Task["redmine:plugins:migrate"].invoke + Rake::Task["redmine:plugins:assets"].invoke + end + +desc <<-DESC +FOR EXPERIMENTAL USE ONLY, Moves Redmine data from production database to the development database. +This task should only be used when you need to move data from one DBMS to a different one (eg. MySQL to PostgreSQL). +WARNING: All data in the development database is deleted. +DESC + + task :migrate_dbms => :environment do + ActiveRecord::Base.establish_connection :development + target_tables = ActiveRecord::Base.connection.tables + ActiveRecord::Base.remove_connection + + ActiveRecord::Base.establish_connection :production + tables = ActiveRecord::Base.connection.tables.sort - %w(schema_migrations plugin_schema_info) + + if (tables - target_tables).any? + list = (tables - target_tables).map {|table| "* #{table}"}.join("\n") + abort "The following table(s) are missing from the target database:\n#{list}" + end + + tables.each do |table_name| + Source = Class.new(ActiveRecord::Base) + Target = Class.new(ActiveRecord::Base) + Target.establish_connection(:development) + + [Source, Target].each do |klass| + klass.table_name = table_name + klass.reset_column_information + klass.inheritance_column = "foo" + klass.record_timestamps = false + end + Target.primary_key = (Target.column_names.include?("id") ? "id" : nil) + + source_count = Source.count + puts "Migrating %6d records from #{table_name}..." % source_count + + Target.delete_all + offset = 0 + while (objects = Source.offset(offset).limit(5000).order("1,2").to_a) && objects.any? + offset += objects.size + Target.transaction do + objects.each do |object| + new_object = Target.new(object.attributes) + new_object.id = object.id if Target.primary_key + new_object.save(:validate => false) + end + end + end + Target.connection.reset_pk_sequence!(table_name) if Target.primary_key + target_count = Target.count + abort "Some records were not migrated" unless source_count == target_count + + Object.send(:remove_const, :Target) + Object.send(:remove_const, :Source) + end + end + + namespace :plugins do + desc 'Migrates installed plugins.' + task :migrate => :environment do + name = ENV['NAME'] + version = nil + version_string = ENV['VERSION'] + if version_string + if version_string =~ /^\d+$/ + version = version_string.to_i + if name.nil? + abort "The VERSION argument requires a plugin NAME." + end + else + abort "Invalid VERSION #{version_string} given." + end + end + + begin + Redmine::Plugin.migrate(name, version) + rescue Redmine::PluginNotFound + abort "Plugin #{name} was not found." + end + + Rake::Task["db:schema:dump"].invoke + end + + desc 'Copies plugins assets into the public directory.' + task :assets => :environment do + name = ENV['NAME'] + + begin + Redmine::Plugin.mirror_assets(name) + rescue Redmine::PluginNotFound + abort "Plugin #{name} was not found." + end + end + + desc 'Runs the plugins tests.' + task :test do + Rake::Task["redmine:plugins:test:units"].invoke + Rake::Task["redmine:plugins:test:functionals"].invoke + Rake::Task["redmine:plugins:test:integration"].invoke + end + + namespace :test do + desc 'Runs the plugins unit tests.' + Rake::TestTask.new :units => "db:test:prepare" do |t| + t.libs << "test" + t.verbose = true + t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/unit/**/*_test.rb" + end + + desc 'Runs the plugins functional tests.' + Rake::TestTask.new :functionals => "db:test:prepare" do |t| + t.libs << "test" + t.verbose = true + t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/functional/**/*_test.rb" + end + + desc 'Runs the plugins integration tests.' + Rake::TestTask.new :integration => "db:test:prepare" do |t| + t.libs << "test" + t.verbose = true + t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/integration/**/*_test.rb" + end + + desc 'Runs the plugins ui tests.' + Rake::TestTask.new :ui => "db:test:prepare" do |t| + t.libs << "test" + t.verbose = true + t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/ui/**/*_test.rb" + end + end + end +end + +# Load plugins' rake tasks +Dir[File.join(Rails.root, "plugins/*/lib/tasks/**/*.rake")].sort.each { |ext| load ext } diff --git a/lib/tasks/reminder.rake b/lib/tasks/reminder.rake new file mode 100644 index 0000000..56122ca --- /dev/null +++ b/lib/tasks/reminder.rake @@ -0,0 +1,45 @@ +# Redmine - project management software +# Copyright (C) 2006-2017 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +desc <<-END_DESC +Send reminders about issues due in the next days. + +Available options: + * days => number of days to remind about (defaults to 7) + * tracker => id of tracker (defaults to all trackers) + * project => id or identifier of project (defaults to all projects) + * users => comma separated list of user/group ids who should be reminded + * version => name of target version for filtering issues (defaults to none) + +Example: + rake redmine:send_reminders days=7 users="1,23, 56" RAILS_ENV="production" +END_DESC + +namespace :redmine do + task :send_reminders => :environment do + options = {} + options[:days] = ENV['days'].to_i if ENV['days'] + options[:project] = ENV['project'] if ENV['project'] + options[:tracker] = ENV['tracker'].to_i if ENV['tracker'] + options[:users] = (ENV['users'] || '').split(',').each(&:strip!) + options[:version] = ENV['version'] if ENV['version'] + + Mailer.with_synched_deliveries do + Mailer.reminders(options) + end + end +end diff --git a/lib/tasks/testing.rake b/lib/tasks/testing.rake new file mode 100644 index 0000000..831f4d3 --- /dev/null +++ b/lib/tasks/testing.rake @@ -0,0 +1,112 @@ +namespace :test do + desc 'Measures test coverage' + task :coverage do + rm_f "coverage" + ENV["COVERAGE"] = "1" + Rake::Task["test"].invoke + end + + desc 'Run unit and functional scm tests' + task :scm do + errors = %w(test:scm:units test:scm:functionals).collect do |task| + begin + Rake::Task[task].invoke + nil + rescue => e + task + end + end.compact + abort "Errors running #{errors.to_sentence(:locale => :en)}!" if errors.any? + end + + namespace :scm do + namespace :setup do + desc "Creates directory for test repositories" + task :create_dir => :environment do + FileUtils.mkdir_p Rails.root + '/tmp/test' + end + + supported_scms = [:subversion, :cvs, :bazaar, :mercurial, :git, :darcs, :filesystem] + + desc "Creates a test subversion repository" + task :subversion => :create_dir do + repo_path = "tmp/test/subversion_repository" + unless File.exists?(repo_path) + system "svnadmin create #{repo_path}" + system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}" + end + end + + desc "Creates a test mercurial repository" + task :mercurial => :create_dir do + repo_path = "tmp/test/mercurial_repository" + unless File.exists?(repo_path) + bundle_path = "test/fixtures/repositories/mercurial_repository.hg" + system "hg init #{repo_path}" + system "hg -R #{repo_path} pull #{bundle_path}" + end + end + + def extract_tar_gz(prefix) + unless File.exists?("tmp/test/#{prefix}_repository") + # system "gunzip < test/fixtures/repositories/#{prefix}_repository.tar.gz | tar -xv -C tmp/test" + system "tar -xvz -C tmp/test -f test/fixtures/repositories/#{prefix}_repository.tar.gz" + end + end + + (supported_scms - [:subversion, :mercurial]).each do |scm| + desc "Creates a test #{scm} repository" + task scm => :create_dir do + extract_tar_gz(scm) + end + end + + desc "Creates all test repositories" + task :all => supported_scms + end + + desc "Updates installed test repositories" + task :update => :environment do + require 'fileutils' + Dir.glob("tmp/test/*_repository").each do |dir| + next unless File.basename(dir) =~ %r{^(.+)_repository$} && File.directory?(dir) + scm = $1 + next unless fixture = Dir.glob("test/fixtures/repositories/#{scm}_repository.*").first + next if File.stat(dir).ctime > File.stat(fixture).mtime + + FileUtils.rm_rf dir + Rake::Task["test:scm:setup:#{scm}"].execute + end + end + + Rake::TestTask.new(:units => "db:test:prepare") do |t| + t.libs << "test" + t.verbose = true + t.warning = false + t.test_files = FileList['test/unit/repository*_test.rb'] + FileList['test/unit/lib/redmine/scm/**/*_test.rb'] + end + Rake::Task['test:scm:units'].comment = "Run the scm unit tests" + + Rake::TestTask.new(:functionals => "db:test:prepare") do |t| + t.libs << "test" + t.verbose = true + t.warning = false + t.test_files = FileList['test/functional/repositories*_test.rb'] + end + Rake::Task['test:scm:functionals'].comment = "Run the scm functional tests" + end + + Rake::TestTask.new(:routing) do |t| + t.libs << "test" + t.verbose = true + t.test_files = FileList['test/integration/routing/*_test.rb'] + FileList['test/integration/api_test/*_routing_test.rb'] + end + Rake::Task['test:routing'].comment = "Run the routing tests" + + Rake::TestTask.new(:ui => "db:test:prepare") do |t| + t.libs << "test" + t.verbose = true + t.test_files = FileList['test/ui/**/*_test_ui.rb'] + end + Rake::Task['test:ui'].comment = "Run the UI tests with Capybara (PhantomJS listening on port 4444 is required)" +end diff --git a/lib/tasks/yardoc.rake b/lib/tasks/yardoc.rake new file mode 100644 index 0000000..eab0d86 --- /dev/null +++ b/lib/tasks/yardoc.rake @@ -0,0 +1,21 @@ +begin + require 'yard' + + YARD::Rake::YardocTask.new do |t| + files = ['app/**/*.rb'] + files << Dir['lib/**/*.rb', 'plugins/**/*.rb'].reject {|f| f.match(/test/) } + t.files = files + + static_files = ['doc/CHANGELOG', + 'doc/COPYING', + 'doc/INSTALL', + 'doc/RUNNING_TESTS', + 'doc/UPGRADING'].join(',') + + t.options += ['--output-dir', './doc/app', '--files', static_files] + end + +rescue LoadError + # yard not installed (gem install yard) + # http://yardoc.org +end diff --git a/log/delete.me b/log/delete.me new file mode 100644 index 0000000..310d508 --- /dev/null +++ b/log/delete.me @@ -0,0 +1 @@ +default directory for log files diff --git a/plugins/README b/plugins/README new file mode 100644 index 0000000..edef256 --- /dev/null +++ b/plugins/README @@ -0,0 +1 @@ +Put your Redmine plugins here. diff --git a/plugins/additionals/.github/workflows/linters.yml b/plugins/additionals/.github/workflows/linters.yml deleted file mode 100644 index 265dab6..0000000 --- a/plugins/additionals/.github/workflows/linters.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Run Linters -on: - push: - pull_request: - schedule: - - cron: '30 5 * * *' - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - bundler-cache: true - - - name: Set Gemfile - run: | - echo "">> Gemfile - echo "group :test do">> Gemfile - echo " gem 'pandoc-ruby', require: false" >> Gemfile - echo " gem 'rubocop', require: false" >> Gemfile - echo " gem 'rubocop-performance', require: false" >> Gemfile - echo " gem 'rubocop-rails', require: false" >> Gemfile - echo " gem 'slim_lint', require: false" >> Gemfile - echo "end">> Gemfile - - - name: Setup gems - run: | - bundle install --jobs 4 --retry 3 - - - name: Run RuboCop - run: | - bundle exec rubocop -S - - - name: Run Slim-Lint - run: | - bundle exec slim-lint app/views - if: always() - - - name: Run Brakeman - run: | - bundle exec brakeman -5 diff --git a/plugins/additionals/.github/workflows/tests.yml b/plugins/additionals/.github/workflows/tests.yml deleted file mode 100644 index a24e8a5..0000000 --- a/plugins/additionals/.github/workflows/tests.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: Tests -on: - push: - pull_request: - schedule: - - cron: '0 5 * * *' - -jobs: - test: - name: ${{ matrix.redmine }} ${{ matrix.db }} ruby-${{ matrix.ruby }} - runs-on: ubuntu-latest - - strategy: - matrix: - ruby: ['2.6', '2.4'] - redmine: ['4.1-stable', 'master'] - db: ['postgres', 'mysql'] - fail-fast: false - - services: - postgres: - image: postgres:13 - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - ports: - - 5432:5432 - - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: 'BestPasswordEver' - ports: - # will assign a random free host port - - 3306/tcp - options: >- - --health-cmd="mysqladmin ping" - --health-interval=10s - --health-timeout=5s - --health-retries=3 - - steps: - - name: Verify MySQL connection from host - run: | - mysql --host 127.0.0.1 --port ${{ job.services.mysql.ports[3306] }} -uroot -pBestPasswordEver -e "SHOW DATABASES" - if: matrix.db == 'mysql' - - - name: Checkout Redmine - uses: actions/checkout@v2 - with: - repository: redmine/redmine - ref: ${{ matrix.redmine }} - path: redmine - - - name: Checkout additionals - uses: actions/checkout@v2 - with: - repository: AlphaNodes/additionals - path: redmine/plugins/additionals - - - name: Update package archives - run: sudo apt-get update --yes --quiet - - - name: Install package dependencies - run: > - sudo apt-get install --yes --quiet - build-essential - cmake - libicu-dev - libpq-dev - libmysqlclient-dev - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby }} - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - - - name: Prepare Redmine source - working-directory: redmine - run: | - sed -i '/rubocop/d' Gemfile - rm -f .rubocop* - cp plugins/additionals/test/support/database-${{ matrix.db }}.yml config/database.yml - cp plugins/additionals/test/support/configuration.yml config/configuration.yml - - - name: Install Ruby dependencies - working-directory: redmine - run: | - bundle install --jobs=4 --retry=3 --without development - - - name: Run Redmine rake tasks - env: - RAILS_ENV: test - MYSQL_PORT: ${{ job.services.mysql.ports[3306] }} - working-directory: redmine - run: | - bundle exec rake generate_secret_token - bundle exec rake db:create db:migrate redmine:plugins:migrate - bundle exec rake db:test:prepare - - - name: Run tests - env: - RAILS_ENV: test - MYSQL_PORT: ${{ job.services.mysql.ports[3306] }} - working-directory: redmine - run: bundle exec rake redmine:plugins:test NAME=additionals RUBYOPT="-W0" - - - name: Run uninstall test - env: - RAILS_ENV: test - MYSQL_PORT: ${{ job.services.mysql.ports[3306] }} - working-directory: redmine - run: bundle exec rake redmine:plugins:migrate NAME=additionals VERSION=0 - - - name: Run build gem file - working-directory: redmine/plugins/additionals - run: gem build additionals.gemspec diff --git a/plugins/additionals/.gitignore b/plugins/additionals/.gitignore index 2469bbe..a889413 100755 --- a/plugins/additionals/.gitignore +++ b/plugins/additionals/.gitignore @@ -1,11 +1,8 @@ .DS_Store .buildpath -*.gem coverage/ tmp/ -Gemfile.lock .project -.vscode .settings/ docs/_build docs/_static diff --git a/plugins/additionals/.rubocop.yml b/plugins/additionals/.rubocop.yml index 5282b1c..7fcb391 100755 --- a/plugins/additionals/.rubocop.yml +++ b/plugins/additionals/.rubocop.yml @@ -1,28 +1,23 @@ -require: - - rubocop-performance - - rubocop-rails - Rails: Enabled: true AllCops: - TargetRubyVersion: 2.4 + TargetRubyVersion: 2.2 TargetRailsVersion: 5.2 - NewCops: enable Metrics/AbcSize: - Enabled: false + Max: 65 Metrics/BlockLength: - Enabled: false + Max: 60 Metrics/ClassLength: Enabled: false Metrics/CyclomaticComplexity: - Max: 25 + Max: 20 -Layout/LineLength: +Metrics/LineLength: Max: 140 Metrics/MethodLength: @@ -34,48 +29,21 @@ Metrics/ModuleLength: Metrics/PerceivedComplexity: Max: 25 -Rails/ApplicationJob: - Enabled: false - -Rails/ApplicationRecord: +Rails/SkipsModelValidations: Enabled: false Rails/CreateTableWithTimestamps: Enabled: false -Rails/HelperInstanceVariable: +# app/model/application_record.rb is missing in redmine, we can't use ApplicationRecord +Rails/ApplicationRecord: Enabled: false -Rails/SkipsModelValidations: - Enabled: false - -Performance/ChainArrayAllocation: - Enabled: true - Style/AutoResourceCleanup: Enabled: true -Style/FrozenStringLiteralComment: - Enabled: false - Style/Documentation: Enabled: false -# required for travis/ci (symbolic links problem) Style/ExpandPathArguments: Enabled: false - -Style/HashTransformKeys: - Enabled: false - -Style/HashTransformValues: - Enabled: false - -Naming/VariableNumber: - Enabled: true - Exclude: - - 'test/**/*' - -Style/StringConcatenation: - Exclude: - - 'app/views/additionals/_select2_ajax_call.*' diff --git a/plugins/additionals/.slim-lint.yml b/plugins/additionals/.slim-lint.yml index 6579ae1..aea15c3 100755 --- a/plugins/additionals/.slim-lint.yml +++ b/plugins/additionals/.slim-lint.yml @@ -3,11 +3,16 @@ linters: max: 140 RuboCop: ignored_cops: - - Layout/ArgumentAlignment + - Layout/AlignArray + - Layout/AlignHash + - Layout/AlignParameters - Layout/BlockEndNewline - Layout/EmptyLineAfterGuardClause - - Layout/HashAlignment + - Layout/FirstParameterIndentation + - Layout/IndentArray + - Layout/IndentationConsistency - Layout/IndentationWidth + - Layout/IndentHash - Layout/MultilineArrayBraceLayout - Layout/MultilineAssignmentLayout - Layout/MultilineBlockLayout @@ -16,11 +21,18 @@ linters: - Layout/MultilineMethodCallIndentation - Layout/MultilineMethodDefinitionBraceLayout - Layout/MultilineOperationIndentation - - Layout/SpaceBeforeBrackets - - Layout/TrailingEmptyLines + - Layout/TrailingBlankLines + - Layout/TrailingWhitespace + - Lint/BlockAlignment + - Lint/EndAlignment - Lint/Void + - Metrics/BlockLength - Metrics/BlockNesting + - Metrics/LineLength + - Naming/FileName - Rails/OutputSafety + - Style/ConditionalAssignment + - Style/FrozenStringLiteralComment - Style/IdenticalConditionalBranches - Style/IfUnlessModifier - Style/Next diff --git a/plugins/additionals/.travis.yml b/plugins/additionals/.travis.yml new file mode 100755 index 0000000..7c7aa27 --- /dev/null +++ b/plugins/additionals/.travis.yml @@ -0,0 +1,49 @@ +language: ruby + +rvm: + - 2.5.3 + - 2.4.5 + - 2.3.8 + +env: + - REDMINE_VER=4.0-stable DB=postgresql + - REDMINE_VER=3.4-stable DB=postgresql + - REDMINE_VER=4.0-stable DB=mysql + - REDMINE_VER=3.4-stable DB=mysql + +sudo: true + +addons: + postgresql: "9.6" + apt: + sources: + - mysql-5.7-trusty + packages: + - mysql-server + - mysql-client + +before_install: + - export PLUGIN_NAME=additionals + - export REDMINE_GIT_REPO=git://github.com/redmine/redmine.git + - export REDMINE_PATH=$HOME/redmine + - export BUNDLE_GEMFILE=$REDMINE_PATH/Gemfile + - export RAILS_ENV=test + - git clone $REDMINE_GIT_REPO $REDMINE_PATH + - cd $REDMINE_PATH + - if [[ "$REDMINE_VER" != "master" ]]; then git checkout -b $REDMINE_VER origin/$REDMINE_VER; fi + - ln -s $TRAVIS_BUILD_DIR $REDMINE_PATH/plugins/$PLUGIN_NAME + - cp $TRAVIS_BUILD_DIR/test/support/additional_environment.rb $REDMINE_PATH/config/ + - cp $TRAVIS_BUILD_DIR/test/support/database-$DB-travis.yml $REDMINE_PATH/config/database.yml + +before_script: + - if [[ "$DB" == "mysql" ]]; then mysql -e "use mysql; update user set authentication_string=PASSWORD('travis_ci_test') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;"; fi + - if [[ "$DB" == "mysql" ]]; then mysql_upgrade -ptravis_ci_test; fi + - if [[ "$DB" == "mysql" ]]; then service mysql restart; fi + - bundle exec rake db:create db:migrate redmine:plugins:migrate + +script: + - export SKIP_COVERAGE=1 + - if [[ "$REDMINE_VER" == "master" ]]; then bundle exec rake redmine:plugins:test:units NAME=$PLUGIN_NAME; fi + - if [[ "$REDMINE_VER" == "master" ]]; then bundle exec rake redmine:plugins:test:functionals NAME=$PLUGIN_NAME; fi + - if [[ "$REDMINE_VER" == "master" ]]; then bundle exec rake redmine:plugins:test:integration NAME=$PLUGIN_NAME; fi + - if [[ "$REDMINE_VER" != "master" ]]; then bundle exec rake redmine:plugins:test NAME=$PLUGIN_NAME RUBYOPT="-W0"; fi diff --git a/plugins/additionals/CHANGELOG.rst b/plugins/additionals/CHANGELOG.rst index ff3b968..d1fe28c 100755 --- a/plugins/additionals/CHANGELOG.rst +++ b/plugins/additionals/CHANGELOG.rst @@ -1,101 +1,6 @@ Changelog ========= -3.0.2 -+++++ - -- d3plus to v2.0.0-alpha.30 support -- Mermaid 8.9.1 support -- Bug fix for select2 loading without named field -- FontAwesome 5.15.2 support -- D3 6.6.0 support -- Fix news limit for welcome dashboard block -- Frensh translation updated, thanks to Brice BEAUMESNIL! -- clipboard.js updated to v2.0.8 -- -3.0.1 -+++++ - -- Do not show "Assign to me" if assigned_to is disabled for tracker -- FontAwesome 5.15.1 support -- D3 6.3.1 support -- Mermaid 8.8.4 support -- add current_user as special login name for user macro (which shows current login user) -- add text parameter to user macro (which disable link to user) -- add asynchronous text block -- gemify plugin to use it with Gemfile.local or other plugins -- remove spam protection functionality -- Chart.js 2.9.4 support -- Allow overwrite mermaid theme and variables - -3.0.0 -+++++ - -- Introduce dashboards -- Redmine 4.1 or newer is required -- FontAwesome 5.14.0 support -- D3 6.1.1 support -- Mermaid 8.8.0 support -- d3plus to v2.0.0-alpha.29 support -- drop wiki header and footer settings - -2.0.24 -++++++ - -- FontAwesome 5.13.0 support -- Mermaid 8.4.8 support -- clipboard.js updated to v2.0.6 -- fix for spam protection with invisible_captcha -- D3 5.16.0 support -- Ruby 2.4 is required - -2.0.23 -++++++ - -- members macro now supports with_sum option -- FontAwesome 5.12 support -- FontAwesome ajax search has been added -- Mermaid 8.4.6 support -- D3 5.15.0 support -- Drop nvd3 library -- Drop Chartjs stacked100 library -- Drop d3plus-hierarchy library -- Drop calendar macro -- Support private comments with issue macro -- Google Docs macro has been added -- Fix bug with Rack 2.0.8 or newer -- Drop Redmine 3.4 support -- Add Redmine 4.1 support -- Use view_layouts_base_body_top hook, which is available since Redmine 3.4 -- Refactoring new hooks (without template) -- asciinema.org macro has been added - thanks to @kotashiratsuka -- Select2 4.0.13 support - -2.0.22 -++++++ - -- FontAwesome 5.11.2 support -- Mermaid 8.4.2 support -- Select2 4.0.12 support -- Chart.js 2.9.3 support -- Chart.js Plugin datalabels 0.7.0 support -- d3plus to v2.0.0-alpha.25 -- Fix user visibility for members macro -- Fix user visibility for issue reports -- Drop ZeroClipboard library - -2.0.21 -++++++ - -- fix mail notification if issue author changed -- fix permission bug for closed issues with freezed mode -- Ruby 2.2.x support has been dropped. Use 2.3.x or newer ruby verion -- FontAwesome 5.9.0 support -- remove issue_close_with_open_children functionality, because this is included in Redmine 3.4.x #47 (thanks to @pva) -- add hierarchy support for projects macro #45 -- select2 support -- bootstrap-datepicker 1.9.0 support - 2.0.20 ++++++ diff --git a/plugins/additionals/Gemfile b/plugins/additionals/Gemfile index 96be6e8..a1f9a7f 100755 --- a/plugins/additionals/Gemfile +++ b/plugins/additionals/Gemfile @@ -1,4 +1,16 @@ -source 'https://rubygems.org' +gem 'deface', '>= 1.1.0' +gem 'gemoji', '~> 3.0.0' +gem 'invisible_captcha' +gem 'slim-rails' -# Specify your gem's dependencies in additionals.gemspec -gemspec +group :test do + gem 'brakeman', require: false + gem 'rubocop', require: false + gem 'slim_lint', require: false +end + +#group :development do +# gem 'awesome_print', require: 'ap' # https://github.com/awesome-print/awesome_print +# gem 'better_errors' # https://github.com/BetterErrors/better_errors +# gem 'binding_of_caller' # better output of with variables for better_errors +#end diff --git a/plugins/additionals/Rakefile b/plugins/additionals/Rakefile deleted file mode 100644 index 39a5d23..0000000 --- a/plugins/additionals/Rakefile +++ /dev/null @@ -1,11 +0,0 @@ -require 'bundler/gem_tasks' -require 'rake/testtask' - -Rake::TestTask.new do |t| - t.libs << 'test' - files = FileList['test/**/*test.rb'] - t.test_files = files - t.verbose = true -end - -task default: :test diff --git a/plugins/additionals/additionals.gemspec b/plugins/additionals/additionals.gemspec deleted file mode 100644 index 9c5d6ca..0000000 --- a/plugins/additionals/additionals.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -lib = File.expand_path '../lib', __FILE__ -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'additionals/version' - -Gem::Specification.new do |spec| - spec.name = 'additionals' - spec.version = Additionals::VERSION - spec.authors = ['AlphaNodes'] - spec.email = ['alex@alphanodes.com'] - - spec.summary = 'Redmine plugin for adding dashboard functionality, wiki macros and libraries for other Redmine plugins' - spec.description = 'Redmine plugin for adding dashboard functionality, wiki macros and libraries for other Redmine plugins' - spec.homepage = 'https://github.com/alphanodes/alphanodes' - spec.license = 'GPL-2.0' - - spec.files = Dir['**/*'] - Dir['test/**/*'] - Dir['Gemfile', 'Gemfile.lock', 'README.rst'] - spec.require_paths = ['lib'] - spec.required_ruby_version = '>= 2.4' - - spec.add_runtime_dependency 'deface', '1.5.3' - spec.add_runtime_dependency 'gemoji', '~> 3.0.0' - spec.add_runtime_dependency 'render_async' - spec.add_runtime_dependency 'rss' - spec.add_runtime_dependency 'slim-rails' - - spec.add_development_dependency 'brakeman' - spec.add_development_dependency 'bundler' - spec.add_development_dependency 'rake' - spec.add_development_dependency 'slim_lint' -end diff --git a/plugins/additionals/app/controllers/additionals_assign_to_me_controller.rb b/plugins/additionals/app/controllers/additionals_assign_to_me_controller.rb index 5569f64..f6ffb33 100755 --- a/plugins/additionals/app/controllers/additionals_assign_to_me_controller.rb +++ b/plugins/additionals/app/controllers/additionals_assign_to_me_controller.rb @@ -23,7 +23,7 @@ class AdditionalsAssignToMeController < ApplicationController return redirect_to(issue_path(@issue)) if last_journal.nil? last_journal = @issue.journals.visible.order(:created_on).last - redirect_to "#{issue_path @issue}#change-#{last_journal.id}" + redirect_to "#{issue_path(@issue)}#change-#{last_journal.id}" end private diff --git a/plugins/additionals/app/controllers/additionals_change_status_controller.rb b/plugins/additionals/app/controllers/additionals_change_status_controller.rb index f82c420..0e1404e 100755 --- a/plugins/additionals/app/controllers/additionals_change_status_controller.rb +++ b/plugins/additionals/app/controllers/additionals_change_status_controller.rb @@ -13,7 +13,7 @@ class AdditionalsChangeStatusController < ApplicationController return end - @issue.init_journal User.current + @issue.init_journal(User.current) @issue.status_id = new_status_id @issue.assigned_to = User.current if @issue.status_x_affected?(new_status_id) && issue_old_user != User.current @@ -27,7 +27,7 @@ class AdditionalsChangeStatusController < ApplicationController return redirect_to(issue_path(@issue)) if last_journal.nil? last_journal = @issue.journals.visible.order(:created_on).last - redirect_to "#{issue_path @issue}#change-#{last_journal.id}" + redirect_to "#{issue_path(@issue)}#change-#{last_journal.id}" end private diff --git a/plugins/additionals/app/controllers/dashboard_async_blocks_controller.rb b/plugins/additionals/app/controllers/dashboard_async_blocks_controller.rb deleted file mode 100644 index fb98457..0000000 --- a/plugins/additionals/app/controllers/dashboard_async_blocks_controller.rb +++ /dev/null @@ -1,101 +0,0 @@ -require 'open-uri' - -class DashboardAsyncBlocksController < ApplicationController - before_action :find_dashboard - before_action :find_block - - helper :additionals_routes - helper :additionals_queries - helper :queries - helper :issues - helper :activities - helper :dashboards - - include DashboardsHelper - - # support for redmine_contacts_helpdesk plugin - if Redmine::Plugin.installed? 'redmine_contacts_helpdesk' - include HelpdeskHelper - helper :helpdesk - end - - rescue_from Query::StatementInvalid, with: :query_statement_invalid - rescue_from StandardError, with: :dashboard_with_invalid_block - - def show - @settings[:sort] = params[:sort] if params[:sort].present? - partial_locals = build_dashboard_partial_locals @block, @block_definition, @settings, @dashboard - - respond_to do |format| - format.js do - render partial: partial_locals[:async][:partial], - content_type: 'text/html', - locals: partial_locals - end - end - end - - # abuse create for query list sort order support - def create - return render_403 if params[:sort].blank? - - partial_locals = build_dashboard_partial_locals @block, @block_definition, @settings, @dashboard - partial_locals[:sort_options] = { sort: params[:sort] } - - respond_to do |format| - format.js do - render partial: 'update_order_by', - locals: partial_locals - end - end - end - - private - - def find_dashboard - @dashboard = Dashboard.find params[:dashboard_id] - raise ::Unauthorized unless @dashboard.visible? - - if @dashboard.dashboard_type == DashboardContentProject::TYPE_NAME && @dashboard.project.nil? - @dashboard.content_project = find_project_by_project_id - else - @project = @dashboard.project - deny_access if @project.present? && !User.current.allowed_to?(:view_project, @project) - end - - @can_edit = @dashboard&.editable? - rescue ActiveRecord::RecordNotFound - render_404 - end - - def find_block - @block = params['block'] - @block_definition = @dashboard.content.find_block @block - - render_404 if @block.blank? - render_403 if @block_definition.blank? - - @settings = @dashboard.layout_settings @block - end - - def find_project_by_project_id - begin - @project = Project.find params[:project_id] - rescue ActiveRecord::RecordNotFound - render_404 - end - deny_access unless User.current.allowed_to?(:view_project, @project) - - @project - end - - def dashboard_with_invalid_block(exception) - logger&.error "Invalid dashboard block for #{@block}: #{exception.message}" - respond_to do |format| - format.html do - render template: 'dashboards/block_error', layout: false - end - format.any { head @status } - end - end -end diff --git a/plugins/additionals/app/controllers/dashboards_controller.rb b/plugins/additionals/app/controllers/dashboards_controller.rb deleted file mode 100644 index cef7616..0000000 --- a/plugins/additionals/app/controllers/dashboards_controller.rb +++ /dev/null @@ -1,216 +0,0 @@ -class DashboardsController < ApplicationController - menu_item :dashboards - - before_action :find_dashboard, except: %i[index new create] - before_action :find_optional_project, only: %i[new create index] - - accept_rss_auth :index, :show - accept_api_auth :index, :show, :create, :update, :destroy - - rescue_from Query::StatementInvalid, with: :query_statement_invalid - - helper :queries - helper :issues - helper :activities - helper :watchers - helper :additionals_routes - helper :dashboards - helper :additionals_issues - helper :additionals_queries - - include AdditionalsRoutesHelper - include AdditionalsQueriesHelper - include QueriesHelper - include WatchersHelper - include SortHelper - - def index - case params[:format] - when 'xml', 'json' - @offset, @limit = api_offset_and_limit - else - @limit = per_page_option - end - - scope = Dashboard.visible - @query_count = scope.count - @query_pages = Paginator.new @query_count, @limit, params['page'] - @dashboards = scope.sorted - .limit(@limit) - .offset(@offset) - .to_a - - respond_to do |format| - format.html { render_error status: 406 } - format.api - end - end - - def show - respond_to do |format| - format.html { head 406 } - format.js if request.xhr? - format.api - end - end - - def new - @dashboard = Dashboard.new(project: @project, - author: User.current) - @dashboard.dashboard_type = assign_dashboard_type - @allowed_projects = @dashboard.allowed_target_projects - end - - def create - @dashboard = Dashboard.new(author: User.current) - @dashboard.safe_attributes = params[:dashboard] - @dashboard.dashboard_type = assign_dashboard_type - @dashboard.role_ids = params[:dashboard][:role_ids] if params[:dashboard].present? - - @allowed_projects = @dashboard.allowed_target_projects - - if @dashboard.save - flash[:notice] = l(:notice_successful_create) - - respond_to do |format| - format.html { redirect_to dashboard_link_path(@project, @dashboard) } - format.api { render action: 'show', status: :created, location: dashboard_url(@dashboard, project_id: @project) } - end - else - respond_to do |format| - format.html { render action: 'new' } - format.api { render_validation_errors(@dashboard) } - end - end - end - - def edit - return render_403 unless @dashboard.editable_by?(User.current) - - @allowed_projects = @dashboard.allowed_target_projects - - respond_to do |format| - format.html - format.api - end - end - - def update - return render_403 unless @dashboard.editable_by?(User.current) - - @dashboard.safe_attributes = params[:dashboard] - @dashboard.role_ids = params[:dashboard][:role_ids] if params[:dashboard].present? - - @project = @dashboard.project if @project && @dashboard.project_id.present? && @dashboard.project != @project - @allowed_projects = @dashboard.allowed_target_projects - - if @dashboard.save - flash[:notice] = l(:notice_successful_update) - respond_to do |format| - format.html { redirect_to dashboard_link_path @project, @dashboard } - format.api { head :ok } - end - else - respond_to do |format| - format.html { render action: 'edit' } - format.api { render_validation_errors @dashboard } - end - end - end - - def destroy - return render_403 unless @dashboard.destroyable_by? User.current - - begin - @dashboard.destroy - flash[:notice] = l(:notice_successful_delete) - respond_to do |format| - format.html { redirect_to @project.nil? ? home_path : project_path(@project) } - format.api { head :ok } - end - rescue ActiveRecord::RecordNotDestroyed - flash[:error] = l(:error_remove_db_entry) - redirect_to dashboard_path(@dashboard) - end - end - - def query_statement_invalid(exception) - logger&.error "Query::StatementInvalid: #{exception.message}" - session.delete(additionals_query_session_key('dashboard')) - render_error l(:error_query_statement_invalid) - end - - def update_layout_setting - block_settings = params[:settings] || {} - - block_settings.each do |block, settings| - @dashboard.update_block_settings(block, settings.to_unsafe_hash) - end - @dashboard.save - @updated_blocks = block_settings.keys - end - - # The block is added on top of the page - # params[:block] : id of the block to add - def add_block - @block = params[:block] - if @dashboard.add_block @block - @dashboard.save - respond_to do |format| - format.html { redirect_to dashboard_link_path(@project, @dashboard) } - format.js - end - else - render_error status: 422 - end - end - - # params[:block] : id of the block to remove - def remove_block - @block = params[:block] - @dashboard.remove_block @block - @dashboard.save - respond_to do |format| - format.html { redirect_to dashboard_link_path(@project, @dashboard) } - format.js - end - end - - # Change blocks order - # params[:group] : group to order (top, left or right) - # params[:blocks] : array of block ids of the group - def order_blocks - @dashboard.order_blocks params[:group], params[:blocks] - @dashboard.save - head 200 - end - - private - - def assign_dashboard_type - if params['dashboard_type'].present? - params['dashboard_type'] - elsif params['dashboard'].present? && params['dashboard']['dashboard_type'].present? - params['dashboard']['dashboard_type'] - elsif @project.nil? - DashboardContentWelcome::TYPE_NAME - else - DashboardContentProject::TYPE_NAME - end - end - - def find_dashboard - @dashboard = Dashboard.find(params[:id]) - raise ::Unauthorized unless @dashboard.visible? - - if @dashboard.dashboard_type == DashboardContentProject::TYPE_NAME && @dashboard.project.nil? - @dashboard.content_project = find_project_by_project_id - else - @project = @dashboard.project - end - - @can_edit = @dashboard&.editable? - rescue ActiveRecord::RecordNotFound - render_404 - end -end diff --git a/plugins/additionals/app/helpers/additionals_chartjs_helper.rb b/plugins/additionals/app/helpers/additionals_chartjs_helper.rb deleted file mode 100644 index bb3f41b..0000000 --- a/plugins/additionals/app/helpers/additionals_chartjs_helper.rb +++ /dev/null @@ -1,12 +0,0 @@ -module AdditionalsChartjsHelper - def chartjs_colorschemes_info_url - link_to(l(:label_chartjs_colorscheme_info), - 'https://nagix.github.io/chartjs-plugin-colorschemes/colorchart.html', - class: 'external') - end - - def select_options_for_chartjs_colorscheme(selected) - data = YAML.safe_load(ERB.new(IO.read(File.join(Additionals.plugin_dir, 'config', 'colorschemes.yml'))).result) || {} - grouped_options_for_select(data, selected) - end -end diff --git a/plugins/additionals/app/helpers/additionals_clipboardjs_helper.rb b/plugins/additionals/app/helpers/additionals_clipboardjs_helper.rb deleted file mode 100644 index b49cc1d..0000000 --- a/plugins/additionals/app/helpers/additionals_clipboardjs_helper.rb +++ /dev/null @@ -1,39 +0,0 @@ -module AdditionalsClipboardjsHelper - def clipboardjs_button_for(target, clipboard_text_from_button = nil) - render_clipboardjs_button(target, clipboard_text_from_button) + render_clipboardjs_javascript(target) - end - - def render_text_with_clipboardjs(text) - return if text.blank? - - tag.acronym text, - class: 'clipboard-text', - title: l(:label_copy_to_clipboard), - data: clipboardjs_data(text: text) - end - - def clipboardjs_data(clipboard_data) - data = { 'label-copied' => l(:label_copied_to_clipboard), - 'label-to-copy' => l(:label_copy_to_clipboard) } - - clipboard_data.each do |key, value| - data["clipboard-#{key}"] = value if value.present? - end - - data - end - - private - - def render_clipboardjs_button(target, clipboard_text_from_button) - tag.button id: "zc_#{target}", - class: 'clipboard-button far fa-copy', - type: 'button', - title: l(:label_copy_to_clipboard), - data: clipboardjs_data(target: "##{target}", text: clipboard_text_from_button) - end - - def render_clipboardjs_javascript(target) - javascript_tag("setClipboardJS('#zc_#{target}');") - end -end diff --git a/plugins/additionals/app/helpers/additionals_custom_fields_helper.rb b/plugins/additionals/app/helpers/additionals_custom_fields_helper.rb deleted file mode 100644 index d554b9d..0000000 --- a/plugins/additionals/app/helpers/additionals_custom_fields_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -module AdditionalsCustomFieldsHelper - def custom_fields_with_full_with_layout - ['IssueCustomField'] - end -end diff --git a/plugins/additionals/app/helpers/additionals_fontawesome_helper.rb b/plugins/additionals/app/helpers/additionals_fontawesome_helper.rb index fe03edd..39dc0e5 100755 --- a/plugins/additionals/app/helpers/additionals_fontawesome_helper.rb +++ b/plugins/additionals/app/helpers/additionals_fontawesome_helper.rb @@ -1,4 +1,11 @@ module AdditionalsFontawesomeHelper + def fontawesome_info_url + s = [] + s << l(:label_set_icon_from) + s << link_to('https://fontawesome.com/icons?m=free', 'https://fontawesome.com/icons?m=free', class: 'external') + safe_join(s, ' ') + end + # name = TYPE-FA_NAME, eg. fas_car # fas_cloud-upload-alt # far_id-card @@ -8,13 +15,13 @@ module AdditionalsFontawesomeHelper # post_text # title def font_awesome_icon(name, options = {}) - info = AdditionalsFontAwesome.value_info name + info = AdditionalsFontAwesome.value_info(name) return '' if info.blank? post_text = '' - options[:'aria-hidden'] = 'true' + options['aria-hidden'] = 'true' options[:class] = if options[:class].present? - "#{info[:classes]} #{options[:class]}" + info[:classes] + ' ' + options[:class] else info[:classes] end @@ -23,68 +30,17 @@ module AdditionalsFontawesomeHelper if options[:pre_text].present? s << options[:pre_text] s << ' ' - options.delete :pre_text + options.delete(:pre_text) end if options[:post_text].present? post_text = options[:post_text] - options.delete :post_text + options.delete(:post_text) end - s << tag.span(options) + s << content_tag('span', '', options) if post_text.present? s << ' ' s << post_text end - safe_join s - end - - def additionals_fontawesome_select(form, selected, options = {}) - options[:include_blank] ||= true unless options[:required] - html_options = {} - - additionals_fontawesome_add_selected selected - - name, options = Additionals.hash_remove_with_default(:name, options, :icon) - loader, options = Additionals.hash_remove_with_default(:loader, options, true) - html_options[:class], options = Additionals.hash_remove_with_default(:class, options, 'select2-fontawesome-field') - html_options[:style], options = Additionals.hash_remove_with_default(:style, options) - - s = [] - s << form.select(name, - options_for_select(AdditionalsFontAwesome.active_option_for_select(selected), selected), - options, - html_options) - - s << additionals_fontawesome_loader(options, html_options) if loader - - safe_join s - end - - def additionals_fontawesome_add_selected(selected) - @selected_store ||= [] - return if selected.blank? - - @selected_store << selected - end - - def additionals_fontawesome_default_select_width - '250px' - end - - def additionals_fontawesome_loader(options, html_options = {}) - html_options[:class] ||= 'select2-fontawesome-field' - options[:template_selection] = 'formatFontawesomeText' - options[:template_result] = 'formatFontawesomeText' - if options[:include_blank] - options[:placeholder] ||= l(:label_disabled) - options[:allow_clear] ||= true - end - options[:width] = additionals_fontawesome_default_select_width - - render(layout: false, - partial: 'additionals/select2_ajax_call.js', - formats: [:js], - locals: { field_class: html_options[:class], - ajax_url: fontawesome_auto_completes_path(selected: @selected_store.join(',')), - options: options }) + safe_join(s) end end diff --git a/plugins/additionals/app/helpers/additionals_issues_helper.rb b/plugins/additionals/app/helpers/additionals_issues_helper.rb index e184394..f0b0962 100755 --- a/plugins/additionals/app/helpers/additionals_issues_helper.rb +++ b/plugins/additionals/app/helpers/additionals_issues_helper.rb @@ -1,29 +1,18 @@ module AdditionalsIssuesHelper - def author_options_for_select(project, entity = nil, permission = nil) - scope = project.present? ? project.users.visible : User.active.visible - scope = scope.with_permission(permission, project) unless permission.nil? - authors = scope.sorted.to_a - - unless entity.nil? - current_author_found = authors.detect { |u| u.id == entity.author_id_was } - if current_author_found.blank? - current_author = User.find_by id: entity.author_id_was - authors << current_author if current_author - end - end - + def issue_author_options_for_select(project, issue = nil) + authors = project.users.sorted s = [] return s unless authors.any? - s << tag.option("<< #{l :label_me} >>", value: User.current.id) if authors.include?(User.current) + s << content_tag('option', "<< #{l(:label_me)} >>", value: User.current.id) if authors.include?(User.current) - if entity.nil? + if issue.nil? s << options_from_collection_for_select(authors, 'id', 'name') else - s << tag.option(entity.author, value: entity.author_id, selected: true) if entity.author && authors.exclude?(entity.author) - s << options_from_collection_for_select(authors, 'id', 'name', entity.author_id) + s << content_tag('option', issue.author, value: issue.author_id, selected: true) if issue.author && !authors.include?(issue.author) + s << options_from_collection_for_select(authors, 'id', 'name', issue.author_id) end - safe_join s + safe_join(s) end def show_issue_change_author?(issue) diff --git a/plugins/additionals/app/helpers/additionals_journals_helper.rb b/plugins/additionals/app/helpers/additionals_journals_helper.rb deleted file mode 100644 index 4549ef6..0000000 --- a/plugins/additionals/app/helpers/additionals_journals_helper.rb +++ /dev/null @@ -1,159 +0,0 @@ -module AdditionalsJournalsHelper - MultipleValuesDetail = Struct.new(:property, :prop_key, :custom_field, :old_value, :value) - - # Returns the textual representation of a journal details - # as an array of strings - def entity_details_to_strings(entity, details, options = {}) - entity_type = entity.model_name.param_key - show_detail_method = "#{entity_type}_show_detail" - options[:only_path] = options[:only_path] != false - no_html = options.delete(:no_html) - strings = [] - values_by_field = {} - - details.each do |detail| - if detail.property == 'cf' - field = detail.custom_field - if field&.multiple? - values_by_field[field] ||= { added: [], deleted: [] } - values_by_field[field][:deleted] << detail.old_value if detail.old_value - values_by_field[field][:added] << detail.value if detail.value - next - end - end - strings << send(show_detail_method, detail, no_html, options) - end - - if values_by_field.present? - values_by_field.each do |field, changes| - if changes[:added].any? - detail = MultipleValuesDetail.new('cf', field.id.to_s, field) - detail.value = changes[:added] - strings << send(show_detail_method, detail, no_html, options) - end - next unless changes[:deleted].any? - - detail = MultipleValuesDetail.new('cf', field.id.to_s, field) - detail.old_value = changes[:deleted] - strings << send(show_detail_method, detail, no_html, options) - end - end - strings - end - - # taken from Redmine 4 - # Returns the action links for an issue journal - def render_entity_journal_actions(entity, journal) - return '' unless journal.notes.present? && journal.editable_by?(User.current) - - entity_type = entity.model_name.param_key - - safe_join [link_to(l(:button_edit), - send("edit_#{entity_type}_journal_path", journal), - remote: true, - method: 'get', - title: l(:button_edit), - class: 'icon-only icon-edit'), - link_to(l(:button_delete), - send("#{entity_type}_journal_path", journal, journal: { notes: '' }), - remote: true, - method: 'put', data: { confirm: l(:text_are_you_sure) }, - title: l(:button_delete), - class: 'icon-only icon-del')], ' ' - end - - # Returns the textual representation of a single journal detail - # rubocop: disable Rails/OutputSafety - def entity_show_detail(entity, detail, no_html = false, options = {}) # rubocop:disable Style/OptionalBooleanParameter: - multiple = false - no_detail = false - show_diff = false - label = nil - diff_url_method = "diff_#{entity.name.underscore}_journal_url" - entity_prop = entity_show_detail_prop detail, options - - if entity_prop.present? - label = entity_prop[:label] if entity_prop.key? :label - value = entity_prop[:value] if entity_prop.key? :value - old_value = entity_prop[:old_value] if entity_prop.key? :old_value - show_diff = entity_prop[:show_diff] if entity_prop.key? :show_diff - no_detail = entity_prop[:no_detail] if entity_prop.key? :no_detail - end - - if label || show_diff - unless no_html - label = tag.strong(label) - old_value = tag.i(old_value) if detail.old_value - old_value = tag.del(old_value) if detail.old_value && detail.value.blank? - value = tag.i(value) if value - end - - html = - if no_detail - l(:text_journal_changed_no_detail, label: label) - elsif show_diff - s = l(:text_journal_changed_no_detail, label: label) - unless no_html - diff_link = link_to l(:label_diff), - send(diff_url_method, - detail.journal_id, - detail_id: detail.id, - only_path: options[:only_path]), - title: l(:label_view_diff) - s << " (#{diff_link})" - end - s.html_safe - elsif detail.value.present? - if detail.old_value.present? - l(:text_journal_changed, label: label, old: old_value, new: value) - elsif multiple - l(:text_journal_added, label: label, value: value) - else - l(:text_journal_set_to, label: label, value: value) - end - else - l(:text_journal_deleted, label: label, old: old_value).html_safe - end - html.html_safe - else - # default implementation for journal detail rendering - show_detail detail, no_html, options - end - end - # rubocop: enable Rails/OutputSafety - - private - - def entity_show_detail_prop(detail, options) - return options[:entity_prop] if options.key? :entity_prop - return unless detail.property == 'cf' - - custom_field = detail.custom_field - return unless custom_field - - return { show_diff: true, label: l(:field_description) } if custom_field.format.class.change_as_diff - - case custom_field.format.name - when 'project_relation' - prop = { label: custom_field.name } - project = Project.visible.where(id: detail.value).first if detail.value.present? - old_project = Project.visible.where(id: detail.old_value).first if detail.old_value.present? - prop[:value] = link_to_project(project) if project.present? - prop[:old_value] = link_to_project(old_project) if old_project.present? - when 'db_entry' - prop = { label: custom_field.name } - db_entry = DbEntry.visible.where(id: detail.value).first if detail.value.present? - old_db_entry = DbEntry.visible.where(id: detail.old_value).first if detail.old_value.present? - prop[:value] = link_to(db_entry.name, db_entry_url(db_entry)) if db_entry.present? - prop[:old_value] = link_to(old_db_entry.name, db_entry_url(old_db_entry)) if old_db_entry.present? - when 'password' - prop = { label: custom_field.name } - password = Password.visible.where(id: detail.value).first if detail.value.present? && defined?(Password) - old_password = Password.visible.where(id: detail.old_value).first if detail.old_value.present? && defined?(Password) - prop[:value] = link_to(password.name, password_url(password)) if password.present? - prop[:old_value] = link_to(old_password.name, password_url(old_password)) if old_password.present? - end - - prop - end -end diff --git a/plugins/additionals/app/helpers/additionals_menu_helper.rb b/plugins/additionals/app/helpers/additionals_menu_helper.rb index ceee70f..cc9859f 100755 --- a/plugins/additionals/app/helpers/additionals_menu_helper.rb +++ b/plugins/additionals/app/helpers/additionals_menu_helper.rb @@ -1,37 +1,28 @@ module AdditionalsMenuHelper def additionals_top_menu_setup - return if Redmine::Plugin.installed? 'redmine_hrm' + return unless User.current.try(:hrm_user_type_id).nil? - if Additionals.setting? :remove_mypage + if Additionals.setting?(:remove_mypage) Redmine::MenuManager.map(:top_menu).delete(:my_page) if Redmine::MenuManager.map(:top_menu).exists?(:my_page) else - handle_top_menu_item(:my_page, { url: my_page_path, after: :home, if: proc { User.current.logged? } }) + handle_top_menu_item(:my_page, url: my_page_path, after: :home, if: proc { User.current.logged? }) end - if Additionals.setting? :remove_help + if Additionals.setting?(:remove_help) Redmine::MenuManager.map(:top_menu).delete(:help) if Redmine::MenuManager.map(:top_menu).exists?(:help) elsif User.current.logged? - handle_top_submenu_item :help, url: '#', symbol: 'fas_question', last: true + handle_top_menu_item(:help, url: '#', symbol: 'fas_question', last: true) @additionals_help_items = additionals_help_menu_items else - handle_top_menu_item :help, url: Redmine::Info.help_url, symbol: 'fas_question', last: true + handle_top_menu_item(:help, url: Redmine::Info.help_url, symbol: 'fas_question', last: true) end end - def handle_top_submenu_item(menu_name, item) - handle_top_menu_item menu_name, item, with_submenu: true - end - - def handle_top_menu_item(menu_name, item, with_submenu: false) + def handle_top_menu_item(menu_name, item) Redmine::MenuManager.map(:top_menu).delete(menu_name.to_sym) if Redmine::MenuManager.map(:top_menu).exists?(menu_name.to_sym) html_options = {} - - css_classes = [] - css_classes << 'top-submenu' if with_submenu - css_classes << 'external' if item[:url].include? '://' - html_options[:class] = css_classes.join(' ') if css_classes.present? - + html_options[:class] = 'external' if item[:url].include? '://' html_options[:title] = item[:title] if item[:title].present? menu_options = { parent: item[:parent].present? ? item[:parent].to_sym : nil, @@ -57,7 +48,7 @@ module AdditionalsMenuHelper menu_options[:before] = :help end - Redmine::MenuManager.map(:top_menu).push menu_name, item[:url], menu_options + Redmine::MenuManager.map(:top_menu).push(menu_name, item[:url], menu_options) end def render_custom_top_menu_item @@ -65,15 +56,14 @@ module AdditionalsMenuHelper return if items.empty? user_roles = Role.givable - .joins(members: :project) - .where(members: { user_id: User.current.id }, - projects: { status: Project::STATUS_ACTIVE }) + .joins(:members).where(members: { user_id: User.current.id }) + .joins(members: :project).where(projects: { status: Project::STATUS_ACTIVE }) .distinct .reorder(nil) - .ids + .pluck(:id) items.each do |item| - additionals_custom_top_menu_item item, user_roles + additionals_custom_top_menu_item(item, user_roles) end end @@ -82,10 +72,10 @@ module AdditionalsMenuHelper Additionals::MAX_CUSTOM_MENU_ITEMS.times do |num| menu_name = "custom_menu#{num}" item = { menu_name: menu_name.to_sym, - url: Additionals.setting("#{menu_name}_url"), - name: Additionals.setting("#{menu_name}_name"), - title: Additionals.setting("#{menu_name}_title"), - roles: Additionals.setting("#{menu_name}_roles") } + url: Additionals.settings[menu_name + '_url'], + name: Additionals.settings[menu_name + '_name'], + title: Additionals.settings[menu_name + '_title'], + roles: Additionals.settings[menu_name + '_roles'] } if item[:name].present? && item[:url].present? && item[:roles].present? items << item @@ -100,9 +90,12 @@ module AdditionalsMenuHelper def additionals_custom_top_menu_item(item, user_roles) show_entry = false item[:roles].each do |role| - if user_roles.empty? && role.to_i == Role::BUILTIN_ANONYMOUS || - # if user is logged in and non_member is active in item, always show it - User.current.logged? && role.to_i == Role::BUILTIN_NON_MEMBER + if user_roles.empty? && role.to_i == Role::BUILTIN_ANONYMOUS + show_entry = true + break + elsif User.current.logged? && role.to_i == Role::BUILTIN_NON_MEMBER + # if user is logged in and non_member is active in item, + # always show it show_entry = true break end @@ -117,7 +110,7 @@ module AdditionalsMenuHelper end if show_entry - handle_top_menu_item item[:menu_name], item + handle_top_menu_item(item[:menu_name], item) elsif Redmine::MenuManager.map(:top_menu).exists?(item[:menu_name]) Redmine::MenuManager.map(:top_menu).delete(item[:menu_name]) end @@ -125,16 +118,12 @@ module AdditionalsMenuHelper def addtionals_help_plugin_items user_items = [{ title: 'Redmine Guide', url: Redmine::Info.help_url }, - { title: "Redmine #{l :label_macro_plural}", url: additionals_macros_path }] + { title: "Redmine #{l(:label_macro_plural)}", url: additionals_macros_path }] - admin_items = [{ title: 'Additionals', - url: 'https://additionals.readthedocs.io/en/latest/manual/', manual: true }, - { title: 'Redmine Changelog', - url: "https://www.redmine.org/projects/redmine/wiki/Changelog_#{Redmine::VERSION::MAJOR}_#{Redmine::VERSION::MINOR}" }, - { title: 'Redmine Upgrade', - url: 'https://www.redmine.org/projects/redmine/wiki/RedmineUpgrade' }, - { title: 'Redmine Security Advisories', - url: 'https://www.redmine.org/projects/redmine/wiki/Security_Advisories' }] + admin_items = [{ title: 'Additionals', url: 'https://additionals.readthedocs.io/en/latest/manual/', manual: true }, + { title: 'Redmine Changelog', url: 'https://www.redmine.org/projects/redmine/wiki/Changelog_3_4' }, + { title: 'Redmine Upgrade', url: 'https://www.redmine.org/projects/redmine/wiki/RedmineUpgrade' }, + { title: 'Redmine Security Advisories', url: 'https://www.redmine.org/projects/redmine/wiki/Security_Advisories' }] Redmine::Plugin.all.each do |plugin| next if plugin.id == :additionals @@ -156,7 +145,7 @@ module AdditionalsMenuHelper plugin_item.each do |temp_item| u_items = if !temp_item[:manual].nil? && temp_item[:manual] - { title: "#{temp_item[:title]} #{l :label_help_manual}", url: temp_item[:url] } + { title: "#{temp_item[:title]} #{l(:label_help_manual)}", url: temp_item[:url] } else { title: temp_item[:title], url: temp_item[:url] } end @@ -184,17 +173,18 @@ module AdditionalsMenuHelper s = [] pages.each_with_index do |item, idx| s << if item[:title] == '-' - tag.li tag.hr + content_tag(:li, tag(:hr)) else - html_options = { class: "help_item_#{idx}" } + html_options = { class: 'help_item_' + idx.to_s } if item[:url].include? '://' html_options[:class] << ' external' html_options[:target] = '_blank' end - tag.li(link_to(item[:title], item[:url], html_options)) + content_tag(:li, + link_to(item[:title], item[:url], html_options)) end end - safe_join s + safe_join(s) end # Plugin help items definition for plugins, diff --git a/plugins/additionals/app/helpers/additionals_projects_helper.rb b/plugins/additionals/app/helpers/additionals_projects_helper.rb deleted file mode 100644 index 5d44081..0000000 --- a/plugins/additionals/app/helpers/additionals_projects_helper.rb +++ /dev/null @@ -1,8 +0,0 @@ -module AdditionalsProjectsHelper - def project_overview_name(_project, dashboard = nil) - name = [l(:label_overview)] - name << dashboard.name if dashboard.present? && (dashboard.always_expose? || !dashboard.system_default) - - safe_join name, Additionals::LIST_SEPARATOR - end -end diff --git a/plugins/additionals/app/helpers/additionals_queries_helper.rb b/plugins/additionals/app/helpers/additionals_queries_helper.rb index 4c357af..79c4c3a 100755 --- a/plugins/additionals/app/helpers/additionals_queries_helper.rb +++ b/plugins/additionals/app/helpers/additionals_queries_helper.rb @@ -4,8 +4,8 @@ module AdditionalsQueriesHelper end def additionals_retrieve_query(object_type, options = {}) - session_key = additionals_query_session_key object_type - query_class = Object.const_get "#{object_type.camelcase}Query" + session_key = additionals_query_session_key(object_type) + query_class = Object.const_get("#{object_type.camelcase}Query") if params[:query_id].present? additionals_load_query_id(query_class, session_key, params[:query_id], options, object_type) elsif api_request? || @@ -28,7 +28,7 @@ module AdditionalsQueriesHelper else # retrieve from session @query = query_class.find_by(id: session[session_key][:id]) if session[session_key][:id] - session_data = Rails.cache.read additionals_query_cache_key(object_type) + session_data = Rails.cache.read(additionals_query_cache_key(object_type)) @query ||= query_class.new(name: '_', filters: session_data.nil? ? nil : session_data[:filters], group_by: session_data.nil? ? nil : session_data[:group_by], @@ -52,9 +52,9 @@ module AdditionalsQueriesHelper end def additionals_load_query_id(query_class, session_key, query_id, options, object_type) - scope = query_class.where(project_id: nil) - scope = scope.or(query_class.where(project_id: @project.id)) if @project - @query = scope.find(query_id) + cond = 'project_id IS NULL' + cond << " OR project_id = #{@project.id}" if @project + @query = query_class.where(cond).find(query_id) raise ::Unauthorized unless @query.visible? @query.project = @project @@ -72,20 +72,19 @@ module AdditionalsQueriesHelper end def additionals_query_cache_key(object_type) - project_id = @project ? @project.id : 0 + project_id = @project.nil? ? 0 : @project.id "#{object_type}_query_data_#{session.id}_#{project_id}" end - def additionals_select2_search_users(options = {}) + def additionals_select2_search_users(where_filter = '', where_params = {}) q = params[:q].to_s.strip exclude_id = params[:user_id].to_i - scope = User.active.where type: 'User' - scope = scope.visible unless options[:all_visible] - scope = scope.where.not(id: exclude_id) if exclude_id.positive? - scope = scope.where(options[:where_filter], options[:where_params]) if options[:where_filter] - q.split.map { |search_string| scope = scope.like(search_string) } if q.present? + scope = User.active.where(type: 'User') + scope = scope.where.not(id: exclude_id) if exclude_id > 0 + scope = scope.where(where_filter, where_params) if where_filter.present? + scope = scope.like(q) if q.present? scope = scope.order(last_login_on: :desc) - .limit(Additionals::SELECT2_INIT_ENTRIES) + .limit(params[:limit] || Additionals::SELECT2_INIT_ENTRIES) @users = scope.to_a.sort! { |x, y| x.name <=> y.name } render layout: false, partial: 'auto_completes/additionals_users' end @@ -98,10 +97,9 @@ module AdditionalsQueriesHelper query.columns end - options[:filename] = StringIO.new('') - - export_to_xlsx(items, columns, options) - options[:filename].string + stream = StringIO.new('') + export_to_xlsx(items, columns, filename: stream) + stream.string end def additionals_result_to_xlsx(items, columns, options = {}) @@ -140,13 +138,13 @@ module AdditionalsQueriesHelper def xlsx_write_header_row(workbook, worksheet, columns) columns_width = [] columns.each_with_index do |c, index| - value = if c.is_a? String + value = if c.class.name == 'String' c else c.caption.to_s end - worksheet.write 0, index, value, workbook.add_format(xlsx_cell_format(:header)) + worksheet.write(0, index, value, workbook.add_format(xlsx_cell_format(:header))) columns_width << xlsx_get_column_width(value) end columns_width @@ -163,18 +161,10 @@ module AdditionalsQueriesHelper columns.each_with_index do |c, column_index| value = csv_content(c, line) if c.name == :id # ID - if options[:no_id_link].blank? - link = url_for(controller: line.class.name.underscore.pluralize, action: 'show', id: line.id) - worksheet.write(line_index + 1, column_index, link, hyperlink_format, value) - else - # id without link - worksheet.write(line_index + 1, - column_index, - value, - workbook.add_format(xlsx_cell_format(:cell, value, line_index))) - end + link = url_for(controller: line.class.name.underscore.pluralize, action: 'show', id: line.id) + worksheet.write(line_index + 1, column_index, link, hyperlink_format, value) elsif xlsx_hyperlink_cell?(value) - worksheet.write(line_index + 1, column_index, value[0..254], hyperlink_format, value) + worksheet.write(line_index + 1, column_index, value, hyperlink_format, value) elsif !c.inline? # block column can be multiline strings value.gsub!("\r\n", "\n") @@ -198,7 +188,7 @@ module AdditionalsQueriesHelper value_str = value.to_s # 1.1: margin - width = (value_str.length + value_str.chars.count { |e| !e.ascii_only? }) * 1.1 + 1 + width = (value_str.length + value_str.chars.reject(&:ascii_only?).length) * 1.1 + 1 # 30: max width width > 30 ? 30 : width end @@ -216,7 +206,7 @@ module AdditionalsQueriesHelper format[:bg_color] = 'silver' unless index.even? else format[:bg_color] = 'silver' unless index.even? - format[:color] = 'red' if value.is_a?(Numeric) && value.negative? + format[:color] = 'red' if value.is_a?(Numeric) && value < 0 end format @@ -224,11 +214,13 @@ module AdditionalsQueriesHelper def xlsx_hyperlink_cell?(token) # Match http, https or ftp URL - if %r{\A[fh]tt?ps?://}.match?(token) || - # Match mailto: - token.present? && token.start_with?('mailto:') || - # Match internal or external sheet link - /\A(?:in|ex)ternal:/.match?(token) + if token =~ %r{\A[fh]tt?ps?://} + true + # Match mailto: + elsif token.present? && token.start_with?('mailto:') + true + # Match internal or external sheet link + elsif token =~ /\A(?:in|ex)ternal:/ true end end @@ -237,7 +229,7 @@ module AdditionalsQueriesHelper # columns in ignored_column_names are skipped (names as symbols) # TODO: this is a temporary fix and should be removed # after https://www.redmine.org/issues/29830 is in Redmine core. - def query_as_hidden_field_tags(query) + def query_as_hidden_field_tags(query, ignored_column_names = nil) tags = hidden_field_tag('set_filter', '1', id: nil) if query.filters.present? @@ -251,10 +243,8 @@ module AdditionalsQueriesHelper else tags << hidden_field_tag('f[]', '', id: nil) end - - ignored_block_columns = query.block_columns.map(&:name) query.columns.each do |column| - next if ignored_block_columns.include?(column.name) + next if ignored_column_names.present? && ignored_column_names.include?(column.name) tags << hidden_field_tag('c[]', column.name, id: nil) end @@ -268,11 +258,4 @@ module AdditionalsQueriesHelper tags end - - def render_query_group_view(query, locals = {}) - return if locals[:group_name].blank? - - render partial: 'queries/additionals_group_view', - locals: { query: query }.merge(locals) - end end diff --git a/plugins/additionals/app/helpers/additionals_routes_helper.rb b/plugins/additionals/app/helpers/additionals_routes_helper.rb deleted file mode 100644 index 9d2de5b..0000000 --- a/plugins/additionals/app/helpers/additionals_routes_helper.rb +++ /dev/null @@ -1,82 +0,0 @@ -module AdditionalsRoutesHelper - def _dashboards_path(project, *args) - if project - project_dashboards_path(project, *args) - else - dashboards_path(*args) - end - end - - def _dashboard_path(project, *args) - if project - project_dashboard_path(project, *args) - else - dashboard_path(*args) - end - end - - def _dashboard_async_blocks_path(project, *args) - if project - project_dashboard_async_blocks_path(project, *args) - else - dashboard_async_blocks_path(*args) - end - end - - def _edit_dashboard_path(project, *args) - if project - edit_project_dashboard_path(project, *args) - else - edit_dashboard_path(*args) - end - end - - def _new_dashboard_path(project, *args) - if project - new_project_dashboard_path(project, *args) - else - new_dashboard_path(*args) - end - end - - def _update_layout_setting_dashboard_path(project, *args) - if project - update_layout_setting_project_dashboard_path(project, *args) - else - update_layout_setting_dashboard_path(*args) - end - end - - def _add_block_dashboard_path(project, *args) - if project - add_block_project_dashboard_path(project, *args) - else - add_block_dashboard_path(*args) - end - end - - def _remove_block_dashboard_path(project, *args) - if project - remove_block_project_dashboard_path(project, *args) - else - remove_block_dashboard_path(*args) - end - end - - def _order_blocks_dashboard_path(project, *args) - if project - order_blocks_project_dashboard_path(project, *args) - else - order_blocks_dashboard_path(*args) - end - end - - def dashboard_link_path(project, dashboard, options = {}) - options[:dashboard_id] = dashboard.id - if dashboard.dashboard_type == DashboardContentProject::TYPE_NAME - project_path project, options - else - home_path options - end - end -end diff --git a/plugins/additionals/app/helpers/additionals_select2_helper.rb b/plugins/additionals/app/helpers/additionals_select2_helper.rb deleted file mode 100644 index 562c3e6..0000000 --- a/plugins/additionals/app/helpers/additionals_select2_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -module AdditionalsSelect2Helper - def additionals_select2_tag(name, option_tags = nil, options = {}) - s = select_tag(name, option_tags, options) - id = options.delete(:id) || sanitize_to_id(name) - s << hidden_field_tag("#{name}[]", '') if options[:multiple] && options.fetch(:include_hidden, true) - - s + javascript_tag("select2Tag('#{id}', #{options.to_json});") - end - - # Transforms select filters of +type+ fields into select2 - def additionals_transform_to_select2(type, options = {}) - javascript_tag("setSelect2Filter('#{type}', #{options.to_json});") unless type.empty? - end -end diff --git a/plugins/additionals/app/helpers/additionals_settings_helper.rb b/plugins/additionals/app/helpers/additionals_settings_helper.rb deleted file mode 100644 index 07b1f26..0000000 --- a/plugins/additionals/app/helpers/additionals_settings_helper.rb +++ /dev/null @@ -1,74 +0,0 @@ -module AdditionalsSettingsHelper - def additionals_settings_tabs - tabs = [{ name: 'general', partial: 'additionals/settings/general', label: :label_general }, - { name: 'wiki', partial: 'additionals/settings/wiki', label: :label_wiki }, - { name: 'macros', partial: 'additionals/settings/macros', label: :label_macro_plural }, - { name: 'rules', partial: 'additionals/settings/issues', label: :label_issue_plural }, - { name: 'web', partial: 'additionals/settings/web_apis', label: :label_web_apis }] - - unless Redmine::Plugin.installed? 'redmine_hrm' - tabs << { name: 'menu', partial: 'additionals/settings/menu', label: :label_settings_menu } - end - - tabs - end - - def additionals_settings_checkbox(name, options = {}) - label_title = options.delete(:label).presence || l("label_#{name}") - value = options.delete :value - value_is_bool = options.delete :value_is_bool - custom_value = if value.nil? - value = 1 - false - else - value = 1 if value_is_bool - true - end - - checked = if custom_value && !value_is_bool - @settings[name] - else - Additionals.true? @settings[name] - end - - s = [label_tag("settings[#{name}]", label_title)] - s << hidden_field_tag("settings[#{name}]", 0, id: nil) if !custom_value || value_is_bool - s << check_box_tag("settings[#{name}]", value, checked, options) - safe_join s - end - - def additionals_settings_textfield(name, options = {}) - label_title = options.delete(:label).presence || l("label_#{name}") - value = options.delete(:value).presence || @settings[name] - - safe_join [label_tag("settings[#{name}]", label_title), - text_field_tag("settings[#{name}]", value, options)] - end - - def additionals_settings_passwordfield(name, options = {}) - label_title = options.delete(:label).presence || l("label_#{name}") - value = options.delete(:value).presence || @settings[name] - - safe_join [label_tag("settings[#{name}]", label_title), - password_field_tag("settings[#{name}]", value, options)] - end - - def additionals_settings_urlfield(name, options = {}) - label_title = options.delete(:label).presence || l("label_#{name}") - value = options.delete(:value).presence || @settings[name] - - safe_join [label_tag("settings[#{name}]", label_title), - url_field_tag("settings[#{name}]", value, options)] - end - - def additionals_settings_textarea(name, options = {}) - label_title = options.delete(:label).presence || l("label_#{name}") - value = options.delete(:value).presence || @settings[name] - - options[:class] = 'wiki-edit' unless options.key?(:class) - options[:rows] = addtionals_textarea_cols(value) unless options.key?(:rows) - - safe_join [label_tag("settings[#{name}]", label_title), - text_area_tag("settings[#{name}]", value, options)] - end -end diff --git a/plugins/additionals/app/helpers/additionals_tag_helper.rb b/plugins/additionals/app/helpers/additionals_tag_helper.rb new file mode 100755 index 0000000..1e2c80d --- /dev/null +++ b/plugins/additionals/app/helpers/additionals_tag_helper.rb @@ -0,0 +1,125 @@ +require 'digest/md5' + +module AdditionalsTagHelper + # deprecated: this will removed after a while + def render_additionals_tags_list(tags, options = {}) + additionals_tag_cloud(tags, options) + end + + # deprecated: this will removed after a while + def render_additionals_tag_link_line(tag_list) + additionals_tag_links(tag_list) + end + + def additionals_tag_cloud(tags, options = {}) + return if tags.blank? + + options[:show_count] = true + + # prevent ActsAsTaggableOn::TagsHelper from calling `all` + # otherwise we will need sort tags after `tag_cloud` + tags = tags.all if tags.respond_to?(:all) + + s = [] + tags.each do |tag| + s << additionals_tag_link(tag, options) + end + + sep = if options[:tags_without_color] + ', ' + else + ' ' + end + + content_tag(:div, safe_join(s, sep), class: 'tags') + end + + # plain list of tags + def render_additionals_tags(tags, sep = ' ') + s = if tags.blank? + [''] + else + tags.map(&:name) + end + s.join(sep) + end + + def additionals_tag_links(tag_list, options = {}) + return unless tag_list + + sep = if options[:tags_without_color] + ', ' + else + ' ' + end + + safe_join(tag_list.map do |tag| + additionals_tag_link(tag, options) + end, sep) + end + + def additionals_tag_link(tag, options = {}) + tag_name = [] + tag_name << tag.name + + unless options[:tags_without_color] + tag_bg_color = additionals_tag_color(tag.name) + tag_fg_color = additionals_tag_fg_color(tag_bg_color) + tag_style = "background-color: #{tag_bg_color}; color: #{tag_fg_color}" + end + + tag_name << content_tag('span', "(#{tag.count})", class: 'tag-count') if options[:show_count] + + if options[:tags_without_color] + content_tag('span', + link_to(safe_join(tag_name), additionals_tag_url(tag.name, options)), + class: 'tag-label') + else + content_tag('span', + link_to(safe_join(tag_name), + additionals_tag_url(tag.name, options), + style: tag_style), + class: 'additionals-tag-label-color', + style: tag_style) + end + end + + def additionals_tag_url(tag_name, options = {}) + action = options[:tag_action].presence || (controller_name == 'hrm_user_resources' ? 'show' : 'index') + + { controller: options[:tag_controller].presence || controller_name, + action: action, + set_filter: 1, + project_id: @project, + fields: [:tags], + values: { tags: [tag_name] }, + operators: { tags: '=' } } + end + + private + + def tag_cloud(tags, classes) + return [] if tags.empty? + + max_count = tags.max_by(&:count).count.to_f + + tags.each do |tag| + index = ((tag.count / max_count) * (classes.size - 1)) + yield tag, classes[index.nan? ? 0 : index.round] + end + end + + def additionals_tag_color(tag_name) + "##{Digest::MD5.hexdigest(tag_name)[0..5]}" + end + + def additionals_tag_fg_color(bg_color) + # calculate contrast text color according to YIQ method + # https://24ways.org/2010/calculating-color-contrast/ + # https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color + r = bg_color[1..2].hex + g = bg_color[3..4].hex + b = bg_color[5..6].hex + (r * 299 + g * 587 + b * 114) >= 128_000 ? 'black' : 'white' + end +end diff --git a/plugins/additionals/app/helpers/dashboards_helper.rb b/plugins/additionals/app/helpers/dashboards_helper.rb deleted file mode 100644 index 937e676..0000000 --- a/plugins/additionals/app/helpers/dashboards_helper.rb +++ /dev/null @@ -1,464 +0,0 @@ -module DashboardsHelper - def dashboard_sidebar?(dashboard, params) - if params['enable_sidebar'].blank? - if dashboard.blank? - # defaults without dashboard - !@project.nil? - else - dashboard.enable_sidebar? - end - else - Additionals.true? params['enable_sidebar'] - end - end - - def welcome_overview_name(dashboard = nil) - name = [l(:label_home)] - name << dashboard.name if dashboard&.always_expose? || dashboard.present? && !dashboard.system_default? - - safe_join name, Additionals::LIST_SEPARATOR - end - - def dashboard_css_classes(dashboard) - classes = ['dashboard', dashboard.dashboard_type.underscore, "dashboard-#{dashboard.id}"] - safe_join classes, ' ' - end - - def sidebar_dashboards(dashboard, project = nil, user = nil) - user ||= User.current - scope = Dashboard.visible.includes([:author]) - - scope = if project.present? - scope = scope.project_only - scope.where(project_id: project.id) - .or(scope.where(system_default: true) - .where(project_id: nil)) - .or(scope.where(author_id: user.id) - .where(project_id: nil)) - else - scope.where dashboard_type: dashboard.dashboard_type - end - - scope.sorted.to_a - end - - def render_dashboard_actionlist(active_dashboard, project = nil) - dashboards = sidebar_dashboards active_dashboard, project - base_css = 'icon icon-dashboard' - out = [] - - dashboards.select!(&:public?) unless User.current.allowed_to? :save_dashboards, project, global: true - dashboards.each do |dashboard| - css_class = base_css - dashboard_name = "#{l :label_dashboard}: #{dashboard.name}" - out << if dashboard.id == active_dashboard.id - link_to dashboard_name, '#', - onclick: 'return false;', - class: "#{base_css} disabled" - else - dashboard_link dashboard, project, - class: css_class, - title: l(:label_change_to_dashboard), - name: dashboard_name - end - end - - safe_join out - end - - def render_sidebar_dashboards(dashboard, project = nil) - dashboards = sidebar_dashboards dashboard, project - out = [dashboard_links(l(:label_my_dashboard_plural), - dashboard, - User.current.allowed_to?(:save_dashboards, project, global: true) ? dashboards.select(&:private?) : [], - project), - dashboard_links(l(:label_shared_dashboard_plural), - dashboard, - dashboards.select(&:public?), - project)] - - out << dashboard_info(dashboard) if dashboard.always_expose? || !dashboard.system_default - - safe_join out - end - - def dashboard_info(dashboard) - tag.div class: 'active-dashboards' do - out = [tag.h3(l(:label_active_dashboard)), - tag.ul do - concat tag.li "#{l :field_name}: #{dashboard.name}" - concat tag.li safe_join([l(:field_author), link_to_user(dashboard.author)], ': ') - concat tag.li "#{l :field_created_on}: #{format_time dashboard.created_at}" - concat tag.li "#{l :field_updated_on}: #{format_time dashboard.updated_at}" - end] - - if dashboard.description.present? - out << tag.div(textilizable(dashboard, :description, inline_attachments: false), - class: 'dashboard-description') - end - - safe_join out - end - end - - def dashboard_links(title, active_dashboard, dashboards, project) - return '' unless dashboards.any? - - tag.h3(title, class: 'dashboards') + - tag.ul(class: 'dashboards') do - dashboards.each do |dashboard| - selected = dashboard.id == if params[:dashboard_id].present? - params[:dashboard_id].to_i - else - active_dashboard.id - end - - css = 'dashboard' - css << ' selected' if selected - li_class = nil - - link = [dashboard_link(dashboard, project, class: css)] - if dashboard.system_default? - link << if dashboard.project_id.nil? - li_class = 'global' - font_awesome_icon 'fas_cube', - title: l(:field_system_default), - class: "dashboard-system-default #{li_class}" - else - li_class = 'project' - font_awesome_icon 'fas_cube', - title: l(:field_project_system_default), - class: "dashboard-system-default #{li_class}" - end - end - - concat tag.li safe_join(link), class: li_class - end - end - end - - def dashboard_link(dashboard, project, options = {}) - if options[:title].blank? && dashboard.public? - author = if dashboard.author_id == User.current.id - l :label_me - else - dashboard.author - end - options[:title] = l(:label_dashboard_author, name: author) - end - - name = options.delete(:name) || dashboard.name - link_to name, dashboard_link_path(project, dashboard), options - end - - def sidebar_action_toggle(enabled, dashboard, project = nil) - return if dashboard.nil? - - if enabled - link_to l(:label_disable_sidebar), - dashboard_link_path(project, dashboard, enable_sidebar: 0), - class: 'icon icon-sidebar' - else - link_to l(:label_enable_sidebar), - dashboard_link_path(project, dashboard, enable_sidebar: 1), - class: 'icon icon-sidebar' - end - end - - def delete_dashboard_link(url, options = {}) - options = { method: :delete, - data: { confirm: l(:text_are_you_sure) }, - class: 'icon icon-del' }.merge(options) - - link_to l(:button_dashboard_delete), url, options - end - - # Returns the select tag used to add or remove a block - def dashboard_block_select_tag(dashboard) - blocks_in_use = dashboard.layout.values.flatten - options = tag.option "<< #{l :label_add_dashboard_block} >>", value: '' - dashboard.content.block_options(blocks_in_use).each do |label, block| - options << tag.option(label, value: block, disabled: block.blank?) - end - select_tag 'block', - options, - id: 'block-select', - class: 'dashboard-block-select', - onchange: "$('#block-form').submit();" - end - - # Renders the blocks - def render_dashboard_blocks(blocks, dashboard, _options = {}) - s = ''.html_safe - - if blocks.present? - blocks.each do |block| - s << render_dashboard_block(block, dashboard).to_s - end - end - s - end - - # Renders a single block - def render_dashboard_block(block, dashboard, overwritten_settings = {}) - block_definition = dashboard.content.find_block block - unless block_definition - Rails.logger.info "Unknown block \"#{block}\" found in #{dashboard.name} (id=#{dashboard.id})" - return - end - - content = render_dashboard_block_content block, block_definition, dashboard, overwritten_settings - return if content.blank? - - if dashboard.editable? - icons = [] - if block_definition[:no_settings].blank? && - (!block_definition.key?(:with_settings_if) || block_definition[:with_settings_if].call(@project)) - icons << link_to_function(l(:label_options), - "$('##{block}-settings').toggle();", - class: 'icon-only icon-settings', - title: l(:label_options)) - end - icons << tag.span('', class: 'icon-only icon-sort-handle sort-handle', title: l(:button_move)) - icons << link_to(l(:button_delete), - _remove_block_dashboard_path(@project, dashboard, block: block), - remote: true, method: 'post', - class: 'icon-only icon-close', title: l(:button_delete)) - - content = tag.div(safe_join(icons), class: 'contextual') + content - end - - tag.div content, class: 'mypage-box', id: "block-#{block}" - end - - def build_dashboard_partial_locals(block, block_definition, settings, dashboard) - partial_locals = { dashboard: dashboard, - settings: settings, - block: block, - block_definition: block_definition, - user: User.current } - - if block_definition[:query_block] - partial_locals[:query_block] = block_definition[:query_block] - partial_locals[:klass] = block_definition[:query_block][:class] - partial_locals[:async] = { required_settings: %i[query_id], - exposed_params: %i[sort], - partial: 'dashboards/blocks/query_list' } - partial_locals[:async][:unique_params] = [Redmine::Utils.random_hex(16)] if params[:refresh].present? - partial_locals[:async] = partial_locals[:async].merge(block_definition[:async]) if block_definition[:async] - elsif block_definition[:async] - partial_locals[:async] = block_definition[:async] - end - - partial_locals - end - - def dashboard_async_required_settings?(settings, async) - return true if async[:required_settings].blank? - return false if settings.blank? - - async[:required_settings].each do |required_setting| - return false if settings.exclude?(required_setting) || settings[required_setting].blank? - end - - true - end - - def dashboard_query_list_block_title(query, query_block, project) - title = [] - title << query.project if project.nil? && query.project - title << query_block[:label] - - title << if query_block[:with_project] - link_to(query.name, send(query_block[:link_helper], project, query.as_params)) - else - link_to(query.name, send(query_block[:link_helper], query.as_params)) - end - - safe_join title, Additionals::LIST_SEPARATOR - end - - def dashboard_query_list_block_alerts(dashboard, query, block_definition) - return if dashboard.visibility == Dashboard::VISIBILITY_PRIVATE - - title = if query.visibility == Query::VISIBILITY_PRIVATE - l(:alert_only_visible_by_yourself) - elsif block_definition.key?(:admin_only) && block_definition[:admin_only] - l(:alert_only_visible_by_admins) - end - - return if title.nil? - - font_awesome_icon('fas_info-circle', - title: title, - class: 'dashboard-block-alert') - end - - def render_legacy_left_block(_block, _block_definition, _settings, _dashboard) - if @project - call_hook :view_projects_show_left, project: @project - else - call_hook :view_welcome_index_left - end - end - - def render_legacy_right_block(_block, _block_definition, _settings, _dashboard) - if @project - call_hook :view_projects_show_right, project: @project - else - call_hook :view_welcome_index_right - end - end - - # copied from my_helper - def render_documents_block(block, _block_definition, settings, dashboard) - max_entries = settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES - - scope = Document.visible - scope = scope.where(project: dashboard.project) if dashboard.project - - documents = scope.order(created_on: :desc) - .limit(max_entries) - .to_a - - render partial: 'dashboards/blocks/documents', locals: { block: block, - max_entries: max_entries, - documents: documents } - end - - def render_news_block(block, _block_definition, settings, dashboard) - max_entries = settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES - - news = if dashboard.content_project.nil? - News.latest User.current, max_entries - else - dashboard.content_project - .news - .limit(max_entries) - .includes(:author, :project) - .reorder(created_on: :desc) - .to_a - end - - render partial: 'dashboards/blocks/news', locals: { block: block, - max_entries: max_entries, - news: news } - end - - def render_my_spent_time_block(block, block_definition, settings, dashboard) - days = settings[:days].to_i - days = 7 if days < 1 || days > 365 - - scope = TimeEntry.where user_id: User.current.id - scope = scope.where(project_id: dashboard.content_project.id) unless dashboard.content_project.nil? - - entries_today = scope.where(spent_on: User.current.today) - entries_days = scope.where(spent_on: User.current.today - (days - 1)..User.current.today) - - render partial: 'dashboards/blocks/my_spent_time', - locals: { block: block, - block_definition: block_definition, - entries_today: entries_today, - entries_days: entries_days, - days: days } - end - - def activity_dashboard_data(settings, dashboard) - max_entries = (settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES).to_i - user = User.current - options = {} - options[:author] = user if Additionals.true? settings[:me_only] - options[:project] = dashboard.content_project if dashboard.content_project.present? - - Redmine::Activity::Fetcher.new(user, options) - .events(nil, nil, limit: max_entries) - .group_by { |event| user.time_to_date(event.event_datetime) } - end - - def dashboard_feed_catcher(url, max_entries) - feed = { items: [], valid: false } - return feed if url.blank? - - cnt = 0 - max_entries = max_entries.present? ? max_entries.to_i : 10 - - begin - URI.parse(url).open do |rss_feed| - rss = RSS::Parser.parse(rss_feed) - rss.items.each do |item| - cnt += 1 - feed[:items] << { title: item.title.try(:content)&.presence || item.title, - link: item.link.try(:href)&.presence || item.link } - break if cnt >= max_entries - end - end - rescue StandardError => e - Rails.logger.info "dashboard_feed_catcher error for #{url}: #{e}" - return feed - end - - feed[:valid] = true - - feed - end - - def dashboard_feed_title(title, block_definition) - title.presence || block_definition[:label] - end - - def options_for_query_select(klass, project) - # sidebar_queries cannot be use because descendants classes are included - # this changes on class loading - # queries = klass.visible.global_or_on_project(@project).sorted.to_a - queries = klass.visible - .global_or_on_project(project) - .where(type: klass.to_s) - .sorted.to_a - - tag.option + options_from_collection_for_select(queries, :id, :name) - end - - private - - # Renders a single block content - def render_dashboard_block_content(block, block_definition, dashboard, overwritten_settings = {}) - settings = dashboard.layout_settings block - settings = settings.merge(overwritten_settings) if overwritten_settings.present? - - partial = block_definition[:partial] - partial_locals = build_dashboard_partial_locals block, block_definition, settings, dashboard - - if block_definition[:query_block] || block_definition[:async] - render partial: 'dashboards/blocks/async', locals: partial_locals - elsif partial - begin - render partial: partial, locals: partial_locals - rescue ActionView::MissingTemplate - Rails.logger.warn("Partial \"#{partial}\" missing for block \"#{block}\" found in #{dashboard.name} (id=#{dashboard.id})") - nil - end - else - send "render_#{block_definition[:name]}_block", - block, - block_definition, - settings, - dashboard - end - end - - def resently_used_dashboard_save(dashboard, project = nil) - user = User.current - dashboard_type = dashboard.dashboard_type - recently_id = user.pref.recently_used_dashboard dashboard_type, project - return if recently_id == dashboard.id || user.anonymous? - - if dashboard_type == DashboardContentProject::TYPE_NAME - user.pref.recently_used_dashboards[dashboard_type] = {} if user.pref.recently_used_dashboards[dashboard_type].nil? - user.pref.recently_used_dashboards[dashboard_type][project.id] = dashboard.id - else - user.pref.recently_used_dashboards[dashboard_type] = dashboard.id - end - - user.pref.save - end -end diff --git a/plugins/additionals/app/jobs/additionals_job.rb b/plugins/additionals/app/jobs/additionals_job.rb deleted file mode 100644 index 613249a..0000000 --- a/plugins/additionals/app/jobs/additionals_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AdditionalsJob < ActiveJob::Base - # Automatically retry jobs that encountered a deadlock - # retry_on ActiveRecord::Deadlocked - - # Most jobs are safe to ignore if the underlying records are no longer available - # discard_on ActiveJob::DeserializationError -end diff --git a/plugins/additionals/app/models/additionals_chart.rb b/plugins/additionals/app/models/additionals_chart.rb deleted file mode 100644 index 84a27ad..0000000 --- a/plugins/additionals/app/models/additionals_chart.rb +++ /dev/null @@ -1,65 +0,0 @@ -class AdditionalsChart - include ActiveRecord::Sanitization - include Redmine::I18n - - CHART_DEFAULT_HEIGHT = 350 - CHART_DEFAULT_WIDTH = 400 - - class << self - def color_schema - Redmine::Plugin.installed?('redmine_reporting') ? RedmineReporting.setting(:chart_color_schema) : 'tableau.Classic20' - end - - def data - raise 'overwrite it!' - end - - # build return value - def build_chart_data(datasets, options = {}) - cached_labels = labels - data = { datasets: datasets.to_json, - labels: cached_labels.keys, - label_ids: cached_labels.values } - - required_labels = options.key?(:required_labels) ? options.delete(:required_labels) : 2 - - data[:valid] = cached_labels.any? && cached_labels.count >= required_labels unless options.key?(:valid) - data[:width] = self::CHART_DEFAULT_WIDTH unless options.key?(:width) - data[:height] = self::CHART_DEFAULT_HEIGHT unless options.key?(:height) - data[:value_link_method] = '_project_issues_path' unless options.key?(:value_link_method) - data[:color_schema] = color_schema - - data.merge(options) - end - - private - - def build_values_without_gaps(data, gap_value = 0) - values = [] - labels.each do |label, _label_id| - values << if data.key?(label) - data[label] - else - gap_value - end - end - - values - end - - def init_labels - @labels = {} - end - - def labels - # NOTE: do not sort it, because color changes if user switch language - @labels.to_h - end - - def add_label(label, id) - return if @labels.key? label - - @labels[label] = id - end - end -end diff --git a/plugins/additionals/app/models/additionals_font_awesome.rb b/plugins/additionals/app/models/additionals_font_awesome.rb index a1e1622..2318b78 100755 --- a/plugins/additionals/app/models/additionals_font_awesome.rb +++ b/plugins/additionals/app/models/additionals_font_awesome.rb @@ -1,12 +1,12 @@ class AdditionalsFontAwesome include Redmine::I18n - FORMAT_REGEXP = /\Afa[rsb]_[a-zA-Z0-9]+[a-zA-Z0-9\-]*\z/.freeze - SEARCH_LIMIT = 50 - class << self def load_icons(type) - data = YAML.safe_load(ERB.new(IO.read(File.join(Additionals.plugin_dir, 'config', 'fontawesome_icons.yml'))).result) || {} + data = YAML.safe_load(ERB.new(IO.read(Rails.root.join('plugins', + 'additionals', + 'config', + 'fontawesome_icons.yml'))).result) || {} icons = {} data.each do |key, values| icons[key] = { unicode: values['unicode'], label: values['label'] } if values['styles'].include?(convert_type2style(type)) @@ -62,6 +62,12 @@ class AdditionalsFontAwesome FONTAWESOME_ICONS[type].collect { |fa_symbol, values| [values[:label], key2value(fa_symbol, type[-1])] } end + def json_for_select + [{ text: l(:label_fontawesome_regular), children: json_values(:far) }, + { text: l(:label_fontawesome_solid), children: json_values(:fas) }, + { text: l(:label_fontawesome_brands), children: json_values(:fab) }].to_json + end + # show only one value as current selected # (all other options are retrieved by select2 def active_option_for_select(selected) @@ -71,6 +77,12 @@ class AdditionalsFontAwesome [[info[:label], selected]] end + def options_for_select + [[l(:label_fontawesome_regular), select_values(:far)], + [l(:label_fontawesome_solid), select_values(:fas)], + [l(:label_fontawesome_brands), select_values(:fab)]] + end + def value_info(value, options = {}) return {} if value.blank? @@ -92,60 +104,8 @@ class AdditionalsFontAwesome info end - def search_for_select(search, selected = nil) - # could be more then one - selected_store = selected.to_s.split(',') - icons = search_in_type(:far, search, selected_store) - cnt = icons.count - return icons if cnt >= SEARCH_LIMIT - - icons += search_in_type(:fas, search, selected_store, cnt) - cnt = icons.count - return icons if cnt >= SEARCH_LIMIT - - icons + search_in_type(:fab, search, selected_store, cnt) - end - - def convert2mermaid(icon) - return if icon.blank? - - parts = icon.split('_') - return unless parts.count == 2 - - "#{parts.first}:fa-#{parts.last}" - end - private - def search_in_type(type, search, selected_store, cnt = 0) - icons = [] - - search_length = search.to_s.length - first_letter_search = if search_length == 1 - search[0].downcase - elsif search_length.zero? && selected_store.any? - selected = selected_store.first - fa = selected.split('_') - search = fa[1][0] if fa.count > 1 - search - end - - FONTAWESOME_ICONS[type].each do |fa_symbol, values| - break if SEARCH_LIMIT == cnt - - id = key2value(fa_symbol, type[-1]) - next if selected_store.exclude?(id) && - search.present? && - (first_letter_search.present? && !values[:label].downcase.start_with?(first_letter_search) || - first_letter_search.blank? && values[:label] !~ /#{search}/i) - - icons << { id: id, text: values[:label] } - cnt += 1 - end - - icons - end - def load_details(type, name) return {} unless FONTAWESOME_ICONS.key?(type) diff --git a/plugins/additionals/app/models/additionals_import.rb b/plugins/additionals/app/models/additionals_import.rb index f8d31a8..f5f081b 100755 --- a/plugins/additionals/app/models/additionals_import.rb +++ b/plugins/additionals/app/models/additionals_import.rb @@ -25,14 +25,16 @@ class AdditionalsImport < Import value = case v.custom_field.field_format when 'date' row_date(row, "cf_#{v.custom_field.id}") + when 'list' + row_value(row, "cf_#{v.custom_field.id}").try(:split, ',') else row_value(row, "cf_#{v.custom_field.id}") end next unless value h[v.custom_field.id.to_s] = - if value.is_a? Array - value.map { |val| v.custom_field.value_from_keyword(val.strip, object) }.flatten!&.compact + if value.is_a?(Array) + value.map { |val| v.custom_field.value_from_keyword(val.strip, object) }.compact.flatten else v.custom_field.value_from_keyword(value, object) end diff --git a/plugins/additionals/app/models/additionals_info.rb b/plugins/additionals/app/models/additionals_info.rb deleted file mode 100644 index b4691b3..0000000 --- a/plugins/additionals/app/models/additionals_info.rb +++ /dev/null @@ -1,73 +0,0 @@ -class AdditionalsInfo - include Redmine::I18n - - class << self - def system_infos - { system_info: { label: l(:label_system_info), value: system_info }, - system_uptime: { label: l(:label_uptime), value: system_uptime } } - end - - def system_info - if windows_platform? - win_info = `wmic os get Caption,CSDVersion,BuildNumber /value` - return 'unknown' if win_info.blank? - - windows_version = '' - windows_build = '' - build_names = %w[BuildNumber CSDVersion] - win_info.split(/\n+/).each do |line| - line_info = line.split '=' - if line_info[0] == 'Caption' - windows_version = line_info[1] - elsif build_names.include?(line_info[0]) && line_info[1]&.present? - windows_build = line_info[1] - end - end - "#{windows_version} build #{windows_build}" - else - `uname -a` - end - end - - def system_uptime(format: :time_tag) - if windows_platform? - `net stats srv | find "Statist"` - elsif File.exist? '/proc/uptime' - secs = `cat /proc/uptime`.to_i - min = 0 - hours = 0 - days = 0 - if secs.positive? - min = (secs / 60).round - hours = (secs / 3_600).round - days = (secs / 86_400).round - end - if days >= 1 - "#{days} #{l(:days, count: days)}" - elsif hours >= 1 - "#{hours} #{l(:hours, count: hours)}" - else - "#{min} #{l(:minutes, count: min)}" - end - else - # this should be work on macOS - seconds = `sysctl -n kern.boottime | awk '{print $4}'`.tr ',', '' - so = DateTime.strptime seconds.strip, '%s' - if so.present? - if format == :datetime - so - else - ApplicationController.helpers.time_tag so - end - else - days = `uptime | awk '{print $3}'`.to_i.round - "#{days} #{l(:days, count: days)}" - end - end - end - - def windows_platform? - /cygwin|mswin|mingw|bccwin|wince|emx/.match? RUBY_PLATFORM - end - end -end diff --git a/plugins/additionals/app/models/additionals_journal.rb b/plugins/additionals/app/models/additionals_journal.rb deleted file mode 100644 index e6cc255..0000000 --- a/plugins/additionals/app/models/additionals_journal.rb +++ /dev/null @@ -1,71 +0,0 @@ -class AdditionalsJournal - class << self - def save_journal_history(journal, prop_key, ids_old, ids) - ids_all = (ids_old + ids).uniq - - ids_all.each do |id| - next if ids_old.include?(id) && ids.include?(id) - - if ids.include?(id) - value = id - old_value = nil - else - old_value = id - value = nil - end - - journal.details << JournalDetail.new(property: 'attr', - prop_key: prop_key, - old_value: old_value, - value: value) - journal.save - end - - true - end - - def validate_relation(entries, entry_id) - old_entries = entries.select { |entry| entry.id.present? } - new_entries = entries.select { |entry| entry.id.blank? } - return true if new_entries.blank? - - new_entries.map! { |entry| entry.send(entry_id) } - return false if new_entries.count != new_entries.uniq.count - - old_entries.map! { |entry| entry.send(entry_id) } - return false unless (old_entries & new_entries).count.zero? - - true - end - - # Preloads visible last notes for a collection of entity - # this is a copy of Issue.load_visible_last_notes, but usable for all entities - # @see https://www.redmine.org/projects/redmine/repository/entry/trunk/app/models/issue.rb#L1214 - def load_visible_last_notes(entries, entity, user = User.current) - return unless entries.any? - - ids = entries.map(&:id) - - journal_class = (entity == Issue ? Journal : "#{entity}Journal").constantize - journal_ids = journal_class.joins(entity.name.underscore.to_sym => :project) - .where(journalized_type: entity.to_s, journalized_id: ids) - .where(journal_class.visible_notes_condition(user, skip_pre_condition: true)) - .where.not(notes: '') - .group(:journalized_id) - .maximum(:id) - .values - - journals = Journal.where(id: journal_ids).to_a - - entries.each do |entry| - journal = journals.detect { |j| j.journalized_id == entry.id } - entry.instance_variable_set('@last_notes', journal.try(:notes) || '') - end - end - - def set_relation_detail(entity, detail, value_key) - value = detail.send value_key - detail[value_key] = (entity.find_by(id: value) || value) if value.present? - end - end -end diff --git a/plugins/additionals/app/models/additionals_macro.rb b/plugins/additionals/app/models/additionals_macro.rb index b571892..990dc26 100755 --- a/plugins/additionals/app/models/additionals_macro.rb +++ b/plugins/additionals/app/models/additionals_macro.rb @@ -62,7 +62,7 @@ class AdditionalsMacro permission: :view_contacts }, { list: %i[db db_query db_tag db_tag_count], permission: :view_db_entries }, - { list: %i[child_pages last_updated_at last_updated_by lastupdated_at lastupdated_by + { list: %i[child_pages calendar last_updated_at last_updated_by lastupdated_at lastupdated_by new_page recently_updated recent comments comment_form tags taggedpages tagcloud show_count count vote show_vote terms_accept terms_reject], permission: :view_wiki_pages, diff --git a/plugins/additionals/app/models/additionals_query.rb b/plugins/additionals/app/models/additionals_query.rb index e9d773e..fea2f0f 100755 --- a/plugins/additionals/app/models/additionals_query.rb +++ b/plugins/additionals/app/models/additionals_query.rb @@ -1,241 +1,150 @@ module AdditionalsQuery - def column_with_prefix?(prefix) - columns.detect { |c| c.name.to_s.start_with?("#{prefix}.") }.present? + def self.included(base) + base.send :include, InstanceMethods end - def available_column_names(options = {}) - names = available_columns.dup - names.flatten! - names.select! { |col| col.sortable.present? } if options[:only_sortable] - names.map(&:name) - end - - def sql_for_enabled_module(table_field, module_names) - module_names = Array(module_names) - - sql = [] - module_names.each do |module_name| - sql << "EXISTS(SELECT 1 FROM #{EnabledModule.table_name} WHERE #{EnabledModule.table_name}.project_id=#{table_field}" \ - " AND #{EnabledModule.table_name}.name='#{module_name}')" - end - - sql.join(' AND ') - end - - def fix_sql_for_text_field(field, operator, value, table_name = nil, target_field = nil) - table_name = queried_table_name if table_name.blank? - target_field = field if target_field.blank? - - sql = [] - sql << "(#{sql_for_field(field, operator, value, table_name, target_field)})" - sql << "#{table_name}.#{target_field} != ''" if operator == '*' - - sql.join(' AND ') - end - - def initialize_ids_filter(options = {}) - if options[:label] - add_available_filter 'ids', type: :integer, label: options[:label] - else - add_available_filter 'ids', type: :integer, name: '#' - end - end - - def sql_for_ids_field(_field, operator, value) - if operator == '=' - # accepts a comma separated list of ids - ids = value.first.to_s.scan(/\d+/).map(&:to_i) - if ids.present? - "#{queried_table_name}.id IN (#{ids.join ','})" + module InstanceMethods + def initialize_ids_filter(options = {}) + if options[:label] + add_available_filter 'ids', type: :integer, label: options[:label] else - '1=0' + add_available_filter 'ids', type: :integer, name: '#' end - else - sql_for_field 'id', operator, value, queried_table_name, 'id' end - end - def sql_for_project_identifier_field(field, operator, values) - value = values.first - values = value.split(',').map(&:strip) if ['=', '!'].include?(operator) && value.include?(',') - sql_for_field field, operator, values, Project.table_name, 'identifier' - end + def sql_for_ids_field(_field, operator, value) + if operator == '=' + # accepts a comma separated list of ids + ids = value.first.to_s.scan(/\d+/).map(&:to_i) + if ids.present? + "#{queried_table_name}.id IN (#{ids.join(',')})" + else + '1=0' + end + else + sql_for_field('id', operator, value, queried_table_name, 'id') + end + end - def sql_for_project_status_field(field, operator, value) - sql_for_field field, operator, value, Project.table_name, 'status' - end + def initialize_project_filter(options = {}) + if project.nil? + add_available_filter('project_id', order: options[:position], + type: :list, + values: -> { project_values }) + end + return if project.nil? || project.leaf? || subproject_values.empty? - def initialize_project_identifier_filter - return if project + add_available_filter('subproject_id', order: options[:position], + type: :list_subprojects, + values: -> { subproject_values }) + end - add_available_filter 'project.identifier', - type: :string, - name: l(:label_attribute_of_project, name: l(:field_identifier)) - end + def initialize_created_filter(options = {}) + add_available_filter 'created_on', order: options[:position], + type: :date_past, + label: options[:label].presence + end - def initialize_project_status_filter - return if project + def initialize_updated_filter(options = {}) + add_available_filter 'updated_on', order: options[:position], + type: :date_past, + label: options[:label].presence + end - add_available_filter 'project.status', - type: :list, - name: l(:label_attribute_of_project, name: l(:field_status)), - values: -> { project_statuses_values } - end + def initialize_tags_filter(options = {}) + values = if project + queried_class.available_tags(project: project.id) + else + queried_class.available_tags + end + return if values.blank? - def initialize_project_filter(options = {}) - if project.nil? || options[:always] - add_available_filter 'project_id', order: options[:position], + add_available_filter 'tags', order: options[:position], + type: :list, + values: values.collect { |t| [t.name, t.name] } + end + + def initialize_author_filter(options = {}) + return if author_values.empty? + + add_available_filter('author_id', order: options[:position], + type: :list_optional, + values: options[:no_lambda].nil? ? author_values : -> { author_values }) + end + + def initialize_assignee_filter(options = {}) + return if author_values.empty? + + add_available_filter('assigned_to_id', order: options[:position], + type: :list_optional, + values: options[:no_lambda] ? author_values : -> { author_values }) + end + + def initialize_watcher_filter(options = {}) + return if watcher_values.empty? || !User.current.logged? + + add_available_filter('watcher_id', order: options[:position], type: :list, - values: -> { project_values } + values: options[:no_lambda] ? watcher_values : -> { watcher_values }) end - return if project.nil? || project.leaf? || subproject_values.empty? - add_available_filter 'subproject_id', order: options[:position], - type: :list_subprojects, - values: -> { subproject_values } - end - - def initialize_created_filter(options = {}) - add_available_filter 'created_on', order: options[:position], - type: :date_past, - label: options[:label].presence - end - - def initialize_updated_filter(options = {}) - add_available_filter 'updated_on', order: options[:position], - type: :date_past, - label: options[:label].presence - end - - def initialize_tags_filter(options = {}) - add_available_filter 'tags', order: options[:position], - type: :list_optional, - values: -> { tag_values(project) } - end - - def initialize_approved_filter - add_available_filter 'approved', - type: :list, - values: [[l(:label_hrm_approved), '1'], - [l(:label_hrm_not_approved), '0'], - [l(:label_hrm_to_approval), '2'], - [l(:label_hrm_without_approval), '3']], - label: :field_approved - end - - def initialize_author_filter(options = {}) - add_available_filter 'author_id', order: options[:position], - type: :list_optional, - values: -> { author_values } - end - - def initialize_assignee_filter(options = {}) - add_available_filter 'assigned_to_id', order: options[:position], - type: :list_optional, - values: -> { assigned_to_all_values } - end - - def initialize_watcher_filter(options = {}) - return unless User.current.logged? - - add_available_filter 'watcher_id', order: options[:position], - type: :list, - values: -> { watcher_values } - end - - def tag_values(project) - values = if project - queried_class.available_tags project: project.id - else - queried_class.available_tags - end - - return [] if values.blank? - - values.collect { |t| [t.name, t.name] } - end - - # issue independend values. Use assigned_to_values from Redmine, if you want it only for issues - def assigned_to_all_values - assigned_to_values = [] - assigned_to_values << ["<< #{l :label_me} >>", 'me'] if User.current.logged? - assigned_to_values += principals.sort_by(&:status).collect { |s| [s.name, s.id.to_s, l("status_#{User::LABEL_BY_STATUS[s.status]}")] } - - assigned_to_values - end - - def watcher_values - watcher_values = [["<< #{l :label_me} >>", 'me']] - watcher_values += users.collect { |s| [s.name, s.id.to_s] } if User.current.allowed_to?(:manage_public_queries, project, global: true) - watcher_values - end - - def sql_for_watcher_id_field(field, operator, value) - watchable_type = queried_class == User ? 'Principal' : queried_class.to_s - - db_table = Watcher.table_name - "#{queried_table_name}.id #{operator == '=' ? 'IN' : 'NOT IN'}" \ - " (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='#{watchable_type}' AND" \ - " #{sql_for_field field, '=', value, db_table, 'user_id'})" - end - - def sql_for_tags_field(field, _operator, value) - AdditionalTags.sql_for_tags_field queried_class, operator_for(field), value - end - - def sql_for_is_private_field(_field, operator, value) - if bool_operator(operator, value) - return '' if value.count > 1 - - "#{queried_table_name}.is_private = #{self.class.connection.quoted_true}" - else - return '1=0' if value.count > 1 - - "#{queried_table_name}.is_private = #{self.class.connection.quoted_false}" + def watcher_values + watcher_values = [["<< #{l(:label_me)} >>", 'me']] + watcher_values += users.collect { |s| [s.name, s.id.to_s] } if User.current.allowed_to?(:manage_public_queries, project, global: true) + watcher_values end - end - # use for list fields with to values 1 (true) and 0 (false) - def bool_operator(operator, values) - operator == '=' && values.first == '1' || operator != '=' && values.first != '1' - end + def sql_for_watcher_id_field(field, operator, value) + watchable_type = queried_class == User ? 'Principal' : queried_class.to_s - # use for list - def bool_values - [[l(:general_text_yes), '1'], [l(:general_text_no), '0']] - end + db_table = Watcher.table_name + "#{queried_table_name}.id #{operator == '=' ? 'IN' : 'NOT IN'} + (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='#{watchable_type}' AND " + + sql_for_field(field, '=', value, db_table, 'user_id') + ')' + end - def query_count - objects_scope.count - rescue ::ActiveRecord::StatementInvalid => e - raise queried_class::StatementInvalid, e.message if defined? queried_class::StatementInvalid + def sql_for_tags_field(field, _operator, value) + AdditionalsTag.sql_for_tags_field(queried_class, operator_for(field), value) + end - raise ::Query::StatementInvalid, e.message - end + def sql_for_is_private_field(_field, operator, value) + if bool_operator(operator, value) + return '1=1' if value.count > 1 - def results_scope(options = {}) - order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten!.to_a.reject(&:blank?) + "#{queried_table_name}.is_private = #{self.class.connection.quoted_true}" + else + return '1=0' if value.count > 1 - objects_scope(options) - .order(order_option) - .joins(joins_for_order_statement(order_option.join(','))) - .limit(options[:limit]) - .offset(options[:offset]) - rescue ::ActiveRecord::StatementInvalid => e - raise queried_class::StatementInvalid, e.message if defined? queried_class::StatementInvalid - - raise ::Query::StatementInvalid, e.message - end - - def grouped_name_for(group_name, replace_fields = {}) - return unless group_name - - if grouped? && group_by_column.present? - replace_fields.each do |field, new_name| - return new_name.presence || group_name if group_by_column.name == field + "#{queried_table_name}.is_private = #{self.class.connection.quoted_false}" end end - group_name + # use for list fields with to values 1 (true) and 0 (false) + def bool_operator(operator, values) + operator == '=' && values.first == '1' || operator != '=' && values.first != '1' + end + + # use for list + def bool_values + [[l(:general_text_yes), '1'], [l(:general_text_no), '0']] + end + + def query_count + objects_scope.count + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid, e.message + end + + def results_scope(options = {}) + order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) + + objects_scope(options) + .order(order_option) + .joins(joins_for_order_statement(order_option.join(','))) + .limit(options[:limit]) + .offset(options[:offset]) + rescue ::ActiveRecord::StatementInvalid => e + raise StatementInvalid, e.message + end end end diff --git a/plugins/additionals/app/models/additionals_tag.rb b/plugins/additionals/app/models/additionals_tag.rb new file mode 100755 index 0000000..f30e559 --- /dev/null +++ b/plugins/additionals/app/models/additionals_tag.rb @@ -0,0 +1,70 @@ +class AdditionalsTag + TAG_TABLE_NAME = RedmineCrm::Tag.table_name if defined? RedmineCrm + TAGGING_TABLE_NAME = RedmineCrm::Tagging.table_name if defined? RedmineCrm + PROJECT_TABLE_NAME = Project.table_name + + def self.get_available_tags(klass, options = {}) + scope = RedmineCrm::Tag.where({}) + scope = scope.where("#{PROJECT_TABLE_NAME}.id = ?", options[:project]) if options[:project] + if options[:permission] + scope = scope.where(tag_access(options[:permission])) + elsif options[:visible_condition] + scope = scope.where(klass.visible_condition(User.current)) + end + scope = scope.where("LOWER(#{TAG_TABLE_NAME}.name) LIKE ?", "%#{options[:name_like].downcase}%") if options[:name_like] + scope = scope.where("#{TAG_TABLE_NAME}.name=?", options[:name]) if options[:name] + scope = scope.where("#{TAGGING_TABLE_NAME}.taggable_id!=?", options[:exclude_id]) if options[:exclude_id] + scope = scope.where(options[:where_field] => options[:where_value]) if options[:where_field].present? && options[:where_value] + + scope = scope.select("#{TAG_TABLE_NAME}.*, COUNT(DISTINCT #{TAGGING_TABLE_NAME}.taggable_id) AS count") + scope = scope.joins(tag_joins(klass, options)) + scope = scope.group("#{TAG_TABLE_NAME}.id, #{TAG_TABLE_NAME}.name").having('COUNT(*) > 0') + scope = scope.order("#{TAG_TABLE_NAME}.name") + scope + end + + def self.tag_joins(klass, options = {}) + table_name = klass.table_name + + joins = ["JOIN #{TAGGING_TABLE_NAME} ON #{TAGGING_TABLE_NAME}.tag_id = #{TAG_TABLE_NAME}.id"] + joins << "JOIN #{table_name} " \ + "ON #{table_name}.id = #{TAGGING_TABLE_NAME}.taggable_id AND #{TAGGING_TABLE_NAME}.taggable_type = '#{klass}'" + + if options[:project_join] + joins << options[:project_join] + elsif options[:project] || !options[:without_projects] + joins << "JOIN #{PROJECT_TABLE_NAME} ON #{table_name}.project_id = #{PROJECT_TABLE_NAME}.id" + end + + joins + end + + def self.tag_access(permission) + projects_allowed = if permission.nil? + Project.visible.pluck(:id) + else + Project.where(Project.allowed_to_condition(User.current, permission)).pluck(:id) + end + + if projects_allowed.present? + "#{PROJECT_TABLE_NAME}.id IN (#{projects_allowed.join(',')})" unless projects_allowed.empty? + else + '1=0' + end + end + + def self.remove_unused_tags + unused = RedmineCrm::Tag.find_by_sql(<<-SQL) + SELECT * FROM tags WHERE id NOT IN ( + SELECT DISTINCT tag_id FROM taggings + ) + SQL + unused.each(&:destroy) + end + + def self.sql_for_tags_field(klass, operator, value) + compare = operator.eql?('=') ? 'IN' : 'NOT IN' + ids_list = klass.tagged_with(value).collect(&:id).push(0).join(',') + "( #{klass.table_name}.id #{compare} (#{ids_list}) ) " + end +end diff --git a/plugins/additionals/app/models/dashboard.rb b/plugins/additionals/app/models/dashboard.rb deleted file mode 100644 index 41b5efe..0000000 --- a/plugins/additionals/app/models/dashboard.rb +++ /dev/null @@ -1,430 +0,0 @@ -class Dashboard < ActiveRecord::Base - include Redmine::I18n - include Redmine::SafeAttributes - include Additionals::EntityMethods - - class SystemDefaultChangeException < StandardError; end - - class ProjectSystemDefaultChangeException < StandardError; end - - belongs_to :project - belongs_to :author, class_name: 'User' - - # current active project (belongs_to :project can be nil, because this is system default) - attr_accessor :content_project - - serialize :options - - has_many :dashboard_roles, dependent: :destroy - has_many :roles, through: :dashboard_roles - - VISIBILITY_PRIVATE = 0 - VISIBILITY_ROLES = 1 - VISIBILITY_PUBLIC = 2 - - scope :by_project, (->(project_id) { where(project_id: project_id) if project_id.present? }) - scope :sorted, (-> { order("#{Dashboard.table_name}.name") }) - scope :welcome_only, (-> { where(dashboard_type: DashboardContentWelcome::TYPE_NAME) }) - scope :project_only, (-> { where(dashboard_type: DashboardContentProject::TYPE_NAME) }) - - safe_attributes 'name', 'description', 'enable_sidebar', - 'always_expose', 'project_id', 'author_id', - if: (lambda do |dashboard, user| - dashboard.new_record? || - user.allowed_to?(:save_dashboards, dashboard.project, global: true) - end) - - safe_attributes 'dashboard_type', - if: (lambda do |dashboard, _user| - dashboard.new_record? - end) - - safe_attributes 'visibility', 'role_ids', - if: (lambda do |dashboard, user| - user.allowed_to?(:share_dashboards, dashboard.project, global: true) || - user.allowed_to?(:set_system_dashboards, dashboard.project, global: true) - end) - - safe_attributes 'system_default', - if: (lambda do |dashboard, user| - user.allowed_to?(:set_system_dashboards, dashboard.project, global: true) - end) - - before_save :dashboard_type_check, :visibility_check, :set_options_hash, :clear_unused_block_settings - - before_destroy :check_destroy_system_default - after_save :update_system_defaults - after_save :remove_unused_role_relations - - validates :name, :dashboard_type, :author, :visibility, presence: true - validates :visibility, inclusion: { in: [VISIBILITY_PUBLIC, VISIBILITY_ROLES, VISIBILITY_PRIVATE] } - validate :validate_roles - validate :validate_visibility - validate :validate_name - validate :validate_system_default - validate :validate_project_system_default - - class << self - def system_default(dashboard_type) - select(:id).find_by(dashboard_type: dashboard_type, system_default: true) - .try(:id) - end - - def default(dashboard_type, project = nil, user = User.current) - recently_id = User.current.pref.recently_used_dashboard dashboard_type, project - - scope = where(dashboard_type: dashboard_type) - scope = scope.where(project_id: project.id).or(scope.where(project_id: nil)) if project.present? - - dashboard = scope.visible.find_by(id: recently_id) if recently_id.present? - - if dashboard.blank? - scope = scope.where(system_default: true).or(scope.where(author_id: user.id)) - dashboard = scope.order(system_default: :desc, project_id: :desc, id: :asc).first - - if recently_id.present? - Rails.logger.debug 'default cleanup required' - # Remove invalid recently_id - if project.present? - User.current.pref.recently_used_dashboards[dashboard_type].delete(project.id) - else - User.current.pref.recently_used_dashboards[dashboard_type] = nil - end - end - end - - dashboard - end - - def fields_for_order_statement(table = nil) - table ||= table_name - ["#{table}.name"] - end - - def visible(user = User.current, options = {}) - scope = left_outer_joins :project - scope = scope.where(projects: { id: nil }).or(scope.where(Project.allowed_to_condition(user, :view_project, options))) - - if user.admin? - scope.where.not(visibility: VISIBILITY_PRIVATE).or(scope.where(author_id: user.id)) - elsif user.memberships.any? - scope.where("#{table_name}.visibility = ?" \ - " OR (#{table_name}.visibility = ? AND #{table_name}.id IN (" \ - "SELECT DISTINCT d.id FROM #{table_name} d" \ - " INNER JOIN #{table_name_prefix}dashboard_roles#{table_name_suffix} dr ON dr.dashboard_id = d.id" \ - " INNER JOIN #{MemberRole.table_name} mr ON mr.role_id = dr.role_id" \ - " INNER JOIN #{Member.table_name} m ON m.id = mr.member_id AND m.user_id = ?" \ - " INNER JOIN #{Project.table_name} p ON p.id = m.project_id AND p.status <> ?" \ - ' WHERE d.project_id IS NULL OR d.project_id = m.project_id))' \ - " OR #{table_name}.author_id = ?", - VISIBILITY_PUBLIC, - VISIBILITY_ROLES, - user.id, - Project::STATUS_ARCHIVED, - user.id) - elsif user.logged? - scope.where(visibility: VISIBILITY_PUBLIC).or(scope.where(author_id: user.id)) - else - scope.where visibility: VISIBILITY_PUBLIC - end - end - end - - def initialize(attributes = nil, *args) - super - set_options_hash - end - - def set_options_hash - self.options ||= {} - end - - def [](attr_name) - if has_attribute? attr_name - super - else - options ? options[attr_name] : nil - end - end - - def []=(attr_name, value) - if has_attribute? attr_name - super - else - h = (self[:options] || {}).dup - h.update(attr_name => value) - self[:options] = h - value - end - end - - # Returns true if the dashboard is visible to +user+ or the current user. - def visible?(user = User.current) - return true if user.admin? - return false unless project.nil? || user.allowed_to?(:view_project, project) - return true if user == author - - case visibility - when VISIBILITY_PUBLIC - true - when VISIBILITY_ROLES - if project - (user.roles_for_project(project) & roles).any? - else - user.memberships.joins(:member_roles).where(member_roles: { role_id: roles.map(&:id) }).any? - end - end - end - - def content - @content ||= "DashboardContent#{dashboard_type[0..-10]}".constantize.new(project: content_project.presence || project) - end - - def available_groups - content.groups - end - - def layout - self[:layout] ||= content.default_layout.deep_dup - end - - def layout=(arg) - self[:layout] = arg - end - - def layout_settings(block = nil) - s = self[:layout_settings] ||= {} - if block - s[block] ||= {} - else - s - end - end - - def layout_settings=(arg) - self[:layout_settings] = arg - end - - def remove_block(block) - block = block.to_s.underscore - layout.each_key do |group| - layout[group].delete block - end - layout - end - - # Adds block to the user page layout - # Returns nil if block is not valid or if it's already - # present in the user page layout - def add_block(block) - block = block.to_s.underscore - return unless content.valid_block? block, layout.values.flatten - - remove_block block - # add it to the first group - # add it to the first group - group = available_groups.first - layout[group] ||= [] - layout[group].unshift block - end - - # Sets the block order for the given group. - # Example: - # preferences.order_blocks('left', ['issueswatched', 'news']) - def order_blocks(group, blocks) - group = group.to_s - return if content.groups.exclude?(group) || blocks.blank? - - blocks = blocks.map(&:underscore) & layout.values.flatten - blocks.each { |block| remove_block(block) } - layout[group] = blocks - end - - def update_block_settings(block, settings) - block = block.to_s - block_settings = layout_settings(block).merge(settings.symbolize_keys) - layout_settings[block] = block_settings - end - - def private?(user = User.current) - author_id == user.id && visibility == VISIBILITY_PRIVATE - end - - def public? - visibility != VISIBILITY_PRIVATE - end - - def editable_by?(usr = User.current, prj = nil) - prj ||= project - usr && (usr.admin? || - (author == usr && usr.allowed_to?(:save_dashboards, prj, global: true))) - end - - def editable?(usr = User.current) - @editable ||= editable_by?(usr) - end - - def destroyable_by?(usr = User.current) - return unless editable_by? usr, project - - return !system_default_was if dashboard_type != DashboardContentProject::TYPE_NAME - - # project dashboards needs special care - project.present? || !system_default_was - end - - def destroyable? - @destroyable ||= destroyable_by?(User.current) - end - - def to_s - name - end - - # Returns a string of css classes that apply to the entry - def css_classes(user = User.current) - s = ['dashboard'] - s << 'created-by-me' if author_id == user.id - s.join(' ') - end - - def allowed_target_projects(user = User.current) - Project.where Project.allowed_to_condition(user, :save_dashboards) - end - - # this is used to get unique cache for blocks - def async_params(block, options, settings = {}) - if block.blank? - msg = 'block is missing for dashboard_async' - Rails.log.error msg - raise msg - end - - config = { dashboard_id: id, - block: block } - - if !options.key?(:skip_user_id) || !options[:skip_user_id] - settings[:user_id] = User.current.id - settings[:user_is_admin] = User.current.admin? - end - - if settings.present? - settings.each do |key, setting| - settings[key] = setting.reject(&:blank?).join(',') if setting.is_a? Array - - next if options[:exposed_params].blank? - - options[:exposed_params].each do |exposed_param| - if key == exposed_param - config[key] = settings[key] - settings.delete key - end - end - end - - unique_params = settings.flatten - unique_params += options[:unique_params].reject(&:blank?) if options[:unique_params].present? - - # Rails.logger.debug "debug async_params for #{block}: unique_params=#{unique_params.inspect}" - config[:unique_key] = Digest::SHA256.hexdigest(unique_params.join('_')) - end - - # Rails.logger.debug "debug async_params for #{block}: config=#{config.inspect}" - - config - end - - def project_id_can_change? - return true if new_record? || - dashboard_type != DashboardContentProject::TYPE_NAME || - !system_default_was || - project_id_was.present? - end - - private - - def clear_unused_block_settings - blocks = layout.values.flatten - layout_settings.keep_if { |block, _settings| blocks.include?(block) } - end - - def remove_unused_role_relations - return if !saved_change_to_visibility? || visibility == VISIBILITY_ROLES - - roles.clear - end - - def validate_roles - return if visibility != VISIBILITY_ROLES || roles.present? - - errors.add(:base, - [l(:label_role_plural), l('activerecord.errors.messages.blank')].join(' ')) - end - - def validate_system_default - return if new_record? || - system_default_was == system_default || - system_default? || - project_id.present? - - raise SystemDefaultChangeException - end - - def validate_project_system_default - return if project_id_can_change? - - raise ProjectSystemDefaultChangeException if project_id.present? - end - - def check_destroy_system_default - raise 'It is not allowed to delete dashboard, which is system default' unless destroyable? - end - - def dashboard_type_check - self.project_id = nil if dashboard_type == DashboardContentWelcome::TYPE_NAME - end - - def update_system_defaults - return unless system_default? && User.current.allowed_to?(:set_system_dashboards, project, global: true) - - scope = self.class - .where(dashboard_type: dashboard_type) - .where.not(id: id) - - scope = scope.where(project: project) if dashboard_type == DashboardContentProject::TYPE_NAME - - scope.update_all system_default: false - end - - # check if permissions changed and dashboard settings have to be corrected - def visibility_check - user = User.current - - return if system_default? || - user.allowed_to?(:share_dashboards, project, global: true) || - user.allowed_to?(:set_system_dashboards, project, global: true) - - # change to private - self.visibility = VISIBILITY_PRIVATE - end - - def validate_visibility - errors.add(:visibility, :must_be_for_everyone) if system_default? && visibility != VISIBILITY_PUBLIC - end - - def validate_name - return if name.blank? - - scope = self.class.visible.where(name: name) - if dashboard_type == DashboardContentProject::TYPE_NAME - scope = scope.project_only - scope = scope.where project_id: project_id - scope = scope.or(scope.where(project_id: nil)) if project_id.present? - else - scope = scope.welcome_only - end - - scope = scope.where.not(id: id) unless new_record? - errors.add(:name, :name_not_unique) if scope.count.positive? - end -end diff --git a/plugins/additionals/app/models/dashboard_content.rb b/plugins/additionals/app/models/dashboard_content.rb deleted file mode 100644 index 43005d7..0000000 --- a/plugins/additionals/app/models/dashboard_content.rb +++ /dev/null @@ -1,115 +0,0 @@ -class DashboardContent - include Redmine::I18n - - attr_accessor :user, :project - - MAX_MULTIPLE_OCCURS = 8 - DEFAULT_MAX_ENTRIES = 10 - RENDER_ASYNC_CACHE_EXPIRES_IN = 30 - - class << self - def types - descendants.map { |dc| dc::TYPE_NAME } - end - end - - def with_chartjs? - false - end - - def initialize(attr = {}) - self.user = attr[:user].presence || User.current - self.project = attr[:project].presence - end - - def groups - %w[top left right bottom] - end - - def block_definitions - { - 'issuequery' => { label: l(:label_query_with_name, l(:label_issue_plural)), - permission: :view_issues, - query_block: { - label: l(:label_issue_plural), - list_partial: 'issues/list', - class: IssueQuery, - link_helper: '_project_issues_path', - count_method: 'issue_count', - entries_method: 'issues', - entities_var: :issues, - with_project: true - }, - max_occurs: DashboardContent::MAX_MULTIPLE_OCCURS }, - 'text' => { label: l(:label_text_sync), - max_occurs: MAX_MULTIPLE_OCCURS, - partial: 'dashboards/blocks/text' }, - 'text_async' => { label: l(:label_text_async), - max_occurs: MAX_MULTIPLE_OCCURS, - async: { required_settings: %i[text], - partial: 'dashboards/blocks/text_async' } }, - 'news' => { label: l(:label_news_latest), - permission: :view_news }, - 'documents' => { label: l(:label_document_plural), - permission: :view_documents }, - 'my_spent_time' => { label: l(:label_my_spent_time), - permission: :log_time }, - 'feed' => { label: l(:label_additionals_feed), - max_occurs: DashboardContent::MAX_MULTIPLE_OCCURS, - async: { required_settings: %i[url], - cache_expires_in: 600, - skip_user_id: true, - partial: 'dashboards/blocks/feed' } } - } - end - - # Returns the available blocks - def available_blocks - return @available_blocks if defined? @available_blocks - - available_blocks = begin block_definitions.reject do |_block_name, block_specs| - block_specs.key?(:permission) && !user.allowed_to?(block_specs[:permission], project, global: true) || - block_specs.key?(:admin_only) && block_specs[:admin_only] && !user.admin? || - block_specs.key?(:if) && !block_specs[:if].call(project) - end - end - - @available_blocks = available_blocks.sort_by { |_k, v| v[:label] }.to_h - end - - def block_options(blocks_in_use = []) - options = [] - available_blocks.each do |block, block_options| - indexes = blocks_in_use.map do |n| - Regexp.last_match(2).to_i if n =~ /\A#{block}(__(\d+))?\z/ - end - indexes.compact! - - occurs = indexes.size - block_id = indexes.any? ? "#{block}__#{indexes.max + 1}" : block - disabled = (occurs >= (available_blocks[block][:max_occurs] || 1)) - block_id = nil if disabled - - options << [block_options[:label], block_id] - end - options - end - - def valid_block?(block, blocks_in_use = []) - block.present? && block_options(blocks_in_use).map(&:last).include?(block) - end - - def find_block(block) - block.to_s =~ /\A(.*?)(__\d+)?\z/ - name = Regexp.last_match(1) - available_blocks.key?(name) ? available_blocks[name].merge(name: name) : nil - end - - # Returns the default layout for a new dashboard - def default_layout - { - 'left' => ['legacy_left'], - 'right' => ['legacy_right'] - } - end -end diff --git a/plugins/additionals/app/models/dashboard_content_project.rb b/plugins/additionals/app/models/dashboard_content_project.rb deleted file mode 100644 index 9884135..0000000 --- a/plugins/additionals/app/models/dashboard_content_project.rb +++ /dev/null @@ -1,52 +0,0 @@ -class DashboardContentProject < DashboardContent - TYPE_NAME = 'ProjectDashboard'.freeze - - def block_definitions - blocks = super - - # legacy_left or legacy_right should not be moved to DashboardContent, - # because DashboardContent is used for areas in other plugins - blocks['legacy_left'] = { label: l(:label_dashboard_legacy_left), - no_settings: true } - - blocks['legacy_right'] = { label: l(:label_dashboard_legacy_right), - no_settings: true } - - blocks['projectinformation'] = { label: l(:label_project_information), - no_settings: true, - if: (lambda do |project| - project.description.present? || - project.homepage.present? || - project.visible_custom_field_values.any? { |o| o.value.present? } - end), - partial: 'dashboards/blocks/project_information' } - - blocks['projectissues'] = { label: l(:label_issues_summary), - no_settings: true, - permission: :view_issues, - partial: 'dashboards/blocks/project_issues' } - - blocks['projecttimeentries'] = { label: l(:label_time_tracking), - no_settings: true, - permission: :view_time_entries, - partial: 'dashboards/blocks/project_time_entries' } - - blocks['projectmembers'] = { label: l(:label_member_plural), - no_settings: true, - partial: 'projects/members_box' } - - blocks['projectsubprojects'] = { label: l(:label_subproject_plural), - no_settings: true, - partial: 'dashboards/blocks/project_subprojects' } - - blocks - end - - # Returns the default layout for a new dashboard - def default_layout - { - 'left' => %w[projectinformation projectissues projecttimeentries], - 'right' => %w[projectmembers projectsubprojects] - } - end -end diff --git a/plugins/additionals/app/models/dashboard_content_welcome.rb b/plugins/additionals/app/models/dashboard_content_welcome.rb deleted file mode 100644 index 0074c55..0000000 --- a/plugins/additionals/app/models/dashboard_content_welcome.rb +++ /dev/null @@ -1,33 +0,0 @@ -class DashboardContentWelcome < DashboardContent - TYPE_NAME = 'WelcomeDashboard'.freeze - - def block_definitions - blocks = super - - # legacy_left or legacy_right should not be moved to DashboardContent, - # because DashboardContent is used for areas in other plugins - blocks['legacy_left'] = { label: l(:label_dashboard_legacy_left), - no_settings: true } - - blocks['legacy_right'] = { label: l(:label_dashboard_legacy_right), - no_settings: true } - - blocks['welcome'] = { label: l(:setting_welcome_text), - no_settings: true, - partial: 'dashboards/blocks/welcome' } - - blocks['activity'] = { label: l(:label_activity), - async: { data_method: 'activity_dashboard_data', - partial: 'dashboards/blocks/activity' } } - - blocks - end - - # Returns the default layout for a new dashboard - def default_layout - { - 'left' => %w[welcome legacy_left], - 'right' => ['legacy_right'] - } - end -end diff --git a/plugins/additionals/app/models/dashboard_role.rb b/plugins/additionals/app/models/dashboard_role.rb deleted file mode 100644 index f174f50..0000000 --- a/plugins/additionals/app/models/dashboard_role.rb +++ /dev/null @@ -1,9 +0,0 @@ -class DashboardRole < ActiveRecord::Base - include Redmine::SafeAttributes - - belongs_to :dashboard - belongs_to :role - - validates :dashboard, :role, - presence: true -end diff --git a/plugins/additionals/app/overrides/account/register.rb b/plugins/additionals/app/overrides/account/register.rb new file mode 100755 index 0000000..3f804be --- /dev/null +++ b/plugins/additionals/app/overrides/account/register.rb @@ -0,0 +1,5 @@ +Deface::Override.new virtual_path: 'account/register', + name: 'add-invisble-captcha', + insert_top: 'div.box', + original: 'e64d82c46cc3322e4d953aa119d1e71e81854158', + partial: 'account/invisible_captcha' diff --git a/plugins/additionals/app/overrides/contacts/form.rb b/plugins/additionals/app/overrides/contacts/form.rb deleted file mode 100644 index 364e0bf..0000000 --- a/plugins/additionals/app/overrides/contacts/form.rb +++ /dev/null @@ -1,15 +0,0 @@ -unless Redmine::Plugin.installed? 'redmine_servicedesk' - if defined?(CONTACTS_VERSION_TYPE) && CONTACTS_VERSION_TYPE == 'PRO version' - Deface::Override.new virtual_path: 'contacts/_form', - name: 'contacts-pro-form-hook', - insert_bottom: 'div#contact_data', - original: 'df6cae24cfd26e5299c45c427fbbd4e5f23c313e', - partial: 'hooks/view_contacts_form' - else - Deface::Override.new virtual_path: 'contacts/_form', - name: 'contacts-form-hook', - insert_bottom: 'div#contact_data', - original: '217049684a0bcd7e404dc6b5b2348aae47ac8a72', - partial: 'hooks/view_contacts_form' - end -end diff --git a/plugins/additionals/app/overrides/custom_fields/formats.rb b/plugins/additionals/app/overrides/custom_fields/formats.rb deleted file mode 100644 index cc8014c..0000000 --- a/plugins/additionals/app/overrides/custom_fields/formats.rb +++ /dev/null @@ -1,6 +0,0 @@ -Deface::Override.new virtual_path: 'custom_fields/formats/_text', - name: 'custom_fields-formats-text', - replace: 'erb[silent]:contains(\'if @custom_field.class.name == "IssueCustomField"\')', - original: '5e0fbf8e8156bf1514cbada3dbaca9afc3c19bbb', - closing_selector: "erb[silent]:contains('end')", - partial: 'custom_fields/formats/additionals_text.html.slim' diff --git a/plugins/additionals/app/overrides/issues/edit.rb b/plugins/additionals/app/overrides/issues/edit.rb deleted file mode 100644 index 3cf7ae6..0000000 --- a/plugins/additionals/app/overrides/issues/edit.rb +++ /dev/null @@ -1,5 +0,0 @@ -Deface::Override.new virtual_path: 'issues/_edit', - name: 'edit-issue-permission', - replace: 'erb[silent]:contains("User.current.allowed_to?(:log_time, @project)")', - original: '98560fb12bb71f775f2a7fd1884c97f8cd632cd3', - text: '<% if User.current.allowed_to?(:log_time, @project) && @issue.log_time_allowed? %>' diff --git a/plugins/additionals/app/overrides/issues/list.rb b/plugins/additionals/app/overrides/issues/list.rb deleted file mode 100644 index 013f165..0000000 --- a/plugins/additionals/app/overrides/issues/list.rb +++ /dev/null @@ -1,5 +0,0 @@ -Deface::Override.new virtual_path: 'issues/_list', - name: 'list-issue-back-url', - replace: 'erb[loud]:contains("hidden_field_tag \'back_url\'")', - original: '6652d55078bb57ac4614e456b01f8a203b8096ec', - text: '<%= query_list_back_url_tag @project %>' diff --git a/plugins/additionals/app/overrides/issues/show.rb b/plugins/additionals/app/overrides/issues/show.rb index a04a3bc..deea066 100755 --- a/plugins/additionals/app/overrides/issues/show.rb +++ b/plugins/additionals/app/overrides/issues/show.rb @@ -1,10 +1,5 @@ -Deface::Override.new virtual_path: 'issues/_action_menu', - name: 'show-issue-log-time', - replace: 'erb[loud]:contains("User.current.allowed_to?(:log_time, @project)")', - original: '4bbf065b9f960687e07f76e7232eb21bf183a981', - partial: 'issues/additionals_action_menu_log_time' Deface::Override.new virtual_path: 'issues/_action_menu', name: 'add-issue-assign-to-me', insert_bottom: 'div.contextual', - original: '44ef032156db0dfdb67301fdb9ef8901abeca18a', + original: 'c0a30490bb9ac5c5644e674319f17e40c57034d8', partial: 'issues/additionals_action_menu' diff --git a/plugins/additionals/app/overrides/layouts/base.rb b/plugins/additionals/app/overrides/layouts/base.rb new file mode 100755 index 0000000..4a07080 --- /dev/null +++ b/plugins/additionals/app/overrides/layouts/base.rb @@ -0,0 +1,5 @@ +Deface::Override.new virtual_path: 'layouts/base', + name: 'add-body-header', + insert_before: 'div#wrapper', + original: '4af81ed701989727953cea2e376c9d83665d7eb2', + partial: 'additionals/global_body_header' diff --git a/plugins/additionals/app/overrides/reports/simple.rb b/plugins/additionals/app/overrides/reports/simple.rb deleted file mode 100644 index 12cb3ad..0000000 --- a/plugins/additionals/app/overrides/reports/simple.rb +++ /dev/null @@ -1,5 +0,0 @@ -Deface::Override.new virtual_path: 'reports/_simple', - name: 'report-simple-user-scope', - insert_before: 'erb[silent]:contains("rows.empty?")', - original: '0c85cc752700d7f2bf08b3b9b30f59d8eddc443b', - partial: 'reports/additionals_simple' diff --git a/plugins/additionals/app/overrides/roles/form.rb b/plugins/additionals/app/overrides/roles/form.rb index 163f3fe..e019ae2 100755 --- a/plugins/additionals/app/overrides/roles/form.rb +++ b/plugins/additionals/app/overrides/roles/form.rb @@ -1,5 +1,5 @@ Deface::Override.new virtual_path: 'roles/_form', name: 'roles-form-hide', insert_before: 'p.manage_members_shown', - original: '7413482e01a07b5615be1900b974fee87224cb47', + original: 'b2a317f49e0b65ae506c8871f0c2bcc3e8098766', partial: 'roles/additionals_form' diff --git a/plugins/additionals/app/overrides/users/show.rb b/plugins/additionals/app/overrides/users/show.rb index dbe63d8..0fe2973 100755 --- a/plugins/additionals/app/overrides/users/show.rb +++ b/plugins/additionals/app/overrides/users/show.rb @@ -1,12 +1,10 @@ -unless Redmine::Plugin.installed? 'redmine_hrm' - Deface::Override.new virtual_path: 'users/show', - name: 'user-show-info-hook', - insert_top: 'div.splitcontentleft ul:first-child', - original: '743d616ab7942bb6bc65bd00626b6a5143247a37', - partial: 'hooks/view_users_show_info' - Deface::Override.new virtual_path: 'users/show', - name: 'user-contextual-hook', - insert_bottom: 'div.contextual', - original: '9d6a7ad6ba0addc68c6b4f6c3b868511bc8eb542', - partial: 'hooks/view_users_show_contextual' -end +Deface::Override.new virtual_path: 'users/show', + name: 'user-show-info-hook', + insert_top: 'div.splitcontentleft ul:first-child', + original: 'aff8d775275e3f33cc45d72b8e2896144be4beff', + partial: 'hooks/view_users_show' +Deface::Override.new virtual_path: 'users/show', + name: 'user-contextual-hook', + insert_bottom: 'div.contextual', + original: '9d6a7ad6ba0addc68c6b4f6c3b868511bc8eb542', + partial: 'hooks/view_users_contextual' diff --git a/plugins/additionals/app/overrides/welcome/index.rb b/plugins/additionals/app/overrides/welcome/index.rb new file mode 100755 index 0000000..42ad6c3 --- /dev/null +++ b/plugins/additionals/app/overrides/welcome/index.rb @@ -0,0 +1,15 @@ +Deface::Override.new virtual_path: 'welcome/index', + name: 'add-welcome-bottom-content', + insert_after: 'div.splitcontentright', + original: 'dd470844bcaa4d7c9dc66e70e6c0c843d42969bf', + partial: 'welcome/overview_bottom' +Deface::Override.new virtual_path: 'welcome/index', + name: 'add-welcome-top-content', + insert_before: 'div.splitcontentleft', + original: 'e7de0a2e88c5ccb4d1feb7abac239e4b669babed', + partial: 'welcome/overview_top' +Deface::Override.new virtual_path: 'welcome/index', + name: 'remove-welcome-news', + replace: 'div.news', + original: '163f5df8f0cb2d5009d7f57ad38174ed29201a1a', + partial: 'welcome/overview_news' diff --git a/plugins/additionals/app/overrides/wiki/edit.rb b/plugins/additionals/app/overrides/wiki/edit.rb deleted file mode 100644 index ae9be74..0000000 --- a/plugins/additionals/app/overrides/wiki/edit.rb +++ /dev/null @@ -1,5 +0,0 @@ -Deface::Override.new virtual_path: 'wiki/edit', - name: 'wiki-edit-bottom', - insert_before: 'fieldset', - original: 'ededb6cfd5adfe8a9723d00ce0ee23575c7cc44c', - partial: 'hooks/view_wiki_form_bottom' diff --git a/plugins/additionals/app/overrides/wiki/show.rb b/plugins/additionals/app/overrides/wiki/show.rb old mode 100644 new mode 100755 index bb13ae0..4ce41f4 --- a/plugins/additionals/app/overrides/wiki/show.rb +++ b/plugins/additionals/app/overrides/wiki/show.rb @@ -1,5 +1,5 @@ Deface::Override.new virtual_path: 'wiki/show', - name: 'wiki-show-bottom', - insert_before: 'p.wiki-update-info', - original: 'd9f52aa98f1cb335314570d3f5403690f1b29145', - partial: 'hooks/view_wiki_show_bottom' + name: 'addto-wiki-show', + insert_before: 'div.contextual', + original: '6b0cb1646d5e2cb23feee1805949e266036581e6', + partial: 'wiki/show_additionals' diff --git a/plugins/additionals/app/overrides/wiki/sidebar.rb b/plugins/additionals/app/overrides/wiki/sidebar.rb new file mode 100755 index 0000000..3db5655 --- /dev/null +++ b/plugins/additionals/app/overrides/wiki/sidebar.rb @@ -0,0 +1,5 @@ +Deface::Override.new virtual_path: 'wiki/_sidebar', + name: 'addto-wiki-sidebar', + insert_after: 'ul', + original: '07a5375c015a7d96826c9977c4d8889c4a98bb49', + partial: 'wiki/global_sidebar' diff --git a/plugins/additionals/app/views/account/_invisible_captcha.html.slim b/plugins/additionals/app/views/account/_invisible_captcha.html.slim new file mode 100755 index 0000000..0c9c490 --- /dev/null +++ b/plugins/additionals/app/views/account/_invisible_captcha.html.slim @@ -0,0 +1,2 @@ +- if Additionals.setting?(:invisible_captcha) + = invisible_captcha diff --git a/plugins/additionals/app/views/account/_login_text.html.slim b/plugins/additionals/app/views/account/_login_text.html.slim index 56e7b55..7d03053 100755 --- a/plugins/additionals/app/views/account/_login_text.html.slim +++ b/plugins/additionals/app/views/account/_login_text.html.slim @@ -1,5 +1,5 @@ -- login_text = Additionals.setting :account_login_bottom +- login_text = Additionals.settings[:account_login_bottom] - if login_text.present? br .login-additionals - = textilizable login_text + = textilizable(login_text) diff --git a/plugins/additionals/app/views/additionals/_body_bottom.html.slim b/plugins/additionals/app/views/additionals/_body_bottom.html.slim index 6c4fcd1..28c4f22 100755 --- a/plugins/additionals/app/views/additionals/_body_bottom.html.slim +++ b/plugins/additionals/app/views/additionals/_body_bottom.html.slim @@ -1,17 +1,9 @@ -- footer = Additionals.setting :global_footer +- footer = Additionals.settings[:global_footer] - if footer.present? .additionals-footer - = textilizable footer - + = textilizable(footer) - if @additionals_help_items.present? javascript: $(function() { - $('a.help').parent().append("
          #{escape_javascript @additionals_help_items}
        "); - }); - -- if Additionals.setting? :open_external_urls - javascript: - $(function() { - $('a.external').attr({ 'target': '_blank', - 'rel': 'noopener noreferrer'}); + $('a.help').parent().append("
          #{escape_javascript(@additionals_help_items)}
        "); }); diff --git a/plugins/additionals/app/views/additionals/_body_top.slim b/plugins/additionals/app/views/additionals/_body_top.slim deleted file mode 100644 index f1e843e..0000000 --- a/plugins/additionals/app/views/additionals/_body_top.slim +++ /dev/null @@ -1,2 +0,0 @@ -- if Additionals.setting? :add_go_to_top - a#gototop diff --git a/plugins/additionals/app/views/additionals/_chart_table_values.html.slim b/plugins/additionals/app/views/additionals/_chart_table_values.html.slim deleted file mode 100644 index 61193e8..0000000 --- a/plugins/additionals/app/views/additionals/_chart_table_values.html.slim +++ /dev/null @@ -1,17 +0,0 @@ -table.list.issue-report.table-of-values - = title_with_fontawesome l(:label_table_of_values), 'far fa-list-alt', 'caption' - thead - tr - th = @chart[:label] - th = l :label_total - tbody - - options = { set_filter: 1 } - - @chart[:filters].each do |line| - - options.merge! line[:filter] if line[:filter] - tr class="#{cycle 'odd', 'even'}" - td.name class="#{line[:id].to_s == '0' ? 'summary' : ''}" - - if line[:filter].nil? - = line[:name] - - else - = link_to line[:name], send(@chart[:value_link_method], @project, options) - td = line[:count] diff --git a/plugins/additionals/app/views/additionals/_content.html.slim b/plugins/additionals/app/views/additionals/_content.html.slim new file mode 100755 index 0000000..0b58a93 --- /dev/null +++ b/plugins/additionals/app/views/additionals/_content.html.slim @@ -0,0 +1,5 @@ +- unless (controller_name == 'account' && action_name == 'login') || \ + (controller_name == 'my') || \ + (controller_name == 'account' && action_name == 'lost_password') + - if Additionals.setting?(:add_go_to_top) + a.gototop[href="#gototop"] = l(:label_go_to_top) diff --git a/plugins/additionals/app/views/additionals/_export_options.html.slim b/plugins/additionals/app/views/additionals/_export_options.html.slim index 4a3214f..fa50638 100755 --- a/plugins/additionals/app/views/additionals/_export_options.html.slim +++ b/plugins/additionals/app/views/additionals/_export_options.html.slim @@ -2,34 +2,25 @@ div id="#{export_format}-export-options" style="display: none" h3.title = l(:label_export_options, export_format: export_format.upcase) = form_tag(url, method: :get, id: "#{export_format}-export-form") do - = query_as_hidden_field_tags @query - - if defined?(selected_columns_only) && selected_columns_only - = hidden_field_tag 'c[]', '' - = l(:description_selected_columns) - - else - p - label - = radio_button_tag 'c[]', '', true - = l(:description_selected_columns) - br - label - = radio_button_tag 'c[]', 'all_inline' - = l(:description_all_columns) - - hr - + - if @query.available_filters.key?('description') + = query_as_hidden_field_tags @query, [:description] + else + = query_as_hidden_field_tags @query + p + label + = radio_button_tag 'c[]', '', true + = l(:description_selected_columns) + br + label + = radio_button_tag 'c[]', 'all_inline' + = l(:description_all_columns) - if @query.available_filters.key?('description') p label = check_box_tag 'c[]', 'description', @query.has_column?(:description) = l(:field_description) - - if defined?(with_last_notes) && with_last_notes - label - = check_box_tag 'c[]', 'last_notes', @query.has_column?(:last_notes) - = l(:label_last_notes) - - = export_csv_encoding_select_tag - + - if Rails.version >= '5.2' + = export_csv_encoding_select_tag p.buttons = submit_tag l(:button_export), name: nil, onclick: 'hideModal(this);' ' diff --git a/plugins/additionals/app/views/additionals/_global_body_header.slim b/plugins/additionals/app/views/additionals/_global_body_header.slim new file mode 100755 index 0000000..207c34a --- /dev/null +++ b/plugins/additionals/app/views/additionals/_global_body_header.slim @@ -0,0 +1,2 @@ +- if Additionals.setting?(:add_go_to_top) + a#gototop diff --git a/plugins/additionals/app/views/additionals/_global_sidebar.html.slim b/plugins/additionals/app/views/additionals/_global_sidebar.html.slim new file mode 100755 index 0000000..00b5775 --- /dev/null +++ b/plugins/additionals/app/views/additionals/_global_sidebar.html.slim @@ -0,0 +1,5 @@ +- sidebar = Additionals.settings[:global_sidebar] +- if sidebar.present? + br + .sidebar-additionals + = textilizable(sidebar) diff --git a/plugins/additionals/app/views/additionals/_h2_with_query_search.html.slim b/plugins/additionals/app/views/additionals/_h2_with_query_search.html.slim index d09b8ee..f54424f 100755 --- a/plugins/additionals/app/views/additionals/_h2_with_query_search.html.slim +++ b/plugins/additionals/app/views/additionals/_h2_with_query_search.html.slim @@ -1,13 +1,7 @@ -- classes = 'title' unless defined? classes += render(partial: 'additionals/live_search_ajax_call.js', layout: false, formats: [:js]) +- unless defined? classes + - classes = 'title' h2 class="#{classes}" = @query.new_record? ? l(title) : h(@query.name) span.additionals-live-search - = text_field_tag :search, - q, - autocomplete: 'off', - class: 'live-search-field', - placeholder: defined?(placeholder) ? placeholder : l(:label_query_name_search) - - javascript: - observeLiveSearchField('search', - 'query-result-list') + = text_field_tag(:search, q, autocomplete: 'off', class: 'live-search-field', placeholder: l(placeholder)) diff --git a/plugins/additionals/app/views/additionals/_html_head.html.slim b/plugins/additionals/app/views/additionals/_html_head.html.slim index 7d33104..7877b16 100755 --- a/plugins/additionals/app/views/additionals/_html_head.html.slim +++ b/plugins/additionals/app/views/additionals/_html_head.html.slim @@ -1,5 +1,9 @@ - additionals_top_menu_setup -= additionals_library_load :font_awesome +- if Additionals.settings[:external_urls].to_i > 0 + = javascript_include_tag('redirect', plugin: 'additionals') +- if Additionals.settings[:external_urls].to_i == 2 + = javascript_include_tag('noreferrer', plugin: 'additionals') += additionals_library_load(:font_awesome) = stylesheet_link_tag 'additionals', plugin: 'additionals' -= javascript_include_tag 'additionals', plugin: 'additionals' -- render_custom_top_menu_item unless Redmine::Plugin.installed? 'redmine_hrm' +- if User.current.try(:hrm_user_type_id).nil? + - render_custom_top_menu_item diff --git a/plugins/additionals/app/views/additionals/_live_search_ajax_call.js.slim b/plugins/additionals/app/views/additionals/_live_search_ajax_call.js.slim new file mode 100755 index 0000000..295d6be --- /dev/null +++ b/plugins/additionals/app/views/additionals/_live_search_ajax_call.js.slim @@ -0,0 +1,18 @@ +javascript: + $(function() { + // when the #search field changes + $('#search').live_observe_field(2, function() { + var form = $('#query_form'); // grab the form wrapping the search bar. + var url = form.attr('action'); + form.find('[name="c[]"] option').each(function(i, elem) { + $(elem).attr('selected', true) + }) + var formData = form.serialize(); + form.find('[name="c[]"] option').each(function(i, elem) { + $(elem).attr('selected', false) + }) + $.get(url, formData, function(data) { // perform an AJAX get, the trailing function is what happens on successful get. + $("#query-result-list").html(data); // replace the "results" div with the result of action taken + }); + }); + }); diff --git a/plugins/additionals/app/views/additionals/_select2_ajax_call.js.slim b/plugins/additionals/app/views/additionals/_select2_ajax_call.js.slim index 0a87881..76c5e36 100755 --- a/plugins/additionals/app/views/additionals/_select2_ajax_call.js.slim +++ b/plugins/additionals/app/views/additionals/_select2_ajax_call.js.slim @@ -1,28 +1,31 @@ - options = {} if options.nil? javascript: - $(function() { - $("#{defined?(field_id) ? ('#' + field_id) : ('.' + field_class)}").select2({ - ajax: { - url: "#{ajax_url}", - dataType: 'json', - delay: 250, - data: function(params) { - return { - q: params.term, - }; - }, - processResults: function(data, params) { - return { - results: data - }; - }, - cache: true + $("##{field_id}").select2({ + ajax: { + url: "#{ajax_url}", + dataType: 'json', + delay: 250, + data: function(params) { + return { + q: params.term + }; }, - placeholder: "#{options[:placeholder].presence}", - allowClear: #{options[:allow_clear].present? && options[:allow_clear] ? 'true' : 'false'}, - minimumInputLength: 0, - width: "#{options[:width].presence || '90%'}", - templateResult: #{options[:template_result].presence || 'formatNameWithIcon'}, - #{options[:template_selection].present? ? ('templateSelection: ' + options[:template_selection]) : nil} - }) - }) + processResults: function(data, params) { + return { + results: data + }; + }, + cache: true + }, + placeholder: "#{options[:placeholder].presence}", + allowClear: #{options[:allow_clear].present? && options[:allow_clear] ? 'true' : 'false'}, + minimumInputLength: 0, + width: '60%', + templateResult: formatState + }); + + function formatState(opt) { + if (opt.loading) return opt.name; + var $opt = $('' + opt.name_with_icon + ''); + return $opt; + }; diff --git a/plugins/additionals/app/views/additionals/_settings_list_defaults.html.slim b/plugins/additionals/app/views/additionals/_settings_list_defaults.html.slim index bbde541..0327b85 100755 --- a/plugins/additionals/app/views/additionals/_settings_list_defaults.html.slim +++ b/plugins/additionals/app/views/additionals/_settings_list_defaults.html.slim @@ -2,11 +2,15 @@ fieldset.box legend = l(:additionals_query_list_defaults) - setting_name_columns = "#{query_type}_list_defaults" - query = query_class.new(@settings[setting_name_columns.to_sym]) - .default-query-settings-label - = render_query_columns_selection(query, name: "settings[#{setting_name_columns}][column_names]") + - if Redmine::VERSION.to_s >= '4' + .default-query-settings-label-redmine4 + = render_query_columns_selection(query, name: "settings[#{setting_name_columns}][column_names]") + - else + .default-query-settings-label + = render_query_columns_selection(query, name: "settings[#{setting_name_columns}][column_names]") - columns = query_class.new.available_totalable_columns -- if columns.count.positive? +- if columns.count > 0 fieldset.box legend = l(:additionals_query_list_default_totals) @@ -16,8 +20,8 @@ fieldset.box - columns.each do |s| label.inline - value = @settings[setting_name_totals.to_sym].present? ? @settings[setting_name_totals.to_sym].include?(s.name.to_s) : false - = check_box_tag "settings[#{setting_name_totals}][]", + = check_box_tag("settings[#{setting_name_totals}][]", s.name, value, - id: nil + id: nil) = s.caption diff --git a/plugins/additionals/app/views/additionals/_tag_list.html.slim b/plugins/additionals/app/views/additionals/_tag_list.html.slim new file mode 100755 index 0000000..e08fb0a --- /dev/null +++ b/plugins/additionals/app/views/additionals/_tag_list.html.slim @@ -0,0 +1,26 @@ +- if defined?(show_always) && show_always || entry.tag_list.present? + .tags.attribute + - unless defined? hide_label + span.label + = l(:field_tag_list) + ' : + - if defined?(editable) && editable + #tags-data + = additionals_tag_links(entry.tags, tags_without_color: defined?(tags_without_color) ? tags_without_color : false) + ' + span.contextual + = link_to l(:label_edit_tags), + {}, + onclick: "$('#edit_tags_form').show(); $('#tags-data').hide(); return false;", + id: 'edit_tags_link' + + #edit_tags_form style="display: none;" + = form_tag(update_url, method: :put, multipart: true ) do + = render partial: 'tags_form' + ' + = submit_tag l(:button_save), class: 'button-small' + ' + = link_to l(:button_cancel), {}, onclick: "$('#edit_tags_form').hide(); $('#tags-data').show(); return false;" + + - else + = additionals_tag_links(entry.tags, tags_without_color: defined?(tags_without_color) ? tags_without_color : false) diff --git a/plugins/additionals/app/views/additionals/charts/_pie_with_value_table.slim b/plugins/additionals/app/views/additionals/charts/_pie_with_value_table.slim deleted file mode 100644 index 2339949..0000000 --- a/plugins/additionals/app/views/additionals/charts/_pie_with_value_table.slim +++ /dev/null @@ -1,46 +0,0 @@ -.additionals-chart-wrapper - .additionals-chart-left - canvas id="#{@chart[:id]}" style="width: #{@chart[:width]}px; height: #{@chart[:height]}px;" - .additionals-table-of-values - = render partial: 'additionals/chart_table_values' - -.clear-both - -javascript: - const pie_chart_#{{@chart[:id]}} = new Chart(document.getElementById("#{@chart[:id]}"), { - type: 'pie', - data: { - label_ids: #{raw json_escape(@chart[:label_ids])}, - labels: #{raw json_escape(@chart[:labels])}, - datasets: #{raw json_escape(@chart[:datasets])} - }, - options: { - responsive: true, - onClick: function(c, i) { - e = i[0]; - if (e !== undefined && #{{@chart[:filter_path].present? ? 1 : 0}} == 1 ) { - var activePoints = pie_chart_#{{@chart[:id]}}.getElementAtEvent(c); - var label_id = this.data.label_ids[activePoints[0]._index]; - window.open("#{{@chart[:filter_path]}}" + label_id); - } - }, - plugins: { - colorschemes: { - scheme: "#{@chart[:color_schema]}", - fillAlpha: 0.8, - }, - datalabels: { - formatter: (value, ctx) => { - let sum = 0; - let dataArr = ctx.chart.data.datasets[0].data; - dataArr.map(data => { - sum += data; - }); - let percentage = (value*100 / sum).toFixed(0)+"%"; - return percentage; - }, - color: '#000', - } - } - } - }); diff --git a/plugins/additionals/app/views/additionals/settings/_additionals.html.slim b/plugins/additionals/app/views/additionals/settings/_additionals.html.slim index e7a92de..df9c460 100755 --- a/plugins/additionals/app/views/additionals/settings/_additionals.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_additionals.html.slim @@ -1,3 +1,8 @@ +- @settings = ActionController::Parameters.new(@settings) unless Rails.version >= '5.2' ' Need Help? : -= link_to_external l(:label_additionals_doc), 'https://additionals.readthedocs.io/en/latest/' += link_to(l(:label_additionals_doc), + 'https://additionals.readthedocs.io/en/latest/', + class: 'external', + target: '_blank', + rel: 'noopener') = render_tabs additionals_settings_tabs diff --git a/plugins/additionals/app/views/additionals/settings/_general.html.slim b/plugins/additionals/app/views/additionals/settings/_general.html.slim index 1fb0d72..53071d3 100755 --- a/plugins/additionals/app/views/additionals/settings/_general.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_general.html.slim @@ -1,47 +1,39 @@ -fieldset.settings - legend = l(:label_content_plural) +br +h3 = l(:label_content_plural) - p - = additionals_settings_textarea :account_login_bottom - em.info - = l(:account_login_info) - p - = additionals_settings_textarea :global_sidebar - em.info - = l(:global_sidebar_info) - p - = additionals_settings_textarea :global_footer - em.info - = l(:global_footer_info) +p + = content_tag(:label, l(:label_account_login)) + = text_area_tag 'settings[account_login_bottom]', @settings[:account_login_bottom], class: 'wiki-edit', rows: 10 + em.info + = l(:account_login_info) +p + = content_tag(:label, l(:label_global_sidebar)) + = text_area_tag 'settings[global_sidebar]', @settings[:global_sidebar], class: 'wiki-edit', rows: 10 + em.info + = l(:global_sidebar_info) +p + = content_tag(:label, l(:label_global_footer)) + = text_area_tag 'settings[global_footer]', @settings[:global_footer], class: 'wiki-edit', rows: 5 + em.info + = l(:global_footer_info) -fieldset.settings - legend = l(:label_settings) - - p - = additionals_settings_checkbox :open_external_urls - em.info - = t(:open_external_urls_info) - p - = additionals_settings_checkbox :add_go_to_top - em.info - = t(:add_go_to_top_info) - p - = additionals_settings_checkbox :legacy_smiley_support - em.info - = t(:legacy_smiley_support_info_html) - -fieldset.settings - legend = l(:label_disabled_modules) - - p - = tag.label l(:label_disabled_modules) - = hidden_field_tag('settings[disabled_modules][]', '') - - Redmine::AccessControl.available_project_modules_all.sort.each do |m| - label.block - - value = @settings[:disabled_modules].present? ? @settings[:disabled_modules].include?(m.to_s) : false - = check_box_tag('settings[disabled_modules][]', m, value, id: nil) - = l_or_humanize(m, prefix: 'project_module_') - - br - em.info - = l(:disabled_modules_info) +br +h3 = l(:label_setting_plural) +p + = content_tag(:label, l(:label_external_urls)) + = select_tag 'settings[external_urls]', + options_for_select({ l(:external_url_default) => '0', + l(:external_url_new_window) => '1', + l(:external_url_noreferrer) => '2' }, @settings['external_urls']) + em.info + = t(:external_urls_info_html) +p + = content_tag(:label, l(:label_add_go_to_top)) + = check_box_tag 'settings[add_go_to_top]', 1, @settings[:add_go_to_top].to_i == 1 + em.info + = t(:add_go_to_top_info) +p + = content_tag(:label, l(:label_legacy_smiley_support)) + = check_box_tag 'settings[legacy_smiley_support]', 1, @settings[:legacy_smiley_support].to_i == 1 + em.info + = t(:legacy_smiley_support_info_html) diff --git a/plugins/additionals/app/views/additionals/settings/_issues.html.slim b/plugins/additionals/app/views/additionals/settings/_issues.html.slim index 6b13902..290db0c 100755 --- a/plugins/additionals/app/views/additionals/settings/_issues.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_issues.html.slim @@ -1,29 +1,44 @@ -em.info = t(:top_rules_help) - br +h3 = l(:label_content_plural) p - = additionals_settings_textarea :new_ticket_message + = content_tag(:label, l(:label_new_ticket_message)) + = text_area_tag 'settings[new_ticket_message]', @settings[:new_ticket_message], class: 'wiki-edit', rows: 10 em.info = l(:new_ticket_message_info) +br +hr + +h3 = l(:label_setting_plural) +.info = t(:top_rules_help) + br p - = additionals_settings_checkbox :new_issue_on_profile + = content_tag(:label, l(:label_new_issue_on_profile)) + = check_box_tag 'settings[new_issue_on_profile]', 1, @settings[:new_issue_on_profile].to_i == 1 p - = additionals_settings_checkbox :issue_assign_to_me + = content_tag(:label, l(:label_issue_assign_to_me)) + = check_box_tag 'settings[issue_assign_to_me]', 1, @settings[:issue_assign_to_me].to_i == 1 p - = additionals_settings_checkbox :issue_change_status_in_sidebar + = content_tag(:label, l(:label_issue_change_status_in_sidebar)) + = check_box_tag 'settings[issue_change_status_in_sidebar]', 1, @settings[:issue_change_status_in_sidebar].to_i == 1 p - = additionals_settings_checkbox :issue_autowatch_involved + = content_tag(:label, l(:label_issue_autowatch_involved)) + = check_box_tag 'settings[issue_autowatch_involved]', 1, @settings[:issue_autowatch_involved].to_i == 1 p - = additionals_settings_checkbox :issue_freezed_with_close + = content_tag(:label, l(:label_rule_issue_close_with_open_children)) + = check_box_tag 'settings[issue_close_with_open_children]', 1, @settings[:issue_close_with_open_children].to_i == 1 +p + = content_tag(:label, l(:label_rule_issue_freezed_with_close)) + = check_box_tag 'settings[issue_freezed_with_close]', 1, @settings[:issue_freezed_with_close].to_i == 1 em.info = t(:rule_issue_freezed_with_close_info) br - rule_status = IssueStatus.sorted p - = additionals_settings_checkbox :issue_status_change + = content_tag(:label, l(:label_rule_issue_status_change)) + = check_box_tag 'settings[issue_status_change]', 1, @settings[:issue_status_change].to_i == 1 span[style="vertical-align: top; margin-left: 15px;"] = l(:field_status) | x: @@ -43,7 +58,8 @@ em.info = t(:rule_issue_status_change_info) br br p - = additionals_settings_checkbox :issue_current_user_status + = content_tag(:label, l(:label_rule_issue_current_user_status)) + = check_box_tag 'settings[issue_current_user_status]', 1, @settings[:issue_current_user_status].to_i == 1 span[style="vertical-align: top; margin-left: 15px;"] = l(:field_status) | x: @@ -56,7 +72,8 @@ em.info = t(:rule_issue_current_user_status_info_html) br br p - = additionals_settings_checkbox :issue_auto_assign + = content_tag(:label, l(:label_rule_issue_auto_assign)) + = check_box_tag 'settings[issue_auto_assign]', 1, @settings[:issue_auto_assign].to_i == 1 span[style="vertical-align: top; margin-left: 15px;"] = l(:field_status) | x: @@ -75,7 +92,8 @@ em.info = t(:rule_issue_auto_assign_info) br br p - = additionals_settings_checkbox :issue_timelog_required + = content_tag(:label, l(:label_rule_issue_timelog_required)) + = check_box_tag 'settings[issue_timelog_required]', 1, @settings[:issue_timelog_required].to_i == 1 span[style="vertical-align: top; margin-left: 15px;"] = l(:label_tracker_plural) | : diff --git a/plugins/additionals/app/views/additionals/settings/_macros.html.slim b/plugins/additionals/app/views/additionals/settings/_macros.html.slim index bfa0ed4..003273b 100755 --- a/plugins/additionals/app/views/additionals/settings/_macros.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_macros.html.slim @@ -4,7 +4,7 @@ em.info br p - = tag.label l(:label_hidden_macros_in_toolbar) + = content_tag(:label, l(:label_hidden_macros_in_toolbar)) = hidden_field_tag('settings[hidden_macros_in_toolbar][]', '') - @available_macros = AdditionalsMacro.all(only_names: true).each do |m| label.block diff --git a/plugins/additionals/app/views/additionals/settings/_menu.html.slim b/plugins/additionals/app/views/additionals/settings/_menu.html.slim index 009bd3b..d0dccb1 100755 --- a/plugins/additionals/app/views/additionals/settings/_menu.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_menu.html.slim @@ -1,27 +1,30 @@ -.info = t :label_top_menu_help_html +.info = t(:label_top_menu_help_html) br -h3 = l :label_custom_menu_items +h3 = l(:label_custom_menu_items) - 5.times do |i| fieldset legend - b = "#{l :label_menu_entry} ##{i + 1}" + b = "#{l(:label_menu_entry)} ##{i + 1}" div p - = additionals_settings_textfield "custom_menu#{i}_name".to_sym, label: l(:field_name), size: 40 + label = h l(:field_name) + = text_field_tag('settings[custom_menu' + i.to_s + '_name]', @settings['custom_menu' + i.to_s + '_name'], size: 40) p - = additionals_settings_textfield "custom_menu#{i}_url".to_sym, label: l(:field_url), size: 80 + label = h l(:field_url) + = text_field_tag('settings[custom_menu' + i.to_s + '_url]', @settings['custom_menu' + i.to_s + '_url'], size: 80) p - = additionals_settings_textfield "custom_menu#{i}_title".to_sym, label: l(:field_title), size: 80 + label = h l(:field_title) + = text_field_tag('settings[custom_menu' + i.to_s + '_title]', @settings['custom_menu' + i.to_s + '_title'], size: 80) i | ( - = l :label_optional + = l(:label_optional) | ) p label = h l(:label_permissions) - - permission_field = "custom_menu#{i}_roles" + - permission_field = 'custom_menu' + i.to_s + '_roles' - menu_roles = Struct.new(:id, :name) - = select_tag("settings[#{permission_field}]", + = select_tag('settings[' + permission_field + ']', options_from_collection_for_select(Role.sorted.collect { |m| menu_roles.new(m.id, m.name) }, :id, :name, @@ -30,12 +33,12 @@ h3 = l :label_custom_menu_items em.info = l(:menu_roles_info) br - -h3 = l :label_settings - +h3 = l(:label_setting_plural) p - = additionals_settings_checkbox :remove_help - em.info = l :remove_help_info + = content_tag(:label, l(:label_remove_help)) + = check_box_tag 'settings[remove_help]', 1, @settings[:remove_help].to_i == 1 + em.info = l(:remove_help_info) p - = additionals_settings_checkbox :remove_mypage - em.info = l :remove_mypage_info + = content_tag(:label, l(:label_remove_mypage)) + = check_box_tag 'settings[remove_mypage]', 1, @settings[:remove_mypage].to_i == 1 + em.info = l(:remove_mypage_info) diff --git a/plugins/additionals/app/views/additionals/settings/_overview.html.slim b/plugins/additionals/app/views/additionals/settings/_overview.html.slim new file mode 100755 index 0000000..167b252 --- /dev/null +++ b/plugins/additionals/app/views/additionals/settings/_overview.html.slim @@ -0,0 +1,29 @@ +.info = t(:top_overview_help) + +br +h3 = l(:label_content_plural) + +p + = content_tag(:label, l(:label_overview_right)) + = text_area_tag 'settings[overview_right]', @settings[:overview_right], class: 'wiki-edit', rows: 10 + em.info + = l(:overview_right_info) +p + = content_tag(:label, l(:label_overview_top)) + = text_area_tag 'settings[overview_top]', @settings[:overview_top], class: 'wiki-edit', rows: 10 + em.info + = l(:overview_top_info) +p + = content_tag(:label, l(:label_overview_bottom)) + = text_area_tag 'settings[overview_bottom]', @settings[:overview_bottom], class: 'wiki-edit', rows: 10 + em.info + = l(:overview_bottom_info) + +br +h3 = l(:label_setting_plural) + +p + = content_tag(:label, l(:label_remove_news)) + = check_box_tag 'settings[remove_news]', 1, @settings[:remove_news].to_i == 1 + em.info + = l(:remove_news_info) diff --git a/plugins/additionals/app/views/additionals/settings/_projects.html.slim b/plugins/additionals/app/views/additionals/settings/_projects.html.slim new file mode 100755 index 0000000..2bb7800 --- /dev/null +++ b/plugins/additionals/app/views/additionals/settings/_projects.html.slim @@ -0,0 +1,26 @@ +.info = t(:top_projects_help) +br + +p + = content_tag(:label, l(:label_project_overview_content)) + = text_area_tag 'settings[project_overview_content]', + @settings[:project_overview_content], + class: 'wiki-edit', rows: 10 + em.info + = l(:project_overview_content_info) + +hr + +p + = content_tag(:label, l(:label_disabled_modules)) + = hidden_field_tag('settings[disabled_modules][]', '') + - Redmine::AccessControl.available_project_modules_all.each do |m| + label.block + - value = @settings[:disabled_modules].present? ? @settings[:disabled_modules].include?(m.to_s) : false + = check_box_tag('settings[disabled_modules][]', m, value, id: nil) + = l_or_humanize(m, prefix: 'project_module_') + + br + + em.info + = l(:disabled_modules_info) diff --git a/plugins/additionals/app/views/additionals/settings/_users.html.slim b/plugins/additionals/app/views/additionals/settings/_users.html.slim new file mode 100755 index 0000000..ca81b60 --- /dev/null +++ b/plugins/additionals/app/views/additionals/settings/_users.html.slim @@ -0,0 +1,10 @@ +br +h3 = l(:label_user_plural) +p + = content_tag(:label, l(:label_invisible_captcha)) + = check_box_tag 'settings[invisible_captcha]', + 1, + @settings[:invisible_captcha].to_i == 1, + disabled: (true unless Setting.self_registration?) + em.info + = t(:invisible_captcha_info_html) diff --git a/plugins/additionals/app/views/additionals/settings/_web_apis.html.slim b/plugins/additionals/app/views/additionals/settings/_web_apis.html.slim index ef6ea34..eea4032 100755 --- a/plugins/additionals/app/views/additionals/settings/_web_apis.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_web_apis.html.slim @@ -1,5 +1,7 @@ +br +h3 = l(:label_web_apis) p - = additionals_settings_textfield :google_maps_api_key, size: 60 + = content_tag(:label, l(:label_google_maps_embed_api)) + = text_field_tag('settings[google_maps_api_key]', @settings[:google_maps_api_key], size: 60) em.info = t(:google_maps_embed_api_html) - -= call_hook :additionals_settings_web_apis, settings: @settings += call_hook(:additionals_settings_web_apis, settings: @settings) diff --git a/plugins/additionals/app/views/additionals/settings/_wiki.html.slim b/plugins/additionals/app/views/additionals/settings/_wiki.html.slim index f88d94b..bd0986a 100755 --- a/plugins/additionals/app/views/additionals/settings/_wiki.html.slim +++ b/plugins/additionals/app/views/additionals/settings/_wiki.html.slim @@ -1,23 +1,34 @@ -em.info = t(:top_wiki_help) +.info = t(:top_wiki_help) br +h3 = l(:label_content_plural) -fieldset.settings - legend = l(:label_content_plural) +p + = content_tag(:label, l(:label_global_wiki_sidebar)) + = text_area_tag 'settings[global_wiki_sidebar]', @settings[:global_wiki_sidebar], class: 'wiki-edit', rows: 10 + em.info + = l(:global_wiki_sidebar_info) +p + = content_tag(:label, l(:label_global_wiki_header)) + = text_area_tag 'settings[global_wiki_header]', @settings[:global_wiki_header], class: 'wiki-edit', rows: 5 + em.info + = l(:global_wiki_header_info) +p + = content_tag(:label, l(:label_global_wiki_footer)) + = text_area_tag 'settings[global_wiki_footer]', @settings[:global_wiki_footer], class: 'wiki-edit', rows: 5 + em.info + = l(:global_wiki_footer_info) - p - = additionals_settings_textarea :global_wiki_sidebar - em.info - = l(:global_wiki_sidebar_info) +br +h3 = l(:label_pdf_wiki_settings) -fieldset.settings - legend = l(:label_pdf_wiki_settings) - - p - = additionals_settings_checkbox :wiki_pdf_remove_title - em.info - = l(:wiki_pdf_remove_title_info) - p - = additionals_settings_checkbox :wiki_pdf_remove_attachments - em.info - = l(:wiki_pdf_remove_attachments_info) +p + = content_tag(:label, l(:label_wiki_pdf_remove_title)) + = check_box_tag 'settings[wiki_pdf_remove_title]', 1, @settings[:wiki_pdf_remove_title].to_i == 1 + em.info + = l(:wiki_pdf_remove_title_info) +p + = content_tag(:label, l(:label_wiki_pdf_remove_attachments)) + = check_box_tag 'settings[wiki_pdf_remove_attachments]', 1, @settings[:wiki_pdf_remove_attachments].to_i == 1 + em.info + = l(:wiki_pdf_remove_attachments_info) diff --git a/plugins/additionals/app/views/additionals_macros/show.html.slim b/plugins/additionals/app/views/additionals_macros/show.html.slim index f99555e..9bb2744 100755 --- a/plugins/additionals/app/views/additionals_macros/show.html.slim +++ b/plugins/additionals/app/views/additionals_macros/show.html.slim @@ -1,6 +1,6 @@ h2 = l(:label_settings_macros) + " (#{@available_macros.count})" -.info = t :label_top_macros_help_html +.info = t(:label_top_macros_help_html) br .box - @available_macros.each do |macro, options| diff --git a/plugins/additionals/app/views/admin/_system_info.html.slim b/plugins/additionals/app/views/admin/_system_info.html.slim index a2178d5..3c29e37 100755 --- a/plugins/additionals/app/views/admin/_system_info.html.slim +++ b/plugins/additionals/app/views/admin/_system_info.html.slim @@ -1,6 +1,11 @@ table.list - - AdditionalsInfo.system_infos.each_value do |system_info| - tr - td.name - = "#{system_info[:label]}:" - td.name = system_info[:value] + tr + td.name + = "#{l(:label_system_info)}:" + td.name + = system_info + tr + td.name + = "#{l(:label_uptime)}:" + td.name + = system_uptime diff --git a/plugins/additionals/app/views/auto_completes/_additionals_tag_list.html.slim b/plugins/additionals/app/views/auto_completes/_additionals_tag_list.html.slim new file mode 100755 index 0000000..7007689 --- /dev/null +++ b/plugins/additionals/app/views/auto_completes/_additionals_tag_list.html.slim @@ -0,0 +1 @@ +== @tags.collect { |tag| { 'id' => tag.name, 'text' => tag.name } }.to_json diff --git a/plugins/additionals/app/views/auto_completes/_issue_assignee.html.erb b/plugins/additionals/app/views/auto_completes/_issue_assignee.html.erb deleted file mode 100644 index e455af3..0000000 --- a/plugins/additionals/app/views/auto_completes/_issue_assignee.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<%= raw @assignee.map { |principal| { - 'id' => principal.id, - 'text' => principal.name, - 'value' => principal.id - } - }.to_json -%> diff --git a/plugins/additionals/app/views/common/_dashboard.html.slim b/plugins/additionals/app/views/common/_dashboard.html.slim deleted file mode 100644 index e5889c2..0000000 --- a/plugins/additionals/app/views/common/_dashboard.html.slim +++ /dev/null @@ -1,43 +0,0 @@ -= call_hook :view_dashboard_top, dashboard: dashboard, project: @project - -#my-page.splitcontent class="#{dashboard_css_classes(dashboard)}" - - dashboard.available_groups.each do |group| - .block-receiver id="list-#{group}" class="splitcontent#{group}" - = render_dashboard_blocks dashboard.layout[group], dashboard - -= call_hook :view_dashboard_bottom, dashboard: dashboard, project: @project - -= context_menu - -/ required for drap & drop work -/ (this should always set, because to support new entries) -- include_calendar_headers_tags - -- if dashboard.content.with_chartjs? - - content_for :header_tags do - = additionals_library_load %i[chartjs chartjs_colorschemes chartjs_datalabels] - -javascript: - $(function() { - $('#block-select').val(''); - $('.block-receiver').sortable({ - connectWith: '.block-receiver', - tolerance: 'pointer', - handle: '.sort-handle', - start: function(event, ui){$(this).parent().addClass('dragging');}, - stop: function(event, ui){$(this).parent().removeClass('dragging');}, - update: function(event, ui){ - // trigger the call on the list that receives the block only - if ($(this).find(ui.item).length > 0) { - $.ajax({ - url: "#{escape_javascript _order_blocks_dashboard_path(@project, dashboard)}", - type: 'post', - data: { - 'group': $(this).attr('id').replace(/^list-/, ''), - 'blocks': $.map($(this).children(), function(el){return $(el).attr('id').replace(/^block-/, '');}) - } - }); - } - } - }); - }); diff --git a/plugins/additionals/app/views/context_menus/_additionals_closed_issues.html.slim b/plugins/additionals/app/views/context_menus/_additionals_closed_issues.html.slim index aec5400..e68a764 100755 --- a/plugins/additionals/app/views/context_menus/_additionals_closed_issues.html.slim +++ b/plugins/additionals/app/views/context_menus/_additionals_closed_issues.html.slim @@ -1,13 +1,11 @@ -ruby: - if Additionals.setting?(:issue_freezed_with_close) && - !User.current.allowed_to?(:edit_closed_issues, project) && - @issues.detect(&:closed?) - @safe_attributes = [] - @can[:edit] = false - @can[:edit] = false - @allowed_statuses = nil - @trackers = nil - @can[:add_watchers] = nil - @can[:delete] = nil - @options_by_custom_field = [] - end +- if Additionals.setting?(:issue_freezed_with_close) && !User.current.allowed_to?(:edit_closed_issues, project) + - if @issues.detect(&:closed?) + ruby: + @safe_attributes = [] + @can[:edit] = false + @can[:edit] = false + @allowed_statuses = nil + @trackers = nil + @can[:add_watchers] = nil + @can[:delete] = nil + @options_by_custom_field = [] diff --git a/plugins/additionals/app/views/custom_fields/formats/_additionals_text.html.slim b/plugins/additionals/app/views/custom_fields/formats/_additionals_text.html.slim deleted file mode 100644 index cb68917..0000000 --- a/plugins/additionals/app/views/custom_fields/formats/_additionals_text.html.slim +++ /dev/null @@ -1,3 +0,0 @@ -- if custom_fields_with_full_with_layout.include? @custom_field.class.name - p - = f.check_box :full_width_layout diff --git a/plugins/additionals/app/views/dashboard_async_blocks/_update_order_by.js.erb b/plugins/additionals/app/views/dashboard_async_blocks/_update_order_by.js.erb deleted file mode 100644 index e730b08..0000000 --- a/plugins/additionals/app/views/dashboard_async_blocks/_update_order_by.js.erb +++ /dev/null @@ -1 +0,0 @@ -$("#block-<%= block %>").replaceWith("<%= escape_javascript render_dashboard_block(block.to_s, dashboard, sort_options) %>"); diff --git a/plugins/additionals/app/views/dashboards/_form.html.slim b/plugins/additionals/app/views/dashboards/_form.html.slim deleted file mode 100644 index 230b427..0000000 --- a/plugins/additionals/app/views/dashboards/_form.html.slim +++ /dev/null @@ -1,87 +0,0 @@ -= error_messages_for 'dashboard' - -.box.tabular.attributes - p - = f.text_field :name, size: 255, required: true - - p - = f.text_area :description, rows: addtionals_textarea_cols(@dashboard.description, min: 4), class: 'wiki-edit' - - .splitcontent - .splitcontentleft - = hidden_field_tag 'dashboard[dashboard_type]', @dashboard.dashboard_type if @dashboard.new_record? - - if @project && @allowed_projects.present? && @allowed_projects.count > 1 - p - = f.select :project_id, - project_tree_options_for_select(@allowed_projects, - selected: @dashboard.project, - include_blank: true), - {}, - disabled: !@dashboard.project_id_can_change? - em.info - = l(:info_dashboard_project_select) - - else - = hidden_field_tag 'dashboard[project_id]', @project&.id - - - if User.current.allowed_to?(:share_dashboards, @project, global: true) || \ - User.current.allowed_to?(:set_system_dashboards, @project, global: true) - - p - label = l(:field_visible) - label.block - = radio_button 'dashboard', 'visibility', Dashboard::VISIBILITY_PRIVATE - ' - = l(:label_visibility_private) - label.block - = radio_button 'dashboard', 'visibility', Dashboard::VISIBILITY_PUBLIC - ' - = l(:label_visibility_public) - label.block - = radio_button 'dashboard', 'visibility', Dashboard::VISIBILITY_ROLES - ' - = l(:label_visibility_roles) - ' : - - Role.givable.sorted.each do |role| - label.block.role-visibility - = check_box_tag 'dashboard[role_ids][]', role.id, @dashboard.role_ids.include?(role.id), id: nil - ' - = role.name - = hidden_field_tag 'dashboard[role_ids][]', '' - - .splitcontentright - p - = f.check_box :enable_sidebar - - - if User.current.allowed_to? :set_system_dashboards, @project, global: true - p = f.check_box :system_default, disabled: !@dashboard.destroyable? - p#always-expose = f.check_box :always_expose - - elsif @dashboard.system_default? - p = f.check_box :system_default, disabled: true - p = f.check_box :always_expose - - - if @dashboard.persisted? - p.object-select - = f.select :author_id, - author_options_for_select(@project, @dashboard, :save_dashboards), - required: true - - = call_hook :view_dashboard_form_details_bottom, dashboard: @dashboard, form: f - -javascript: - $(function() { - $("input[name='dashboard[visibility]']").change(function(){ - var roles_checked = $('#dashboard_visibility_1').is(':checked'); - var private_checked = $('#dashboard_visibility_0').is(':checked'); - $("input[name='dashboard[role_ids][]'][type=checkbox]").attr('disabled', !roles_checked); - }).trigger('change'); - - $("input[name='dashboard[system_default]']").change(function(){ - var selection = $('#dashboard_system_default').is(':checked'); - if (selection) { - $('#always-expose').show(); - } - else { - $('#always-expose').hide(); - } - }).trigger('change'); - }); diff --git a/plugins/additionals/app/views/dashboards/add_block.js.erb b/plugins/additionals/app/views/dashboards/add_block.js.erb deleted file mode 100644 index d1da381..0000000 --- a/plugins/additionals/app/views/dashboards/add_block.js.erb +++ /dev/null @@ -1,3 +0,0 @@ -$("#block-<%= escape_javascript @block %>").remove(); -$("#list-top").prepend("<%= escape_javascript render_dashboard_blocks([@block], @dashboard) %>"); -$("#block-select").replaceWith("<%= escape_javascript dashboard_block_select_tag(@dashboard) %>"); diff --git a/plugins/additionals/app/views/dashboards/block_error.html.slim b/plugins/additionals/app/views/dashboards/block_error.html.slim deleted file mode 100644 index b928af0..0000000 --- a/plugins/additionals/app/views/dashboards/block_error.html.slim +++ /dev/null @@ -1,4 +0,0 @@ -p#errorExplanation - ' An error occurred while executing dashboard block - = tag.i @block - ' and has been logged. Please report this error to your Redmine administrator. diff --git a/plugins/additionals/app/views/dashboards/blocks/_activity.html.slim b/plugins/additionals/app/views/dashboards/blocks/_activity.html.slim deleted file mode 100644 index 71d56ca..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_activity.html.slim +++ /dev/null @@ -1,11 +0,0 @@ -- cache render_async_cache_key(_dashboard_async_blocks_path(@project, - dashboard.async_params(block, async, settings))), - expires_in: async[:cache_expires_in] || DashboardContent::RENDER_ASYNC_CACHE_EXPIRES_IN, - skip_digest: true do - - - events_by_day = activity_dashboard_data settings, dashboard - - title = Additionals.true?(settings[:me_only]) ? l(:label_my_activity) : l(:label_activity) - h3 = link_to title, activity_path(user_id: User.current, - from: events_by_day.keys.first) - - = render partial: 'activities/activities', locals: { events_by_day: events_by_day } diff --git a/plugins/additionals/app/views/dashboards/blocks/_activity_settings.html.slim b/plugins/additionals/app/views/dashboards/blocks/_activity_settings.html.slim deleted file mode 100644 index 67f32af..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_activity_settings.html.slim +++ /dev/null @@ -1,21 +0,0 @@ -div id="#{block}-settings" style="#{'display: none;' if hide}" - = form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do - = hidden_field_tag "settings[#{block}][me_only]", '0' - .box - p - label - = l :label_max_entries - ' : - = number_field_tag "settings[#{block}][max_entries]", - settings[:max_entries].presence || DashboardContent::DEFAULT_MAX_ENTRIES, - min: 1, max: 1000, required: true - p - label - = l :label_only_my_activities - ' : - = check_box_tag "settings[#{block}][me_only]", '1', Additionals.true?(settings[:me_only]) - - p - = submit_tag l(:button_save) - ' - = link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" diff --git a/plugins/additionals/app/views/dashboards/blocks/_async.html.slim b/plugins/additionals/app/views/dashboards/blocks/_async.html.slim deleted file mode 100644 index 7e5a616..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_async.html.slim +++ /dev/null @@ -1,31 +0,0 @@ -- with_async = dashboard_async_required_settings? settings, async - -- unless with_async - h3 = settings[:title].presence || block_definition[:label] - -- if @can_edit && \ - block_definition[:no_settings].blank? && \ - (!block_definition.key?(:with_settings_if) || block_definition[:with_settings_if].call(@project)) - = render partial: block_definition[:settings_partial].presence || "#{async[:partial]}_settings", - locals: build_dashboard_partial_locals(block, - block_definition, - settings, - dashboard).merge({ hide: with_async }) - -- if with_async - = render_async_cache _dashboard_async_blocks_path(@project, - dashboard.async_params(block, async, settings)) do - .clear-both - p - i.fas.fa-sync.fa-spin - ' - = l(:label_loading) - - = content_for :render_async - - javascript: - $(function() { - $('#ajax-indicator').hide(); - }) -- else - p.nodata = l :label_no_data diff --git a/plugins/additionals/app/views/dashboards/blocks/_documents.html.slim b/plugins/additionals/app/views/dashboards/blocks/_documents.html.slim deleted file mode 100644 index 6f90179..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_documents.html.slim +++ /dev/null @@ -1,27 +0,0 @@ -h3.icon.icon-document = l :label_document_plural - -- if @can_edit - div id="#{block}-settings" style='display: none;' - = form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do - .box - p - label - = l(:label_max_entries) - ' : - = number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 1000, required: true - p - = submit_tag l(:button_save) - ' - = link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" - -- if documents.any? - = render partial: 'documents/document', collection: documents - p - - if @project - = link_to l(:label_document_view_all), project_documents_path(@project) - /- else - / no route available - /= link_to l(:label_news_view_all), documents_path - -- else - p.nodata = l :label_no_data diff --git a/plugins/additionals/app/views/dashboards/blocks/_feed.html.slim b/plugins/additionals/app/views/dashboards/blocks/_feed.html.slim deleted file mode 100644 index af2b485..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_feed.html.slim +++ /dev/null @@ -1,20 +0,0 @@ -- cache render_async_cache_key(_dashboard_async_blocks_path(@project, - dashboard.async_params(block, async, settings))), - expires_in: async[:cache_expires_in], - skip_digest: true do - - - feed = dashboard_feed_catcher settings[:url], settings[:max_entries] - h3 - = dashboard_feed_title settings[:title], block_definition - - - if feed[:valid] - - if feed[:items].count.positive? - ul.reporting-list.feed - - feed[:items].each do |item| - li = link_to_external item[:title], item[:link] - - else - p.nodata = l :label_no_data - - elsif settings[:url].blank? - p.nodata = l :label_no_data - - else - p.nodata = l(:label_invalid_feed_data) diff --git a/plugins/additionals/app/views/dashboards/blocks/_feed_settings.html.slim b/plugins/additionals/app/views/dashboards/blocks/_feed_settings.html.slim deleted file mode 100644 index 46af816..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_feed_settings.html.slim +++ /dev/null @@ -1,25 +0,0 @@ -- max_entries = settings[:max_entries].presence || DashboardContent::DEFAULT_MAX_ENTRIES - -div id="#{block}-settings" style="#{'display: none;' if hide}" - = form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do - .box - p - label - = l :field_title - ' : - = text_field_tag "settings[#{block}][title]", dashboard_feed_title(settings[:title], block_definition) - p - label - = l :field_url - ' : - = url_field_tag "settings[#{block}][url]", settings[:url], required: true - p - label - = l(:label_max_entries) - ' : - = number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 100, required: true - - p - = submit_tag l(:button_save) - ' - = link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" diff --git a/plugins/additionals/app/views/dashboards/blocks/_my_spent_time.html.slim b/plugins/additionals/app/views/dashboards/blocks/_my_spent_time.html.slim deleted file mode 100644 index 5e2941b..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_my_spent_time.html.slim +++ /dev/null @@ -1,35 +0,0 @@ -h3 = block_definition[:label] - -- if @can_edit - div id="#{block}-settings" style='display: none;' - = form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do - .box - p - label - = l :button_show - ' : - = number_field_tag "settings[#{block}][days]", days, min: 1, max: 1000, required: true - ' - = l :label_day_plural - p - = submit_tag l(:button_save) - ' - = link_to_function l(:button_cancel), "$('#my_spent_time-settings').toggle();" - -ul.reporting-list - li.today - = l :label_today - ' : - = l_hours_short entries_today.sum(&:hours) - - li.days - = l :label_last_n_days, days - ' : - = l_hours_short entries_days.sum(&:hours) - -= link_to l(:label_spent_time), _time_entries_path(@project, nil, user_id: 'me') -' -= link_to l(:button_log_time), - _new_time_entry_path(@project, nil), - class: 'icon-only icon-add', - title: l(:button_log_time) diff --git a/plugins/additionals/app/views/dashboards/blocks/_news.html.slim b/plugins/additionals/app/views/dashboards/blocks/_news.html.slim deleted file mode 100644 index ce223a1..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_news.html.slim +++ /dev/null @@ -1,25 +0,0 @@ -h3.icon.icon-news = l :label_news_latest - -- if @can_edit - div id="#{block}-settings" style='display: none;' - = form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do - .box - p - label - = l :label_max_entries - ' : - = number_field_tag "settings[#{block}][max_entries]", max_entries, min: 1, max: 1000, required: true - p - = submit_tag l(:button_save) - ' - = link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" - -- if news.any? - = render partial: 'news/news', collection: news - p - - if @project - = link_to l(:label_news_view_all), project_news_index_path(@project) - - else - = link_to l(:label_news_view_all), news_index_path -- else - p.nodata = l :label_no_data diff --git a/plugins/additionals/app/views/dashboards/blocks/_project_information.html.slim b/plugins/additionals/app/views/dashboards/blocks/_project_information.html.slim deleted file mode 100644 index a9144cf..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_project_information.html.slim +++ /dev/null @@ -1,21 +0,0 @@ -h3 = block_definition[:label] - -- if @project.description.present? - .wiki.project-description - = textilizable @project.description -- if @project.homepage.present? || @project.visible_custom_field_values.any? { |o| o.value.present? } - ul.reporting-list - - if @project.homepage.present? - li - span.label - = l :field_homepage - ' : - = link_to_if uri_with_safe_scheme?(@project.homepage), @project.homepage, @project.homepage, class: 'external' - - render_custom_field_values(@project) do |custom_field, formatted| - li class="#{custom_field.css_classes}" - span.label - = custom_field.name - ' : - = formatted - -= call_hook :view_projects_show_dashboard_info_block, project: @project, dashboard: dashboard diff --git a/plugins/additionals/app/views/dashboards/blocks/_project_issues.html.slim b/plugins/additionals/app/views/dashboards/blocks/_project_issues.html.slim deleted file mode 100644 index 3f9b455..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_project_issues.html.slim +++ /dev/null @@ -1,42 +0,0 @@ -h3.icon.icon-issue - = l :label_issue_tracking - ' - = link_to l(:label_details), - project_issues_report_details_path(@project, detail: 'tracker'), - class: 'icon-only icon-zoom-in', - title: l(:label_details) - -- if @trackers.present? - table.list.issue-report - thead - tr - th - th - = l :label_open_issues_plural - th - = l :label_closed_issues_plural - th - = l :label_total - tbody - - @trackers.each do |tracker| - tr - td.name - = link_to tracker.name, project_issues_path(@project, set_filter: 1, tracker_id: tracker.id), title: tracker.description - td - = link_to @open_issues_by_tracker[tracker].to_i, project_issues_path(@project, set_filter: 1, tracker_id: tracker.id) - td - = link_to (@total_issues_by_tracker[tracker].to_i - @open_issues_by_tracker[tracker].to_i), - project_issues_path(@project, set_filter: 1, tracker_id: tracker.id, status_id: 'c') - td.total - = link_to @total_issues_by_tracker[tracker].to_i, - project_issues_path(@project, set_filter: 1, tracker_id: tracker.id, status_id: '*') -p - = link_to l(:label_issue_view_all), project_issues_path(@project, set_filter: 1) - ' | - = link_to l(:field_summary), project_issues_report_path(@project) - - if User.current.allowed_to? :view_calendar, @project, global: true - ' | - = link_to l(:label_calendar), project_calendar_path(@project) - - if User.current.allowed_to? :view_gantt, @project, global: true - ' | - = link_to l(:label_gantt), project_gantt_path(@project) diff --git a/plugins/additionals/app/views/dashboards/blocks/_project_subprojects.html.slim b/plugins/additionals/app/views/dashboards/blocks/_project_subprojects.html.slim deleted file mode 100644 index e169418..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_project_subprojects.html.slim +++ /dev/null @@ -1,7 +0,0 @@ -- if @subprojects.any? - h3.icon.icon-projects - = l :label_subproject_plural - ul.subprojects - - @subprojects.each do |project| - li - = link_to project.name, project_path(project), class: project.css_classes diff --git a/plugins/additionals/app/views/dashboards/blocks/_project_time_entries.html.slim b/plugins/additionals/app/views/dashboards/blocks/_project_time_entries.html.slim deleted file mode 100644 index af361f5..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_project_time_entries.html.slim +++ /dev/null @@ -1,20 +0,0 @@ -h3.icon.icon-time - = block_definition[:label] -ul - - if @total_estimated_hours.present? - li - = l :field_estimated_hours - ' : - = l_hours @total_estimated_hours - - if @total_hours.present? - li - = l :label_spent_time - ' : - = l_hours @total_hours -p - - if User.current.allowed_to? :log_time, @project - = link_to l(:button_log_time), new_project_time_entry_path(@project) - ' | - = link_to l(:label_details), project_time_entries_path(@project) - ' | - = link_to l(:label_report), report_project_time_entries_path(@project) diff --git a/plugins/additionals/app/views/dashboards/blocks/_query_list.html.slim b/plugins/additionals/app/views/dashboards/blocks/_query_list.html.slim deleted file mode 100644 index 1f7dc6e..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_query_list.html.slim +++ /dev/null @@ -1,35 +0,0 @@ -- cache render_async_cache_key(_dashboard_async_blocks_path(@project, dashboard.async_params(block, async, settings))), - expires_in: DashboardContent::RENDER_ASYNC_CACHE_EXPIRES_IN, - skip_digest: true do - - - query = klass.visible.find_by(id: settings[:query_id]) - - if query - ruby: - query.project = @project if query_block[:with_project] - count = query.send query_block[:count_method] - query.column_names = settings[:columns].split(',').map(&:to_sym) if settings[:columns].present? - query.sort_criteria = params[:sort] if params[:sort].present? - - h3.query-list-block - = dashboard_query_list_block_title query, query_block, @project - = " (#{count})" - = dashboard_query_list_block_alerts dashboard, query, block_definition - - - if query.respond_to?(:description) && query.description.present? - .query-description - = textilizable query, :description - - - if count.positive? - / required by some helpers of other plugins - - @query = query - - = render partial: query_block[:list_partial], - locals: { query_block[:entities_var] => query.send(query_block[:entries_method], - limit: settings[:max_entries] || DashboardContent::DEFAULT_MAX_ENTRIES), - query: query, - query_options: { sort_param: 'sort', - sort_link_options: { method: :post, remote: true } } } - - else - p.nodata = l :label_no_data - - else - p.nodata = l :label_no_data diff --git a/plugins/additionals/app/views/dashboards/blocks/_query_list_settings.slim b/plugins/additionals/app/views/dashboards/blocks/_query_list_settings.slim deleted file mode 100644 index 12a82f3..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_query_list_settings.slim +++ /dev/null @@ -1,27 +0,0 @@ -- query = klass.find_by id: settings[:query_id] -- query.column_names = settings[:columns].map(&:to_sym) if query && settings[:columns].present? - -div id="#{block}-settings" style="#{'display: none;' if hide}" - = form_tag(_update_layout_setting_dashboard_path(@project, dashboard), remote: true) do - .box - - if query - = render_query_columns_selection query, name: "settings[#{block}][columns]" - - else - p - label - = block_definition[:label] - ' - = select_tag "settings[#{block}][query_id]", - options_for_query_select(klass, @project), - required: true - p - label - = l :label_max_entries - ' : - = number_field_tag "settings[#{block}][max_entries]", - settings[:max_entries].presence || DashboardContent::DEFAULT_MAX_ENTRIES, - min: 1, max: 100, required: true - p - = submit_tag l(:button_save) - ' - = link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" diff --git a/plugins/additionals/app/views/dashboards/blocks/_text.html.slim b/plugins/additionals/app/views/dashboards/blocks/_text.html.slim deleted file mode 100644 index 8469bb4..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_text.html.slim +++ /dev/null @@ -1,12 +0,0 @@ -- if settings[:text].nil? - h3 - = l :label_text_sync -- elsif settings[:title].present? - h3 - = settings[:title] - -- if @can_edit - = render partial: 'dashboards/blocks/text_async_settings', locals: { block: block, settings: settings } - -.wiki - = textilizable settings[:text] diff --git a/plugins/additionals/app/views/dashboards/blocks/_text_async.html.slim b/plugins/additionals/app/views/dashboards/blocks/_text_async.html.slim deleted file mode 100644 index db9a050..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_text_async.html.slim +++ /dev/null @@ -1,10 +0,0 @@ -- cache render_async_cache_key(_dashboard_async_blocks_path(@project, - dashboard.async_params(block, async, settings))), - expires_in: async[:cache_expires_in] || DashboardContent::RENDER_ASYNC_CACHE_EXPIRES_IN, - skip_digest: true do - - - if settings[:title].present? - h3 = settings[:title] - - .wiki - = textilizable settings[:text] diff --git a/plugins/additionals/app/views/dashboards/blocks/_text_async_settings.html.slim b/plugins/additionals/app/views/dashboards/blocks/_text_async_settings.html.slim deleted file mode 100644 index c0cfc5d..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_text_async_settings.html.slim +++ /dev/null @@ -1,15 +0,0 @@ -div id="#{block}-settings" style='display: none;' - = form_tag(_update_layout_setting_dashboard_path(@project, @dashboard), remote: true) do - .box - p - label - = l :field_title - ' : - = text_field_tag "settings[#{block}][title]", (settings[:title] || l(:label_text_sync)) - p - = text_area_tag "settings[#{block}][text]", settings[:text], rows: addtionals_textarea_cols(settings[:text]), class: 'wiki-edit' - = wikitoolbar_for "settings_#{block}_text" - p - = submit_tag l :button_save - ' - = link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" diff --git a/plugins/additionals/app/views/dashboards/blocks/_welcome.html.slim b/plugins/additionals/app/views/dashboards/blocks/_welcome.html.slim deleted file mode 100644 index 7573c86..0000000 --- a/plugins/additionals/app/views/dashboards/blocks/_welcome.html.slim +++ /dev/null @@ -1,2 +0,0 @@ -.wiki - = textilizable Setting.welcome_text diff --git a/plugins/additionals/app/views/dashboards/edit.html.slim b/plugins/additionals/app/views/dashboards/edit.html.slim deleted file mode 100644 index acfe00a..0000000 --- a/plugins/additionals/app/views/dashboards/edit.html.slim +++ /dev/null @@ -1,6 +0,0 @@ -h2 = l(:button_dashboard_edit) -= labelled_form_for :dashboard, - @dashboard, - html: { multipart: true, id: 'dashboard-form' } do |f| - = render partial: 'form', locals: { f: f } - = submit_tag l(:button_save) diff --git a/plugins/additionals/app/views/dashboards/index.api.rsb b/plugins/additionals/app/views/dashboards/index.api.rsb deleted file mode 100644 index f0a5764..0000000 --- a/plugins/additionals/app/views/dashboards/index.api.rsb +++ /dev/null @@ -1,20 +0,0 @@ -api.array :dashboards, api_meta(total_count: @query_count, offset: @offset, limit: @limit) do - @dashboards.each do |dashboard| - api.dashboard do - api.id dashboard.id - api.name dashboard.name - api.dashboard_type dashboard.dashboard_type - api.description dashboard.description - api.enable_sidebar dashboard.enable_sidebar - api.system_default dashboard.system_default - api.always_expose dashboard.always_expose - api.project(id: dashboard.project_id, name: dashboard.project.name) unless dashboard.project.nil? - api.author id: dashboard.author_id, name: dashboard.author.name - api.visibility dashboard.visibility - api.created_on dashboard.created_at - api.updated_on dashboard.updated_at - - call_hook :api_dashboard_show, dashboard: dashboard - end - end -end diff --git a/plugins/additionals/app/views/dashboards/new.html.slim b/plugins/additionals/app/views/dashboards/new.html.slim deleted file mode 100644 index 00b5b98..0000000 --- a/plugins/additionals/app/views/dashboards/new.html.slim +++ /dev/null @@ -1,7 +0,0 @@ -h2 = l(:label_new_additional_dashboard) -= labelled_form_for :dashboard, - @dashboard, - url: { action: 'create', project_id: @project }, - html: { multipart: true, id: 'dashboard-form' } do |f| - = render partial: 'form', locals: { f: f } - = submit_tag l(:button_save) diff --git a/plugins/additionals/app/views/dashboards/remove_block.js.erb b/plugins/additionals/app/views/dashboards/remove_block.js.erb deleted file mode 100644 index cf01ceb..0000000 --- a/plugins/additionals/app/views/dashboards/remove_block.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#block-<%= escape_javascript @block %>").remove(); -$("#block-select").replaceWith("<%= escape_javascript dashboard_block_select_tag(@dashboard) %>"); diff --git a/plugins/additionals/app/views/dashboards/show.api.rsb b/plugins/additionals/app/views/dashboards/show.api.rsb deleted file mode 100644 index 421304a..0000000 --- a/plugins/additionals/app/views/dashboards/show.api.rsb +++ /dev/null @@ -1,17 +0,0 @@ -api.dashboard do - api.id @dashboard.id - api.name @dashboard.name - api.dashboard_type @dashboard.dashboard_type - api.description @dashboard.description - api.enable_sidebar @dashboard.enable_sidebar - api.system_default @dashboard.system_default - api.always_expose @dashboard.always_expose - api.project(id: @dashboard.project_id, name: @dashboard.project.name) unless @dashboard.project.nil? - api.author id: @dashboard.author_id, name: @dashboard.author.name - api.visibility @dashboard.visibility - api.options @dashboard.options - api.created_on @dashboard.created_at - api.updated_on @dashboard.updated_at - - call_hook :api_dashboard_show, dashboard: @dashboard -end diff --git a/plugins/additionals/app/views/dashboards/update_layout_setting.js.erb b/plugins/additionals/app/views/dashboards/update_layout_setting.js.erb deleted file mode 100644 index c044a79..0000000 --- a/plugins/additionals/app/views/dashboards/update_layout_setting.js.erb +++ /dev/null @@ -1,14 +0,0 @@ -<% @updated_blocks.each do |block| %> - $("#block-<%= block %>").replaceWith("<%= escape_javascript render_dashboard_block(block.to_s, @dashboard) %>"); -<% end %> - - -$('[title]').tooltip({ - show: { - delay: 400 - }, - position: { - my: "center bottom-5", - at: "center top" - } -}); diff --git a/plugins/additionals/app/views/hooks/_view_contacts_form.html.slim b/plugins/additionals/app/views/hooks/_view_contacts_form.html.slim deleted file mode 100644 index fea1e64..0000000 --- a/plugins/additionals/app/views/hooks/_view_contacts_form.html.slim +++ /dev/null @@ -1 +0,0 @@ -= call_hook :view_contacts_form_details_bottom, contact: @contact, form: f diff --git a/plugins/additionals/app/views/hooks/_view_users_contextual.html.slim b/plugins/additionals/app/views/hooks/_view_users_contextual.html.slim new file mode 100755 index 0000000..be2e2be --- /dev/null +++ b/plugins/additionals/app/views/hooks/_view_users_contextual.html.slim @@ -0,0 +1 @@ += call_hook(:view_users_show_contextual, user: @user) diff --git a/plugins/additionals/app/views/hooks/_view_users_show.html.slim b/plugins/additionals/app/views/hooks/_view_users_show.html.slim new file mode 100755 index 0000000..41e2ebe --- /dev/null +++ b/plugins/additionals/app/views/hooks/_view_users_show.html.slim @@ -0,0 +1 @@ += call_hook(:view_users_show_info, user: @user) diff --git a/plugins/additionals/app/views/hooks/_view_users_show_contextual.html.slim b/plugins/additionals/app/views/hooks/_view_users_show_contextual.html.slim deleted file mode 100644 index e87391e..0000000 --- a/plugins/additionals/app/views/hooks/_view_users_show_contextual.html.slim +++ /dev/null @@ -1 +0,0 @@ -= call_hook :view_users_show_contextual, user: @user diff --git a/plugins/additionals/app/views/hooks/_view_users_show_info.html.slim b/plugins/additionals/app/views/hooks/_view_users_show_info.html.slim deleted file mode 100644 index c1dcabb..0000000 --- a/plugins/additionals/app/views/hooks/_view_users_show_info.html.slim +++ /dev/null @@ -1 +0,0 @@ -= call_hook :view_users_show_info, user: @user diff --git a/plugins/additionals/app/views/hooks/_view_wiki_form_bottom.html.slim b/plugins/additionals/app/views/hooks/_view_wiki_form_bottom.html.slim deleted file mode 100644 index 2f94ebd..0000000 --- a/plugins/additionals/app/views/hooks/_view_wiki_form_bottom.html.slim +++ /dev/null @@ -1 +0,0 @@ -= call_hook :view_wiki_form_bottom, content: @content, page: @page diff --git a/plugins/additionals/app/views/hooks/_view_wiki_show_bottom.html.slim b/plugins/additionals/app/views/hooks/_view_wiki_show_bottom.html.slim deleted file mode 100644 index bfefc0f..0000000 --- a/plugins/additionals/app/views/hooks/_view_wiki_show_bottom.html.slim +++ /dev/null @@ -1 +0,0 @@ -= call_hook :view_wiki_show_bottom, content: @content, page: @page diff --git a/plugins/additionals/app/views/issues/_additionals_action_menu.html.slim b/plugins/additionals/app/views/issues/_additionals_action_menu.html.slim index 99c954d..d28c675 100755 --- a/plugins/additionals/app/views/issues/_additionals_action_menu.html.slim +++ b/plugins/additionals/app/views/issues/_additionals_action_menu.html.slim @@ -1,9 +1,5 @@ -- if User.current.logged? && \ - Additionals.setting?(:issue_assign_to_me) && \ - @issue.editable? && \ - @issue.safe_attribute?('assigned_to_id') && \ - @issue.assigned_to_id != User.current.id && \ - @project.assignable_users.detect { |u| u.id == User.current.id } - = link_to font_awesome_icon('far_user-circle', post_text: l(:button_assign_to_me)), +- if User.current.logged? && @issue.editable? && Additionals.setting?(:issue_assign_to_me) && \ + @issue.assigned_to_id != User.current.id && @project.assignable_users.detect { |u| u.id == User.current.id } + = link_to(font_awesome_icon('far_user-circle', post_text: l(:button_assign_to_me)), issue_assign_to_me_path(@issue), method: :put, - class: 'assign-to-me' + class: 'assign-to-me') diff --git a/plugins/additionals/app/views/issues/_additionals_action_menu_log_time.html.slim b/plugins/additionals/app/views/issues/_additionals_action_menu_log_time.html.slim deleted file mode 100644 index ebc5f11..0000000 --- a/plugins/additionals/app/views/issues/_additionals_action_menu_log_time.html.slim +++ /dev/null @@ -1,2 +0,0 @@ -- if User.current.allowed_to?(:log_time, @project) && @issue.log_time_allowed? - = link_to l(:button_log_time), new_issue_time_entry_path(@issue), class: 'icon icon-time-add' diff --git a/plugins/additionals/app/views/issues/_additionals_sidebar_issues.html.slim b/plugins/additionals/app/views/issues/_additionals_sidebar.html.slim old mode 100644 new mode 100755 similarity index 53% rename from plugins/additionals/app/views/issues/_additionals_sidebar_issues.html.slim rename to plugins/additionals/app/views/issues/_additionals_sidebar.html.slim index a6cf08b..092055e --- a/plugins/additionals/app/views/issues/_additionals_sidebar_issues.html.slim +++ b/plugins/additionals/app/views/issues/_additionals_sidebar.html.slim @@ -1,19 +1,21 @@ - if Additionals.setting?(:issue_change_status_in_sidebar) && \ - @issue && \ - User.current.allowed_to?(:edit_issues, @project) && \ - (!@issue.closed? || User.current.allowed_to?(:edit_closed_issues, @project)) - - statuses = @issue.sidbar_change_status_allowed_to User.current + @issue && \ + User.current.allowed_to?(:edit_issues, @project) && \ + (!@issue.closed? || User.current.allowed_to?(:edit_closed_issues, @project)) + - statuses = @issue.sidbar_change_status_allowed_to(User.current) - if statuses.present? - h3 = l :label_issue_change_status + h3 = l(:label_issue_change_status) ul.issue-status-change-sidebar - statuses.each do |s| - - unless s == @issue.status + - if s != @issue.status li - if s.is_closed? - = link_to font_awesome_icon('fas_caret-square-left', post_text: s.name), + = link_to(font_awesome_icon('fas_caret-square-left', post_text: s.name), issue_change_status_path(@issue, new_status_id: s.id), - method: :put, class: "status-switch status-#{s.id}" + method: :put, class: "status-switch status-#{s.id}") - else - = link_to font_awesome_icon('far_caret-square-left', post_text: s.name), + = link_to(font_awesome_icon('far_caret-square-left', post_text: s.name), issue_change_status_path(@issue, new_status_id: s.id), - method: :put, class: "status-switch status-#{s.id}" + method: :put, class: "status-switch status-#{s.id}") + + h3 = l(:label_planning) diff --git a/plugins/additionals/app/views/issues/_additionals_sidebar_queries.html.slim b/plugins/additionals/app/views/issues/_additionals_sidebar_queries.html.slim deleted file mode 100644 index 08826a2..0000000 --- a/plugins/additionals/app/views/issues/_additionals_sidebar_queries.html.slim +++ /dev/null @@ -1,4 +0,0 @@ -- if Additionals.setting(:global_sidebar).present? - br - .sidebar-additionals - = textilizable(Additionals.setting(:global_sidebar)) diff --git a/plugins/additionals/app/views/issues/_change_author.html.slim b/plugins/additionals/app/views/issues/_change_author.html.slim index d14e440..8d6b343 100755 --- a/plugins/additionals/app/views/issues/_change_author.html.slim +++ b/plugins/additionals/app/views/issues/_change_author.html.slim @@ -1,9 +1,9 @@ - if show_issue_change_author?(issue) && issue.safe_attribute?('author_id') - - author_options = author_options_for_select(issue.project, issue) + - author_options = issue_author_options_for_select(issue.project, issue) - if author_options.present? p#change_author = form.label_for_field :author_id - = link_to_function tag.span(l(:button_edit), class: 'icon icon-edit'), '$(this).hide(); $("#issue_author_id").show()' + = link_to_function content_tag(:span, l(:button_edit), class: 'icon icon-edit'), '$(this).hide(); $("#issue_author_id").show()' = form.select :author_id, author_options, { required: true, no_label: true }, style: 'display: none' javascript: $('#change_author').insertBefore($('#issue_tracker_id').parent()); diff --git a/plugins/additionals/app/views/issues/_change_author_bulk.html.slim b/plugins/additionals/app/views/issues/_change_author_bulk.html.slim index 786aa2b..9b68c63 100755 --- a/plugins/additionals/app/views/issues/_change_author_bulk.html.slim +++ b/plugins/additionals/app/views/issues/_change_author_bulk.html.slim @@ -1,7 +1,7 @@ - if @project && User.current.allowed_to?(:edit_issue_author, @project) - - author_options = author_options_for_select(@project) + - author_options = issue_author_options_for_select(@project) - if author_options.present? p#change_author = label_tag('issue[author_id]', l(:field_author)) = select_tag('issue[author_id]', - tag.option(l(:label_no_change_option), value: '') + author_options) + content_tag('option', l(:label_no_change_option), value: '') + author_options) diff --git a/plugins/additionals/app/views/issues/_new_ticket_message.html.slim b/plugins/additionals/app/views/issues/_new_ticket_message.html.slim index 46dda79..a5f7f8e 100755 --- a/plugins/additionals/app/views/issues/_new_ticket_message.html.slim +++ b/plugins/additionals/app/views/issues/_new_ticket_message.html.slim @@ -1,3 +1,3 @@ - if @issue.new_ticket_message.present? .nodata.nodata-left - = textilizable @issue, :new_ticket_message, inline_attachments: false + = textilizable(@issue.new_ticket_message).html_safe diff --git a/plugins/additionals/app/views/projects/_additionals_sidebar.html.slim b/plugins/additionals/app/views/projects/_additionals_sidebar.html.slim deleted file mode 100644 index 57e4a4c..0000000 --- a/plugins/additionals/app/views/projects/_additionals_sidebar.html.slim +++ /dev/null @@ -1,4 +0,0 @@ -- if Additionals.setting(:global_sidebar).present? - br - .sidebar-additionals - = textilizable Additionals.setting(:global_sidebar) diff --git a/plugins/additionals/app/views/projects/_project_overview.html.slim b/plugins/additionals/app/views/projects/_project_overview.html.slim new file mode 100755 index 0000000..1821bbc --- /dev/null +++ b/plugins/additionals/app/views/projects/_project_overview.html.slim @@ -0,0 +1,4 @@ +- project_overview_content = Additionals.settings[:project_overview_content] +- if project_overview_content.present? + .project-content.wiki.box + = textilizable(project_overview_content) diff --git a/plugins/additionals/app/views/projects/show.html.slim b/plugins/additionals/app/views/projects/show.html.slim deleted file mode 100644 index 2023f3c..0000000 --- a/plugins/additionals/app/views/projects/show.html.slim +++ /dev/null @@ -1,94 +0,0 @@ -/ Some plugins use @news (e.g. redmine_wysiwyg_editor), to detect news -- @news = nil -.contextual - - if User.current.allowed_to?(:save_dashboards, @project) && @dashboard&.editable? - = link_to l(:button_dashboard_edit), - edit_project_dashboard_path(@project, @dashboard), - class: 'icon icon-edit' - - = bookmark_link @project unless Redmine::Plugin.installed? 'redmine_reporting' - = call_hook :view_project_contextual_links, project: @project - - - if @dashboard&.editable? - = form_tag(_add_block_dashboard_path(@project, @dashboard), remote: true, id: 'block-form', authenticity_token: true) do - = dashboard_block_select_tag @dashboard - - = actions_dropdown do - - if User.current.allowed_to? :add_subprojects, @project - = link_to l(:label_subproject_new), new_project_path(parent_id: @project), class: 'icon icon-add' - - if User.current.allowed_to?(:close_project, @project) - - if @project.active? - = link_to l(:button_close), - close_project_path(@project), - data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-lock' - - else - = link_to l(:button_reopen), - reopen_project_path(@project), - data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-unlock' - - - if User.current.admin? - - if @project.archived? - = link_to l(:button_unarchive), - unarchive_project_path(@project, status: params[:status]), - method: :post, class: 'icon icon-unlock' - - else - = link_to l(:button_archive), - archive_project_path(@project, status: params[:status]), - data: { confirm: l(:text_are_you_sure) }, method: :post, class: 'icon icon-lock' - = link_to l(:button_copy), copy_project_path(@project), class: 'icon icon-copy' - = link_to l(:button_delete), project_path(@project), method: :delete, class: 'icon icon-del' - - - if User.current.allowed_to? :save_dashboards, @project - = link_to l(:label_new_dashboard), - new_project_dashboard_path(@project), - class: 'icon icon-add new-additionals-dashboard' - - - if @dashboard&.destroyable? - = delete_dashboard_link project_dashboard_path(@project, @dashboard), - class: 'icon icon-del' - - = sidebar_action_toggle @dashboard_sidebar, @dashboard, @project - = render_dashboard_actionlist @dashboard, @project unless @dashboard_sidebar - = call_hook :view_project_actions_dropdown, project: @project - - - if User.current.allowed_to?(:edit_project, @project) - = link_to_if_authorized l(:label_settings), - { controller: 'projects', action: 'settings', id: @project }, - class: 'icon icon-settings' - -h2 = project_overview_name @project, @dashboard - -- unless @project.active? - p.warning - span.icon.icon-lock - = l(:text_project_closed) - -= render partial: 'common/dashboard', locals: { dashboard: @dashboard } - -javascript: - $(function() { - $('#block-projectmembers div.members').removeClass('box'); - }); - -= call_hook :view_projects_show_bottom, project: @project - -- if @dashboard_sidebar - - content_for :sidebar do - = call_hook :view_projects_show_sidebar_top, project: @project - = render_sidebar_dashboards @dashboard, @project - - if Additionals.setting(:global_sidebar).present? - br - .sidebar-additionals - = textilizable Additionals.setting(:global_sidebar) - - = call_hook :view_projects_show_sidebar_bottom, project: @project - -- content_for :header_tags do - = auto_discovery_link_tag :atom, - { controller: 'activities', - action: 'index', - id: @project, - format: 'atom', - key: User.current.rss_key } - -- html_title l(:label_overview) diff --git a/plugins/additionals/app/views/queries/_additionals_group_view.html.slim b/plugins/additionals/app/views/queries/_additionals_group_view.html.slim deleted file mode 100644 index e35f927..0000000 --- a/plugins/additionals/app/views/queries/_additionals_group_view.html.slim +++ /dev/null @@ -1,13 +0,0 @@ -- reset_cycle -tr.group.open - td colspan="#{query.inline_columns.size + 2}" - span.expander.icon.icon-expended[onclick="toggleRowGroup(this);"] - '   - span.name = group_name - - if group_count.present? - ' - span.badge.badge-count.count = group_count - ' - span.totals = group_totals - = link_to_function("#{l :button_collapse_all}/#{l :button_expand_all}", - 'toggleAllRowGroups(this)', class: 'toggle-all') diff --git a/plugins/additionals/app/views/reports/_additionals_simple.html.slim b/plugins/additionals/app/views/reports/_additionals_simple.html.slim deleted file mode 100644 index ae108b6..0000000 --- a/plugins/additionals/app/views/reports/_additionals_simple.html.slim +++ /dev/null @@ -1,7 +0,0 @@ -ruby: - case field_name - when 'assigned_to_id' - rows = Setting.issue_group_assignment? ? @project.visible_principals : @project.visible_users # rubocop:disable Lint/UselessAssignment - when 'author_id' - rows = @project.visible_users # rubocop:disable Lint/UselessAssignment - end diff --git a/plugins/additionals/app/views/users/_additionals_contextual.html.slim b/plugins/additionals/app/views/users/_additionals_contextual.html.slim index 68c5b27..ba37a40 100755 --- a/plugins/additionals/app/views/users/_additionals_contextual.html.slim +++ b/plugins/additionals/app/views/users/_additionals_contextual.html.slim @@ -1,3 +1,4 @@ - if Additionals.setting?(:new_issue_on_profile) && @memberships.present? - - project_url = memberships_new_issue_project_url user, @memberships - = link_to l(:label_issue_new), project_url, class: 'user-new-issue icon icon-add' if project_url.present? + - project_url = memberships_new_issue_project_url(user, @memberships) + - if project_url.present? + = link_to(l(:label_issue_new), project_url, class: 'user-new-issue icon icon-add') diff --git a/plugins/additionals/app/views/welcome/_overview_bottom.html.slim b/plugins/additionals/app/views/welcome/_overview_bottom.html.slim new file mode 100755 index 0000000..dbe0d26 --- /dev/null +++ b/plugins/additionals/app/views/welcome/_overview_bottom.html.slim @@ -0,0 +1,5 @@ +- overview_bottom = Additionals.settings[:overview_bottom] +- if overview_bottom.present? + .clear-both + .overview-bottom.wiki.box + = textilizable(overview_bottom) diff --git a/plugins/additionals/app/views/welcome/_overview_news.html.slim b/plugins/additionals/app/views/welcome/_overview_news.html.slim new file mode 100755 index 0000000..d9a0c2e --- /dev/null +++ b/plugins/additionals/app/views/welcome/_overview_news.html.slim @@ -0,0 +1,5 @@ +- unless Additionals.setting?(:remove_news) + .news.box + h3 = l(:label_news_latest) + = render partial: 'news/news', collection: @news + = link_to l(:label_news_view_all), news_index_path diff --git a/plugins/additionals/app/views/welcome/_overview_right.html.slim b/plugins/additionals/app/views/welcome/_overview_right.html.slim new file mode 100755 index 0000000..98afad9 --- /dev/null +++ b/plugins/additionals/app/views/welcome/_overview_right.html.slim @@ -0,0 +1,4 @@ +- overview_right = Additionals.settings[:overview_right] +- if overview_right.present? + .overview-right.wiki.box + = textilizable(overview_right) diff --git a/plugins/additionals/app/views/welcome/_overview_top.html.slim b/plugins/additionals/app/views/welcome/_overview_top.html.slim new file mode 100755 index 0000000..3a38f9f --- /dev/null +++ b/plugins/additionals/app/views/welcome/_overview_top.html.slim @@ -0,0 +1,4 @@ +- overview_top = Additionals.settings[:overview_top] +- if overview_top.present? + .overview-top.wiki.box + = textilizable(overview_top) diff --git a/plugins/additionals/app/views/welcome/_sidebar.html.slim b/plugins/additionals/app/views/welcome/_sidebar.html.slim deleted file mode 100644 index 62f0a95..0000000 --- a/plugins/additionals/app/views/welcome/_sidebar.html.slim +++ /dev/null @@ -1,6 +0,0 @@ -- if Additionals.setting(:global_sidebar).present? - br - .sidebar-additionals - = textilizable Additionals.setting(:global_sidebar) - -= render_sidebar_dashboards @dashboard diff --git a/plugins/additionals/app/views/welcome/index.html.slim b/plugins/additionals/app/views/welcome/index.html.slim deleted file mode 100644 index 3bc789a..0000000 --- a/plugins/additionals/app/views/welcome/index.html.slim +++ /dev/null @@ -1,172 +0,0 @@ -/ Some plugins use @news (e.g. redmine_wysiwyg_editor), to detect news -- @news = nil -.contextual - - if User.current.allowed_to?(:save_dashboards, nil, global: true) && @dashboard&.editable? - = link_to l(:button_dashboard_edit), - edit_dashboard_path(@dashboard), - class: 'icon icon-edit' - - = call_hook :view_welcome_contextual_links - - - if @dashboard&.editable? - = form_tag(add_block_dashboard_path(@dashboard), remote: true, id: 'block-form', authenticity_token: true) do - = dashboard_block_select_tag @dashboard - - = actions_dropdown do - - if User.current.allowed_to? :save_dashboards, nil, global: true - = link_to l(:label_new_dashboard), - new_dashboard_path, - class: 'icon icon-add new-additionals-dashboard' - - if @dashboard&.destroyable? - = delete_dashboard_link dashboard_path(@dashboard), - class: 'icon icon-del' - = sidebar_action_toggle @dashboard_sidebar, @dashboard - = render_dashboard_actionlist @dashboard unless @dashboard_sidebar - - = call_hook :view_welcome_show_actions_dropdown - -- if User.current.logged? - - h2 = welcome_overview_name @dashboard - - = call_hook :view_welcome_index_top - - = render partial: 'common/dashboard', locals: { dashboard: @dashboard } - - = call_hook :view_welcome_index_bottom - - - if @dashboard_sidebar - - content_for :sidebar do - = render partial: 'sidebar' - = call_hook :view_welcome_show_sidebar_bottom - - - content_for :header_tags do - = auto_discovery_link_tag :atom, - { controller: 'news', - action: 'index', - key: User.current.rss_key, - format: 'atom' }, - title: "#{Setting.app_title}: #{l :label_news_latest}" - = auto_discovery_link_tag :atom, - { controller: 'activities', - action: 'index', - key: User.current.rss_key, - format: 'atom' }, - title: "#{Setting.app_title}: #{l :label_activity}" - -- else - - div id="fp" - - = text_field_tag 'forcetop', nil, :style => 'display: none;' - - - section id="fp-banner" - div class="inner" - h2 SuitePro - p #{l :welcome_suitepro} - ul class="actions special" - li - #{l :label_login} - #{l :welcome_discover} - - - section id="one" class="frapper style1 special" - div class="inner" - header class="major" - h2 A SIMPLE WAY TO GET WORK DONE  ;) - p #{raw l :welcome_suitepro_is_redmine, :suitepro => 'SuitePro', :redmine => 'Redmine'} - ul class="icons major" -
      • Ruby
      • -
      • Project
      • -
      • Workflow
      • - - - section id="two" class="frapper alt style2" - section class="spotlight" - div class="image" - = image_tag '/themes/circlepro/images/pic01.jpg' - div class="content" - h2 #{raw l :welcome_spotlight_1_title} - p #{l :welcome_spotlight_1_text} - section class="spotlight" - div class="image" - = image_tag '/themes/circlepro/images/pic02.jpg' - div class="content" - h2 #{raw l :welcome_spotlight_2_title} - p #{l :welcome_spotlight_2_text} - section class="spotlight" - div class="image" - = image_tag '/themes/circlepro/images/pic03.jpg' - div class="content" - h2 #{raw l :welcome_spotlight_3_title} - p #{l :welcome_spotlight_3_text} - - - section id="three" class="frapper style3 special" - div class="inner" - header class="major" - h2 #{l :welcome_other_features} - ul class="features" - li class="fp-icon fp-icon_4" - h3 #{l :welcome_feature_1_title} - p #{l :welcome_feature_1_text} - li class="fp-icon fp-icon_5" - h3 #{l :welcome_feature_2_title} - p #{l :welcome_feature_2_text} - li class="fp-icon fp-icon_6" - h3 #{l :welcome_feature_3_title} - p #{l :welcome_feature_3_text} - li class="fp-icon fp-icon_7" - h3 #{l :welcome_feature_4_title} - p #{l :welcome_feature_4_text} - li class="fp-icon fp-icon_8" - h3 #{l :welcome_feature_5_title} - p #{l :welcome_feature_5_text} - li class="fp-icon fp-icon_9" - h3 #{l :welcome_feature_6_title} - p #{l :welcome_feature_6_text} - - - section id="fp-login" class="frapper style4" - div class="inner" - div id="login-form" - h2 #{l :label_login} - = form_tag signin_path, onsubmit: 'return keepAnchorOnSignIn(this);' do - = back_url_hidden_field_tag - - label for="username" #{l :field_login} - = text_field_tag 'username', params[:username], :tabindex => '1' - - - = password_field_tag 'password', nil, :tabindex => '2' - - - if Setting.openid? - label for="openid_url" #{l :field_identity_url} - = text_field_tag "openid_url", nil, :tabindex => '3' - - - if Setting.autologin? - label for="autologin" #{l :label_stay_logged_in} - = check_box_tag 'autologin', 1, false, :tabindex => 4 - - - - - section id="fp-cta" class="frapper style4" - div class="inner" - header - h2 #{l :welcome_any_questions} - p #{l :welcome_please_contact} - ul class="actions stacked" - li - #{l :welcome_contact} - li - #{l :welcome_about_me} - - - - - - diff --git a/plugins/additionals/app/views/wiki/_additionals_sidebar.html.slim b/plugins/additionals/app/views/wiki/_additionals_sidebar.html.slim deleted file mode 100644 index b279b66..0000000 --- a/plugins/additionals/app/views/wiki/_additionals_sidebar.html.slim +++ /dev/null @@ -1,4 +0,0 @@ -- if Additionals.setting(:global_sidebar).present? - .sidebar-additionals - = textilizable Additionals.setting(:global_sidebar) - br diff --git a/plugins/additionals/app/views/wiki/_calendar_macros.html.slim b/plugins/additionals/app/views/wiki/_calendar_macros.html.slim new file mode 100755 index 0000000..dab17e4 --- /dev/null +++ b/plugins/additionals/app/views/wiki/_calendar_macros.html.slim @@ -0,0 +1,17 @@ +.month-calendar id="month-calendar-#{id}" + javascript: + $("#month-calendar-#{id}").datepicker({ + language: "#{locale}", + calendarWeeks: #{options[:show_weeks]}, + todayHighlight: true, + multidate: true, + disableTouchKeyboard: true, + defaultViewDate: { + year: #{options[:year]}, + month: #{options[:month]}, + day: 1 + } + }); + - unless selected.empty? + javascript: + $('#month-calendar-#{id}').datepicker('setDates', #{selected}); diff --git a/plugins/additionals/app/views/wiki/_global_sidebar.html.slim b/plugins/additionals/app/views/wiki/_global_sidebar.html.slim new file mode 100755 index 0000000..88c7a54 --- /dev/null +++ b/plugins/additionals/app/views/wiki/_global_sidebar.html.slim @@ -0,0 +1,5 @@ +- sidebar = Additionals.settings[:global_sidebar] +- if sidebar.present? + .sidebar-additionals + = textilizable(sidebar) + br diff --git a/plugins/additionals/app/views/wiki/_project_macros.html.slim b/plugins/additionals/app/views/wiki/_project_macros.html.slim index 5996112..4163432 100755 --- a/plugins/additionals/app/views/wiki/_project_macros.html.slim +++ b/plugins/additionals/app/views/wiki/_project_macros.html.slim @@ -1,20 +1,15 @@ .additionals-projects.box - if list_title h3 = list_title - - table.list.projects - - project_tree(@projects, init_level: false) do |project, level| - tr id="project-#{project.id}" class="#{project_list_css_classes project, level}" - td.name - span[style='font-weight: bold;'] - - if Redmine::Plugin.installed? 'redmine_reporting' - = project_name_with_icon project - - else - = link_to_project project - - if project.homepage? - ' : - = link_to(project.homepage, project.homepage, @html_options) - - if with_create_issue && User.current.allowed_to?(:add_issues, project) - = link_to '', - new_project_issue_path(project_id: project), - class: 'icon icon-add', title: l(:label_issue_new) + ul + - @projects.each do |project| + li.project class="#{cycle('odd', 'even')}" + span[style='font-weight: bold;'] + = link_to_project(project) + - if project.homepage? + ' : + = link_to(project.homepage, project.homepage, @html_options) + - if with_create_issue && User.current.allowed_to?(:add_issues, project) + = link_to('', + new_project_issue_path(project_id: project), + class: 'icon icon-add', title: l(:label_issue_new)) diff --git a/plugins/additionals/app/views/wiki/_show_additionals.html.slim b/plugins/additionals/app/views/wiki/_show_additionals.html.slim new file mode 100755 index 0000000..eadb004 --- /dev/null +++ b/plugins/additionals/app/views/wiki/_show_additionals.html.slim @@ -0,0 +1,4 @@ +- content_for :header_tags do + = stylesheet_link_tag 'bootstrap-datepicker3.standalone.min', plugin: 'additionals' + = javascript_include_tag('bootstrap-datepicker.min', plugin: 'additionals') + = bootstrap_datepicker_locale diff --git a/plugins/additionals/app/views/wiki/_user_macros.html.slim b/plugins/additionals/app/views/wiki/_user_macros.html.slim index 00ead10..38db12d 100755 --- a/plugins/additionals/app/views/wiki/_user_macros.html.slim +++ b/plugins/additionals/app/views/wiki/_user_macros.html.slim @@ -2,24 +2,22 @@ - if list_title h3 = list_title - users.each do |user| - .user.box class="#{cycle 'odd', 'even'}" + .user.box class="#{cycle('odd', 'even')}" div[style="float: left; display: block; margin-right: 5px;"] = avatar(user, size: 50) .user.line[style="font-weight: bold;"] - = link_to_user user - + = link_to_user(user) - if !user_roles.nil? && user_roles[user.id] .user.line - = l :field_role + = l(:field_role) ' : = user_roles[user.id].join(', ').html_safe .user.line - = l :field_login + = l(:field_login) ' : - = link_to user.login, "/users/#{user.id}" - + = link_to user.login, '/users/' + user.id.to_s - unless user.pref.hide_mail .user.line - = l :field_mail + = l(:field_mail) ' : - = mail_to user.mail, nil, encode: 'javascript' + = mail_to(user.mail, nil, encode: 'javascript') diff --git a/plugins/additionals/assets/images/ZeroClipboard.swf b/plugins/additionals/assets/images/ZeroClipboard.swf new file mode 100755 index 0000000..aac7e4c Binary files /dev/null and b/plugins/additionals/assets/images/ZeroClipboard.swf differ diff --git a/plugins/additionals/assets/images/button_selected.svg b/plugins/additionals/assets/images/button_selected.svg deleted file mode 100644 index 3aeba71..0000000 --- a/plugins/additionals/assets/images/button_selected.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/plugins/additionals/assets/javascripts/.eslintignore b/plugins/additionals/assets/javascripts/.eslintignore index b472d8f..d304d63 100755 --- a/plugins/additionals/assets/javascripts/.eslintignore +++ b/plugins/additionals/assets/javascripts/.eslintignore @@ -1,4 +1,5 @@ # eslint ignore file *.js !additionals*.js -!select2_helpers.js +!noreferrer.js +!tooltips.js diff --git a/plugins/additionals/assets/javascripts/Chart.bundle.min.js b/plugins/additionals/assets/javascripts/Chart.bundle.min.js deleted file mode 100644 index 7134d26..0000000 --- a/plugins/additionals/assets/javascripts/Chart.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Chart.js v2.9.4 - * https://www.chartjs.org - * (c) 2020 Chart.js Contributors - * Released under the MIT License - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Chart=e()}(this,(function(){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function t(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},i=e((function(t){var e={};for(var i in n)n.hasOwnProperty(i)&&(e[n[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=e[t];if(i)return i;var a,r,o,s=1/0;for(var l in n)if(n.hasOwnProperty(l)){var u=n[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));i.rgb,i.hsl,i.hsv,i.hwb,i.cmyk,i.xyz,i.lab,i.lch,i.hex,i.keyword,i.ansi16,i.ansi256,i.hcg,i.apple,i.gray;function a(t){var e=function(){for(var t={},e=Object.keys(i),n=e.length,a=0;a1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var l=s,u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},d={getRgba:h,getHsla:c,getRgb:function(t){var e=h(t);return e&&e.slice(0,3)},getHsl:function(t){var e=c(t);return e&&e.slice(0,3)},getHwb:f,getAlpha:function(t){var e=h(t);if(e)return e[3];if(e=c(t))return e[3];if(e=f(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+b(t[0])+b(t[1])+b(t[2])+(e>=0&&e<1?b(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:g,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return m(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:m,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return y[t.slice(0,3)]}};function h(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new _,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},_.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},_.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},_.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i=0;a--)e.call(n,t[a],a);else for(a=0;a=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-C.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*C.easeInBounce(2*t):.5*C.easeOutBounce(2*t-1)+.5}},P={effects:C};D.easingEffects=C;var T=Math.PI,O=T/180,A=2*T,F=T/2,I=T/4,L=2*T/3,R={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),se.left-1e-6&&t.xe.top-1e-6&&t.y0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r=n?(B.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},tt=B.options.resolve,et=["push","pop","shift","splice","unshift"];function nt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(et.forEach((function(e){delete t[e]})),delete t._chartjs)}}var it=function(t,e){this.initialize(t,e)};B.extend(it.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&nt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;tn&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;na?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function st(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+rt,ot(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=rt,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+rt,n.startAngle,!0),a=0;as;)a-=rt;for(;a=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/rt)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+rt,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;tt.x&&(e=yt(e,"left","right")):t.basen?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function _t(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&bt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}Y._set("global",{elements:{rectangle:{backgroundColor:pt,borderColor:pt,borderSkipped:"bottom",borderWidth:0}}});var wt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=bt(t),n=e.right-e.left,i=e.bottom-e.top,a=xt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return _t(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return vt(n)?_t(n,t,null):_t(n,null,e)},inXRange:function(t){return _t(this._view,t,null)},inYRange:function(t){return _t(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return vt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return vt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),kt={},Mt=lt,St=ht,Dt=mt,Ct=wt;kt.Arc=Mt,kt.Line=St,kt.Point=Dt,kt.Rectangle=Ct;var Pt=B._deprecated,Tt=B.valueOrDefault;function Ot(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=B.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return B.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}Y._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),Y._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var At=at.extend({dataElementType:kt.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;at.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Pt("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Pt("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Pt("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Pt("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Pt("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e=0&&m.min>=0?m.min:m.max,x=void 0===m.start?m.end:m.max>=0&&m.min>=0?m.max-m.min:m.min-m.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(m.min<0&&r<0||m.max>=0&&r>0)&&(y+=r));return o=h.getPixelForValue(y),l=(s=h.getPixelForValue(y+x))-o,void 0!==p&&Math.abs(l)=0&&!c||x<0&&c?o-p:o+p),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t=Nt?-Wt:b<-Nt?Wt:0)+p,x=Math.cos(b),_=Math.sin(b),w=Math.cos(y),k=Math.sin(y),M=b<=0&&y>=0||y>=Wt,S=b<=Yt&&y>=Yt||y>=Wt+Yt,D=b<=-Yt&&y>=-Yt||y>=Nt+Yt,C=b===-Nt||y>=Nt?-1:Math.min(x,x*m,w,w*m),P=D?-1:Math.min(_,_*m,k,k*m),T=M?1:Math.max(x,x*m,w,w*m),O=S?1:Math.max(_,_*m,k,k*m);u=(T-C)/2,d=(O-P)/2,h=-(T+C)/2,c=-(O+P)/2}for(i=0,a=g.length;i0&&!isNaN(t)?Wt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Rt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Rt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Rt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n0&&Bt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return re(t,e,{intersect:!1})},point:function(t,e){return ne(t,te(e,t))},nearest:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis);return ie(t,i,n.intersect,a)},x:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},se=B.extend;function le(t,e){return B.where(t,(function(t){return t.pos===e}))}function ue(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function de(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function he(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-de(o,t,"left","right"),a=e.outerHeight-de(o,t,"top","bottom"),i!==t.w||a!==t.h){t.w=i,t.h=a;var l=n.horizontal?[i,t.w]:[a,t.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function ce(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function fe(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;idiv{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&me.default||me,be="$chartjs",ye="chartjs-size-monitor",xe="chartjs-render-monitor",_e="chartjs-render-animation",we=["animationstart","webkitAnimationStart"],ke={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function Me(t,e){var n=B.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var Se=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function De(t,e,n){t.addEventListener(e,n,Se)}function Ce(t,e,n){t.removeEventListener(e,n,Se)}function Pe(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Te(t){var e=document.createElement("div");return e.className=t||"",e}function Oe(t,e,n){var i,a,r,o,s=t[be]||(t[be]={}),l=s.resizer=function(t){var e=Te(ye),n=Te(ye+"-expand"),i=Te(ye+"-shrink");n.appendChild(Te()),i.appendChild(Te()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return De(n,"scroll",a.bind(n,"expand")),De(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Pe("resize",n)),i&&i.clientWidth0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index-1?t.split("\n"):t}function He(t){var e=Y.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:We(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:We(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:We(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:We(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:We(t.titleFontStyle,e.defaultFontStyle),titleFontSize:We(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:We(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:We(t.footerFontStyle,e.defaultFontStyle),footerFontSize:We(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Be(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function je(t){return Ee([],Ve(t))}var Ue=X.extend({initialize:function(){this._model=He(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Ee(o,Ve(i)),o=Ee(o,Ve(a)),o=Ee(o,Ve(r))},getBeforeBody:function(){return je(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return B.each(t,(function(t){var r={before:[],lines:[],after:[]};Ee(r.before,Ve(i.beforeLabel.call(n,t,e))),Ee(r.lines,i.label.call(n,t,e)),Ee(r.after,Ve(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return je(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Ee(r,Ve(n)),r=Ee(r,Ve(i)),r=Ee(r,Ve(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=He(c),m=h._active,p=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},y={width:f.width,height:f.height},x={x:f.caretX,y:f.caretY};if(m.length){g.opacity=1;var _=[],w=[];x=ze[c.position].call(h,m,h._eventPosition);var k=[];for(e=0,n=m.length;ei.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,y,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.yl.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,y),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=y.width,g.height=y.height,g.caretX=x.x,g.caretY=x.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=Ye(e.rtl,e.x,e.width);for(t.x=Be(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=B.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,B.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),B.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!B.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),Ge=ze,qe=Ue;qe.positioners=Ge;var Ze=B.valueOrDefault;function $e(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?B.merge(e[t][a],[Ne.getScaleDefaults(r),o]):B.merge(e[t][a],o)}else B._merger(t,e,n,i)}})}function Xe(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||Object.create(null),r=n[t];"scales"===t?e[t]=$e(a,r):"scale"===t?e[t]=B.merge(a,[Ne.getScaleDefaults(r.type),r]):B._merger(t,e,n,i)}})}function Ke(t){var e=t.options;B.each(t.scales,(function(e){pe.removeBox(t,e)})),e=Xe(Y.global,Y[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Je(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(B.findIndex(t,a)>=0);return i}function Qe(t){return"top"===t||"bottom"===t}function tn(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}Y._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var en=function(t,e){return this.construct(t,e),this};B.extend(en.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||Object.create(null)).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(Y.global,Y[t.type],t.options||{}),t}(e);var i=Le.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=B.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,en.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Re.notify(t,"beforeInit"),B.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Re.notify(t,"afterInit"),t},clear:function(){return B.canvas.clear(this),this},stop:function(){return Q.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(B.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:B.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",B.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Re.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;B.each(e.xAxes,(function(t,n){t.id||(t.id=Je(e.xAxes,"x-axis-",n))})),B.each(e.yAxes,(function(t,n){t.id||(t.id=Je(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),B.each(i,(function(e){var i=e.options,r=i.id,o=Ze(i.type,e.dtype);Qe(i.position)!==Qe(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Ne.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),B.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Ne.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t=0;--n)this.drawDataset(e[n],t);Re.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Re.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Re.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Re.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Re.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return oe.modes.single(this,t)},getElementsAtEvent:function(t){return oe.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return oe.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=oe.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return oe.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=B.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=B.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(B.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},ln=B.isArray,un=B.isNullOrUndef,dn=B.valueOrDefault,hn=B.valueAtIndexOrDefault;function cn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=rl+1e-6)))return o}function fn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,m,p,v=n.length,b=[],y=[],x=[],_=0,w=0;for(a=0;ae){for(n=0;n=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-gn(l.gridLines)-u.padding-mn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=B.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){B.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){B.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=gn(o)+mn(r)),u?s&&(e.height=gn(o)+mn(r)):e.height=t.maxHeight,a.display&&s){var d=vn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,m=h.highest,p=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,y=B.toRadians(t.labelRotation),x=Math.cos(y),_=Math.sin(y),w=_*g.width+x*(m.height-(b?m.offset:0))+(b?0:p);e.height=Math.min(t.maxHeight,e.height+w+v);var k,M,S=t.getPixelForTick(0)-t.left,D=t.right-t.getPixelForTick(t.getTicks().length-1);b?(k=l?x*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):x*f.width+_*f.offset):(k=c.width/2,M=f.width/2),t.paddingLeft=Math.max((k-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-D)*t.width/(t.width-D),0)+3}else{var C=a.mirror?0:g.width+v+p;e.width=Math.min(t.maxWidth,e.width+C),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){B.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(un(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;nn-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;es)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;iu)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e1?(h-d)/(u-1):null,yn(t,i,B.isNullOrUndef(a)?0:d-a,d),yn(t,i,h,B.isNullOrUndef(a)?t.length:h+a),bn(t)}return yn(t,i),bn(t)},_tickSize:function(){var t=this.options.ticks,e=B.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;_n.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return wn(e)||wn(n)||(t=o.chart.data.datasets[n].data[e]),wn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=B.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),Mn={position:"bottom"};kn._defaults=Mn;var Sn=B.noop,Dn=B.isNullOrUndef;var Cn=_n.extend({getRightValue:function(t){return"string"==typeof t?+t:_n.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=B.sign(t.min),i=B.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:Sn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:B.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,m=B.niceNum((g-f)/u/l)*l;if(m<1e-14&&Dn(d)&&Dn(h))return[f,g];(r=Math.ceil(g/m)-Math.floor(f/m))>u&&(m=B.niceNum(r*m/u/l)*l),s||Dn(c)?n=Math.pow(10,B._decimalPlaces(m)):(n=Math.pow(10,c),m=Math.ceil(m*n)/n),i=Math.floor(f/m)*m,a=Math.ceil(g/m)*m,s&&(!Dn(d)&&B.almostWhole(d/m,m/1e3)&&(i=d),!Dn(h)&&B.almostWhole(h/m,m/1e3)&&(a=h)),r=(a-i)/m,r=B.almostEquals(r,Math.round(r),m/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Dn(d)?i:d);for(var p=1;pe.length-1?null:this.getPixelForValue(e[t])}}),Fn=Pn;An._defaults=Fn;var In=B.valueOrDefault,Ln=B.math.log10;var Rn={position:"left",ticks:{callback:sn.formatters.logarithmic}};function Nn(t,e){return B.isFinite(t)&&t>=0?t:e}var Wn=_n.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t0){var e=B.min(t),n=B.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Ln(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:Nn(e.min),max:Nn(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Ln(e.min)))),o=Math.floor(Ln(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Ln(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Ln(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(ne.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Ln(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;_n.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,Y.global.defaultFontSize)/t._length),t._startValue=Ln(e),t._valueOffset=n,t._valueRange=(Ln(t.max)-Ln(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Ln(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),Yn=Rn;Wn._defaults=Yn;var zn=B.valueOrDefault,En=B.valueAtIndexOrDefault,Vn=B.options.resolve,Hn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:sn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Bn(t){var e=t.ticks;return e.display&&t.display?zn(e.fontSize,Y.global.defaultFontSize)+2*e.backdropPaddingY:0}function jn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:ta?{start:e-n,end:e}:{start:e,end:e+n}}function Un(t){return 0===t||180===t?"center":t<180?"left":"right"}function Gn(t,e,n,i){var a,r,o=n.y+i/2;if(B.isArray(e))for(a=0,r=e.length;a270||t<90)&&(n.y-=e.h)}function Zn(t){return B.isNumber(t)?t:0}var $n=Cn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Bn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;B.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);B.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Bn(this.options))},convertTicksToLabels:function(){var t=this;Cn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=B.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=B.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;er.r&&(r.r=f.end,o.r=h),g.startr.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Zn(a),r=Zn(r),o=Zn(o),s=Zn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(B.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=zn(s.lineWidth,o.lineWidth),u=zn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Bn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=B.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=En(i.fontColor,s,Y.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=B.toDegrees(h);e.textAlign=Un(c),qn(c,t._pointLabelSizes[s],u),Gn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&B.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=En(e.color,i-1),u=En(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=B.options._parseFont(n),s=zn(n.fontColor,Y.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",B.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:B.noop}),Xn=Hn;$n._defaults=Xn;var Kn=B._deprecated,Jn=B.options.resolve,Qn=B.valueOrDefault,ti=Number.MIN_SAFE_INTEGER||-9007199254740991,ei=Number.MAX_SAFE_INTEGER||9007199254740991,ni={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ii=Object.keys(ni);function ai(t,e){return t-e}function ri(t){return B.valueOrDefault(t.time.min,t.ticks.min)}function oi(t){return B.valueOrDefault(t.time.max,t.ticks.max)}function si(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function li(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),B.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),B.isFinite(o)||(o=n.parse(o))),o)}function ui(t,e){if(B.isNullOrUndef(e))return null;var n=t.options.time,i=li(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function di(t,e,n,i){var a,r,o,s=ii.length;for(a=ii.indexOf(t);a=0&&(e[r].major=!0);return e}(t,r,o,n):r}var ci=_n.extend({initialize:function(){this.mergeTicksOptions(),_n.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new on._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),B.mergeIf(n.displayFormats,i.formats()),_n.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),_n.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=ei,f=ti,g=[],m=[],p=[],v=s._getLabels();for(t=0,n=v.length;t1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?di(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ii.length-1;r>=ii.indexOf(n);r--)if(o=ii[r],ni[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ii[n?ii.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ii.indexOf(t)+1,n=ii.length;ee&&s=0&&t0?s:1}}),fi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};ci._defaults=fi;var gi={category:kn,linear:An,logarithmic:Wn,radialLinear:$n,time:ci},mi=e((function(e,n){e.exports=function(){var n,i;function a(){return n.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function u(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function d(t,e){var n,i=[];for(n=0;n>>0,i=0;i0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}var E=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,H={},B={};function j(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(B[t]=a),e&&(B[e[0]]=function(){return z(a.apply(this,arguments),e[1],e[2])}),n&&(B[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=G(e,t.localeData()),H[e]=H[e]||function(t){var e,n,i,a=t.match(E);for(e=0,n=a.length;e=0&&V.test(t);)t=t.replace(V,i),V.lastIndex=0,n-=1;return t}var q=/\d/,Z=/\d\d/,$=/\d{3}/,X=/\d{4}/,K=/[+-]?\d{6}/,J=/\d\d?/,Q=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,it=/[+-]?\d{1,6}/,at=/\d+/,rt=/[+-]?\d+/,ot=/Z|[+-]\d\d:?\d\d/gi,st=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function dt(t,e,n){ut[t]=O(e)?e:function(t,i){return t&&n?n:e}}function ht(t,e){return h(ut,t)?ut[t](e._strict,e._locale):new RegExp(ct(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,a){return e||n||i||a}))))}function ct(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ft={};function gt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n68?1900:2e3)};var Pt,Tt=Ot("FullYear",!0);function Ot(t,e){return function(n){return null!=n?(Ft(this,t,n),a.updateOffset(this,e),this):At(this,t)}}function At(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Ft(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&Ct(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),It(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function It(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=function(t,e){return(t%e+e)%e}(e,12);return t+=(e-n)/12,1===n?Ct(t)?29:28:31-n%7%2}Pt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0?(s=new Date(t+400,e,n,i,a,r,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,n,i,a,r,o),s}function jt(t){var e;if(t<100&&t>=0){var n=Array.prototype.slice.call(arguments);n[0]=t+400,e=new Date(Date.UTC.apply(null,n)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function Ut(t,e,n){var i=7+e-n;return-(7+jt(t,0,i).getUTCDay()-e)%7+i-1}function Gt(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+Ut(t,i,a);return s<=0?o=Dt(r=t-1)+s:s>Dt(t)?(r=t+1,o=s-Dt(t)):(r=t,o=s),{year:r,dayOfYear:o}}function qt(t,e,n){var i,a,r=Ut(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+Zt(a=t.year()-1,e,n):o>Zt(t.year(),e,n)?(i=o-Zt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Zt(t,e,n){var i=Ut(t,e,n),a=Ut(t+1,e,n);return(Dt(t)-i+a)/7}function $t(t,e){return t.slice(e,7).concat(t.slice(0,e))}j("w",["ww",2],"wo","week"),j("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),Y("week",5),Y("isoWeek",5),dt("w",J),dt("ww",J,Z),dt("W",J),dt("WW",J,Z),mt(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=k(t)})),j("d",0,"do","day"),j("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),j("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),j("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),j("e",0,0,"weekday"),j("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),Y("day",11),Y("weekday",11),Y("isoWeekday",11),dt("d",J),dt("e",J),dt("E",J),dt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),dt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),dt("dddd",(function(t,e){return e.weekdaysRegex(t)})),mt(["dd","ddd","dddd"],(function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t})),mt(["d","e","E"],(function(t,e,n,i){e[i]=k(t)}));var Xt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Kt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Jt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Qt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null}var te=lt,ee=lt,ne=lt;function ie(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ct(s[e]),l[e]=ct(l[e]),u[e]=ct(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function ae(){return this.hours()%12||12}function re(t,e){j(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function oe(t,e){return e._meridiemParse}j("H",["HH",2],0,"hour"),j("h",["hh",2],0,ae),j("k",["kk",2],0,(function(){return this.hours()||24})),j("hmm",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)})),j("hmmss",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)+z(this.seconds(),2)})),j("Hmm",0,0,(function(){return""+this.hours()+z(this.minutes(),2)})),j("Hmmss",0,0,(function(){return""+this.hours()+z(this.minutes(),2)+z(this.seconds(),2)})),re("a",!0),re("A",!1),L("hour","h"),Y("hour",13),dt("a",oe),dt("A",oe),dt("H",J),dt("h",J),dt("k",J),dt("HH",J,Z),dt("hh",J,Z),dt("kk",J,Z),dt("hmm",Q),dt("hmmss",tt),dt("Hmm",Q),dt("Hmmss",tt),gt(["H","HH"],xt),gt(["k","kk"],(function(t,e,n){var i=k(t);e[xt]=24===i?0:i})),gt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),gt(["h","hh"],(function(t,e,n){e[xt]=k(t),g(n).bigHour=!0})),gt("hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i)),g(n).bigHour=!0})),gt("hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a)),g(n).bigHour=!0})),gt("Hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i))})),gt("Hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a))}));var se,le=Ot("Hours",!0),ue={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Rt,monthsShort:Nt,week:{dow:0,doy:6},weekdays:Xt,weekdaysMin:Jt,weekdaysShort:Kt,meridiemParse:/[ap]\.?m?\.?/i},de={},he={};function ce(t){return t?t.toLowerCase().replace("_","-"):t}function fe(n){var i=null;if(!de[n]&&e&&e.exports)try{i=se._abbr,t(),ge(i)}catch(t){}return de[n]}function ge(t,e){var n;return t&&((n=s(e)?pe(t):me(t,e))?se=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),se._abbr}function me(t,e){if(null!==e){var n,i=ue;if(e.abbr=t,null!=de[t])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=de[t]._config;else if(null!=e.parentLocale)if(null!=de[e.parentLocale])i=de[e.parentLocale]._config;else{if(null==(n=fe(e.parentLocale)))return he[e.parentLocale]||(he[e.parentLocale]=[]),he[e.parentLocale].push({name:t,config:e}),null;i=n._config}return de[t]=new F(A(i,e)),he[t]&&he[t].forEach((function(t){me(t.name,t.config)})),ge(t),de[t]}return delete de[t],null}function pe(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return se;if(!r(t)){if(e=fe(t))return e;t=[t]}return function(t){for(var e,n,i,a,r=0;r0;){if(i=fe(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&M(a,n,!0)>=e-1)break;e--}r++}return se}(t)}function ve(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[bt]<0||n[bt]>11?bt:n[yt]<1||n[yt]>It(n[vt],n[bt])?yt:n[xt]<0||n[xt]>24||24===n[xt]&&(0!==n[_t]||0!==n[wt]||0!==n[kt])?xt:n[_t]<0||n[_t]>59?_t:n[wt]<0||n[wt]>59?wt:n[kt]<0||n[kt]>999?kt:-1,g(t)._overflowDayOfYear&&(eyt)&&(e=yt),g(t)._overflowWeeks&&-1===e&&(e=Mt),g(t)._overflowWeekday&&-1===e&&(e=St),g(t).overflow=e),t}function be(t,e,n){return null!=t?t:null!=e?e:n}function ye(t){var e,n,i,r,o,s=[];if(!t._d){for(i=function(t){var e=new Date(a.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[yt]&&null==t._a[bt]&&function(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=be(e.GG,t._a[vt],qt(Le(),1,4).year),i=be(e.W,1),((a=be(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=qt(Le(),r,o);n=be(e.gg,t._a[vt],u.year),i=be(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>Zt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=Gt(n,i,a,r,o),t._a[vt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=be(t._a[vt],i[vt]),(t._dayOfYear>Dt(o)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=jt(o,0,t._dayOfYear),t._a[bt]=n.getUTCMonth(),t._a[yt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=i[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[xt]&&0===t._a[_t]&&0===t._a[wt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[xt]=0),t._d=(t._useUTC?jt:Bt).apply(null,s),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[xt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(g(t).weekdayMismatch=!0)}}var xe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_e=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,we=/Z|[+-]\d\d(?::?\d\d)?/,ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Me=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Se=/^\/?Date\((\-?\d+)/i;function De(t){var e,n,i,a,r,o,s=t._i,l=xe.exec(s)||_e.exec(s);if(l){for(g(t).iso=!0,e=0,n=ke.length;e0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),u+=n.length),B[r]?(n?g(t).empty=!1:g(t).unusedTokens.push(r),pt(r,n,t)):t._strict&&!n&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[xt]<=12&&!0===g(t).bigHour&&t._a[xt]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[xt]=function(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}(t._locale,t._a[xt],t._meridiem),ye(t),ve(t)}else Oe(t);else De(t)}function Fe(t){var e=t._i,n=t._f;return t._locale=t._locale||pe(t._l),null===e||void 0===n&&""===e?p({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),_(e)?new x(ve(e)):(u(e)?t._d=e:r(n)?function(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;athis?this:t:p()}));function We(t,e){var n,i;if(1===e.length&&r(e[0])&&(e=e[0]),!e.length)return Le();for(n=e[0],i=1;i=0?new Date(t+400,e,n)-hn:new Date(t,e,n).valueOf()}function gn(t,e,n){return t<100&&t>=0?Date.UTC(t+400,e,n)-hn:Date.UTC(t,e,n)}function mn(t,e){j(0,[t,t.length],0,e)}function pn(t,e,n,i,a){var r;return null==t?qt(this,i,a).year:(e>(r=Zt(t,i,a))&&(e=r),vn.call(this,t,e,n,i,a))}function vn(t,e,n,i,a){var r=Gt(t,e,n,i,a),o=jt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}j(0,["gg",2],0,(function(){return this.weekYear()%100})),j(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),mn("gggg","weekYear"),mn("ggggg","weekYear"),mn("GGGG","isoWeekYear"),mn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),Y("weekYear",1),Y("isoWeekYear",1),dt("G",rt),dt("g",rt),dt("GG",J,Z),dt("gg",J,Z),dt("GGGG",nt,X),dt("gggg",nt,X),dt("GGGGG",it,K),dt("ggggg",it,K),mt(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=k(t)})),mt(["gg","GG"],(function(t,e,n,i){e[i]=a.parseTwoDigitYear(t)})),j("Q",0,"Qo","quarter"),L("quarter","Q"),Y("quarter",7),dt("Q",q),gt("Q",(function(t,e){e[bt]=3*(k(t)-1)})),j("D",["DD",2],"Do","date"),L("date","D"),Y("date",9),dt("D",J),dt("DD",J,Z),dt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),gt(["D","DD"],yt),gt("Do",(function(t,e){e[yt]=k(t.match(J)[0])}));var bn=Ot("Date",!0);j("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),Y("dayOfYear",4),dt("DDD",et),dt("DDDD",$),gt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=k(t)})),j("m",["mm",2],0,"minute"),L("minute","m"),Y("minute",14),dt("m",J),dt("mm",J,Z),gt(["m","mm"],_t);var yn=Ot("Minutes",!1);j("s",["ss",2],0,"second"),L("second","s"),Y("second",15),dt("s",J),dt("ss",J,Z),gt(["s","ss"],wt);var xn,_n=Ot("Seconds",!1);for(j("S",0,0,(function(){return~~(this.millisecond()/100)})),j(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),j(0,["SSS",3],0,"millisecond"),j(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),j(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),j(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),j(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),j(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),j(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),L("millisecond","ms"),Y("millisecond",16),dt("S",et,q),dt("SS",et,Z),dt("SSS",et,$),xn="SSSS";xn.length<=9;xn+="S")dt(xn,at);function wn(t,e){e[kt]=k(1e3*("0."+t))}for(xn="S";xn.length<=9;xn+="S")gt(xn,wn);var kn=Ot("Milliseconds",!1);j("z",0,0,"zoneAbbr"),j("zz",0,0,"zoneName");var Mn=x.prototype;function Sn(t){return t}Mn.add=en,Mn.calendar=function(t,e){var n=t||Le(),i=Ue(n,this).startOf("day"),r=a.calendarFormat(this,i)||"sameElse",o=e&&(O(e[r])?e[r].call(this,n):e[r]);return this.format(o||this.localeData().calendar(r,this,Le(n)))},Mn.clone=function(){return new x(this)},Mn.diff=function(t,e,n){var i,a,r;if(!this.isValid())return NaN;if(!(i=Ue(t,this)).isValid())return NaN;switch(a=6e4*(i.utcOffset()-this.utcOffset()),e=R(e)){case"year":r=an(this,i)/12;break;case"month":r=an(this,i);break;case"quarter":r=an(this,i)/3;break;case"second":r=(this-i)/1e3;break;case"minute":r=(this-i)/6e4;break;case"hour":r=(this-i)/36e5;break;case"day":r=(this-i-a)/864e5;break;case"week":r=(this-i-a)/6048e5;break;default:r=this-i}return n?r:w(r)},Mn.endOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?gn:fn;switch(t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=dn-cn(e+(this._isUTC?0:this.utcOffset()*un),dn)-1;break;case"minute":e=this._d.valueOf(),e+=un-cn(e,un)-1;break;case"second":e=this._d.valueOf(),e+=ln-cn(e,ln)-1}return this._d.setTime(e),a.updateOffset(this,!0),this},Mn.format=function(t){t||(t=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},Mn.from=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.fromNow=function(t){return this.from(Le(),t)},Mn.to=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.toNow=function(t){return this.to(Le(),t)},Mn.get=function(t){return O(this[t=R(t)])?this[t]():this},Mn.invalidAt=function(){return g(this).overflow},Mn.isAfter=function(t,e){var n=_(t)?t:Le(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Mn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a=e+'[")]';return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+a)},Mn.toJSON=function(){return this.isValid()?this.toISOString():null},Mn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Mn.unix=function(){return Math.floor(this.valueOf()/1e3)},Mn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Mn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Mn.year=Tt,Mn.isLeapYear=function(){return Ct(this.year())},Mn.weekYear=function(t){return pn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Mn.isoWeekYear=function(t){return pn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Mn.quarter=Mn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Mn.month=zt,Mn.daysInMonth=function(){return It(this.year(),this.month())},Mn.week=Mn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Mn.isoWeek=Mn.isoWeeks=function(t){var e=qt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Mn.weeksInYear=function(){var t=this.localeData()._week;return Zt(this.year(),t.dow,t.doy)},Mn.isoWeeksInYear=function(){return Zt(this.year(),1,4)},Mn.date=bn,Mn.day=Mn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},Mn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Mn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Mn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Mn.hour=Mn.hours=le,Mn.minute=Mn.minutes=yn,Mn.second=Mn.seconds=_n,Mn.millisecond=Mn.milliseconds=kn,Mn.utcOffset=function(t,e,n){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=je(st,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(i=Ge(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!e||this._changeInProgress?tn(this,Xe(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Ge(this)},Mn.utc=function(t){return this.utcOffset(0,t)},Mn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ge(this),"m")),this},Mn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=je(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Mn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Le(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Mn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Mn.isUtc=qe,Mn.isUTC=qe,Mn.zoneAbbr=function(){return this._isUTC?"UTC":""},Mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Mn.dates=D("dates accessor is deprecated. Use date instead.",bn),Mn.months=D("months accessor is deprecated. Use month instead",zt),Mn.years=D("years accessor is deprecated. Use year instead",Tt),Mn.zone=D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),Mn.isDSTShifted=D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(b(t,this),(t=Fe(t))._a){var e=t._isUTC?f(t._a):Le(t._a);this._isDSTShifted=this.isValid()&&M(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}));var Dn=F.prototype;function Cn(t,e,n,i){var a=pe(),r=f().set(i,e);return a[n](r,t)}function Pn(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Cn(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=Cn(t,i,n,"month");return a}function Tn(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var a,r=pe(),o=t?r._week.dow:0;if(null!=n)return Cn(e,(n+o)%7,i,"day");var s=[];for(a=0;a<7;a++)s[a]=Cn(e,(a+o)%7,i,"day");return s}Dn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return O(i)?i.call(e,n):i},Dn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])},Dn.invalidDate=function(){return this._invalidDate},Dn.ordinal=function(t){return this._ordinal.replace("%d",t)},Dn.preparse=Sn,Dn.postformat=Sn,Dn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return O(a)?a(t,e,n,i):a.replace(/%d/i,t)},Dn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return O(n)?n(e):n.replace(/%s/i,e)},Dn.set=function(t){var e,n;for(n in t)O(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Dn.months=function(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Lt).test(e)?"format":"standalone"][t.month()]:r(this._months)?this._months:this._months.standalone},Dn.monthsShort=function(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Lt.test(e)?"format":"standalone"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Dn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return Wt.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=f([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Dn.monthsRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=Vt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Dn.monthsShortRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=Et),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Dn.week=function(t){return qt(t,this._week.dow,this._week.doy).week},Dn.firstDayOfYear=function(){return this._week.doy},Dn.firstDayOfWeek=function(){return this._week.dow},Dn.weekdays=function(t,e){var n=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?$t(n,this._week.dow):t?n[t.day()]:n},Dn.weekdaysMin=function(t){return!0===t?$t(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},Dn.weekdaysShort=function(t){return!0===t?$t(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},Dn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return Qt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Dn.weekdaysRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=te),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Dn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ee),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Dn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ne),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Dn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},Dn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ge("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),a.lang=D("moment.lang is deprecated. Use moment.locale instead.",ge),a.langData=D("moment.langData is deprecated. Use moment.localeData instead.",pe);var On=Math.abs;function An(t,e,n,i){var a=Xe(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function Fn(t){return t<0?Math.floor(t):Math.ceil(t)}function In(t){return 4800*t/146097}function Ln(t){return 146097*t/4800}function Rn(t){return function(){return this.as(t)}}var Nn=Rn("ms"),Wn=Rn("s"),Yn=Rn("m"),zn=Rn("h"),En=Rn("d"),Vn=Rn("w"),Hn=Rn("M"),Bn=Rn("Q"),jn=Rn("y");function Un(t){return function(){return this.isValid()?this._data[t]:NaN}}var Gn=Un("milliseconds"),qn=Un("seconds"),Zn=Un("minutes"),$n=Un("hours"),Xn=Un("days"),Kn=Un("months"),Jn=Un("years"),Qn=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,M:11};function ei(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}var ni=Math.abs;function ii(t){return(t>0)-(t<0)||+t}function ai(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=ni(this._milliseconds)/1e3,i=ni(this._days),a=ni(this._months);t=w(n/60),e=w(t/60),n%=60,t%=60;var r=w(a/12),o=a%=12,s=i,l=e,u=t,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=ii(this._months)!==ii(h)?"-":"",g=ii(this._days)!==ii(h)?"-":"",m=ii(this._milliseconds)!==ii(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(o?f+o+"M":"")+(s?g+s+"D":"")+(l||u||d?"T":"")+(l?m+l+"H":"")+(u?m+u+"M":"")+(d?m+d+"S":"")}var ri=ze.prototype;return ri.isValid=function(){return this._isValid},ri.abs=function(){var t=this._data;return this._milliseconds=On(this._milliseconds),this._days=On(this._days),this._months=On(this._months),t.milliseconds=On(t.milliseconds),t.seconds=On(t.seconds),t.minutes=On(t.minutes),t.hours=On(t.hours),t.months=On(t.months),t.years=On(t.years),this},ri.add=function(t,e){return An(this,t,e,1)},ri.subtract=function(t,e){return An(this,t,e,-1)},ri.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=R(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+In(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(Ln(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},ri.asMilliseconds=Nn,ri.asSeconds=Wn,ri.asMinutes=Yn,ri.asHours=zn,ri.asDays=En,ri.asWeeks=Vn,ri.asMonths=Hn,ri.asQuarters=Bn,ri.asYears=jn,ri.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},ri._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*Fn(Ln(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=w(r/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,o+=w(n/24),a=w(In(o)),s+=a,o-=Fn(Ln(a)),i=w(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},ri.clone=function(){return Xe(this)},ri.get=function(t){return t=R(t),this.isValid()?this[t+"s"]():NaN},ri.milliseconds=Gn,ri.seconds=qn,ri.minutes=Zn,ri.hours=$n,ri.days=Xn,ri.weeks=function(){return w(this.days()/7)},ri.months=Kn,ri.years=Jn,ri.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var i=Xe(t).abs(),a=Qn(i.as("s")),r=Qn(i.as("m")),o=Qn(i.as("h")),s=Qn(i.as("d")),l=Qn(i.as("M")),u=Qn(i.as("y")),d=a<=ti.ss&&["s",a]||a0,d[4]=n,ei.apply(null,d)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},ri.toISOString=ai,ri.toString=ai,ri.toJSON=ai,ri.locale=rn,ri.localeData=sn,ri.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ai),ri.lang=on,j("X",0,0,"unix"),j("x",0,0,"valueOf"),dt("x",rt),dt("X",/[+-]?\d+(\.\d{1,3})?/),gt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))})),gt("x",(function(t,e,n){n._d=new Date(k(t))})),a.version="2.24.0",n=Le,a.fn=Mn,a.min=function(){return We("isBefore",[].slice.call(arguments,0))},a.max=function(){return We("isAfter",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=f,a.unix=function(t){return Le(1e3*t)},a.months=function(t,e){return Pn(t,e,"months")},a.isDate=u,a.locale=ge,a.invalid=p,a.duration=Xe,a.isMoment=_,a.weekdays=function(t,e,n){return Tn(t,e,n,"weekdays")},a.parseZone=function(){return Le.apply(null,arguments).parseZone()},a.localeData=pe,a.isDuration=Ee,a.monthsShort=function(t,e){return Pn(t,e,"monthsShort")},a.weekdaysMin=function(t,e,n){return Tn(t,e,n,"weekdaysMin")},a.defineLocale=me,a.updateLocale=function(t,e){if(null!=e){var n,i,a=ue;null!=(i=fe(t))&&(a=i._config),e=A(a,e),(n=new F(e)).parentLocale=de[t],de[t]=n,ge(t)}else null!=de[t]&&(null!=de[t].parentLocale?de[t]=de[t].parentLocale:null!=de[t]&&delete de[t]);return de[t]},a.locales=function(){return C(de)},a.weekdaysShort=function(t,e,n){return Tn(t,e,n,"weekdaysShort")},a.normalizeUnits=R,a.relativeTimeRounding=function(t){return void 0===t?Qn:"function"==typeof t&&(Qn=t,!0)},a.relativeTimeThreshold=function(t,e){return void 0!==ti[t]&&(void 0===e?ti[t]:(ti[t]=e,"s"===t&&(ti.ss=e-1),!0))},a.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},a.prototype=Mn,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()})),pi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};on._date.override("function"==typeof mi?{_id:"moment",formats:function(){return pi},parse:function(t,e){return"string"==typeof t&&"string"==typeof e?t=mi(t,e):t instanceof mi||(t=mi(t)),t.isValid()?t.valueOf():null},format:function(t,e){return mi(t).format(e)},add:function(t,e,n){return mi(t).add(e,n).valueOf()},diff:function(t,e,n){return mi(t).diff(mi(e),n)},startOf:function(t,e,n){return t=mi(t),"isoWeek"===e?t.isoWeekday(n).valueOf():t.startOf(e).valueOf()},endOf:function(t,e){return mi(t).endOf(e).valueOf()},_create:function(t){return mi(t)}}:{}),Y._set("global",{plugins:{filler:{propagate:!0}}});var vi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function yi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a0;--r)B.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function Mi(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,m=i.spanGaps,p=[],v=[],b=0,y=0;for(t.beginPath(),o=0,s=g;o=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||Y.global.defaultColor,o&&s&&r.length&&(B.canvas.clipArea(u,t.chartArea),Mi(u,r,o,a,s,i._loop),B.canvas.unclipArea(u)))}},Di=B.rtl.getRtlAdapter,Ci=B.noop,Pi=B.valueOrDefault;function Ti(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}Y._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;el.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],m=n.padding,p=0,v=0;B.each(t.legendItems,(function(t,e){var i=Ti(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(m+=p+n.padding,f.push(p),g.push(v),p=0,v=0),p=Math.max(p,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),m+=p,f.push(p),g.push(v),l.width+=m}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Ci,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=Y.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=Di(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Pi(n.fontColor,i.defaultFontColor),g=B.options._parseFont(n),m=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var p=Ti(n,m),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},y=t.isHorizontal();d=y?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},B.rtl.overrideTextDirection(t.ctx,e.textDirection);var x=m+n.padding;B.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=p+m/2+f,_=d.x,w=d.y;h.setWidth(t.minSize.width),y?i>0&&_+g+n.padding>t.left+t.minSize.width&&(w=d.y+=x,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&w+x>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,w=d.y=t.top+b(o,s[d.line]));var k=h.x(_);!function(t,e,i){if(!(isNaN(p)||p<=0)){c.save();var o=Pi(i.lineWidth,r.borderWidth);if(c.fillStyle=Pi(i.fillStyle,a),c.lineCap=Pi(i.lineCap,r.borderCapStyle),c.lineDashOffset=Pi(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Pi(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Pi(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Pi(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=p*Math.SQRT2/2,l=h.xPlus(t,p/2),u=e+m/2;B.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,p),e,p,m),0!==o&&c.strokeRect(h.leftForLtr(t,p),e,p,m);c.restore()}}(k,w,e),v[i].left=h.leftForLtr(k,v[i].width),v[i].top=w,function(t,e,n,i){var a=m/2,r=h.xPlus(t,p+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(k,w,e,f),y?d.x+=g+n.padding:d.y+=x})),B.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Oi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.legend=n}var Fi={id:"legend",_element:Oi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(B.mergeIf(e,Y.global.legend),n?(pe.configure(t,n,e),n.options=e):Ai(t,e)):n&&(pe.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ii=B.noop;Y._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Li=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ii,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ii,beforeSetDimensions:Ii,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ii,beforeBuildLabels:Ii,buildLabels:Ii,afterBuildLabels:Ii,beforeFit:Ii,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(B.isArray(n.text)?n.text.length:1)*B.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ii,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=B.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=B.valueOrDefault(n.fontColor,Y.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(B.isArray(g))for(var m=0,p=0;p=0;i--){var a=t[i];if(e(a))return a}},B.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},B.almostEquals=function(t,e,n){return Math.abs(t-e)=t},B.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},B.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},B.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},B.toRadians=function(t){return t*(Math.PI/180)},B.toDegrees=function(t){return t*(180/Math.PI)},B._decimalPlaces=function(t){if(B.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},B.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},B.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},B.aliasPixel=function(t){return t%2==0?0:.5},B._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},B.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},B.EPSILON=Number.EPSILON||1e-14,B.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e0?d[e-1]:null,(a=e0?d[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},B.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},B.niceNum=function(t,e){var n=Math.floor(B.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},B.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},B.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(B.getStyle(r,"padding-left")),u=parseFloat(B.getStyle(r,"padding-top")),d=parseFloat(B.getStyle(r,"padding-right")),h=parseFloat(B.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},B.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},B.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},B._calculatePadding=function(t,e,n){return(e=B.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},B._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},B.getMaximumWidth=function(t){var e=B._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-B._calculatePadding(e,"padding-left",n)-B._calculatePadding(e,"padding-right",n),a=B.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},B.getMaximumHeight=function(t){var e=B._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-B._calculatePadding(e,"padding-top",n)-B._calculatePadding(e,"padding-bottom",n),a=B.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},B.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},B.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},B.fontString=function(t,e,n){return e+" "+t+"px "+n},B.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;on.length){for(o=0;oi&&(i=r),i},B.numberOfLabelLines=function(t){var e=1;return B.each(t,(function(t){B.isArray(t)&&t.length>e&&(e=t.length)})),e},B.color=w?function(t){return t instanceof CanvasGradient&&(t=Y.global.defaultColor),w(t)}:function(t){return console.error("Color.js not found!"),t},B.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:B.color(t).saturate(.5).darken(.1).rgbString()}}(),nn._adapters=on,nn.Animation=J,nn.animationService=Q,nn.controllers=Qt,nn.DatasetController=at,nn.defaults=Y,nn.Element=X,nn.elements=kt,nn.Interaction=oe,nn.layouts=pe,nn.platform=Le,nn.plugins=Re,nn.Scale=_n,nn.scaleService=Ne,nn.Ticks=sn,nn.Tooltip=qe,nn.helpers.each(gi,(function(t,e){nn.scaleService.registerScaleType(e,t,t._defaults)})),Ni)Ni.hasOwnProperty(Ei)&&nn.plugins.register(Ni[Ei]);nn.platform.initialize();var Vi=nn;return"undefined"!=typeof window&&(window.Chart=nn),nn.Chart=nn,nn.Legend=Ni.legend._element,nn.Title=Ni.title._element,nn.pluginService=nn.plugins,nn.PluginBase=nn.Element.extend({}),nn.canvasHelpers=nn.helpers.canvas,nn.layoutService=nn.layouts,nn.LinearScaleBase=Cn,nn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){nn[t]=function(e,n){return new nn(e,nn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Vi})); diff --git a/plugins/additionals/assets/javascripts/additionals.js b/plugins/additionals/assets/javascripts/additionals.js deleted file mode 100644 index 3474a86..0000000 --- a/plugins/additionals/assets/javascripts/additionals.js +++ /dev/null @@ -1,92 +0,0 @@ -/* exported setClipboardJS */ -/* global ClipboardJS */ -function setClipboardJS(element){ - var clipboard = new ClipboardJS(element); - clipboard.on('success', function(e) { - $(element).tooltip({ - content: $(element).data('label-copied') - }); - setTimeout(function() { - e.clearSelection(); - $(element).tooltip({ - content: $(element).data('label-to-copy') - }); - }, 1000); - }); -} - -/* exported formatNameWithIcon */ -function formatNameWithIcon(opt) { - if (opt.loading) return opt.name; - var $opt = $('' + opt.name_with_icon + ''); - return $opt; -} - -/* exported formatFontawesomeText */ -function formatFontawesomeText(icon) { - var icon_id = icon.id; - if (icon_id !== undefined) { - var fa = icon.id.split('_'); - return $(' ' + icon.text + ''); - } else { - return icon.text; - } -} - -/* exported observeLiveSearchField */ -function observeLiveSearchField(fieldId, targetId, target_url) { - $('#'+fieldId).each(function() { - var $this = $(this); - $this.addClass('autocomplete'); - $this.attr('data-search-was', $this.val()); - var check = function() { - var val = $this.val(); - if ($this.attr('data-search-was') != val){ - $this.attr('data-search-was', val); - - var form = $('#query_form'); // grab the form wrapping the search bar. - var formData; - var url; - - form.find('[name="c[]"] option').each(function(i, elem) { - $(elem).attr('selected', true); - }); - - if (typeof target_url === 'undefined') { - url = form.attr('action'); - formData = form.serialize(); - } else { - url = target_url; - formData = { q: val }; - } - - form.find('[name="c[]"] option').each(function(i, elem) { - $(elem).attr('selected', false); - }); - - $.ajax({ - url: url, - type: 'get', - data: formData, - success: function(data){ if(targetId) $('#'+targetId).html(data); }, - beforeSend: function(){ $this.addClass('ajax-loading'); }, - complete: function(){ $this.removeClass('ajax-loading'); } - }); - } - }; - - /* see https://stackoverflow.com/questions/1909441/how-to-delay-the-keyup-handler-until-the-user-stops-typing */ - var search_delay = function(callback) { - var timer = 0; - return function() { - var context = this, args = arguments; - clearTimeout(timer); - timer = setTimeout(function () { - callback.apply(context, args); - }, 400 || 0); - }; - }; - - $this.keyup(search_delay(check)); - }); -} diff --git a/plugins/additionals/assets/javascripts/additionals_observe_field.js b/plugins/additionals/assets/javascripts/additionals_observe_field.js new file mode 100755 index 0000000..c33ba54 --- /dev/null +++ b/plugins/additionals/assets/javascripts/additionals_observe_field.js @@ -0,0 +1,52 @@ +// see https://github.com/splendeo/jquery.observe_field + +(function($) { + 'use strict'; + + $.fn.live_observe_field = function(frequency, callback) { + + frequency = frequency * 100; // translate to milliseconds + + return this.each(function() { + var $this = $(this); + var prev = $this.val(); + var prevChecked = $this.prop('checked'); + + var check = function() { + if (removed()) { + // if removed clear the interval and don't fire the callback + if (ti) + clearInterval(ti); + return; + } + + var val = $this.val(); + var checked = $this.prop('checked'); + if (prev != val || checked != prevChecked) { + prev = val; + prevChecked = checked; + $this.map(callback); // invokes the callback on $this + } + }; + + var removed = function() { + return $this.closest('html').length == 0; + }; + + var reset = function() { + if (ti) { + clearInterval(ti); + ti = setInterval(check, frequency); + } + }; + + check(); + var ti = setInterval(check, frequency); // invoke check periodically + + // reset counter after user interaction + $this.bind('keyup click mousemove', reset); // mousemove is for selects + }); + + }; + +})(jQuery); diff --git a/plugins/additionals/assets/javascripts/additionals_to_select2.js b/plugins/additionals/assets/javascripts/additionals_to_select2.js new file mode 100755 index 0000000..59ce6b1 --- /dev/null +++ b/plugins/additionals/assets/javascripts/additionals_to_select2.js @@ -0,0 +1,41 @@ +var oldAdditionalsToggleFilter = window.toggleFilter; + +window.toggleFilter = function(field) { + oldAdditionalsToggleFilter(field); + return additionals_transform_to_select2(field); +}; + +function filterAdditionalsFormatState (opt) { + var $opt = $('' + opt.name_with_icon + ''); + return $opt; +} + +/* global availableFilters additionals_field_formats additionals_filter_urls:true* */ +function additionals_transform_to_select2(field){ + var field_format = availableFilters[field]['field_format']; + var initialized_select2 = $('#tr_' + field + ' .values .select2'); + if (initialized_select2.size() == 0 && $.inArray(field_format, additionals_field_formats) >= 0) { + $('#tr_' + field + ' .toggle-multiselect').hide(); + $('#tr_' + field + ' .values .value').attr('multiple', 'multiple'); + $('#tr_' + field + ' .values .value').select2({ + ajax: { + url: additionals_filter_urls[field_format], + dataType: 'json', + delay: 250, + data: function(params) { + return { q: params.term }; + }, + processResults: function(data, params) { + return { results: data }; + }, + cache: true + }, + placeholder: ' ', + minimumInputLength: 1, + width: '60%', + templateResult: filterAdditionalsFormatState + }).on('select2:open', function (e) { + $(this).parent('span').find('.select2-search__field').val(' ').trigger($.Event('input', { which: 13 })).val(''); + }); + } +} diff --git a/plugins/additionals/assets/javascripts/bootstrap-datepicker.min.js b/plugins/additionals/assets/javascripts/bootstrap-datepicker.min.js new file mode 100755 index 0000000..14457e0 --- /dev/null +++ b/plugins/additionals/assets/javascripts/bootstrap-datepicker.min.js @@ -0,0 +1,8 @@ +/*! + * Datepicker for Bootstrap v1.8.0 (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a,b){function c(){return new Date(Date.UTC.apply(Date,arguments))}function d(){var a=new Date;return c(a.getFullYear(),a.getMonth(),a.getDate())}function e(a,b){return a.getUTCFullYear()===b.getUTCFullYear()&&a.getUTCMonth()===b.getUTCMonth()&&a.getUTCDate()===b.getUTCDate()}function f(c,d){return function(){return d!==b&&a.fn.datepicker.deprecated(d),this[c].apply(this,arguments)}}function g(a){return a&&!isNaN(a.getTime())}function h(b,c){function d(a,b){return b.toLowerCase()}var e,f=a(b).data(),g={},h=new RegExp("^"+c.toLowerCase()+"([A-Z])");c=new RegExp("^"+c.toLowerCase());for(var i in f)c.test(i)&&(e=i.replace(h,d),g[e]=f[i]);return g}function i(b){var c={};if(q[b]||(b=b.split("-")[0],q[b])){var d=q[b];return a.each(p,function(a,b){b in d&&(c[b]=d[b])}),c}}var j=function(){var b={get:function(a){return this.slice(a)[0]},contains:function(a){for(var b=a&&a.valueOf(),c=0,d=this.length;c]/g)||[]).length<=0)return!0;var d=a(c);return d.length>0}catch(a){return!1}},_process_options:function(b){this._o=a.extend({},this._o,b);var e=this.o=a.extend({},this._o),f=e.language;q[f]||(f=f.split("-")[0],q[f]||(f=o.language)),e.language=f,e.startView=this._resolveViewName(e.startView),e.minViewMode=this._resolveViewName(e.minViewMode),e.maxViewMode=this._resolveViewName(e.maxViewMode),e.startView=Math.max(this.o.minViewMode,Math.min(this.o.maxViewMode,e.startView)),e.multidate!==!0&&(e.multidate=Number(e.multidate)||!1,e.multidate!==!1&&(e.multidate=Math.max(0,e.multidate))),e.multidateSeparator=String(e.multidateSeparator),e.weekStart%=7,e.weekEnd=(e.weekStart+6)%7;var g=r.parseFormat(e.format);e.startDate!==-(1/0)&&(e.startDate?e.startDate instanceof Date?e.startDate=this._local_to_utc(this._zero_time(e.startDate)):e.startDate=r.parseDate(e.startDate,g,e.language,e.assumeNearbyYear):e.startDate=-(1/0)),e.endDate!==1/0&&(e.endDate?e.endDate instanceof Date?e.endDate=this._local_to_utc(this._zero_time(e.endDate)):e.endDate=r.parseDate(e.endDate,g,e.language,e.assumeNearbyYear):e.endDate=1/0),e.daysOfWeekDisabled=this._resolveDaysOfWeek(e.daysOfWeekDisabled||[]),e.daysOfWeekHighlighted=this._resolveDaysOfWeek(e.daysOfWeekHighlighted||[]),e.datesDisabled=e.datesDisabled||[],a.isArray(e.datesDisabled)||(e.datesDisabled=e.datesDisabled.split(",")),e.datesDisabled=a.map(e.datesDisabled,function(a){return r.parseDate(a,g,e.language,e.assumeNearbyYear)});var h=String(e.orientation).toLowerCase().split(/\s+/g),i=e.orientation.toLowerCase();if(h=a.grep(h,function(a){return/^auto|left|right|top|bottom$/.test(a)}),e.orientation={x:"auto",y:"auto"},i&&"auto"!==i)if(1===h.length)switch(h[0]){case"top":case"bottom":e.orientation.y=h[0];break;case"left":case"right":e.orientation.x=h[0]}else i=a.grep(h,function(a){return/^left|right$/.test(a)}),e.orientation.x=i[0]||"auto",i=a.grep(h,function(a){return/^top|bottom$/.test(a)}),e.orientation.y=i[0]||"auto";else;if(e.defaultViewDate instanceof Date||"string"==typeof e.defaultViewDate)e.defaultViewDate=r.parseDate(e.defaultViewDate,g,e.language,e.assumeNearbyYear);else if(e.defaultViewDate){var j=e.defaultViewDate.year||(new Date).getFullYear(),k=e.defaultViewDate.month||0,l=e.defaultViewDate.day||1;e.defaultViewDate=c(j,k,l)}else e.defaultViewDate=d()},_events:[],_secondaryEvents:[],_applyEvents:function(a){for(var c,d,e,f=0;ff?(this.picker.addClass("datepicker-orient-right"),n+=m-b):this.o.rtl?this.picker.addClass("datepicker-orient-right"):this.picker.addClass("datepicker-orient-left");var p,q=this.o.orientation.y;if("auto"===q&&(p=-g+o-c,q=p<0?"bottom":"top"),this.picker.addClass("datepicker-orient-"+q),"top"===q?o-=c+parseInt(this.picker.css("padding-top")):o+=l,this.o.rtl){var r=f-(n+m);this.picker.css({top:o,right:r,zIndex:j})}else this.picker.css({top:o,left:n,zIndex:j});return this},_allow_update:!0,update:function(){if(!this._allow_update)return this;var b=this.dates.copy(),c=[],d=!1;return arguments.length?(a.each(arguments,a.proxy(function(a,b){b instanceof Date&&(b=this._local_to_utc(b)),c.push(b)},this)),d=!0):(c=this.isInput?this.element.val():this.element.data("date")||this.inputField.val(),c=c&&this.o.multidate?c.split(this.o.multidateSeparator):[c],delete this.element.data().date),c=a.map(c,a.proxy(function(a){return r.parseDate(a,this.o.format,this.o.language,this.o.assumeNearbyYear)},this)),c=a.grep(c,a.proxy(function(a){return!this.dateWithinRange(a)||!a},this),!0),this.dates.replace(c),this.o.updateViewDate&&(this.dates.length?this.viewDate=new Date(this.dates.get(-1)):this.viewDatethis.o.endDate?this.viewDate=new Date(this.o.endDate):this.viewDate=this.o.defaultViewDate),d?(this.setValue(),this.element.change()):this.dates.length&&String(b)!==String(this.dates)&&d&&(this._trigger("changeDate"),this.element.change()),!this.dates.length&&b.length&&(this._trigger("clearDate"),this.element.change()),this.fill(),this},fillDow:function(){if(this.o.showWeekDays){var b=this.o.weekStart,c="";for(this.o.calendarWeeks&&(c+=' ');b";c+="",this.picker.find(".datepicker-days thead").append(c)}},fillMonths:function(){for(var a,b=this._utc_to_local(this.viewDate),c="",d=0;d<12;d++)a=b&&b.getMonth()===d?" focused":"",c+=''+q[this.o.language].monthsShort[d]+"";this.picker.find(".datepicker-months td").html(c)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],f=this.viewDate.getUTCFullYear(),g=this.viewDate.getUTCMonth(),h=d();return b.getUTCFullYear()f||b.getUTCFullYear()===f&&b.getUTCMonth()>g)&&c.push("new"),this.focusDate&&b.valueOf()===this.focusDate.valueOf()&&c.push("focused"),this.o.todayHighlight&&e(b,h)&&c.push("today"),this.dates.contains(b)!==-1&&c.push("active"),this.dateWithinRange(b)||c.push("disabled"),this.dateIsDisabled(b)&&c.push("disabled","disabled-date"),a.inArray(b.getUTCDay(),this.o.daysOfWeekHighlighted)!==-1&&c.push("highlighted"),this.range&&(b>this.range[0]&&bh)&&j.push("disabled"),t===r&&j.push("focused"),i!==a.noop&&(l=i(new Date(t,0,1)),l===b?l={}:"boolean"==typeof l?l={enabled:l}:"string"==typeof l&&(l={classes:l}),l.enabled===!1&&j.push("disabled"),l.classes&&(j=j.concat(l.classes.split(/\s+/))),l.tooltip&&(k=l.tooltip)),m+='"+t+"";o.find(".datepicker-switch").text(p+"-"+q),o.find("td").html(m)},fill:function(){var d,e,f=new Date(this.viewDate),g=f.getUTCFullYear(),h=f.getUTCMonth(),i=this.o.startDate!==-(1/0)?this.o.startDate.getUTCFullYear():-(1/0),j=this.o.startDate!==-(1/0)?this.o.startDate.getUTCMonth():-(1/0),k=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,l=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,m=q[this.o.language].today||q.en.today||"",n=q[this.o.language].clear||q.en.clear||"",o=q[this.o.language].titleFormat||q.en.titleFormat;if(!isNaN(g)&&!isNaN(h)){this.picker.find(".datepicker-days .datepicker-switch").text(r.formatDate(f,o,this.o.language)),this.picker.find("tfoot .today").text(m).css("display",this.o.todayBtn===!0||"linked"===this.o.todayBtn?"table-cell":"none"),this.picker.find("tfoot .clear").text(n).css("display",this.o.clearBtn===!0?"table-cell":"none"),this.picker.find("thead .datepicker-title").text(this.o.title).css("display","string"==typeof this.o.title&&""!==this.o.title?"table-cell":"none"),this.updateNavArrows(),this.fillMonths();var p=c(g,h,0),s=p.getUTCDate();p.setUTCDate(s-(p.getUTCDay()-this.o.weekStart+7)%7);var t=new Date(p);p.getUTCFullYear()<100&&t.setUTCFullYear(p.getUTCFullYear()),t.setUTCDate(t.getUTCDate()+42),t=t.valueOf();for(var u,v,w=[];p.valueOf()"),this.o.calendarWeeks)){var x=new Date(+p+(this.o.weekStart-u-7)%7*864e5),y=new Date(Number(x)+(11-x.getUTCDay())%7*864e5),z=new Date(Number(z=c(y.getUTCFullYear(),0,1))+(11-z.getUTCDay())%7*864e5),A=(y-z)/864e5/7+1;w.push(''+A+"")}v=this.getClassNames(p),v.push("day");var B=p.getUTCDate();this.o.beforeShowDay!==a.noop&&(e=this.o.beforeShowDay(this._utc_to_local(p)),e===b?e={}:"boolean"==typeof e?e={enabled:e}:"string"==typeof e&&(e={classes:e}),e.enabled===!1&&v.push("disabled"),e.classes&&(v=v.concat(e.classes.split(/\s+/))),e.tooltip&&(d=e.tooltip),e.content&&(B=e.content)),v=a.isFunction(a.uniqueSort)?a.uniqueSort(v):a.unique(v),w.push(''+B+""),d=null,u===this.o.weekEnd&&w.push(""),p.setUTCDate(p.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").html(w.join(""));var C=q[this.o.language].monthsTitle||q.en.monthsTitle||"Months",D=this.picker.find(".datepicker-months").find(".datepicker-switch").text(this.o.maxViewMode<2?C:g).end().find("tbody span").removeClass("active");if(a.each(this.dates,function(a,b){b.getUTCFullYear()===g&&D.eq(b.getUTCMonth()).addClass("active")}),(gk)&&D.addClass("disabled"),g===i&&D.slice(0,j).addClass("disabled"),g===k&&D.slice(l+1).addClass("disabled"),this.o.beforeShowMonth!==a.noop){var E=this;a.each(D,function(c,d){var e=new Date(g,c,1),f=E.o.beforeShowMonth(e);f===b?f={}:"boolean"==typeof f?f={enabled:f}:"string"==typeof f&&(f={classes:f}),f.enabled!==!1||a(d).hasClass("disabled")||a(d).addClass("disabled"),f.classes&&a(d).addClass(f.classes),f.tooltip&&a(d).prop("title",f.tooltip)})}this._fill_yearsView(".datepicker-years","year",10,g,i,k,this.o.beforeShowYear),this._fill_yearsView(".datepicker-decades","decade",100,g,i,k,this.o.beforeShowDecade),this._fill_yearsView(".datepicker-centuries","century",1e3,g,i,k,this.o.beforeShowCentury)}},updateNavArrows:function(){if(this._allow_update){var a,b,c=new Date(this.viewDate),d=c.getUTCFullYear(),e=c.getUTCMonth(),f=this.o.startDate!==-(1/0)?this.o.startDate.getUTCFullYear():-(1/0),g=this.o.startDate!==-(1/0)?this.o.startDate.getUTCMonth():-(1/0),h=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,i=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,j=1;switch(this.viewMode){case 4:j*=10;case 3:j*=10;case 2:j*=10;case 1:a=Math.floor(d/j)*jh;break;case 0:a=d<=f&&e=h&&e>i}this.picker.find(".prev").toggleClass("disabled",a),this.picker.find(".next").toggleClass("disabled",b)}},click:function(b){b.preventDefault(),b.stopPropagation();var e,f,g,h;e=a(b.target),e.hasClass("datepicker-switch")&&this.viewMode!==this.o.maxViewMode&&this.setViewMode(this.viewMode+1),e.hasClass("today")&&!e.hasClass("day")&&(this.setViewMode(0),this._setDate(d(),"linked"===this.o.todayBtn?null:"view")),e.hasClass("clear")&&this.clearDates(),e.hasClass("disabled")||(e.hasClass("month")||e.hasClass("year")||e.hasClass("decade")||e.hasClass("century"))&&(this.viewDate.setUTCDate(1),f=1,1===this.viewMode?(h=e.parent().find("span").index(e),g=this.viewDate.getUTCFullYear(),this.viewDate.setUTCMonth(h)):(h=0,g=Number(e.text()),this.viewDate.setUTCFullYear(g)),this._trigger(r.viewModes[this.viewMode-1].e,this.viewDate),this.viewMode===this.o.minViewMode?this._setDate(c(g,h,f)):(this.setViewMode(this.viewMode-1),this.fill())),this.picker.is(":visible")&&this._focused_from&&this._focused_from.focus(),delete this._focused_from},dayCellClick:function(b){var c=a(b.currentTarget),d=c.data("date"),e=new Date(d);this.o.updateViewDate&&(e.getUTCFullYear()!==this.viewDate.getUTCFullYear()&&this._trigger("changeYear",this.viewDate),e.getUTCMonth()!==this.viewDate.getUTCMonth()&&this._trigger("changeMonth",this.viewDate)),this._setDate(e)},navArrowsClick:function(b){var c=a(b.currentTarget),d=c.hasClass("prev")?-1:1;0!==this.viewMode&&(d*=12*r.viewModes[this.viewMode].navStep),this.viewDate=this.moveMonth(this.viewDate,d),this._trigger(r.viewModes[this.viewMode].e,this.viewDate),this.fill()},_toggle_multidate:function(a){var b=this.dates.contains(a);if(a||this.dates.clear(),b!==-1?(this.o.multidate===!0||this.o.multidate>1||this.o.toggleActive)&&this.dates.remove(b):this.o.multidate===!1?(this.dates.clear(),this.dates.push(a)):this.dates.push(a),"number"==typeof this.o.multidate)for(;this.dates.length>this.o.multidate;)this.dates.remove(0)},_setDate:function(a,b){b&&"date"!==b||this._toggle_multidate(a&&new Date(a)),(!b&&this.o.updateViewDate||"view"===b)&&(this.viewDate=a&&new Date(a)),this.fill(),this.setValue(),b&&"view"===b||this._trigger("changeDate"),this.inputField.trigger("change"),!this.o.autoclose||b&&"date"!==b||this.hide()},moveDay:function(a,b){var c=new Date(a);return c.setUTCDate(a.getUTCDate()+b),c},moveWeek:function(a,b){return this.moveDay(a,7*b)},moveMonth:function(a,b){if(!g(a))return this.o.defaultViewDate;if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),h=e.getUTCMonth(),i=Math.abs(b);if(b=b>0?1:-1,1===i)d=b===-1?function(){return e.getUTCMonth()===h}:function(){return e.getUTCMonth()!==c},c=h+b,e.setUTCMonth(c),c=(c+12)%12;else{for(var j=0;j0},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(!this.picker.is(":visible"))return void(40!==a.keyCode&&27!==a.keyCode||(this.show(),a.stopPropagation()));var b,c,d=!1,e=this.focusDate||this.viewDate;switch(a.keyCode){case 27:this.focusDate?(this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill()):this.hide(),a.preventDefault(),a.stopPropagation();break;case 37:case 38:case 39:case 40:if(!this.o.keyboardNavigation||7===this.o.daysOfWeekDisabled.length)break;b=37===a.keyCode||38===a.keyCode?-1:1,0===this.viewMode?a.ctrlKey?(c=this.moveAvailableDate(e,b,"moveYear"),c&&this._trigger("changeYear",this.viewDate)):a.shiftKey?(c=this.moveAvailableDate(e,b,"moveMonth"),c&&this._trigger("changeMonth",this.viewDate)):37===a.keyCode||39===a.keyCode?c=this.moveAvailableDate(e,b,"moveDay"):this.weekOfDateIsDisabled(e)||(c=this.moveAvailableDate(e,b,"moveWeek")):1===this.viewMode?(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,"moveMonth")):2===this.viewMode&&(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,"moveYear")),c&&(this.focusDate=this.viewDate=c,this.setValue(),this.fill(),a.preventDefault());break;case 13:if(!this.o.forceParse)break;e=this.focusDate||this.dates.get(-1)||this.viewDate,this.o.keyboardNavigation&&(this._toggle_multidate(e),d=!0),this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.setValue(),this.fill(),this.picker.is(":visible")&&(a.preventDefault(),a.stopPropagation(),this.o.autoclose&&this.hide());break;case 9:this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill(),this.hide()}d&&(this.dates.length?this._trigger("changeDate"):this._trigger("clearDate"),this.inputField.trigger("change"))},setViewMode:function(a){this.viewMode=a,this.picker.children("div").hide().filter(".datepicker-"+r.viewModes[this.viewMode].clsName).show(),this.updateNavArrows(),this._trigger("changeViewMode",new Date(this.viewDate))}};var l=function(b,c){a.data(b,"datepicker",this),this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,this.keepEmptyValues=c.keepEmptyValues,delete c.keepEmptyValues,n.call(a(this.inputs),c).on("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a.data(b,"datepicker")}),this.updateDates()};l.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.getUTCDate()}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},clearDates:function(){a.each(this.pickers,function(a,b){b.clearDates()})},dateUpdated:function(c){if(!this.updating){this.updating=!0;var d=a.data(c.target,"datepicker");if(d!==b){var e=d.getUTCDate(),f=this.keepEmptyValues,g=a.inArray(c.target,this.inputs),h=g-1,i=g+1,j=this.inputs.length;if(g!==-1){if(a.each(this.pickers,function(a,b){b.getUTCDate()||b!==d&&f||b.setUTCDate(e)}),e=0&&ethis.dates[i])for(;ithis.dates[i];)this.pickers[i++].setUTCDate(e);this.updateDates(),delete this.updating}}}},destroy:function(){a.map(this.pickers,function(a){a.destroy()}),a(this.inputs).off("changeDate",this.dateUpdated),delete this.element.data().datepicker},remove:f("destroy","Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead")};var m=a.fn.datepicker,n=function(c){var d=Array.apply(null,arguments);d.shift();var e;if(this.each(function(){var b=a(this),f=b.data("datepicker"),g="object"==typeof c&&c;if(!f){var j=h(this,"date"),m=a.extend({},o,j,g),n=i(m.language),p=a.extend({},o,n,j,g);b.hasClass("input-daterange")||p.inputs?(a.extend(p,{inputs:p.inputs||b.find("input").toArray()}),f=new l(this,p)):f=new k(this,p),b.data("datepicker",f)}"string"==typeof c&&"function"==typeof f[c]&&(e=f[c].apply(f,d))}),e===b||e instanceof k||e instanceof l)return this;if(this.length>1)throw new Error("Using only allowed for the collection of a single element ("+c+" function)");return e};a.fn.datepicker=n;var o=a.fn.datepicker.defaults={assumeNearbyYear:!1,autoclose:!1,beforeShowDay:a.noop,beforeShowMonth:a.noop,beforeShowYear:a.noop,beforeShowDecade:a.noop,beforeShowCentury:a.noop,calendarWeeks:!1,clearBtn:!1,toggleActive:!1,daysOfWeekDisabled:[],daysOfWeekHighlighted:[],datesDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keepEmptyValues:!1,keyboardNavigation:!0,language:"en",minViewMode:0,maxViewMode:4,multidate:!1,multidateSeparator:",",orientation:"auto",rtl:!1,startDate:-(1/0),startView:0,todayBtn:!1,todayHighlight:!1,updateViewDate:!0,weekStart:0,disableTouchKeyboard:!1,enableOnReadonly:!0,showOnFocus:!0,zIndexOffset:10,container:"body",immediateUpdates:!1,title:"",templates:{leftArrow:"«",rightArrow:"»"},showWeekDays:!0},p=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=k;var q=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear",titleFormat:"MM yyyy"}},r={viewModes:[{names:["days","month"],clsName:"days",e:"changeMonth"},{names:["months","year"],clsName:"months",e:"changeYear",navStep:1},{names:["years","decade"],clsName:"years",e:"changeDecade",navStep:10},{names:["decades","century"],clsName:"decades",e:"changeCentury",navStep:100},{names:["centuries","millennium"],clsName:"centuries",e:"changeMillennium",navStep:1e3}],validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,parseFormat:function(a){if("function"==typeof a.toValue&&"function"==typeof a.toDisplay)return a;var b=a.replace(this.validParts,"\0").split("\0"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,e,f,g){function h(a,b){return b===!0&&(b=10),a<100&&(a+=2e3,a>(new Date).getFullYear()+b&&(a-=100)),a}function i(){var a=this.slice(0,j[n].length),b=j[n].slice(0,a.length);return a.toLowerCase()===b.toLowerCase()}if(!c)return b;if(c instanceof Date)return c;if("string"==typeof e&&(e=r.parseFormat(e)),e.toValue)return e.toValue(c,e,f);var j,l,m,n,o,p={d:"moveDay",m:"moveMonth",w:"moveWeek",y:"moveYear"},s={yesterday:"-1d",today:"+0d",tomorrow:"+1d"};if(c in s&&(c=s[c]),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(c)){for(j=c.match(/([\-+]\d+)([dmwy])/gi),c=new Date,n=0;n'+o.templates.leftArrow+''+o.templates.rightArrow+"", +contTemplate:'',footTemplate:''};r.template='
        '+r.headTemplate+""+r.footTemplate+'
        '+r.headTemplate+r.contTemplate+r.footTemplate+'
        '+r.headTemplate+r.contTemplate+r.footTemplate+'
        '+r.headTemplate+r.contTemplate+r.footTemplate+'
        '+r.headTemplate+r.contTemplate+r.footTemplate+"
        ",a.fn.datepicker.DPGlobal=r,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=m,this},a.fn.datepicker.version="1.8.0",a.fn.datepicker.deprecated=function(a){var b=window.console;b&&b.warn&&b.warn("DEPRECATED: "+a)},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),n.call(c,"show"))}),a(function(){n.call(a('[data-provide="datepicker-inline"]'))})}); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/chartjs-plugin-colorschemes.min.js b/plugins/additionals/assets/javascripts/chartjs-plugin-colorschemes.min.js deleted file mode 100644 index bf10124..0000000 --- a/plugins/additionals/assets/javascripts/chartjs-plugin-colorschemes.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * chartjs-plugin-colorschemes v0.4.0 - * https://nagix.github.io/chartjs-plugin-colorschemes - * (c) 2019 Akihiko Kusanagi - * Released under the MIT license - */ -!function(f,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],e):(f=f||self).ChartColorSchemes=e(f.Chart)}(this,function(f){"use strict";f=f&&f.hasOwnProperty("default")?f.default:f;var e=Object.freeze({YlGn3:["#f7fcb9","#addd8e","#31a354"],YlGn4:["#ffffcc","#c2e699","#78c679","#238443"],YlGn5:["#ffffcc","#c2e699","#78c679","#31a354","#006837"],YlGn6:["#ffffcc","#d9f0a3","#addd8e","#78c679","#31a354","#006837"],YlGn7:["#ffffcc","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#005a32"],YlGn8:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#005a32"],YlGn9:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],YlGnBu3:["#edf8b1","#7fcdbb","#2c7fb8"],YlGnBu4:["#ffffcc","#a1dab4","#41b6c4","#225ea8"],YlGnBu5:["#ffffcc","#a1dab4","#41b6c4","#2c7fb8","#253494"],YlGnBu6:["#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#2c7fb8","#253494"],YlGnBu7:["#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"],YlGnBu8:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"],YlGnBu9:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],GnBu3:["#e0f3db","#a8ddb5","#43a2ca"],GnBu4:["#f0f9e8","#bae4bc","#7bccc4","#2b8cbe"],GnBu5:["#f0f9e8","#bae4bc","#7bccc4","#43a2ca","#0868ac"],GnBu6:["#f0f9e8","#ccebc5","#a8ddb5","#7bccc4","#43a2ca","#0868ac"],GnBu7:["#f0f9e8","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#08589e"],GnBu8:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#08589e"],GnBu9:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],BuGn3:["#e5f5f9","#99d8c9","#2ca25f"],BuGn4:["#edf8fb","#b2e2e2","#66c2a4","#238b45"],BuGn5:["#edf8fb","#b2e2e2","#66c2a4","#2ca25f","#006d2c"],BuGn6:["#edf8fb","#ccece6","#99d8c9","#66c2a4","#2ca25f","#006d2c"],BuGn7:["#edf8fb","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#005824"],BuGn8:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#005824"],BuGn9:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],PuBuGn3:["#ece2f0","#a6bddb","#1c9099"],PuBuGn4:["#f6eff7","#bdc9e1","#67a9cf","#02818a"],PuBuGn5:["#f6eff7","#bdc9e1","#67a9cf","#1c9099","#016c59"],PuBuGn6:["#f6eff7","#d0d1e6","#a6bddb","#67a9cf","#1c9099","#016c59"],PuBuGn7:["#f6eff7","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016450"],PuBuGn8:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016450"],PuBuGn9:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],PuBu3:["#ece7f2","#a6bddb","#2b8cbe"],PuBu4:["#f1eef6","#bdc9e1","#74a9cf","#0570b0"],PuBu5:["#f1eef6","#bdc9e1","#74a9cf","#2b8cbe","#045a8d"],PuBu6:["#f1eef6","#d0d1e6","#a6bddb","#74a9cf","#2b8cbe","#045a8d"],PuBu7:["#f1eef6","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#034e7b"],PuBu8:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#034e7b"],PuBu9:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu3:["#e0ecf4","#9ebcda","#8856a7"],BuPu4:["#edf8fb","#b3cde3","#8c96c6","#88419d"],BuPu5:["#edf8fb","#b3cde3","#8c96c6","#8856a7","#810f7c"],BuPu6:["#edf8fb","#bfd3e6","#9ebcda","#8c96c6","#8856a7","#810f7c"],BuPu7:["#edf8fb","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#6e016b"],BuPu8:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#6e016b"],BuPu9:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],RdPu3:["#fde0dd","#fa9fb5","#c51b8a"],RdPu4:["#feebe2","#fbb4b9","#f768a1","#ae017e"],RdPu5:["#feebe2","#fbb4b9","#f768a1","#c51b8a","#7a0177"],RdPu6:["#feebe2","#fcc5c0","#fa9fb5","#f768a1","#c51b8a","#7a0177"],RdPu7:["#feebe2","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177"],RdPu8:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177"],RdPu9:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],PuRd3:["#e7e1ef","#c994c7","#dd1c77"],PuRd4:["#f1eef6","#d7b5d8","#df65b0","#ce1256"],PuRd5:["#f1eef6","#d7b5d8","#df65b0","#dd1c77","#980043"],PuRd6:["#f1eef6","#d4b9da","#c994c7","#df65b0","#dd1c77","#980043"],PuRd7:["#f1eef6","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#91003f"],PuRd8:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#91003f"],PuRd9:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],OrRd3:["#fee8c8","#fdbb84","#e34a33"],OrRd4:["#fef0d9","#fdcc8a","#fc8d59","#d7301f"],OrRd5:["#fef0d9","#fdcc8a","#fc8d59","#e34a33","#b30000"],OrRd6:["#fef0d9","#fdd49e","#fdbb84","#fc8d59","#e34a33","#b30000"],OrRd7:["#fef0d9","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#990000"],OrRd8:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#990000"],OrRd9:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],YlOrRd3:["#ffeda0","#feb24c","#f03b20"],YlOrRd4:["#ffffb2","#fecc5c","#fd8d3c","#e31a1c"],YlOrRd5:["#ffffb2","#fecc5c","#fd8d3c","#f03b20","#bd0026"],YlOrRd6:["#ffffb2","#fed976","#feb24c","#fd8d3c","#f03b20","#bd0026"],YlOrRd7:["#ffffb2","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#b10026"],YlOrRd8:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#b10026"],YlOrRd9:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],YlOrBr3:["#fff7bc","#fec44f","#d95f0e"],YlOrBr4:["#ffffd4","#fed98e","#fe9929","#cc4c02"],YlOrBr5:["#ffffd4","#fed98e","#fe9929","#d95f0e","#993404"],YlOrBr6:["#ffffd4","#fee391","#fec44f","#fe9929","#d95f0e","#993404"],YlOrBr7:["#ffffd4","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#8c2d04"],YlOrBr8:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#8c2d04"],YlOrBr9:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],Purples3:["#efedf5","#bcbddc","#756bb1"],Purples4:["#f2f0f7","#cbc9e2","#9e9ac8","#6a51a3"],Purples5:["#f2f0f7","#cbc9e2","#9e9ac8","#756bb1","#54278f"],Purples6:["#f2f0f7","#dadaeb","#bcbddc","#9e9ac8","#756bb1","#54278f"],Purples7:["#f2f0f7","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#4a1486"],Purples8:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#4a1486"],Purples9:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],Blues3:["#deebf7","#9ecae1","#3182bd"],Blues4:["#eff3ff","#bdd7e7","#6baed6","#2171b5"],Blues5:["#eff3ff","#bdd7e7","#6baed6","#3182bd","#08519c"],Blues6:["#eff3ff","#c6dbef","#9ecae1","#6baed6","#3182bd","#08519c"],Blues7:["#eff3ff","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594"],Blues8:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594"],Blues9:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],Greens3:["#e5f5e0","#a1d99b","#31a354"],Greens4:["#edf8e9","#bae4b3","#74c476","#238b45"],Greens5:["#edf8e9","#bae4b3","#74c476","#31a354","#006d2c"],Greens6:["#edf8e9","#c7e9c0","#a1d99b","#74c476","#31a354","#006d2c"],Greens7:["#edf8e9","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#005a32"],Greens8:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#005a32"],Greens9:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],Oranges3:["#fee6ce","#fdae6b","#e6550d"],Oranges4:["#feedde","#fdbe85","#fd8d3c","#d94701"],Oranges5:["#feedde","#fdbe85","#fd8d3c","#e6550d","#a63603"],Oranges6:["#feedde","#fdd0a2","#fdae6b","#fd8d3c","#e6550d","#a63603"],Oranges7:["#feedde","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#8c2d04"],Oranges8:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#8c2d04"],Oranges9:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],Reds3:["#fee0d2","#fc9272","#de2d26"],Reds4:["#fee5d9","#fcae91","#fb6a4a","#cb181d"],Reds5:["#fee5d9","#fcae91","#fb6a4a","#de2d26","#a50f15"],Reds6:["#fee5d9","#fcbba1","#fc9272","#fb6a4a","#de2d26","#a50f15"],Reds7:["#fee5d9","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#99000d"],Reds8:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#99000d"],Reds9:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],Greys3:["#f0f0f0","#bdbdbd","#636363"],Greys4:["#f7f7f7","#cccccc","#969696","#525252"],Greys5:["#f7f7f7","#cccccc","#969696","#636363","#252525"],Greys6:["#f7f7f7","#d9d9d9","#bdbdbd","#969696","#636363","#252525"],Greys7:["#f7f7f7","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525"],Greys8:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525"],Greys9:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],PuOr3:["#f1a340","#f7f7f7","#998ec3"],PuOr4:["#e66101","#fdb863","#b2abd2","#5e3c99"],PuOr5:["#e66101","#fdb863","#f7f7f7","#b2abd2","#5e3c99"],PuOr6:["#b35806","#f1a340","#fee0b6","#d8daeb","#998ec3","#542788"],PuOr7:["#b35806","#f1a340","#fee0b6","#f7f7f7","#d8daeb","#998ec3","#542788"],PuOr8:["#b35806","#e08214","#fdb863","#fee0b6","#d8daeb","#b2abd2","#8073ac","#542788"],PuOr9:["#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788"],PuOr10:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],PuOr11:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],BrBG3:["#d8b365","#f5f5f5","#5ab4ac"],BrBG4:["#a6611a","#dfc27d","#80cdc1","#018571"],BrBG5:["#a6611a","#dfc27d","#f5f5f5","#80cdc1","#018571"],BrBG6:["#8c510a","#d8b365","#f6e8c3","#c7eae5","#5ab4ac","#01665e"],BrBG7:["#8c510a","#d8b365","#f6e8c3","#f5f5f5","#c7eae5","#5ab4ac","#01665e"],BrBG8:["#8c510a","#bf812d","#dfc27d","#f6e8c3","#c7eae5","#80cdc1","#35978f","#01665e"],BrBG9:["#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e"],BrBG10:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],BrBG11:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],PRGn3:["#af8dc3","#f7f7f7","#7fbf7b"],PRGn4:["#7b3294","#c2a5cf","#a6dba0","#008837"],PRGn5:["#7b3294","#c2a5cf","#f7f7f7","#a6dba0","#008837"],PRGn6:["#762a83","#af8dc3","#e7d4e8","#d9f0d3","#7fbf7b","#1b7837"],PRGn7:["#762a83","#af8dc3","#e7d4e8","#f7f7f7","#d9f0d3","#7fbf7b","#1b7837"],PRGn8:["#762a83","#9970ab","#c2a5cf","#e7d4e8","#d9f0d3","#a6dba0","#5aae61","#1b7837"],PRGn9:["#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837"],PRGn10:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],PRGn11:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],PiYG3:["#e9a3c9","#f7f7f7","#a1d76a"],PiYG4:["#d01c8b","#f1b6da","#b8e186","#4dac26"],PiYG5:["#d01c8b","#f1b6da","#f7f7f7","#b8e186","#4dac26"],PiYG6:["#c51b7d","#e9a3c9","#fde0ef","#e6f5d0","#a1d76a","#4d9221"],PiYG7:["#c51b7d","#e9a3c9","#fde0ef","#f7f7f7","#e6f5d0","#a1d76a","#4d9221"],PiYG8:["#c51b7d","#de77ae","#f1b6da","#fde0ef","#e6f5d0","#b8e186","#7fbc41","#4d9221"],PiYG9:["#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221"],PiYG10:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PiYG11:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],RdBu3:["#ef8a62","#f7f7f7","#67a9cf"],RdBu4:["#ca0020","#f4a582","#92c5de","#0571b0"],RdBu5:["#ca0020","#f4a582","#f7f7f7","#92c5de","#0571b0"],RdBu6:["#b2182b","#ef8a62","#fddbc7","#d1e5f0","#67a9cf","#2166ac"],RdBu7:["#b2182b","#ef8a62","#fddbc7","#f7f7f7","#d1e5f0","#67a9cf","#2166ac"],RdBu8:["#b2182b","#d6604d","#f4a582","#fddbc7","#d1e5f0","#92c5de","#4393c3","#2166ac"],RdBu9:["#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac"],RdBu10:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],RdBu11:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],RdGy3:["#ef8a62","#ffffff","#999999"],RdGy4:["#ca0020","#f4a582","#bababa","#404040"],RdGy5:["#ca0020","#f4a582","#ffffff","#bababa","#404040"],RdGy6:["#b2182b","#ef8a62","#fddbc7","#e0e0e0","#999999","#4d4d4d"],RdGy7:["#b2182b","#ef8a62","#fddbc7","#ffffff","#e0e0e0","#999999","#4d4d4d"],RdGy8:["#b2182b","#d6604d","#f4a582","#fddbc7","#e0e0e0","#bababa","#878787","#4d4d4d"],RdGy9:["#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d"],RdGy10:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],RdGy11:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],RdYlBu3:["#fc8d59","#ffffbf","#91bfdb"],RdYlBu4:["#d7191c","#fdae61","#abd9e9","#2c7bb6"],RdYlBu5:["#d7191c","#fdae61","#ffffbf","#abd9e9","#2c7bb6"],RdYlBu6:["#d73027","#fc8d59","#fee090","#e0f3f8","#91bfdb","#4575b4"],RdYlBu7:["#d73027","#fc8d59","#fee090","#ffffbf","#e0f3f8","#91bfdb","#4575b4"],RdYlBu8:["#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4"],RdYlBu9:["#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4"],RdYlBu10:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],RdYlBu11:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],Spectral3:["#fc8d59","#ffffbf","#99d594"],Spectral4:["#d7191c","#fdae61","#abdda4","#2b83ba"],Spectral5:["#d7191c","#fdae61","#ffffbf","#abdda4","#2b83ba"],Spectral6:["#d53e4f","#fc8d59","#fee08b","#e6f598","#99d594","#3288bd"],Spectral7:["#d53e4f","#fc8d59","#fee08b","#ffffbf","#e6f598","#99d594","#3288bd"],Spectral8:["#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd"],Spectral9:["#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd"],Spectral10:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],Spectral11:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn3:["#fc8d59","#ffffbf","#91cf60"],RdYlGn4:["#d7191c","#fdae61","#a6d96a","#1a9641"],RdYlGn5:["#d7191c","#fdae61","#ffffbf","#a6d96a","#1a9641"],RdYlGn6:["#d73027","#fc8d59","#fee08b","#d9ef8b","#91cf60","#1a9850"],RdYlGn7:["#d73027","#fc8d59","#fee08b","#ffffbf","#d9ef8b","#91cf60","#1a9850"],RdYlGn8:["#d73027","#f46d43","#fdae61","#fee08b","#d9ef8b","#a6d96a","#66bd63","#1a9850"],RdYlGn9:["#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850"],RdYlGn10:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdYlGn11:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],Accent3:["#7fc97f","#beaed4","#fdc086"],Accent4:["#7fc97f","#beaed4","#fdc086","#ffff99"],Accent5:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0"],Accent6:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f"],Accent7:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17"],Accent8:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],DarkTwo3:["#1b9e77","#d95f02","#7570b3"],DarkTwo4:["#1b9e77","#d95f02","#7570b3","#e7298a"],DarkTwo5:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e"],DarkTwo6:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02"],DarkTwo7:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d"],DarkTwo8:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired3:["#a6cee3","#1f78b4","#b2df8a"],Paired4:["#a6cee3","#1f78b4","#b2df8a","#33a02c"],Paired5:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99"],Paired6:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c"],Paired7:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f"],Paired8:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00"],Paired9:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6"],Paired10:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a"],Paired11:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99"],Paired12:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],PastelOne3:["#fbb4ae","#b3cde3","#ccebc5"],PastelOne4:["#fbb4ae","#b3cde3","#ccebc5","#decbe4"],PastelOne5:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6"],PastelOne6:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc"],PastelOne7:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd"],PastelOne8:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec"],PastelOne9:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"],PastelTwo3:["#b3e2cd","#fdcdac","#cbd5e8"],PastelTwo4:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4"],PastelTwo5:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9"],PastelTwo6:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae"],PastelTwo7:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc"],PastelTwo8:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],SetOne3:["#e41a1c","#377eb8","#4daf4a"],SetOne4:["#e41a1c","#377eb8","#4daf4a","#984ea3"],SetOne5:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00"],SetOne6:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33"],SetOne7:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628"],SetOne8:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf"],SetOne9:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],SetTwo3:["#66c2a5","#fc8d62","#8da0cb"],SetTwo4:["#66c2a5","#fc8d62","#8da0cb","#e78ac3"],SetTwo5:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854"],SetTwo6:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f"],SetTwo7:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494"],SetTwo8:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],SetThree3:["#8dd3c7","#ffffb3","#bebada"],SetThree4:["#8dd3c7","#ffffb3","#bebada","#fb8072"],SetThree5:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3"],SetThree6:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462"],SetThree7:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69"],SetThree8:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5"],SetThree9:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9"],SetThree10:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd"],SetThree11:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5"],SetThree12:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"]}),d={brewer:e,office:Object.freeze({Adjacency6:["#a9a57c","#9cbebd","#d2cb6c","#95a39d","#c89f5d","#b1a089"],Advantage6:["#663366","#330f42","#666699","#999966","#f7901e","#a3a101"],Angles6:["#797b7e","#f96a1b","#08a1d9","#7c984a","#c2ad8d","#506e94"],Apex6:["#ceb966","#9cb084","#6bb1c9","#6585cf","#7e6bc9","#a379bb"],Apothecary6:["#93a299","#cf543f","#b5ae53","#848058","#e8b54d","#786c71"],Aspect6:["#f07f09","#9f2936","#1b587c","#4e8542","#604878","#c19859"],Atlas6:["#f81b02","#fc7715","#afbf41","#50c49f","#3b95c4","#b560d4"],Austin6:["#94c600","#71685a","#ff6700","#909465","#956b43","#fea022"],Badge6:["#f8b323","#656a59","#46b2b5","#8caa7e","#d36f68","#826276"],Banded6:["#ffc000","#a5d028","#08cc78","#f24099","#828288","#f56617"],Basis6:["#f09415","#c1b56b","#4baf73","#5aa6c0","#d17df9","#fa7e5c"],Berlin6:["#a6b727","#df5327","#fe9e00","#418ab3","#d7d447","#818183"],BlackTie6:["#6f6f74","#a7b789","#beae98","#92a9b9","#9c8265","#8d6974"],Blue6:["#0f6fc6","#009dd9","#0bd0d9","#10cf9b","#7cca62","#a5c249"],BlueGreen6:["#3494ba","#58b6c0","#75bda7","#7a8c8e","#84acb6","#2683c6"],BlueII6:["#1cade4","#2683c6","#27ced7","#42ba97","#3e8853","#62a39f"],BlueRed6:["#4a66ac","#629dd1","#297fd5","#7f8fa9","#5aa2ae","#9d90a0"],BlueWarm6:["#4a66ac","#629dd1","#297fd5","#7f8fa9","#5aa2ae","#9d90a0"],Breeze6:["#2c7c9f","#244a58","#e2751d","#ffb400","#7eb606","#c00000"],Capital6:["#4b5a60","#9c5238","#504539","#c1ad79","#667559","#bad6ad"],Celestial6:["#ac3ec1","#477bd1","#46b298","#90ba4c","#dd9d31","#e25247"],Circuit6:["#9acd4c","#faa93a","#d35940","#b258d3","#63a0cc","#8ac4a7"],Civic6:["#d16349","#ccb400","#8cadae","#8c7b70","#8fb08c","#d19049"],Clarity6:["#93a299","#ad8f67","#726056","#4c5a6a","#808da0","#79463d"],Codex6:["#990000","#efab16","#78ac35","#35aca2","#4083cf","#0d335e"],Composite6:["#98c723","#59b0b9","#deae00","#b77bb4","#e0773c","#a98d63"],Concourse6:["#2da2bf","#da1f28","#eb641b","#39639d","#474b78","#7d3c4a"],Couture6:["#9e8e5c","#a09781","#85776d","#aeafa9","#8d878b","#6b6149"],Crop6:["#8c8d86","#e6c069","#897b61","#8dab8e","#77a2bb","#e28394"],Damask6:["#9ec544","#50bea3","#4a9ccc","#9a66ca","#c54f71","#de9c3c"],Depth6:["#41aebd","#97e9d5","#a2cf49","#608f3d","#f4de3a","#fcb11c"],Dividend6:["#4d1434","#903163","#b2324b","#969fa7","#66b1ce","#40619d"],Droplet6:["#2fa3ee","#4bcaad","#86c157","#d99c3f","#ce6633","#a35dd1"],Elemental6:["#629dd1","#297fd5","#7f8fa9","#4a66ac","#5aa2ae","#9d90a0"],Equity6:["#d34817","#9b2d1f","#a28e6a","#956251","#918485","#855d5d"],Essential6:["#7a7a7a","#f5c201","#526db0","#989aac","#dc5924","#b4b392"],Excel16:["#9999ff","#993366","#ffffcc","#ccffff","#660066","#ff8080","#0066cc","#ccccff","#000080","#ff00ff","#ffff00","#0000ff","#800080","#800000","#008080","#0000ff"],Executive6:["#6076b4","#9c5252","#e68422","#846648","#63891f","#758085"],Exhibit6:["#3399ff","#69ffff","#ccff33","#3333ff","#9933ff","#ff33ff"],Expo6:["#fbc01e","#efe1a2","#fa8716","#be0204","#640f10","#7e13e3"],Facet6:["#90c226","#54a021","#e6b91e","#e76618","#c42f1a","#918655"],Feathered6:["#606372","#79a8a4","#b2ad8f","#ad8082","#dec18c","#92a185"],Flow6:["#0f6fc6","#009dd9","#0bd0d9","#10cf9b","#7cca62","#a5c249"],Focus6:["#ffb91d","#f97817","#6de304","#ff0000","#732bea","#c913ad"],Folio6:["#294171","#748cbc","#8e887c","#834736","#5a1705","#a0a16a"],Formal6:["#907f76","#a46645","#cd9c47","#9a92cd","#7d639b","#733678"],Forte6:["#c70f0c","#dd6b0d","#faa700","#93e50d","#17c7ba","#0a96e4"],Foundry6:["#72a376","#b0ccb0","#a8cdd7","#c0beaf","#cec597","#e8b7b7"],Frame6:["#40bad2","#fab900","#90bb23","#ee7008","#1ab39f","#d5393d"],Gallery6:["#b71e42","#de478e","#bc72f0","#795faf","#586ea6","#6892a0"],Genesis6:["#80b606","#e29f1d","#2397e2","#35aca2","#5430bb","#8d34e0"],Grayscale6:["#dddddd","#b2b2b2","#969696","#808080","#5f5f5f","#4d4d4d"],Green6:["#549e39","#8ab833","#c0cf3a","#029676","#4ab5c4","#0989b1"],GreenYellow6:["#99cb38","#63a537","#37a76f","#44c1a3","#4eb3cf","#51c3f9"],Grid6:["#c66951","#bf974d","#928b70","#87706b","#94734e","#6f777d"],Habitat6:["#f8c000","#f88600","#f83500","#8b723d","#818b3d","#586215"],Hardcover6:["#873624","#d6862d","#d0be40","#877f6c","#972109","#aeb795"],Headlines6:["#439eb7","#e28b55","#dcb64d","#4ca198","#835b82","#645135"],Horizon6:["#7e97ad","#cc8e60","#7a6a60","#b4936d","#67787b","#9d936f"],Infusion6:["#8c73d0","#c2e8c4","#c5a6e8","#b45ec7","#9fdafb","#95c5b0"],Inkwell6:["#860908","#4a0505","#7a500a","#c47810","#827752","#b5bb83"],Inspiration6:["#749805","#bacc82","#6e9ec2","#2046a5","#5039c6","#7411d0"],Integral6:["#1cade4","#2683c6","#27ced7","#42ba97","#3e8853","#62a39f"],Ion6:["#b01513","#ea6312","#e6b729","#6aac90","#5f9c9d","#9e5e9b"],IonBoardroom6:["#b31166","#e33d6f","#e45f3c","#e9943a","#9b6bf2","#d53dd0"],Kilter6:["#76c5ef","#fea022","#ff6700","#70a525","#a5d848","#20768c"],Madison6:["#a1d68b","#5ec795","#4dadcf","#cdb756","#e29c36","#8ec0c1"],MainEvent6:["#b80e0f","#a6987d","#7f9a71","#64969f","#9b75b2","#80737a"],Marquee6:["#418ab3","#a6b727","#f69200","#838383","#fec306","#df5327"],Median6:["#94b6d2","#dd8047","#a5ab81","#d8b25c","#7ba79d","#968c8c"],Mesh6:["#6f6f6f","#bfbfa5","#dcd084","#e7bf5f","#e9a039","#cf7133"],Metail6:["#6283ad","#324966","#5b9ea4","#1d5b57","#1b4430","#2f3c35"],Metro6:["#7fd13b","#ea157a","#feb80a","#00addc","#738ac8","#1ab39f"],Metropolitan6:["#50b4c8","#a8b97f","#9b9256","#657689","#7a855d","#84ac9d"],Module6:["#f0ad00","#60b5cc","#e66c7d","#6bb76d","#e88651","#c64847"],NewsPrint6:["#ad0101","#726056","#ac956e","#808da9","#424e5b","#730e00"],Office6:["#5b9bd5","#ed7d31","#a5a5a5","#ffc000","#4472c4","#70ad47"],OfficeClassic6:["#4f81bd","#c0504d","#9bbb59","#8064a2","#4bacc6","#f79646"],Opulent6:["#b83d68","#ac66bb","#de6c36","#f9b639","#cf6da4","#fa8d3d"],Orange6:["#e48312","#bd582c","#865640","#9b8357","#c2bc80","#94a088"],OrangeRed6:["#d34817","#9b2d1f","#a28e6a","#956251","#918485","#855d5d"],Orbit6:["#f2d908","#9de61e","#0d8be6","#c61b1b","#e26f08","#8d35d1"],Organic6:["#83992a","#3c9770","#44709d","#a23c33","#d97828","#deb340"],Oriel6:["#fe8637","#7598d9","#b32c16","#f5cd2d","#aebad5","#777c84"],Origin6:["#727ca3","#9fb8cd","#d2da7a","#fada7a","#b88472","#8e736a"],Paper6:["#a5b592","#f3a447","#e7bc29","#d092a7","#9c85c0","#809ec2"],Parallax6:["#30acec","#80c34f","#e29d3e","#d64a3b","#d64787","#a666e1"],Parcel6:["#f6a21d","#9bafb5","#c96731","#9ca383","#87795d","#a0988c"],Perception6:["#a2c816","#e07602","#e4c402","#7dc1ef","#21449b","#a2b170"],Perspective6:["#838d9b","#d2610c","#80716a","#94147c","#5d5ad2","#6f6c7d"],Pixel6:["#ff7f01","#f1b015","#fbec85","#d2c2f1","#da5af4","#9d09d1"],Plaza6:["#990000","#580101","#e94a00","#eb8f00","#a4a4a4","#666666"],Precedent6:["#993232","#9b6c34","#736c5d","#c9972b","#c95f2b","#8f7a05"],Pushpin6:["#fda023","#aa2b1e","#71685c","#64a73b","#eb5605","#b9ca1a"],Quotable6:["#00c6bb","#6feba0","#b6df5e","#efb251","#ef755f","#ed515c"],Red6:["#a5300f","#d55816","#e19825","#b19c7d","#7f5f52","#b27d49"],RedOrange6:["#e84c22","#ffbd47","#b64926","#ff8427","#cc9900","#b22600"],RedViolet6:["#e32d91","#c830cc","#4ea6dc","#4775e7","#8971e1","#d54773"],Retrospect6:["#e48312","#bd582c","#865640","#9b8357","#c2bc80","#94a088"],Revolution6:["#0c5986","#ddf53d","#508709","#bf5e00","#9c0001","#660075"],Saddle6:["#c6b178","#9c5b14","#71b2bc","#78aa5d","#867099","#4c6f75"],Savon6:["#1cade4","#2683c6","#27ced7","#42ba97","#3e8853","#62a39f"],Sketchbook6:["#a63212","#e68230","#9bb05e","#6b9bc7","#4e66b2","#8976ac"],Sky6:["#073779","#8fd9fb","#ffcc00","#eb6615","#c76402","#b523b4"],Slate6:["#bc451b","#d3ba68","#bb8640","#ad9277","#a55a43","#ad9d7b"],Slice6:["#052f61","#a50e82","#14967c","#6a9e1f","#e87d37","#c62324"],Slipstream6:["#4e67c8","#5eccf3","#a7ea52","#5dceaf","#ff8021","#f14124"],SOHO6:["#61625e","#964d2c","#66553e","#848058","#afa14b","#ad7d4d"],Solstice6:["#3891a7","#feb80a","#c32d2e","#84aa33","#964305","#475a8d"],Spectrum6:["#990000","#ff6600","#ffba00","#99cc00","#528a02","#333333"],Story6:["#1d86cd","#732e9a","#b50b1b","#e8950e","#55992b","#2c9c89"],Studio6:["#f7901e","#fec60b","#9fe62f","#4ea5d1","#1c4596","#542d90"],Summer6:["#51a6c2","#51c2a9","#7ec251","#e1dc53","#b54721","#a16bb1"],Technic6:["#6ea0b0","#ccaf0a","#8d89a4","#748560","#9e9273","#7e848d"],Thatch6:["#759aa5","#cfc60d","#99987f","#90ac97","#ffad1c","#b9ab6f"],Tradition6:["#6b4a0b","#790a14","#908342","#423e5c","#641345","#748a2f"],Travelogue6:["#b74d21","#a32323","#4576a3","#615d9a","#67924b","#bf7b1b"],Trek6:["#f0a22e","#a5644e","#b58b80","#c3986d","#a19574","#c17529"],Twilight6:["#e8bc4a","#83c1c6","#e78d35","#909ce1","#839c41","#cc5439"],Urban6:["#53548a","#438086","#a04da3","#c4652d","#8b5d3d","#5c92b5"],UrbanPop6:["#86ce24","#00a2e6","#fac810","#7d8f8c","#d06b20","#958b8b"],VaporTrail6:["#df2e28","#fe801a","#e9bf35","#81bb42","#32c7a9","#4a9bdc"],Venture6:["#9eb060","#d09a08","#f2ec86","#824f1c","#511818","#553876"],Verve6:["#ff388c","#e40059","#9c007f","#68007f","#005bd3","#00349e"],View6:["#6f6f74","#92a9b9","#a7b789","#b9a489","#8d6374","#9b7362"],Violet6:["#ad84c6","#8784c7","#5d739a","#6997af","#84acb6","#6f8183"],VioletII6:["#92278f","#9b57d3","#755dd9","#665eb8","#45a5ed","#5982db"],Waveform6:["#31b6fd","#4584d3","#5bd078","#a5d028","#f5c040","#05e0db"],Wisp6:["#a53010","#de7e18","#9f8351","#728653","#92aa4c","#6aac91"],WoodType6:["#d34817","#9b2d1f","#a28e6a","#956251","#918485","#855d5d"],Yellow6:["#ffca08","#f8931d","#ce8d3e","#ec7016","#e64823","#9c6a6a"],YellowOrange6:["#f0a22e","#a5644e","#b58b80","#c3986d","#a19574","#c17529"]}),tableau:Object.freeze({Tableau10:["#4E79A7","#F28E2B","#E15759","#76B7B2","#59A14F","#EDC948","#B07AA1","#FF9DA7","#9C755F","#BAB0AC"],Tableau20:["#4E79A7","#A0CBE8","#F28E2B","#FFBE7D","#59A14F","#8CD17D","#B6992D","#F1CE63","#499894","#86BCB6","#E15759","#FF9D9A","#79706E","#BAB0AC","#D37295","#FABFD2","#B07AA1","#D4A6C8","#9D7660","#D7B5A6"],ColorBlind10:["#1170aa","#fc7d0b","#a3acb9","#57606c","#5fa2ce","#c85200","#7b848f","#a3cce9","#ffbc79","#c8d0d9"],SeattleGrays5:["#767f8b","#b3b7b8","#5c6068","#d3d3d3","#989ca3"],Traffic9:["#b60a1c","#e39802","#309143","#e03531","#f0bd27","#51b364","#ff684c","#ffda66","#8ace7e"],MillerStone11:["#4f6980","#849db1","#a2ceaa","#638b66","#bfbb60","#f47942","#fbb04e","#b66353","#d7ce9f","#b9aa97","#7e756d"],SuperfishelStone10:["#6388b4","#ffae34","#ef6f6a","#8cc2ca","#55ad89","#c3bc3f","#bb7693","#baa094","#a9b5ae","#767676"],NurielStone9:["#8175aa","#6fb899","#31a1b3","#ccb22b","#a39fc9","#94d0c0","#959c9e","#027b8e","#9f8f12"],JewelBright9:["#eb1e2c","#fd6f30","#f9a729","#f9d23c","#5fbb68","#64cdcc","#91dcea","#a4a4d5","#bbc9e5"],Summer8:["#bfb202","#b9ca5d","#cf3e53","#f1788d","#00a2b3","#97cfd0","#f3a546","#f7c480"],Winter10:["#90728f","#b9a0b4","#9d983d","#cecb76","#e15759","#ff9888","#6b6b6b","#bab2ae","#aa8780","#dab6af"],GreenOrangeTeal12:["#4e9f50","#87d180","#ef8a0c","#fcc66d","#3ca8bc","#98d9e4","#94a323","#c3ce3d","#a08400","#f7d42a","#26897e","#8dbfa8"],RedBlueBrown12:["#466f9d","#91b3d7","#ed444a","#feb5a2","#9d7660","#d7b5a6","#3896c4","#a0d4ee","#ba7e45","#39b87f","#c8133b","#ea8783"],PurplePinkGray12:["#8074a8","#c6c1f0","#c46487","#ffbed1","#9c9290","#c5bfbe","#9b93c9","#ddb5d5","#7c7270","#f498b6","#b173a0","#c799bc"],HueCircle19:["#1ba3c6","#2cb5c0","#30bcad","#21B087","#33a65c","#57a337","#a2b627","#d5bb21","#f8b620","#f89217","#f06719","#e03426","#f64971","#fc719e","#eb73b3","#ce69be","#a26dc2","#7873c0","#4f7cba"],OrangeBlue7:["#9e3d22","#d45b21","#f69035","#d9d5c9","#77acd3","#4f81af","#2b5c8a"],RedGreen7:["#a3123a","#e33f43","#f8816b","#ced7c3","#73ba67","#44914e","#24693d"],GreenBlue7:["#24693d","#45934d","#75bc69","#c9dad2","#77a9cf","#4e7fab","#2a5783"],RedBlue7:["#a90c38","#e03b42","#f87f69","#dfd4d1","#7eaed3","#5383af","#2e5a87"],RedBlack7:["#ae123a","#e33e43","#f8816b","#d9d9d9","#a0a7a8","#707c83","#49525e"],GoldPurple7:["#ad9024","#c1a33b","#d4b95e","#e3d8cf","#d4a3c3","#c189b0","#ac7299"],RedGreenGold7:["#be2a3e","#e25f48","#f88f4d","#f4d166","#90b960","#4b9b5f","#22763f"],SunsetSunrise7:["#33608c","#9768a5","#e7718a","#f6ba57","#ed7846","#d54c45","#b81840"],OrangeBlueWhite7:["#9e3d22","#e36621","#fcad52","#ffffff","#95c5e1","#5b8fbc","#2b5c8a"],RedGreenWhite7:["#ae123a","#ee574d","#fdac9e","#ffffff","#91d183","#539e52","#24693d"],GreenBlueWhite7:["#24693d","#529c51","#8fd180","#ffffff","#95c1dd","#598ab5","#2a5783"],RedBlueWhite7:["#a90c38","#ec534b","#feaa9a","#ffffff","#9ac4e1","#5c8db8","#2e5a87"],RedBlackWhite7:["#ae123a","#ee574d","#fdac9d","#ffffff","#bdc0bf","#7d888d","#49525e"],OrangeBlueLight7:["#ffcc9e","#f9d4b6","#f0dccd","#e5e5e5","#dae1ea","#cfdcef","#c4d8f3"],Temperature7:["#529985","#6c9e6e","#99b059","#dbcf47","#ebc24b","#e3a14f","#c26b51"],BlueGreen7:["#feffd9","#f2fabf","#dff3b2","#c4eab1","#94d6b7","#69c5be","#41b7c4"],BlueLight7:["#e5e5e5","#e0e3e8","#dbe1ea","#d5dfec","#d0dcef","#cadaf1","#c4d8f3"],OrangeLight7:["#e5e5e5","#ebe1d9","#f0ddcd","#f5d9c2","#f9d4b6","#fdd0aa","#ffcc9e"],Blue20:["#b9ddf1","#afd6ed","#a5cfe9","#9bc7e4","#92c0df","#89b8da","#80b0d5","#79aacf","#72a3c9","#6a9bc3","#6394be","#5b8cb8","#5485b2","#4e7fac","#4878a6","#437a9f","#3d6a98","#376491","#305d8a","#2a5783"],Orange20:["#ffc685","#fcbe75","#f9b665","#f7ae54","#f5a645","#f59c3c","#f49234","#f2882d","#f07e27","#ee7422","#e96b20","#e36420","#db5e20","#d25921","#ca5422","#c14f22","#b84b23","#af4623","#a64122","#9e3d22"],Green20:["#b3e0a6","#a5db96","#98d687","#8ed07f","#85ca77","#7dc370","#75bc69","#6eb663","#67af5c","#61a956","#59a253","#519c51","#49964f","#428f4d","#398949","#308344","#2b7c40","#27763d","#256f3d","#24693d"],Red20:["#ffbeb2","#feb4a6","#fdab9b","#fca290","#fb9984","#fa8f79","#f9856e","#f77b66","#f5715d","#f36754","#f05c4d","#ec5049","#e74545","#e13b42","#da323f","#d3293d","#ca223c","#c11a3b","#b8163a","#ae123a"],Purple20:["#eec9e5","#eac1df","#e6b9d9","#e0b2d2","#daabcb","#d5a4c4","#cf9dbe","#ca96b8","#c48fb2","#be89ac","#b882a6","#b27ba1","#aa759d","#a27099","#9a6a96","#926591","#8c5f86","#865986","#81537f","#7c4d79"],Brown20:["#eedbbd","#ecd2ad","#ebc994","#eac085","#e8b777","#e5ae6c","#e2a562","#de9d5a","#d99455","#d38c54","#ce8451","#c9784d","#c47247","#c16941","#bd6036","#b85636","#b34d34","#ad4433","#a63d32","#9f3632"],Gray20:["#d5d5d5","#cdcecd","#c5c7c6","#bcbfbe","#b4b7b7","#acb0b1","#a4a9ab","#9ca3a4","#939c9e","#8b9598","#848e93","#7c878d","#758087","#6e7a81","#67737c","#616c77","#5b6570","#555f6a","#4f5864","#49525e"],GrayWarm20:["#dcd4d0","#d4ccc8","#cdc4c0","#c5bdb9","#beb6b2","#b7afab","#b0a7a4","#a9a09d","#a29996","#9b938f","#948c88","#8d8481","#867e7b","#807774","#79706e","#736967","#6c6260","#665c51","#5f5654","#59504e"],BlueTeal20:["#bce4d8","#aedcd5","#a1d5d2","#95cecf","#89c8cc","#7ec1ca","#72bac6","#66b2c2","#59acbe","#4ba5ba","#419eb6","#3b96b2","#358ead","#3586a7","#347ea1","#32779b","#316f96","#2f6790","#2d608a","#2c5985"],OrangeGold20:["#f4d166","#f6c760","#f8bc58","#f8b252","#f7a84a","#f69e41","#f49538","#f38b2f","#f28026","#f0751e","#eb6c1c","#e4641e","#de5d1f","#d75521","#cf4f22","#c64a22","#bc4623","#b24223","#a83e24","#9e3a26"],GreenGold20:["#f4d166","#e3cd62","#d3c95f","#c3c55d","#b2c25b","#a3bd5a","#93b958","#84b457","#76af56","#67a956","#5aa355","#4f9e53","#479751","#40914f","#3a8a4d","#34844a","#2d7d45","#257740","#1c713b","#146c36"],RedGold21:["#f4d166","#f5c75f","#f6bc58","#f7b254","#f9a750","#fa9d4f","#fa9d4f","#fb934d","#f7894b","#f47f4a","#f0774a","#eb6349","#e66549","#e15c48","#dc5447","#d64c45","#d04344","#ca3a42","#c43141","#bd273f","#b71d3e"],Classic10:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],ClassicMedium10:["#729ece","#ff9e4a","#67bf5c","#ed665d","#ad8bc9","#a8786e","#ed97ca","#a2a2a2","#cdcc5d","#6dccda"],ClassicLight10:["#aec7e8","#ffbb78","#98df8a","#ff9896","#c5b0d5","#c49c94","#f7b6d2","#c7c7c7","#dbdb8d","#9edae5"],Classic20:["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],ClassicGray5:["#60636a","#a5acaf","#414451","#8f8782","#cfcfcf"],ClassicColorBlind10:["#006ba4","#ff800e","#ababab","#595959","#5f9ed1","#c85200","#898989","#a2c8ec","#ffbc79","#cfcfcf"],ClassicTrafficLight9:["#b10318","#dba13a","#309343","#d82526","#ffc156","#69b764","#f26c64","#ffdd71","#9fcd99"],ClassicPurpleGray6:["#7b66d2","#dc5fbd","#94917b","#995688","#d098ee","#d7d5c5"],ClassicPurpleGray12:["#7b66d2","#a699e8","#dc5fbd","#ffc0da","#5f5a41","#b4b19b","#995688","#d898ba","#ab6ad5","#d098ee","#8b7c6e","#dbd4c5"],ClassicGreenOrange6:["#32a251","#ff7f0f","#3cb7cc","#ffd94a","#39737c","#b85a0d"],ClassicGreenOrange12:["#32a251","#acd98d","#ff7f0f","#ffb977","#3cb7cc","#98d9e4","#b85a0d","#ffd94a","#39737c","#86b4a9","#82853b","#ccc94d"],ClassicBlueRed6:["#2c69b0","#f02720","#ac613c","#6ba3d6","#ea6b73","#e9c39b"],ClassicBlueRed12:["#2c69b0","#b5c8e2","#f02720","#ffb6b0","#ac613c","#e9c39b","#6ba3d6","#b5dffd","#ac8763","#ddc9b4","#bd0a36","#f4737a"],ClassicCyclic13:["#1f83b4","#12a2a8","#2ca030","#78a641","#bcbd22","#ffbf50","#ffaa0e","#ff7f0e","#d63a3a","#c7519c","#ba43b4","#8a60b0","#6f63bb"],ClassicGreen7:["#bccfb4","#94bb83","#69a761","#339444","#27823b","#1a7232","#09622a"],ClassicGray13:["#c3c3c3","#b2b2b2","#a2a2a2","#929292","#838383","#747474","#666666","#585858","#4b4b4b","#3f3f3f","#333333","#282828","#1e1e1e"],ClassicBlue7:["#b4d4da","#7bc8e2","#67add4","#3a87b7","#1c73b1","#1c5998","#26456e"],ClassicRed9:["#eac0bd","#f89a90","#f57667","#e35745","#d8392c","#cf1719","#c21417","#b10c1d","#9c0824"],ClassicOrange7:["#f0c294","#fdab67","#fd8938","#f06511","#d74401","#a33202","#7b3014"],ClassicAreaRed11:["#f5cac7","#fbb3ab","#fd9c8f","#fe8b7a","#fd7864","#f46b55","#ea5e45","#e04e35","#d43e25","#c92b14","#bd1100"],ClassicAreaGreen11:["#dbe8b4","#c3e394","#acdc7a","#9ad26d","#8ac765","#7abc5f","#6cae59","#60a24d","#569735","#4a8c1c","#3c8200"],ClassicAreaBrown11:["#f3e0c2","#f6d29c","#f7c577","#f0b763","#e4aa63","#d89c63","#cc8f63","#c08262","#bb7359","#bb6348","#bb5137"],ClassicRedGreen11:["#9c0824","#bd1316","#d11719","#df513f","#fc8375","#cacaca","#a2c18f","#69a761","#2f8e41","#1e7735","#09622a"],ClassicRedBlue11:["#9c0824","#bd1316","#d11719","#df513f","#fc8375","#cacaca","#67add4","#3a87b7","#1c73b1","#1c5998","#26456e"],ClassicRedBlack11:["#9c0824","#bd1316","#d11719","#df513f","#fc8375","#cacaca","#9b9b9b","#777777","#565656","#383838","#1e1e1e"],ClassicAreaRedGreen21:["#bd1100","#c82912","#d23a21","#dc4930","#e6583e","#ef654d","#f7705b","#fd7e6b","#fe8e7e","#fca294","#e9dabe","#c7e298","#b1de7f","#a0d571","#90cb68","#82c162","#75b65d","#69aa56","#5ea049","#559633","#4a8c1c"],ClassicOrangeBlue13:["#7b3014","#a33202","#d74401","#f06511","#fd8938","#fdab67","#cacaca","#7bc8e2","#67add4","#3a87b7","#1c73b1","#1c5998","#26456e"],ClassicGreenBlue11:["#09622a","#1e7735","#2f8e41","#69a761","#a2c18f","#cacaca","#67add4","#3a87b7","#1c73b1","#1c5998","#26456e"],ClassicRedWhiteGreen11:["#9c0824","#b41f27","#cc312b","#e86753","#fcb4a5","#ffffff","#b9d7b7","#74af72","#428f49","#297839","#09622a"],ClassicRedWhiteBlack11:["#9c0824","#b41f27","#cc312b","#e86753","#fcb4a5","#ffffff","#bfbfbf","#838383","#575757","#393939","#1e1e1e"],ClassicOrangeWhiteBlue11:["#7b3014","#a84415","#d85a13","#fb8547","#ffc2a1","#ffffff","#b7cde2","#6a9ec5","#3679a8","#2e5f8a","#26456e"],ClassicRedWhiteBlackLight10:["#ffc2c5","#ffd1d3","#ffe0e1","#fff0f0","#ffffff","#f3f3f3","#e8e8e8","#dddddd","#d1d1d1","#c6c6c6"],ClassicOrangeWhiteBlueLight11:["#ffcc9e","#ffd6b1","#ffe0c5","#ffead8","#fff5eb","#ffffff","#f3f7fd","#e8effa","#dce8f8","#d0e0f6","#c4d8f3"],ClassicRedWhiteGreenLight11:["#ffb2b6","#ffc2c5","#ffd1d3","#ffe0e1","#fff0f0","#ffffff","#f1faed","#e3f5db","#d5f0ca","#c6ebb8","#b7e6a7"],ClassicRedGreenLight11:["#ffb2b6","#fcbdc0","#f8c7c9","#f2d1d2","#ecdbdc","#e5e5e5","#dde6d9","#d4e6cc","#cae6c0","#c1e6b4","#b7e6a7"]})},c=f.helpers,a=2===f.DatasetController.prototype.removeHoverStyle.length,b="$colorschemes";f.defaults.global.plugins.colorschemes={scheme:"brewer.Paired12",fillAlpha:.5,reverse:!1,override:!1};var r={id:"colorschemes",beforeUpdate:function(e,d){var a,r,l,o,n,t=function(e){var d,a,b,r;return c.isArray(e)?e:"string"==typeof e&&(d=f.colorschemes||{},(a=e.match(/^(brewer\.\w+)([1-3])-(\d+)$/))?e=a[1]+["One","Two","Three"][a[2]-1]+a[3]:"office.Office2007-2010-6"===e&&(e="office.OfficeClassic6"),r=d[(b=e.split("."))[0]])?r[b[1]]:void 0}(d.scheme),u=d.fillAlpha,i=d.reverse,s=d.override,B=d.custom;t&&("function"==typeof B&&(r=B(a=t.slice()),c.isArray(r)&&r.length?t=r:c.isArray(a)&&a.length&&(t=a)),l=t.length,e.config.data.datasets.forEach(function(f,d){switch(o=d%l,n=t[i?l-o-1:o],f[b]={},f.type||e.config.type){case"line":case"radar":case"scatter":(void 0===f.backgroundColor||s)&&(f[b].backgroundColor=f.backgroundColor,f.backgroundColor=c.color(n).alpha(u).rgbString()),(void 0===f.borderColor||s)&&(f[b].borderColor=f.borderColor,f.borderColor=n),(void 0===f.pointBackgroundColor||s)&&(f[b].pointBackgroundColor=f.pointBackgroundColor,f.pointBackgroundColor=c.color(n).alpha(u).rgbString()),(void 0===f.pointBorderColor||s)&&(f[b].pointBorderColor=f.pointBorderColor,f.pointBorderColor=n);break;case"doughnut":case"pie":case"polarArea":(void 0===f.backgroundColor||s)&&(f[b].backgroundColor=f.backgroundColor,f.backgroundColor=f.data.map(function(f,e){return o=e%l,t[i?l-o-1:o]}));break;default:(void 0===f.backgroundColor||s)&&(f[b].backgroundColor=f.backgroundColor,f.backgroundColor=n)}}))},afterUpdate:function(f){f.config.data.datasets.forEach(function(f){f[b]&&(f[b].hasOwnProperty("backgroundColor")&&(f.backgroundColor=f[b].backgroundColor),f[b].hasOwnProperty("borderColor")&&(f.borderColor=f[b].borderColor),f[b].hasOwnProperty("pointBackgroundColor")&&(f.pointBackgroundColor=f[b].pointBackgroundColor),f[b].hasOwnProperty("pointBorderColor")&&(f.pointBorderColor=f[b].pointBorderColor),delete f[b])})},beforeEvent:function(f,e,d){a&&this.beforeUpdate(f,d)},afterEvent:function(f){a&&this.afterUpdate(f)}};return f.plugins.register(r),f.colorschemes=d,r}); diff --git a/plugins/additionals/assets/javascripts/chartjs-plugin-datalabels.min.js b/plugins/additionals/assets/javascripts/chartjs-plugin-datalabels.min.js deleted file mode 100644 index 75eb420..0000000 --- a/plugins/additionals/assets/javascripts/chartjs-plugin-datalabels.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * chartjs-plugin-datalabels v0.7.0 - * https://chartjs-plugin-datalabels.netlify.com - * (c) 2019 Chart.js Contributors - * Released under the MIT license - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],e):(t=t||self).ChartDataLabels=e(t.Chart)}(this,function(t){"use strict";var e=(t=t&&t.hasOwnProperty("default")?t.default:t).helpers,r=function(){if("undefined"!=typeof window){if(window.devicePixelRatio)return window.devicePixelRatio;var t=window.screen;if(t)return(t.deviceXDPI||1)/(t.logicalXDPI||1)}return 1}(),n={toTextLines:function(t){var r,n=[];for(t=[].concat(t);t.length;)"string"==typeof(r=t.pop())?n.unshift.apply(n,r.split("\n")):Array.isArray(r)?t.push.apply(t,r):e.isNullOrUndef(t)||n.unshift(""+r);return n},toFontString:function(t){return!t||e.isNullOrUndef(t.size)||e.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family},textSize:function(t,e,r){var n,i=[].concat(e),o=i.length,a=t.font,l=0;for(t.font=r.string,n=0;nr.right&&(n|=l),er.bottom&&(n|=s),n}function d(t,e){var r,n,i=e.anchor,o=t;return e.clamp&&(o=function(t,e){for(var r,n,i,o=t.x0,d=t.y0,c=t.x1,h=t.y1,x=f(o,d,e),y=f(c,h,e);x|y&&!(x&y);)(r=x||y)&u?(n=o+(c-o)*(e.top-d)/(h-d),i=e.top):r&s?(n=o+(c-o)*(e.bottom-d)/(h-d),i=e.bottom):r&l?(i=d+(h-d)*(e.right-o)/(c-o),n=e.right):r&a&&(i=d+(h-d)*(e.left-o)/(c-o),n=e.left),r===x?x=f(o=n,d=i,e):y=f(c=n,h=i,e);return{x0:o,x1:c,y0:d,y1:h}}(o,e.area)),"start"===i?(r=o.x0,n=o.y0):"end"===i?(r=o.x1,n=o.y1):(r=(o.x0+o.x1)/2,n=(o.y0+o.y1)/2),function(t,e,r,n,i){switch(i){case"center":r=n=0;break;case"bottom":r=0,n=1;break;case"right":r=1,n=0;break;case"left":r=-1,n=0;break;case"top":r=0,n=-1;break;case"start":r=-r,n=-n;break;case"end":break;default:i*=Math.PI/180,r=Math.cos(i),n=Math.sin(i)}return{x:t,y:e,vx:r,vy:n}}(r,n,t.vx,t.vy,e.align)}var c={arc:function(t,e){var r=(t.startAngle+t.endAngle)/2,n=Math.cos(r),i=Math.sin(r),o=t.innerRadius,a=t.outerRadius;return d({x0:t.x+n*o,y0:t.y+i*o,x1:t.x+n*a,y1:t.y+i*a,vx:n,vy:i},e)},point:function(t,e){var r=i(t,e.origin),n=r.x*t.radius,o=r.y*t.radius;return d({x0:t.x-n,y0:t.y-o,x1:t.x+n,y1:t.y+o,vx:r.x,vy:r.y},e)},rect:function(t,e){var r=i(t,e.origin),n=t.x,o=t.y,a=0,l=0;return t.horizontal?(n=Math.min(t.x,t.base),a=Math.abs(t.base-t.x)):(o=Math.min(t.y,t.base),l=Math.abs(t.base-t.y)),d({x0:n,y0:o+l,x1:n+a,y1:o,vx:r.x,vy:r.y},e)},fallback:function(t,e){var r=i(t,e.origin);return d({x0:t.x,y0:t.y,x1:t.x,y1:t.y,vx:r.x,vy:r.y},e)}},h=t.helpers,x=n.rasterize;function y(t){var e=t._model.horizontal,r=t._scale||e&&t._xScale||t._yScale;if(!r)return null;if(void 0!==r.xCenter&&void 0!==r.yCenter)return{x:r.xCenter,y:r.yCenter};var n=r.getBasePixel();return e?{x:n,y:null}:{x:null,y:n}}function v(t,e,r){var n=t.shadowBlur,i=r.stroked,o=x(r.x),a=x(r.y),l=x(r.w);i&&t.strokeText(e,o,a,l),r.filled&&(n&&i&&(t.shadowBlur=0),t.fillText(e,o,a,l),n&&i&&(t.shadowBlur=n))}var _=function(t,e,r,n){var i=this;i._config=t,i._index=n,i._model=null,i._rects=null,i._ctx=e,i._el=r};h.extend(_.prototype,{_modelize:function(e,r,i,o){var a,l=this._index,s=h.options.resolve,u=n.parseFont(s([i.font,{}],o,l)),f=s([i.color,t.defaults.global.defaultFontColor],o,l);return{align:s([i.align,"center"],o,l),anchor:s([i.anchor,"center"],o,l),area:o.chart.chartArea,backgroundColor:s([i.backgroundColor,null],o,l),borderColor:s([i.borderColor,null],o,l),borderRadius:s([i.borderRadius,0],o,l),borderWidth:s([i.borderWidth,0],o,l),clamp:s([i.clamp,!1],o,l),clip:s([i.clip,!1],o,l),color:f,display:e,font:u,lines:r,offset:s([i.offset,0],o,l),opacity:s([i.opacity,1],o,l),origin:y(this._el),padding:h.options.toPadding(s([i.padding,0],o,l)),positioner:(a=this._el,a instanceof t.elements.Arc?c.arc:a instanceof t.elements.Point?c.point:a instanceof t.elements.Rectangle?c.rect:c.fallback),rotation:s([i.rotation,0],o,l)*(Math.PI/180),size:n.textSize(this._ctx,r,u),textAlign:s([i.textAlign,"start"],o,l),textShadowBlur:s([i.textShadowBlur,0],o,l),textShadowColor:s([i.textShadowColor,f],o,l),textStrokeColor:s([i.textStrokeColor,f],o,l),textStrokeWidth:s([i.textStrokeWidth,0],o,l)}},update:function(t){var e,r,i,o=this,a=null,l=null,s=o._index,u=o._config,f=h.options.resolve([u.display,!0],t,s);f&&(e=t.dataset.data[s],r=h.valueOrDefault(h.callback(u.formatter,[e,t]),e),(i=h.isNullOrUndef(r)?[]:n.toTextLines(r)).length&&(l=function(t){var e=t.borderWidth||0,r=t.padding,n=t.size.height,i=t.size.width,o=-i/2,a=-n/2;return{frame:{x:o-r.left-e,y:a-r.top-e,w:i+r.width+2*e,h:n+r.height+2*e},text:{x:o,y:a,w:i,h:n}}}(a=o._modelize(f,i,u,t)))),o._model=a,o._rects=l},geometry:function(){return this._rects?this._rects.frame:{}},rotation:function(){return this._model?this._model.rotation:0},visible:function(){return this._model&&this._model.opacity},model:function(){return this._model},draw:function(t,e){var r,i=t.ctx,o=this._model,a=this._rects;this.visible()&&(i.save(),o.clip&&(r=o.area,i.beginPath(),i.rect(r.left,r.top,r.right-r.left,r.bottom-r.top),i.clip()),i.globalAlpha=n.bound(0,o.opacity,1),i.translate(x(e.x),x(e.y)),i.rotate(o.rotation),function(t,e,r){var n=r.backgroundColor,i=r.borderColor,o=r.borderWidth;(n||i&&o)&&(t.beginPath(),h.canvas.roundedRect(t,x(e.x)+o/2,x(e.y)+o/2,x(e.w)-o,x(e.h)-o,r.borderRadius),t.closePath(),n&&(t.fillStyle=n,t.fill()),i&&o&&(t.strokeStyle=i,t.lineWidth=o,t.lineJoin="miter",t.stroke()))}(i,a.frame,o),function(t,e,r,n){var i,o=n.textAlign,a=n.color,l=!!a,s=n.font,u=e.length,f=n.textStrokeColor,d=n.textStrokeWidth,c=f&&d;if(u&&(l||c))for(r=function(t,e,r){var n=r.lineHeight,i=t.w,o=t.x;return"center"===e?o+=i/2:"end"!==e&&"right"!==e||(o+=i),{h:n,w:i,x:o,y:t.y+n/2}}(r,o,s),t.font=s.string,t.textAlign=o,t.textBaseline="middle",t.shadowBlur=n.textShadowBlur,t.shadowColor=n.textShadowColor,l&&(t.fillStyle=a),c&&(t.lineJoin="round",t.lineWidth=d,t.strokeStyle=f),i=0,u=e.length;ie.x+e.w+2||t.y>e.y+e.h+2)},intersects:function(t){var e,r,n,i=this._points(),o=t._points(),a=[k(i[0],i[1]),k(i[0],i[3])];for(this._rotation!==t._rotation&&a.push(k(o[0],o[1]),k(o[0],o[3])),e=0;e=0;--r)for(i=t[r].$layout,n=r-1;n>=0&&i._visible;--n)(o=t[n].$layout)._visible&&i._box.intersects(o._box)&&e(i,o)})(t,function(t,e){var r=t._hidable,n=e._hidable;r&&n||n?e._visible=!1:r&&(t._visible=!1)})}(t)},lookup:function(t,e){var r,n;for(r=t.length-1;r>=0;--r)if((n=t[r].$layout)&&n._visible&&n._box.contains(e))return t[r];return null},draw:function(t,e){var r,n,i,o,a,l;for(r=0,n=e.length;rn?1:t>=n?0:NaN}function e(t){let e=t,r=t;function i(t,n,e,i){for(null==e&&(e=0),null==i&&(i=t.length);e>>1;r(t[o],n)<0?e=o+1:i=o}return e}return 1===t.length&&(e=(n,e)=>t(n)-e,r=function(t){return(e,r)=>n(t(e),r)}(t)),{left:i,center:function(t,n,r,o){null==r&&(r=0),null==o&&(o=t.length);const a=i(t,n,r,o-1);return a>r&&e(t[a-1],n)>-e(t[a],n)?a-1:a},right:function(t,n,e,i){for(null==e&&(e=0),null==i&&(i=t.length);e>>1;r(t[o],n)>0?i=o:e=o+1}return e}}}function r(t){return null===t?NaN:+t}const i=e(n),o=i.right,a=i.left,u=e(r).center;function c(t,n){let e=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&++e;else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(i=+i)>=i&&++e}return e}function f(t){return 0|t.length}function s(t){return!(t>0)}function l(t){return"object"!=typeof t||"length"in t?t:Array.from(t)}function h(t,n){let e,r=0,i=0,o=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(e=n-i,i+=e/++r,o+=e*(n-i));else{let a=-1;for(let u of t)null!=(u=n(u,++a,t))&&(u=+u)>=u&&(e=u-i,i+=e/++r,o+=e*(u-i))}if(r>1)return o/(r-1)}function d(t,n){const e=h(t,n);return e?Math.sqrt(e):e}function p(t,n){let e,r;if(void 0===n)for(const n of t)null!=n&&(void 0===e?n>=n&&(e=r=n):(e>n&&(e=n),r=o&&(e=r=o):(e>o&&(e=o),r0){for(o=t[--i];i>0&&(n=o,e=t[--i],o=n+e,r=e-(o-n),!r););i>0&&(r<0&&t[i-1]<0||r>0&&t[i-1]>0)&&(e=2*r,n=o+e,e==n-o&&(o=n))}return o}}class y extends Map{constructor(t,n=x){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const[n,e]of t)this.set(n,e)}get(t){return super.get(_(this,t))}has(t){return super.has(_(this,t))}set(t,n){return super.set(b(this,t),n)}delete(t){return super.delete(m(this,t))}}class v extends Set{constructor(t,n=x){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(_(this,t))}add(t){return super.add(b(this,t))}delete(t){return super.delete(m(this,t))}}function _({_intern:t,_key:n},e){const r=n(e);return t.has(r)?t.get(r):e}function b({_intern:t,_key:n},e){const r=n(e);return t.has(r)?t.get(r):(t.set(r,e),e)}function m({_intern:t,_key:n},e){const r=n(e);return t.has(r)&&(e=t.get(e),t.delete(r)),e}function x(t){return null!==t&&"object"==typeof t?t.valueOf():t}function w(t){return t}function M(t,...n){return S(t,w,w,n)}function A(t,n,...e){return S(t,w,n,e)}function T(t){if(1!==t.length)throw new Error("duplicate key");return t[0]}function S(t,n,e,r){return function t(i,o){if(o>=r.length)return e(i);const a=new y,u=r[o++];let c=-1;for(const t of i){const n=u(t,++c,i),e=a.get(n);e?e.push(t):a.set(n,[t])}for(const[n,e]of a)a.set(n,t(e,o));return n(a)}(t,0)}function E(t,n){return Array.from(n,(n=>t[n]))}function k(t,...e){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");t=Array.from(t);let[r=n]=e;if(1===r.length||e.length>1){const i=Uint32Array.from(t,((t,n)=>n));return e.length>1?(e=e.map((n=>t.map(n))),i.sort(((t,r)=>{for(const i of e){const e=n(i[t],i[r]);if(e)return e}}))):(r=t.map(r),i.sort(((t,e)=>n(r[t],r[e])))),E(t,i)}return t.sort(r)}var N=Array.prototype.slice;function C(t){return function(){return t}}var P=Math.sqrt(50),z=Math.sqrt(10),D=Math.sqrt(2);function q(t,n,e){var r,i,o,a,u=-1;if(e=+e,(t=+t)===(n=+n)&&e>0)return[t];if((r=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),o=new Array(i=Math.ceil(n-t+1));++u=0?(o>=P?10:o>=z?5:o>=D?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=P?10:o>=z?5:o>=D?2:1)}function F(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=P?i*=10:o>=z?i*=5:o>=D&&(i*=2),n0?(t=Math.floor(t/i)*i,n=Math.ceil(n/i)*i):i<0&&(t=Math.ceil(t*i)/i,n=Math.floor(n*i)/i),r=i}}function U(t){return Math.ceil(Math.log(c(t))/Math.LN2)+1}function I(){var t=w,n=p,e=U;function r(r){Array.isArray(r)||(r=Array.from(r));var i,a,u=r.length,c=new Array(u);for(i=0;i=l)if(t>=l&&n===p){const t=R(s,l,e);isFinite(t)&&(t>0?l=(Math.floor(l/t)+1)*t:t<0&&(l=(Math.ceil(l*-t)+1)/-t))}else h.pop()}for(var d=h.length;h[0]<=s;)h.shift(),--d;for(;h[d-1]>l;)h.pop(),--d;var g,y=new Array(d+1);for(i=0;i<=d;++i)(g=y[i]=[]).x0=i>0?h[i-1]:s,g.x1=i=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e=i)&&(e=i)}return e}function Y(t,n){let e;if(void 0===n)for(const n of t)null!=n&&(e>n||void 0===e&&n>=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e>i||void 0===e&&i>=i)&&(e=i)}return e}function L(t,e,r=0,i=t.length-1,o=n){for(;i>r;){if(i-r>600){const n=i-r+1,a=e-r+1,u=Math.log(n),c=.5*Math.exp(2*u/3),f=.5*Math.sqrt(u*c*(n-c)/n)*(a-n/2<0?-1:1);L(t,e,Math.max(r,Math.floor(e-a*c/n+f)),Math.min(i,Math.floor(e+(n-a)*c/n+f)),o)}const n=t[e];let a=r,u=i;for(j(t,r,e),o(t[i],n)>0&&j(t,r,i);a0;)--u}0===o(t[r],n)?j(t,r,u):(++u,j(t,u,i)),u<=e&&(r=u+1),e<=u&&(i=u-1)}return t}function j(t,n,e){const r=t[n];t[n]=t[e],t[e]=r}function H(t,n,e){if(r=(t=Float64Array.from(function*(t,n){if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(yield n);else{let e=-1;for(let r of t)null!=(r=n(r,++e,t))&&(r=+r)>=r&&(yield r)}}(t,e))).length){if((n=+n)<=0||r<2)return Y(t);if(n>=1)return B(t);var r,i=(r-1)*n,o=Math.floor(i),a=B(L(t,o).subarray(0,o+1));return a+(Y(t.subarray(o+1))-a)*(i-o)}}function X(t,n,e=r){if(i=t.length){if((n=+n)<=0||i<2)return+e(t[0],0,t);if(n>=1)return+e(t[i-1],i-1,t);var i,o=(i-1)*n,a=Math.floor(o),u=+e(t[a],a,t);return u+(+e(t[a+1],a+1,t)-u)*(o-a)}}function G(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e=n)&&(e=n,r=i);else for(let o of t)null!=(o=n(o,++i,t))&&(e=o)&&(e=o,r=i);return r}function V(t){return Array.from(function*(t){for(const n of t)yield*n}(t))}function $(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e>n||void 0===e&&n>=n)&&(e=n,r=i);else for(let o of t)null!=(o=n(o,++i,t))&&(e>o||void 0===e&&o>=o)&&(e=o,r=i);return r}function W(t,n){return[t,n]}function Z(t,n,e){t=+t,n=+n,e=(i=arguments.length)<2?(n=t,t=0,1):i<3?1:+e;for(var r=-1,i=0|Math.max(0,Math.ceil((n-t)/e)),o=new Array(i);++r+t(n)}function st(t,n){return n=Math.max(0,t.bandwidth()-2*n)/2,t.round()&&(n=Math.round(n)),e=>+t(e)+n}function lt(){return!this.__axis}function ht(t,n){var e=[],r=null,i=null,o=6,a=6,u=3,c="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,f=1===t||4===t?-1:1,s=4===t||2===t?"x":"y",l=1===t||3===t?ut:ct;function h(h){var d=null==r?n.ticks?n.ticks.apply(n,e):n.domain():r,p=null==i?n.tickFormat?n.tickFormat.apply(n,e):ot:i,g=Math.max(o,0)+u,y=n.range(),v=+y[0]+c,_=+y[y.length-1]+c,b=(n.bandwidth?st:ft)(n.copy(),c),m=h.selection?h.selection():h,x=m.selectAll(".domain").data([null]),w=m.selectAll(".tick").data(d,n).order(),M=w.exit(),A=w.enter().append("g").attr("class","tick"),T=w.select("line"),S=w.select("text");x=x.merge(x.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),w=w.merge(A),T=T.merge(A.append("line").attr("stroke","currentColor").attr(s+"2",f*o)),S=S.merge(A.append("text").attr("fill","currentColor").attr(s,f*g).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),h!==m&&(x=x.transition(h),w=w.transition(h),T=T.transition(h),S=S.transition(h),M=M.transition(h).attr("opacity",at).attr("transform",(function(t){return isFinite(t=b(t))?l(t+c):this.getAttribute("transform")})),A.attr("opacity",at).attr("transform",(function(t){var n=this.parentNode.__axis;return l((n&&isFinite(n=n(t))?n:b(t))+c)}))),M.remove(),x.attr("d",4===t||2===t?a?"M"+f*a+","+v+"H"+c+"V"+_+"H"+f*a:"M"+c+","+v+"V"+_:a?"M"+v+","+f*a+"V"+c+"H"+_+"V"+f*a:"M"+v+","+c+"H"+_),w.attr("opacity",1).attr("transform",(function(t){return l(b(t)+c)})),T.attr(s+"2",f*o),S.attr(s,f*g).text(p),m.filter(lt).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),m.each((function(){this.__axis=b}))}return h.scale=function(t){return arguments.length?(n=t,h):n},h.ticks=function(){return e=it.call(arguments),h},h.tickArguments=function(t){return arguments.length?(e=null==t?[]:it.call(t),h):e.slice()},h.tickValues=function(t){return arguments.length?(r=null==t?null:it.call(t),h):r&&r.slice()},h.tickFormat=function(t){return arguments.length?(i=t,h):i},h.tickSize=function(t){return arguments.length?(o=a=+t,h):o},h.tickSizeInner=function(t){return arguments.length?(o=+t,h):o},h.tickSizeOuter=function(t){return arguments.length?(a=+t,h):a},h.tickPadding=function(t){return arguments.length?(u=+t,h):u},h.offset=function(t){return arguments.length?(c=+t,h):c},h}var dt={value:()=>{}};function pt(){for(var t,n=0,e=arguments.length,r={};n=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))}function vt(t,n){for(var e,r=0,i=t.length;r0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),mt.hasOwnProperty(n)?{space:mt[n],local:t}:t}function wt(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===bt&&n.documentElement.namespaceURI===bt?n.createElement(t):n.createElementNS(e,t)}}function Mt(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function At(t){var n=xt(t);return(n.local?Mt:wt)(n)}function Tt(){}function St(t){return null==t?Tt:function(){return this.querySelector(t)}}function Et(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function kt(){return[]}function Nt(t){return null==t?kt:function(){return this.querySelectorAll(t)}}function Ct(t){return function(){return this.matches(t)}}function Pt(t){return function(n){return n.matches(t)}}var zt=Array.prototype.find;function Dt(){return this.firstElementChild}var qt=Array.prototype.filter;function Rt(){return this.children}function Ft(t){return new Array(t.length)}function Ot(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function Ut(t){return function(){return t}}function It(t,n,e,r,i,o){for(var a,u=0,c=n.length,f=o.length;un?1:t>=n?0:NaN}function jt(t){return function(){this.removeAttribute(t)}}function Ht(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Xt(t,n){return function(){this.setAttribute(t,n)}}function Gt(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function Vt(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function $t(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function Wt(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Zt(t){return function(){this.style.removeProperty(t)}}function Kt(t,n,e){return function(){this.style.setProperty(t,n,e)}}function Qt(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}function Jt(t,n){return t.style.getPropertyValue(n)||Wt(t).getComputedStyle(t,null).getPropertyValue(n)}function tn(t){return function(){delete this[t]}}function nn(t,n){return function(){this[t]=n}}function en(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function rn(t){return t.trim().split(/^|\s+/)}function on(t){return t.classList||new an(t)}function an(t){this._node=t,this._names=rn(t.getAttribute("class")||"")}function un(t,n){for(var e=on(t),r=-1,i=n.length;++r=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}}))}function Tn(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Cn=[null];function Pn(t,n){this._groups=t,this._parents=n}function zn(){return new Pn([[document.documentElement]],Cn)}function Dn(t){return"string"==typeof t?new Pn([[document.querySelector(t)]],[document.documentElement]):new Pn([[t]],Cn)}Pn.prototype=zn.prototype={constructor:Pn,select:function(t){"function"!=typeof t&&(t=St(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i=x&&(x=m+1);!(b=y[x])&&++x=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=Lt);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?Zt:"function"==typeof n?Qt:Kt)(t,n,null==e?"":e)):Jt(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?tn:"function"==typeof n?en:nn)(t,n)):this.node()[t]},classed:function(t,n){var e=rn(t+"");if(arguments.length<2){for(var r=on(this.node()),i=-1,o=e.length;++i()=>t;function Hn(t,{sourceEvent:n,subject:e,target:r,identifier:i,active:o,x:a,y:u,dx:c,dy:f,dispatch:s}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},subject:{value:e,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:u,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:f,enumerable:!0,configurable:!0},_:{value:s}})}function Xn(t){return!t.ctrlKey&&!t.button}function Gn(){return this.parentNode}function Vn(t,n){return null==n?{x:t.x,y:t.y}:n}function $n(){return navigator.maxTouchPoints||"ontouchstart"in this}function Wn(t,n,e){t.prototype=n.prototype=e,e.constructor=t}function Zn(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[r];return e}function Kn(){}Hn.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};var Qn=.7,Jn=1/Qn,te="\\s*([+-]?\\d+)\\s*",ne="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",ee="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",re=/^#([0-9a-f]{3,8})$/,ie=new RegExp("^rgb\\("+[te,te,te]+"\\)$"),oe=new RegExp("^rgb\\("+[ee,ee,ee]+"\\)$"),ae=new RegExp("^rgba\\("+[te,te,te,ne]+"\\)$"),ue=new RegExp("^rgba\\("+[ee,ee,ee,ne]+"\\)$"),ce=new RegExp("^hsl\\("+[ne,ee,ee]+"\\)$"),fe=new RegExp("^hsla\\("+[ne,ee,ee,ne]+"\\)$"),se={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function le(){return this.rgb().formatHex()}function he(){return this.rgb().formatRgb()}function de(t){var n,e;return t=(t+"").trim().toLowerCase(),(n=re.exec(t))?(e=n[1].length,n=parseInt(n[1],16),6===e?pe(n):3===e?new _e(n>>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):8===e?ge(n>>24&255,n>>16&255,n>>8&255,(255&n)/255):4===e?ge(n>>12&15|n>>8&240,n>>8&15|n>>4&240,n>>4&15|240&n,((15&n)<<4|15&n)/255):null):(n=ie.exec(t))?new _e(n[1],n[2],n[3],1):(n=oe.exec(t))?new _e(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=ae.exec(t))?ge(n[1],n[2],n[3],n[4]):(n=ue.exec(t))?ge(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=ce.exec(t))?we(n[1],n[2]/100,n[3]/100,1):(n=fe.exec(t))?we(n[1],n[2]/100,n[3]/100,n[4]):se.hasOwnProperty(t)?pe(se[t]):"transparent"===t?new _e(NaN,NaN,NaN,0):null}function pe(t){return new _e(t>>16&255,t>>8&255,255&t,1)}function ge(t,n,e,r){return r<=0&&(t=n=e=NaN),new _e(t,n,e,r)}function ye(t){return t instanceof Kn||(t=de(t)),t?new _e((t=t.rgb()).r,t.g,t.b,t.opacity):new _e}function ve(t,n,e,r){return 1===arguments.length?ye(t):new _e(t,n,e,null==r?1:r)}function _e(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function be(){return"#"+xe(this.r)+xe(this.g)+xe(this.b)}function me(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function xe(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function we(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Te(t,n,e,r)}function Me(t){if(t instanceof Te)return new Te(t.h,t.s,t.l,t.opacity);if(t instanceof Kn||(t=de(t)),!t)return new Te;if(t instanceof Te)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,u=o-i,c=(o+i)/2;return u?(a=n===o?(e-r)/u+6*(e0&&c<1?0:a,new Te(a,u,c,t.opacity)}function Ae(t,n,e,r){return 1===arguments.length?Me(t):new Te(t,n,e,null==r?1:r)}function Te(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Se(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}Wn(Kn,de,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:le,formatHex:le,formatHsl:function(){return Me(this).formatHsl()},formatRgb:he,toString:he}),Wn(_e,ve,Zn(Kn,{brighter:function(t){return t=null==t?Jn:Math.pow(Jn,t),new _e(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Qn:Math.pow(Qn,t),new _e(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:be,formatHex:be,formatRgb:me,toString:me})),Wn(Te,Ae,Zn(Kn,{brighter:function(t){return t=null==t?Jn:Math.pow(Jn,t),new Te(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Qn:Math.pow(Qn,t),new Te(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new _e(Se(t>=240?t-240:t+120,i,r),Se(t,i,r),Se(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const Ee=Math.PI/180,ke=180/Math.PI,Ne=.96422,Ce=.82521,Pe=4/29,ze=6/29,De=3*ze*ze;function qe(t){if(t instanceof Fe)return new Fe(t.l,t.a,t.b,t.opacity);if(t instanceof je)return He(t);t instanceof _e||(t=ye(t));var n,e,r=Be(t.r),i=Be(t.g),o=Be(t.b),a=Oe((.2225045*r+.7168786*i+.0606169*o)/1);return r===i&&i===o?n=e=a:(n=Oe((.4360747*r+.3850649*i+.1430804*o)/Ne),e=Oe((.0139322*r+.0971045*i+.7141733*o)/Ce)),new Fe(116*a-16,500*(n-a),200*(a-e),t.opacity)}function Re(t,n,e,r){return 1===arguments.length?qe(t):new Fe(t,n,e,null==r?1:r)}function Fe(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Oe(t){return t>.008856451679035631?Math.pow(t,1/3):t/De+Pe}function Ue(t){return t>ze?t*t*t:De*(t-Pe)}function Ie(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Be(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Ye(t){if(t instanceof je)return new je(t.h,t.c,t.l,t.opacity);if(t instanceof Fe||(t=qe(t)),0===t.a&&0===t.b)return new je(NaN,0=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,u=r()=>t;function ar(t,n){return function(e){return t+e*n}}function ur(t,n){var e=n-t;return e?ar(t,e>180||e<-180?e-360*Math.round(e/360):e):or(isNaN(t)?n:t)}function cr(t){return 1==(t=+t)?fr:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):or(isNaN(n)?e:n)}}function fr(t,n){var e=n-t;return e?ar(t,e):or(isNaN(t)?n:t)}var sr=function t(n){var e=cr(n);function r(t,n){var r=e((t=ve(t)).r,(n=ve(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=fr(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function lr(t){return function(n){var e,r,i=n.length,o=new Array(i),a=new Array(i),u=new Array(i);for(e=0;eo&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:_r(e,r)})),o=xr.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:_r(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,u,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:_r(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,u,c),function(t,n,e,r,o,a){if(t!==e||n!==r){var u=o.push(i(o)+"scale(",null,",",null,")");a.push({i:u-4,x:_r(t,e)},{i:u-2,x:_r(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,u,c),o=a=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(null,t),n=n._next;--Gr}function oi(){Zr=(Wr=Qr.now())+Kr,Gr=Vr=0;try{ii()}finally{Gr=0,function(){var t,n,e=Hr,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Hr=n);Xr=t,ui(r)}(),Zr=0}}function ai(){var t=Qr.now(),n=t-Wr;n>1e3&&(Kr-=n,Wr=t)}function ui(t){Gr||(Vr&&(Vr=clearTimeout(Vr)),t-Zr>24?(t<1/0&&(Vr=setTimeout(oi,t-Qr.now()-Kr)),$r&&($r=clearInterval($r))):($r||(Wr=Qr.now(),$r=setInterval(ai,1e3)),Gr=1,Jr(oi)))}function ci(t,n,e){var r=new ei;return n=null==n?0:+n,r.restart((e=>{r.stop(),t(e+n)}),n,e),r}ei.prototype=ri.prototype={constructor:ei,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?ti():+e)+(null==n?0:+n),this._next||Xr===this||(Xr?Xr._next=this:Hr=this,Xr=this),this._call=t,this._time=e,ui()},stop:function(){this._call&&(this._call=null,this._time=1/0,ui())}};var fi=pt("start","end","cancel","interrupt"),si=[];function li(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(t){e.state=1,e.timer.restart(a,e.delay,e.time),e.delay<=t&&a(t-e.delay)}function a(o){var f,s,l,h;if(1!==e.state)return c();for(f in i)if((h=i[f]).name===e.name){if(3===h.state)return ci(a);4===h.state?(h.state=6,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[f]):+f0)throw new Error("too late; already scheduled");return e}function di(t,n){var e=pi(t,n);if(e.state>3)throw new Error("too late; already running");return e}function pi(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function gi(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>2&&e.state<5,e.state=6,e.timer.stop(),e.on.call(r?"interrupt":"cancel",t,t.__data__,e.index,e.group),delete o[i]):a=!1;a&&delete t.__transition}}function yi(t,n){var e,r;return function(){var i=di(this,t),o=i.tween;if(o!==e)for(var a=0,u=(r=e=o).length;a=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?hi:di;return function(){var a=o(this,t),u=a.on;u!==r&&(i=(r=u).copy()).on(n,e),a.on=i}}var Fi=zn.prototype.constructor;function Oi(t){return function(){this.style.removeProperty(t)}}function Ui(t,n,e){return function(r){this.style.setProperty(t,n.call(this,r),e)}}function Ii(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&Ui(t,o,e)),r}return o._value=n,o}function Bi(t){return function(n){this.textContent=t.call(this,n)}}function Yi(t){var n,e;function r(){var r=t.apply(this,arguments);return r!==e&&(n=(e=r)&&Bi(r)),n}return r._value=t,r}var Li=0;function ji(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._id=r}function Hi(t){return zn().transition(t)}function Xi(){return++Li}var Gi=zn.prototype;ji.prototype=Hi.prototype={constructor:ji,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=St(t));for(var r=this._groups,i=r.length,o=new Array(i),a=0;a()=>t;function mo(t,{sourceEvent:n,target:e,selection:r,mode:i,dispatch:o}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},selection:{value:r,enumerable:!0,configurable:!0},mode:{value:i,enumerable:!0,configurable:!0},_:{value:o}})}function xo(t){t.stopImmediatePropagation()}function wo(t){t.preventDefault(),t.stopImmediatePropagation()}var Mo={name:"drag"},Ao={name:"space"},To={name:"handle"},So={name:"center"};const{abs:Eo,max:ko,min:No}=Math;function Co(t){return[+t[0],+t[1]]}function Po(t){return[Co(t[0]),Co(t[1])]}var zo={name:"x",handles:["w","e"].map(Bo),input:function(t,n){return null==t?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},Do={name:"y",handles:["n","s"].map(Bo),input:function(t,n){return null==t?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},qo={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(Bo),input:function(t){return null==t?null:Po(t)},output:function(t){return t}},Ro={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Fo={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},Oo={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},Uo={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},Io={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function Bo(t){return{type:t}}function Yo(t){return!t.ctrlKey&&!t.button}function Lo(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function jo(){return navigator.maxTouchPoints||"ontouchstart"in this}function Ho(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function Xo(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function Go(t){var n,e=Lo,r=Yo,i=jo,o=!0,a=pt("start","brush","end"),u=6;function c(n){var e=n.property("__brush",g).selectAll(".overlay").data([Bo("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",Ro.overlay).merge(e).each((function(){var t=Ho(this).extent;Dn(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),n.selectAll(".selection").data([Bo("selection")]).enter().append("rect").attr("class","selection").attr("cursor",Ro.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=n.selectAll(".handle").data(t.handles,(function(t){return t.type}));r.exit().remove(),r.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return Ro[t.type]})),n.each(f).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",h).filter(i).on("touchstart.brush",h).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function f(){var t=Dn(this),n=Ho(this).selection;n?(t.selectAll(".selection").style("display",null).attr("x",n[0][0]).attr("y",n[0][1]).attr("width",n[1][0]-n[0][0]).attr("height",n[1][1]-n[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?n[1][0]-u/2:n[0][0]-u/2})).attr("y",(function(t){return"s"===t.type[0]?n[1][1]-u/2:n[0][1]-u/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?n[1][0]-n[0][0]+u:u})).attr("height",(function(t){return"e"===t.type||"w"===t.type?n[1][1]-n[0][1]+u:u}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function s(t,n,e){var r=t.__brush.emitter;return!r||e&&r.clean?new l(t,n,e):r}function l(t,n,e){this.that=t,this.args=n,this.state=t.__brush,this.active=0,this.clean=e}function h(e){if((!n||e.touches)&&r.apply(this,arguments)){var i,a,u,c,l,h,d,p,g,y,v,_=this,b=e.target.__data__.type,m="selection"===(o&&e.metaKey?b="overlay":b)?Mo:o&&e.altKey?So:To,x=t===Do?null:Uo[b],w=t===zo?null:Io[b],M=Ho(_),A=M.extent,T=M.selection,S=A[0][0],E=A[0][1],k=A[1][0],N=A[1][1],C=0,P=0,z=x&&w&&o&&e.shiftKey,D=Array.from(e.touches||[e],(t=>{const n=t.identifier;return(t=Un(t,_)).point0=t.slice(),t.identifier=n,t}));if("overlay"===b){T&&(g=!0);const n=[D[0],D[1]||D[0]];M.selection=T=[[i=t===Do?S:No(n[0][0],n[1][0]),u=t===zo?E:No(n[0][1],n[1][1])],[l=t===Do?k:ko(n[0][0],n[1][0]),d=t===zo?N:ko(n[0][1],n[1][1])]],D.length>1&&I()}else i=T[0][0],u=T[0][1],l=T[1][0],d=T[1][1];a=i,c=u,h=l,p=d;var q=Dn(_).attr("pointer-events","none"),R=q.selectAll(".overlay").attr("cursor",Ro[b]);gi(_);var F=s(_,arguments,!0).beforestart();if(e.touches)F.moved=U,F.ended=B;else{var O=Dn(e.view).on("mousemove.brush",U,!0).on("mouseup.brush",B,!0);o&&O.on("keydown.brush",Y,!0).on("keyup.brush",L,!0),Yn(e.view)}f.call(_),F.start(e,m.name)}function U(t){for(const n of t.changedTouches||[t])for(const t of D)t.identifier===n.identifier&&(t.cur=Un(n,_));if(z&&!y&&!v&&1===D.length){const t=D[0];Eo(t.cur[0]-t[0])>Eo(t.cur[1]-t[1])?v=!0:y=!0}for(const t of D)t.cur&&(t[0]=t.cur[0],t[1]=t.cur[1]);g=!0,wo(t),I(t)}function I(t){const n=D[0],e=n.point0;var r;switch(C=n[0]-e[0],P=n[1]-e[1],m){case Ao:case Mo:x&&(C=ko(S-i,No(k-l,C)),a=i+C,h=l+C),w&&(P=ko(E-u,No(N-d,P)),c=u+P,p=d+P);break;case To:D[1]?(x&&(a=ko(S,No(k,D[0][0])),h=ko(S,No(k,D[1][0])),x=1),w&&(c=ko(E,No(N,D[0][1])),p=ko(E,No(N,D[1][1])),w=1)):(x<0?(C=ko(S-i,No(k-i,C)),a=i+C,h=l):x>0&&(C=ko(S-l,No(k-l,C)),a=i,h=l+C),w<0?(P=ko(E-u,No(N-u,P)),c=u+P,p=d):w>0&&(P=ko(E-d,No(N-d,P)),c=u,p=d+P));break;case So:x&&(a=ko(S,No(k,i-C*x)),h=ko(S,No(k,l+C*x))),w&&(c=ko(E,No(N,u-P*w)),p=ko(E,No(N,d+P*w)))}h0&&(i=a-C),w<0?d=p-P:w>0&&(u=c-P),m=Ao,R.attr("cursor",Ro.selection),I());break;default:return}wo(t)}function L(t){switch(t.keyCode){case 16:z&&(y=v=z=!1,I());break;case 18:m===So&&(x<0?l=h:x>0&&(i=a),w<0?d=p:w>0&&(u=c),m=To,I());break;case 32:m===Ao&&(t.altKey?(x&&(l=h-C*x,i=a+C*x),w&&(d=p-P*w,u=c+P*w),m=So):(x<0?l=h:x>0&&(i=a),w<0?d=p:w>0&&(u=c),m=To),R.attr("cursor",Ro[b]),I());break;default:return}wo(t)}}function d(t){s(this,arguments).moved(t)}function p(t){s(this,arguments).ended(t)}function g(){var n=this.__brush||{selection:null};return n.extent=Po(e.apply(this,arguments)),n.dim=t,n}return c.move=function(n,e){n.tween?n.on("start.brush",(function(t){s(this,arguments).beforestart().start(t)})).on("interrupt.brush end.brush",(function(t){s(this,arguments).end(t)})).tween("brush",(function(){var n=this,r=n.__brush,i=s(n,arguments),o=r.selection,a=t.input("function"==typeof e?e.apply(this,arguments):e,r.extent),u=Mr(o,a);function c(t){r.selection=1===t&&null===a?null:u(t),f.call(n),i.brush()}return null!==o&&null!==a?c:c(1)})):n.each((function(){var n=this,r=arguments,i=n.__brush,o=t.input("function"==typeof e?e.apply(n,r):e,i.extent),a=s(n,r).beforestart();gi(n),i.selection=null===o?null:o,f.call(n),a.start().brush().end()}))},c.clear=function(t){c.move(t,null)},l.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(t,n){return this.starting?(this.starting=!1,this.emit("start",t,n)):this.emit("brush",t),this},brush:function(t,n){return this.emit("brush",t,n),this},end:function(t,n){return 0==--this.active&&(delete this.state.emitter,this.emit("end",t,n)),this},emit:function(n,e,r){var i=Dn(this.that).datum();a.call(n,this.that,new mo(n,{sourceEvent:e,target:c,selection:t.output(this.state.selection),mode:r,dispatch:a}),i)}},c.extent=function(t){return arguments.length?(e="function"==typeof t?t:bo(Po(t)),c):e},c.filter=function(t){return arguments.length?(r="function"==typeof t?t:bo(!!t),c):r},c.touchable=function(t){return arguments.length?(i="function"==typeof t?t:bo(!!t),c):i},c.handleSize=function(t){return arguments.length?(u=+t,c):u},c.keyModifiers=function(t){return arguments.length?(o=!!t,c):o},c.on=function(){var t=a.on.apply(a,arguments);return t===a?c:t},c}var Vo=Math.abs,$o=Math.cos,Wo=Math.sin,Zo=Math.PI,Ko=Zo/2,Qo=2*Zo,Jo=Math.max,ta=1e-12;function na(t,n){return Array.from({length:n-t},((n,e)=>t+e))}function ea(t){return function(n,e){return t(n.source.value+n.target.value,e.source.value+e.target.value)}}function ra(t,n){var e=0,r=null,i=null,o=null;function a(a){var u,c=a.length,f=new Array(c),s=na(0,c),l=new Array(c*c),h=new Array(c),d=0;a=Float64Array.from({length:c*c},n?(t,n)=>a[n%c][n/c|0]:(t,n)=>a[n/c|0][n%c]);for(let n=0;nr(f[t],f[n])));for(const e of s){const r=n;if(t){const t=na(1+~c,c).filter((t=>t<0?a[~t*c+e]:a[e*c+t]));i&&t.sort(((t,n)=>i(t<0?-a[~t*c+e]:a[e*c+t],n<0?-a[~n*c+e]:a[e*c+n])));for(const r of t)if(r<0){(l[~r*c+e]||(l[~r*c+e]={source:null,target:null})).target={index:e,startAngle:n,endAngle:n+=a[~r*c+e]*d,value:a[~r*c+e]}}else{(l[e*c+r]||(l[e*c+r]={source:null,target:null})).source={index:e,startAngle:n,endAngle:n+=a[e*c+r]*d,value:a[e*c+r]}}h[e]={index:e,startAngle:r,endAngle:n,value:f[e]}}else{const t=na(0,c).filter((t=>a[e*c+t]||a[t*c+e]));i&&t.sort(((t,n)=>i(a[e*c+t],a[e*c+n])));for(const r of t){let t;if(eaa)if(Math.abs(s*u-c*f)>aa&&i){var h=e-o,d=r-a,p=u*u+c*c,g=h*h+d*d,y=Math.sqrt(p),v=Math.sqrt(l),_=i*Math.tan((ia-Math.acos((p+l-g)/(2*y*v)))/2),b=_/v,m=_/y;Math.abs(b-1)>aa&&(this._+="L"+(t+b*f)+","+(n+b*s)),this._+="A"+i+","+i+",0,0,"+ +(s*h>f*d)+","+(this._x1=t+m*u)+","+(this._y1=n+m*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,o=!!o;var a=(e=+e)*Math.cos(r),u=e*Math.sin(r),c=t+a,f=n+u,s=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+f:(Math.abs(this._x1-c)>aa||Math.abs(this._y1-f)>aa)&&(this._+="L"+c+","+f),e&&(l<0&&(l=l%oa+oa),l>ua?this._+="A"+e+","+e+",0,1,"+s+","+(t-a)+","+(n-u)+"A"+e+","+e+",0,1,"+s+","+(this._x1=c)+","+(this._y1=f):l>aa&&(this._+="A"+e+","+e+",0,"+ +(l>=ia)+","+s+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};var sa=Array.prototype.slice;function la(t){return function(){return t}}function ha(t){return t.source}function da(t){return t.target}function pa(t){return t.radius}function ga(t){return t.startAngle}function ya(t){return t.endAngle}function va(){return 0}function _a(){return 10}function ba(t){var n=ha,e=da,r=pa,i=pa,o=ga,a=ya,u=va,c=null;function f(){var f,s=n.apply(this,arguments),l=e.apply(this,arguments),h=u.apply(this,arguments)/2,d=sa.call(arguments),p=+r.apply(this,(d[0]=s,d)),g=o.apply(this,d)-Ko,y=a.apply(this,d)-Ko,v=+i.apply(this,(d[0]=l,d)),_=o.apply(this,d)-Ko,b=a.apply(this,d)-Ko;if(c||(c=f=fa()),h>ta&&(Vo(y-g)>2*h+ta?y>g?(g+=h,y-=h):(g-=h,y+=h):g=y=(g+y)/2,Vo(b-_)>2*h+ta?b>_?(_+=h,b-=h):(_-=h,b+=h):_=b=(_+b)/2),c.moveTo(p*$o(g),p*Wo(g)),c.arc(0,0,p,g,y),g!==_||y!==b)if(t){var m=+t.apply(this,arguments),x=v-m,w=(_+b)/2;c.quadraticCurveTo(0,0,x*$o(_),x*Wo(_)),c.lineTo(v*$o(w),v*Wo(w)),c.lineTo(x*$o(b),x*Wo(b))}else c.quadraticCurveTo(0,0,v*$o(_),v*Wo(_)),c.arc(0,0,v,_,b);if(c.quadraticCurveTo(0,0,p*$o(g),p*Wo(g)),c.closePath(),f)return c=null,f+""||null}return t&&(f.headRadius=function(n){return arguments.length?(t="function"==typeof n?n:la(+n),f):t}),f.radius=function(t){return arguments.length?(r=i="function"==typeof t?t:la(+t),f):r},f.sourceRadius=function(t){return arguments.length?(r="function"==typeof t?t:la(+t),f):r},f.targetRadius=function(t){return arguments.length?(i="function"==typeof t?t:la(+t),f):i},f.startAngle=function(t){return arguments.length?(o="function"==typeof t?t:la(+t),f):o},f.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:la(+t),f):a},f.padAngle=function(t){return arguments.length?(u="function"==typeof t?t:la(+t),f):u},f.source=function(t){return arguments.length?(n=t,f):n},f.target=function(t){return arguments.length?(e=t,f):e},f.context=function(t){return arguments.length?(c=null==t?null:t,f):c},f}var ma=Array.prototype.slice;function xa(t,n){return t-n}var wa=t=>()=>t;function Ma(t,n){for(var e,r=-1,i=n.length;++rr!=d>r&&e<(h-f)*(r-s)/(d-s)+f&&(i=-i)}return i}function Ta(t,n,e){var r,i,o,a;return function(t,n,e){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])}(t,n,e)&&(i=t[r=+(t[0]===n[0])],o=e[r],a=n[r],i<=o&&o<=a||a<=o&&o<=i)}function Sa(){}var Ea=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function ka(){var t=1,n=1,e=U,r=u;function i(t){var n=e(t);if(Array.isArray(n))n=n.slice().sort(xa);else{var r=p(t),i=r[0],a=r[1];n=F(i,a,n),n=Z(Math.floor(i/n)*n,Math.floor(a/n)*n,n)}return n.map((function(n){return o(t,n)}))}function o(e,i){var o=[],u=[];return function(e,r,i){var o,u,c,f,s,l,h=new Array,d=new Array;o=u=-1,f=e[0]>=r,Ea[f<<1].forEach(p);for(;++o=r,Ea[c|f<<1].forEach(p);Ea[f<<0].forEach(p);for(;++u=r,s=e[u*t]>=r,Ea[f<<1|s<<2].forEach(p);++o=r,l=s,s=e[u*t+o+1]>=r,Ea[c|f<<1|s<<2|l<<3].forEach(p);Ea[f|s<<3].forEach(p)}o=-1,s=e[u*t]>=r,Ea[s<<2].forEach(p);for(;++o=r,Ea[s<<2|l<<3].forEach(p);function p(t){var n,e,r=[t[0][0]+o,t[0][1]+u],c=[t[1][0]+o,t[1][1]+u],f=a(r),s=a(c);(n=d[f])?(e=h[s])?(delete d[n.end],delete h[e.start],n===e?(n.ring.push(c),i(n.ring)):h[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete d[n.end],n.ring.push(c),d[n.end=s]=n):(n=h[s])?(e=d[f])?(delete h[n.start],delete d[e.end],n===e?(n.ring.push(c),i(n.ring)):h[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete h[n.start],n.ring.unshift(r),h[n.start=f]=n):h[f]=d[s]={start:f,end:s,ring:[r,c]}}Ea[s<<3].forEach(p)}(e,i,(function(t){r(t,e,i),function(t){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];++n0?o.push([t]):u.push(t)})),u.forEach((function(t){for(var n,e=0,r=o.length;e0&&a0&&u=0&&o>=0))throw new Error("invalid size");return t=r,n=o,i},i.thresholds=function(t){return arguments.length?(e="function"==typeof t?t:Array.isArray(t)?wa(ma.call(t)):wa(t),i):e},i.smooth=function(t){return arguments.length?(r=t?u:Sa,i):r===u},i}function Na(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[u-o+a*r]),n.data[u-e+a*r]=c/Math.min(u+1,r-1+o-u,o))}function Ca(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[a+(u-o)*r]),n.data[a+(u-e)*r]=c/Math.min(u+1,i-1+o-u,o))}function Pa(t){return t[0]}function za(t){return t[1]}function Da(){return 1}const qa=Math.pow(2,-52),Ra=new Uint32Array(512);class Fa{static from(t,n=Ha,e=Xa){const r=t.length,i=new Float64Array(2*r);for(let o=0;o>1;if(n>0&&"number"!=typeof t[0])throw new Error("Expected coords to contain numbers.");this.coords=t;const e=Math.max(2*n-5,0);this._triangles=new Uint32Array(3*e),this._halfedges=new Int32Array(3*e),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.update()}update(){const{coords:t,_hullPrev:n,_hullNext:e,_hullTri:r,_hullHash:i}=this,o=t.length>>1;let a=1/0,u=1/0,c=-1/0,f=-1/0;for(let n=0;nc&&(c=e),r>f&&(f=r),this._ids[n]=n}const s=(a+c)/2,l=(u+f)/2;let h,d,p,g=1/0;for(let n=0;n0&&(d=n,g=e)}let _=t[2*d],b=t[2*d+1],m=1/0;for(let n=0;nr&&(n[e++]=i,r=this._dists[i])}return this.hull=n.subarray(0,e),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(Ia(y,v,_,b,x,w)){const t=d,n=_,e=b;d=p,_=x,b=w,p=t,x=n,w=e}const M=function(t,n,e,r,i,o){const a=e-t,u=r-n,c=i-t,f=o-n,s=a*a+u*u,l=c*c+f*f,h=.5/(a*f-u*c);return{x:t+(f*s-u*l)*h,y:n+(a*l-c*s)*h}}(y,v,_,b,x,w);this._cx=M.x,this._cy=M.y;for(let n=0;n0&&Math.abs(f-o)<=qa&&Math.abs(s-a)<=qa)continue;if(o=f,a=s,c===h||c===d||c===p)continue;let l=0;for(let t=0,n=this._hashKey(f,s);t0?3-e:1+e)/4}(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){const{_triangles:n,_halfedges:e,coords:r}=this;let i=0,o=0;for(;;){const a=e[t],u=t-t%3;if(o=u+(t+2)%3,-1===a){if(0===i)break;t=Ra[--i];continue}const c=a-a%3,f=u+(t+1)%3,s=c+(a+2)%3,l=n[o],h=n[t],d=n[f],p=n[s];if(Ba(r[2*l],r[2*l+1],r[2*h],r[2*h+1],r[2*d],r[2*d+1],r[2*p],r[2*p+1])){n[t]=p,n[a]=l;const r=e[s];if(-1===r){let n=this._hullStart;do{if(this._hullTri[n]===s){this._hullTri[n]=t;break}n=this._hullPrev[n]}while(n!==this._hullStart)}this._link(t,r),this._link(a,e[o]),this._link(o,s);const u=c+(a+1)%3;i=33306690738754716e-32*Math.abs(a+u)?a-u:0}function Ia(t,n,e,r,i,o){return(Ua(i,o,t,n,e,r)||Ua(t,n,e,r,i,o)||Ua(e,r,i,o,t,n))<0}function Ba(t,n,e,r,i,o,a,u){const c=t-a,f=n-u,s=e-a,l=r-u,h=i-a,d=o-u,p=s*s+l*l,g=h*h+d*d;return c*(l*g-p*d)-f*(s*g-p*h)+(c*c+f*f)*(s*d-l*h)<0}function Ya(t,n,e,r,i,o){const a=e-t,u=r-n,c=i-t,f=o-n,s=a*a+u*u,l=c*c+f*f,h=.5/(a*f-u*c),d=(f*s-u*l)*h,p=(a*l-c*s)*h;return d*d+p*p}function La(t,n,e,r){if(r-e<=20)for(let i=e+1;i<=r;i++){const r=t[i],o=n[r];let a=i-1;for(;a>=e&&n[t[a]]>o;)t[a+1]=t[a--];t[a+1]=r}else{let i=e+1,o=r;ja(t,e+r>>1,i),n[t[e]]>n[t[r]]&&ja(t,e,r),n[t[i]]>n[t[r]]&&ja(t,i,r),n[t[e]]>n[t[i]]&&ja(t,e,i);const a=t[i],u=n[a];for(;;){do{i++}while(n[t[i]]u);if(o=o-e?(La(t,n,i,r),La(t,n,e,o-1)):(La(t,n,e,o-1),La(t,n,i,r))}}function ja(t,n,e){const r=t[n];t[n]=t[e],t[e]=r}function Ha(t){return t[0]}function Xa(t){return t[1]}const Ga=1e-6;class Va{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,e){const r=(t=+t)+(e=+e),i=n=+n;if(e<0)throw new Error("negative radius");null===this._x1?this._+=`M${r},${i}`:(Math.abs(this._x1-r)>Ga||Math.abs(this._y1-i)>Ga)&&(this._+="L"+r+","+i),e&&(this._+=`A${e},${e},0,1,1,${t-e},${n}A${e},${e},0,1,1,${this._x1=r},${this._y1=i}`)}rect(t,n,e,r){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+e}v${+r}h${-e}Z`}value(){return this._||null}}class $a{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}}class Wa{constructor(t,[n,e,r,i]=[0,0,960,500]){if(!((r=+r)>=(n=+n)&&(i=+i)>=(e=+e)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(2*t.points.length),this.vectors=new Float64Array(2*t.points.length),this.xmax=r,this.xmin=n,this.ymax=i,this.ymin=e,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){const{delaunay:{points:t,hull:n,triangles:e},vectors:r}=this,i=this.circumcenters=this._circumcenters.subarray(0,e.length/3*2);for(let n,r,o=0,a=0,u=e.length;o1;)i-=2;for(let t=2;t4)for(let t=0;t0){if(n>=this.ymax)return null;(i=(this.ymax-n)/r)0){if(t>=this.xmax)return null;(i=(this.xmax-t)/e)this.xmax?2:0)|(nthis.ymax?8:0)}}const Za=2*Math.PI,Ka=Math.pow;function Qa(t){return t[0]}function Ja(t){return t[1]}function tu(t,n,e){return[t+Math.sin(t+n)*e,n+Math.cos(t-n)*e]}class nu{static from(t,n=Qa,e=Ja,r){return new nu("length"in t?function(t,n,e,r){const i=t.length,o=new Float64Array(2*i);for(let a=0;a2&&function(t){const{triangles:n,coords:e}=t;for(let t=0;t1e-10)return!1}return!0}(t)){this.collinear=Int32Array.from({length:n.length/2},((t,n)=>n)).sort(((t,e)=>n[2*t]-n[2*e]||n[2*t+1]-n[2*e+1]));const t=this.collinear[0],e=this.collinear[this.collinear.length-1],r=[n[2*t],n[2*t+1],n[2*e],n[2*e+1]],i=1e-8*Math.hypot(r[3]-r[1],r[2]-r[0]);for(let t=0,e=n.length/2;t0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=r[0],this.triangles[1]=r[1],this.triangles[2]=r[1],o[r[0]]=1,2===r.length&&(o[r[1]]=0))}voronoi(t){return new Wa(this,t)}*neighbors(t){const{inedges:n,hull:e,_hullIndex:r,halfedges:i,triangles:o,collinear:a}=this;if(a){const n=a.indexOf(t);return n>0&&(yield a[n-1]),void(n=0&&i!==e&&i!==r;)e=i;return i}_step(t,n,e){const{inedges:r,hull:i,_hullIndex:o,halfedges:a,triangles:u,points:c}=this;if(-1===r[t]||!c.length)return(t+1)%(c.length>>1);let f=t,s=Ka(n-c[2*t],2)+Ka(e-c[2*t+1],2);const l=r[t];let h=l;do{let r=u[h];const l=Ka(n-c[2*r],2)+Ka(e-c[2*r+1],2);if(l9999?"+"+au(t,6):au(t,4)}(t.getUTCFullYear())+"-"+au(t.getUTCMonth()+1,2)+"-"+au(t.getUTCDate(),2)+(i?"T"+au(n,2)+":"+au(e,2)+":"+au(r,2)+"."+au(i,3)+"Z":r?"T"+au(n,2)+":"+au(e,2)+":"+au(r,2)+"Z":e||n?"T"+au(n,2)+":"+au(e,2)+"Z":"")}function cu(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return ru;if(f)return f=!1,eu;var n,r,i=a;if(34===t.charCodeAt(i)){for(;a++=o?c=!0:10===(r=t.charCodeAt(a++))?f=!0:13===r&&(f=!0,10===t.charCodeAt(a)&&++a),t.slice(i+1,n-1).replace(/""/g,'"')}for(;aNu(n,e).then((n=>(new DOMParser).parseFromString(n,t)))}var Ru=qu("application/xml"),Fu=qu("text/html"),Ou=qu("image/svg+xml");function Uu(t,n,e,r){if(isNaN(n)||isNaN(e))return t;var i,o,a,u,c,f,s,l,h,d=t._root,p={data:r},g=t._x0,y=t._y0,v=t._x1,_=t._y1;if(!d)return t._root=p,t;for(;d.length;)if((f=n>=(o=(g+v)/2))?g=o:v=o,(s=e>=(a=(y+_)/2))?y=a:_=a,i=d,!(d=d[l=s<<1|f]))return i[l]=p,t;if(u=+t._x.call(null,d.data),c=+t._y.call(null,d.data),n===u&&e===c)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(f=n>=(o=(g+v)/2))?g=o:v=o,(s=e>=(a=(y+_)/2))?y=a:_=a}while((l=s<<1|f)==(h=(c>=a)<<1|u>=o));return i[h]=d,i[l]=p,t}function Iu(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function Bu(t){return t[0]}function Yu(t){return t[1]}function Lu(t,n,e){var r=new ju(null==n?Bu:n,null==e?Yu:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function ju(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function Hu(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}var Xu=Lu.prototype=ju.prototype;function Gu(t){return function(){return t}}function Vu(t){return 1e-6*(t()-.5)}function $u(t){return t.x+t.vx}function Wu(t){return t.y+t.vy}function Zu(t){return t.index}function Ku(t,n){var e=t.get(n);if(!e)throw new Error("node not found: "+n);return e}Xu.copy=function(){var t,n,e=new ju(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=Hu(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=Hu(n));return e},Xu.add=function(t){const n=+this._x.call(null,t),e=+this._y.call(null,t);return Uu(this.cover(n,e),n,e,t)},Xu.addAll=function(t){var n,e,r,i,o=t.length,a=new Array(o),u=new Array(o),c=1/0,f=1/0,s=-1/0,l=-1/0;for(e=0;es&&(s=r),il&&(l=i));if(c>s||f>l)return this;for(this.cover(c,f).cover(s,l),e=0;et||t>=i||r>n||n>=o;)switch(u=(nh||(o=c.y0)>d||(a=c.x1)=v)<<1|t>=y)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,g.data),b=n-+this._y.call(null,g.data),m=_*_+b*b;if(m=(u=(p+y)/2))?p=u:y=u,(s=a>=(c=(g+v)/2))?g=c:v=c,n=d,!(d=d[l=s<<1|f]))return this;if(!d.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(d=n[0]||n[1]||n[2]||n[3])&&d===(n[3]||n[2]||n[1]||n[0])&&!d.length&&(e?e[h]=d:this._root=d),this):(this._root=i,this)},Xu.removeAll=function(t){for(var n=0,e=t.length;n1?r[0]+r.slice(2):r,+t.slice(e+1)]}function rc(t){return(t=ec(Math.abs(t)))?t[1]:NaN}var ic,oc=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ac(t){if(!(n=oc.exec(t)))throw new Error("invalid format: "+t);var n;return new uc({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function uc(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function cc(t,n){var e=ec(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}ac.prototype=uc.prototype,uc.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var fc={"%":(t,n)=>(100*t).toFixed(n),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,n)=>t.toExponential(n),f:(t,n)=>t.toFixed(n),g:(t,n)=>t.toPrecision(n),o:t=>Math.round(t).toString(8),p:(t,n)=>cc(100*t,n),r:cc,s:function(t,n){var e=ec(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(ic=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+ec(t,Math.max(0,n+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function sc(t){return t}var lc,hc=Array.prototype.map,dc=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function pc(t){var n,e,r=void 0===t.grouping||void 0===t.thousands?sc:(n=hc.call(t.grouping,Number),e=t.thousands+"",function(t,r){for(var i=t.length,o=[],a=0,u=n[0],c=0;i>0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=n[a=(a+1)%n.length];return o.reverse().join(e)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",u=void 0===t.numerals?sc:function(t){return function(n){return n.replace(/[0-9]/g,(function(n){return t[+n]}))}}(hc.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",f=void 0===t.minus?"−":t.minus+"",s=void 0===t.nan?"NaN":t.nan+"";function l(t){var n=(t=ac(t)).fill,e=t.align,l=t.sign,h=t.symbol,d=t.zero,p=t.width,g=t.comma,y=t.precision,v=t.trim,_=t.type;"n"===_?(g=!0,_="g"):fc[_]||(void 0===y&&(y=12),v=!0,_="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===h?i:"#"===h&&/[boxX]/.test(_)?"0"+_.toLowerCase():"",m="$"===h?o:/[%p]/.test(_)?c:"",x=fc[_],w=/[defgprs%]/.test(_);function M(t){var i,o,c,h=b,M=m;if("c"===_)M=x(t)+M,t="";else{var A=(t=+t)<0||1/t<0;if(t=isNaN(t)?s:x(Math.abs(t),y),v&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),A&&0==+t&&"+"!==l&&(A=!1),h=(A?"("===l?l:f:"-"===l||"("===l?"":l)+h,M=("s"===_?dc[8+ic/3]:"")+M+(A&&"("===l?")":""),w)for(i=-1,o=t.length;++i(c=t.charCodeAt(i))||c>57){M=(46===c?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var T=h.length+t.length+M.length,S=T>1)+h+t+M+S.slice(T);break;default:t=S+h+t+M}return u(t)}return y=void 0===y?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),M.toString=function(){return t+""},M}return{format:l,formatPrefix:function(t,n){var e=l(((t=ac(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(rc(n)/3))),i=Math.pow(10,-r),o=dc[8+r/3];return function(t){return e(i*t)+o}}}}function gc(n){return lc=pc(n),t.format=lc.format,t.formatPrefix=lc.formatPrefix,lc}function yc(t){return Math.max(0,-rc(Math.abs(t)))}function vc(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(rc(n)/3)))-rc(Math.abs(t)))}function _c(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,rc(n)-rc(t))+1}t.format=void 0,t.formatPrefix=void 0,gc({thousands:",",grouping:[3],currency:["$",""]});var bc=1e-6,mc=1e-12,xc=Math.PI,wc=xc/2,Mc=xc/4,Ac=2*xc,Tc=180/xc,Sc=xc/180,Ec=Math.abs,kc=Math.atan,Nc=Math.atan2,Cc=Math.cos,Pc=Math.ceil,zc=Math.exp,Dc=Math.hypot,qc=Math.log,Rc=Math.pow,Fc=Math.sin,Oc=Math.sign||function(t){return t>0?1:t<0?-1:0},Uc=Math.sqrt,Ic=Math.tan;function Bc(t){return t>1?0:t<-1?xc:Math.acos(t)}function Yc(t){return t>1?wc:t<-1?-wc:Math.asin(t)}function Lc(t){return(t=Fc(t/2))*t}function jc(){}function Hc(t,n){t&&Gc.hasOwnProperty(t.type)&&Gc[t.type](t,n)}var Xc={Feature:function(t,n){Hc(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=Cc(n=(n*=Sc)/2+Mc),a=Fc(n),u=tf*a,c=Jc*o+u*Cc(i),f=u*r*Fc(i);df.add(Nc(f,c)),Qc=t,Jc=o,tf=a}function mf(t){return[Nc(t[1],t[0]),Yc(t[2])]}function xf(t){var n=t[0],e=t[1],r=Cc(e);return[r*Cc(n),r*Fc(n),Fc(e)]}function wf(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Mf(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Af(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Tf(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Sf(t){var n=Uc(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var Ef,kf,Nf,Cf,Pf,zf,Df,qf,Rf,Ff,Of,Uf,If,Bf,Yf,Lf,jf={point:Hf,lineStart:Gf,lineEnd:Vf,polygonStart:function(){jf.point=$f,jf.lineStart=Wf,jf.lineEnd=Zf,sf=new g,gf.polygonStart()},polygonEnd:function(){gf.polygonEnd(),jf.point=Hf,jf.lineStart=Gf,jf.lineEnd=Vf,df<0?(nf=-(rf=180),ef=-(of=90)):sf>bc?of=90:sf<-1e-6&&(ef=-90),hf[0]=nf,hf[1]=rf},sphere:function(){nf=-(rf=180),ef=-(of=90)}};function Hf(t,n){lf.push(hf=[nf=t,rf=t]),nof&&(of=n)}function Xf(t,n){var e=xf([t*Sc,n*Sc]);if(ff){var r=Mf(ff,e),i=Mf([r[1],-r[0],0],r);Sf(i),i=mf(i);var o,a=t-af,u=a>0?1:-1,c=i[0]*Tc*u,f=Ec(a)>180;f^(u*afof&&(of=o):f^(u*af<(c=(c+360)%360-180)&&cof&&(of=n)),f?tKf(nf,rf)&&(rf=t):Kf(t,rf)>Kf(nf,rf)&&(nf=t):rf>=nf?(trf&&(rf=t)):t>af?Kf(nf,t)>Kf(nf,rf)&&(rf=t):Kf(t,rf)>Kf(nf,rf)&&(nf=t)}else lf.push(hf=[nf=t,rf=t]);nof&&(of=n),ff=e,af=t}function Gf(){jf.point=Xf}function Vf(){hf[0]=nf,hf[1]=rf,jf.point=Hf,ff=null}function $f(t,n){if(ff){var e=t-af;sf.add(Ec(e)>180?e+(e>0?360:-360):e)}else uf=t,cf=n;gf.point(t,n),Xf(t,n)}function Wf(){gf.lineStart()}function Zf(){$f(uf,cf),gf.lineEnd(),Ec(sf)>bc&&(nf=-(rf=180)),hf[0]=nf,hf[1]=rf,ff=null}function Kf(t,n){return(n-=t)<0?n+360:n}function Qf(t,n){return t[0]-n[0]}function Jf(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nxc?t+Math.round(-t/Ac)*Ac:t,n]}function ps(t,n,e){return(t%=Ac)?n||e?hs(ys(t),vs(n,e)):ys(t):n||e?vs(n,e):ds}function gs(t){return function(n,e){return[(n+=t)>xc?n-Ac:n<-xc?n+Ac:n,e]}}function ys(t){var n=gs(t);return n.invert=gs(-t),n}function vs(t,n){var e=Cc(t),r=Fc(t),i=Cc(n),o=Fc(n);function a(t,n){var a=Cc(n),u=Cc(t)*a,c=Fc(t)*a,f=Fc(n),s=f*e+u*r;return[Nc(c*i-s*o,u*e-f*r),Yc(s*i+c*o)]}return a.invert=function(t,n){var a=Cc(n),u=Cc(t)*a,c=Fc(t)*a,f=Fc(n),s=f*i-c*o;return[Nc(c*i+f*o,u*e+s*r),Yc(s*e-u*r)]},a}function _s(t){function n(n){return(n=t(n[0]*Sc,n[1]*Sc))[0]*=Tc,n[1]*=Tc,n}return t=ps(t[0]*Sc,t[1]*Sc,t.length>2?t[2]*Sc:0),n.invert=function(n){return(n=t.invert(n[0]*Sc,n[1]*Sc))[0]*=Tc,n[1]*=Tc,n},n}function bs(t,n,e,r,i,o){if(e){var a=Cc(n),u=Fc(n),c=r*e;null==i?(i=n+r*Ac,o=n-c/2):(i=ms(a,i),o=ms(a,o),(r>0?io)&&(i+=r*Ac));for(var f,s=i;r>0?s>o:s1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function ws(t,n){return Ec(t[0]-n[0])=0;--o)i.point((s=f[o])[0],s[1]);else r(h.x,h.p.x,-1,i);h=h.p}f=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function Ts(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,E=S*T,k=E>xc,N=v*M;if(c.add(Nc(N*S*Fc(E),_*A+N*Cc(E))),a+=k?T+S*Ac:T,k^p>=e^x>=e){var C=Mf(xf(d),xf(m));Sf(C);var P=Mf(o,C);Sf(P);var z=(k^T>=0?-1:1)*Yc(P[2]);(r>z||r===z&&(C[0]||C[1]))&&(u+=k^T>=0?1:-1)}}return(a<-1e-6||a0){for(l||(i.polygonStart(),l=!0),i.lineStart(),t=0;t1&&2&c&&h.push(h.pop().concat(h.shift())),a.push(h.filter(Ns))}return h}}function Ns(t){return t.length>1}function Cs(t,n){return((t=t.x)[0]<0?t[1]-wc-bc:wc-t[1])-((n=n.x)[0]<0?n[1]-wc-bc:wc-n[1])}ds.invert=ds;var Ps=ks((function(){return!0}),(function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?xc:-xc,c=Ec(o-e);Ec(c-xc)0?wc:-wc),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&c>=xc&&(Ec(e-i)bc?kc((Fc(n)*(o=Cc(r))*Fc(e)-Fc(r)*(i=Cc(n))*Fc(t))/(i*o*a)):(n+r)/2}(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}}),(function(t,n,e,r){var i;if(null==t)i=e*wc,r.point(-xc,i),r.point(0,i),r.point(xc,i),r.point(xc,0),r.point(xc,-i),r.point(0,-i),r.point(-xc,-i),r.point(-xc,0),r.point(-xc,i);else if(Ec(t[0]-n[0])>bc){var o=t[0]0,i=Ec(n)>bc;function o(t,e){return Cc(t)*Cc(e)>n}function a(t,e,r){var i=[1,0,0],o=Mf(xf(t),xf(e)),a=wf(o,o),u=o[0],c=a-u*u;if(!c)return!r&&t;var f=n*a/c,s=-n*u/c,l=Mf(i,o),h=Tf(i,f);Af(h,Tf(o,s));var d=l,p=wf(h,d),g=wf(d,d),y=p*p-g*(wf(h,h)-1);if(!(y<0)){var v=Uc(y),_=Tf(d,(-p-v)/g);if(Af(_,h),_=mf(_),!r)return _;var b,m=t[0],x=e[0],w=t[1],M=e[1];x0^_[1]<(Ec(_[0]-m)xc^(m<=_[0]&&_[0]<=x)){var S=Tf(d,(-p+v)/g);return Af(S,h),[_,mf(S)]}}}function u(n,e){var i=r?t:xc-t,o=0;return n<-i?o|=1:n>i&&(o|=2),e<-i?o|=4:e>i&&(o|=8),o}return ks(o,(function(t){var n,e,c,f,s;return{lineStart:function(){f=c=!1,s=1},point:function(l,h){var d,p=[l,h],g=o(l,h),y=r?g?0:u(l,h):g?u(l+(l<0?xc:-xc),h):0;if(!n&&(f=c=g)&&t.lineStart(),g!==c&&(!(d=a(n,p))||ws(n,d)||ws(p,d))&&(p[2]=1),g!==c)s=0,g?(t.lineStart(),d=a(p,n),t.point(d[0],d[1])):(d=a(n,p),t.point(d[0],d[1],2),t.lineEnd()),n=d;else if(i&&n&&r^g){var v;y&e||!(v=a(p,n,!0))||(s=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1],3)))}!g||n&&ws(n,p)||t.point(p[0],p[1]),n=p,c=g,e=y},lineEnd:function(){c&&t.lineEnd(),n=null},clean:function(){return s|(f&&c)<<1}}}),(function(n,r,i,o){bs(o,t,e,i,n,r)}),r?[0,-t]:[-xc,t-xc])}var Ds,qs,Rs,Fs,Os=1e9,Us=-Os;function Is(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,u,f){var s=0,l=0;if(null==i||(s=a(i,u))!==(l=a(o,u))||c(i,o)<0^u>0)do{f.point(0===s||3===s?t:e,s>1?r:n)}while((s=(s+u+4)%4)!==l);else f.point(o[0],o[1])}function a(r,i){return Ec(r[0]-t)0?0:3:Ec(r[0]-e)0?2:1:Ec(r[1]-n)0?1:0:i>0?3:2}function u(t,n){return c(t.x,n.x)}function c(t,n){var e=a(t,1),r=a(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(a){var c,f,s,l,h,d,p,g,y,v,_,b=a,m=xs(),x={point:w,lineStart:function(){x.point=M,f&&f.push(s=[]);v=!0,y=!1,p=g=NaN},lineEnd:function(){c&&(M(l,h),d&&y&&m.rejoin(),c.push(m.result()));x.point=w,y&&b.lineEnd()},polygonStart:function(){b=m,c=[],f=[],_=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=f.length;er&&(h-o)*(r-a)>(d-a)*(t-o)&&++n:d<=r&&(h-o)*(r-a)<(d-a)*(t-o)&&--n;return n}(),e=_&&n,i=(c=V(c)).length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),o(null,null,1,a),a.lineEnd()),i&&As(c,u,n,o,a),a.polygonEnd());b=a,c=f=s=null}};function w(t,n){i(t,n)&&b.point(t,n)}function M(o,a){var u=i(o,a);if(f&&s.push([o,a]),v)l=o,h=a,d=u,v=!1,u&&(b.lineStart(),b.point(o,a));else if(u&&y)b.point(o,a);else{var c=[p=Math.max(Us,Math.min(Os,p)),g=Math.max(Us,Math.min(Os,g))],m=[o=Math.max(Us,Math.min(Os,o)),a=Math.max(Us,Math.min(Os,a))];!function(t,n,e,r,i,o){var a,u=t[0],c=t[1],f=0,s=1,l=n[0]-u,h=n[1]-c;if(a=e-u,l||!(a>0)){if(a/=l,l<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=i-u,l||!(a<0)){if(a/=l,l<0){if(a>s)return;a>f&&(f=a)}else if(l>0){if(a0)){if(a/=h,h<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=o-c,h||!(a<0)){if(a/=h,h<0){if(a>s)return;a>f&&(f=a)}else if(h>0){if(a0&&(t[0]=u+f*l,t[1]=c+f*h),s<1&&(n[0]=u+s*l,n[1]=c+s*h),!0}}}}}(c,m,t,n,e,r)?u&&(b.lineStart(),b.point(o,a),_=!1):(y||(b.lineStart(),b.point(c[0],c[1])),b.point(m[0],m[1]),u||b.lineEnd(),_=!1)}p=o,g=a,y=u}return x}}var Bs={sphere:jc,point:jc,lineStart:function(){Bs.point=Ls,Bs.lineEnd=Ys},lineEnd:jc,polygonStart:jc,polygonEnd:jc};function Ys(){Bs.point=Bs.lineEnd=jc}function Ls(t,n){qs=t*=Sc,Rs=Fc(n*=Sc),Fs=Cc(n),Bs.point=js}function js(t,n){t*=Sc;var e=Fc(n*=Sc),r=Cc(n),i=Ec(t-qs),o=Cc(i),a=r*Fc(i),u=Fs*e-Rs*r*o,c=Rs*e+Fs*r*o;Ds.add(Nc(Uc(a*a+u*u),c)),qs=t,Rs=e,Fs=r}function Hs(t){return Ds=new g,Wc(t,Bs),+Ds}var Xs=[null,null],Gs={type:"LineString",coordinates:Xs};function Vs(t,n){return Xs[0]=t,Xs[1]=n,Hs(Gs)}var $s={Feature:function(t,n){return Zs(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r0&&(i=Vs(t[o],t[o-1]))>0&&e<=i&&r<=i&&(e+r-i)*(1-Math.pow((e-r)/i,2))bc})).map(c)).concat(Z(Pc(o/d)*d,i,d).filter((function(t){return Ec(t%g)>bc})).map(f))}return v.lines=function(){return _().map((function(t){return{type:"LineString",coordinates:t}}))},v.outline=function(){return{type:"Polygon",coordinates:[s(r).concat(l(a).slice(1),s(e).reverse().slice(1),l(u).reverse().slice(1))]}},v.extent=function(t){return arguments.length?v.extentMajor(t).extentMinor(t):v.extentMinor()},v.extentMajor=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],u=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),u>a&&(t=u,u=a,a=t),v.precision(y)):[[r,u],[e,a]]},v.extentMinor=function(e){return arguments.length?(n=+e[0][0],t=+e[1][0],o=+e[0][1],i=+e[1][1],n>t&&(e=n,n=t,t=e),o>i&&(e=o,o=i,i=e),v.precision(y)):[[n,o],[t,i]]},v.step=function(t){return arguments.length?v.stepMajor(t).stepMinor(t):v.stepMinor()},v.stepMajor=function(t){return arguments.length?(p=+t[0],g=+t[1],v):[p,g]},v.stepMinor=function(t){return arguments.length?(h=+t[0],d=+t[1],v):[h,d]},v.precision=function(h){return arguments.length?(y=+h,c=el(o,i,90),f=rl(n,t,y),s=el(u,a,90),l=rl(r,e,y),v):y},v.extentMajor([[-180,-89.999999],[180,89.999999]]).extentMinor([[-180,-80.000001],[180,80.000001]])}var ol,al,ul,cl,fl=t=>t,sl=new g,ll=new g,hl={point:jc,lineStart:jc,lineEnd:jc,polygonStart:function(){hl.lineStart=dl,hl.lineEnd=yl},polygonEnd:function(){hl.lineStart=hl.lineEnd=hl.point=jc,sl.add(Ec(ll)),ll=new g},result:function(){var t=sl/2;return sl=new g,t}};function dl(){hl.point=pl}function pl(t,n){hl.point=gl,ol=ul=t,al=cl=n}function gl(t,n){ll.add(cl*t-ul*n),ul=t,cl=n}function yl(){gl(ol,al)}var vl=1/0,_l=vl,bl=-vl,ml=bl,xl={point:function(t,n){tbl&&(bl=t);n<_l&&(_l=n);n>ml&&(ml=n)},lineStart:jc,lineEnd:jc,polygonStart:jc,polygonEnd:jc,result:function(){var t=[[vl,_l],[bl,ml]];return bl=ml=-(_l=vl=1/0),t}};var wl,Ml,Al,Tl,Sl=0,El=0,kl=0,Nl=0,Cl=0,Pl=0,zl=0,Dl=0,ql=0,Rl={point:Fl,lineStart:Ol,lineEnd:Bl,polygonStart:function(){Rl.lineStart=Yl,Rl.lineEnd=Ll},polygonEnd:function(){Rl.point=Fl,Rl.lineStart=Ol,Rl.lineEnd=Bl},result:function(){var t=ql?[zl/ql,Dl/ql]:Pl?[Nl/Pl,Cl/Pl]:kl?[Sl/kl,El/kl]:[NaN,NaN];return Sl=El=kl=Nl=Cl=Pl=zl=Dl=ql=0,t}};function Fl(t,n){Sl+=t,El+=n,++kl}function Ol(){Rl.point=Ul}function Ul(t,n){Rl.point=Il,Fl(Al=t,Tl=n)}function Il(t,n){var e=t-Al,r=n-Tl,i=Uc(e*e+r*r);Nl+=i*(Al+t)/2,Cl+=i*(Tl+n)/2,Pl+=i,Fl(Al=t,Tl=n)}function Bl(){Rl.point=Fl}function Yl(){Rl.point=jl}function Ll(){Hl(wl,Ml)}function jl(t,n){Rl.point=Hl,Fl(wl=Al=t,Ml=Tl=n)}function Hl(t,n){var e=t-Al,r=n-Tl,i=Uc(e*e+r*r);Nl+=i*(Al+t)/2,Cl+=i*(Tl+n)/2,Pl+=i,zl+=(i=Tl*t-Al*n)*(Al+t),Dl+=i*(Tl+n),ql+=3*i,Fl(Al=t,Tl=n)}function Xl(t){this._context=t}Xl.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,Ac)}},result:jc};var Gl,Vl,$l,Wl,Zl,Kl=new g,Ql={point:jc,lineStart:function(){Ql.point=Jl},lineEnd:function(){Gl&&th(Vl,$l),Ql.point=jc},polygonStart:function(){Gl=!0},polygonEnd:function(){Gl=null},result:function(){var t=+Kl;return Kl=new g,t}};function Jl(t,n){Ql.point=th,Vl=Wl=t,$l=Zl=n}function th(t,n){Wl-=t,Zl-=n,Kl.add(Uc(Wl*Wl+Zl*Zl)),Wl=t,Zl=n}function nh(){this._string=[]}function eh(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function rh(t){return function(n){var e=new ih;for(var r in t)e[r]=t[r];return e.stream=n,e}}function ih(){}function oh(t,n,e){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),Wc(e,t.stream(xl)),n(xl.result()),null!=r&&t.clipExtent(r),t}function ah(t,n,e){return oh(t,(function(e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=Math.min(r/(e[1][0]-e[0][0]),i/(e[1][1]-e[0][1])),a=+n[0][0]+(r-o*(e[1][0]+e[0][0]))/2,u=+n[0][1]+(i-o*(e[1][1]+e[0][1]))/2;t.scale(150*o).translate([a,u])}),e)}function uh(t,n,e){return ah(t,[[0,0],n],e)}function ch(t,n,e){return oh(t,(function(e){var r=+n,i=r/(e[1][0]-e[0][0]),o=(r-i*(e[1][0]+e[0][0]))/2,a=-i*e[0][1];t.scale(150*i).translate([o,a])}),e)}function fh(t,n,e){return oh(t,(function(e){var r=+n,i=r/(e[1][1]-e[0][1]),o=-i*e[0][0],a=(r-i*(e[1][1]+e[0][1]))/2;t.scale(150*i).translate([o,a])}),e)}nh.prototype={_radius:4.5,_circle:eh(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._string.push("M",t,",",n),this._point=1;break;case 1:this._string.push("L",t,",",n);break;default:null==this._circle&&(this._circle=eh(this._radius)),this._string.push("M",t,",",n,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},ih.prototype={constructor:ih,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var sh=Cc(30*Sc);function lh(t,n){return+n?function(t,n){function e(r,i,o,a,u,c,f,s,l,h,d,p,g,y){var v=f-r,_=s-i,b=v*v+_*_;if(b>4*n&&g--){var m=a+h,x=u+d,w=c+p,M=Uc(m*m+x*x+w*w),A=Yc(w/=M),T=Ec(Ec(w)-1)n||Ec((v*N+_*C)/b-.5)>.3||a*h+u*d+c*p2?t[2]%360*Sc:0,N()):[y*Tc,v*Tc,_*Tc]},E.angle=function(t){return arguments.length?(b=t%360*Sc,N()):b*Tc},E.reflectX=function(t){return arguments.length?(m=t?-1:1,N()):m<0},E.reflectY=function(t){return arguments.length?(x=t?-1:1,N()):x<0},E.precision=function(t){return arguments.length?(a=lh(u,S=t*t),C()):Uc(S)},E.fitExtent=function(t,n){return ah(E,t,n)},E.fitSize=function(t,n){return uh(E,t,n)},E.fitWidth=function(t,n){return ch(E,t,n)},E.fitHeight=function(t,n){return fh(E,t,n)},function(){return n=t.apply(this,arguments),E.invert=n.invert&&k,N()}}function yh(t){var n=0,e=xc/3,r=gh(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*Sc,e=t[1]*Sc):[n*Tc,e*Tc]},i}function vh(t,n){var e=Fc(t),r=(e+Fc(n))/2;if(Ec(r)0?n<-wc+bc&&(n=-wc+bc):n>wc-bc&&(n=wc-bc);var e=i/Rc(Sh(n),r);return[e*Fc(r*t),i-e*Cc(r*t)]}return o.invert=function(t,n){var e=i-n,o=Oc(r)*Uc(t*t+e*e),a=Nc(t,Ec(e))*Oc(e);return e*r<0&&(a-=xc*Oc(t)*Oc(e)),[a/r,2*kc(Rc(i/o,1/r))-wc]},o}function kh(t,n){return[t,n]}function Nh(t,n){var e=Cc(t),r=t===n?Fc(t):(e-Cc(n))/(n-t),i=e/r+t;if(Ec(r)=0;)n+=e[r].value;else n=1;t.value=n}function Xh(t,n){t instanceof Map?(t=[void 0,t],void 0===n&&(n=Vh)):void 0===n&&(n=Gh);for(var e,r,i,o,a,u=new Zh(t),c=[u];e=c.pop();)if((i=n(e.data))&&(a=(i=Array.from(i)).length))for(e.children=i,o=a-1;o>=0;--o)c.push(r=i[o]=new Zh(i[o])),r.parent=e,r.depth=e.depth+1;return u.eachBefore(Wh)}function Gh(t){return t.children}function Vh(t){return Array.isArray(t)?t[1]:null}function $h(t){void 0!==t.data.value&&(t.value=t.data.value),t.data=t.data.data}function Wh(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function Zh(t){this.data=t,this.depth=this.height=0,this.parent=null}function Kh(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(Array.from(t))).length,o=[];r0&&e*e>r*r+i*i}function nd(t,n){for(var e=0;e(a*=a)?(r=(f+a-i)/(2*f),o=Math.sqrt(Math.max(0,a/f-r*r)),e.x=t.x-r*u-o*c,e.y=t.y-r*c+o*u):(r=(f+i-a)/(2*f),o=Math.sqrt(Math.max(0,i/f-r*r)),e.x=n.x+r*u-o*c,e.y=n.y+r*c+o*u)):(e.x=n.x+e.r,e.y=n.y)}function ad(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function ud(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function cd(t){this._=t,this.next=null,this.previous=null}function fd(t){if(!(i=(t=function(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}(t)).length))return 0;var n,e,r,i,o,a,u,c,f,s,l;if((n=t[0]).x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;od(e,n,r=t[2]),n=new cd(n),e=new cd(e),r=new cd(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(u=3;ubc&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},Uh.invert=xh(Yc),Ih.invert=xh((function(t){return 2*kc(t)})),Bh.invert=function(t,n){return[-n,2*kc(zc(t))-wc]},Zh.prototype=Xh.prototype={constructor:Zh,count:function(){return this.eachAfter(Hh)},each:function(t,n){let e=-1;for(const r of this)t.call(n,r,++e,this);return this},eachAfter:function(t,n){for(var e,r,i,o=this,a=[o],u=[],c=-1;o=a.pop();)if(u.push(o),e=o.children)for(r=0,i=e.length;r=0;--r)o.push(e[r]);return this},find:function(t,n){let e=-1;for(const r of this)if(t.call(n,r,++e,this))return r},sum:function(t){return this.eachAfter((function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e}))},sort:function(t){return this.eachBefore((function(n){n.children&&n.children.sort(t)}))},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;t=e.pop(),n=r.pop();for(;t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){return Array.from(this)},leaves:function(){var t=[];return this.eachBefore((function(n){n.children||t.push(n)})),t},links:function(){var t=this,n=[];return t.each((function(e){e!==t&&n.push({source:e.parent,target:e})})),n},copy:function(){return Xh(this).eachBefore($h)},[Symbol.iterator]:function*(){var t,n,e,r,i=this,o=[i];do{for(t=o.reverse(),o=[];i=t.pop();)if(yield i,n=i.children)for(e=0,r=n.length;eh&&(h=u),y=s*s*g,(d=Math.max(h/y,y/l))>p){s-=u;break}p=d}v.push(a={value:s,dice:c1?n:1)},e}(Pd);var qd=function t(n){function e(t,e,r,i,o){if((a=t._squarify)&&a.ratio===n)for(var a,u,c,f,s,l=-1,h=a.length,d=t.value;++l1?n:1)},e}(Pd);function Rd(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function Fd(t,n){return t[0]-n[0]||t[1]-n[1]}function Od(t){const n=t.length,e=[0,1];let r,i=2;for(r=2;r1&&Rd(t[e[i-2]],t[e[i-1]],t[r])<=0;)--i;e[i++]=r}return e.slice(0,i)}var Ud=Math.random,Id=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(Ud),Bd=function t(n){function e(t,e){return arguments.length<2&&(e=t,t=0),t=Math.floor(t),e=Math.floor(e)-t,function(){return Math.floor(n()*e+t)}}return e.source=t,e}(Ud),Yd=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(Ud),Ld=function t(n){var e=Yd.source(n);function r(){var t=e.apply(this,arguments);return function(){return Math.exp(t())}}return r.source=t,r}(Ud),jd=function t(n){function e(t){return(t=+t)<=0?()=>0:function(){for(var e=0,r=t;r>1;--r)e+=n();return e+r*n()}}return e.source=t,e}(Ud),Hd=function t(n){var e=jd.source(n);function r(t){if(0==(t=+t))return n;var r=e(t);return function(){return r()/t}}return r.source=t,r}(Ud),Xd=function t(n){function e(t){return function(){return-Math.log1p(-n())/t}}return e.source=t,e}(Ud),Gd=function t(n){function e(t){if((t=+t)<0)throw new RangeError("invalid alpha");return t=1/-t,function(){return Math.pow(1-n(),t)}}return e.source=t,e}(Ud),Vd=function t(n){function e(t){if((t=+t)<0||t>1)throw new RangeError("invalid p");return function(){return Math.floor(n()+t)}}return e.source=t,e}(Ud),$d=function t(n){function e(t){if((t=+t)<0||t>1)throw new RangeError("invalid p");return 0===t?()=>1/0:1===t?()=>1:(t=Math.log1p(-t),function(){return 1+Math.floor(Math.log1p(-n())/t)})}return e.source=t,e}(Ud),Wd=function t(n){var e=Yd.source(n)();function r(t,r){if((t=+t)<0)throw new RangeError("invalid k");if(0===t)return()=>0;if(r=null==r?1:+r,1===t)return()=>-Math.log1p(-n())*r;var i=(t<1?t+1:t)-1/3,o=1/(3*Math.sqrt(i)),a=t<1?()=>Math.pow(n(),1/t):()=>1;return function(){do{do{var t=e(),u=1+o*t}while(u<=0);u*=u*u;var c=1-n()}while(c>=1-.0331*t*t*t*t&&Math.log(c)>=.5*t*t+i*(1-u+Math.log(u)));return i*u*a()*r}}return r.source=t,r}(Ud),Zd=function t(n){var e=Wd.source(n);function r(t,n){var r=e(t),i=e(n);return function(){var t=r();return 0===t?0:t/(t+i())}}return r.source=t,r}(Ud),Kd=function t(n){var e=$d.source(n),r=Zd.source(n);function i(t,n){return t=+t,(n=+n)>=1?()=>t:n<=0?()=>0:function(){for(var i=0,o=t,a=n;o*a>16&&o*(1-a)>16;){var u=Math.floor((o+1)*a),c=r(u,o-u+1)();c<=a?(i+=u,o-=u,a=(a-c)/(1-c)):(o=u-1,a/=c)}for(var f=a<.5,s=e(f?a:1-a),l=s(),h=0;l<=o;++h)l+=s();return i+(f?h:o-h)}}return i.source=t,i}(Ud),Qd=function t(n){function e(t,e,r){var i;return 0==(t=+t)?i=t=>-Math.log(t):(t=1/t,i=n=>Math.pow(n,t)),e=null==e?0:+e,r=null==r?1:+r,function(){return e+r*i(-Math.log1p(-n()))}}return e.source=t,e}(Ud),Jd=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,function(){return t+e*Math.tan(Math.PI*n())}}return e.source=t,e}(Ud),tp=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,function(){var r=n();return t+e*Math.log(r/(1-r))}}return e.source=t,e}(Ud),np=function t(n){var e=Wd.source(n),r=Kd.source(n);function i(t){return function(){for(var i=0,o=t;o>16;){var a=Math.floor(.875*o),u=e(a)();if(u>o)return i+r(a-1,o/u)();i+=a,o-=u}for(var c=-Math.log1p(-n()),f=0;c<=o;++f)c-=Math.log1p(-n());return i+f}}return i.source=t,i}(Ud);const ep=1/4294967296;function rp(t,n){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(n).domain(t)}return this}function ip(t,n){switch(arguments.length){case 0:break;case 1:"function"==typeof t?this.interpolator(t):this.range(t);break;default:this.domain(t),"function"==typeof n?this.interpolator(n):this.range(n)}return this}const op=Symbol("implicit");function ap(){var t=new Map,n=[],e=[],r=op;function i(i){var o=i+"",a=t.get(o);if(!a){if(r!==op)return r;t.set(o,a=n.push(i))}return e[(a-1)%e.length]}return i.domain=function(e){if(!arguments.length)return n.slice();n=[],t=new Map;for(const r of e){const e=r+"";t.has(e)||t.set(e,n.push(r))}return i},i.range=function(t){return arguments.length?(e=Array.from(t),i):e.slice()},i.unknown=function(t){return arguments.length?(r=t,i):r},i.copy=function(){return ap(n,e).unknown(r)},rp.apply(i,arguments),i}function up(){var t,n,e=ap().unknown(void 0),r=e.domain,i=e.range,o=0,a=1,u=!1,c=0,f=0,s=.5;function l(){var e=r().length,l=an&&(e=t,t=n,n=e),function(e){return Math.max(t,Math.min(n,e))}}(a[0],a[t-1])),r=t>2?pp:dp,i=o=null,l}function l(n){return isNaN(n=+n)?e:(i||(i=r(a.map(t),u,c)))(t(f(n)))}return l.invert=function(e){return f(n((o||(o=r(u,a.map(t),_r)))(e)))},l.domain=function(t){return arguments.length?(a=Array.from(t,fp),s()):a.slice()},l.range=function(t){return arguments.length?(u=Array.from(t),s()):u.slice()},l.rangeRound=function(t){return u=Array.from(t),c=Ar,s()},l.clamp=function(t){return arguments.length?(f=!!t||lp,s()):f!==lp},l.interpolate=function(t){return arguments.length?(c=t,s()):c},l.unknown=function(t){return arguments.length?(e=t,l):e},function(e,r){return t=e,n=r,s()}}function vp(){return yp()(lp,lp)}function _p(n,e,r,i){var o,a=F(n,e,r);switch((i=ac(null==i?",f":i)).type){case"s":var u=Math.max(Math.abs(n),Math.abs(e));return null!=i.precision||isNaN(o=vc(a,u))||(i.precision=o),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=_c(a,Math.max(Math.abs(n),Math.abs(e))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=yc(a))||(i.precision=o-2*("%"===i.type))}return t.format(i)}function bp(t){var n=t.domain;return t.ticks=function(t){var e=n();return q(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){var r=n();return _p(r[0],r[r.length-1],null==t?10:t,e)},t.nice=function(e){null==e&&(e=10);var r,i,o=n(),a=0,u=o.length-1,c=o[a],f=o[u],s=10;for(f0;){if((i=R(c,f,e))===r)return o[a]=c,o[u]=f,n(o);if(i>0)c=Math.floor(c/i)*i,f=Math.ceil(f/i)*i;else{if(!(i<0))break;c=Math.ceil(c*i)/i,f=Math.floor(f*i)/i}r=i}return t},t}function mp(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i];return a0){for(;h<=d;++h)for(s=1,f=r(h);sc)break;g.push(l)}}else for(;h<=d;++h)for(s=a-1,f=r(h);s>=1;--s)if(!((l=f*s)c)break;g.push(l)}2*g.length0))return u;do{u.push(a=new Date(+e)),n(e,o),t(e)}while(a=n)for(;t(n),!e(n);)n.setTime(n-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););}))},e&&(i.count=function(n,r){return Up.setTime(+n),Ip.setTime(+r),t(Up),t(Ip),Math.floor(e(Up,Ip))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}var Yp=Bp((function(){}),(function(t,n){t.setTime(+t+n)}),(function(t,n){return n-t}));Yp.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?Bp((function(n){n.setTime(Math.floor(n/t)*t)}),(function(n,e){n.setTime(+n+e*t)}),(function(n,e){return(e-n)/t})):Yp:null};var Lp=Yp.range,jp=1e3,Hp=6e4,Xp=36e5,Gp=864e5,Vp=6048e5,$p=Bp((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,n){t.setTime(+t+n*jp)}),(function(t,n){return(n-t)/jp}),(function(t){return t.getUTCSeconds()})),Wp=$p.range,Zp=Bp((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*jp)}),(function(t,n){t.setTime(+t+n*Hp)}),(function(t,n){return(n-t)/Hp}),(function(t){return t.getMinutes()})),Kp=Zp.range,Qp=Bp((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*jp-t.getMinutes()*Hp)}),(function(t,n){t.setTime(+t+n*Xp)}),(function(t,n){return(n-t)/Xp}),(function(t){return t.getHours()})),Jp=Qp.range,tg=Bp((t=>t.setHours(0,0,0,0)),((t,n)=>t.setDate(t.getDate()+n)),((t,n)=>(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Hp)/Gp),(t=>t.getDate()-1)),ng=tg.range;function eg(t){return Bp((function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)}),(function(t,n){t.setDate(t.getDate()+7*n)}),(function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Hp)/Vp}))}var rg=eg(0),ig=eg(1),og=eg(2),ag=eg(3),ug=eg(4),cg=eg(5),fg=eg(6),sg=rg.range,lg=ig.range,hg=og.range,dg=ag.range,pg=ug.range,gg=cg.range,yg=fg.range,vg=Bp((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,n){t.setMonth(t.getMonth()+n)}),(function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})),_g=vg.range,bg=Bp((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,n){t.setFullYear(t.getFullYear()+n)}),(function(t,n){return n.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));bg.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Bp((function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)}),(function(n,e){n.setFullYear(n.getFullYear()+e*t)})):null};var mg=bg.range,xg=Bp((function(t){t.setUTCSeconds(0,0)}),(function(t,n){t.setTime(+t+n*Hp)}),(function(t,n){return(n-t)/Hp}),(function(t){return t.getUTCMinutes()})),wg=xg.range,Mg=Bp((function(t){t.setUTCMinutes(0,0,0)}),(function(t,n){t.setTime(+t+n*Xp)}),(function(t,n){return(n-t)/Xp}),(function(t){return t.getUTCHours()})),Ag=Mg.range,Tg=Bp((function(t){t.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCDate(t.getUTCDate()+n)}),(function(t,n){return(n-t)/Gp}),(function(t){return t.getUTCDate()-1})),Sg=Tg.range;function Eg(t){return Bp((function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCDate(t.getUTCDate()+7*n)}),(function(t,n){return(n-t)/Vp}))}var kg=Eg(0),Ng=Eg(1),Cg=Eg(2),Pg=Eg(3),zg=Eg(4),Dg=Eg(5),qg=Eg(6),Rg=kg.range,Fg=Ng.range,Og=Cg.range,Ug=Pg.range,Ig=zg.range,Bg=Dg.range,Yg=qg.range,Lg=Bp((function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCMonth(t.getUTCMonth()+n)}),(function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())}),(function(t){return t.getUTCMonth()})),jg=Lg.range,Hg=Bp((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)}),(function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));Hg.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Bp((function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)}),(function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)})):null};var Xg=Hg.range;function Gg(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function Vg(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function $g(t,n,e){return{y:t,m:n,d:e,H:0,M:0,S:0,L:0}}function Wg(t){var n=t.dateTime,e=t.date,r=t.time,i=t.periods,o=t.days,a=t.shortDays,u=t.months,c=t.shortMonths,f=ry(i),s=iy(i),l=ry(o),h=iy(o),d=ry(a),p=iy(a),g=ry(u),y=iy(u),v=ry(c),_=iy(c),b={a:function(t){return a[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Ty,e:Ty,f:Cy,g:Yy,G:jy,H:Sy,I:Ey,j:ky,L:Ny,m:Py,M:zy,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:hv,s:dv,S:Dy,u:qy,U:Ry,V:Oy,w:Uy,W:Iy,x:null,X:null,y:By,Y:Ly,Z:Hy,"%":lv},m={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:Xy,e:Xy,f:Zy,g:uv,G:fv,H:Gy,I:Vy,j:$y,L:Wy,m:Ky,M:Qy,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:hv,s:dv,S:Jy,u:tv,U:nv,V:rv,w:iv,W:ov,x:null,X:null,y:av,Y:cv,Z:sv,"%":lv},x={a:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=p.get(r[0].toLowerCase()),e+r[0].length):-1},A:function(t,n,e){var r=l.exec(n.slice(e));return r?(t.w=h.get(r[0].toLowerCase()),e+r[0].length):-1},b:function(t,n,e){var r=v.exec(n.slice(e));return r?(t.m=_.get(r[0].toLowerCase()),e+r[0].length):-1},B:function(t,n,e){var r=g.exec(n.slice(e));return r?(t.m=y.get(r[0].toLowerCase()),e+r[0].length):-1},c:function(t,e,r){return A(t,n,e,r)},d:gy,e:gy,f:xy,g:ly,G:sy,H:vy,I:vy,j:yy,L:my,m:py,M:_y,p:function(t,n,e){var r=f.exec(n.slice(e));return r?(t.p=s.get(r[0].toLowerCase()),e+r[0].length):-1},q:dy,Q:My,s:Ay,S:by,u:ay,U:uy,V:cy,w:oy,W:fy,x:function(t,n,r){return A(t,e,n,r)},X:function(t,n,e){return A(t,r,n,e)},y:ly,Y:sy,Z:hy,"%":wy};function w(t,n){return function(e){var r,i,o,a=[],u=-1,c=0,f=t.length;for(e instanceof Date||(e=new Date(+e));++u53)return null;"w"in o||(o.w=1),"Z"in o?(i=(r=Vg($g(o.y,0,1))).getUTCDay(),r=i>4||0===i?Ng.ceil(r):Ng(r),r=Tg.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=Gg($g(o.y,0,1))).getDay(),r=i>4||0===i?ig.ceil(r):ig(r),r=tg.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?Vg($g(o.y,0,1)).getUTCDay():Gg($g(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,Vg(o)):Gg(o)}}function A(t,n,e,r){for(var i,o,a=0,u=n.length,c=e.length;a=c)return-1;if(37===(i=n.charCodeAt(a++))){if(i=n.charAt(a++),!(o=x[i in Kg?n.charAt(a++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}return b.x=w(e,b),b.X=w(r,b),b.c=w(n,b),m.x=w(e,m),m.X=w(r,m),m.c=w(n,m),{format:function(t){var n=w(t+="",b);return n.toString=function(){return t},n},parse:function(t){var n=M(t+="",!1);return n.toString=function(){return t},n},utcFormat:function(t){var n=w(t+="",m);return n.toString=function(){return t},n},utcParse:function(t){var n=M(t+="",!0);return n.toString=function(){return t},n}}}var Zg,Kg={"-":"",_:" ",0:"0"},Qg=/^\s*\d+/,Jg=/^%/,ty=/[\\^$*+?|[\]().{}]/g;function ny(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o[t.toLowerCase(),n])))}function oy(t,n,e){var r=Qg.exec(n.slice(e,e+1));return r?(t.w=+r[0],e+r[0].length):-1}function ay(t,n,e){var r=Qg.exec(n.slice(e,e+1));return r?(t.u=+r[0],e+r[0].length):-1}function uy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.U=+r[0],e+r[0].length):-1}function cy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.V=+r[0],e+r[0].length):-1}function fy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.W=+r[0],e+r[0].length):-1}function sy(t,n,e){var r=Qg.exec(n.slice(e,e+4));return r?(t.y=+r[0],e+r[0].length):-1}function ly(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),e+r[0].length):-1}function hy(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function dy(t,n,e){var r=Qg.exec(n.slice(e,e+1));return r?(t.q=3*r[0]-3,e+r[0].length):-1}function py(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function gy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function yy(t,n,e){var r=Qg.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function vy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function _y(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function by(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function my(t,n,e){var r=Qg.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function xy(t,n,e){var r=Qg.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function wy(t,n,e){var r=Jg.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function My(t,n,e){var r=Qg.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function Ay(t,n,e){var r=Qg.exec(n.slice(e));return r?(t.s=+r[0],e+r[0].length):-1}function Ty(t,n){return ny(t.getDate(),n,2)}function Sy(t,n){return ny(t.getHours(),n,2)}function Ey(t,n){return ny(t.getHours()%12||12,n,2)}function ky(t,n){return ny(1+tg.count(bg(t),t),n,3)}function Ny(t,n){return ny(t.getMilliseconds(),n,3)}function Cy(t,n){return Ny(t,n)+"000"}function Py(t,n){return ny(t.getMonth()+1,n,2)}function zy(t,n){return ny(t.getMinutes(),n,2)}function Dy(t,n){return ny(t.getSeconds(),n,2)}function qy(t){var n=t.getDay();return 0===n?7:n}function Ry(t,n){return ny(rg.count(bg(t)-1,t),n,2)}function Fy(t){var n=t.getDay();return n>=4||0===n?ug(t):ug.ceil(t)}function Oy(t,n){return t=Fy(t),ny(ug.count(bg(t),t)+(4===bg(t).getDay()),n,2)}function Uy(t){return t.getDay()}function Iy(t,n){return ny(ig.count(bg(t)-1,t),n,2)}function By(t,n){return ny(t.getFullYear()%100,n,2)}function Yy(t,n){return ny((t=Fy(t)).getFullYear()%100,n,2)}function Ly(t,n){return ny(t.getFullYear()%1e4,n,4)}function jy(t,n){var e=t.getDay();return ny((t=e>=4||0===e?ug(t):ug.ceil(t)).getFullYear()%1e4,n,4)}function Hy(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+ny(n/60|0,"0",2)+ny(n%60,"0",2)}function Xy(t,n){return ny(t.getUTCDate(),n,2)}function Gy(t,n){return ny(t.getUTCHours(),n,2)}function Vy(t,n){return ny(t.getUTCHours()%12||12,n,2)}function $y(t,n){return ny(1+Tg.count(Hg(t),t),n,3)}function Wy(t,n){return ny(t.getUTCMilliseconds(),n,3)}function Zy(t,n){return Wy(t,n)+"000"}function Ky(t,n){return ny(t.getUTCMonth()+1,n,2)}function Qy(t,n){return ny(t.getUTCMinutes(),n,2)}function Jy(t,n){return ny(t.getUTCSeconds(),n,2)}function tv(t){var n=t.getUTCDay();return 0===n?7:n}function nv(t,n){return ny(kg.count(Hg(t)-1,t),n,2)}function ev(t){var n=t.getUTCDay();return n>=4||0===n?zg(t):zg.ceil(t)}function rv(t,n){return t=ev(t),ny(zg.count(Hg(t),t)+(4===Hg(t).getUTCDay()),n,2)}function iv(t){return t.getUTCDay()}function ov(t,n){return ny(Ng.count(Hg(t)-1,t),n,2)}function av(t,n){return ny(t.getUTCFullYear()%100,n,2)}function uv(t,n){return ny((t=ev(t)).getUTCFullYear()%100,n,2)}function cv(t,n){return ny(t.getUTCFullYear()%1e4,n,4)}function fv(t,n){var e=t.getUTCDay();return ny((t=e>=4||0===e?zg(t):zg.ceil(t)).getUTCFullYear()%1e4,n,4)}function sv(){return"+0000"}function lv(){return"%"}function hv(t){return+t}function dv(t){return Math.floor(+t/1e3)}function pv(n){return Zg=Wg(n),t.timeFormat=Zg.format,t.timeParse=Zg.parse,t.utcFormat=Zg.utcFormat,t.utcParse=Zg.utcParse,Zg}t.timeFormat=void 0,t.timeParse=void 0,t.utcFormat=void 0,t.utcParse=void 0,pv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var gv="%Y-%m-%dT%H:%M:%S.%LZ";var yv=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat(gv);var vv=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse(gv),_v=1e3,bv=6e4,mv=36e5,xv=864e5,wv=2592e6,Mv=31536e6;function Av(t){return new Date(t)}function Tv(t){return t instanceof Date?+t:+new Date(+t)}function Sv(t,n,r,i,o,a,u,c,f){var s=vp(),l=s.invert,h=s.domain,d=f(".%L"),p=f(":%S"),g=f("%I:%M"),y=f("%I %p"),v=f("%a %d"),_=f("%b %d"),b=f("%B"),m=f("%Y"),x=[[u,1,_v],[u,5,5e3],[u,15,15e3],[u,30,3e4],[a,1,bv],[a,5,3e5],[a,15,9e5],[a,30,18e5],[o,1,mv],[o,3,108e5],[o,6,216e5],[o,12,432e5],[i,1,xv],[i,2,1728e5],[r,1,6048e5],[n,1,wv],[n,3,7776e6],[t,1,Mv]];function w(e){return(u(e)hr(t[t.length-1]),Hv=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(zv),Xv=jv(Hv),Gv=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(zv),Vv=jv(Gv),$v=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(zv),Wv=jv($v),Zv=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(zv),Kv=jv(Zv),Qv=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(zv),Jv=jv(Qv),t_=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(zv),n_=jv(t_),e_=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(zv),r_=jv(e_),i_=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(zv),o_=jv(i_),a_=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(zv),u_=jv(a_),c_=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(zv),f_=jv(c_),s_=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(zv),l_=jv(s_),h_=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(zv),d_=jv(h_),p_=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(zv),g_=jv(p_),y_=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(zv),v_=jv(y_),__=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(zv),b_=jv(__),m_=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(zv),x_=jv(m_),w_=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(zv),M_=jv(w_),A_=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(zv),T_=jv(A_),S_=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(zv),E_=jv(S_),k_=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(zv),N_=jv(k_),C_=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(zv),P_=jv(C_),z_=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(zv),D_=jv(z_),q_=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(zv),R_=jv(q_),F_=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(zv),O_=jv(F_),U_=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(zv),I_=jv(U_),B_=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(zv),Y_=jv(B_),L_=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(zv),j_=jv(L_);var H_=Lr(tr(300,.5,0),tr(-240,.5,1)),X_=Lr(tr(-100,.75,.35),tr(80,1.5,.8)),G_=Lr(tr(260,.75,.35),tr(80,1.5,.8)),V_=tr();var $_=ve(),W_=Math.PI/3,Z_=2*Math.PI/3;function K_(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}}var Q_=K_(zv("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),J_=K_(zv("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),tb=K_(zv("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),nb=K_(zv("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function eb(t){return function(){return t}}var rb=Math.abs,ib=Math.atan2,ob=Math.cos,ab=Math.max,ub=Math.min,cb=Math.sin,fb=Math.sqrt,sb=1e-12,lb=Math.PI,hb=lb/2,db=2*lb;function pb(t){return t>1?0:t<-1?lb:Math.acos(t)}function gb(t){return t>=1?hb:t<=-1?-hb:Math.asin(t)}function yb(t){return t.innerRadius}function vb(t){return t.outerRadius}function _b(t){return t.startAngle}function bb(t){return t.endAngle}function mb(t){return t&&t.padAngle}function xb(t,n,e,r,i,o,a,u){var c=e-t,f=r-n,s=a-i,l=u-o,h=l*c-s*f;if(!(h*hC*C+P*P&&(A=S,T=E),{cx:A,cy:T,x01:-s,y01:-l,x11:A*(i/x-1),y11:T*(i/x-1)}}var Mb=Array.prototype.slice;function Ab(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function Tb(t){this._context=t}function Sb(t){return new Tb(t)}function Eb(t){return t[0]}function kb(t){return t[1]}function Nb(t,n){var e=eb(!0),r=null,i=Sb,o=null;function a(a){var u,c,f,s=(a=Ab(a)).length,l=!1;for(null==r&&(o=i(f=fa())),u=0;u<=s;++u)!(u=s;--l)u.point(y[l],v[l]);u.lineEnd(),u.areaEnd()}g&&(y[f]=+t(h,f,c),v[f]=+n(h,f,c),u.point(r?+r(h,f,c):y[f],e?+e(h,f,c):v[f]))}if(d)return u=null,d+""||null}function f(){return Nb().defined(i).curve(a).context(o)}return t="function"==typeof t?t:void 0===t?Eb:eb(+t),n="function"==typeof n?n:eb(void 0===n?0:+n),e="function"==typeof e?e:void 0===e?kb:eb(+e),c.x=function(n){return arguments.length?(t="function"==typeof n?n:eb(+n),r=null,c):t},c.x0=function(n){return arguments.length?(t="function"==typeof n?n:eb(+n),c):t},c.x1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:eb(+t),c):r},c.y=function(t){return arguments.length?(n="function"==typeof t?t:eb(+t),e=null,c):n},c.y0=function(t){return arguments.length?(n="function"==typeof t?t:eb(+t),c):n},c.y1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:eb(+t),c):e},c.lineX0=c.lineY0=function(){return f().x(t).y(n)},c.lineY1=function(){return f().x(t).y(e)},c.lineX1=function(){return f().x(r).y(n)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:eb(!!t),c):i},c.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),c):a},c.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),c):o},c}function Pb(t,n){return nt?1:n>=t?0:NaN}function zb(t){return t}Tb.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var Db=Rb(Sb);function qb(t){this._curve=t}function Rb(t){function n(n){return new qb(t(n))}return n._curve=t,n}function Fb(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(Rb(t)):n()._curve},t}function Ob(){return Fb(Nb().curve(Db))}function Ub(){var t=Cb().curve(Db),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Fb(e())},delete t.lineX0,t.lineEndAngle=function(){return Fb(r())},delete t.lineX1,t.lineInnerRadius=function(){return Fb(i())},delete t.lineY0,t.lineOuterRadius=function(){return Fb(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(Rb(t)):n()._curve},t}function Ib(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}function Bb(t){return t.source}function Yb(t){return t.target}function Lb(t){var n=Bb,e=Yb,r=Eb,i=kb,o=null;function a(){var a,u=Mb.call(arguments),c=n.apply(this,u),f=e.apply(this,u);if(o||(o=a=fa()),t(o,+r.apply(this,(u[0]=c,u)),+i.apply(this,u),+r.apply(this,(u[0]=f,u)),+i.apply(this,u)),a)return o=null,a+""||null}return a.source=function(t){return arguments.length?(n=t,a):n},a.target=function(t){return arguments.length?(e=t,a):e},a.x=function(t){return arguments.length?(r="function"==typeof t?t:eb(+t),a):r},a.y=function(t){return arguments.length?(i="function"==typeof t?t:eb(+t),a):i},a.context=function(t){return arguments.length?(o=null==t?null:t,a):o},a}function jb(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}function Hb(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}function Xb(t,n,e,r,i){var o=Ib(n,e),a=Ib(n,e=(e+i)/2),u=Ib(r,e),c=Ib(r,i);t.moveTo(o[0],o[1]),t.bezierCurveTo(a[0],a[1],u[0],u[1],c[0],c[1])}qb.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var Gb={draw:function(t,n){var e=Math.sqrt(n/lb);t.moveTo(e,0),t.arc(0,0,e,0,db)}},Vb={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},$b=Math.sqrt(1/3),Wb=2*$b,Zb={draw:function(t,n){var e=Math.sqrt(n/Wb),r=e*$b;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},Kb=Math.sin(lb/10)/Math.sin(7*lb/10),Qb=Math.sin(db/10)*Kb,Jb=-Math.cos(db/10)*Kb,tm={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=Qb*e,i=Jb*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var a=db*o/5,u=Math.cos(a),c=Math.sin(a);t.lineTo(c*e,-u*e),t.lineTo(u*r-c*i,c*r+u*i)}t.closePath()}},nm={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},em=Math.sqrt(3),rm={draw:function(t,n){var e=-Math.sqrt(n/(3*em));t.moveTo(0,2*e),t.lineTo(-em*e,-e),t.lineTo(em*e,-e),t.closePath()}},im=-.5,om=Math.sqrt(3)/2,am=1/Math.sqrt(12),um=3*(am/2+1),cm={draw:function(t,n){var e=Math.sqrt(n/um),r=e/2,i=e*am,o=r,a=e*am+e,u=-o,c=a;t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(im*r-om*i,om*r+im*i),t.lineTo(im*o-om*a,om*o+im*a),t.lineTo(im*u-om*c,om*u+im*c),t.lineTo(im*r+om*i,im*i-om*r),t.lineTo(im*o+om*a,im*a-om*o),t.lineTo(im*u+om*c,im*c-om*u),t.closePath()}},fm=[Gb,Vb,Zb,nm,tm,rm,cm];function sm(){}function lm(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function hm(t){this._context=t}function dm(t){this._context=t}function pm(t){this._context=t}hm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:lm(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:lm(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},dm.prototype={areaStart:sm,areaEnd:sm,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:lm(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},pm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:lm(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}};class gm{constructor(t,n){this._context=t,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,n,t,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,t,this._y0,t,n)}this._x0=t,this._y0=n}}function ym(t,n){this._basis=new hm(t),this._beta=n}ym.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],a=t[e]-i,u=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*n[c]+(1-this._beta)*(o+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var vm=function t(n){function e(t){return 1===n?new hm(t):new ym(t,n)}return e.beta=function(n){return t(+n)},e}(.85);function _m(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function bm(t,n){this._context=t,this._k=(1-n)/6}bm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:_m(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:_m(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var mm=function t(n){function e(t){return new bm(t,n)}return e.tension=function(n){return t(+n)},e}(0);function xm(t,n){this._context=t,this._k=(1-n)/6}xm.prototype={areaStart:sm,areaEnd:sm,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:_m(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var wm=function t(n){function e(t){return new xm(t,n)}return e.tension=function(n){return t(+n)},e}(0);function Mm(t,n){this._context=t,this._k=(1-n)/6}Mm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:_m(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Am=function t(n){function e(t){return new Mm(t,n)}return e.tension=function(n){return t(+n)},e}(0);function Tm(t,n,e){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>sb){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>sb){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,s=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*f+t._x1*t._l23_2a-n*t._l12_2a)/s,a=(a*f+t._y1*t._l23_2a-e*t._l12_2a)/s}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function Sm(t,n){this._context=t,this._alpha=n}Sm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:Tm(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Em=function t(n){function e(t){return n?new Sm(t,n):new bm(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function km(t,n){this._context=t,this._alpha=n}km.prototype={areaStart:sm,areaEnd:sm,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Tm(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Nm=function t(n){function e(t){return n?new km(t,n):new xm(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function Cm(t,n){this._context=t,this._alpha=n}Cm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Tm(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Pm=function t(n){function e(t){return n?new Cm(t,n):new Mm(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function zm(t){this._context=t}function Dm(t){return t<0?-1:1}function qm(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(e-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i);return(Dm(o)+Dm(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function Rm(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function Fm(t,n,e){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3;t._context.bezierCurveTo(r+u,i+u*n,o-u,a-u*e,o,a)}function Om(t){this._context=t}function Um(t){this._context=new Im(t)}function Im(t){this._context=t}function Bm(t){this._context=t}function Ym(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r);for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(a[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,a=t[n[0]],u=a.length;o=0;)e[n]=n;return e}function Xm(t,n){return t[n]}function Gm(t){const n=[];return n.key=t,n}function Vm(t){var n=t.map($m);return Hm(t).sort((function(t,e){return n[t]-n[e]}))}function $m(t){for(var n,e=-1,r=0,i=t.length,o=-1/0;++eo&&(o=n,r=e);return r}function Wm(t){var n=t.map(Zm);return Hm(t).sort((function(t,e){return n[t]-n[e]}))}function Zm(t){for(var n,e=0,r=-1,i=t.length;++r=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}};var Km=t=>()=>t;function Qm(t,{sourceEvent:n,target:e,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function Jm(t,n,e){this.k=t,this.x=n,this.y=e}Jm.prototype={constructor:Jm,scale:function(t){return 1===t?this:new Jm(this.k*t,this.x,this.y)},translate:function(t,n){return 0===t&0===n?this:new Jm(this.k,this.x+this.k*t,this.y+this.k*n)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var tx=new Jm(1,0,0);function nx(t){for(;!t.__zoom;)if(!(t=t.parentNode))return tx;return t.__zoom}function ex(t){t.stopImmediatePropagation()}function rx(t){t.preventDefault(),t.stopImmediatePropagation()}function ix(t){return!(t.ctrlKey&&"wheel"!==t.type||t.button)}function ox(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t).hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]:[[0,0],[t.clientWidth,t.clientHeight]]}function ax(){return this.__zoom||tx}function ux(t){return-t.deltaY*(1===t.deltaMode?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function cx(){return navigator.maxTouchPoints||"ontouchstart"in this}function fx(t,n,e){var r=t.invertX(n[0][0])-e[0][0],i=t.invertX(n[1][0])-e[1][0],o=t.invertY(n[0][1])-e[0][1],a=t.invertY(n[1][1])-e[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}nx.prototype=Jm.prototype,t.Adder=g,t.Delaunay=nu,t.FormatSpecifier=uc,t.InternMap=y,t.InternSet=v,t.Voronoi=Wa,t.active=function(t,n){var e,r,i=t.__transition;if(i)for(r in n=null==n?null:n+"",i)if((e=i[r]).state>1&&e.name===n)return new ji([[t]],_o,n,+r);return null},t.arc=function(){var t=yb,n=vb,e=eb(0),r=null,i=_b,o=bb,a=mb,u=null;function c(){var c,f,s=+t.apply(this,arguments),l=+n.apply(this,arguments),h=i.apply(this,arguments)-hb,d=o.apply(this,arguments)-hb,p=rb(d-h),g=d>h;if(u||(u=c=fa()),lsb)if(p>db-sb)u.moveTo(l*ob(h),l*cb(h)),u.arc(0,0,l,h,d,!g),s>sb&&(u.moveTo(s*ob(d),s*cb(d)),u.arc(0,0,s,d,h,g));else{var y,v,_=h,b=d,m=h,x=d,w=p,M=p,A=a.apply(this,arguments)/2,T=A>sb&&(r?+r.apply(this,arguments):fb(s*s+l*l)),S=ub(rb(l-s)/2,+e.apply(this,arguments)),E=S,k=S;if(T>sb){var N=gb(T/s*cb(A)),C=gb(T/l*cb(A));(w-=2*N)>sb?(m+=N*=g?1:-1,x-=N):(w=0,m=x=(h+d)/2),(M-=2*C)>sb?(_+=C*=g?1:-1,b-=C):(M=0,_=b=(h+d)/2)}var P=l*ob(_),z=l*cb(_),D=s*ob(x),q=s*cb(x);if(S>sb){var R,F=l*ob(b),O=l*cb(b),U=s*ob(m),I=s*cb(m);if(psb?k>sb?(y=wb(U,I,P,z,l,k,g),v=wb(F,O,D,q,l,k,g),u.moveTo(y.cx+y.x01,y.cy+y.y01),ksb&&w>sb?E>sb?(y=wb(D,q,F,O,s,-E,g),v=wb(P,z,U,I,s,-E,g),u.lineTo(y.cx+y.x01,y.cy+y.y01),E>a,f=i+2*u>>a,s=wa(20);function l(r){var i=new Float32Array(c*f),l=new Float32Array(c*f);r.forEach((function(r,o,s){var l=+t(r,o,s)+u>>a,h=+n(r,o,s)+u>>a,d=+e(r,o,s);l>=0&&l=0&&h>a),Ca({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Na({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),Ca({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Na({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),Ca({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a);var d=s(i);if(!Array.isArray(d)){var p=B(i);d=F(0,p,d),(d=Z(0,Math.floor(p/d)*d,d)).shift()}return ka().thresholds(d).size([c,f])(i).map(h)}function h(t){return t.value*=Math.pow(2,-2*a),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(g)}function g(t){t[0]=t[0]*Math.pow(2,a)-u,t[1]=t[1]*Math.pow(2,a)-u}function y(){return c=r+2*(u=3*o)>>a,f=i+2*u>>a,l}return l.x=function(n){return arguments.length?(t="function"==typeof n?n:wa(+n),l):t},l.y=function(t){return arguments.length?(n="function"==typeof t?t:wa(+t),l):n},l.weight=function(t){return arguments.length?(e="function"==typeof t?t:wa(+t),l):e},l.size=function(t){if(!arguments.length)return[r,i];var n=+t[0],e=+t[1];if(!(n>=0&&e>=0))throw new Error("invalid size");return r=n,i=e,y()},l.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return a=Math.floor(Math.log(t)/Math.LN2),y()},l.thresholds=function(t){return arguments.length?(s="function"==typeof t?t:Array.isArray(t)?wa(ma.call(t)):wa(t),l):s},l.bandwidth=function(t){if(!arguments.length)return Math.sqrt(o*(o+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return o=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},l},t.contours=ka,t.count=c,t.create=function(t){return Dn(At(t).call(document.documentElement))},t.creator=At,t.cross=function(...t){const n="function"==typeof t[t.length-1]&&function(t){return n=>t(...n)}(t.pop()),e=(t=t.map(l)).map(f),r=t.length-1,i=new Array(r+1).fill(0),o=[];if(r<0||e.some(s))return o;for(;;){o.push(i.map(((n,e)=>t[e][n])));let a=r;for(;++i[a]===e[a];){if(0===a)return n?o.map(n):o;i[a--]=0}}},t.csv=Pu,t.csvFormat=hu,t.csvFormatBody=du,t.csvFormatRow=gu,t.csvFormatRows=pu,t.csvFormatValue=yu,t.csvParse=su,t.csvParseRows=lu,t.cubehelix=tr,t.cumsum=function(t,n){var e=0,r=0;return Float64Array.from(t,void 0===n?t=>e+=+t||0:i=>e+=+n(i,r++,t)||0)},t.curveBasis=function(t){return new hm(t)},t.curveBasisClosed=function(t){return new dm(t)},t.curveBasisOpen=function(t){return new pm(t)},t.curveBumpX=function(t){return new gm(t,!0)},t.curveBumpY=function(t){return new gm(t,!1)},t.curveBundle=vm,t.curveCardinal=mm,t.curveCardinalClosed=wm,t.curveCardinalOpen=Am,t.curveCatmullRom=Em,t.curveCatmullRomClosed=Nm,t.curveCatmullRomOpen=Pm,t.curveLinear=Sb,t.curveLinearClosed=function(t){return new zm(t)},t.curveMonotoneX=function(t){return new Om(t)},t.curveMonotoneY=function(t){return new Um(t)},t.curveNatural=function(t){return new Bm(t)},t.curveStep=function(t){return new Lm(t,.5)},t.curveStepAfter=function(t){return new Lm(t,1)},t.curveStepBefore=function(t){return new Lm(t,0)},t.descending=function(t,n){return nt?1:n>=t?0:NaN},t.deviation=d,t.difference=function(t,...n){t=new Set(t);for(const e of n)for(const n of e)t.delete(n);return t},t.disjoint=function(t,n){const e=n[Symbol.iterator](),r=new Set;for(const n of t){if(r.has(n))return!1;let t,i;for(;({value:t,done:i}=e.next())&&!i;){if(Object.is(n,t))return!1;r.add(t)}}return!0},t.dispatch=pt,t.drag=function(){var t,n,e,r,i=Xn,o=Gn,a=Vn,u=$n,c={},f=pt("start","drag","end"),s=0,l=0;function h(t){t.on("mousedown.drag",d).filter(u).on("touchstart.drag",y).on("touchmove.drag",v).on("touchend.drag touchcancel.drag",_).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(a,u){if(!r&&i.call(this,a,u)){var c=b(this,o.call(this,a,u),a,u,"mouse");c&&(Dn(a.view).on("mousemove.drag",p,!0).on("mouseup.drag",g,!0),Yn(a.view),In(a),e=!1,t=a.clientX,n=a.clientY,c("start",a))}}function p(r){if(Bn(r),!e){var i=r.clientX-t,o=r.clientY-n;e=i*i+o*o>l}c.mouse("drag",r)}function g(t){Dn(t.view).on("mousemove.drag mouseup.drag",null),Ln(t.view,e),Bn(t),c.mouse("end",t)}function y(t,n){if(i.call(this,t,n)){var e,r,a=t.changedTouches,u=o.call(this,t,n),c=a.length;for(e=0;e+t,t.easePoly=Ki,t.easePolyIn=Wi,t.easePolyInOut=Ki,t.easePolyOut=Zi,t.easeQuad=Vi,t.easeQuadIn=function(t){return t*t},t.easeQuadInOut=Vi,t.easeQuadOut=function(t){return t*(2-t)},t.easeSin=to,t.easeSinIn=function(t){return 1==+t?1:1-Math.cos(t*Ji)},t.easeSinInOut=to,t.easeSinOut=function(t){return Math.sin(t*Ji)},t.every=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let e=-1;for(const r of t)if(!n(r,++e,t))return!1;return!0},t.extent=p,t.fcumsum=function(t,n){const e=new g;let r=-1;return Float64Array.from(t,void 0===n?t=>e.add(+t||0):i=>e.add(+n(i,++r,t)||0))},t.filter=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");const e=[];let r=-1;for(const i of t)n(i,++r,t)&&e.push(i);return e},t.forceCenter=function(t,n){var e,r=1;function i(){var i,o,a=e.length,u=0,c=0;for(i=0;if+p||os+p||ac.index){var g=f-u.x-u.vx,y=s-u.y-u.vy,v=g*g+y*y;vt.r&&(t.r=t[n].r)}function c(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r[u(t,n,r),t])));for(a=0,i=new Array(f);a=u)){(t.data!==n||t.next)&&(0===l&&(p+=(l=Vu(e))*l),0===h&&(p+=(h=Vu(e))*h),p(t=(1664525*t+1013904223)%Qu)/Qu}();function l(){h(),f.call("tick",n),e1?(null==e?u.delete(t):u.set(t,p(e)),n):u.get(t)},find:function(n,e,r){var i,o,a,u,c,f=0,s=t.length;for(null==r?r=1/0:r*=r,f=0;f1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=Gu(.1);function o(t){for(var i,o=0,a=n.length;o=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++eKf(r[0],r[1])&&(r[1]=i[1]),Kf(i[0],r[1])>Kf(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=Kf(r[1],i[0]))>a&&(a=u,nf=i[0],rf=r[1])}return lf=hf=null,nf===1/0||ef===1/0?[[NaN,NaN],[NaN,NaN]]:[[nf,ef],[rf,of]]},t.geoCentroid=function(t){Ef=kf=Nf=Cf=Pf=zf=Df=qf=0,Rf=new g,Ff=new g,Of=new g,Wc(t,ts);var n=+Rf,e=+Ff,r=+Of,i=Dc(n,e,r);return i2?t[2]+90:90]):[(t=e())[0],t[1],t[2]-90]},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=Bh,t.gray=function(t,n){return new Fe(t,0,0,null==n?1:n)},t.greatest=function(t,e=n){let r,i=!1;if(1===e.length){let o;for(const a of t){const t=e(a);(i?n(t,o)>0:0===n(t,t))&&(r=a,o=t,i=!0)}}else for(const n of t)(i?e(n,r)>0:0===e(n,n))&&(r=n,i=!0);return r},t.greatestIndex=function(t,e=n){if(1===e.length)return G(t,e);let r,i=-1,o=-1;for(const n of t)++o,(i<0?0===e(n,n):e(n,r)>0)&&(r=n,i=o);return i},t.group=M,t.groupSort=function(t,e,r){return(1===e.length?k(A(t,e,r),(([t,e],[r,i])=>n(e,i)||n(t,r))):k(M(t,r),(([t,r],[i,o])=>e(r,o)||n(t,i)))).map((([t])=>t))},t.groups=function(t,...n){return S(t,Array.from,w,n)},t.hcl=Le,t.hierarchy=Xh,t.histogram=I,t.hsl=Ae,t.html=Fu,t.image=function(t,n){return new Promise((function(e,r){var i=new Image;for(var o in n)i[o]=n[o];i.onerror=r,i.onload=function(){e(i)},i.src=t}))},t.index=function(t,...n){return S(t,w,T,n)},t.indexes=function(t,...n){return S(t,Array.from,T,n)},t.interpolate=Mr,t.interpolateArray=function(t,n){return(gr(n)?pr:yr)(t,n)},t.interpolateBasis=rr,t.interpolateBasisClosed=ir,t.interpolateBlues=D_,t.interpolateBrBG=Xv,t.interpolateBuGn=f_,t.interpolateBuPu=l_,t.interpolateCividis=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-t*(35.34-t*(2381.73-t*(6402.7-t*(7024.72-2710.57*t)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+t*(170.73+t*(52.82-t*(131.46-t*(176.58-67.37*t)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+t*(442.36-t*(2482.43-t*(6167.24-t*(6614.94-2475.67*t)))))))+")"},t.interpolateCool=G_,t.interpolateCubehelix=Yr,t.interpolateCubehelixDefault=H_,t.interpolateCubehelixLong=Lr,t.interpolateDate=vr,t.interpolateDiscrete=function(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}},t.interpolateGnBu=d_,t.interpolateGreens=R_,t.interpolateGreys=O_,t.interpolateHcl=Ur,t.interpolateHclLong=Ir,t.interpolateHsl=Rr,t.interpolateHslLong=Fr,t.interpolateHue=function(t,n){var e=ur(+t,+n);return function(t){var n=e(t);return n-360*Math.floor(n/360)}},t.interpolateInferno=tb,t.interpolateLab=function(t,n){var e=fr((t=Re(t)).l,(n=Re(n)).l),r=fr(t.a,n.a),i=fr(t.b,n.b),o=fr(t.opacity,n.opacity);return function(n){return t.l=e(n),t.a=r(n),t.b=i(n),t.opacity=o(n),t+""}},t.interpolateMagma=J_,t.interpolateNumber=_r,t.interpolateNumberArray=pr,t.interpolateObject=br,t.interpolateOrRd=g_,t.interpolateOranges=j_,t.interpolatePRGn=Vv,t.interpolatePiYG=Wv,t.interpolatePlasma=nb,t.interpolatePuBu=b_,t.interpolatePuBuGn=v_,t.interpolatePuOr=Kv,t.interpolatePuRd=x_,t.interpolatePurples=I_,t.interpolateRainbow=function(t){(t<0||t>1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return V_.h=360*t-100,V_.s=1.5-1.5*n,V_.l=.8-.9*n,V_+""},t.interpolateRdBu=Jv,t.interpolateRdGy=n_,t.interpolateRdPu=M_,t.interpolateRdYlBu=r_,t.interpolateRdYlGn=o_,t.interpolateReds=Y_,t.interpolateRgb=sr,t.interpolateRgbBasis=hr,t.interpolateRgbBasisClosed=dr,t.interpolateRound=Ar,t.interpolateSinebow=function(t){var n;return t=(.5-t)*Math.PI,$_.r=255*(n=Math.sin(t))*n,$_.g=255*(n=Math.sin(t+W_))*n,$_.b=255*(n=Math.sin(t+Z_))*n,$_+""},t.interpolateSpectral=u_,t.interpolateString=wr,t.interpolateTransformCss=Cr,t.interpolateTransformSvg=Pr,t.interpolateTurbo=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"},t.interpolateViridis=Q_,t.interpolateWarm=X_,t.interpolateYlGn=E_,t.interpolateYlGnBu=T_,t.interpolateYlOrBr=N_,t.interpolateYlOrRd=P_,t.interpolateZoom=Dr,t.interrupt=gi,t.intersection=function(t,...n){t=new Set(t),n=n.map(et);t:for(const e of t)for(const r of n)if(!r.has(e)){t.delete(e);continue t}return t},t.interval=function(t,n,e){var r=new ei,i=n;return null==n?(r.restart(t,n,e),r):(r._restart=r.restart,r.restart=function(t,n,e){n=+n,e=null==e?ti():+e,r._restart((function o(a){a+=i,r._restart(o,i+=n,e),t(a)}),n,e)},r.restart(t,n,e),r)},t.isoFormat=yv,t.isoParse=vv,t.json=function(t,n){return fetch(t,n).then(Du)},t.lab=Re,t.lch=function(t,n,e,r){return 1===arguments.length?Ye(t):new je(e,n,t,null==r?1:r)},t.least=function(t,e=n){let r,i=!1;if(1===e.length){let o;for(const a of t){const t=e(a);(i?n(t,o)<0:0===n(t,t))&&(r=a,o=t,i=!0)}}else for(const n of t)(i?e(n,r)<0:0===e(n,n))&&(r=n,i=!0);return r},t.leastIndex=K,t.line=Nb,t.lineRadial=Ob,t.linkHorizontal=function(){return Lb(jb)},t.linkRadial=function(){var t=Lb(Xb);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.linkVertical=function(){return Lb(Hb)},t.local=Rn,t.map=function(t,n){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");if("function"!=typeof n)throw new TypeError("mapper is not a function");return Array.from(t,((e,r)=>n(e,r,t)))},t.matcher=Ct,t.max=B,t.maxIndex=G,t.mean=function(t,n){let e=0,r=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(++e,r+=n);else{let i=-1;for(let o of t)null!=(o=n(o,++i,t))&&(o=+o)>=o&&(++e,r+=o)}if(e)return r/e},t.median=function(t,n){return H(t,.5,n)},t.merge=V,t.min=Y,t.minIndex=$,t.namespace=xt,t.namespaces=mt,t.nice=O,t.now=ti,t.pack=function(){var t=null,n=1,e=1,r=hd;function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(gd(t)).eachAfter(yd(r,.5)).eachBefore(vd(1)):i.eachBefore(gd(pd)).eachAfter(yd(hd,1)).eachAfter(yd(r,i.r/Math.min(n,e))).eachBefore(vd(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=sd(n),i):t},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:dd(+t),i):r},i},t.packEnclose=Kh,t.packSiblings=function(t){return fd(t),t},t.pairs=function(t,n=W){const e=[];let r,i=!1;for(const o of t)i&&e.push(n(r,o)),r=o,i=!0;return e},t.partition=function(){var t=1,n=1,e=0,r=!1;function i(i){var o=i.height+1;return i.x0=i.y0=e,i.x1=t,i.y1=n/o,i.eachBefore(function(t,n){return function(r){r.children&&bd(r,r.x0,t*(r.depth+1)/n,r.x1,t*(r.depth+2)/n);var i=r.x0,o=r.y0,a=r.x1-e,u=r.y1-e;a0&&(d+=l);for(null!=n?p.sort((function(t,e){return n(g[t],g[e])})):null!=e&&p.sort((function(t,n){return e(a[t],a[n])})),u=0,f=d?(v-h*b)/d:0;u0?l*f:0)+b,g[c]={data:a[c],index:u,value:l,startAngle:y,endAngle:s,padAngle:_};return g}return a.value=function(n){return arguments.length?(t="function"==typeof n?n:eb(+n),a):t},a.sortValues=function(t){return arguments.length?(n=t,e=null,a):n},a.sort=function(t){return arguments.length?(e=t,n=null,a):e},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:eb(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:eb(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:eb(+t),a):o},a},t.piecewise=jr,t.pointRadial=Ib,t.pointer=Un,t.pointers=function(t,n){return t.target&&(t=On(t),void 0===n&&(n=t.currentTarget),t=t.touches||[t]),Array.from(t,(t=>Un(t,n)))},t.polygonArea=function(t){for(var n,e=-1,r=t.length,i=t[r-1],o=0;++eu!=f>u&&a<(c-e)*(u-r)/(f-r)+e&&(s=!s),c=e,f=r;return s},t.polygonHull=function(t){if((e=t.length)<3)return null;var n,e,r=new Array(e),i=new Array(e);for(n=0;n=0;--n)f.push(t[r[o[n]][2]]);for(n=+u;n(n=1664525*n+1013904223|0,ep*(n>>>0))},t.randomLogNormal=Ld,t.randomLogistic=tp,t.randomNormal=Yd,t.randomPareto=Gd,t.randomPoisson=np,t.randomUniform=Id,t.randomWeibull=Qd,t.range=Z,t.reduce=function(t,n,e){if("function"!=typeof n)throw new TypeError("reducer is not a function");const r=t[Symbol.iterator]();let i,o,a=-1;if(arguments.length<3){if(({done:i,value:e}=r.next()),i)return;++a}for(;({done:i,value:o}=r.next()),!i;)e=n(e,o,++a,t);return e},t.reverse=function(t){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(t).reverse()},t.rgb=ve,t.ribbon=function(){return ba()},t.ribbonArrow=function(){return ba(_a)},t.rollup=A,t.rollups=function(t,n,...e){return S(t,Array.from,n,e)},t.scaleBand=up,t.scaleDiverging=function t(){var n=bp(Cv()(lp));return n.copy=function(){return kv(n,t())},ip.apply(n,arguments)},t.scaleDivergingLog=function t(){var n=Ep(Cv()).domain([.1,1,10]);return n.copy=function(){return kv(n,t()).base(n.base())},ip.apply(n,arguments)},t.scaleDivergingPow=Pv,t.scaleDivergingSqrt=function(){return Pv.apply(null,arguments).exponent(.5)},t.scaleDivergingSymlog=function t(){var n=Cp(Cv());return n.copy=function(){return kv(n,t()).constant(n.constant())},ip.apply(n,arguments)},t.scaleIdentity=function t(n){var e;function r(t){return isNaN(t=+t)?e:t}return r.invert=r,r.domain=r.range=function(t){return arguments.length?(n=Array.from(t,fp),r):n.slice()},r.unknown=function(t){return arguments.length?(e=t,r):e},r.copy=function(){return t(n).unknown(e)},n=arguments.length?Array.from(n,fp):[0,1],bp(r)},t.scaleImplicit=op,t.scaleLinear=function t(){var n=vp();return n.copy=function(){return gp(n,t())},rp.apply(n,arguments),bp(n)},t.scaleLog=function t(){var n=Ep(yp()).domain([1,10]);return n.copy=function(){return gp(n,t()).base(n.base())},rp.apply(n,arguments),n},t.scaleOrdinal=ap,t.scalePoint=function(){return cp(up.apply(null,arguments).paddingInner(1))},t.scalePow=Rp,t.scaleQuantile=function t(){var e,r=[],i=[],a=[];function u(){var t=0,n=Math.max(1,i.length);for(a=new Array(n-1);++t0?a[n-1]:r[0],n=i?[a[i-1],r]:[a[n-1],a[n]]},c.unknown=function(t){return arguments.length?(n=t,c):c},c.thresholds=function(){return a.slice()},c.copy=function(){return t().domain([e,r]).range(u).unknown(n)},rp.apply(bp(c),arguments)},t.scaleRadial=function t(){var n,e=vp(),r=[0,1],i=!1;function o(t){var r=Op(e(t));return isNaN(r)?n:i?Math.round(r):r}return o.invert=function(t){return e.invert(Fp(t))},o.domain=function(t){return arguments.length?(e.domain(t),o):e.domain()},o.range=function(t){return arguments.length?(e.range((r=Array.from(t,fp)).map(Fp)),o):r.slice()},o.rangeRound=function(t){return o.range(t).round(!0)},o.round=function(t){return arguments.length?(i=!!t,o):i},o.clamp=function(t){return arguments.length?(e.clamp(t),o):e.clamp()},o.unknown=function(t){return arguments.length?(n=t,o):n},o.copy=function(){return t(e.domain(),r).round(i).clamp(e.clamp()).unknown(n)},rp.apply(o,arguments),bp(o)},t.scaleSequential=function t(){var n=bp(Ev()(lp));return n.copy=function(){return kv(n,t())},ip.apply(n,arguments)},t.scaleSequentialLog=function t(){var n=Ep(Ev()).domain([1,10]);return n.copy=function(){return kv(n,t()).base(n.base())},ip.apply(n,arguments)},t.scaleSequentialPow=Nv,t.scaleSequentialQuantile=function t(){var e=[],r=lp;function i(t){if(!isNaN(t=+t))return r((o(e,t,1)-1)/(e.length-1))}return i.domain=function(t){if(!arguments.length)return e.slice();e=[];for(let n of t)null==n||isNaN(n=+n)||e.push(n);return e.sort(n),i},i.interpolator=function(t){return arguments.length?(r=t,i):r},i.range=function(){return e.map(((t,n)=>r(n/(e.length-1))))},i.quantiles=function(t){return Array.from({length:t+1},((n,r)=>H(e,r/t)))},i.copy=function(){return t(r).domain(e)},ip.apply(i,arguments)},t.scaleSequentialSqrt=function(){return Nv.apply(null,arguments).exponent(.5)},t.scaleSequentialSymlog=function t(){var n=Cp(Ev());return n.copy=function(){return kv(n,t()).constant(n.constant())},ip.apply(n,arguments)},t.scaleSqrt=function(){return Rp.apply(null,arguments).exponent(.5)},t.scaleSymlog=function t(){var n=Cp(yp());return n.copy=function(){return gp(n,t()).constant(n.constant())},rp.apply(n,arguments)},t.scaleThreshold=function t(){var n,e=[.5],r=[0,1],i=1;function a(t){return t<=t?r[o(e,t,0,i)]:n}return a.domain=function(t){return arguments.length?(e=Array.from(t),i=Math.min(e.length,r.length-1),a):e.slice()},a.range=function(t){return arguments.length?(r=Array.from(t),i=Math.min(e.length,r.length-1),a):r.slice()},a.invertExtent=function(t){var n=r.indexOf(t);return[e[n-1],e[n]]},a.unknown=function(t){return arguments.length?(n=t,a):n},a.copy=function(){return t().domain(e).range(r).unknown(n)},rp.apply(a,arguments)},t.scaleTime=function(){return rp.apply(Sv(bg,vg,rg,tg,Qp,Zp,$p,Yp,t.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)},t.scaleUtc=function(){return rp.apply(Sv(Hg,Lg,kg,Tg,Mg,xg,$p,Yp,t.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)},t.scan=function(t,n){const e=K(t,n);return e<0?void 0:e},t.schemeAccent=qv,t.schemeBlues=z_,t.schemeBrBG=Hv,t.schemeBuGn=c_,t.schemeBuPu=s_,t.schemeCategory10=Dv,t.schemeDark2=Rv,t.schemeGnBu=h_,t.schemeGreens=q_,t.schemeGreys=F_,t.schemeOrRd=p_,t.schemeOranges=L_,t.schemePRGn=Gv,t.schemePaired=Fv,t.schemePastel1=Ov,t.schemePastel2=Uv,t.schemePiYG=$v,t.schemePuBu=__,t.schemePuBuGn=y_,t.schemePuOr=Zv,t.schemePuRd=m_,t.schemePurples=U_,t.schemeRdBu=Qv,t.schemeRdGy=t_,t.schemeRdPu=w_,t.schemeRdYlBu=e_,t.schemeRdYlGn=i_,t.schemeReds=B_,t.schemeSet1=Iv,t.schemeSet2=Bv,t.schemeSet3=Yv,t.schemeSpectral=a_,t.schemeTableau10=Lv,t.schemeYlGn=S_,t.schemeYlGnBu=A_,t.schemeYlOrBr=k_,t.schemeYlOrRd=C_,t.select=Dn,t.selectAll=function(t){return"string"==typeof t?new Pn([document.querySelectorAll(t)],[document.documentElement]):new Pn([null==t?[]:Et(t)],Cn)},t.selection=zn,t.selector=St,t.selectorAll=Nt,t.shuffle=Q,t.shuffler=J,t.some=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let e=-1;for(const r of t)if(n(r,++e,t))return!0;return!1},t.sort=k,t.stack=function(){var t=eb([]),n=Hm,e=jm,r=Xm;function i(i){var o,a,u=Array.from(t.apply(this,arguments),Gm),c=u.length,f=-1;for(const t of i)for(o=0,++f;o0)for(var e,r,i,o,a,u,c=0,f=t[n[0]].length;c0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):(r[0]=0,r[1]=i)},t.stackOffsetExpand=function(t,n){if((r=t.length)>0){for(var e,r,i,o=0,a=t[0].length;o0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,a=1;a0)throw new Error("cycle");return o}return e.id=function(n){return arguments.length?(t=ld(n),e):t},e.parentId=function(t){return arguments.length?(n=ld(t),e):n},e},t.style=Jt,t.subset=function(t,n){return rt(n,t)},t.sum=function(t,n){let e=0;if(void 0===n)for(let n of t)(n=+n)&&(e+=n);else{let r=-1;for(let i of t)(i=+n(i,++r,t))&&(e+=i)}return e},t.superset=rt,t.svg=Ou,t.symbol=function(t,n){var e=null;function r(){var r;if(e||(e=r=fa()),t.apply(this,arguments).draw(e,+n.apply(this,arguments)),r)return e=null,r+""||null}return t="function"==typeof t?t:eb(t||Gb),n="function"==typeof n?n:eb(void 0===n?64:+n),r.type=function(n){return arguments.length?(t="function"==typeof n?n:eb(n),r):t},r.size=function(t){return arguments.length?(n="function"==typeof t?t:eb(+t),r):n},r.context=function(t){return arguments.length?(e=null==t?null:t,r):e},r},t.symbolCircle=Gb,t.symbolCross=Vb,t.symbolDiamond=Zb,t.symbolSquare=nm,t.symbolStar=tm,t.symbolTriangle=rm,t.symbolWye=cm,t.symbols=fm,t.text=Nu,t.thresholdFreedmanDiaconis=function(t,n,e){return Math.ceil((e-n)/(2*(H(t,.75)-H(t,.25))*Math.pow(c(t),-1/3)))},t.thresholdScott=function(t,n,e){return Math.ceil((e-n)/(3.5*d(t)*Math.pow(c(t),-1/3)))},t.thresholdSturges=U,t.tickFormat=_p,t.tickIncrement=R,t.tickStep=F,t.ticks=q,t.timeDay=tg,t.timeDays=ng,t.timeFormatDefaultLocale=pv,t.timeFormatLocale=Wg,t.timeFriday=cg,t.timeFridays=gg,t.timeHour=Qp,t.timeHours=Jp,t.timeInterval=Bp,t.timeMillisecond=Yp,t.timeMilliseconds=Lp,t.timeMinute=Zp,t.timeMinutes=Kp,t.timeMonday=ig,t.timeMondays=lg,t.timeMonth=vg,t.timeMonths=_g,t.timeSaturday=fg,t.timeSaturdays=yg,t.timeSecond=$p,t.timeSeconds=Wp,t.timeSunday=rg,t.timeSundays=sg,t.timeThursday=ug,t.timeThursdays=pg,t.timeTuesday=og,t.timeTuesdays=hg,t.timeWednesday=ag,t.timeWednesdays=dg,t.timeWeek=rg,t.timeWeeks=sg,t.timeYear=bg,t.timeYears=mg,t.timeout=ci,t.timer=ri,t.timerFlush=ii,t.transition=Hi,t.transpose=tt,t.tree=function(){var t=Ad,n=1,e=1,r=null;function i(i){var c=function(t){for(var n,e,r,i,o,a=new Nd(t,0),u=[a];n=u.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)u.push(e=n.children[i]=new Nd(r[i],i)),e.parent=n;return(a.parent=new Nd(null,0)).children=[a],a}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(a),r)i.eachBefore(u);else{var f=i,s=i,l=i;i.eachBefore((function(t){t.xs.x&&(s=t),t.depth>l.depth&&(l=t)}));var h=f===s?1:t(f,s)/2,d=h-f.x,p=n/(s.x+h+d),g=e/(l.depth||1);i.eachBefore((function(t){t.x=(t.x+d)*p,t.y=t.depth*g}))}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,a=n,u=e,c=o.parent.children[0],f=o.m,s=a.m,l=u.m,h=c.m;u=Sd(u),o=Td(o),u&&o;)c=Td(c),(a=Sd(a)).a=n,(i=u.z+l-o.z-f+t(u._,o._))>0&&(Ed(kd(u,n,r),n,i),f+=i,s+=i),l+=u.m,f+=o.m,h+=c.m,s+=a.m;u&&!Sd(a)&&(a.t=u,a.m+=l-s),o&&!Td(c)&&(c.t=o,c.m+=f-h,r=n)}return r}(n,i,n.parent.A||r[0])}function a(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.treemap=function(){var t=Dd,n=!1,e=1,r=1,i=[0],o=hd,a=hd,u=hd,c=hd,f=hd;function s(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(l),i=[0],n&&t.eachBefore(_d),t}function l(n){var e=i[n.depth],r=n.x0+e,s=n.y0+e,l=n.x1-e,h=n.y1-e;l=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}var l=f[n],h=r/2+l,d=n+1,p=e-1;for(;d>>1;f[g]c-o){var _=r?(i*v+a*y)/r:a;t(n,d,y,i,o,_,c),t(d,e,v,_,o,a,c)}else{var b=r?(o*v+c*y)/r:c;t(n,d,y,i,o,a,b),t(d,e,v,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=bd,t.treemapResquarify=qd,t.treemapSlice=Cd,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?Cd:bd)(t,n,e,r,i)},t.treemapSquarify=Dd,t.tsv=zu,t.tsvFormat=mu,t.tsvFormatBody=xu,t.tsvFormatRow=Mu,t.tsvFormatRows=wu,t.tsvFormatValue=Au,t.tsvParse=_u,t.tsvParseRows=bu,t.union=function(...t){const n=new Set;for(const e of t)for(const t of e)n.add(t);return n},t.utcDay=Tg,t.utcDays=Sg,t.utcFriday=Dg,t.utcFridays=Bg,t.utcHour=Mg,t.utcHours=Ag,t.utcMillisecond=Yp,t.utcMilliseconds=Lp,t.utcMinute=xg,t.utcMinutes=wg,t.utcMonday=Ng,t.utcMondays=Fg,t.utcMonth=Lg,t.utcMonths=jg,t.utcSaturday=qg,t.utcSaturdays=Yg,t.utcSecond=$p,t.utcSeconds=Wp,t.utcSunday=kg,t.utcSundays=Rg,t.utcThursday=zg,t.utcThursdays=Ig,t.utcTuesday=Cg,t.utcTuesdays=Og,t.utcWednesday=Pg,t.utcWednesdays=Ug,t.utcWeek=kg,t.utcWeeks=Rg,t.utcYear=Hg,t.utcYears=Xg,t.variance=h,t.version="6.6.0",t.window=Wt,t.xml=Ru,t.zip=function(){return tt(arguments)},t.zoom=function(){var t,n,e,r=ix,i=ox,o=fx,a=ux,u=cx,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=Dr,h=pt("start","zoom","end"),d=500,p=0,g=10;function y(t){t.property("__zoom",ax).on("wheel.zoom",M).on("mousedown.zoom",A).on("dblclick.zoom",T).filter(u).on("touchstart.zoom",S).on("touchmove.zoom",E).on("touchend.zoom touchcancel.zoom",k).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function v(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new Jm(n,t.x,t.y)}function _(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Jm(t.k,r,i)}function b(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function m(t,n,e,r){t.on("start.zoom",(function(){x(this,arguments).event(r).start()})).on("interrupt.zoom end.zoom",(function(){x(this,arguments).event(r).end()})).tween("zoom",(function(){var t=this,o=arguments,a=x(t,o).event(r),u=i.apply(t,o),c=null==e?b(u):"function"==typeof e?e.apply(t,o):e,f=Math.max(u[1][0]-u[0][0],u[1][1]-u[0][1]),s=t.__zoom,h="function"==typeof n?n.apply(t,o):n,d=l(s.invert(c).concat(f/s.k),h.invert(c).concat(f/h.k));return function(t){if(1===t)t=h;else{var n=d(t),e=f/n[2];t=new Jm(e,c[0]-n[0]*e,c[1]-n[1]*e)}a.zoom(null,t)}}))}function x(t,n,e){return!e&&t.__zooming||new w(t,n)}function w(t,n){this.that=t,this.args=n,this.active=0,this.sourceEvent=null,this.extent=i.apply(t,n),this.taps=0}function M(t,...n){if(r.apply(this,arguments)){var e=x(this,n).event(t),i=this.__zoom,u=Math.max(c[0],Math.min(c[1],i.k*Math.pow(2,a.apply(this,arguments)))),s=Un(t);if(e.wheel)e.mouse[0][0]===s[0]&&e.mouse[0][1]===s[1]||(e.mouse[1]=i.invert(e.mouse[0]=s)),clearTimeout(e.wheel);else{if(i.k===u)return;e.mouse=[s,i.invert(s)],gi(this),e.start()}rx(t),e.wheel=setTimeout(l,150),e.zoom("mouse",o(_(v(i,u),e.mouse[0],e.mouse[1]),e.extent,f))}function l(){e.wheel=null,e.end()}}function A(t,...n){if(!e&&r.apply(this,arguments)){var i=x(this,n,!0).event(t),a=Dn(t.view).on("mousemove.zoom",h,!0).on("mouseup.zoom",d,!0),u=Un(t,c),c=t.currentTarget,s=t.clientX,l=t.clientY;Yn(t.view),ex(t),i.mouse=[u,this.__zoom.invert(u)],gi(this),i.start()}function h(t){if(rx(t),!i.moved){var n=t.clientX-s,e=t.clientY-l;i.moved=n*n+e*e>p}i.event(t).zoom("mouse",o(_(i.that.__zoom,i.mouse[0]=Un(t,c),i.mouse[1]),i.extent,f))}function d(t){a.on("mousemove.zoom mouseup.zoom",null),Ln(t.view,i.moved),rx(t),i.event(t).end()}}function T(t,...n){if(r.apply(this,arguments)){var e=this.__zoom,a=Un(t.changedTouches?t.changedTouches[0]:t,this),u=e.invert(a),c=e.k*(t.shiftKey?.5:2),l=o(_(v(e,c),a,u),i.apply(this,n),f);rx(t),s>0?Dn(this).transition().duration(s).call(m,l,a,t):Dn(this).call(y.transform,l,a,t)}}function S(e,...i){if(r.apply(this,arguments)){var o,a,u,c,f=e.touches,s=f.length,l=x(this,i,e.changedTouches.length===s).event(e);for(ex(e),a=0;an?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ +r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], +shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; +if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}(); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/d3plus-hierarchy.full.min.js b/plugins/additionals/assets/javascripts/d3plus-hierarchy.full.min.js deleted file mode 100644 index d0c5618..0000000 --- a/plugins/additionals/assets/javascripts/d3plus-hierarchy.full.min.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - d3plus-hierarchy v0.9.0 - Nested, hierarchical, and cluster charts built on D3 - Copyright (c) 2020 D3plus - https://d3plus.org - @license MIT -*/ -(function(e){typeof define==="function"&&define.amd?define(e):e()})(function(){"use strict";var e=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};function t(e,t){return t={exports:{}},e(t,t.exports),t.exports}var n=function(e){return e&&e.Math==Math&&e};var c=n(typeof globalThis=="object"&&globalThis)||n(typeof window=="object"&&window)||n(typeof self=="object"&&self)||n(typeof e=="object"&&e)||Function("return this")();var o=function(e){try{return!!e()}catch(e){return true}};var d=!o(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7});var i={}.propertyIsEnumerable;var a=Object.getOwnPropertyDescriptor;var r=a&&!i.call({1:2},1);var s=r?function e(t){var n=a(this,t);return!!n&&n.enumerable}:i;var g={f:s};var l=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}};var u={}.toString;var h=function(e){return u.call(e).slice(8,-1)};var f="".split;var b=o(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return h(e)=="String"?f.call(e,""):Object(e)}:Object;var p=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e};var v=function(e){return b(p(e))};var m=function(e){return typeof e==="object"?e!==null:typeof e==="function"};var y=function(e,t){if(!m(e))return e;var n,i;if(t&&typeof(n=e.toString)=="function"&&!m(i=n.call(e)))return i;if(typeof(n=e.valueOf)=="function"&&!m(i=n.call(e)))return i;if(!t&&typeof(n=e.toString)=="function"&&!m(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")};var _={}.hasOwnProperty;var w=function(e,t){return _.call(e,t)};var x=c.document;var k=m(x)&&m(x.createElement);var S=function(e){return k?x.createElement(e):{}};var C=!d&&!o(function(){return Object.defineProperty(S("div"),"a",{get:function(){return 7}}).a!=7});var E=Object.getOwnPropertyDescriptor;var A=d?E:function e(t,n){t=v(t);n=y(n,true);if(C)try{return E(t,n)}catch(e){}if(w(t,n))return l(!g.f.call(t,n),t[n])};var R={f:A};var M=function(e){if(!m(e)){throw TypeError(String(e)+" is not an object")}return e};var T=Object.defineProperty;var B=d?T:function e(t,n,i){M(t);n=y(n,true);M(i);if(C)try{return T(t,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");if("value"in i)t[n]=i.value;return t};var N={f:B};var D=d?function(e,t,n){return N.f(e,t,l(1,n))}:function(e,t,n){e[t]=n;return e};var P=function(t,n){try{D(c,t,n)}catch(e){c[t]=n}return n};var O="__core-js_shared__";var z=c[O]||P(O,{});var F=z;var L=Function.toString;if(typeof F.inspectSource!="function"){F.inspectSource=function(e){return L.call(e)}}var I=F.inspectSource;var j=c.WeakMap;var H=typeof j==="function"&&/native code/.test(I(j));var V=t(function(e){(e.exports=function(e,t){return F[e]||(F[e]=t!==undefined?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})});var U=0;var G=Math.random();var W=function(e){return"Symbol("+String(e===undefined?"":e)+")_"+(++U+G).toString(36)};var K=V("keys");var q=function(e){return K[e]||(K[e]=W(e))};var Y={};var X=c.WeakMap;var $,Z,J;var Q=function(e){return J(e)?Z(e):$(e,{})};var ee=function(n){return function(e){var t;if(!m(e)||(t=Z(e)).type!==n){throw TypeError("Incompatible receiver, "+n+" required")}return t}};if(H){var te=new X;var ne=te.get;var ie=te.has;var ae=te.set;$=function(e,t){ae.call(te,e,t);return t};Z=function(e){return ne.call(te,e)||{}};J=function(e){return ie.call(te,e)}}else{var re=q("state");Y[re]=true;$=function(e,t){D(e,re,t);return t};Z=function(e){return w(e,re)?e[re]:{}};J=function(e){return w(e,re)}}var oe={set:$,get:Z,has:J,enforce:Q,getterFor:ee};var se=t(function(e){var t=oe.get;var s=oe.enforce;var l=String(String).split("String");(e.exports=function(e,t,n,i){var a=i?!!i.unsafe:false;var r=i?!!i.enumerable:false;var o=i?!!i.noTargetGet:false;if(typeof n=="function"){if(typeof t=="string"&&!w(n,"name"))D(n,"name",t);s(n).source=l.join(typeof t=="string"?t:"")}if(e===c){if(r)e[t]=n;else P(t,n);return}else if(!a){delete e[t]}else if(!o&&e[t]){r=true}if(r)e[t]=n;else D(e,t,n)})(Function.prototype,"toString",function e(){return typeof this=="function"&&t(this).source||I(this)})});var le=c;var ue=function(e){return typeof e=="function"?e:undefined};var he=function(e,t){return arguments.length<2?ue(le[e])||ue(c[e]):le[e]&&le[e][t]||c[e]&&c[e][t]};var ce=Math.ceil;var fe=Math.floor;var de=function(e){return isNaN(e=+e)?0:(e>0?fe:ce)(e)};var ge=Math.min;var pe=function(e){return e>0?ge(de(e),9007199254740991):0};var ve=Math.max;var me=Math.min;var ye=function(e,t){var n=de(e);return n<0?ve(n+t,0):me(n,t)};var _e=function(s){return function(e,t,n){var i=v(e);var a=pe(i.length);var r=ye(n,a);var o;if(s&&t!=t)while(a>r){o=i[r++];if(o!=o)return true}else for(;a>r;r++){if((s||r in i)&&i[r]===t)return s||r||0}return!s&&-1}};var be={includes:_e(true),indexOf:_e(false)};var we=be.indexOf;var xe=function(e,t){var n=v(e);var i=0;var a=[];var r;for(r in n)!w(Y,r)&&w(n,r)&&a.push(r);while(t.length>i)if(w(n,r=t[i++])){~we(a,r)||a.push(r)}return a};var ke=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];var Se=ke.concat("length","prototype");var Ce=Object.getOwnPropertyNames||function e(t){return xe(t,Se)};var Ee={f:Ce};var Ae=Object.getOwnPropertySymbols;var Re={f:Ae};var Me=he("Reflect","ownKeys")||function e(t){var n=Ee.f(M(t));var i=Re.f;return i?n.concat(i(t)):n};var Te=function(e,t){var n=Me(t);var i=N.f;var a=R.f;for(var r=0;rl;l++)if(_||l in r){c=r[l];f=o(c,l,a);if(d){if(g)h[l]=f;else if(f)switch(d){case 3:return true;case 5:return c;case 6:return l;case 2:Je.call(h,c)}else if(m)return false}}return y?-1:v||m?m:h}};var et={forEach:Qe(0),map:Qe(1),filter:Qe(2),some:Qe(3),every:Qe(4),find:Qe(5),findIndex:Qe(6)};var tt=Object.keys||function e(t){return xe(t,ke)};var nt=d?Object.defineProperties:function e(t,n){M(t);var i=tt(n);var a=i.length;var r=0;var o;while(a>r)N.f(t,o=i[r++],n[o]);return t};var it=he("document","documentElement");var at=">";var rt="<";var ot="prototype";var st="script";var lt=q("IE_PROTO");var ut=function(){};var ht=function(e){return rt+st+at+e+rt+"/"+st+at};var ct=function(e){e.write(ht(""));e.close();var t=e.parentWindow.Object;e=null;return t};var ft=function(){var e=S("iframe");var t="java"+st+":";var n;e.style.display="none";it.appendChild(e);e.src=String(t);n=e.contentWindow.document;n.open();n.write(ht("document.F=Object"));n.close();return n.F};var dt;var gt=function(){try{dt=document.domain&&new ActiveXObject("htmlfile")}catch(e){}gt=dt?ct(dt):ft();var e=ke.length;while(e--)delete gt[ot][ke[e]];return gt()};Y[lt]=true;var pt=Object.create||function e(t,n){var i;if(t!==null){ut[ot]=M(t);i=new ut;ut[ot]=null;i[lt]=t}else i=gt();return n===undefined?i:nt(i,n)};var vt=Xe("unscopables");var mt=Array.prototype;if(mt[vt]==undefined){N.f(mt,vt,{configurable:true,value:pt(null)})}var yt=function(e){mt[vt][e]=true};var _t=Object.defineProperty;var bt={};var wt=function(e){throw e};var xt=function(e,t){if(w(bt,e))return bt[e];if(!t)t={};var n=[][e];var i=w(t,"ACCESSORS")?t.ACCESSORS:false;var a=w(t,0)?t[0]:wt;var r=w(t,1)?t[1]:undefined;return bt[e]=!!n&&!o(function(){if(i&&!d)return true;var e={length:-1};if(i)_t(e,1,{enumerable:true,get:wt});else e[1]=1;n.call(e,a,r)})};var kt=et.find;var St="find";var Ct=true;var Et=xt(St);if(St in[])Array(1)[St](function(){Ct=false});Ie({target:"Array",proto:true,forced:Ct||!Et},{find:function e(t){return kt(this,t,arguments.length>1?arguments[1]:undefined)}});yt(St);var At=be.includes;var Rt=xt("indexOf",{ACCESSORS:true,1:0});Ie({target:"Array",proto:true,forced:!Rt},{includes:function e(t){return At(this,t,arguments.length>1?arguments[1]:undefined)}});yt("includes");var Mt=Object.assign;var Tt=Object.defineProperty;var Bt=!Mt||o(function(){if(d&&Mt({b:1},Mt(Tt({},"a",{enumerable:true,get:function(){Tt(this,"b",{value:3,enumerable:false})}}),{b:2})).b!==1)return true;var e={};var t={};var n=Symbol();var i="abcdefghijklmnopqrst";e[n]=7;i.split("").forEach(function(e){t[e]=e});return Mt({},e)[n]!=7||tt(Mt({},t)).join("")!=i})?function e(t,n){var i=Ve(t);var a=arguments.length;var r=1;var o=Re.f;var s=g.f;while(a>r){var l=b(arguments[r++]);var u=o?tt(l).concat(o(l)):tt(l);var h=u.length;var c=0;var f;while(h>c){f=u[c++];if(!d||s.call(l,f))i[f]=l[f]}}return i}:Mt;Ie({target:"Object",stat:true,forced:Object.assign!==Bt},{assign:Bt});var Nt=Xe("match");var Dt=function(e){var t;return m(e)&&((t=e[Nt])!==undefined?!!t:h(e)=="RegExp")};var Pt=function(e){if(Dt(e)){throw TypeError("The method doesn't accept regular expressions")}return e};var Ot=Xe("match");var zt=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{n[Ot]=false;return"/./"[t](n)}catch(e){}}return false};Ie({target:"String",proto:true,forced:!zt("includes")},{includes:function e(t){return!!~String(p(this)).indexOf(Pt(t),arguments.length>1?arguments[1]:undefined)}});var Ft=R.f;var Lt="".startsWith;var It=Math.min;var jt=zt("startsWith");var Ht=!jt&&!!function(){var e=Ft(String.prototype,"startsWith");return e&&!e.writable}();Ie({target:"String",proto:true,forced:!Ht&&!jt},{startsWith:function e(t){var n=String(p(this));Pt(t);var i=pe(It(arguments.length>1?arguments[1]:undefined,n.length));var a=String(t);return Lt?Lt.call(n,a,i):n.slice(i,i+a.length)===a}});if(typeof window!=="undefined"){(function(){try{if(typeof SVGElement==="undefined"||Boolean(SVGElement.prototype.innerHTML)){return}}catch(e){return}function n(e){switch(e.nodeType){case 1:return a(e);case 3:return t(e);case 8:return i(e)}}function t(e){return e.textContent.replace(/&/g,"&").replace(//g,">")}function i(e){return"\x3c!--"+e.nodeValue+"--\x3e"}function a(e){var t="";t+="<"+e.tagName;if(e.hasAttributes()){[].forEach.call(e.attributes,function(e){t+=" "+e.name+'="'+e.value+'"'})}t+=">";if(e.hasChildNodes()){[].forEach.call(e.childNodes,function(e){t+=n(e)})}t+="";return t}Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function(){var t="";[].forEach.call(this.childNodes,function(e){t+=n(e)});return t},set:function(e){while(this.firstChild){this.removeChild(this.firstChild)}try{var t=new DOMParser;t.async=false;var n=""+e+"";var i=t.parseFromString(n,"text/xml").documentElement;[].forEach.call(i.childNodes,function(e){this.appendChild(this.ownerDocument.importNode(e,true))}.bind(this))}catch(e){throw new Error("Error parsing markup string")}}});Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function(){return this.innerHTML},set:function(e){this.innerHTML=e}})})()}});(function(e,t){typeof exports==="object"&&typeof module!=="undefined"?t(exports):typeof define==="function"&&define.amd?define("d3plus-hierarchy",["exports"],t):(e=e||self,t(e.d3plus={}))})(this,function(e){function F(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){F=function(e){return typeof e}}else{F=function(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return F(e)}function o(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function i(e,t){for(var n=0;ne.length)t=e.length;for(var n=0,i=new Array(t);n=e.length)return{done:true};return{done:false,value:e[i++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=true,o=false,s;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();r=e.done;return e},e:function(e){o=true;s=e},f:function(){try{if(!r&&n.return!=null)n.return()}finally{if(o)throw s}}}}function k(e,t){return et?1:e>=t?0:NaN}function S(o){if(o.length===1)o=C(o);return{left:function e(t,n,i,a){if(i==null)i=0;if(a==null)a=t.length;while(i>>1;if(o(t[r],n)<0)i=r+1;else a=r}return i},right:function e(t,n,i,a){if(i==null)i=0;if(a==null)a=t.length;while(i>>1;if(o(t[r],n)>0)a=r;else i=r+1}return i}}}function C(n){return function(e,t){return k(n(e),t)}}var E=S(k);var A=E.right;function R(e){return e===null?NaN:+e}function M(e,t){var n=e.length,i=0,a=-1,r=0,o,s,l=0;if(t==null){while(++a1)return l/(i-1)}function Te(e,t){var n=M(e,t);return n?Math.sqrt(n):n}function Be(e,t){var n=e.length,i=-1,a,r,o;if(t==null){while(++i=a){r=o=a;while(++ia)r=a;if(o=a){r=o=a;while(++ia)r=a;if(o0)return[e];if(i=t0){e=Math.ceil(e/s);t=Math.floor(t/s);o=new Array(r=Math.ceil(t-e+1));while(++a=0?(r>=T?10:r>=B?5:r>=N?2:1)*Math.pow(10,a):-Math.pow(10,-a)/(r>=T?10:r>=B?5:r>=N?2:1)}function P(e,t,n){var i=Math.abs(t-e)/Math.max(0,n),a=Math.pow(10,Math.floor(Math.log(i)/Math.LN10)),r=i/a;if(r>=T)a*=10;else if(r>=B)a*=5;else if(r>=N)a*=2;return t=1)return+n(e[i-1],i-1,e);var i,a=(i-1)*t,r=Math.floor(a),o=+n(e[r],r,e),s=+n(e[r+1],r+1,e);return o+(s-o)*(a-r)}function ve(e,t){var n=e.length,i=-1,a,r;if(t==null){while(++i=a){r=a;while(++ir){r=a}}}}}else{while(++i=a){r=a;while(++ir){r=a}}}}}return r}function Pe(e){var t=e.length,n,i=-1,a=0,r,o;while(++i=0){o=e[t];n=o.length;while(--n>=0){r[--a]=o[n]}}return r}function Oe(e,t){var n=e.length,i=-1,a,r;if(t==null){while(++i=a){r=a;while(++ia){r=a}}}}}else{while(++i=a){r=a;while(++ia){r=a}}}}}return r}function O(e,t){var n=e.length,i=-1,a,r=0;if(t==null){while(++iI));else if(!(Math.abs(c*l-u*h)>I)||!r){this._+="L"+(this._x1=t)+","+(this._y1=n)}else{var d=i-o,g=a-s,p=l*l+u*u,v=d*d+g*g,m=Math.sqrt(p),y=Math.sqrt(f),_=r*Math.tan((z-Math.acos((p+f-v)/(2*m*y)))/2),b=_/y,w=_/m;if(Math.abs(b-1)>I){this._+="L"+(t+b*h)+","+(n+b*c)}this._+="A"+r+","+r+",0,0,"+ +(c*d>h*g)+","+(this._x1=t+w*l)+","+(this._y1=n+w*u)}},arc:function e(t,n,i,a,r,o){t=+t,n=+n,i=+i;var s=i*Math.cos(a),l=i*Math.sin(a),u=t+s,h=n+l,c=1^o,f=o?a-r:r-a;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null){this._+="M"+u+","+h}else if(Math.abs(this._x1-u)>I||Math.abs(this._y1-h)>I){this._+="L"+u+","+h}if(!i)return;if(f<0)f=f%L+L;if(f>j){this._+="A"+i+","+i+",0,1,"+c+","+(t-s)+","+(n-l)+"A"+i+","+i+",0,1,"+c+","+(this._x1=u)+","+(this._y1=h)}else if(f>I){this._+="A"+i+","+i+",0,"+ +(f>=z)+","+c+","+(this._x1=t+i*Math.cos(r))+","+(this._y1=n+i*Math.sin(r))}},rect:function e(t,n,i,a){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +i+"v"+ +a+"h"+-i+"Z"},toString:function e(){return this._}};function q(t){return function e(){return t}}var Y=Math.abs;var X=Math.atan2;var Z=Math.cos;var V=Math.max;var J=Math.min;var Q=Math.sin;var ee=Math.sqrt;var te=1e-12;var ne=Math.PI;var ie=ne/2;var ae=2*ne;function re(e){return e>1?0:e<-1?ne:Math.acos(e)}function oe(e){return e>=1?ie:e<=-1?-ie:Math.asin(e)}function se(e){return e.innerRadius}function le(e){return e.outerRadius}function ue(e){return e.startAngle}function he(e){return e.endAngle}function ce(e){return e&&e.padAngle}function fe(e,t,n,i,a,r,o,s){var l=n-e,u=i-t,h=o-a,c=s-r,f=c*l-h*u;if(f*fT*T+B*B)S=E,C=A;return{cx:S,cy:C,x01:-h,y01:-c,x11:S*(a/w-1),y11:C*(a/w-1)}}function U(){var L=se,I=le,j=q(0),H=null,V=ue,U=he,G=ce,W=null;function t(){var e,t,n=+L.apply(this,arguments),i=+I.apply(this,arguments),a=V.apply(this,arguments)-ie,r=U.apply(this,arguments)-ie,o=Y(r-a),s=r>a;if(!W)W=e=K();if(ite))W.moveTo(0,0);else if(o>ae-te){W.moveTo(i*Z(a),i*Q(a));W.arc(0,0,i,a,r,!s);if(n>te){W.moveTo(n*Z(r),n*Q(r));W.arc(0,0,n,r,a,s)}}else{var l=a,u=r,h=a,c=r,f=o,d=o,g=G.apply(this,arguments)/2,p=g>te&&(H?+H.apply(this,arguments):ee(n*n+i*i)),v=J(Y(i-n)/2,+j.apply(this,arguments)),m=v,y=v,_,b;if(p>te){var w=oe(p/n*Q(g)),x=oe(p/i*Q(g));if((f-=w*2)>te)w*=s?1:-1,h+=w,c-=w;else f=0,h=c=(a+r)/2;if((d-=x*2)>te)x*=s?1:-1,l+=x,u-=x;else d=0,l=u=(a+r)/2}var k=i*Z(l),S=i*Q(l),C=n*Z(c),E=n*Q(c);if(v>te){var A=i*Z(u),R=i*Q(u),M=n*Z(h),T=n*Q(h),B;if(ote))W.moveTo(k,S);else if(y>te){_=de(M,T,k,S,i,y,s);b=de(A,R,C,E,i,y,s);W.moveTo(_.cx+_.x01,_.cy+_.y01);if(yte)||!(f>te))W.lineTo(C,E);else if(m>te){_=de(C,E,A,R,n,-m,s);b=de(k,S,M,T,n,-m,s);W.lineTo(_.cx+_.x01,_.cy+_.y01);if(m=n;--i){m.point(l[i],u[i])}m.lineEnd();m.areaEnd()}}if(o){l[t]=+h(r,t,e),u[t]=+f(r,t,e);m.point(c?+c(r,t,e):l[t],d?+d(r,t,e):u[t])}}if(s)return m=null,s+""||null}function e(){return ye().defined(g).curve(v).context(p)}t.x=function(e){return arguments.length?(h=typeof e==="function"?e:q(+e),c=null,t):h};t.x0=function(e){return arguments.length?(h=typeof e==="function"?e:q(+e),t):h};t.x1=function(e){return arguments.length?(c=e==null?null:typeof e==="function"?e:q(+e),t):c};t.y=function(e){return arguments.length?(f=typeof e==="function"?e:q(+e),d=null,t):f};t.y0=function(e){return arguments.length?(f=typeof e==="function"?e:q(+e),t):f};t.y1=function(e){return arguments.length?(d=e==null?null:typeof e==="function"?e:q(+e),t):d};t.lineX0=t.lineY0=function(){return e().x(h).y(f)};t.lineY1=function(){return e().x(h).y(d)};t.lineX1=function(){return e().x(c).y(f)};t.defined=function(e){return arguments.length?(g=typeof e==="function"?e:q(!!e),t):g};t.curve=function(e){return arguments.length?(v=e,p!=null&&(m=v(p)),t):v};t.context=function(e){return arguments.length?(e==null?p=m=null:m=v(p=e),t):p};return t}function be(e,t){return te?1:t>=e?0:NaN}function we(e){return e}function xe(){var g=we,p=be,v=null,m=q(0),y=q(ae),_=q(0);function t(n){var e,t=n.length,i,a,r=0,o=new Array(t),s=new Array(t),l=+m.apply(this,arguments),u=Math.min(ae,Math.max(-ae,y.apply(this,arguments)-l)),h,c=Math.min(Math.abs(u)/t,_.apply(this,arguments)),f=c*(u<0?-1:1),d;for(e=0;e0){r+=d}}if(p!=null)o.sort(function(e,t){return p(s[e],s[t])});else if(v!=null)o.sort(function(e,t){return v(n[e],n[t])});for(e=0,a=r?(u-t*f)/r:0;e0?d*a:0)+f,s[i]={data:n[i],index:e,value:d,startAngle:l,endAngle:h,padAngle:c}}return s}t.value=function(e){return arguments.length?(g=typeof e==="function"?e:q(+e),t):g};t.sortValues=function(e){return arguments.length?(p=e,v=null,t):p};t.sort=function(e){return arguments.length?(v=e,p=null,t):v};t.startAngle=function(e){return arguments.length?(m=typeof e==="function"?e:q(+e),t):m};t.endAngle=function(e){return arguments.length?(y=typeof e==="function"?e:q(+e),t):y};t.padAngle=function(e){return arguments.length?(_=typeof e==="function"?e:q(+e),t):_};return t}var ke=Ce(W);function Se(e){this._curve=e}Se.prototype={areaStart:function e(){this._curve.areaStart()},areaEnd:function e(){this._curve.areaEnd()},lineStart:function e(){this._curve.lineStart()},lineEnd:function e(){this._curve.lineEnd()},point:function e(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};function Ce(t){function e(e){return new Se(t(e))}e._curve=t;return e}function Ee(e){var t=e.curve;e.angle=e.x,delete e.x;e.radius=e.y,delete e.y;e.curve=function(e){return arguments.length?t(Ce(e)):t()._curve};return e}function Ae(){return Ee(ye().curve(ke))}function Re(){var e=_e().curve(ke),t=e.curve,n=e.lineX0,i=e.lineX1,a=e.lineY0,r=e.lineY1;e.angle=e.x,delete e.x;e.startAngle=e.x0,delete e.x0;e.endAngle=e.x1,delete e.x1;e.radius=e.y,delete e.y;e.innerRadius=e.y0,delete e.y0;e.outerRadius=e.y1,delete e.y1;e.lineStartAngle=function(){return Ee(n())},delete e.lineX0;e.lineEndAngle=function(){return Ee(i())},delete e.lineX1;e.lineInnerRadius=function(){return Ee(a())},delete e.lineY0;e.lineOuterRadius=function(){return Ee(r())},delete e.lineY1;e.curve=function(e){return arguments.length?t(Ce(e)):t()._curve};return e}function Me(e,t){return[(t=+t)*Math.cos(e-=Math.PI/2),t*Math.sin(e)]}var ze=Array.prototype.slice;function Fe(e){return e.source}function Le(e){return e.target}function Ie(a){var r=Fe,o=Le,s=ge,l=me,u=null;function t(){var e,t=ze.call(arguments),n=r.apply(this,t),i=o.apply(this,t);if(!u)u=e=K();a(u,+s.apply(this,(t[0]=n,t)),+l.apply(this,t),+s.apply(this,(t[0]=i,t)),+l.apply(this,t));if(e)return u=null,e+""||null}t.source=function(e){return arguments.length?(r=e,t):r};t.target=function(e){return arguments.length?(o=e,t):o};t.x=function(e){return arguments.length?(s=typeof e==="function"?e:q(+e),t):s};t.y=function(e){return arguments.length?(l=typeof e==="function"?e:q(+e),t):l};t.context=function(e){return arguments.length?(u=e==null?null:e,t):u};return t}function je(e,t,n,i,a){e.moveTo(t,n);e.bezierCurveTo(t=(t+i)/2,n,t,a,i,a)}function He(e,t,n,i,a){e.moveTo(t,n);e.bezierCurveTo(t,n=(n+a)/2,i,n,i,a)}function Ve(e,t,n,i,a){var r=Me(t,n),o=Me(t,n=(n+a)/2),s=Me(i,n),l=Me(i,a);e.moveTo(r[0],r[1]);e.bezierCurveTo(o[0],o[1],s[0],s[1],l[0],l[1])}function Ue(){return Ie(je)}function Ge(){return Ie(He)}function We(){var e=Ie(Ve);e.angle=e.x,delete e.x;e.radius=e.y,delete e.y;return e}var Ke={draw:function e(t,n){var i=Math.sqrt(n/ne);t.moveTo(i,0);t.arc(0,0,i,0,ae)}};var qe={draw:function e(t,n){var i=Math.sqrt(n/5)/2;t.moveTo(-3*i,-i);t.lineTo(-i,-i);t.lineTo(-i,-3*i);t.lineTo(i,-3*i);t.lineTo(i,-i);t.lineTo(3*i,-i);t.lineTo(3*i,i);t.lineTo(i,i);t.lineTo(i,3*i);t.lineTo(-i,3*i);t.lineTo(-i,i);t.lineTo(-3*i,i);t.closePath()}};var Ye=Math.sqrt(1/3),Xe=Ye*2;var $e={draw:function e(t,n){var i=Math.sqrt(n/Xe),a=i*Ye;t.moveTo(0,-i);t.lineTo(a,0);t.lineTo(0,i);t.lineTo(-a,0);t.closePath()}};var Ze=.8908130915292852,Je=Math.sin(ne/10)/Math.sin(7*ne/10),Qe=Math.sin(ae/10)*Je,et=-Math.cos(ae/10)*Je;var tt={draw:function e(t,n){var i=Math.sqrt(n*Ze),a=Qe*i,r=et*i;t.moveTo(0,-i);t.lineTo(a,r);for(var o=1;o<5;++o){var s=ae*o/5,l=Math.cos(s),u=Math.sin(s);t.lineTo(u*i,-l*i);t.lineTo(l*a-u*r,u*a+l*r)}t.closePath()}};var nt={draw:function e(t,n){var i=Math.sqrt(n),a=-i/2;t.rect(a,a,i,i)}};var it=Math.sqrt(3);var at={draw:function e(t,n){var i=-Math.sqrt(n/(it*3));t.moveTo(0,i*2);t.lineTo(-it*i,-i);t.lineTo(it*i,-i);t.closePath()}};var rt=-.5,ot=Math.sqrt(3)/2,st=1/Math.sqrt(12),lt=(st/2+1)*3;var ut={draw:function e(t,n){var i=Math.sqrt(n/lt),a=i/2,r=i*st,o=a,s=i*st+i,l=-o,u=s;t.moveTo(a,r);t.lineTo(o,s);t.lineTo(l,u);t.lineTo(rt*a-ot*r,ot*a+rt*r);t.lineTo(rt*o-ot*s,ot*o+rt*s);t.lineTo(rt*l-ot*u,ot*l+rt*u);t.lineTo(rt*a+ot*r,rt*r-ot*a);t.lineTo(rt*o+ot*s,rt*s-ot*o);t.lineTo(rt*l+ot*u,rt*u-ot*l);t.closePath()}};var ht=[Ke,qe,$e,nt,tt,at,ut];function ct(){var t=q(Ke),n=q(64),i=null;function a(){var e;if(!i)i=e=K();t.apply(this,arguments).draw(i,+n.apply(this,arguments));if(e)return i=null,e+""||null}a.type=function(e){return arguments.length?(t=typeof e==="function"?e:q(e),a):t};a.size=function(e){return arguments.length?(n=typeof e==="function"?e:q(+e),a):n};a.context=function(e){return arguments.length?(i=e==null?null:e,a):i};return a}function ft(){}function dt(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+n)/6)}function gt(e){this._context=e}gt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 3:dt(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:dt(this,t,n);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n}};function pt(e){return new gt(e)}function vt(e){this._context=e}vt.prototype={areaStart:ft,areaEnd:ft,lineStart:function e(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2);this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3);this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3);this._context.closePath();break}case 3:{this.point(this._x2,this._y2);this.point(this._x3,this._y3);this.point(this._x4,this._y4);break}}},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._x2=t,this._y2=n;break;case 1:this._point=2;this._x3=t,this._y3=n;break;case 2:this._point=3;this._x4=t,this._y4=n;this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:dt(this,t,n);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n}};function mt(e){return new vt(e)}function yt(e){this._context=e}yt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function e(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var i=(this._x0+4*this._x1+t)/6,a=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 3:this._point=4;default:dt(this,t,n);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n}};function _t(e){return new yt(e)}function bt(e,t){this._basis=new gt(e);this._beta=t}bt.prototype={lineStart:function e(){this._x=[];this._y=[];this._basis.lineStart()},lineEnd:function e(){var t=this._x,n=this._y,i=t.length-1;if(i>0){var a=t[0],r=n[0],o=t[i]-a,s=n[i]-r,l=-1,u;while(++l<=i){u=l/i;this._basis.point(this._beta*t[l]+(1-this._beta)*(a+u*o),this._beta*n[l]+(1-this._beta)*(r+u*s))}}this._x=this._y=null;this._basis.lineEnd()},point:function e(t,n){this._x.push(+t);this._y.push(+n)}};var wt=function t(n){function e(e){return n===1?new gt(e):new bt(e,n)}e.beta=function(e){return t(+e)};return e}(.85);function xt(e,t,n){e._context.bezierCurveTo(e._x1+e._k*(e._x2-e._x0),e._y1+e._k*(e._y2-e._y0),e._x2+e._k*(e._x1-t),e._y2+e._k*(e._y1-n),e._x2,e._y2)}function kt(e,t){this._context=e;this._k=(1-t)/6}kt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:xt(this,this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;this._x1=t,this._y1=n;break;case 2:this._point=3;default:xt(this,t,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var St=function t(n){function e(e){return new kt(e,n)}e.tension=function(e){return t(+e)};return e}(0);function Ct(e,t){this._context=e;this._k=(1-t)/6}Ct.prototype={areaStart:ft,areaEnd:ft,lineStart:function e(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._x3=t,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3;this._x5=t,this._y5=n;break;default:xt(this,t,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Et=function t(n){function e(e){return new Ct(e,n)}e.tension=function(e){return t(+e)};return e}(0);function At(e,t){this._context=e;this._k=(1-t)/6}At.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function e(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:xt(this,t,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Rt=function t(n){function e(e){return new At(e,n)}e.tension=function(e){return t(+e)};return e}(0);function Mt(e,t,n){var i=e._x1,a=e._y1,r=e._x2,o=e._y2;if(e._l01_a>te){var s=2*e._l01_2a+3*e._l01_a*e._l12_a+e._l12_2a,l=3*e._l01_a*(e._l01_a+e._l12_a);i=(i*s-e._x0*e._l12_2a+e._x2*e._l01_2a)/l;a=(a*s-e._y0*e._l12_2a+e._y2*e._l01_2a)/l}if(e._l23_a>te){var u=2*e._l23_2a+3*e._l23_a*e._l12_a+e._l12_2a,h=3*e._l23_a*(e._l23_a+e._l12_a);r=(r*u+e._x1*e._l23_2a-t*e._l12_2a)/h;o=(o*u+e._y1*e._l23_2a-n*e._l12_2a)/h}e._context.bezierCurveTo(i,a,r,o,e._x2,e._y2)}function Tt(e,t){this._context=e;this._alpha=t}Tt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function e(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;if(this._point){var i=this._x2-t,a=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+a*a,this._alpha))}switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:Mt(this,t,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Bt=function t(n){function e(e){return n?new Tt(e,n):new kt(e,0)}e.alpha=function(e){return t(+e)};return e}(.5);function Nt(e,t){this._context=e;this._alpha=t}Nt.prototype={areaStart:ft,areaEnd:ft,lineStart:function e(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function e(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function e(t,n){t=+t,n=+n;if(this._point){var i=this._x2-t,a=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+a*a,this._alpha))}switch(this._point){case 0:this._point=1;this._x3=t,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3;this._x5=t,this._y5=n;break;default:Mt(this,t,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Dt=function t(n){function e(e){return n?new Nt(e,n):new Ct(e,0)}e.alpha=function(e){return t(+e)};return e}(.5);function Pt(e,t){this._context=e;this._alpha=t}Pt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function e(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;if(this._point){var i=this._x2-t,a=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+a*a,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Mt(this,t,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Ot=function t(n){function e(e){return n?new Pt(e,n):new At(e,0)}e.alpha=function(e){return t(+e)};return e}(.5);function zt(e){this._context=e}zt.prototype={areaStart:ft,areaEnd:ft,lineStart:function e(){this._point=0},lineEnd:function e(){if(this._point)this._context.closePath()},point:function e(t,n){t=+t,n=+n;if(this._point)this._context.lineTo(t,n);else this._point=1,this._context.moveTo(t,n)}};function Ft(e){return new zt(e)}function Lt(e){return e<0?-1:1}function It(e,t,n){var i=e._x1-e._x0,a=t-e._x1,r=(e._y1-e._y0)/(i||a<0&&-0),o=(n-e._y1)/(a||i<0&&-0),s=(r*a+o*i)/(i+a);return(Lt(r)+Lt(o))*Math.min(Math.abs(r),Math.abs(o),.5*Math.abs(s))||0}function jt(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}function Ht(e,t,n){var i=e._x0,a=e._y0,r=e._x1,o=e._y1,s=(r-i)/3;e._context.bezierCurveTo(i+s,a+s*t,r-s,o-s*n,r,o)}function Vt(e){this._context=e}Vt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Ht(this,this._t0,jt(this,this._t0));break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){var i=NaN;t=+t,n=+n;if(t===this._x1&&n===this._y1)return;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;Ht(this,jt(this,i=It(this,t,n)),i);break;default:Ht(this,this._t0,i=It(this,t,n));break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n;this._t0=i}};function Ut(e){this._context=new Gt(e)}(Ut.prototype=Object.create(Vt.prototype)).point=function(e,t){Vt.prototype.point.call(this,t,e)};function Gt(e){this._context=e}Gt.prototype={moveTo:function e(t,n){this._context.moveTo(n,t)},closePath:function e(){this._context.closePath()},lineTo:function e(t,n){this._context.lineTo(n,t)},bezierCurveTo:function e(t,n,i,a,r,o){this._context.bezierCurveTo(n,t,a,i,o,r)}};function Wt(e){return new Vt(e)}function Kt(e){return new Ut(e)}function qt(e){this._context=e}qt.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x=[];this._y=[]},lineEnd:function e(){var t=this._x,n=this._y,i=t.length;if(i){this._line?this._context.lineTo(t[0],n[0]):this._context.moveTo(t[0],n[0]);if(i===2){this._context.lineTo(t[1],n[1])}else{var a=Yt(t),r=Yt(n);for(var o=0,s=1;s=0;--t){a[t]=(o[t]-a[t+1])/r[t]}r[n-1]=(e[n]+a[n-1])/2;for(t=0;t=0)this._t=1-this._t,this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:{if(this._t<=0){this._context.lineTo(this._x,n);this._context.lineTo(t,n)}else{var i=this._x*(1-this._t)+t*this._t;this._context.lineTo(i,this._y);this._context.lineTo(i,n)}break}}this._x=t,this._y=n}};function Zt(e){return new $t(e,.5)}function Jt(e){return new $t(e,0)}function Qt(e){return new $t(e,1)}function en(e,t){if(!((o=e.length)>1))return;for(var n=1,i,a,r=e[t[0]],o,s=r.length;n=0){n[t]=t}return n}function nn(e,t){return e[t]}function an(){var c=q([]),f=tn,d=en,g=nn;function t(e){var t=c.apply(this,arguments),n,i=e.length,a=t.length,r=new Array(a),o;for(n=0;n0))return;for(var n,i,a=0,r=e[0].length,o;a0))return;for(var n,i=0,a,r,o,s,l,u=e[t[0]].length;i=0){a[0]=o,a[1]=o+=r}else if(r<0){a[1]=s,a[0]=s+=r}else{a[0]=o}}}}function sn(e,t){if(!((a=e.length)>0))return;for(var n=0,i=e[t[0]],a,r=i.length;n0)||!((r=(a=e[t[0]]).length)>0))return;for(var n=0,i=1,a,r,o;ir)r=a,n=t}return n}function cn(e){var n=e.map(fn);return tn(e).sort(function(e,t){return n[e]-n[t]})}function fn(e){var t=0,n=-1,i=e.length,a;while(++n1&&arguments[1]!==undefined?arguments[1]:{};for(var n in t){if({}.hasOwnProperty.call(t,n))e.attr(n,t[n])}}var kn={language:"Afar",location:null,id:4096,tag:"aa",version:"Release 10"};var Sn={language:"Afrikaans",location:null,id:54,tag:"af",version:"Release 7"};var Cn={language:"Aghem",location:null,id:4096,tag:"agq",version:"Release 10"};var En={language:"Akan",location:null,id:4096,tag:"ak",version:"Release 10"};var An={language:"Albanian",location:null,id:28,tag:"sq",version:"Release 7"};var Rn={language:"Alsatian",location:null,id:132,tag:"gsw",version:"Release 7"};var Mn={language:"Amharic",location:null,id:94,tag:"am",version:"Release 7"};var Tn={language:"Arabic",location:null,id:1,tag:"ar",version:"Release 7"};var Bn={language:"Armenian",location:null,id:43,tag:"hy",version:"Release 7"};var Nn={language:"Assamese",location:null,id:77,tag:"as",version:"Release 7"};var Dn={language:"Asturian",location:null,id:4096,tag:"ast",version:"Release 10"};var Pn={language:"Asu",location:null,id:4096,tag:"asa",version:"Release 10"};var On={language:"Azerbaijani (Latin)",location:null,id:44,tag:"az",version:"Release 7"};var zn={language:"Bafia",location:null,id:4096,tag:"ksf",version:"Release 10"};var Fn={language:"Bamanankan",location:null,id:4096,tag:"bm",version:"Release 10"};var Ln={language:"Bangla",location:null,id:69,tag:"bn",version:"Release 7"};var In={language:"Basaa",location:null,id:4096,tag:"bas",version:"Release 10"};var jn={language:"Bashkir",location:null,id:109,tag:"ba",version:"Release 7"};var Hn={language:"Basque",location:null,id:45,tag:"eu",version:"Release 7"};var Vn={language:"Belarusian",location:null,id:35,tag:"be",version:"Release 7"};var Un={language:"Bemba",location:null,id:4096,tag:"bem",version:"Release 10"};var Gn={language:"Bena",location:null,id:4096,tag:"bez",version:"Release 10"};var Wn={language:"Blin",location:null,id:4096,tag:"byn",version:"Release 10"};var Kn={language:"Bodo",location:null,id:4096,tag:"brx",version:"Release 10"};var qn={language:"Bosnian (Latin)",location:null,id:30746,tag:"bs",version:"Release 7"};var Yn={language:"Breton",location:null,id:126,tag:"br",version:"Release 7"};var Xn={language:"Bulgarian",location:null,id:2,tag:"bg",version:"Release 7"};var $n={language:"Burmese",location:null,id:85,tag:"my",version:"Release 8.1"};var Zn={language:"Catalan",location:null,id:3,tag:"ca",version:"Release 7"};var Jn={language:"Cebuano",location:null,id:4096,tag:"ceb",version:"Release 10.5"};var Qn={language:"Central Kurdish",location:null,id:146,tag:"ku",version:"Release 8"};var ei={language:"Chakma",location:null,id:4096,tag:"ccp",version:"Release 10.5"};var ti={language:"Cherokee",location:null,id:92,tag:"chr",version:"Release 8"};var ni={language:"Chiga",location:null,id:4096,tag:"cgg",version:"Release 10"};var ii={language:"Chinese (Simplified)",location:null,id:30724,tag:"zh",version:"Windows 7"};var ai={language:"Congo Swahili",location:null,id:4096,tag:"swc",version:"Release 10"};var ri={language:"Cornish",location:null,id:4096,tag:"kw",version:"Release 10"};var oi={language:"Corsican",location:null,id:131,tag:"co",version:"Release 7"};var si={language:"Czech",location:null,id:5,tag:"cs",version:"Release 7"};var li={language:"Danish",location:null,id:6,tag:"da",version:"Release 7"};var ui={language:"Dari",location:null,id:140,tag:"prs",version:"Release 7"};var hi={language:"Divehi",location:null,id:101,tag:"dv",version:"Release 7"};var ci={language:"Duala",location:null,id:4096,tag:"dua",version:"Release 10"};var fi={language:"Dutch",location:null,id:19,tag:"nl",version:"Release 7"};var di={language:"Dzongkha",location:null,id:4096,tag:"dz",version:"Release 10"};var gi={language:"Embu",location:null,id:4096,tag:"ebu",version:"Release 10"};var pi={language:"English",location:null,id:9,tag:"en",version:"Release 7"};var vi={language:"Esperanto",location:null,id:4096,tag:"eo",version:"Release 10"};var mi={language:"Estonian",location:null,id:37,tag:"et",version:"Release 7"};var yi={language:"Ewe",location:null,id:4096,tag:"ee",version:"Release 10"};var _i={language:"Ewondo",location:null,id:4096,tag:"ewo",version:"Release 10"};var bi={language:"Faroese",location:null,id:56,tag:"fo",version:"Release 7"};var wi={language:"Filipino",location:null,id:100,tag:"fil",version:"Release 7"};var xi={language:"Finnish",location:null,id:11,tag:"fi",version:"Release 7"};var ki={language:"French",location:null,id:12,tag:"fr",version:"Release 7"};var Si={language:"Frisian",location:null,id:98,tag:"fy",version:"Release 7"};var Ci={language:"Friulian",location:null,id:4096,tag:"fur",version:"Release 10"};var Ei={language:"Fulah",location:null,id:103,tag:"ff",version:"Release 8"};var Ai={language:"Galician",location:null,id:86,tag:"gl",version:"Release 7"};var Ri={language:"Ganda",location:null,id:4096,tag:"lg",version:"Release 10"};var Mi={language:"Georgian",location:null,id:55,tag:"ka",version:"Release 7"};var Ti={language:"German",location:null,id:7,tag:"de",version:"Release 7"};var Bi={language:"Greek",location:null,id:8,tag:"el",version:"Release 7"};var Ni={language:"Greenlandic",location:null,id:111,tag:"kl",version:"Release 7"};var Di={language:"Guarani",location:null,id:116,tag:"gn",version:"Release 8.1"};var Pi={language:"Gujarati",location:null,id:71,tag:"gu",version:"Release 7"};var Oi={language:"Gusii",location:null,id:4096,tag:"guz",version:"Release 10"};var zi={language:"Hausa (Latin)",location:null,id:104,tag:"ha",version:"Release 7"};var Fi={language:"Hawaiian",location:null,id:117,tag:"haw",version:"Release 8"};var Li={language:"Hebrew",location:null,id:13,tag:"he",version:"Release 7"};var Ii={language:"Hindi",location:null,id:57,tag:"hi",version:"Release 7"};var ji={language:"Hungarian",location:null,id:14,tag:"hu",version:"Release 7"};var Hi={language:"Icelandic",location:null,id:15,tag:"is",version:"Release 7"};var Vi={language:"Igbo",location:null,id:112,tag:"ig",version:"Release 7"};var Ui={language:"Indonesian",location:null,id:33,tag:"id",version:"Release 7"};var Gi={language:"Interlingua",location:null,id:4096,tag:"ia",version:"Release 10"};var Wi={language:"Inuktitut (Latin)",location:null,id:93,tag:"iu",version:"Release 7"};var Ki={language:"Irish",location:null,id:60,tag:"ga",version:"Windows 7"};var qi={language:"Italian",location:null,id:16,tag:"it",version:"Release 7"};var Yi={language:"Japanese",location:null,id:17,tag:"ja",version:"Release 7"};var Xi={language:"Javanese",location:null,id:4096,tag:"jv",version:"Release 8.1"};var $i={language:"Jola-Fonyi",location:null,id:4096,tag:"dyo",version:"Release 10"};var Zi={language:"Kabuverdianu",location:null,id:4096,tag:"kea",version:"Release 10"};var Ji={language:"Kabyle",location:null,id:4096,tag:"kab",version:"Release 10"};var Qi={language:"Kako",location:null,id:4096,tag:"kkj",version:"Release 10"};var ea={language:"Kalenjin",location:null,id:4096,tag:"kln",version:"Release 10"};var ta={language:"Kamba",location:null,id:4096,tag:"kam",version:"Release 10"};var na={language:"Kannada",location:null,id:75,tag:"kn",version:"Release 7"};var ia={language:"Kashmiri",location:null,id:96,tag:"ks",version:"Release 10"};var aa={language:"Kazakh",location:null,id:63,tag:"kk",version:"Release 7"};var ra={language:"Khmer",location:null,id:83,tag:"km",version:"Release 7"};var oa={language:"K'iche",location:null,id:134,tag:"quc",version:"Release 10"};var sa={language:"Kikuyu",location:null,id:4096,tag:"ki",version:"Release 10"};var la={language:"Kinyarwanda",location:null,id:135,tag:"rw",version:"Release 7"};var ua={language:"Kiswahili",location:null,id:65,tag:"sw",version:"Release 7"};var ha={language:"Konkani",location:null,id:87,tag:"kok",version:"Release 7"};var ca={language:"Korean",location:null,id:18,tag:"ko",version:"Release 7"};var fa={language:"Koyra Chiini",location:null,id:4096,tag:"khq",version:"Release 10"};var da={language:"Koyraboro Senni",location:null,id:4096,tag:"ses",version:"Release 10"};var ga={language:"Kwasio",location:null,id:4096,tag:"nmg",version:"Release 10"};var pa={language:"Kyrgyz",location:null,id:64,tag:"ky",version:"Release 7"};var va={language:"Lakota",location:null,id:4096,tag:"lkt",version:"Release 10"};var ma={language:"Langi",location:null,id:4096,tag:"lag",version:"Release 10"};var ya={language:"Lao",location:null,id:84,tag:"lo",version:"Release 7"};var _a={language:"Latvian",location:null,id:38,tag:"lv",version:"Release 7"};var ba={language:"Lingala",location:null,id:4096,tag:"ln",version:"Release 10"};var wa={language:"Lithuanian",location:null,id:39,tag:"lt",version:"Release 7"};var xa={language:"Low German",location:null,id:4096,tag:"nds",version:"Release 10.2"};var ka={language:"Lower Sorbian",location:null,id:31790,tag:"dsb",version:"Windows 7"};var Sa={language:"Luba-Katanga",location:null,id:4096,tag:"lu",version:"Release 10"};var Ca={language:"Luo",location:null,id:4096,tag:"luo",version:"Release 10"};var Ea={language:"Luxembourgish",location:null,id:110,tag:"lb",version:"Release 7"};var Aa={language:"Luyia",location:null,id:4096,tag:"luy",version:"Release 10"};var Ra={language:"Macedonian",location:null,id:47,tag:"mk",version:"Release 7"};var Ma={language:"Machame",location:null,id:4096,tag:"jmc",version:"Release 10"};var Ta={language:"Makhuwa-Meetto",location:null,id:4096,tag:"mgh",version:"Release 10"};var Ba={language:"Makonde",location:null,id:4096,tag:"kde",version:"Release 10"};var Na={language:"Malagasy",location:null,id:4096,tag:"mg",version:"Release 8.1"};var Da={language:"Malay",location:null,id:62,tag:"ms",version:"Release 7"};var Pa={language:"Malayalam",location:null,id:76,tag:"ml",version:"Release 7"};var Oa={language:"Maltese",location:null,id:58,tag:"mt",version:"Release 7"};var za={language:"Manx",location:null,id:4096,tag:"gv",version:"Release 10"};var Fa={language:"Maori",location:null,id:129,tag:"mi",version:"Release 7"};var La={language:"Mapudungun",location:null,id:122,tag:"arn",version:"Release 7"};var Ia={language:"Marathi",location:null,id:78,tag:"mr",version:"Release 7"};var ja={language:"Masai",location:null,id:4096,tag:"mas",version:"Release 10"};var Ha={language:"Meru",location:null,id:4096,tag:"mer",version:"Release 10"};var Va={language:"Meta'",location:null,id:4096,tag:"mgo",version:"Release 10"};var Ua={language:"Mohawk",location:null,id:124,tag:"moh",version:"Release 7"};var Ga={language:"Mongolian (Cyrillic)",location:null,id:80,tag:"mn",version:"Release 7"};var Wa={language:"Morisyen",location:null,id:4096,tag:"mfe",version:"Release 10"};var Ka={language:"Mundang",location:null,id:4096,tag:"mua",version:"Release 10"};var qa={language:"N'ko",location:null,id:4096,tag:"nqo",version:"Release 8.1"};var Ya={language:"Nama",location:null,id:4096,tag:"naq",version:"Release 10"};var Xa={language:"Nepali",location:null,id:97,tag:"ne",version:"Release 7"};var $a={language:"Ngiemboon",location:null,id:4096,tag:"nnh",version:"Release 10"};var Za={language:"Ngomba",location:null,id:4096,tag:"jgo",version:"Release 10"};var Ja={language:"North Ndebele",location:null,id:4096,tag:"nd",version:"Release 10"};var Qa={language:"Norwegian (Bokmal)",location:null,id:20,tag:"no",version:"Release 7"};var er={language:"Norwegian (Bokmal)",location:null,id:31764,tag:"nb",version:"Release 7"};var tr={language:"Norwegian (Nynorsk)",location:null,id:30740,tag:"nn",version:"Release 7"};var nr={language:"Nuer",location:null,id:4096,tag:"nus",version:"Release 10"};var ir={language:"Nyankole",location:null,id:4096,tag:"nyn",version:"Release 10"};var ar={language:"Occitan",location:null,id:130,tag:"oc",version:"Release 7"};var rr={language:"Odia",location:null,id:72,tag:"or",version:"Release 7"};var or={language:"Oromo",location:null,id:114,tag:"om",version:"Release 8.1"};var sr={language:"Ossetian",location:null,id:4096,tag:"os",version:"Release 10"};var lr={language:"Pashto",location:null,id:99,tag:"ps",version:"Release 7"};var ur={language:"Persian",location:null,id:41,tag:"fa",version:"Release 7"};var hr={language:"Polish",location:null,id:21,tag:"pl",version:"Release 7"};var cr={language:"Portuguese",location:null,id:22,tag:"pt",version:"Release 7"};var fr={language:"Punjabi",location:null,id:70,tag:"pa",version:"Release 7"};var dr={language:"Quechua",location:null,id:107,tag:"quz",version:"Release 7"};var gr={language:"Ripuarian",location:null,id:4096,tag:"ksh",version:"Release 10"};var pr={language:"Romanian",location:null,id:24,tag:"ro",version:"Release 7"};var vr={language:"Romansh",location:null,id:23,tag:"rm",version:"Release 7"};var mr={language:"Rombo",location:null,id:4096,tag:"rof",version:"Release 10"};var yr={language:"Rundi",location:null,id:4096,tag:"rn",version:"Release 10"};var _r={language:"Russian",location:null,id:25,tag:"ru",version:"Release 7"};var br={language:"Rwa",location:null,id:4096,tag:"rwk",version:"Release 10"};var wr={language:"Saho",location:null,id:4096,tag:"ssy",version:"Release 10"};var xr={language:"Sakha",location:null,id:133,tag:"sah",version:"Release 7"};var kr={language:"Samburu",location:null,id:4096,tag:"saq",version:"Release 10"};var Sr={language:"Sami (Inari)",location:null,id:28731,tag:"smn",version:"Windows 7"};var Cr={language:"Sami (Lule)",location:null,id:31803,tag:"smj",version:"Windows 7"};var Er={language:"Sami (Northern)",location:null,id:59,tag:"se",version:"Release 7"};var Ar={language:"Sami (Skolt)",location:null,id:29755,tag:"sms",version:"Windows 7"};var Rr={language:"Sami (Southern)",location:null,id:30779,tag:"sma",version:"Windows 7"};var Mr={language:"Sango",location:null,id:4096,tag:"sg",version:"Release 10"};var Tr={language:"Sangu",location:null,id:4096,tag:"sbp",version:"Release 10"};var Br={language:"Sanskrit",location:null,id:79,tag:"sa",version:"Release 7"};var Nr={language:"Scottish Gaelic",location:null,id:145,tag:"gd",version:"Windows 7"};var Dr={language:"Sena",location:null,id:4096,tag:"seh",version:"Release 10"};var Pr={language:"Serbian (Latin)",location:null,id:31770,tag:"sr",version:"Release 7"};var Or={language:"Sesotho sa Leboa",location:null,id:108,tag:"nso",version:"Release 7"};var zr={language:"Setswana",location:null,id:50,tag:"tn",version:"Release 7"};var Fr={language:"Shambala",location:null,id:4096,tag:"ksb",version:"Release 10"};var Lr={language:"Shona",location:null,id:4096,tag:"sn",version:"Release 8.1"};var Ir={language:"Sindhi",location:null,id:89,tag:"sd",version:"Release 8"};var jr={language:"Sinhala",location:null,id:91,tag:"si",version:"Release 7"};var Hr={language:"Slovak",location:null,id:27,tag:"sk",version:"Release 7"};var Vr={language:"Slovenian",location:null,id:36,tag:"sl",version:"Release 7"};var Ur={language:"Soga",location:null,id:4096,tag:"xog",version:"Release 10"};var Gr={language:"Somali",location:null,id:119,tag:"so",version:"Release 8.1"};var Wr={language:"Sotho",location:null,id:48,tag:"st",version:"Release 8.1"};var Kr={language:"South Ndebele",location:null,id:4096,tag:"nr",version:"Release 10"};var qr={language:"Spanish",location:null,id:10,tag:"es",version:"Release 7"};var Yr={language:"Standard Moroccan Tamazight",location:null,id:4096,tag:"zgh",version:"Release 8.1"};var Xr={language:"Swati",location:null,id:4096,tag:"ss",version:"Release 10"};var $r={language:"Swedish",location:null,id:29,tag:"sv",version:"Release 7"};var Zr={language:"Syriac",location:null,id:90,tag:"syr",version:"Release 7"};var Jr={language:"Tachelhit",location:null,id:4096,tag:"shi",version:"Release 10"};var Qr={language:"Taita",location:null,id:4096,tag:"dav",version:"Release 10"};var eo={language:"Tajik (Cyrillic)",location:null,id:40,tag:"tg",version:"Release 7"};var to={language:"Tamazight (Latin)",location:null,id:95,tag:"tzm",version:"Release 7"};var no={language:"Tamil",location:null,id:73,tag:"ta",version:"Release 7"};var io={language:"Tasawaq",location:null,id:4096,tag:"twq",version:"Release 10"};var ao={language:"Tatar",location:null,id:68,tag:"tt",version:"Release 7"};var ro={language:"Telugu",location:null,id:74,tag:"te",version:"Release 7"};var oo={language:"Teso",location:null,id:4096,tag:"teo",version:"Release 10"};var so={language:"Thai",location:null,id:30,tag:"th",version:"Release 7"};var lo={language:"Tibetan",location:null,id:81,tag:"bo",version:"Release 7"};var uo={language:"Tigre",location:null,id:4096,tag:"tig",version:"Release 10"};var ho={language:"Tigrinya",location:null,id:115,tag:"ti",version:"Release 8"};var co={language:"Tongan",location:null,id:4096,tag:"to",version:"Release 10"};var fo={language:"Tsonga",location:null,id:49,tag:"ts",version:"Release 8.1"};var go={language:"Turkish",location:null,id:31,tag:"tr",version:"Release 7"};var po={language:"Turkmen",location:null,id:66,tag:"tk",version:"Release 7"};var vo={language:"Ukrainian",location:null,id:34,tag:"uk",version:"Release 7"};var mo={language:"Upper Sorbian",location:null,id:46,tag:"hsb",version:"Release 7"};var yo={language:"Urdu",location:null,id:32,tag:"ur",version:"Release 7"};var _o={language:"Uyghur",location:null,id:128,tag:"ug",version:"Release 7"};var bo={language:"Uzbek (Latin)",location:null,id:67,tag:"uz",version:"Release 7"};var wo={language:"Vai",location:null,id:4096,tag:"vai",version:"Release 10"};var xo={language:"Venda",location:null,id:51,tag:"ve",version:"Release 10"};var ko={language:"Vietnamese",location:null,id:42,tag:"vi",version:"Release 7"};var So={language:"Volapük",location:null,id:4096,tag:"vo",version:"Release 10"};var Co={language:"Vunjo",location:null,id:4096,tag:"vun",version:"Release 10"};var Eo={language:"Walser",location:null,id:4096,tag:"wae",version:"Release 10"};var Ao={language:"Welsh",location:null,id:82,tag:"cy",version:"Release 7"};var Ro={language:"Wolaytta",location:null,id:4096,tag:"wal",version:"Release 10"};var Mo={language:"Wolof",location:null,id:136,tag:"wo",version:"Release 7"};var To={language:"Xhosa",location:null,id:52,tag:"xh",version:"Release 7"};var Bo={language:"Yangben",location:null,id:4096,tag:"yav",version:"Release 10"};var No={language:"Yi",location:null,id:120,tag:"ii",version:"Release 7"};var Do={language:"Yoruba",location:null,id:106,tag:"yo",version:"Release 7"};var Po={language:"Zarma",location:null,id:4096,tag:"dje",version:"Release 10"};var Oo={language:"Zulu",location:null,id:53,tag:"zu",version:"Release 7"};var zo={aa:kn,"aa-dj":{language:"Afar",location:"Djibouti",id:4096,tag:"aa-DJ",version:"Release 10"},"aa-er":{language:"Afar",location:"Eritrea",id:4096,tag:"aa-ER",version:"Release 10"},"aa-et":{language:"Afar",location:"Ethiopia",id:4096,tag:"aa-ET",version:"Release 10"},af:Sn,"af-na":{language:"Afrikaans",location:"Namibia",id:4096,tag:"af-NA",version:"Release 10"},"af-za":{language:"Afrikaans",location:"South Africa",id:1078,tag:"af-ZA",version:"Release B"},agq:Cn,"agq-cm":{language:"Aghem",location:"Cameroon",id:4096,tag:"agq-CM",version:"Release 10"},ak:En,"ak-gh":{language:"Akan",location:"Ghana",id:4096,tag:"ak-GH",version:"Release 10"},sq:An,"sq-al":{language:"Albanian",location:"Albania",id:1052,tag:"sq-AL",version:"Release B"},"sq-mk":{language:"Albanian",location:"North Macedonia",id:4096,tag:"sq-MK",version:"Release 10"},gsw:Rn,"gsw-fr":{language:"Alsatian",location:"France",id:1156,tag:"gsw-FR",version:"Release V"},"gsw-li":{language:"Alsatian",location:"Liechtenstein",id:4096,tag:"gsw-LI",version:"Release 10"},"gsw-ch":{language:"Alsatian",location:"Switzerland",id:4096,tag:"gsw-CH",version:"Release 10"},am:Mn,"am-et":{language:"Amharic",location:"Ethiopia",id:1118,tag:"am-ET",version:"Release V"},ar:Tn,"ar-dz":{language:"Arabic",location:"Algeria",id:5121,tag:"ar-DZ",version:"Release B"},"ar-bh":{language:"Arabic",location:"Bahrain",id:15361,tag:"ar-BH",version:"Release B"},"ar-td":{language:"Arabic",location:"Chad",id:4096,tag:"ar-TD",version:"Release 10"},"ar-km":{language:"Arabic",location:"Comoros",id:4096,tag:"ar-KM",version:"Release 10"},"ar-dj":{language:"Arabic",location:"Djibouti",id:4096,tag:"ar-DJ",version:"Release 10"},"ar-eg":{language:"Arabic",location:"Egypt",id:3073,tag:"ar-EG",version:"Release B"},"ar-er":{language:"Arabic",location:"Eritrea",id:4096,tag:"ar-ER",version:"Release 10"},"ar-iq":{language:"Arabic",location:"Iraq",id:2049,tag:"ar-IQ",version:"Release B"},"ar-il":{language:"Arabic",location:"Israel",id:4096,tag:"ar-IL",version:"Release 10"},"ar-jo":{language:"Arabic",location:"Jordan",id:11265,tag:"ar-JO",version:"Release B"},"ar-kw":{language:"Arabic",location:"Kuwait",id:13313,tag:"ar-KW",version:"Release B"},"ar-lb":{language:"Arabic",location:"Lebanon",id:12289,tag:"ar-LB",version:"Release B"},"ar-ly":{language:"Arabic",location:"Libya",id:4097,tag:"ar-LY",version:"Release B"},"ar-mr":{language:"Arabic",location:"Mauritania",id:4096,tag:"ar-MR",version:"Release 10"},"ar-ma":{language:"Arabic",location:"Morocco",id:6145,tag:"ar-MA",version:"Release B"},"ar-om":{language:"Arabic",location:"Oman",id:8193,tag:"ar-OM",version:"Release B"},"ar-ps":{language:"Arabic",location:"Palestinian Authority",id:4096,tag:"ar-PS",version:"Release 10"},"ar-qa":{language:"Arabic",location:"Qatar",id:16385,tag:"ar-QA",version:"Release B"},"ar-sa":{language:"Arabic",location:"Saudi Arabia",id:1025,tag:"ar-SA",version:"Release B"},"ar-so":{language:"Arabic",location:"Somalia",id:4096,tag:"ar-SO",version:"Release 10"},"ar-ss":{language:"Arabic",location:"South Sudan",id:4096,tag:"ar-SS",version:"Release 10"},"ar-sd":{language:"Arabic",location:"Sudan",id:4096,tag:"ar-SD",version:"Release 10"},"ar-sy":{language:"Arabic",location:"Syria",id:10241,tag:"ar-SY",version:"Release B"},"ar-tn":{language:"Arabic",location:"Tunisia",id:7169,tag:"ar-TN",version:"Release B"},"ar-ae":{language:"Arabic",location:"U.A.E.",id:14337,tag:"ar-AE",version:"Release B"},"ar-001":{language:"Arabic",location:"World",id:4096,tag:"ar-001",version:"Release 10"},"ar-ye":{language:"Arabic",location:"Yemen",id:9217,tag:"ar-YE",version:"Release B"},hy:Bn,"hy-am":{language:"Armenian",location:"Armenia",id:1067,tag:"hy-AM",version:"Release C"},as:Nn,"as-in":{language:"Assamese",location:"India",id:1101,tag:"as-IN",version:"Release V"},ast:Dn,"ast-es":{language:"Asturian",location:"Spain",id:4096,tag:"ast-ES",version:"Release 10"},asa:Pn,"asa-tz":{language:"Asu",location:"Tanzania",id:4096,tag:"asa-TZ",version:"Release 10"},"az-cyrl":{language:"Azerbaijani (Cyrillic)",location:null,id:29740,tag:"az-Cyrl",version:"Windows 7"},"az-cyrl-az":{language:"Azerbaijani (Cyrillic)",location:"Azerbaijan",id:2092,tag:"az-Cyrl-AZ",version:"Release C"},az:On,"az-latn":{language:"Azerbaijani (Latin)",location:null,id:30764,tag:"az-Latn",version:"Windows 7"},"az-latn-az":{language:"Azerbaijani (Latin)",location:"Azerbaijan",id:1068,tag:"az-Latn-AZ",version:"Release C"},ksf:zn,"ksf-cm":{language:"Bafia",location:"Cameroon",id:4096,tag:"ksf-CM",version:"Release 10"},bm:Fn,"bm-latn-ml":{language:"Bamanankan (Latin)",location:"Mali",id:4096,tag:"bm-Latn-ML",version:"Release 10"},bn:Ln,"bn-bd":{language:"Bangla",location:"Bangladesh",id:2117,tag:"bn-BD",version:"Release V"},"bn-in":{language:"Bangla",location:"India",id:1093,tag:"bn-IN",version:"Release E1"},bas:In,"bas-cm":{language:"Basaa",location:"Cameroon",id:4096,tag:"bas-CM",version:"Release 10"},ba:jn,"ba-ru":{language:"Bashkir",location:"Russia",id:1133,tag:"ba-RU",version:"Release V"},eu:Hn,"eu-es":{language:"Basque",location:"Spain",id:1069,tag:"eu-ES",version:"Release B"},be:Vn,"be-by":{language:"Belarusian",location:"Belarus",id:1059,tag:"be-BY",version:"Release B"},bem:Un,"bem-zm":{language:"Bemba",location:"Zambia",id:4096,tag:"bem-ZM",version:"Release 10"},bez:Gn,"bez-tz":{language:"Bena",location:"Tanzania",id:4096,tag:"bez-TZ",version:"Release 10"},byn:Wn,"byn-er":{language:"Blin",location:"Eritrea",id:4096,tag:"byn-ER",version:"Release 10"},brx:Kn,"brx-in":{language:"Bodo",location:"India",id:4096,tag:"brx-IN",version:"Release 10"},"bs-cyrl":{language:"Bosnian (Cyrillic)",location:null,id:25626,tag:"bs-Cyrl",version:"Windows 7"},"bs-cyrl-ba":{language:"Bosnian (Cyrillic)",location:"Bosnia and Herzegovina",id:8218,tag:"bs-Cyrl-BA",version:"Release E1"},"bs-latn":{language:"Bosnian (Latin)",location:null,id:26650,tag:"bs-Latn",version:"Windows 7"},bs:qn,"bs-latn-ba":{language:"Bosnian (Latin)",location:"Bosnia and Herzegovina",id:5146,tag:"bs-Latn-BA",version:"Release E1"},br:Yn,"br-fr":{language:"Breton",location:"France",id:1150,tag:"br-FR",version:"Release V"},bg:Xn,"bg-bg":{language:"Bulgarian",location:"Bulgaria",id:1026,tag:"bg-BG",version:"Release B"},my:$n,"my-mm":{language:"Burmese",location:"Myanmar",id:1109,tag:"my-MM",version:"Release 8.1"},ca:Zn,"ca-ad":{language:"Catalan",location:"Andorra",id:4096,tag:"ca-AD",version:"Release 10"},"ca-fr":{language:"Catalan",location:"France",id:4096,tag:"ca-FR",version:"Release 10"},"ca-it":{language:"Catalan",location:"Italy",id:4096,tag:"ca-IT",version:"Release 10"},"ca-es":{language:"Catalan",location:"Spain",id:1027,tag:"ca-ES",version:"Release B"},ceb:Jn,"ceb-latn":{language:"Cebuan (Latin)",location:null,id:4096,tag:"ceb-Latn",version:"Release 10.5"},"ceb-latn-ph":{language:"Cebuan (Latin)",location:"Philippines",id:4096,tag:"ceb-Latn-PH",version:"Release 10.5"},"tzm-latn-":{language:"Central Atlas Tamazight (Latin)",location:"Morocco",id:4096,tag:"tzm-Latn-",version:"Release 10"},ku:Qn,"ku-arab":{language:"Central Kurdish",location:null,id:31890,tag:"ku-Arab",version:"Release 8"},"ku-arab-iq":{language:"Central Kurdish",location:"Iraq",id:1170,tag:"ku-Arab-IQ",version:"Release 8"},ccp:ei,"ccp-cakm":{language:"Chakma",location:"Chakma",id:4096,tag:"ccp-Cakm",version:"Release 10.5"},"ccp-cakm-":{language:"Chakma",location:"India",id:4096,tag:"ccp-Cakm-",version:"Release 10.5"},"cd-ru":{language:"Chechen",location:"Russia",id:4096,tag:"cd-RU",version:"Release 10.1"},chr:ti,"chr-cher":{language:"Cherokee",location:null,id:31836,tag:"chr-Cher",version:"Release 8"},"chr-cher-us":{language:"Cherokee",location:"United States",id:1116,tag:"chr-Cher-US",version:"Release 8"},cgg:ni,"cgg-ug":{language:"Chiga",location:"Uganda",id:4096,tag:"cgg-UG",version:"Release 10"},"zh-hans":{language:"Chinese (Simplified)",location:null,id:4,tag:"zh-Hans",version:"Release A"},zh:ii,"zh-cn":{language:"Chinese (Simplified)",location:"People's Republic of China",id:2052,tag:"zh-CN",version:"Release A"},"zh-sg":{language:"Chinese (Simplified)",location:"Singapore",id:4100,tag:"zh-SG",version:"Release A"},"zh-hant":{language:"Chinese (Traditional)",location:null,id:31748,tag:"zh-Hant",version:"Release A"},"zh-hk":{language:"Chinese (Traditional)",location:"Hong Kong S.A.R.",id:3076,tag:"zh-HK",version:"Release A"},"zh-mo":{language:"Chinese (Traditional)",location:"Macao S.A.R.",id:5124,tag:"zh-MO",version:"Release D"},"zh-tw":{language:"Chinese (Traditional)",location:"Taiwan",id:1028,tag:"zh-TW",version:"Release A"},"cu-ru":{language:"Church Slavic",location:"Russia",id:4096,tag:"cu-RU",version:"Release 10.1"},swc:ai,"swc-cd":{language:"Congo Swahili",location:"Congo DRC",id:4096,tag:"swc-CD",version:"Release 10"},kw:ri,"kw-gb":{language:"Cornish",location:"United Kingdom",id:4096,tag:"kw-GB",version:"Release 10"},co:oi,"co-fr":{language:"Corsican",location:"France",id:1155,tag:"co-FR",version:"Release V"},"hr,":{language:"Croatian",location:null,id:26,tag:"hr,",version:"Release 7"},"hr-hr":{language:"Croatian",location:"Croatia",id:1050,tag:"hr-HR",version:"Release A"},"hr-ba":{language:"Croatian (Latin)",location:"Bosnia and Herzegovina",id:4122,tag:"hr-BA",version:"Release E1"},cs:si,"cs-cz":{language:"Czech",location:"Czech Republic",id:1029,tag:"cs-CZ",version:"Release A"},da:li,"da-dk":{language:"Danish",location:"Denmark",id:1030,tag:"da-DK",version:"Release A"},"da-gl":{language:"Danish",location:"Greenland",id:4096,tag:"da-GL",version:"Release 10"},prs:ui,"prs-af":{language:"Dari",location:"Afghanistan",id:1164,tag:"prs-AF",version:"Release V"},dv:hi,"dv-mv":{language:"Divehi",location:"Maldives",id:1125,tag:"dv-MV",version:"Release D"},dua:ci,"dua-cm":{language:"Duala",location:"Cameroon",id:4096,tag:"dua-CM",version:"Release 10"},nl:fi,"nl-aw":{language:"Dutch",location:"Aruba",id:4096,tag:"nl-AW",version:"Release 10"},"nl-be":{language:"Dutch",location:"Belgium",id:2067,tag:"nl-BE",version:"Release A"},"nl-bq":{language:"Dutch",location:"Bonaire, Sint Eustatius and Saba",id:4096,tag:"nl-BQ",version:"Release 10"},"nl-cw":{language:"Dutch",location:"Curaçao",id:4096,tag:"nl-CW",version:"Release 10"},"nl-nl":{language:"Dutch",location:"Netherlands",id:1043,tag:"nl-NL",version:"Release A"},"nl-sx":{language:"Dutch",location:"Sint Maarten",id:4096,tag:"nl-SX",version:"Release 10"},"nl-sr":{language:"Dutch",location:"Suriname",id:4096,tag:"nl-SR",version:"Release 10"},dz:di,"dz-bt":{language:"Dzongkha",location:"Bhutan",id:3153,tag:"dz-BT",version:"Release 10"},ebu:gi,"ebu-ke":{language:"Embu",location:"Kenya",id:4096,tag:"ebu-KE",version:"Release 10"},en:pi,"en-as":{language:"English",location:"American Samoa",id:4096,tag:"en-AS",version:"Release 10"},"en-ai":{language:"English",location:"Anguilla",id:4096,tag:"en-AI",version:"Release 10"},"en-ag":{language:"English",location:"Antigua and Barbuda",id:4096,tag:"en-AG",version:"Release 10"},"en-au":{language:"English",location:"Australia",id:3081,tag:"en-AU",version:"Release A"},"en-at":{language:"English",location:"Austria",id:4096,tag:"en-AT",version:"Release 10.1"},"en-bs":{language:"English",location:"Bahamas",id:4096,tag:"en-BS",version:"Release 10"},"en-bb":{language:"English",location:"Barbados",id:4096,tag:"en-BB",version:"Release 10"},"en-be":{language:"English",location:"Belgium",id:4096,tag:"en-BE",version:"Release 10"},"en-bz":{language:"English",location:"Belize",id:10249,tag:"en-BZ",version:"Release B"},"en-bm":{language:"English",location:"Bermuda",id:4096,tag:"en-BM",version:"Release 10"},"en-bw":{language:"English",location:"Botswana",id:4096,tag:"en-BW",version:"Release 10"},"en-io":{language:"English",location:"British Indian Ocean Territory",id:4096,tag:"en-IO",version:"Release 10"},"en-vg":{language:"English",location:"British Virgin Islands",id:4096,tag:"en-VG",version:"Release 10"},"en-bi":{language:"English",location:"Burundi",id:4096,tag:"en-BI",version:"Release 10.1"},"en-cm":{language:"English",location:"Cameroon",id:4096,tag:"en-CM",version:"Release 10"},"en-ca":{language:"English",location:"Canada",id:4105,tag:"en-CA",version:"Release A"},"en-029":{language:"English",location:"Caribbean",id:9225,tag:"en-029",version:"Release B"},"en-ky":{language:"English",location:"Cayman Islands",id:4096,tag:"en-KY",version:"Release 10"},"en-cx":{language:"English",location:"Christmas Island",id:4096,tag:"en-CX",version:"Release 10"},"en-cc":{language:"English",location:"Cocos [Keeling] Islands",id:4096,tag:"en-CC",version:"Release 10"},"en-ck":{language:"English",location:"Cook Islands",id:4096,tag:"en-CK",version:"Release 10"},"en-cy":{language:"English",location:"Cyprus",id:4096,tag:"en-CY",version:"Release 10.1"},"en-dk":{language:"English",location:"Denmark",id:4096,tag:"en-DK",version:"Release 10.1"},"en-dm":{language:"English",location:"Dominica",id:4096,tag:"en-DM",version:"Release 10"},"en-er":{language:"English",location:"Eritrea",id:4096,tag:"en-ER",version:"Release 10"},"en-150":{language:"English",location:"Europe",id:4096,tag:"en-150",version:"Release 10"},"en-fk":{language:"English",location:"Falkland Islands",id:4096,tag:"en-FK",version:"Release 10"},"en-fi":{language:"English",location:"Finland",id:4096,tag:"en-FI",version:"Release 10.1"},"en-fj":{language:"English",location:"Fiji",id:4096,tag:"en-FJ",version:"Release 10"},"en-gm":{language:"English",location:"Gambia",id:4096,tag:"en-GM",version:"Release 10"},"en-de":{language:"English",location:"Germany",id:4096,tag:"en-DE",version:"Release 10.1"},"en-gh":{language:"English",location:"Ghana",id:4096,tag:"en-GH",version:"Release 10"},"en-gi":{language:"English",location:"Gibraltar",id:4096,tag:"en-GI",version:"Release 10"},"en-gd":{language:"English",location:"Grenada",id:4096,tag:"en-GD",version:"Release 10"},"en-gu":{language:"English",location:"Guam",id:4096,tag:"en-GU",version:"Release 10"},"en-gg":{language:"English",location:"Guernsey",id:4096,tag:"en-GG",version:"Release 10"},"en-gy":{language:"English",location:"Guyana",id:4096,tag:"en-GY",version:"Release 10"},"en-hk":{language:"English",location:"Hong Kong",id:15369,tag:"en-HK",version:"Release 8.1"},"en-in":{language:"English",location:"India",id:16393,tag:"en-IN",version:"Release V"},"en-ie":{language:"English",location:"Ireland",id:6153,tag:"en-IE",version:"Release A"},"en-im":{language:"English",location:"Isle of Man",id:4096,tag:"en-IM",version:"Release 10"},"en-il":{language:"English",location:"Israel",id:4096,tag:"en-IL",version:"Release 10.1"},"en-jm":{language:"English",location:"Jamaica",id:8201,tag:"en-JM",version:"Release B"},"en-je":{language:"English",location:"Jersey",id:4096,tag:"en-JE",version:"Release 10"},"en-ke":{language:"English",location:"Kenya",id:4096,tag:"en-KE",version:"Release 10"},"en-ki":{language:"English",location:"Kiribati",id:4096,tag:"en-KI",version:"Release 10"},"en-ls":{language:"English",location:"Lesotho",id:4096,tag:"en-LS",version:"Release 10"},"en-lr":{language:"English",location:"Liberia",id:4096,tag:"en-LR",version:"Release 10"},"en-mo":{language:"English",location:"Macao SAR",id:4096,tag:"en-MO",version:"Release 10"},"en-mg":{language:"English",location:"Madagascar",id:4096,tag:"en-MG",version:"Release 10"},"en-mw":{language:"English",location:"Malawi",id:4096,tag:"en-MW",version:"Release 10"},"en-my":{language:"English",location:"Malaysia",id:17417,tag:"en-MY",version:"Release V"},"en-mt":{language:"English",location:"Malta",id:4096,tag:"en-MT",version:"Release 10"},"en-mh":{language:"English",location:"Marshall Islands",id:4096,tag:"en-MH",version:"Release 10"},"en-mu":{language:"English",location:"Mauritius",id:4096,tag:"en-MU",version:"Release 10"},"en-fm":{language:"English",location:"Micronesia",id:4096,tag:"en-FM",version:"Release 10"},"en-ms":{language:"English",location:"Montserrat",id:4096,tag:"en-MS",version:"Release 10"},"en-na":{language:"English",location:"Namibia",id:4096,tag:"en-NA",version:"Release 10"},"en-nr":{language:"English",location:"Nauru",id:4096,tag:"en-NR",version:"Release 10"},"en-nl":{language:"English",location:"Netherlands",id:4096,tag:"en-NL",version:"Release 10.1"},"en-nz":{language:"English",location:"New Zealand",id:5129,tag:"en-NZ",version:"Release A"},"en-ng":{language:"English",location:"Nigeria",id:4096,tag:"en-NG",version:"Release 10"},"en-nu":{language:"English",location:"Niue",id:4096,tag:"en-NU",version:"Release 10"},"en-nf":{language:"English",location:"Norfolk Island",id:4096,tag:"en-NF",version:"Release 10"},"en-mp":{language:"English",location:"Northern Mariana Islands",id:4096,tag:"en-MP",version:"Release 10"},"en-pk":{language:"English",location:"Pakistan",id:4096,tag:"en-PK",version:"Release 10"},"en-pw":{language:"English",location:"Palau",id:4096,tag:"en-PW",version:"Release 10"},"en-pg":{language:"English",location:"Papua New Guinea",id:4096,tag:"en-PG",version:"Release 10"},"en-pn":{language:"English",location:"Pitcairn Islands",id:4096,tag:"en-PN",version:"Release 10"},"en-pr":{language:"English",location:"Puerto Rico",id:4096,tag:"en-PR",version:"Release 10"},"en-ph":{language:"English",location:"Republic of the Philippines",id:13321,tag:"en-PH",version:"Release C"},"en-rw":{language:"English",location:"Rwanda",id:4096,tag:"en-RW",version:"Release 10"},"en-kn":{language:"English",location:"Saint Kitts and Nevis",id:4096,tag:"en-KN",version:"Release 10"},"en-lc":{language:"English",location:"Saint Lucia",id:4096,tag:"en-LC",version:"Release 10"},"en-vc":{language:"English",location:"Saint Vincent and the Grenadines",id:4096,tag:"en-VC",version:"Release 10"},"en-ws":{language:"English",location:"Samoa",id:4096,tag:"en-WS",version:"Release 10"},"en-sc":{language:"English",location:"Seychelles",id:4096,tag:"en-SC",version:"Release 10"},"en-sl":{language:"English",location:"Sierra Leone",id:4096,tag:"en-SL",version:"Release 10"},"en-sg":{language:"English",location:"Singapore",id:18441,tag:"en-SG",version:"Release V"},"en-sx":{language:"English",location:"Sint Maarten",id:4096,tag:"en-SX",version:"Release 10"},"en-si":{language:"English",location:"Slovenia",id:4096,tag:"en-SI",version:"Release 10.1"},"en-sb":{language:"English",location:"Solomon Islands",id:4096,tag:"en-SB",version:"Release 10"},"en-za":{language:"English",location:"South Africa",id:7177,tag:"en-ZA",version:"Release B"},"en-ss":{language:"English",location:"South Sudan",id:4096,tag:"en-SS",version:"Release 10"},"en-sh":{language:"English",location:"St Helena, Ascension, Tristan da Cunha",id:4096,tag:"en-SH",version:"Release 10"},"en-sd":{language:"English",location:"Sudan",id:4096,tag:"en-SD",version:"Release 10"},"en-sz":{language:"English",location:"Swaziland",id:4096,tag:"en-SZ",version:"Release 10"},"en-se":{language:"English",location:"Sweden",id:4096,tag:"en-SE",version:"Release 10.1"},"en-ch":{language:"English",location:"Switzerland",id:4096,tag:"en-CH",version:"Release 10.1"},"en-tz":{language:"English",location:"Tanzania",id:4096,tag:"en-TZ",version:"Release 10"},"en-tk":{language:"English",location:"Tokelau",id:4096,tag:"en-TK",version:"Release 10"},"en-to":{language:"English",location:"Tonga",id:4096,tag:"en-TO",version:"Release 10"},"en-tt":{language:"English",location:"Trinidad and Tobago",id:11273,tag:"en-TT",version:"Release B"},"en-tc":{language:"English",location:"Turks and Caicos Islands",id:4096,tag:"en-TC",version:"Release 10"},"en-tv":{language:"English",location:"Tuvalu",id:4096,tag:"en-TV",version:"Release 10"},"en-ug":{language:"English",location:"Uganda",id:4096,tag:"en-UG",version:"Release 10"},"en-ae":{language:"English",location:"United Arab Emirates",id:19465,tag:"en-AE",version:"Release 10.5"},"en-gb":{language:"English",location:"United Kingdom",id:2057,tag:"en-GB",version:"Release A"},"en-us":{language:"English",location:"United States",id:1033,tag:"en-US",version:"Release A"},"en-um":{language:"English",location:"US Minor Outlying Islands",id:4096,tag:"en-UM",version:"Release 10"},"en-vi":{language:"English",location:"US Virgin Islands",id:4096,tag:"en-VI",version:"Release 10"},"en-vu":{language:"English",location:"Vanuatu",id:4096,tag:"en-VU",version:"Release 10"},"en-001":{language:"English",location:"World",id:4096,tag:"en-001",version:"Release 10"},"en-zm":{language:"English",location:"Zambia",id:4096,tag:"en-ZM",version:"Release 10"},"en-zw":{language:"English",location:"Zimbabwe",id:12297,tag:"en-ZW",version:"Release C"},eo:vi,"eo-001":{language:"Esperanto",location:"World",id:4096,tag:"eo-001",version:"Release 10"},et:mi,"et-ee":{language:"Estonian",location:"Estonia",id:1061,tag:"et-EE",version:"Release B"},ee:yi,"ee-gh":{language:"Ewe",location:"Ghana",id:4096,tag:"ee-GH",version:"Release 10"},"ee-tg":{language:"Ewe",location:"Togo",id:4096,tag:"ee-TG",version:"Release 10"},ewo:_i,"ewo-cm":{language:"Ewondo",location:"Cameroon",id:4096,tag:"ewo-CM",version:"Release 10"},fo:bi,"fo-dk":{language:"Faroese",location:"Denmark",id:4096,tag:"fo-DK",version:"Release 10.1"},"fo-fo":{language:"Faroese",location:"Faroe Islands",id:1080,tag:"fo-FO",version:"Release B"},fil:wi,"fil-ph":{language:"Filipino",location:"Philippines",id:1124,tag:"fil-PH",version:"Release E2"},fi:xi,"fi-fi":{language:"Finnish",location:"Finland",id:1035,tag:"fi-FI",version:"Release A"},fr:ki,"fr-dz":{language:"French",location:"Algeria",id:4096,tag:"fr-DZ",version:"Release 10"},"fr-be":{language:"French",location:"Belgium",id:2060,tag:"fr-BE",version:"Release A"},"fr-bj":{language:"French",location:"Benin",id:4096,tag:"fr-BJ",version:"Release 10"},"fr-bf":{language:"French",location:"Burkina Faso",id:4096,tag:"fr-BF",version:"Release 10"},"fr-bi":{language:"French",location:"Burundi",id:4096,tag:"fr-BI",version:"Release 10"},"fr-cm":{language:"French",location:"Cameroon",id:11276,tag:"fr-CM",version:"Release 8.1"},"fr-ca":{language:"French",location:"Canada",id:3084,tag:"fr-CA",version:"Release A"},"fr-cf":{language:"French",location:"Central African Republic",id:4096,tag:"fr-CF",version:"Release10"},"fr-td":{language:"French",location:"Chad",id:4096,tag:"fr-TD",version:"Release 10"},"fr-km":{language:"French",location:"Comoros",id:4096,tag:"fr-KM",version:"Release 10"},"fr-cg":{language:"French",location:"Congo",id:4096,tag:"fr-CG",version:"Release 10"},"fr-cd":{language:"French",location:"Congo, DRC",id:9228,tag:"fr-CD",version:"Release 8.1"},"fr-ci":{language:"French",location:"Côte d'Ivoire",id:12300,tag:"fr-CI",version:"Release 8.1"},"fr-dj":{language:"French",location:"Djibouti",id:4096,tag:"fr-DJ",version:"Release 10"},"fr-gq":{language:"French",location:"Equatorial Guinea",id:4096,tag:"fr-GQ",version:"Release 10"},"fr-fr":{language:"French",location:"France",id:1036,tag:"fr-FR",version:"Release A"},"fr-gf":{language:"French",location:"French Guiana",id:4096,tag:"fr-GF",version:"Release 10"},"fr-pf":{language:"French",location:"French Polynesia",id:4096,tag:"fr-PF",version:"Release 10"},"fr-ga":{language:"French",location:"Gabon",id:4096,tag:"fr-GA",version:"Release 10"},"fr-gp":{language:"French",location:"Guadeloupe",id:4096,tag:"fr-GP",version:"Release 10"},"fr-gn":{language:"French",location:"Guinea",id:4096,tag:"fr-GN",version:"Release 10"},"fr-ht":{language:"French",location:"Haiti",id:15372,tag:"fr-HT",version:"Release 8.1"},"fr-lu":{language:"French",location:"Luxembourg",id:5132,tag:"fr-LU",version:"Release A"},"fr-mg":{language:"French",location:"Madagascar",id:4096,tag:"fr-MG",version:"Release 10"},"fr-ml":{language:"French",location:"Mali",id:13324,tag:"fr-ML",version:"Release 8.1"},"fr-mq":{language:"French",location:"Martinique",id:4096,tag:"fr-MQ",version:"Release 10"},"fr-mr":{language:"French",location:"Mauritania",id:4096,tag:"fr-MR",version:"Release 10"},"fr-mu":{language:"French",location:"Mauritius",id:4096,tag:"fr-MU",version:"Release 10"},"fr-yt":{language:"French",location:"Mayotte",id:4096,tag:"fr-YT",version:"Release 10"},"fr-ma":{language:"French",location:"Morocco",id:14348,tag:"fr-MA",version:"Release 8.1"},"fr-nc":{language:"French",location:"New Caledonia",id:4096,tag:"fr-NC",version:"Release 10"},"fr-ne":{language:"French",location:"Niger",id:4096,tag:"fr-NE",version:"Release 10"},"fr-mc":{language:"French",location:"Principality of Monaco",id:6156,tag:"fr-MC",version:"Release A"},"fr-re":{language:"French",location:"Reunion",id:8204,tag:"fr-RE",version:"Release 8.1"},"fr-rw":{language:"French",location:"Rwanda",id:4096,tag:"fr-RW",version:"Release 10"},"fr-bl":{language:"French",location:"Saint Barthélemy",id:4096,tag:"fr-BL",version:"Release 10"},"fr-mf":{language:"French",location:"Saint Martin",id:4096,tag:"fr-MF",version:"Release 10"},"fr-pm":{language:"French",location:"Saint Pierre and Miquelon",id:4096,tag:"fr-PM",version:"Release 10"},"fr-sn":{language:"French",location:"Senegal",id:10252,tag:"fr-SN",version:"Release 8.1"},"fr-sc":{language:"French",location:"Seychelles",id:4096,tag:"fr-SC",version:"Release 10"},"fr-ch":{language:"French",location:"Switzerland",id:4108,tag:"fr-CH",version:"Release A"},"fr-sy":{language:"French",location:"Syria",id:4096,tag:"fr-SY",version:"Release 10"},"fr-tg":{language:"French",location:"Togo",id:4096,tag:"fr-TG",version:"Release 10"},"fr-tn":{language:"French",location:"Tunisia",id:4096,tag:"fr-TN",version:"Release 10"},"fr-vu":{language:"French",location:"Vanuatu",id:4096,tag:"fr-VU",version:"Release 10"},"fr-wf":{language:"French",location:"Wallis and Futuna",id:4096,tag:"fr-WF",version:"Release 10"},fy:Si,"fy-nl":{language:"Frisian",location:"Netherlands",id:1122,tag:"fy-NL",version:"Release E2"},fur:Ci,"fur-it":{language:"Friulian",location:"Italy",id:4096,tag:"fur-IT",version:"Release 10"},ff:Ei,"ff-latn":{language:"Fulah (Latin)",location:null,id:31847,tag:"ff-Latn",version:"Release 8"},"ff-latn-bf":{language:"Fulah (Latin)",location:"Burkina Faso",id:4096,tag:"ff-Latn-BF",version:"Release 10.4"},"ff-cm":{language:"Fulah",location:"Cameroon",id:4096,tag:"ff-CM",version:"Release 10"},"ff-latn-cm":{language:"Fulah (Latin)",location:"Cameroon",id:4096,tag:"ff-Latn-CM",version:"Release 10.4"},"ff-latn-gm":{language:"Fulah (Latin)",location:"Gambia",id:4096,tag:"ff-Latn-GM",version:"Release 10.4"},"ff-latn-gh":{language:"Fulah (Latin)",location:"Ghana",id:4096,tag:"ff-Latn-GH",version:"Release 10.4"},"ff-gn":{language:"Fulah",location:"Guinea",id:4096,tag:"ff-GN",version:"Release 10"},"ff-latn-gn":{language:"Fulah (Latin)",location:"Guinea",id:4096,tag:"ff-Latn-GN",version:"Release 10.4"},"ff-latn-gw":{language:"Fulah (Latin)",location:"Guinea-Bissau",id:4096,tag:"ff-Latn-GW",version:"Release 10.4"},"ff-latn-lr":{language:"Fulah (Latin)",location:"Liberia",id:4096,tag:"ff-Latn-LR",version:"Release 10.4"},"ff-mr":{language:"Fulah",location:"Mauritania",id:4096,tag:"ff-MR",version:"Release 10"},"ff-latn-mr":{language:"Fulah (Latin)",location:"Mauritania",id:4096,tag:"ff-Latn-MR",version:"Release 10.4"},"ff-latn-ne":{language:"Fulah (Latin)",location:"Niger",id:4096,tag:"ff-Latn-NE",version:"Release 10.4"},"ff-ng":{language:"Fulah",location:"Nigeria",id:4096,tag:"ff-NG",version:"Release 10"},"ff-latn-ng":{language:"Fulah (Latin)",location:"Nigeria",id:4096,tag:"ff-Latn-NG",version:"Release 10.4"},"ff-latn-sn":{language:"Fulah",location:"Senegal",id:2151,tag:"ff-Latn-SN",version:"Release 8"},"ff-latn-sl":{language:"Fulah (Latin)",location:"Sierra Leone",id:4096,tag:"ff-Latn-SL",version:"Release 10.4"},gl:Ai,"gl-es":{language:"Galician",location:"Spain",id:1110,tag:"gl-ES",version:"Release D"},lg:Ri,"lg-ug":{language:"Ganda",location:"Uganda",id:4096,tag:"lg-UG",version:"Release 10"},ka:Mi,"ka-ge":{language:"Georgian",location:"Georgia",id:1079,tag:"ka-GE",version:"Release C"},de:Ti,"de-at":{language:"German",location:"Austria",id:3079,tag:"de-AT",version:"Release A"},"de-be":{language:"German",location:"Belgium",id:4096,tag:"de-BE",version:"Release 10"},"de-de":{language:"German",location:"Germany",id:1031,tag:"de-DE",version:"Release A"},"de-it":{language:"German",location:"Italy",id:4096,tag:"de-IT",version:"Release 10.2"},"de-li":{language:"German",location:"Liechtenstein",id:5127,tag:"de-LI",version:"Release B"},"de-lu":{language:"German",location:"Luxembourg",id:4103,tag:"de-LU",version:"Release B"},"de-ch":{language:"German",location:"Switzerland",id:2055,tag:"de-CH",version:"Release A"},el:Bi,"el-cy":{language:"Greek",location:"Cyprus",id:4096,tag:"el-CY",version:"Release 10"},"el-gr":{language:"Greek",location:"Greece",id:1032,tag:"el-GR",version:"Release A"},kl:Ni,"kl-gl":{language:"Greenlandic",location:"Greenland",id:1135,tag:"kl-GL",version:"Release V"},gn:Di,"gn-py":{language:"Guarani",location:"Paraguay",id:1140,tag:"gn-PY",version:"Release 8.1"},gu:Pi,"gu-in":{language:"Gujarati",location:"India",id:1095,tag:"gu-IN",version:"Release D"},guz:Oi,"guz-ke":{language:"Gusii",location:"Kenya",id:4096,tag:"guz-KE",version:"Release 10"},ha:zi,"ha-latn":{language:"Hausa (Latin)",location:null,id:31848,tag:"ha-Latn",version:"Windows 7"},"ha-latn-gh":{language:"Hausa (Latin)",location:"Ghana",id:4096,tag:"ha-Latn-GH",version:"Release 10"},"ha-latn-ne":{language:"Hausa (Latin)",location:"Niger",id:4096,tag:"ha-Latn-NE",version:"Release 10"},"ha-latn-ng":{language:"Hausa (Latin)",location:"Nigeria",id:1128,tag:"ha-Latn-NG",version:"Release V"},haw:Fi,"haw-us":{language:"Hawaiian",location:"United States",id:1141,tag:"haw-US",version:"Release 8"},he:Li,"he-il":{language:"Hebrew",location:"Israel",id:1037,tag:"he-IL",version:"Release B"},hi:Ii,"hi-in":{language:"Hindi",location:"India",id:1081,tag:"hi-IN",version:"Release C"},hu:ji,"hu-hu":{language:"Hungarian",location:"Hungary",id:1038,tag:"hu-HU",version:"Release A"},is:Hi,"is-is":{language:"Icelandic",location:"Iceland",id:1039,tag:"is-IS",version:"Release A"},ig:Vi,"ig-ng":{language:"Igbo",location:"Nigeria",id:1136,tag:"ig-NG",version:"Release V"},id:Ui,"id-id":{language:"Indonesian",location:"Indonesia",id:1057,tag:"id-ID",version:"Release B"},ia:Gi,"ia-fr":{language:"Interlingua",location:"France",id:4096,tag:"ia-FR",version:"Release 10"},"ia-001":{language:"Interlingua",location:"World",id:4096,tag:"ia-001",version:"Release 10"},iu:Wi,"iu-latn":{language:"Inuktitut (Latin)",location:null,id:31837,tag:"iu-Latn",version:"Windows 7"},"iu-latn-ca":{language:"Inuktitut (Latin)",location:"Canada",id:2141,tag:"iu-Latn-CA",version:"Release E2"},"iu-cans":{language:"Inuktitut (Syllabics)",location:null,id:30813,tag:"iu-Cans",version:"Windows 7"},"iu-cans-ca":{language:"Inuktitut (Syllabics)",location:"Canada",id:1117,tag:"iu-Cans-CA",version:"Release V"},ga:Ki,"ga-ie":{language:"Irish",location:"Ireland",id:2108,tag:"ga-IE",version:"Release E2"},it:qi,"it-it":{language:"Italian",location:"Italy",id:1040,tag:"it-IT",version:"Release A"},"it-sm":{language:"Italian",location:"San Marino",id:4096,tag:"it-SM",version:"Release 10"},"it-ch":{language:"Italian",location:"Switzerland",id:2064,tag:"it-CH",version:"Release A"},"it-va":{language:"Italian",location:"Vatican City",id:4096,tag:"it-VA",version:"Release 10.3"},ja:Yi,"ja-jp":{language:"Japanese",location:"Japan",id:1041,tag:"ja-JP",version:"Release A"},jv:Xi,"jv-latn":{language:"Javanese",location:"Latin",id:4096,tag:"jv-Latn",version:"Release 8.1"},"jv-latn-id":{language:"Javanese",location:"Latin, Indonesia",id:4096,tag:"jv-Latn-ID",version:"Release 8.1"},dyo:$i,"dyo-sn":{language:"Jola-Fonyi",location:"Senegal",id:4096,tag:"dyo-SN",version:"Release 10"},kea:Zi,"kea-cv":{language:"Kabuverdianu",location:"Cabo Verde",id:4096,tag:"kea-CV",version:"Release 10"},kab:Ji,"kab-dz":{language:"Kabyle",location:"Algeria",id:4096,tag:"kab-DZ",version:"Release 10"},kkj:Qi,"kkj-cm":{language:"Kako",location:"Cameroon",id:4096,tag:"kkj-CM",version:"Release 10"},kln:ea,"kln-ke":{language:"Kalenjin",location:"Kenya",id:4096,tag:"kln-KE",version:"Release 10"},kam:ta,"kam-ke":{language:"Kamba",location:"Kenya",id:4096,tag:"kam-KE",version:"Release 10"},kn:na,"kn-in":{language:"Kannada",location:"India",id:1099,tag:"kn-IN",version:"Release D"},ks:ia,"ks-arab":{language:"Kashmiri",location:"Perso-Arabic",id:1120,tag:"ks-Arab",version:"Release 10"},"ks-arab-in":{language:"Kashmiri",location:"Perso-Arabic",id:4096,tag:"ks-Arab-IN",version:"Release 10"},kk:aa,"kk-kz":{language:"Kazakh",location:"Kazakhstan",id:1087,tag:"kk-KZ",version:"Release C"},km:ra,"km-kh":{language:"Khmer",location:"Cambodia",id:1107,tag:"km-KH",version:"Release V"},quc:oa,"quc-latn-gt":{language:"K'iche",location:"Guatemala",id:1158,tag:"quc-Latn-GT",version:"Release 10"},ki:sa,"ki-ke":{language:"Kikuyu",location:"Kenya",id:4096,tag:"ki-KE",version:"Release 10"},rw:la,"rw-rw":{language:"Kinyarwanda",location:"Rwanda",id:1159,tag:"rw-RW",version:"Release V"},sw:ua,"sw-ke":{language:"Kiswahili",location:"Kenya",id:1089,tag:"sw-KE",version:"Release C"},"sw-tz":{language:"Kiswahili",location:"Tanzania",id:4096,tag:"sw-TZ",version:"Release 10"},"sw-ug":{language:"Kiswahili",location:"Uganda",id:4096,tag:"sw-UG",version:"Release 10"},kok:ha,"kok-in":{language:"Konkani",location:"India",id:1111,tag:"kok-IN",version:"Release C"},ko:ca,"ko-kr":{language:"Korean",location:"Korea",id:1042,tag:"ko-KR",version:"Release A"},"ko-kp":{language:"Korean",location:"North Korea",id:4096,tag:"ko-KP",version:"Release 10.1"},khq:fa,"khq-ml":{language:"Koyra Chiini",location:"Mali",id:4096,tag:"khq-ML",version:"Release 10"},ses:da,"ses-ml":{language:"Koyraboro Senni",location:"Mali",id:4096,tag:"ses-ML",version:"Release 10"},nmg:ga,"nmg-cm":{language:"Kwasio",location:"Cameroon",id:4096,tag:"nmg-CM",version:"Release 10"},ky:pa,"ky-kg":{language:"Kyrgyz",location:"Kyrgyzstan",id:1088,tag:"ky-KG",version:"Release D"},"ku-arab-ir":{language:"Kurdish",location:"Perso-Arabic, Iran",id:4096,tag:"ku-Arab-IR",version:"Release 10.1"},lkt:va,"lkt-us":{language:"Lakota",location:"United States",id:4096,tag:"lkt-US",version:"Release 10"},lag:ma,"lag-tz":{language:"Langi",location:"Tanzania",id:4096,tag:"lag-TZ",version:"Release 10"},lo:ya,"lo-la":{language:"Lao",location:"Lao P.D.R.",id:1108,tag:"lo-LA",version:"Release V"},lv:_a,"lv-lv":{language:"Latvian",location:"Latvia",id:1062,tag:"lv-LV",version:"Release B"},ln:ba,"ln-ao":{language:"Lingala",location:"Angola",id:4096,tag:"ln-AO",version:"Release 10"},"ln-cf":{language:"Lingala",location:"Central African Republic",id:4096,tag:"ln-CF",version:"Release 10"},"ln-cg":{language:"Lingala",location:"Congo",id:4096,tag:"ln-CG",version:"Release 10"},"ln-cd":{language:"Lingala",location:"Congo DRC",id:4096,tag:"ln-CD",version:"Release 10"},lt:wa,"lt-lt":{language:"Lithuanian",location:"Lithuania",id:1063,tag:"lt-LT",version:"Release B"},nds:xa,"nds-de":{language:"Low German",location:"Germany",id:4096,tag:"nds-DE",version:"Release 10.2"},"nds-nl":{language:"Low German",location:"Netherlands",id:4096,tag:"nds-NL",version:"Release 10.2"},dsb:ka,"dsb-de":{language:"Lower Sorbian",location:"Germany",id:2094,tag:"dsb-DE",version:"Release V"},lu:Sa,"lu-cd":{language:"Luba-Katanga",location:"Congo DRC",id:4096,tag:"lu-CD",version:"Release 10"},luo:Ca,"luo-ke":{language:"Luo",location:"Kenya",id:4096,tag:"luo-KE",version:"Release 10"},lb:Ea,"lb-lu":{language:"Luxembourgish",location:"Luxembourg",id:1134,tag:"lb-LU",version:"Release E2"},luy:Aa,"luy-ke":{language:"Luyia",location:"Kenya",id:4096,tag:"luy-KE",version:"Release 10"},mk:Ra,"mk-mk":{language:"Macedonian",location:"North Macedonia",id:1071,tag:"mk-MK",version:"Release C"},jmc:Ma,"jmc-tz":{language:"Machame",location:"Tanzania",id:4096,tag:"jmc-TZ",version:"Release 10"},mgh:Ta,"mgh-mz":{language:"Makhuwa-Meetto",location:"Mozambique",id:4096,tag:"mgh-MZ",version:"Release 10"},kde:Ba,"kde-tz":{language:"Makonde",location:"Tanzania",id:4096,tag:"kde-TZ",version:"Release 10"},mg:Na,"mg-mg":{language:"Malagasy",location:"Madagascar",id:4096,tag:"mg-MG",version:"Release 8.1"},ms:Da,"ms-bn":{language:"Malay",location:"Brunei Darussalam",id:2110,tag:"ms-BN",version:"Release C"},"ms-my":{language:"Malay",location:"Malaysia",id:1086,tag:"ms-MY",version:"Release C"},ml:Pa,"ml-in":{language:"Malayalam",location:"India",id:1100,tag:"ml-IN",version:"Release E1"},mt:Oa,"mt-mt":{language:"Maltese",location:"Malta",id:1082,tag:"mt-MT",version:"Release E1"},gv:za,"gv-im":{language:"Manx",location:"Isle of Man",id:4096,tag:"gv-IM",version:"Release 10"},mi:Fa,"mi-nz":{language:"Maori",location:"New Zealand",id:1153,tag:"mi-NZ",version:"Release E1"},arn:La,"arn-cl":{language:"Mapudungun",location:"Chile",id:1146,tag:"arn-CL",version:"Release E2"},mr:Ia,"mr-in":{language:"Marathi",location:"India",id:1102,tag:"mr-IN",version:"Release C"},mas:ja,"mas-ke":{language:"Masai",location:"Kenya",id:4096,tag:"mas-KE",version:"Release 10"},"mas-tz":{language:"Masai",location:"Tanzania",id:4096,tag:"mas-TZ",version:"Release 10"},"mzn-ir":{language:"Mazanderani",location:"Iran",id:4096,tag:"mzn-IR",version:"Release 10.1"},mer:Ha,"mer-ke":{language:"Meru",location:"Kenya",id:4096,tag:"mer-KE",version:"Release 10"},mgo:Va,"mgo-cm":{language:"Meta'",location:"Cameroon",id:4096,tag:"mgo-CM",version:"Release 10"},moh:Ua,"moh-ca":{language:"Mohawk",location:"Canada",id:1148,tag:"moh-CA",version:"Release E2"},mn:Ga,"mn-cyrl":{language:"Mongolian (Cyrillic)",location:null,id:30800,tag:"mn-Cyrl",version:"Windows 7"},"mn-mn":{language:"Mongolian (Cyrillic)",location:"Mongolia",id:1104,tag:"mn-MN",version:"Release D"},"mn-mong":{language:"Mongolian (Traditional Mongolian)",location:null,id:31824,tag:"mn-Mong",version:"Windows 7"},"mn-mong-cn":{language:"Mongolian (Traditional Mongolian)",location:"People's Republic of China",id:2128,tag:"mn-Mong-CN",version:"Windows V"},"mn-mong-mn":{language:"Mongolian (Traditional Mongolian)",location:"Mongolia",id:3152,tag:"mn-Mong-MN",version:"Windows 7"},mfe:Wa,"mfe-mu":{language:"Morisyen",location:"Mauritius",id:4096,tag:"mfe-MU",version:"Release 10"},mua:Ka,"mua-cm":{language:"Mundang",location:"Cameroon",id:4096,tag:"mua-CM",version:"Release 10"},nqo:qa,"nqo-gn":{language:"N'ko",location:"Guinea",id:4096,tag:"nqo-GN",version:"Release 8.1"},naq:Ya,"naq-na":{language:"Nama",location:"Namibia",id:4096,tag:"naq-NA",version:"Release 10"},ne:Xa,"ne-in":{language:"Nepali",location:"India",id:2145,tag:"ne-IN",version:"Release 8.1"},"ne-np":{language:"Nepali",location:"Nepal",id:1121,tag:"ne-NP",version:"Release E2"},nnh:$a,"nnh-cm":{language:"Ngiemboon",location:"Cameroon",id:4096,tag:"nnh-CM",version:"Release 10"},jgo:Za,"jgo-cm":{language:"Ngomba",location:"Cameroon",id:4096,tag:"jgo-CM",version:"Release 10"},"lrc-iq":{language:"Northern Luri",location:"Iraq",id:4096,tag:"lrc-IQ",version:"Release 10.1"},"lrc-ir":{language:"Northern Luri",location:"Iran",id:4096,tag:"lrc-IR",version:"Release 10.1"},nd:Ja,"nd-zw":{language:"North Ndebele",location:"Zimbabwe",id:4096,tag:"nd-ZW",version:"Release 10"},no:Qa,nb:er,"nb-no":{language:"Norwegian (Bokmal)",location:"Norway",id:1044,tag:"nb-NO",version:"Release A"},nn:tr,"nn-no":{language:"Norwegian (Nynorsk)",location:"Norway",id:2068,tag:"nn-NO",version:"Release A"},"nb-sj":{language:"Norwegian Bokmål",location:"Svalbard and Jan Mayen",id:4096,tag:"nb-SJ",version:"Release 10"},nus:nr,"nus-sd":{language:"Nuer",location:"Sudan",id:4096,tag:"nus-SD",version:"Release 10"},"nus-ss":{language:"Nuer",location:"South Sudan",id:4096,tag:"nus-SS",version:"Release 10.1"},nyn:ir,"nyn-ug":{language:"Nyankole",location:"Uganda",id:4096,tag:"nyn-UG",version:"Release 10"},oc:ar,"oc-fr":{language:"Occitan",location:"France",id:1154,tag:"oc-FR",version:"Release V"},or:rr,"or-in":{language:"Odia",location:"India",id:1096,tag:"or-IN",version:"Release V"},om:or,"om-et":{language:"Oromo",location:"Ethiopia",id:1138,tag:"om-ET",version:"Release 8.1"},"om-ke":{language:"Oromo",location:"Kenya",id:4096,tag:"om-KE",version:"Release 10"},os:sr,"os-ge":{language:"Ossetian",location:"Cyrillic, Georgia",id:4096,tag:"os-GE",version:"Release 10"},"os-ru":{language:"Ossetian",location:"Cyrillic, Russia",id:4096,tag:"os-RU",version:"Release 10"},ps:lr,"ps-af":{language:"Pashto",location:"Afghanistan",id:1123,tag:"ps-AF",version:"Release E2"},"ps-pk":{language:"Pashto",location:"Pakistan",id:4096,tag:"ps-PK",version:"Release 10.5"},fa:ur,"fa-af":{language:"Persian",location:"Afghanistan",id:4096,tag:"fa-AF",version:"Release 10"},"fa-ir":{language:"Persian",location:"Iran",id:1065,tag:"fa-IR",version:"Release B"},pl:hr,"pl-pl":{language:"Polish",location:"Poland",id:1045,tag:"pl-PL",version:"Release A"},pt:cr,"pt-ao":{language:"Portuguese",location:"Angola",id:4096,tag:"pt-AO",version:"Release 8.1"},"pt-br":{language:"Portuguese",location:"Brazil",id:1046,tag:"pt-BR",version:"Release A"},"pt-cv":{language:"Portuguese",location:"Cabo Verde",id:4096,tag:"pt-CV",version:"Release 10"},"pt-gq":{language:"Portuguese",location:"Equatorial Guinea",id:4096,tag:"pt-GQ",version:"Release 10.2"},"pt-gw":{language:"Portuguese",location:"Guinea-Bissau",id:4096,tag:"pt-GW",version:"Release 10"},"pt-lu":{language:"Portuguese",location:"Luxembourg",id:4096,tag:"pt-LU",version:"Release 10.2"},"pt-mo":{language:"Portuguese",location:"Macao SAR",id:4096,tag:"pt-MO",version:"Release 10"},"pt-mz":{language:"Portuguese",location:"Mozambique",id:4096,tag:"pt-MZ",version:"Release 10"},"pt-pt":{language:"Portuguese",location:"Portugal",id:2070,tag:"pt-PT",version:"Release A"},"pt-st":{language:"Portuguese",location:"São Tomé and Príncipe",id:4096,tag:"pt-ST",version:"Release 10"},"pt-ch":{language:"Portuguese",location:"Switzerland",id:4096,tag:"pt-CH",version:"Release 10.2"},"pt-tl":{language:"Portuguese",location:"Timor-Leste",id:4096,tag:"pt-TL",version:"Release 10"},"prg-001":{language:"Prussian",location:null,id:4096,tag:"prg-001",version:"Release 10.1"},"qps-ploca":{language:"Pseudo Language",location:"Pseudo locale for east Asian/complex script localization testing",id:1534,tag:"qps-ploca",version:"Release 7"},"qps-ploc":{language:"Pseudo Language",location:"Pseudo locale used for localization testing",id:1281,tag:"qps-ploc",version:"Release 7"},"qps-plocm":{language:"Pseudo Language",location:"Pseudo locale used for localization testing of mirrored locales",id:2559,tag:"qps-plocm",version:"Release 7"},pa:fr,"pa-arab":{language:"Punjabi",location:null,id:31814,tag:"pa-Arab",version:"Release 8"},"pa-in":{language:"Punjabi",location:"India",id:1094,tag:"pa-IN",version:"Release D"},"pa-arab-pk":{language:"Punjabi",location:"Islamic Republic of Pakistan",id:2118,tag:"pa-Arab-PK",version:"Release 8"},quz:dr,"quz-bo":{language:"Quechua",location:"Bolivia",id:1131,tag:"quz-BO",version:"Release E1"},"quz-ec":{language:"Quechua",location:"Ecuador",id:2155,tag:"quz-EC",version:"Release E1"},"quz-pe":{language:"Quechua",location:"Peru",id:3179,tag:"quz-PE",version:"Release E1"},ksh:gr,"ksh-de":{language:"Ripuarian",location:"Germany",id:4096,tag:"ksh-DE",version:"Release 10"},ro:pr,"ro-md":{language:"Romanian",location:"Moldova",id:2072,tag:"ro-MD",version:"Release 8.1"},"ro-ro":{language:"Romanian",location:"Romania",id:1048,tag:"ro-RO",version:"Release A"},rm:vr,"rm-ch":{language:"Romansh",location:"Switzerland",id:1047,tag:"rm-CH",version:"Release E2"},rof:mr,"rof-tz":{language:"Rombo",location:"Tanzania",id:4096,tag:"rof-TZ",version:"Release 10"},rn:yr,"rn-bi":{language:"Rundi",location:"Burundi",id:4096,tag:"rn-BI",version:"Release 10"},ru:_r,"ru-by":{language:"Russian",location:"Belarus",id:4096,tag:"ru-BY",version:"Release 10"},"ru-kz":{language:"Russian",location:"Kazakhstan",id:4096,tag:"ru-KZ",version:"Release 10"},"ru-kg":{language:"Russian",location:"Kyrgyzstan",id:4096,tag:"ru-KG",version:"Release 10"},"ru-md":{language:"Russian",location:"Moldova",id:2073,tag:"ru-MD",version:"Release 10"},"ru-ru":{language:"Russian",location:"Russia",id:1049,tag:"ru-RU",version:"Release A"},"ru-ua":{language:"Russian",location:"Ukraine",id:4096,tag:"ru-UA",version:"Release 10"},rwk:br,"rwk-tz":{language:"Rwa",location:"Tanzania",id:4096,tag:"rwk-TZ",version:"Release 10"},ssy:wr,"ssy-er":{language:"Saho",location:"Eritrea",id:4096,tag:"ssy-ER",version:"Release 10"},sah:xr,"sah-ru":{language:"Sakha",location:"Russia",id:1157,tag:"sah-RU",version:"Release V"},saq:kr,"saq-ke":{language:"Samburu",location:"Kenya",id:4096,tag:"saq-KE",version:"Release 10"},smn:Sr,"smn-fi":{language:"Sami (Inari)",location:"Finland",id:9275,tag:"smn-FI",version:"Release E1"},smj:Cr,"smj-no":{language:"Sami (Lule)",location:"Norway",id:4155,tag:"smj-NO",version:"Release E1"},"smj-se":{language:"Sami (Lule)",location:"Sweden",id:5179,tag:"smj-SE",version:"Release E1"},se:Er,"se-fi":{language:"Sami (Northern)",location:"Finland",id:3131,tag:"se-FI",version:"Release E1"},"se-no":{language:"Sami (Northern)",location:"Norway",id:1083,tag:"se-NO",version:"Release E1"},"se-se":{language:"Sami (Northern)",location:"Sweden",id:2107,tag:"se-SE",version:"Release E1"},sms:Ar,"sms-fi":{language:"Sami (Skolt)",location:"Finland",id:8251,tag:"sms-FI",version:"Release E1"},sma:Rr,"sma-no":{language:"Sami (Southern)",location:"Norway",id:6203,tag:"sma-NO",version:"Release E1"},"sma-se":{language:"Sami (Southern)",location:"Sweden",id:7227,tag:"sma-SE",version:"Release E1"},sg:Mr,"sg-cf":{language:"Sango",location:"Central African Republic",id:4096,tag:"sg-CF",version:"Release 10"},sbp:Tr,"sbp-tz":{language:"Sangu",location:"Tanzania",id:4096,tag:"sbp-TZ",version:"Release 10"},sa:Br,"sa-in":{language:"Sanskrit",location:"India",id:1103,tag:"sa-IN",version:"Release C"},gd:Nr,"gd-gb":{language:"Scottish Gaelic",location:"United Kingdom",id:1169,tag:"gd-GB",version:"Release 7"},seh:Dr,"seh-mz":{language:"Sena",location:"Mozambique",id:4096,tag:"seh-MZ",version:"Release 10"},"sr-cyrl":{language:"Serbian (Cyrillic)",location:null,id:27674,tag:"sr-Cyrl",version:"Windows 7"},"sr-cyrl-ba":{language:"Serbian (Cyrillic)",location:"Bosnia and Herzegovina",id:7194,tag:"sr-Cyrl-BA",version:"Release E1"},"sr-cyrl-me":{language:"Serbian (Cyrillic)",location:"Montenegro",id:12314,tag:"sr-Cyrl-ME",version:"Release 7"},"sr-cyrl-rs":{language:"Serbian (Cyrillic)",location:"Serbia",id:10266,tag:"sr-Cyrl-RS",version:"Release 7"},"sr-cyrl-cs":{language:"Serbian (Cyrillic)",location:"Serbia and Montenegro (Former)",id:3098,tag:"sr-Cyrl-CS",version:"Release B"},"sr-latn":{language:"Serbian (Latin)",location:null,id:28698,tag:"sr-Latn",version:"Windows 7"},sr:Pr,"sr-latn-ba":{language:"Serbian (Latin)",location:"Bosnia and Herzegovina",id:6170,tag:"sr-Latn-BA",version:"Release E1"},"sr-latn-me":{language:"Serbian (Latin)",location:"Montenegro",id:11290,tag:"sr-Latn-ME",version:"Release 7"},"sr-latn-rs":{language:"Serbian (Latin)",location:"Serbia",id:9242,tag:"sr-Latn-RS",version:"Release 7"},"sr-latn-cs":{language:"Serbian (Latin)",location:"Serbia and Montenegro (Former)",id:2074,tag:"sr-Latn-CS",version:"Release B"},nso:Or,"nso-za":{language:"Sesotho sa Leboa",location:"South Africa",id:1132,tag:"nso-ZA",version:"Release E1"},tn:zr,"tn-bw":{language:"Setswana",location:"Botswana",id:2098,tag:"tn-BW",version:"Release 8"},"tn-za":{language:"Setswana",location:"South Africa",id:1074,tag:"tn-ZA",version:"Release E1"},ksb:Fr,"ksb-tz":{language:"Shambala",location:"Tanzania",id:4096,tag:"ksb-TZ",version:"Release 10"},sn:Lr,"sn-latn":{language:"Shona",location:"Latin",id:4096,tag:"sn-Latn",version:"Release 8.1"},"sn-latn-zw":{language:"Shona",location:"Zimbabwe",id:4096,tag:"sn-Latn-ZW",version:"Release 8.1"},sd:Ir,"sd-arab":{language:"Sindhi",location:null,id:31833,tag:"sd-Arab",version:"Release 8"},"sd-arab-pk":{language:"Sindhi",location:"Islamic Republic of Pakistan",id:2137,tag:"sd-Arab-PK",version:"Release 8"},si:jr,"si-lk":{language:"Sinhala",location:"Sri Lanka",id:1115,tag:"si-LK",version:"Release V"},sk:Hr,"sk-sk":{language:"Slovak",location:"Slovakia",id:1051,tag:"sk-SK",version:"Release A"},sl:Vr,"sl-si":{language:"Slovenian",location:"Slovenia",id:1060,tag:"sl-SI",version:"Release A"},xog:Ur,"xog-ug":{language:"Soga",location:"Uganda",id:4096,tag:"xog-UG",version:"Release 10"},so:Gr,"so-dj":{language:"Somali",location:"Djibouti",id:4096,tag:"so-DJ",version:"Release 10"},"so-et":{language:"Somali",location:"Ethiopia",id:4096,tag:"so-ET",version:"Release 10"},"so-ke":{language:"Somali",location:"Kenya",id:4096,tag:"so-KE",version:"Release 10"},"so-so":{language:"Somali",location:"Somalia",id:1143,tag:"so-SO",version:"Release 8.1"},st:Wr,"st-za":{language:"Sotho",location:"South Africa",id:1072,tag:"st-ZA",version:"Release 8.1"},nr:Kr,"nr-za":{language:"South Ndebele",location:"South Africa",id:4096,tag:"nr-ZA",version:"Release 10"},"st-ls":{language:"Southern Sotho",location:"Lesotho",id:4096,tag:"st-LS",version:"Release 10"},es:qr,"es-ar":{language:"Spanish",location:"Argentina",id:11274,tag:"es-AR",version:"Release B"},"es-bz":{language:"Spanish",location:"Belize",id:4096,tag:"es-BZ",version:"Release 10.3"},"es-ve":{language:"Spanish",location:"Bolivarian Republic of Venezuela",id:8202,tag:"es-VE",version:"Release B"},"es-bo":{language:"Spanish",location:"Bolivia",id:16394,tag:"es-BO",version:"Release B"},"es-br":{language:"Spanish",location:"Brazil",id:4096,tag:"es-BR",version:"Release 10.2"},"es-cl":{language:"Spanish",location:"Chile",id:13322,tag:"es-CL",version:"Release B"},"es-co":{language:"Spanish",location:"Colombia",id:9226,tag:"es-CO",version:"Release B"},"es-cr":{language:"Spanish",location:"Costa Rica",id:5130,tag:"es-CR",version:"Release B"},"es-cu":{language:"Spanish",location:"Cuba",id:23562,tag:"es-CU",version:"Release 10"},"es-do":{language:"Spanish",location:"Dominican Republic",id:7178,tag:"es-DO",version:"Release B"},"es-ec":{language:"Spanish",location:"Ecuador",id:12298,tag:"es-EC",version:"Release B"},"es-sv":{language:"Spanish",location:"El Salvador",id:17418,tag:"es-SV",version:"Release B"},"es-gq":{language:"Spanish",location:"Equatorial Guinea",id:4096,tag:"es-GQ",version:"Release 10"},"es-gt":{language:"Spanish",location:"Guatemala",id:4106,tag:"es-GT",version:"Release B"},"es-hn":{language:"Spanish",location:"Honduras",id:18442,tag:"es-HN",version:"Release B"},"es-419":{language:"Spanish",location:"Latin America",id:22538,tag:"es-419",version:"Release 8.1"},"es-mx":{language:"Spanish",location:"Mexico",id:2058,tag:"es-MX",version:"Release A"},"es-ni":{language:"Spanish",location:"Nicaragua",id:19466,tag:"es-NI",version:"Release B"},"es-pa":{language:"Spanish",location:"Panama",id:6154,tag:"es-PA",version:"Release B"},"es-py":{language:"Spanish",location:"Paraguay",id:15370,tag:"es-PY",version:"Release B"},"es-pe":{language:"Spanish",location:"Peru",id:10250,tag:"es-PE",version:"Release B"},"es-ph":{language:"Spanish",location:"Philippines",id:4096,tag:"es-PH",version:"Release 10"},"es-pr":{language:"Spanish",location:"Puerto Rico",id:20490,tag:"es-PR",version:"Release B"},"es-es_tradnl":{language:"Spanish",location:"Spain",id:1034,tag:"es-ES_tradnl",version:"Release A"},"es-es":{language:"Spanish",location:"Spain",id:3082,tag:"es-ES",version:"Release A"},"es-us":{language:"Spanish",location:"UnitedStates",id:21514,tag:"es-US",version:"Release V"},"es-uy":{language:"Spanish",location:"Uruguay",id:14346,tag:"es-UY",version:"Release B"},zgh:Yr,"zgh-tfng-ma":{language:"Standard Moroccan Tamazight",location:"Morocco",id:4096,tag:"zgh-Tfng-MA",version:"Release 8.1"},"zgh-tfng":{language:"Standard Moroccan Tamazight",location:"Tifinagh",id:4096,tag:"zgh-Tfng",version:"Release 8.1"},ss:Xr,"ss-za":{language:"Swati",location:"South Africa",id:4096,tag:"ss-ZA",version:"Release 10"},"ss-sz":{language:"Swati",location:"Swaziland",id:4096,tag:"ss-SZ",version:"Release 10"},sv:$r,"sv-ax":{language:"Swedish",location:"Åland Islands",id:4096,tag:"sv-AX",version:"Release 10"},"sv-fi":{language:"Swedish",location:"Finland",id:2077,tag:"sv-FI",version:"Release B"},"sv-se":{language:"Swedish",location:"Sweden",id:1053,tag:"sv-SE",version:"Release A"},syr:Zr,"syr-sy":{language:"Syriac",location:"Syria",id:1114,tag:"syr-SY",version:"Release D"},shi:Jr,"shi-tfng":{language:"Tachelhit",location:"Tifinagh",id:4096,tag:"shi-Tfng",version:"Release 10"},"shi-tfng-ma":{language:"Tachelhit",location:"Tifinagh, Morocco",id:4096,tag:"shi-Tfng-MA",version:"Release 10"},"shi-latn":{language:"Tachelhit (Latin)",location:null,id:4096,tag:"shi-Latn",version:"Release 10"},"shi-latn-ma":{language:"Tachelhit (Latin)",location:"Morocco",id:4096,tag:"shi-Latn-MA",version:"Release 10"},dav:Qr,"dav-ke":{language:"Taita",location:"Kenya",id:4096,tag:"dav-KE",version:"Release 10"},tg:eo,"tg-cyrl":{language:"Tajik (Cyrillic)",location:null,id:31784,tag:"tg-Cyrl",version:"Windows 7"},"tg-cyrl-tj":{language:"Tajik (Cyrillic)",location:"Tajikistan",id:1064,tag:"tg-Cyrl-TJ",version:"Release V"},tzm:to,"tzm-latn":{language:"Tamazight (Latin)",location:null,id:31839,tag:"tzm-Latn",version:"Windows 7"},"tzm-latn-dz":{language:"Tamazight (Latin)",location:"Algeria",id:2143,tag:"tzm-Latn-DZ",version:"Release V"},ta:no,"ta-in":{language:"Tamil",location:"India",id:1097,tag:"ta-IN",version:"Release C"},"ta-my":{language:"Tamil",location:"Malaysia",id:4096,tag:"ta-MY",version:"Release 10"},"ta-sg":{language:"Tamil",location:"Singapore",id:4096,tag:"ta-SG",version:"Release 10"},"ta-lk":{language:"Tamil",location:"Sri Lanka",id:2121,tag:"ta-LK",version:"Release 8"},twq:io,"twq-ne":{language:"Tasawaq",location:"Niger",id:4096,tag:"twq-NE",version:"Release 10"},tt:ao,"tt-ru":{language:"Tatar",location:"Russia",id:1092,tag:"tt-RU",version:"Release D"},te:ro,"te-in":{language:"Telugu",location:"India",id:1098,tag:"te-IN",version:"Release D"},teo:oo,"teo-ke":{language:"Teso",location:"Kenya",id:4096,tag:"teo-KE",version:"Release 10"},"teo-ug":{language:"Teso",location:"Uganda",id:4096,tag:"teo-UG",version:"Release 10"},th:so,"th-th":{language:"Thai",location:"Thailand",id:1054,tag:"th-TH",version:"Release B"},bo:lo,"bo-in":{language:"Tibetan",location:"India",id:4096,tag:"bo-IN",version:"Release 10"},"bo-cn":{language:"Tibetan",location:"People's Republic of China",id:1105,tag:"bo-CN",version:"Release V"},tig:uo,"tig-er":{language:"Tigre",location:"Eritrea",id:4096,tag:"tig-ER",version:"Release 10"},ti:ho,"ti-er":{language:"Tigrinya",location:"Eritrea",id:2163,tag:"ti-ER",version:"Release 8"},"ti-et":{language:"Tigrinya",location:"Ethiopia",id:1139,tag:"ti-ET",version:"Release 8"},to:co,"to-to":{language:"Tongan",location:"Tonga",id:4096,tag:"to-TO",version:"Release 10"},ts:fo,"ts-za":{language:"Tsonga",location:"South Africa",id:1073,tag:"ts-ZA",version:"Release 8.1"},tr:go,"tr-cy":{language:"Turkish",location:"Cyprus",id:4096,tag:"tr-CY",version:"Release 10"},"tr-tr":{language:"Turkish",location:"Turkey",id:1055,tag:"tr-TR",version:"Release A"},tk:po,"tk-tm":{language:"Turkmen",location:"Turkmenistan",id:1090,tag:"tk-TM",version:"Release V"},uk:vo,"uk-ua":{language:"Ukrainian",location:"Ukraine",id:1058,tag:"uk-UA",version:"Release B"},hsb:mo,"hsb-de":{language:"Upper Sorbian",location:"Germany",id:1070,tag:"hsb-DE",version:"Release V"},ur:yo,"ur-in":{language:"Urdu",location:"India",id:2080,tag:"ur-IN",version:"Release 8.1"},"ur-pk":{language:"Urdu",location:"Islamic Republic of Pakistan",id:1056,tag:"ur-PK",version:"Release C"},ug:_o,"ug-cn":{language:"Uyghur",location:"People's Republic of China",id:1152,tag:"ug-CN",version:"Release V"},"uz-arab":{language:"Uzbek",location:"Perso-Arabic",id:4096,tag:"uz-Arab",version:"Release 10"},"uz-arab-af":{language:"Uzbek",location:"Perso-Arabic, Afghanistan",id:4096,tag:"uz-Arab-AF",version:"Release 10"},"uz-cyrl":{language:"Uzbek (Cyrillic)",location:null,id:30787,tag:"uz-Cyrl",version:"Windows 7"},"uz-cyrl-uz":{language:"Uzbek (Cyrillic)",location:"Uzbekistan",id:2115,tag:"uz-Cyrl-UZ",version:"Release C"},uz:bo,"uz-latn":{language:"Uzbek (Latin)",location:null,id:31811,tag:"uz-Latn",version:"Windows7"},"uz-latn-uz":{language:"Uzbek (Latin)",location:"Uzbekistan",id:1091,tag:"uz-Latn-UZ",version:"Release C"},vai:wo,"vai-vaii":{language:"Vai",location:null,id:4096,tag:"vai-Vaii",version:"Release 10"},"vai-vaii-lr":{language:"Vai",location:"Liberia",id:4096,tag:"vai-Vaii-LR",version:"Release 10"},"vai-latn-lr":{language:"Vai (Latin)",location:"Liberia",id:4096,tag:"vai-Latn-LR",version:"Release 10"},"vai-latn":{language:"Vai (Latin)",location:null,id:4096,tag:"vai-Latn",version:"Release 10"},"ca-es-":{language:"Valencian",location:"Spain",id:2051,tag:"ca-ES-",version:"Release 8"},ve:xo,"ve-za":{language:"Venda",location:"South Africa",id:1075,tag:"ve-ZA",version:"Release 10"},vi:ko,"vi-vn":{language:"Vietnamese",location:"Vietnam",id:1066,tag:"vi-VN",version:"Release B"},vo:So,"vo-001":{language:"Volapük",location:"World",id:4096,tag:"vo-001",version:"Release 10"},vun:Co,"vun-tz":{language:"Vunjo",location:"Tanzania",id:4096,tag:"vun-TZ",version:"Release 10"},wae:Eo,"wae-ch":{language:"Walser",location:"Switzerland",id:4096,tag:"wae-CH",version:"Release 10"},cy:Ao,"cy-gb":{language:"Welsh",location:"United Kingdom",id:1106,tag:"cy-GB",version:"ReleaseE1"},wal:Ro,"wal-et":{language:"Wolaytta",location:"Ethiopia",id:4096,tag:"wal-ET",version:"Release 10"},wo:Mo,"wo-sn":{language:"Wolof",location:"Senegal",id:1160,tag:"wo-SN",version:"Release V"},xh:To,"xh-za":{language:"Xhosa",location:"South Africa",id:1076,tag:"xh-ZA",version:"Release E1"},yav:Bo,"yav-cm":{language:"Yangben",location:"Cameroon",id:4096,tag:"yav-CM",version:"Release 10"},ii:No,"ii-cn":{language:"Yi",location:"People's Republic of China",id:1144,tag:"ii-CN",version:"Release V"},yo:Do,"yo-bj":{language:"Yoruba",location:"Benin",id:4096,tag:"yo-BJ",version:"Release 10"},"yo-ng":{language:"Yoruba",location:"Nigeria",id:1130,tag:"yo-NG",version:"Release V"},dje:Po,"dje-ne":{language:"Zarma",location:"Niger",id:4096,tag:"dje-NE",version:"Release 10"},zu:Oo,"zu-za":{language:"Zulu",location:"South Africa",id:1077,tag:"zu-ZA",version:"Release E1"}};var Fo={name:"Abkhazian",names:["Abkhazian"],"iso639-2":"abk","iso639-1":"ab"};var Lo={name:"Achinese",names:["Achinese"],"iso639-2":"ace","iso639-1":null};var Io={name:"Acoli",names:["Acoli"],"iso639-2":"ach","iso639-1":null};var jo={name:"Adangme",names:["Adangme"],"iso639-2":"ada","iso639-1":null};var Ho={name:"Adygei",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var Vo={name:"Adyghe",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var Uo={name:"Afar",names:["Afar"],"iso639-2":"aar","iso639-1":"aa"};var Go={name:"Afrihili",names:["Afrihili"],"iso639-2":"afh","iso639-1":null};var Wo={name:"Afrikaans",names:["Afrikaans"],"iso639-2":"afr","iso639-1":"af"};var Ko={name:"Ainu",names:["Ainu"],"iso639-2":"ain","iso639-1":null};var qo={name:"Akan",names:["Akan"],"iso639-2":"aka","iso639-1":"ak"};var Yo={name:"Akkadian",names:["Akkadian"],"iso639-2":"akk","iso639-1":null};var Xo={name:"Albanian",names:["Albanian"],"iso639-2":"alb/sqi","iso639-1":"sq"};var $o={name:"Alemannic",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var Zo={name:"Aleut",names:["Aleut"],"iso639-2":"ale","iso639-1":null};var Jo={name:"Alsatian",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var Qo={name:"Amharic",names:["Amharic"],"iso639-2":"amh","iso639-1":"am"};var es={name:"Angika",names:["Angika"],"iso639-2":"anp","iso639-1":null};var ts={name:"Arabic",names:["Arabic"],"iso639-2":"ara","iso639-1":"ar"};var ns={name:"Aragonese",names:["Aragonese"],"iso639-2":"arg","iso639-1":"an"};var is={name:"Arapaho",names:["Arapaho"],"iso639-2":"arp","iso639-1":null};var as={name:"Arawak",names:["Arawak"],"iso639-2":"arw","iso639-1":null};var rs={name:"Armenian",names:["Armenian"],"iso639-2":"arm/hye","iso639-1":"hy"};var os={name:"Aromanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var ss={name:"Arumanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var ls={name:"Assamese",names:["Assamese"],"iso639-2":"asm","iso639-1":"as"};var us={name:"Asturian",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var hs={name:"Asturleonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var cs={name:"Avaric",names:["Avaric"],"iso639-2":"ava","iso639-1":"av"};var fs={name:"Avestan",names:["Avestan"],"iso639-2":"ave","iso639-1":"ae"};var ds={name:"Awadhi",names:["Awadhi"],"iso639-2":"awa","iso639-1":null};var gs={name:"Aymara",names:["Aymara"],"iso639-2":"aym","iso639-1":"ay"};var ps={name:"Azerbaijani",names:["Azerbaijani"],"iso639-2":"aze","iso639-1":"az"};var vs={name:"Bable",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var ms={name:"Balinese",names:["Balinese"],"iso639-2":"ban","iso639-1":null};var ys={name:"Baluchi",names:["Baluchi"],"iso639-2":"bal","iso639-1":null};var _s={name:"Bambara",names:["Bambara"],"iso639-2":"bam","iso639-1":"bm"};var bs={name:"Basa",names:["Basa"],"iso639-2":"bas","iso639-1":null};var ws={name:"Bashkir",names:["Bashkir"],"iso639-2":"bak","iso639-1":"ba"};var xs={name:"Basque",names:["Basque"],"iso639-2":"baq/eus","iso639-1":"eu"};var ks={name:"Bedawiyet",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var Ss={name:"Beja",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var Cs={name:"Belarusian",names:["Belarusian"],"iso639-2":"bel","iso639-1":"be"};var Es={name:"Bemba",names:["Bemba"],"iso639-2":"bem","iso639-1":null};var As={name:"Bengali",names:["Bengali"],"iso639-2":"ben","iso639-1":"bn"};var Rs={name:"Bhojpuri",names:["Bhojpuri"],"iso639-2":"bho","iso639-1":null};var Ms={name:"Bikol",names:["Bikol"],"iso639-2":"bik","iso639-1":null};var Ts={name:"Bilin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var Bs={name:"Bini",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var Ns={name:"Bislama",names:["Bislama"],"iso639-2":"bis","iso639-1":"bi"};var Ds={name:"Blin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var Ps={name:"Bliss",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var Os={name:"Blissymbolics",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var zs={name:"Blissymbols",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var Fs={name:"Bosnian",names:["Bosnian"],"iso639-2":"bos","iso639-1":"bs"};var Ls={name:"Braj",names:["Braj"],"iso639-2":"bra","iso639-1":null};var Is={name:"Breton",names:["Breton"],"iso639-2":"bre","iso639-1":"br"};var js={name:"Buginese",names:["Buginese"],"iso639-2":"bug","iso639-1":null};var Hs={name:"Bulgarian",names:["Bulgarian"],"iso639-2":"bul","iso639-1":"bg"};var Vs={name:"Buriat",names:["Buriat"],"iso639-2":"bua","iso639-1":null};var Us={name:"Burmese",names:["Burmese"],"iso639-2":"bur/mya","iso639-1":"my"};var Gs={name:"Caddo",names:["Caddo"],"iso639-2":"cad","iso639-1":null};var Ws={name:"Castilian",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var Ks={name:"Catalan",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var qs={name:"Cebuano",names:["Cebuano"],"iso639-2":"ceb","iso639-1":null};var Ys={name:"Chagatai",names:["Chagatai"],"iso639-2":"chg","iso639-1":null};var Xs={name:"Chamorro",names:["Chamorro"],"iso639-2":"cha","iso639-1":"ch"};var $s={name:"Chechen",names:["Chechen"],"iso639-2":"che","iso639-1":"ce"};var Zs={name:"Cherokee",names:["Cherokee"],"iso639-2":"chr","iso639-1":null};var Js={name:"Chewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var Qs={name:"Cheyenne",names:["Cheyenne"],"iso639-2":"chy","iso639-1":null};var el={name:"Chibcha",names:["Chibcha"],"iso639-2":"chb","iso639-1":null};var tl={name:"Chichewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var nl={name:"Chinese",names:["Chinese"],"iso639-2":"chi/zho","iso639-1":"zh"};var il={name:"Chipewyan",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null};var al={name:"Choctaw",names:["Choctaw"],"iso639-2":"cho","iso639-1":null};var rl={name:"Chuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var ol={name:"Chuukese",names:["Chuukese"],"iso639-2":"chk","iso639-1":null};var sl={name:"Chuvash",names:["Chuvash"],"iso639-2":"chv","iso639-1":"cv"};var ll={name:"Coptic",names:["Coptic"],"iso639-2":"cop","iso639-1":null};var ul={name:"Cornish",names:["Cornish"],"iso639-2":"cor","iso639-1":"kw"};var hl={name:"Corsican",names:["Corsican"],"iso639-2":"cos","iso639-1":"co"};var cl={name:"Cree",names:["Cree"],"iso639-2":"cre","iso639-1":"cr"};var fl={name:"Creek",names:["Creek"],"iso639-2":"mus","iso639-1":null};var dl={name:"Croatian",names:["Croatian"],"iso639-2":"hrv","iso639-1":"hr"};var gl={name:"Czech",names:["Czech"],"iso639-2":"cze/ces","iso639-1":"cs"};var pl={name:"Dakota",names:["Dakota"],"iso639-2":"dak","iso639-1":null};var vl={name:"Danish",names:["Danish"],"iso639-2":"dan","iso639-1":"da"};var ml={name:"Dargwa",names:["Dargwa"],"iso639-2":"dar","iso639-1":null};var yl={name:"Delaware",names:["Delaware"],"iso639-2":"del","iso639-1":null};var _l={name:"Dhivehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var bl={name:"Dimili",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var wl={name:"Dimli",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var xl={name:"Dinka",names:["Dinka"],"iso639-2":"din","iso639-1":null};var kl={name:"Divehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var Sl={name:"Dogri",names:["Dogri"],"iso639-2":"doi","iso639-1":null};var Cl={name:"Dogrib",names:["Dogrib"],"iso639-2":"dgr","iso639-1":null};var El={name:"Duala",names:["Duala"],"iso639-2":"dua","iso639-1":null};var Al={name:"Dutch",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var Rl={name:"Dyula",names:["Dyula"],"iso639-2":"dyu","iso639-1":null};var Ml={name:"Dzongkha",names:["Dzongkha"],"iso639-2":"dzo","iso639-1":"dz"};var Tl={name:"Edo",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var Bl={name:"Efik",names:["Efik"],"iso639-2":"efi","iso639-1":null};var Nl={name:"Ekajuk",names:["Ekajuk"],"iso639-2":"eka","iso639-1":null};var Dl={name:"Elamite",names:["Elamite"],"iso639-2":"elx","iso639-1":null};var Pl={name:"English",names:["English"],"iso639-2":"eng","iso639-1":"en"};var Ol={name:"Erzya",names:["Erzya"],"iso639-2":"myv","iso639-1":null};var zl={name:"Esperanto",names:["Esperanto"],"iso639-2":"epo","iso639-1":"eo"};var Fl={name:"Estonian",names:["Estonian"],"iso639-2":"est","iso639-1":"et"};var Ll={name:"Ewe",names:["Ewe"],"iso639-2":"ewe","iso639-1":"ee"};var Il={name:"Ewondo",names:["Ewondo"],"iso639-2":"ewo","iso639-1":null};var jl={name:"Fang",names:["Fang"],"iso639-2":"fan","iso639-1":null};var Hl={name:"Fanti",names:["Fanti"],"iso639-2":"fat","iso639-1":null};var Vl={name:"Faroese",names:["Faroese"],"iso639-2":"fao","iso639-1":"fo"};var Ul={name:"Fijian",names:["Fijian"],"iso639-2":"fij","iso639-1":"fj"};var Gl={name:"Filipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var Wl={name:"Finnish",names:["Finnish"],"iso639-2":"fin","iso639-1":"fi"};var Kl={name:"Flemish",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var ql={name:"Fon",names:["Fon"],"iso639-2":"fon","iso639-1":null};var Yl={name:"French",names:["French"],"iso639-2":"fre/fra","iso639-1":"fr"};var Xl={name:"Friulian",names:["Friulian"],"iso639-2":"fur","iso639-1":null};var $l={name:"Fulah",names:["Fulah"],"iso639-2":"ful","iso639-1":"ff"};var Zl={name:"Ga",names:["Ga"],"iso639-2":"gaa","iso639-1":null};var Jl={name:"Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"};var Ql={name:"Galician",names:["Galician"],"iso639-2":"glg","iso639-1":"gl"};var eu={name:"Ganda",names:["Ganda"],"iso639-2":"lug","iso639-1":"lg"};var tu={name:"Gayo",names:["Gayo"],"iso639-2":"gay","iso639-1":null};var nu={name:"Gbaya",names:["Gbaya"],"iso639-2":"gba","iso639-1":null};var iu={name:"Geez",names:["Geez"],"iso639-2":"gez","iso639-1":null};var au={name:"Georgian",names:["Georgian"],"iso639-2":"geo/kat","iso639-1":"ka"};var ru={name:"German",names:["German"],"iso639-2":"ger/deu","iso639-1":"de"};var ou={name:"Gikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var su={name:"Gilbertese",names:["Gilbertese"],"iso639-2":"gil","iso639-1":null};var lu={name:"Gondi",names:["Gondi"],"iso639-2":"gon","iso639-1":null};var uu={name:"Gorontalo",names:["Gorontalo"],"iso639-2":"gor","iso639-1":null};var hu={name:"Gothic",names:["Gothic"],"iso639-2":"got","iso639-1":null};var cu={name:"Grebo",names:["Grebo"],"iso639-2":"grb","iso639-1":null};var fu={name:"Greenlandic",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var du={name:"Guarani",names:["Guarani"],"iso639-2":"grn","iso639-1":"gn"};var gu={name:"Gujarati",names:["Gujarati"],"iso639-2":"guj","iso639-1":"gu"};var pu={name:"Haida",names:["Haida"],"iso639-2":"hai","iso639-1":null};var vu={name:"Haitian",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"};var mu={name:"Hausa",names:["Hausa"],"iso639-2":"hau","iso639-1":"ha"};var yu={name:"Hawaiian",names:["Hawaiian"],"iso639-2":"haw","iso639-1":null};var _u={name:"Hebrew",names:["Hebrew"],"iso639-2":"heb","iso639-1":"he"};var bu={name:"Herero",names:["Herero"],"iso639-2":"her","iso639-1":"hz"};var wu={name:"Hiligaynon",names:["Hiligaynon"],"iso639-2":"hil","iso639-1":null};var xu={name:"Hindi",names:["Hindi"],"iso639-2":"hin","iso639-1":"hi"};var ku={name:"Hittite",names:["Hittite"],"iso639-2":"hit","iso639-1":null};var Su={name:"Hmong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var Cu={name:"Hungarian",names:["Hungarian"],"iso639-2":"hun","iso639-1":"hu"};var Eu={name:"Hupa",names:["Hupa"],"iso639-2":"hup","iso639-1":null};var Au={name:"Iban",names:["Iban"],"iso639-2":"iba","iso639-1":null};var Ru={name:"Icelandic",names:["Icelandic"],"iso639-2":"ice/isl","iso639-1":"is"};var Mu={name:"Ido",names:["Ido"],"iso639-2":"ido","iso639-1":"io"};var Tu={name:"Igbo",names:["Igbo"],"iso639-2":"ibo","iso639-1":"ig"};var Bu={name:"Iloko",names:["Iloko"],"iso639-2":"ilo","iso639-1":null};var Nu={name:"Indonesian",names:["Indonesian"],"iso639-2":"ind","iso639-1":"id"};var Du={name:"Ingush",names:["Ingush"],"iso639-2":"inh","iso639-1":null};var Pu={name:"Interlingue",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Ou={name:"Inuktitut",names:["Inuktitut"],"iso639-2":"iku","iso639-1":"iu"};var zu={name:"Inupiaq",names:["Inupiaq"],"iso639-2":"ipk","iso639-1":"ik"};var Fu={name:"Irish",names:["Irish"],"iso639-2":"gle","iso639-1":"ga"};var Lu={name:"Italian",names:["Italian"],"iso639-2":"ita","iso639-1":"it"};var Iu={name:"Japanese",names:["Japanese"],"iso639-2":"jpn","iso639-1":"ja"};var ju={name:"Javanese",names:["Javanese"],"iso639-2":"jav","iso639-1":"jv"};var Hu={name:"Jingpho",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Vu={name:"Kabardian",names:["Kabardian"],"iso639-2":"kbd","iso639-1":null};var Uu={name:"Kabyle",names:["Kabyle"],"iso639-2":"kab","iso639-1":null};var Gu={name:"Kachin",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Wu={name:"Kalaallisut",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var Ku={name:"Kalmyk",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var qu={name:"Kamba",names:["Kamba"],"iso639-2":"kam","iso639-1":null};var Yu={name:"Kannada",names:["Kannada"],"iso639-2":"kan","iso639-1":"kn"};var Xu={name:"Kanuri",names:["Kanuri"],"iso639-2":"kau","iso639-1":"kr"};var $u={name:"Kapampangan",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var Zu={name:"Karelian",names:["Karelian"],"iso639-2":"krl","iso639-1":null};var Ju={name:"Kashmiri",names:["Kashmiri"],"iso639-2":"kas","iso639-1":"ks"};var Qu={name:"Kashubian",names:["Kashubian"],"iso639-2":"csb","iso639-1":null};var eh={name:"Kawi",names:["Kawi"],"iso639-2":"kaw","iso639-1":null};var th={name:"Kazakh",names:["Kazakh"],"iso639-2":"kaz","iso639-1":"kk"};var nh={name:"Khasi",names:["Khasi"],"iso639-2":"kha","iso639-1":null};var ih={name:"Khotanese",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var ah={name:"Kikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var rh={name:"Kimbundu",names:["Kimbundu"],"iso639-2":"kmb","iso639-1":null};var oh={name:"Kinyarwanda",names:["Kinyarwanda"],"iso639-2":"kin","iso639-1":"rw"};var sh={name:"Kirdki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var lh={name:"Kirghiz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var uh={name:"Kirmanjki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var hh={name:"Klingon",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null};var ch={name:"Komi",names:["Komi"],"iso639-2":"kom","iso639-1":"kv"};var fh={name:"Kongo",names:["Kongo"],"iso639-2":"kon","iso639-1":"kg"};var dh={name:"Konkani",names:["Konkani"],"iso639-2":"kok","iso639-1":null};var gh={name:"Korean",names:["Korean"],"iso639-2":"kor","iso639-1":"ko"};var ph={name:"Kosraean",names:["Kosraean"],"iso639-2":"kos","iso639-1":null};var vh={name:"Kpelle",names:["Kpelle"],"iso639-2":"kpe","iso639-1":null};var mh={name:"Kuanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var yh={name:"Kumyk",names:["Kumyk"],"iso639-2":"kum","iso639-1":null};var _h={name:"Kurdish",names:["Kurdish"],"iso639-2":"kur","iso639-1":"ku"};var bh={name:"Kurukh",names:["Kurukh"],"iso639-2":"kru","iso639-1":null};var wh={name:"Kutenai",names:["Kutenai"],"iso639-2":"kut","iso639-1":null};var xh={name:"Kwanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var kh={name:"Kyrgyz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var Sh={name:"Ladino",names:["Ladino"],"iso639-2":"lad","iso639-1":null};var Ch={name:"Lahnda",names:["Lahnda"],"iso639-2":"lah","iso639-1":null};var Eh={name:"Lamba",names:["Lamba"],"iso639-2":"lam","iso639-1":null};var Ah={name:"Lao",names:["Lao"],"iso639-2":"lao","iso639-1":"lo"};var Rh={name:"Latin",names:["Latin"],"iso639-2":"lat","iso639-1":"la"};var Mh={name:"Latvian",names:["Latvian"],"iso639-2":"lav","iso639-1":"lv"};var Th={name:"Leonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var Bh={name:"Letzeburgesch",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var Nh={name:"Lezghian",names:["Lezghian"],"iso639-2":"lez","iso639-1":null};var Dh={name:"Limburgan",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Ph={name:"Limburger",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Oh={name:"Limburgish",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var zh={name:"Lingala",names:["Lingala"],"iso639-2":"lin","iso639-1":"ln"};var Fh={name:"Lithuanian",names:["Lithuanian"],"iso639-2":"lit","iso639-1":"lt"};var Lh={name:"Lojban",names:["Lojban"],"iso639-2":"jbo","iso639-1":null};var Ih={name:"Lozi",names:["Lozi"],"iso639-2":"loz","iso639-1":null};var jh={name:"Luiseno",names:["Luiseno"],"iso639-2":"lui","iso639-1":null};var Hh={name:"Lunda",names:["Lunda"],"iso639-2":"lun","iso639-1":null};var Vh={name:"Lushai",names:["Lushai"],"iso639-2":"lus","iso639-1":null};var Uh={name:"Luxembourgish",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var Gh={name:"Macedonian",names:["Macedonian"],"iso639-2":"mac/mkd","iso639-1":"mk"};var Wh={name:"Madurese",names:["Madurese"],"iso639-2":"mad","iso639-1":null};var Kh={name:"Magahi",names:["Magahi"],"iso639-2":"mag","iso639-1":null};var qh={name:"Maithili",names:["Maithili"],"iso639-2":"mai","iso639-1":null};var Yh={name:"Makasar",names:["Makasar"],"iso639-2":"mak","iso639-1":null};var Xh={name:"Malagasy",names:["Malagasy"],"iso639-2":"mlg","iso639-1":"mg"};var $h={name:"Malay",names:["Malay"],"iso639-2":"may/msa","iso639-1":"ms"};var Zh={name:"Malayalam",names:["Malayalam"],"iso639-2":"mal","iso639-1":"ml"};var Jh={name:"Maldivian",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var Qh={name:"Maltese",names:["Maltese"],"iso639-2":"mlt","iso639-1":"mt"};var ec={name:"Manchu",names:["Manchu"],"iso639-2":"mnc","iso639-1":null};var tc={name:"Mandar",names:["Mandar"],"iso639-2":"mdr","iso639-1":null};var nc={name:"Mandingo",names:["Mandingo"],"iso639-2":"man","iso639-1":null};var ic={name:"Manipuri",names:["Manipuri"],"iso639-2":"mni","iso639-1":null};var ac={name:"Manx",names:["Manx"],"iso639-2":"glv","iso639-1":"gv"};var rc={name:"Maori",names:["Maori"],"iso639-2":"mao/mri","iso639-1":"mi"};var oc={name:"Mapuche",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var sc={name:"Mapudungun",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var lc={name:"Marathi",names:["Marathi"],"iso639-2":"mar","iso639-1":"mr"};var uc={name:"Mari",names:["Mari"],"iso639-2":"chm","iso639-1":null};var hc={name:"Marshallese",names:["Marshallese"],"iso639-2":"mah","iso639-1":"mh"};var cc={name:"Marwari",names:["Marwari"],"iso639-2":"mwr","iso639-1":null};var fc={name:"Masai",names:["Masai"],"iso639-2":"mas","iso639-1":null};var dc={name:"Mende",names:["Mende"],"iso639-2":"men","iso639-1":null};var gc={name:"Micmac",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null};var pc={name:"Minangkabau",names:["Minangkabau"],"iso639-2":"min","iso639-1":null};var vc={name:"Mirandese",names:["Mirandese"],"iso639-2":"mwl","iso639-1":null};var mc={name:"Mohawk",names:["Mohawk"],"iso639-2":"moh","iso639-1":null};var yc={name:"Moksha",names:["Moksha"],"iso639-2":"mdf","iso639-1":null};var _c={name:"Moldavian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var bc={name:"Moldovan",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var wc={name:"Mong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var xc={name:"Mongo",names:["Mongo"],"iso639-2":"lol","iso639-1":null};var kc={name:"Mongolian",names:["Mongolian"],"iso639-2":"mon","iso639-1":"mn"};var Sc={name:"Montenegrin",names:["Montenegrin"],"iso639-2":"cnr","iso639-1":null};var Cc={name:"Mossi",names:["Mossi"],"iso639-2":"mos","iso639-1":null};var Ec={name:"Nauru",names:["Nauru"],"iso639-2":"nau","iso639-1":"na"};var Ac={name:"Navaho",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var Rc={name:"Navajo",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var Mc={name:"Ndonga",names:["Ndonga"],"iso639-2":"ndo","iso639-1":"ng"};var Tc={name:"Neapolitan",names:["Neapolitan"],"iso639-2":"nap","iso639-1":null};var Bc={name:"Nepali",names:["Nepali"],"iso639-2":"nep","iso639-1":"ne"};var Nc={name:"Newari",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null};var Dc={name:"Nias",names:["Nias"],"iso639-2":"nia","iso639-1":null};var Pc={name:"Niuean",names:["Niuean"],"iso639-2":"niu","iso639-1":null};var Oc={name:"Nogai",names:["Nogai"],"iso639-2":"nog","iso639-1":null};var zc={name:"Norwegian",names:["Norwegian"],"iso639-2":"nor","iso639-1":"no"};var Fc={name:"Nuosu",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"};var Lc={name:"Nyamwezi",names:["Nyamwezi"],"iso639-2":"nym","iso639-1":null};var Ic={name:"Nyanja",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var jc={name:"Nyankole",names:["Nyankole"],"iso639-2":"nyn","iso639-1":null};var Hc={name:"Nyoro",names:["Nyoro"],"iso639-2":"nyo","iso639-1":null};var Vc={name:"Nzima",names:["Nzima"],"iso639-2":"nzi","iso639-1":null};var Uc={name:"Occidental",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Gc={name:"Oirat",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var Wc={name:"Ojibwa",names:["Ojibwa"],"iso639-2":"oji","iso639-1":"oj"};var Kc={name:"Oriya",names:["Oriya"],"iso639-2":"ori","iso639-1":"or"};var qc={name:"Oromo",names:["Oromo"],"iso639-2":"orm","iso639-1":"om"};var Yc={name:"Osage",names:["Osage"],"iso639-2":"osa","iso639-1":null};var Xc={name:"Ossetian",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var $c={name:"Ossetic",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var Zc={name:"Pahlavi",names:["Pahlavi"],"iso639-2":"pal","iso639-1":null};var Jc={name:"Palauan",names:["Palauan"],"iso639-2":"pau","iso639-1":null};var Qc={name:"Pali",names:["Pali"],"iso639-2":"pli","iso639-1":"pi"};var ef={name:"Pampanga",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var tf={name:"Pangasinan",names:["Pangasinan"],"iso639-2":"pag","iso639-1":null};var nf={name:"Panjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var af={name:"Papiamento",names:["Papiamento"],"iso639-2":"pap","iso639-1":null};var rf={name:"Pashto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var of={name:"Pedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var sf={name:"Persian",names:["Persian"],"iso639-2":"per/fas","iso639-1":"fa"};var lf={name:"Phoenician",names:["Phoenician"],"iso639-2":"phn","iso639-1":null};var uf={name:"Pilipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var hf={name:"Pohnpeian",names:["Pohnpeian"],"iso639-2":"pon","iso639-1":null};var cf={name:"Polish",names:["Polish"],"iso639-2":"pol","iso639-1":"pl"};var ff={name:"Portuguese",names:["Portuguese"],"iso639-2":"por","iso639-1":"pt"};var df={name:"Punjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var gf={name:"Pushto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var pf={name:"Quechua",names:["Quechua"],"iso639-2":"que","iso639-1":"qu"};var vf={name:"Rajasthani",names:["Rajasthani"],"iso639-2":"raj","iso639-1":null};var mf={name:"Rapanui",names:["Rapanui"],"iso639-2":"rap","iso639-1":null};var yf={name:"Rarotongan",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null};var _f={name:"Romanian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var bf={name:"Romansh",names:["Romansh"],"iso639-2":"roh","iso639-1":"rm"};var wf={name:"Romany",names:["Romany"],"iso639-2":"rom","iso639-1":null};var xf={name:"Rundi",names:["Rundi"],"iso639-2":"run","iso639-1":"rn"};var kf={name:"Russian",names:["Russian"],"iso639-2":"rus","iso639-1":"ru"};var Sf={name:"Sakan",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var Cf={name:"Samoan",names:["Samoan"],"iso639-2":"smo","iso639-1":"sm"};var Ef={name:"Sandawe",names:["Sandawe"],"iso639-2":"sad","iso639-1":null};var Af={name:"Sango",names:["Sango"],"iso639-2":"sag","iso639-1":"sg"};var Rf={name:"Sanskrit",names:["Sanskrit"],"iso639-2":"san","iso639-1":"sa"};var Mf={name:"Santali",names:["Santali"],"iso639-2":"sat","iso639-1":null};var Tf={name:"Sardinian",names:["Sardinian"],"iso639-2":"srd","iso639-1":"sc"};var Bf={name:"Sasak",names:["Sasak"],"iso639-2":"sas","iso639-1":null};var Nf={name:"Scots",names:["Scots"],"iso639-2":"sco","iso639-1":null};var Df={name:"Selkup",names:["Selkup"],"iso639-2":"sel","iso639-1":null};var Pf={name:"Sepedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var Of={name:"Serbian",names:["Serbian"],"iso639-2":"srp","iso639-1":"sr"};var zf={name:"Serer",names:["Serer"],"iso639-2":"srr","iso639-1":null};var Ff={name:"Shan",names:["Shan"],"iso639-2":"shn","iso639-1":null};var Lf={name:"Shona",names:["Shona"],"iso639-2":"sna","iso639-1":"sn"};var If={name:"Sicilian",names:["Sicilian"],"iso639-2":"scn","iso639-1":null};var jf={name:"Sidamo",names:["Sidamo"],"iso639-2":"sid","iso639-1":null};var Hf={name:"Siksika",names:["Siksika"],"iso639-2":"bla","iso639-1":null};var Vf={name:"Sindhi",names:["Sindhi"],"iso639-2":"snd","iso639-1":"sd"};var Uf={name:"Sinhala",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var Gf={name:"Sinhalese",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var Wf={name:"Slovak",names:["Slovak"],"iso639-2":"slo/slk","iso639-1":"sk"};var Kf={name:"Slovenian",names:["Slovenian"],"iso639-2":"slv","iso639-1":"sl"};var qf={name:"Sogdian",names:["Sogdian"],"iso639-2":"sog","iso639-1":null};var Yf={name:"Somali",names:["Somali"],"iso639-2":"som","iso639-1":"so"};var Xf={name:"Soninke",names:["Soninke"],"iso639-2":"snk","iso639-1":null};var $f={name:"Spanish",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var Zf={name:"Sukuma",names:["Sukuma"],"iso639-2":"suk","iso639-1":null};var Jf={name:"Sumerian",names:["Sumerian"],"iso639-2":"sux","iso639-1":null};var Qf={name:"Sundanese",names:["Sundanese"],"iso639-2":"sun","iso639-1":"su"};var ed={name:"Susu",names:["Susu"],"iso639-2":"sus","iso639-1":null};var td={name:"Swahili",names:["Swahili"],"iso639-2":"swa","iso639-1":"sw"};var nd={name:"Swati",names:["Swati"],"iso639-2":"ssw","iso639-1":"ss"};var id={name:"Swedish",names:["Swedish"],"iso639-2":"swe","iso639-1":"sv"};var ad={name:"Syriac",names:["Syriac"],"iso639-2":"syr","iso639-1":null};var rd={name:"Tagalog",names:["Tagalog"],"iso639-2":"tgl","iso639-1":"tl"};var od={name:"Tahitian",names:["Tahitian"],"iso639-2":"tah","iso639-1":"ty"};var sd={name:"Tajik",names:["Tajik"],"iso639-2":"tgk","iso639-1":"tg"};var ld={name:"Tamashek",names:["Tamashek"],"iso639-2":"tmh","iso639-1":null};var ud={name:"Tamil",names:["Tamil"],"iso639-2":"tam","iso639-1":"ta"};var hd={name:"Tatar",names:["Tatar"],"iso639-2":"tat","iso639-1":"tt"};var cd={name:"Telugu",names:["Telugu"],"iso639-2":"tel","iso639-1":"te"};var fd={name:"Tereno",names:["Tereno"],"iso639-2":"ter","iso639-1":null};var dd={name:"Tetum",names:["Tetum"],"iso639-2":"tet","iso639-1":null};var gd={name:"Thai",names:["Thai"],"iso639-2":"tha","iso639-1":"th"};var pd={name:"Tibetan",names:["Tibetan"],"iso639-2":"tib/bod","iso639-1":"bo"};var vd={name:"Tigre",names:["Tigre"],"iso639-2":"tig","iso639-1":null};var md={name:"Tigrinya",names:["Tigrinya"],"iso639-2":"tir","iso639-1":"ti"};var yd={name:"Timne",names:["Timne"],"iso639-2":"tem","iso639-1":null};var _d={name:"Tiv",names:["Tiv"],"iso639-2":"tiv","iso639-1":null};var bd={name:"Tlingit",names:["Tlingit"],"iso639-2":"tli","iso639-1":null};var wd={name:"Tokelau",names:["Tokelau"],"iso639-2":"tkl","iso639-1":null};var xd={name:"Tsimshian",names:["Tsimshian"],"iso639-2":"tsi","iso639-1":null};var kd={name:"Tsonga",names:["Tsonga"],"iso639-2":"tso","iso639-1":"ts"};var Sd={name:"Tswana",names:["Tswana"],"iso639-2":"tsn","iso639-1":"tn"};var Cd={name:"Tumbuka",names:["Tumbuka"],"iso639-2":"tum","iso639-1":null};var Ed={name:"Turkish",names:["Turkish"],"iso639-2":"tur","iso639-1":"tr"};var Ad={name:"Turkmen",names:["Turkmen"],"iso639-2":"tuk","iso639-1":"tk"};var Rd={name:"Tuvalu",names:["Tuvalu"],"iso639-2":"tvl","iso639-1":null};var Md={name:"Tuvinian",names:["Tuvinian"],"iso639-2":"tyv","iso639-1":null};var Td={name:"Twi",names:["Twi"],"iso639-2":"twi","iso639-1":"tw"};var Bd={name:"Udmurt",names:["Udmurt"],"iso639-2":"udm","iso639-1":null};var Nd={name:"Ugaritic",names:["Ugaritic"],"iso639-2":"uga","iso639-1":null};var Dd={name:"Uighur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var Pd={name:"Ukrainian",names:["Ukrainian"],"iso639-2":"ukr","iso639-1":"uk"};var Od={name:"Umbundu",names:["Umbundu"],"iso639-2":"umb","iso639-1":null};var zd={name:"Undetermined",names:["Undetermined"],"iso639-2":"und","iso639-1":null};var Fd={name:"Urdu",names:["Urdu"],"iso639-2":"urd","iso639-1":"ur"};var Ld={name:"Uyghur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var Id={name:"Uzbek",names:["Uzbek"],"iso639-2":"uzb","iso639-1":"uz"};var jd={name:"Vai",names:["Vai"],"iso639-2":"vai","iso639-1":null};var Hd={name:"Valencian",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var Vd={name:"Venda",names:["Venda"],"iso639-2":"ven","iso639-1":"ve"};var Ud={name:"Vietnamese",names:["Vietnamese"],"iso639-2":"vie","iso639-1":"vi"};var Gd={name:"Votic",names:["Votic"],"iso639-2":"vot","iso639-1":null};var Wd={name:"Walloon",names:["Walloon"],"iso639-2":"wln","iso639-1":"wa"};var Kd={name:"Waray",names:["Waray"],"iso639-2":"war","iso639-1":null};var qd={name:"Washo",names:["Washo"],"iso639-2":"was","iso639-1":null};var Yd={name:"Welsh",names:["Welsh"],"iso639-2":"wel/cym","iso639-1":"cy"};var Xd={name:"Wolaitta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var $d={name:"Wolaytta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var Zd={name:"Wolof",names:["Wolof"],"iso639-2":"wol","iso639-1":"wo"};var Jd={name:"Xhosa",names:["Xhosa"],"iso639-2":"xho","iso639-1":"xh"};var Qd={name:"Yakut",names:["Yakut"],"iso639-2":"sah","iso639-1":null};var eg={name:"Yao",names:["Yao"],"iso639-2":"yao","iso639-1":null};var tg={name:"Yapese",names:["Yapese"],"iso639-2":"yap","iso639-1":null};var ng={name:"Yiddish",names:["Yiddish"],"iso639-2":"yid","iso639-1":"yi"};var ig={name:"Yoruba",names:["Yoruba"],"iso639-2":"yor","iso639-1":"yo"};var ag={name:"Zapotec",names:["Zapotec"],"iso639-2":"zap","iso639-1":null};var rg={name:"Zaza",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var og={name:"Zazaki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var sg={name:"Zenaga",names:["Zenaga"],"iso639-2":"zen","iso639-1":null};var lg={name:"Zhuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var ug={name:"Zulu",names:["Zulu"],"iso639-2":"zul","iso639-1":"zu"};var hg={name:"Zuni",names:["Zuni"],"iso639-2":"zun","iso639-1":null};var cg={Abkhazian:Fo,Achinese:Lo,Acoli:Io,Adangme:jo,Adygei:Ho,Adyghe:Vo,Afar:Uo,Afrihili:Go,Afrikaans:Wo,"Afro-Asiatic languages":{name:"Afro-Asiatic languages",names:["Afro-Asiatic languages"],"iso639-2":"afa","iso639-1":null},Ainu:Ko,Akan:qo,Akkadian:Yo,Albanian:Xo,Alemannic:$o,Aleut:Zo,"Algonquian languages":{name:"Algonquian languages",names:["Algonquian languages"],"iso639-2":"alg","iso639-1":null},Alsatian:Jo,"Altaic languages":{name:"Altaic languages",names:["Altaic languages"],"iso639-2":"tut","iso639-1":null},Amharic:Qo,Angika:es,"Apache languages":{name:"Apache languages",names:["Apache languages"],"iso639-2":"apa","iso639-1":null},Arabic:ts,Aragonese:ns,Arapaho:is,Arawak:as,Armenian:rs,Aromanian:os,"Artificial languages":{name:"Artificial languages",names:["Artificial languages"],"iso639-2":"art","iso639-1":null},Arumanian:ss,Assamese:ls,Asturian:us,Asturleonese:hs,"Athapascan languages":{name:"Athapascan languages",names:["Athapascan languages"],"iso639-2":"ath","iso639-1":null},"Australian languages":{name:"Australian languages",names:["Australian languages"],"iso639-2":"aus","iso639-1":null},"Austronesian languages":{name:"Austronesian languages",names:["Austronesian languages"],"iso639-2":"map","iso639-1":null},Avaric:cs,Avestan:fs,Awadhi:ds,Aymara:gs,Azerbaijani:ps,Bable:vs,Balinese:ms,"Baltic languages":{name:"Baltic languages",names:["Baltic languages"],"iso639-2":"bat","iso639-1":null},Baluchi:ys,Bambara:_s,"Bamileke languages":{name:"Bamileke languages",names:["Bamileke languages"],"iso639-2":"bai","iso639-1":null},"Banda languages":{name:"Banda languages",names:["Banda languages"],"iso639-2":"bad","iso639-1":null},"Bantu languages":{name:"Bantu languages",names:["Bantu languages"],"iso639-2":"bnt","iso639-1":null},Basa:bs,Bashkir:ws,Basque:xs,"Batak languages":{name:"Batak languages",names:["Batak languages"],"iso639-2":"btk","iso639-1":null},Bedawiyet:ks,Beja:Ss,Belarusian:Cs,Bemba:Es,Bengali:As,"Berber languages":{name:"Berber languages",names:["Berber languages"],"iso639-2":"ber","iso639-1":null},Bhojpuri:Rs,"Bihari languages":{name:"Bihari languages",names:["Bihari languages"],"iso639-2":"bih","iso639-1":"bh"},Bikol:Ms,Bilin:Ts,Bini:Bs,Bislama:Ns,Blin:Ds,Bliss:Ps,Blissymbolics:Os,Blissymbols:zs,"Bokmål, Norwegian":{name:"Bokmål, Norwegian",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},Bosnian:Fs,Braj:Ls,Breton:Is,Buginese:js,Bulgarian:Hs,Buriat:Vs,Burmese:Us,Caddo:Gs,Castilian:Ws,Catalan:Ks,"Caucasian languages":{name:"Caucasian languages",names:["Caucasian languages"],"iso639-2":"cau","iso639-1":null},Cebuano:qs,"Celtic languages":{name:"Celtic languages",names:["Celtic languages"],"iso639-2":"cel","iso639-1":null},"Central American Indian languages":{name:"Central American Indian languages",names:["Central American Indian languages"],"iso639-2":"cai","iso639-1":null},"Central Khmer":{name:"Central Khmer",names:["Central Khmer"],"iso639-2":"khm","iso639-1":"km"},Chagatai:Ys,"Chamic languages":{name:"Chamic languages",names:["Chamic languages"],"iso639-2":"cmc","iso639-1":null},Chamorro:Xs,Chechen:$s,Cherokee:Zs,Chewa:Js,Cheyenne:Qs,Chibcha:el,Chichewa:tl,Chinese:nl,"Chinook jargon":{name:"Chinook jargon",names:["Chinook jargon"],"iso639-2":"chn","iso639-1":null},Chipewyan:il,Choctaw:al,Chuang:rl,"Church Slavic":{name:"Church Slavic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Church Slavonic":{name:"Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Chuukese:ol,Chuvash:sl,"Classical Nepal Bhasa":{name:"Classical Nepal Bhasa",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Newari":{name:"Classical Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Syriac":{name:"Classical Syriac",names:["Classical Syriac"],"iso639-2":"syc","iso639-1":null},"Cook Islands Maori":{name:"Cook Islands Maori",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null},Coptic:ll,Cornish:ul,Corsican:hl,Cree:cl,Creek:fl,"Creoles and pidgins":{name:"Creoles and pidgins",names:["Creoles and pidgins"],"iso639-2":"crp","iso639-1":null},"Creoles and pidgins, English based":{name:"Creoles and pidgins, English based",names:["Creoles and pidgins, English based"],"iso639-2":"cpe","iso639-1":null},"Creoles and pidgins, French-based":{name:"Creoles and pidgins, French-based",names:["Creoles and pidgins, French-based"],"iso639-2":"cpf","iso639-1":null},"Creoles and pidgins, Portuguese-based":{name:"Creoles and pidgins, Portuguese-based",names:["Creoles and pidgins, Portuguese-based"],"iso639-2":"cpp","iso639-1":null},"Crimean Tatar":{name:"Crimean Tatar",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},"Crimean Turkish":{name:"Crimean Turkish",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},Croatian:dl,"Cushitic languages":{name:"Cushitic languages",names:["Cushitic languages"],"iso639-2":"cus","iso639-1":null},Czech:gl,Dakota:pl,Danish:vl,Dargwa:ml,Delaware:yl,"Dene Suline":{name:"Dene Suline",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null},Dhivehi:_l,Dimili:bl,Dimli:wl,Dinka:xl,Divehi:kl,Dogri:Sl,Dogrib:Cl,"Dravidian languages":{name:"Dravidian languages",names:["Dravidian languages"],"iso639-2":"dra","iso639-1":null},Duala:El,Dutch:Al,"Dutch, Middle (ca.1050-1350)":{name:"Dutch, Middle (ca.1050-1350)",names:["Dutch, Middle (ca.1050-1350)"],"iso639-2":"dum","iso639-1":null},Dyula:Rl,Dzongkha:Ml,"Eastern Frisian":{name:"Eastern Frisian",names:["Eastern Frisian"],"iso639-2":"frs","iso639-1":null},Edo:Tl,Efik:Bl,"Egyptian (Ancient)":{name:"Egyptian (Ancient)",names:["Egyptian (Ancient)"],"iso639-2":"egy","iso639-1":null},Ekajuk:Nl,Elamite:Dl,English:Pl,"English, Middle (1100-1500)":{name:"English, Middle (1100-1500)",names:["English, Middle (1100-1500)"],"iso639-2":"enm","iso639-1":null},"English, Old (ca.450-1100)":{name:"English, Old (ca.450-1100)",names:["English, Old (ca.450-1100)"],"iso639-2":"ang","iso639-1":null},Erzya:Ol,Esperanto:zl,Estonian:Fl,Ewe:Ll,Ewondo:Il,Fang:jl,Fanti:Hl,Faroese:Vl,Fijian:Ul,Filipino:Gl,Finnish:Wl,"Finno-Ugrian languages":{name:"Finno-Ugrian languages",names:["Finno-Ugrian languages"],"iso639-2":"fiu","iso639-1":null},Flemish:Kl,Fon:ql,French:Yl,"French, Middle (ca.1400-1600)":{name:"French, Middle (ca.1400-1600)",names:["French, Middle (ca.1400-1600)"],"iso639-2":"frm","iso639-1":null},"French, Old (842-ca.1400)":{name:"French, Old (842-ca.1400)",names:["French, Old (842-ca.1400)"],"iso639-2":"fro","iso639-1":null},Friulian:Xl,Fulah:$l,Ga:Zl,Gaelic:Jl,"Galibi Carib":{name:"Galibi Carib",names:["Galibi Carib"],"iso639-2":"car","iso639-1":null},Galician:Ql,Ganda:eu,Gayo:tu,Gbaya:nu,Geez:iu,Georgian:au,German:ru,"German, Low":{name:"German, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"German, Middle High (ca.1050-1500)":{name:"German, Middle High (ca.1050-1500)",names:["German, Middle High (ca.1050-1500)"],"iso639-2":"gmh","iso639-1":null},"German, Old High (ca.750-1050)":{name:"German, Old High (ca.750-1050)",names:["German, Old High (ca.750-1050)"],"iso639-2":"goh","iso639-1":null},"Germanic languages":{name:"Germanic languages",names:["Germanic languages"],"iso639-2":"gem","iso639-1":null},Gikuyu:ou,Gilbertese:su,Gondi:lu,Gorontalo:uu,Gothic:hu,Grebo:cu,"Greek, Ancient (to 1453)":{name:"Greek, Ancient (to 1453)",names:["Greek, Ancient (to 1453)"],"iso639-2":"grc","iso639-1":null},"Greek, Modern (1453-)":{name:"Greek, Modern (1453-)",names:["Greek, Modern (1453-)"],"iso639-2":"gre/ell","iso639-1":"el"},Greenlandic:fu,Guarani:du,Gujarati:gu,"Gwich'in":{name:"Gwich'in",names:["Gwich'in"],"iso639-2":"gwi","iso639-1":null},Haida:pu,Haitian:vu,"Haitian Creole":{name:"Haitian Creole",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"},Hausa:mu,Hawaiian:yu,Hebrew:_u,Herero:bu,Hiligaynon:wu,"Himachali languages":{name:"Himachali languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Hindi:xu,"Hiri Motu":{name:"Hiri Motu",names:["Hiri Motu"],"iso639-2":"hmo","iso639-1":"ho"},Hittite:ku,Hmong:Su,Hungarian:Cu,Hupa:Eu,Iban:Au,Icelandic:Ru,Ido:Mu,Igbo:Tu,"Ijo languages":{name:"Ijo languages",names:["Ijo languages"],"iso639-2":"ijo","iso639-1":null},Iloko:Bu,"Imperial Aramaic (700-300 BCE)":{name:"Imperial Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},"Inari Sami":{name:"Inari Sami",names:["Inari Sami"],"iso639-2":"smn","iso639-1":null},"Indic languages":{name:"Indic languages",names:["Indic languages"],"iso639-2":"inc","iso639-1":null},"Indo-European languages":{name:"Indo-European languages",names:["Indo-European languages"],"iso639-2":"ine","iso639-1":null},Indonesian:Nu,Ingush:Du,"Interlingua (International Auxiliary Language Association)":{name:"Interlingua (International Auxiliary Language Association)",names:["Interlingua (International Auxiliary Language Association)"],"iso639-2":"ina","iso639-1":"ia"},Interlingue:Pu,Inuktitut:Ou,Inupiaq:zu,"Iranian languages":{name:"Iranian languages",names:["Iranian languages"],"iso639-2":"ira","iso639-1":null},Irish:Fu,"Irish, Middle (900-1200)":{name:"Irish, Middle (900-1200)",names:["Irish, Middle (900-1200)"],"iso639-2":"mga","iso639-1":null},"Irish, Old (to 900)":{name:"Irish, Old (to 900)",names:["Irish, Old (to 900)"],"iso639-2":"sga","iso639-1":null},"Iroquoian languages":{name:"Iroquoian languages",names:["Iroquoian languages"],"iso639-2":"iro","iso639-1":null},Italian:Lu,Japanese:Iu,Javanese:ju,Jingpho:Hu,"Judeo-Arabic":{name:"Judeo-Arabic",names:["Judeo-Arabic"],"iso639-2":"jrb","iso639-1":null},"Judeo-Persian":{name:"Judeo-Persian",names:["Judeo-Persian"],"iso639-2":"jpr","iso639-1":null},Kabardian:Vu,Kabyle:Uu,Kachin:Gu,Kalaallisut:Wu,Kalmyk:Ku,Kamba:qu,Kannada:Yu,Kanuri:Xu,Kapampangan:$u,"Kara-Kalpak":{name:"Kara-Kalpak",names:["Kara-Kalpak"],"iso639-2":"kaa","iso639-1":null},"Karachay-Balkar":{name:"Karachay-Balkar",names:["Karachay-Balkar"],"iso639-2":"krc","iso639-1":null},Karelian:Zu,"Karen languages":{name:"Karen languages",names:["Karen languages"],"iso639-2":"kar","iso639-1":null},Kashmiri:Ju,Kashubian:Qu,Kawi:eh,Kazakh:th,Khasi:nh,"Khoisan languages":{name:"Khoisan languages",names:["Khoisan languages"],"iso639-2":"khi","iso639-1":null},Khotanese:ih,Kikuyu:ah,Kimbundu:rh,Kinyarwanda:oh,Kirdki:sh,Kirghiz:lh,Kirmanjki:uh,Klingon:hh,Komi:ch,Kongo:fh,Konkani:dh,Korean:gh,Kosraean:ph,Kpelle:vh,"Kru languages":{name:"Kru languages",names:["Kru languages"],"iso639-2":"kro","iso639-1":null},Kuanyama:mh,Kumyk:yh,Kurdish:_h,Kurukh:bh,Kutenai:wh,Kwanyama:xh,Kyrgyz:kh,Ladino:Sh,Lahnda:Ch,Lamba:Eh,"Land Dayak languages":{name:"Land Dayak languages",names:["Land Dayak languages"],"iso639-2":"day","iso639-1":null},Lao:Ah,Latin:Rh,Latvian:Mh,Leonese:Th,Letzeburgesch:Bh,Lezghian:Nh,Limburgan:Dh,Limburger:Ph,Limburgish:Oh,Lingala:zh,Lithuanian:Fh,Lojban:Lh,"Low German":{name:"Low German",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Low Saxon":{name:"Low Saxon",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Lower Sorbian":{name:"Lower Sorbian",names:["Lower Sorbian"],"iso639-2":"dsb","iso639-1":null},Lozi:Ih,"Luba-Katanga":{name:"Luba-Katanga",names:["Luba-Katanga"],"iso639-2":"lub","iso639-1":"lu"},"Luba-Lulua":{name:"Luba-Lulua",names:["Luba-Lulua"],"iso639-2":"lua","iso639-1":null},Luiseno:jh,"Lule Sami":{name:"Lule Sami",names:["Lule Sami"],"iso639-2":"smj","iso639-1":null},Lunda:Hh,"Luo (Kenya and Tanzania)":{name:"Luo (Kenya and Tanzania)",names:["Luo (Kenya and Tanzania)"],"iso639-2":"luo","iso639-1":null},Lushai:Vh,Luxembourgish:Uh,"Macedo-Romanian":{name:"Macedo-Romanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null},Macedonian:Gh,Madurese:Wh,Magahi:Kh,Maithili:qh,Makasar:Yh,Malagasy:Xh,Malay:$h,Malayalam:Zh,Maldivian:Jh,Maltese:Qh,Manchu:ec,Mandar:tc,Mandingo:nc,Manipuri:ic,"Manobo languages":{name:"Manobo languages",names:["Manobo languages"],"iso639-2":"mno","iso639-1":null},Manx:ac,Maori:rc,Mapuche:oc,Mapudungun:sc,Marathi:lc,Mari:uc,Marshallese:hc,Marwari:cc,Masai:fc,"Mayan languages":{name:"Mayan languages",names:["Mayan languages"],"iso639-2":"myn","iso639-1":null},Mende:dc,"Mi'kmaq":{name:"Mi'kmaq",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null},Micmac:gc,Minangkabau:pc,Mirandese:vc,Mohawk:mc,Moksha:yc,Moldavian:_c,Moldovan:bc,"Mon-Khmer languages":{name:"Mon-Khmer languages",names:["Mon-Khmer languages"],"iso639-2":"mkh","iso639-1":null},Mong:wc,Mongo:xc,Mongolian:kc,Montenegrin:Sc,Mossi:Cc,"Multiple languages":{name:"Multiple languages",names:["Multiple languages"],"iso639-2":"mul","iso639-1":null},"Munda languages":{name:"Munda languages",names:["Munda languages"],"iso639-2":"mun","iso639-1":null},"N'Ko":{name:"N'Ko",names:["N'Ko"],"iso639-2":"nqo","iso639-1":null},"Nahuatl languages":{name:"Nahuatl languages",names:["Nahuatl languages"],"iso639-2":"nah","iso639-1":null},Nauru:Ec,Navaho:Ac,Navajo:Rc,"Ndebele, North":{name:"Ndebele, North",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Ndebele, South":{name:"Ndebele, South",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},Ndonga:Mc,Neapolitan:Tc,"Nepal Bhasa":{name:"Nepal Bhasa",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null},Nepali:Bc,Newari:Nc,Nias:Dc,"Niger-Kordofanian languages":{name:"Niger-Kordofanian languages",names:["Niger-Kordofanian languages"],"iso639-2":"nic","iso639-1":null},"Nilo-Saharan languages":{name:"Nilo-Saharan languages",names:["Nilo-Saharan languages"],"iso639-2":"ssa","iso639-1":null},Niuean:Pc,"No linguistic content":{name:"No linguistic content",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},Nogai:Oc,"Norse, Old":{name:"Norse, Old",names:["Norse, Old"],"iso639-2":"non","iso639-1":null},"North American Indian languages":{name:"North American Indian languages",names:["North American Indian languages"],"iso639-2":"nai","iso639-1":null},"North Ndebele":{name:"North Ndebele",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Northern Frisian":{name:"Northern Frisian",names:["Northern Frisian"],"iso639-2":"frr","iso639-1":null},"Northern Sami":{name:"Northern Sami",names:["Northern Sami"],"iso639-2":"sme","iso639-1":"se"},"Northern Sotho":{name:"Northern Sotho",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},Norwegian:zc,"Norwegian Bokmål":{name:"Norwegian Bokmål",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},"Norwegian Nynorsk":{name:"Norwegian Nynorsk",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},"Not applicable":{name:"Not applicable",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},"Nubian languages":{name:"Nubian languages",names:["Nubian languages"],"iso639-2":"nub","iso639-1":null},Nuosu:Fc,Nyamwezi:Lc,Nyanja:Ic,Nyankole:jc,"Nynorsk, Norwegian":{name:"Nynorsk, Norwegian",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},Nyoro:Hc,Nzima:Vc,Occidental:Uc,"Occitan (post 1500)":{name:"Occitan (post 1500)",names:["Occitan (post 1500)"],"iso639-2":"oci","iso639-1":"oc"},"Occitan, Old (to 1500)":{name:"Occitan, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},"Official Aramaic (700-300 BCE)":{name:"Official Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},Oirat:Gc,Ojibwa:Wc,"Old Bulgarian":{name:"Old Bulgarian",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Church Slavonic":{name:"Old Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Newari":{name:"Old Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Old Slavonic":{name:"Old Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Oriya:Kc,Oromo:qc,Osage:Yc,Ossetian:Xc,Ossetic:$c,"Otomian languages":{name:"Otomian languages",names:["Otomian languages"],"iso639-2":"oto","iso639-1":null},Pahlavi:Zc,Palauan:Jc,Pali:Qc,Pampanga:ef,Pangasinan:tf,Panjabi:nf,Papiamento:af,"Papuan languages":{name:"Papuan languages",names:["Papuan languages"],"iso639-2":"paa","iso639-1":null},Pashto:rf,Pedi:of,Persian:sf,"Persian, Old (ca.600-400 B.C.)":{name:"Persian, Old (ca.600-400 B.C.)",names:["Persian, Old (ca.600-400 B.C.)"],"iso639-2":"peo","iso639-1":null},"Philippine languages":{name:"Philippine languages",names:["Philippine languages"],"iso639-2":"phi","iso639-1":null},Phoenician:lf,Pilipino:uf,Pohnpeian:hf,Polish:cf,Portuguese:ff,"Prakrit languages":{name:"Prakrit languages",names:["Prakrit languages"],"iso639-2":"pra","iso639-1":null},"Provençal, Old (to 1500)":{name:"Provençal, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},Punjabi:df,Pushto:gf,Quechua:pf,Rajasthani:vf,Rapanui:mf,Rarotongan:yf,"Reserved for local use":{name:"Reserved for local use",names:["Reserved for local use"],"iso639-2":"qaa-qtz","iso639-1":null},"Romance languages":{name:"Romance languages",names:["Romance languages"],"iso639-2":"roa","iso639-1":null},Romanian:_f,Romansh:bf,Romany:wf,Rundi:xf,Russian:kf,Sakan:Sf,"Salishan languages":{name:"Salishan languages",names:["Salishan languages"],"iso639-2":"sal","iso639-1":null},"Samaritan Aramaic":{name:"Samaritan Aramaic",names:["Samaritan Aramaic"],"iso639-2":"sam","iso639-1":null},"Sami languages":{name:"Sami languages",names:["Sami languages"],"iso639-2":"smi","iso639-1":null},Samoan:Cf,Sandawe:Ef,Sango:Af,Sanskrit:Rf,Santali:Mf,Sardinian:Tf,Sasak:Bf,"Saxon, Low":{name:"Saxon, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},Scots:Nf,"Scottish Gaelic":{name:"Scottish Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"},Selkup:Df,"Semitic languages":{name:"Semitic languages",names:["Semitic languages"],"iso639-2":"sem","iso639-1":null},Sepedi:Pf,Serbian:Of,Serer:zf,Shan:Ff,Shona:Lf,"Sichuan Yi":{name:"Sichuan Yi",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"},Sicilian:If,Sidamo:jf,"Sign Languages":{name:"Sign Languages",names:["Sign Languages"],"iso639-2":"sgn","iso639-1":null},Siksika:Hf,Sindhi:Vf,Sinhala:Uf,Sinhalese:Gf,"Sino-Tibetan languages":{name:"Sino-Tibetan languages",names:["Sino-Tibetan languages"],"iso639-2":"sit","iso639-1":null},"Siouan languages":{name:"Siouan languages",names:["Siouan languages"],"iso639-2":"sio","iso639-1":null},"Skolt Sami":{name:"Skolt Sami",names:["Skolt Sami"],"iso639-2":"sms","iso639-1":null},"Slave (Athapascan)":{name:"Slave (Athapascan)",names:["Slave (Athapascan)"],"iso639-2":"den","iso639-1":null},"Slavic languages":{name:"Slavic languages",names:["Slavic languages"],"iso639-2":"sla","iso639-1":null},Slovak:Wf,Slovenian:Kf,Sogdian:qf,Somali:Yf,"Songhai languages":{name:"Songhai languages",names:["Songhai languages"],"iso639-2":"son","iso639-1":null},Soninke:Xf,"Sorbian languages":{name:"Sorbian languages",names:["Sorbian languages"],"iso639-2":"wen","iso639-1":null},"Sotho, Northern":{name:"Sotho, Northern",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},"Sotho, Southern":{name:"Sotho, Southern",names:["Sotho, Southern"],"iso639-2":"sot","iso639-1":"st"},"South American Indian languages":{name:"South American Indian languages",names:["South American Indian languages"],"iso639-2":"sai","iso639-1":null},"South Ndebele":{name:"South Ndebele",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},"Southern Altai":{name:"Southern Altai",names:["Southern Altai"],"iso639-2":"alt","iso639-1":null},"Southern Sami":{name:"Southern Sami",names:["Southern Sami"],"iso639-2":"sma","iso639-1":null},Spanish:$f,"Sranan Tongo":{name:"Sranan Tongo",names:["Sranan Tongo"],"iso639-2":"srn","iso639-1":null},"Standard Moroccan Tamazight":{name:"Standard Moroccan Tamazight",names:["Standard Moroccan Tamazight"],"iso639-2":"zgh","iso639-1":null},Sukuma:Zf,Sumerian:Jf,Sundanese:Qf,Susu:ed,Swahili:td,Swati:nd,Swedish:id,"Swiss German":{name:"Swiss German",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null},Syriac:ad,Tagalog:rd,Tahitian:od,"Tai languages":{name:"Tai languages",names:["Tai languages"],"iso639-2":"tai","iso639-1":null},Tajik:sd,Tamashek:ld,Tamil:ud,Tatar:hd,Telugu:cd,Tereno:fd,Tetum:dd,Thai:gd,Tibetan:pd,Tigre:vd,Tigrinya:md,Timne:yd,Tiv:_d,"tlhIngan-Hol":{name:"tlhIngan-Hol",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null},Tlingit:bd,"Tok Pisin":{name:"Tok Pisin",names:["Tok Pisin"],"iso639-2":"tpi","iso639-1":null},Tokelau:wd,"Tonga (Nyasa)":{name:"Tonga (Nyasa)",names:["Tonga (Nyasa)"],"iso639-2":"tog","iso639-1":null},"Tonga (Tonga Islands)":{name:"Tonga (Tonga Islands)",names:["Tonga (Tonga Islands)"],"iso639-2":"ton","iso639-1":"to"},Tsimshian:xd,Tsonga:kd,Tswana:Sd,Tumbuka:Cd,"Tupi languages":{name:"Tupi languages",names:["Tupi languages"],"iso639-2":"tup","iso639-1":null},Turkish:Ed,"Turkish, Ottoman (1500-1928)":{name:"Turkish, Ottoman (1500-1928)",names:["Turkish, Ottoman (1500-1928)"],"iso639-2":"ota","iso639-1":null},Turkmen:Ad,Tuvalu:Rd,Tuvinian:Md,Twi:Td,Udmurt:Bd,Ugaritic:Nd,Uighur:Dd,Ukrainian:Pd,Umbundu:Od,"Uncoded languages":{name:"Uncoded languages",names:["Uncoded languages"],"iso639-2":"mis","iso639-1":null},Undetermined:zd,"Upper Sorbian":{name:"Upper Sorbian",names:["Upper Sorbian"],"iso639-2":"hsb","iso639-1":null},Urdu:Fd,Uyghur:Ld,Uzbek:Id,Vai:jd,Valencian:Hd,Venda:Vd,Vietnamese:Ud,"Volapük":{name:"Volapük",names:["Volapük"],"iso639-2":"vol","iso639-1":"vo"},Votic:Gd,"Wakashan languages":{name:"Wakashan languages",names:["Wakashan languages"],"iso639-2":"wak","iso639-1":null},Walloon:Wd,Waray:Kd,Washo:qd,Welsh:Yd,"Western Frisian":{name:"Western Frisian",names:["Western Frisian"],"iso639-2":"fry","iso639-1":"fy"},"Western Pahari languages":{name:"Western Pahari languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Wolaitta:Xd,Wolaytta:$d,Wolof:Zd,Xhosa:Jd,Yakut:Qd,Yao:eg,Yapese:tg,Yiddish:ng,Yoruba:ig,"Yupik languages":{name:"Yupik languages",names:["Yupik languages"],"iso639-2":"ypk","iso639-1":null},"Zande languages":{name:"Zande languages",names:["Zande languages"],"iso639-2":"znd","iso639-1":null},Zapotec:ag,Zaza:rg,Zazaki:og,Zenaga:sg,Zhuang:lg,Zulu:ug,Zuni:hg};function fg(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}var dg=[];var gg=Object.keys(cg);Object.keys(zo).map(function(e){var t=zo[e];var n=gg.find(function(e){return e.toLowerCase()===t.language.toLowerCase()});if(t.location&&n){var i;dg.push((i={},fg(i,"name",t.language),fg(i,"location",t.location),fg(i,"tag",t.tag),fg(i,"lcid",t.id),fg(i,"iso639-2",cg[n]["iso639-2"]),fg(i,"iso639-1",cg[n]["iso639-1"]),i))}});var pg={ar:"ar-SA",ca:"ca-ES",da:"da-DK",en:"en-US",ko:"ko-KR",pa:"pa-IN",pt:"pt-BR",sv:"sv-SE"};function vg(t){if(typeof t!=="string"||t.length===5)return t;if(pg[t])return pg[t];var e=dg.filter(function(e){return e["iso639-1"]===t});if(!e.length)return t;else if(e.length===1)return e[0].tag;else if(e.find(function(e){return e.tag==="".concat(t,"-").concat(t.toUpperCase())}))return"".concat(t,"-").concat(t.toUpperCase());else return e[0].tag}function mg(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function yg(){return"".concat(mg()).concat(mg(),"-").concat(mg(),"-").concat(mg(),"-").concat(mg(),"-").concat(mg()).concat(mg()).concat(mg())}var _g="D3PLUS-COMMON-RESET";var bg={and:"y",Back:"Atrás","Click to Expand":"Clic para Ampliar","Click to Hide":"Clic para Ocultar","Click to Highlight":"Clic para Resaltar","Click to Reset":"Clic para Restablecer",Download:"Descargar","Loading Visualization":"Cargando Visualización","No Data Available":"Datos No Disponibles","Powered by D3plus":"Funciona con D3plus",Share:"Porcentaje","Shift+Click to Hide":"Mayús+Clic para Ocultar",Total:"Total",Values:"Valores"};var wg={"es-ES":bg};function xg(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function kg(e,t){for(var n=0;n1&&arguments[1]!==undefined?arguments[1]:i._locale;var n=wg[t];return n&&n[e]?n[e]:e};this._uuid=yg()}Sg(e,[{key:"config",value:function n(e){var i=this;if(!this._configDefault){var n={};Eg(this.__proto__).forEach(function(e){var t=i[e]();if(t!==i)n[e]=_n(t)?wn({},t):t});this._configDefault=n}if(arguments.length){for(var t in e){if({}.hasOwnProperty.call(e,t)&&t in this){var a=e[t];if(a===_g){if(t==="on")this._on=this._configDefault[t];else this[t](this._configDefault[t])}else{Cg(a,this._configDefault[t]);this[t](a)}}}return this}else{var r={};Eg(this.__proto__).forEach(function(e){r[e]=i[e]()});return r}}},{key:"locale",value:function e(t){return arguments.length?(this._locale=vg(t),this):this._locale}},{key:"on",value:function e(t,n){return arguments.length===2?(this._on[t]=n,this):arguments.length?typeof t==="string"?this._on[t]:(this._on=Object.assign({},this._on,t),this):this._on}},{key:"parent",value:function e(t){return arguments.length?(this._parent=t,this):this._parent}},{key:"translate",value:function e(t){return arguments.length?(this._translate=t,this):this._translate}},{key:"shapeConfig",value:function e(t){return arguments.length?(this._shapeConfig=wn(this._shapeConfig,t),this):this._shapeConfig}}]);return e}();function Rg(n){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];if(!e||!(e instanceof Array)||!e.length)return undefined;return e.reduce(function(e,t){return Math.abs(t-n)0&&arguments[0]!==undefined?arguments[0]:this._shapeConfig;var a=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"shape";var t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var n={duration:this._duration,on:{}};var o=function e(a){return function(e,t,n){var i;while(e.__d3plus__){if(i)e.__d3plusParent__=i;i=e;t=e.i;e=e.data||e.feature}return a.bind(r)(e,t,n||i)}};var s=function e(t,n){for(var i in n){if({}.hasOwnProperty.call(n,i)&&!i.includes(".")||i.includes(".".concat(a))){t.on[i]=o(n[i])}}};var l=function t(e){return e.map(function(e){if(e instanceof Array)return t(e);else if(Mg(e)==="object")return i({},e);else if(typeof e==="function")return o(e);else return e})};var i=function e(t,n){for(var i in n){if({}.hasOwnProperty.call(n,i)){if(i==="on")s(t,n[i]);else if(typeof n[i]==="function"){t[i]=o(n[i])}else if(n[i]instanceof Array){t[i]=l(n[i])}else if(Mg(n[i])==="object"){t[i]={on:{}};e(t[i],n[i])}else t[i]=n[i]}}};i(n,e);if(this._on)s(n,this._on);if(t&&e[t]){i(n,e[t]);if(e[t].on)s(n,e[t].on)}return n}function Bg(t){return function e(){return t}}var Ng="http://www.w3.org/1999/xhtml";var Dg={svg:"http://www.w3.org/2000/svg",xhtml:Ng,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Pg(e){var t=e+="",n=t.indexOf(":");if(n>=0&&(t=e.slice(0,n))!=="xmlns")e=e.slice(n+1);return Dg.hasOwnProperty(t)?{space:Dg[t],local:e}:e}function Og(n){return function(){var e=this.ownerDocument,t=this.namespaceURI;return t===Ng&&e.documentElement.namespaceURI===Ng?e.createElement(n):e.createElementNS(t,n)}}function zg(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Fg(e){var t=Pg(e);return(t.local?zg:Og)(t)}function Lg(){}function Ig(e){return e==null?Lg:function(){return this.querySelector(e)}}function jg(e){if(typeof e!=="function")e=Ig(e);for(var t=this._groups,n=t.length,i=new Array(n),a=0;a=_)_=y+1;while(!(w=v[_])&&++_=0;){if(o=i[a]){if(r&&o.compareDocumentPosition(r)^4)r.parentNode.insertBefore(o,r);r=o}}}return this}function ap(n){if(!n)n=rp;function e(e,t){return e&&t?n(e.__data__,t.__data__):!e-!t}for(var t=this._groups,i=t.length,a=new Array(i),r=0;rt?1:e>=t?0:NaN}function op(){var e=arguments[0];arguments[0]=this;e.apply(null,arguments);return this}function sp(){var e=new Array(this.size()),t=-1;this.each(function(){e[++t]=this});return e}function lp(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?bp:typeof t==="function"?xp:wp)(e,t,n==null?"":n)):Sp(this.node(),e)}function Sp(e,t){return e.style.getPropertyValue(t)||_p(e).getComputedStyle(e,null).getPropertyValue(t)}function Cp(e){return function(){delete this[e]}}function Ep(e,t){return function(){this[e]=t}}function Ap(t,n){return function(){var e=n.apply(this,arguments);if(e==null)delete this[t];else this[t]=e}}function Rp(e,t){return arguments.length>1?this.each((t==null?Cp:typeof t==="function"?Ap:Ep)(e,t)):this.node()[e]}function Mp(e){return e.trim().split(/^|\s+/)}function Tp(e){return e.classList||new Bp(e)}function Bp(e){this._node=e;this._names=Mp(e.getAttribute("class")||"")}Bp.prototype={add:function e(t){var n=this._names.indexOf(t);if(n<0){this._names.push(t);this._node.setAttribute("class",this._names.join(" "))}},remove:function e(t){var n=this._names.indexOf(t);if(n>=0){this._names.splice(n,1);this._node.setAttribute("class",this._names.join(" "))}},contains:function e(t){return this._names.indexOf(t)>=0}};function Np(e,t){var n=Tp(e),i=-1,a=t.length;while(++i=0)t=e.slice(n+1),e=e.slice(0,n);return{type:e,name:t}})}function cv(r){return function(){var e=this.__on;if(!e)return;for(var t=0,n=-1,i=e.length,a;t=0)t=e.slice(n+1),e=e.slice(0,n);if(e&&!i.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:t}})}Tv.prototype=Mv.prototype={constructor:Tv,on:function e(t,n){var i=this._,a=Bv(t+"",i),r,o=-1,s=a.length;if(arguments.length<2){while(++o0)for(var i=new Array(r),a=0,r,o;a=0)e._call.call(null,t);e=e._next}--Pv}function $v(){Hv=(jv=Uv.now())+Vv;Pv=Ov=0;try{Xv()}finally{Pv=0;Jv();Hv=0}}function Zv(){var e=Uv.now(),t=e-jv;if(t>Fv)Vv-=t,jv=e}function Jv(){var e,t=Lv,n,i=Infinity;while(t){if(t._call){if(i>t._time)i=t._time;e=t,t=t._next}else{n=t._next,t._next=null;t=e?e._next=n:Lv=n}}Iv=e;Qv(i)}function Qv(e){if(Pv)return;if(Ov)Ov=clearTimeout(Ov);var t=e-Hv;if(t>24){if(eim)throw new Error("too late; already scheduled");return n}function fm(e,t){var n=dm(e,t);if(n.state>om)throw new Error("too late; already running");return n}function dm(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function gm(r,o,s){var l=r.__transition,u;l[o]=s;s.timer=Yv(e,0,s.time);function e(e){s.state=am;s.timer.restart(h,s.delay,s.time);if(s.delay<=e)h(e-s.delay)}function h(e){var t,n,i,a;if(s.state!==am)return f();for(t in l){a=l[t];if(a.name!==s.name)continue;if(a.state===om)return em(h);if(a.state===sm){a.state=um;a.timer.stop();a.on.call("interrupt",r,r.__data__,a.index,a.group);delete l[t]}else if(+trm&&i.state>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1)):(t=Em.exec(e))?Om(parseInt(t[1],16)):(t=Am.exec(e))?new Im(t[1],t[2],t[3],1):(t=Rm.exec(e))?new Im(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Mm.exec(e))?zm(t[1],t[2],t[3],t[4]):(t=Tm.exec(e))?zm(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Bm.exec(e))?Hm(t[1],t[2]/100,t[3]/100,1):(t=Nm.exec(e))?Hm(t[1],t[2]/100,t[3]/100,t[4]):Dm.hasOwnProperty(e)?Om(Dm[e]):e==="transparent"?new Im(NaN,NaN,NaN,0):null}function Om(e){return new Im(e>>16&255,e>>8&255,e&255,1)}function zm(e,t,n,i){if(i<=0)e=t=n=NaN;return new Im(e,t,n,i)}function Fm(e){if(!(e instanceof _m))e=Pm(e);if(!e)return new Im;e=e.rgb();return new Im(e.r,e.g,e.b,e.opacity)}function Lm(e,t,n,i){return arguments.length===1?Fm(e):new Im(e,t,n,i==null?1:i)}function Im(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}mm(Im,Lm,ym(_m,{brighter:function e(t){t=t==null?wm:Math.pow(wm,t);return new Im(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?bm:Math.pow(bm,t);return new Im(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},hex:function e(){return"#"+jm(this.r)+jm(this.g)+jm(this.b)},toString:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}}));function jm(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function Hm(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new Gm(e,t,n,i)}function Vm(e){if(e instanceof Gm)return new Gm(e.h,e.s,e.l,e.opacity);if(!(e instanceof _m))e=Pm(e);if(!e)return new Gm;if(e instanceof Gm)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new Gm(o,s,l,e.opacity)}function Um(e,t,n,i){return arguments.length===1?Vm(e):new Gm(e,t,n,i==null?1:i)}function Gm(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}mm(Gm,Um,ym(_m,{brighter:function e(t){t=t==null?wm:Math.pow(wm,t);return new Gm(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?bm:Math.pow(bm,t);return new Gm(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new Im(Wm(t>=240?t-240:t+120,r,a),Wm(t,r,a),Wm(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));function Wm(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}var Km=Math.PI/180;var qm=180/Math.PI;var Ym=18,Xm=.96422,$m=1,Zm=.82521,Jm=4/29,Qm=6/29,ey=3*Qm*Qm,ty=Qm*Qm*Qm;function ny(e){if(e instanceof ay)return new ay(e.l,e.a,e.b,e.opacity);if(e instanceof cy){if(isNaN(e.h))return new ay(e.l,0,0,e.opacity);var t=e.h*Km;return new ay(e.l,Math.cos(t)*e.c,Math.sin(t)*e.c,e.opacity)}if(!(e instanceof Im))e=Fm(e);var n=ly(e.r),i=ly(e.g),a=ly(e.b),r=ry((.2225045*n+.7168786*i+.0606169*a)/$m),o,s;if(n===i&&i===a)o=s=r;else{o=ry((.4360747*n+.3850649*i+.1430804*a)/Xm);s=ry((.0139322*n+.0971045*i+.7141733*a)/Zm)}return new ay(116*r-16,500*(o-r),200*(r-s),e.opacity)}function iy(e,t,n,i){return arguments.length===1?ny(e):new ay(e,t,n,i==null?1:i)}function ay(e,t,n,i){this.l=+e;this.a=+t;this.b=+n;this.opacity=+i}mm(ay,iy,ym(_m,{brighter:function e(t){return new ay(this.l+Ym*(t==null?1:t),this.a,this.b,this.opacity)},darker:function e(t){return new ay(this.l-Ym*(t==null?1:t),this.a,this.b,this.opacity)},rgb:function e(){var t=(this.l+16)/116,n=isNaN(this.a)?t:t+this.a/500,i=isNaN(this.b)?t:t-this.b/200;n=Xm*oy(n);t=$m*oy(t);i=Zm*oy(i);return new Im(sy(3.1338561*n-1.6168667*t-.4906146*i),sy(-.9787684*n+1.9161415*t+.033454*i),sy(.0719453*n-.2289914*t+1.4052427*i),this.opacity)}}));function ry(e){return e>ty?Math.pow(e,1/3):e/ey+Jm}function oy(e){return e>Qm?e*e*e:ey*(e-Jm)}function sy(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function ly(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function uy(e){if(e instanceof cy)return new cy(e.h,e.c,e.l,e.opacity);if(!(e instanceof ay))e=ny(e);if(e.a===0&&e.b===0)return new cy(NaN,0,e.l,e.opacity);var t=Math.atan2(e.b,e.a)*qm;return new cy(t<0?t+360:t,Math.sqrt(e.a*e.a+e.b*e.b),e.l,e.opacity)}function hy(e,t,n,i){return arguments.length===1?uy(e):new cy(e,t,n,i==null?1:i)}function cy(e,t,n,i){this.h=+e;this.c=+t;this.l=+n;this.opacity=+i}mm(cy,hy,ym(_m,{brighter:function e(t){return new cy(this.h,this.c,this.l+Ym*(t==null?1:t),this.opacity)},darker:function e(t){return new cy(this.h,this.c,this.l-Ym*(t==null?1:t),this.opacity)},rgb:function e(){return ny(this).rgb()}}));var fy=-.14861,dy=+1.78277,gy=-.29227,py=-.90649,vy=+1.97294,my=vy*py,yy=vy*dy,_y=dy*gy-py*fy;function by(e){if(e instanceof xy)return new xy(e.h,e.s,e.l,e.opacity);if(!(e instanceof Im))e=Fm(e);var t=e.r/255,n=e.g/255,i=e.b/255,a=(_y*i+my*t-yy*n)/(_y+my-yy),r=i-a,o=(vy*(n-a)-gy*r)/py,s=Math.sqrt(o*o+r*r)/(vy*a*(1-a)),l=s?Math.atan2(o,r)*qm-120:NaN;return new xy(l<0?l+360:l,s,a,e.opacity)}function wy(e,t,n,i){return arguments.length===1?by(e):new xy(e,t,n,i==null?1:i)}function xy(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}mm(xy,wy,ym(_m,{brighter:function e(t){t=t==null?wm:Math.pow(wm,t);return new xy(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?bm:Math.pow(bm,t);return new xy(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=isNaN(this.h)?0:(this.h+120)*Km,n=+this.l,i=isNaN(this.s)?0:this.s*n*(1-n),a=Math.cos(t),r=Math.sin(t);return new Im(255*(n+i*(fy*a+dy*r)),255*(n+i*(gy*a+py*r)),255*(n+i*(vy*a)),this.opacity)}}));function ky(e){return function(){return e}}function Sy(t,n){return function(e){return t+e*n}}function Cy(t,n,i){return t=Math.pow(t,i),n=Math.pow(n,i)-t,i=1/i,function(e){return Math.pow(t+e*n,i)}}function Ey(n){return(n=+n)===1?Ay:function(e,t){return t-e?Cy(e,t,n):ky(isNaN(e)?t:e)}}function Ay(e,t){var n=t-e;return n?Sy(e,n):ky(isNaN(e)?t:e)}var Ry=function e(t){var o=Ey(t);function n(t,e){var n=o((t=Lm(t)).r,(e=Lm(e)).r),i=o(t.g,e.g),a=o(t.b,e.b),r=Ay(t.opacity,e.opacity);return function(e){t.r=n(e);t.g=i(e);t.b=a(e);t.opacity=r(e);return t+""}}n.gamma=e;return n}(1);function My(e,t){var n=t?t.length:0,i=e?Math.min(n,e.length):0,a=new Array(i),r=new Array(n),o;for(o=0;ot){r=i.slice(t,r);if(s[o])s[o]+=r;else s[++o]=r}if((n=n[0])===(a=a[0])){if(s[o])s[o]+=a;else s[++o]=a}else{s[++o]=null;l.push({i:o,x:By(n,a)})}t=Py.lastIndex}if(t180)t+=360;else if(t-e>180)e+=360;i.push({i:n.push(u(n)+"rotate(",null,a)-2,x:By(e,t)})}else if(t){n.push(u(n)+"rotate("+t+a)}}function h(e,t,n,i){if(e!==t){i.push({i:n.push(u(n)+"skewX(",null,a)-2,x:By(e,t)})}else if(t){n.push(u(n)+"skewX("+t+a)}}function c(e,t,n,i,a,r){if(e!==n||t!==i){var o=a.push(u(a)+"scale(",null,",",null,")");r.push({i:o-4,x:By(e,n)},{i:o-2,x:By(t,i)})}else if(n!==1||i!==1){a.push(u(a)+"scale("+n+","+i+")")}}return function(e,t){var a=[],r=[];e=n(e),t=n(t);i(e.translateX,e.translateY,t.translateX,t.translateY,a,r);o(e.rotate,t.rotate,a,r);h(e.skewX,t.skewX,a,r);c(e.scaleX,e.scaleY,t.scaleX,t.scaleY,a,r);e=t=null;return function(e){var t=-1,n=r.length,i;while(++t=0)e=e.slice(0,t);return!e||e==="start"})}function P_(n,i,a){var r,o,s=D_(i)?cm:fm;return function(){var e=s(this,n),t=e.on;if(t!==r)(o=(r=t).copy()).on(i,a);e.on=o}}function O_(e,t){var n=this._id;return arguments.length<2?dm(this.node(),n).on.on(e):this.each(P_(n,e,t))}function z_(n){return function(){var e=this.parentNode;for(var t in this.__transition){if(+t!==n)return}if(e)e.removeChild(this)}}function F_(){return this.on("end.remove",z_(this._id))}function L_(e){var t=this._name,n=this._id;if(typeof e!=="function")e=Ig(e);for(var i=this._groups,a=i.length,r=new Array(a),o=0;o=f.length){if(d!=null)e.sort(d);return g!=null?g(e):e}var t=-1,r=e.length,o=f[n++],s,l,u=mb(),h,c=i();while(++tf.length)return e;var i,a=r[n-1];if(g!=null&&n>=f.length)i=e.entries();else i=[],e.each(function(e,t){i.push({key:t,values:o(e,n)})});return a!=null?i.sort(function(e,t){return a(e.key,t.key)}):i}return n={object:function e(t){return p(t,0,_b,bb)},map:function e(t){return p(t,0,wb,xb)},entries:function e(t){return o(p(t,0,wb,xb),0)},key:function e(t){f.push(t);return n},sortKeys:function e(t){r[f.length-1]=t;return n},sortValues:function e(t){d=t;return n},rollup:function e(t){g=t;return n}}}function _b(){return{}}function bb(e,t,n){e[t]=n}function wb(){return mb()}function xb(e,t,n){e.set(t,n)}function kb(){}var Sb=mb.prototype;kb.prototype=Cb.prototype={constructor:kb,has:Sb.has,add:function e(t){t+="";this[pb+t]=t;return this},remove:Sb.remove,clear:Sb.clear,values:Sb.keys,size:Sb.size,empty:Sb.empty,each:Sb.each};function Cb(e,t){var n=new kb;if(e instanceof kb)e.each(function(e){n.add(e)});else if(e){var i=-1,a=e.length;if(t==null)while(++i1&&arguments[1]!==undefined?arguments[1]:{};var e=Ab(Pe(a.map(function(e){return Eb(e)}))),o={};e.forEach(function(t){var e;if(r[t])e=r[t](a,function(e){return e[t]});else{var n=a.map(function(e){return e[t]});var i=n.map(function(e){return e||e===false?e.constructor:e}).filter(function(e){return e!==void 0});if(!i.length)e=undefined;else if(i.indexOf(Array)>=0){e=Pe(n.map(function(e){return e instanceof Array?e:[e]}));e=Ab(e);if(e.length===1)e=e[0]}else if(i.indexOf(String)>=0){e=Ab(n);if(e.length===1)e=e[0]}else if(i.indexOf(Number)>=0)e=O(n);else if(i.indexOf(Object)>=0){e=Ab(n.filter(function(e){return e}));if(e.length===1)e=e[0];else e=Rb(e)}else{e=Ab(n.filter(function(e){return e!==void 0}));if(e.length===1)e=e[0]}}o[t]=e});return o}function Mb(e){var a;if(typeof e==="number")a=[e];else a=e.split(/\s+/);if(a.length===1)a=[a[0],a[0],a[0],a[0]];else if(a.length===2)a=a.concat(a);else if(a.length===3)a.push(a[1]);return["top","right","bottom","left"].reduce(function(e,t,n){var i=parseFloat(a[n]);e[t]=i||0;return e},{})}function Tb(){if("-webkit-transform"in document.body.style)return"-webkit-";else if("-moz-transform"in document.body.style)return"-moz-";else if("-ms-transform"in document.body.style)return"-ms-";else if("-o-transform"in document.body.style)return"-o-";else return""}function Bb(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};for(var n in t){if({}.hasOwnProperty.call(t,n))e.style(n,t[n])}}function Nb(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function Db(e,t){for(var n=0;n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?iw(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?iw(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Wb.exec(e))?new ow(t[1],t[2],t[3],1):(t=Kb.exec(e))?new ow(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=qb.exec(e))?iw(t[1],t[2],t[3],t[4]):(t=Yb.exec(e))?iw(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Xb.exec(e))?hw(t[1],t[2]/100,t[3]/100,1):(t=$b.exec(e))?hw(t[1],t[2]/100,t[3]/100,t[4]):Zb.hasOwnProperty(e)?nw(Zb[e]):e==="transparent"?new ow(NaN,NaN,NaN,0):null}function nw(e){return new ow(e>>16&255,e>>8&255,e&255,1)}function iw(e,t,n,i){if(i<=0)e=t=n=NaN;return new ow(e,t,n,i)}function aw(e){if(!(e instanceof Lb))e=tw(e);if(!e)return new ow;e=e.rgb();return new ow(e.r,e.g,e.b,e.opacity)}function rw(e,t,n,i){return arguments.length===1?aw(e):new ow(e,t,n,i==null?1:i)}function ow(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}zb(ow,rw,Fb(Lb,{brighter:function e(t){t=t==null?jb:Math.pow(jb,t);return new ow(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?Ib:Math.pow(Ib,t);return new ow(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:sw,formatHex:sw,formatRgb:lw,toString:lw}));function sw(){return"#"+uw(this.r)+uw(this.g)+uw(this.b)}function lw(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}function uw(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function hw(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new dw(e,t,n,i)}function cw(e){if(e instanceof dw)return new dw(e.h,e.s,e.l,e.opacity);if(!(e instanceof Lb))e=tw(e);if(!e)return new dw;if(e instanceof dw)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new dw(o,s,l,e.opacity)}function fw(e,t,n,i){return arguments.length===1?cw(e):new dw(e,t,n,i==null?1:i)}function dw(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}zb(dw,fw,Fb(Lb,{brighter:function e(t){t=t==null?jb:Math.pow(jb,t);return new dw(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?Ib:Math.pow(Ib,t);return new dw(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new ow(gw(t>=240?t-240:t+120,r,a),gw(t,r,a),gw(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(t===1?")":", "+t+")")}}));function gw(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}function pw(e,t,n){e.prototype=t.prototype=n;n.constructor=e}function vw(e,t){var n=Object.create(e.prototype);for(var i in t){n[i]=t[i]}return n}function mw(){}var yw=.7;var _w=1/yw;var bw="\\s*([+-]?\\d+)\\s*",ww="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",xw="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",kw=/^#([0-9a-f]{3,8})$/,Sw=new RegExp("^rgb\\("+[bw,bw,bw]+"\\)$"),Cw=new RegExp("^rgb\\("+[xw,xw,xw]+"\\)$"),Ew=new RegExp("^rgba\\("+[bw,bw,bw,ww]+"\\)$"),Aw=new RegExp("^rgba\\("+[xw,xw,xw,ww]+"\\)$"),Rw=new RegExp("^hsl\\("+[ww,xw,xw]+"\\)$"),Mw=new RegExp("^hsla\\("+[ww,xw,xw,ww]+"\\)$");var Tw={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};pw(mw,Pw,{copy:function e(t){return Object.assign(new this.constructor,this,t)},displayable:function e(){return this.rgb().displayable()},hex:Bw,formatHex:Bw,formatHsl:Nw,formatRgb:Dw,toString:Dw});function Bw(){return this.rgb().formatHex()}function Nw(){return Gw(this).formatHsl()}function Dw(){return this.rgb().formatRgb()}function Pw(e){var t,n;e=(e+"").trim().toLowerCase();return(t=kw.exec(e))?(n=t[1].length,t=parseInt(t[1],16),n===6?Ow(t):n===3?new Iw(t>>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?zw(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?zw(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Sw.exec(e))?new Iw(t[1],t[2],t[3],1):(t=Cw.exec(e))?new Iw(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Ew.exec(e))?zw(t[1],t[2],t[3],t[4]):(t=Aw.exec(e))?zw(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Rw.exec(e))?Uw(t[1],t[2]/100,t[3]/100,1):(t=Mw.exec(e))?Uw(t[1],t[2]/100,t[3]/100,t[4]):Tw.hasOwnProperty(e)?Ow(Tw[e]):e==="transparent"?new Iw(NaN,NaN,NaN,0):null}function Ow(e){return new Iw(e>>16&255,e>>8&255,e&255,1)}function zw(e,t,n,i){if(i<=0)e=t=n=NaN;return new Iw(e,t,n,i)}function Fw(e){if(!(e instanceof mw))e=Pw(e);if(!e)return new Iw;e=e.rgb();return new Iw(e.r,e.g,e.b,e.opacity)}function Lw(e,t,n,i){return arguments.length===1?Fw(e):new Iw(e,t,n,i==null?1:i)}function Iw(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}pw(Iw,Lw,vw(mw,{brighter:function e(t){t=t==null?_w:Math.pow(_w,t);return new Iw(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?yw:Math.pow(yw,t);return new Iw(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:jw,formatHex:jw,formatRgb:Hw,toString:Hw}));function jw(){return"#"+Vw(this.r)+Vw(this.g)+Vw(this.b)}function Hw(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}function Vw(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function Uw(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new Kw(e,t,n,i)}function Gw(e){if(e instanceof Kw)return new Kw(e.h,e.s,e.l,e.opacity);if(!(e instanceof mw))e=Pw(e);if(!e)return new Kw;if(e instanceof Kw)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new Kw(o,s,l,e.opacity)}function Ww(e,t,n,i){return arguments.length===1?Gw(e):new Kw(e,t,n,i==null?1:i)}function Kw(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}pw(Kw,Ww,vw(mw,{brighter:function e(t){t=t==null?_w:Math.pow(_w,t);return new Kw(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?yw:Math.pow(yw,t);return new Kw(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new Iw(qw(t>=240?t-240:t+120,r,a),qw(t,r,a),qw(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(t===1?")":", "+t+")")}}));function qw(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}function Yw(e,t){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(t).domain(e);break}return this}function Xw(e,t){switch(arguments.length){case 0:break;case 1:this.interpolator(e);break;default:this.interpolator(t).domain(e);break}return this}var $w=Array.prototype;var Zw=$w.map;var Jw=$w.slice;var Qw={name:"implicit"};function ex(){var r=mb(),o=[],i=[],a=Qw;function s(e){var t=e+"",n=r.get(t);if(!n){if(a!==Qw)return a;r.set(t,n=o.push(e))}return i[(n-1)%i.length]}s.domain=function(e){if(!arguments.length)return o.slice();o=[],r=mb();var t=-1,n=e.length,i,a;while(++tn)i=t,t=n,n=i;return function(e){return Math.max(t,Math.min(n,e))}}function hx(e,t,n){var i=e[0],a=e[1],r=t[0],o=t[1];if(a2?cx:hx;u=h=null;return f}function f(e){return isNaN(e=+e)?o:(u||(u=l(t.map(a),n,i)))(a(s(e)))}f.invert=function(e){return s(r((h||(h=l(n,t.map(a),By)))(e)))};f.domain=function(e){return arguments.length?(t=Zw.call(e,rx),s===sx||(s=ux(t)),c()):t.slice()};f.range=function(e){return arguments.length?(n=Jw.call(e),c()):n.slice()};f.rangeRound=function(e){return n=Jw.call(e),i=Iy,c()};f.clamp=function(e){return arguments.length?(s=e?ux(t):sx,f):s!==sx};f.interpolate=function(e){return arguments.length?(i=e,c()):i};f.unknown=function(e){return arguments.length?(o=e,f):o};return function(e,t){a=e,r=t;return c()}}function gx(e,t){return dx()(e,t)}function px(e,t){if((n=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var n,i=e.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+e.slice(n+1)]}function vx(e){return e=px(Math.abs(e)),e?e[1]:NaN}function mx(s,l){return function(e,t){var n=e.length,i=[],a=0,r=s[0],o=0;while(n>0&&r>0){if(o+r+1>t)r=Math.max(1,t-o);i.push(e.substring(n-=r,n+r));if((o+=r+1)>t)break;r=s[a=(a+1)%s.length]}return i.reverse().join(l)}}function yx(t){return function(e){return e.replace(/[0-9]/g,function(e){return t[+e]})}}var _x=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function bx(e){return new wx(e)}bx.prototype=wx.prototype;function wx(e){if(!(t=_x.exec(e)))throw new Error("invalid format: "+e);var t;this.fill=t[1]||" ";this.align=t[2]||">";this.sign=t[3]||"-";this.symbol=t[4]||"";this.zero=!!t[5];this.width=t[6]&&+t[6];this.comma=!!t[7];this.precision=t[8]&&+t[8].slice(1);this.trim=!!t[9];this.type=t[10]||""}wx.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width==null?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision==null?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function xx(e){e:for(var t=e.length,n=1,i=-1,a;n0){if(!+e[n])break e;i=0}break}}return i>0?e.slice(0,i)+e.slice(a+1):e}var kx;function Sx(e,t){var n=px(e,t);if(!n)return e+"";var i=n[0],a=n[1],r=a-(kx=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,o=i.length;return r===o?i:r>o?i+new Array(r-o+1).join("0"):r>0?i.slice(0,r)+"."+i.slice(r):"0."+new Array(1-r).join("0")+px(e,Math.max(0,t+r-1))[0]}function Cx(e,t){var n=px(e,t);if(!n)return e+"";var i=n[0],a=n[1];return a<0?"0."+new Array(-a).join("0")+i:i.length>a+1?i.slice(0,a+1)+"."+i.slice(a+1):i+new Array(a-i.length+2).join("0")}var Ex={"%":function e(t,n){return(t*100).toFixed(n)},b:function e(t){return Math.round(t).toString(2)},c:function e(t){return t+""},d:function e(t){return Math.round(t).toString(10)},e:function e(t,n){return t.toExponential(n)},f:function e(t,n){return t.toFixed(n)},g:function e(t,n){return t.toPrecision(n)},o:function e(t){return Math.round(t).toString(8)},p:function e(t,n){return Cx(t*100,n)},r:Cx,s:Sx,X:function e(t){return Math.round(t).toString(16).toUpperCase()},x:function e(t){return Math.round(t).toString(16)}};function Ax(e){return e}var Rx=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Mx(e){var x=e.grouping&&e.thousands?mx(e.grouping,e.thousands):Ax,i=e.currency,k=e.decimal,S=e.numerals?yx(e.numerals):Ax,a=e.percent||"%";function o(e){e=bx(e);var u=e.fill,h=e.align,c=e.sign,t=e.symbol,f=e.zero,d=e.width,g=e.comma,p=e.precision,v=e.trim,m=e.type;if(m==="n")g=true,m="g";else if(!Ex[m])p==null&&(p=12),v=true,m="g";if(f||u==="0"&&h==="=")f=true,u="0",h="=";var y=t==="$"?i[0]:t==="#"&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",_=t==="$"?i[1]:/[%p]/.test(m)?a:"";var b=Ex[m],w=/[defgprs%]/.test(m);p=p==null?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p));function n(e){var t=y,n=_,i,a,r;if(m==="c"){n=b(e)+n;e=""}else{e=+e;var o=e<0;e=b(Math.abs(e),p);if(v)e=xx(e);if(o&&+e===0)o=false;t=(o?c==="("?c:"-":c==="-"||c==="("?"":c)+t;n=(m==="s"?Rx[8+kx/3]:"")+n+(o&&c==="("?")":"");if(w){i=-1,a=e.length;while(++ir||r>57){n=(r===46?k+e.slice(i+1):e.slice(i))+n;e=e.slice(0,i);break}}}}if(g&&!f)e=x(e,Infinity);var s=t.length+e.length+n.length,l=s>1)+t+e+n+l.slice(s);break;default:e=l+t+e+n;break}return S(e)}n.toString=function(){return e+""};return n}function t(e,t){var n=o((e=bx(e),e.type="f",e)),i=Math.max(-8,Math.min(8,Math.floor(vx(t)/3)))*3,a=Math.pow(10,-i),r=Rx[8+i/3];return function(e){return n(a*e)+r}}return{format:o,formatPrefix:t}}var Tx;var Bx;var Nx;Dx({decimal:".",thousands:",",grouping:[3],currency:["$",""]});function Dx(e){Tx=Mx(e);Bx=Tx.format;Nx=Tx.formatPrefix;return Tx}function Px(e){return Math.max(0,-vx(Math.abs(e)))}function Ox(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(vx(t)/3)))*3-vx(Math.abs(e)))}function zx(e,t){e=Math.abs(e),t=Math.abs(t)-e;return Math.max(0,vx(t)-vx(e))+1}function Fx(e,t,n,i){var a=P(e,t,n),r;i=bx(i==null?",f":i);switch(i.type){case"s":{var o=Math.max(Math.abs(e),Math.abs(t));if(i.precision==null&&!isNaN(r=Ox(a,o)))i.precision=r;return Nx(i,o)}case"":case"e":case"g":case"p":case"r":{if(i.precision==null&&!isNaN(r=zx(a,Math.max(Math.abs(e),Math.abs(t)))))i.precision=r-(i.type==="e");break}case"f":case"%":{if(i.precision==null&&!isNaN(r=Px(a)))i.precision=r-(i.type==="%")*2;break}}return Bx(i)}function Lx(s){var l=s.domain;s.ticks=function(e){var t=l();return pe(t[0],t[t.length-1],e==null?10:e)};s.tickFormat=function(e,t){var n=l();return Fx(n[0],n[n.length-1],e==null?10:e,t)};s.nice=function(e){if(e==null)e=10;var t=l(),n=0,i=t.length-1,a=t[n],r=t[i],o;if(r0){a=Math.floor(a/o)*o;r=Math.ceil(r/o)*o;o=D(a,r,e)}else if(o<0){a=Math.ceil(a*o)/o;r=Math.floor(r*o)/o;o=D(a,r,e)}if(o>0){t[n]=Math.floor(a/o)*o;t[i]=Math.ceil(r/o)*o;l(t)}else if(o<0){t[n]=Math.ceil(a*o)/o;t[i]=Math.floor(r*o)/o;l(t)}return s};return s}function Ix(){var e=gx(sx,sx);e.copy=function(){return fx(e,Ix())};Yw.apply(e,arguments);return Lx(e)}function jx(t){var n;function i(e){return isNaN(e=+e)?n:e}i.invert=i;i.domain=i.range=function(e){return arguments.length?(t=Zw.call(e,rx),i):t.slice()};i.unknown=function(e){return arguments.length?(n=e,i):n};i.copy=function(){return jx(t).unknown(n)};t=arguments.length?Zw.call(t,rx):[0,1];return Lx(i)}function Hx(e,t){e=e.slice();var n=0,i=e.length-1,a=e[n],r=e[i],o;if(r0)for(;ri)break;c.push(u)}}else for(;r=1;--l){u=s*l;if(ui)break;c.push(u)}}}else{c=pe(r,o,Math.min(o-r,h)).map(p)}return a?c.reverse():c};t.tickFormat=function(e,n){if(n==null)n=d===10?".0e":",";if(typeof n!=="function")n=Bx(n);if(e===Infinity)return n;if(e==null)e=10;var i=Math.max(1,d*e/t.ticks().length);return function(e){var t=e/p(Math.round(g(e)));if(t*d0?i[t-1]:a[0],t=a?[r[a-1],i]:[r[t-1],r[t]]};s.unknown=function(e){return arguments.length?(t=e,s):s};s.thresholds=function(){return r.slice()};s.copy=function(){return uk().domain([n,i]).range(o).unknown(t)};return Yw.apply(Lx(s),arguments)}function hk(){var n=[.5],i=[0,1],t,a=1;function r(e){return e<=e?i[A(n,e,0,a)]:t}r.domain=function(e){return arguments.length?(n=Jw.call(e),a=Math.min(n.length,i.length-1),r):n.slice()};r.range=function(e){return arguments.length?(i=Jw.call(e),a=Math.min(n.length,i.length-1),r):i.slice()};r.invertExtent=function(e){var t=i.indexOf(e);return[n[t-1],n[t]]};r.unknown=function(e){return arguments.length?(t=e,r):t};r.copy=function(){return hk().domain(n).range(i).unknown(t)};return Yw.apply(r,arguments)}var ck=new Date,fk=new Date;function dk(r,o,n,i){function s(e){return r(e=new Date(+e)),e}s.floor=s;s.ceil=function(e){return r(e=new Date(e-1)),o(e,1),r(e),e};s.round=function(e){var t=s(e),n=s.ceil(e);return e-t0))return i;do{i.push(a=new Date(+e)),o(e,n),r(e)}while(a=e)while(r(e),!n(e)){e.setTime(e-1)}},function(e,t){if(e>=e){if(t<0)while(++t<=0){while(o(e,-1),!n(e)){}}else while(--t>=0){while(o(e,+1),!n(e)){}}}})};if(n){s.count=function(e,t){ck.setTime(+e),fk.setTime(+t);r(ck),r(fk);return Math.floor(n(ck,fk))};s.every=function(t){t=Math.floor(t);return!isFinite(t)||!(t>0)?null:!(t>1)?s:s.filter(i?function(e){return i(e)%t===0}:function(e){return s.count(0,e)%t===0})}}return s}var gk=dk(function(){},function(e,t){e.setTime(+e+t)},function(e,t){return t-e});gk.every=function(n){n=Math.floor(n);if(!isFinite(n)||!(n>0))return null;if(!(n>1))return gk;return dk(function(e){e.setTime(Math.floor(e/n)*n)},function(e,t){e.setTime(+e+t*n)},function(e,t){return(t-e)/n})};var pk=1e3;var vk=6e4;var mk=36e5;var yk=864e5;var _k=6048e5;var bk=dk(function(e){e.setTime(e-e.getMilliseconds())},function(e,t){e.setTime(+e+t*pk)},function(e,t){return(t-e)/pk},function(e){return e.getUTCSeconds()});var wk=dk(function(e){e.setTime(e-e.getMilliseconds()-e.getSeconds()*pk)},function(e,t){e.setTime(+e+t*vk)},function(e,t){return(t-e)/vk},function(e){return e.getMinutes()});var xk=dk(function(e){e.setTime(e-e.getMilliseconds()-e.getSeconds()*pk-e.getMinutes()*vk)},function(e,t){e.setTime(+e+t*mk)},function(e,t){return(t-e)/mk},function(e){return e.getHours()});var kk=dk(function(e){e.setHours(0,0,0,0)},function(e,t){e.setDate(e.getDate()+t)},function(e,t){return(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*vk)/yk},function(e){return e.getDate()-1});function Sk(t){return dk(function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7);e.setHours(0,0,0,0)},function(e,t){e.setDate(e.getDate()+t*7)},function(e,t){return(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*vk)/_k})}var Ck=Sk(0);var Ek=Sk(1);var Ak=Sk(2);var Rk=Sk(3);var Mk=Sk(4);var Tk=Sk(5);var Bk=Sk(6);var Nk=dk(function(e){e.setDate(1);e.setHours(0,0,0,0)},function(e,t){e.setMonth(e.getMonth()+t)},function(e,t){return t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12},function(e){return e.getMonth()});var Dk=dk(function(e){e.setMonth(0,1);e.setHours(0,0,0,0)},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e,t){return t.getFullYear()-e.getFullYear()},function(e){return e.getFullYear()});Dk.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:dk(function(e){e.setFullYear(Math.floor(e.getFullYear()/n)*n);e.setMonth(0,1);e.setHours(0,0,0,0)},function(e,t){e.setFullYear(e.getFullYear()+t*n)})};var Pk=dk(function(e){e.setUTCSeconds(0,0)},function(e,t){e.setTime(+e+t*vk)},function(e,t){return(t-e)/vk},function(e){return e.getUTCMinutes()});var Ok=dk(function(e){e.setUTCMinutes(0,0,0)},function(e,t){e.setTime(+e+t*mk)},function(e,t){return(t-e)/mk},function(e){return e.getUTCHours()});var zk=dk(function(e){e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+t)},function(e,t){return(t-e)/yk},function(e){return e.getUTCDate()-1});function Fk(t){return dk(function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+t*7)},function(e,t){return(t-e)/_k})}var Lk=Fk(0);var Ik=Fk(1);var jk=Fk(2);var Hk=Fk(3);var Vk=Fk(4);var Uk=Fk(5);var Gk=Fk(6);var Wk=dk(function(e){e.setUTCDate(1);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCMonth(e.getUTCMonth()+t)},function(e,t){return t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12},function(e){return e.getUTCMonth()});var Kk=dk(function(e){e.setUTCMonth(0,1);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCFullYear(e.getUTCFullYear()+t)},function(e,t){return t.getUTCFullYear()-e.getUTCFullYear()},function(e){return e.getUTCFullYear()});Kk.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:dk(function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/n)*n);e.setUTCMonth(0,1);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCFullYear(e.getUTCFullYear()+t*n)})};function qk(e){if(0<=e.y&&e.y<100){var t=new Date(-1,e.m,e.d,e.H,e.M,e.S,e.L);t.setFullYear(e.y);return t}return new Date(e.y,e.m,e.d,e.H,e.M,e.S,e.L)}function Yk(e){if(0<=e.y&&e.y<100){var t=new Date(Date.UTC(-1,e.m,e.d,e.H,e.M,e.S,e.L));t.setUTCFullYear(e.y);return t}return new Date(Date.UTC(e.y,e.m,e.d,e.H,e.M,e.S,e.L))}function Xk(e){return{y:e,m:0,d:1,H:0,M:0,S:0,L:0}}function $k(e){var i=e.dateTime,a=e.date,r=e.time,t=e.periods,n=e.days,o=e.shortDays,s=e.months,l=e.shortMonths;var u=iS(t),h=aS(t),c=iS(n),f=aS(n),d=iS(o),g=aS(o),p=iS(s),v=aS(s),m=iS(l),y=aS(l);var _={a:D,A:P,b:O,B:z,c:null,d:SS,e:SS,f:MS,H:CS,I:ES,j:AS,L:RS,m:TS,M:BS,p:F,Q:rC,s:oC,S:NS,u:DS,U:PS,V:OS,w:zS,W:FS,x:null,X:null,y:LS,Y:IS,Z:jS,"%":aC};var b={a:L,A:I,b:j,B:H,c:null,d:HS,e:HS,f:KS,H:VS,I:US,j:GS,L:WS,m:qS,M:YS,p:V,Q:rC,s:oC,S:XS,u:$S,U:ZS,V:JS,w:QS,W:eC,x:null,X:null,y:tC,Y:nC,Z:iC,"%":aC};var w={a:E,A:A,b:R,B:M,c:T,d:gS,e:gS,f:bS,H:vS,I:vS,j:pS,L:_S,m:dS,M:mS,p:C,Q:xS,s:kS,S:yS,u:oS,U:sS,V:lS,w:rS,W:uS,x:B,X:N,y:cS,Y:hS,Z:fS,"%":wS};_.x=x(a,_);_.X=x(r,_);_.c=x(i,_);b.x=x(a,b);b.X=x(r,b);b.c=x(i,b);function x(l,u){return function(e){var t=[],n=-1,i=0,a=l.length,r,o,s;if(!(e instanceof Date))e=new Date(+e);while(++n53)return null;if(!("w"in t))t.w=1;if("Z"in t){i=Yk(Xk(t.y)),a=i.getUTCDay();i=a>4||a===0?Ik.ceil(i):Ik(i);i=zk.offset(i,(t.V-1)*7);t.y=i.getUTCFullYear();t.m=i.getUTCMonth();t.d=i.getUTCDate()+(t.w+6)%7}else{i=o(Xk(t.y)),a=i.getDay();i=a>4||a===0?Ek.ceil(i):Ek(i);i=kk.offset(i,(t.V-1)*7);t.y=i.getFullYear();t.m=i.getMonth();t.d=i.getDate()+(t.w+6)%7}}else if("W"in t||"U"in t){if(!("w"in t))t.w="u"in t?t.u%7:"W"in t?1:0;a="Z"in t?Yk(Xk(t.y)).getUTCDay():o(Xk(t.y)).getDay();t.m=0;t.d="W"in t?(t.w+6)%7+t.W*7-(a+5)%7:t.w+t.U*7-(a+6)%7}if("Z"in t){t.H+=t.Z/100|0;t.M+=t.Z%100;return Yk(t)}return o(t)}}function S(e,t,n,i){var a=0,r=t.length,o=n.length,s,l;while(a=o)return-1;s=t.charCodeAt(a++);if(s===37){s=t.charAt(a++);l=w[s in Zk?t.charAt(a++):s];if(!l||(i=l(e,n,i))<0)return-1}else if(s!=n.charCodeAt(i++)){return-1}}return i}function C(e,t,n){var i=u.exec(t.slice(n));return i?(e.p=h[i[0].toLowerCase()],n+i[0].length):-1}function E(e,t,n){var i=d.exec(t.slice(n));return i?(e.w=g[i[0].toLowerCase()],n+i[0].length):-1}function A(e,t,n){var i=c.exec(t.slice(n));return i?(e.w=f[i[0].toLowerCase()],n+i[0].length):-1}function R(e,t,n){var i=m.exec(t.slice(n));return i?(e.m=y[i[0].toLowerCase()],n+i[0].length):-1}function M(e,t,n){var i=p.exec(t.slice(n));return i?(e.m=v[i[0].toLowerCase()],n+i[0].length):-1}function T(e,t,n){return S(e,i,t,n)}function B(e,t,n){return S(e,a,t,n)}function N(e,t,n){return S(e,r,t,n)}function D(e){return o[e.getDay()]}function P(e){return n[e.getDay()]}function O(e){return l[e.getMonth()]}function z(e){return s[e.getMonth()]}function F(e){return t[+(e.getHours()>=12)]}function L(e){return o[e.getUTCDay()]}function I(e){return n[e.getUTCDay()]}function j(e){return l[e.getUTCMonth()]}function H(e){return s[e.getUTCMonth()]}function V(e){return t[+(e.getUTCHours()>=12)]}return{format:function e(t){var n=x(t+="",_);n.toString=function(){return t};return n},parse:function e(t){var n=k(t+="",qk);n.toString=function(){return t};return n},utcFormat:function e(t){var n=x(t+="",b);n.toString=function(){return t};return n},utcParse:function e(t){var n=k(t,Yk);n.toString=function(){return t};return n}}}var Zk={"-":"",_:" ",0:"0"},Jk=/^\s*\d+/,Qk=/^%/,eS=/[\\^$*+?|[\]().{}]/g;function tS(e,t,n){var i=e<0?"-":"",a=(i?-e:e)+"",r=a.length;return i+(r68?1900:2e3),n+i[0].length):-1}function fS(e,t,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(n,n+6));return i?(e.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function dS(e,t,n){var i=Jk.exec(t.slice(n,n+2));return i?(e.m=i[0]-1,n+i[0].length):-1}function gS(e,t,n){var i=Jk.exec(t.slice(n,n+2));return i?(e.d=+i[0],n+i[0].length):-1}function pS(e,t,n){var i=Jk.exec(t.slice(n,n+3));return i?(e.m=0,e.d=+i[0],n+i[0].length):-1}function vS(e,t,n){var i=Jk.exec(t.slice(n,n+2));return i?(e.H=+i[0],n+i[0].length):-1}function mS(e,t,n){var i=Jk.exec(t.slice(n,n+2));return i?(e.M=+i[0],n+i[0].length):-1}function yS(e,t,n){var i=Jk.exec(t.slice(n,n+2));return i?(e.S=+i[0],n+i[0].length):-1}function _S(e,t,n){var i=Jk.exec(t.slice(n,n+3));return i?(e.L=+i[0],n+i[0].length):-1}function bS(e,t,n){var i=Jk.exec(t.slice(n,n+6));return i?(e.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function wS(e,t,n){var i=Qk.exec(t.slice(n,n+1));return i?n+i[0].length:-1}function xS(e,t,n){var i=Jk.exec(t.slice(n));return i?(e.Q=+i[0],n+i[0].length):-1}function kS(e,t,n){var i=Jk.exec(t.slice(n));return i?(e.Q=+i[0]*1e3,n+i[0].length):-1}function SS(e,t){return tS(e.getDate(),t,2)}function CS(e,t){return tS(e.getHours(),t,2)}function ES(e,t){return tS(e.getHours()%12||12,t,2)}function AS(e,t){return tS(1+kk.count(Dk(e),e),t,3)}function RS(e,t){return tS(e.getMilliseconds(),t,3)}function MS(e,t){return RS(e,t)+"000"}function TS(e,t){return tS(e.getMonth()+1,t,2)}function BS(e,t){return tS(e.getMinutes(),t,2)}function NS(e,t){return tS(e.getSeconds(),t,2)}function DS(e){var t=e.getDay();return t===0?7:t}function PS(e,t){return tS(Ck.count(Dk(e),e),t,2)}function OS(e,t){var n=e.getDay();e=n>=4||n===0?Mk(e):Mk.ceil(e);return tS(Mk.count(Dk(e),e)+(Dk(e).getDay()===4),t,2)}function zS(e){return e.getDay()}function FS(e,t){return tS(Ek.count(Dk(e),e),t,2)}function LS(e,t){return tS(e.getFullYear()%100,t,2)}function IS(e,t){return tS(e.getFullYear()%1e4,t,4)}function jS(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+tS(t/60|0,"0",2)+tS(t%60,"0",2)}function HS(e,t){return tS(e.getUTCDate(),t,2)}function VS(e,t){return tS(e.getUTCHours(),t,2)}function US(e,t){return tS(e.getUTCHours()%12||12,t,2)}function GS(e,t){return tS(1+zk.count(Kk(e),e),t,3)}function WS(e,t){return tS(e.getUTCMilliseconds(),t,3)}function KS(e,t){return WS(e,t)+"000"}function qS(e,t){return tS(e.getUTCMonth()+1,t,2)}function YS(e,t){return tS(e.getUTCMinutes(),t,2)}function XS(e,t){return tS(e.getUTCSeconds(),t,2)}function $S(e){var t=e.getUTCDay();return t===0?7:t}function ZS(e,t){return tS(Lk.count(Kk(e),e),t,2)}function JS(e,t){var n=e.getUTCDay();e=n>=4||n===0?Vk(e):Vk.ceil(e);return tS(Vk.count(Kk(e),e)+(Kk(e).getUTCDay()===4),t,2)}function QS(e){return e.getUTCDay()}function eC(e,t){return tS(Ik.count(Kk(e),e),t,2)}function tC(e,t){return tS(e.getUTCFullYear()%100,t,2)}function nC(e,t){return tS(e.getUTCFullYear()%1e4,t,4)}function iC(){return"+0000"}function aC(){return"%"}function rC(e){return+e}function oC(e){return Math.floor(+e/1e3)}var sC;var lC;var uC;var hC;var cC;fC({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function fC(e){sC=$k(e);lC=sC.format;uC=sC.parse;hC=sC.utcFormat;cC=sC.utcParse;return sC}var dC="%Y-%m-%dT%H:%M:%S.%LZ";function gC(e){return e.toISOString()}var pC=Date.prototype.toISOString?gC:hC(dC);function vC(e){var t=new Date(e);return isNaN(t)?null:t}var mC=+new Date("2000-01-01T00:00:00.000Z")?vC:cC(dC);var yC=1e3,_C=yC*60,bC=_C*60,wC=bC*24,xC=wC*7,kC=wC*30,SC=wC*365;function CC(e){return new Date(e)}function EC(e){return e instanceof Date?+e:+new Date(+e)}function AC(o,t,n,i,a,r,s,l,u){var h=gx(sx,sx),c=h.invert,f=h.domain;var d=u(".%L"),g=u(":%S"),p=u("%I:%M"),v=u("%I %p"),m=u("%a %d"),y=u("%b %d"),_=u("%B"),b=u("%Y");var w=[[s,1,yC],[s,5,5*yC],[s,15,15*yC],[s,30,30*yC],[r,1,_C],[r,5,5*_C],[r,15,15*_C],[r,30,30*_C],[a,1,bC],[a,3,3*bC],[a,6,6*bC],[a,12,12*bC],[i,1,wC],[i,2,2*wC],[n,1,xC],[t,1,kC],[t,3,3*kC],[o,1,SC]];function x(e){return(s(e)1&&arguments[1]!==undefined?arguments[1]:{};return e in t?t[e]:e in WC?WC[e]:WC.missing}function qC(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if([null,void 0].indexOf(e)>=0)return KC("missing",t);else if(e===true)return KC("on",t);else if(e===false)return KC("off",t);var n=Pw(e);if(!n)return KC("scale",t)(e);return e.toString()}function YC(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};e=Lw(e);var n=(e.r*299+e.g*587+e.b*114)/1e3;return n>=128?KC("dark",t):KC("light",t)}function XC(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:.5;e=Ww(e);t*=1-e.l;e.l+=t;e.s-=t;return e.toString()}function $C(e){if(e.replace(/\s+/g,"")==="")return e;var t=(new DOMParser).parseFromString(e.replace(/<[^>]+>/g,""),"text/html");return t.documentElement?t.documentElement.textContent:e}function ZC(e,t){t=Object.assign({"font-size":10,"font-family":"sans-serif","font-style":"normal","font-weight":400,"font-variant":"normal"},t);var n=document.createElement("canvas").getContext("2d");var i=[];i.push(t["font-style"]);i.push(t["font-variant"]);i.push(t["font-weight"]);i.push(typeof t["font-size"]==="string"?t["font-size"]:"".concat(t["font-size"],"px"));i.push(t["font-family"]);n.font=i.join(" ");if(e instanceof Array)return e.map(function(e){return n.measureText($C(e)).width});return n.measureText($C(e)).width}function JC(e){return e.toString().replace(/^\s+|\s+$/g,"")}function QC(e){return e.toString().replace(/\s+$/,"")}var eE="abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",tE={},nE=32;var iE,aE,rE,oE;var sE=function e(t){if(!iE){iE=ZC(eE,{"font-family":"DejaVuSans","font-size":nE});aE=ZC(eE,{"font-family":"-apple-system","font-size":nE});rE=ZC(eE,{"font-family":"monospace","font-size":nE});oE=ZC(eE,{"font-family":"sans-serif","font-size":nE})}if(!(t instanceof Array))t=t.split(",");t=t.map(function(e){return JC(e)});for(var n=0;n",")","}","]",".","!","?","/","u00BB","u300B","u3009"].concat(pE);var yE="က-ဪဿ-၉ၐ-ၕ";var _E="぀-ゟ゠-ヿ＀-+--}⦅-゚㐀-䶿";var bE="㐀-龿";var wE="ກ-ຮະ-ໄ່-໋ໍ-ໝ";var xE=yE+bE+_E+wE;var kE=new RegExp("(\\".concat(pE.join("|\\"),")*[^\\s|\\").concat(pE.join("|\\"),"]*(\\").concat(pE.join("|\\"),")*"),"g");var SE=new RegExp("[".concat(xE,"]"));var CE=new RegExp("(\\".concat(vE.join("|\\"),")*[").concat(xE,"](\\").concat(mE.join("|\\"),"|\\").concat(gE.join("|\\"),")*|[a-z0-9]+"),"gi");function EE(e){if(!SE.test(e))return uE(e).match(kE).filter(function(e){return e.length});return Pe(uE(e).match(kE).map(function(e){if(SE.test(e))return e.match(CE);return[e]}))}function AE(){var d="sans-serif",g=10,p=400,v=200,m,y=null,_=false,b=EE,w=200;function t(e){e=uE(e);if(m===void 0)m=Math.ceil(g*1.4);var t=b(e);var n={"font-family":d,"font-size":g,"font-weight":p,"line-height":m};var i=1,a="",r=false,o=0;var s=[],l=ZC(t,n),u=ZC(" ",n);for(var h=0;hw){if(!h&&!_){r=true;break}if(s.length>=i)s[i-1]=QC(s[i-1]);i++;if(m*i>v||f>w&&!_||y&&i>y){r=true;break}o=0;s.push(c)}else if(!h)s[0]=c;else s[i-1]+=c;a+=c;o+=f;o+=c.match(/[\s]*$/g)[0].length*u}return{lines:s,sentence:e,truncated:r,widths:ZC(s,n),words:t}}t.fontFamily=function(e){return arguments.length?(d=e,t):d};t.fontSize=function(e){return arguments.length?(g=e,t):g};t.fontWeight=function(e){return arguments.length?(p=e,t):p};t.height=function(e){return arguments.length?(v=e,t):v};t.lineHeight=function(e){return arguments.length?(m=e,t):m};t.maxLines=function(e){return arguments.length?(y=e,t):y};t.overflow=function(e){return arguments.length?(_=e,t):_};t.split=function(e){return arguments.length?(b=e,t):b};t.width=function(e){return arguments.length?(w=e,t):w};return t}function RE(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){RE=function e(t){return typeof t}}else{RE=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return RE(e)}function ME(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function TE(e,t){for(var n=0;ny&&(g>s||a&&g>y*r)){if(a){h=ZC(b,f);var x=1.165+p/g*.1,k=p*g,S=ve(h),C=O(h,function(e){return e*s})*x;if(S>p||C>k){var E=Math.sqrt(k/C),A=p/S;var R=Oe([E,A]);o=Math.floor(o*R)}var M=Math.floor(g*.8);if(o>M)o=M}w()}if(u.length){var T=l*s;var B=D._rotate(t,n);var N=B===0?_==="top"?0:_==="middle"?g/2-T/2:g-T:0;N-=s*.1;e.push({aH:D._ariaHidden(t,n),data:t,i:n,lines:u,fC:D._fontColor(t,n),fStroke:D._fontStroke(t,n),fSW:D._fontStrokeWidth(t,n),fF:f["font-family"],fO:D._fontOpacity(t,n),fW:f["font-weight"],id:D._id(t,n),tA:D._textAnchor(t,n),vA:D._verticalAlign(t,n),widths:c.widths,fS:o,lH:s,w:p,h:g,r:B,x:D._x(t,n)+d.left,y:D._y(t,n)+N+d.top})}return e},[]),function(e){return D._id(e.data,e.i)});var a=sb().duration(this._duration);if(this._duration===0){n.exit().remove()}else{n.exit().transition().delay(this._duration).remove();n.exit().selectAll("text").transition(a).attr("opacity",0).style("opacity",0)}function i(e){e.attr("transform",function(e,t){var n=P._rotateAnchor(e,t);return"translate(".concat(e.x,", ").concat(e.y,") rotate(").concat(e.r,", ").concat(n[0],", ").concat(n[1],")")})}var r=n.enter().append("g").attr("class","d3plus-textBox").attr("id",function(e){return"d3plus-textBox-".concat(cE(e.id))}).call(i).merge(n);var o=lE();r.style("pointer-events",function(e){return D._pointerEvents(e.data,e.i)}).each(function(n){function e(e){e[P._html?"html":"text"](function(e){return QC(e).replace(/&([^\;&]*)/g,function(e,t){return t==="amp"?e:"&".concat(t)}).replace(/<([^A-z^/]+)/g,function(e,t){return"<".concat(t)}).replace(/<$/g,"<").replace(/(<[^>^\/]+>)([^<^>]+)$/g,function(e,t,n){return"".concat(t).concat(n).concat(t.replace("<","]+)(<\/[^>]+>)/g,function(e,t,n){return"".concat(n.replace("]*>([^<^>]+)<\/[^>]+>/g,function(e,t,n){var i=P._html[t]?''):"";return"".concat(i.length?i:"").concat(n).concat(i.length?"":"")})})}function t(e){e.attr("aria-hidden",n.aH).attr("dir",o?"rtl":"ltr").attr("fill",n.fC).attr("stroke",n.fStroke).attr("stroke-width",n.fSW).attr("text-anchor",n.tA).attr("font-family",n.fF).style("font-family",n.fF).attr("font-size","".concat(n.fS,"px")).style("font-size","".concat(n.fS,"px")).attr("font-weight",n.fW).style("font-weight",n.fW).attr("x","".concat(n.tA==="middle"?n.w/2:o?n.tA==="start"?n.w:0:n.tA==="end"?n.w:2*Math.sin(Math.PI*n.r/180),"px")).attr("y",function(e,t){return n.r===0||n.vA==="top"?"".concat((t+1)*n.lH-(n.lH-n.fS),"px"):n.vA==="middle"?"".concat((n.h+n.fS)/2-(n.lH-n.fS)+(t-n.lines.length/2+.5)*n.lH,"px"):"".concat(n.h-2*(n.lH-n.fS)-(n.lines.length-(t+1))*n.lH+2*Math.cos(Math.PI*n.r/180),"px")})}var i=xv(this).selectAll("text").data(n.lines);if(P._duration===0){i.call(e).call(t);i.exit().remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("unicode-bidi","bidi-override").call(e).call(t).attr("opacity",n.fO).style("opacity",n.fO)}else{i.call(e).transition(a).call(t);i.exit().transition(a).attr("opacity",0).remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("opacity",0).style("opacity",0).call(e).call(t).merge(i).transition(a).delay(P._delay).call(t).attr("opacity",n.fO).style("opacity",n.fO)}}).transition(a).call(i);var s=Object.keys(this._on),l=s.reduce(function(e,n){e[n]=function(e,t){return D._on[n](e.data,t)};return e},{});for(var u=0;u0&&arguments[0]!==undefined?arguments[0]:"g";GE(this,n);a=t.call(this);a._activeOpacity=.25;a._activeStyle={stroke:function e(t,n){var i=a._fill(t,n);if(["transparent","none"].includes(i))i=a._stroke(t,n);return tw(i).darker(1)},"stroke-width":function e(t,n){var i=a._strokeWidth(t,n)||1;return i*3}};a._ariaLabel=Bg("");a._backgroundImage=Bg(false);a._backgroundImageClass=new Ob;a._data=[];a._duration=600;a._fill=Bg("black");a._fillOpacity=Bg(1);a._hoverOpacity=.5;a._hoverStyle={stroke:function e(t,n){var i=a._fill(t,n);if(["transparent","none"].includes(i))i=a._stroke(t,n);return tw(i).darker(.5)},"stroke-width":function e(t,n){var i=a._strokeWidth(t,n)||1;return i*2}};a._id=function(e,t){return e.id!==void 0?e.id:t};a._label=Bg(false);a._labelClass=new jE;a._labelConfig={fontColor:function e(t,n){return YC(a._fill(t,n))},fontSize:12,padding:5};a._name="Shape";a._opacity=Bg(1);a._pointerEvents=Bg("visiblePainted");a._role=Bg("presentation");a._rotate=Bg(0);a._rx=Bg(0);a._ry=Bg(0);a._scale=Bg(1);a._shapeRendering=Bg("geometricPrecision");a._stroke=function(e,t){return tw(a._fill(e,t)).darker(1)};a._strokeDasharray=Bg("0");a._strokeLinecap=Bg("butt");a._strokeOpacity=Bg(1);a._strokeWidth=Bg(0);a._tagName=e;a._textAnchor=Bg("start");a._vectorEffect=Bg("non-scaling-stroke");a._verticalAlign=Bg("top");a._x=mn("x",0);a._y=mn("y",0);return a}KE(n,[{key:"_aes",value:function e(){return{}}},{key:"_applyEvents",value:function e(t){var o=this;var s=Object.keys(this._on);var n=function e(r){t.on(s[r],function(e,t){if(!o._on[s[r]])return;if(e.i!==void 0)t=e.i;if(e.nested&&e.values){var n=function e(t,n){if(o._discrete==="x")return[o._x(t,n),i[1]];else if(o._discrete==="y")return[i[0],o._y(t,n)];else return[o._x(t,n),o._y(t,n)]};var i=Cv(o._select.node()),a=e.values.map(function(e){return VE(i,n(e,t))});t=a.indexOf(Oe(a));e=e.values[t]}o._on[s[r]].bind(o)(e,t)})};for(var i=0;i *, g.d3plus-").concat(this._name,"-active > *")).each(function(e){if(e&&e.parentNode)e.parentNode.appendChild(this);else this.parentNode.removeChild(this)});this._group=gb("g.d3plus-".concat(this._name,"-group"),{parent:this._select});var r=this._update=gb("g.d3plus-".concat(this._name,"-shape"),{parent:this._group,update:{opacity:this._active?this._activeOpacity:1}}).selectAll(".d3plus-".concat(this._name)).data(i,a);r.order();if(this._duration){r.transition(this._transition).call(this._applyTransform.bind(this))}else{r.call(this._applyTransform.bind(this))}var o=this._enter=r.enter().append(this._tagName).attr("class",function(e,t){return"d3plus-Shape d3plus-".concat(n._name," d3plus-id-").concat(cE(n._nestWrapper(n._id)(e,t)))}).call(this._applyTransform.bind(this)).attr("aria-label",this._ariaLabel).attr("role",this._role).attr("opacity",this._nestWrapper(this._opacity));var s=o.merge(r);var l=s.attr("shape-rendering",this._nestWrapper(this._shapeRendering));if(this._duration){l=l.attr("pointer-events","none").transition(this._transition).transition().delay(100).attr("pointer-events",this._pointerEvents)}l.attr("opacity",this._nestWrapper(this._opacity));var u=this._exit=r.exit();if(this._duration)u.transition().delay(this._duration).remove();else u.remove();this._renderImage();this._renderLabels();this._hoverGroup=gb("g.d3plus-".concat(this._name,"-hover"),{parent:this._group});this._activeGroup=gb("g.d3plus-".concat(this._name,"-active"),{parent:this._group});var h=this._group.selectAll(".d3plus-HitArea").data(this._hitArea&&Object.keys(this._on).length?i:[],a);h.order().call(this._applyTransform.bind(this));var c=this._name==="Line";c&&this._path.curve(vn["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var f=h.enter().append(c?"path":"rect").attr("class",function(e,t){return"d3plus-HitArea d3plus-id-".concat(cE(n._nestWrapper(n._id)(e,t)))}).attr("fill","black").attr("stroke","black").attr("pointer-events","painted").attr("opacity",0).call(this._applyTransform.bind(this));var d=this;var g=h.merge(f).each(function(e){var t=d._data.indexOf(e);var n=d._hitArea(e,t,d._aes(e,t));return n&&!(d._name==="Line"&&parseFloat(d._strokeWidth(e,t))>10)?xv(this).call(xn,n):xv(this).remove()});h.exit().remove();this._applyEvents(this._hitArea?g:s);setTimeout(function(){if(n._active)n._renderActive();else if(n._hover)n._renderHover();if(t)t()},this._duration+100);return this}},{key:"active",value:function e(t){if(!arguments.length||t===undefined)return this._active;this._active=t;if(this._group){this._renderActive()}return this}},{key:"activeOpacity",value:function e(t){return arguments.length?(this._activeOpacity=t,this):this._activeOpacity}},{key:"activeStyle",value:function e(t){return arguments.length?(this._activeStyle=wn({},this._activeStyle,t),this):this._activeStyle}},{key:"ariaLabel",value:function e(t){return t!==undefined?(this._ariaLabel=typeof t==="function"?t:Bg(t),this):this._ariaLabel}},{key:"backgroundImage",value:function e(t){return arguments.length?(this._backgroundImage=typeof t==="function"?t:Bg(t),this):this._backgroundImage}},{key:"data",value:function e(t){return arguments.length?(this._data=t,this):this._data}},{key:"discrete",value:function e(t){return arguments.length?(this._discrete=t,this):this._discrete}},{key:"duration",value:function e(t){return arguments.length?(this._duration=t,this):this._duration}},{key:"fill",value:function e(t){return arguments.length?(this._fill=typeof t==="function"?t:Bg(t),this):this._fill}},{key:"fillOpacity",value:function e(t){return arguments.length?(this._fillOpacity=typeof t==="function"?t:Bg(t),this):this._fillOpacity}},{key:"hover",value:function e(t){if(!arguments.length||t===void 0)return this._hover;this._hover=t;if(this._group){this._renderHover()}return this}},{key:"hoverStyle",value:function e(t){return arguments.length?(this._hoverStyle=wn({},this._hoverStyle,t),this):this._hoverStyle}},{key:"hoverOpacity",value:function e(t){return arguments.length?(this._hoverOpacity=t,this):this._hoverOpacity}},{key:"hitArea",value:function e(t){return arguments.length?(this._hitArea=typeof t==="function"?t:Bg(t),this):this._hitArea}},{key:"id",value:function e(t){return arguments.length?(this._id=t,this):this._id}},{key:"label",value:function e(t){return arguments.length?(this._label=typeof t==="function"?t:Bg(t),this):this._label}},{key:"labelBounds",value:function e(t){return arguments.length?(this._labelBounds=typeof t==="function"?t:Bg(t),this):this._labelBounds}},{key:"labelConfig",value:function e(t){return arguments.length?(this._labelConfig=wn(this._labelConfig,t),this):this._labelConfig}},{key:"opacity",value:function e(t){return arguments.length?(this._opacity=typeof t==="function"?t:Bg(t),this):this._opacity}},{key:"pointerEvents",value:function e(t){return arguments.length?(this._pointerEvents=typeof t==="function"?t:Bg(t),this):this._pointerEvents}},{key:"role",value:function e(t){return t!==undefined?(this._role=typeof t==="function"?t:Bg(t),this):this._role}},{key:"rotate",value:function e(t){return arguments.length?(this._rotate=typeof t==="function"?t:Bg(t),this):this._rotate}},{key:"rx",value:function e(t){return arguments.length?(this._rx=typeof t==="function"?t:Bg(t),this):this._rx}},{key:"ry",value:function e(t){return arguments.length?(this._ry=typeof t==="function"?t:Bg(t),this):this._ry}},{key:"scale",value:function e(t){return arguments.length?(this._scale=typeof t==="function"?t:Bg(t),this):this._scale}},{key:"select",value:function e(t){return arguments.length?(this._select=xv(t),this):this._select}},{key:"shapeRendering",value:function e(t){return arguments.length?(this._shapeRendering=typeof t==="function"?t:Bg(t),this):this._shapeRendering}},{key:"sort",value:function e(t){return arguments.length?(this._sort=t,this):this._sort}},{key:"stroke",value:function e(t){return arguments.length?(this._stroke=typeof t==="function"?t:Bg(t),this):this._stroke}},{key:"strokeDasharray",value:function e(t){return arguments.length?(this._strokeDasharray=typeof t==="function"?t:Bg(t),this):this._strokeDasharray}},{key:"strokeLinecap",value:function e(t){return arguments.length?(this._strokeLinecap=typeof t==="function"?t:Bg(t),this):this._strokeLinecap}},{key:"strokeOpacity",value:function e(t){return arguments.length?(this._strokeOpacity=typeof t==="function"?t:Bg(t),this):this._strokeOpacity}},{key:"strokeWidth",value:function e(t){return arguments.length?(this._strokeWidth=typeof t==="function"?t:Bg(t),this):this._strokeWidth}},{key:"textAnchor",value:function e(t){return arguments.length?(this._textAnchor=typeof t==="function"?t:Bg(t),this):this._textAnchor}},{key:"vectorEffect",value:function e(t){return arguments.length?(this._vectorEffect=typeof t==="function"?t:Bg(t),this):this._vectorEffect}},{key:"verticalAlign",value:function e(t){return arguments.length?(this._verticalAlign=typeof t==="function"?t:Bg(t),this):this._verticalAlign}},{key:"x",value:function e(t){return arguments.length?(this._x=typeof t==="function"?t:Bg(t),this):this._x}},{key:"y",value:function e(t){return arguments.length?(this._y=typeof t==="function"?t:Bg(t),this):this._y}}]);return n}(Ag);function tA(e,t){var a=[];var r=[];function o(e,t){if(e.length===1){a.push(e[0]);r.push(e[0])}else{var n=Array(e.length-1);for(var i=0;i=3){t.x1=e[1][0];t.y1=e[1][1]}t.x=e[e.length-1][0];t.y=e[e.length-1][1];if(e.length===4){t.type="C"}else if(e.length===3){t.type="Q"}else{t.type="L"}return t}function iA(e,t){t=t||2;var n=[];var i=e;var a=1/t;for(var r=0;r0){i-=1}else if(i0){i-=1}}}e[i]=(e[i]||0)+1;return e},[]);var a=i.reduce(function(e,t,n){if(n===r.length-1){var i=sA(t,Object.assign({},r[r.length-1]));if(i[0].type==="M"){i.forEach(function(e){e.type="L"})}return e.concat(i)}return e.concat(hA(r[n],r[n+1],t))},[]);a.unshift(r[0]);return a}function fA(e){var t=(e||"").match(rA)||[];var n=[];var i;var a;for(var r=0;rg.length){g=cA(g,p,t)}else if(p.length0){for(var n=0;nr!==s>r&&a<(o-l)*(r-u)/(s-u)+l)h=!h;o=l,s=u}return h}function mA(e,t,n,i){var a=1e-9;var r=e[0]-t[0],o=n[0]-i[0],s=e[1]-t[1],l=n[1]-i[1];var u=r*l-s*o;if(Math.abs(u)e.length)t=e.length;for(var n=0,i=new Array(t);nMath.max(e[0],t[0])+i||oMath.max(e[1],t[1])+i)}function CA(e,t,n,i){var a=mA(e,t,n,i);if(!a)return false;return SA(e,t,a)&&SA(n,i,a)}function EA(e,t){var n=-1;var i=e.length;var a=t.length;var r=e[i-1];while(++ne.length)t=e.length;for(var n=0,i=new Array(t);n2&&arguments[2]!==undefined?arguments[2]:0;var i=1e-9;t=[t[0]+i*Math.cos(n),t[1]+i*Math.sin(n)];var a=t,r=AA(a,2),o=r[0],s=r[1];var l=[o+Math.cos(n),s+Math.sin(n)];var u=0;if(Math.abs(l[0]-o)t[u]){if(_2&&arguments[2]!==undefined?arguments[2]:[0,0];var i=Math.cos(t),a=Math.sin(t),r=e[0]-n[0],o=e[1]-n[1];return[i*r-a*o+n[0],a*r+i*o+n[1]]}var OA=function(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[0,0];return e.map(function(e){return PA(e,t,n)})};function zA(e,t,n){var i=t[0],a=t[1];var r=n[0]-i,o=n[1]-a;if(r!==0||o!==0){var s=((e[0]-i)*r+(e[1]-a)*o)/(r*r+o*o);if(s>1){i=n[0];a=n[1]}else if(s>0){i+=r*s;a+=o*s}}r=e[0]-i;o=e[1]-a;return r*r+o*o}function FA(e,t){var n,i=e[0];var a=[i];for(var r=1,o=e.length;rt){a.push(n);i=n}}if(i!==n)a.push(n);return a}function LA(e,t,n,i,a){var r,o=i;for(var s=t+1;so){r=s;o=l}}if(o>i){if(r-t>1)LA(e,t,r,i,a);a.push(e[r]);if(n-r>1)LA(e,r,n,i,a)}}function IA(e,t){var n=e.length-1;var i=[e[0]];LA(e,0,n,t,i);i.push(e[n]);return i}var jA=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(e.length<=2)return e;var i=t*t;e=n?e:FA(e,i);e=IA(e,i);return e};function HA(e,t){return KA(e)||WA(e,t)||UA(e,t)||VA()}function VA(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function UA(e,t){if(!e)return;if(typeof e==="string")return GA(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor)n=e.constructor.name;if(n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return GA(e,t)}function GA(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,i=new Array(t);n1&&arguments[1]!==undefined?arguments[1]:{};if(e.length<3){if(t.verbose)console.error("polygon has to have at least 3 points",e);return null}var n=[];t=Object.assign({angle:Ne(-90,90+YA,YA),cache:true,maxAspectRatio:15,minAspectRatio:1,minHeight:0,minWidth:0,nTries:20,tolerance:.02,verbose:false},t);var i=t.angle instanceof Array?t.angle:typeof t.angle==="number"?[t.angle]:typeof t.angle==="string"&&!isNaN(t.angle)?[Number(t.angle)]:[];var a=t.aspectRatio instanceof Array?t.aspectRatio:typeof t.aspectRatio==="number"?[t.aspectRatio]:typeof t.aspectRatio==="string"&&!isNaN(t.aspectRatio)?[Number(t.aspectRatio)]:[];var r=t.origin&&t.origin instanceof Array?t.origin[0]instanceof Array?t.origin:[t.origin]:[];var o;if(t.cache){o=Pe(e).join(",");o+="-".concat(t.minAspectRatio);o+="-".concat(t.maxAspectRatio);o+="-".concat(t.minHeight);o+="-".concat(t.minWidth);o+="-".concat(i.join(","));o+="-".concat(r.join(","));if(XA[o])return XA[o]}var s=Math.abs(gA(e));if(s===0){if(t.verbose)console.error("polygon has 0 area",e);return null}var l=Be(e,function(e){return e[0]}),u=HA(l,2),h=u[0],c=u[1];var f=Be(e,function(e){return e[1]}),d=HA(f,2),g=d[0],p=d[1];var v=Math.min(c-h,p-g)*t.tolerance;if(v>0)e=jA(e,v);if(t.events)n.push({type:"simplify",poly:e});var m=Be(e,function(e){return e[0]});var y=HA(m,2);h=y[0];c=y[1];var _=Be(e,function(e){return e[1]});var b=HA(_,2);g=b[0];p=b[1];var w=c-h,x=p-g;var k=Math.min(w,x)/50;if(!r.length){var S=pA(e);if(!isFinite(S[0])){if(t.verbose)console.error("cannot find centroid",e);return null}if(vA(e,S))r.push(S);var C=t.nTries;while(C){var E=Math.random()*w+h;var A=Math.random()*x+g;var R=[E,A];if(vA(e,R)){r.push(R)}C--}}if(t.events)n.push({type:"origins",points:r});var M=0;var T=null;for(var B=0;B=k)n.push({type:"aRatio",aRatio:ue});while(ce-he>=k){var fe=(he+ce)/2;var de=fe/ue;var ge=HA(K,2),pe=ge[0],ve=ge[1];var me=[[pe-fe/2,ve-de/2],[pe+fe/2,ve-de/2],[pe+fe/2,ve+de/2],[pe-fe/2,ve+de/2]];me=OA(me,D,K);var ye=EA(me,e);if(ye){M=fe*de;me.push(me[0]);T={area:M,cx:pe,cy:ve,width:fe,height:de,angle:-N,points:me};he=fe}else{ce=fe}if(t.events)n.push({type:"rectangle",areaFraction:fe*de/s,cx:pe,cy:ve,width:fe,height:de,angle:N,insidePoly:ye})}}}}}if(t.cache){XA[o]=T}return t.events?Object.assign(T||{},{events:n}):T}function ZA(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){ZA=function e(t){return typeof t}}else{ZA=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return ZA(e)}function JA(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function QA(e,t){for(var n=0;nr[0][1])o=o.reverse();o.push(o[0]);return{points:o}}},{key:"_dataFilter",value:function e(i){var a=this;var t=yb().key(this._id).entries(i).map(function(e){e.data=Rb(e.values);e.i=i.indexOf(e.values[0]);var t=Be(e.values.map(a._x).concat(e.values.map(a._x0)).concat(a._x1?e.values.map(a._x1):[]));e.xR=t;e.width=t[1]-t[0];e.x=t[0]+e.width/2;var n=Be(e.values.map(a._y).concat(e.values.map(a._y0)).concat(a._y1?e.values.map(a._y1):[]));e.yR=n;e.height=n[1]-n[0];e.y=n[0]+e.height/2;e.nested=true;e.translate=[e.x,e.y];e.__d3plusShape__=true;return e});t.key=function(e){return e.key};return t}},{key:"render",value:function e(t){var n=this;tR(uR(r.prototype),"render",this).call(this,t);var i=this._path=_e().defined(this._defined).curve(vn["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).x0(this._x0).x1(this._x1).y(this._y).y0(this._y0).y1(this._y1);var a=_e().defined(function(e){return e}).curve(vn["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).y(this._y).x0(function(e,t){return n._x1?n._x0(e,t)+(n._x1(e,t)-n._x0(e,t))/2:n._x0(e,t)}).x1(function(e,t){return n._x1?n._x0(e,t)+(n._x1(e,t)-n._x0(e,t))/2:n._x0(e,t)}).y0(function(e,t){return n._y1?n._y0(e,t)+(n._y1(e,t)-n._y0(e,t))/2:n._y0(e,t)}).y1(function(e,t){return n._y1?n._y0(e,t)+(n._y1(e,t)-n._y0(e,t))/2:n._y0(e,t)});this._enter.append("path").attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).attr("d",function(e){return a(e.values)}).call(this._applyStyle.bind(this)).transition(this._transition).attrTween("d",function(e){return dA(xv(this).attr("d"),i(e.values))});this._update.select("path").transition(this._transition).attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).attrTween("d",function(e){return dA(xv(this).attr("d"),i(e.values))}).call(this._applyStyle.bind(this));this._exit.select("path").transition(this._transition).attrTween("d",function(e){return dA(xv(this).attr("d"),a(e.values))});return this}},{key:"curve",value:function e(t){return arguments.length?(this._curve=t,this):this._curve}},{key:"defined",value:function e(t){return arguments.length?(this._defined=t,this):this._defined}},{key:"x",value:function e(t){if(!arguments.length)return this._x;this._x=typeof t==="function"?t:Bg(t);this._x0=this._x;return this}},{key:"x0",value:function e(t){if(!arguments.length)return this._x0;this._x0=typeof t==="function"?t:Bg(t);this._x=this._x0;return this}},{key:"x1",value:function e(t){return arguments.length?(this._x1=typeof t==="function"||t===null?t:Bg(t),this):this._x1}},{key:"y",value:function e(t){if(!arguments.length)return this._y;this._y=typeof t==="function"?t:Bg(t);this._y0=this._y;return this}},{key:"y0",value:function e(t){if(!arguments.length)return this._y0;this._y0=typeof t==="function"?t:Bg(t);this._y=this._y0;return this}},{key:"y1",value:function e(t){return arguments.length?(this._y1=typeof t==="function"||t===null?t:Bg(t),this):this._y1}}]);return r}(eA);function cR(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){cR=function e(t){return typeof t}}else{cR=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return cR(e)}function fR(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function dR(e,t){for(var n=0;n=e.initialLength)break}}if(n.length>1&&n.length%2)n.pop();n[n.length-1]+=e.initialLength-O(n);if(n.length%2===0)n.push(0);e.initialStrokeArray=n.join(" ")}this._path.curve(vn["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var a=this._enter.append("path").attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).attr("d",function(e){return n._path(e.values)}).call(this._applyStyle.bind(this));var r=this._update.select("path").attr("stroke-dasharray",function(e){return o._strokeDasharray(e.values[0],o._data.indexOf(e.values[0]))});if(this._duration){a.each(i).attr("stroke-dasharray",function(e){return"".concat(e.initialStrokeArray," ").concat(e.initialLength)}).attr("stroke-dashoffset",function(e){return e.initialLength}).transition(this._transition).attr("stroke-dashoffset",0);r=r.transition(this._transition).attrTween("d",function(e){return dA(xv(this).attr("d"),o._path(e.values))});this._exit.selectAll("path").each(i).attr("stroke-dasharray",function(e){return"".concat(e.initialStrokeArray," ").concat(e.initialLength)}).transition(this._transition).attr("stroke-dashoffset",function(e){return-e.initialLength})}else{r=r.attr("d",function(e){return o._path(e.values)})}r.attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).call(this._applyStyle.bind(this));return this}},{key:"_aes",value:function e(t,n){var i=this;return{points:t.values.map(function(e){return[i._x(e,n),i._y(e,n)]})}}},{key:"curve",value:function e(t){return arguments.length?(this._curve=t,this):this._curve}},{key:"defined",value:function e(t){return arguments.length?(this._defined=t,this):this._defined}}]);return s}(eA);function dM(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){dM=function e(t){return typeof t}}else{dM=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return dM(e)}function gM(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function pM(e,t){for(var n=0;nve(e))a.upperLimit=ve(e)}else if(t[1]==="extent")a.upperLimit=ve(e);else if(typeof t[1]==="number")a.upperLimit=De(e,t[1]);var n=a.third-a.first;if(a.orient==="vertical"){a.height=n;a.width=r._rectWidth(a.data,a.i);a.x=r._x(a.data,a.i);a.y=a.first+n/2}else if(a.orient==="horizontal"){a.height=r._rectWidth(a.data,a.i);a.width=n;a.x=a.first+n/2;a.y=r._y(a.data,a.i)}a.values.forEach(function(e,t){var n=a.orient==="vertical"?r._y(e,t):r._x(e,t);if(na.upperLimit){var i={};i.__d3plus__=true;i.data=e;i.i=t;i.outlier=r._outlier(e,t);if(a.orient==="vertical"){i.x=a.x;i.y=n;o.push(i)}else if(a.orient==="horizontal"){i.y=a.y;i.x=n;o.push(i)}}});a.__d3plus__=true;return a});this._box=(new JR).data(t).x(function(e){return e.x}).y(function(e){return e.y}).select(gb("g.d3plus-Box",{parent:this._select}).node()).config(Tg.bind(this)(this._rectConfig,"shape")).render();this._median=(new JR).data(t).x(function(e){return e.orient==="vertical"?e.x:e.median}).y(function(e){return e.orient==="vertical"?e.median:e.y}).height(function(e){return e.orient==="vertical"?1:e.height}).width(function(e){return e.orient==="vertical"?e.width:1}).select(gb("g.d3plus-Box-Median",{parent:this._select}).node()).config(Tg.bind(this)(this._medianConfig,"shape")).render();var h=[];t.forEach(function(e,t){var n=e.x;var i=e.y;var a=e.first-e.lowerLimit;var r=e.upperLimit-e.third;if(e.orient==="vertical"){var o=i-e.height/2;var s=i+e.height/2;h.push({__d3plus__:true,data:e,i:t,x:n,y:o,length:a,orient:"top"},{__d3plus__:true,data:e,i:t,x:n,y:s,length:r,orient:"bottom"})}else if(e.orient==="horizontal"){var l=n+e.width/2;var u=n-e.width/2;h.push({__d3plus__:true,data:e,i:t,x:l,y:i,length:r,orient:"right"},{__d3plus__:true,data:e,i:t,x:u,y:i,length:a,orient:"left"})}});this._whisker=(new CM).data(h).select(gb("g.d3plus-Box-Whisker",{parent:this._select}).node()).config(Tg.bind(this)(this._whiskerConfig,"shape")).render();this._whiskerEndpoint=[];yb().key(function(e){return e.outlier}).entries(o).forEach(function(e){var t=e.key;r._whiskerEndpoint.push((new FM[t]).data(e.values).select(gb("g.d3plus-Box-Outlier-".concat(t),{parent:r._select}).node()).config(Tg.bind(r)(r._outlierConfig,"shape",t)).render())});return this}},{key:"active",value:function e(t){if(this._box)this._box.active(t);if(this._median)this._median.active(t);if(this._whisker)this._whisker.active(t);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(e){return e.active(t)})}},{key:"data",value:function e(t){return arguments.length?(this._data=t,this):this._data}},{key:"hover",value:function e(t){if(this._box)this._box.hover(t);if(this._median)this._median.hover(t);if(this._whisker)this._whisker.hover(t);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(e){return e.hover(t)})}},{key:"medianConfig",value:function e(t){return arguments.length?(this._medianConfig=wn(this._medianConfig,t),this):this._medianConfig}},{key:"orient",value:function e(t){return arguments.length?(this._orient=typeof t==="function"?t:Bg(t),this):this._orient}},{key:"outlier",value:function e(t){return arguments.length?(this._outlier=typeof t==="function"?t:Bg(t),this):this._outlier}},{key:"outlierConfig",value:function e(t){return arguments.length?(this._outlierConfig=wn(this._outlierConfig,t),this):this._outlierConfig}},{key:"rectConfig",value:function e(t){return arguments.length?(this._rectConfig=wn(this._rectConfig,t),this):this._rectConfig}},{key:"rectWidth",value:function e(t){return arguments.length?(this._rectWidth=typeof t==="function"?t:Bg(t),this):this._rectWidth}},{key:"select",value:function e(t){return arguments.length?(this._select=xv(t),this):this._select}},{key:"whiskerConfig",value:function e(t){return arguments.length?(this._whiskerConfig=wn(this._whiskerConfig,t),this):this._whiskerConfig}},{key:"whiskerMode",value:function e(t){return arguments.length?(this._whiskerMode=t instanceof Array?t:[t,t],this):this._whiskerMode}},{key:"x",value:function e(t){return arguments.length?(this._x=typeof t==="function"?t:mn(t),this):this._x}},{key:"y",value:function e(t){return arguments.length?(this._y=typeof t==="function"?t:mn(t),this):this._y}}]);return n}(Ag);var IM=Math.PI;var jM=function(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"circle";if(e<0)e=IM*2+e;if(n==="square"){var i=45*(IM/180);var a=0,r=0;if(e1&&arguments[1]!==undefined?arguments[1]:20;var n=[],i=/([MLA])([^MLAZ]+)/gi;var a=i.exec(e);while(a!==null){if(["M","L"].includes(a[1]))n.push(a[2].split(",").map(Number));else if(a[1]==="A"){var r=a[2].split(",").map(Number);var o=r.slice(r.length-2,r.length),s=n[n.length-1],l=r[0],u=VE(s,o);var h=Math.acos((l*l+l*l-u*u)/(2*l*l));if(r[2])h=HM*2-h;var c=h/(h/(HM*2)*(l*HM*2)/t);var f=Math.atan2(-s[1],-s[0])-HM;var d=c;while(d1&&arguments[1]!==undefined?arguments[1]:"data";return e.reduce(function(e,t){var n=[];if(Array.isArray(t)){n=t}else{if(t[i]){n=t[i]}else{console.warn('d3plus-viz: Please implement a "dataFormat" callback to concat the arrays manually (consider using the d3plus.dataConcat method in your callback). Currently unable to concatenate (using key: "'.concat(i,'") the following response:'),t)}}return e.concat(n)},[])};var rT=function(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"data";var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"headers";return e[t].map(function(i){return e[n].reduce(function(e,t,n){return e[t]=i[n],e},{})})};function oT(a,e){var r,o=Mv("beforesend","progress","load","error"),s,l=mb(),u=new XMLHttpRequest,h=null,c=null,i,f,d=0;if(typeof XDomainRequest!=="undefined"&&!("withCredentials"in u)&&/^(http(s)?:)?\/\//.test(a))u=new XDomainRequest;"onload"in u?u.onload=u.onerror=u.ontimeout=t:u.onreadystatechange=function(e){u.readyState>3&&t(e)};function t(e){var t=u.status,n;if(!t&&lT(u)||t>=200&&t<300||t===304){if(i){try{n=i.call(r,u)}catch(e){o.call("error",r,e);return}}else{n=u}o.call("load",r,n)}else{o.call("error",r,e)}}u.onprogress=function(e){o.call("progress",r,e)};r={header:function e(t,n){t=(t+"").toLowerCase();if(arguments.length<2)return l.get(t);if(n==null)l.remove(t);else l.set(t,n+"");return r},mimeType:function e(t){if(!arguments.length)return s;s=t==null?null:t+"";return r},responseType:function e(t){if(!arguments.length)return f;f=t;return r},timeout:function e(t){if(!arguments.length)return d;d=+t;return r},user:function e(t){return arguments.length<1?h:(h=t==null?null:t+"",r)},password:function e(t){return arguments.length<1?c:(c=t==null?null:t+"",r)},response:function e(t){i=t;return r},get:function e(t,n){return r.send("GET",t,n)},post:function e(t,n){return r.send("POST",t,n)},send:function e(t,n,i){u.open(t,a,true,h,c);if(s!=null&&!l.has("accept"))l.set("accept",s+",*/*");if(u.setRequestHeader)l.each(function(e,t){u.setRequestHeader(t,e)});if(s!=null&&u.overrideMimeType)u.overrideMimeType(s);if(f!=null)u.responseType=f;if(d>0)u.timeout=d;if(i==null&&typeof n==="function")i=n,n=null;if(i!=null&&i.length===1)i=sT(i);if(i!=null)r.on("error",i).on("load",function(e){i(null,e)});o.call("beforesend",r,u);u.send(n==null?null:n);return r},abort:function e(){u.abort();return r},on:function e(){var t=o.on.apply(o,arguments);return t===o?r:t}};if(e!=null){if(typeof e!=="function")throw new Error("invalid callback: "+e);return r.get(e)}return r}function sT(n){return function(e,t){n(e==null?t:null)}}function lT(e){var t=e.responseType;return t&&t!=="text"?e.response:e.responseText}function uT(i,a){return function(e,t){var n=oT(e).mimeType(i).response(a);if(t!=null){if(typeof t!=="function")throw new Error("invalid callback: "+t);return n.get(t)}return n}}var hT=uT("application/json",function(e){return JSON.parse(e.responseText)});var cT=uT("text/plain",function(e){return e.responseText});var fT={},dT={},gT=34,pT=10,vT=13;function mT(e){return new Function("d","return {"+e.map(function(e,t){return JSON.stringify(e)+": d["+t+'] || ""'}).join(",")+"}")}function yT(n,i){var a=mT(n);return function(e,t){return i(a(e),t,n)}}function _T(e){var n=Object.create(null),i=[];e.forEach(function(e){for(var t in e){if(!(t in n)){i.push(n[t]=t)}}});return i}function bT(e,t){var n=e+"",i=n.length;return i9999?"+"+bT(e,6):bT(e,4)}function xT(e){var t=e.getUTCHours(),n=e.getUTCMinutes(),i=e.getUTCSeconds(),a=e.getUTCMilliseconds();return isNaN(e)?"Invalid Date":wT(e.getUTCFullYear())+"-"+bT(e.getUTCMonth()+1,2)+"-"+bT(e.getUTCDate(),2)+(a?"T"+bT(t,2)+":"+bT(n,2)+":"+bT(i,2)+"."+bT(a,3)+"Z":i?"T"+bT(t,2)+":"+bT(n,2)+":"+bT(i,2)+"Z":n||t?"T"+bT(t,2)+":"+bT(n,2)+"Z":"")}function kT(i){var t=new RegExp('["'+i+"\n\r]"),c=i.charCodeAt(0);function e(e,n){var i,a,t=r(e,function(e,t){if(i)return i(e,t-1);a=e,i=n?yT(e,n):mT(e)});t.columns=a||[];return t}function r(i,e){var t=[],a=i.length,r=0,n=0,o,s=a<=0,l=false;if(i.charCodeAt(a-1)===pT)--a;if(i.charCodeAt(a-1)===vT)--a;function u(){if(s)return dT;if(l)return l=false,fT;var e,t=r,n;if(i.charCodeAt(t)===gT){while(r++=a)s=true;else if((n=i.charCodeAt(r++))===pT)l=true;else if(n===vT){l=true;if(i.charCodeAt(r)===pT)++r}return i.slice(t+1,e-1).replace(/""/g,'"')}while(rMath.abs(e[1]-R[1]))C=true;else S=true}R=e;x=true;jT();P()}function P(){var e;b=R[0]-A[0];w=R[1]-A[1];switch(i){case VT:case HT:{if(a)b=Math.max(l-u,Math.min(g-p,b)),h=u+b,v=p+b;if(r)w=Math.max(c-f,Math.min(m-y,w)),d=f+w,_=y+w;break}case UT:{if(a<0)b=Math.max(l-u,Math.min(g-u,b)),h=u+b,v=p;else if(a>0)b=Math.max(l-p,Math.min(g-p,b)),h=u,v=p+b;if(r<0)w=Math.max(c-f,Math.min(m-f,w)),d=f+w,_=y;else if(r>0)w=Math.max(c-y,Math.min(m-y,w)),d=f,_=y+w;break}case GT:{if(a)h=Math.max(l,Math.min(g,u-b*a)),v=Math.max(l,Math.min(g,p+b*a));if(r)d=Math.max(c,Math.min(m,f-w*r)),_=Math.max(c,Math.min(m,y+w*r));break}}if(v0)u=h-b;if(r<0)y=_-w;else if(r>0)f=d-w;i=VT;B.attr("cursor",ZT.selection);P()}break}default:return}jT()}function F(){switch(ov.keyCode){case 16:{if(k){S=C=k=false;P()}break}case 18:{if(i===GT){if(a<0)p=v;else if(a>0)u=h;if(r<0)y=_;else if(r>0)f=d;i=UT;P()}break}case 32:{if(i===VT){if(ov.altKey){if(a)p=v-b*a,u=h+b*a;if(r)y=_-w*r,f=d+w*r;i=GT}else{if(a<0)p=v;else if(a>0)u=h;if(r<0)y=_;else if(r>0)f=d;i=UT}B.attr("cursor",ZT[n]);P()}break}default:return}jT()}}function l(){U(this,arguments).moved()}function u(){U(this,arguments).ended()}function h(){var e=this.__brush||{selection:null};e.extent=KT(t.apply(this,arguments));e.dim=L;return e}r.extent=function(e){return arguments.length?(t=typeof e==="function"?e:FT(KT(e)),r):t};r.filter=function(e){return arguments.length?(I=typeof e==="function"?e:FT(!!e),r):I};r.touchable=function(e){return arguments.length?(i=typeof e==="function"?e:FT(!!e),r):i};r.handleSize=function(e){return arguments.length?(a=+e,r):a};r.keyModifiers=function(e){return arguments.length?(j=!!e,r):j};r.on=function(){var e=n.on.apply(n,arguments);return e===n?r:e};return r}function cB(e,t,n){e.prototype=t.prototype=n;n.constructor=e}function fB(e,t){var n=Object.create(e.prototype);for(var i in t){n[i]=t[i]}return n}function dB(){}var gB=.7;var pB=1/gB;var vB="\\s*([+-]?\\d+)\\s*",mB="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",yB="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",_B=/^#([0-9a-f]{3,8})$/,bB=new RegExp("^rgb\\("+[vB,vB,vB]+"\\)$"),wB=new RegExp("^rgb\\("+[yB,yB,yB]+"\\)$"),xB=new RegExp("^rgba\\("+[vB,vB,vB,mB]+"\\)$"),kB=new RegExp("^rgba\\("+[yB,yB,yB,mB]+"\\)$"),SB=new RegExp("^hsl\\("+[mB,yB,yB]+"\\)$"),CB=new RegExp("^hsla\\("+[mB,yB,yB,mB]+"\\)$");var EB={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};cB(dB,TB,{copy:function e(t){return Object.assign(new this.constructor,this,t)},displayable:function e(){return this.rgb().displayable()},hex:AB,formatHex:AB,formatHsl:RB,formatRgb:MB,toString:MB});function AB(){return this.rgb().formatHex()}function RB(){return jB(this).formatHsl()}function MB(){return this.rgb().formatRgb()}function TB(e){var t,n;e=(e+"").trim().toLowerCase();return(t=_B.exec(e))?(n=t[1].length,t=parseInt(t[1],16),n===6?BB(t):n===3?new OB(t>>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?NB(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?NB(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=bB.exec(e))?new OB(t[1],t[2],t[3],1):(t=wB.exec(e))?new OB(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=xB.exec(e))?NB(t[1],t[2],t[3],t[4]):(t=kB.exec(e))?NB(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=SB.exec(e))?IB(t[1],t[2]/100,t[3]/100,1):(t=CB.exec(e))?IB(t[1],t[2]/100,t[3]/100,t[4]):EB.hasOwnProperty(e)?BB(EB[e]):e==="transparent"?new OB(NaN,NaN,NaN,0):null}function BB(e){return new OB(e>>16&255,e>>8&255,e&255,1)}function NB(e,t,n,i){if(i<=0)e=t=n=NaN;return new OB(e,t,n,i)}function DB(e){if(!(e instanceof dB))e=TB(e);if(!e)return new OB;e=e.rgb();return new OB(e.r,e.g,e.b,e.opacity)}function PB(e,t,n,i){return arguments.length===1?DB(e):new OB(e,t,n,i==null?1:i)}function OB(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}cB(OB,PB,fB(dB,{brighter:function e(t){t=t==null?pB:Math.pow(pB,t);return new OB(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?gB:Math.pow(gB,t);return new OB(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:zB,formatHex:zB,formatRgb:FB,toString:FB}));function zB(){return"#"+LB(this.r)+LB(this.g)+LB(this.b)}function FB(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}function LB(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function IB(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new VB(e,t,n,i)}function jB(e){if(e instanceof VB)return new VB(e.h,e.s,e.l,e.opacity);if(!(e instanceof dB))e=TB(e);if(!e)return new VB;if(e instanceof VB)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new VB(o,s,l,e.opacity)}function HB(e,t,n,i){return arguments.length===1?jB(e):new VB(e,t,n,i==null?1:i)}function VB(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}cB(VB,HB,fB(dB,{brighter:function e(t){t=t==null?pB:Math.pow(pB,t);return new VB(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?gB:Math.pow(gB,t);return new VB(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new OB(UB(t>=240?t-240:t+120,r,a),UB(t,r,a),UB(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(t===1?")":", "+t+")")}}));function UB(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}var GB=[].slice;var WB={};function KB(e){this._size=e;this._call=this._error=null;this._tasks=[];this._data=[];this._waiting=this._active=this._ended=this._start=0}KB.prototype=JB.prototype={constructor:KB,defer:function e(t){if(typeof t!=="function")throw new Error("invalid callback");if(this._call)throw new Error("defer after await");if(this._error!=null)return this;var n=GB.call(arguments,1);n.push(t);++this._waiting,this._tasks.push(n);qB(this);return this},abort:function e(){if(this._error==null)$B(this,new Error("abort"));return this},await:function e(n){if(typeof n!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=function(e,t){n.apply(null,[e].concat(t))};ZB(this);return this},awaitAll:function e(t){if(typeof t!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=t;ZB(this);return this}};function qB(t){if(!t._start){try{YB(t)}catch(e){if(t._tasks[t._ended+t._active-1])$B(t,e);else if(!t._data)throw e}}}function YB(e){while(e._start=e._waiting&&e._active=0){if(i=e._tasks[n]){e._tasks[n]=null;if(i.abort){try{i.abort()}catch(t){}}}}e._active=NaN;ZB(e)}function ZB(e){if(!e._active&&e._call){var t=e._data;e._data=undefined;e._call(e._error,t)}}function JB(e){if(e==null)e=Infinity;else if(!((e=+e)>=1))throw new Error("invalid concurrency");return new KB(e)}function QB(e){return function(){return e}}function eN(e,t,n){this.target=e;this.type=t;this.transform=n}function tN(e,t,n){this.k=e;this.x=t;this.y=n}tN.prototype={constructor:tN,scale:function e(t){return t===1?this:new tN(this.k*t,this.x,this.y)},translate:function e(t,n){return t===0&n===0?this:new tN(this.k,this.x+this.k*t,this.y+this.k*n)},apply:function e(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function e(t){return t*this.k+this.x},applyY:function e(t){return t*this.k+this.y},invert:function e(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function e(t){return(t-this.x)/this.k},invertY:function e(t){return(t-this.y)/this.k},rescaleX:function e(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function e(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function e(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var nN=new tN(1,0,0);iN.prototype=tN.prototype;function iN(e){while(!e.__zoom){if(!(e=e.parentNode))return nN}return e.__zoom}function aN(){ov.stopImmediatePropagation()}function rN(){ov.preventDefault();ov.stopImmediatePropagation()}function oN(){return!ov.ctrlKey&&!ov.button}function sN(){var e=this;if(e instanceof SVGElement){e=e.ownerSVGElement||e;if(e.hasAttribute("viewBox")){e=e.viewBox.baseVal;return[[e.x,e.y],[e.x+e.width,e.y+e.height]]}return[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]}return[[0,0],[e.clientWidth,e.clientHeight]]}function lN(){return this.__zoom||nN}function uN(){return-ov.deltaY*(ov.deltaMode===1?.05:ov.deltaMode?1:.002)}function hN(){return navigator.maxTouchPoints||"ontouchstart"in this}function cN(e,t,n){var i=e.invertX(t[0][0])-n[0][0],a=e.invertX(t[1][0])-n[1][0],r=e.invertY(t[0][1])-n[0][1],o=e.invertY(t[1][1])-n[1][1];return e.translate(a>i?(i+a)/2:Math.min(0,i)||Math.max(0,a),o>r?(r+o)/2:Math.min(0,r)||Math.max(0,o))}function fN(){var s=oN,c=sN,d=cN,r=uN,t=hN,o=[0,Infinity],g=[[-Infinity,-Infinity],[Infinity,Infinity]],l=250,f=r_,n=Mv("start","zoom","end"),p,u,h=500,v=150,m=0;function y(e){e.property("__zoom",lN).on("wheel.zoom",a).on("mousedown.zoom",S).on("dblclick.zoom",C).filter(t).on("touchstart.zoom",E).on("touchmove.zoom",A).on("touchend.zoom touchcancel.zoom",R).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}y.transform=function(e,t,n){var i=e.selection?e.selection():e;i.property("__zoom",lN);if(e!==i){x(e,t,n)}else{i.interrupt().each(function(){k(this,arguments).start().zoom(null,typeof t==="function"?t.apply(this,arguments):t).end()})}};y.scaleBy=function(e,n,t){y.scaleTo(e,function(){var e=this.__zoom.k,t=typeof n==="function"?n.apply(this,arguments):n;return e*t},t)};y.scaleTo=function(e,r,o){y.transform(e,function(){var e=c.apply(this,arguments),t=this.__zoom,n=o==null?w(e):typeof o==="function"?o.apply(this,arguments):o,i=t.invert(n),a=typeof r==="function"?r.apply(this,arguments):r;return d(b(_(t,a),n,i),e,g)},o)};y.translateBy=function(e,t,n){y.transform(e,function(){return d(this.__zoom.translate(typeof t==="function"?t.apply(this,arguments):t,typeof n==="function"?n.apply(this,arguments):n),c.apply(this,arguments),g)})};y.translateTo=function(e,i,a,r){y.transform(e,function(){var e=c.apply(this,arguments),t=this.__zoom,n=r==null?w(e):typeof r==="function"?r.apply(this,arguments):r;return d(nN.translate(n[0],n[1]).scale(t.k).translate(typeof i==="function"?-i.apply(this,arguments):-i,typeof a==="function"?-a.apply(this,arguments):-a),e,g)},r)};function _(e,t){t=Math.max(o[0],Math.min(o[1],t));return t===e.k?e:new tN(t,e.x,e.y)}function b(e,t,n){var i=t[0]-n[0]*e.k,a=t[1]-n[1]*e.k;return i===e.x&&a===e.y?e:new tN(e.k,i,a)}function w(e){return[(+e[0][0]+ +e[1][0])/2,(+e[0][1]+ +e[1][1])/2]}function x(e,u,h){e.on("start.zoom",function(){k(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){k(this,arguments).end()}).tween("zoom",function(){var e=this,t=arguments,i=k(e,t),n=c.apply(e,t),a=h==null?w(n):typeof h==="function"?h.apply(e,t):h,r=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),o=e.__zoom,s=typeof u==="function"?u.apply(e,t):u,l=f(o.invert(a).concat(r/o.k),s.invert(a).concat(r/s.k));return function(e){if(e===1)e=s;else{var t=l(e),n=r/t[2];e=new tN(n,a[0]-t[0]*n,a[1]-t[1]*n)}i.zoom(null,e)}})}function k(e,t,n){return!n&&e.__zooming||new i(e,t)}function i(e,t){this.that=e;this.args=t;this.active=0;this.extent=c.apply(e,t);this.taps=0}i.prototype={start:function e(){if(++this.active===1){this.that.__zooming=this;this.emit("start")}return this},zoom:function e(t,n){if(this.mouse&&t!=="mouse")this.mouse[1]=n.invert(this.mouse[0]);if(this.touch0&&t!=="touch")this.touch0[1]=n.invert(this.touch0[0]);if(this.touch1&&t!=="touch")this.touch1[1]=n.invert(this.touch1[0]);this.that.__zoom=n;this.emit("zoom");return this},end:function e(){if(--this.active===0){delete this.that.__zooming;this.emit("end")}return this},emit:function e(t){gv(new eN(y,t,this.that.__zoom),n.apply,n,[t,this.that,this.args])}};function a(){if(!s.apply(this,arguments))return;var e=k(this,arguments),t=this.__zoom,n=Math.max(o[0],Math.min(o[1],t.k*Math.pow(2,r.apply(this,arguments)))),i=Cv(this);if(e.wheel){if(e.mouse[0][0]!==i[0]||e.mouse[0][1]!==i[1]){e.mouse[1]=t.invert(e.mouse[0]=i)}clearTimeout(e.wheel)}else if(t.k===n)return;else{e.mouse=[i,t.invert(i)];pm(this);e.start()}rN();e.wheel=setTimeout(a,v);e.zoom("mouse",d(b(_(t,n),e.mouse[0],e.mouse[1]),e.extent,g));function a(){e.wheel=null;e.end()}}function S(){if(u||!s.apply(this,arguments))return;var n=k(this,arguments,true),e=xv(ov.view).on("mousemove.zoom",r,true).on("mouseup.zoom",o,true),t=Cv(this),i=ov.clientX,a=ov.clientY;OT(ov.view);aN();n.mouse=[t,this.__zoom.invert(t)];pm(this);n.start();function r(){rN();if(!n.moved){var e=ov.clientX-i,t=ov.clientY-a;n.moved=e*e+t*t>m}n.zoom("mouse",d(b(n.that.__zoom,n.mouse[0]=Cv(n.that),n.mouse[1]),n.extent,g))}function o(){e.on("mousemove.zoom mouseup.zoom",null);zT(ov.view,n.moved);rN();n.end()}}function C(){if(!s.apply(this,arguments))return;var e=this.__zoom,t=Cv(this),n=e.invert(t),i=e.k*(ov.shiftKey?.5:2),a=d(b(_(e,i),t,n),c.apply(this,arguments),g);rN();if(l>0)xv(this).transition().duration(l).call(x,a,t);else xv(this).call(y.transform,a)}function E(){if(!s.apply(this,arguments))return;var e=ov.touches,t=e.length,n=k(this,arguments,ov.changedTouches.length===t),i,a,r,o;aN();for(a=0;an.capacity)this.remove(n.linkedList.end.key);return this};e.update=function(e,t){if(this.has(e))this.set(e,t(this.get(e)));return this};e.remove=function(e){var t=this._LRUCacheState;var n=t.hash[e];if(!n)return this;if(n===t.linkedList.head)t.linkedList.head=n.p;if(n===t.linkedList.end)t.linkedList.end=n.n;s(n.n,n.p);delete t.hash[e];delete t.data[e];t.linkedList.length-=1;return this};e.removeAll=function(){this._LRUCacheState=new n(this._LRUCacheState.capacity);return this};e.info=function(){var e=this._LRUCacheState;return{capacity:e.capacity,length:e.linkedList.length}};e.keys=function(){var e=[];var t=this._LRUCacheState.linkedList.head;while(t){e.push(t.key);t=t.p}return e};e.has=function(e){return!!this._LRUCacheState.hash[e]};e.staleKey=function(){return this._LRUCacheState.linkedList.end&&this._LRUCacheState.linkedList.end.key};e.popStale=function(){var e=this.staleKey();if(!e)return null;var t=[e,this._LRUCacheState.data[e]];this.remove(e);return t};function n(e){this.capacity=e>0?+e:Number.MAX_SAFE_INTEGER||Number.MAX_VALUE;this.data=Object.create?Object.create(null):{};this.hash=Object.create?Object.create(null):{};this.linkedList=new i}function i(){this.length=0;this.head=null;this.end=null}function r(e){this.key=e;this.p=null;this.n=null}function o(e,t){if(t===e.head)return;if(!e.end){e.end=t}else if(e.end===t){e.end=t.n}s(t.n,t.p);s(t,e.head);e.head=t;e.head.n=null}function s(e,t){if(e===t)return;if(e)e.p=t;if(t)t.n=e}return t})});function mN(e,t){if((n=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var n,i=e.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+e.slice(n+1)]}function yN(e){return e=mN(Math.abs(e)),e?e[1]:NaN}function _N(s,l){return function(e,t){var n=e.length,i=[],a=0,r=s[0],o=0;while(n>0&&r>0){if(o+r+1>t)r=Math.max(1,t-o);i.push(e.substring(n-=r,n+r));if((o+=r+1)>t)break;r=s[a=(a+1)%s.length]}return i.reverse().join(l)}}function bN(t){return function(e){return e.replace(/[0-9]/g,function(e){return t[+e]})}}var wN=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function xN(e){if(!(t=wN.exec(e)))throw new Error("invalid format: "+e);var t;return new kN({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}xN.prototype=kN.prototype;function kN(e){this.fill=e.fill===undefined?" ":e.fill+"";this.align=e.align===undefined?">":e.align+"";this.sign=e.sign===undefined?"-":e.sign+"";this.symbol=e.symbol===undefined?"":e.symbol+"";this.zero=!!e.zero;this.width=e.width===undefined?undefined:+e.width;this.comma=!!e.comma;this.precision=e.precision===undefined?undefined:+e.precision;this.trim=!!e.trim;this.type=e.type===undefined?"":e.type+""}kN.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===undefined?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===undefined?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function SN(e){e:for(var t=e.length,n=1,i=-1,a;n0)i=0;break}}return i>0?e.slice(0,i)+e.slice(a+1):e}var CN;function EN(e,t){var n=mN(e,t);if(!n)return e+"";var i=n[0],a=n[1],r=a-(CN=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,o=i.length;return r===o?i:r>o?i+new Array(r-o+1).join("0"):r>0?i.slice(0,r)+"."+i.slice(r):"0."+new Array(1-r).join("0")+mN(e,Math.max(0,t+r-1))[0]}function AN(e,t){var n=mN(e,t);if(!n)return e+"";var i=n[0],a=n[1];return a<0?"0."+new Array(-a).join("0")+i:i.length>a+1?i.slice(0,a+1)+"."+i.slice(a+1):i+new Array(a-i.length+2).join("0")}var RN={"%":function e(t,n){return(t*100).toFixed(n)},b:function e(t){return Math.round(t).toString(2)},c:function e(t){return t+""},d:function e(t){return Math.round(t).toString(10)},e:function e(t,n){return t.toExponential(n)},f:function e(t,n){return t.toFixed(n)},g:function e(t,n){return t.toPrecision(n)},o:function e(t){return Math.round(t).toString(8)},p:function e(t,n){return AN(t*100,n)},r:AN,s:EN,X:function e(t){return Math.round(t).toString(16).toUpperCase()},x:function e(t){return Math.round(t).toString(16)}};function MN(e){return e}var TN=Array.prototype.map,BN=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function NN(e){var x=e.grouping===undefined||e.thousands===undefined?MN:_N(TN.call(e.grouping,Number),e.thousands+""),i=e.currency===undefined?"":e.currency[0]+"",a=e.currency===undefined?"":e.currency[1]+"",k=e.decimal===undefined?".":e.decimal+"",S=e.numerals===undefined?MN:bN(TN.call(e.numerals,String)),r=e.percent===undefined?"%":e.percent+"",C=e.minus===undefined?"-":e.minus+"",E=e.nan===undefined?"NaN":e.nan+"";function o(e){e=xN(e);var u=e.fill,h=e.align,c=e.sign,t=e.symbol,f=e.zero,d=e.width,g=e.comma,p=e.precision,v=e.trim,m=e.type;if(m==="n")g=true,m="g";else if(!RN[m])p===undefined&&(p=12),v=true,m="g";if(f||u==="0"&&h==="=")f=true,u="0",h="=";var y=t==="$"?i:t==="#"&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",_=t==="$"?a:/[%p]/.test(m)?r:"";var b=RN[m],w=/[defgprs%]/.test(m);p=p===undefined?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p));function n(e){var t=y,n=_,i,a,r;if(m==="c"){n=b(e)+n;e=""}else{e=+e;var o=e<0||1/e<0;e=isNaN(e)?E:b(Math.abs(e),p);if(v)e=SN(e);if(o&&+e===0&&c!=="+")o=false;t=(o?c==="("?c:C:c==="-"||c==="("?"":c)+t;n=(m==="s"?BN[8+CN/3]:"")+n+(o&&c==="("?")":"");if(w){i=-1,a=e.length;while(++ir||r>57){n=(r===46?k+e.slice(i+1):e.slice(i))+n;e=e.slice(0,i);break}}}}if(g&&!f)e=x(e,Infinity);var s=t.length+e.length+n.length,l=s>1)+t+e+n+l.slice(s);break;default:e=l+t+e+n;break}return S(e)}n.toString=function(){return e+""};return n}function t(e,t){var n=o((e=xN(e),e.type="f",e)),i=Math.max(-8,Math.min(8,Math.floor(yN(t)/3)))*3,a=Math.pow(10,-i),r=BN[8+i/3];return function(e){return n(a*e)+r}}return{format:o,formatPrefix:t}}var DN={"en-GB":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","T","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["£",""]},"en-US":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","T","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-CL":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["$",""]},"es-MX":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-ES":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","mm","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["€",""]},"et-EE":{separator:" ",suffixes:["y","z","a","f","p","n","µ","m","","tuhat","miljonit","miljardit","triljonit","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["","eurot"]},"fr-FR":{suffixes:["y","z","a","f","p","n","µ","m","","k","m","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["€",""]}};function PN(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){PN=function e(t){return typeof t}}else{PN=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return PN(e)}var ON=function e(t,n){return parseFloat(Math.round(t*Math.pow(10,n))/Math.pow(10,n)).toFixed(n)};function zN(e,t,n){var i=0;if(e){if(e<0)e*=-1;i=1+Math.floor(1e-12+Math.log(e)/Math.LN10);i=Math.max(-24,Math.min(24,Math.floor((i-1)/3)*3))}var a=n[8+i/3];return{number:ON(a.scale(e),t),symbol:a.symbol}}function FN(e,t){var n=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(e){return e/n}:function(e){return e*n},symbol:e}}function LN(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"en-US";var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(isFinite(e))e*=1;else return"N/A";var i=e<0;var a=e.toString().split(".")[0].replace("-","").length,r=PN(t)==="object"?t:DN[t]||DN["en-US"],o=r.suffixes.map(FN);var s=r.delimiters.decimal||".",l=r.separator||"",u=r.delimiters.thousands||",";var h=NN({currency:r.currency||["$",""],decimal:s,grouping:r.grouping||[3],thousands:u});var c;if(n)c=h.format(n)(e);else if(e===0)c="0";else if(a>=3){var f=zN(h.format(".3r")(e),2,o);var d=parseFloat(f.number).toString().replace(".",s);var g=f.symbol;c="".concat(d).concat(l).concat(g)}else if(a===3)c=h.format(",f")(e);else if(e<1&&e>-1)c=h.format(".2g")(e);else c=h.format(".3g")(e);return"".concat(i&&c.charAt(0)!=="-"?"-":"").concat(c).replace(/(\.[0]*[1-9]*)[0]*$/g,"$1").replace(/\.[0]*$/g,"")}function IN(e){if(e.constructor===Date)return e;else if(e.constructor===Number&&"".concat(e).length>5&&e%1===0)return new Date(e);var t="".concat(e);var n=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(t),i=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(t);if(n){var a=n[1];if(a.indexOf("-")===0)t=t.replace(a,a.substr(1));var r=new Date(t);r.setFullYear(a);return r}else if(i){var o=i[1];if(o.indexOf("-")===0)t=t.replace(o,o.substr(1));var s=new Date(t);s.setFullYear(o);return s}else if(!t.includes("/")&&!t.includes(" ")&&(!t.includes("-")||!t.indexOf("-"))){var l=new Date("".concat(t,"/01/01"));l.setFullYear(e);return l}else return new Date(t)}var jN={"de-DE":{dateTime:"%A, der %e. %B %Y, %X",date:"%d.%m.%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"en-GB":{dateTime:"%a %e %b %X %Y",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-US":{dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es-ES":{dateTime:"%A, %e de %B de %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-MX":{dateTime:"%x, %X",date:"%d/%m/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"fr-FR":{dateTime:"%A, le %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],shortDays:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],shortMonths:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"it-IT":{dateTime:"%A %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"]},"pt-BR":{dateTime:"%A, %e de %B de %Y. %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"]}};function HN(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function VN(e){return KN(e)||WN(e)||GN(e)||UN()}function UN(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function GN(e,t){if(!e)return;if(typeof e==="string")return qN(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor)n=e.constructor.name;if(n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return qN(e,t)}function WN(e){if(typeof Symbol!=="undefined"&&Symbol.iterator in Object(e))return Array.from(e)}function KN(e){if(Array.isArray(e))return qN(e)}function qN(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,i=new Array(t);nt[1]?n.reverse():n}},{key:"_getPosition",value:function e(t){return t<0&&this._d3ScaleNegative?this._d3ScaleNegative(t):this._d3Scale(t)}},{key:"_getRange",value:function e(){var t=[];if(this._d3ScaleNegative)t=this._d3ScaleNegative.range();if(this._d3Scale)t=t.concat(this._d3Scale.range());return t[0]>t[1]?Be(t).reverse():Be(t)}},{key:"_getTicks",value:function e(){var t=sk().domain([10,400]).range([10,50]);var n=[];if(this._d3ScaleNegative){var i=this._d3ScaleNegative.range();var a=i[1]-i[0];n=this._d3ScaleNegative.ticks(Math.floor(a/t(a)))}if(this._d3Scale){var r=this._d3Scale.range();var o=r[1]-r[0];n=n.concat(this._d3Scale.ticks(Math.floor(o/t(o))))}return n}},{key:"_gridPosition",value:function e(t){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var i=this._position,a=i.height,r=i.x,o=i.y,s=i.opposite,l=this._margin[s],u=["top","left"].includes(this._orient)?this._outerBounds[o]+this._outerBounds[a]-l:this._outerBounds[o]+l,h=n?this._lastScale||this._getPosition.bind(this):this._getPosition.bind(this),c=["top","left"].includes(this._orient)?l:-l,f=this._scale==="band"?this._d3Scale.bandwidth()/2:0,d=function e(t){return h(t.id)+f};t.call(xn,this._gridConfig).attr("".concat(r,"1"),d).attr("".concat(r,"2"),d).attr("".concat(o,"1"),u).attr("".concat(o,"2"),n?u:u+c)}},{key:"render",value:function e(t){var d=this,n;if(this._select===void 0){this.select(xv("body").append("svg").attr("width","".concat(this._width,"px")).attr("height","".concat(this._height,"px")).node())}var i=this._timeLocale||jN[this._locale]||jN["en-US"];fC(i).format();var s=lC("%a %d"),l=lC("%I %p"),u=lC(".%L"),h=lC("%I:%M"),c=lC("%b"),f=lC(":%S"),g=lC("%b %d"),p=lC("%Y");var a=this._position,r=a.width,v=a.height,m=a.x,y=a.y,_=a.horizontal,b=a.opposite,o="d3plus-Axis-clip-".concat(this._uuid),w=["top","left"].includes(this._orient),x=this._padding,k=this._select,C=[x,this["_".concat(r)]-x],S=sb().duration(this._duration);var E=this._shape==="Circle"?this._shapeConfig.r:this._shape==="Rect"?this._shapeConfig[r]:this._shapeConfig.strokeWidth;var A=typeof E!=="function"?function(){return E}:E;var R=this._margin={top:0,right:0,bottom:0,left:0};var M,T,B;var N=this._tickFormat?this._tickFormat:function(e){if(d._scale==="time"){return(bk(e)=1e3?i[d._tickUnit+8]:"";var r=e/Math.pow(10,3*d._tickUnit);var o=LN(r,t,",.".concat(r.toString().length,"r"));return"".concat(o).concat(n).concat(a)}else{return LN(e,d._locale)}};function D(){var a=this;var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this._range;T=e?e.slice():[undefined,undefined];var t=C[0],n=C[1];if(this._range){if(this._range[0]!==undefined)t=this._range[0];if(this._range[this._range.length-1]!==undefined)n=this._range[this._range.length-1]}if(T[0]===undefined||T[0]n)T[1]=n;var i=n-t;if(this._scale==="ordinal"&&this._domain.length>T.length){if(e===this._range){var r=this._domain.length+1;T=Ne(r).map(function(e){return T[0]+i*(e/(r-1))}).slice(1,r);T=T.map(function(e){return e-T[0]/2})}else{var o=this._domain.length;var s=T[1]-T[0];T=Ne(o).map(function(e){return T[0]+s*(e/(o-1))})}}else if(e===this._range){var l=sk().domain([10,400]).range([10,50]);var u=this._scale==="time"?this._domain.map(IN):this._domain;var h=pe(u[0],u[1],Math.floor(i/l(i)));B=(this._ticks?this._scale==="time"?this._ticks.map(IN):this._ticks:h).slice();M=(this._labels?this._scale==="time"?this._labels.map(IN):this._labels:h).slice();var c=M.length;if(c){var f=Math.ceil(i/c/2);T=[T[0]+f,T[1]-f]}}var d="scale".concat(this._scale.charAt(0).toUpperCase()).concat(this._scale.slice(1));this._d3Scale=GC[d]().domain(this._scale==="time"?this._domain.map(IN):this._domain).range(T);if(this._d3Scale.padding)this._d3Scale.padding(this._scalePadding);if(this._d3Scale.paddingInner)this._d3Scale.paddingInner(this._paddingInner);if(this._d3Scale.paddingOuter)this._d3Scale.paddingOuter(this._paddingOuter);this._d3ScaleNegative=null;if(this._scale==="log"){var g=this._d3Scale.domain();if(g[0]===0){g[0]=Math.abs(g[g.length-1])<=1?1e-6:1;if(g[g.length-1]<0)g[0]*=-1}else if(g[g.length-1]===0){g[g.length-1]=Math.abs(g[0])<=1?1e-6:1;if(g[0]<0)g[g.length-1]*=-1}var p=this._d3Scale.range();if(g[0]<0&&g[g.length-1]<0){this._d3ScaleNegative=this._d3Scale.copy().domain(g).range(p);this._d3Scale=null}else if(g[0]>0&&g[g.length-1]>0){this._d3Scale.domain(g).range(p)}else{var v=Zx().domain([1,g[g[1]>0?1:0]]).range([0,1]);var m=v(Math.abs(g[g[1]<0?1:0]));var y=m/(m+1)*(p[1]-p[0]);if(g[0]>0)y=p[1]-p[0]-y;this._d3ScaleNegative=this._d3Scale.copy();(g[0]<0?this._d3Scale:this._d3ScaleNegative).domain([Math.sign(g[1]),g[1]]).range([p[0]+y,p[1]]);(g[0]<0?this._d3ScaleNegative:this._d3Scale).domain([g[0],Math.sign(g[0])]).range([p[0],p[0]+y])}}B=(this._ticks?this._scale==="time"?this._ticks.map(IN):this._ticks:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():this._domain).slice();M=(this._labels?this._scale==="time"?this._labels.map(IN):this._labels:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():B).slice();if(this._scale==="log"){var _=M.filter(function(e){return Math.abs(e).toString().charAt(0)==="1"&&(a._d3Scale?e!==-1:e!==1)});if(_.length>2){M=_;B=_}else if(M.length>=10){M=M.filter(function(e){return e%5===0||N(e).substr(-1)==="1"})}}if(this._scale==="time"){B=B.map(Number);M=M.map(Number)}B=B.sort(function(e,t){return a._getPosition(e)-a._getPosition(t)});M=M.sort(function(e,t){return a._getPosition(e)-a._getPosition(t)});if(this._scale==="linear"&&this._tickSuffix==="smallest"){var b=M.filter(function(e){return e>=1e3});if(b.length>0){var w=Math.min.apply(Math,VN(b));var x=1;while(x&&x<7){var k=Math.pow(10,3*x);if(w/k>=1){this._tickUnit=x;x+=1}else{break}}}}var S=[];this._availableTicks=B;B.forEach(function(e,t){var n=A({id:e,tick:true},t);if(a._shape==="Circle")n*=2;var i=a._getPosition(e);if(!S.length||Math.abs(Rg(i,S)-i)>n*2)S.push(i);else S.push(false)});B=B.filter(function(e,t){return S[t]!==false});this._visibleTicks=B}D.bind(this)();function P(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var n=e.i,i=e.position;if(this._scale==="band"){return this._d3Scale.bandwidth()}else{var a=n-t<0?U.length===1||!this._range?C[0]:(i-U[n+t].position)/2-i:i-(i-U[n-t].position)/2;var r=Math.abs(i-a);var o=n+t>U.length-1?U.length===1||!this._range?C[1]:(i-U[n-t].position)/2-i:i-(i-U[n+t].position)/2;var s=Math.abs(i-o);return Oe([r,s])*2}}if(this._title){var O=this._titleConfig,z=O.fontFamily,F=O.fontSize,L=O.lineHeight;var I=AE().fontFamily(typeof z==="function"?z():z).fontSize(typeof F==="function"?F():F).lineHeight(typeof L==="function"?L():L).width(T[T.length-1]-T[0]-x*2).height(this["_".concat(v)]-this._tickSize-x*2);var j=I(this._title).lines.length;R[this._orient]=j*I.lineHeight()+x}var H=this._shape==="Circle"?typeof this._shapeConfig.r==="function"?this._shapeConfig.r({tick:true}):this._shapeConfig.r:this._shape==="Rect"?typeof this._shapeConfig[v]==="function"?this._shapeConfig[v]({tick:true}):this._shapeConfig[v]:this._tickSize,V=A({tick:true});if(typeof H==="function")H=ve(B.map(H));if(this._shape==="Rect")H/=2;if(typeof V==="function")V=ve(B.map(V));if(this._shape!=="Circle")V/=2;var U=M.map(function(e,t){var n=d._shapeConfig.labelConfig.fontFamily(e,t),i=d._shapeConfig.labelConfig.fontSize(e,t),a=d._getPosition(e);var r=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(e,t):i*1.4;return{d:e,i:t,fF:n,fS:i,lineHeight:r,position:a}});function G(e){var t=e.d,n=e.i,i=e.fF,a=e.fS,r=e.rotate,o=e.space;var s=r?"width":"height",l=r?"height":"width";var u=Oe([this._maxSize,this._width]);var h=Oe([this._maxSize,this._height]);var c=AE().fontFamily(i).fontSize(a).lineHeight(this._shapeConfig.lineHeight?this._shapeConfig.lineHeight(t,n):undefined)[l](_?o:u-H-x-this._margin.left-this._margin.right)[s](_?h-H-x-this._margin.top-this._margin.bottom:o);var f=c(N(t));f.lines=f.lines.filter(function(e){return e!==""});f.width=f.lines.length?Math.ceil(ve(f.widths))+a/4:0;if(f.width%2)f.width++;f.height=f.lines.length?Math.ceil(f.lines.length*c.lineHeight())+a/4:0;if(f.height%2)f.height++;return f}U=U.map(function(e){e.rotate=d._labelRotation;e.space=P.bind(d)(e);var t=G.bind(d)(e);return Object.assign(t,e)});this._rotateLabels=_&&this._labelRotation===undefined?U.some(function(e){return e.truncated}):this._labelRotation;if(this._rotateLabels){U=U.map(function(e){e.rotate=true;var t=G.bind(d)(e);return Object.assign(e,t)})}var W=[0,0];for(var K=0;K<2;K++){var q=U[K?U.length-1:0];if(!q)break;var Y=q.height,X=q.position,$=q.rotate,Z=q.width;var J=K?C[1]:C[0];var Q=($||!_?Y:Z)/2;var ee=K?X+Q-J:X-Q-J;W[K]=ee}var te=T[0];var ne=T[T.length-1];var ie=[te-W[0],ne-W[1]];if(this._range){if(this._range[0]!==undefined)ie[0]=this._range[0];if(this._range[this._range.length-1]!==undefined)ie[1]=this._range[this._range.length-1]}if(ie[0]!==te||ie[1]!==ne){D.bind(this)(ie);U=M.map(function(e,t){var n=d._shapeConfig.labelConfig.fontFamily(e,t),i=d._shapeConfig.labelConfig.fontSize(e,t),a=d._getPosition(e);var r=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(e,t):i*1.4;return{d:e,i:t,fF:n,fS:i,lineHeight:r,position:a}});U=U.map(function(e){e.rotate=d._rotateLabels;e.space=P.bind(d)(e);var t=G.bind(d)(e);return Object.assign(t,e)})}var ae=ve(U,function(e){return e.height})||0;this._rotateLabels=_&&this._labelRotation===undefined?U.some(function(e){var t=e.i,n=e.height,i=e.position,a=e.truncated;var r=U[t-1];return a||t&&r.position+r.height/2>i-n/2}):this._labelRotation;if(this._rotateLabels){var re=0;U=U.map(function(e){e.space=P.bind(d)(e,2);var t=G.bind(d)(e);e=Object.assign(e,t);var n=U[e.i-1];if(!n){re=1}else if(n.position+n.height/2>e.position){if(re){e.offset=n.width;re=0}else re=1}return e})}var oe=this._labelOffset?ve(U,function(e){return e.offset||0}):0;U.forEach(function(e){return e.offset=e.offset?oe:0});var se=this._shape==="Line"?0:H;var le=this._outerBounds=(n={},HN(n,v,(ve(U,function(e){return Math.ceil(e[e.rotate||!_?"width":"height"]+e.offset)})||0)+(U.length?x:0)),HN(n,r,C[C.length-1]-C[0]),HN(n,m,C[0]),n);le[v]=ve([this._minSize,le[v]]);R[this._orient]+=H;R[b]=this._gridSize!==undefined?ve([this._gridSize,se]):this["_".concat(v)]-R[this._orient]-le[v]-x;le[v]+=R[b]+R[this._orient];le[y]=this._align==="start"?this._padding:this._align==="end"?this["_".concat(v)]-le[v]-this._padding:this["_".concat(v)]/2-le[v]/2;var ue=gb("g#d3plus-Axis-".concat(this._uuid),{parent:k});this._group=ue;var he=gb("g.grid",{parent:ue}).selectAll("line").data((this._gridSize!==0?this._grid||this._scale==="log"&&!this._gridLog?M:B:[]).map(function(e){return{id:e}}),function(e){return e.id});he.exit().transition(S).attr("opacity",0).call(this._gridPosition.bind(this)).remove();he.enter().append("line").attr("opacity",0).attr("clip-path","url(#".concat(o,")")).call(this._gridPosition.bind(this),true).merge(he).transition(S).attr("opacity",1).call(this._gridPosition.bind(this));var ce=M.filter(function(e,t){return U[t].lines.length&&!B.includes(e)});var fe=U.some(function(e){return e.rotate});var de=B.concat(ce).map(function(t){var e;var n=U.find(function(e){return e.d===t});var i=d._getPosition(t);var a=n?n.space:0;var r=n?n.lines.length:1;var o=n?n.lineHeight:1;var s=n&&d._labelOffset?n.offset:0;var l=_?a:le.width-R[d._position.opposite]-H-R[d._orient]+x;var u=R[b],h=(H+s)*(w?-1:1),c=w?le[y]+le[v]-u:le[y]+u;var f=(e={id:t,labelBounds:fe&&n?{x:-n.width/2+n.fS/4,y:d._orient==="bottom"?h+x+(n.width-o*r)/2:h-x*2-(n.width+o*r)/2,width:n.width,height:n.height}:{x:_?-a/2:d._orient==="left"?-l-x+h:h+x,y:_?d._orient==="bottom"?h+x:h-x-ae:-a/2,width:_?a:l,height:_?ae:a},rotate:n?n.rotate:false,size:M.includes(t)?h:0,text:M.includes(t)?N(t):false,tick:B.includes(t)},HN(e,m,i+(d._scale==="band"?d._d3Scale.bandwidth()/2:0)),HN(e,y,c),e);return f});if(this._shape==="Line"){de=de.concat(de.map(function(e){var t=Object.assign({},e);t[y]+=e.size;return t}))}(new iT[this._shape]).data(de).duration(this._duration).labelConfig({ellipsis:function e(t){return t&&t.length?"".concat(t,"..."):""},rotate:function e(t){return t.rotate?-90:0}}).select(gb("g.ticks",{parent:ue}).node()).config(this._shapeConfig).render();var ge=ue.selectAll("line.bar").data([null]);ge.enter().append("line").attr("class","bar").attr("opacity",0).call(this._barPosition.bind(this)).merge(ge).transition(S).attr("opacity",1).call(this._barPosition.bind(this));this._titleClass.data(this._title?[{text:this._title}]:[]).duration(this._duration).height(R[this._orient]).rotate(this._orient==="left"?-90:this._orient==="right"?90:0).select(gb("g.d3plus-Axis-title",{parent:ue}).node()).text(function(e){return e.text}).verticalAlign("middle").width(T[T.length-1]-T[0]).x(_?T[0]:this._orient==="left"?le.x+R.left/2-(T[T.length-1]-T[0])/2:le.x+le.width-R.right/2-(T[T.length-1]-T[0])/2).y(_?this._orient==="bottom"?le.y+le.height-R.bottom:le.y:T[0]+(T[T.length-1]-T[0])/2-R[this._orient]/2).config(this._titleConfig).render();this._lastScale=this._getPosition.bind(this);if(t)setTimeout(t,this._duration+100);return this}},{key:"align",value:function e(t){return arguments.length?(this._align=t,this):this._align}},{key:"barConfig",value:function e(t){return arguments.length?(this._barConfig=Object.assign(this._barConfig,t),this):this._barConfig}},{key:"domain",value:function e(t){return arguments.length?(this._domain=t,this):this._domain}},{key:"duration",value:function e(t){return arguments.length?(this._duration=t,this):this._duration}},{key:"grid",value:function e(t){return arguments.length?(this._grid=t,this):this._grid}},{key:"gridConfig",value:function e(t){return arguments.length?(this._gridConfig=Object.assign(this._gridConfig,t),this):this._gridConfig}},{key:"gridLog",value:function e(t){return arguments.length?(this._gridLog=t,this):this._gridLog}},{key:"gridSize",value:function e(t){return arguments.length?(this._gridSize=t,this):this._gridSize}},{key:"height",value:function e(t){return arguments.length?(this._height=t,this):this._height}},{key:"labels",value:function e(t){return arguments.length?(this._labels=t,this):this._labels}},{key:"labelOffset",value:function e(t){return arguments.length?(this._labelOffset=t,this):this._labelOffset}},{key:"labelRotation",value:function e(t){return arguments.length?(this._labelRotation=t,this):this._labelRotation}},{key:"maxSize",value:function e(t){return arguments.length?(this._maxSize=t,this):this._maxSize}},{key:"minSize",value:function e(t){return arguments.length?(this._minSize=t,this):this._minSize}},{key:"orient",value:function e(t){if(arguments.length){var n=["top","bottom"].includes(t),i={top:"bottom",right:"left",bottom:"top",left:"right"};this._position={horizontal:n,width:n?"width":"height",height:n?"height":"width",x:n?"x":"y",y:n?"y":"x",opposite:i[t]};return this._orient=t,this}return this._orient}},{key:"outerBounds",value:function e(){return this._outerBounds}},{key:"padding",value:function e(t){return arguments.length?(this._padding=t,this):this._padding}},{key:"paddingInner",value:function e(t){return arguments.length?(this._paddingInner=t,this):this._paddingInner}},{key:"paddingOuter",value:function e(t){return arguments.length?(this._paddingOuter=t,this):this._paddingOuter}},{key:"range",value:function e(t){return arguments.length?(this._range=t,this):this._range}},{key:"scale",value:function e(t){return arguments.length?(this._scale=t,this):this._scale}},{key:"scalePadding",value:function e(t){return arguments.length?(this._scalePadding=t,this):this._scalePadding}},{key:"select",value:function e(t){return arguments.length?(this._select=xv(t),this):this._select}},{key:"shape",value:function e(t){return arguments.length?(this._shape=t,this):this._shape}},{key:"shapeConfig",value:function e(t){return arguments.length?(this._shapeConfig=wn(this._shapeConfig,t),this):this._shapeConfig}},{key:"tickFormat",value:function e(t){return arguments.length?(this._tickFormat=t,this):this._tickFormat}},{key:"ticks",value:function e(t){return arguments.length?(this._ticks=t,this):this._ticks}},{key:"tickSize",value:function e(t){return arguments.length?(this._tickSize=t,this):this._tickSize}},{key:"tickSpecifier",value:function e(t){return arguments.length?(this._tickSpecifier=t,this):this._tickSpecifier}},{key:"tickSuffix",value:function e(t){return arguments.length?(this._tickSuffix=t,this):this._tickSuffix}},{key:"timeLocale",value:function e(t){return arguments.length?(this._timeLocale=t,this):this._timeLocale}},{key:"title",value:function e(t){return arguments.length?(this._title=t,this):this._title}},{key:"titleConfig",value:function e(t){return arguments.length?(this._titleConfig=Object.assign(this._titleConfig,t),this):this._titleConfig}},{key:"width",value:function e(t){return arguments.length?(this._width=t,this):this._width}}]);return i}(Ag);function oD(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){oD=function e(t){return typeof t}}else{oD=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return oD(e)}function sD(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function lD(e,t){for(var n=0;n0){var r=(n[t]-n[e-1])/(t-e+1);a=i[t]-i[e-1]-(t-e+1)*r*r}else a=i[t]-n[t]*n[t]/(t+1);if(a<0)return 0;return a}function KD(e,t,n,i,a,r,o){if(e>t)return;var s=Math.floor((e+t)/2);i[n][s]=i[n-1][s-1];a[n][s]=s;var l=n;if(e>n)l=Math.max(l,a[n][e-1]||0);l=Math.max(l,a[n-1][s]||0);var u=s-1;if(t=l;--h){var c=WD(h,s,r,o);if(c+i[n-1][l-1]>=i[n][s])break;var f=WD(l,s,r,o);var d=f+i[n-1][l-1];if(de.length){throw new Error("Cannot generate more classes than there are data values")}var n=VD(e);var i=UD(n);if(i===1){return[n]}var a=GD(t,n.length),r=GD(t,n.length);qD(n,r,a);var o=a[0]?a[0].length-1:0;var s=[];for(var l=a.length-1;l>=0;l--){var u=a[l][o];s[l]=n.slice(u,o+1);if(l>0)o=u-1}return s}function XD(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){XD=function e(t){return typeof t}}else{XD=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return XD(e)}function $D(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function ZD(e,t){for(var n=0;nl){var u=1,h=[];var d=ve(this._lineData.map(function(e){return e.words.length}));this._wrapLines=function(){var t=this;u++;if(u>d)return;var o=u===1?this._lineData.slice():this._lineData.filter(function(e){return e.width+e.shapeWidth+t._padding*(e.width?2:1)>l&&e.words.length>=u}).sort(function(e,t){return t.sentence.length-e.sentence.length});if(o.length&&f>o[0].height*u){var s=false;var e=function e(t){var n=o[t];var i=n.og.height*u,a=n.og.width*(1.5*(1/u));var r=AE().fontFamily(n.f).fontSize(n.s).lineHeight(n.lh).width(a).height(i)(n.sentence);if(!r.truncated){n.width=Math.ceil(ve(r.lines.map(function(e){return ZC(e,{"font-family":n.f,"font-size":n.s})})))+n.s;n.height=r.lines.length*(n.lh+1)}else{s=true;return"break"}};for(var n=0;nf){h=[];break}if(a>l){h=[];this._wrapLines();break}else if(t+af){o=O(this._lineData.map(function(e){return e.shapeWidth+c._padding}))-this._padding;for(var s=0;sthis._midpoint;var f=h&&c;var d=this._color,g,p;if(d&&!(d instanceof Array)){d=Ne(0,this._buckets,1).map(function(e){return XC(d,(e+1)/n._buckets)}).reverse()}if(this._scale==="jenks"){var v=this._data.map(this._value).filter(function(e){return e!==null&&typeof e==="number"});var m=Oe([d?d.length:this._buckets,v.length]);var y=[];if(f&&this._centered){var _=Math.floor(m/2);var b=m%2;var w=v.filter(function(e){return e=n._midpoint});var S=Te(k);var C=x>S?1:0;var E=S>x?1:0;var A=YD(w,_+b*C);var R=YD(k,_+b*E);y=A.concat(R)}else{y=YD(v,m)}p=Pe(y.map(function(e,t){return t===y.length-1?[e[0],e[e.length-1]]:[e[0]]}));var M=new Set(p);if(p.length!==M.size){g=Array.from(M)}if(!d){if(f){d=[this._colorMin,this._colorMid,this._colorMax];var T=p.slice(0,m).filter(function(e,t){return en._midpoint});var N=p.slice(0,m).filter(function(e,t){return e>n._midpoint&&p[t+1]>n._midpoint});var D=T.map(function(e,t){return!t?d[0]:XC(d[0],t/T.length)});var P=B.map(function(){return d[1]});var O=N.map(function(e,t){return t===N.length-1?d[2]:XC(d[2],1-(t+1)/N.length)});d=D.concat(P).concat(O)}else{d=Ne(0,this._buckets,1).map(function(e){return XC(n._colorMax,e/n._buckets)}).reverse()}}if(v.length<=m){d=d.slice(m-v.length)}this._colorScale=hk().domain(p).range(["black"].concat(d).concat(d[d.length-1]))}else{var z;if(f&&!d){var F=Math.floor(this._buckets/2);var L=Ne(0,F,1).map(function(e){return!e?n._colorMin:XC(n._colorMin,e/F)});var I=(this._buckets%2?[0]:[]).map(function(){return n._colorMid});var j=Ne(0,F,1).map(function(e){return!e?n._colorMax:XC(n._colorMax,e/F)}).reverse();d=L.concat(I).concat(j);var H=(d.length-1)/2;z=[u[0],this._midpoint,u[1]];z=Ne(u[0],this._midpoint,-(u[0]-this._midpoint)/H).concat(Ne(this._midpoint,u[1],(u[1]-this._midpoint)/H)).concat([u[1]])}else{if(!d){if(this._scale==="buckets"||this._scale==="quantile"){d=Ne(0,this._buckets,1).map(function(e){return XC(h?n._colorMin:n._colorMax,e/n._buckets)});if(c)d=d.reverse()}else{d=h?[this._colorMin,XC(this._colorMin,.8)]:[XC(this._colorMax,.8),this._colorMax]}}if(this._scale==="quantile"){var V=1/(d.length-1);z=Ne(0,1+V/2,V).map(function(e){return De(l,e)})}else if(f&&this._color&&this._centered){var U=(this._midpoint-u[0])/Math.floor(d.length/2);var G=(u[1]-this._midpoint)/Math.floor(d.length/2);var W=Ne(u[0],this._midpoint,U);var K=Ne(this._midpoint,u[1]+G/2,G);z=W.concat(K)}else{var q=(u[1]-u[0])/(d.length-1);z=Ne(u[0],u[1]+q/2,q)}}if(this._scale==="buckets"||this._scale==="quantile"){p=z.concat([z[z.length-1]])}else if(this._scale==="log"){var Y=z.filter(function(e){return e<0});if(Y.length){var X=Y[0];var $=Y.map(function(e){return-Math.pow(Math.abs(X),e/X)});Y.forEach(function(e,t){z[z.indexOf(e)]=$[t]})}var Z=z.filter(function(e){return e>0});if(Z.length){var J=Z[Z.length-1];var Q=Z.map(function(e){return Math.pow(J,e/J)});Z.forEach(function(e,t){z[z.indexOf(e)]=Q[t]})}if(z.includes(0))z[z.indexOf(0)]=1}this._colorScale=Ix().domain(z).range(d)}var ee=this._bucketAxis||!["buckets","jenks","quantile"].includes(this._scale);var te=sb().duration(this._duration);var ne={enter:{opacity:0},exit:{opacity:0},parent:this._group,transition:te,update:{opacity:1}};var ie=gb("g.d3plus-ColorScale-labels",Object.assign({condition:ee},ne));var ae=gb("g.d3plus-ColorScale-Rect",Object.assign({condition:ee},ne));var re=gb("g.d3plus-ColorScale-legend",Object.assign({condition:!ee},ne));if(ee){var oe;var se={x:0,y:0};var le=wn({domain:i?u:u.reverse(),duration:this._duration,height:this._height,labels:g||p,orient:this._orient,padding:this._padding,scale:this._scale==="log"?"log":"linear",ticks:p,width:this._width},this._axisConfig);var ue=wn({height:this["_".concat(a)]/2,width:this["_".concat(r)]/2},this._labelConfig||this._axisConfig.titleConfig);this._labelClass.config(ue);var he=[];if(i&&this._labelMin){var ce={"font-family":this._labelClass.fontFamily()(this._labelMin),"font-size":this._labelClass.fontSize()(this._labelMin),"font-weight":this._labelClass.fontWeight()(this._labelMin)};if(ce["font-family"]instanceof Array)ce["font-family"]=ce["font-family"][0];var fe=ZC(this._labelMin,ce);if(fe&&fe=0){return 1}}return 0}();function zP(e){var t=false;return function(){if(t){return}t=true;window.Promise.resolve().then(function(){t=false;e()})}}function FP(e){var t=false;return function(){if(!t){t=true;setTimeout(function(){t=false;e()},OP)}}}var LP=PP&&window.Promise;var IP=LP?zP:FP;function jP(e){var t={};return e&&t.toString.call(e)==="[object Function]"}function HP(e,t){if(e.nodeType!==1){return[]}var n=e.ownerDocument.defaultView;var i=n.getComputedStyle(e,null);return t?i[t]:i}function VP(e){if(e.nodeName==="HTML"){return e}return e.parentNode||e.host}function UP(e){if(!e){return document.body}switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=HP(e),n=t.overflow,i=t.overflowX,a=t.overflowY;if(/(auto|scroll|overlay)/.test(n+a+i)){return e}return UP(VP(e))}function GP(e){return e&&e.referenceNode?e.referenceNode:e}var WP=PP&&!!(window.MSInputMethodContext&&document.documentMode);var KP=PP&&/MSIE 10/.test(navigator.userAgent);function qP(e){if(e===11){return WP}if(e===10){return KP}return WP||KP}function YP(e){if(!e){return document.documentElement}var t=qP(10)?document.body:null;var n=e.offsetParent||null;while(n===t&&e.nextElementSibling){n=(e=e.nextElementSibling).offsetParent}var i=n&&n.nodeName;if(!i||i==="BODY"||i==="HTML"){return e?e.ownerDocument.documentElement:document.documentElement}if(["TH","TD","TABLE"].indexOf(n.nodeName)!==-1&&HP(n,"position")==="static"){return YP(n)}return n}function XP(e){var t=e.nodeName;if(t==="BODY"){return false}return t==="HTML"||YP(e.firstElementChild)===e}function $P(e){if(e.parentNode!==null){return $P(e.parentNode)}return e}function ZP(e,t){if(!e||!e.nodeType||!t||!t.nodeType){return document.documentElement}var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING;var i=n?e:t;var a=n?t:e;var r=document.createRange();r.setStart(i,0);r.setEnd(a,0);var o=r.commonAncestorContainer;if(e!==o&&t!==o||i.contains(a)){if(XP(o)){return o}return YP(o)}var s=$P(e);if(s.host){return ZP(s.host,t)}else{return ZP(e,$P(t).host)}}function JP(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"top";var n=t==="top"?"scrollTop":"scrollLeft";var i=e.nodeName;if(i==="BODY"||i==="HTML"){var a=e.ownerDocument.documentElement;var r=e.ownerDocument.scrollingElement||a;return r[n]}return e[n]}function QP(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var i=JP(t,"top");var a=JP(t,"left");var r=n?-1:1;e.top+=i*r;e.bottom+=i*r;e.left+=a*r;e.right+=a*r;return e}function eO(e,t){var n=t==="x"?"Left":"Top";var i=n==="Left"?"Right":"Bottom";return parseFloat(e["border"+n+"Width"])+parseFloat(e["border"+i+"Width"])}function tO(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],qP(10)?parseInt(n["offset"+e])+parseInt(i["margin"+(e==="Height"?"Top":"Left")])+parseInt(i["margin"+(e==="Height"?"Bottom":"Right")]):0)}function nO(e){var t=e.body;var n=e.documentElement;var i=qP(10)&&getComputedStyle(n);return{height:tO("Height",t,n,i),width:tO("Width",t,n,i)}}var iO=function e(t,n){if(!(t instanceof n)){throw new TypeError("Cannot call a class as a function")}};var aO=function(){function i(e,t){for(var n=0;n2&&arguments[2]!==undefined?arguments[2]:false;var i=qP(10);var a=t.nodeName==="HTML";var r=lO(e);var o=lO(t);var s=UP(e);var l=HP(t);var u=parseFloat(l.borderTopWidth);var h=parseFloat(l.borderLeftWidth);if(n&&a){o.top=Math.max(o.top,0);o.left=Math.max(o.left,0)}var c=sO({top:r.top-o.top-u,left:r.left-o.left-h,width:r.width,height:r.height});c.marginTop=0;c.marginLeft=0;if(!i&&a){var f=parseFloat(l.marginTop);var d=parseFloat(l.marginLeft);c.top-=u-f;c.bottom-=u-f;c.left-=h-d;c.right-=h-d;c.marginTop=f;c.marginLeft=d}if(i&&!n?t.contains(s):t===s&&s.nodeName!=="BODY"){c=QP(c,t)}return c}function hO(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=e.ownerDocument.documentElement;var i=uO(e,n);var a=Math.max(n.clientWidth,window.innerWidth||0);var r=Math.max(n.clientHeight,window.innerHeight||0);var o=!t?JP(n):0;var s=!t?JP(n,"left"):0;var l={top:o-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:a,height:r};return sO(l)}function cO(e){var t=e.nodeName;if(t==="BODY"||t==="HTML"){return false}if(HP(e,"position")==="fixed"){return true}var n=VP(e);if(!n){return false}return cO(n)}function fO(e){if(!e||!e.parentElement||qP()){return document.documentElement}var t=e.parentElement;while(t&&HP(t,"transform")==="none"){t=t.parentElement}return t||document.documentElement}function dO(e,t,n,i){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var r={top:0,left:0};var o=a?fO(e):ZP(e,GP(t));if(i==="viewport"){r=hO(o,a)}else{var s=void 0;if(i==="scrollParent"){s=UP(VP(t));if(s.nodeName==="BODY"){s=e.ownerDocument.documentElement}}else if(i==="window"){s=e.ownerDocument.documentElement}else{s=i}var l=uO(s,o,a);if(s.nodeName==="HTML"&&!cO(o)){var u=nO(e.ownerDocument),h=u.height,c=u.width;r.top+=l.top-l.marginTop;r.bottom=h+l.top;r.left+=l.left-l.marginLeft;r.right=c+l.left}else{r=l}}n=n||0;var f=typeof n==="number";r.left+=f?n:n.left||0;r.top+=f?n:n.top||0;r.right-=f?n:n.right||0;r.bottom-=f?n:n.bottom||0;return r}function gO(e){var t=e.width,n=e.height;return t*n}function pO(e,t,i,n,a){var r=arguments.length>5&&arguments[5]!==undefined?arguments[5]:0;if(e.indexOf("auto")===-1){return e}var o=dO(i,n,r,a);var s={top:{width:o.width,height:t.top-o.top},right:{width:o.right-t.right,height:o.height},bottom:{width:o.width,height:o.bottom-t.bottom},left:{width:t.left-o.left,height:o.height}};var l=Object.keys(s).map(function(e){return oO({key:e},s[e],{area:gO(s[e])})}).sort(function(e,t){return t.area-e.area});var u=l.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight});var h=u.length>0?u[0].key:l[0].key;var c=e.split("-")[1];return h+(c?"-"+c:"")}function vO(e,t,n){var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var a=i?fO(t):ZP(t,GP(n));return uO(n,a,i)}function mO(e){var t=e.ownerDocument.defaultView;var n=t.getComputedStyle(e);var i=parseFloat(n.marginTop||0)+parseFloat(n.marginBottom||0);var a=parseFloat(n.marginLeft||0)+parseFloat(n.marginRight||0);var r={width:e.offsetWidth+a,height:e.offsetHeight+i};return r}function yO(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function _O(e,t,n){n=n.split("-")[0];var i=mO(e);var a={width:i.width,height:i.height};var r=["right","left"].indexOf(n)!==-1;var o=r?"top":"left";var s=r?"left":"top";var l=r?"height":"width";var u=!r?"height":"width";a[o]=t[o]+t[l]/2-i[l]/2;if(n===s){a[s]=t[s]-i[u]}else{a[s]=t[yO(s)]}return a}function bO(e,t){if(Array.prototype.find){return e.find(t)}return e.filter(t)[0]}function wO(e,t,n){if(Array.prototype.findIndex){return e.findIndex(function(e){return e[t]===n})}var i=bO(e,function(e){return e[t]===n});return e.indexOf(i)}function xO(e,n,t){var i=t===undefined?e:e.slice(0,wO(e,"name",t));i.forEach(function(e){if(e["function"]){console.warn("`modifier.function` is deprecated, use `modifier.fn`!")}var t=e["function"]||e.fn;if(e.enabled&&jP(t)){n.offsets.popper=sO(n.offsets.popper);n.offsets.reference=sO(n.offsets.reference);n=t(n,e)}});return n}function kO(){if(this.state.isDestroyed){return}var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:false,offsets:{}};e.offsets.reference=vO(this.state,this.popper,this.reference,this.options.positionFixed);e.placement=pO(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding);e.originalPlacement=e.placement;e.positionFixed=this.options.positionFixed;e.offsets.popper=_O(this.popper,e.offsets.reference,e.placement);e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute";e=xO(this.modifiers,e);if(!this.state.isCreated){this.state.isCreated=true;this.options.onCreate(e)}else{this.options.onUpdate(e)}}function SO(e,i){return e.some(function(e){var t=e.name,n=e.enabled;return n&&t===i})}function CO(e){var t=[false,"ms","Webkit","Moz","O"];var n=e.charAt(0).toUpperCase()+e.slice(1);for(var i=0;io[d]){e.offsets.popper[c]+=s[c]+g-o[d]}e.offsets.popper=sO(e.offsets.popper);var p=s[c]+s[u]/2-g/2;var v=HP(e.instance.popper);var m=parseFloat(v["margin"+h]);var y=parseFloat(v["border"+h+"Width"]);var _=p-e.offsets.popper[c]-m-y;_=Math.max(Math.min(o[u]-g,_),0);e.arrowElement=i;e.offsets.arrow=(n={},rO(n,c,Math.round(_)),rO(n,f,""),n);return e}function UO(e){if(e==="end"){return"start"}else if(e==="start"){return"end"}return e}var GO=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"];var WO=GO.slice(3);function KO(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=WO.indexOf(e);var i=WO.slice(n+1).concat(WO.slice(0,n));return t?i.reverse():i}var qO={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function YO(p,v){if(SO(p.instance.modifiers,"inner")){return p}if(p.flipped&&p.placement===p.originalPlacement){return p}var m=dO(p.instance.popper,p.instance.reference,v.padding,v.boundariesElement,p.positionFixed);var y=p.placement.split("-")[0];var _=yO(y);var b=p.placement.split("-")[1]||"";var w=[];switch(v.behavior){case qO.FLIP:w=[y,_];break;case qO.CLOCKWISE:w=KO(y);break;case qO.COUNTERCLOCKWISE:w=KO(y,true);break;default:w=v.behavior}w.forEach(function(e,t){if(y!==e||w.length===t+1){return p}y=p.placement.split("-")[0];_=yO(y);var n=p.offsets.popper;var i=p.offsets.reference;var a=Math.floor;var r=y==="left"&&a(n.right)>a(i.left)||y==="right"&&a(n.left)a(i.top)||y==="bottom"&&a(n.top)a(m.right);var l=a(n.top)a(m.bottom);var h=y==="left"&&o||y==="right"&&s||y==="top"&&l||y==="bottom"&&u;var c=["top","bottom"].indexOf(y)!==-1;var f=!!v.flipVariations&&(c&&b==="start"&&o||c&&b==="end"&&s||!c&&b==="start"&&l||!c&&b==="end"&&u);var d=!!v.flipVariationsByContent&&(c&&b==="start"&&s||c&&b==="end"&&o||!c&&b==="start"&&u||!c&&b==="end"&&l);var g=f||d;if(r||h||g){p.flipped=true;if(r||h){y=w[t+1]}if(g){b=UO(b)}p.placement=y+(b?"-"+b:"");p.offsets.popper=oO({},p.offsets.popper,_O(p.instance.popper,p.offsets.reference,p.placement));p=xO(p.instance.modifiers,p,"flip")}});return p}function XO(e){var t=e.offsets,n=t.popper,i=t.reference;var a=e.placement.split("-")[0];var r=Math.floor;var o=["top","bottom"].indexOf(a)!==-1;var s=o?"right":"bottom";var l=o?"left":"top";var u=o?"width":"height";if(n[s]r(i[s])){e.offsets.popper[l]=r(i[s])}return e}function $O(e,t,n,i){var a=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);var r=+a[1];var o=a[2];if(!r){return e}if(o.indexOf("%")===0){var s=void 0;switch(o){case"%p":s=n;break;case"%":case"%r":default:s=i}var l=sO(s);return l[t]/100*r}else if(o==="vh"||o==="vw"){var u=void 0;if(o==="vh"){u=Math.max(document.documentElement.clientHeight,window.innerHeight||0)}else{u=Math.max(document.documentElement.clientWidth,window.innerWidth||0)}return u/100*r}else{return r}}function ZO(e,a,r,t){var o=[0,0];var s=["right","left"].indexOf(t)!==-1;var n=e.split(/(\+|\-)/).map(function(e){return e.trim()});var i=n.indexOf(bO(n,function(e){return e.search(/,|\s/)!==-1}));if(n[i]&&n[i].indexOf(",")===-1){console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.")}var l=/\s*,\s*|\s+/;var u=i!==-1?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];u=u.map(function(e,t){var n=(t===1?!s:s)?"height":"width";var i=false;return e.reduce(function(e,t){if(e[e.length-1]===""&&["+","-"].indexOf(t)!==-1){e[e.length-1]=t;i=true;return e}else if(i){e[e.length-1]+=t;i=false;return e}else{return e.concat(t)}},[]).map(function(e){return $O(e,n,a,r)})});u.forEach(function(n,i){n.forEach(function(e,t){if(DO(e)){o[i]+=e*(n[t-1]==="-"?-1:1)}})});return o}function JO(e,t){var n=t.offset;var i=e.placement,a=e.offsets,r=a.popper,o=a.reference;var s=i.split("-")[0];var l=void 0;if(DO(+n)){l=[+n,0]}else{l=ZO(n,r,o,s)}if(s==="left"){r.top+=l[0];r.left-=l[1]}else if(s==="right"){r.top+=l[0];r.left+=l[1]}else if(s==="top"){r.left+=l[0];r.top-=l[1]}else if(s==="bottom"){r.left+=l[0];r.top+=l[1]}e.popper=r;return e}function QO(e,a){var t=a.boundariesElement||YP(e.instance.popper);if(e.instance.reference===t){t=YP(t)}var n=CO("transform");var i=e.instance.popper.style;var r=i.top,o=i.left,s=i[n];i.top="";i.left="";i[n]="";var l=dO(e.instance.popper,e.instance.reference,a.padding,t,e.positionFixed);i.top=r;i.left=o;i[n]=s;a.boundaries=l;var u=a.priority;var h=e.offsets.popper;var c={primary:function e(t){var n=h[t];if(h[t]l[t]&&!a.escapeWithReference){i=Math.min(h[n],l[t]-(t==="right"?h.width:h.height))}return rO({},n,i)}};u.forEach(function(e){var t=["left","top"].indexOf(e)!==-1?"primary":"secondary";h=oO({},h,c[t](e))});e.offsets.popper=h;return e}function ez(e){var t=e.placement;var n=t.split("-")[0];var i=t.split("-")[1];if(i){var a=e.offsets,r=a.reference,o=a.popper;var s=["bottom","top"].indexOf(n)!==-1;var l=s?"left":"top";var u=s?"width":"height";var h={start:rO({},l,r[l]),end:rO({},l,r[l]+r[u]-o[u])};e.offsets.popper=oO({},o,h[i])}return e}function tz(e){if(!HO(e.instance.modifiers,"hide","preventOverflow")){return e}var t=e.offsets.reference;var n=bO(e.instance.modifiers,function(e){return e.name==="preventOverflow"}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.right2&&arguments[2]!==undefined?arguments[2]:{};iO(this,r);this.scheduleUpdate=function(){return requestAnimationFrame(n.update)};this.update=IP(this.update.bind(this));this.options=oO({},r.Defaults,i);this.state={isDestroyed:false,isCreated:false,scrollParents:[]};this.reference=e&&e.jquery?e[0]:e;this.popper=t&&t.jquery?t[0]:t;this.options.modifiers={};Object.keys(oO({},r.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=oO({},r.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})});this.modifiers=Object.keys(this.options.modifiers).map(function(e){return oO({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order});this.modifiers.forEach(function(e){if(e.enabled&&jP(e.onLoad)){e.onLoad(n.reference,n.popper,n.options,e,n.state)}});this.update();var a=this.options.eventsEnabled;if(a){this.enableEventListeners()}this.state.eventsEnabled=a}aO(r,[{key:"update",value:function e(){return kO.call(this)}},{key:"destroy",value:function e(){return EO.call(this)}},{key:"enableEventListeners",value:function e(){return TO.call(this)}},{key:"disableEventListeners",value:function e(){return NO.call(this)}}]);return r}();rz.Utils=(typeof window!=="undefined"?window:global).PopperUtils;rz.placements=GO;rz.Defaults=az;function oz(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){oz=function e(t){return typeof t}}else{oz=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return oz(e)}function sz(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function lz(e,t){for(var n=0;n0&&arguments[0]!==undefined?arguments[0]:{},n=t.duration,i=n===void 0?600:n,a=t.callback;this.mask.call(this.exit.bind(this),i);this.elem.call(this.exit.bind(this),i);if(a)setTimeout(a,i+100);this._isVisible=false;return this}},{key:"render",value:function e(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=t.callback,i=t.container,a=i===void 0?"body":i,r=t.duration,o=r===void 0?600:r,s=t.html,l=s===void 0?"Please Wait":s,u=t.mask,h=u===void 0?"rgba(0, 0, 0, 0.05)":u,c=t.style,f=c===void 0?{}:c;var d=xv(a);this.mask=d.selectAll("div.d3plus-Mask").data(h?[h]:[]);this.mask=this.mask.enter().append("div").attr("class","d3plus-Mask").style("opacity",1).merge(this.mask);this.mask.exit().call(this.exit.bind(this),o);Bb(this.mask,{"background-color":String,bottom:"0px",left:"0px",position:"absolute",right:"0px",top:"0px"});this.elem=d.selectAll("div.d3plus-Message").data([l]);this.elem=this.elem.enter().append("div").attr("class","d3plus-Message").style("opacity",1).merge(this.elem).html(String);Bb(this.elem,f);if(n)setTimeout(n,100);this._isVisible=true;return this}}]);return e}();function xz(){var e=this._history.length;var t=gb("g.d3plus-viz-back",{parent:this._select,transition:this._transition,update:{transform:"translate(".concat(this._margin.left,", ").concat(this._margin.top,")")}}).node();this._backClass.data(e?[{text:"← ".concat(this._translate("Back")),x:0,y:0}]:[]).select(t).config(this._backConfig).render();this._margin.top+=e?this._backClass.fontSize()()+this._backClass.padding()()*2:0}function kz(){var i=this;var e=this._data;var t=this._colorScalePosition||"bottom";var n=["top","bottom"].includes(t);var a=this._colorScalePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var r=this._width-(this._margin.left+this._margin.right+a.left+a.right);var o=n?Oe([this._colorScaleMaxSize,r]):this._width-(this._margin.left+this._margin.right);var s=this._height-(this._margin.bottom+this._margin.top+a.bottom+a.top);var l=!n?Oe([this._colorScaleMaxSize,s]):this._height-(this._margin.bottom+this._margin.top);var u={opacity:this._colorScalePosition?1:0,transform:"translate(".concat(n?this._margin.left+a.left+(r-o)/2:this._margin.left,", ").concat(n?this._margin.top:this._margin.top+a.top+(s-l)/2,")")};var h=this._colorScale&&e&&e.length>1;var c=gb("g.d3plus-viz-colorScale",{condition:h&&!this._colorScaleConfig.select,enter:u,parent:this._select,transition:this._transition,update:u}).node();if(h){var f=e.filter(function(e,t){var n=i._colorScale(e,t);return n!==undefined&&n!==null});this._colorScaleClass.align({bottom:"end",left:"start",right:"end",top:"start"}[t]||"bottom").duration(this._duration).data(f).height(l).locale(this._locale).orient(t).select(c).value(this._colorScale).width(o).config(this._colorScaleConfig).render();var d=this._colorScaleClass.outerBounds();if(this._colorScalePosition&&!this._colorScaleConfig.select&&d.height){if(n)this._margin[t]+=d.height+this._legendClass.padding()*2;else this._margin[t]+=d.width+this._legendClass.padding()*2}}else{this._colorScaleClass.config(this._colorScaleConfig)}}var Sz=pN(function(t,e){(function(e){{t.exports=e()}})(function(){return function r(o,s,l){function u(n,e){if(!s[n]){if(!o[n]){var t=typeof gN=="function"&&gN;if(!e&&t)return t(n,!0);if(h)return h(n,!0);var i=new Error("Cannot find module '"+n+"'");throw i.code="MODULE_NOT_FOUND",i}var a=s[n]={exports:{}};o[n][0].call(a.exports,function(e){var t=o[n][1][e];return u(t?t:e)},a,a.exports,r,o,s,l)}return s[n].exports}var h=typeof gN=="function"&&gN;for(var e=0;e= 0x80 (not a basic code point)","invalid-input":"Invalid input"},c=y-_,S=Math.floor,C=String.fromCharCode,f;function E(e){throw new RangeError(h[e])}function d(e,t){var n=e.length;var i=[];while(n--){i[n]=t(e[n])}return i}function g(e,t){var n=e.split("@");var i="";if(n.length>1){i=n[0]+"@";e=n[1]}e=e.replace(u,".");var a=e.split(".");var r=d(a,t).join(".");return i+r}function A(e){var t=[],n=0,i=e.length,a,r;while(n=55296&&a<=56319&&n65535){e-=65536;t+=C(e>>>10&1023|55296);e=56320|e&1023}t+=C(e);return t}).join("")}function R(e){if(e-48<10){return e-22}if(e-65<26){return e-65}if(e-97<26){return e-97}return y}function M(e,t){return e+22+75*(e<26)-((t!=0)<<5)}function T(e,t,n){var i=0;e=n?S(e/o):e>>1;e+=S(e/t);for(;e>c*b>>1;i+=y){e=S(e/c)}return S(i+(c+1)*e/(e+r))}function p(e){var t=[],n=e.length,i,a=0,r=x,o=w,s,l,u,h,c,f,d,g,p;s=e.lastIndexOf(k);if(s<0){s=0}for(l=0;l=128){E("not-basic")}t.push(e.charCodeAt(l))}for(u=s>0?s+1:0;u=n){E("invalid-input")}d=R(e.charCodeAt(u++));if(d>=y||d>S((m-a)/c)){E("overflow")}a+=d*c;g=f<=o?_:f>=o+b?b:f-o;if(dS(m/p)){E("overflow")}c*=p}i=t.length+1;o=T(a-h,i,h==0);if(S(a/i)>m-r){E("overflow")}r+=S(a/i);a%=i;t.splice(a++,0,r)}return v(t)}function B(e){var t,n,i,a,r,o,s,l,u,h,c,f=[],d,g,p,v;e=A(e);d=e.length;t=x;n=0;r=w;for(o=0;o=t&&cS((m-n)/g)){E("overflow")}n+=(s-t)*g;t=s;for(o=0;om){E("overflow")}if(c==t){for(l=n,u=y;;u+=y){h=u<=r?_:u>=r+b?b:u-r;if(l0){c(n.documentElement);clearInterval(e);if(a.type==="view"){l.contentWindow.scrollTo(r,o);if(/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&(l.contentWindow.scrollY!==o||l.contentWindow.scrollX!==r)){n.documentElement.style.top=-o+"px";n.documentElement.style.left=-r+"px";n.documentElement.style.position="absolute"}}t(l)}},50)};n.open();n.write("");u(e,r,o);n.replaceChild(n.adoptNode(s),n.documentElement);n.close()})}},{"./log":13}],3:[function(e,t,n){function i(e){this.r=0;this.g=0;this.b=0;this.a=null;var t=this.fromArray(e)||this.namedColor(e)||this.rgb(e)||this.rgba(e)||this.hex6(e)||this.hex3(e)}i.prototype.darken=function(e){var t=1-e;return new i([Math.round(this.r*t),Math.round(this.g*t),Math.round(this.b*t),this.a])};i.prototype.isTransparent=function(){return this.a===0};i.prototype.isBlack=function(){return this.r===0&&this.g===0&&this.b===0};i.prototype.fromArray=function(e){if(Array.isArray(e)){this.r=Math.min(e[0],255);this.g=Math.min(e[1],255);this.b=Math.min(e[2],255);if(e.length>3){this.a=e[3]}}return Array.isArray(e)};var a=/^#([a-f0-9]{3})$/i;i.prototype.hex3=function(e){var t=null;if((t=e.match(a))!==null){this.r=parseInt(t[1][0]+t[1][0],16);this.g=parseInt(t[1][1]+t[1][1],16);this.b=parseInt(t[1][2]+t[1][2],16)}return t!==null};var r=/^#([a-f0-9]{6})$/i;i.prototype.hex6=function(e){var t=null;if((t=e.match(r))!==null){this.r=parseInt(t[1].substring(0,2),16);this.g=parseInt(t[1].substring(2,4),16);this.b=parseInt(t[1].substring(4,6),16)}return t!==null};var o=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;i.prototype.rgb=function(e){var t=null;if((t=e.match(o))!==null){this.r=Number(t[1]);this.g=Number(t[2]);this.b=Number(t[3])}return t!==null};var s=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;i.prototype.rgba=function(e){var t=null;if((t=e.match(s))!==null){this.r=Number(t[1]);this.g=Number(t[2]);this.b=Number(t[3]);this.a=Number(t[4])}return t!==null};i.prototype.toString=function(){return this.a!==null&&this.a!==1?"rgba("+[this.r,this.g,this.b,this.a].join(",")+")":"rgb("+[this.r,this.g,this.b].join(",")+")"};i.prototype.namedColor=function(e){e=e.toLowerCase();var t=l[e];if(t){this.r=t[0];this.g=t[1];this.b=t[2]}else if(e==="transparent"){this.r=this.g=this.b=this.a=0;return true}return!!t};i.prototype.isColor=true;var l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};t.exports=i},{}],4:[function(e,t,n){var d=e("./support");var o=e("./renderers/canvas");var g=e("./imageloader");var p=e("./nodeparser");var i=e("./nodecontainer");var v=e("./log");var a=e("./utils");var r=e("./clone");var s=e("./proxy").loadUrlDocument;var m=a.getBounds;var c="data-html2canvas-node";var l=0;function u(e,t){var n=l++;t=t||{};if(t.logging){v.options.logging=true;v.options.start=Date.now()}t.async=typeof t.async==="undefined"?true:t.async;t.allowTaint=typeof t.allowTaint==="undefined"?false:t.allowTaint;t.removeContainer=typeof t.removeContainer==="undefined"?true:t.removeContainer;t.javascriptEnabled=typeof t.javascriptEnabled==="undefined"?false:t.javascriptEnabled;t.imageTimeout=typeof t.imageTimeout==="undefined"?1e4:t.imageTimeout;t.renderer=typeof t.renderer==="function"?t.renderer:o;t.strict=!!t.strict;if(typeof e==="string"){if(typeof t.proxy!=="string"){return Promise.reject("Proxy must be used when rendering url")}var i=t.width!=null?t.width:window.innerWidth;var a=t.height!=null?t.height:window.innerHeight;return s(k(e),t.proxy,document,i,a,t).then(function(e){return y(e.contentWindow.document.documentElement,e,t,i,a)})}var r=(e===undefined?[document.documentElement]:e.length?e:[e])[0];r.setAttribute(c+n,n);return f(r.ownerDocument,t,r.ownerDocument.defaultView.innerWidth,r.ownerDocument.defaultView.innerHeight,n).then(function(e){if(typeof t.onrendered==="function"){v("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");t.onrendered(e)}return e})}u.CanvasRenderer=o;u.NodeContainer=i;u.log=v;u.utils=a;var h=typeof document==="undefined"||typeof Object.create!=="function"||typeof document.createElement("canvas").getContext!=="function"?function(){return Promise.reject("No canvas support")}:u;t.exports=h;function f(o,s,l,u,h){return r(o,o,l,u,s,o.defaultView.pageXOffset,o.defaultView.pageYOffset).then(function(e){v("Document cloned");var t=c+h;var n="["+t+"='"+h+"']";o.querySelector(n).removeAttribute(t);var i=e.contentWindow;var a=i.document.querySelector(n);var r=typeof s.onclone==="function"?Promise.resolve(s.onclone(i.document)):Promise.resolve(true);return r.then(function(){return y(a,e,s,l,u)})})}function y(t,n,i,e,a){var r=n.contentWindow;var o=new d(r.document);var s=new g(i,o);var l=m(t);var u=i.type==="view"?e:w(r.document);var h=i.type==="view"?a:x(r.document);var c=new i.renderer(u,h,s,i,document);var f=new p(t,c,o,s,i);return f.ready.then(function(){v("Finished rendering");var e;if(i.type==="view"){e=b(c.canvas,{width:c.canvas.width,height:c.canvas.height,top:0,left:0,x:0,y:0})}else if(t===r.document.body||t===r.document.documentElement||i.canvas!=null){e=c.canvas}else{e=b(c.canvas,{width:i.width!=null?i.width:l.width,height:i.height!=null?i.height:l.height,top:l.top,left:l.left,x:0,y:0})}_(n,i);return e})}function _(e,t){if(t.removeContainer){e.parentNode.removeChild(e);v("Cleaned up container")}}function b(e,t){var n=document.createElement("canvas");var i=Math.min(e.width-1,Math.max(0,t.left));var a=Math.min(e.width,Math.max(1,t.left+t.width));var r=Math.min(e.height-1,Math.max(0,t.top));var o=Math.min(e.height,Math.max(1,t.top+t.height));n.width=t.width;n.height=t.height;var s=a-i;var l=o-r;v("Cropping canvas at:","left:",t.left,"top:",t.top,"width:",s,"height:",l);v("Resulting crop with width",t.width,"and height",t.height,"with x",i,"and y",r);n.getContext("2d").drawImage(e,i,r,s,l,t.x,t.y,s,l);return n}function w(e){return Math.max(Math.max(e.body.scrollWidth,e.documentElement.scrollWidth),Math.max(e.body.offsetWidth,e.documentElement.offsetWidth),Math.max(e.body.clientWidth,e.documentElement.clientWidth))}function x(e){return Math.max(Math.max(e.body.scrollHeight,e.documentElement.scrollHeight),Math.max(e.body.offsetHeight,e.documentElement.offsetHeight),Math.max(e.body.clientHeight,e.documentElement.clientHeight))}function k(e){var t=document.createElement("a");t.href=e;t.href=t.href;return t}},{"./clone":2,"./imageloader":11,"./log":13,"./nodecontainer":14,"./nodeparser":15,"./proxy":16,"./renderers/canvas":20,"./support":22,"./utils":26}],5:[function(e,t,n){var i=e("./log");var a=e("./utils").smallImage;function r(e){this.src=e;i("DummyImageContainer for",e);if(!this.promise||!this.image){i("Initiating DummyImageContainer");r.prototype.image=new Image;var n=this.image;r.prototype.promise=new Promise(function(e,t){n.onload=e;n.onerror=t;n.src=a();if(n.complete===true){e(n)}})}}t.exports=r},{"./log":13,"./utils":26}],6:[function(e,t,n){var l=e("./utils").smallImage;function i(e,t){var n=document.createElement("div"),i=document.createElement("img"),a=document.createElement("span"),r="Hidden Text",o,s;n.style.visibility="hidden";n.style.fontFamily=e;n.style.fontSize=t;n.style.margin=0;n.style.padding=0;document.body.appendChild(n);i.src=l();i.width=1;i.height=1;i.style.margin=0;i.style.padding=0;i.style.verticalAlign="baseline";a.style.fontFamily=e;a.style.fontSize=t;a.style.margin=0;a.style.padding=0;a.appendChild(document.createTextNode(r));n.appendChild(a);n.appendChild(i);o=i.offsetTop-a.offsetTop+1;n.removeChild(a);n.appendChild(document.createTextNode(r));n.style.lineHeight="normal";i.style.verticalAlign="super";s=i.offsetTop-n.offsetTop+1;document.body.removeChild(n);this.baseline=o;this.lineWidth=1;this.middle=s}t.exports=i},{"./utils":26}],7:[function(e,t,n){var i=e("./font");function a(){this.data={}}a.prototype.getMetrics=function(e,t){if(this.data[e+"-"+t]===undefined){this.data[e+"-"+t]=new i(e,t)}return this.data[e+"-"+t]};t.exports=a},{"./font":6}],8:[function(r,e,t){var n=r("./utils");var o=n.getBounds;var a=r("./proxy").loadUrlDocument;function i(t,e,n){this.image=null;this.src=t;var i=this;var a=o(t);this.promise=(!e?this.proxyLoad(n.proxy,a,n):new Promise(function(e){if(t.contentWindow.document.URL==="about:blank"||t.contentWindow.document.documentElement==null){t.contentWindow.onload=t.onload=function(){e(t)}}else{e(t)}})).then(function(e){var t=r("./core");return t(e.contentWindow.document.documentElement,{type:"view",width:e.width,height:e.height,proxy:n.proxy,javascriptEnabled:n.javascriptEnabled,removeContainer:n.removeContainer,allowTaint:n.allowTaint,imageTimeout:n.imageTimeout/2})}).then(function(e){return i.image=e})}i.prototype.proxyLoad=function(e,t,n){var i=this.src;return a(i.src,e,i.ownerDocument,t.width,t.height,n)};e.exports=i},{"./core":4,"./proxy":16,"./utils":26}],9:[function(e,t,n){function i(e){this.src=e.value;this.colorStops=[];this.type=null;this.x0=.5;this.y0=.5;this.x1=.5;this.y1=.5;this.promise=Promise.resolve(true)}i.TYPES={LINEAR:1,RADIAL:2};i.REGEXP_COLORSTOP=/^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;t.exports=i},{}],10:[function(e,t,n){function i(n,i){this.src=n;this.image=new Image;var a=this;this.tainted=null;this.promise=new Promise(function(e,t){a.image.onload=e;a.image.onerror=t;if(i){a.image.crossOrigin="anonymous"}a.image.src=n;if(a.image.complete===true){e(a.image)}})}t.exports=i},{}],11:[function(e,t,n){var r=e("./log");var i=e("./imagecontainer");var a=e("./dummyimagecontainer");var o=e("./proxyimagecontainer");var s=e("./framecontainer");var l=e("./svgcontainer");var u=e("./svgnodecontainer");var h=e("./lineargradientcontainer");var c=e("./webkitgradientcontainer");var f=e("./utils").bind;function d(e,t){this.link=null;this.options=e;this.support=t;this.origin=this.getOrigin(window.location.href)}d.prototype.findImages=function(e){var t=[];e.reduce(function(e,t){switch(t.node.nodeName){case"IMG":return e.concat([{args:[t.node.src],method:"url"}]);case"svg":case"IFRAME":return e.concat([{args:[t.node],method:t.node.nodeName}])}return e},[]).forEach(this.addImage(t,this.loadImage),this);return t};d.prototype.findBackgroundImage=function(e,t){t.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(e,this.loadImage),this);return e};d.prototype.addImage=function(n,i){return function(t){t.args.forEach(function(e){if(!this.imageExists(n,e)){n.splice(0,0,i.call(this,t));r("Added image #"+n.length,typeof e==="string"?e.substring(0,100):e)}},this)}};d.prototype.hasImageBackground=function(e){return e.method!=="none"};d.prototype.loadImage=function(e){if(e.method==="url"){var t=e.args[0];if(this.isSVG(t)&&!this.support.svg&&!this.options.allowTaint){return new l(t)}else if(t.match(/data:image\/.*;base64,/i)){return new i(t.replace(/url\(['"]{0,}|['"]{0,}\)$/gi,""),false)}else if(this.isSameOrigin(t)||this.options.allowTaint===true||this.isSVG(t)){return new i(t,false)}else if(this.support.cors&&!this.options.allowTaint&&this.options.useCORS){return new i(t,true)}else if(this.options.proxy){return new o(t,this.options.proxy)}else{return new a(t)}}else if(e.method==="linear-gradient"){return new h(e)}else if(e.method==="gradient"){return new c(e)}else if(e.method==="svg"){return new u(e.args[0],this.support.svg)}else if(e.method==="IFRAME"){return new s(e.args[0],this.isSameOrigin(e.args[0].src),this.options)}else{return new a(e)}};d.prototype.isSVG=function(e){return e.substring(e.length-3).toLowerCase()==="svg"||l.prototype.isInline(e)};d.prototype.imageExists=function(e,t){return e.some(function(e){return e.src===t})};d.prototype.isSameOrigin=function(e){return this.getOrigin(e)===this.origin};d.prototype.getOrigin=function(e){var t=this.link||(this.link=document.createElement("a"));t.href=e;t.href=t.href;return t.protocol+t.hostname+t.port};d.prototype.getPromise=function(t){return this.timeout(t,this.options.imageTimeout)["catch"](function(){var e=new a(t.src);return e.promise.then(function(e){t.image=e})})};d.prototype.get=function(t){var n=null;return this.images.some(function(e){return(n=e).src===t})?n:null};d.prototype.fetch=function(e){this.images=e.reduce(f(this.findBackgroundImage,this),this.findImages(e));this.images.forEach(function(t,n){t.promise.then(function(){r("Succesfully loaded image #"+(n+1),t)},function(e){r("Failed loading image #"+(n+1),t,e)})});this.ready=Promise.all(this.images.map(this.getPromise,this));r("Finished searching images");return this};d.prototype.timeout=function(n,i){var a;var e=Promise.race([n.promise,new Promise(function(e,t){a=setTimeout(function(){r("Timed out loading image",n);t(n)},i)})]).then(function(e){clearTimeout(a);return e});e["catch"](function(){clearTimeout(a)});return e};t.exports=d},{"./dummyimagecontainer":5,"./framecontainer":8,"./imagecontainer":10,"./lineargradientcontainer":12,"./log":13,"./proxyimagecontainer":17,"./svgcontainer":23,"./svgnodecontainer":24,"./utils":26,"./webkitgradientcontainer":27}],12:[function(e,t,n){var a=e("./gradientcontainer");var r=e("./color");function i(e){a.apply(this,arguments);this.type=a.TYPES.LINEAR;var t=i.REGEXP_DIRECTION.test(e.args[0])||!a.REGEXP_COLORSTOP.test(e.args[0]);if(t){e.args[0].split(/\s+/).reverse().forEach(function(e,t){switch(e){case"left":this.x0=0;this.x1=1;break;case"top":this.y0=0;this.y1=1;break;case"right":this.x0=1;this.x1=0;break;case"bottom":this.y0=1;this.y1=0;break;case"to":var n=this.y0;var i=this.x0;this.y0=this.y1;this.x0=this.x1;this.x1=i;this.y1=n;break;case"center":break;default:var a=parseFloat(e,10)*.01;if(isNaN(a)){break}if(t===0){this.y0=a;this.y1=1-this.y0}else{this.x0=a;this.x1=1-this.x0}break}},this)}else{this.y0=0;this.y1=1}this.colorStops=e.args.slice(t?1:0).map(function(e){var t=e.match(a.REGEXP_COLORSTOP);var n=+t[2];var i=n===0?"%":t[3];return{color:new r(t[1]),stop:i==="%"?n/100:null}});if(this.colorStops[0].stop===null){this.colorStops[0].stop=0}if(this.colorStops[this.colorStops.length-1].stop===null){this.colorStops[this.colorStops.length-1].stop=1}this.colorStops.forEach(function(n,i){if(n.stop===null){this.colorStops.slice(i).some(function(e,t){if(e.stop!==null){n.stop=(e.stop-this.colorStops[i-1].stop)/(t+1)+this.colorStops[i-1].stop;return true}else{return false}},this)}},this)}i.prototype=Object.create(a.prototype);i.REGEXP_DIRECTION=/^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;t.exports=i},{"./color":3,"./gradientcontainer":9}],13:[function(e,t,n){var i=function e(){if(e.options.logging&&window.console&&window.console.log){Function.prototype.bind.call(window.console.log,window.console).apply(window.console,[Date.now()-e.options.start+"ms","html2canvas:"].concat([].slice.call(arguments,0)))}};i.options={logging:false};t.exports=i},{}],14:[function(e,t,n){var r=e("./color");var i=e("./utils");var a=i.getBounds;var o=i.parseBackgrounds;var s=i.offsetBounds;function l(e,t){this.node=e;this.parent=t;this.stack=null;this.bounds=null;this.borders=null;this.clip=[];this.backgroundClip=[];this.offsetBounds=null;this.visible=null;this.computedStyles=null;this.colors={};this.styles={};this.backgroundImages=null;this.transformData=null;this.transformMatrix=null;this.isPseudoElement=false;this.opacity=null}l.prototype.cloneTo=function(e){e.visible=this.visible;e.borders=this.borders;e.bounds=this.bounds;e.clip=this.clip;e.backgroundClip=this.backgroundClip;e.computedStyles=this.computedStyles;e.styles=this.styles;e.backgroundImages=this.backgroundImages;e.opacity=this.opacity};l.prototype.getOpacity=function(){return this.opacity===null?this.opacity=this.cssFloat("opacity"):this.opacity};l.prototype.assignStack=function(e){this.stack=e;e.children.push(this)};l.prototype.isElementVisible=function(){return this.node.nodeType===Node.TEXT_NODE?this.parent.visible:this.css("display")!=="none"&&this.css("visibility")!=="hidden"&&!this.node.hasAttribute("data-html2canvas-ignore")&&(this.node.nodeName!=="INPUT"||this.node.getAttribute("type")!=="hidden")};l.prototype.css=function(e){if(!this.computedStyles){this.computedStyles=this.isPseudoElement?this.parent.computedStyle(this.before?":before":":after"):this.computedStyle(null)}return this.styles[e]||(this.styles[e]=this.computedStyles[e])};l.prototype.prefixedCss=function(t){var e=["webkit","moz","ms","o"];var n=this.css(t);if(n===undefined){e.some(function(e){n=this.css(e+t.substr(0,1).toUpperCase()+t.substr(1));return n!==undefined},this)}return n===undefined?null:n};l.prototype.computedStyle=function(e){return this.node.ownerDocument.defaultView.getComputedStyle(this.node,e)};l.prototype.cssInt=function(e){var t=parseInt(this.css(e),10);return isNaN(t)?0:t};l.prototype.color=function(e){return this.colors[e]||(this.colors[e]=new r(this.css(e)))};l.prototype.cssFloat=function(e){var t=parseFloat(this.css(e));return isNaN(t)?0:t};l.prototype.fontWeight=function(){var e=this.css("fontWeight");switch(parseInt(e,10)){case 401:e="bold";break;case 400:e="normal";break}return e};l.prototype.parseClip=function(){var e=this.css("clip").match(this.CLIP);if(e){return{top:parseInt(e[1],10),right:parseInt(e[2],10),bottom:parseInt(e[3],10),left:parseInt(e[4],10)}}return null};l.prototype.parseBackgroundImages=function(){return this.backgroundImages||(this.backgroundImages=o(this.css("backgroundImage")))};l.prototype.cssList=function(e,t){var n=(this.css(e)||"").split(",");n=n[t||0]||n[0]||"auto";n=n.trim().split(" ");if(n.length===1){n=[n[0],c(n[0])?"auto":n[0]]}return n};l.prototype.parseBackgroundSize=function(e,t,n){var i=this.cssList("backgroundSize",n);var a,r;if(c(i[0])){a=e.width*parseFloat(i[0])/100}else if(/contain|cover/.test(i[0])){var o=e.width/e.height,s=t.width/t.height;return o0){this.renderIndex=0;this.asyncRenderer(this.renderQueue,e)}else{e()}},this))},this))}a.prototype.calculateOverflowClips=function(){this.nodes.forEach(function(e){if(H(e)){if(V(e)){e.appendToDOM()}e.borders=this.parseBorders(e);var t=e.css("overflow")==="hidden"?[e.borders.clip]:[];var n=e.parseClip();if(n&&["absolute","fixed"].indexOf(e.css("position"))!==-1){t.push([["rect",e.bounds.left+n.left,e.bounds.top+n.top,n.right-n.left,n.bottom-n.top]])}e.clip=r(e)?e.parent.clip.concat(t):t;e.backgroundClip=e.css("overflow")!=="hidden"?e.clip.concat([e.borders.clip]):e.clip;if(V(e)){e.cleanDOM()}}else if(U(e)){e.clip=r(e)?e.parent.clip:[]}if(!V(e)){e.bounds=null}},this)};function r(e){return e.parent&&e.parent.clip.length}a.prototype.asyncRenderer=function(e,t,n){n=n||Date.now();this.paint(e[this.renderIndex++]);if(e.length===this.renderIndex){t()}else if(n+20>Date.now()){this.asyncRenderer(e,t,n)}else{setTimeout(p(function(){this.asyncRenderer(e,t)},this),0)}};a.prototype.createPseudoHideStyles=function(e){this.createStyles(e,"."+c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+':before { content: "" !important; display: none !important; }'+"."+c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER+':after { content: "" !important; display: none !important; }')};a.prototype.disableAnimations=function(e){this.createStyles(e,"* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; "+"-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}")};a.prototype.createStyles=function(e,t){var n=e.createElement("style");n.innerHTML=t;e.body.appendChild(n)};a.prototype.getPseudoElements=function(e){var t=[[e]];if(e.node.nodeType===Node.ELEMENT_NODE){var n=this.getPseudoElement(e,":before");var i=this.getPseudoElement(e,":after");if(n){t.push(n)}if(i){t.push(i)}}return X(t)};function y(e){return e.replace(/(\-[a-z])/g,function(e){return e.toUpperCase().replace("-","")})}a.prototype.getPseudoElement=function(e,t){var n=e.computedStyle(t);if(!n||!n.content||n.content==="none"||n.content==="-moz-alt-content"||n.display==="none"){return null}var i=$(n.content);var a=i.substr(0,3)==="url";var r=document.createElement(a?"img":"html2canvaspseudoelement");var o=new c(r,e,t);for(var s=n.length-1;s>=0;s--){var l=y(n.item(s));r.style[l]=n[l]}r.className=c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+" "+c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;if(a){r.src=v(i)[0].args[0];return[o]}else{var u=document.createTextNode(i);r.appendChild(u);return[o,new h(u,o)]}};a.prototype.getChildren=function(n){return X([].filter.call(n.node.childNodes,O).map(function(e){var t=[e.nodeType===Node.TEXT_NODE?new h(e,n):new u(e,n)].filter(Y);return e.nodeType===Node.ELEMENT_NODE&&t.length&&e.tagName!=="TEXTAREA"?t[0].isElementVisible()?t.concat(this.getChildren(t[0])):[]:t},this))};a.prototype.newStackingContext=function(e,t){var n=new g(t,e.getOpacity(),e.node,e.parent);e.cloneTo(n);var i=t?n.getParentStack(this):n.parent.stack;i.contexts.push(n);e.stack=n};a.prototype.createStackingContexts=function(){this.nodes.forEach(function(e){if(H(e)&&(this.isRootElement(e)||W(e)||z(e)||this.isBodyWithTransparentRoot(e)||e.hasTransform())){this.newStackingContext(e,true)}else if(H(e)&&(F(e)&&M(e)||I(e)||L(e))){this.newStackingContext(e,false)}else{e.assignStack(e.parent.stack)}},this)};a.prototype.isBodyWithTransparentRoot=function(e){return e.node.nodeName==="BODY"&&e.parent.color("backgroundColor").isTransparent()};a.prototype.isRootElement=function(e){return e.parent===null};a.prototype.sortStackingContexts=function(e){e.contexts.sort(G(e.contexts.slice(0)));e.contexts.forEach(this.sortStackingContexts,this)};a.prototype.parseTextBounds=function(o){return function(e,t,n){if(o.parent.css("textDecoration").substr(0,4)!=="none"||e.trim().length!==0){if(this.support.rangeBounds&&!o.parent.hasTransform()){var i=n.slice(0,t).join("").length;return this.getRangeBounds(o.node,i,e.length)}else if(o.node&&typeof o.node.data==="string"){var a=o.node.splitText(e.length);var r=this.getWrapperBounds(o.node,o.parent.hasTransform());o.node=a;return r}}else if(!this.support.rangeBounds||o.parent.hasTransform()){o.node=o.node.splitText(e.length)}return{}}};a.prototype.getWrapperBounds=function(e,t){var n=e.ownerDocument.createElement("html2canvaswrapper");var i=e.parentNode,a=e.cloneNode(true);n.appendChild(e.cloneNode(true));i.replaceChild(n,e);var r=t?m(n):o(n);i.replaceChild(a,n);return r};a.prototype.getRangeBounds=function(e,t,n){var i=this.range||(this.range=e.ownerDocument.createRange());i.setStart(e,t);i.setEnd(e,t+n);return i.getBoundingClientRect()};function _(){}a.prototype.parse=function(e){var t=e.contexts.filter(A);var n=e.children.filter(H);var i=n.filter(j(L));var a=i.filter(j(F)).filter(j(T));var r=n.filter(j(F)).filter(L);var o=i.filter(j(F)).filter(T);var s=e.contexts.concat(i.filter(F)).filter(M);var l=e.children.filter(U).filter(N);var u=e.contexts.filter(R);t.concat(a).concat(r).concat(o).concat(s).concat(l).concat(u).forEach(function(e){this.renderQueue.push(e);if(B(e)){this.parse(e);this.renderQueue.push(new _)}},this)};a.prototype.paint=function(e){try{if(e instanceof _){this.renderer.ctx.restore()}else if(U(e)){if(V(e.parent)){e.parent.appendToDOM()}this.paintText(e);if(V(e.parent)){e.parent.cleanDOM()}}else{this.paintNode(e)}}catch(e){s(e);if(this.options.strict){throw e}}};a.prototype.paintNode=function(e){if(B(e)){this.renderer.setOpacity(e.opacity);this.renderer.ctx.save();if(e.hasTransform()){this.renderer.setTransform(e.parseTransform())}}if(e.node.nodeName==="INPUT"&&e.node.type==="checkbox"){this.paintCheckbox(e)}else if(e.node.nodeName==="INPUT"&&e.node.type==="radio"){this.paintRadio(e)}else{this.paintElement(e)}};a.prototype.paintElement=function(n){var i=n.parseBounds();this.renderer.clip(n.backgroundClip,function(){this.renderer.renderBackground(n,i,n.borders.borders.map(q))},this);this.renderer.clip(n.clip,function(){this.renderer.renderBorders(n.borders.borders)},this);this.renderer.clip(n.backgroundClip,function(){switch(n.node.nodeName){case"svg":case"IFRAME":var e=this.images.get(n.node);if(e){this.renderer.renderImage(n,i,n.borders,e)}else{s("Error loading <"+n.node.nodeName+">",n.node)}break;case"IMG":var t=this.images.get(n.node.src);if(t){this.renderer.renderImage(n,i,n.borders,t)}else{s("Error loading ",n.node.src)}break;case"CANVAS":this.renderer.renderImage(n,i,n.borders,{image:n.node});break;case"SELECT":case"INPUT":case"TEXTAREA":this.paintFormValue(n);break}},this)};a.prototype.paintCheckbox=function(e){var t=e.parseBounds();var n=Math.min(t.width,t.height);var i={width:n-1,height:n-1,top:t.top,left:t.left};var a=[3,3];var r=[a,a,a,a];var o=[1,1,1,1].map(function(e){return{color:new d("#A5A5A5"),width:e}});var s=k(i,r,o);this.renderer.clip(e.backgroundClip,function(){this.renderer.rectangle(i.left+1,i.top+1,i.width-2,i.height-2,new d("#DEDEDE"));this.renderer.renderBorders(w(o,i,s,r));if(e.node.checked){this.renderer.font(new d("#424242"),"normal","normal","bold",n-3+"px","arial");this.renderer.text("✔",i.left+n/6,i.top+n-1)}},this)};a.prototype.paintRadio=function(e){var t=e.parseBounds();var n=Math.min(t.width,t.height)-2;this.renderer.clip(e.backgroundClip,function(){this.renderer.circleStroke(t.left+1,t.top+1,n,new d("#DEDEDE"),1,new d("#A5A5A5"));if(e.node.checked){this.renderer.circle(Math.ceil(t.left+n/4)+1,Math.ceil(t.top+n/4)+1,Math.floor(n/2),new d("#424242"))}},this)};a.prototype.paintFormValue=function(t){var e=t.getValue();if(e.length>0){var n=t.node.ownerDocument;var i=n.createElement("html2canvaswrapper");var a=["lineHeight","textAlign","fontFamily","fontWeight","fontSize","color","paddingLeft","paddingTop","paddingRight","paddingBottom","width","height","borderLeftStyle","borderTopStyle","borderLeftWidth","borderTopWidth","boxSizing","whiteSpace","wordWrap"];a.forEach(function(e){try{i.style[e]=t.css(e)}catch(e){s("html2canvas: Parse: Exception caught in renderFormValue: "+e.message)}});var r=t.parseBounds();i.style.position="fixed";i.style.left=r.left+"px";i.style.top=r.top+"px";i.textContent=e;n.body.appendChild(i);this.paintText(new h(i.firstChild,t));n.body.removeChild(i)}};a.prototype.paintText=function(n){n.applyTextTransform();var e=l.ucs2.decode(n.node.data);var i=(!this.options.letterRendering||D(n))&&!Q(n.node.data)?Z(e):e.map(function(e){return l.ucs2.encode([e])});var t=n.parent.fontWeight();var a=n.parent.css("fontSize");var r=n.parent.css("fontFamily");var o=n.parent.parseTextShadows();this.renderer.font(n.parent.color("color"),n.parent.css("fontStyle"),n.parent.css("fontVariant"),t,a,r);if(o.length){this.renderer.fontShadow(o[0].color,o[0].offsetX,o[0].offsetY,o[0].blur)}else{this.renderer.clearShadow()}this.renderer.clip(n.parent.clip,function(){i.map(this.parseTextBounds(n),this).forEach(function(e,t){if(e){this.renderer.text(i[t],e.left,e.bottom);this.renderTextDecoration(n.parent,e,this.fontMetrics.getMetrics(r,a))}},this)},this)};a.prototype.renderTextDecoration=function(e,t,n){switch(e.css("textDecoration").split(" ")[0]){case"underline":this.renderer.rectangle(t.left,Math.round(t.top+n.baseline+n.lineWidth),t.width,1,e.color("color"));break;case"overline":this.renderer.rectangle(t.left,Math.round(t.top),t.width,1,e.color("color"));break;case"line-through":this.renderer.rectangle(t.left,Math.ceil(t.top+n.middle+n.lineWidth),t.width,1,e.color("color"));break}};var b={inset:[["darken",.6],["darken",.1],["darken",.1],["darken",.6]]};a.prototype.parseBorders=function(r){var e=r.parseBounds();var t=P(r);var n=["Top","Right","Bottom","Left"].map(function(e,t){var n=r.css("border"+e+"Style");var i=r.color("border"+e+"Color");if(n==="inset"&&i.isBlack()){i=new d([255,255,255,i.a])}var a=b[n]?b[n][t]:null;return{width:r.cssInt("border"+e+"Width"),color:a?i[a[0]](a[1]):i,args:null}});var i=k(e,t,n);return{clip:this.parseBackgroundClip(r,i,n,t,e),borders:w(n,e,i,t)}};function w(o,s,l,u){return o.map(function(e,t){if(e.width>0){var n=s.left;var i=s.top;var a=s.width;var r=s.height-o[2].width;switch(t){case 0:r=o[0].width;e.args=C({c1:[n,i],c2:[n+a,i],c3:[n+a-o[1].width,i+r],c4:[n+o[3].width,i+r]},u[0],u[1],l.topLeftOuter,l.topLeftInner,l.topRightOuter,l.topRightInner);break;case 1:n=s.left+s.width-o[1].width;a=o[1].width;e.args=C({c1:[n+a,i],c2:[n+a,i+r+o[2].width],c3:[n,i+r],c4:[n,i+o[0].width]},u[1],u[2],l.topRightOuter,l.topRightInner,l.bottomRightOuter,l.bottomRightInner);break;case 2:i=i+s.height-o[2].width;r=o[2].width;e.args=C({c1:[n+a,i+r],c2:[n,i+r],c3:[n+o[3].width,i],c4:[n+a-o[3].width,i]},u[2],u[3],l.bottomRightOuter,l.bottomRightInner,l.bottomLeftOuter,l.bottomLeftInner);break;case 3:a=o[3].width;e.args=C({c1:[n,i+r+o[2].width],c2:[n,i],c3:[n+a,i+o[0].width],c4:[n+a,i+r]},u[3],u[0],l.bottomLeftOuter,l.bottomLeftInner,l.topLeftOuter,l.topLeftInner);break}}return e})}a.prototype.parseBackgroundClip=function(e,t,n,i,a){var r=e.css("backgroundClip"),o=[];switch(r){case"content-box":case"padding-box":E(o,i[0],i[1],t.topLeftInner,t.topRightInner,a.left+n[3].width,a.top+n[0].width);E(o,i[1],i[2],t.topRightInner,t.bottomRightInner,a.left+a.width-n[1].width,a.top+n[0].width);E(o,i[2],i[3],t.bottomRightInner,t.bottomLeftInner,a.left+a.width-n[1].width,a.top+a.height-n[2].width);E(o,i[3],i[0],t.bottomLeftInner,t.topLeftInner,a.left+n[3].width,a.top+a.height-n[2].width);break;default:E(o,i[0],i[1],t.topLeftOuter,t.topRightOuter,a.left,a.top);E(o,i[1],i[2],t.topRightOuter,t.bottomRightOuter,a.left+a.width,a.top);E(o,i[2],i[3],t.bottomRightOuter,t.bottomLeftOuter,a.left+a.width,a.top+a.height);E(o,i[3],i[0],t.bottomLeftOuter,t.topLeftOuter,a.left,a.top+a.height);break}return o};function x(e,t,n,i){var a=4*((Math.sqrt(2)-1)/3);var r=n*a,o=i*a,s=e+n,l=t+i;return{topLeft:S({x:e,y:l},{x:e,y:l-o},{x:s-r,y:t},{x:s,y:t}),topRight:S({x:e,y:t},{x:e+r,y:t},{x:s,y:l-o},{x:s,y:l}),bottomRight:S({x:s,y:t},{x:s,y:t+o},{x:e+r,y:l},{x:e,y:l}),bottomLeft:S({x:s,y:l},{x:s-r,y:l},{x:e,y:t+o},{x:e,y:t})}}function k(e,t,n){var i=e.left,a=e.top,r=e.width,o=e.height,s=t[0][0]r+n[3].width?0:u-n[3].width,h-n[0].width).topRight.subdivide(.5),bottomRightOuter:x(i+m,a+v,c,f).bottomRight.subdivide(.5),bottomRightInner:x(i+Math.min(m,r-n[3].width),a+Math.min(v,o+n[0].width),Math.max(0,c-n[1].width),f-n[2].width).bottomRight.subdivide(.5),bottomLeftOuter:x(i,a+y,d,g).bottomLeft.subdivide(.5),bottomLeftInner:x(i+n[3].width,a+y,Math.max(0,d-n[3].width),g-n[2].width).bottomLeft.subdivide(.5)}}function S(l,u,h,c){var f=function e(t,n,i){return{x:t.x+(n.x-t.x)*i,y:t.y+(n.y-t.y)*i}};return{start:l,startControl:u,endControl:h,end:c,subdivide:function e(t){var n=f(l,u,t),i=f(u,h,t),a=f(h,c,t),r=f(n,i,t),o=f(i,a,t),s=f(r,o,t);return[S(l,n,r,s),S(s,o,a,c)]},curveTo:function e(t){t.push(["bezierCurve",u.x,u.y,h.x,h.y,c.x,c.y])},curveToReversed:function e(t){t.push(["bezierCurve",h.x,h.y,u.x,u.y,l.x,l.y])}}}function C(e,t,n,i,a,r,o){var s=[];if(t[0]>0||t[1]>0){s.push(["line",i[1].start.x,i[1].start.y]);i[1].curveTo(s)}else{s.push(["line",e.c1[0],e.c1[1]])}if(n[0]>0||n[1]>0){s.push(["line",r[0].start.x,r[0].start.y]);r[0].curveTo(s);s.push(["line",o[0].end.x,o[0].end.y]);o[0].curveToReversed(s)}else{s.push(["line",e.c2[0],e.c2[1]]);s.push(["line",e.c3[0],e.c3[1]])}if(t[0]>0||t[1]>0){s.push(["line",a[1].end.x,a[1].end.y]);a[1].curveToReversed(s)}else{s.push(["line",e.c4[0],e.c4[1]])}return s}function E(e,t,n,i,a,r,o){if(t[0]>0||t[1]>0){e.push(["line",i[0].start.x,i[0].start.y]);i[0].curveTo(e);i[1].curveTo(e)}else{e.push(["line",r,o])}if(n[0]>0||n[1]>0){e.push(["line",a[0].start.x,a[0].start.y])}}function A(e){return e.cssInt("zIndex")<0}function R(e){return e.cssInt("zIndex")>0}function M(e){return e.cssInt("zIndex")===0}function T(e){return["inline","inline-block","inline-table"].indexOf(e.css("display"))!==-1}function B(e){return e instanceof g}function N(e){return e.node.data.trim().length>0}function D(e){return/^(normal|none|0px)$/.test(e.parent.css("letterSpacing"))}function P(i){return["TopLeft","TopRight","BottomRight","BottomLeft"].map(function(e){var t=i.css("border"+e+"Radius");var n=t.split(" ");if(n.length<=1){n[1]=n[0]}return n.map(K)})}function O(e){return e.nodeType===Node.TEXT_NODE||e.nodeType===Node.ELEMENT_NODE}function z(e){var t=e.css("position");var n=["absolute","relative","fixed"].indexOf(t)!==-1?e.css("zIndex"):"auto";return n!=="auto"}function F(e){return e.css("position")!=="static"}function L(e){return e.css("float")!=="none"}function I(e){return["inline-block","inline-table"].indexOf(e.css("display"))!==-1}function j(e){var t=this;return function(){return!e.apply(t,arguments)}}function H(e){return e.node.nodeType===Node.ELEMENT_NODE}function V(e){return e.isPseudoElement===true}function U(e){return e.node.nodeType===Node.TEXT_NODE}function G(n){return function(e,t){return e.cssInt("zIndex")+n.indexOf(e)/n.length-(t.cssInt("zIndex")+n.indexOf(t)/n.length)}}function W(e){return e.getOpacity()<1}function K(e){return parseInt(e,10)}function q(e){return e.width}function Y(e){return e.node.nodeType!==Node.ELEMENT_NODE||["SCRIPT","HEAD","TITLE","OBJECT","BR","OPTION"].indexOf(e.node.nodeName)===-1}function X(e){return[].concat.apply([],e)}function $(e){var t=e.substr(0,1);return t===e.substr(e.length-1)&&t.match(/'|"/)?e.substr(1,e.length-2):e}function Z(e){var t=[],n=0,i=false,a;while(e.length){if(J(e[n])===i){a=e.splice(0,n);if(a.length){t.push(l.ucs2.encode(a))}i=!i;n=0}else{n++}if(n>=e.length){a=e.splice(0,n);if(a.length){t.push(l.ucs2.encode(a))}}}return t}function J(e){return[32,13,10,9,45].indexOf(e)!==-1}function Q(e){return/[^\u0000-\u00ff]/.test(e)}t.exports=a},{"./color":3,"./fontmetrics":7,"./log":13,"./nodecontainer":14,"./pseudoelementcontainer":18,"./stackingcontext":21,"./textcontainer":25,"./utils":26,punycode:1}],16:[function(e,t,n){var o=e("./xhr");var i=e("./utils");var s=e("./log");var l=e("./clone");var u=i.decode64;function h(e,t,n){var i="withCredentials"in new XMLHttpRequest;if(!t){return Promise.reject("No proxy configured")}var a=f(i);var r=d(t,e,a);return i?o(r):c(n,r,a).then(function(e){return u(e.content)})}var a=0;function r(e,t,n){var i="crossOrigin"in new Image;var a=f(i);var r=d(t,e,a);return i?Promise.resolve(r):c(n,r,a).then(function(e){return"data:"+e.type+";base64,"+e.content})}function c(r,e,o){return new Promise(function(t,n){var i=r.createElement("script");var a=function e(){delete window.html2canvas.proxy[o];r.body.removeChild(i)};window.html2canvas.proxy[o]=function(e){a();t(e)};i.src=e;i.onerror=function(e){a();n(e)};r.body.appendChild(i)})}function f(e){return!e?"html2canvas_"+Date.now()+"_"+ ++a+"_"+Math.round(Math.random()*1e5):""}function d(e,t,n){return e+"?url="+encodeURIComponent(t)+(n.length?"&callback=html2canvas.proxy."+n:"")}function g(r){return function(t){var e=new DOMParser,n;try{n=e.parseFromString(t,"text/html")}catch(e){s("DOMParser not supported, falling back to createHTMLDocument");n=document.implementation.createHTMLDocument("");try{n.open();n.write(t);n.close()}catch(e){s("createHTMLDocument write not supported, falling back to document.body.innerHTML");n.body.innerHTML=t}}var i=n.querySelector("base");if(!i||!i.href.host){var a=n.createElement("base");a.href=r;n.head.insertBefore(a,n.head.firstChild)}return n}}function p(e,t,n,i,a,r){return new h(e,t,window.document).then(g(e)).then(function(e){return l(e,n,i,a,r,0,0)})}n.Proxy=h;n.ProxyURL=r;n.loadUrlDocument=p},{"./clone":2,"./log":13,"./utils":26,"./xhr":28}],17:[function(e,t,n){var r=e("./proxy").ProxyURL;function i(n,i){var e=document.createElement("a");e.href=n;n=e.href;this.src=n;this.image=new Image;var a=this;this.promise=new Promise(function(e,t){a.image.crossOrigin="Anonymous";a.image.onload=e;a.image.onerror=t;new r(n,i,document).then(function(e){a.image.src=e})["catch"](t)})}t.exports=i},{"./proxy":16}],18:[function(e,t,n){var i=e("./nodecontainer");function a(e,t,n){i.call(this,e,t);this.isPseudoElement=true;this.before=n===":before"}a.prototype.cloneTo=function(e){a.prototype.cloneTo.call(this,e);e.isPseudoElement=true;e.before=this.before};a.prototype=Object.create(i.prototype);a.prototype.appendToDOM=function(){if(this.before){this.parent.node.insertBefore(this.node,this.parent.node.firstChild)}else{this.parent.node.appendChild(this.node)}this.parent.node.className+=" "+this.getHideClass()};a.prototype.cleanDOM=function(){this.node.parentNode.removeChild(this.node);this.parent.node.className=this.parent.node.className.replace(this.getHideClass(),"")};a.prototype.getHideClass=function(){return this["PSEUDO_HIDE_ELEMENT_CLASS_"+(this.before?"BEFORE":"AFTER")]};a.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE="___html2canvas___pseudoelement_before";a.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER="___html2canvas___pseudoelement_after";t.exports=a},{"./nodecontainer":14}],19:[function(e,t,n){var l=e("./log");function i(e,t,n,i,a){this.width=e;this.height=t;this.images=n;this.options=i;this.document=a}i.prototype.renderImage=function(e,t,n,i){var a=e.cssInt("paddingLeft"),r=e.cssInt("paddingTop"),o=e.cssInt("paddingRight"),s=e.cssInt("paddingBottom"),l=n.borders;var u=t.width-(l[1].width+l[3].width+a+o);var h=t.height-(l[0].width+l[2].width+r+s);this.drawImage(i,0,0,i.image.width||u,i.image.height||h,t.left+a+l[3].width,t.top+r+l[0].width,u,h)};i.prototype.renderBackground=function(e,t,n){if(t.height>0&&t.width>0){this.renderBackgroundColor(e,t);this.renderBackgroundImage(e,t,n)}};i.prototype.renderBackgroundColor=function(e,t){var n=e.color("backgroundColor");if(!n.isTransparent()){this.rectangle(t.left,t.top,t.width,t.height,n)}};i.prototype.renderBorders=function(e){e.forEach(this.renderBorder,this)};i.prototype.renderBorder=function(e){if(!e.color.isTransparent()&&e.args!==null){this.drawShape(e.args,e.color)}};i.prototype.renderBackgroundImage=function(r,o,s){var e=r.parseBackgroundImages();e.reverse().forEach(function(e,t,n){switch(e.method){case"url":var i=this.images.get(e.args[0]);if(i){this.renderBackgroundRepeating(r,o,i,n.length-(t+1),s)}else{l("Error loading background-image",e.args[0])}break;case"linear-gradient":case"gradient":var a=this.images.get(e.value);if(a){this.renderBackgroundGradient(a,o,s)}else{l("Error loading background-image",e.args[0])}break;case"none":break;default:l("Unknown background-image type",e.args[0])}},this)};i.prototype.renderBackgroundRepeating=function(e,t,n,i,a){var r=e.parseBackgroundSize(t,n.image,i);var o=e.parseBackgroundPosition(t,n.image,i,r);var s=e.parseBackgroundRepeat(i);switch(s){case"repeat-x":case"repeat no-repeat":this.backgroundRepeatShape(n,o,r,t,t.left+a[3],t.top+o.top+a[0],99999,r.height,a);break;case"repeat-y":case"no-repeat repeat":this.backgroundRepeatShape(n,o,r,t,t.left+o.left+a[3],t.top+a[0],r.width,99999,a);break;case"no-repeat":this.backgroundRepeatShape(n,o,r,t,t.left+o.left+a[3],t.top+o.top+a[0],r.width,r.height,a);break;default:this.renderBackgroundRepeat(n,o,r,{top:t.top,left:t.left},a[3],a[0]);break}};t.exports=i},{"./log":13}],20:[function(e,t,n){var i=e("../renderer");var a=e("../lineargradientcontainer");var r=e("../log");function o(e,t){i.apply(this,arguments);this.canvas=this.options.canvas||this.document.createElement("canvas");if(!this.options.canvas){this.canvas.width=e;this.canvas.height=t}this.ctx=this.canvas.getContext("2d");this.taintCtx=this.document.createElement("canvas").getContext("2d");this.ctx.textBaseline="bottom";this.variables={};r("Initialized CanvasRenderer with size",e,"x",t)}o.prototype=Object.create(i.prototype);o.prototype.setFillStyle=function(e){this.ctx.fillStyle=F(e)==="object"&&!!e.isColor?e.toString():e;return this.ctx};o.prototype.rectangle=function(e,t,n,i,a){this.setFillStyle(a).fillRect(e,t,n,i)};o.prototype.circle=function(e,t,n,i){this.setFillStyle(i);this.ctx.beginPath();this.ctx.arc(e+n/2,t+n/2,n/2,0,Math.PI*2,true);this.ctx.closePath();this.ctx.fill()};o.prototype.circleStroke=function(e,t,n,i,a,r){this.circle(e,t,n,i);this.ctx.strokeStyle=r.toString();this.ctx.stroke()};o.prototype.drawShape=function(e,t){this.shape(e);this.setFillStyle(t).fill()};o.prototype.taints=function(t){if(t.tainted===null){this.taintCtx.drawImage(t.image,0,0);try{this.taintCtx.getImageData(0,0,1,1);t.tainted=false}catch(e){this.taintCtx=document.createElement("canvas").getContext("2d");t.tainted=true}}return t.tainted};o.prototype.drawImage=function(e,t,n,i,a,r,o,s,l){if(!this.taints(e)||this.options.allowTaint){this.ctx.drawImage(e.image,t,n,i,a,r,o,s,l)}};o.prototype.clip=function(e,t,n){this.ctx.save();e.filter(s).forEach(function(e){this.shape(e).clip()},this);t.call(n);this.ctx.restore()};o.prototype.shape=function(e){this.ctx.beginPath();e.forEach(function(e,t){if(e[0]==="rect"){this.ctx.rect.apply(this.ctx,e.slice(1))}else{this.ctx[t===0?"moveTo":e[0]+"To"].apply(this.ctx,e.slice(1))}},this);this.ctx.closePath();return this.ctx};o.prototype.font=function(e,t,n,i,a,r){this.setFillStyle(e).font=[t,n,i,a,r].join(" ").split(",")[0]};o.prototype.fontShadow=function(e,t,n,i){this.setVariable("shadowColor",e.toString()).setVariable("shadowOffsetY",t).setVariable("shadowOffsetX",n).setVariable("shadowBlur",i)};o.prototype.clearShadow=function(){this.setVariable("shadowColor","rgba(0,0,0,0)")};o.prototype.setOpacity=function(e){this.ctx.globalAlpha=e};o.prototype.setTransform=function(e){this.ctx.translate(e.origin[0],e.origin[1]);this.ctx.transform.apply(this.ctx,e.matrix);this.ctx.translate(-e.origin[0],-e.origin[1])};o.prototype.setVariable=function(e,t){if(this.variables[e]!==t){this.variables[e]=this.ctx[e]=t}return this};o.prototype.text=function(e,t,n){this.ctx.fillText(e,t,n)};o.prototype.backgroundRepeatShape=function(e,t,n,i,a,r,o,s,l){var u=[["line",Math.round(a),Math.round(r)],["line",Math.round(a+o),Math.round(r)],["line",Math.round(a+o),Math.round(s+r)],["line",Math.round(a),Math.round(s+r)]];this.clip([u],function(){this.renderBackgroundRepeat(e,t,n,i,l[3],l[0])},this)};o.prototype.renderBackgroundRepeat=function(e,t,n,i,a,r){var o=Math.round(i.left+t.left+a),s=Math.round(i.top+t.top+r);this.setFillStyle(this.ctx.createPattern(this.resizeImage(e,n),"repeat"));this.ctx.translate(o,s);this.ctx.fill();this.ctx.translate(-o,-s)};o.prototype.renderBackgroundGradient=function(e,t){if(e instanceof a){var n=this.ctx.createLinearGradient(t.left+t.width*e.x0,t.top+t.height*e.y0,t.left+t.width*e.x1,t.top+t.height*e.y1);e.colorStops.forEach(function(e){n.addColorStop(e.stop,e.color.toString())});this.rectangle(t.left,t.top,t.width,t.height,n)}};o.prototype.resizeImage=function(e,t){var n=e.image;if(n.width===t.width&&n.height===t.height){return n}var i,a=document.createElement("canvas");a.width=t.width;a.height=t.height;i=a.getContext("2d");i.drawImage(n,0,0,n.width,n.height,0,0,t.width,t.height);return a};function s(e){return e.length>0}t.exports=o},{"../lineargradientcontainer":12,"../log":13,"../renderer":19}],21:[function(e,t,n){var a=e("./nodecontainer");function i(e,t,n,i){a.call(this,n,i);this.ownStacking=e;this.contexts=[];this.children=[];this.opacity=(this.parent?this.parent.stack.opacity:1)*t}i.prototype=Object.create(a.prototype);i.prototype.getParentStack=function(e){var t=this.parent?this.parent.stack:null;return t?t.ownStacking?t:t.getParentStack(e):e.stack};t.exports=i},{"./nodecontainer":14}],22:[function(e,t,n){function i(e){this.rangeBounds=this.testRangeBounds(e);this.cors=this.testCORS();this.svg=this.testSVG()}i.prototype.testRangeBounds=function(e){var t,n,i,a,r=false;if(e.createRange){t=e.createRange();if(t.getBoundingClientRect){n=e.createElement("boundtest");n.style.height="123px";n.style.display="block";e.body.appendChild(n);t.selectNode(n);i=t.getBoundingClientRect();a=i.height;if(a===123){r=true}e.body.removeChild(n)}}return r};i.prototype.testCORS=function(){return typeof(new Image).crossOrigin!=="undefined"};i.prototype.testSVG=function(){var e=new Image;var t=document.createElement("canvas");var n=t.getContext("2d");e.src="data:image/svg+xml,";try{n.drawImage(e,0,0);t.toDataURL()}catch(e){return false}return true};t.exports=i},{}],23:[function(e,t,n){var i=e("./xhr");var a=e("./utils").decode64;function r(e){this.src=e;this.image=null;var n=this;this.promise=this.hasFabric().then(function(){return n.isInline(e)?Promise.resolve(n.inlineFormatting(e)):i(e)}).then(function(t){return new Promise(function(e){window.html2canvas.svg.fabric.loadSVGFromString(t,n.createCanvas.call(n,e))})})}r.prototype.hasFabric=function(){return!window.html2canvas.svg||!window.html2canvas.svg.fabric?Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")):Promise.resolve()};r.prototype.inlineFormatting=function(e){return/^data:image\/svg\+xml;base64,/.test(e)?this.decode64(this.removeContentType(e)):this.removeContentType(e)};r.prototype.removeContentType=function(e){return e.replace(/^data:image\/svg\+xml(;base64)?,/,"")};r.prototype.isInline=function(e){return/^data:image\/svg\+xml/i.test(e)};r.prototype.createCanvas=function(i){var a=this;return function(e,t){var n=new window.html2canvas.svg.fabric.StaticCanvas("c");a.image=n.lowerCanvasEl;n.setWidth(t.width).setHeight(t.height).add(window.html2canvas.svg.fabric.util.groupSVGElements(e,t)).renderAll();i(n.lowerCanvasEl)}};r.prototype.decode64=function(e){return typeof window.atob==="function"?window.atob(e):a(e)};t.exports=r},{"./utils":26,"./xhr":28}],24:[function(e,t,n){var i=e("./svgcontainer");function a(n,e){this.src=n;this.image=null;var i=this;this.promise=e?new Promise(function(e,t){i.image=new Image;i.image.onload=e;i.image.onerror=t;i.image.src="data:image/svg+xml,"+(new XMLSerializer).serializeToString(n);if(i.image.complete===true){e(i.image)}}):this.hasFabric().then(function(){return new Promise(function(e){window.html2canvas.svg.fabric.parseSVGDocument(n,i.createCanvas.call(i,e))})})}a.prototype=Object.create(i.prototype);t.exports=a},{"./svgcontainer":23}],25:[function(e,t,n){var i=e("./nodecontainer");function a(e,t){i.call(this,e,t)}a.prototype=Object.create(i.prototype);a.prototype.applyTextTransform=function(){this.node.data=this.transform(this.parent.css("textTransform"))};a.prototype.transform=function(e){var t=this.node.data;switch(e){case"lowercase":return t.toLowerCase();case"capitalize":return t.replace(/(^|\s|:|-|\(|\))([a-z])/g,r);case"uppercase":return t.toUpperCase();default:return t}};function r(e,t,n){if(e.length>0){return t+n.toUpperCase()}}t.exports=a},{"./nodecontainer":14}],26:[function(e,t,n){n.smallImage=function e(){return"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"};n.bind=function(e,t){return function(){return e.apply(t,arguments)}};n.decode64=function(e){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var n=e.length,i,a,r,o,s,l,u,h;var c="";for(i=0;i>4;u=(r&15)<<4|o>>2;h=(o&3)<<6|s;if(o===64){c+=String.fromCharCode(l)}else if(s===64||s===-1){c+=String.fromCharCode(l,u)}else{c+=String.fromCharCode(l,u,h)}}return c};n.getBounds=function(e){if(e.getBoundingClientRect){var t=e.getBoundingClientRect();var n=e.offsetWidth==null?t.width:e.offsetWidth;return{top:t.top,bottom:t.bottom||t.top+t.height,right:t.left+n,left:t.left,width:n,height:e.offsetHeight==null?t.height:e.offsetHeight}}return{}};n.offsetBounds=function(e){var t=e.offsetParent?n.offsetBounds(e.offsetParent):{top:0,left:0};return{top:e.offsetTop+t.top,bottom:e.offsetTop+e.offsetHeight+t.top,right:e.offsetLeft+t.left+e.offsetWidth,left:e.offsetLeft+t.left,width:e.offsetWidth,height:e.offsetHeight}};n.parseBackgrounds=function(e){var t=" \r\n\t",n,i,a,r,o,s=[],l=0,u=0,h,c;var f=function e(){if(n){if(i.substr(0,1)==='"'){i=i.substr(1,i.length-2)}if(i){c.push(i)}if(n.substr(0,1)==="-"&&(r=n.indexOf("-",1)+1)>0){a=n.substr(0,r);n=n.substr(r)}s.push({prefix:a,method:n.toLowerCase(),value:o,args:c,image:null})}c=[];n=a=i=o=""};c=[];n=a=i=o="";e.split("").forEach(function(e){if(l===0&&t.indexOf(e)>-1){return}switch(e){case'"':if(!h){h=e}else if(h===e){h=null}break;case"(":if(h){break}else if(l===0){l=1;o+=e;return}else{u++}break;case")":if(h){break}else if(l===1){if(u===0){l=0;o+=e;f();return}else{u--}}break;case",":if(h){break}else if(l===0){f();return}else if(l===1){if(u===0&&!n.match(/^url$/i)){c.push(i);i="";o+=e;return}}break}o+=e;if(l===0){n+=e}else{i+=e}});f();return s}},{}],27:[function(e,t,n){var i=e("./gradientcontainer");function a(e){i.apply(this,arguments);this.type=e.args[0]==="linear"?i.TYPES.LINEAR:i.TYPES.RADIAL}a.prototype=Object.create(i.prototype);t.exports=a},{"./gradientcontainer":9}],28:[function(e,t,n){function i(i){return new Promise(function(e,t){var n=new XMLHttpRequest;n.open("GET",i);n.onload=function(){if(n.status===200){e(n.responseText)}else{t(new Error(n.statusText))}};n.onerror=function(){t(new Error("Network Error"))};n.send()})}t.exports=i},{}]},{},[4])(4)})});var Cz=function e(t){this.ok=false;this.alpha=1;if(t.charAt(0)=="#"){t=t.substr(1,6)}t=t.replace(/ /g,"");t=t.toLowerCase();var h={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};t=h[t]||t;var c=[{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,example:["rgba(123, 234, 45, 0.8)","rgba(255,234,245,1.0)"],process:function e(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3]),parseFloat(t[4])]}},{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function e(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function e(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function e(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}];for(var n=0;n3){this.alpha=o[3]}this.ok=true}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"};this.toHex=function(){var e=this.r.toString(16);var t=this.g.toString(16);var n=this.b.toString(16);if(e.length==1)e="0"+e;if(t.length==1)t="0"+t;if(n.length==1)n="0"+n;return"#"+e+t+n};this.getHelpXML=function(){var e=new Array;for(var t=0;t "+s.toRGB()+" -> "+s.toHex());o.appendChild(l);o.appendChild(u);r.appendChild(o)}catch(e){}}return r}};var Ez=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];var Az=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function Rz(e,t,n,i){if(isNaN(i)||i<1)return;i|=0;var a,r,o,s,l,u,h,c,f,d,g,p,v,m,y,_,b,w,x,k,S,C,E,A;var R=i+i+1;var M=t-1;var T=n-1;var B=i+1;var N=B*(B+1)/2;var D=new Mz;var P=D;for(o=1;o>I;if(E!=0){E=255/E;e[u]=(c*L>>I)*E;e[u+1]=(f*L>>I)*E;e[u+2]=(d*L>>I)*E}else{e[u]=e[u+1]=e[u+2]=0}c-=p;f-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=h+((s=a+i+1)>I;if(E>0){E=255/E;e[s]=(c*L>>I)*E;e[s+1]=(f*L>>I)*E;e[s+2]=(d*L>>I)*E}else{e[s]=e[s+1]=e[s+2]=0}c-=p;f-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=a+((s=r+B)65535){e-=65536;var t=55296+(e>>10),n=56320+(e&1023);return String.fromCharCode(t,n)}else{return String.fromCharCode(e)}}function s(e){var t=e.slice(1,-1);if(t in i){return i[t]}else if(t.charAt(0)==="#"){return o(parseInt(t.substr(1).replace("x","0x")))}else{r.error("entity not found:"+e);return e}}function t(e){if(e>p){var t=n.substring(p,e).replace(/&#?\w+;/g,s);f&&l(p);a.characters(t,0,e-p);p=e}}function l(e,t){while(e>=h&&(t=c.exec(n))){u=t.index;h=u+t[0].length;f.lineNumber++}f.columnNumber=e-u+1}var u=0;var h=0;var c=/.*(?:\r\n?|\n)|.*$/g;var f=a.locator;var d=[{currentNSMap:e}];var g={};var p=0;while(true){try{var v=n.indexOf("<",p);if(v<0){if(!n.substr(p).match(/^\s*$/)){var m=a.doc;var y=m.createTextNode(n.substr(p));m.appendChild(y);a.currentElement=y}return}if(v>p){t(v)}switch(n.charAt(v+1)){case"/":var _=n.indexOf(">",v+3);var b=n.substring(v+2,_);var w=d.pop();if(_<0){b=n.substring(v+2).replace(/[\s<].*/,"");r.error("end tag name: "+b+" is not complete:"+w.tagName);_=v+1+b.length}else if(b.match(/\sp){p=_}else{t(Math.max(v,p)+1)}}}function Gz(e,t){t.lineNumber=e.lineNumber;t.columnNumber=e.columnNumber;return t}function Wz(e,t,n,i,a,r){var o;var s;var l=++t;var u=Pz;while(true){var h=e.charAt(l);switch(h){case"=":if(u===Oz){o=e.slice(t,l);u=Fz}else if(u===zz){u=Fz}else{throw new Error("attribute equal must after attrName")}break;case"'":case'"':if(u===Fz||u===Oz){if(u===Oz){r.warning('attribute value must after "="');o=e.slice(t,l)}t=l+1;l=e.indexOf(h,t);if(l>0){s=e.slice(t,l).replace(/&#?\w+;/g,a);n.add(o,s,t-1);u=Iz}else{throw new Error("attribute value no end '"+h+"' match")}}else if(u==Lz){s=e.slice(t,l).replace(/&#?\w+;/g,a);n.add(o,s,t);r.warning('attribute "'+o+'" missed start quot('+h+")!!");t=l+1;u=Iz}else{throw new Error('attribute value must after "="')}break;case"/":switch(u){case Pz:n.setTagName(e.slice(t,l));case Iz:case jz:case Hz:u=Hz;n.closed=true;case Lz:case Oz:case zz:break;default:throw new Error("attribute invalid close char('/')")}break;case"":r.error("unexpected end of input");if(u==Pz){n.setTagName(e.slice(t,l))}return l;case">":switch(u){case Pz:n.setTagName(e.slice(t,l));case Iz:case jz:case Hz:break;case Lz:case Oz:s=e.slice(t,l);if(s.slice(-1)==="/"){n.closed=true;s=s.slice(0,-1)}case zz:if(u===zz){s=o}if(u==Lz){r.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s.replace(/&#?\w+;/g,a),t)}else{if(i[""]!=="http://www.w3.org/1999/xhtml"||!s.match(/^(?:disabled|checked|selected)$/i)){r.warning('attribute "'+s+'" missed value!! "'+s+'" instead!!')}n.add(s,s,t)}break;case Fz:throw new Error("attribute value missed!!")}return l;case"€":h=" ";default:if(h<=" "){switch(u){case Pz:n.setTagName(e.slice(t,l));u=jz;break;case Oz:o=e.slice(t,l);u=zz;break;case Lz:var s=e.slice(t,l).replace(/&#?\w+;/g,a);r.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s,t);case Iz:u=jz;break}}else{switch(u){case zz:var c=n.tagName;if(i[""]!=="http://www.w3.org/1999/xhtml"||!o.match(/^(?:disabled|checked|selected)$/i)){r.warning('attribute "'+o+'" missed value!! "'+o+'" instead2!!')}n.add(o,o,t);t=l;u=Oz;break;case Iz:r.warning('attribute space is required"'+o+'"!!');case jz:u=Oz;t=l;break;case Fz:u=Lz;t=l;break;case Hz:throw new Error("elements closed character '/' and '>' must be connected to")}}}l++}}function Kz(e,t,n){var i=e.tagName;var a=null;var r=e.length;while(r--){var o=e[r];var s=o.qName;var l=o.value;var u=s.indexOf(":");if(u>0){var h=o.prefix=s.slice(0,u);var c=s.slice(u+1);var f=h==="xmlns"&&c}else{c=s;h=null;f=s==="xmlns"&&""}o.localName=c;if(f!==false){if(a==null){a={};Xz(n,n={})}n[f]=a[f]=l;o.uri="http://www.w3.org/2000/xmlns/";t.startPrefixMapping(f,l)}}var r=e.length;while(r--){o=e[r];var h=o.prefix;if(h){if(h==="xml"){o.uri="http://www.w3.org/XML/1998/namespace"}if(h!=="xmlns"){o.uri=n[h||""]}}}var u=i.indexOf(":");if(u>0){h=e.prefix=i.slice(0,u);c=e.localName=i.slice(u+1)}else{h=null;c=e.localName=i}var d=e.uri=n[h||""];t.startElement(d,c,i,e);if(e.closed){t.endElement(d,c,i);if(a){for(h in a){t.endPrefixMapping(h)}}}else{e.currentNSMap=n;e.localNSMap=a;return true}}function qz(e,t,n,i,a){if(/^(?:script|textarea)$/i.test(n)){var r=e.indexOf("",t);var o=e.substring(t+1,r);if(/[&<]/.test(o)){if(/^script$/i.test(n)){a.characters(o,0,o.length);return r}o=o.replace(/&#?\w+;/g,i);a.characters(o,0,o.length);return r}}return t+1}function Yz(e,t,n,i){var a=i[n];if(a==null){a=e.lastIndexOf("");if(at){n.comment(e,t+4,r-t-4);return r+3}else{i.error("Unclosed comment");return-1}}else{return-1}default:if(e.substr(t+3,6)=="CDATA["){var r=e.indexOf("]]>",t+9);n.startCDATA();n.characters(e,t+9,r-t-9);n.endCDATA();return r+3}var o=eF(e,t);var s=o.length;if(s>1&&/!doctype/i.test(o[0][0])){var l=o[1][0];var u=s>3&&/^public$/i.test(o[2][0])&&o[3][0];var h=s>4&&o[4][0];var c=o[s-1];n.startDTD(l,u&&u.replace(/^(['"])(.*?)\1$/,"$2"),h&&h.replace(/^(['"])(.*?)\1$/,"$2"));n.endDTD();return c.index+c[0].length}}return-1}function Zz(e,t,n){var i=e.indexOf("?>",t);if(i){var a=e.substring(t,i).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(a){var r=a[0].length;n.processingInstruction(a[1],a[2]);return i+2}else{return-1}}return-1}function Jz(e){}Jz.prototype={setTagName:function e(t){if(!Dz.test(t)){throw new Error("invalid tagName:"+t)}this.tagName=t},add:function e(t,n,i){if(!Dz.test(t)){throw new Error("invalid attribute:"+t)}this[this.length++]={qName:t,value:n,offset:i}},length:0,getLocalName:function e(t){return this[t].localName},getLocator:function e(t){return this[t].locator},getQName:function e(t){return this[t].qName},getURI:function e(t){return this[t].uri},getValue:function e(t){return this[t].value}};function Qz(e,t){e.__proto__=t;return e}if(!(Qz({},Qz.prototype)instanceof Qz)){Qz=function e(t,n){function i(){}i.prototype=n;i=new i;for(n in t){i[n]=t[n]}return i}}function eF(e,t){var n;var i=[];var a=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;a.lastIndex=t;a.exec(e);while(n=a.exec(e)){i.push(n);if(n[1])return i}}var tF=Vz;var nF={XMLReader:tF};function iF(e,t){for(var n in e){t[n]=e[n]}}function aF(e,t){var n=e.prototype;if(Object.create){var i=Object.create(t.prototype);n.__proto__=i}if(!(n instanceof t)){var a=function e(){};a.prototype=t.prototype;a=new a;iF(n,a);e.prototype=n=a}if(n.constructor!=e){if(typeof e!="function"){console.error("unknow Class:"+e)}n.constructor=e}}var rF="http://www.w3.org/1999/xhtml";var oF={};var sF=oF.ELEMENT_NODE=1;var lF=oF.ATTRIBUTE_NODE=2;var uF=oF.TEXT_NODE=3;var hF=oF.CDATA_SECTION_NODE=4;var cF=oF.ENTITY_REFERENCE_NODE=5;var fF=oF.ENTITY_NODE=6;var dF=oF.PROCESSING_INSTRUCTION_NODE=7;var gF=oF.COMMENT_NODE=8;var pF=oF.DOCUMENT_NODE=9;var vF=oF.DOCUMENT_TYPE_NODE=10;var mF=oF.DOCUMENT_FRAGMENT_NODE=11;var yF=oF.NOTATION_NODE=12;var _F={};var bF={};var wF=_F.INDEX_SIZE_ERR=(bF[1]="Index size error",1);var xF=_F.DOMSTRING_SIZE_ERR=(bF[2]="DOMString size error",2);var kF=_F.HIERARCHY_REQUEST_ERR=(bF[3]="Hierarchy request error",3);var SF=_F.WRONG_DOCUMENT_ERR=(bF[4]="Wrong document",4);var CF=_F.INVALID_CHARACTER_ERR=(bF[5]="Invalid character",5);var EF=_F.NO_DATA_ALLOWED_ERR=(bF[6]="No data allowed",6);var AF=_F.NO_MODIFICATION_ALLOWED_ERR=(bF[7]="No modification allowed",7);var RF=_F.NOT_FOUND_ERR=(bF[8]="Not found",8);var MF=_F.NOT_SUPPORTED_ERR=(bF[9]="Not supported",9);var TF=_F.INUSE_ATTRIBUTE_ERR=(bF[10]="Attribute in use",10);var BF=_F.INVALID_STATE_ERR=(bF[11]="Invalid state",11);var NF=_F.SYNTAX_ERR=(bF[12]="Syntax error",12);var DF=_F.INVALID_MODIFICATION_ERR=(bF[13]="Invalid modification",13);var PF=_F.NAMESPACE_ERR=(bF[14]="Invalid namespace",14);var OF=_F.INVALID_ACCESS_ERR=(bF[15]="Invalid access",15);function zF(e,t){if(t instanceof Error){var n=t}else{n=this;Error.call(this,bF[e]);this.message=bF[e];if(Error.captureStackTrace)Error.captureStackTrace(this,zF)}n.code=e;if(t)this.message=this.message+": "+t;return n}zF.prototype=Error.prototype;iF(_F,zF);function FF(){}FF.prototype={length:0,item:function e(t){return this[t]||null},toString:function e(t,n){for(var i=[],a=0;a=0){var a=t.length-1;while(i0},lookupPrefix:function e(t){var n=this;while(n){var i=n._nsMap;if(i){for(var a in i){if(i[a]==t){return a}}}n=n.nodeType==lF?n.ownerDocument:n.parentNode}return null},lookupNamespaceURI:function e(t){var n=this;while(n){var i=n._nsMap;if(i){if(t in i){return i[t]}}n=n.nodeType==lF?n.ownerDocument:n.parentNode}return null},isDefaultNamespace:function e(t){var n=this.lookupPrefix(t);return n==null}};function KF(e){return e=="<"&&"<"||e==">"&&">"||e=="&"&&"&"||e=='"'&&"""||"&#"+e.charCodeAt()+";"}iF(oF,WF);iF(oF,WF.prototype);function qF(e,t){if(t(e)){return true}if(e=e.firstChild){do{if(qF(e,t)){return true}}while(e=e.nextSibling)}}function YF(){}function XF(e,t,n){e&&e._inc++;var i=n.namespaceURI;if(i=="http://www.w3.org/2000/xmlns/"){t._nsMap[n.prefix?n.localName:""]=n.value}}function $F(e,t,n,i){e&&e._inc++;var a=n.namespaceURI;if(a=="http://www.w3.org/2000/xmlns/"){delete t._nsMap[n.prefix?n.localName:""]}}function ZF(e,t,n){if(e&&e._inc){e._inc++;var i=t.childNodes;if(n){i[i.length++]=n}else{var a=t.firstChild;var r=0;while(a){i[r++]=a;a=a.nextSibling}i.length=r}}}function JF(e,t){var n=t.previousSibling;var i=t.nextSibling;if(n){n.nextSibling=i}else{e.firstChild=i}if(i){i.previousSibling=n}else{e.lastChild=n}ZF(e.ownerDocument,e);return t}function QF(e,t,n){var i=t.parentNode;if(i){i.removeChild(t)}if(t.nodeType===mF){var a=t.firstChild;if(a==null){return t}var r=t.lastChild}else{a=r=t}var o=n?n.previousSibling:e.lastChild;a.previousSibling=o;r.nextSibling=n;if(o){o.nextSibling=a}else{e.firstChild=a}if(n==null){e.lastChild=r}else{n.previousSibling=r}do{a.parentNode=e}while(a!==r&&(a=a.nextSibling));ZF(e.ownerDocument||e,e);if(t.nodeType==mF){t.firstChild=t.lastChild=null}return t}function eL(e,t){var n=t.parentNode;if(n){var i=e.lastChild;n.removeChild(t);var i=e.lastChild}var i=e.lastChild;t.parentNode=e;t.previousSibling=i;t.nextSibling=null;if(i){i.nextSibling=t}else{e.firstChild=t}e.lastChild=t;ZF(e.ownerDocument,e,t);return t}YF.prototype={nodeName:"#document",nodeType:pF,doctype:null,documentElement:null,_inc:1,insertBefore:function e(t,n){if(t.nodeType==mF){var i=t.firstChild;while(i){var a=i.nextSibling;this.insertBefore(i,n);i=a}return t}if(this.documentElement==null&&t.nodeType==sF){this.documentElement=t}return QF(this,t,n),t.ownerDocument=this,t},removeChild:function e(t){if(this.documentElement==t){this.documentElement=null}return JF(this,t)},importNode:function e(t,n){return mL(this,t,n)},getElementById:function e(t){var n=null;qF(this.documentElement,function(e){if(e.nodeType==sF){if(e.getAttribute("id")==t){n=e;return true}}});return n},createElement:function e(t){var n=new tL;n.ownerDocument=this;n.nodeName=t;n.tagName=t;n.childNodes=new FF;var i=n.attributes=new jF;i._ownerElement=n;return n},createDocumentFragment:function e(){var t=new cL;t.ownerDocument=this;t.childNodes=new FF;return t},createTextNode:function e(t){var n=new aL;n.ownerDocument=this;n.appendData(t);return n},createComment:function e(t){var n=new rL;n.ownerDocument=this;n.appendData(t);return n},createCDATASection:function e(t){var n=new oL;n.ownerDocument=this;n.appendData(t);return n},createProcessingInstruction:function e(t,n){var i=new fL;i.ownerDocument=this;i.tagName=i.target=t;i.nodeValue=i.data=n;return i},createAttribute:function e(t){var n=new nL;n.ownerDocument=this;n.name=t;n.nodeName=t;n.localName=t;n.specified=true;return n},createEntityReference:function e(t){var n=new hL;n.ownerDocument=this;n.nodeName=t;return n},createElementNS:function e(t,n){var i=new tL;var a=n.split(":");var r=i.attributes=new jF;i.childNodes=new FF;i.ownerDocument=this;i.nodeName=n;i.tagName=n;i.namespaceURI=t;if(a.length==2){i.prefix=a[0];i.localName=a[1]}else{i.localName=n}r._ownerElement=i;return i},createAttributeNS:function e(t,n){var i=new nL;var a=n.split(":");i.ownerDocument=this;i.nodeName=n;i.name=n;i.namespaceURI=t;i.specified=true;if(a.length==2){i.prefix=a[0];i.localName=a[1]}else{i.localName=n}return i}};aF(YF,WF);function tL(){this._nsMap={}}tL.prototype={nodeType:sF,hasAttribute:function e(t){return this.getAttributeNode(t)!=null},getAttribute:function e(t){var n=this.getAttributeNode(t);return n&&n.value||""},getAttributeNode:function e(t){return this.attributes.getNamedItem(t)},setAttribute:function e(t,n){var i=this.ownerDocument.createAttribute(t);i.value=i.nodeValue=""+n;this.setAttributeNode(i)},removeAttribute:function e(t){var n=this.getAttributeNode(t);n&&this.removeAttributeNode(n)},appendChild:function e(t){if(t.nodeType===mF){return this.insertBefore(t,null)}else{return eL(this,t)}},setAttributeNode:function e(t){return this.attributes.setNamedItem(t)},setAttributeNodeNS:function e(t){return this.attributes.setNamedItemNS(t)},removeAttributeNode:function e(t){return this.attributes.removeNamedItem(t.nodeName)},removeAttributeNS:function e(t,n){var i=this.getAttributeNodeNS(t,n);i&&this.removeAttributeNode(i)},hasAttributeNS:function e(t,n){return this.getAttributeNodeNS(t,n)!=null},getAttributeNS:function e(t,n){var i=this.getAttributeNodeNS(t,n);return i&&i.value||""},setAttributeNS:function e(t,n,i){var a=this.ownerDocument.createAttributeNS(t,n);a.value=a.nodeValue=""+i;this.setAttributeNode(a)},getAttributeNodeNS:function e(t,n){return this.attributes.getNamedItemNS(t,n)},getElementsByTagName:function e(i){return new LF(this,function(t){var n=[];qF(t,function(e){if(e!==t&&e.nodeType==sF&&(i==="*"||e.tagName==i)){n.push(e)}});return n})},getElementsByTagNameNS:function e(i,a){return new LF(this,function(t){var n=[];qF(t,function(e){if(e!==t&&e.nodeType===sF&&(i==="*"||e.namespaceURI===i)&&(a==="*"||e.localName==a)){n.push(e)}});return n})}};YF.prototype.getElementsByTagName=tL.prototype.getElementsByTagName;YF.prototype.getElementsByTagNameNS=tL.prototype.getElementsByTagNameNS;aF(tL,WF);function nL(){}nL.prototype.nodeType=lF;aF(nL,WF);function iL(){}iL.prototype={data:"",substringData:function e(t,n){return this.data.substring(t,t+n)},appendData:function e(t){t=this.data+t;this.nodeValue=this.data=t;this.length=t.length},insertData:function e(t,n){this.replaceData(t,0,n)},appendChild:function e(t){throw new Error(bF[kF])},deleteData:function e(t,n){this.replaceData(t,n,"")},replaceData:function e(t,n,i){var a=this.data.substring(0,t);var r=this.data.substring(t+n);i=a+i+r;this.nodeValue=this.data=i;this.length=i.length}};aF(iL,WF);function aL(){}aL.prototype={nodeName:"#text",nodeType:uF,splitText:function e(t){var n=this.data;var i=n.substring(t);n=n.substring(0,t);this.data=this.nodeValue=n;this.length=n.length;var a=this.ownerDocument.createTextNode(i);if(this.parentNode){this.parentNode.insertBefore(a,this.nextSibling)}return a}};aF(aL,iL);function rL(){}rL.prototype={nodeName:"#comment",nodeType:gF};aF(rL,iL);function oL(){}oL.prototype={nodeName:"#cdata-section",nodeType:hF};aF(oL,iL);function sL(){}sL.prototype.nodeType=vF;aF(sL,WF);function lL(){}lL.prototype.nodeType=yF;aF(lL,WF);function uL(){}uL.prototype.nodeType=fF;aF(uL,WF);function hL(){}hL.prototype.nodeType=cF;aF(hL,WF);function cL(){}cL.prototype.nodeName="#document-fragment";cL.prototype.nodeType=mF;aF(cL,WF);function fL(){}fL.prototype.nodeType=dF;aF(fL,WF);function dL(){}dL.prototype.serializeToString=function(e,t,n){return gL.call(e,t,n)};WF.prototype.toString=gL;function gL(e,t){var n=[];var i=this.nodeType==9?this.documentElement:this;var a=i.prefix;var r=i.namespaceURI;if(r&&a==null){var a=i.lookupPrefix(r);if(a==null){var o=[{namespace:r,prefix:null}]}}vL(this,n,e,t,o);return n.join("")}function pL(e,t,n){var i=e.prefix||"";var a=e.namespaceURI;if(!i&&!a){return false}if(i==="xml"&&a==="http://www.w3.org/XML/1998/namespace"||a=="http://www.w3.org/2000/xmlns/"){return false}var r=n.length;while(r--){var o=n[r];if(o.prefix==i){return o.namespace!=a}}return true}function vL(e,t,n,i,a){if(i){e=i(e);if(e){if(typeof e=="string"){t.push(e);return}}else{return}}switch(e.nodeType){case sF:if(!a)a=[];var r=a.length;var o=e.attributes;var s=o.length;var l=e.firstChild;var u=e.tagName;n=rF===e.namespaceURI||n;t.push("<",u);for(var h=0;h");if(n&&/^script$/i.test(u)){while(l){if(l.data){t.push(l.data)}else{vL(l,t,n,i,a)}l=l.nextSibling}}else{while(l){vL(l,t,n,i,a);l=l.nextSibling}}t.push("")}else{t.push("/>")}return;case pF:case mF:var l=e.firstChild;while(l){vL(l,t,n,i,a);l=l.nextSibling}return;case lF:return t.push(" ",e.name,'="',e.value.replace(/[<&"]/g,KF),'"');case uF:return t.push(e.data.replace(/[<&]/g,KF));case hF:return t.push("");case gF:return t.push("\x3c!--",e.data,"--\x3e");case vF:var p=e.publicId;var v=e.systemId;t.push("')}else if(v&&v!="."){t.push(' SYSTEM "',v,'">')}else{var m=e.internalSubset;if(m){t.push(" [",m,"]")}t.push(">")}return;case dF:return t.push("");case cF:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function mL(e,t,n){var i;switch(t.nodeType){case sF:i=t.cloneNode(false);i.ownerDocument=e;case mF:break;case lF:n=true;break}if(!i){i=t.cloneNode(false)}i.ownerDocument=e;i.parentNode=null;if(n){var a=t.firstChild;while(a){i.appendChild(mL(e,a,n));a=a.nextSibling}}return i}function yL(e,t,n){var i=new t.constructor;for(var a in t){var r=t[a];if(F(r)!="object"){if(r!=i[a]){i[a]=r}}}if(t.childNodes){i.childNodes=new FF}i.ownerDocument=e;switch(i.nodeType){case sF:var o=t.attributes;var s=i.attributes=new jF;var l=o.length;s._ownerElement=i;for(var u=0;u",amp:"&",quot:'"',apos:"'"};if(o){a.setDocumentLocator(o)}i.errorHandler=u(r,a,o);i.domBuilder=n.domBuilder||a;if(/\/x?html?$/.test(t)){l.nbsp=" ";l.copy="©";s[""]="http://www.w3.org/1999/xhtml"}s.xml=s.xml||"http://www.w3.org/XML/1998/namespace";if(e){i.parse(e,s,l)}else{i.errorHandler.error("invalid doc source")}return a.doc};function u(i,e,a){if(!i){if(e instanceof h){return e}i=e}var r={};var o=i instanceof Function;a=a||{};function t(t){var n=i[t];if(!n&&o){n=i.length==2?function(e){i(t,e)}:i}r[t]=n&&function(e){n("[xmldom "+t+"]\t"+e+s(a))}||function(){}}t("warning");t("error");t("fatalError");return r}function h(){this.cdata=false}function c(e,t){t.lineNumber=e.lineNumber;t.columnNumber=e.columnNumber}h.prototype={startDocument:function e(){this.doc=(new i).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function e(t,n,i,a){var r=this.doc;var o=r.createElementNS(t,i||n);var s=a.length;f(this,o);this.currentElement=o;this.locator&&c(this.locator,o);for(var l=0;l=t+n||t){return new java.lang.String(e,t,n)+""}return e}}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(e){h.prototype[e]=function(){return null}});function f(e,t){if(!e.currentElement){e.doc.appendChild(t)}else{e.currentElement.appendChild(t)}}var d=nF.XMLReader;var i=t.DOMImplementation=kL.DOMImplementation;t.XMLSerializer=kL.XMLSerializer;t.DOMParser=n});var CL=SL.DOMImplementation;var EL=SL.XMLSerializer;var AL=SL.DOMParser;function RL(e,t,n){if(e==null&&t==null&&n==null){var i=document.querySelectorAll("svg");for(var a=0;a~\.\[:]+)/g;var n=/(\.[^\s\+>~\.\[:]+)/g;var i=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi;var o=/(:[\w-]+\([^\)]*\))/gi;var s=/(:[^\s\+>~\.\[:]+)/g;var l=/([^\s\+>~\.\[:]+)/g;var u=function e(t,n){var i=a.match(t);if(i==null){return}r[n]+=i.length;a=a.replace(t," ")};a=a.replace(/:not\(([^\)]*)\)/g," $1 ");a=a.replace(/{[^]*/gm," ");u(e,1);u(t,0);u(n,1);u(i,2);u(o,1);u(s,1);a=a.replace(/[\*\s\+>~]/g," ");a=a.replace(/[#\.]/g," ");u(l,2);return r.join("")}function BL(e){var N={opts:e};var u=ML();if(typeof CanvasRenderingContext2D!="undefined"){CanvasRenderingContext2D.prototype.drawSvg=function(e,t,n,i,a,r){var o={ignoreMouse:true,ignoreAnimation:true,ignoreDimensions:true,ignoreClear:true,offsetX:t,offsetY:n,scaleWidth:i,scaleHeight:a};for(var s in r){if(r.hasOwnProperty(s)){o[s]=r[s]}}RL(this.canvas,e,o)}}N.FRAMERATE=30;N.MAX_VIRTUAL_PIXELS=3e4;N.log=function(e){};if(N.opts.log==true&&typeof console!="undefined"){N.log=function(e){console.log(e)}}N.init=function(e){var t=0;N.UniqueId=function(){t++;return"canvg"+t};N.Definitions={};N.Styles={};N.StylesSpecificity={};N.Animations=[];N.Images=[];N.ctx=e;N.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(e,t){this.viewPorts.push({width:e,height:t})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};this.ComputeSize=function(e){if(e!=null&&typeof e=="number")return e;if(e=="x")return this.width();if(e=="y")return this.height();return Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};N.init();N.ImagesLoaded=function(){for(var e=0;e]*>/,"");var t=new ActiveXObject("Microsoft.XMLDOM");t.async="false";t.loadXML(e);return t}};N.Property=function(e,t){this.name=e;this.value=t};N.Property.prototype.getValue=function(){return this.value};N.Property.prototype.hasValue=function(){return this.value!=null&&this.value!=""};N.Property.prototype.numValue=function(){if(!this.hasValue())return 0;var e=parseFloat(this.value);if((this.value+"").match(/%$/)){e=e/100}return e};N.Property.prototype.valueOrDefault=function(e){if(this.hasValue())return this.value;return e};N.Property.prototype.numValueOrDefault=function(e){if(this.hasValue())return this.numValue();return e};N.Property.prototype.addOpacity=function(e){var t=this.value;if(e.value!=null&&e.value!=""&&typeof this.value=="string"){var n=new Cz(this.value);if(n.ok){t="rgba("+n.r+", "+n.g+", "+n.b+", "+e.numValue()+")"}}return new N.Property(this.name,t)};N.Property.prototype.getDefinition=function(){var e=this.value.match(/#([^\)'"]+)/);if(e){e=e[1]}if(!e){e=this.value}return N.Definitions[e]};N.Property.prototype.isUrlDefinition=function(){return this.value.indexOf("url(")==0};N.Property.prototype.getFillStyleDefinition=function(e,t){var n=this.getDefinition();if(n!=null&&n.createGradient){return n.createGradient(N.ctx,e,t)}if(n!=null&&n.createPattern){if(n.getHrefAttribute().hasValue()){var i=n.attribute("patternTransform");n=n.getHrefAttribute().getDefinition();if(i.hasValue()){n.attribute("patternTransform",true).value=i.value}}return n.createPattern(N.ctx,e)}return null};N.Property.prototype.getDPI=function(e){return 96};N.Property.prototype.getEM=function(e){var t=12;var n=new N.Property("fontSize",N.Font.Parse(N.ctx.font).fontSize);if(n.hasValue())t=n.toPixels(e);return t};N.Property.prototype.getUnits=function(){var e=this.value+"";return e.replace(/[0-9\.\-]/g,"")};N.Property.prototype.toPixels=function(e,t){if(!this.hasValue())return 0;var n=this.value+"";if(n.match(/em$/))return this.numValue()*this.getEM(e);if(n.match(/ex$/))return this.numValue()*this.getEM(e)/2;if(n.match(/px$/))return this.numValue();if(n.match(/pt$/))return this.numValue()*this.getDPI(e)*(1/72);if(n.match(/pc$/))return this.numValue()*15;if(n.match(/cm$/))return this.numValue()*this.getDPI(e)/2.54;if(n.match(/mm$/))return this.numValue()*this.getDPI(e)/25.4;if(n.match(/in$/))return this.numValue()*this.getDPI(e);if(n.match(/%$/))return this.numValue()*N.ViewPort.ComputeSize(e);var i=this.numValue();if(t&&i<1)return i*N.ViewPort.ComputeSize(e);return i};N.Property.prototype.toMilliseconds=function(){if(!this.hasValue())return 0;var e=this.value+"";if(e.match(/s$/))return this.numValue()*1e3;if(e.match(/ms$/))return this.numValue();return this.numValue()};N.Property.prototype.toRadians=function(){if(!this.hasValue())return 0;var e=this.value+"";if(e.match(/deg$/))return this.numValue()*(Math.PI/180);if(e.match(/grad$/))return this.numValue()*(Math.PI/200);if(e.match(/rad$/))return this.numValue();return this.numValue()*(Math.PI/180)};var t={baseline:"alphabetic","before-edge":"top","text-before-edge":"top",middle:"middle",central:"middle","after-edge":"bottom","text-after-edge":"bottom",ideographic:"ideographic",alphabetic:"alphabetic",hanging:"hanging",mathematical:"alphabetic"};N.Property.prototype.toTextBaseline=function(){if(!this.hasValue())return null;return t[this.value]};N.Font=new function(){this.Styles="normal|italic|oblique|inherit";this.Variants="normal|small-caps|inherit";this.Weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";this.CreateFont=function(e,t,n,i,a,r){var o=r!=null?this.Parse(r):this.CreateFont("","","","","",N.ctx.font);return{fontFamily:a||o.fontFamily,fontSize:i||o.fontSize,fontStyle:e||o.fontStyle,fontWeight:n||o.fontWeight,fontVariant:t||o.fontVariant,toString:function e(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var o=this;this.Parse=function(e){var t={};var n=N.trim(N.compressSpaces(e||"")).split(" ");var i={fontSize:false,fontStyle:false,fontWeight:false,fontVariant:false};var a="";for(var r=0;rthis.x2)this.x2=e}if(t!=null){if(isNaN(this.y1)||isNaN(this.y2)){this.y1=t;this.y2=t}if(tthis.y2)this.y2=t}};this.addX=function(e){this.addPoint(e,null)};this.addY=function(e){this.addPoint(null,e)};this.addBoundingBox=function(e){this.addPoint(e.x1,e.y1);this.addPoint(e.x2,e.y2)};this.addQuadraticCurve=function(e,t,n,i,a,r){var o=e+2/3*(n-e);var s=t+2/3*(i-t);var l=o+1/3*(a-e);var u=s+1/3*(r-t);this.addBezierCurve(e,t,o,l,s,u,a,r)};this.addBezierCurve=function(e,t,n,i,a,r,o,s){var l=[e,t],u=[n,i],h=[a,r],c=[o,s];this.addPoint(l[0],l[1]);this.addPoint(c[0],c[1]);for(var f=0;f<=1;f++){var d=function e(t){return Math.pow(1-t,3)*l[f]+3*Math.pow(1-t,2)*t*u[f]+3*(1-t)*Math.pow(t,2)*h[f]+Math.pow(t,3)*c[f]};var g=6*l[f]-12*u[f]+6*h[f];var p=-3*l[f]+9*u[f]-9*h[f]+3*c[f];var v=3*u[f]-3*l[f];if(p==0){if(g==0)continue;var m=-v/g;if(0=0;t--){this.transforms[t].unapply(e)}};this.applyToPoint=function(e){for(var t=0;ta){this.styles[i]=t[i];this.stylesSpecificity[i]=n}}}}}};if(r!=null&&r.nodeType==1){for(var e=0;e0){e.push([this.points[this.points.length-1],e[e.length-1][1]])}return e}};N.Element.polyline.prototype=new N.Element.PathElementBase;N.Element.polygon=function(e){this.base=N.Element.polyline;this.base(e);this.basePath=this.path;this.path=function(e){var t=this.basePath(e);if(e!=null){e.lineTo(this.points[0].x,this.points[0].y);e.closePath()}return t}};N.Element.polygon.prototype=new N.Element.polyline;N.Element.path=function(e){this.base=N.Element.PathElementBase;this.base(e);var t=this.attribute("d").value;t=t.replace(/,/gm," ");for(var n=0;n<2;n++){t=t.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2")}t=t.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");t=t.replace(/([0-9])([+\-])/gm,"$1 $2");for(var n=0;n<2;n++){t=t.replace(/(\.[0-9]*)(\.)/gm,"$1 $2")}t=t.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");t=N.compressSpaces(t);t=N.trim(t);this.PathParser=new function(e){this.tokens=e.split(" ");this.reset=function(){this.i=-1;this.command="";this.previousCommand="";this.start=new N.Point(0,0);this.control=new N.Point(0,0);this.current=new N.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){if(this.isEnd())return true;return this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){switch(this.command){case"m":case"l":case"h":case"v":case"c":case"s":case"q":case"t":case"a":case"z":return true}return false};this.getToken=function(){this.i++;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){var e=new N.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(e)};this.getAsControlPoint=function(){var e=this.getPoint();this.control=e;return e};this.getAsCurrentPoint=function(){var e=this.getPoint();this.current=e;return e};this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"&&this.previousCommand.toLowerCase()!="q"&&this.previousCommand.toLowerCase()!="t"){return this.current}var e=new N.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return e};this.makeAbsolute=function(e){if(this.isRelativeCommand()){e.x+=this.current.x;e.y+=this.current.y}return e};this.addMarker=function(e,t,n){if(n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null){this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)}this.addMarkerAngle(e,t==null?null:t.angleTo(e))};this.addMarkerAngle=function(e,t){this.points.push(e);this.angles.push(t)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var e=0;e1){h*=Math.sqrt(v);c*=Math.sqrt(v)}var m=(d==g?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(c,2)-Math.pow(h,2)*Math.pow(p.y,2)-Math.pow(c,2)*Math.pow(p.x,2))/(Math.pow(h,2)*Math.pow(p.y,2)+Math.pow(c,2)*Math.pow(p.x,2)));if(isNaN(m))m=0;var y=new N.Point(m*h*p.y/c,m*-c*p.x/h);var _=new N.Point((o.x+u.x)/2+Math.cos(f)*y.x-Math.sin(f)*y.y,(o.y+u.y)/2+Math.sin(f)*y.x+Math.cos(f)*y.y);var b=function e(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2))};var w=function e(t,n){return(t[0]*n[0]+t[1]*n[1])/(b(t)*b(n))};var x=function e(t,n){return(t[0]*n[1]=1)E=0;var A=1-g?1:-1;var R=k+A*(E/2);var M=new N.Point(_.x+h*Math.cos(R),_.y+c*Math.sin(R));t.addMarkerAngle(M,R-A*Math.PI/2);t.addMarkerAngle(u,R-A*Math.PI);n.addPoint(u.x,u.y);if(e!=null){var w=h>c?h:c;var T=h>c?1:h/c;var B=h>c?c/h:1;e.translate(_.x,_.y);e.rotate(f);e.scale(T,B);e.arc(0,0,w,k,k+E,1-g);e.scale(1/T,1/B);e.rotate(-f);e.translate(-_.x,-_.y)}}break;case"Z":case"z":if(e!=null)e.closePath();t.current=t.start}}return n};this.getMarkers=function(){var e=this.PathParser.getMarkerPoints();var t=this.PathParser.getMarkerAngles();var n=[];for(var i=0;i1)this.offset=1;var t=this.style("stop-color",true);if(t.value=="")t.value="#000";if(this.style("stop-opacity").hasValue())t=t.addOpacity(this.style("stop-opacity"));this.color=t.value};N.Element.stop.prototype=new N.Element.ElementBase;N.Element.AnimateBase=function(e){this.base=N.Element.ElementBase;this.base(e);N.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").toMilliseconds();this.getProperty=function(){var e=this.attribute("attributeType").value;var t=this.attribute("attributeName").value;if(e=="CSS"){return this.parent.style(t,true)}return this.parent.attribute(t,true)};this.initialValue=null;this.initialUnits="";this.removed=false;this.calcValue=function(){return""};this.update=function(e){if(this.initialValue==null){this.initialValue=this.getProperty().value;this.initialUnits=this.getProperty().getUnits()}if(this.duration>this.maxDuration){if(this.attribute("repeatCount").value=="indefinite"||this.attribute("repeatDur").value=="indefinite"){this.duration=0}else if(this.attribute("fill").valueOrDefault("remove")=="freeze"&&!this.frozen){this.frozen=true;this.parent.animationFrozen=true;this.parent.animationFrozenValue=this.getProperty().value}else if(this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed){this.removed=true;this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue;return true}return false}this.duration=this.duration+e;var t=false;if(this.beginn&&o.attribute("x").hasValue())break;a+=o.measureTextRecursive(e)}return-1*(i=="end"?a:a/2)}return 0};this.renderChild=function(e,t,n,i){var a=n.children[i];if(a.attribute("x").hasValue()){a.x=a.attribute("x").toPixels("x")+t.getAnchorDelta(e,n,i);if(a.attribute("dx").hasValue())a.x+=a.attribute("dx").toPixels("x")}else{if(a.attribute("dx").hasValue())t.x+=a.attribute("dx").toPixels("x");a.x=t.x}t.x=a.x+a.measureText(e);if(a.attribute("y").hasValue()){a.y=a.attribute("y").toPixels("y");if(a.attribute("dy").hasValue())a.y+=a.attribute("dy").toPixels("y")}else{if(a.attribute("dy").hasValue())t.y+=a.attribute("dy").toPixels("y");a.y=t.y}t.y=a.y;a.render(e);for(var i=0;i0&&t[n-1]!=" "&&n0&&t[n-1]!=" "&&(n==t.length-1||t[n+1]==" "))r="initial";if(typeof e.glyphs[i]!="undefined"){a=e.glyphs[i][r];if(a==null&&e.glyphs[i].type=="glyph")a=e.glyphs[i]}}else{a=e.glyphs[i]}if(a==null)a=e.missingGlyph;return a};this.renderChildren=function(e){var t=this.parent.style("font-family").getDefinition();if(t!=null){var n=this.parent.style("font-size").numValueOrDefault(N.Font.Parse(N.ctx.font).fontSize);var i=this.parent.style("font-style").valueOrDefault(N.Font.Parse(N.ctx.font).fontStyle);var a=this.getText();if(t.isRTL)a=a.split("").reverse().join("");var r=N.ToNumberArray(this.parent.attribute("dx").value);for(var o=0;o0){return""}return this.text}};N.Element.tspan.prototype=new N.Element.TextElementBase;N.Element.tref=function(e){this.base=N.Element.TextElementBase;this.base(e);this.getText=function(){var e=this.getHrefAttribute().getDefinition();if(e!=null)return e.children[0].getText()}};N.Element.tref.prototype=new N.Element.TextElementBase;N.Element.a=function(e){this.base=N.Element.TextElementBase;this.base(e);this.hasText=e.childNodes.length>0;for(var t=0;t0){var n=new N.Element.g;n.children=this.children;n.parent=this;n.render(e)}};this.onclick=function(){window.open(this.getHrefAttribute().value)};this.onmousemove=function(){N.ctx.canvas.style.cursor="pointer"}};N.Element.a.prototype=new N.Element.TextElementBase;N.Element.image=function(e){this.base=N.Element.RenderedElementBase;this.base(e);var t=this.getHrefAttribute().value;if(t==""){return}var r=t.match(/\.svg$/);N.Images.push(this);this.loaded=false;if(!r){this.img=document.createElement("img");if(N.opts["useCORS"]==true){this.img.crossOrigin="Anonymous"}var n=this;this.img.onload=function(){n.loaded=true};this.img.onerror=function(){N.log('ERROR: image "'+t+'" not found');n.loaded=true};this.img.src=t}else{this.img=N.ajax(t);this.loaded=true}this.renderChildren=function(e){var t=this.attribute("x").toPixels("x");var n=this.attribute("y").toPixels("y");var i=this.attribute("width").toPixels("x");var a=this.attribute("height").toPixels("y");if(i==0||a==0)return;e.save();if(r){e.drawSvg(this.img,t,n,i,a)}else{e.translate(t,n);N.AspectRatio(e,this.attribute("preserveAspectRatio").value,i,this.img.width,a,this.img.height,0,0);e.drawImage(this.img,0,0)}e.restore()};this.getBoundingBox=function(){var e=this.attribute("x").toPixels("x");var t=this.attribute("y").toPixels("y");var n=this.attribute("width").toPixels("x");var i=this.attribute("height").toPixels("y");return new N.BoundingBox(e,t,e+n,t+i)}};N.Element.image.prototype=new N.Element.RenderedElementBase;N.Element.g=function(e){this.base=N.Element.RenderedElementBase;this.base(e);this.getBoundingBox=function(){var e=new N.BoundingBox;for(var t=0;t0){var m=p[v].indexOf("url");var y=p[v].indexOf(")",m);var _=p[v].substr(m+5,y-m-6);var b=N.parseXml(N.ajax(_));var w=b.getElementsByTagName("font");for(var x=0;xe.length)t=e.length;for(var n=0,i=new Array(t);n0&&!xv(this).selectAll("image, img, svg").size()){var E=this.cloneNode(true);xv(E).selectAll("*").each(function(){xv(this).call(DL);if(xv(this).attr("opacity")==="0")this.parentNode.removeChild(this)});te.push(Object.assign({},n,{type:"svg",value:E,tag:t}))}else if(this.childNodes.length>0){var A=UL(this),R=OL(A,3),M=R[0],T=R[1],B=R[2];n.scale*=M;n.x+=T;n.y+=B;ne(this,n)}else{var N=this.cloneNode(true);xv(N).selectAll("*").each(function(){if(xv(this).attr("opacity")==="0")this.parentNode.removeChild(this)});if(t==="line"){xv(N).attr("x1",parseFloat(xv(N).attr("x1"))+n.x);xv(N).attr("x2",parseFloat(xv(N).attr("x2"))+n.x);xv(N).attr("y1",parseFloat(xv(N).attr("y1"))+n.y);xv(N).attr("y2",parseFloat(xv(N).attr("y2"))+n.y)}else if(t==="path"){var D=UL(N),P=OL(D,3),O=P[0],z=P[1],F=P[2];if(xv(N).attr("transform"))xv(N).attr("transform","scale(".concat(O,")translate(").concat(z+n.x,",").concat(F+n.y,")"))}xv(N).call(DL);var L=xv(N).attr("fill");var I=L&&L.indexOf("url")===0;te.push(Object.assign({},n,{type:"svg",value:N,tag:t}));if(I){var j=xv(L.slice(4,-1)).node().cloneNode(true);var H=(j.tagName||"").toLowerCase();if(H==="pattern"){var V=UL(N),U=OL(V,3),G=U[0],W=U[1],K=U[2];n.scale*=G;n.x+=W;n.y+=K;ne(j,n)}}}}function ne(e,t){Ev(e.childNodes).each(function(){i.bind(this)(t)})}for(var a=0;a").concat(a,"");f.save();f.translate(q.padding,q.padding);NL(c,l,Object.assign({},VL,{offsetX:t.x,offsetY:t.y}));f.restore();break;case"svg":var u=h?(new XMLSerializer).serializeToString(t.value):t.value.outerHTML;f.save();f.translate(q.padding+n.x+t.x,q.padding+n.y+t.y);f.rect(0,0,n.width,n.height);f.clip();NL(c,u,Object.assign({},VL,{offsetX:t.x+n.x,offsetY:t.y+n.y}));f.restore();break;default:console.warn("uncaught",t);break}}q.callback(c)}}(function(e){var f=e.Uint8Array,t=e.HTMLCanvasElement,n=t&&t.prototype,l=/\s*;\s*base64\s*(?:;|$)/i,u="toDataURL",d,h=function e(t){var n=t.length,i=new f(n/4*3|0),a=0,r=0,o=[0,0],s=0,l=0,u,h,c;while(n--){h=t.charCodeAt(a++);u=d[h-43];if(u!==255&&u!==c){o[1]=o[0];o[0]=h;l=l<<6|u;s++;if(s===4){i[r++]=l>>>16;if(o[1]!==61){i[r++]=l>>>8}if(o[0]!==61){i[r++]=l}s=0}}}return i};if(f){d=new f([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51])}if(t&&(!n.toBlob||!n.toBlobHD)){if(!n.toBlob)n.toBlob=function(e,t){if(!t){t="image/png"}if(this.mozGetAsFile){e(this.mozGetAsFile("canvas",t));return}if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(t)){e(this.msToBlob());return}var n=Array.prototype.slice.call(arguments,1),i=this[u].apply(this,n),a=i.indexOf(","),r=i.substring(a+1),o=l.test(i.substring(0,a)),s;if(Blob.fake){s=new Blob;if(o){s.encoding="base64"}else{s.encoding="URI"}s.data=r;s.size=r.length}else if(f){if(o){s=new Blob([h(r)],{type:t})}else{s=new Blob([decodeURIComponent(r)],{type:t})}}e(s)};if(!n.toBlobHD&&n.toDataURLHD){n.toBlobHD=function(){u="toDataURLHD";var e=this.toBlob();u="toDataURL";return e}}else{n.toBlobHD=n.toBlob}}})(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||dN.content||dN);var WL=pN(function(e){var t=t||function(h){if(typeof h==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var e=h.document,c=function e(){return h.URL||h.webkitURL||h},f=e.createElementNS("http://www.w3.org/1999/xhtml","a"),d="download"in f,g=function e(t){var n=new MouseEvent("click");t.dispatchEvent(n)},p=/constructor/i.test(h.HTMLElement)||h.safari,v=/CriOS\/[\d]+/.test(navigator.userAgent),o=function e(t){(h.setImmediate||h.setTimeout)(function(){throw t},0)},m="application/octet-stream",i=1e3*40,y=function e(t){var n=function e(){if(typeof t==="string"){c().revokeObjectURL(t)}else{t.remove()}};setTimeout(n,i)},_=function e(t,n,i){n=[].concat(n);var a=n.length;while(a--){var r=t["on"+n[a]];if(typeof r==="function"){try{r.call(t,i||t)}catch(e){o(e)}}}},b=function e(t){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)){return new Blob([String.fromCharCode(65279),t],{type:t.type})}return t},a=function e(i,t,n){if(!n){i=b(i)}var a=this,r=i.type,o=r===m,s,l=function e(){_(a,"writestart progress write writeend".split(" "))},u=function e(){if((v||o&&p)&&h.FileReader){var n=new FileReader;n.onloadend=function(){var e=v?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");var t=h.open(e,"_blank");if(!t)h.location.href=e;e=undefined;a.readyState=a.DONE;l()};n.readAsDataURL(i);a.readyState=a.INIT;return}if(!s){s=c().createObjectURL(i)}if(o){h.location.href=s}else{var t=h.open(s,"_blank");if(!t){h.location.href=s}}a.readyState=a.DONE;l();y(s)};a.readyState=a.INIT;if(d){s=c().createObjectURL(i);setTimeout(function(){f.href=s;f.download=t;g(f);l();y(s);a.readyState=a.DONE});return}u()},t=a.prototype,n=function e(t,n,i){return new a(t,n||t.name||"download",i)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=b(e)}return navigator.msSaveOrOpenBlob(e,t)}}t.abort=function(){};t.readyState=t.INIT=0;t.WRITING=1;t.DONE=2;t.error=t.onwritestart=t.onprogress=t.onwrite=t.onabort=t.onerror=t.onwriteend=null;return n}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||dN.content);if(e.exports){e.exports.saveAs=t}});var KL=WL.saveAs;var qL={filename:"download",type:"png"};function YL(e){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};if(!e)return;n=Object.assign({},qL,n);var t=new RegExp(/(MSIE|Trident\/|Edge\/)/i).test(navigator.userAgent);if(!(e instanceof Array)&&n.type==="svg"){var a=t?(new XMLSerializer).serializeToString(e):e.outerHTML;KL(new Blob([a],{type:"application/svg+xml"}),"".concat(n.filename,".svg"))}GL(e,Object.assign({},i,{callback:function e(t){if(i.callback)i.callback(t);if(["jpg","png"].includes(n.type)){t.toBlob(function(e){return KL(e,"".concat(n.filename,".").concat(n.type))})}}}))}var XL={Button:mD,Radio:MD,Select:HD};function $L(){var c=this;var f=this;var d=this._controlPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var g=["left","right","top","bottom"];var e=function e(t){var l=g[t];var u=(c._controls||[]).filter(function(e){return!e.position&&l==="bottom"||e.position===l});if(c._downloadButton&&c._downloadPosition===l){u.push({data:[{text:c._translate("Download"),value:1}],label:"downloadButton",on:{click:function e(){var t=c._detectResize;if(t)c.detectResize(false).render();YL(c._select.node(),Object.assign({title:c._title||undefined},c._downloadConfig),{callback:function e(){setTimeout(function(){if(t)c.detectResize(t).render()},5e3)}})}},type:"Button"})}var n=l==="top"||l==="bottom";var i={height:n?c._height-(c._margin.top+c._margin.bottom):c._height-(c._margin.top+c._margin.bottom+d.top+d.bottom),width:n?c._width-(c._margin.left+c._margin.right+d.left+d.right):c._width-(c._margin.left+c._margin.right)};i.x=(n?c._margin.left+d.left:c._margin.left)+(l==="right"?c._width-c._margin.bottom:0);i.y=(n?c._margin.top:c._margin.top+d.top)+(l==="bottom"?c._height-c._margin.bottom:0);var a=gb("foreignObject.d3plus-viz-controls-".concat(l),{condition:u.length,enter:Object.assign({opacity:0},i),exit:Object.assign({opacity:0},i),parent:c._select,transition:c._transition,update:{height:i.height,opacity:1,width:i.width}});var h=a.selectAll("div.d3plus-viz-controls-container").data([null]);h=h.enter().append("xhtml:div").attr("class","d3plus-viz-controls-container").merge(h);if(u.length){var r=function e(t){var n=Object.assign({},u[t]);var i={};if(n.on){var a=function e(t){if({}.hasOwnProperty.call(n.on,t)){i[t]=function(){n.on[t].bind(f)(this.value)}}};for(var r in n.on){a(r)}}var o=n.label||"".concat(l,"-").concat(t);if(!c._controlCache[o]){var s=n.type&&XL[n.type]?n.type:"Select";c._controlCache[o]=(new XL[s]).container(h.node());if(n.checked)c._controlCache[o].checked(n.checked);if(n.selected)c._controlCache[o].selected(n.selected)}delete n.checked;delete n.selected;c._controlCache[o].config(n).config({on:i}).config(c._controlConfig).render()};for(var o=0;o0&&arguments[0]!==undefined?arguments[0]:[];var t=this._legendClass.outerBounds();var n=this._legendPosition;var i=["top","bottom"].includes(n);var a=this._legendPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var r={transform:"translate(".concat(i?this._margin.left+a.left:this._margin.left,", ").concat(i?this._margin.top:this._margin.top+a.top,")")};var s=gb("g.d3plus-viz-legend",{condition:this._legend&&!this._legendConfig.select,enter:r,parent:this._select,transition:this._transition,update:r}).node();var l=[];var u=function e(t,n){var i=o._shape(t,n);var a=i==="Line"?"stroke":"fill";var r=o._shapeConfig[i]&&o._shapeConfig[i][a]?o._shapeConfig[i][a]:o._shapeConfig[a];return typeof r==="function"?r.bind(o)(t,n):r};var h=function e(t,n){var i=o._shape(t,n);var a=o._shapeConfig[i]&&o._shapeConfig[i].opacity?o._shapeConfig[i].opacity:o._shapeConfig.opacity;return typeof a==="function"?a.bind(o)(t,n):a};var c=function e(t,n){return"".concat(u(t,n),"_").concat(h(t,n))};if(this._legend){yb().key(c).rollup(function(e){return l.push(Rb(e,o._aggs))}).entries(this._colorScale?e.filter(function(e,t){return o._colorScale(e,t)===undefined}):e)}l.sort(this._legendSort);var f=l.map(function(e,t){return o._ids(e,t).slice(0,o._drawDepth+1)});this._legendDepth=0;var d=function e(t){var n=f.map(function(e){return e[t]});if(!n.some(function(e){return e instanceof Array})&&Array.from(new Set(n)).length===l.length){o._legendDepth=t;return"break"}};for(var g=0;g<=this._drawDepth;g++){var p=d(g);if(p==="break")break}var v=function e(t,n){var i=o._id(t,n);if(i instanceof Array)i=i[0];return o._hidden.includes(i)||o._solo.length&&!o._solo.includes(i)};this._legendClass.id(c).align(i?"center":n).direction(i?"row":"column").duration(this._duration).data(l.length>this._legendCutoff||this._colorScale?l:[]).height(i?this._height-(this._margin.bottom+this._margin.top):this._height-(this._margin.bottom+this._margin.top+a.bottom+a.top)).locale(this._locale).parent(this).select(s).verticalAlign(!i?"middle":n).width(i?this._width-(this._margin.left+this._margin.right+a.left+a.right):this._width-(this._margin.left+this._margin.right)).shapeConfig(Tg.bind(this)(this._shapeConfig,"legend")).shapeConfig({fill:function e(t,n){return v(t,n)?o._hiddenColor(t,n):u(t,n)},labelConfig:{fontOpacity:function e(t,n){return v(t,n)?o._hiddenOpacity(t,n):1}},opacity:h}).config(this._legendConfig).render();if(!this._legendConfig.select&&t.height){if(i)this._margin[n]+=t.height+this._legendClass.padding()*2;else this._margin[n]+=t.width+this._legendClass.padding()*2}}function QL(n){var i=this;if(!(n instanceof Array))n=[n,n];if(JSON.stringify(n)!==JSON.stringify(this._timelineSelection)){this._timelineSelection=n;n=n.map(Number);this.timeFilter(function(e){var t=IN(i._time(e)).getTime();return t>=n[0]&&t<=n[1]}).render()}}function eI(){var t=this;var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var n=this._time&&this._timeline;var i=n?Ab(this._data.map(this._time)).map(IN):[];n=n&&i.length>1;var a=this._timelinePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var r={transform:"translate(".concat(this._margin.left+a.left,", 0)")};var o=gb("g.d3plus-viz-timeline",{condition:n,enter:r,parent:this._select,transition:this._transition,update:r}).node();if(n){var s=this._timelineClass.domain(Be(i)).duration(this._duration).height(this._height-this._margin.bottom).locale(this._locale).select(o).ticks(i.sort(function(e,t){return+e-+t})).width(this._width-(this._margin.left+this._margin.right+a.left+a.right));if(s.selection()===undefined){this._timelineSelection=Be(e,this._time).map(IN);s.selection(this._timelineSelection)}var l=this._timelineConfig;s.config(l).on("end",function(e){QL.bind(t)(e);if(l.on&&l.on.end)l.on.end(e)}).render();this._margin.bottom+=s.outerBounds().height+s.padding()*2}}function tI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var t=this._title?this._title(e):false;var n=this._titlePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var a=gb("g.d3plus-viz-title",{enter:i,parent:this._select,transition:this._transition,update:i}).node();this._titleClass.data(t?[{text:t}]:[]).locale(this._locale).select(a).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._titleConfig).render();this._margin.top+=t?a.getBBox().height:0}function nI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var t=typeof this._total==="function"?O(e.map(this._total)):this._total===true&&this._size?O(e.map(this._size)):false;var n=this._totalPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var a=gb("g.d3plus-viz-total",{enter:i,parent:this._select,transition:this._transition,update:i}).node();var r=typeof t==="number";this._totalClass.data(r?[{text:this._totalFormat(t)}]:[]).locale(this._locale).select(a).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._totalConfig).render();this._margin.top+=r?a.getBBox().height+this._totalConfig.padding*2:0}function iI(e,t){if(!e)return undefined;if(e.tagName===undefined||["BODY","HTML"].indexOf(e.tagName)>=0){var n=window["inner".concat(t.charAt(0).toUpperCase()+t.slice(1))];var i=xv(e);if(t==="width"){n-=parseFloat(i.style("margin-left"),10);n-=parseFloat(i.style("margin-right"),10);n-=parseFloat(i.style("padding-left"),10);n-=parseFloat(i.style("padding-right"),10)}else{n-=parseFloat(i.style("margin-top"),10);n-=parseFloat(i.style("margin-bottom"),10);n-=parseFloat(i.style("padding-top"),10);n-=parseFloat(i.style("padding-bottom"),10)}return n}else{var a=parseFloat(xv(e).style(t),10);if(typeof a==="number"&&a>0)return a;else return iI(e.parentNode,t)}}function aI(e){return[iI(e,"width"),iI(e,"height")]}function rI(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var n=window.pageXOffset!==undefined?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var i=window.pageYOffset!==undefined?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var a=e.getBoundingClientRect();var r=a.height,o=a.left+n,s=a.top+i,l=a.width;return i+window.innerHeight>s+t&&i+to+t&&n+t=0){this._solo=[];this._hidden=[];this.render()}}else{if(r<0&&this._hidden.length").concat(s("Shift+Click to Hide"))).title(this._legendConfig.label?this._legendClass.label():ZL.bind(this)).position(a).config(Tg.bind(this)(this._tooltipConfig)).config(Tg.bind(this)(this._legendTooltip)).render()}}function fI(e,t,n){if(e&&this._tooltip(e,t)){this._select.style("cursor","pointer");var i=ov.touches?[ov.touches[0].clientX,ov.touches[0].clientY]:[ov.clientX,ov.clientY];this._tooltipClass.data([n||e]).footer(this._drawDepthe.length)t=e.length;for(var n=0,i=new Array(t);n0&&arguments[0]!==undefined?arguments[0]:false;bI=e;if(bI)this._brushGroup.style("display","inline");else this._brushGroup.style("display","none");if(!bI&&this._zoom){this._container.call(this._zoomBehavior);if(!this._zoomScroll){this._container.on("wheel.zoom",null)}if(!this._zoomPan){this._container.on("mousedown.zoom mousemove.zoom",null).on("touchstart.zoom touchmove.zoom touchend.zoom touchcancel.zoom",null)}}else{this._container.on(".zoom",null)}}function kI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;if(this._zoomGroup){if(!t)this._zoomGroup.attr("transform",e||ov.transform);else this._zoomGroup.transition().duration(t).attr("transform",e||ov.transform)}if(this._renderTiles)this._renderTiles(iN(this._container.node()),t)}function SI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;if(!this._container)return;var t=this._zoomBehavior.extent().bind(document)()[1].map(function(e){return e/2}),n=this._zoomBehavior.scaleExtent(),i=iN(this._container.node());if(!e){i.k=n[0];i.x=0;i.y=0}else{var a=[(t[0]-i.x)/i.k,(t[1]-i.y)/i.k];i.k=Math.min(n[1],i.k*e);if(i.k<=n[0]){i.k=n[0];i.x=0;i.y=0}else{i.x+=t[0]-(a[0]*i.k+i.x);i.y+=t[1]-(a[1]*i.k+i.y)}}kI.bind(this)(i,this._duration)}function CI(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this._duration;var n=this._zoomBehavior.scaleExtent(),i=iN(this._container.node());if(e){var a=gI(this._zoomBehavior.translateExtent()[1],2),r=a[0],o=a[1],s=e[1][0]-e[0][0],l=e[1][1]-e[0][1];var u=Math.min(n[1],1/Math.max(s/r,l/o));var h,c;if(s/l0)i.x=0;else if(i.x0)i.y=0;else if(i.ye.length)t=e.length;for(var n=0,i=new Array(t);n600:true}function QI(i){return i.reduce(function(e,t,n){if(!n)e+=t;else if(n===i.length-1&&n===1)e+=" and ".concat(t);else if(n===i.length-1)e+=", and ".concat(t);else e+=", ".concat(t);return e},"")}var ej=function(e){WI(n,e);var t=qI(n);function n(){var s;VI(this,n);s=t.call(this);s._aggs={};s._ariaHidden=true;s._attribution=false;s._attributionStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.25)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"400 11px/11px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",margin:"5px",opacity:.75,padding:"4px 6px 3px"};s._backClass=(new jE).on("click",function(){if(s._history.length)s.config(s._history.pop()).render();else s.depth(s._drawDepth-1).filter(false).render()}).on("mousemove",function(){return s._backClass.select().style("cursor","pointer")});s._backConfig={fontSize:10,padding:5,resize:false};s._cache=true;s._color=function(e,t){return s._groupBy[0](e,t)};s._colorScaleClass=new _P;s._colorScaleConfig={};s._colorScalePadding=JI;s._colorScalePosition="bottom";s._colorScaleMaxSize=600;var e=new HD;s._controlCache={};s._controlConfig={selectStyle:Object.assign({margin:"5px"},e.selectStyle())};s._controlPadding=JI;s._data=[];s._dataCutoff=100;s._detectResize=true;s._detectResizeDelay=400;s._detectVisible=true;s._detectVisibleInterval=1e3;s._downloadButton=false;s._downloadConfig={type:"png"};s._downloadPosition="top";s._duration=600;s._hidden=[];s._hiddenColor=Bg("#aaa");s._hiddenOpacity=Bg(.5);s._history=[];s._groupBy=[mn("id")];s._legend=true;s._legendClass=new oP;s._legendConfig={label:ZL.bind(XI(s)),shapeConfig:{ariaLabel:ZL.bind(XI(s)),labelConfig:{fontColor:undefined,fontResize:false,padding:0}}};s._legendCutoff=1;s._legendPadding=JI;s._legendPosition="bottom";s._legendSort=function(e,t){return s._drawLabel(e).localeCompare(s._drawLabel(t))};s._legendTooltip={};s._loadingHTML=function(){return"\n
        \n ".concat(s._translate("Loading Visualization"),'\n ').concat(s._translate("Powered by D3plus"),"\n
        ")};s._loadingMessage=true;s._lrucache=vN(10);s._messageClass=new wz;s._messageMask="rgba(0, 0, 0, 0.05)";s._messageStyle={bottom:"0",left:"0",position:"absolute",right:"0","text-align":"center",top:"0"};s._noDataHTML=function(){return"\n
        \n ".concat(s._translate("No Data Available"),"\n
        ")};s._noDataMessage=true;s._on={"click.shape":oI.bind(XI(s)),"click.legend":sI.bind(XI(s)),mouseenter:uI.bind(XI(s)),mouseleave:hI.bind(XI(s)),"mousemove.shape":fI.bind(XI(s)),"mousemove.legend":cI.bind(XI(s))};s._queue=[];s._scrollContainer=(typeof window==="undefined"?"undefined":HI(window))===undefined?"":window;s._shape=Bg("Rect");s._shapes=[];s._shapeConfig={ariaLabel:function e(t,n){return s._drawLabel(t,n)},fill:function e(t,n){while(t.__d3plus__&&t.data){t=t.data;n=t.i}if(s._colorScale){var i=s._colorScale(t,n);if(i!==undefined&&i!==null){var a=s._colorScaleClass._colorScale;var r=s._colorScaleClass.color();if(!a)return r instanceof Array?r[r.length-1]:r;else if(!a.domain().length)return a.range()[a.range().length-1];return a(i)}}var o=s._color(t,n);if(TB(o))return o;return qC(o)},labelConfig:{fontColor:function e(t,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(t,n):s._shapeConfig.fill;return YC(i)}},opacity:Bg(1),stroke:function e(t,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(t,n):s._shapeConfig.fill;return TB(i).darker()},role:"presentation",strokeWidth:Bg(0)};s._solo=[];s._svgDesc="";s._svgTitle="";s._timeline=true;s._timelineClass=(new DP).align("end");s._timelineConfig={brushing:false,padding:5};s._timelinePadding=JI;s._threshold=Bg(1e-4);s._thresholdKey=undefined;s._thresholdName=function(){return s._translate("Values")};s._titleClass=new jE;s._titleConfig={ariaHidden:true,fontSize:12,padding:5,resize:false,textAnchor:"middle"};s._titlePadding=JI;s._tooltip=Bg(true);s._tooltipClass=new mz;s._tooltipConfig={pointerEvents:"none",titleStyle:{"max-width":"200px"}};s._totalClass=new jE;s._totalConfig={fontSize:10,padding:5,resize:false,textAnchor:"middle"};s._totalFormat=function(e){return"".concat(s._translate("Total"),": ").concat(LN(e,s._locale))};s._totalPadding=JI;s._zoom=false;s._zoomBehavior=fN();s._zoomBrush=uB();s._zoomBrushHandleSize=1;s._zoomBrushHandleStyle={fill:"#444"};s._zoomBrushSelectionStyle={fill:"#777","stroke-width":0};s._zoomControlStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.75)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"900 15px/21px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",height:"20px",margin:"5px",opacity:.75,padding:0,"text-align":"center",width:"20px"};s._zoomControlStyleActive={background:"rgba(0, 0, 0, 0.75)",color:"rgba(255, 255, 255, 0.75)",opacity:1};s._zoomControlStyleHover={cursor:"pointer",opacity:1};s._zoomFactor=2;s._zoomMax=16;s._zoomPadding=20;s._zoomPan=true;s._zoomScroll=true;return s}GI(n,[{key:"_preDraw",value:function e(){var r=this;var o=this;this._drawDepth=this._depth!==void 0?this._depth:this._groupBy.length-1;this._id=this._groupBy[this._drawDepth];this._ids=function(t,n){return r._groupBy.map(function(e){return!t||t.__d3plus__&&!t.data?undefined:e(t.__d3plus__?t.data:t,t.__d3plus__?t.i:n)}).filter(function(e){return e!==undefined&&e!==null})};this._drawLabel=function(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:r._drawDepth;if(!e)return"";while(e.__d3plus__&&e.data){e=e.data;t=e.i}if(e._isAggregation){return"".concat(r._thresholdName(e,t)," < ").concat(LN(e._threshold*100,r._locale),"%")}if(r._label)return"".concat(r._label(e,t));var i=o._ids(e,t).slice(0,n+1);var a=i.reverse().find(function(e){return!(e instanceof Array)})||i[i.length-1];return a instanceof Array?QI(a):"".concat(a)};if(this._time&&!this._timeFilter&&this._data.length){var t=this._data.map(this._time).map(IN);var n=this._data[0],i=0;if(this._discrete&&"_".concat(this._discrete)in this&&this["_".concat(this._discrete)](n,i)===this._time(n,i)){this._timeFilter=function(){return true}}else{var a=+ve(t);this._timeFilter=function(e,t){return+IN(r._time(e,t))===a}}}this._filteredData=[];this._legendData=[];var s=[];if(this._data.length){s=this._timeFilter?this._data.filter(this._timeFilter):this._data;if(this._filter)s=s.filter(this._filter);var l=yb();for(var u=0;u<=this._drawDepth;u++){l.key(this._groupBy[u])}if(this._discrete&&"_".concat(this._discrete)in this)l.key(this["_".concat(this._discrete)]);if(this._discrete&&"_".concat(this._discrete,"2")in this)l.key(this["_".concat(this._discrete,"2")]);var h=l.rollup(function(e){var t=r._data.indexOf(e[0]);var n=r._shape(e[0],t);var i=r._id(e[0],t);var a=Rb(e,r._aggs);if(!r._hidden.includes(i)&&(!r._solo.length||r._solo.includes(i))){if(!r._discrete&&n==="Line")r._filteredData=r._filteredData.concat(e);else r._filteredData.push(a)}r._legendData.push(a)}).entries(s);this._filteredData=this._thresholdFunction(this._filteredData,h)}var c=yb().key(this._id).entries(this._filteredData).length;if(c>this._dataCutoff){if(this._userHover===undefined)this._userHover=this._shapeConfig.hoverOpacity||.5;if(this._userDuration===undefined)this._userDuration=this._shapeConfig.duration||600;this._shapeConfig.hoverOpacity=1;this._shapeConfig.duration=0}else if(this._userHover!==undefined){this._shapeConfig.hoverOpacity=this._userHover;this._shapeConfig.duration=this._userDuration}if(this._noDataMessage&&!this._filteredData.length){this._messageClass.render({container:this._select.node().parentNode,html:this._noDataHTML(this),mask:false,style:this._messageStyle})}}},{key:"_draw",value:function e(){if(this._legendPosition==="left"||this._legendPosition==="right")JL.bind(this)(this._filteredData);if(this._colorScalePosition==="left"||this._colorScalePosition==="right"||this._colorScalePosition===false)kz.bind(this)(this._filteredData);xz.bind(this)();tI.bind(this)(this._filteredData);nI.bind(this)(this._filteredData);eI.bind(this)(this._filteredData);$L.bind(this)(this._filteredData);if(this._legendPosition==="top"||this._legendPosition==="bottom")JL.bind(this)(this._legendData);if(this._colorScalePosition==="top"||this._colorScalePosition==="bottom")kz.bind(this)(this._filteredData);this._shapes=[]}},{key:"_thresholdFunction",value:function e(t){return t}},{key:"render",value:function e(r){var o=this;this._margin={bottom:0,left:0,right:0,top:0};this._padding={bottom:0,left:0,right:0,top:0};this._transition=sb().duration(this._duration);if(this._select===void 0||this._select.node().tagName.toLowerCase()!=="svg"){var t=this._select===void 0?xv("body").append("div"):this._select;var n=t.append("svg");this.select(n.node())}function s(){var e=this._select.style("display");this._select.style("display","none");var t=aI(this._select.node().parentNode),n=OI(t,2),i=n[0],a=n[1];i-=parseFloat(this._select.style("border-left-width"),10);i-=parseFloat(this._select.style("border-right-width"),10);a-=parseFloat(this._select.style("border-top-width"),10);a-=parseFloat(this._select.style("border-bottom-width"),10);this._select.style("display",e);if(this._autoWidth){this.width(i);this._select.style("width","".concat(this._width,"px")).attr("width","".concat(this._width,"px"))}if(this._autoHeight){this.height(a);this._select.style("height","".concat(this._height,"px")).attr("height","".concat(this._height,"px"))}}if((!this._width||!this._height)&&(!this._detectVisible||rI(this._select.node()))){this._autoWidth=this._width===undefined;this._autoHeight=this._height===undefined;s.bind(this)()}this._select.attr("class","d3plus-viz").attr("aria-hidden",this._ariaHidden).attr("aria-labelledby","".concat(this._uuid,"-title ").concat(this._uuid,"-desc")).attr("role","img").attr("xmlns","http://www.w3.org/2000/svg").attr("xmlns:xlink","http://www.w3.org/1999/xlink").transition(sb).style("width",this._width!==undefined?"".concat(this._width,"px"):undefined).style("height",this._height!==undefined?"".concat(this._height,"px"):undefined).attr("width",this._width!==undefined?"".concat(this._width,"px"):undefined).attr("height",this._height!==undefined?"".concat(this._height,"px"):undefined);var i=xv(this._select.node().parentNode);var a=i.style("position");if(a==="static")i.style("position","relative");var l=this._select.selectAll("title").data([0]);var u=l.enter().append("title").attr("id","".concat(this._uuid,"-title"));l.merge(u).text(this._svgTitle);var h=this._select.selectAll("desc").data([0]);var c=h.enter().append("desc").attr("id","".concat(this._uuid,"-desc"));h.merge(c).text(this._svgDesc);this._visiblePoll=clearInterval(this._visiblePoll);this._resizePoll=clearTimeout(this._resizePoll);this._scrollPoll=clearTimeout(this._scrollPoll);xv(this._scrollContainer).on("scroll.".concat(this._uuid),null);xv(this._scrollContainer).on("resize.".concat(this._uuid),null);if(this._detectVisible&&this._select.style("visibility")==="hidden"){this._visiblePoll=setInterval(function(){if(o._select.style("visibility")!=="hidden"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(r)}},this._detectVisibleInterval)}else if(this._detectVisible&&this._select.style("display")==="none"){this._visiblePoll=setInterval(function(){if(o._select.style("display")!=="none"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(r)}},this._detectVisibleInterval)}else if(this._detectVisible&&!rI(this._select.node())){xv(this._scrollContainer).on("scroll.".concat(this._uuid),function(){if(!o._scrollPoll){o._scrollPoll=setTimeout(function(){if(rI(o._select.node())){xv(o._scrollContainer).on("scroll.".concat(o._uuid),null);o.render(r)}o._scrollPoll=clearTimeout(o._scrollPoll)},o._detectVisibleInterval)}})}else{var f=JB();this._queue.forEach(function(e){var t=o._cache?o._lrucache.get("".concat(e[3],"_").concat(e[1])):undefined;if(!t)f.defer.apply(f,BI(e));else o["_".concat(e[3])]=e[2]?e[2](t):t});this._queue=[];if(this._loadingMessage&&f._tasks.length){this._messageClass.render({container:this._select.node().parentNode,html:this._loadingHTML(this),mask:this._filteredData?this._messageMask:false,style:this._messageStyle})}f.awaitAll(function(){var n=o._data instanceof Array&&o._data.length>0?Object.keys(o._data[0]):[];var e=o._select.selectAll("g.data-table").data(!o._ariaHidden&&o._data instanceof Array&&o._data.length?[0]:[]);var t=e.enter().append("g").attr("class","data-table").attr("role","table");e.exit().remove();var i=e.merge(t).selectAll("text").data(o._data instanceof Array?Ne(0,o._data.length+1):[]);i.exit().remove();var a=i.merge(i.enter().append("text").attr("role","row")).selectAll("tspan").data(function(e,t){return n.map(function(e){return{role:t?"cell":"columnheader",text:t?o._data[t-1][e]:e}})});a.exit().remove();a.merge(a.enter().append("tspan")).attr("role",function(e){return e.role}).attr("dy","-1000px").html(function(e){return e.text});o._preDraw();o._draw(r);wI.bind(o)();TI.bind(o)();if(o._messageClass._isVisible&&(!o._noDataMessage||o._filteredData.length))o._messageClass.hide();if(o._detectResize&&(o._autoWidth||o._autoHeight)){xv(o._scrollContainer).on("resize.".concat(o._uuid),function(){o._resizePoll=clearTimeout(o._resizePoll);o._resizePoll=setTimeout(function(){o._resizePoll=clearTimeout(o._resizePoll);s.bind(o)();o.render(r)},o._detectResizeDelay)})}if(r)setTimeout(r,o._duration+100)})}xv("body").on("touchstart.".concat(this._uuid),dI.bind(this));return this}},{key:"active",value:function e(t){this._active=t;if(this._shapeConfig.activeOpacity!==1){this._shapes.forEach(function(e){return e.active(t)});if(this._legend)this._legendClass.active(t)}return this}},{key:"aggs",value:function e(t){return arguments.length?(this._aggs=wn(this._aggs,t),this):this._aggs}},{key:"ariaHidden",value:function e(t){return arguments.length?(this._ariaHidden=t,this):this._ariaHidden}},{key:"attribution",value:function e(t){return arguments.length?(this._attribution=t,this):this._attribution}},{key:"attributionStyle",value:function e(t){return arguments.length?(this._attributionStyle=wn(this._attributionStyle,t),this):this._attributionStyle}},{key:"backConfig",value:function e(t){return arguments.length?(this._backConfig=wn(this._backConfig,t),this):this._backConfig}},{key:"cache",value:function e(t){return arguments.length?(this._cache=t,this):this._cache}},{key:"color",value:function e(t){return arguments.length?(this._color=!t||typeof t==="function"?t:mn(t),this):this._color}},{key:"colorScale",value:function e(t){return arguments.length?(this._colorScale=!t||typeof t==="function"?t:mn(t),this):this._colorScale}},{key:"colorScaleConfig",value:function e(t){return arguments.length?(this._colorScaleConfig=wn(this._colorScaleConfig,t),this):this._colorScaleConfig}},{key:"colorScalePadding",value:function e(t){return arguments.length?(this._colorScalePadding=typeof t==="function"?t:Bg(t),this):this._colorScalePadding}},{key:"colorScalePosition",value:function e(t){return arguments.length?(this._colorScalePosition=t,this):this._colorScalePosition}},{key:"colorScaleMaxSize",value:function e(t){return arguments.length?(this._colorScaleMaxSize=t,this):this._colorScaleMaxSize}},{key:"controls",value:function e(t){return arguments.length?(this._controls=t,this):this._controls}},{key:"controlConfig",value:function e(t){return arguments.length?(this._controlConfig=wn(this._controlConfig,t),this):this._controlConfig}},{key:"controlPadding",value:function e(t){return arguments.length?(this._controlPadding=typeof t==="function"?t:Bg(t),this):this._controlPadding}},{key:"data",value:function e(t,n){if(arguments.length){var i=this._queue.find(function(e){return e[3]==="data"});var a=[DT.bind(this),t,n,"data"];if(i)this._queue[this._queue.indexOf(i)]=a;else this._queue.push(a);this._hidden=[];this._solo=[];return this}return this._data}},{key:"dataCutoff",value:function e(t){return arguments.length?(this._dataCutoff=t,this):this._dataCutoff}},{key:"depth",value:function e(t){return arguments.length?(this._depth=t,this):this._depth}},{key:"detectResize",value:function e(t){return arguments.length?(this._detectResize=t,this):this._detectResize}},{key:"detectResizeDelay",value:function e(t){return arguments.length?(this._detectResizeDelay=t,this):this._detectResizeDelay}},{key:"detectVisible",value:function e(t){return arguments.length?(this._detectVisible=t,this):this._detectVisible}},{key:"detectVisibleInterval",value:function e(t){return arguments.length?(this._detectVisibleInterval=t,this):this._detectVisibleInterval}},{key:"discrete",value:function e(t){return arguments.length?(this._discrete=t,this):this._discrete}},{key:"downloadButton",value:function e(t){return arguments.length?(this._downloadButton=t,this):this._downloadButton}},{key:"downloadConfig",value:function e(t){return arguments.length?(this._downloadConfig=wn(this._downloadConfig,t),this):this._downloadConfig}},{key:"downloadPosition",value:function e(t){return arguments.length?(this._downloadPosition=t,this):this._downloadPosition}},{key:"duration",value:function e(t){return arguments.length?(this._duration=t,this):this._duration}},{key:"filter",value:function e(t){return arguments.length?(this._filter=t,this):this._filter}},{key:"groupBy",value:function e(t){var n=this;if(!arguments.length)return this._groupBy;if(!(t instanceof Array))t=[t];return this._groupBy=t.map(function(e){if(typeof e==="function")return e;else{if(!n._aggs[e]){n._aggs[e]=function(e,t){var n=Ab(e.map(t));return n.length===1?n[0]:n}}return mn(e)}}),this}},{key:"height",value:function e(t){return arguments.length?(this._height=t,this):this._height}},{key:"hiddenColor",value:function e(t){return arguments.length?(this._hiddenColor=typeof t==="function"?t:Bg(t),this):this._hiddenColor}},{key:"hiddenOpacity",value:function e(t){return arguments.length?(this._hiddenOpacity=typeof t==="function"?t:Bg(t),this):this._hiddenOpacity}},{key:"hover",value:function e(t){var i=this;var n=this._hover=t;if(this._shapeConfig.hoverOpacity!==1){if(typeof t==="function"){var a=Pe(this._shapes.map(function(e){return e.data()}));a=a.concat(this._legendClass.data());var r=t?a.filter(t):[];var o=[];r.map(this._ids).forEach(function(e){for(var t=1;t<=e.length;t++){o.push(JSON.stringify(e.slice(0,t)))}});o=o.filter(function(e,t){return o.indexOf(e)===t});if(o.length)n=function e(t,n){return o.includes(JSON.stringify(i._ids(t,n)))}}this._shapes.forEach(function(e){return e.hover(n)});if(this._legend)this._legendClass.hover(n)}return this}},{key:"label",value:function e(t){return arguments.length?(this._label=typeof t==="function"?t:Bg(t),this):this._label}},{key:"legend",value:function e(t){return arguments.length?(this._legend=t,this):this._legend}},{key:"legendConfig",value:function e(t){return arguments.length?(this._legendConfig=wn(this._legendConfig,t),this):this._legendConfig}},{key:"legendCutoff",value:function e(t){return arguments.length?(this._legendCutoff=t,this):this._legendCutoff}},{key:"legendTooltip",value:function e(t){return arguments.length?(this._legendTooltip=wn(this._legendTooltip,t),this):this._legendTooltip}},{key:"legendPadding",value:function e(t){return arguments.length?(this._legendPadding=typeof t==="function"?t:Bg(t),this):this._legendPadding}},{key:"legendPosition",value:function e(t){return arguments.length?(this._legendPosition=t,this):this._legendPosition}},{key:"legendSort",value:function e(t){return arguments.length?(this._legendSort=t,this):this._legendSort}},{key:"loadingHTML",value:function e(t){return arguments.length?(this._loadingHTML=typeof t==="function"?t:Bg(t),this):this._loadingHTML}},{key:"loadingMessage",value:function e(t){return arguments.length?(this._loadingMessage=t,this):this._loadingMessage}},{key:"messageMask",value:function e(t){return arguments.length?(this._messageMask=t,this):this._messageMask}},{key:"messageStyle",value:function e(t){return arguments.length?(this._messageStyle=wn(this._messageStyle,t),this):this._messageStyle}},{key:"noDataHTML",value:function e(t){return arguments.length?(this._noDataHTML=typeof t==="function"?t:Bg(t),this):this._noDataHTML}},{key:"noDataMessage",value:function e(t){return arguments.length?(this._noDataMessage=t,this):this._noDataMessage}},{key:"scrollContainer",value:function e(t){return arguments.length?(this._scrollContainer=t,this):this._scrollContainer}},{key:"select",value:function e(t){return arguments.length?(this._select=xv(t),this):this._select}},{key:"shape",value:function e(t){return arguments.length?(this._shape=typeof t==="function"?t:Bg(t),this):this._shape}},{key:"shapeConfig",value:function e(t){return arguments.length?(this._shapeConfig=wn(this._shapeConfig,t),this):this._shapeConfig}},{key:"svgDesc",value:function e(t){return arguments.length?(this._svgDesc=t,this):this._svgDesc}},{key:"svgTitle",value:function e(t){return arguments.length?(this._svgTitle=t,this):this._svgTitle}},{key:"threshold",value:function e(t){if(arguments.length){if(typeof t==="function"){this._threshold=t}else if(isFinite(t)&&!isNaN(t)){this._threshold=Bg(t*1)}return this}else return this._threshold}},{key:"thresholdKey",value:function e(t){if(arguments.length){if(typeof t==="function"){this._thresholdKey=t}else{this._thresholdKey=mn(t)}return this}else return this._thresholdKey}},{key:"thresholdName",value:function e(t){return arguments.length?(this._thresholdName=typeof t==="function"?t:Bg(t),this):this._thresholdName}},{key:"time",value:function e(t){if(arguments.length){if(typeof t==="function"){this._time=t}else{this._time=mn(t);if(!this._aggs[t]){this._aggs[t]=function(e,t){var n=Ab(e.map(t));return n.length===1?n[0]:n}}}this._timeFilter=false;return this}else return this._time}},{key:"timeFilter",value:function e(t){return arguments.length?(this._timeFilter=t,this):this._timeFilter}},{key:"timeline",value:function e(t){return arguments.length?(this._timeline=t,this):this._timeline}},{key:"timelineConfig",value:function e(t){return arguments.length?(this._timelineConfig=wn(this._timelineConfig,t),this):this._timelineConfig}},{key:"timelinePadding",value:function e(t){return arguments.length?(this._timelinePadding=typeof t==="function"?t:Bg(t),this):this._timelinePadding}},{key:"title",value:function e(t){return arguments.length?(this._title=typeof t==="function"?t:Bg(t),this):this._title}},{key:"titleConfig",value:function e(t){return arguments.length?(this._titleConfig=wn(this._titleConfig,t),this):this._titleConfig}},{key:"titlePadding",value:function e(t){return arguments.length?(this._titlePadding=typeof t==="function"?t:Bg(t),this):this._titlePadding}},{key:"tooltip",value:function e(t){return arguments.length?(this._tooltip=typeof t==="function"?t:Bg(t),this):this._tooltip}},{key:"tooltipConfig",value:function e(t){return arguments.length?(this._tooltipConfig=wn(this._tooltipConfig,t),this):this._tooltipConfig}},{key:"total",value:function e(t){if(arguments.length){if(typeof t==="function")this._total=t;else if(t)this._total=mn(t);else this._total=false;return this}else return this._total}},{key:"totalConfig",value:function e(t){return arguments.length?(this._totalConfig=wn(this._totalConfig,t),this):this._totalConfig}},{key:"totalFormat",value:function e(t){return arguments.length?(this._totalFormat=t,this):this._totalFormat}},{key:"totalPadding",value:function e(t){return arguments.length?(this._totalPadding=typeof t==="function"?t:Bg(t),this):this._totalPadding}},{key:"width",value:function e(t){return arguments.length?(this._width=t,this):this._width}},{key:"zoom",value:function e(t){return arguments.length?(this._zoom=t,this):this._zoom}},{key:"zoomBrushHandleSize",value:function e(t){return arguments.length?(this._zoomBrushHandleSize=t,this):this._zoomBrushHandleSize}},{key:"zoomBrushHandleStyle",value:function e(t){return arguments.length?(this._zoomBrushHandleStyle=t,this):this._zoomBrushHandleStyle}},{key:"zoomBrushSelectionStyle",value:function e(t){return arguments.length?(this._zoomBrushSelectionStyle=t,this):this._zoomBrushSelectionStyle}},{key:"zoomControlStyle",value:function e(t){return arguments.length?(this._zoomControlStyle=t,this):this._zoomControlStyle}},{key:"zoomControlStyleActive",value:function e(t){return arguments.length?(this._zoomControlStyleActive=t,this):this._zoomControlStyleActive}},{key:"zoomControlStyleHover",value:function e(t){return arguments.length?(this._zoomControlStyleHover=t,this):this._zoomControlStyleHover}},{key:"zoomFactor",value:function e(t){return arguments.length?(this._zoomFactor=t,this):this._zoomFactor}},{key:"zoomMax",value:function e(t){return arguments.length?(this._zoomMax=t,this):this._zoomMax}},{key:"zoomPan",value:function e(t){return arguments.length?(this._zoomPan=t,this):this._zoomPan}},{key:"zoomPadding",value:function e(t){return arguments.length?(this._zoomPadding=t,this):this._zoomPadding}},{key:"zoomScroll",value:function e(t){return arguments.length?(this._zoomScroll=t,this):this._zoomScroll}}]);return n}(Ag);var tj=function(e){s(u,e);var t=c(u);function u(){var i;o(this,u);i=t.call(this);i._shapeConfig=wn(i._shapeConfig,{ariaLabel:function e(t,n){return i._pieData?"".concat(++i._pieData[n].index,". ").concat(i._drawLabel(t,n),", ").concat(i._value(t,n),"."):""},Path:{labelConfig:{fontResize:true}}});i._innerRadius=0;i._legendSort=function(e,t){return i._value(t)-i._value(e)};i._padPixel=0;i._pie=xe();i._sort=function(e,t){return i._value(t)-i._value(e)};i._value=mn("value");return i}n(u,[{key:"_draw",value:function e(t){var n=this;_(y(u.prototype),"_draw",this).call(this,t);var i=this._height-this._margin.top-this._margin.bottom,a=this._width-this._margin.left-this._margin.right;var r=Oe([a,i])/2;var o=this._pieData=this._pie.padAngle(this._padAngle||this._padPixel/r).sort(this._sort).value(this._value)(this._filteredData);o.forEach(function(e,t){e.__d3plus__=true;e.i=t});var s=U().innerRadius(this._innerRadius).outerRadius(r);var l="translate(".concat(a/2+this._margin.left,", ").concat(i/2+this._margin.top,")");this._shapes.push((new nT).data(o).d(s).select(gb("g.d3plus-Pie",{parent:this._select,enter:{transform:l},update:{transform:l}}).node()).config({id:function e(t){return n._ids(t).join("-")},x:0,y:0}).label(this._drawLabel).config(Tg.bind(this)(this._shapeConfig,"shape","Path")).render());return this}},{key:"innerRadius",value:function e(t){return arguments.length?(this._innerRadius=t,this):this._innerRadius}},{key:"padAngle",value:function e(t){return arguments.length?(this._padAngle=t,this):this._padAngle}},{key:"padPixel",value:function e(t){return arguments.length?(this._padPixel=t,this):this._padPixel}},{key:"sort",value:function e(t){return arguments.length?(this._sort=t,this):this._sort}},{key:"value",value:function e(t){return arguments.length?(this._value=typeof t==="function"?t:mn(t),this):this._value}}]);return u}(ej);var nj=function(e){s(n,e);var t=c(n);function n(){var e;o(this,n);e=t.call(this);e._innerRadius=function(){return Oe([e._width-e._margin.left-e._margin.right,e._height-e._margin.top-e._margin.bottom])/4};e._padPixel=2;return e}return n}(tj);function ij(e){var t=0,n=e.children,i=n&&n.length;if(!i)t=1;else while(--i>=0){t+=n[i].value}e.value=t}function aj(){return this.eachAfter(ij)}function rj(e){var t=this,n,i=[t],a,r,o;do{n=i.reverse(),i=[];while(t=n.pop()){e(t),a=t.children;if(a)for(r=0,o=a.length;r=0;--a){n.push(i[a])}}return this}function sj(e){var t=this,n=[t],i=[],a,r,o;while(t=n.pop()){i.push(t),a=t.children;if(a)for(r=0,o=a.length;r=0){t+=n[i].value}e.value=t})}function uj(t){return this.eachBefore(function(e){if(e.children){e.children.sort(t)}})}function hj(e){var t=this,n=cj(t,e),i=[t];while(t!==n){t=t.parent;i.push(t)}var a=i.length;while(e!==n){i.splice(a,0,e);e=e.parent}return i}function cj(e,t){if(e===t)return e;var n=e.ancestors(),i=t.ancestors(),a=null;e=n.pop();t=i.pop();while(e===t){a=e;e=n.pop();t=i.pop()}return a}function fj(){var e=this,t=[e];while(e=e.parent){t.push(e)}return t}function dj(){var t=[];this.each(function(e){t.push(e)});return t}function gj(){var t=[];this.eachBefore(function(e){if(!e.children){t.push(e)}});return t}function pj(){var t=this,n=[];t.each(function(e){if(e!==t){n.push({source:e.parent,target:e})}});return n}function vj(e,t){var n=new wj(e),i=+e.value&&(n.value=e.value),a,r=[n],o,s,l,u;if(t==null)t=yj;while(a=r.pop()){if(i)a.value=+a.data.value;if((s=t(a.data))&&(u=s.length)){a.children=new Array(u);for(l=u-1;l>=0;--l){r.push(o=a.children[l]=new wj(s[l]));o.parent=a;o.depth=a.depth+1}}}return n.eachBefore(bj)}function mj(){return vj(this).eachBefore(_j)}function yj(e){return e.children}function _j(e){e.data=e.data.data}function bj(e){var t=0;do{e.height=t}while((e=e.parent)&&e.height<++t)}function wj(e){this.data=e;this.depth=this.height=0;this.parent=null}wj.prototype=vj.prototype={constructor:wj,count:aj,each:rj,eachAfter:sj,eachBefore:oj,sum:lj,sort:uj,path:hj,ancestors:fj,descendants:dj,leaves:gj,links:pj,copy:mj};var xj=Array.prototype.slice;function kj(e){var t=e.length,n,i;while(t){i=Math.random()*t--|0;n=e[t];e[t]=e[i];e[i]=n}return e}function Sj(e){var t=0,n=(e=kj(xj.call(e))).length,i=[],a,r;while(t0&&n*n>i*i+a*a}function Rj(e,t){for(var n=0;nl){a=(u+l-r)/(2*u);s=Math.sqrt(Math.max(0,l/u-a*a));n.x=e.x-a*i-s*o;n.y=e.y-a*o+s*i}else{a=(u+r-l)/(2*u);s=Math.sqrt(Math.max(0,r/u-a*a));n.x=t.x+a*i-s*o;n.y=t.y+a*o+s*i}}else{n.x=t.x+n.r;n.y=t.y}}function Pj(e,t){var n=e.r+t.r-1e-6,i=t.x-e.x,a=t.y-e.y;return n>0&&n*n>i*i+a*a}function Oj(e){var t=e._,n=e.next._,i=t.r+n.r,a=(t.x*n.r+n.x*t.r)/i,r=(t.y*n.r+n.y*t.r)/i;return a*a+r*r}function zj(e){this._=e;this.next=null;this.previous=null}function Fj(e){if(!(a=e.length))return 0;var t,n,i,a,r,o,s,l,u,h,c;t=e[0],t.x=0,t.y=0;if(!(a>1))return t.r;n=e[1],t.x=-n.r,n.x=t.r,n.y=0;if(!(a>2))return t.r+n.r;Dj(n,t,i=e[2]);t=new zj(t),n=new zj(n),i=new zj(i);t.next=i.previous=n;n.next=t.previous=i;i.next=n.previous=t;e:for(s=3;s=0){r=i[a];r.z+=t;r.m+=t;t+=r.s+(n+=r.c)}}function eH(e,t,n){return e.a.parent===t.parent?e.a:n}function tH(e,t){this._=e;this.parent=null;this.children=null;this.A=null;this.a=this;this.z=0;this.m=0;this.c=0;this.s=0;this.t=null;this.i=t}tH.prototype=Object.create(wj.prototype);function nH(e){var t=new tH(e,0),n,i=[t],a,r,o,s;while(n=i.pop()){if(r=n._.children){n.children=new Array(s=r.length);for(o=s-1;o>=0;--o){i.push(a=n.children[o]=new tH(r[o],o));a.parent=n}}}(t.parent=new tH(null,0)).children=[t];return t}function iH(){var f=Xj,u=1,h=1,c=null;function t(e){var t=nH(e);t.eachAfter(d),t.parent.m=-t.z;t.eachBefore(g);if(c)e.eachBefore(p);else{var n=e,i=e,a=e;e.eachBefore(function(e){if(e.xi.x)i=e;if(e.depth>a.depth)a=e});var r=n===i?1:f(n,i)/2,o=r-n.x,s=u/(i.x+r+o),l=h/(a.depth||1);e.eachBefore(function(e){e.x=(e.x+o)*s;e.y=e.depth*l})}return e}function d(e){var t=e.children,n=e.parent.children,i=e.i?n[e.i-1]:null;if(t){Qj(e);var a=(t[0].z+t[t.length-1].z)/2;if(i){e.z=i.z+f(e._,i._);e.m=e.z-a}else{e.z=a}}else if(i){e.z=i.z+f(e._,i._)}e.parent.A=r(e,i,e.parent.A||n[0])}function g(e){e._.x=e.z+e.parent.m;e.m+=e.parent.m}function r(e,t,n){if(t){var i=e,a=e,r=t,o=i.parent.children[0],s=i.m,l=a.m,u=r.m,h=o.m,c;while(r=Zj(r),i=$j(i),r&&i){o=$j(o);a=Zj(a);a.a=e;c=r.z+u-i.z-s+f(r._,i._);if(c>0){Jj(eH(r,e,n),e,c);s+=c;l+=c}u+=r.m;s+=i.m;h+=o.m;l+=a.m}if(r&&!Zj(a)){a.t=r;a.m+=u-l}if(i&&!$j(o)){o.t=i;o.m+=s-h;n=e}}return n}function p(e){e.x*=u;e.y=e.depth*h}t.separation=function(e){return arguments.length?(f=e,t):f};t.size=function(e){return arguments.length?(c=false,u=+e[0],h=+e[1],t):c?null:[u,h]};t.nodeSize=function(e){return arguments.length?(c=true,u=+e[0],h=+e[1],t):c?[u,h]:null};return t}function aH(e,t,n,i,a){var r=e.children,o,s=-1,l=r.length,u=e.value&&(a-n)/e.value;while(++sy)y=u;x=v*v*w;_=Math.max(y/x,x/m);if(_>b){v-=u;break}b=_}o.push(l={value:v,dice:d1?e:1)};return e}(rH);function lH(){var o=sH,t=false,n=1,i=1,s=[0],l=jj,u=jj,h=jj,c=jj,f=jj;function a(e){e.x0=e.y0=0;e.x1=n;e.y1=i;e.eachBefore(r);s=[0];if(t)e.eachBefore(qj);return e}function r(e){var t=s[e.depth],n=e.x0+t,i=e.y0+t,a=e.x1-t,r=e.y1-t;if(a1&&arguments[1]!==undefined?arguments[1]:[];if(e.values){e.values.forEach(function(e){n.push(e);t(e,n)})}else{n.push(e)}return n};var hH=function(e){s(h,e);var i=c(h);function h(){var r;o(this,h);r=i.call(this);r._layoutPadding=1;r._on.mouseenter=function(){};var t=r._on["mousemove.legend"];r._on["mousemove.legend"]=function(n,e){t(n,e);var i=r._ids(n,e);var a=uH(n);r.hover(function(t){var e=Object.keys(t).filter(function(e){return e!=="value"}).every(function(e){return n[e]&&n[e].includes(t[e])});if(e)a.push(t);else if(i.includes(t.key))a.push.apply(a,d(uH(t,[t])));return a.includes(t)})};var n=r._on["mousemove.shape"];r._on["mousemove.shape"]=function(t,e){if(t.__d3plusTooltip__)n(t,e);r.hover(function(e){return uH(t,[t]).includes(e)})};r._pack=Uj();r._packOpacity=Bg(.25);r._shape=Bg("Circle");r._shapeConfig=wn(r._shapeConfig,{Circle:{label:function e(t){return t.parent&&!t.children?t.id:false},labelConfig:{fontResize:true},opacity:function e(t){return t.__d3plusOpacity__}}});r._sort=function(e,t){return t.value-e.value};r._sum=mn("value");return r}n(h,[{key:"_draw",value:function e(t){var n=this;_(y(h.prototype),"_draw",this).call(this,t);var i=this._height-this._margin.top-this._margin.bottom,a=this._width-this._margin.left-this._margin.right;var r=Math.min(i,a);var o="translate(".concat((a-r)/2,", ").concat((i-r)/2,")");var s=yb();for(var l=0;l<=this._drawDepth;l++){s.key(this._groupBy[l])}s=s.entries(this._filteredData);var u=this._pack.padding(this._layoutPadding).size([r,r])(vj({key:s.key,values:s},function(e){return e.values}).sum(this._sum).sort(this._sort)).descendants();u.forEach(function(e,t){e.__d3plus__=true;e.i=t;e.id=e.parent?e.parent.data.key:null;e.data.__d3plusOpacity__=e.height?n._packOpacity(e.data,t):1;e.data.__d3plusTooltip__=!e.height?true:false});this._shapes.push((new LR).data(u).select(gb("g.d3plus-Pack",{parent:this._select,enter:{transform:o},update:{transform:o}}).node()).config(Tg.bind(this)(this._shapeConfig,"shape","Circle")).render());return this}},{key:"hover",value:function e(t){this._hover=t;this._shapes.forEach(function(e){return e.hover(t)});if(this._legend)this._legendClass.hover(t);return this}},{key:"layoutPadding",value:function e(t){return arguments.length?(this._layoutPadding=t,this):this._layoutPadding}},{key:"packOpacity",value:function e(t){return arguments.length?(this._packOpacity=typeof t==="function"?t:Bg(t),this):this._packOpacity}},{key:"sort",value:function e(t){return arguments.length?(this._sort=t,this):this._sort}},{key:"sum",value:function e(t){return arguments.length?(this._sum=typeof t==="function"?t:mn(t),this):this._sum}}]);return h}(ej);function cH(e,t){if(!(t instanceof Array))t=[t];var n=yb();for(var i=0;i1})).select(gb("g.d3plus-Tree-Links",p).node()).config(Tg.bind(this)(this._shapeConfig,"shape","Path")).config({d:function e(t){var n=c._shapeConfig.r;if(typeof n==="function")n=n(t.data,t.i);var i=t.parent.x-t.x+(c._orient==="vertical"?0:n),a=t.parent.y-t.y+(c._orient==="vertical"?n:0),r=c._orient==="vertical"?0:-n,o=c._orient==="vertical"?-n:0;return c._orient==="vertical"?"M".concat(r,",").concat(o,"C").concat(r,",").concat((o+a)/2," ").concat(i,",").concat((o+a)/2," ").concat(i,",").concat(a):"M".concat(r,",").concat(o,"C").concat((r+i)/2,",").concat(o," ").concat((r+i)/2,",").concat(a," ").concat(i,",").concat(a)},id:function e(t,n){return c._ids(t,n).join("-")}}).render());this._shapes.push((new LR).data(r).select(gb("g.d3plus-Tree-Shapes",p).node()).config(Tg.bind(this)(this._shapeConfig,"shape","Circle")).config({id:function e(t,n){return c._ids(t,n).join("-")},label:function e(t,n){if(c._label)return c._label(t.data,n);var i=c._ids(t,n).slice(0,t.depth);return i[i.length-1]},labelConfig:{textAnchor:function e(t){return c._orient==="vertical"?"middle":t.data.children&&t.data.depth!==c._groupBy.length?"end":"start"},verticalAlign:function e(t){return c._orient==="vertical"?t.data.depth===1?"bottom":"top":"middle"}},hitArea:function e(t,n,i){var a=c._labelHeight,r=c._labelWidths[t.depth-1];return{width:c._orient==="vertical"?r:i.r*2+r,height:c._orient==="horizontal"?a:i.r*2+a,x:c._orient==="vertical"?-r/2:t.children&&t.depth!==c._groupBy.length?-(i.r+r):-i.r,y:c._orient==="horizontal"?-a/2:t.children&&t.depth!==c._groupBy.length?-(i.r+c._labelHeight):-i.r}},labelBounds:function e(t,n,i){var a;var r=c._labelHeight,o=c._orient==="vertical"?"height":"width",s=c._labelWidths[t.depth-1],l=c._orient==="vertical"?"width":"height",u=c._orient==="vertical"?"x":"y",h=c._orient==="vertical"?"y":"x";return a={},m(a,l,s),m(a,o,r),m(a,u,-s/2),m(a,h,t.children&&t.depth!==c._groupBy.length?-(i.r+r):i.r),a}}).render());return this}},{key:"orient",value:function e(t){return arguments.length?(this._orient=t,this):this._orient}},{key:"separation",value:function e(t){return arguments.length?(this._separation=t,this):this._separation}}]);return v}(ej);var gH=function(e){s(g,e);var t=c(g);function g(){var a;o(this,g);a=t.call(this);a._layoutPadding=1;a._legendSort=function(e,t){return a._sum(t)-a._sum(e)};a._legendTooltip=wn({},a._legendTooltip,{tbody:[]});a._shapeConfig=wn({},a._shapeConfig,{ariaLabel:function e(t,n){var i=a._rankData?"".concat(a._rankData.indexOf(t)+1,". "):"";return"".concat(i).concat(a._drawLabel(t,n),", ").concat(a._sum(t,n),".")},labelConfig:{fontMax:20,fontMin:8,fontResize:true,padding:5}});a._sort=function(e,t){var n=r(e);var i=r(t);return n&&!i?1:!n&&i?-1:t.value-e.value};a._sum=mn("value");a._thresholdKey=a._sum;a._tile=sH;a._tooltipConfig=wn({},a._tooltipConfig,{tbody:[[function(){return a._translate("Share")},function(e,t,n){return"".concat(LN(n.share*100,a._locale),"%")}]]});a._treemap=lH().round(true);var r=function e(t){return t.children&&t.children.length===1&&t.children[0].data._isAggregation};return a}n(g,[{key:"_draw",value:function e(t){var n=this;_(y(g.prototype),"_draw",this).call(this,t);var i=yb();for(var a=0;a<=this._drawDepth;a++){i.key(this._groupBy[a])}i=i.entries(this._filteredData);var r=this._treemap.padding(this._layoutPadding).size([this._width-this._margin.left-this._margin.right,this._height-this._margin.top-this._margin.bottom]).tile(this._tile)(vj({values:i},function(e){return e.values}).sum(this._sum).sort(this._sort));var o=[],s=this;function l(e){for(var t=0;t-1?i:undefined;n.data=Rb(n.data.values,s._aggs);n.x=n.x0+(n.x1-n.x0)/2;n.y=n.y0+(n.y1-n.y0)/2;o.push(n)}}}if(r.children)l(r.children);this._rankData=o.sort(this._sort).map(function(e){return e.data});var u=r.value;o.forEach(function(e){e.share=n._sum(e.data,e.i)/u});var h="translate(".concat(this._margin.left,", ").concat(this._margin.top,")");var c=Tg.bind(this)(this._shapeConfig,"shape","Rect");var f=c.labelConfig.fontMin;var d=c.labelConfig.padding;this._shapes.push((new JR).data(o).label(function(e){return[n._drawLabel(e.data,e.i),"".concat(LN(e.share*100,n._locale),"%")]}).select(gb("g.d3plus-Treemap",{parent:this._select,enter:{transform:h},update:{transform:h}}).node()).config({height:function e(t){return t.y1-t.y0},labelBounds:function e(t,n,i){var a=i.height;var r=Math.min(50,(a-d*2)*.5);if(r0){var u=Rb(n,h);u._isAggregation=true;u._threshold=t;a.push(u)}return a}throw new Error("Depth is higher than the amount of grouping levels.")}return t}},{key:"layoutPadding",value:function e(t){return arguments.length?(this._layoutPadding=typeof t==="function"?t:Bg(t),this):this._layoutPadding}},{key:"sort",value:function e(t){return arguments.length?(this._sort=t,this):this._sort}},{key:"sum",value:function e(t){if(arguments.length){this._sum=typeof t==="function"?t:mn(t);this._thresholdKey=this._sum;return this}else return this._sum}},{key:"tile",value:function e(t){return arguments.length?(this._tile=t,this):this._tile}}]);return g}(ej);e.Donut=nj;e.Pack=hH;e.Pie=tj;e.Tree=dH;e.Treemap=gH;Object.defineProperty(e,"__esModule",{value:true})}); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/d3plus-network.full.min.js b/plugins/additionals/assets/javascripts/d3plus-network.full.min.js deleted file mode 100644 index e736ea6..0000000 --- a/plugins/additionals/assets/javascripts/d3plus-network.full.min.js +++ /dev/null @@ -1,32 +0,0 @@ -function _classCallCheck2(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(e,t){for(var n=0;n=t.length)return{done:true};return{done:false,value:t[i++]}},e:function e(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=true,o=false,s;return{s:function e(){n=t[Symbol.iterator]()},n:function e(){var t=n.next();r=t.done;return t},e:function e(t){o=true;s=t},f:function e(){try{if(!r&&n["return"]!=null)n["return"]()}finally{if(o)throw s}}}}function _unsupportedIterableToArray2(e,t){if(!e)return;if(typeof e==="string")return _arrayLikeToArray2(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor)n=e.constructor.name;if(n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray2(e,t)}function _arrayLikeToArray2(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,i=new Array(t);n0?de:fe)(t)};var pe=Math.min;var ve=function e(t){return t>0?pe(ge(t),9007199254740991):0};var me=Math.max;var ye=Math.min;var _e=function e(t,n){var i=ge(t);return i<0?me(i+n,0):ye(i,n)};var be=function e(s){return function(e,t,n){var i=m(e);var a=ve(i.length);var r=_e(n,a);var o;if(s&&t!=t)while(a>r){o=i[r++];if(o!=o)return true}else for(;a>r;r++){if((s||r in i)&&i[r]===t)return s||r||0}return!s&&-1}};var we={includes:be(true),indexOf:be(false)};var xe=we.indexOf;var ke=function e(t,n){var i=m(t);var a=0;var r=[];var o;for(o in i){!x(X,o)&&x(i,o)&&r.push(o)}while(n.length>a){if(x(i,o=n[a++])){~xe(r,o)||r.push(o)}}return r};var Se=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];var Ce=Se.concat("length","prototype");var Ee=Object.getOwnPropertyNames||function e(t){return ke(t,Ce)};var Ae={f:Ee};var Re=Object.getOwnPropertySymbols;var Me={f:Re};var Te=ce("Reflect","ownKeys")||function e(t){var n=Ae.f(T(t));var i=Me.f;return i?n.concat(i(t)):n};var Be=function e(t,n){var i=Te(n);var a=P.f;var r=M.f;for(var o=0;ol;l++){if(_||l in r){c=r[l];f=o(c,l,a);if(d){if(g)h[l]=f;else if(f)switch(d){case 3:return true;case 5:return c;case 6:return l;case 2:Qe.call(h,c)}else if(m)return false}}}return y?-1:v||m?m:h}};var tt={forEach:et(0),map:et(1),filter:et(2),some:et(3),every:et(4),find:et(5),findIndex:et(6)};var nt=Object.keys||function e(t){return ke(t,Se)};var it=d?Object.defineProperties:function e(t,n){T(t);var i=nt(n);var a=i.length;var r=0;var o;while(a>r){P.f(t,o=i[r++],n[o])}return t};var at=ce("document","documentElement");var rt=">";var ot="<";var st="prototype";var lt="script";var ut=Y("IE_PROTO");var ht=function e(){};var ct=function e(t){return ot+lt+rt+t+ot+"/"+lt+rt};var ft=function e(t){t.write(ct(""));t.close();var n=t.parentWindow.Object;t=null;return n};var dt=function e(){var t=C("iframe");var n="java"+lt+":";var i;t.style.display="none";at.appendChild(t);t.src=String(n);i=t.contentWindow.document;i.open();i.write(ct("document.F=Object"));i.close();return i.F};var gt;var pt=function e(){try{gt=document.domain&&new ActiveXObject("htmlfile")}catch(e){}pt=gt?ft(gt):dt();var t=Se.length;while(t--){delete pt[st][Se[t]]}return pt()};X[ut]=true;var vt=Object.create||function e(t,n){var i;if(t!==null){ht[st]=T(t);i=new ht;ht[st]=null;i[ut]=t}else i=pt();return n===undefined?i:it(i,n)};var mt=$e("unscopables");var yt=Array.prototype;if(yt[mt]==undefined){P.f(yt,mt,{configurable:true,value:vt(null)})}var _t=function e(t){yt[mt][t]=true};var bt=Object.defineProperty;var wt={};var xt=function e(t){throw t};var kt=function e(t,n){if(x(wt,t))return wt[t];if(!n)n={};var i=[][t];var a=x(n,"ACCESSORS")?n.ACCESSORS:false;var r=x(n,0)?n[0]:xt;var o=x(n,1)?n[1]:undefined;return wt[t]=!!i&&!s(function(){if(a&&!d)return true;var e={length:-1};if(a)bt(e,1,{enumerable:true,get:xt});else e[1]=1;i.call(e,r,o)})};var St=tt.find;var Ct="find";var Et=true;var At=kt(Ct);if(Ct in[])Array(1)[Ct](function(){Et=false});je({target:"Array",proto:true,forced:Et||!At},{find:function e(t){return St(this,t,arguments.length>1?arguments[1]:undefined)}});_t(Ct);var Rt=we.includes;var Mt=kt("indexOf",{ACCESSORS:true,1:0});je({target:"Array",proto:true,forced:!Mt},{includes:function e(t){return Rt(this,t,arguments.length>1?arguments[1]:undefined)}});_t("includes");var Tt=Object.assign;var Bt=Object.defineProperty;var Nt=!Tt||s(function(){if(d&&Tt({b:1},Tt(Bt({},"a",{enumerable:true,get:function e(){Bt(this,"b",{value:3,enumerable:false})}}),{b:2})).b!==1)return true;var e={};var t={};var n=Symbol();var i="abcdefghijklmnopqrst";e[n]=7;i.split("").forEach(function(e){t[e]=e});return Tt({},e)[n]!=7||nt(Tt({},t)).join("")!=i})?function e(t,n){var i=Ge(t);var a=arguments.length;var r=1;var o=Me.f;var s=g.f;while(a>r){var l=b(arguments[r++]);var u=o?nt(l).concat(o(l)):nt(l);var h=u.length;var c=0;var f;while(h>c){f=u[c++];if(!d||s.call(l,f))i[f]=l[f]}}return i}:Tt;je({target:"Object",stat:true,forced:Object.assign!==Nt},{assign:Nt});var Pt=$e("match");var Dt=function e(t){var n;return y(t)&&((n=t[Pt])!==undefined?!!n:c(t)=="RegExp")};var Ot=function e(t){if(Dt(t)){throw TypeError("The method doesn't accept regular expressions")}return t};var zt=$e("match");var Ft=function e(t){var n=/./;try{"/./"[t](n)}catch(e){try{n[zt]=false;return"/./"[t](n)}catch(e){}}return false};je({target:"String",proto:true,forced:!Ft("includes")},{includes:function e(t){return!!~String(v(this)).indexOf(Ot(t),arguments.length>1?arguments[1]:undefined)}});var Lt=M.f;var It="".startsWith;var jt=Math.min;var Ht=Ft("startsWith");var Vt=!Ht&&!!function(){var e=Lt(String.prototype,"startsWith");return e&&!e.writable}();je({target:"String",proto:true,forced:!Vt&&!Ht},{startsWith:function e(t){var n=String(v(this));Ot(t);var i=ve(jt(arguments.length>1?arguments[1]:undefined,n.length));var a=String(t);return It?It.call(n,a,i):n.slice(i,i+a.length)===a}});if(typeof window!=="undefined"){(function(){try{if(typeof SVGElement==="undefined"||Boolean(SVGElement.prototype.innerHTML)){return}}catch(e){return}function n(e){switch(e.nodeType){case 1:return a(e);case 3:return t(e);case 8:return i(e)}}function t(e){return e.textContent.replace(/&/g,"&").replace(//g,">")}function i(e){return"\x3c!--"+e.nodeValue+"--\x3e"}function a(e){var t="";t+="<"+e.tagName;if(e.hasAttributes()){[].forEach.call(e.attributes,function(e){t+=" "+e.name+'="'+e.value+'"'})}t+=">";if(e.hasChildNodes()){[].forEach.call(e.childNodes,function(e){t+=n(e)})}t+="";return t}Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function e(){var t="";[].forEach.call(this.childNodes,function(e){t+=n(e)});return t},set:function e(t){while(this.firstChild){this.removeChild(this.firstChild)}try{var n=new DOMParser;n.async=false;var i=""+t+"";var a=n.parseFromString(i,"text/xml").documentElement;[].forEach.call(a.childNodes,function(e){this.appendChild(this.ownerDocument.importNode(e,true))}.bind(this))}catch(e){throw new Error("Error parsing markup string")}}});Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function e(){return this.innerHTML},set:function e(t){this.innerHTML=t}})})()}});(function(e,t){(typeof exports==="undefined"?"undefined":_typeof2(exports))==="object"&&typeof module!=="undefined"?t(exports):typeof define==="function"&&define.amd?define("d3plus-network",["exports"],t):(e=typeof globalThis!=="undefined"?globalThis:e||self,t(e.d3plus={}))})(this,function(e){function k(e,t){return et?1:e>=t?0:NaN}function S(o){if(o.length===1)o=t(o);return{left:function e(t,n,i,a){if(i==null)i=0;if(a==null)a=t.length;while(i>>1;if(o(t[r],n)<0)i=r+1;else a=r}return i},right:function e(t,n,i,a){if(i==null)i=0;if(a==null)a=t.length;while(i>>1;if(o(t[r],n)>0)a=r;else i=r+1}return i}}}function t(n){return function(e,t){return k(n(e),t)}}var n=S(k);var u=n.right;function h(e){return e===null?NaN:+e}function i(e,t){var n=e.length,i=0,a=-1,r=0,o,s,l=0;if(t==null){while(++a1)return l/(i-1)}function ze(e,t){var n=i(e,t);return n?Math.sqrt(n):n}function Fe(e,t){var n=e.length,i=-1,a,r,o;if(t==null){while(++i=a){r=o=a;while(++ia)r=a;if(o=a){r=o=a;while(++ia)r=a;if(o0)return[e];if(i=t0){e=Math.ceil(e/s);t=Math.floor(t/s);o=new Array(r=Math.ceil(t-e+1));while(++a=0?(r>=o?10:r>=s?5:r>=l?2:1)*Math.pow(10,a):-Math.pow(10,-a)/(r>=o?10:r>=s?5:r>=l?2:1)}function C(e,t,n){var i=Math.abs(t-e)/Math.max(0,n),a=Math.pow(10,Math.floor(Math.log(i)/Math.LN10)),r=i/a;if(r>=o)a*=10;else if(r>=s)a*=5;else if(r>=l)a*=2;return t=1)return+n(e[i-1],i-1,e);var i,a=(i-1)*t,r=Math.floor(a),o=+n(e[r],r,e),s=+n(e[r+1],r+1,e);return o+(s-o)*(a-r)}function me(e,t){var n=e.length,i=-1,a,r;if(t==null){while(++i=a){r=a;while(++ir){r=a}}}}}else{while(++i=a){r=a;while(++ir){r=a}}}}}return r}function a(e,t){var n=e.length,i=n,a=-1,r,o=0;if(t==null){while(++a=0){o=e[t];n=o.length;while(--n>=0){r[--a]=o[n]}}return r}function je(e,t){var n=e.length,i=-1,a,r;if(t==null){while(++i=a){r=a;while(++ia){r=a}}}}}else{while(++i=a){r=a;while(++ia){r=a}}}}}return r}function O(e,t){var n=e.length,i=-1,a,r=0;if(t==null){while(++i=f.length){if(d!=null)e.sort(d);return g!=null?g(e):e}var t=-1,r=e.length,o=f[n++],s,l,u=E(),h,c=i();while(++tf.length)return e;var i,a=r[n-1];if(g!=null&&n>=f.length)i=e.entries();else i=[],e.each(function(e,t){i.push({key:t,values:o(e,n)})});return a!=null?i.sort(function(e,t){return a(e.key,t.key)}):i}return n={object:function e(t){return p(t,0,v,m)},map:function e(t){return p(t,0,y,_)},entries:function e(t){return o(p(t,0,y,_),0)},key:function e(t){f.push(t);return n},sortKeys:function e(t){r[f.length-1]=t;return n},sortValues:function e(t){d=t;return n},rollup:function e(t){g=t;return n}}}function v(){return{}}function m(e,t,n){e[t]=n}function y(){return E()}function _(e,t,n){e.set(t,n)}function d(){}var g=E.prototype;d.prototype={constructor:d,has:g.has,add:function e(t){t+="";this[r+t]=t;return this},remove:g.remove,clear:g.clear,values:g.keys,size:g.size,empty:g.empty,each:g.each};function p(e){var t=[];for(var n in e){t.push(n)}return t}function b(e){return function(){return e}}function w(){return(Math.random()-.5)*1e-6}function x(e){var t=+this._x.call(null,e),n=+this._y.call(null,e);return A(this.cover(t,n),t,n,e)}function A(e,t,n,i){if(isNaN(t)||isNaN(n))return e;var a,r=e._root,o={data:i},s=e._x0,l=e._y0,u=e._x1,h=e._y1,c,f,d,g,p,v,m,y;if(!r)return e._root=o,e;while(r.length){if(p=t>=(c=(s+u)/2))s=c;else u=c;if(v=n>=(f=(l+h)/2))l=f;else h=f;if(a=r,!(r=r[m=v<<1|p]))return a[m]=o,e}d=+e._x.call(null,r.data);g=+e._y.call(null,r.data);if(t===d&&n===g)return o.next=r,a?a[m]=o:e._root=o,e;do{a=a?a[m]=new Array(4):e._root=new Array(4);if(p=t>=(c=(s+u)/2))s=c;else u=c;if(v=n>=(f=(l+h)/2))l=f;else h=f}while((m=v<<1|p)===(y=(g>=f)<<1|d>=c));return a[y]=r,a[m]=o,e}function R(e){var t,n,i=e.length,a,r,o=new Array(i),s=new Array(i),l=Infinity,u=Infinity,h=-Infinity,c=-Infinity;for(n=0;nh)h=a;if(rc)c=r}if(l>h||u>c)return this;this.cover(l,u).cover(h,c);for(n=0;ne||e>=a||i>t||t>=r){u=(th||(s=g.y0)>c||(l=g.x1)=m)<<1|e>=v){g=f[f.length-1];f[f.length-1]=f[f.length-1-p];f[f.length-1-p]=g}}else{var y=e-+this._x.call(null,d.data),_=t-+this._y.call(null,d.data),b=y*y+_*_;if(b=(f=(o+l)/2))o=f;else l=f;if(p=c>=(d=(s+u)/2))s=d;else u=d;if(!(t=n,n=n[v=p<<1|g]))return this;if(!n.length)break;if(t[v+1&3]||t[v+2&3]||t[v+3&3])i=t,m=v}while(n.data!==e){if(!(a=n,n=n.next))return this}if(r=n.next)delete n.next;if(a)return r?a.next=r:delete a.next,this;if(!t)return this._root=r,this;r?t[v]=r:delete t[v];if((n=t[0]||t[1]||t[2]||t[3])&&n===(t[3]||t[2]||t[1]||t[0])&&!n.length){if(i)i[m]=n;else this._root=n}return this}function z(e){for(var t=0,n=e.length;t=0)t=e.slice(n+1),e=e.slice(0,n);if(e&&!i.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:t}})}ne.prototype=te.prototype={constructor:ne,on:function e(t,n){var i=this._,a=ie(t+"",i),r,o=-1,s=a.length;if(arguments.length<2){while(++o0)for(var i=new Array(r),a=0,r,o;a=0)e._call.call(null,t);e=e._next}--oe}function Ce(){de=(fe=pe.now())+ge;oe=se=0;try{Se()}finally{oe=0;Ae();de=0}}function Ee(){var e=pe.now(),t=e-fe;if(t>ue)ge-=t,fe=e}function Ae(){var e,t=he,n,i=Infinity;while(t){if(t._call){if(i>t._time)i=t._time;e=t,t=t._next}else{n=t._next,t._next=null;t=e?e._next=n:he=n}}ce=e;Re(i)}function Re(e){if(oe)return;if(se)se=clearTimeout(se);var t=e-de;if(t>24){if(e1?(n==null?h.remove(t):h.set(t,d(n)),r):h.get(t)},find:function e(t,n,i){var a=0,r=c.length,o,s,l,u,h;if(i==null)i=Infinity;else i*=i;for(a=0;a1?(i.on(t,n),r):i.on(t)}}}function Oe(){var a,l,u,i=b(-30),h,c=1,f=Infinity,d=.81;function t(e){var t,n=a.length,i=W(a,Te,Be).visitAfter(r);for(u=e,t=0;t=f)return;if(e.data!==l||e.next){if(a===0)a=w(),s+=a*a;if(r===0)r=w(),s+=r*r;if(s1&&Ge(e[n[i-2]],e[n[i-1]],e[a])<=0){--i}n[i++]=a}return n.slice(0,i)}function Ke(e){if((n=e.length)<3)return null;var t,n,i=new Array(n),a=new Array(n);for(t=0;t=0;--t){u.push(e[i[r[t]][2]])}for(t=+s;tr!==s>r&&a<(o-l)*(r-u)/(s-u)+l)h=!h;o=l,s=u}return h}function Ye(e,t){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(t).domain(e);break}return this}function Xe(e,t){switch(arguments.length){case 0:break;case 1:this.interpolator(e);break;default:this.interpolator(t).domain(e);break}return this}var $e=Array.prototype;var Ze=$e.map;var Je=$e.slice;var Qe={name:"implicit"};function et(){var r=E(),o=[],i=[],a=Qe;function s(e){var t=e+"",n=r.get(t);if(!n){if(a!==Qe)return a;r.set(t,n=o.push(e))}return i[(n-1)%i.length]}s.domain=function(e){if(!arguments.length)return o.slice();o=[],r=E();var t=-1,n=e.length,i,a;while(++t>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1)):(t=dt.exec(e))?xt(parseInt(t[1],16)):(t=gt.exec(e))?new Et(t[1],t[2],t[3],1):(t=pt.exec(e))?new Et(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=vt.exec(e))?kt(t[1],t[2],t[3],t[4]):(t=mt.exec(e))?kt(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=yt.exec(e))?Rt(t[1],t[2]/100,t[3]/100,1):(t=_t.exec(e))?Rt(t[1],t[2]/100,t[3]/100,t[4]):bt.hasOwnProperty(e)?xt(bt[e]):e==="transparent"?new Et(NaN,NaN,NaN,0):null}function xt(e){return new Et(e>>16&255,e>>8&255,e&255,1)}function kt(e,t,n,i){if(i<=0)e=t=n=NaN;return new Et(e,t,n,i)}function St(e){if(!(e instanceof ot))e=wt(e);if(!e)return new Et;e=e.rgb();return new Et(e.r,e.g,e.b,e.opacity)}function Ct(e,t,n,i){return arguments.length===1?St(e):new Et(e,t,n,i==null?1:i)}function Et(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}at(Et,Ct,rt(ot,{brighter:function e(t){t=t==null?lt:Math.pow(lt,t);return new Et(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?st:Math.pow(st,t);return new Et(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},hex:function e(){return"#"+At(this.r)+At(this.g)+At(this.b)},toString:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}}));function At(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function Rt(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new Bt(e,t,n,i)}function Mt(e){if(e instanceof Bt)return new Bt(e.h,e.s,e.l,e.opacity);if(!(e instanceof ot))e=wt(e);if(!e)return new Bt;if(e instanceof Bt)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new Bt(o,s,l,e.opacity)}function Tt(e,t,n,i){return arguments.length===1?Mt(e):new Bt(e,t,n,i==null?1:i)}function Bt(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}at(Bt,Tt,rt(ot,{brighter:function e(t){t=t==null?lt:Math.pow(lt,t);return new Bt(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?st:Math.pow(st,t);return new Bt(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new Et(Nt(t>=240?t-240:t+120,r,a),Nt(t,r,a),Nt(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));function Nt(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}var Pt=Math.PI/180;var Dt=180/Math.PI;var Ot=18,zt=.96422,Ft=1,Lt=.82521,It=4/29,jt=6/29,Ht=3*jt*jt,Vt=jt*jt*jt;function Gt(e){if(e instanceof Wt)return new Wt(e.l,e.a,e.b,e.opacity);if(e instanceof Jt){if(isNaN(e.h))return new Wt(e.l,0,0,e.opacity);var t=e.h*Pt;return new Wt(e.l,Math.cos(t)*e.c,Math.sin(t)*e.c,e.opacity)}if(!(e instanceof Et))e=St(e);var n=Xt(e.r),i=Xt(e.g),a=Xt(e.b),r=Kt((.2225045*n+.7168786*i+.0606169*a)/Ft),o,s;if(n===i&&i===a)o=s=r;else{o=Kt((.4360747*n+.3850649*i+.1430804*a)/zt);s=Kt((.0139322*n+.0971045*i+.7141733*a)/Lt)}return new Wt(116*r-16,500*(o-r),200*(r-s),e.opacity)}function Ut(e,t,n,i){return arguments.length===1?Gt(e):new Wt(e,t,n,i==null?1:i)}function Wt(e,t,n,i){this.l=+e;this.a=+t;this.b=+n;this.opacity=+i}at(Wt,Ut,rt(ot,{brighter:function e(t){return new Wt(this.l+Ot*(t==null?1:t),this.a,this.b,this.opacity)},darker:function e(t){return new Wt(this.l-Ot*(t==null?1:t),this.a,this.b,this.opacity)},rgb:function e(){var t=(this.l+16)/116,n=isNaN(this.a)?t:t+this.a/500,i=isNaN(this.b)?t:t-this.b/200;n=zt*qt(n);t=Ft*qt(t);i=Lt*qt(i);return new Et(Yt(3.1338561*n-1.6168667*t-.4906146*i),Yt(-.9787684*n+1.9161415*t+.033454*i),Yt(.0719453*n-.2289914*t+1.4052427*i),this.opacity)}}));function Kt(e){return e>Vt?Math.pow(e,1/3):e/Ht+It}function qt(e){return e>jt?e*e*e:Ht*(e-It)}function Yt(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function Xt(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function $t(e){if(e instanceof Jt)return new Jt(e.h,e.c,e.l,e.opacity);if(!(e instanceof Wt))e=Gt(e);if(e.a===0&&e.b===0)return new Jt(NaN,0,e.l,e.opacity);var t=Math.atan2(e.b,e.a)*Dt;return new Jt(t<0?t+360:t,Math.sqrt(e.a*e.a+e.b*e.b),e.l,e.opacity)}function Zt(e,t,n,i){return arguments.length===1?$t(e):new Jt(e,t,n,i==null?1:i)}function Jt(e,t,n,i){this.h=+e;this.c=+t;this.l=+n;this.opacity=+i}at(Jt,Zt,rt(ot,{brighter:function e(t){return new Jt(this.h,this.c,this.l+Ot*(t==null?1:t),this.opacity)},darker:function e(t){return new Jt(this.h,this.c,this.l-Ot*(t==null?1:t),this.opacity)},rgb:function e(){return Gt(this).rgb()}}));var Qt=-.14861,en=+1.78277,tn=-.29227,nn=-.90649,an=+1.97294,rn=an*nn,on=an*en,sn=en*tn-nn*Qt;function ln(e){if(e instanceof hn)return new hn(e.h,e.s,e.l,e.opacity);if(!(e instanceof Et))e=St(e);var t=e.r/255,n=e.g/255,i=e.b/255,a=(sn*i+rn*t-on*n)/(sn+rn-on),r=i-a,o=(an*(n-a)-tn*r)/nn,s=Math.sqrt(o*o+r*r)/(an*a*(1-a)),l=s?Math.atan2(o,r)*Dt-120:NaN;return new hn(l<0?l+360:l,s,a,e.opacity)}function un(e,t,n,i){return arguments.length===1?ln(e):new hn(e,t,n,i==null?1:i)}function hn(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}at(hn,un,rt(ot,{brighter:function e(t){t=t==null?lt:Math.pow(lt,t);return new hn(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?st:Math.pow(st,t);return new hn(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=isNaN(this.h)?0:(this.h+120)*Pt,n=+this.l,i=isNaN(this.s)?0:this.s*n*(1-n),a=Math.cos(t),r=Math.sin(t);return new Et(255*(n+i*(Qt*a+en*r)),255*(n+i*(tn*a+nn*r)),255*(n+i*(an*a)),this.opacity)}}));function cn(e){return function(){return e}}function fn(t,n){return function(e){return t+e*n}}function dn(t,n,i){return t=Math.pow(t,i),n=Math.pow(n,i)-t,i=1/i,function(e){return Math.pow(t+e*n,i)}}function gn(n){return(n=+n)===1?pn:function(e,t){return t-e?dn(e,t,n):cn(isNaN(e)?t:e)}}function pn(e,t){var n=t-e;return n?fn(e,n):cn(isNaN(e)?t:e)}var vn=function e(t){var o=gn(t);function n(t,e){var n=o((t=Ct(t)).r,(e=Ct(e)).r),i=o(t.g,e.g),a=o(t.b,e.b),r=pn(t.opacity,e.opacity);return function(e){t.r=n(e);t.g=i(e);t.b=a(e);t.opacity=r(e);return t+""}}n.gamma=e;return n}(1);function mn(e,t){var n=t?t.length:0,i=e?Math.min(n,e.length):0,a=new Array(i),r=new Array(n),o;for(o=0;ot){r=i.slice(t,r);if(s[o])s[o]+=r;else s[++o]=r}if((n=n[0])===(a=a[0])){if(s[o])s[o]+=a;else s[++o]=a}else{s[++o]=null;l.push({i:o,x:_n(n,a)})}t=xn.lastIndex}if(t180)t+=360;else if(t-e>180)e+=360;i.push({i:n.push(u(n)+"rotate(",null,a)-2,x:_n(e,t)})}else if(t){n.push(u(n)+"rotate("+t+a)}}function h(e,t,n,i){if(e!==t){i.push({i:n.push(u(n)+"skewX(",null,a)-2,x:_n(e,t)})}else if(t){n.push(u(n)+"skewX("+t+a)}}function c(e,t,n,i,a,r){if(e!==n||t!==i){var o=a.push(u(a)+"scale(",null,",",null,")");r.push({i:o-4,x:_n(e,n)},{i:o-2,x:_n(t,i)})}else if(n!==1||i!==1){a.push(u(a)+"scale("+n+","+i+")")}}return function(e,t){var a=[],r=[];e=n(e),t=n(t);i(e.translateX,e.translateY,t.translateX,t.translateY,a,r);o(e.rotate,t.rotate,a,r);h(e.skewX,t.skewX,a,r);c(e.scaleX,e.scaleY,t.scaleX,t.scaleY,a,r);e=t=null;return function(e){var t=-1,n=r.length,i;while(++tn)i=t,t=n,n=i;return function(e){return Math.max(t,Math.min(n,e))}}function ei(e,t,n){var i=e[0],a=e[1],r=t[0],o=t[1];if(a2?ti:ei;u=h=null;return f}function f(e){return isNaN(e=+e)?o:(u||(u=l(t.map(a),n,i)))(a(s(e)))}f.invert=function(e){return s(r((h||(h=l(n,t.map(a),_n)))(e)))};f.domain=function(e){return arguments.length?(t=Ze.call(e,Xn),s===Zn||(s=Qn(t)),c()):t.slice()};f.range=function(e){return arguments.length?(n=Je.call(e),c()):n.slice()};f.rangeRound=function(e){return n=Je.call(e),i=An,c()};f.clamp=function(e){return arguments.length?(s=e?Qn(t):Zn,f):s!==Zn};f.interpolate=function(e){return arguments.length?(i=e,c()):i};f.unknown=function(e){return arguments.length?(o=e,f):o};return function(e,t){a=e,r=t;return c()}}function ai(e,t){return ii()(e,t)}function ri(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function oi(e,t){if((n=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var n,i=e.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+e.slice(n+1)]}function si(e){return e=oi(Math.abs(e)),e?e[1]:NaN}function li(s,l){return function(e,t){var n=e.length,i=[],a=0,r=s[0],o=0;while(n>0&&r>0){if(o+r+1>t)r=Math.max(1,t-o);i.push(e.substring(n-=r,n+r));if((o+=r+1)>t)break;r=s[a=(a+1)%s.length]}return i.reverse().join(l)}}function ui(t){return function(e){return e.replace(/[0-9]/g,function(e){return t[+e]})}}var hi=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ci(e){if(!(t=hi.exec(e)))throw new Error("invalid format: "+e);var t;return new fi({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}ci.prototype=fi.prototype;function fi(e){this.fill=e.fill===undefined?" ":e.fill+"";this.align=e.align===undefined?">":e.align+"";this.sign=e.sign===undefined?"-":e.sign+"";this.symbol=e.symbol===undefined?"":e.symbol+"";this.zero=!!e.zero;this.width=e.width===undefined?undefined:+e.width;this.comma=!!e.comma;this.precision=e.precision===undefined?undefined:+e.precision;this.trim=!!e.trim;this.type=e.type===undefined?"":e.type+""}fi.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===undefined?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===undefined?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function di(e){e:for(var t=e.length,n=1,i=-1,a;n0)i=0;break}}return i>0?e.slice(0,i)+e.slice(a+1):e}var gi;function pi(e,t){var n=oi(e,t);if(!n)return e+"";var i=n[0],a=n[1],r=a-(gi=Math.max(-8,Math.min(8,Math.floor(a/3)))*3)+1,o=i.length;return r===o?i:r>o?i+new Array(r-o+1).join("0"):r>0?i.slice(0,r)+"."+i.slice(r):"0."+new Array(1-r).join("0")+oi(e,Math.max(0,t+r-1))[0]}function vi(e,t){var n=oi(e,t);if(!n)return e+"";var i=n[0],a=n[1];return a<0?"0."+new Array(-a).join("0")+i:i.length>a+1?i.slice(0,a+1)+"."+i.slice(a+1):i+new Array(a-i.length+2).join("0")}var mi={"%":function e(t,n){return(t*100).toFixed(n)},b:function e(t){return Math.round(t).toString(2)},c:function e(t){return t+""},d:ri,e:function e(t,n){return t.toExponential(n)},f:function e(t,n){return t.toFixed(n)},g:function e(t,n){return t.toPrecision(n)},o:function e(t){return Math.round(t).toString(8)},p:function e(t,n){return vi(t*100,n)},r:vi,s:pi,X:function e(t){return Math.round(t).toString(16).toUpperCase()},x:function e(t){return Math.round(t).toString(16)}};function yi(e){return e}var _i=Array.prototype.map,bi=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function wi(e){var x=e.grouping===undefined||e.thousands===undefined?yi:li(_i.call(e.grouping,Number),e.thousands+""),i=e.currency===undefined?"":e.currency[0]+"",a=e.currency===undefined?"":e.currency[1]+"",k=e.decimal===undefined?".":e.decimal+"",S=e.numerals===undefined?yi:ui(_i.call(e.numerals,String)),r=e.percent===undefined?"%":e.percent+"",C=e.minus===undefined?"-":e.minus+"",E=e.nan===undefined?"NaN":e.nan+"";function o(e){e=ci(e);var u=e.fill,h=e.align,c=e.sign,t=e.symbol,f=e.zero,d=e.width,g=e.comma,p=e.precision,v=e.trim,m=e.type;if(m==="n")g=true,m="g";else if(!mi[m])p===undefined&&(p=12),v=true,m="g";if(f||u==="0"&&h==="=")f=true,u="0",h="=";var y=t==="$"?i:t==="#"&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",_=t==="$"?a:/[%p]/.test(m)?r:"";var b=mi[m],w=/[defgprs%]/.test(m);p=p===undefined?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p));function n(e){var t=y,n=_,i,a,r;if(m==="c"){n=b(e)+n;e=""}else{e=+e;var o=e<0||1/e<0;e=isNaN(e)?E:b(Math.abs(e),p);if(v)e=di(e);if(o&&+e===0&&c!=="+")o=false;t=(o?c==="("?c:C:c==="-"||c==="("?"":c)+t;n=(m==="s"?bi[8+gi/3]:"")+n+(o&&c==="("?")":"");if(w){i=-1,a=e.length;while(++ir||r>57){n=(r===46?k+e.slice(i+1):e.slice(i))+n;e=e.slice(0,i);break}}}}if(g&&!f)e=x(e,Infinity);var s=t.length+e.length+n.length,l=s>1)+t+e+n+l.slice(s);break;default:e=l+t+e+n;break}return S(e)}n.toString=function(){return e+""};return n}function t(e,t){var n=o((e=ci(e),e.type="f",e)),i=Math.max(-8,Math.min(8,Math.floor(si(t)/3)))*3,a=Math.pow(10,-i),r=bi[8+i/3];return function(e){return n(a*e)+r}}return{format:o,formatPrefix:t}}var xi;var ki;var Si;Ci({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"});function Ci(e){xi=wi(e);ki=xi.format;Si=xi.formatPrefix;return xi}function Ei(e){return Math.max(0,-si(Math.abs(e)))}function Ai(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(si(t)/3)))*3-si(Math.abs(e)))}function Ri(e,t){e=Math.abs(e),t=Math.abs(t)-e;return Math.max(0,si(t)-si(e))+1}function Mi(e,t,n,i){var a=C(e,t,n),r;i=ci(i==null?",f":i);switch(i.type){case"s":{var o=Math.max(Math.abs(e),Math.abs(t));if(i.precision==null&&!isNaN(r=Ai(a,o)))i.precision=r;return Si(i,o)}case"":case"e":case"g":case"p":case"r":{if(i.precision==null&&!isNaN(r=Ri(a,Math.max(Math.abs(e),Math.abs(t)))))i.precision=r-(i.type==="e");break}case"f":case"%":{if(i.precision==null&&!isNaN(r=Ei(a)))i.precision=r-(i.type==="%")*2;break}}return ki(i)}function Ti(s){var l=s.domain;s.ticks=function(e){var t=l();return ve(t[0],t[t.length-1],e==null?10:e)};s.tickFormat=function(e,t){var n=l();return Mi(n[0],n[n.length-1],e==null?10:e,t)};s.nice=function(e){if(e==null)e=10;var t=l(),n=0,i=t.length-1,a=t[n],r=t[i],o;if(r0){a=Math.floor(a/o)*o;r=Math.ceil(r/o)*o;o=c(a,r,e)}else if(o<0){a=Math.ceil(a*o)/o;r=Math.floor(r*o)/o;o=c(a,r,e)}if(o>0){t[n]=Math.floor(a/o)*o;t[i]=Math.ceil(r/o)*o;l(t)}else if(o<0){t[n]=Math.ceil(a*o)/o;t[i]=Math.floor(r*o)/o;l(t)}return s};return s}function Bi(){var e=ai(Zn,Zn);e.copy=function(){return ni(e,Bi())};Ye.apply(e,arguments);return Ti(e)}function Ni(t){var n;function i(e){return isNaN(e=+e)?n:e}i.invert=i;i.domain=i.range=function(e){return arguments.length?(t=Ze.call(e,Xn),i):t.slice()};i.unknown=function(e){return arguments.length?(n=e,i):n};i.copy=function(){return Ni(t).unknown(n)};t=arguments.length?Ze.call(t,Xn):[0,1];return Ti(i)}function Pi(e,t){e=e.slice();var n=0,i=e.length-1,a=e[n],r=e[i],o;if(r0)for(;ri)break;c.push(u)}}else for(;r=1;--l){u=s*l;if(ui)break;c.push(u)}}}else{c=ve(r,o,Math.min(o-r,h)).map(p)}return a?c.reverse():c};t.tickFormat=function(e,n){if(n==null)n=d===10?".0e":",";if(typeof n!=="function")n=ki(n);if(e===Infinity)return n;if(e==null)e=10;var i=Math.max(1,d*e/t.ticks().length);return function(e){var t=e/p(Math.round(g(e)));if(t*d0?i[t-1]:a[0],t=a?[r[a-1],i]:[r[t-1],r[t]]};s.unknown=function(e){return arguments.length?(t=e,s):s};s.thresholds=function(){return r.slice()};s.copy=function(){return ta().domain([n,i]).range(o).unknown(t)};return Ye.apply(Ti(s),arguments)}function na(){var n=[.5],i=[0,1],t,a=1;function r(e){return e<=e?i[u(n,e,0,a)]:t}r.domain=function(e){return arguments.length?(n=Je.call(e),a=Math.min(n.length,i.length-1),r):n.slice()};r.range=function(e){return arguments.length?(i=Je.call(e),a=Math.min(n.length,i.length-1),r):i.slice()};r.invertExtent=function(e){var t=i.indexOf(e);return[n[t-1],n[t]]};r.unknown=function(e){return arguments.length?(t=e,r):t};r.copy=function(){return na().domain(n).range(i).unknown(t)};return Ye.apply(r,arguments)}var ia=new Date,aa=new Date;function ra(r,o,n,i){function s(e){return r(e=new Date(+e)),e}s.floor=s;s.ceil=function(e){return r(e=new Date(e-1)),o(e,1),r(e),e};s.round=function(e){var t=s(e),n=s.ceil(e);return e-t0))return i;do{i.push(a=new Date(+e)),o(e,n),r(e)}while(a=e)while(r(e),!n(e)){e.setTime(e-1)}},function(e,t){if(e>=e){if(t<0)while(++t<=0){while(o(e,-1),!n(e)){}}else while(--t>=0){while(o(e,+1),!n(e)){}}}})};if(n){s.count=function(e,t){ia.setTime(+e),aa.setTime(+t);r(ia),r(aa);return Math.floor(n(ia,aa))};s.every=function(t){t=Math.floor(t);return!isFinite(t)||!(t>0)?null:!(t>1)?s:s.filter(i?function(e){return i(e)%t===0}:function(e){return s.count(0,e)%t===0})}}return s}var oa=ra(function(){},function(e,t){e.setTime(+e+t)},function(e,t){return t-e});oa.every=function(n){n=Math.floor(n);if(!isFinite(n)||!(n>0))return null;if(!(n>1))return oa;return ra(function(e){e.setTime(Math.floor(e/n)*n)},function(e,t){e.setTime(+e+t*n)},function(e,t){return(t-e)/n})};var sa=1e3;var la=6e4;var ua=36e5;var ha=864e5;var ca=6048e5;var fa=ra(function(e){e.setTime(Math.floor(e/sa)*sa)},function(e,t){e.setTime(+e+t*sa)},function(e,t){return(t-e)/sa},function(e){return e.getUTCSeconds()});var da=ra(function(e){e.setTime(Math.floor(e/la)*la)},function(e,t){e.setTime(+e+t*la)},function(e,t){return(t-e)/la},function(e){return e.getMinutes()});var ga=ra(function(e){var t=e.getTimezoneOffset()*la%ua;if(t<0)t+=ua;e.setTime(Math.floor((+e-t)/ua)*ua+t)},function(e,t){e.setTime(+e+t*ua)},function(e,t){return(t-e)/ua},function(e){return e.getHours()});var pa=ra(function(e){e.setHours(0,0,0,0)},function(e,t){e.setDate(e.getDate()+t)},function(e,t){return(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*la)/ha},function(e){return e.getDate()-1});function va(t){return ra(function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7);e.setHours(0,0,0,0)},function(e,t){e.setDate(e.getDate()+t*7)},function(e,t){return(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*la)/ca})}var ma=va(0);var ya=va(1);var _a=va(2);var ba=va(3);var wa=va(4);var xa=va(5);var ka=va(6);var Sa=ra(function(e){e.setDate(1);e.setHours(0,0,0,0)},function(e,t){e.setMonth(e.getMonth()+t)},function(e,t){return t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12},function(e){return e.getMonth()});var Ca=ra(function(e){e.setMonth(0,1);e.setHours(0,0,0,0)},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e,t){return t.getFullYear()-e.getFullYear()},function(e){return e.getFullYear()});Ca.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:ra(function(e){e.setFullYear(Math.floor(e.getFullYear()/n)*n);e.setMonth(0,1);e.setHours(0,0,0,0)},function(e,t){e.setFullYear(e.getFullYear()+t*n)})};var Ea=ra(function(e){e.setUTCSeconds(0,0)},function(e,t){e.setTime(+e+t*la)},function(e,t){return(t-e)/la},function(e){return e.getUTCMinutes()});var Aa=ra(function(e){e.setUTCMinutes(0,0,0)},function(e,t){e.setTime(+e+t*ua)},function(e,t){return(t-e)/ua},function(e){return e.getUTCHours()});var Ra=ra(function(e){e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+t)},function(e,t){return(t-e)/ha},function(e){return e.getUTCDate()-1});function Ma(t){return ra(function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+t*7)},function(e,t){return(t-e)/ca})}var Ta=Ma(0);var Ba=Ma(1);var Na=Ma(2);var Pa=Ma(3);var Da=Ma(4);var Oa=Ma(5);var za=Ma(6);var Fa=ra(function(e){e.setUTCDate(1);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCMonth(e.getUTCMonth()+t)},function(e,t){return t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12},function(e){return e.getUTCMonth()});var La=ra(function(e){e.setUTCMonth(0,1);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCFullYear(e.getUTCFullYear()+t)},function(e,t){return t.getUTCFullYear()-e.getUTCFullYear()},function(e){return e.getUTCFullYear()});La.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:ra(function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/n)*n);e.setUTCMonth(0,1);e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCFullYear(e.getUTCFullYear()+t*n)})};function Ia(e){if(0<=e.y&&e.y<100){var t=new Date(-1,e.m,e.d,e.H,e.M,e.S,e.L);t.setFullYear(e.y);return t}return new Date(e.y,e.m,e.d,e.H,e.M,e.S,e.L)}function ja(e){if(0<=e.y&&e.y<100){var t=new Date(Date.UTC(-1,e.m,e.d,e.H,e.M,e.S,e.L));t.setUTCFullYear(e.y);return t}return new Date(Date.UTC(e.y,e.m,e.d,e.H,e.M,e.S,e.L))}function Ha(e,t,n){return{y:e,m:t,d:n,H:0,M:0,S:0,L:0}}function Va(e){var i=e.dateTime,a=e.date,r=e.time,t=e.periods,n=e.days,o=e.shortDays,s=e.months,l=e.shortMonths;var u=Xa(t),h=$a(t),c=Xa(n),f=$a(n),d=Xa(o),g=$a(o),p=Xa(s),v=$a(s),m=Xa(l),y=$a(l);var _={a:P,A:D,b:O,B:z,c:null,d:mr,e:mr,f:xr,g:Pr,G:Or,H:yr,I:_r,j:br,L:wr,m:kr,M:Sr,p:F,q:L,Q:ao,s:ro,S:Cr,u:Er,U:Ar,V:Mr,w:Tr,W:Br,x:null,X:null,y:Nr,Y:Dr,Z:zr,"%":io};var b={a:I,A:j,b:H,B:V,c:null,d:Fr,e:Fr,f:Vr,g:Qr,G:to,H:Lr,I:Ir,j:jr,L:Hr,m:Gr,M:Ur,p:G,q:U,Q:ao,s:ro,S:Wr,u:Kr,U:qr,V:Xr,w:$r,W:Zr,x:null,X:null,y:Jr,Y:eo,Z:no,"%":io};var w={a:E,A:A,b:R,B:M,c:T,d:sr,e:sr,f:dr,g:ir,G:nr,H:ur,I:ur,j:lr,L:fr,m:or,M:hr,p:C,q:rr,Q:pr,s:vr,S:cr,u:Ja,U:Qa,V:er,w:Za,W:tr,x:B,X:N,y:ir,Y:nr,Z:ar,"%":gr};_.x=x(a,_);_.X=x(r,_);_.c=x(i,_);b.x=x(a,b);b.X=x(r,b);b.c=x(i,b);function x(l,u){return function(e){var t=[],n=-1,i=0,a=l.length,r,o,s;if(!(e instanceof Date))e=new Date(+e);while(++n53)return null;if(!("w"in t))t.w=1;if("Z"in t){i=ja(Ha(t.y,0,1)),a=i.getUTCDay();i=a>4||a===0?Ba.ceil(i):Ba(i);i=Ra.offset(i,(t.V-1)*7);t.y=i.getUTCFullYear();t.m=i.getUTCMonth();t.d=i.getUTCDate()+(t.w+6)%7}else{i=Ia(Ha(t.y,0,1)),a=i.getDay();i=a>4||a===0?ya.ceil(i):ya(i);i=pa.offset(i,(t.V-1)*7);t.y=i.getFullYear();t.m=i.getMonth();t.d=i.getDate()+(t.w+6)%7}}else if("W"in t||"U"in t){if(!("w"in t))t.w="u"in t?t.u%7:"W"in t?1:0;a="Z"in t?ja(Ha(t.y,0,1)).getUTCDay():Ia(Ha(t.y,0,1)).getDay();t.m=0;t.d="W"in t?(t.w+6)%7+t.W*7-(a+5)%7:t.w+t.U*7-(a+6)%7}if("Z"in t){t.H+=t.Z/100|0;t.M+=t.Z%100;return ja(t)}return Ia(t)}}function S(e,t,n,i){var a=0,r=t.length,o=n.length,s,l;while(a=o)return-1;s=t.charCodeAt(a++);if(s===37){s=t.charAt(a++);l=w[s in Ga?t.charAt(a++):s];if(!l||(i=l(e,n,i))<0)return-1}else if(s!=n.charCodeAt(i++)){return-1}}return i}function C(e,t,n){var i=u.exec(t.slice(n));return i?(e.p=h[i[0].toLowerCase()],n+i[0].length):-1}function E(e,t,n){var i=d.exec(t.slice(n));return i?(e.w=g[i[0].toLowerCase()],n+i[0].length):-1}function A(e,t,n){var i=c.exec(t.slice(n));return i?(e.w=f[i[0].toLowerCase()],n+i[0].length):-1}function R(e,t,n){var i=m.exec(t.slice(n));return i?(e.m=y[i[0].toLowerCase()],n+i[0].length):-1}function M(e,t,n){var i=p.exec(t.slice(n));return i?(e.m=v[i[0].toLowerCase()],n+i[0].length):-1}function T(e,t,n){return S(e,i,t,n)}function B(e,t,n){return S(e,a,t,n)}function N(e,t,n){return S(e,r,t,n)}function P(e){return o[e.getDay()]}function D(e){return n[e.getDay()]}function O(e){return l[e.getMonth()]}function z(e){return s[e.getMonth()]}function F(e){return t[+(e.getHours()>=12)]}function L(e){return 1+~~(e.getMonth()/3)}function I(e){return o[e.getUTCDay()]}function j(e){return n[e.getUTCDay()]}function H(e){return l[e.getUTCMonth()]}function V(e){return s[e.getUTCMonth()]}function G(e){return t[+(e.getUTCHours()>=12)]}function U(e){return 1+~~(e.getUTCMonth()/3)}return{format:function e(t){var n=x(t+="",_);n.toString=function(){return t};return n},parse:function e(t){var n=k(t+="",false);n.toString=function(){return t};return n},utcFormat:function e(t){var n=x(t+="",b);n.toString=function(){return t};return n},utcParse:function e(t){var n=k(t+="",true);n.toString=function(){return t};return n}}}var Ga={"-":"",_:" ",0:"0"},Ua=/^\s*\d+/,Wa=/^%/,Ka=/[\\^$*+?|[\]().{}]/g;function qa(e,t,n){var i=e<0?"-":"",a=(i?-e:e)+"",r=a.length;return i+(r68?1900:2e3),n+i[0].length):-1}function ar(e,t,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(n,n+6));return i?(e.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function rr(e,t,n){var i=Ua.exec(t.slice(n,n+1));return i?(e.q=i[0]*3-3,n+i[0].length):-1}function or(e,t,n){var i=Ua.exec(t.slice(n,n+2));return i?(e.m=i[0]-1,n+i[0].length):-1}function sr(e,t,n){var i=Ua.exec(t.slice(n,n+2));return i?(e.d=+i[0],n+i[0].length):-1}function lr(e,t,n){var i=Ua.exec(t.slice(n,n+3));return i?(e.m=0,e.d=+i[0],n+i[0].length):-1}function ur(e,t,n){var i=Ua.exec(t.slice(n,n+2));return i?(e.H=+i[0],n+i[0].length):-1}function hr(e,t,n){var i=Ua.exec(t.slice(n,n+2));return i?(e.M=+i[0],n+i[0].length):-1}function cr(e,t,n){var i=Ua.exec(t.slice(n,n+2));return i?(e.S=+i[0],n+i[0].length):-1}function fr(e,t,n){var i=Ua.exec(t.slice(n,n+3));return i?(e.L=+i[0],n+i[0].length):-1}function dr(e,t,n){var i=Ua.exec(t.slice(n,n+6));return i?(e.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function gr(e,t,n){var i=Wa.exec(t.slice(n,n+1));return i?n+i[0].length:-1}function pr(e,t,n){var i=Ua.exec(t.slice(n));return i?(e.Q=+i[0],n+i[0].length):-1}function vr(e,t,n){var i=Ua.exec(t.slice(n));return i?(e.s=+i[0],n+i[0].length):-1}function mr(e,t){return qa(e.getDate(),t,2)}function yr(e,t){return qa(e.getHours(),t,2)}function _r(e,t){return qa(e.getHours()%12||12,t,2)}function br(e,t){return qa(1+pa.count(Ca(e),e),t,3)}function wr(e,t){return qa(e.getMilliseconds(),t,3)}function xr(e,t){return wr(e,t)+"000"}function kr(e,t){return qa(e.getMonth()+1,t,2)}function Sr(e,t){return qa(e.getMinutes(),t,2)}function Cr(e,t){return qa(e.getSeconds(),t,2)}function Er(e){var t=e.getDay();return t===0?7:t}function Ar(e,t){return qa(ma.count(Ca(e)-1,e),t,2)}function Rr(e){var t=e.getDay();return t>=4||t===0?wa(e):wa.ceil(e)}function Mr(e,t){e=Rr(e);return qa(wa.count(Ca(e),e)+(Ca(e).getDay()===4),t,2)}function Tr(e){return e.getDay()}function Br(e,t){return qa(ya.count(Ca(e)-1,e),t,2)}function Nr(e,t){return qa(e.getFullYear()%100,t,2)}function Pr(e,t){e=Rr(e);return qa(e.getFullYear()%100,t,2)}function Dr(e,t){return qa(e.getFullYear()%1e4,t,4)}function Or(e,t){var n=e.getDay();e=n>=4||n===0?wa(e):wa.ceil(e);return qa(e.getFullYear()%1e4,t,4)}function zr(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+qa(t/60|0,"0",2)+qa(t%60,"0",2)}function Fr(e,t){return qa(e.getUTCDate(),t,2)}function Lr(e,t){return qa(e.getUTCHours(),t,2)}function Ir(e,t){return qa(e.getUTCHours()%12||12,t,2)}function jr(e,t){return qa(1+Ra.count(La(e),e),t,3)}function Hr(e,t){return qa(e.getUTCMilliseconds(),t,3)}function Vr(e,t){return Hr(e,t)+"000"}function Gr(e,t){return qa(e.getUTCMonth()+1,t,2)}function Ur(e,t){return qa(e.getUTCMinutes(),t,2)}function Wr(e,t){return qa(e.getUTCSeconds(),t,2)}function Kr(e){var t=e.getUTCDay();return t===0?7:t}function qr(e,t){return qa(Ta.count(La(e)-1,e),t,2)}function Yr(e){var t=e.getUTCDay();return t>=4||t===0?Da(e):Da.ceil(e)}function Xr(e,t){e=Yr(e);return qa(Da.count(La(e),e)+(La(e).getUTCDay()===4),t,2)}function $r(e){return e.getUTCDay()}function Zr(e,t){return qa(Ba.count(La(e)-1,e),t,2)}function Jr(e,t){return qa(e.getUTCFullYear()%100,t,2)}function Qr(e,t){e=Yr(e);return qa(e.getUTCFullYear()%100,t,2)}function eo(e,t){return qa(e.getUTCFullYear()%1e4,t,4)}function to(e,t){var n=e.getUTCDay();e=n>=4||n===0?Da(e):Da.ceil(e);return qa(e.getUTCFullYear()%1e4,t,4)}function no(){return"+0000"}function io(){return"%"}function ao(e){return+e}function ro(e){return Math.floor(+e/1e3)}var oo;var so;var lo;uo({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function uo(e){oo=Va(e);so=oo.format;oo.parse;lo=oo.utcFormat;oo.utcParse;return oo}var ho=1e3,co=ho*60,fo=co*60,go=fo*24,po=go*7,vo=go*30,mo=go*365;function yo(e){return new Date(e)}function _o(e){return e instanceof Date?+e:+new Date(+e)}function bo(o,t,n,i,a,r,s,l,u){var h=ai(Zn,Zn),c=h.invert,f=h.domain;var d=u(".%L"),g=u(":%S"),p=u("%I:%M"),v=u("%I %p"),m=u("%a %d"),y=u("%b %d"),_=u("%B"),b=u("%Y");var w=[[s,1,ho],[s,5,5*ho],[s,15,15*ho],[s,30,30*ho],[r,1,co],[r,5,5*co],[r,15,15*co],[r,30,30*co],[a,1,fo],[a,3,3*fo],[a,6,6*fo],[a,12,12*fo],[i,1,go],[i,2,2*go],[n,1,po],[t,1,vo],[t,3,3*vo],[o,1,mo]];function x(e){return(s(e)=0&&(t=e.slice(0,n))!=="xmlns")e=e.slice(n+1);return Io.hasOwnProperty(t)?{space:Io[t],local:e}:e}function Ho(n){return function(){var e=this.ownerDocument,t=this.namespaceURI;return t===Lo&&e.documentElement.namespaceURI===Lo?e.createElement(n):e.createElementNS(t,n)}}function Vo(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Go(e){var t=jo(e);return(t.local?Vo:Ho)(t)}function Uo(){}function Wo(e){return e==null?Uo:function(){return this.querySelector(e)}}function Ko(e){if(typeof e!=="function")e=Wo(e);for(var t=this._groups,n=t.length,i=new Array(n),a=0;a=_)_=y+1;while(!(w=v[_])&&++_=0;){if(o=i[a]){if(r&&o.compareDocumentPosition(r)^4)r.parentNode.insertBefore(o,r);r=o}}}return this}function hs(n){if(!n)n=cs;function e(e,t){return e&&t?n(e.__data__,t.__data__):!e-!t}for(var t=this._groups,i=t.length,a=new Array(i),r=0;rt?1:e>=t?0:NaN}function fs(){var e=arguments[0];arguments[0]=this;e.apply(null,arguments);return this}function ds(){var e=new Array(this.size()),t=-1;this.each(function(){e[++t]=this});return e}function gs(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?Es:typeof t==="function"?Rs:As)(e,t,n==null?"":n)):Ts(this.node(),e)}function Ts(e,t){return e.style.getPropertyValue(t)||Cs(e).getComputedStyle(e,null).getPropertyValue(t)}function Bs(e){return function(){delete this[e]}}function Ns(e,t){return function(){this[e]=t}}function Ps(t,n){return function(){var e=n.apply(this,arguments);if(e==null)delete this[t];else this[t]=e}}function Ds(e,t){return arguments.length>1?this.each((t==null?Bs:typeof t==="function"?Ps:Ns)(e,t)):this.node()[e]}function Os(e){return e.trim().split(/^|\s+/)}function zs(e){return e.classList||new Fs(e)}function Fs(e){this._node=e;this._names=Os(e.getAttribute("class")||"")}Fs.prototype={add:function e(t){var n=this._names.indexOf(t);if(n<0){this._names.push(t);this._node.setAttribute("class",this._names.join(" "))}},remove:function e(t){var n=this._names.indexOf(t);if(n>=0){this._names.splice(n,1);this._node.setAttribute("class",this._names.join(" "))}},contains:function e(t){return this._names.indexOf(t)>=0}};function Ls(e,t){var n=zs(e),i=-1,a=t.length;while(++i=0)t=e.slice(n+1),e=e.slice(0,n);return{type:e,name:t}})}function ml(r){return function(){var e=this.__on;if(!e)return;for(var t=0,n=-1,i=e.length,a;tIl)throw new Error("too late; already scheduled");return n}function Yl(e,t){var n=Xl(e,t);if(n.state>Vl)throw new Error("too late; already running");return n}function Xl(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function $l(r,o,s){var l=r.__transition,u;l[o]=s;s.timer=ke(e,0,s.time);function e(e){s.state=jl;s.timer.restart(h,s.delay,s.time);if(s.delay<=e)h(e-s.delay)}function h(e){var t,n,i,a;if(s.state!==jl)return f();for(t in l){a=l[t];if(a.name!==s.name)continue;if(a.state===Vl)return Me(h);if(a.state===Gl){a.state=Wl;a.timer.stop();a.on.call("interrupt",r,r.__data__,a.index,a.group);delete l[t]}else if(+tHl&&i.state=0)e=e.slice(0,t);return!e||e==="start"})}function Au(n,i,a){var r,o,s=Eu(i)?ql:Yl;return function(){var e=s(this,n),t=e.on;if(t!==r)(o=(r=t).copy()).on(i,a);e.on=o}}function Ru(e,t){var n=this._id;return arguments.length<2?Xl(this.node(),n).on.on(e):this.each(Au(n,e,t))}function Mu(n){return function(){var e=this.parentNode;for(var t in this.__transition){if(+t!==n)return}if(e)e.removeChild(this)}}function Tu(){return this.on("end.remove",Mu(this._id))}function Bu(e){var t=this._name,n=this._id;if(typeof e!=="function")e=Wo(e);for(var i=this._groups,a=i.length,r=new Array(a),o=0;oi?(i+a)/2:Math.min(0,i)||Math.max(0,a),o>r?(r+o)/2:Math.min(0,r)||Math.max(0,o))}function bh(){var s=gh,c=ph,d=_h,r=mh,t=yh,o=[0,Infinity],g=[[-Infinity,-Infinity],[Infinity,Infinity]],l=250,f=qn,n=te("start","zoom","end"),p,u,h=500,v=150,m=0;function y(e){e.property("__zoom",vh).on("wheel.zoom",a).on("mousedown.zoom",S).on("dblclick.zoom",C).filter(t).on("touchstart.zoom",E).on("touchmove.zoom",A).on("touchend.zoom touchcancel.zoom",R).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}y.transform=function(e,t,n){var i=e.selection?e.selection():e;i.property("__zoom",vh);if(e!==i){x(e,t,n)}else{i.interrupt().each(function(){k(this,arguments).start().zoom(null,typeof t==="function"?t.apply(this,arguments):t).end()})}};y.scaleBy=function(e,n,t){y.scaleTo(e,function(){var e=this.__zoom.k,t=typeof n==="function"?n.apply(this,arguments):n;return e*t},t)};y.scaleTo=function(e,r,o){y.transform(e,function(){var e=c.apply(this,arguments),t=this.__zoom,n=o==null?w(e):typeof o==="function"?o.apply(this,arguments):o,i=t.invert(n),a=typeof r==="function"?r.apply(this,arguments):r;return d(b(_(t,a),n,i),e,g)},o)};y.translateBy=function(e,t,n){y.transform(e,function(){return d(this.__zoom.translate(typeof t==="function"?t.apply(this,arguments):t,typeof n==="function"?n.apply(this,arguments):n),c.apply(this,arguments),g)})};y.translateTo=function(e,i,a,r){y.transform(e,function(){var e=c.apply(this,arguments),t=this.__zoom,n=r==null?w(e):typeof r==="function"?r.apply(this,arguments):r;return d(hh.translate(n[0],n[1]).scale(t.k).translate(typeof i==="function"?-i.apply(this,arguments):-i,typeof a==="function"?-a.apply(this,arguments):-a),e,g)},r)};function _(e,t){t=Math.max(o[0],Math.min(o[1],t));return t===e.k?e:new uh(t,e.x,e.y)}function b(e,t,n){var i=t[0]-n[0]*e.k,a=t[1]-n[1]*e.k;return i===e.x&&a===e.y?e:new uh(e.k,i,a)}function w(e){return[(+e[0][0]+ +e[1][0])/2,(+e[0][1]+ +e[1][1])/2]}function x(e,u,h){e.on("start.zoom",function(){k(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){k(this,arguments).end()}).tween("zoom",function(){var e=this,t=arguments,i=k(e,t),n=c.apply(e,t),a=h==null?w(n):typeof h==="function"?h.apply(e,t):h,r=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),o=e.__zoom,s=typeof u==="function"?u.apply(e,t):u,l=f(o.invert(a).concat(r/o.k),s.invert(a).concat(r/s.k));return function(e){if(e===1)e=s;else{var t=l(e),n=r/t[2];e=new uh(n,a[0]-t[0]*n,a[1]-t[1]*n)}i.zoom(null,e)}})}function k(e,t,n){return!n&&e.__zooming||new i(e,t)}function i(e,t){this.that=e;this.args=t;this.active=0;this.extent=c.apply(e,t);this.taps=0}i.prototype={start:function e(){if(++this.active===1){this.that.__zooming=this;this.emit("start")}return this},zoom:function e(t,n){if(this.mouse&&t!=="mouse")this.mouse[1]=n.invert(this.mouse[0]);if(this.touch0&&t!=="touch")this.touch0[1]=n.invert(this.touch0[0]);if(this.touch1&&t!=="touch")this.touch1[1]=n.invert(this.touch1[0]);this.that.__zoom=n;this.emit("zoom");return this},end:function e(){if(--this.active===0){delete this.that.__zooming;this.emit("end")}return this},emit:function e(t){bl(new lh(y,t,this.that.__zoom),n.apply,n,[t,this.that,this.args])}};function a(){if(!s.apply(this,arguments))return;var e=k(this,arguments),t=this.__zoom,n=Math.max(o[0],Math.min(o[1],t.k*Math.pow(2,r.apply(this,arguments)))),i=Bl(this);if(e.wheel){if(e.mouse[0][0]!==i[0]||e.mouse[0][1]!==i[1]){e.mouse[1]=t.invert(e.mouse[0]=i)}clearTimeout(e.wheel)}else if(t.k===n)return;else{e.mouse=[i,t.invert(i)];Zl(this);e.start()}dh();e.wheel=setTimeout(a,v);e.zoom("mouse",d(b(_(t,n),e.mouse[0],e.mouse[1]),e.extent,g));function a(){e.wheel=null;e.end()}}function S(){if(u||!s.apply(this,arguments))return;var n=k(this,arguments,true),e=Rl(fl.view).on("mousemove.zoom",r,true).on("mouseup.zoom",o,true),t=Bl(this),i=fl.clientX,a=fl.clientY;Ol(fl.view);fh();n.mouse=[t,this.__zoom.invert(t)];Zl(this);n.start();function r(){dh();if(!n.moved){var e=fl.clientX-i,t=fl.clientY-a;n.moved=e*e+t*t>m}n.zoom("mouse",d(b(n.that.__zoom,n.mouse[0]=Bl(n.that),n.mouse[1]),n.extent,g))}function o(){e.on("mousemove.zoom mouseup.zoom",null);zl(fl.view,n.moved);dh();n.end()}}function C(){if(!s.apply(this,arguments))return;var e=this.__zoom,t=Bl(this),n=e.invert(t),i=e.k*(fl.shiftKey?.5:2),a=d(b(_(e,i),t,n),c.apply(this,arguments),g);dh();if(l>0)Rl(this).transition().duration(l).call(x,a,t);else Rl(this).call(y.transform,a)}function E(){if(!s.apply(this,arguments))return;var e=fl.touches,t=e.length,n=k(this,arguments,fl.changedTouches.length===t),i,a,r,o;fh();for(a=0;a1&&arguments[1]!==undefined?arguments[1]:{};for(var n in t){if({}.hasOwnProperty.call(t,n))e.attr(n,t[n])}}var Ah={language:"Afar",location:null,id:4096,tag:"aa",version:"Release 10"};var Rh={language:"Afrikaans",location:null,id:54,tag:"af",version:"Release 7"};var Mh={language:"Aghem",location:null,id:4096,tag:"agq",version:"Release 10"};var Th={language:"Akan",location:null,id:4096,tag:"ak",version:"Release 10"};var Bh={language:"Albanian",location:null,id:28,tag:"sq",version:"Release 7"};var Nh={language:"Alsatian",location:null,id:132,tag:"gsw",version:"Release 7"};var Ph={language:"Amharic",location:null,id:94,tag:"am",version:"Release 7"};var Dh={language:"Arabic",location:null,id:1,tag:"ar",version:"Release 7"};var Oh={language:"Armenian",location:null,id:43,tag:"hy",version:"Release 7"};var zh={language:"Assamese",location:null,id:77,tag:"as",version:"Release 7"};var Fh={language:"Asturian",location:null,id:4096,tag:"ast",version:"Release 10"};var Lh={language:"Asu",location:null,id:4096,tag:"asa",version:"Release 10"};var Ih={language:"Azerbaijani (Latin)",location:null,id:44,tag:"az",version:"Release 7"};var jh={language:"Bafia",location:null,id:4096,tag:"ksf",version:"Release 10"};var Hh={language:"Bamanankan",location:null,id:4096,tag:"bm",version:"Release 10"};var Vh={language:"Bangla",location:null,id:69,tag:"bn",version:"Release 7"};var Gh={language:"Basaa",location:null,id:4096,tag:"bas",version:"Release 10"};var Uh={language:"Bashkir",location:null,id:109,tag:"ba",version:"Release 7"};var Wh={language:"Basque",location:null,id:45,tag:"eu",version:"Release 7"};var Kh={language:"Belarusian",location:null,id:35,tag:"be",version:"Release 7"};var qh={language:"Bemba",location:null,id:4096,tag:"bem",version:"Release 10"};var Yh={language:"Bena",location:null,id:4096,tag:"bez",version:"Release 10"};var Xh={language:"Blin",location:null,id:4096,tag:"byn",version:"Release 10"};var $h={language:"Bodo",location:null,id:4096,tag:"brx",version:"Release 10"};var Zh={language:"Bosnian (Latin)",location:null,id:30746,tag:"bs",version:"Release 7"};var Jh={language:"Breton",location:null,id:126,tag:"br",version:"Release 7"};var Qh={language:"Bulgarian",location:null,id:2,tag:"bg",version:"Release 7"};var ec={language:"Burmese",location:null,id:85,tag:"my",version:"Release 8.1"};var tc={language:"Catalan",location:null,id:3,tag:"ca",version:"Release 7"};var nc={language:"Cebuano",location:null,id:4096,tag:"ceb",version:"Release 10.5"};var ic={language:"Central Kurdish",location:null,id:146,tag:"ku",version:"Release 8"};var ac={language:"Chakma",location:null,id:4096,tag:"ccp",version:"Release 10.5"};var rc={language:"Cherokee",location:null,id:92,tag:"chr",version:"Release 8"};var oc={language:"Chiga",location:null,id:4096,tag:"cgg",version:"Release 10"};var sc={language:"Chinese (Simplified)",location:null,id:30724,tag:"zh",version:"Windows 7"};var lc={language:"Congo Swahili",location:null,id:4096,tag:"swc",version:"Release 10"};var uc={language:"Cornish",location:null,id:4096,tag:"kw",version:"Release 10"};var hc={language:"Corsican",location:null,id:131,tag:"co",version:"Release 7"};var cc={language:"Czech",location:null,id:5,tag:"cs",version:"Release 7"};var fc={language:"Danish",location:null,id:6,tag:"da",version:"Release 7"};var dc={language:"Dari",location:null,id:140,tag:"prs",version:"Release 7"};var gc={language:"Divehi",location:null,id:101,tag:"dv",version:"Release 7"};var pc={language:"Duala",location:null,id:4096,tag:"dua",version:"Release 10"};var vc={language:"Dutch",location:null,id:19,tag:"nl",version:"Release 7"};var mc={language:"Dzongkha",location:null,id:4096,tag:"dz",version:"Release 10"};var yc={language:"Embu",location:null,id:4096,tag:"ebu",version:"Release 10"};var _c={language:"English",location:null,id:9,tag:"en",version:"Release 7"};var bc={language:"Esperanto",location:null,id:4096,tag:"eo",version:"Release 10"};var wc={language:"Estonian",location:null,id:37,tag:"et",version:"Release 7"};var xc={language:"Ewe",location:null,id:4096,tag:"ee",version:"Release 10"};var kc={language:"Ewondo",location:null,id:4096,tag:"ewo",version:"Release 10"};var Sc={language:"Faroese",location:null,id:56,tag:"fo",version:"Release 7"};var Cc={language:"Filipino",location:null,id:100,tag:"fil",version:"Release 7"};var Ec={language:"Finnish",location:null,id:11,tag:"fi",version:"Release 7"};var Ac={language:"French",location:null,id:12,tag:"fr",version:"Release 7"};var Rc={language:"Frisian",location:null,id:98,tag:"fy",version:"Release 7"};var Mc={language:"Friulian",location:null,id:4096,tag:"fur",version:"Release 10"};var Tc={language:"Fulah",location:null,id:103,tag:"ff",version:"Release 8"};var Bc={language:"Galician",location:null,id:86,tag:"gl",version:"Release 7"};var Nc={language:"Ganda",location:null,id:4096,tag:"lg",version:"Release 10"};var Pc={language:"Georgian",location:null,id:55,tag:"ka",version:"Release 7"};var Dc={language:"German",location:null,id:7,tag:"de",version:"Release 7"};var Oc={language:"Greek",location:null,id:8,tag:"el",version:"Release 7"};var zc={language:"Greenlandic",location:null,id:111,tag:"kl",version:"Release 7"};var Fc={language:"Guarani",location:null,id:116,tag:"gn",version:"Release 8.1"};var Lc={language:"Gujarati",location:null,id:71,tag:"gu",version:"Release 7"};var Ic={language:"Gusii",location:null,id:4096,tag:"guz",version:"Release 10"};var jc={language:"Hausa (Latin)",location:null,id:104,tag:"ha",version:"Release 7"};var Hc={language:"Hawaiian",location:null,id:117,tag:"haw",version:"Release 8"};var Vc={language:"Hebrew",location:null,id:13,tag:"he",version:"Release 7"};var Gc={language:"Hindi",location:null,id:57,tag:"hi",version:"Release 7"};var Uc={language:"Hungarian",location:null,id:14,tag:"hu",version:"Release 7"};var Wc={language:"Icelandic",location:null,id:15,tag:"is",version:"Release 7"};var Kc={language:"Igbo",location:null,id:112,tag:"ig",version:"Release 7"};var qc={language:"Indonesian",location:null,id:33,tag:"id",version:"Release 7"};var Yc={language:"Interlingua",location:null,id:4096,tag:"ia",version:"Release 10"};var Xc={language:"Inuktitut (Latin)",location:null,id:93,tag:"iu",version:"Release 7"};var $c={language:"Irish",location:null,id:60,tag:"ga",version:"Windows 7"};var Zc={language:"Italian",location:null,id:16,tag:"it",version:"Release 7"};var Jc={language:"Japanese",location:null,id:17,tag:"ja",version:"Release 7"};var Qc={language:"Javanese",location:null,id:4096,tag:"jv",version:"Release 8.1"};var ef={language:"Jola-Fonyi",location:null,id:4096,tag:"dyo",version:"Release 10"};var tf={language:"Kabuverdianu",location:null,id:4096,tag:"kea",version:"Release 10"};var nf={language:"Kabyle",location:null,id:4096,tag:"kab",version:"Release 10"};var af={language:"Kako",location:null,id:4096,tag:"kkj",version:"Release 10"};var rf={language:"Kalenjin",location:null,id:4096,tag:"kln",version:"Release 10"};var of={language:"Kamba",location:null,id:4096,tag:"kam",version:"Release 10"};var sf={language:"Kannada",location:null,id:75,tag:"kn",version:"Release 7"};var lf={language:"Kashmiri",location:null,id:96,tag:"ks",version:"Release 10"};var uf={language:"Kazakh",location:null,id:63,tag:"kk",version:"Release 7"};var hf={language:"Khmer",location:null,id:83,tag:"km",version:"Release 7"};var cf={language:"K'iche",location:null,id:134,tag:"quc",version:"Release 10"};var ff={language:"Kikuyu",location:null,id:4096,tag:"ki",version:"Release 10"};var df={language:"Kinyarwanda",location:null,id:135,tag:"rw",version:"Release 7"};var gf={language:"Kiswahili",location:null,id:65,tag:"sw",version:"Release 7"};var pf={language:"Konkani",location:null,id:87,tag:"kok",version:"Release 7"};var vf={language:"Korean",location:null,id:18,tag:"ko",version:"Release 7"};var mf={language:"Koyra Chiini",location:null,id:4096,tag:"khq",version:"Release 10"};var yf={language:"Koyraboro Senni",location:null,id:4096,tag:"ses",version:"Release 10"};var _f={language:"Kwasio",location:null,id:4096,tag:"nmg",version:"Release 10"};var bf={language:"Kyrgyz",location:null,id:64,tag:"ky",version:"Release 7"};var wf={language:"Lakota",location:null,id:4096,tag:"lkt",version:"Release 10"};var xf={language:"Langi",location:null,id:4096,tag:"lag",version:"Release 10"};var kf={language:"Lao",location:null,id:84,tag:"lo",version:"Release 7"};var Sf={language:"Latvian",location:null,id:38,tag:"lv",version:"Release 7"};var Cf={language:"Lingala",location:null,id:4096,tag:"ln",version:"Release 10"};var Ef={language:"Lithuanian",location:null,id:39,tag:"lt",version:"Release 7"};var Af={language:"Low German",location:null,id:4096,tag:"nds",version:"Release 10.2"};var Rf={language:"Lower Sorbian",location:null,id:31790,tag:"dsb",version:"Windows 7"};var Mf={language:"Luba-Katanga",location:null,id:4096,tag:"lu",version:"Release 10"};var Tf={language:"Luo",location:null,id:4096,tag:"luo",version:"Release 10"};var Bf={language:"Luxembourgish",location:null,id:110,tag:"lb",version:"Release 7"};var Nf={language:"Luyia",location:null,id:4096,tag:"luy",version:"Release 10"};var Pf={language:"Macedonian",location:null,id:47,tag:"mk",version:"Release 7"};var Df={language:"Machame",location:null,id:4096,tag:"jmc",version:"Release 10"};var Of={language:"Makhuwa-Meetto",location:null,id:4096,tag:"mgh",version:"Release 10"};var zf={language:"Makonde",location:null,id:4096,tag:"kde",version:"Release 10"};var Ff={language:"Malagasy",location:null,id:4096,tag:"mg",version:"Release 8.1"};var Lf={language:"Malay",location:null,id:62,tag:"ms",version:"Release 7"};var If={language:"Malayalam",location:null,id:76,tag:"ml",version:"Release 7"};var jf={language:"Maltese",location:null,id:58,tag:"mt",version:"Release 7"};var Hf={language:"Manx",location:null,id:4096,tag:"gv",version:"Release 10"};var Vf={language:"Maori",location:null,id:129,tag:"mi",version:"Release 7"};var Gf={language:"Mapudungun",location:null,id:122,tag:"arn",version:"Release 7"};var Uf={language:"Marathi",location:null,id:78,tag:"mr",version:"Release 7"};var Wf={language:"Masai",location:null,id:4096,tag:"mas",version:"Release 10"};var Kf={language:"Meru",location:null,id:4096,tag:"mer",version:"Release 10"};var qf={language:"Meta'",location:null,id:4096,tag:"mgo",version:"Release 10"};var Yf={language:"Mohawk",location:null,id:124,tag:"moh",version:"Release 7"};var Xf={language:"Mongolian (Cyrillic)",location:null,id:80,tag:"mn",version:"Release 7"};var $f={language:"Morisyen",location:null,id:4096,tag:"mfe",version:"Release 10"};var Zf={language:"Mundang",location:null,id:4096,tag:"mua",version:"Release 10"};var Jf={language:"N'ko",location:null,id:4096,tag:"nqo",version:"Release 8.1"};var Qf={language:"Nama",location:null,id:4096,tag:"naq",version:"Release 10"};var ed={language:"Nepali",location:null,id:97,tag:"ne",version:"Release 7"};var td={language:"Ngiemboon",location:null,id:4096,tag:"nnh",version:"Release 10"};var nd={language:"Ngomba",location:null,id:4096,tag:"jgo",version:"Release 10"};var id={language:"North Ndebele",location:null,id:4096,tag:"nd",version:"Release 10"};var ad={language:"Norwegian (Bokmal)",location:null,id:20,tag:"no",version:"Release 7"};var rd={language:"Norwegian (Bokmal)",location:null,id:31764,tag:"nb",version:"Release 7"};var od={language:"Norwegian (Nynorsk)",location:null,id:30740,tag:"nn",version:"Release 7"};var sd={language:"Nuer",location:null,id:4096,tag:"nus",version:"Release 10"};var ld={language:"Nyankole",location:null,id:4096,tag:"nyn",version:"Release 10"};var ud={language:"Occitan",location:null,id:130,tag:"oc",version:"Release 7"};var hd={language:"Odia",location:null,id:72,tag:"or",version:"Release 7"};var cd={language:"Oromo",location:null,id:114,tag:"om",version:"Release 8.1"};var fd={language:"Ossetian",location:null,id:4096,tag:"os",version:"Release 10"};var dd={language:"Pashto",location:null,id:99,tag:"ps",version:"Release 7"};var gd={language:"Persian",location:null,id:41,tag:"fa",version:"Release 7"};var pd={language:"Polish",location:null,id:21,tag:"pl",version:"Release 7"};var vd={language:"Portuguese",location:null,id:22,tag:"pt",version:"Release 7"};var md={language:"Punjabi",location:null,id:70,tag:"pa",version:"Release 7"};var yd={language:"Quechua",location:null,id:107,tag:"quz",version:"Release 7"};var _d={language:"Ripuarian",location:null,id:4096,tag:"ksh",version:"Release 10"};var bd={language:"Romanian",location:null,id:24,tag:"ro",version:"Release 7"};var wd={language:"Romansh",location:null,id:23,tag:"rm",version:"Release 7"};var xd={language:"Rombo",location:null,id:4096,tag:"rof",version:"Release 10"};var kd={language:"Rundi",location:null,id:4096,tag:"rn",version:"Release 10"};var Sd={language:"Russian",location:null,id:25,tag:"ru",version:"Release 7"};var Cd={language:"Rwa",location:null,id:4096,tag:"rwk",version:"Release 10"};var Ed={language:"Saho",location:null,id:4096,tag:"ssy",version:"Release 10"};var Ad={language:"Sakha",location:null,id:133,tag:"sah",version:"Release 7"};var Rd={language:"Samburu",location:null,id:4096,tag:"saq",version:"Release 10"};var Md={language:"Sami (Inari)",location:null,id:28731,tag:"smn",version:"Windows 7"};var Td={language:"Sami (Lule)",location:null,id:31803,tag:"smj",version:"Windows 7"};var Bd={language:"Sami (Northern)",location:null,id:59,tag:"se",version:"Release 7"};var Nd={language:"Sami (Skolt)",location:null,id:29755,tag:"sms",version:"Windows 7"};var Pd={language:"Sami (Southern)",location:null,id:30779,tag:"sma",version:"Windows 7"};var Dd={language:"Sango",location:null,id:4096,tag:"sg",version:"Release 10"};var Od={language:"Sangu",location:null,id:4096,tag:"sbp",version:"Release 10"};var zd={language:"Sanskrit",location:null,id:79,tag:"sa",version:"Release 7"};var Fd={language:"Scottish Gaelic",location:null,id:145,tag:"gd",version:"Windows 7"};var Ld={language:"Sena",location:null,id:4096,tag:"seh",version:"Release 10"};var Id={language:"Serbian (Latin)",location:null,id:31770,tag:"sr",version:"Release 7"};var jd={language:"Sesotho sa Leboa",location:null,id:108,tag:"nso",version:"Release 7"};var Hd={language:"Setswana",location:null,id:50,tag:"tn",version:"Release 7"};var Vd={language:"Shambala",location:null,id:4096,tag:"ksb",version:"Release 10"};var Gd={language:"Shona",location:null,id:4096,tag:"sn",version:"Release 8.1"};var Ud={language:"Sindhi",location:null,id:89,tag:"sd",version:"Release 8"};var Wd={language:"Sinhala",location:null,id:91,tag:"si",version:"Release 7"};var Kd={language:"Slovak",location:null,id:27,tag:"sk",version:"Release 7"};var qd={language:"Slovenian",location:null,id:36,tag:"sl",version:"Release 7"};var Yd={language:"Soga",location:null,id:4096,tag:"xog",version:"Release 10"};var Xd={language:"Somali",location:null,id:119,tag:"so",version:"Release 8.1"};var $d={language:"Sotho",location:null,id:48,tag:"st",version:"Release 8.1"};var Zd={language:"South Ndebele",location:null,id:4096,tag:"nr",version:"Release 10"};var Jd={language:"Spanish",location:null,id:10,tag:"es",version:"Release 7"};var Qd={language:"Standard Moroccan Tamazight",location:null,id:4096,tag:"zgh",version:"Release 8.1"};var eg={language:"Swati",location:null,id:4096,tag:"ss",version:"Release 10"};var tg={language:"Swedish",location:null,id:29,tag:"sv",version:"Release 7"};var ng={language:"Syriac",location:null,id:90,tag:"syr",version:"Release 7"};var ig={language:"Tachelhit",location:null,id:4096,tag:"shi",version:"Release 10"};var ag={language:"Taita",location:null,id:4096,tag:"dav",version:"Release 10"};var rg={language:"Tajik (Cyrillic)",location:null,id:40,tag:"tg",version:"Release 7"};var og={language:"Tamazight (Latin)",location:null,id:95,tag:"tzm",version:"Release 7"};var sg={language:"Tamil",location:null,id:73,tag:"ta",version:"Release 7"};var lg={language:"Tasawaq",location:null,id:4096,tag:"twq",version:"Release 10"};var ug={language:"Tatar",location:null,id:68,tag:"tt",version:"Release 7"};var hg={language:"Telugu",location:null,id:74,tag:"te",version:"Release 7"};var cg={language:"Teso",location:null,id:4096,tag:"teo",version:"Release 10"};var fg={language:"Thai",location:null,id:30,tag:"th",version:"Release 7"};var dg={language:"Tibetan",location:null,id:81,tag:"bo",version:"Release 7"};var gg={language:"Tigre",location:null,id:4096,tag:"tig",version:"Release 10"};var pg={language:"Tigrinya",location:null,id:115,tag:"ti",version:"Release 8"};var vg={language:"Tongan",location:null,id:4096,tag:"to",version:"Release 10"};var mg={language:"Tsonga",location:null,id:49,tag:"ts",version:"Release 8.1"};var yg={language:"Turkish",location:null,id:31,tag:"tr",version:"Release 7"};var _g={language:"Turkmen",location:null,id:66,tag:"tk",version:"Release 7"};var bg={language:"Ukrainian",location:null,id:34,tag:"uk",version:"Release 7"};var wg={language:"Upper Sorbian",location:null,id:46,tag:"hsb",version:"Release 7"};var xg={language:"Urdu",location:null,id:32,tag:"ur",version:"Release 7"};var kg={language:"Uyghur",location:null,id:128,tag:"ug",version:"Release 7"};var Sg={language:"Uzbek (Latin)",location:null,id:67,tag:"uz",version:"Release 7"};var Cg={language:"Vai",location:null,id:4096,tag:"vai",version:"Release 10"};var Eg={language:"Venda",location:null,id:51,tag:"ve",version:"Release 10"};var Ag={language:"Vietnamese",location:null,id:42,tag:"vi",version:"Release 7"};var Rg={language:"Volapük",location:null,id:4096,tag:"vo",version:"Release 10"};var Mg={language:"Vunjo",location:null,id:4096,tag:"vun",version:"Release 10"};var Tg={language:"Walser",location:null,id:4096,tag:"wae",version:"Release 10"};var Bg={language:"Welsh",location:null,id:82,tag:"cy",version:"Release 7"};var Ng={language:"Wolaytta",location:null,id:4096,tag:"wal",version:"Release 10"};var Pg={language:"Wolof",location:null,id:136,tag:"wo",version:"Release 7"};var Dg={language:"Xhosa",location:null,id:52,tag:"xh",version:"Release 7"};var Og={language:"Yangben",location:null,id:4096,tag:"yav",version:"Release 10"};var zg={language:"Yi",location:null,id:120,tag:"ii",version:"Release 7"};var Fg={language:"Yoruba",location:null,id:106,tag:"yo",version:"Release 7"};var Lg={language:"Zarma",location:null,id:4096,tag:"dje",version:"Release 10"};var Ig={language:"Zulu",location:null,id:53,tag:"zu",version:"Release 7"};var jg={aa:Ah,"aa-dj":{language:"Afar",location:"Djibouti",id:4096,tag:"aa-DJ",version:"Release 10"},"aa-er":{language:"Afar",location:"Eritrea",id:4096,tag:"aa-ER",version:"Release 10"},"aa-et":{language:"Afar",location:"Ethiopia",id:4096,tag:"aa-ET",version:"Release 10"},af:Rh,"af-na":{language:"Afrikaans",location:"Namibia",id:4096,tag:"af-NA",version:"Release 10"},"af-za":{language:"Afrikaans",location:"South Africa",id:1078,tag:"af-ZA",version:"Release B"},agq:Mh,"agq-cm":{language:"Aghem",location:"Cameroon",id:4096,tag:"agq-CM",version:"Release 10"},ak:Th,"ak-gh":{language:"Akan",location:"Ghana",id:4096,tag:"ak-GH",version:"Release 10"},sq:Bh,"sq-al":{language:"Albanian",location:"Albania",id:1052,tag:"sq-AL",version:"Release B"},"sq-mk":{language:"Albanian",location:"North Macedonia",id:4096,tag:"sq-MK",version:"Release 10"},gsw:Nh,"gsw-fr":{language:"Alsatian",location:"France",id:1156,tag:"gsw-FR",version:"Release V"},"gsw-li":{language:"Alsatian",location:"Liechtenstein",id:4096,tag:"gsw-LI",version:"Release 10"},"gsw-ch":{language:"Alsatian",location:"Switzerland",id:4096,tag:"gsw-CH",version:"Release 10"},am:Ph,"am-et":{language:"Amharic",location:"Ethiopia",id:1118,tag:"am-ET",version:"Release V"},ar:Dh,"ar-dz":{language:"Arabic",location:"Algeria",id:5121,tag:"ar-DZ",version:"Release B"},"ar-bh":{language:"Arabic",location:"Bahrain",id:15361,tag:"ar-BH",version:"Release B"},"ar-td":{language:"Arabic",location:"Chad",id:4096,tag:"ar-TD",version:"Release 10"},"ar-km":{language:"Arabic",location:"Comoros",id:4096,tag:"ar-KM",version:"Release 10"},"ar-dj":{language:"Arabic",location:"Djibouti",id:4096,tag:"ar-DJ",version:"Release 10"},"ar-eg":{language:"Arabic",location:"Egypt",id:3073,tag:"ar-EG",version:"Release B"},"ar-er":{language:"Arabic",location:"Eritrea",id:4096,tag:"ar-ER",version:"Release 10"},"ar-iq":{language:"Arabic",location:"Iraq",id:2049,tag:"ar-IQ",version:"Release B"},"ar-il":{language:"Arabic",location:"Israel",id:4096,tag:"ar-IL",version:"Release 10"},"ar-jo":{language:"Arabic",location:"Jordan",id:11265,tag:"ar-JO",version:"Release B"},"ar-kw":{language:"Arabic",location:"Kuwait",id:13313,tag:"ar-KW",version:"Release B"},"ar-lb":{language:"Arabic",location:"Lebanon",id:12289,tag:"ar-LB",version:"Release B"},"ar-ly":{language:"Arabic",location:"Libya",id:4097,tag:"ar-LY",version:"Release B"},"ar-mr":{language:"Arabic",location:"Mauritania",id:4096,tag:"ar-MR",version:"Release 10"},"ar-ma":{language:"Arabic",location:"Morocco",id:6145,tag:"ar-MA",version:"Release B"},"ar-om":{language:"Arabic",location:"Oman",id:8193,tag:"ar-OM",version:"Release B"},"ar-ps":{language:"Arabic",location:"Palestinian Authority",id:4096,tag:"ar-PS",version:"Release 10"},"ar-qa":{language:"Arabic",location:"Qatar",id:16385,tag:"ar-QA",version:"Release B"},"ar-sa":{language:"Arabic",location:"Saudi Arabia",id:1025,tag:"ar-SA",version:"Release B"},"ar-so":{language:"Arabic",location:"Somalia",id:4096,tag:"ar-SO",version:"Release 10"},"ar-ss":{language:"Arabic",location:"South Sudan",id:4096,tag:"ar-SS",version:"Release 10"},"ar-sd":{language:"Arabic",location:"Sudan",id:4096,tag:"ar-SD",version:"Release 10"},"ar-sy":{language:"Arabic",location:"Syria",id:10241,tag:"ar-SY",version:"Release B"},"ar-tn":{language:"Arabic",location:"Tunisia",id:7169,tag:"ar-TN",version:"Release B"},"ar-ae":{language:"Arabic",location:"U.A.E.",id:14337,tag:"ar-AE",version:"Release B"},"ar-001":{language:"Arabic",location:"World",id:4096,tag:"ar-001",version:"Release 10"},"ar-ye":{language:"Arabic",location:"Yemen",id:9217,tag:"ar-YE",version:"Release B"},hy:Oh,"hy-am":{language:"Armenian",location:"Armenia",id:1067,tag:"hy-AM",version:"Release C"},as:zh,"as-in":{language:"Assamese",location:"India",id:1101,tag:"as-IN",version:"Release V"},ast:Fh,"ast-es":{language:"Asturian",location:"Spain",id:4096,tag:"ast-ES",version:"Release 10"},asa:Lh,"asa-tz":{language:"Asu",location:"Tanzania",id:4096,tag:"asa-TZ",version:"Release 10"},"az-cyrl":{language:"Azerbaijani (Cyrillic)",location:null,id:29740,tag:"az-Cyrl",version:"Windows 7"},"az-cyrl-az":{language:"Azerbaijani (Cyrillic)",location:"Azerbaijan",id:2092,tag:"az-Cyrl-AZ",version:"Release C"},az:Ih,"az-latn":{language:"Azerbaijani (Latin)",location:null,id:30764,tag:"az-Latn",version:"Windows 7"},"az-latn-az":{language:"Azerbaijani (Latin)",location:"Azerbaijan",id:1068,tag:"az-Latn-AZ",version:"Release C"},ksf:jh,"ksf-cm":{language:"Bafia",location:"Cameroon",id:4096,tag:"ksf-CM",version:"Release 10"},bm:Hh,"bm-latn-ml":{language:"Bamanankan (Latin)",location:"Mali",id:4096,tag:"bm-Latn-ML",version:"Release 10"},bn:Vh,"bn-bd":{language:"Bangla",location:"Bangladesh",id:2117,tag:"bn-BD",version:"Release V"},"bn-in":{language:"Bangla",location:"India",id:1093,tag:"bn-IN",version:"Release E1"},bas:Gh,"bas-cm":{language:"Basaa",location:"Cameroon",id:4096,tag:"bas-CM",version:"Release 10"},ba:Uh,"ba-ru":{language:"Bashkir",location:"Russia",id:1133,tag:"ba-RU",version:"Release V"},eu:Wh,"eu-es":{language:"Basque",location:"Spain",id:1069,tag:"eu-ES",version:"Release B"},be:Kh,"be-by":{language:"Belarusian",location:"Belarus",id:1059,tag:"be-BY",version:"Release B"},bem:qh,"bem-zm":{language:"Bemba",location:"Zambia",id:4096,tag:"bem-ZM",version:"Release 10"},bez:Yh,"bez-tz":{language:"Bena",location:"Tanzania",id:4096,tag:"bez-TZ",version:"Release 10"},byn:Xh,"byn-er":{language:"Blin",location:"Eritrea",id:4096,tag:"byn-ER",version:"Release 10"},brx:$h,"brx-in":{language:"Bodo",location:"India",id:4096,tag:"brx-IN",version:"Release 10"},"bs-cyrl":{language:"Bosnian (Cyrillic)",location:null,id:25626,tag:"bs-Cyrl",version:"Windows 7"},"bs-cyrl-ba":{language:"Bosnian (Cyrillic)",location:"Bosnia and Herzegovina",id:8218,tag:"bs-Cyrl-BA",version:"Release E1"},"bs-latn":{language:"Bosnian (Latin)",location:null,id:26650,tag:"bs-Latn",version:"Windows 7"},bs:Zh,"bs-latn-ba":{language:"Bosnian (Latin)",location:"Bosnia and Herzegovina",id:5146,tag:"bs-Latn-BA",version:"Release E1"},br:Jh,"br-fr":{language:"Breton",location:"France",id:1150,tag:"br-FR",version:"Release V"},bg:Qh,"bg-bg":{language:"Bulgarian",location:"Bulgaria",id:1026,tag:"bg-BG",version:"Release B"},my:ec,"my-mm":{language:"Burmese",location:"Myanmar",id:1109,tag:"my-MM",version:"Release 8.1"},ca:tc,"ca-ad":{language:"Catalan",location:"Andorra",id:4096,tag:"ca-AD",version:"Release 10"},"ca-fr":{language:"Catalan",location:"France",id:4096,tag:"ca-FR",version:"Release 10"},"ca-it":{language:"Catalan",location:"Italy",id:4096,tag:"ca-IT",version:"Release 10"},"ca-es":{language:"Catalan",location:"Spain",id:1027,tag:"ca-ES",version:"Release B"},ceb:nc,"ceb-latn":{language:"Cebuan (Latin)",location:null,id:4096,tag:"ceb-Latn",version:"Release 10.5"},"ceb-latn-ph":{language:"Cebuan (Latin)",location:"Philippines",id:4096,tag:"ceb-Latn-PH",version:"Release 10.5"},"tzm-latn-":{language:"Central Atlas Tamazight (Latin)",location:"Morocco",id:4096,tag:"tzm-Latn-",version:"Release 10"},ku:ic,"ku-arab":{language:"Central Kurdish",location:null,id:31890,tag:"ku-Arab",version:"Release 8"},"ku-arab-iq":{language:"Central Kurdish",location:"Iraq",id:1170,tag:"ku-Arab-IQ",version:"Release 8"},ccp:ac,"ccp-cakm":{language:"Chakma",location:"Chakma",id:4096,tag:"ccp-Cakm",version:"Release 10.5"},"ccp-cakm-":{language:"Chakma",location:"India",id:4096,tag:"ccp-Cakm-",version:"Release 10.5"},"cd-ru":{language:"Chechen",location:"Russia",id:4096,tag:"cd-RU",version:"Release 10.1"},chr:rc,"chr-cher":{language:"Cherokee",location:null,id:31836,tag:"chr-Cher",version:"Release 8"},"chr-cher-us":{language:"Cherokee",location:"United States",id:1116,tag:"chr-Cher-US",version:"Release 8"},cgg:oc,"cgg-ug":{language:"Chiga",location:"Uganda",id:4096,tag:"cgg-UG",version:"Release 10"},"zh-hans":{language:"Chinese (Simplified)",location:null,id:4,tag:"zh-Hans",version:"Release A"},zh:sc,"zh-cn":{language:"Chinese (Simplified)",location:"People's Republic of China",id:2052,tag:"zh-CN",version:"Release A"},"zh-sg":{language:"Chinese (Simplified)",location:"Singapore",id:4100,tag:"zh-SG",version:"Release A"},"zh-hant":{language:"Chinese (Traditional)",location:null,id:31748,tag:"zh-Hant",version:"Release A"},"zh-hk":{language:"Chinese (Traditional)",location:"Hong Kong S.A.R.",id:3076,tag:"zh-HK",version:"Release A"},"zh-mo":{language:"Chinese (Traditional)",location:"Macao S.A.R.",id:5124,tag:"zh-MO",version:"Release D"},"zh-tw":{language:"Chinese (Traditional)",location:"Taiwan",id:1028,tag:"zh-TW",version:"Release A"},"cu-ru":{language:"Church Slavic",location:"Russia",id:4096,tag:"cu-RU",version:"Release 10.1"},swc:lc,"swc-cd":{language:"Congo Swahili",location:"Congo DRC",id:4096,tag:"swc-CD",version:"Release 10"},kw:uc,"kw-gb":{language:"Cornish",location:"United Kingdom",id:4096,tag:"kw-GB",version:"Release 10"},co:hc,"co-fr":{language:"Corsican",location:"France",id:1155,tag:"co-FR",version:"Release V"},"hr,":{language:"Croatian",location:null,id:26,tag:"hr,",version:"Release 7"},"hr-hr":{language:"Croatian",location:"Croatia",id:1050,tag:"hr-HR",version:"Release A"},"hr-ba":{language:"Croatian (Latin)",location:"Bosnia and Herzegovina",id:4122,tag:"hr-BA",version:"Release E1"},cs:cc,"cs-cz":{language:"Czech",location:"Czech Republic",id:1029,tag:"cs-CZ",version:"Release A"},da:fc,"da-dk":{language:"Danish",location:"Denmark",id:1030,tag:"da-DK",version:"Release A"},"da-gl":{language:"Danish",location:"Greenland",id:4096,tag:"da-GL",version:"Release 10"},prs:dc,"prs-af":{language:"Dari",location:"Afghanistan",id:1164,tag:"prs-AF",version:"Release V"},dv:gc,"dv-mv":{language:"Divehi",location:"Maldives",id:1125,tag:"dv-MV",version:"Release D"},dua:pc,"dua-cm":{language:"Duala",location:"Cameroon",id:4096,tag:"dua-CM",version:"Release 10"},nl:vc,"nl-aw":{language:"Dutch",location:"Aruba",id:4096,tag:"nl-AW",version:"Release 10"},"nl-be":{language:"Dutch",location:"Belgium",id:2067,tag:"nl-BE",version:"Release A"},"nl-bq":{language:"Dutch",location:"Bonaire, Sint Eustatius and Saba",id:4096,tag:"nl-BQ",version:"Release 10"},"nl-cw":{language:"Dutch",location:"Curaçao",id:4096,tag:"nl-CW",version:"Release 10"},"nl-nl":{language:"Dutch",location:"Netherlands",id:1043,tag:"nl-NL",version:"Release A"},"nl-sx":{language:"Dutch",location:"Sint Maarten",id:4096,tag:"nl-SX",version:"Release 10"},"nl-sr":{language:"Dutch",location:"Suriname",id:4096,tag:"nl-SR",version:"Release 10"},dz:mc,"dz-bt":{language:"Dzongkha",location:"Bhutan",id:3153,tag:"dz-BT",version:"Release 10"},ebu:yc,"ebu-ke":{language:"Embu",location:"Kenya",id:4096,tag:"ebu-KE",version:"Release 10"},en:_c,"en-as":{language:"English",location:"American Samoa",id:4096,tag:"en-AS",version:"Release 10"},"en-ai":{language:"English",location:"Anguilla",id:4096,tag:"en-AI",version:"Release 10"},"en-ag":{language:"English",location:"Antigua and Barbuda",id:4096,tag:"en-AG",version:"Release 10"},"en-au":{language:"English",location:"Australia",id:3081,tag:"en-AU",version:"Release A"},"en-at":{language:"English",location:"Austria",id:4096,tag:"en-AT",version:"Release 10.1"},"en-bs":{language:"English",location:"Bahamas",id:4096,tag:"en-BS",version:"Release 10"},"en-bb":{language:"English",location:"Barbados",id:4096,tag:"en-BB",version:"Release 10"},"en-be":{language:"English",location:"Belgium",id:4096,tag:"en-BE",version:"Release 10"},"en-bz":{language:"English",location:"Belize",id:10249,tag:"en-BZ",version:"Release B"},"en-bm":{language:"English",location:"Bermuda",id:4096,tag:"en-BM",version:"Release 10"},"en-bw":{language:"English",location:"Botswana",id:4096,tag:"en-BW",version:"Release 10"},"en-io":{language:"English",location:"British Indian Ocean Territory",id:4096,tag:"en-IO",version:"Release 10"},"en-vg":{language:"English",location:"British Virgin Islands",id:4096,tag:"en-VG",version:"Release 10"},"en-bi":{language:"English",location:"Burundi",id:4096,tag:"en-BI",version:"Release 10.1"},"en-cm":{language:"English",location:"Cameroon",id:4096,tag:"en-CM",version:"Release 10"},"en-ca":{language:"English",location:"Canada",id:4105,tag:"en-CA",version:"Release A"},"en-029":{language:"English",location:"Caribbean",id:9225,tag:"en-029",version:"Release B"},"en-ky":{language:"English",location:"Cayman Islands",id:4096,tag:"en-KY",version:"Release 10"},"en-cx":{language:"English",location:"Christmas Island",id:4096,tag:"en-CX",version:"Release 10"},"en-cc":{language:"English",location:"Cocos [Keeling] Islands",id:4096,tag:"en-CC",version:"Release 10"},"en-ck":{language:"English",location:"Cook Islands",id:4096,tag:"en-CK",version:"Release 10"},"en-cy":{language:"English",location:"Cyprus",id:4096,tag:"en-CY",version:"Release 10.1"},"en-dk":{language:"English",location:"Denmark",id:4096,tag:"en-DK",version:"Release 10.1"},"en-dm":{language:"English",location:"Dominica",id:4096,tag:"en-DM",version:"Release 10"},"en-er":{language:"English",location:"Eritrea",id:4096,tag:"en-ER",version:"Release 10"},"en-150":{language:"English",location:"Europe",id:4096,tag:"en-150",version:"Release 10"},"en-fk":{language:"English",location:"Falkland Islands",id:4096,tag:"en-FK",version:"Release 10"},"en-fi":{language:"English",location:"Finland",id:4096,tag:"en-FI",version:"Release 10.1"},"en-fj":{language:"English",location:"Fiji",id:4096,tag:"en-FJ",version:"Release 10"},"en-gm":{language:"English",location:"Gambia",id:4096,tag:"en-GM",version:"Release 10"},"en-de":{language:"English",location:"Germany",id:4096,tag:"en-DE",version:"Release 10.1"},"en-gh":{language:"English",location:"Ghana",id:4096,tag:"en-GH",version:"Release 10"},"en-gi":{language:"English",location:"Gibraltar",id:4096,tag:"en-GI",version:"Release 10"},"en-gd":{language:"English",location:"Grenada",id:4096,tag:"en-GD",version:"Release 10"},"en-gu":{language:"English",location:"Guam",id:4096,tag:"en-GU",version:"Release 10"},"en-gg":{language:"English",location:"Guernsey",id:4096,tag:"en-GG",version:"Release 10"},"en-gy":{language:"English",location:"Guyana",id:4096,tag:"en-GY",version:"Release 10"},"en-hk":{language:"English",location:"Hong Kong",id:15369,tag:"en-HK",version:"Release 8.1"},"en-in":{language:"English",location:"India",id:16393,tag:"en-IN",version:"Release V"},"en-ie":{language:"English",location:"Ireland",id:6153,tag:"en-IE",version:"Release A"},"en-im":{language:"English",location:"Isle of Man",id:4096,tag:"en-IM",version:"Release 10"},"en-il":{language:"English",location:"Israel",id:4096,tag:"en-IL",version:"Release 10.1"},"en-jm":{language:"English",location:"Jamaica",id:8201,tag:"en-JM",version:"Release B"},"en-je":{language:"English",location:"Jersey",id:4096,tag:"en-JE",version:"Release 10"},"en-ke":{language:"English",location:"Kenya",id:4096,tag:"en-KE",version:"Release 10"},"en-ki":{language:"English",location:"Kiribati",id:4096,tag:"en-KI",version:"Release 10"},"en-ls":{language:"English",location:"Lesotho",id:4096,tag:"en-LS",version:"Release 10"},"en-lr":{language:"English",location:"Liberia",id:4096,tag:"en-LR",version:"Release 10"},"en-mo":{language:"English",location:"Macao SAR",id:4096,tag:"en-MO",version:"Release 10"},"en-mg":{language:"English",location:"Madagascar",id:4096,tag:"en-MG",version:"Release 10"},"en-mw":{language:"English",location:"Malawi",id:4096,tag:"en-MW",version:"Release 10"},"en-my":{language:"English",location:"Malaysia",id:17417,tag:"en-MY",version:"Release V"},"en-mt":{language:"English",location:"Malta",id:4096,tag:"en-MT",version:"Release 10"},"en-mh":{language:"English",location:"Marshall Islands",id:4096,tag:"en-MH",version:"Release 10"},"en-mu":{language:"English",location:"Mauritius",id:4096,tag:"en-MU",version:"Release 10"},"en-fm":{language:"English",location:"Micronesia",id:4096,tag:"en-FM",version:"Release 10"},"en-ms":{language:"English",location:"Montserrat",id:4096,tag:"en-MS",version:"Release 10"},"en-na":{language:"English",location:"Namibia",id:4096,tag:"en-NA",version:"Release 10"},"en-nr":{language:"English",location:"Nauru",id:4096,tag:"en-NR",version:"Release 10"},"en-nl":{language:"English",location:"Netherlands",id:4096,tag:"en-NL",version:"Release 10.1"},"en-nz":{language:"English",location:"New Zealand",id:5129,tag:"en-NZ",version:"Release A"},"en-ng":{language:"English",location:"Nigeria",id:4096,tag:"en-NG",version:"Release 10"},"en-nu":{language:"English",location:"Niue",id:4096,tag:"en-NU",version:"Release 10"},"en-nf":{language:"English",location:"Norfolk Island",id:4096,tag:"en-NF",version:"Release 10"},"en-mp":{language:"English",location:"Northern Mariana Islands",id:4096,tag:"en-MP",version:"Release 10"},"en-pk":{language:"English",location:"Pakistan",id:4096,tag:"en-PK",version:"Release 10"},"en-pw":{language:"English",location:"Palau",id:4096,tag:"en-PW",version:"Release 10"},"en-pg":{language:"English",location:"Papua New Guinea",id:4096,tag:"en-PG",version:"Release 10"},"en-pn":{language:"English",location:"Pitcairn Islands",id:4096,tag:"en-PN",version:"Release 10"},"en-pr":{language:"English",location:"Puerto Rico",id:4096,tag:"en-PR",version:"Release 10"},"en-ph":{language:"English",location:"Republic of the Philippines",id:13321,tag:"en-PH",version:"Release C"},"en-rw":{language:"English",location:"Rwanda",id:4096,tag:"en-RW",version:"Release 10"},"en-kn":{language:"English",location:"Saint Kitts and Nevis",id:4096,tag:"en-KN",version:"Release 10"},"en-lc":{language:"English",location:"Saint Lucia",id:4096,tag:"en-LC",version:"Release 10"},"en-vc":{language:"English",location:"Saint Vincent and the Grenadines",id:4096,tag:"en-VC",version:"Release 10"},"en-ws":{language:"English",location:"Samoa",id:4096,tag:"en-WS",version:"Release 10"},"en-sc":{language:"English",location:"Seychelles",id:4096,tag:"en-SC",version:"Release 10"},"en-sl":{language:"English",location:"Sierra Leone",id:4096,tag:"en-SL",version:"Release 10"},"en-sg":{language:"English",location:"Singapore",id:18441,tag:"en-SG",version:"Release V"},"en-sx":{language:"English",location:"Sint Maarten",id:4096,tag:"en-SX",version:"Release 10"},"en-si":{language:"English",location:"Slovenia",id:4096,tag:"en-SI",version:"Release 10.1"},"en-sb":{language:"English",location:"Solomon Islands",id:4096,tag:"en-SB",version:"Release 10"},"en-za":{language:"English",location:"South Africa",id:7177,tag:"en-ZA",version:"Release B"},"en-ss":{language:"English",location:"South Sudan",id:4096,tag:"en-SS",version:"Release 10"},"en-sh":{language:"English",location:"St Helena, Ascension, Tristan da Cunha",id:4096,tag:"en-SH",version:"Release 10"},"en-sd":{language:"English",location:"Sudan",id:4096,tag:"en-SD",version:"Release 10"},"en-sz":{language:"English",location:"Swaziland",id:4096,tag:"en-SZ",version:"Release 10"},"en-se":{language:"English",location:"Sweden",id:4096,tag:"en-SE",version:"Release 10.1"},"en-ch":{language:"English",location:"Switzerland",id:4096,tag:"en-CH",version:"Release 10.1"},"en-tz":{language:"English",location:"Tanzania",id:4096,tag:"en-TZ",version:"Release 10"},"en-tk":{language:"English",location:"Tokelau",id:4096,tag:"en-TK",version:"Release 10"},"en-to":{language:"English",location:"Tonga",id:4096,tag:"en-TO",version:"Release 10"},"en-tt":{language:"English",location:"Trinidad and Tobago",id:11273,tag:"en-TT",version:"Release B"},"en-tc":{language:"English",location:"Turks and Caicos Islands",id:4096,tag:"en-TC",version:"Release 10"},"en-tv":{language:"English",location:"Tuvalu",id:4096,tag:"en-TV",version:"Release 10"},"en-ug":{language:"English",location:"Uganda",id:4096,tag:"en-UG",version:"Release 10"},"en-ae":{language:"English",location:"United Arab Emirates",id:19465,tag:"en-AE",version:"Release 10.5"},"en-gb":{language:"English",location:"United Kingdom",id:2057,tag:"en-GB",version:"Release A"},"en-us":{language:"English",location:"United States",id:1033,tag:"en-US",version:"Release A"},"en-um":{language:"English",location:"US Minor Outlying Islands",id:4096,tag:"en-UM",version:"Release 10"},"en-vi":{language:"English",location:"US Virgin Islands",id:4096,tag:"en-VI",version:"Release 10"},"en-vu":{language:"English",location:"Vanuatu",id:4096,tag:"en-VU",version:"Release 10"},"en-001":{language:"English",location:"World",id:4096,tag:"en-001",version:"Release 10"},"en-zm":{language:"English",location:"Zambia",id:4096,tag:"en-ZM",version:"Release 10"},"en-zw":{language:"English",location:"Zimbabwe",id:12297,tag:"en-ZW",version:"Release C"},eo:bc,"eo-001":{language:"Esperanto",location:"World",id:4096,tag:"eo-001",version:"Release 10"},et:wc,"et-ee":{language:"Estonian",location:"Estonia",id:1061,tag:"et-EE",version:"Release B"},ee:xc,"ee-gh":{language:"Ewe",location:"Ghana",id:4096,tag:"ee-GH",version:"Release 10"},"ee-tg":{language:"Ewe",location:"Togo",id:4096,tag:"ee-TG",version:"Release 10"},ewo:kc,"ewo-cm":{language:"Ewondo",location:"Cameroon",id:4096,tag:"ewo-CM",version:"Release 10"},fo:Sc,"fo-dk":{language:"Faroese",location:"Denmark",id:4096,tag:"fo-DK",version:"Release 10.1"},"fo-fo":{language:"Faroese",location:"Faroe Islands",id:1080,tag:"fo-FO",version:"Release B"},fil:Cc,"fil-ph":{language:"Filipino",location:"Philippines",id:1124,tag:"fil-PH",version:"Release E2"},fi:Ec,"fi-fi":{language:"Finnish",location:"Finland",id:1035,tag:"fi-FI",version:"Release A"},fr:Ac,"fr-dz":{language:"French",location:"Algeria",id:4096,tag:"fr-DZ",version:"Release 10"},"fr-be":{language:"French",location:"Belgium",id:2060,tag:"fr-BE",version:"Release A"},"fr-bj":{language:"French",location:"Benin",id:4096,tag:"fr-BJ",version:"Release 10"},"fr-bf":{language:"French",location:"Burkina Faso",id:4096,tag:"fr-BF",version:"Release 10"},"fr-bi":{language:"French",location:"Burundi",id:4096,tag:"fr-BI",version:"Release 10"},"fr-cm":{language:"French",location:"Cameroon",id:11276,tag:"fr-CM",version:"Release 8.1"},"fr-ca":{language:"French",location:"Canada",id:3084,tag:"fr-CA",version:"Release A"},"fr-cf":{language:"French",location:"Central African Republic",id:4096,tag:"fr-CF",version:"Release10"},"fr-td":{language:"French",location:"Chad",id:4096,tag:"fr-TD",version:"Release 10"},"fr-km":{language:"French",location:"Comoros",id:4096,tag:"fr-KM",version:"Release 10"},"fr-cg":{language:"French",location:"Congo",id:4096,tag:"fr-CG",version:"Release 10"},"fr-cd":{language:"French",location:"Congo, DRC",id:9228,tag:"fr-CD",version:"Release 8.1"},"fr-ci":{language:"French",location:"Côte d'Ivoire",id:12300,tag:"fr-CI",version:"Release 8.1"},"fr-dj":{language:"French",location:"Djibouti",id:4096,tag:"fr-DJ",version:"Release 10"},"fr-gq":{language:"French",location:"Equatorial Guinea",id:4096,tag:"fr-GQ",version:"Release 10"},"fr-fr":{language:"French",location:"France",id:1036,tag:"fr-FR",version:"Release A"},"fr-gf":{language:"French",location:"French Guiana",id:4096,tag:"fr-GF",version:"Release 10"},"fr-pf":{language:"French",location:"French Polynesia",id:4096,tag:"fr-PF",version:"Release 10"},"fr-ga":{language:"French",location:"Gabon",id:4096,tag:"fr-GA",version:"Release 10"},"fr-gp":{language:"French",location:"Guadeloupe",id:4096,tag:"fr-GP",version:"Release 10"},"fr-gn":{language:"French",location:"Guinea",id:4096,tag:"fr-GN",version:"Release 10"},"fr-ht":{language:"French",location:"Haiti",id:15372,tag:"fr-HT",version:"Release 8.1"},"fr-lu":{language:"French",location:"Luxembourg",id:5132,tag:"fr-LU",version:"Release A"},"fr-mg":{language:"French",location:"Madagascar",id:4096,tag:"fr-MG",version:"Release 10"},"fr-ml":{language:"French",location:"Mali",id:13324,tag:"fr-ML",version:"Release 8.1"},"fr-mq":{language:"French",location:"Martinique",id:4096,tag:"fr-MQ",version:"Release 10"},"fr-mr":{language:"French",location:"Mauritania",id:4096,tag:"fr-MR",version:"Release 10"},"fr-mu":{language:"French",location:"Mauritius",id:4096,tag:"fr-MU",version:"Release 10"},"fr-yt":{language:"French",location:"Mayotte",id:4096,tag:"fr-YT",version:"Release 10"},"fr-ma":{language:"French",location:"Morocco",id:14348,tag:"fr-MA",version:"Release 8.1"},"fr-nc":{language:"French",location:"New Caledonia",id:4096,tag:"fr-NC",version:"Release 10"},"fr-ne":{language:"French",location:"Niger",id:4096,tag:"fr-NE",version:"Release 10"},"fr-mc":{language:"French",location:"Principality of Monaco",id:6156,tag:"fr-MC",version:"Release A"},"fr-re":{language:"French",location:"Reunion",id:8204,tag:"fr-RE",version:"Release 8.1"},"fr-rw":{language:"French",location:"Rwanda",id:4096,tag:"fr-RW",version:"Release 10"},"fr-bl":{language:"French",location:"Saint Barthélemy",id:4096,tag:"fr-BL",version:"Release 10"},"fr-mf":{language:"French",location:"Saint Martin",id:4096,tag:"fr-MF",version:"Release 10"},"fr-pm":{language:"French",location:"Saint Pierre and Miquelon",id:4096,tag:"fr-PM",version:"Release 10"},"fr-sn":{language:"French",location:"Senegal",id:10252,tag:"fr-SN",version:"Release 8.1"},"fr-sc":{language:"French",location:"Seychelles",id:4096,tag:"fr-SC",version:"Release 10"},"fr-ch":{language:"French",location:"Switzerland",id:4108,tag:"fr-CH",version:"Release A"},"fr-sy":{language:"French",location:"Syria",id:4096,tag:"fr-SY",version:"Release 10"},"fr-tg":{language:"French",location:"Togo",id:4096,tag:"fr-TG",version:"Release 10"},"fr-tn":{language:"French",location:"Tunisia",id:4096,tag:"fr-TN",version:"Release 10"},"fr-vu":{language:"French",location:"Vanuatu",id:4096,tag:"fr-VU",version:"Release 10"},"fr-wf":{language:"French",location:"Wallis and Futuna",id:4096,tag:"fr-WF",version:"Release 10"},fy:Rc,"fy-nl":{language:"Frisian",location:"Netherlands",id:1122,tag:"fy-NL",version:"Release E2"},fur:Mc,"fur-it":{language:"Friulian",location:"Italy",id:4096,tag:"fur-IT",version:"Release 10"},ff:Tc,"ff-latn":{language:"Fulah (Latin)",location:null,id:31847,tag:"ff-Latn",version:"Release 8"},"ff-latn-bf":{language:"Fulah (Latin)",location:"Burkina Faso",id:4096,tag:"ff-Latn-BF",version:"Release 10.4"},"ff-cm":{language:"Fulah",location:"Cameroon",id:4096,tag:"ff-CM",version:"Release 10"},"ff-latn-cm":{language:"Fulah (Latin)",location:"Cameroon",id:4096,tag:"ff-Latn-CM",version:"Release 10.4"},"ff-latn-gm":{language:"Fulah (Latin)",location:"Gambia",id:4096,tag:"ff-Latn-GM",version:"Release 10.4"},"ff-latn-gh":{language:"Fulah (Latin)",location:"Ghana",id:4096,tag:"ff-Latn-GH",version:"Release 10.4"},"ff-gn":{language:"Fulah",location:"Guinea",id:4096,tag:"ff-GN",version:"Release 10"},"ff-latn-gn":{language:"Fulah (Latin)",location:"Guinea",id:4096,tag:"ff-Latn-GN",version:"Release 10.4"},"ff-latn-gw":{language:"Fulah (Latin)",location:"Guinea-Bissau",id:4096,tag:"ff-Latn-GW",version:"Release 10.4"},"ff-latn-lr":{language:"Fulah (Latin)",location:"Liberia",id:4096,tag:"ff-Latn-LR",version:"Release 10.4"},"ff-mr":{language:"Fulah",location:"Mauritania",id:4096,tag:"ff-MR",version:"Release 10"},"ff-latn-mr":{language:"Fulah (Latin)",location:"Mauritania",id:4096,tag:"ff-Latn-MR",version:"Release 10.4"},"ff-latn-ne":{language:"Fulah (Latin)",location:"Niger",id:4096,tag:"ff-Latn-NE",version:"Release 10.4"},"ff-ng":{language:"Fulah",location:"Nigeria",id:4096,tag:"ff-NG",version:"Release 10"},"ff-latn-ng":{language:"Fulah (Latin)",location:"Nigeria",id:4096,tag:"ff-Latn-NG",version:"Release 10.4"},"ff-latn-sn":{language:"Fulah",location:"Senegal",id:2151,tag:"ff-Latn-SN",version:"Release 8"},"ff-latn-sl":{language:"Fulah (Latin)",location:"Sierra Leone",id:4096,tag:"ff-Latn-SL",version:"Release 10.4"},gl:Bc,"gl-es":{language:"Galician",location:"Spain",id:1110,tag:"gl-ES",version:"Release D"},lg:Nc,"lg-ug":{language:"Ganda",location:"Uganda",id:4096,tag:"lg-UG",version:"Release 10"},ka:Pc,"ka-ge":{language:"Georgian",location:"Georgia",id:1079,tag:"ka-GE",version:"Release C"},de:Dc,"de-at":{language:"German",location:"Austria",id:3079,tag:"de-AT",version:"Release A"},"de-be":{language:"German",location:"Belgium",id:4096,tag:"de-BE",version:"Release 10"},"de-de":{language:"German",location:"Germany",id:1031,tag:"de-DE",version:"Release A"},"de-it":{language:"German",location:"Italy",id:4096,tag:"de-IT",version:"Release 10.2"},"de-li":{language:"German",location:"Liechtenstein",id:5127,tag:"de-LI",version:"Release B"},"de-lu":{language:"German",location:"Luxembourg",id:4103,tag:"de-LU",version:"Release B"},"de-ch":{language:"German",location:"Switzerland",id:2055,tag:"de-CH",version:"Release A"},el:Oc,"el-cy":{language:"Greek",location:"Cyprus",id:4096,tag:"el-CY",version:"Release 10"},"el-gr":{language:"Greek",location:"Greece",id:1032,tag:"el-GR",version:"Release A"},kl:zc,"kl-gl":{language:"Greenlandic",location:"Greenland",id:1135,tag:"kl-GL",version:"Release V"},gn:Fc,"gn-py":{language:"Guarani",location:"Paraguay",id:1140,tag:"gn-PY",version:"Release 8.1"},gu:Lc,"gu-in":{language:"Gujarati",location:"India",id:1095,tag:"gu-IN",version:"Release D"},guz:Ic,"guz-ke":{language:"Gusii",location:"Kenya",id:4096,tag:"guz-KE",version:"Release 10"},ha:jc,"ha-latn":{language:"Hausa (Latin)",location:null,id:31848,tag:"ha-Latn",version:"Windows 7"},"ha-latn-gh":{language:"Hausa (Latin)",location:"Ghana",id:4096,tag:"ha-Latn-GH",version:"Release 10"},"ha-latn-ne":{language:"Hausa (Latin)",location:"Niger",id:4096,tag:"ha-Latn-NE",version:"Release 10"},"ha-latn-ng":{language:"Hausa (Latin)",location:"Nigeria",id:1128,tag:"ha-Latn-NG",version:"Release V"},haw:Hc,"haw-us":{language:"Hawaiian",location:"United States",id:1141,tag:"haw-US",version:"Release 8"},he:Vc,"he-il":{language:"Hebrew",location:"Israel",id:1037,tag:"he-IL",version:"Release B"},hi:Gc,"hi-in":{language:"Hindi",location:"India",id:1081,tag:"hi-IN",version:"Release C"},hu:Uc,"hu-hu":{language:"Hungarian",location:"Hungary",id:1038,tag:"hu-HU",version:"Release A"},is:Wc,"is-is":{language:"Icelandic",location:"Iceland",id:1039,tag:"is-IS",version:"Release A"},ig:Kc,"ig-ng":{language:"Igbo",location:"Nigeria",id:1136,tag:"ig-NG",version:"Release V"},id:qc,"id-id":{language:"Indonesian",location:"Indonesia",id:1057,tag:"id-ID",version:"Release B"},ia:Yc,"ia-fr":{language:"Interlingua",location:"France",id:4096,tag:"ia-FR",version:"Release 10"},"ia-001":{language:"Interlingua",location:"World",id:4096,tag:"ia-001",version:"Release 10"},iu:Xc,"iu-latn":{language:"Inuktitut (Latin)",location:null,id:31837,tag:"iu-Latn",version:"Windows 7"},"iu-latn-ca":{language:"Inuktitut (Latin)",location:"Canada",id:2141,tag:"iu-Latn-CA",version:"Release E2"},"iu-cans":{language:"Inuktitut (Syllabics)",location:null,id:30813,tag:"iu-Cans",version:"Windows 7"},"iu-cans-ca":{language:"Inuktitut (Syllabics)",location:"Canada",id:1117,tag:"iu-Cans-CA",version:"Release V"},ga:$c,"ga-ie":{language:"Irish",location:"Ireland",id:2108,tag:"ga-IE",version:"Release E2"},it:Zc,"it-it":{language:"Italian",location:"Italy",id:1040,tag:"it-IT",version:"Release A"},"it-sm":{language:"Italian",location:"San Marino",id:4096,tag:"it-SM",version:"Release 10"},"it-ch":{language:"Italian",location:"Switzerland",id:2064,tag:"it-CH",version:"Release A"},"it-va":{language:"Italian",location:"Vatican City",id:4096,tag:"it-VA",version:"Release 10.3"},ja:Jc,"ja-jp":{language:"Japanese",location:"Japan",id:1041,tag:"ja-JP",version:"Release A"},jv:Qc,"jv-latn":{language:"Javanese",location:"Latin",id:4096,tag:"jv-Latn",version:"Release 8.1"},"jv-latn-id":{language:"Javanese",location:"Latin, Indonesia",id:4096,tag:"jv-Latn-ID",version:"Release 8.1"},dyo:ef,"dyo-sn":{language:"Jola-Fonyi",location:"Senegal",id:4096,tag:"dyo-SN",version:"Release 10"},kea:tf,"kea-cv":{language:"Kabuverdianu",location:"Cabo Verde",id:4096,tag:"kea-CV",version:"Release 10"},kab:nf,"kab-dz":{language:"Kabyle",location:"Algeria",id:4096,tag:"kab-DZ",version:"Release 10"},kkj:af,"kkj-cm":{language:"Kako",location:"Cameroon",id:4096,tag:"kkj-CM",version:"Release 10"},kln:rf,"kln-ke":{language:"Kalenjin",location:"Kenya",id:4096,tag:"kln-KE",version:"Release 10"},kam:of,"kam-ke":{language:"Kamba",location:"Kenya",id:4096,tag:"kam-KE",version:"Release 10"},kn:sf,"kn-in":{language:"Kannada",location:"India",id:1099,tag:"kn-IN",version:"Release D"},ks:lf,"ks-arab":{language:"Kashmiri",location:"Perso-Arabic",id:1120,tag:"ks-Arab",version:"Release 10"},"ks-arab-in":{language:"Kashmiri",location:"Perso-Arabic",id:4096,tag:"ks-Arab-IN",version:"Release 10"},kk:uf,"kk-kz":{language:"Kazakh",location:"Kazakhstan",id:1087,tag:"kk-KZ",version:"Release C"},km:hf,"km-kh":{language:"Khmer",location:"Cambodia",id:1107,tag:"km-KH",version:"Release V"},quc:cf,"quc-latn-gt":{language:"K'iche",location:"Guatemala",id:1158,tag:"quc-Latn-GT",version:"Release 10"},ki:ff,"ki-ke":{language:"Kikuyu",location:"Kenya",id:4096,tag:"ki-KE",version:"Release 10"},rw:df,"rw-rw":{language:"Kinyarwanda",location:"Rwanda",id:1159,tag:"rw-RW",version:"Release V"},sw:gf,"sw-ke":{language:"Kiswahili",location:"Kenya",id:1089,tag:"sw-KE",version:"Release C"},"sw-tz":{language:"Kiswahili",location:"Tanzania",id:4096,tag:"sw-TZ",version:"Release 10"},"sw-ug":{language:"Kiswahili",location:"Uganda",id:4096,tag:"sw-UG",version:"Release 10"},kok:pf,"kok-in":{language:"Konkani",location:"India",id:1111,tag:"kok-IN",version:"Release C"},ko:vf,"ko-kr":{language:"Korean",location:"Korea",id:1042,tag:"ko-KR",version:"Release A"},"ko-kp":{language:"Korean",location:"North Korea",id:4096,tag:"ko-KP",version:"Release 10.1"},khq:mf,"khq-ml":{language:"Koyra Chiini",location:"Mali",id:4096,tag:"khq-ML",version:"Release 10"},ses:yf,"ses-ml":{language:"Koyraboro Senni",location:"Mali",id:4096,tag:"ses-ML",version:"Release 10"},nmg:_f,"nmg-cm":{language:"Kwasio",location:"Cameroon",id:4096,tag:"nmg-CM",version:"Release 10"},ky:bf,"ky-kg":{language:"Kyrgyz",location:"Kyrgyzstan",id:1088,tag:"ky-KG",version:"Release D"},"ku-arab-ir":{language:"Kurdish",location:"Perso-Arabic, Iran",id:4096,tag:"ku-Arab-IR",version:"Release 10.1"},lkt:wf,"lkt-us":{language:"Lakota",location:"United States",id:4096,tag:"lkt-US",version:"Release 10"},lag:xf,"lag-tz":{language:"Langi",location:"Tanzania",id:4096,tag:"lag-TZ",version:"Release 10"},lo:kf,"lo-la":{language:"Lao",location:"Lao P.D.R.",id:1108,tag:"lo-LA",version:"Release V"},lv:Sf,"lv-lv":{language:"Latvian",location:"Latvia",id:1062,tag:"lv-LV",version:"Release B"},ln:Cf,"ln-ao":{language:"Lingala",location:"Angola",id:4096,tag:"ln-AO",version:"Release 10"},"ln-cf":{language:"Lingala",location:"Central African Republic",id:4096,tag:"ln-CF",version:"Release 10"},"ln-cg":{language:"Lingala",location:"Congo",id:4096,tag:"ln-CG",version:"Release 10"},"ln-cd":{language:"Lingala",location:"Congo DRC",id:4096,tag:"ln-CD",version:"Release 10"},lt:Ef,"lt-lt":{language:"Lithuanian",location:"Lithuania",id:1063,tag:"lt-LT",version:"Release B"},nds:Af,"nds-de":{language:"Low German",location:"Germany",id:4096,tag:"nds-DE",version:"Release 10.2"},"nds-nl":{language:"Low German",location:"Netherlands",id:4096,tag:"nds-NL",version:"Release 10.2"},dsb:Rf,"dsb-de":{language:"Lower Sorbian",location:"Germany",id:2094,tag:"dsb-DE",version:"Release V"},lu:Mf,"lu-cd":{language:"Luba-Katanga",location:"Congo DRC",id:4096,tag:"lu-CD",version:"Release 10"},luo:Tf,"luo-ke":{language:"Luo",location:"Kenya",id:4096,tag:"luo-KE",version:"Release 10"},lb:Bf,"lb-lu":{language:"Luxembourgish",location:"Luxembourg",id:1134,tag:"lb-LU",version:"Release E2"},luy:Nf,"luy-ke":{language:"Luyia",location:"Kenya",id:4096,tag:"luy-KE",version:"Release 10"},mk:Pf,"mk-mk":{language:"Macedonian",location:"North Macedonia",id:1071,tag:"mk-MK",version:"Release C"},jmc:Df,"jmc-tz":{language:"Machame",location:"Tanzania",id:4096,tag:"jmc-TZ",version:"Release 10"},mgh:Of,"mgh-mz":{language:"Makhuwa-Meetto",location:"Mozambique",id:4096,tag:"mgh-MZ",version:"Release 10"},kde:zf,"kde-tz":{language:"Makonde",location:"Tanzania",id:4096,tag:"kde-TZ",version:"Release 10"},mg:Ff,"mg-mg":{language:"Malagasy",location:"Madagascar",id:4096,tag:"mg-MG",version:"Release 8.1"},ms:Lf,"ms-bn":{language:"Malay",location:"Brunei Darussalam",id:2110,tag:"ms-BN",version:"Release C"},"ms-my":{language:"Malay",location:"Malaysia",id:1086,tag:"ms-MY",version:"Release C"},ml:If,"ml-in":{language:"Malayalam",location:"India",id:1100,tag:"ml-IN",version:"Release E1"},mt:jf,"mt-mt":{language:"Maltese",location:"Malta",id:1082,tag:"mt-MT",version:"Release E1"},gv:Hf,"gv-im":{language:"Manx",location:"Isle of Man",id:4096,tag:"gv-IM",version:"Release 10"},mi:Vf,"mi-nz":{language:"Maori",location:"New Zealand",id:1153,tag:"mi-NZ",version:"Release E1"},arn:Gf,"arn-cl":{language:"Mapudungun",location:"Chile",id:1146,tag:"arn-CL",version:"Release E2"},mr:Uf,"mr-in":{language:"Marathi",location:"India",id:1102,tag:"mr-IN",version:"Release C"},mas:Wf,"mas-ke":{language:"Masai",location:"Kenya",id:4096,tag:"mas-KE",version:"Release 10"},"mas-tz":{language:"Masai",location:"Tanzania",id:4096,tag:"mas-TZ",version:"Release 10"},"mzn-ir":{language:"Mazanderani",location:"Iran",id:4096,tag:"mzn-IR",version:"Release 10.1"},mer:Kf,"mer-ke":{language:"Meru",location:"Kenya",id:4096,tag:"mer-KE",version:"Release 10"},mgo:qf,"mgo-cm":{language:"Meta'",location:"Cameroon",id:4096,tag:"mgo-CM",version:"Release 10"},moh:Yf,"moh-ca":{language:"Mohawk",location:"Canada",id:1148,tag:"moh-CA",version:"Release E2"},mn:Xf,"mn-cyrl":{language:"Mongolian (Cyrillic)",location:null,id:30800,tag:"mn-Cyrl",version:"Windows 7"},"mn-mn":{language:"Mongolian (Cyrillic)",location:"Mongolia",id:1104,tag:"mn-MN",version:"Release D"},"mn-mong":{language:"Mongolian (Traditional Mongolian)",location:null,id:31824,tag:"mn-Mong",version:"Windows 7"},"mn-mong-cn":{language:"Mongolian (Traditional Mongolian)",location:"People's Republic of China",id:2128,tag:"mn-Mong-CN",version:"Windows V"},"mn-mong-mn":{language:"Mongolian (Traditional Mongolian)",location:"Mongolia",id:3152,tag:"mn-Mong-MN",version:"Windows 7"},mfe:$f,"mfe-mu":{language:"Morisyen",location:"Mauritius",id:4096,tag:"mfe-MU",version:"Release 10"},mua:Zf,"mua-cm":{language:"Mundang",location:"Cameroon",id:4096,tag:"mua-CM",version:"Release 10"},nqo:Jf,"nqo-gn":{language:"N'ko",location:"Guinea",id:4096,tag:"nqo-GN",version:"Release 8.1"},naq:Qf,"naq-na":{language:"Nama",location:"Namibia",id:4096,tag:"naq-NA",version:"Release 10"},ne:ed,"ne-in":{language:"Nepali",location:"India",id:2145,tag:"ne-IN",version:"Release 8.1"},"ne-np":{language:"Nepali",location:"Nepal",id:1121,tag:"ne-NP",version:"Release E2"},nnh:td,"nnh-cm":{language:"Ngiemboon",location:"Cameroon",id:4096,tag:"nnh-CM",version:"Release 10"},jgo:nd,"jgo-cm":{language:"Ngomba",location:"Cameroon",id:4096,tag:"jgo-CM",version:"Release 10"},"lrc-iq":{language:"Northern Luri",location:"Iraq",id:4096,tag:"lrc-IQ",version:"Release 10.1"},"lrc-ir":{language:"Northern Luri",location:"Iran",id:4096,tag:"lrc-IR",version:"Release 10.1"},nd:id,"nd-zw":{language:"North Ndebele",location:"Zimbabwe",id:4096,tag:"nd-ZW",version:"Release 10"},no:ad,nb:rd,"nb-no":{language:"Norwegian (Bokmal)",location:"Norway",id:1044,tag:"nb-NO",version:"Release A"},nn:od,"nn-no":{language:"Norwegian (Nynorsk)",location:"Norway",id:2068,tag:"nn-NO",version:"Release A"},"nb-sj":{language:"Norwegian Bokmål",location:"Svalbard and Jan Mayen",id:4096,tag:"nb-SJ",version:"Release 10"},nus:sd,"nus-sd":{language:"Nuer",location:"Sudan",id:4096,tag:"nus-SD",version:"Release 10"},"nus-ss":{language:"Nuer",location:"South Sudan",id:4096,tag:"nus-SS",version:"Release 10.1"},nyn:ld,"nyn-ug":{language:"Nyankole",location:"Uganda",id:4096,tag:"nyn-UG",version:"Release 10"},oc:ud,"oc-fr":{language:"Occitan",location:"France",id:1154,tag:"oc-FR",version:"Release V"},or:hd,"or-in":{language:"Odia",location:"India",id:1096,tag:"or-IN",version:"Release V"},om:cd,"om-et":{language:"Oromo",location:"Ethiopia",id:1138,tag:"om-ET",version:"Release 8.1"},"om-ke":{language:"Oromo",location:"Kenya",id:4096,tag:"om-KE",version:"Release 10"},os:fd,"os-ge":{language:"Ossetian",location:"Cyrillic, Georgia",id:4096,tag:"os-GE",version:"Release 10"},"os-ru":{language:"Ossetian",location:"Cyrillic, Russia",id:4096,tag:"os-RU",version:"Release 10"},ps:dd,"ps-af":{language:"Pashto",location:"Afghanistan",id:1123,tag:"ps-AF",version:"Release E2"},"ps-pk":{language:"Pashto",location:"Pakistan",id:4096,tag:"ps-PK",version:"Release 10.5"},fa:gd,"fa-af":{language:"Persian",location:"Afghanistan",id:4096,tag:"fa-AF",version:"Release 10"},"fa-ir":{language:"Persian",location:"Iran",id:1065,tag:"fa-IR",version:"Release B"},pl:pd,"pl-pl":{language:"Polish",location:"Poland",id:1045,tag:"pl-PL",version:"Release A"},pt:vd,"pt-ao":{language:"Portuguese",location:"Angola",id:4096,tag:"pt-AO",version:"Release 8.1"},"pt-br":{language:"Portuguese",location:"Brazil",id:1046,tag:"pt-BR",version:"Release A"},"pt-cv":{language:"Portuguese",location:"Cabo Verde",id:4096,tag:"pt-CV",version:"Release 10"},"pt-gq":{language:"Portuguese",location:"Equatorial Guinea",id:4096,tag:"pt-GQ",version:"Release 10.2"},"pt-gw":{language:"Portuguese",location:"Guinea-Bissau",id:4096,tag:"pt-GW",version:"Release 10"},"pt-lu":{language:"Portuguese",location:"Luxembourg",id:4096,tag:"pt-LU",version:"Release 10.2"},"pt-mo":{language:"Portuguese",location:"Macao SAR",id:4096,tag:"pt-MO",version:"Release 10"},"pt-mz":{language:"Portuguese",location:"Mozambique",id:4096,tag:"pt-MZ",version:"Release 10"},"pt-pt":{language:"Portuguese",location:"Portugal",id:2070,tag:"pt-PT",version:"Release A"},"pt-st":{language:"Portuguese",location:"São Tomé and Príncipe",id:4096,tag:"pt-ST",version:"Release 10"},"pt-ch":{language:"Portuguese",location:"Switzerland",id:4096,tag:"pt-CH",version:"Release 10.2"},"pt-tl":{language:"Portuguese",location:"Timor-Leste",id:4096,tag:"pt-TL",version:"Release 10"},"prg-001":{language:"Prussian",location:null,id:4096,tag:"prg-001",version:"Release 10.1"},"qps-ploca":{language:"Pseudo Language",location:"Pseudo locale for east Asian/complex script localization testing",id:1534,tag:"qps-ploca",version:"Release 7"},"qps-ploc":{language:"Pseudo Language",location:"Pseudo locale used for localization testing",id:1281,tag:"qps-ploc",version:"Release 7"},"qps-plocm":{language:"Pseudo Language",location:"Pseudo locale used for localization testing of mirrored locales",id:2559,tag:"qps-plocm",version:"Release 7"},pa:md,"pa-arab":{language:"Punjabi",location:null,id:31814,tag:"pa-Arab",version:"Release 8"},"pa-in":{language:"Punjabi",location:"India",id:1094,tag:"pa-IN",version:"Release D"},"pa-arab-pk":{language:"Punjabi",location:"Islamic Republic of Pakistan",id:2118,tag:"pa-Arab-PK",version:"Release 8"},quz:yd,"quz-bo":{language:"Quechua",location:"Bolivia",id:1131,tag:"quz-BO",version:"Release E1"},"quz-ec":{language:"Quechua",location:"Ecuador",id:2155,tag:"quz-EC",version:"Release E1"},"quz-pe":{language:"Quechua",location:"Peru",id:3179,tag:"quz-PE",version:"Release E1"},ksh:_d,"ksh-de":{language:"Ripuarian",location:"Germany",id:4096,tag:"ksh-DE",version:"Release 10"},ro:bd,"ro-md":{language:"Romanian",location:"Moldova",id:2072,tag:"ro-MD",version:"Release 8.1"},"ro-ro":{language:"Romanian",location:"Romania",id:1048,tag:"ro-RO",version:"Release A"},rm:wd,"rm-ch":{language:"Romansh",location:"Switzerland",id:1047,tag:"rm-CH",version:"Release E2"},rof:xd,"rof-tz":{language:"Rombo",location:"Tanzania",id:4096,tag:"rof-TZ",version:"Release 10"},rn:kd,"rn-bi":{language:"Rundi",location:"Burundi",id:4096,tag:"rn-BI",version:"Release 10"},ru:Sd,"ru-by":{language:"Russian",location:"Belarus",id:4096,tag:"ru-BY",version:"Release 10"},"ru-kz":{language:"Russian",location:"Kazakhstan",id:4096,tag:"ru-KZ",version:"Release 10"},"ru-kg":{language:"Russian",location:"Kyrgyzstan",id:4096,tag:"ru-KG",version:"Release 10"},"ru-md":{language:"Russian",location:"Moldova",id:2073,tag:"ru-MD",version:"Release 10"},"ru-ru":{language:"Russian",location:"Russia",id:1049,tag:"ru-RU",version:"Release A"},"ru-ua":{language:"Russian",location:"Ukraine",id:4096,tag:"ru-UA",version:"Release 10"},rwk:Cd,"rwk-tz":{language:"Rwa",location:"Tanzania",id:4096,tag:"rwk-TZ",version:"Release 10"},ssy:Ed,"ssy-er":{language:"Saho",location:"Eritrea",id:4096,tag:"ssy-ER",version:"Release 10"},sah:Ad,"sah-ru":{language:"Sakha",location:"Russia",id:1157,tag:"sah-RU",version:"Release V"},saq:Rd,"saq-ke":{language:"Samburu",location:"Kenya",id:4096,tag:"saq-KE",version:"Release 10"},smn:Md,"smn-fi":{language:"Sami (Inari)",location:"Finland",id:9275,tag:"smn-FI",version:"Release E1"},smj:Td,"smj-no":{language:"Sami (Lule)",location:"Norway",id:4155,tag:"smj-NO",version:"Release E1"},"smj-se":{language:"Sami (Lule)",location:"Sweden",id:5179,tag:"smj-SE",version:"Release E1"},se:Bd,"se-fi":{language:"Sami (Northern)",location:"Finland",id:3131,tag:"se-FI",version:"Release E1"},"se-no":{language:"Sami (Northern)",location:"Norway",id:1083,tag:"se-NO",version:"Release E1"},"se-se":{language:"Sami (Northern)",location:"Sweden",id:2107,tag:"se-SE",version:"Release E1"},sms:Nd,"sms-fi":{language:"Sami (Skolt)",location:"Finland",id:8251,tag:"sms-FI",version:"Release E1"},sma:Pd,"sma-no":{language:"Sami (Southern)",location:"Norway",id:6203,tag:"sma-NO",version:"Release E1"},"sma-se":{language:"Sami (Southern)",location:"Sweden",id:7227,tag:"sma-SE",version:"Release E1"},sg:Dd,"sg-cf":{language:"Sango",location:"Central African Republic",id:4096,tag:"sg-CF",version:"Release 10"},sbp:Od,"sbp-tz":{language:"Sangu",location:"Tanzania",id:4096,tag:"sbp-TZ",version:"Release 10"},sa:zd,"sa-in":{language:"Sanskrit",location:"India",id:1103,tag:"sa-IN",version:"Release C"},gd:Fd,"gd-gb":{language:"Scottish Gaelic",location:"United Kingdom",id:1169,tag:"gd-GB",version:"Release 7"},seh:Ld,"seh-mz":{language:"Sena",location:"Mozambique",id:4096,tag:"seh-MZ",version:"Release 10"},"sr-cyrl":{language:"Serbian (Cyrillic)",location:null,id:27674,tag:"sr-Cyrl",version:"Windows 7"},"sr-cyrl-ba":{language:"Serbian (Cyrillic)",location:"Bosnia and Herzegovina",id:7194,tag:"sr-Cyrl-BA",version:"Release E1"},"sr-cyrl-me":{language:"Serbian (Cyrillic)",location:"Montenegro",id:12314,tag:"sr-Cyrl-ME",version:"Release 7"},"sr-cyrl-rs":{language:"Serbian (Cyrillic)",location:"Serbia",id:10266,tag:"sr-Cyrl-RS",version:"Release 7"},"sr-cyrl-cs":{language:"Serbian (Cyrillic)",location:"Serbia and Montenegro (Former)",id:3098,tag:"sr-Cyrl-CS",version:"Release B"},"sr-latn":{language:"Serbian (Latin)",location:null,id:28698,tag:"sr-Latn",version:"Windows 7"},sr:Id,"sr-latn-ba":{language:"Serbian (Latin)",location:"Bosnia and Herzegovina",id:6170,tag:"sr-Latn-BA",version:"Release E1"},"sr-latn-me":{language:"Serbian (Latin)",location:"Montenegro",id:11290,tag:"sr-Latn-ME",version:"Release 7"},"sr-latn-rs":{language:"Serbian (Latin)",location:"Serbia",id:9242,tag:"sr-Latn-RS",version:"Release 7"},"sr-latn-cs":{language:"Serbian (Latin)",location:"Serbia and Montenegro (Former)",id:2074,tag:"sr-Latn-CS",version:"Release B"},nso:jd,"nso-za":{language:"Sesotho sa Leboa",location:"South Africa",id:1132,tag:"nso-ZA",version:"Release E1"},tn:Hd,"tn-bw":{language:"Setswana",location:"Botswana",id:2098,tag:"tn-BW",version:"Release 8"},"tn-za":{language:"Setswana",location:"South Africa",id:1074,tag:"tn-ZA",version:"Release E1"},ksb:Vd,"ksb-tz":{language:"Shambala",location:"Tanzania",id:4096,tag:"ksb-TZ",version:"Release 10"},sn:Gd,"sn-latn":{language:"Shona",location:"Latin",id:4096,tag:"sn-Latn",version:"Release 8.1"},"sn-latn-zw":{language:"Shona",location:"Zimbabwe",id:4096,tag:"sn-Latn-ZW",version:"Release 8.1"},sd:Ud,"sd-arab":{language:"Sindhi",location:null,id:31833,tag:"sd-Arab",version:"Release 8"},"sd-arab-pk":{language:"Sindhi",location:"Islamic Republic of Pakistan",id:2137,tag:"sd-Arab-PK",version:"Release 8"},si:Wd,"si-lk":{language:"Sinhala",location:"Sri Lanka",id:1115,tag:"si-LK",version:"Release V"},sk:Kd,"sk-sk":{language:"Slovak",location:"Slovakia",id:1051,tag:"sk-SK",version:"Release A"},sl:qd,"sl-si":{language:"Slovenian",location:"Slovenia",id:1060,tag:"sl-SI",version:"Release A"},xog:Yd,"xog-ug":{language:"Soga",location:"Uganda",id:4096,tag:"xog-UG",version:"Release 10"},so:Xd,"so-dj":{language:"Somali",location:"Djibouti",id:4096,tag:"so-DJ",version:"Release 10"},"so-et":{language:"Somali",location:"Ethiopia",id:4096,tag:"so-ET",version:"Release 10"},"so-ke":{language:"Somali",location:"Kenya",id:4096,tag:"so-KE",version:"Release 10"},"so-so":{language:"Somali",location:"Somalia",id:1143,tag:"so-SO",version:"Release 8.1"},st:$d,"st-za":{language:"Sotho",location:"South Africa",id:1072,tag:"st-ZA",version:"Release 8.1"},nr:Zd,"nr-za":{language:"South Ndebele",location:"South Africa",id:4096,tag:"nr-ZA",version:"Release 10"},"st-ls":{language:"Southern Sotho",location:"Lesotho",id:4096,tag:"st-LS",version:"Release 10"},es:Jd,"es-ar":{language:"Spanish",location:"Argentina",id:11274,tag:"es-AR",version:"Release B"},"es-bz":{language:"Spanish",location:"Belize",id:4096,tag:"es-BZ",version:"Release 10.3"},"es-ve":{language:"Spanish",location:"Bolivarian Republic of Venezuela",id:8202,tag:"es-VE",version:"Release B"},"es-bo":{language:"Spanish",location:"Bolivia",id:16394,tag:"es-BO",version:"Release B"},"es-br":{language:"Spanish",location:"Brazil",id:4096,tag:"es-BR",version:"Release 10.2"},"es-cl":{language:"Spanish",location:"Chile",id:13322,tag:"es-CL",version:"Release B"},"es-co":{language:"Spanish",location:"Colombia",id:9226,tag:"es-CO",version:"Release B"},"es-cr":{language:"Spanish",location:"Costa Rica",id:5130,tag:"es-CR",version:"Release B"},"es-cu":{language:"Spanish",location:"Cuba",id:23562,tag:"es-CU",version:"Release 10"},"es-do":{language:"Spanish",location:"Dominican Republic",id:7178,tag:"es-DO",version:"Release B"},"es-ec":{language:"Spanish",location:"Ecuador",id:12298,tag:"es-EC",version:"Release B"},"es-sv":{language:"Spanish",location:"El Salvador",id:17418,tag:"es-SV",version:"Release B"},"es-gq":{language:"Spanish",location:"Equatorial Guinea",id:4096,tag:"es-GQ",version:"Release 10"},"es-gt":{language:"Spanish",location:"Guatemala",id:4106,tag:"es-GT",version:"Release B"},"es-hn":{language:"Spanish",location:"Honduras",id:18442,tag:"es-HN",version:"Release B"},"es-419":{language:"Spanish",location:"Latin America",id:22538,tag:"es-419",version:"Release 8.1"},"es-mx":{language:"Spanish",location:"Mexico",id:2058,tag:"es-MX",version:"Release A"},"es-ni":{language:"Spanish",location:"Nicaragua",id:19466,tag:"es-NI",version:"Release B"},"es-pa":{language:"Spanish",location:"Panama",id:6154,tag:"es-PA",version:"Release B"},"es-py":{language:"Spanish",location:"Paraguay",id:15370,tag:"es-PY",version:"Release B"},"es-pe":{language:"Spanish",location:"Peru",id:10250,tag:"es-PE",version:"Release B"},"es-ph":{language:"Spanish",location:"Philippines",id:4096,tag:"es-PH",version:"Release 10"},"es-pr":{language:"Spanish",location:"Puerto Rico",id:20490,tag:"es-PR",version:"Release B"},"es-es_tradnl":{language:"Spanish",location:"Spain",id:1034,tag:"es-ES_tradnl",version:"Release A"},"es-es":{language:"Spanish",location:"Spain",id:3082,tag:"es-ES",version:"Release A"},"es-us":{language:"Spanish",location:"UnitedStates",id:21514,tag:"es-US",version:"Release V"},"es-uy":{language:"Spanish",location:"Uruguay",id:14346,tag:"es-UY",version:"Release B"},zgh:Qd,"zgh-tfng-ma":{language:"Standard Moroccan Tamazight",location:"Morocco",id:4096,tag:"zgh-Tfng-MA",version:"Release 8.1"},"zgh-tfng":{language:"Standard Moroccan Tamazight",location:"Tifinagh",id:4096,tag:"zgh-Tfng",version:"Release 8.1"},ss:eg,"ss-za":{language:"Swati",location:"South Africa",id:4096,tag:"ss-ZA",version:"Release 10"},"ss-sz":{language:"Swati",location:"Swaziland",id:4096,tag:"ss-SZ",version:"Release 10"},sv:tg,"sv-ax":{language:"Swedish",location:"Åland Islands",id:4096,tag:"sv-AX",version:"Release 10"},"sv-fi":{language:"Swedish",location:"Finland",id:2077,tag:"sv-FI",version:"Release B"},"sv-se":{language:"Swedish",location:"Sweden",id:1053,tag:"sv-SE",version:"Release A"},syr:ng,"syr-sy":{language:"Syriac",location:"Syria",id:1114,tag:"syr-SY",version:"Release D"},shi:ig,"shi-tfng":{language:"Tachelhit",location:"Tifinagh",id:4096,tag:"shi-Tfng",version:"Release 10"},"shi-tfng-ma":{language:"Tachelhit",location:"Tifinagh, Morocco",id:4096,tag:"shi-Tfng-MA",version:"Release 10"},"shi-latn":{language:"Tachelhit (Latin)",location:null,id:4096,tag:"shi-Latn",version:"Release 10"},"shi-latn-ma":{language:"Tachelhit (Latin)",location:"Morocco",id:4096,tag:"shi-Latn-MA",version:"Release 10"},dav:ag,"dav-ke":{language:"Taita",location:"Kenya",id:4096,tag:"dav-KE",version:"Release 10"},tg:rg,"tg-cyrl":{language:"Tajik (Cyrillic)",location:null,id:31784,tag:"tg-Cyrl",version:"Windows 7"},"tg-cyrl-tj":{language:"Tajik (Cyrillic)",location:"Tajikistan",id:1064,tag:"tg-Cyrl-TJ",version:"Release V"},tzm:og,"tzm-latn":{language:"Tamazight (Latin)",location:null,id:31839,tag:"tzm-Latn",version:"Windows 7"},"tzm-latn-dz":{language:"Tamazight (Latin)",location:"Algeria",id:2143,tag:"tzm-Latn-DZ",version:"Release V"},ta:sg,"ta-in":{language:"Tamil",location:"India",id:1097,tag:"ta-IN",version:"Release C"},"ta-my":{language:"Tamil",location:"Malaysia",id:4096,tag:"ta-MY",version:"Release 10"},"ta-sg":{language:"Tamil",location:"Singapore",id:4096,tag:"ta-SG",version:"Release 10"},"ta-lk":{language:"Tamil",location:"Sri Lanka",id:2121,tag:"ta-LK",version:"Release 8"},twq:lg,"twq-ne":{language:"Tasawaq",location:"Niger",id:4096,tag:"twq-NE",version:"Release 10"},tt:ug,"tt-ru":{language:"Tatar",location:"Russia",id:1092,tag:"tt-RU",version:"Release D"},te:hg,"te-in":{language:"Telugu",location:"India",id:1098,tag:"te-IN",version:"Release D"},teo:cg,"teo-ke":{language:"Teso",location:"Kenya",id:4096,tag:"teo-KE",version:"Release 10"},"teo-ug":{language:"Teso",location:"Uganda",id:4096,tag:"teo-UG",version:"Release 10"},th:fg,"th-th":{language:"Thai",location:"Thailand",id:1054,tag:"th-TH",version:"Release B"},bo:dg,"bo-in":{language:"Tibetan",location:"India",id:4096,tag:"bo-IN",version:"Release 10"},"bo-cn":{language:"Tibetan",location:"People's Republic of China",id:1105,tag:"bo-CN",version:"Release V"},tig:gg,"tig-er":{language:"Tigre",location:"Eritrea",id:4096,tag:"tig-ER",version:"Release 10"},ti:pg,"ti-er":{language:"Tigrinya",location:"Eritrea",id:2163,tag:"ti-ER",version:"Release 8"},"ti-et":{language:"Tigrinya",location:"Ethiopia",id:1139,tag:"ti-ET",version:"Release 8"},to:vg,"to-to":{language:"Tongan",location:"Tonga",id:4096,tag:"to-TO",version:"Release 10"},ts:mg,"ts-za":{language:"Tsonga",location:"South Africa",id:1073,tag:"ts-ZA",version:"Release 8.1"},tr:yg,"tr-cy":{language:"Turkish",location:"Cyprus",id:4096,tag:"tr-CY",version:"Release 10"},"tr-tr":{language:"Turkish",location:"Turkey",id:1055,tag:"tr-TR",version:"Release A"},tk:_g,"tk-tm":{language:"Turkmen",location:"Turkmenistan",id:1090,tag:"tk-TM",version:"Release V"},uk:bg,"uk-ua":{language:"Ukrainian",location:"Ukraine",id:1058,tag:"uk-UA",version:"Release B"},hsb:wg,"hsb-de":{language:"Upper Sorbian",location:"Germany",id:1070,tag:"hsb-DE",version:"Release V"},ur:xg,"ur-in":{language:"Urdu",location:"India",id:2080,tag:"ur-IN",version:"Release 8.1"},"ur-pk":{language:"Urdu",location:"Islamic Republic of Pakistan",id:1056,tag:"ur-PK",version:"Release C"},ug:kg,"ug-cn":{language:"Uyghur",location:"People's Republic of China",id:1152,tag:"ug-CN",version:"Release V"},"uz-arab":{language:"Uzbek",location:"Perso-Arabic",id:4096,tag:"uz-Arab",version:"Release 10"},"uz-arab-af":{language:"Uzbek",location:"Perso-Arabic, Afghanistan",id:4096,tag:"uz-Arab-AF",version:"Release 10"},"uz-cyrl":{language:"Uzbek (Cyrillic)",location:null,id:30787,tag:"uz-Cyrl",version:"Windows 7"},"uz-cyrl-uz":{language:"Uzbek (Cyrillic)",location:"Uzbekistan",id:2115,tag:"uz-Cyrl-UZ",version:"Release C"},uz:Sg,"uz-latn":{language:"Uzbek (Latin)",location:null,id:31811,tag:"uz-Latn",version:"Windows7"},"uz-latn-uz":{language:"Uzbek (Latin)",location:"Uzbekistan",id:1091,tag:"uz-Latn-UZ",version:"Release C"},vai:Cg,"vai-vaii":{language:"Vai",location:null,id:4096,tag:"vai-Vaii",version:"Release 10"},"vai-vaii-lr":{language:"Vai",location:"Liberia",id:4096,tag:"vai-Vaii-LR",version:"Release 10"},"vai-latn-lr":{language:"Vai (Latin)",location:"Liberia",id:4096,tag:"vai-Latn-LR",version:"Release 10"},"vai-latn":{language:"Vai (Latin)",location:null,id:4096,tag:"vai-Latn",version:"Release 10"},"ca-es-":{language:"Valencian",location:"Spain",id:2051,tag:"ca-ES-",version:"Release 8"},ve:Eg,"ve-za":{language:"Venda",location:"South Africa",id:1075,tag:"ve-ZA",version:"Release 10"},vi:Ag,"vi-vn":{language:"Vietnamese",location:"Vietnam",id:1066,tag:"vi-VN",version:"Release B"},vo:Rg,"vo-001":{language:"Volapük",location:"World",id:4096,tag:"vo-001",version:"Release 10"},vun:Mg,"vun-tz":{language:"Vunjo",location:"Tanzania",id:4096,tag:"vun-TZ",version:"Release 10"},wae:Tg,"wae-ch":{language:"Walser",location:"Switzerland",id:4096,tag:"wae-CH",version:"Release 10"},cy:Bg,"cy-gb":{language:"Welsh",location:"United Kingdom",id:1106,tag:"cy-GB",version:"ReleaseE1"},wal:Ng,"wal-et":{language:"Wolaytta",location:"Ethiopia",id:4096,tag:"wal-ET",version:"Release 10"},wo:Pg,"wo-sn":{language:"Wolof",location:"Senegal",id:1160,tag:"wo-SN",version:"Release V"},xh:Dg,"xh-za":{language:"Xhosa",location:"South Africa",id:1076,tag:"xh-ZA",version:"Release E1"},yav:Og,"yav-cm":{language:"Yangben",location:"Cameroon",id:4096,tag:"yav-CM",version:"Release 10"},ii:zg,"ii-cn":{language:"Yi",location:"People's Republic of China",id:1144,tag:"ii-CN",version:"Release V"},yo:Fg,"yo-bj":{language:"Yoruba",location:"Benin",id:4096,tag:"yo-BJ",version:"Release 10"},"yo-ng":{language:"Yoruba",location:"Nigeria",id:1130,tag:"yo-NG",version:"Release V"},dje:Lg,"dje-ne":{language:"Zarma",location:"Niger",id:4096,tag:"dje-NE",version:"Release 10"},zu:Ig,"zu-za":{language:"Zulu",location:"South Africa",id:1077,tag:"zu-ZA",version:"Release E1"}};var Hg={name:"Abkhazian",names:["Abkhazian"],"iso639-2":"abk","iso639-1":"ab"};var Vg={name:"Achinese",names:["Achinese"],"iso639-2":"ace","iso639-1":null};var Gg={name:"Acoli",names:["Acoli"],"iso639-2":"ach","iso639-1":null};var Ug={name:"Adangme",names:["Adangme"],"iso639-2":"ada","iso639-1":null};var Wg={name:"Adygei",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var Kg={name:"Adyghe",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var qg={name:"Afar",names:["Afar"],"iso639-2":"aar","iso639-1":"aa"};var Yg={name:"Afrihili",names:["Afrihili"],"iso639-2":"afh","iso639-1":null};var Xg={name:"Afrikaans",names:["Afrikaans"],"iso639-2":"afr","iso639-1":"af"};var $g={name:"Ainu",names:["Ainu"],"iso639-2":"ain","iso639-1":null};var Zg={name:"Akan",names:["Akan"],"iso639-2":"aka","iso639-1":"ak"};var Jg={name:"Akkadian",names:["Akkadian"],"iso639-2":"akk","iso639-1":null};var Qg={name:"Albanian",names:["Albanian"],"iso639-2":"alb/sqi","iso639-1":"sq"};var ep={name:"Alemannic",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var tp={name:"Aleut",names:["Aleut"],"iso639-2":"ale","iso639-1":null};var np={name:"Alsatian",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var ip={name:"Amharic",names:["Amharic"],"iso639-2":"amh","iso639-1":"am"};var ap={name:"Angika",names:["Angika"],"iso639-2":"anp","iso639-1":null};var rp={name:"Arabic",names:["Arabic"],"iso639-2":"ara","iso639-1":"ar"};var op={name:"Aragonese",names:["Aragonese"],"iso639-2":"arg","iso639-1":"an"};var sp={name:"Arapaho",names:["Arapaho"],"iso639-2":"arp","iso639-1":null};var lp={name:"Arawak",names:["Arawak"],"iso639-2":"arw","iso639-1":null};var up={name:"Armenian",names:["Armenian"],"iso639-2":"arm/hye","iso639-1":"hy"};var hp={name:"Aromanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var cp={name:"Arumanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var fp={name:"Assamese",names:["Assamese"],"iso639-2":"asm","iso639-1":"as"};var dp={name:"Asturian",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var gp={name:"Asturleonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var pp={name:"Avaric",names:["Avaric"],"iso639-2":"ava","iso639-1":"av"};var vp={name:"Avestan",names:["Avestan"],"iso639-2":"ave","iso639-1":"ae"};var mp={name:"Awadhi",names:["Awadhi"],"iso639-2":"awa","iso639-1":null};var yp={name:"Aymara",names:["Aymara"],"iso639-2":"aym","iso639-1":"ay"};var _p={name:"Azerbaijani",names:["Azerbaijani"],"iso639-2":"aze","iso639-1":"az"};var bp={name:"Bable",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var wp={name:"Balinese",names:["Balinese"],"iso639-2":"ban","iso639-1":null};var xp={name:"Baluchi",names:["Baluchi"],"iso639-2":"bal","iso639-1":null};var kp={name:"Bambara",names:["Bambara"],"iso639-2":"bam","iso639-1":"bm"};var Sp={name:"Basa",names:["Basa"],"iso639-2":"bas","iso639-1":null};var Cp={name:"Bashkir",names:["Bashkir"],"iso639-2":"bak","iso639-1":"ba"};var Ep={name:"Basque",names:["Basque"],"iso639-2":"baq/eus","iso639-1":"eu"};var Ap={name:"Bedawiyet",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var Rp={name:"Beja",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var Mp={name:"Belarusian",names:["Belarusian"],"iso639-2":"bel","iso639-1":"be"};var Tp={name:"Bemba",names:["Bemba"],"iso639-2":"bem","iso639-1":null};var Bp={name:"Bengali",names:["Bengali"],"iso639-2":"ben","iso639-1":"bn"};var Np={name:"Bhojpuri",names:["Bhojpuri"],"iso639-2":"bho","iso639-1":null};var Pp={name:"Bikol",names:["Bikol"],"iso639-2":"bik","iso639-1":null};var Dp={name:"Bilin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var Op={name:"Bini",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var zp={name:"Bislama",names:["Bislama"],"iso639-2":"bis","iso639-1":"bi"};var Fp={name:"Blin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var Lp={name:"Bliss",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var Ip={name:"Blissymbolics",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var jp={name:"Blissymbols",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var Hp={name:"Bosnian",names:["Bosnian"],"iso639-2":"bos","iso639-1":"bs"};var Vp={name:"Braj",names:["Braj"],"iso639-2":"bra","iso639-1":null};var Gp={name:"Breton",names:["Breton"],"iso639-2":"bre","iso639-1":"br"};var Up={name:"Buginese",names:["Buginese"],"iso639-2":"bug","iso639-1":null};var Wp={name:"Bulgarian",names:["Bulgarian"],"iso639-2":"bul","iso639-1":"bg"};var Kp={name:"Buriat",names:["Buriat"],"iso639-2":"bua","iso639-1":null};var qp={name:"Burmese",names:["Burmese"],"iso639-2":"bur/mya","iso639-1":"my"};var Yp={name:"Caddo",names:["Caddo"],"iso639-2":"cad","iso639-1":null};var Xp={name:"Castilian",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var $p={name:"Catalan",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var Zp={name:"Cebuano",names:["Cebuano"],"iso639-2":"ceb","iso639-1":null};var Jp={name:"Chagatai",names:["Chagatai"],"iso639-2":"chg","iso639-1":null};var Qp={name:"Chamorro",names:["Chamorro"],"iso639-2":"cha","iso639-1":"ch"};var ev={name:"Chechen",names:["Chechen"],"iso639-2":"che","iso639-1":"ce"};var tv={name:"Cherokee",names:["Cherokee"],"iso639-2":"chr","iso639-1":null};var nv={name:"Chewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var iv={name:"Cheyenne",names:["Cheyenne"],"iso639-2":"chy","iso639-1":null};var av={name:"Chibcha",names:["Chibcha"],"iso639-2":"chb","iso639-1":null};var rv={name:"Chichewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var ov={name:"Chinese",names:["Chinese"],"iso639-2":"chi/zho","iso639-1":"zh"};var sv={name:"Chipewyan",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null};var lv={name:"Choctaw",names:["Choctaw"],"iso639-2":"cho","iso639-1":null};var uv={name:"Chuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var hv={name:"Chuukese",names:["Chuukese"],"iso639-2":"chk","iso639-1":null};var cv={name:"Chuvash",names:["Chuvash"],"iso639-2":"chv","iso639-1":"cv"};var fv={name:"Coptic",names:["Coptic"],"iso639-2":"cop","iso639-1":null};var dv={name:"Cornish",names:["Cornish"],"iso639-2":"cor","iso639-1":"kw"};var gv={name:"Corsican",names:["Corsican"],"iso639-2":"cos","iso639-1":"co"};var pv={name:"Cree",names:["Cree"],"iso639-2":"cre","iso639-1":"cr"};var vv={name:"Creek",names:["Creek"],"iso639-2":"mus","iso639-1":null};var mv={name:"Croatian",names:["Croatian"],"iso639-2":"hrv","iso639-1":"hr"};var yv={name:"Czech",names:["Czech"],"iso639-2":"cze/ces","iso639-1":"cs"};var _v={name:"Dakota",names:["Dakota"],"iso639-2":"dak","iso639-1":null};var bv={name:"Danish",names:["Danish"],"iso639-2":"dan","iso639-1":"da"};var wv={name:"Dargwa",names:["Dargwa"],"iso639-2":"dar","iso639-1":null};var xv={name:"Delaware",names:["Delaware"],"iso639-2":"del","iso639-1":null};var kv={name:"Dhivehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var Sv={name:"Dimili",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var Cv={name:"Dimli",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var Ev={name:"Dinka",names:["Dinka"],"iso639-2":"din","iso639-1":null};var Av={name:"Divehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var Rv={name:"Dogri",names:["Dogri"],"iso639-2":"doi","iso639-1":null};var Mv={name:"Dogrib",names:["Dogrib"],"iso639-2":"dgr","iso639-1":null};var Tv={name:"Duala",names:["Duala"],"iso639-2":"dua","iso639-1":null};var Bv={name:"Dutch",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var Nv={name:"Dyula",names:["Dyula"],"iso639-2":"dyu","iso639-1":null};var Pv={name:"Dzongkha",names:["Dzongkha"],"iso639-2":"dzo","iso639-1":"dz"};var Dv={name:"Edo",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var Ov={name:"Efik",names:["Efik"],"iso639-2":"efi","iso639-1":null};var zv={name:"Ekajuk",names:["Ekajuk"],"iso639-2":"eka","iso639-1":null};var Fv={name:"Elamite",names:["Elamite"],"iso639-2":"elx","iso639-1":null};var Lv={name:"English",names:["English"],"iso639-2":"eng","iso639-1":"en"};var Iv={name:"Erzya",names:["Erzya"],"iso639-2":"myv","iso639-1":null};var jv={name:"Esperanto",names:["Esperanto"],"iso639-2":"epo","iso639-1":"eo"};var Hv={name:"Estonian",names:["Estonian"],"iso639-2":"est","iso639-1":"et"};var Vv={name:"Ewe",names:["Ewe"],"iso639-2":"ewe","iso639-1":"ee"};var Gv={name:"Ewondo",names:["Ewondo"],"iso639-2":"ewo","iso639-1":null};var Uv={name:"Fang",names:["Fang"],"iso639-2":"fan","iso639-1":null};var Wv={name:"Fanti",names:["Fanti"],"iso639-2":"fat","iso639-1":null};var Kv={name:"Faroese",names:["Faroese"],"iso639-2":"fao","iso639-1":"fo"};var qv={name:"Fijian",names:["Fijian"],"iso639-2":"fij","iso639-1":"fj"};var Yv={name:"Filipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var Xv={name:"Finnish",names:["Finnish"],"iso639-2":"fin","iso639-1":"fi"};var $v={name:"Flemish",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var Zv={name:"Fon",names:["Fon"],"iso639-2":"fon","iso639-1":null};var Jv={name:"French",names:["French"],"iso639-2":"fre/fra","iso639-1":"fr"};var Qv={name:"Friulian",names:["Friulian"],"iso639-2":"fur","iso639-1":null};var em={name:"Fulah",names:["Fulah"],"iso639-2":"ful","iso639-1":"ff"};var tm={name:"Ga",names:["Ga"],"iso639-2":"gaa","iso639-1":null};var nm={name:"Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"};var im={name:"Galician",names:["Galician"],"iso639-2":"glg","iso639-1":"gl"};var am={name:"Ganda",names:["Ganda"],"iso639-2":"lug","iso639-1":"lg"};var rm={name:"Gayo",names:["Gayo"],"iso639-2":"gay","iso639-1":null};var om={name:"Gbaya",names:["Gbaya"],"iso639-2":"gba","iso639-1":null};var sm={name:"Geez",names:["Geez"],"iso639-2":"gez","iso639-1":null};var lm={name:"Georgian",names:["Georgian"],"iso639-2":"geo/kat","iso639-1":"ka"};var um={name:"German",names:["German"],"iso639-2":"ger/deu","iso639-1":"de"};var hm={name:"Gikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var cm={name:"Gilbertese",names:["Gilbertese"],"iso639-2":"gil","iso639-1":null};var fm={name:"Gondi",names:["Gondi"],"iso639-2":"gon","iso639-1":null};var dm={name:"Gorontalo",names:["Gorontalo"],"iso639-2":"gor","iso639-1":null};var gm={name:"Gothic",names:["Gothic"],"iso639-2":"got","iso639-1":null};var pm={name:"Grebo",names:["Grebo"],"iso639-2":"grb","iso639-1":null};var vm={name:"Greenlandic",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var mm={name:"Guarani",names:["Guarani"],"iso639-2":"grn","iso639-1":"gn"};var ym={name:"Gujarati",names:["Gujarati"],"iso639-2":"guj","iso639-1":"gu"};var _m={name:"Haida",names:["Haida"],"iso639-2":"hai","iso639-1":null};var bm={name:"Haitian",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"};var wm={name:"Hausa",names:["Hausa"],"iso639-2":"hau","iso639-1":"ha"};var xm={name:"Hawaiian",names:["Hawaiian"],"iso639-2":"haw","iso639-1":null};var km={name:"Hebrew",names:["Hebrew"],"iso639-2":"heb","iso639-1":"he"};var Sm={name:"Herero",names:["Herero"],"iso639-2":"her","iso639-1":"hz"};var Cm={name:"Hiligaynon",names:["Hiligaynon"],"iso639-2":"hil","iso639-1":null};var Em={name:"Hindi",names:["Hindi"],"iso639-2":"hin","iso639-1":"hi"};var Am={name:"Hittite",names:["Hittite"],"iso639-2":"hit","iso639-1":null};var Rm={name:"Hmong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var Mm={name:"Hungarian",names:["Hungarian"],"iso639-2":"hun","iso639-1":"hu"};var Tm={name:"Hupa",names:["Hupa"],"iso639-2":"hup","iso639-1":null};var Bm={name:"Iban",names:["Iban"],"iso639-2":"iba","iso639-1":null};var Nm={name:"Icelandic",names:["Icelandic"],"iso639-2":"ice/isl","iso639-1":"is"};var Pm={name:"Ido",names:["Ido"],"iso639-2":"ido","iso639-1":"io"};var Dm={name:"Igbo",names:["Igbo"],"iso639-2":"ibo","iso639-1":"ig"};var Om={name:"Iloko",names:["Iloko"],"iso639-2":"ilo","iso639-1":null};var zm={name:"Indonesian",names:["Indonesian"],"iso639-2":"ind","iso639-1":"id"};var Fm={name:"Ingush",names:["Ingush"],"iso639-2":"inh","iso639-1":null};var Lm={name:"Interlingue",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Im={name:"Inuktitut",names:["Inuktitut"],"iso639-2":"iku","iso639-1":"iu"};var jm={name:"Inupiaq",names:["Inupiaq"],"iso639-2":"ipk","iso639-1":"ik"};var Hm={name:"Irish",names:["Irish"],"iso639-2":"gle","iso639-1":"ga"};var Vm={name:"Italian",names:["Italian"],"iso639-2":"ita","iso639-1":"it"};var Gm={name:"Japanese",names:["Japanese"],"iso639-2":"jpn","iso639-1":"ja"};var Um={name:"Javanese",names:["Javanese"],"iso639-2":"jav","iso639-1":"jv"};var Wm={name:"Jingpho",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Km={name:"Kabardian",names:["Kabardian"],"iso639-2":"kbd","iso639-1":null};var qm={name:"Kabyle",names:["Kabyle"],"iso639-2":"kab","iso639-1":null};var Ym={name:"Kachin",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Xm={name:"Kalaallisut",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var $m={name:"Kalmyk",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var Zm={name:"Kamba",names:["Kamba"],"iso639-2":"kam","iso639-1":null};var Jm={name:"Kannada",names:["Kannada"],"iso639-2":"kan","iso639-1":"kn"};var Qm={name:"Kanuri",names:["Kanuri"],"iso639-2":"kau","iso639-1":"kr"};var ey={name:"Kapampangan",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var ty={name:"Karelian",names:["Karelian"],"iso639-2":"krl","iso639-1":null};var ny={name:"Kashmiri",names:["Kashmiri"],"iso639-2":"kas","iso639-1":"ks"};var iy={name:"Kashubian",names:["Kashubian"],"iso639-2":"csb","iso639-1":null};var ay={name:"Kawi",names:["Kawi"],"iso639-2":"kaw","iso639-1":null};var ry={name:"Kazakh",names:["Kazakh"],"iso639-2":"kaz","iso639-1":"kk"};var oy={name:"Khasi",names:["Khasi"],"iso639-2":"kha","iso639-1":null};var sy={name:"Khotanese",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var ly={name:"Kikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var uy={name:"Kimbundu",names:["Kimbundu"],"iso639-2":"kmb","iso639-1":null};var hy={name:"Kinyarwanda",names:["Kinyarwanda"],"iso639-2":"kin","iso639-1":"rw"};var cy={name:"Kirdki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var fy={name:"Kirghiz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var dy={name:"Kirmanjki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var gy={name:"Klingon",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null};var py={name:"Komi",names:["Komi"],"iso639-2":"kom","iso639-1":"kv"};var vy={name:"Kongo",names:["Kongo"],"iso639-2":"kon","iso639-1":"kg"};var my={name:"Konkani",names:["Konkani"],"iso639-2":"kok","iso639-1":null};var yy={name:"Korean",names:["Korean"],"iso639-2":"kor","iso639-1":"ko"};var _y={name:"Kosraean",names:["Kosraean"],"iso639-2":"kos","iso639-1":null};var by={name:"Kpelle",names:["Kpelle"],"iso639-2":"kpe","iso639-1":null};var wy={name:"Kuanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var xy={name:"Kumyk",names:["Kumyk"],"iso639-2":"kum","iso639-1":null};var ky={name:"Kurdish",names:["Kurdish"],"iso639-2":"kur","iso639-1":"ku"};var Sy={name:"Kurukh",names:["Kurukh"],"iso639-2":"kru","iso639-1":null};var Cy={name:"Kutenai",names:["Kutenai"],"iso639-2":"kut","iso639-1":null};var Ey={name:"Kwanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var Ay={name:"Kyrgyz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var Ry={name:"Ladino",names:["Ladino"],"iso639-2":"lad","iso639-1":null};var My={name:"Lahnda",names:["Lahnda"],"iso639-2":"lah","iso639-1":null};var Ty={name:"Lamba",names:["Lamba"],"iso639-2":"lam","iso639-1":null};var By={name:"Lao",names:["Lao"],"iso639-2":"lao","iso639-1":"lo"};var Ny={name:"Latin",names:["Latin"],"iso639-2":"lat","iso639-1":"la"};var Py={name:"Latvian",names:["Latvian"],"iso639-2":"lav","iso639-1":"lv"};var Dy={name:"Leonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var Oy={name:"Letzeburgesch",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var zy={name:"Lezghian",names:["Lezghian"],"iso639-2":"lez","iso639-1":null};var Fy={name:"Limburgan",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Ly={name:"Limburger",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Iy={name:"Limburgish",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var jy={name:"Lingala",names:["Lingala"],"iso639-2":"lin","iso639-1":"ln"};var Hy={name:"Lithuanian",names:["Lithuanian"],"iso639-2":"lit","iso639-1":"lt"};var Vy={name:"Lojban",names:["Lojban"],"iso639-2":"jbo","iso639-1":null};var Gy={name:"Lozi",names:["Lozi"],"iso639-2":"loz","iso639-1":null};var Uy={name:"Luiseno",names:["Luiseno"],"iso639-2":"lui","iso639-1":null};var Wy={name:"Lunda",names:["Lunda"],"iso639-2":"lun","iso639-1":null};var Ky={name:"Lushai",names:["Lushai"],"iso639-2":"lus","iso639-1":null};var qy={name:"Luxembourgish",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var Yy={name:"Macedonian",names:["Macedonian"],"iso639-2":"mac/mkd","iso639-1":"mk"};var Xy={name:"Madurese",names:["Madurese"],"iso639-2":"mad","iso639-1":null};var $y={name:"Magahi",names:["Magahi"],"iso639-2":"mag","iso639-1":null};var Zy={name:"Maithili",names:["Maithili"],"iso639-2":"mai","iso639-1":null};var Jy={name:"Makasar",names:["Makasar"],"iso639-2":"mak","iso639-1":null};var Qy={name:"Malagasy",names:["Malagasy"],"iso639-2":"mlg","iso639-1":"mg"};var e_={name:"Malay",names:["Malay"],"iso639-2":"may/msa","iso639-1":"ms"};var t_={name:"Malayalam",names:["Malayalam"],"iso639-2":"mal","iso639-1":"ml"};var n_={name:"Maldivian",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var i_={name:"Maltese",names:["Maltese"],"iso639-2":"mlt","iso639-1":"mt"};var a_={name:"Manchu",names:["Manchu"],"iso639-2":"mnc","iso639-1":null};var r_={name:"Mandar",names:["Mandar"],"iso639-2":"mdr","iso639-1":null};var o_={name:"Mandingo",names:["Mandingo"],"iso639-2":"man","iso639-1":null};var s_={name:"Manipuri",names:["Manipuri"],"iso639-2":"mni","iso639-1":null};var l_={name:"Manx",names:["Manx"],"iso639-2":"glv","iso639-1":"gv"};var u_={name:"Maori",names:["Maori"],"iso639-2":"mao/mri","iso639-1":"mi"};var h_={name:"Mapuche",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var c_={name:"Mapudungun",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var f_={name:"Marathi",names:["Marathi"],"iso639-2":"mar","iso639-1":"mr"};var d_={name:"Mari",names:["Mari"],"iso639-2":"chm","iso639-1":null};var g_={name:"Marshallese",names:["Marshallese"],"iso639-2":"mah","iso639-1":"mh"};var p_={name:"Marwari",names:["Marwari"],"iso639-2":"mwr","iso639-1":null};var v_={name:"Masai",names:["Masai"],"iso639-2":"mas","iso639-1":null};var m_={name:"Mende",names:["Mende"],"iso639-2":"men","iso639-1":null};var y_={name:"Micmac",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null};var __={name:"Minangkabau",names:["Minangkabau"],"iso639-2":"min","iso639-1":null};var b_={name:"Mirandese",names:["Mirandese"],"iso639-2":"mwl","iso639-1":null};var w_={name:"Mohawk",names:["Mohawk"],"iso639-2":"moh","iso639-1":null};var x_={name:"Moksha",names:["Moksha"],"iso639-2":"mdf","iso639-1":null};var k_={name:"Moldavian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var S_={name:"Moldovan",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var C_={name:"Mong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var E_={name:"Mongo",names:["Mongo"],"iso639-2":"lol","iso639-1":null};var A_={name:"Mongolian",names:["Mongolian"],"iso639-2":"mon","iso639-1":"mn"};var R_={name:"Montenegrin",names:["Montenegrin"],"iso639-2":"cnr","iso639-1":null};var M_={name:"Mossi",names:["Mossi"],"iso639-2":"mos","iso639-1":null};var T_={name:"Nauru",names:["Nauru"],"iso639-2":"nau","iso639-1":"na"};var B_={name:"Navaho",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var N_={name:"Navajo",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var P_={name:"Ndonga",names:["Ndonga"],"iso639-2":"ndo","iso639-1":"ng"};var D_={name:"Neapolitan",names:["Neapolitan"],"iso639-2":"nap","iso639-1":null};var O_={name:"Nepali",names:["Nepali"],"iso639-2":"nep","iso639-1":"ne"};var z_={name:"Newari",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null};var F_={name:"Nias",names:["Nias"],"iso639-2":"nia","iso639-1":null};var L_={name:"Niuean",names:["Niuean"],"iso639-2":"niu","iso639-1":null};var I_={name:"Nogai",names:["Nogai"],"iso639-2":"nog","iso639-1":null};var j_={name:"Norwegian",names:["Norwegian"],"iso639-2":"nor","iso639-1":"no"};var H_={name:"Nuosu",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"};var V_={name:"Nyamwezi",names:["Nyamwezi"],"iso639-2":"nym","iso639-1":null};var G_={name:"Nyanja",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var U_={name:"Nyankole",names:["Nyankole"],"iso639-2":"nyn","iso639-1":null};var W_={name:"Nyoro",names:["Nyoro"],"iso639-2":"nyo","iso639-1":null};var K_={name:"Nzima",names:["Nzima"],"iso639-2":"nzi","iso639-1":null};var q_={name:"Occidental",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Y_={name:"Oirat",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var X_={name:"Ojibwa",names:["Ojibwa"],"iso639-2":"oji","iso639-1":"oj"};var $_={name:"Oriya",names:["Oriya"],"iso639-2":"ori","iso639-1":"or"};var Z_={name:"Oromo",names:["Oromo"],"iso639-2":"orm","iso639-1":"om"};var J_={name:"Osage",names:["Osage"],"iso639-2":"osa","iso639-1":null};var Q_={name:"Ossetian",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var eb={name:"Ossetic",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var tb={name:"Pahlavi",names:["Pahlavi"],"iso639-2":"pal","iso639-1":null};var nb={name:"Palauan",names:["Palauan"],"iso639-2":"pau","iso639-1":null};var ib={name:"Pali",names:["Pali"],"iso639-2":"pli","iso639-1":"pi"};var ab={name:"Pampanga",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var rb={name:"Pangasinan",names:["Pangasinan"],"iso639-2":"pag","iso639-1":null};var ob={name:"Panjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var sb={name:"Papiamento",names:["Papiamento"],"iso639-2":"pap","iso639-1":null};var lb={name:"Pashto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var ub={name:"Pedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var hb={name:"Persian",names:["Persian"],"iso639-2":"per/fas","iso639-1":"fa"};var cb={name:"Phoenician",names:["Phoenician"],"iso639-2":"phn","iso639-1":null};var fb={name:"Pilipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var db={name:"Pohnpeian",names:["Pohnpeian"],"iso639-2":"pon","iso639-1":null};var gb={name:"Polish",names:["Polish"],"iso639-2":"pol","iso639-1":"pl"};var pb={name:"Portuguese",names:["Portuguese"],"iso639-2":"por","iso639-1":"pt"};var vb={name:"Punjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var mb={name:"Pushto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var yb={name:"Quechua",names:["Quechua"],"iso639-2":"que","iso639-1":"qu"};var _b={name:"Rajasthani",names:["Rajasthani"],"iso639-2":"raj","iso639-1":null};var bb={name:"Rapanui",names:["Rapanui"],"iso639-2":"rap","iso639-1":null};var wb={name:"Rarotongan",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null};var xb={name:"Romanian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var kb={name:"Romansh",names:["Romansh"],"iso639-2":"roh","iso639-1":"rm"};var Sb={name:"Romany",names:["Romany"],"iso639-2":"rom","iso639-1":null};var Cb={name:"Rundi",names:["Rundi"],"iso639-2":"run","iso639-1":"rn"};var Eb={name:"Russian",names:["Russian"],"iso639-2":"rus","iso639-1":"ru"};var Ab={name:"Sakan",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var Rb={name:"Samoan",names:["Samoan"],"iso639-2":"smo","iso639-1":"sm"};var Mb={name:"Sandawe",names:["Sandawe"],"iso639-2":"sad","iso639-1":null};var Tb={name:"Sango",names:["Sango"],"iso639-2":"sag","iso639-1":"sg"};var Bb={name:"Sanskrit",names:["Sanskrit"],"iso639-2":"san","iso639-1":"sa"};var Nb={name:"Santali",names:["Santali"],"iso639-2":"sat","iso639-1":null};var Pb={name:"Sardinian",names:["Sardinian"],"iso639-2":"srd","iso639-1":"sc"};var Db={name:"Sasak",names:["Sasak"],"iso639-2":"sas","iso639-1":null};var Ob={name:"Scots",names:["Scots"],"iso639-2":"sco","iso639-1":null};var zb={name:"Selkup",names:["Selkup"],"iso639-2":"sel","iso639-1":null};var Fb={name:"Sepedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var Lb={name:"Serbian",names:["Serbian"],"iso639-2":"srp","iso639-1":"sr"};var Ib={name:"Serer",names:["Serer"],"iso639-2":"srr","iso639-1":null};var jb={name:"Shan",names:["Shan"],"iso639-2":"shn","iso639-1":null};var Hb={name:"Shona",names:["Shona"],"iso639-2":"sna","iso639-1":"sn"};var Vb={name:"Sicilian",names:["Sicilian"],"iso639-2":"scn","iso639-1":null};var Gb={name:"Sidamo",names:["Sidamo"],"iso639-2":"sid","iso639-1":null};var Ub={name:"Siksika",names:["Siksika"],"iso639-2":"bla","iso639-1":null};var Wb={name:"Sindhi",names:["Sindhi"],"iso639-2":"snd","iso639-1":"sd"};var Kb={name:"Sinhala",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var qb={name:"Sinhalese",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var Yb={name:"Slovak",names:["Slovak"],"iso639-2":"slo/slk","iso639-1":"sk"};var Xb={name:"Slovenian",names:["Slovenian"],"iso639-2":"slv","iso639-1":"sl"};var $b={name:"Sogdian",names:["Sogdian"],"iso639-2":"sog","iso639-1":null};var Zb={name:"Somali",names:["Somali"],"iso639-2":"som","iso639-1":"so"};var Jb={name:"Soninke",names:["Soninke"],"iso639-2":"snk","iso639-1":null};var Qb={name:"Spanish",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var ew={name:"Sukuma",names:["Sukuma"],"iso639-2":"suk","iso639-1":null};var tw={name:"Sumerian",names:["Sumerian"],"iso639-2":"sux","iso639-1":null};var nw={name:"Sundanese",names:["Sundanese"],"iso639-2":"sun","iso639-1":"su"};var iw={name:"Susu",names:["Susu"],"iso639-2":"sus","iso639-1":null};var aw={name:"Swahili",names:["Swahili"],"iso639-2":"swa","iso639-1":"sw"};var rw={name:"Swati",names:["Swati"],"iso639-2":"ssw","iso639-1":"ss"};var ow={name:"Swedish",names:["Swedish"],"iso639-2":"swe","iso639-1":"sv"};var sw={name:"Syriac",names:["Syriac"],"iso639-2":"syr","iso639-1":null};var lw={name:"Tagalog",names:["Tagalog"],"iso639-2":"tgl","iso639-1":"tl"};var uw={name:"Tahitian",names:["Tahitian"],"iso639-2":"tah","iso639-1":"ty"};var hw={name:"Tajik",names:["Tajik"],"iso639-2":"tgk","iso639-1":"tg"};var cw={name:"Tamashek",names:["Tamashek"],"iso639-2":"tmh","iso639-1":null};var fw={name:"Tamil",names:["Tamil"],"iso639-2":"tam","iso639-1":"ta"};var dw={name:"Tatar",names:["Tatar"],"iso639-2":"tat","iso639-1":"tt"};var gw={name:"Telugu",names:["Telugu"],"iso639-2":"tel","iso639-1":"te"};var pw={name:"Tereno",names:["Tereno"],"iso639-2":"ter","iso639-1":null};var vw={name:"Tetum",names:["Tetum"],"iso639-2":"tet","iso639-1":null};var mw={name:"Thai",names:["Thai"],"iso639-2":"tha","iso639-1":"th"};var yw={name:"Tibetan",names:["Tibetan"],"iso639-2":"tib/bod","iso639-1":"bo"};var _w={name:"Tigre",names:["Tigre"],"iso639-2":"tig","iso639-1":null};var bw={name:"Tigrinya",names:["Tigrinya"],"iso639-2":"tir","iso639-1":"ti"};var ww={name:"Timne",names:["Timne"],"iso639-2":"tem","iso639-1":null};var xw={name:"Tiv",names:["Tiv"],"iso639-2":"tiv","iso639-1":null};var kw={name:"Tlingit",names:["Tlingit"],"iso639-2":"tli","iso639-1":null};var Sw={name:"Tokelau",names:["Tokelau"],"iso639-2":"tkl","iso639-1":null};var Cw={name:"Tsimshian",names:["Tsimshian"],"iso639-2":"tsi","iso639-1":null};var Ew={name:"Tsonga",names:["Tsonga"],"iso639-2":"tso","iso639-1":"ts"};var Aw={name:"Tswana",names:["Tswana"],"iso639-2":"tsn","iso639-1":"tn"};var Rw={name:"Tumbuka",names:["Tumbuka"],"iso639-2":"tum","iso639-1":null};var Mw={name:"Turkish",names:["Turkish"],"iso639-2":"tur","iso639-1":"tr"};var Tw={name:"Turkmen",names:["Turkmen"],"iso639-2":"tuk","iso639-1":"tk"};var Bw={name:"Tuvalu",names:["Tuvalu"],"iso639-2":"tvl","iso639-1":null};var Nw={name:"Tuvinian",names:["Tuvinian"],"iso639-2":"tyv","iso639-1":null};var Pw={name:"Twi",names:["Twi"],"iso639-2":"twi","iso639-1":"tw"};var Dw={name:"Udmurt",names:["Udmurt"],"iso639-2":"udm","iso639-1":null};var Ow={name:"Ugaritic",names:["Ugaritic"],"iso639-2":"uga","iso639-1":null};var zw={name:"Uighur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var Fw={name:"Ukrainian",names:["Ukrainian"],"iso639-2":"ukr","iso639-1":"uk"};var Lw={name:"Umbundu",names:["Umbundu"],"iso639-2":"umb","iso639-1":null};var Iw={name:"Undetermined",names:["Undetermined"],"iso639-2":"und","iso639-1":null};var jw={name:"Urdu",names:["Urdu"],"iso639-2":"urd","iso639-1":"ur"};var Hw={name:"Uyghur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var Vw={name:"Uzbek",names:["Uzbek"],"iso639-2":"uzb","iso639-1":"uz"};var Gw={name:"Vai",names:["Vai"],"iso639-2":"vai","iso639-1":null};var Uw={name:"Valencian",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var Ww={name:"Venda",names:["Venda"],"iso639-2":"ven","iso639-1":"ve"};var Kw={name:"Vietnamese",names:["Vietnamese"],"iso639-2":"vie","iso639-1":"vi"};var qw={name:"Votic",names:["Votic"],"iso639-2":"vot","iso639-1":null};var Yw={name:"Walloon",names:["Walloon"],"iso639-2":"wln","iso639-1":"wa"};var Xw={name:"Waray",names:["Waray"],"iso639-2":"war","iso639-1":null};var $w={name:"Washo",names:["Washo"],"iso639-2":"was","iso639-1":null};var Zw={name:"Welsh",names:["Welsh"],"iso639-2":"wel/cym","iso639-1":"cy"};var Jw={name:"Wolaitta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var Qw={name:"Wolaytta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var ex={name:"Wolof",names:["Wolof"],"iso639-2":"wol","iso639-1":"wo"};var tx={name:"Xhosa",names:["Xhosa"],"iso639-2":"xho","iso639-1":"xh"};var nx={name:"Yakut",names:["Yakut"],"iso639-2":"sah","iso639-1":null};var ix={name:"Yao",names:["Yao"],"iso639-2":"yao","iso639-1":null};var ax={name:"Yapese",names:["Yapese"],"iso639-2":"yap","iso639-1":null};var rx={name:"Yiddish",names:["Yiddish"],"iso639-2":"yid","iso639-1":"yi"};var ox={name:"Yoruba",names:["Yoruba"],"iso639-2":"yor","iso639-1":"yo"};var sx={name:"Zapotec",names:["Zapotec"],"iso639-2":"zap","iso639-1":null};var lx={name:"Zaza",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var ux={name:"Zazaki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var hx={name:"Zenaga",names:["Zenaga"],"iso639-2":"zen","iso639-1":null};var cx={name:"Zhuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var fx={name:"Zulu",names:["Zulu"],"iso639-2":"zul","iso639-1":"zu"};var dx={name:"Zuni",names:["Zuni"],"iso639-2":"zun","iso639-1":null};var gx={Abkhazian:Hg,Achinese:Vg,Acoli:Gg,Adangme:Ug,Adygei:Wg,Adyghe:Kg,Afar:qg,Afrihili:Yg,Afrikaans:Xg,"Afro-Asiatic languages":{name:"Afro-Asiatic languages",names:["Afro-Asiatic languages"],"iso639-2":"afa","iso639-1":null},Ainu:$g,Akan:Zg,Akkadian:Jg,Albanian:Qg,Alemannic:ep,Aleut:tp,"Algonquian languages":{name:"Algonquian languages",names:["Algonquian languages"],"iso639-2":"alg","iso639-1":null},Alsatian:np,"Altaic languages":{name:"Altaic languages",names:["Altaic languages"],"iso639-2":"tut","iso639-1":null},Amharic:ip,Angika:ap,"Apache languages":{name:"Apache languages",names:["Apache languages"],"iso639-2":"apa","iso639-1":null},Arabic:rp,Aragonese:op,Arapaho:sp,Arawak:lp,Armenian:up,Aromanian:hp,"Artificial languages":{name:"Artificial languages",names:["Artificial languages"],"iso639-2":"art","iso639-1":null},Arumanian:cp,Assamese:fp,Asturian:dp,Asturleonese:gp,"Athapascan languages":{name:"Athapascan languages",names:["Athapascan languages"],"iso639-2":"ath","iso639-1":null},"Australian languages":{name:"Australian languages",names:["Australian languages"],"iso639-2":"aus","iso639-1":null},"Austronesian languages":{name:"Austronesian languages",names:["Austronesian languages"],"iso639-2":"map","iso639-1":null},Avaric:pp,Avestan:vp,Awadhi:mp,Aymara:yp,Azerbaijani:_p,Bable:bp,Balinese:wp,"Baltic languages":{name:"Baltic languages",names:["Baltic languages"],"iso639-2":"bat","iso639-1":null},Baluchi:xp,Bambara:kp,"Bamileke languages":{name:"Bamileke languages",names:["Bamileke languages"],"iso639-2":"bai","iso639-1":null},"Banda languages":{name:"Banda languages",names:["Banda languages"],"iso639-2":"bad","iso639-1":null},"Bantu languages":{name:"Bantu languages",names:["Bantu languages"],"iso639-2":"bnt","iso639-1":null},Basa:Sp,Bashkir:Cp,Basque:Ep,"Batak languages":{name:"Batak languages",names:["Batak languages"],"iso639-2":"btk","iso639-1":null},Bedawiyet:Ap,Beja:Rp,Belarusian:Mp,Bemba:Tp,Bengali:Bp,"Berber languages":{name:"Berber languages",names:["Berber languages"],"iso639-2":"ber","iso639-1":null},Bhojpuri:Np,"Bihari languages":{name:"Bihari languages",names:["Bihari languages"],"iso639-2":"bih","iso639-1":"bh"},Bikol:Pp,Bilin:Dp,Bini:Op,Bislama:zp,Blin:Fp,Bliss:Lp,Blissymbolics:Ip,Blissymbols:jp,"Bokmål, Norwegian":{name:"Bokmål, Norwegian",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},Bosnian:Hp,Braj:Vp,Breton:Gp,Buginese:Up,Bulgarian:Wp,Buriat:Kp,Burmese:qp,Caddo:Yp,Castilian:Xp,Catalan:$p,"Caucasian languages":{name:"Caucasian languages",names:["Caucasian languages"],"iso639-2":"cau","iso639-1":null},Cebuano:Zp,"Celtic languages":{name:"Celtic languages",names:["Celtic languages"],"iso639-2":"cel","iso639-1":null},"Central American Indian languages":{name:"Central American Indian languages",names:["Central American Indian languages"],"iso639-2":"cai","iso639-1":null},"Central Khmer":{name:"Central Khmer",names:["Central Khmer"],"iso639-2":"khm","iso639-1":"km"},Chagatai:Jp,"Chamic languages":{name:"Chamic languages",names:["Chamic languages"],"iso639-2":"cmc","iso639-1":null},Chamorro:Qp,Chechen:ev,Cherokee:tv,Chewa:nv,Cheyenne:iv,Chibcha:av,Chichewa:rv,Chinese:ov,"Chinook jargon":{name:"Chinook jargon",names:["Chinook jargon"],"iso639-2":"chn","iso639-1":null},Chipewyan:sv,Choctaw:lv,Chuang:uv,"Church Slavic":{name:"Church Slavic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Church Slavonic":{name:"Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Chuukese:hv,Chuvash:cv,"Classical Nepal Bhasa":{name:"Classical Nepal Bhasa",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Newari":{name:"Classical Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Syriac":{name:"Classical Syriac",names:["Classical Syriac"],"iso639-2":"syc","iso639-1":null},"Cook Islands Maori":{name:"Cook Islands Maori",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null},Coptic:fv,Cornish:dv,Corsican:gv,Cree:pv,Creek:vv,"Creoles and pidgins":{name:"Creoles and pidgins",names:["Creoles and pidgins"],"iso639-2":"crp","iso639-1":null},"Creoles and pidgins, English based":{name:"Creoles and pidgins, English based",names:["Creoles and pidgins, English based"],"iso639-2":"cpe","iso639-1":null},"Creoles and pidgins, French-based":{name:"Creoles and pidgins, French-based",names:["Creoles and pidgins, French-based"],"iso639-2":"cpf","iso639-1":null},"Creoles and pidgins, Portuguese-based":{name:"Creoles and pidgins, Portuguese-based",names:["Creoles and pidgins, Portuguese-based"],"iso639-2":"cpp","iso639-1":null},"Crimean Tatar":{name:"Crimean Tatar",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},"Crimean Turkish":{name:"Crimean Turkish",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},Croatian:mv,"Cushitic languages":{name:"Cushitic languages",names:["Cushitic languages"],"iso639-2":"cus","iso639-1":null},Czech:yv,Dakota:_v,Danish:bv,Dargwa:wv,Delaware:xv,"Dene Suline":{name:"Dene Suline",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null},Dhivehi:kv,Dimili:Sv,Dimli:Cv,Dinka:Ev,Divehi:Av,Dogri:Rv,Dogrib:Mv,"Dravidian languages":{name:"Dravidian languages",names:["Dravidian languages"],"iso639-2":"dra","iso639-1":null},Duala:Tv,Dutch:Bv,"Dutch, Middle (ca.1050-1350)":{name:"Dutch, Middle (ca.1050-1350)",names:["Dutch, Middle (ca.1050-1350)"],"iso639-2":"dum","iso639-1":null},Dyula:Nv,Dzongkha:Pv,"Eastern Frisian":{name:"Eastern Frisian",names:["Eastern Frisian"],"iso639-2":"frs","iso639-1":null},Edo:Dv,Efik:Ov,"Egyptian (Ancient)":{name:"Egyptian (Ancient)",names:["Egyptian (Ancient)"],"iso639-2":"egy","iso639-1":null},Ekajuk:zv,Elamite:Fv,English:Lv,"English, Middle (1100-1500)":{name:"English, Middle (1100-1500)",names:["English, Middle (1100-1500)"],"iso639-2":"enm","iso639-1":null},"English, Old (ca.450-1100)":{name:"English, Old (ca.450-1100)",names:["English, Old (ca.450-1100)"],"iso639-2":"ang","iso639-1":null},Erzya:Iv,Esperanto:jv,Estonian:Hv,Ewe:Vv,Ewondo:Gv,Fang:Uv,Fanti:Wv,Faroese:Kv,Fijian:qv,Filipino:Yv,Finnish:Xv,"Finno-Ugrian languages":{name:"Finno-Ugrian languages",names:["Finno-Ugrian languages"],"iso639-2":"fiu","iso639-1":null},Flemish:$v,Fon:Zv,French:Jv,"French, Middle (ca.1400-1600)":{name:"French, Middle (ca.1400-1600)",names:["French, Middle (ca.1400-1600)"],"iso639-2":"frm","iso639-1":null},"French, Old (842-ca.1400)":{name:"French, Old (842-ca.1400)",names:["French, Old (842-ca.1400)"],"iso639-2":"fro","iso639-1":null},Friulian:Qv,Fulah:em,Ga:tm,Gaelic:nm,"Galibi Carib":{name:"Galibi Carib",names:["Galibi Carib"],"iso639-2":"car","iso639-1":null},Galician:im,Ganda:am,Gayo:rm,Gbaya:om,Geez:sm,Georgian:lm,German:um,"German, Low":{name:"German, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"German, Middle High (ca.1050-1500)":{name:"German, Middle High (ca.1050-1500)",names:["German, Middle High (ca.1050-1500)"],"iso639-2":"gmh","iso639-1":null},"German, Old High (ca.750-1050)":{name:"German, Old High (ca.750-1050)",names:["German, Old High (ca.750-1050)"],"iso639-2":"goh","iso639-1":null},"Germanic languages":{name:"Germanic languages",names:["Germanic languages"],"iso639-2":"gem","iso639-1":null},Gikuyu:hm,Gilbertese:cm,Gondi:fm,Gorontalo:dm,Gothic:gm,Grebo:pm,"Greek, Ancient (to 1453)":{name:"Greek, Ancient (to 1453)",names:["Greek, Ancient (to 1453)"],"iso639-2":"grc","iso639-1":null},"Greek, Modern (1453-)":{name:"Greek, Modern (1453-)",names:["Greek, Modern (1453-)"],"iso639-2":"gre/ell","iso639-1":"el"},Greenlandic:vm,Guarani:mm,Gujarati:ym,"Gwich'in":{name:"Gwich'in",names:["Gwich'in"],"iso639-2":"gwi","iso639-1":null},Haida:_m,Haitian:bm,"Haitian Creole":{name:"Haitian Creole",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"},Hausa:wm,Hawaiian:xm,Hebrew:km,Herero:Sm,Hiligaynon:Cm,"Himachali languages":{name:"Himachali languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Hindi:Em,"Hiri Motu":{name:"Hiri Motu",names:["Hiri Motu"],"iso639-2":"hmo","iso639-1":"ho"},Hittite:Am,Hmong:Rm,Hungarian:Mm,Hupa:Tm,Iban:Bm,Icelandic:Nm,Ido:Pm,Igbo:Dm,"Ijo languages":{name:"Ijo languages",names:["Ijo languages"],"iso639-2":"ijo","iso639-1":null},Iloko:Om,"Imperial Aramaic (700-300 BCE)":{name:"Imperial Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},"Inari Sami":{name:"Inari Sami",names:["Inari Sami"],"iso639-2":"smn","iso639-1":null},"Indic languages":{name:"Indic languages",names:["Indic languages"],"iso639-2":"inc","iso639-1":null},"Indo-European languages":{name:"Indo-European languages",names:["Indo-European languages"],"iso639-2":"ine","iso639-1":null},Indonesian:zm,Ingush:Fm,"Interlingua (International Auxiliary Language Association)":{name:"Interlingua (International Auxiliary Language Association)",names:["Interlingua (International Auxiliary Language Association)"],"iso639-2":"ina","iso639-1":"ia"},Interlingue:Lm,Inuktitut:Im,Inupiaq:jm,"Iranian languages":{name:"Iranian languages",names:["Iranian languages"],"iso639-2":"ira","iso639-1":null},Irish:Hm,"Irish, Middle (900-1200)":{name:"Irish, Middle (900-1200)",names:["Irish, Middle (900-1200)"],"iso639-2":"mga","iso639-1":null},"Irish, Old (to 900)":{name:"Irish, Old (to 900)",names:["Irish, Old (to 900)"],"iso639-2":"sga","iso639-1":null},"Iroquoian languages":{name:"Iroquoian languages",names:["Iroquoian languages"],"iso639-2":"iro","iso639-1":null},Italian:Vm,Japanese:Gm,Javanese:Um,Jingpho:Wm,"Judeo-Arabic":{name:"Judeo-Arabic",names:["Judeo-Arabic"],"iso639-2":"jrb","iso639-1":null},"Judeo-Persian":{name:"Judeo-Persian",names:["Judeo-Persian"],"iso639-2":"jpr","iso639-1":null},Kabardian:Km,Kabyle:qm,Kachin:Ym,Kalaallisut:Xm,Kalmyk:$m,Kamba:Zm,Kannada:Jm,Kanuri:Qm,Kapampangan:ey,"Kara-Kalpak":{name:"Kara-Kalpak",names:["Kara-Kalpak"],"iso639-2":"kaa","iso639-1":null},"Karachay-Balkar":{name:"Karachay-Balkar",names:["Karachay-Balkar"],"iso639-2":"krc","iso639-1":null},Karelian:ty,"Karen languages":{name:"Karen languages",names:["Karen languages"],"iso639-2":"kar","iso639-1":null},Kashmiri:ny,Kashubian:iy,Kawi:ay,Kazakh:ry,Khasi:oy,"Khoisan languages":{name:"Khoisan languages",names:["Khoisan languages"],"iso639-2":"khi","iso639-1":null},Khotanese:sy,Kikuyu:ly,Kimbundu:uy,Kinyarwanda:hy,Kirdki:cy,Kirghiz:fy,Kirmanjki:dy,Klingon:gy,Komi:py,Kongo:vy,Konkani:my,Korean:yy,Kosraean:_y,Kpelle:by,"Kru languages":{name:"Kru languages",names:["Kru languages"],"iso639-2":"kro","iso639-1":null},Kuanyama:wy,Kumyk:xy,Kurdish:ky,Kurukh:Sy,Kutenai:Cy,Kwanyama:Ey,Kyrgyz:Ay,Ladino:Ry,Lahnda:My,Lamba:Ty,"Land Dayak languages":{name:"Land Dayak languages",names:["Land Dayak languages"],"iso639-2":"day","iso639-1":null},Lao:By,Latin:Ny,Latvian:Py,Leonese:Dy,Letzeburgesch:Oy,Lezghian:zy,Limburgan:Fy,Limburger:Ly,Limburgish:Iy,Lingala:jy,Lithuanian:Hy,Lojban:Vy,"Low German":{name:"Low German",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Low Saxon":{name:"Low Saxon",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Lower Sorbian":{name:"Lower Sorbian",names:["Lower Sorbian"],"iso639-2":"dsb","iso639-1":null},Lozi:Gy,"Luba-Katanga":{name:"Luba-Katanga",names:["Luba-Katanga"],"iso639-2":"lub","iso639-1":"lu"},"Luba-Lulua":{name:"Luba-Lulua",names:["Luba-Lulua"],"iso639-2":"lua","iso639-1":null},Luiseno:Uy,"Lule Sami":{name:"Lule Sami",names:["Lule Sami"],"iso639-2":"smj","iso639-1":null},Lunda:Wy,"Luo (Kenya and Tanzania)":{name:"Luo (Kenya and Tanzania)",names:["Luo (Kenya and Tanzania)"],"iso639-2":"luo","iso639-1":null},Lushai:Ky,Luxembourgish:qy,"Macedo-Romanian":{name:"Macedo-Romanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null},Macedonian:Yy,Madurese:Xy,Magahi:$y,Maithili:Zy,Makasar:Jy,Malagasy:Qy,Malay:e_,Malayalam:t_,Maldivian:n_,Maltese:i_,Manchu:a_,Mandar:r_,Mandingo:o_,Manipuri:s_,"Manobo languages":{name:"Manobo languages",names:["Manobo languages"],"iso639-2":"mno","iso639-1":null},Manx:l_,Maori:u_,Mapuche:h_,Mapudungun:c_,Marathi:f_,Mari:d_,Marshallese:g_,Marwari:p_,Masai:v_,"Mayan languages":{name:"Mayan languages",names:["Mayan languages"],"iso639-2":"myn","iso639-1":null},Mende:m_,"Mi'kmaq":{name:"Mi'kmaq",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null},Micmac:y_,Minangkabau:__,Mirandese:b_,Mohawk:w_,Moksha:x_,Moldavian:k_,Moldovan:S_,"Mon-Khmer languages":{name:"Mon-Khmer languages",names:["Mon-Khmer languages"],"iso639-2":"mkh","iso639-1":null},Mong:C_,Mongo:E_,Mongolian:A_,Montenegrin:R_,Mossi:M_,"Multiple languages":{name:"Multiple languages",names:["Multiple languages"],"iso639-2":"mul","iso639-1":null},"Munda languages":{name:"Munda languages",names:["Munda languages"],"iso639-2":"mun","iso639-1":null},"N'Ko":{name:"N'Ko",names:["N'Ko"],"iso639-2":"nqo","iso639-1":null},"Nahuatl languages":{name:"Nahuatl languages",names:["Nahuatl languages"],"iso639-2":"nah","iso639-1":null},Nauru:T_,Navaho:B_,Navajo:N_,"Ndebele, North":{name:"Ndebele, North",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Ndebele, South":{name:"Ndebele, South",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},Ndonga:P_,Neapolitan:D_,"Nepal Bhasa":{name:"Nepal Bhasa",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null},Nepali:O_,Newari:z_,Nias:F_,"Niger-Kordofanian languages":{name:"Niger-Kordofanian languages",names:["Niger-Kordofanian languages"],"iso639-2":"nic","iso639-1":null},"Nilo-Saharan languages":{name:"Nilo-Saharan languages",names:["Nilo-Saharan languages"],"iso639-2":"ssa","iso639-1":null},Niuean:L_,"No linguistic content":{name:"No linguistic content",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},Nogai:I_,"Norse, Old":{name:"Norse, Old",names:["Norse, Old"],"iso639-2":"non","iso639-1":null},"North American Indian languages":{name:"North American Indian languages",names:["North American Indian languages"],"iso639-2":"nai","iso639-1":null},"North Ndebele":{name:"North Ndebele",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Northern Frisian":{name:"Northern Frisian",names:["Northern Frisian"],"iso639-2":"frr","iso639-1":null},"Northern Sami":{name:"Northern Sami",names:["Northern Sami"],"iso639-2":"sme","iso639-1":"se"},"Northern Sotho":{name:"Northern Sotho",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},Norwegian:j_,"Norwegian Bokmål":{name:"Norwegian Bokmål",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},"Norwegian Nynorsk":{name:"Norwegian Nynorsk",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},"Not applicable":{name:"Not applicable",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},"Nubian languages":{name:"Nubian languages",names:["Nubian languages"],"iso639-2":"nub","iso639-1":null},Nuosu:H_,Nyamwezi:V_,Nyanja:G_,Nyankole:U_,"Nynorsk, Norwegian":{name:"Nynorsk, Norwegian",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},Nyoro:W_,Nzima:K_,Occidental:q_,"Occitan (post 1500)":{name:"Occitan (post 1500)",names:["Occitan (post 1500)"],"iso639-2":"oci","iso639-1":"oc"},"Occitan, Old (to 1500)":{name:"Occitan, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},"Official Aramaic (700-300 BCE)":{name:"Official Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},Oirat:Y_,Ojibwa:X_,"Old Bulgarian":{name:"Old Bulgarian",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Church Slavonic":{name:"Old Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Newari":{name:"Old Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Old Slavonic":{name:"Old Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Oriya:$_,Oromo:Z_,Osage:J_,Ossetian:Q_,Ossetic:eb,"Otomian languages":{name:"Otomian languages",names:["Otomian languages"],"iso639-2":"oto","iso639-1":null},Pahlavi:tb,Palauan:nb,Pali:ib,Pampanga:ab,Pangasinan:rb,Panjabi:ob,Papiamento:sb,"Papuan languages":{name:"Papuan languages",names:["Papuan languages"],"iso639-2":"paa","iso639-1":null},Pashto:lb,Pedi:ub,Persian:hb,"Persian, Old (ca.600-400 B.C.)":{name:"Persian, Old (ca.600-400 B.C.)",names:["Persian, Old (ca.600-400 B.C.)"],"iso639-2":"peo","iso639-1":null},"Philippine languages":{name:"Philippine languages",names:["Philippine languages"],"iso639-2":"phi","iso639-1":null},Phoenician:cb,Pilipino:fb,Pohnpeian:db,Polish:gb,Portuguese:pb,"Prakrit languages":{name:"Prakrit languages",names:["Prakrit languages"],"iso639-2":"pra","iso639-1":null},"Provençal, Old (to 1500)":{name:"Provençal, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},Punjabi:vb,Pushto:mb,Quechua:yb,Rajasthani:_b,Rapanui:bb,Rarotongan:wb,"Reserved for local use":{name:"Reserved for local use",names:["Reserved for local use"],"iso639-2":"qaa-qtz","iso639-1":null},"Romance languages":{name:"Romance languages",names:["Romance languages"],"iso639-2":"roa","iso639-1":null},Romanian:xb,Romansh:kb,Romany:Sb,Rundi:Cb,Russian:Eb,Sakan:Ab,"Salishan languages":{name:"Salishan languages",names:["Salishan languages"],"iso639-2":"sal","iso639-1":null},"Samaritan Aramaic":{name:"Samaritan Aramaic",names:["Samaritan Aramaic"],"iso639-2":"sam","iso639-1":null},"Sami languages":{name:"Sami languages",names:["Sami languages"],"iso639-2":"smi","iso639-1":null},Samoan:Rb,Sandawe:Mb,Sango:Tb,Sanskrit:Bb,Santali:Nb,Sardinian:Pb,Sasak:Db,"Saxon, Low":{name:"Saxon, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},Scots:Ob,"Scottish Gaelic":{name:"Scottish Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"},Selkup:zb,"Semitic languages":{name:"Semitic languages",names:["Semitic languages"],"iso639-2":"sem","iso639-1":null},Sepedi:Fb,Serbian:Lb,Serer:Ib,Shan:jb,Shona:Hb,"Sichuan Yi":{name:"Sichuan Yi",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"},Sicilian:Vb,Sidamo:Gb,"Sign Languages":{name:"Sign Languages",names:["Sign Languages"],"iso639-2":"sgn","iso639-1":null},Siksika:Ub,Sindhi:Wb,Sinhala:Kb,Sinhalese:qb,"Sino-Tibetan languages":{name:"Sino-Tibetan languages",names:["Sino-Tibetan languages"],"iso639-2":"sit","iso639-1":null},"Siouan languages":{name:"Siouan languages",names:["Siouan languages"],"iso639-2":"sio","iso639-1":null},"Skolt Sami":{name:"Skolt Sami",names:["Skolt Sami"],"iso639-2":"sms","iso639-1":null},"Slave (Athapascan)":{name:"Slave (Athapascan)",names:["Slave (Athapascan)"],"iso639-2":"den","iso639-1":null},"Slavic languages":{name:"Slavic languages",names:["Slavic languages"],"iso639-2":"sla","iso639-1":null},Slovak:Yb,Slovenian:Xb,Sogdian:$b,Somali:Zb,"Songhai languages":{name:"Songhai languages",names:["Songhai languages"],"iso639-2":"son","iso639-1":null},Soninke:Jb,"Sorbian languages":{name:"Sorbian languages",names:["Sorbian languages"],"iso639-2":"wen","iso639-1":null},"Sotho, Northern":{name:"Sotho, Northern",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},"Sotho, Southern":{name:"Sotho, Southern",names:["Sotho, Southern"],"iso639-2":"sot","iso639-1":"st"},"South American Indian languages":{name:"South American Indian languages",names:["South American Indian languages"],"iso639-2":"sai","iso639-1":null},"South Ndebele":{name:"South Ndebele",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},"Southern Altai":{name:"Southern Altai",names:["Southern Altai"],"iso639-2":"alt","iso639-1":null},"Southern Sami":{name:"Southern Sami",names:["Southern Sami"],"iso639-2":"sma","iso639-1":null},Spanish:Qb,"Sranan Tongo":{name:"Sranan Tongo",names:["Sranan Tongo"],"iso639-2":"srn","iso639-1":null},"Standard Moroccan Tamazight":{name:"Standard Moroccan Tamazight",names:["Standard Moroccan Tamazight"],"iso639-2":"zgh","iso639-1":null},Sukuma:ew,Sumerian:tw,Sundanese:nw,Susu:iw,Swahili:aw,Swati:rw,Swedish:ow,"Swiss German":{name:"Swiss German",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null},Syriac:sw,Tagalog:lw,Tahitian:uw,"Tai languages":{name:"Tai languages",names:["Tai languages"],"iso639-2":"tai","iso639-1":null},Tajik:hw,Tamashek:cw,Tamil:fw,Tatar:dw,Telugu:gw,Tereno:pw,Tetum:vw,Thai:mw,Tibetan:yw,Tigre:_w,Tigrinya:bw,Timne:ww,Tiv:xw,"tlhIngan-Hol":{name:"tlhIngan-Hol",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null},Tlingit:kw,"Tok Pisin":{name:"Tok Pisin",names:["Tok Pisin"],"iso639-2":"tpi","iso639-1":null},Tokelau:Sw,"Tonga (Nyasa)":{name:"Tonga (Nyasa)",names:["Tonga (Nyasa)"],"iso639-2":"tog","iso639-1":null},"Tonga (Tonga Islands)":{name:"Tonga (Tonga Islands)",names:["Tonga (Tonga Islands)"],"iso639-2":"ton","iso639-1":"to"},Tsimshian:Cw,Tsonga:Ew,Tswana:Aw,Tumbuka:Rw,"Tupi languages":{name:"Tupi languages",names:["Tupi languages"],"iso639-2":"tup","iso639-1":null},Turkish:Mw,"Turkish, Ottoman (1500-1928)":{name:"Turkish, Ottoman (1500-1928)",names:["Turkish, Ottoman (1500-1928)"],"iso639-2":"ota","iso639-1":null},Turkmen:Tw,Tuvalu:Bw,Tuvinian:Nw,Twi:Pw,Udmurt:Dw,Ugaritic:Ow,Uighur:zw,Ukrainian:Fw,Umbundu:Lw,"Uncoded languages":{name:"Uncoded languages",names:["Uncoded languages"],"iso639-2":"mis","iso639-1":null},Undetermined:Iw,"Upper Sorbian":{name:"Upper Sorbian",names:["Upper Sorbian"],"iso639-2":"hsb","iso639-1":null},Urdu:jw,Uyghur:Hw,Uzbek:Vw,Vai:Gw,Valencian:Uw,Venda:Ww,Vietnamese:Kw,"Volapük":{name:"Volapük",names:["Volapük"],"iso639-2":"vol","iso639-1":"vo"},Votic:qw,"Wakashan languages":{name:"Wakashan languages",names:["Wakashan languages"],"iso639-2":"wak","iso639-1":null},Walloon:Yw,Waray:Xw,Washo:$w,Welsh:Zw,"Western Frisian":{name:"Western Frisian",names:["Western Frisian"],"iso639-2":"fry","iso639-1":"fy"},"Western Pahari languages":{name:"Western Pahari languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Wolaitta:Jw,Wolaytta:Qw,Wolof:ex,Xhosa:tx,Yakut:nx,Yao:ix,Yapese:ax,Yiddish:rx,Yoruba:ox,"Yupik languages":{name:"Yupik languages",names:["Yupik languages"],"iso639-2":"ypk","iso639-1":null},"Zande languages":{name:"Zande languages",names:["Zande languages"],"iso639-2":"znd","iso639-1":null},Zapotec:sx,Zaza:lx,Zazaki:ux,Zenaga:hx,Zhuang:cx,Zulu:fx,Zuni:dx};function px(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}var vx=[];var mx=Object.keys(gx);Object.keys(jg).map(function(e){var t=jg[e];var n=mx.find(function(e){return e.toLowerCase()===t.language.toLowerCase()});if(t.location&&n){var i;vx.push((i={},px(i,"name",t.language),px(i,"location",t.location),px(i,"tag",t.tag),px(i,"lcid",t.id),px(i,"iso639-2",gx[n]["iso639-2"]),px(i,"iso639-1",gx[n]["iso639-1"]),i))}});var yx={ar:"ar-SA",ca:"ca-ES",da:"da-DK",en:"en-US",ko:"ko-KR",pa:"pa-IN",pt:"pt-BR",sv:"sv-SE"};function _x(t){if(typeof t!=="string"||t.length===5)return t;if(yx[t])return yx[t];var e=vx.filter(function(e){return e["iso639-1"]===t});if(!e.length)return t;else if(e.length===1)return e[0].tag;else if(e.find(function(e){return e.tag==="".concat(t,"-").concat(t.toUpperCase())}))return"".concat(t,"-").concat(t.toUpperCase());else return e[0].tag}function bx(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function wx(){return"".concat(bx()).concat(bx(),"-").concat(bx(),"-").concat(bx(),"-").concat(bx(),"-").concat(bx()).concat(bx()).concat(bx())}var xx="D3PLUS-COMMON-RESET";var kx={and:"y",Back:"Atrás","Click to Expand":"Clic para Ampliar","Click to Hide":"Clic para Ocultar","Click to Highlight":"Clic para Resaltar","Click to Reset":"Clic para Restablecer",Download:"Descargar","Loading Visualization":"Cargando Visualización","No Data Available":"Datos No Disponibles","Powered by D3plus":"Funciona con D3plus",Share:"Porcentaje","Shift+Click to Hide":"Mayús+Clic para Ocultar",Total:"Total",Values:"Valores"};var Sx={"es-ES":kx};function Cx(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function Ex(e,t){for(var n=0;n1&&arguments[1]!==undefined?arguments[1]:i._locale;var n=Sx[t];return n&&n[e]?n[e]:e};this._uuid=wx()}Ax(e,[{key:"config",value:function n(e){var i=this;if(!this._configDefault){var n={};Mx(this.__proto__).forEach(function(e){var t=i[e]();if(t!==i)n[e]=kh(t)?Ch({},t):t});this._configDefault=n}if(arguments.length){for(var t in e){if({}.hasOwnProperty.call(e,t)&&t in this){var a=e[t];if(a===xx){if(t==="on")this._on=this._configDefault[t];else this[t](this._configDefault[t])}else{Rx(a,this._configDefault[t]);this[t](a)}}}return this}else{var r={};Mx(this.__proto__).forEach(function(e){r[e]=i[e]()});return r}}},{key:"locale",value:function e(t){return arguments.length?(this._locale=_x(t),this):this._locale}},{key:"on",value:function e(t,n){return arguments.length===2?(this._on[t]=n,this):arguments.length?typeof t==="string"?this._on[t]:(this._on=Object.assign({},this._on,t),this):this._on}},{key:"parent",value:function e(t){return arguments.length?(this._parent=t,this):this._parent}},{key:"translate",value:function e(t){return arguments.length?(this._translate=t,this):this._translate}},{key:"shapeConfig",value:function e(t){return arguments.length?(this._shapeConfig=Ch(this._shapeConfig,t),this):this._shapeConfig}}]);return e}();function Bx(n){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];if(!e||!(e instanceof Array)||!e.length)return undefined;return e.reduce(function(e,t){return Math.abs(t-n)0&&arguments[0]!==undefined?arguments[0]:this._shapeConfig;var a=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"shape";var t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var n={duration:this._duration,on:{}};var o=function e(a){return function(e,t,n){var i;while(e.__d3plus__){if(i)e.__d3plusParent__=i;i=e;t=e.i;e=e.data||e.feature}return a.bind(r)(e,t,n||i)}};var s=function e(t,n){for(var i in n){if({}.hasOwnProperty.call(n,i)&&!i.includes(".")||i.includes(".".concat(a))){t.on[i]=o(n[i])}}};var l=function t(e){return e.map(function(e){if(e instanceof Array)return t(e);else if(Nx(e)==="object")return i({},e);else if(typeof e==="function")return o(e);else return e})};var i=function e(t,n){for(var i in n){if({}.hasOwnProperty.call(n,i)){if(i==="on")s(t,n[i]);else if(typeof n[i]==="function"){t[i]=o(n[i])}else if(n[i]instanceof Array){t[i]=l(n[i])}else if(Nx(n[i])==="object"){t[i]={on:{}};e(t[i],n[i])}else t[i]=n[i]}}};i(n,e);if(this._on)s(n,this._on);if(t&&e[t]){i(n,e[t]);if(e[t].on)s(n,e[t].on)}return n}function Dx(t){return function e(){return t}}function Ox(e,t){t=Object.assign({},{condition:true,enter:{},exit:{},parent:Rl("body"),transition:eh().duration(0),update:{}},t);var n=/\.([^#]+)/g.exec(e),i=/#([^\.]+)/g.exec(e),a=/^([^.^#]+)/g.exec(e)[1];var r=t.parent.selectAll(e.includes(":")?e.split(":")[1]:e).data(t.condition?[null]:[]);var o=r.enter().append(a).call(Eh,t.enter);if(i)o.attr("id",i[1]);if(n)o.attr("class",n[1]);r.exit().transition(t.transition).call(Eh,t.exit).remove();var s=o.merge(r);s.transition(t.transition).call(Eh,t.update);return s}function zx(e){return e.filter(function(e,t,n){return n.indexOf(e)===t})}function Fx(a){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var e=zx(_e(a.map(function(e){return p(e)}))),o={};e.forEach(function(t){var e;if(r[t])e=r[t](a,function(e){return e[t]});else{var n=a.map(function(e){return e[t]});var i=n.map(function(e){return e||e===false?e.constructor:e}).filter(function(e){return e!==void 0});if(!i.length)e=undefined;else if(i.indexOf(Array)>=0){e=_e(n.map(function(e){return e instanceof Array?e:[e]}));e=zx(e);if(e.length===1)e=e[0]}else if(i.indexOf(String)>=0){e=zx(n);if(e.length===1)e=e[0]}else if(i.indexOf(Number)>=0)e=O(n);else if(i.indexOf(Object)>=0){e=zx(n.filter(function(e){return e}));if(e.length===1)e=e[0];else e=Fx(e)}else{e=zx(n.filter(function(e){return e!==void 0}));if(e.length===1)e=e[0]}}o[t]=e});return o}function Lx(e){var a;if(typeof e==="number")a=[e];else a=e.split(/\s+/);if(a.length===1)a=[a[0],a[0],a[0],a[0]];else if(a.length===2)a=a.concat(a);else if(a.length===3)a.push(a[1]);return["top","right","bottom","left"].reduce(function(e,t,n){var i=parseFloat(a[n]);e[t]=i||0;return e},{})}function Ix(){if("-webkit-transform"in document.body.style)return"-webkit-";else if("-moz-transform"in document.body.style)return"-moz-";else if("-ms-transform"in document.body.style)return"-ms-";else if("-o-transform"in document.body.style)return"-o-";else return""}function jx(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};for(var n in t){if({}.hasOwnProperty.call(t,n))e.style(n,t[n])}}function Hx(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function Vx(e,t){for(var n=0;n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?fk(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?fk(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=ek.exec(e))?new pk(t[1],t[2],t[3],1):(t=tk.exec(e))?new pk(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=nk.exec(e))?fk(t[1],t[2],t[3],t[4]):(t=ik.exec(e))?fk(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=ak.exec(e))?_k(t[1],t[2]/100,t[3]/100,1):(t=rk.exec(e))?_k(t[1],t[2]/100,t[3]/100,t[4]):ok.hasOwnProperty(e)?ck(ok[e]):e==="transparent"?new pk(NaN,NaN,NaN,0):null}function ck(e){return new pk(e>>16&255,e>>8&255,e&255,1)}function fk(e,t,n,i){if(i<=0)e=t=n=NaN;return new pk(e,t,n,i)}function dk(e){if(!(e instanceof qx))e=hk(e);if(!e)return new pk;e=e.rgb();return new pk(e.r,e.g,e.b,e.opacity)}function gk(e,t,n,i){return arguments.length===1?dk(e):new pk(e,t,n,i==null?1:i)}function pk(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}Wx(pk,gk,Kx(qx,{brighter:function e(t){t=t==null?Xx:Math.pow(Xx,t);return new pk(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?Yx:Math.pow(Yx,t);return new pk(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:vk,formatHex:vk,formatRgb:mk,toString:mk}));function vk(){return"#"+yk(this.r)+yk(this.g)+yk(this.b)}function mk(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}function yk(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function _k(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new xk(e,t,n,i)}function bk(e){if(e instanceof xk)return new xk(e.h,e.s,e.l,e.opacity);if(!(e instanceof qx))e=hk(e);if(!e)return new xk;if(e instanceof xk)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new xk(o,s,l,e.opacity)}function wk(e,t,n,i){return arguments.length===1?bk(e):new xk(e,t,n,i==null?1:i)}function xk(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}Wx(xk,wk,Kx(qx,{brighter:function e(t){t=t==null?Xx:Math.pow(Xx,t);return new xk(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?Yx:Math.pow(Yx,t);return new xk(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new pk(kk(t>=240?t-240:t+120,r,a),kk(t,r,a),kk(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(t===1?")":", "+t+")")}}));function kk(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}function Sk(e,t,n){e.prototype=t.prototype=n;n.constructor=e}function Ck(e,t){var n=Object.create(e.prototype);for(var i in t){n[i]=t[i]}return n}function Ek(){}var Ak=.7;var Rk=1/Ak;var Mk="\\s*([+-]?\\d+)\\s*",Tk="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",Bk="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Nk=/^#([0-9a-f]{3,8})$/,Pk=new RegExp("^rgb\\("+[Mk,Mk,Mk]+"\\)$"),Dk=new RegExp("^rgb\\("+[Bk,Bk,Bk]+"\\)$"),Ok=new RegExp("^rgba\\("+[Mk,Mk,Mk,Tk]+"\\)$"),zk=new RegExp("^rgba\\("+[Bk,Bk,Bk,Tk]+"\\)$"),Fk=new RegExp("^hsl\\("+[Tk,Bk,Bk]+"\\)$"),Lk=new RegExp("^hsla\\("+[Tk,Bk,Bk,Tk]+"\\)$");var Ik={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Sk(Ek,Gk,{copy:function e(t){return Object.assign(new this.constructor,this,t)},displayable:function e(){return this.rgb().displayable()},hex:jk,formatHex:jk,formatHsl:Hk,formatRgb:Vk,toString:Vk});function jk(){return this.rgb().formatHex()}function Hk(){return Qk(this).formatHsl()}function Vk(){return this.rgb().formatRgb()}function Gk(e){var t,n;e=(e+"").trim().toLowerCase();return(t=Nk.exec(e))?(n=t[1].length,t=parseInt(t[1],16),n===6?Uk(t):n===3?new Yk(t>>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?Wk(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?Wk(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Pk.exec(e))?new Yk(t[1],t[2],t[3],1):(t=Dk.exec(e))?new Yk(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Ok.exec(e))?Wk(t[1],t[2],t[3],t[4]):(t=zk.exec(e))?Wk(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=Fk.exec(e))?Jk(t[1],t[2]/100,t[3]/100,1):(t=Lk.exec(e))?Jk(t[1],t[2]/100,t[3]/100,t[4]):Ik.hasOwnProperty(e)?Uk(Ik[e]):e==="transparent"?new Yk(NaN,NaN,NaN,0):null}function Uk(e){return new Yk(e>>16&255,e>>8&255,e&255,1)}function Wk(e,t,n,i){if(i<=0)e=t=n=NaN;return new Yk(e,t,n,i)}function Kk(e){if(!(e instanceof Ek))e=Gk(e);if(!e)return new Yk;e=e.rgb();return new Yk(e.r,e.g,e.b,e.opacity)}function qk(e,t,n,i){return arguments.length===1?Kk(e):new Yk(e,t,n,i==null?1:i)}function Yk(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}Sk(Yk,qk,Ck(Ek,{brighter:function e(t){t=t==null?Rk:Math.pow(Rk,t);return new Yk(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?Ak:Math.pow(Ak,t);return new Yk(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Xk,formatHex:Xk,formatRgb:$k,toString:$k}));function Xk(){return"#"+Zk(this.r)+Zk(this.g)+Zk(this.b)}function $k(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}function Zk(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function Jk(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new tS(e,t,n,i)}function Qk(e){if(e instanceof tS)return new tS(e.h,e.s,e.l,e.opacity);if(!(e instanceof Ek))e=Gk(e);if(!e)return new tS;if(e instanceof tS)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new tS(o,s,l,e.opacity)}function eS(e,t,n,i){return arguments.length===1?Qk(e):new tS(e,t,n,i==null?1:i)}function tS(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}Sk(tS,eS,Ck(Ek,{brighter:function e(t){t=t==null?Rk:Math.pow(Rk,t);return new tS(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?Ak:Math.pow(Ak,t);return new tS(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new Yk(nS(t>=240?t-240:t+120,r,a),nS(t,r,a),nS(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(t===1?")":", "+t+")")}}));function nS(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}var iS={dark:"#444444",light:"#f7f7f7",missing:"#cccccc",off:"#b22200",on:"#224f20",scale:et().range(["#b22200","#282f6b","#eace3f","#b35c1e","#224f20","#5f487c","#759143","#419391","#993c88","#e89c89","#ffee8d","#afd5e8","#f7ba77","#a5c697","#c5b5e5","#d1d392","#bbefd0","#e099cf"])};function aS(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};return e in t?t[e]:e in iS?iS[e]:iS.missing}function rS(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if([null,void 0].indexOf(e)>=0)return aS("missing",t);else if(e===true)return aS("on",t);else if(e===false)return aS("off",t);var n=Gk(e);if(!n)return aS("scale",t)(e);return e.toString()}function oS(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};e=qk(e);var n=(e.r*299+e.g*587+e.b*114)/1e3;return n>=128?aS("dark",t):aS("light",t)}function sS(e){e=eS(e);if(e.l>.45){if(e.s>.8)e.s=.8;e.l=.45}return e.toString()}function lS(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:.5;e=eS(e);t*=1-e.l;e.l+=t;e.s-=t;return e.toString()}var uS=Math.PI,hS=2*uS,cS=1e-6,fS=hS-cS;function dS(){this._x0=this._y0=this._x1=this._y1=null;this._=""}function gS(){return new dS}dS.prototype=gS.prototype={constructor:dS,moveTo:function e(t,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)},closePath:function e(){if(this._x1!==null){this._x1=this._x0,this._y1=this._y0;this._+="Z"}},lineTo:function e(t,n){this._+="L"+(this._x1=+t)+","+(this._y1=+n)},quadraticCurveTo:function e(t,n,i,a){this._+="Q"+ +t+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},bezierCurveTo:function e(t,n,i,a,r,o){this._+="C"+ +t+","+ +n+","+ +i+","+ +a+","+(this._x1=+r)+","+(this._y1=+o)},arcTo:function e(t,n,i,a,r){t=+t,n=+n,i=+i,a=+a,r=+r;var o=this._x1,s=this._y1,l=i-t,u=a-n,h=o-t,c=s-n,f=h*h+c*c;if(r<0)throw new Error("negative radius: "+r);if(this._x1===null){this._+="M"+(this._x1=t)+","+(this._y1=n)}else if(!(f>cS));else if(!(Math.abs(c*l-u*h)>cS)||!r){this._+="L"+(this._x1=t)+","+(this._y1=n)}else{var d=i-o,g=a-s,p=l*l+u*u,v=d*d+g*g,m=Math.sqrt(p),y=Math.sqrt(f),_=r*Math.tan((uS-Math.acos((p+f-v)/(2*m*y)))/2),b=_/y,w=_/m;if(Math.abs(b-1)>cS){this._+="L"+(t+b*h)+","+(n+b*c)}this._+="A"+r+","+r+",0,0,"+ +(c*d>h*g)+","+(this._x1=t+w*l)+","+(this._y1=n+w*u)}},arc:function e(t,n,i,a,r,o){t=+t,n=+n,i=+i;var s=i*Math.cos(a),l=i*Math.sin(a),u=t+s,h=n+l,c=1^o,f=o?a-r:r-a;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null){this._+="M"+u+","+h}else if(Math.abs(this._x1-u)>cS||Math.abs(this._y1-h)>cS){this._+="L"+u+","+h}if(!i)return;if(f<0)f=f%hS+hS;if(f>fS){this._+="A"+i+","+i+",0,1,"+c+","+(t-s)+","+(n-l)+"A"+i+","+i+",0,1,"+c+","+(this._x1=u)+","+(this._y1=h)}else if(f>cS){this._+="A"+i+","+i+",0,"+ +(f>=uS)+","+c+","+(this._x1=t+i*Math.cos(r))+","+(this._y1=n+i*Math.sin(r))}},rect:function e(t,n,i,a){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +i+"v"+ +a+"h"+-i+"Z"},toString:function e(){return this._}};function pS(t){return function e(){return t}}var vS=Math.abs;var mS=Math.atan2;var yS=Math.cos;var _S=Math.max;var bS=Math.min;var wS=Math.sin;var xS=Math.sqrt;var kS=1e-12;var SS=Math.PI;var CS=SS/2;var ES=2*SS;function AS(e){return e>1?0:e<-1?SS:Math.acos(e)}function RS(e){return e>=1?CS:e<=-1?-CS:Math.asin(e)}function MS(e){return e.innerRadius}function TS(e){return e.outerRadius}function BS(e){return e.startAngle}function NS(e){return e.endAngle}function PS(e){return e&&e.padAngle}function DS(e,t,n,i,a,r,o,s){var l=n-e,u=i-t,h=o-a,c=s-r,f=c*l-h*u;if(f*fT*T+B*B)S=E,C=A;return{cx:S,cy:C,x01:-h,y01:-c,x11:S*(a/w-1),y11:C*(a/w-1)}}function zS(){var L=MS,I=TS,j=pS(0),H=null,V=BS,G=NS,U=PS,W=null;function t(){var e,t,n=+L.apply(this,arguments),i=+I.apply(this,arguments),a=V.apply(this,arguments)-CS,r=G.apply(this,arguments)-CS,o=vS(r-a),s=r>a;if(!W)W=e=gS();if(ikS))W.moveTo(0,0);else if(o>ES-kS){W.moveTo(i*yS(a),i*wS(a));W.arc(0,0,i,a,r,!s);if(n>kS){W.moveTo(n*yS(r),n*wS(r));W.arc(0,0,n,r,a,s)}}else{var l=a,u=r,h=a,c=r,f=o,d=o,g=U.apply(this,arguments)/2,p=g>kS&&(H?+H.apply(this,arguments):xS(n*n+i*i)),v=bS(vS(i-n)/2,+j.apply(this,arguments)),m=v,y=v,_,b;if(p>kS){var w=RS(p/n*wS(g)),x=RS(p/i*wS(g));if((f-=w*2)>kS)w*=s?1:-1,h+=w,c-=w;else f=0,h=c=(a+r)/2;if((d-=x*2)>kS)x*=s?1:-1,l+=x,u-=x;else d=0,l=u=(a+r)/2}var k=i*yS(l),S=i*wS(l),C=n*yS(c),E=n*wS(c);if(v>kS){var A=i*yS(u),R=i*wS(u),M=n*yS(h),T=n*wS(h),B;if(okS))W.moveTo(k,S);else if(y>kS){_=OS(M,T,k,S,i,y,s);b=OS(A,R,C,E,i,y,s);W.moveTo(_.cx+_.x01,_.cy+_.y01);if(ykS)||!(f>kS))W.lineTo(C,E);else if(m>kS){_=OS(C,E,A,R,n,-m,s);b=OS(k,S,M,T,n,-m,s);W.lineTo(_.cx+_.x01,_.cy+_.y01);if(m=n;--i){m.point(l[i],u[i])}m.lineEnd();m.areaEnd()}}if(o){l[t]=+h(r,t,e),u[t]=+f(r,t,e);m.point(c?+c(r,t,e):l[t],d?+d(r,t,e):u[t])}}if(s)return m=null,s+""||null}function e(){return HS().defined(g).curve(v).context(p)}t.x=function(e){return arguments.length?(h=typeof e==="function"?e:pS(+e),c=null,t):h};t.x0=function(e){return arguments.length?(h=typeof e==="function"?e:pS(+e),t):h};t.x1=function(e){return arguments.length?(c=e==null?null:typeof e==="function"?e:pS(+e),t):c};t.y=function(e){return arguments.length?(f=typeof e==="function"?e:pS(+e),d=null,t):f};t.y0=function(e){return arguments.length?(f=typeof e==="function"?e:pS(+e),t):f};t.y1=function(e){return arguments.length?(d=e==null?null:typeof e==="function"?e:pS(+e),t):d};t.lineX0=t.lineY0=function(){return e().x(h).y(f)};t.lineY1=function(){return e().x(h).y(d)};t.lineX1=function(){return e().x(c).y(f)};t.defined=function(e){return arguments.length?(g=typeof e==="function"?e:pS(!!e),t):g};t.curve=function(e){return arguments.length?(v=e,p!=null&&(m=v(p)),t):v};t.context=function(e){return arguments.length?(e==null?p=m=null:m=v(p=e),t):p};return t}function GS(e,t){return te?1:t>=e?0:NaN}function US(e){return e}function WS(){var g=US,p=GS,v=null,m=pS(0),y=pS(ES),_=pS(0);function t(n){var e,t=n.length,i,a,r=0,o=new Array(t),s=new Array(t),l=+m.apply(this,arguments),u=Math.min(ES,Math.max(-ES,y.apply(this,arguments)-l)),h,c=Math.min(Math.abs(u)/t,_.apply(this,arguments)),f=c*(u<0?-1:1),d;for(e=0;e0){r+=d}}if(p!=null)o.sort(function(e,t){return p(s[e],s[t])});else if(v!=null)o.sort(function(e,t){return v(n[e],n[t])});for(e=0,a=r?(u-t*f)/r:0;e0?d*a:0)+f,s[i]={data:n[i],index:e,value:d,startAngle:l,endAngle:h,padAngle:c}}return s}t.value=function(e){return arguments.length?(g=typeof e==="function"?e:pS(+e),t):g};t.sortValues=function(e){return arguments.length?(p=e,v=null,t):p};t.sort=function(e){return arguments.length?(v=e,p=null,t):v};t.startAngle=function(e){return arguments.length?(m=typeof e==="function"?e:pS(+e),t):m};t.endAngle=function(e){return arguments.length?(y=typeof e==="function"?e:pS(+e),t):y};t.padAngle=function(e){return arguments.length?(_=typeof e==="function"?e:pS(+e),t):_};return t}var KS=YS(LS);function qS(e){this._curve=e}qS.prototype={areaStart:function e(){this._curve.areaStart()},areaEnd:function e(){this._curve.areaEnd()},lineStart:function e(){this._curve.lineStart()},lineEnd:function e(){this._curve.lineEnd()},point:function e(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};function YS(t){function e(e){return new qS(t(e))}e._curve=t;return e}function XS(e){var t=e.curve;e.angle=e.x,delete e.x;e.radius=e.y,delete e.y;e.curve=function(e){return arguments.length?t(YS(e)):t()._curve};return e}function $S(){return XS(HS().curve(KS))}function ZS(){var e=VS().curve(KS),t=e.curve,n=e.lineX0,i=e.lineX1,a=e.lineY0,r=e.lineY1;e.angle=e.x,delete e.x;e.startAngle=e.x0,delete e.x0;e.endAngle=e.x1,delete e.x1;e.radius=e.y,delete e.y;e.innerRadius=e.y0,delete e.y0;e.outerRadius=e.y1,delete e.y1;e.lineStartAngle=function(){return XS(n())},delete e.lineX0;e.lineEndAngle=function(){return XS(i())},delete e.lineX1;e.lineInnerRadius=function(){return XS(a())},delete e.lineY0;e.lineOuterRadius=function(){return XS(r())},delete e.lineY1;e.curve=function(e){return arguments.length?t(YS(e)):t()._curve};return e}function JS(e,t){return[(t=+t)*Math.cos(e-=Math.PI/2),t*Math.sin(e)]}var QS=Array.prototype.slice;function eC(e){return e.source}function tC(e){return e.target}function nC(a){var r=eC,o=tC,s=IS,l=jS,u=null;function t(){var e,t=QS.call(arguments),n=r.apply(this,t),i=o.apply(this,t);if(!u)u=e=gS();a(u,+s.apply(this,(t[0]=n,t)),+l.apply(this,t),+s.apply(this,(t[0]=i,t)),+l.apply(this,t));if(e)return u=null,e+""||null}t.source=function(e){return arguments.length?(r=e,t):r};t.target=function(e){return arguments.length?(o=e,t):o};t.x=function(e){return arguments.length?(s=typeof e==="function"?e:pS(+e),t):s};t.y=function(e){return arguments.length?(l=typeof e==="function"?e:pS(+e),t):l};t.context=function(e){return arguments.length?(u=e==null?null:e,t):u};return t}function iC(e,t,n,i,a){e.moveTo(t,n);e.bezierCurveTo(t=(t+i)/2,n,t,a,i,a)}function aC(e,t,n,i,a){e.moveTo(t,n);e.bezierCurveTo(t,n=(n+a)/2,i,n,i,a)}function rC(e,t,n,i,a){var r=JS(t,n),o=JS(t,n=(n+a)/2),s=JS(i,n),l=JS(i,a);e.moveTo(r[0],r[1]);e.bezierCurveTo(o[0],o[1],s[0],s[1],l[0],l[1])}function oC(){return nC(iC)}function sC(){return nC(aC)}function lC(){var e=nC(rC);e.angle=e.x,delete e.x;e.radius=e.y,delete e.y;return e}var uC={draw:function e(t,n){var i=Math.sqrt(n/SS);t.moveTo(i,0);t.arc(0,0,i,0,ES)}};var hC={draw:function e(t,n){var i=Math.sqrt(n/5)/2;t.moveTo(-3*i,-i);t.lineTo(-i,-i);t.lineTo(-i,-3*i);t.lineTo(i,-3*i);t.lineTo(i,-i);t.lineTo(3*i,-i);t.lineTo(3*i,i);t.lineTo(i,i);t.lineTo(i,3*i);t.lineTo(-i,3*i);t.lineTo(-i,i);t.lineTo(-3*i,i);t.closePath()}};var cC=Math.sqrt(1/3),fC=cC*2;var dC={draw:function e(t,n){var i=Math.sqrt(n/fC),a=i*cC;t.moveTo(0,-i);t.lineTo(a,0);t.lineTo(0,i);t.lineTo(-a,0);t.closePath()}};var gC=.8908130915292852,pC=Math.sin(SS/10)/Math.sin(7*SS/10),vC=Math.sin(ES/10)*pC,mC=-Math.cos(ES/10)*pC;var yC={draw:function e(t,n){var i=Math.sqrt(n*gC),a=vC*i,r=mC*i;t.moveTo(0,-i);t.lineTo(a,r);for(var o=1;o<5;++o){var s=ES*o/5,l=Math.cos(s),u=Math.sin(s);t.lineTo(u*i,-l*i);t.lineTo(l*a-u*r,u*a+l*r)}t.closePath()}};var _C={draw:function e(t,n){var i=Math.sqrt(n),a=-i/2;t.rect(a,a,i,i)}};var bC=Math.sqrt(3);var wC={draw:function e(t,n){var i=-Math.sqrt(n/(bC*3));t.moveTo(0,i*2);t.lineTo(-bC*i,-i);t.lineTo(bC*i,-i);t.closePath()}};var xC=-.5,kC=Math.sqrt(3)/2,SC=1/Math.sqrt(12),CC=(SC/2+1)*3;var EC={draw:function e(t,n){var i=Math.sqrt(n/CC),a=i/2,r=i*SC,o=a,s=i*SC+i,l=-o,u=s;t.moveTo(a,r);t.lineTo(o,s);t.lineTo(l,u);t.lineTo(xC*a-kC*r,kC*a+xC*r);t.lineTo(xC*o-kC*s,kC*o+xC*s);t.lineTo(xC*l-kC*u,kC*l+xC*u);t.lineTo(xC*a+kC*r,xC*r-kC*a);t.lineTo(xC*o+kC*s,xC*s-kC*o);t.lineTo(xC*l+kC*u,xC*u-kC*l);t.closePath()}};var AC=[uC,hC,dC,_C,yC,wC,EC];function RC(){var t=pS(uC),n=pS(64),i=null;function a(){var e;if(!i)i=e=gS();t.apply(this,arguments).draw(i,+n.apply(this,arguments));if(e)return i=null,e+""||null}a.type=function(e){return arguments.length?(t=typeof e==="function"?e:pS(e),a):t};a.size=function(e){return arguments.length?(n=typeof e==="function"?e:pS(+e),a):n};a.context=function(e){return arguments.length?(i=e==null?null:e,a):i};return a}function MC(){}function TC(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+n)/6)}function BC(e){this._context=e}BC.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 3:TC(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:TC(this,t,n);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n}};function NC(e){return new BC(e)}function PC(e){this._context=e}PC.prototype={areaStart:MC,areaEnd:MC,lineStart:function e(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2);this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3);this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3);this._context.closePath();break}case 3:{this.point(this._x2,this._y2);this.point(this._x3,this._y3);this.point(this._x4,this._y4);break}}},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._x2=t,this._y2=n;break;case 1:this._point=2;this._x3=t,this._y3=n;break;case 2:this._point=3;this._x4=t,this._y4=n;this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:TC(this,t,n);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n}};function DC(e){return new PC(e)}function OC(e){this._context=e}OC.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function e(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var i=(this._x0+4*this._x1+t)/6,a=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 3:this._point=4;default:TC(this,t,n);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n}};function zC(e){return new OC(e)}function FC(e,t){this._basis=new BC(e);this._beta=t}FC.prototype={lineStart:function e(){this._x=[];this._y=[];this._basis.lineStart()},lineEnd:function e(){var t=this._x,n=this._y,i=t.length-1;if(i>0){var a=t[0],r=n[0],o=t[i]-a,s=n[i]-r,l=-1,u;while(++l<=i){u=l/i;this._basis.point(this._beta*t[l]+(1-this._beta)*(a+u*o),this._beta*n[l]+(1-this._beta)*(r+u*s))}}this._x=this._y=null;this._basis.lineEnd()},point:function e(t,n){this._x.push(+t);this._y.push(+n)}};var LC=function t(n){function e(e){return n===1?new BC(e):new FC(e,n)}e.beta=function(e){return t(+e)};return e}(.85);function IC(e,t,n){e._context.bezierCurveTo(e._x1+e._k*(e._x2-e._x0),e._y1+e._k*(e._y2-e._y0),e._x2+e._k*(e._x1-t),e._y2+e._k*(e._y1-n),e._x2,e._y2)}function jC(e,t){this._context=e;this._k=(1-t)/6}jC.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:IC(this,this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;this._x1=t,this._y1=n;break;case 2:this._point=3;default:IC(this,t,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var HC=function t(n){function e(e){return new jC(e,n)}e.tension=function(e){return t(+e)};return e}(0);function VC(e,t){this._context=e;this._k=(1-t)/6}VC.prototype={areaStart:MC,areaEnd:MC,lineStart:function e(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._x3=t,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3;this._x5=t,this._y5=n;break;default:IC(this,t,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var GC=function t(n){function e(e){return new VC(e,n)}e.tension=function(e){return t(+e)};return e}(0);function UC(e,t){this._context=e;this._k=(1-t)/6}UC.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function e(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:IC(this,t,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var WC=function t(n){function e(e){return new UC(e,n)}e.tension=function(e){return t(+e)};return e}(0);function KC(e,t,n){var i=e._x1,a=e._y1,r=e._x2,o=e._y2;if(e._l01_a>kS){var s=2*e._l01_2a+3*e._l01_a*e._l12_a+e._l12_2a,l=3*e._l01_a*(e._l01_a+e._l12_a);i=(i*s-e._x0*e._l12_2a+e._x2*e._l01_2a)/l;a=(a*s-e._y0*e._l12_2a+e._y2*e._l01_2a)/l}if(e._l23_a>kS){var u=2*e._l23_2a+3*e._l23_a*e._l12_a+e._l12_2a,h=3*e._l23_a*(e._l23_a+e._l12_a);r=(r*u+e._x1*e._l23_2a-t*e._l12_2a)/h;o=(o*u+e._y1*e._l23_2a-n*e._l12_2a)/h}e._context.bezierCurveTo(i,a,r,o,e._x2,e._y2)}function qC(e,t){this._context=e;this._alpha=t}qC.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function e(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;if(this._point){var i=this._x2-t,a=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+a*a,this._alpha))}switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:KC(this,t,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var YC=function t(n){function e(e){return n?new qC(e,n):new jC(e,0)}e.alpha=function(e){return t(+e)};return e}(.5);function XC(e,t){this._context=e;this._alpha=t}XC.prototype={areaStart:MC,areaEnd:MC,lineStart:function e(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function e(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function e(t,n){t=+t,n=+n;if(this._point){var i=this._x2-t,a=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+a*a,this._alpha))}switch(this._point){case 0:this._point=1;this._x3=t,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3;this._x5=t,this._y5=n;break;default:KC(this,t,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var $C=function t(n){function e(e){return n?new XC(e,n):new VC(e,0)}e.alpha=function(e){return t(+e)};return e}(.5);function ZC(e,t){this._context=e;this._alpha=t}ZC.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function e(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function e(t,n){t=+t,n=+n;if(this._point){var i=this._x2-t,a=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+a*a,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:KC(this,t,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var JC=function t(n){function e(e){return n?new ZC(e,n):new UC(e,0)}e.alpha=function(e){return t(+e)};return e}(.5);function QC(e){this._context=e}QC.prototype={areaStart:MC,areaEnd:MC,lineStart:function e(){this._point=0},lineEnd:function e(){if(this._point)this._context.closePath()},point:function e(t,n){t=+t,n=+n;if(this._point)this._context.lineTo(t,n);else this._point=1,this._context.moveTo(t,n)}};function eE(e){return new QC(e)}function tE(e){return e<0?-1:1}function nE(e,t,n){var i=e._x1-e._x0,a=t-e._x1,r=(e._y1-e._y0)/(i||a<0&&-0),o=(n-e._y1)/(a||i<0&&-0),s=(r*a+o*i)/(i+a);return(tE(r)+tE(o))*Math.min(Math.abs(r),Math.abs(o),.5*Math.abs(s))||0}function iE(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}function aE(e,t,n){var i=e._x0,a=e._y0,r=e._x1,o=e._y1,s=(r-i)/3;e._context.bezierCurveTo(i+s,a+s*t,r-s,o-s*n,r,o)}function rE(e){this._context=e}rE.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN;this._point=0},lineEnd:function e(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:aE(this,this._t0,iE(this,this._t0));break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function e(t,n){var i=NaN;t=+t,n=+n;if(t===this._x1&&n===this._y1)return;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;aE(this,iE(this,i=nE(this,t,n)),i);break;default:aE(this,this._t0,i=nE(this,t,n));break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=n;this._t0=i}};function oE(e){this._context=new sE(e)}(oE.prototype=Object.create(rE.prototype)).point=function(e,t){rE.prototype.point.call(this,t,e)};function sE(e){this._context=e}sE.prototype={moveTo:function e(t,n){this._context.moveTo(n,t)},closePath:function e(){this._context.closePath()},lineTo:function e(t,n){this._context.lineTo(n,t)},bezierCurveTo:function e(t,n,i,a,r,o){this._context.bezierCurveTo(n,t,a,i,o,r)}};function lE(e){return new rE(e)}function uE(e){return new oE(e)}function hE(e){this._context=e}hE.prototype={areaStart:function e(){this._line=0},areaEnd:function e(){this._line=NaN},lineStart:function e(){this._x=[];this._y=[]},lineEnd:function e(){var t=this._x,n=this._y,i=t.length;if(i){this._line?this._context.lineTo(t[0],n[0]):this._context.moveTo(t[0],n[0]);if(i===2){this._context.lineTo(t[1],n[1])}else{var a=cE(t),r=cE(n);for(var o=0,s=1;s=0;--t){a[t]=(o[t]-a[t+1])/r[t]}r[n-1]=(e[n]+a[n-1])/2;for(t=0;t=0)this._t=1-this._t,this._line=1-this._line},point:function e(t,n){t=+t,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:{if(this._t<=0){this._context.lineTo(this._x,n);this._context.lineTo(t,n)}else{var i=this._x*(1-this._t)+t*this._t;this._context.lineTo(i,this._y);this._context.lineTo(i,n)}break}}this._x=t,this._y=n}};function gE(e){return new dE(e,.5)}function pE(e){return new dE(e,0)}function vE(e){return new dE(e,1)}function mE(e,t){if(!((o=e.length)>1))return;for(var n=1,i,a,r=e[t[0]],o,s=r.length;n=0){n[t]=t}return n}function _E(e,t){return e[t]}function bE(){var c=pS([]),f=yE,d=mE,g=_E;function t(e){var t=c.apply(this,arguments),n,i=e.length,a=t.length,r=new Array(a),o;for(n=0;n0))return;for(var n,i,a=0,r=e[0].length,o;a0))return;for(var n,i=0,a,r,o,s,l,u=e[t[0]].length;i0){a[0]=o,a[1]=o+=r}else if(r<0){a[1]=s,a[0]=s+=r}else{a[0]=0,a[1]=r}}}}function kE(e,t){if(!((a=e.length)>0))return;for(var n=0,i=e[t[0]],a,r=i.length;n0)||!((r=(a=e[t[0]]).length)>0))return;for(var n=0,i=1,a,r,o;ir)r=a,n=t}return n}function AE(e){var n=e.map(RE);return yE(e).sort(function(e,t){return n[e]-n[t]})}function RE(e){var t=0,n=-1,i=e.length,a;while(++n]+>/g,""),"text/html");return t.documentElement?t.documentElement.textContent:e}function DE(e,t){t=Object.assign({"font-size":10,"font-family":"sans-serif","font-style":"normal","font-weight":400,"font-variant":"normal"},t);var n=document.createElement("canvas").getContext("2d");var i=[];i.push(t["font-style"]);i.push(t["font-variant"]);i.push(t["font-weight"]);i.push(typeof t["font-size"]==="string"?t["font-size"]:"".concat(t["font-size"],"px"));i.push(t["font-family"]);n.font=i.join(" ");if(e instanceof Array)return e.map(function(e){return n.measureText(PE(e)).width});return n.measureText(PE(e)).width}function OE(e){return e.toString().replace(/^\s+|\s+$/g,"")}function zE(e){return e.toString().replace(/\s+$/,"")}var FE="abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",LE={},IE=32;var jE,HE,VE,GE;var UE=function e(t){if(!jE){jE=DE(FE,{"font-family":"DejaVuSans","font-size":IE});HE=DE(FE,{"font-family":"-apple-system","font-size":IE});VE=DE(FE,{"font-family":"monospace","font-size":IE});GE=DE(FE,{"font-family":"sans-serif","font-size":IE})}if(!(t instanceof Array))t=t.split(",");t=t.map(function(e){return OE(e)});for(var n=0;n",")","}","]",".","!","?","/","u00BB","u300B","u3009"].concat(JE);var tA="က-ဪဿ-၉ၐ-ၕ";var nA="぀-ゟ゠-ヿ＀-+--}⦅-゚㐀-䶿";var iA="㐀-龿";var aA="ກ-ຮະ-ໄ່-໋ໍ-ໝ";var rA=tA+iA+nA+aA;var oA=new RegExp("(\\".concat(JE.join("|\\"),")*[^\\s|\\").concat(JE.join("|\\"),"]*(\\").concat(JE.join("|\\"),")*"),"g");var sA=new RegExp("[".concat(rA,"]"));var lA=new RegExp("(\\".concat(QE.join("|\\"),")*[").concat(rA,"](\\").concat(eA.join("|\\"),"|\\").concat(ZE.join("|\\"),")*|[a-z0-9]+"),"gi");function uA(e){if(!sA.test(e))return KE(e).match(oA).filter(function(e){return e.length});return _e(KE(e).match(oA).map(function(e){if(sA.test(e))return e.match(lA);return[e]}))}function hA(){var d="sans-serif",g=10,p=400,v=200,m,y=null,_=false,b=uA,w=200;function t(e){e=KE(e);if(m===void 0)m=Math.ceil(g*1.4);var t=b(e);var n={"font-family":d,"font-size":g,"font-weight":p,"line-height":m};var i=1,a="",r=false,o=0;var s=[],l=DE(t,n),u=DE(" ",n);for(var h=0;hw){if(!h&&!_){r=true;break}if(s.length>=i)s[i-1]=zE(s[i-1]);i++;if(m*i>v||f>w&&!_||y&&i>y){r=true;break}o=0;s.push(c)}else if(!h)s[0]=c;else s[i-1]+=c;a+=c;o+=f;o+=c.match(/[\s]*$/g)[0].length*u}return{lines:s,sentence:e,truncated:r,widths:DE(s,n),words:t}}t.fontFamily=function(e){return arguments.length?(d=e,t):d};t.fontSize=function(e){return arguments.length?(g=e,t):g};t.fontWeight=function(e){return arguments.length?(p=e,t):p};t.height=function(e){return arguments.length?(v=e,t):v};t.lineHeight=function(e){return arguments.length?(m=e,t):m};t.maxLines=function(e){return arguments.length?(y=e,t):y};t.overflow=function(e){return arguments.length?(_=e,t):_};t.split=function(e){return arguments.length?(b=e,t):b};t.width=function(e){return arguments.length?(w=e,t):w};return t}function cA(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){cA=function e(t){return typeof t}}else{cA=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return cA(e)}function fA(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function dA(e,t){for(var n=0;ny&&(g>s||a&&g>y*r)){if(a){h=DE(b,f);var x=1.165+p/g*.1,k=p*g,S=me(h),C=O(h,function(e){return e*s})*x;if(S>p||C>k){var E=Math.sqrt(k/C),A=p/S;var R=je([E,A]);o=Math.floor(o*R)}var M=Math.floor(g*.8);if(o>M)o=M}w()}if(u.length){var T=l*s;var B=P._rotate(t,n);var N=B===0?_==="top"?0:_==="middle"?g/2-T/2:g-T:0;N-=s*.1;e.push({aH:P._ariaHidden(t,n),data:t,i:n,lines:u,fC:P._fontColor(t,n),fStroke:P._fontStroke(t,n),fSW:P._fontStrokeWidth(t,n),fF:f["font-family"],fO:P._fontOpacity(t,n),fW:f["font-weight"],id:P._id(t,n),tA:P._textAnchor(t,n),vA:P._verticalAlign(t,n),widths:c.widths,fS:o,lH:s,w:p,h:g,r:B,x:P._x(t,n)+d.left,y:P._y(t,n)+N+d.top})}return e},[]),function(e){return P._id(e.data,e.i)});var a=eh().duration(this._duration);if(this._duration===0){n.exit().remove()}else{n.exit().transition().delay(this._duration).remove();n.exit().selectAll("text").transition(a).attr("opacity",0).style("opacity",0)}function i(e){e.attr("transform",function(e,t){var n=D._rotateAnchor(e,t);return"translate(".concat(e.x,", ").concat(e.y,") rotate(").concat(e.r,", ").concat(n[0],", ").concat(n[1],")")})}var r=n.enter().append("g").attr("class","d3plus-textBox").attr("id",function(e){return"d3plus-textBox-".concat(YE(e.id))}).call(i).merge(n);var o=WE();r.order().style("pointer-events",function(e){return P._pointerEvents(e.data,e.i)}).each(function(n){function e(e){e[D._html?"html":"text"](function(e){return zE(e).replace(/&([^\;&]*)/g,function(e,t){return t==="amp"?e:"&".concat(t)}).replace(/<([^A-z^/]+)/g,function(e,t){return"<".concat(t)}).replace(/<$/g,"<").replace(/(<[^>^\/]+>)([^<^>]+)$/g,function(e,t,n){return"".concat(t).concat(n).concat(t.replace("<","]+)(<\/[^>]+>)/g,function(e,t,n){return"".concat(n.replace("]*>([^<^>]+)<\/[^>]+>/g,function(e,t,n){var i=D._html[t]?''):"";return"".concat(i.length?i:"").concat(n).concat(i.length?"":"")})})}function t(e){e.attr("aria-hidden",n.aH).attr("dir",o?"rtl":"ltr").attr("fill",n.fC).attr("stroke",n.fStroke).attr("stroke-width",n.fSW).attr("text-anchor",n.tA).attr("font-family",n.fF).style("font-family",n.fF).attr("font-size","".concat(n.fS,"px")).style("font-size","".concat(n.fS,"px")).attr("font-weight",n.fW).style("font-weight",n.fW).attr("x","".concat(n.tA==="middle"?n.w/2:o?n.tA==="start"?n.w:0:n.tA==="end"?n.w:2*Math.sin(Math.PI*n.r/180),"px")).attr("y",function(e,t){return n.r===0||n.vA==="top"?"".concat((t+1)*n.lH-(n.lH-n.fS),"px"):n.vA==="middle"?"".concat((n.h+n.fS)/2-(n.lH-n.fS)+(t-n.lines.length/2+.5)*n.lH,"px"):"".concat(n.h-2*(n.lH-n.fS)-(n.lines.length-(t+1))*n.lH+2*Math.cos(Math.PI*n.r/180),"px")})}var i=Rl(this).selectAll("text").data(n.lines);if(D._duration===0){i.call(e).call(t);i.exit().remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("unicode-bidi","bidi-override").call(e).call(t).attr("opacity",n.fO).style("opacity",n.fO)}else{i.call(e).transition(a).call(t);i.exit().transition(a).attr("opacity",0).remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("opacity",0).style("opacity",0).call(e).call(t).merge(i).transition(a).delay(D._delay).call(t).attr("opacity",n.fO).style("opacity",n.fO)}}).transition(a).call(i);var s=Object.keys(this._on),l=s.reduce(function(e,n){e[n]=function(e,t){return P._on[n](e.data,t)};return e},{});for(var u=0;u0&&arguments[0]!==undefined?arguments[0]:"g";AA(this,n);a=t.call(this);a._activeOpacity=.25;a._activeStyle={stroke:function e(t,n){var i=a._fill(t,n);if(["transparent","none"].includes(i))i=a._stroke(t,n);return hk(i).darker(1)},"stroke-width":function e(t,n){var i=a._strokeWidth(t,n)||1;return i*3}};a._ariaLabel=Dx("");a._backgroundImage=Dx(false);a._backgroundImageClass=new Ux;a._data=[];a._duration=600;a._fill=Dx("black");a._fillOpacity=Dx(1);a._hoverOpacity=.5;a._hoverStyle={stroke:function e(t,n){var i=a._fill(t,n);if(["transparent","none"].includes(i))i=a._stroke(t,n);return hk(i).darker(.5)},"stroke-width":function e(t,n){var i=a._strokeWidth(t,n)||1;return i*2}};a._id=function(e,t){return e.id!==void 0?e.id:t};a._label=Dx(false);a._labelClass=new kA;a._labelConfig={fontColor:function e(t,n){return oS(a._fill(t,n))},fontSize:12,padding:5};a._name="Shape";a._opacity=Dx(1);a._pointerEvents=Dx("visiblePainted");a._role=Dx("presentation");a._rotate=Dx(0);a._rx=Dx(0);a._ry=Dx(0);a._scale=Dx(1);a._shapeRendering=Dx("geometricPrecision");a._stroke=function(e,t){return hk(a._fill(e,t)).darker(1)};a._strokeDasharray=Dx("0");a._strokeLinecap=Dx("butt");a._strokeOpacity=Dx(1);a._strokeWidth=Dx(0);a._tagName=e;a._textAnchor=Dx("start");a._vectorEffect=Dx("non-scaling-stroke");a._verticalAlign=Dx("top");a._x=wh("x",0);a._y=wh("y",0);return a}MA(n,[{key:"_aes",value:function e(){return{}}},{key:"_applyEvents",value:function e(t){var o=this;var s=Object.keys(this._on);var n=function e(r){t.on(s[r],function(e,t){if(!o._on[s[r]])return;if(e.i!==void 0)t=e.i;if(e.nested&&e.values){var n=function e(t,n){if(o._discrete==="x")return[o._x(t,n),i[1]];else if(o._discrete==="y")return[i[0],o._y(t,n)];else return[o._x(t,n),o._y(t,n)]};var i=Bl(o._select.node()),a=e.values.map(function(e){return CA(i,n(e,t))});t=a.indexOf(je(a));e=e.values[t]}o._on[s[r]].bind(o)(e,t)})};for(var i=0;i *, g.d3plus-").concat(this._name,"-active > *")).each(function(e){if(e&&e.parentNode)e.parentNode.appendChild(this);else this.parentNode.removeChild(this)});this._group=Ox("g.d3plus-".concat(this._name,"-group"),{parent:this._select});var r=this._update=Ox("g.d3plus-".concat(this._name,"-shape"),{parent:this._group,update:{opacity:this._active?this._activeOpacity:1}}).selectAll(".d3plus-".concat(this._name)).data(i,a);r.order();if(this._duration){r.transition(this._transition).call(this._applyTransform.bind(this))}else{r.call(this._applyTransform.bind(this))}var o=this._enter=r.enter().append(this._tagName).attr("class",function(e,t){return"d3plus-Shape d3plus-".concat(n._name," d3plus-id-").concat(YE(n._nestWrapper(n._id)(e,t)))}).call(this._applyTransform.bind(this)).attr("aria-label",this._ariaLabel).attr("role",this._role).attr("opacity",this._nestWrapper(this._opacity));var s=o.merge(r);var l=s.attr("shape-rendering",this._nestWrapper(this._shapeRendering));if(this._duration){l=l.attr("pointer-events","none").transition(this._transition).transition().delay(100).attr("pointer-events",this._pointerEvents)}l.attr("opacity",this._nestWrapper(this._opacity));var u=this._exit=r.exit();if(this._duration)u.transition().delay(this._duration).remove();else u.remove();this._renderImage();this._renderLabels();this._hoverGroup=Ox("g.d3plus-".concat(this._name,"-hover"),{parent:this._group});this._activeGroup=Ox("g.d3plus-".concat(this._name,"-active"),{parent:this._group});var h=this._group.selectAll(".d3plus-HitArea").data(this._hitArea&&Object.keys(this._on).length?i:[],a);h.order().call(this._applyTransform.bind(this));var c=this._name==="Line";c&&this._path.curve(NE["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var f=h.enter().append(c?"path":"rect").attr("class",function(e,t){return"d3plus-HitArea d3plus-id-".concat(YE(n._nestWrapper(n._id)(e,t)))}).attr("fill","black").attr("stroke","black").attr("pointer-events","painted").attr("opacity",0).call(this._applyTransform.bind(this));var d=this;var g=h.merge(f).each(function(e){var t=d._data.indexOf(e);var n=d._hitArea(e,t,d._aes(e,t));return n&&!(d._name==="Line"&&parseFloat(d._strokeWidth(e,t))>10)?Rl(this).call(Eh,n):Rl(this).remove()});h.exit().remove();this._applyEvents(this._hitArea?g:s);setTimeout(function(){if(n._active)n._renderActive();else if(n._hover)n._renderHover();if(t)t()},this._duration+100);return this}},{key:"active",value:function e(t){if(!arguments.length||t===undefined)return this._active;this._active=t;if(this._group){this._renderActive()}return this}},{key:"activeOpacity",value:function e(t){return arguments.length?(this._activeOpacity=t,this):this._activeOpacity}},{key:"activeStyle",value:function e(t){return arguments.length?(this._activeStyle=Ch({},this._activeStyle,t),this):this._activeStyle}},{key:"ariaLabel",value:function e(t){return t!==undefined?(this._ariaLabel=typeof t==="function"?t:Dx(t),this):this._ariaLabel}},{key:"backgroundImage",value:function e(t){return arguments.length?(this._backgroundImage=typeof t==="function"?t:Dx(t),this):this._backgroundImage}},{key:"data",value:function e(t){return arguments.length?(this._data=t,this):this._data}},{key:"discrete",value:function e(t){return arguments.length?(this._discrete=t,this):this._discrete}},{key:"duration",value:function e(t){return arguments.length?(this._duration=t,this):this._duration}},{key:"fill",value:function e(t){return arguments.length?(this._fill=typeof t==="function"?t:Dx(t),this):this._fill}},{key:"fillOpacity",value:function e(t){return arguments.length?(this._fillOpacity=typeof t==="function"?t:Dx(t),this):this._fillOpacity}},{key:"hover",value:function e(t){if(!arguments.length||t===void 0)return this._hover;this._hover=t;if(this._group){this._renderHover()}return this}},{key:"hoverStyle",value:function e(t){return arguments.length?(this._hoverStyle=Ch({},this._hoverStyle,t),this):this._hoverStyle}},{key:"hoverOpacity",value:function e(t){return arguments.length?(this._hoverOpacity=t,this):this._hoverOpacity}},{key:"hitArea",value:function e(t){return arguments.length?(this._hitArea=typeof t==="function"?t:Dx(t),this):this._hitArea}},{key:"id",value:function e(t){return arguments.length?(this._id=t,this):this._id}},{key:"label",value:function e(t){return arguments.length?(this._label=typeof t==="function"?t:Dx(t),this):this._label}},{key:"labelBounds",value:function e(t){return arguments.length?(this._labelBounds=typeof t==="function"?t:Dx(t),this):this._labelBounds}},{key:"labelConfig",value:function e(t){return arguments.length?(this._labelConfig=Ch(this._labelConfig,t),this):this._labelConfig}},{key:"opacity",value:function e(t){return arguments.length?(this._opacity=typeof t==="function"?t:Dx(t),this):this._opacity}},{key:"pointerEvents",value:function e(t){return arguments.length?(this._pointerEvents=typeof t==="function"?t:Dx(t),this):this._pointerEvents}},{key:"role",value:function e(t){return t!==undefined?(this._role=typeof t==="function"?t:Dx(t),this):this._role}},{key:"rotate",value:function e(t){return arguments.length?(this._rotate=typeof t==="function"?t:Dx(t),this):this._rotate}},{key:"rx",value:function e(t){return arguments.length?(this._rx=typeof t==="function"?t:Dx(t),this):this._rx}},{key:"ry",value:function e(t){return arguments.length?(this._ry=typeof t==="function"?t:Dx(t),this):this._ry}},{key:"scale",value:function e(t){return arguments.length?(this._scale=typeof t==="function"?t:Dx(t),this):this._scale}},{key:"select",value:function e(t){return arguments.length?(this._select=Rl(t),this):this._select}},{key:"shapeRendering",value:function e(t){return arguments.length?(this._shapeRendering=typeof t==="function"?t:Dx(t),this):this._shapeRendering}},{key:"sort",value:function e(t){return arguments.length?(this._sort=t,this):this._sort}},{key:"stroke",value:function e(t){return arguments.length?(this._stroke=typeof t==="function"?t:Dx(t),this):this._stroke}},{key:"strokeDasharray",value:function e(t){return arguments.length?(this._strokeDasharray=typeof t==="function"?t:Dx(t),this):this._strokeDasharray}},{key:"strokeLinecap",value:function e(t){return arguments.length?(this._strokeLinecap=typeof t==="function"?t:Dx(t),this):this._strokeLinecap}},{key:"strokeOpacity",value:function e(t){return arguments.length?(this._strokeOpacity=typeof t==="function"?t:Dx(t),this):this._strokeOpacity}},{key:"strokeWidth",value:function e(t){return arguments.length?(this._strokeWidth=typeof t==="function"?t:Dx(t),this):this._strokeWidth}},{key:"textAnchor",value:function e(t){return arguments.length?(this._textAnchor=typeof t==="function"?t:Dx(t),this):this._textAnchor}},{key:"vectorEffect",value:function e(t){return arguments.length?(this._vectorEffect=typeof t==="function"?t:Dx(t),this):this._vectorEffect}},{key:"verticalAlign",value:function e(t){return arguments.length?(this._verticalAlign=typeof t==="function"?t:Dx(t),this):this._verticalAlign}},{key:"x",value:function e(t){return arguments.length?(this._x=typeof t==="function"?t:Dx(t),this):this._x}},{key:"y",value:function e(t){return arguments.length?(this._y=typeof t==="function"?t:Dx(t),this):this._y}}]);return n}(Tx);function LA(e,t){var a=[];var r=[];function o(e,t){if(e.length===1){a.push(e[0]);r.push(e[0])}else{var n=Array(e.length-1);for(var i=0;i=3){t.x1=e[1][0];t.y1=e[1][1]}t.x=e[e.length-1][0];t.y=e[e.length-1][1];if(e.length===4){t.type="C"}else if(e.length===3){t.type="Q"}else{t.type="L"}return t}function jA(e,t){t=t||2;var n=[];var i=e;var a=1/t;for(var r=0;r0){i-=1}else if(i0){i-=1}}}e[i]=(e[i]||0)+1;return e},[]);var a=i.reduce(function(e,t,n){if(n===r.length-1){var i=UA(t,Object.assign({},r[r.length-1]));if(i[0].type==="M"){i.forEach(function(e){e.type="L"})}return e.concat(i)}return e.concat(qA(r[n],r[n+1],t))},[]);a.unshift(r[0]);return a}function XA(e){var t=(e||"").match(VA)||[];var n=[];var i;var a;for(var r=0;rg.length){g=YA(g,p,t)}else if(p.length0){for(var n=0;ne.length)t=e.length;for(var n=0,i=new Array(t);nMath.max(e[0],t[0])+i||oMath.max(e[1],t[1])+i)}function rR(e,t,n,i){var a=ZA(e,t,n,i);if(!a)return false;return aR(e,t,a)&&aR(n,i,a)}function oR(e,t){var n=-1;var i=e.length;var a=t.length;var r=e[i-1];while(++ne.length)t=e.length;for(var n=0,i=new Array(t);n2&&arguments[2]!==undefined?arguments[2]:0;var i=1e-9;t=[t[0]+i*Math.cos(n),t[1]+i*Math.sin(n)];var a=t,r=sR(a,2),o=r[0],s=r[1];var l=[o+Math.cos(n),s+Math.sin(n)];var u=0;if(Math.abs(l[0]-o)t[u]){if(_2&&arguments[2]!==undefined?arguments[2]:[0,0];var i=Math.cos(t),a=Math.sin(t),r=e[0]-n[0],o=e[1]-n[1];return[i*r-a*o+n[0],a*r+i*o+n[1]]}var pR=function e(t,n){var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[0,0];return t.map(function(e){return gR(e,n,i)})};function vR(e,t,n){var i=t[0],a=t[1];var r=n[0]-i,o=n[1]-a;if(r!==0||o!==0){var s=((e[0]-i)*r+(e[1]-a)*o)/(r*r+o*o);if(s>1){i=n[0];a=n[1]}else if(s>0){i+=r*s;a+=o*s}}r=e[0]-i;o=e[1]-a;return r*r+o*o}function mR(e,t){var n,i=e[0];var a=[i];for(var r=1,o=e.length;rt){a.push(n);i=n}}if(i!==n)a.push(n);return a}function yR(e,t,n,i,a){var r,o=i;for(var s=t+1;so){r=s;o=l}}if(o>i){if(r-t>1)yR(e,t,r,i,a);a.push(e[r]);if(n-r>1)yR(e,r,n,i,a)}}function _R(e,t){var n=e.length-1;var i=[e[0]];yR(e,0,n,t,i);i.push(e[n]);return i}var bR=function e(t){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(t.length<=2)return t;var a=n*n;t=i?t:mR(t,a);t=_R(t,a);return t};function wR(e,t){return ER(e)||CR(e,t)||kR(e,t)||xR()}function xR(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function kR(e,t){if(!e)return;if(typeof e==="string")return SR(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor)n=e.constructor.name;if(n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return SR(e,t)}function SR(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,i=new Array(t);n1&&arguments[1]!==undefined?arguments[1]:{};if(e.length<3){if(t.verbose)console.error("polygon has to have at least 3 points",e);return null}var n=[];t=Object.assign({angle:Le(-90,90+RR,RR),cache:true,maxAspectRatio:15,minAspectRatio:1,minHeight:0,minWidth:0,nTries:20,tolerance:.02,verbose:false},t);var i=t.angle instanceof Array?t.angle:typeof t.angle==="number"?[t.angle]:typeof t.angle==="string"&&!isNaN(t.angle)?[Number(t.angle)]:[];var a=t.aspectRatio instanceof Array?t.aspectRatio:typeof t.aspectRatio==="number"?[t.aspectRatio]:typeof t.aspectRatio==="string"&&!isNaN(t.aspectRatio)?[Number(t.aspectRatio)]:[];var r=t.origin&&t.origin instanceof Array?t.origin[0]instanceof Array?t.origin:[t.origin]:[];var o;if(t.cache){o=_e(e).join(",");o+="-".concat(t.minAspectRatio);o+="-".concat(t.maxAspectRatio);o+="-".concat(t.minHeight);o+="-".concat(t.minWidth);o+="-".concat(i.join(","));o+="-".concat(r.join(","));if(MR[o])return MR[o]}var s=Math.abs(He(e));if(s===0){if(t.verbose)console.error("polygon has 0 area",e);return null}var l=Fe(e,function(e){return e[0]}),u=wR(l,2),h=u[0],c=u[1];var f=Fe(e,function(e){return e[1]}),d=wR(f,2),g=d[0],p=d[1];var v=Math.min(c-h,p-g)*t.tolerance;if(v>0)e=bR(e,v);if(t.events)n.push({type:"simplify",poly:e});var m=Fe(e,function(e){return e[0]});var y=wR(m,2);h=y[0];c=y[1];var _=Fe(e,function(e){return e[1]});var b=wR(_,2);g=b[0];p=b[1];var w=c-h,x=p-g;var k=Math.min(w,x)/50;if(!r.length){var S=Ve(e);if(!isFinite(S[0])){if(t.verbose)console.error("cannot find centroid",e);return null}if(qe(e,S))r.push(S);var C=t.nTries;while(C){var E=Math.random()*w+h;var A=Math.random()*x+g;var R=[E,A];if(qe(e,R)){r.push(R)}C--}}if(t.events)n.push({type:"origins",points:r});var M=0;var T=null;for(var B=0;B=k)n.push({type:"aRatio",aRatio:ue});while(ce-he>=k){var fe=(he+ce)/2;var de=fe/ue;var ge=wR(K,2),pe=ge[0],ve=ge[1];var me=[[pe-fe/2,ve-de/2],[pe+fe/2,ve-de/2],[pe+fe/2,ve+de/2],[pe-fe/2,ve+de/2]];me=pR(me,P,K);var ye=oR(me,e);if(ye){M=fe*de;me.push(me[0]);T={area:M,cx:pe,cy:ve,width:fe,height:de,angle:-N,points:me};he=fe}else{ce=fe}if(t.events)n.push({type:"rectangle",areaFraction:fe*de/s,cx:pe,cy:ve,width:fe,height:de,angle:N,insidePoly:ye})}}}}}if(t.cache){MR[o]=T}return t.events?Object.assign(T||{},{events:n}):T}function BR(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){BR=function e(t){return typeof t}}else{BR=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return BR(e)}function NR(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function PR(e,t){for(var n=0;nr[0][1])o=o.reverse();o.push(o[0]);return{points:o}}},{key:"_dataFilter",value:function e(i){var a=this;var t=X().key(this._id).entries(i).map(function(e){e.data=Fx(e.values);e.i=i.indexOf(e.values[0]);var t=Fe(e.values.map(a._x).concat(e.values.map(a._x0)).concat(a._x1?e.values.map(a._x1):[]));e.xR=t;e.width=t[1]-t[0];e.x=t[0]+e.width/2;var n=Fe(e.values.map(a._y).concat(e.values.map(a._y0)).concat(a._y1?e.values.map(a._y1):[]));e.yR=n;e.height=n[1]-n[0];e.y=n[0]+e.height/2;e.nested=true;e.translate=[e.x,e.y];e.__d3plusShape__=true;return e});t.key=function(e){return e.key};return t}},{key:"render",value:function e(t){var n=this;OR(GR(r.prototype),"render",this).call(this,t);var i=this._path=VS().defined(this._defined).curve(NE["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).x0(this._x0).x1(this._x1).y(this._y).y0(this._y0).y1(this._y1);var a=VS().defined(function(e){return e}).curve(NE["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).y(this._y).x0(function(e,t){return n._x1?n._x0(e,t)+(n._x1(e,t)-n._x0(e,t))/2:n._x0(e,t)}).x1(function(e,t){return n._x1?n._x0(e,t)+(n._x1(e,t)-n._x0(e,t))/2:n._x0(e,t)}).y0(function(e,t){return n._y1?n._y0(e,t)+(n._y1(e,t)-n._y0(e,t))/2:n._y0(e,t)}).y1(function(e,t){return n._y1?n._y0(e,t)+(n._y1(e,t)-n._y0(e,t))/2:n._y0(e,t)});this._enter.append("path").attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).attr("d",function(e){return a(e.values)}).call(this._applyStyle.bind(this)).transition(this._transition).attrTween("d",function(e){return $A(Rl(this).attr("d"),i(e.values))});this._update.select("path").transition(this._transition).attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).attrTween("d",function(e){return $A(Rl(this).attr("d"),i(e.values))}).call(this._applyStyle.bind(this));this._exit.select("path").transition(this._transition).attrTween("d",function(e){return $A(Rl(this).attr("d"),a(e.values))});return this}},{key:"curve",value:function e(t){return arguments.length?(this._curve=t,this):this._curve}},{key:"defined",value:function e(t){return arguments.length?(this._defined=t,this):this._defined}},{key:"x",value:function e(t){if(!arguments.length)return this._x;this._x=typeof t==="function"?t:Dx(t);this._x0=this._x;return this}},{key:"x0",value:function e(t){if(!arguments.length)return this._x0;this._x0=typeof t==="function"?t:Dx(t);this._x=this._x0;return this}},{key:"x1",value:function e(t){return arguments.length?(this._x1=typeof t==="function"||t===null?t:Dx(t),this):this._x1}},{key:"y",value:function e(t){if(!arguments.length)return this._y;this._y=typeof t==="function"?t:Dx(t);this._y0=this._y;return this}},{key:"y0",value:function e(t){if(!arguments.length)return this._y0;this._y0=typeof t==="function"?t:Dx(t);this._y=this._y0;return this}},{key:"y1",value:function e(t){return arguments.length?(this._y1=typeof t==="function"||t===null?t:Dx(t),this):this._y1}}]);return r}(FA);function WR(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){WR=function e(t){return typeof t}}else{WR=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return WR(e)}function KR(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function qR(e,t){for(var n=0;n=e.initialLength)break}}if(n.length>1&&n.length%2)n.pop();n[n.length-1]+=e.initialLength-O(n);if(n.length%2===0)n.push(0);e.initialStrokeArray=n.join(" ")}this._path.curve(NE["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var a=this._enter.append("path").attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).attr("d",function(e){return n._path(e.values)}).call(this._applyStyle.bind(this));var r=this._update.select("path").attr("stroke-dasharray",function(e){return o._strokeDasharray(e.values[0],o._data.indexOf(e.values[0]))});if(this._duration){a.each(i).attr("stroke-dasharray",function(e){return"".concat(e.initialStrokeArray," ").concat(e.initialLength)}).attr("stroke-dashoffset",function(e){return e.initialLength}).transition(this._transition).attr("stroke-dashoffset",0);r=r.transition(this._transition).attrTween("d",function(e){return $A(Rl(this).attr("d"),o._path(e.values))});this._exit.selectAll("path").each(i).attr("stroke-dasharray",function(e){return"".concat(e.initialStrokeArray," ").concat(e.initialLength)}).transition(this._transition).attr("stroke-dashoffset",function(e){return-e.initialLength})}else{r=r.attr("d",function(e){return o._path(e.values)})}r.attr("transform",function(e){return"translate(".concat(-e.xR[0]-e.width/2,", ").concat(-e.yR[0]-e.height/2,")")}).call(this._applyStyle.bind(this));return this}},{key:"_aes",value:function e(t,n){var i=this;return{points:t.values.map(function(e){return[i._x(e,n),i._y(e,n)]})}}},{key:"curve",value:function e(t){return arguments.length?(this._curve=t,this):this._curve}},{key:"defined",value:function e(t){return arguments.length?(this._defined=t,this):this._defined}}]);return s}(FA);function qM(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){qM=function e(t){return typeof t}}else{qM=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return qM(e)}function YM(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function XM(e,t){for(var n=0;nme(e))a.upperLimit=me(e)}else if(t[1]==="extent")a.upperLimit=me(e);else if(typeof t[1]==="number")a.upperLimit=Ie(e,t[1]);var n=a.third-a.first;if(a.orient==="vertical"){a.height=n;a.width=r._rectWidth(a.data,a.i);a.x=r._x(a.data,a.i);a.y=a.first+n/2}else if(a.orient==="horizontal"){a.height=r._rectWidth(a.data,a.i);a.width=n;a.x=a.first+n/2;a.y=r._y(a.data,a.i)}a.values.forEach(function(e,t){var n=a.orient==="vertical"?r._y(e,t):r._x(e,t);if(na.upperLimit){var i={};i.__d3plus__=true;i.data=e;i.i=t;i.outlier=r._outlier(e,t);if(a.orient==="vertical"){i.x=a.x;i.y=n;o.push(i)}else if(a.orient==="horizontal"){i.y=a.y;i.x=n;o.push(i)}}});a.__d3plus__=true;return a});this._box=(new NM).data(t).x(function(e){return e.x}).y(function(e){return e.y}).select(Ox("g.d3plus-Box",{parent:this._select}).node()).config(Px.bind(this)(this._rectConfig,"shape")).render();this._median=(new NM).data(t).x(function(e){return e.orient==="vertical"?e.x:e.median}).y(function(e){return e.orient==="vertical"?e.median:e.y}).height(function(e){return e.orient==="vertical"?1:e.height}).width(function(e){return e.orient==="vertical"?e.width:1}).select(Ox("g.d3plus-Box-Median",{parent:this._select}).node()).config(Px.bind(this)(this._medianConfig,"shape")).render();var h=[];t.forEach(function(e,t){var n=e.x;var i=e.y;var a=e.first-e.lowerLimit;var r=e.upperLimit-e.third;if(e.orient==="vertical"){var o=i-e.height/2;var s=i+e.height/2;h.push({__d3plus__:true,data:e,i:t,x:n,y:o,length:a,orient:"top"},{__d3plus__:true,data:e,i:t,x:n,y:s,length:r,orient:"bottom"})}else if(e.orient==="horizontal"){var l=n+e.width/2;var u=n-e.width/2;h.push({__d3plus__:true,data:e,i:t,x:l,y:i,length:r,orient:"right"},{__d3plus__:true,data:e,i:t,x:u,y:i,length:a,orient:"left"})}});this._whisker=(new rT).data(h).select(Ox("g.d3plus-Box-Whisker",{parent:this._select}).node()).config(Px.bind(this)(this._whiskerConfig,"shape")).render();this._whiskerEndpoint=[];X().key(function(e){return e.outlier}).entries(o).forEach(function(e){var t=e.key;r._whiskerEndpoint.push((new mT[t]).data(e.values).select(Ox("g.d3plus-Box-Outlier-".concat(t),{parent:r._select}).node()).config(Px.bind(r)(r._outlierConfig,"shape",t)).render())});return this}},{key:"active",value:function e(t){if(this._box)this._box.active(t);if(this._median)this._median.active(t);if(this._whisker)this._whisker.active(t);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(e){return e.active(t)})}},{key:"data",value:function e(t){return arguments.length?(this._data=t,this):this._data}},{key:"hover",value:function e(t){if(this._box)this._box.hover(t);if(this._median)this._median.hover(t);if(this._whisker)this._whisker.hover(t);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(e){return e.hover(t)})}},{key:"medianConfig",value:function e(t){return arguments.length?(this._medianConfig=Ch(this._medianConfig,t),this):this._medianConfig}},{key:"orient",value:function e(t){return arguments.length?(this._orient=typeof t==="function"?t:Dx(t),this):this._orient}},{key:"outlier",value:function e(t){return arguments.length?(this._outlier=typeof t==="function"?t:Dx(t),this):this._outlier}},{key:"outlierConfig",value:function e(t){return arguments.length?(this._outlierConfig=Ch(this._outlierConfig,t),this):this._outlierConfig}},{key:"rectConfig",value:function e(t){return arguments.length?(this._rectConfig=Ch(this._rectConfig,t),this):this._rectConfig}},{key:"rectWidth",value:function e(t){return arguments.length?(this._rectWidth=typeof t==="function"?t:Dx(t),this):this._rectWidth}},{key:"select",value:function e(t){return arguments.length?(this._select=Rl(t),this):this._select}},{key:"whiskerConfig",value:function e(t){return arguments.length?(this._whiskerConfig=Ch(this._whiskerConfig,t),this):this._whiskerConfig}},{key:"whiskerMode",value:function e(t){return arguments.length?(this._whiskerMode=t instanceof Array?t:[t,t],this):this._whiskerMode}},{key:"x",value:function e(t){return arguments.length?(this._x=typeof t==="function"?t:wh(t),this):this._x}},{key:"y",value:function e(t){return arguments.length?(this._y=typeof t==="function"?t:wh(t),this):this._y}}]);return n}(Tx);var _T=Math.PI;var bT=function e(t,n){var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"circle";if(t<0)t=_T*2+t;if(i==="square"){var a=45*(_T/180);var r=0,o=0;if(t<_T/2){var s=Math.tan(t);r+=t1&&arguments[1]!==undefined?arguments[1]:20;var i=[],a=/([MLA])([^MLAZ]+)/gi;var r=a.exec(t);while(r!==null){if(["M","L"].includes(r[1]))i.push(r[2].split(",").map(Number));else if(r[1]==="A"){var o=r[2].split(",").map(Number);var s=o.slice(o.length-2,o.length),l=i[i.length-1],u=o[0],h=CA(l,s);var c=Math.acos((u*u+u*u-h*h)/(2*u*u));if(o[2])c=wT*2-c;var f=c/(c/(wT*2)*(u*wT*2)/n);var d=Math.atan2(-l[1],-l[0])-wT;var g=f;while(g1&&arguments[1]!==undefined?arguments[1]:"data";return t.reduce(function(e,t){var n=[];if(Array.isArray(t)){n=t}else{if(t[i]){n=t[i]}else{console.warn('d3plus-viz: Please implement a "dataFormat" callback to concat the arrays manually (consider using the d3plus.dataConcat method in your callback). Currently unable to concatenate (using key: "'.concat(i,'") the following response:'),t)}}return e.concat(n)},[])};function IT(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){IT=function e(t){return typeof t}}else{IT=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return IT(e)}var jT=function e(t){return typeof t==="string"||IT(t)==="object"&&t.url&&t.headers};function HT(a,e){var r,o=te("beforesend","progress","load","error"),s,l=E(),u=new XMLHttpRequest,h=null,c=null,i,f,d=0;if(typeof XDomainRequest!=="undefined"&&!("withCredentials"in u)&&/^(http(s)?:)?\/\//.test(a))u=new XDomainRequest;"onload"in u?u.onload=u.onerror=u.ontimeout=t:u.onreadystatechange=function(e){u.readyState>3&&t(e)};function t(e){var t=u.status,n;if(!t&>(u)||t>=200&&t<300||t===304){if(i){try{n=i.call(r,u)}catch(e){o.call("error",r,e);return}}else{n=u}o.call("load",r,n)}else{o.call("error",r,e)}}u.onprogress=function(e){o.call("progress",r,e)};r={header:function e(t,n){t=(t+"").toLowerCase();if(arguments.length<2)return l.get(t);if(n==null)l.remove(t);else l.set(t,n+"");return r},mimeType:function e(t){if(!arguments.length)return s;s=t==null?null:t+"";return r},responseType:function e(t){if(!arguments.length)return f;f=t;return r},timeout:function e(t){if(!arguments.length)return d;d=+t;return r},user:function e(t){return arguments.length<1?h:(h=t==null?null:t+"",r)},password:function e(t){return arguments.length<1?c:(c=t==null?null:t+"",r)},response:function e(t){i=t;return r},get:function e(t,n){return r.send("GET",t,n)},post:function e(t,n){return r.send("POST",t,n)},send:function e(t,n,i){u.open(t,a,true,h,c);if(s!=null&&!l.has("accept"))l.set("accept",s+",*/*");if(u.setRequestHeader)l.each(function(e,t){u.setRequestHeader(t,e)});if(s!=null&&u.overrideMimeType)u.overrideMimeType(s);if(f!=null)u.responseType=f;if(d>0)u.timeout=d;if(i==null&&typeof n==="function")i=n,n=null;if(i!=null&&i.length===1)i=VT(i);if(i!=null)r.on("error",i).on("load",function(e){i(null,e)});o.call("beforesend",r,u);u.send(n==null?null:n);return r},abort:function e(){u.abort();return r},on:function e(){var t=o.on.apply(o,arguments);return t===o?r:t}};if(e!=null){if(typeof e!=="function")throw new Error("invalid callback: "+e);return r.get(e)}return r}function VT(n){return function(e,t){n(e==null?t:null)}}function GT(e){var t=e.responseType;return t&&t!=="text"?e.response:e.responseText}function UT(i,a){return function(e,t){var n=HT(e).mimeType(i).response(a);if(t!=null){if(typeof t!=="function")throw new Error("invalid callback: "+t);return n.get(t)}return n}}var WT=UT("application/json",function(e){return JSON.parse(e.responseText)});var KT=UT("text/plain",function(e){return e.responseText});var qT={},YT={},XT=34,$T=10,ZT=13;function JT(e){return new Function("d","return {"+e.map(function(e,t){return JSON.stringify(e)+": d["+t+'] || ""'}).join(",")+"}")}function QT(n,i){var a=JT(n);return function(e,t){return i(a(e),t,n)}}function eB(e){var n=Object.create(null),i=[];e.forEach(function(e){for(var t in e){if(!(t in n)){i.push(n[t]=t)}}});return i}function tB(e,t){var n=e+"",i=n.length;return i9999?"+"+tB(e,6):tB(e,4)}function iB(e){var t=e.getUTCHours(),n=e.getUTCMinutes(),i=e.getUTCSeconds(),a=e.getUTCMilliseconds();return isNaN(e)?"Invalid Date":nB(e.getUTCFullYear())+"-"+tB(e.getUTCMonth()+1,2)+"-"+tB(e.getUTCDate(),2)+(a?"T"+tB(t,2)+":"+tB(n,2)+":"+tB(i,2)+"."+tB(a,3)+"Z":i?"T"+tB(t,2)+":"+tB(n,2)+":"+tB(i,2)+"Z":n||t?"T"+tB(t,2)+":"+tB(n,2)+"Z":"")}function aB(i){var t=new RegExp('["'+i+"\n\r]"),c=i.charCodeAt(0);function e(e,n){var i,a,t=r(e,function(e,t){if(i)return i(e,t-1);a=e,i=n?QT(e,n):JT(e)});t.columns=a||[];return t}function r(i,e){var t=[],a=i.length,r=0,n=0,o,s=a<=0,l=false;if(i.charCodeAt(a-1)===$T)--a;if(i.charCodeAt(a-1)===ZT)--a;function u(){if(s)return YT;if(l)return l=false,qT;var e,t=r,n;if(i.charCodeAt(t)===XT){while(r++=a)s=true;else if((n=i.charCodeAt(r++))===$T)l=true;else if(n===ZT){l=true;if(i.charCodeAt(r)===$T)++r}return i.slice(t+1,e-1).replace(/""/g,'"')}while(r1&&arguments[1]!==undefined?arguments[1]:"data";var a=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"headers";return t[n].map(function(i){return t[a].reduce(function(e,t,n){return e[t]=i[n],e},{})})};function gB(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){gB=function e(t){return typeof t}}else{gB=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return gB(e)}function pB(r,o,s,l){var u=this;var h;var c=function e(t){var n=t.slice(t.length-4);switch(n){case".csv":return cB;case".tsv":return fB;case".txt":return KT;default:return WT}};var f=function e(t,n,i){if(n!==WT&&!t&&i&&i instanceof Array){i.forEach(function(e){for(var t in e){if(!isNaN(e[t]))e[t]=parseFloat(e[t]);else if(e[t].toLowerCase()==="false")e[t]=false;else if(e[t].toLowerCase()==="true")e[t]=true;else if(e[t].toLowerCase()==="null")e[t]=null;else if(e[t].toLowerCase()==="undefined")e[t]=undefined}})}return i};var d=function e(t){return t.reduce(function(e,t){return t?e+1:e},0)};var g=function e(t,n){return n.indexOf(t)};if(!(r instanceof Array))r=[r];var e=r.find(jT);var p=new Array(r.length);var v=[];if(e){r.forEach(function(e,t){if(jT(e))v.push(e);else p[t]=e})}else{p[0]=r}var m=d(p);v.forEach(function(e){var t={},i=e;if(gB(e)==="object"){i=e.url;t=e.headers}h=c(i);var n=h(i);for(var a in t){if({}.hasOwnProperty.call(t,a)){n.header(a,t[a])}}n.get(function(e,t){t=e?[]:t;if(t&&!(t instanceof Array)&&t.data&&t.headers)t=dB(t);t=f(e,h,t);p[g(i,r)]=t;if(d(p)-m===v.length){t=d(p)===1?p[0]:p;if(u._cache)u._lrucache.set("".concat(s,"_").concat(i),t);if(o){var n=o(d(p)===1?p[0]:p);if(s==="data"&&!(n instanceof Array)){t=n.data;delete n.data;u.config(n)}else t=n}else if(s==="data"){t=LT(p,"data")}if(s&&"_".concat(s)in u)u["_".concat(s)]=t;if(l)l(e,t)}})});if(v.length===0){p=p.map(function(e){if(e&&!(e instanceof Array)&&e.data&&e.headers)e=dB(e);return e});var t=d(p)===1?p[0]:p;if(o){var n=o(d(p)===1?p[0]:p);if(s==="data"&&!(n instanceof Array)){t=n.data;delete n.data;this.config(n)}else t=n}else if(s==="data"){t=LT(p,"data")}if(s&&"_".concat(s)in this)this["_".concat(s)]=t;if(l)l(null,t)}}function vB(e,t,n){if(!(e instanceof Array))e=[e];var i=e.find(jT);if(i){var a=this._queue.find(function(e){return e[3]==="data"});var r=[pB.bind(this),e,t,"data"];if(a)this._queue[this._queue.indexOf(a)]=r;else this._queue.push(r)}else{this["_".concat(n)]=e}}function mB(e){return function(){return e}}function yB(e,t,n){this.target=e;this.type=t;this.selection=n}function _B(){fl.stopImmediatePropagation()}function bB(){fl.preventDefault();fl.stopImmediatePropagation()}var wB={name:"drag"},xB={name:"space"},kB={name:"handle"},SB={name:"center"};function CB(e){return[+e[0],+e[1]]}function EB(e){return[CB(e[0]),CB(e[1])]}function AB(t){return function(e){return Pl(e,fl.touches,t)}}var RB={name:"x",handles:["w","e"].map(zB),input:function e(t,n){return t==null?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function e(t){return t&&[t[0][0],t[1][0]]}};var MB={name:"y",handles:["n","s"].map(zB),input:function e(t,n){return t==null?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function e(t){return t&&[t[0][1],t[1][1]]}};var TB={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(zB),input:function e(t){return t==null?null:EB(t)},output:function e(t){return t}};var BB={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"};var NB={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"};var PB={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"};var DB={overlay:+1,selection:+1,n:null,e:+1,s:null,w:-1,nw:-1,ne:+1,se:+1,sw:-1};var OB={overlay:+1,selection:+1,n:-1,e:null,s:+1,w:null,nw:-1,ne:-1,se:+1,sw:+1};function zB(e){return{type:e}}function FB(){return!fl.ctrlKey&&!fl.button}function LB(){var e=this.ownerSVGElement||this;if(e.hasAttribute("viewBox")){e=e.viewBox.baseVal;return[[e.x,e.y],[e.x+e.width,e.y+e.height]]}return[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]}function IB(){return navigator.maxTouchPoints||"ontouchstart"in this}function jB(e){while(!e.__brush){if(!(e=e.parentNode))return}return e.__brush}function HB(e){return e[0][0]===e[1][0]||e[0][1]===e[1][1]}function VB(){return UB(RB)}function GB(){return UB(TB)}function UB(L){var t=LB,I=FB,i=IB,j=true,n=te("start","brush","end"),a=6,H;function r(e){var t=e.property("__brush",h).selectAll(".overlay").data([zB("overlay")]);t.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",BB.overlay).merge(t).each(function(){var e=jB(this).extent;Rl(this).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1])});e.selectAll(".selection").data([zB("selection")]).enter().append("rect").attr("class","selection").attr("cursor",BB.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var n=e.selectAll(".handle").data(L.handles,function(e){return e.type});n.exit().remove();n.enter().append("rect").attr("class",function(e){return"handle handle--"+e.type}).attr("cursor",function(e){return BB[e.type]});e.each(V).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",s).filter(i).on("touchstart.brush",s).on("touchmove.brush",l).on("touchend.brush touchcancel.brush",u).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}r.move=function(e,s){if(e.selection){e.on("start.brush",function(){G(this,arguments).beforestart().start()}).on("interrupt.brush end.brush",function(){G(this,arguments).end()}).tween("brush",function(){var t=this,n=t.__brush,i=G(t,arguments),e=n.selection,a=L.input(typeof s==="function"?s.apply(this,arguments):s,n.extent),r=En(e,a);function o(e){n.selection=e===1&&a===null?null:r(e);V.call(t);i.brush()}return e!==null&&a!==null?o:o(1)})}else{e.each(function(){var e=this,t=arguments,n=e.__brush,i=L.input(typeof s==="function"?s.apply(e,t):s,n.extent),a=G(e,t).beforestart();Zl(e);n.selection=i===null?null:i;V.call(e);a.start().brush().end()})}};r.clear=function(e){r.move(e,null)};function V(){var e=Rl(this),t=jB(this).selection;if(t){e.selectAll(".selection").style("display",null).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1]);e.selectAll(".handle").style("display",null).attr("x",function(e){return e.type[e.type.length-1]==="e"?t[1][0]-a/2:t[0][0]-a/2}).attr("y",function(e){return e.type[0]==="s"?t[1][1]-a/2:t[0][1]-a/2}).attr("width",function(e){return e.type==="n"||e.type==="s"?t[1][0]-t[0][0]+a:a}).attr("height",function(e){return e.type==="e"||e.type==="w"?t[1][1]-t[0][1]+a:a})}else{e.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}}function G(e,t,n){return!n&&e.__brush.emitter||new o(e,t)}function o(e,t){this.that=e;this.args=t;this.state=e.__brush;this.active=0}o.prototype={beforestart:function e(){if(++this.active===1)this.state.emitter=this,this.starting=true;return this},start:function e(){if(this.starting)this.starting=false,this.emit("start");else this.emit("brush");return this},brush:function e(){this.emit("brush");return this},end:function e(){if(--this.active===0)delete this.state.emitter,this.emit("end");return this},emit:function e(t){bl(new yB(r,t,L.output(this.state.selection)),n.apply,n,[t,this.that,this.args])}};function s(){if(H&&!fl.touches)return;if(!I.apply(this,arguments))return;var t=this,n=fl.target.__data__.type,i=(j&&fl.metaKey?n="overlay":n)==="selection"?wB:j&&fl.altKey?SB:kB,a=L===MB?null:DB[n],r=L===RB?null:OB[n],o=jB(t),e=o.extent,s=o.selection,l=e[0][0],u,h,c=e[0][1],f,d,g=e[1][0],p,v,m=e[1][1],y,_,b=0,w=0,x,k=a&&r&&j&&fl.shiftKey,S,C,E=fl.touches?AB(fl.changedTouches[0].identifier):Bl,A=E(t),R=A,M=G(t,arguments,true).beforestart();if(n==="overlay"){if(s)x=true;o.selection=s=[[u=L===MB?l:A[0],f=L===RB?c:A[1]],[p=L===MB?g:u,y=L===RB?m:f]]}else{u=s[0][0];f=s[0][1];p=s[1][0];y=s[1][1]}h=u;d=f;v=p;_=y;var T=Rl(t).attr("pointer-events","none");var B=T.selectAll(".overlay").attr("cursor",BB[n]);if(fl.touches){M.moved=P;M.ended=O}else{var N=Rl(fl.view).on("mousemove.brush",P,true).on("mouseup.brush",O,true);if(j)N.on("keydown.brush",z,true).on("keyup.brush",F,true);Ol(fl.view)}_B();Zl(t);V.call(t);M.start();function P(){var e=E(t);if(k&&!S&&!C){if(Math.abs(e[0]-R[0])>Math.abs(e[1]-R[1]))C=true;else S=true}R=e;x=true;bB();D()}function D(){var e;b=R[0]-A[0];w=R[1]-A[1];switch(i){case xB:case wB:{if(a)b=Math.max(l-u,Math.min(g-p,b)),h=u+b,v=p+b;if(r)w=Math.max(c-f,Math.min(m-y,w)),d=f+w,_=y+w;break}case kB:{if(a<0)b=Math.max(l-u,Math.min(g-u,b)),h=u+b,v=p;else if(a>0)b=Math.max(l-p,Math.min(g-p,b)),h=u,v=p+b;if(r<0)w=Math.max(c-f,Math.min(m-f,w)),d=f+w,_=y;else if(r>0)w=Math.max(c-y,Math.min(m-y,w)),d=f,_=y+w;break}case SB:{if(a)h=Math.max(l,Math.min(g,u-b*a)),v=Math.max(l,Math.min(g,p+b*a));if(r)d=Math.max(c,Math.min(m,f-w*r)),_=Math.max(c,Math.min(m,y+w*r));break}}if(v0)u=h-b;if(r<0)y=_-w;else if(r>0)f=d-w;i=xB;B.attr("cursor",BB.selection);D()}break}default:return}bB()}function F(){switch(fl.keyCode){case 16:{if(k){S=C=k=false;D()}break}case 18:{if(i===SB){if(a<0)p=v;else if(a>0)u=h;if(r<0)y=_;else if(r>0)f=d;i=kB;D()}break}case 32:{if(i===xB){if(fl.altKey){if(a)p=v-b*a,u=h+b*a;if(r)y=_-w*r,f=d+w*r;i=SB}else{if(a<0)p=v;else if(a>0)u=h;if(r<0)y=_;else if(r>0)f=d;i=kB}B.attr("cursor",BB[n]);D()}break}default:return}bB()}}function l(){G(this,arguments).moved()}function u(){G(this,arguments).ended()}function h(){var e=this.__brush||{selection:null};e.extent=EB(t.apply(this,arguments));e.dim=L;return e}r.extent=function(e){return arguments.length?(t=typeof e==="function"?e:mB(EB(e)),r):t};r.filter=function(e){return arguments.length?(I=typeof e==="function"?e:mB(!!e),r):I};r.touchable=function(e){return arguments.length?(i=typeof e==="function"?e:mB(!!e),r):i};r.handleSize=function(e){return arguments.length?(a=+e,r):a};r.keyModifiers=function(e){return arguments.length?(j=!!e,r):j};r.on=function(){var e=n.on.apply(n,arguments);return e===n?r:e};return r}function WB(e,t,n){e.prototype=t.prototype=n;n.constructor=e}function KB(e,t){var n=Object.create(e.prototype);for(var i in t){n[i]=t[i]}return n}function qB(){}var YB=.7;var XB=1/YB;var $B="\\s*([+-]?\\d+)\\s*",ZB="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",JB="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",QB=/^#([0-9a-f]{3,8})$/,eN=new RegExp("^rgb\\("+[$B,$B,$B]+"\\)$"),tN=new RegExp("^rgb\\("+[JB,JB,JB]+"\\)$"),nN=new RegExp("^rgba\\("+[$B,$B,$B,ZB]+"\\)$"),iN=new RegExp("^rgba\\("+[JB,JB,JB,ZB]+"\\)$"),aN=new RegExp("^hsl\\("+[ZB,JB,JB]+"\\)$"),rN=new RegExp("^hsla\\("+[ZB,JB,JB,ZB]+"\\)$");var oN={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};WB(qB,hN,{copy:function e(t){return Object.assign(new this.constructor,this,t)},displayable:function e(){return this.rgb().displayable()},hex:sN,formatHex:sN,formatHsl:lN,formatRgb:uN,toString:uN});function sN(){return this.rgb().formatHex()}function lN(){return bN(this).formatHsl()}function uN(){return this.rgb().formatRgb()}function hN(e){var t,n;e=(e+"").trim().toLowerCase();return(t=QB.exec(e))?(n=t[1].length,t=parseInt(t[1],16),n===6?cN(t):n===3?new pN(t>>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?fN(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?fN(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=eN.exec(e))?new pN(t[1],t[2],t[3],1):(t=tN.exec(e))?new pN(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=nN.exec(e))?fN(t[1],t[2],t[3],t[4]):(t=iN.exec(e))?fN(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=aN.exec(e))?_N(t[1],t[2]/100,t[3]/100,1):(t=rN.exec(e))?_N(t[1],t[2]/100,t[3]/100,t[4]):oN.hasOwnProperty(e)?cN(oN[e]):e==="transparent"?new pN(NaN,NaN,NaN,0):null}function cN(e){return new pN(e>>16&255,e>>8&255,e&255,1)}function fN(e,t,n,i){if(i<=0)e=t=n=NaN;return new pN(e,t,n,i)}function dN(e){if(!(e instanceof qB))e=hN(e);if(!e)return new pN;e=e.rgb();return new pN(e.r,e.g,e.b,e.opacity)}function gN(e,t,n,i){return arguments.length===1?dN(e):new pN(e,t,n,i==null?1:i)}function pN(e,t,n,i){this.r=+e;this.g=+t;this.b=+n;this.opacity=+i}WB(pN,gN,KB(qB,{brighter:function e(t){t=t==null?XB:Math.pow(XB,t);return new pN(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function e(t){t=t==null?YB:Math.pow(YB,t);return new pN(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function e(){return this},displayable:function e(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:vN,formatHex:vN,formatRgb:mN,toString:mN}));function vN(){return"#"+yN(this.r)+yN(this.g)+yN(this.b)}function mN(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}function yN(e){e=Math.max(0,Math.min(255,Math.round(e)||0));return(e<16?"0":"")+e.toString(16)}function _N(e,t,n,i){if(i<=0)e=t=n=NaN;else if(n<=0||n>=1)e=t=NaN;else if(t<=0)e=NaN;return new xN(e,t,n,i)}function bN(e){if(e instanceof xN)return new xN(e.h,e.s,e.l,e.opacity);if(!(e instanceof qB))e=hN(e);if(!e)return new xN;if(e instanceof xN)return e;e=e.rgb();var t=e.r/255,n=e.g/255,i=e.b/255,a=Math.min(t,n,i),r=Math.max(t,n,i),o=NaN,s=r-a,l=(r+a)/2;if(s){if(t===r)o=(n-i)/s+(n0&&l<1?0:o}return new xN(o,s,l,e.opacity)}function wN(e,t,n,i){return arguments.length===1?bN(e):new xN(e,t,n,i==null?1:i)}function xN(e,t,n,i){this.h=+e;this.s=+t;this.l=+n;this.opacity=+i}WB(xN,wN,KB(qB,{brighter:function e(t){t=t==null?XB:Math.pow(XB,t);return new xN(this.h,this.s,this.l*t,this.opacity)},darker:function e(t){t=t==null?YB:Math.pow(YB,t);return new xN(this.h,this.s,this.l*t,this.opacity)},rgb:function e(){var t=this.h%360+(this.h<0)*360,n=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,a=i+(i<.5?i:1-i)*n,r=2*i-a;return new pN(kN(t>=240?t-240:t+120,r,a),kN(t,r,a),kN(t<120?t+240:t-120,r,a),this.opacity)},displayable:function e(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function e(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(t===1?")":", "+t+")")}}));function kN(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}var SN=[].slice;var CN={};function EN(e){this._size=e;this._call=this._error=null;this._tasks=[];this._data=[];this._waiting=this._active=this._ended=this._start=0}EN.prototype=NN.prototype={constructor:EN,defer:function e(t){if(typeof t!=="function")throw new Error("invalid callback");if(this._call)throw new Error("defer after await");if(this._error!=null)return this;var n=SN.call(arguments,1);n.push(t);++this._waiting,this._tasks.push(n);AN(this);return this},abort:function e(){if(this._error==null)TN(this,new Error("abort"));return this},await:function e(n){if(typeof n!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=function(e,t){n.apply(null,[e].concat(t))};BN(this);return this},awaitAll:function e(t){if(typeof t!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=t;BN(this);return this}};function AN(t){if(!t._start){try{RN(t)}catch(e){if(t._tasks[t._ended+t._active-1])TN(t,e);else if(!t._data)throw e}}}function RN(e){while(e._start=e._waiting&&e._active=0){if(i=e._tasks[n]){e._tasks[n]=null;if(i.abort){try{i.abort()}catch(t){}}}}e._active=NaN;BN(e)}function BN(e){if(!e._active&&e._call){var t=e._data;e._data=undefined;e._call(e._error,t)}}function NN(e){if(e==null)e=Infinity;else if(!((e=+e)>=1))throw new Error("invalid concurrency");return new EN(e)}var PN=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};function DN(e,t,i){return i={path:t,exports:{},require:function e(t,n){return ON(t,n===undefined||n===null?i.path:n)}},e(i,i.exports),i.exports}function ON(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}var zN=DN(function(n){(function(e,t){{n.exports=t()}})((typeof window==="undefined"?"undefined":_typeof2(window))==="object"?window:PN,function(){var a=void 0;function t(e){if(!(this instanceof t))return new t(e);this._LRUCacheState=new n(e)}var e=t.prototype;e.get=function(e){var t=this._LRUCacheState;var n=t.hash[e];if(!n)return;o(t.linkedList,n);return t.data[e]};e.set=function(e,t){var n=this._LRUCacheState;var i=n.hash[e];if(t===a)return this;if(!i){n.hash[e]=new r(e);n.linkedList.length+=1;i=n.hash[e]}o(n.linkedList,i);n.data[e]=t;if(n.linkedList.length>n.capacity)this.remove(n.linkedList.end.key);return this};e.update=function(e,t){if(this.has(e))this.set(e,t(this.get(e)));return this};e.remove=function(e){var t=this._LRUCacheState;var n=t.hash[e];if(!n)return this;if(n===t.linkedList.head)t.linkedList.head=n.p;if(n===t.linkedList.end)t.linkedList.end=n.n;s(n.n,n.p);delete t.hash[e];delete t.data[e];t.linkedList.length-=1;return this};e.removeAll=function(){this._LRUCacheState=new n(this._LRUCacheState.capacity);return this};e.info=function(){var e=this._LRUCacheState;return{capacity:e.capacity,length:e.linkedList.length}};e.keys=function(){var e=[];var t=this._LRUCacheState.linkedList.head;while(t){e.push(t.key);t=t.p}return e};e.has=function(e){return!!this._LRUCacheState.hash[e]};e.staleKey=function(){return this._LRUCacheState.linkedList.end&&this._LRUCacheState.linkedList.end.key};e.popStale=function(){var e=this.staleKey();if(!e)return null;var t=[e,this._LRUCacheState.data[e]];this.remove(e);return t};function n(e){this.capacity=e>0?+e:Number.MAX_SAFE_INTEGER||Number.MAX_VALUE;this.data=Object.create?Object.create(null):{};this.hash=Object.create?Object.create(null):{};this.linkedList=new i}function i(){this.length=0;this.head=null;this.end=null}function r(e){this.key=e;this.p=null;this.n=null}function o(e,t){if(t===e.head)return;if(!e.end){e.end=t}else if(e.end===t){e.end=t.n}s(t.n,t.p);s(t,e.head);e.head=t;e.head.n=null}function s(e,t){if(e===t)return;if(e)e.p=t;if(t)t.n=e}return t})});var FN={"en-GB":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","T","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["£",""]},"en-US":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","T","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-CL":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["$",""]},"es-MX":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-ES":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","mm","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["€",""]},"et-EE":{separator:" ",suffixes:["y","z","a","f","p","n","µ","m","","tuhat","miljonit","miljardit","triljonit","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["","eurot"]},"fr-FR":{suffixes:["y","z","a","f","p","n","µ","m","","k","m","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["€",""]}};function LN(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){LN=function e(t){return typeof t}}else{LN=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return LN(e)}var IN=function e(t,n){return parseFloat(Math.round(t*Math.pow(10,n))/Math.pow(10,n)).toFixed(n)};function jN(e,t,n){var i=0;if(e){if(e<0)e*=-1;i=1+Math.floor(1e-12+Math.log(e)/Math.LN10);i=Math.max(-24,Math.min(24,Math.floor((i-1)/3)*3))}var a=n[8+i/3];return{number:IN(a.scale(e),t),symbol:a.symbol}}function HN(e,t){var n=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(e){return e/n}:function(e){return e*n},symbol:e}}function VN(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"en-US";var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(isFinite(e))e*=1;else return"N/A";var i=e<0;var a=e.toString().split(".")[0].replace("-","").length,r=LN(t)==="object"?t:FN[t]||FN["en-US"],o=r.suffixes.map(HN);var s=r.delimiters.decimal||".",l=r.separator||"",u=r.delimiters.thousands||",";var h=wi({currency:r.currency||["$",""],decimal:s,grouping:r.grouping||[3],thousands:u});var c;if(n)c=h.format(n)(e);else if(e===0)c="0";else if(a>=3){var f=jN(h.format(".3r")(e),2,o);var d=parseFloat(f.number).toString().replace(".",s);var g=f.symbol;c="".concat(d).concat(l).concat(g)}else if(a===3)c=h.format(",f")(e);else if(e<1&&e>-1)c=h.format(".2g")(e);else c=h.format(".3g")(e);return"".concat(i&&c.charAt(0)!=="-"?"-":"").concat(c).replace(/(\.[0]*[1-9]*)[0]*$/g,"$1").replace(/\.[0]*$/g,"")}function GN(e){if(e.constructor===Date)return e;else if(e.constructor===Number&&"".concat(e).length>5&&e%1===0)return new Date(e);var t="".concat(e);var n=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(t),i=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(t);if(n){var a=n[1];if(a.indexOf("-")===0)t=t.replace(a,a.substr(1));var r=new Date(t);r.setFullYear(a);return r}else if(i){var o=i[1];if(o.indexOf("-")===0)t=t.replace(o,o.substr(1));var s=new Date(t);s.setFullYear(o);return s}else if(!t.includes("/")&&!t.includes(" ")&&(!t.includes("-")||!t.indexOf("-"))){var l=new Date("".concat(t,"/01/01"));l.setFullYear(e);return l}else return new Date(t)}var UN={"de-DE":{dateTime:"%A, der %e. %B %Y, %X",date:"%d.%m.%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"en-GB":{dateTime:"%a %e %b %X %Y",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-US":{dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es-ES":{dateTime:"%A, %e de %B de %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-MX":{dateTime:"%x, %X",date:"%d/%m/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"fr-FR":{dateTime:"%A, le %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],shortDays:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],shortMonths:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"it-IT":{dateTime:"%A %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"]},"pt-BR":{dateTime:"%A, %e de %B de %Y. %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"]}};function WN(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function KN(e){return $N(e)||XN(e)||YN(e)||qN()}function qN(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function YN(e,t){if(!e)return;if(typeof e==="string")return ZN(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor)n=e.constructor.name;if(n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ZN(e,t)}function XN(e){if(typeof Symbol!=="undefined"&&Symbol.iterator in Object(e))return Array.from(e)}function $N(e){if(Array.isArray(e))return ZN(e)}function ZN(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,i=new Array(t);nt[1]?n.reverse():n}},{key:"_getPosition",value:function e(t){return t<0&&this._d3ScaleNegative?this._d3ScaleNegative(t):this._d3Scale(t)}},{key:"_getRange",value:function e(){var t=[];if(this._d3ScaleNegative)t=this._d3ScaleNegative.range();if(this._d3Scale)t=t.concat(this._d3Scale.range());return t[0]>t[1]?Fe(t).reverse():Fe(t)}},{key:"_getTicks",value:function e(){var t=Qi().domain([10,400]).range([10,50]);var n=[];if(this._d3ScaleNegative){var i=this._d3ScaleNegative.range();var a=i[1]-i[0];n=this._d3ScaleNegative.ticks(Math.floor(a/t(a)))}if(this._d3Scale){var r=this._d3Scale.range();var o=r[1]-r[0];n=n.concat(this._d3Scale.ticks(Math.floor(o/t(o))))}return n}},{key:"_gridPosition",value:function e(t){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var i=this._position,a=i.height,r=i.x,o=i.y,s=i.opposite,l=this._margin[s],u=["top","left"].includes(this._orient)?this._outerBounds[o]+this._outerBounds[a]-l:this._outerBounds[o]+l,h=n?this._lastScale||this._getPosition.bind(this):this._getPosition.bind(this),c=["top","left"].includes(this._orient)?l:-l,f=this._scale==="band"?this._d3Scale.bandwidth()/2:0,d=function e(t){return h(t.id)+f};t.call(Eh,this._gridConfig).attr("".concat(r,"1"),d).attr("".concat(r,"2"),d).attr("".concat(o,"1"),u).attr("".concat(o,"2"),n?u:u+c)}},{key:"render",value:function e(t){var d=this,n;if(this._select===void 0){this.select(Rl("body").append("svg").attr("width","".concat(this._width,"px")).attr("height","".concat(this._height,"px")).node())}var i=this._timeLocale||UN[this._locale]||UN["en-US"];uo(i).format();var s=so("%a %d"),l=so("%I %p"),u=so(".%L"),h=so("%I:%M"),c=so("%b"),f=so(":%S"),g=so("%b %d"),p=so("%Y");var a=this._position,r=a.width,v=a.height,m=a.x,y=a.y,_=a.horizontal,b=a.opposite,o="d3plus-Axis-clip-".concat(this._uuid),w=["top","left"].includes(this._orient),x=this._padding,k=this._select,C=[x,this["_".concat(r)]-x],S=eh().duration(this._duration);var E=this._shape==="Circle"?this._shapeConfig.r:this._shape==="Rect"?this._shapeConfig[r]:this._shapeConfig.strokeWidth;var A=typeof E!=="function"?function(){return E}:E;var R=this._margin={top:0,right:0,bottom:0,left:0};var M,T,B;var N=this._tickFormat?this._tickFormat:function(e){if(d._scale==="time"){return(fa(e)=1e3?i[d._tickUnit+8]:"";var r=e/Math.pow(10,3*d._tickUnit);var o=VN(r,t,",.".concat(r.toString().length,"r"));return"".concat(o).concat(n).concat(a)}else{return VN(e,d._locale)}};function P(){var a=this;var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this._range;T=e?e.slice():[undefined,undefined];var t=C[0],n=C[1];if(this._range){if(this._range[0]!==undefined)t=this._range[0];if(this._range[this._range.length-1]!==undefined)n=this._range[this._range.length-1]}if(T[0]===undefined||T[0]n)T[1]=n;var i=n-t;if(this._scale==="ordinal"&&this._domain.length>T.length){if(e===this._range){var r=this._domain.length+1;T=Le(r).map(function(e){return T[0]+i*(e/(r-1))}).slice(1,r);T=T.map(function(e){return e-T[0]/2})}else{var o=this._domain.length;var s=T[1]-T[0];T=Le(o).map(function(e){return T[0]+s*(e/(o-1))})}}else if(e===this._range){var l=Qi().domain([10,400]).range([10,50]);var u=this._scale==="time"?this._domain.map(GN):this._domain;var h=ve(u[0],u[1],Math.floor(i/l(i)));B=(this._ticks?this._scale==="time"?this._ticks.map(GN):this._ticks:h).slice();M=(this._labels?this._scale==="time"?this._labels.map(GN):this._labels:h).slice();var c=M.length;if(c){var f=Math.ceil(i/c/2);T=[T[0]+f,T[1]-f]}}var d="scale".concat(this._scale.charAt(0).toUpperCase()).concat(this._scale.slice(1));this._d3Scale=Fo[d]().domain(this._scale==="time"?this._domain.map(GN):this._domain).range(T);if(this._d3Scale.padding)this._d3Scale.padding(this._scalePadding);if(this._d3Scale.paddingInner)this._d3Scale.paddingInner(this._paddingInner);if(this._d3Scale.paddingOuter)this._d3Scale.paddingOuter(this._paddingOuter);this._d3ScaleNegative=null;if(this._scale==="log"){var g=this._d3Scale.domain();if(g[0]===0){g[0]=Math.abs(g[g.length-1])<=1?1e-6:1;if(g[g.length-1]<0)g[0]*=-1}else if(g[g.length-1]===0){g[g.length-1]=Math.abs(g[0])<=1?1e-6:1;if(g[0]<0)g[g.length-1]*=-1}var p=this._d3Scale.range();if(g[0]<0&&g[g.length-1]<0){this._d3ScaleNegative=this._d3Scale.copy().domain(g).range(p);this._d3Scale=null}else if(g[0]>0&&g[g.length-1]>0){this._d3Scale.domain(g).range(p)}else{var v=Gi().domain([1,g[g[1]>0?1:0]]).range([0,1]);var m=v(Math.abs(g[g[1]<0?1:0]));var y=m/(m+1)*(p[1]-p[0]);if(g[0]>0)y=p[1]-p[0]-y;this._d3ScaleNegative=this._d3Scale.copy();(g[0]<0?this._d3Scale:this._d3ScaleNegative).domain([Math.sign(g[1]),g[1]]).range([p[0]+y,p[1]]);(g[0]<0?this._d3ScaleNegative:this._d3Scale).domain([g[0],Math.sign(g[0])]).range([p[0],p[0]+y])}}B=(this._ticks?this._scale==="time"?this._ticks.map(GN):this._ticks:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():this._domain).slice();M=(this._labels?this._scale==="time"?this._labels.map(GN):this._labels:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():B).slice();if(this._scale==="log"){var _=M.filter(function(e,t){return!t||t===M.length-1||Math.abs(e).toString().charAt(0)==="1"&&(a._d3Scale?e!==-1:e!==1)});if(_.length>2){M=_}else if(M.length>=10){M=M.filter(function(e){return e%5===0||N(e).substr(-1)==="1"})}if(M.includes(-1)&&M.includes(1)&&M.some(function(e){return e>10||e<10})){M.splice(M.indexOf(-1),1)}}if(this._scale==="time"){B=B.map(Number);M=M.map(Number)}B=B.sort(function(e,t){return a._getPosition(e)-a._getPosition(t)});M=M.sort(function(e,t){return a._getPosition(e)-a._getPosition(t)});if(this._scale==="linear"&&this._tickSuffix==="smallest"){var b=M.filter(function(e){return e>=1e3});if(b.length>0){var w=Math.min.apply(Math,KN(b));var x=1;while(x&&x<7){var k=Math.pow(10,3*x);if(w/k>=1){this._tickUnit=x;x+=1}else{break}}}}var S=[];this._availableTicks=B;B.forEach(function(e,t){var n=A({id:e,tick:true},t);if(a._shape==="Circle")n*=2;var i=a._getPosition(e);if(!S.length||Math.abs(Bx(i,S)-i)>n*2)S.push(i);else S.push(false)});B=B.filter(function(e,t){return S[t]!==false});this._visibleTicks=B}P.bind(this)();function D(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var n=e.i,i=e.position;if(this._scale==="band"){return this._d3Scale.bandwidth()}else{var a=n-t<0?G.length===1||!this._range?C[0]:(i-G[n+t].position)/2-i:i-(i-G[n-t].position)/2;var r=Math.abs(i-a);var o=n+t>G.length-1?G.length===1||!this._range?C[1]:(i-G[n-t].position)/2-i:i-(i-G[n+t].position)/2;var s=Math.abs(i-o);return je([r,s])*2}}if(this._title){var O=this._titleConfig,z=O.fontFamily,F=O.fontSize,L=O.lineHeight;var I=hA().fontFamily(typeof z==="function"?z():z).fontSize(typeof F==="function"?F():F).lineHeight(typeof L==="function"?L():L).width(T[T.length-1]-T[0]-x*2).height(this["_".concat(v)]-this._tickSize-x*2);var j=I(this._title).lines.length;R[this._orient]=j*I.lineHeight()+x}var H=this._shape==="Circle"?typeof this._shapeConfig.r==="function"?this._shapeConfig.r({tick:true}):this._shapeConfig.r:this._shape==="Rect"?typeof this._shapeConfig[v]==="function"?this._shapeConfig[v]({tick:true}):this._shapeConfig[v]:this._tickSize,V=A({tick:true});if(typeof H==="function")H=me(B.map(H));if(this._shape==="Rect")H/=2;if(typeof V==="function")V=me(B.map(V));if(this._shape!=="Circle")V/=2;var G=M.map(function(e,t){var n=d._shapeConfig.labelConfig.fontFamily(e,t),i=d._shapeConfig.labelConfig.fontSize(e,t),a=d._getPosition(e);var r=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(e,t):i*1.4;return{d:e,i:t,fF:n,fS:i,lineHeight:r,position:a}});function U(e){var t=e.d,n=e.i,i=e.fF,a=e.fS,r=e.rotate,o=e.space;var s=r?"width":"height",l=r?"height":"width";var u=je([this._maxSize,this._width]);var h=je([this._maxSize,this._height]);var c=hA().fontFamily(i).fontSize(a).lineHeight(this._shapeConfig.lineHeight?this._shapeConfig.lineHeight(t,n):undefined)[l](_?o:u-H-x-this._margin.left-this._margin.right)[s](_?h-H-x-this._margin.top-this._margin.bottom:o);var f=c(N(t));f.lines=f.lines.filter(function(e){return e!==""});f.width=f.lines.length?Math.ceil(me(f.widths))+a/4:0;if(f.width%2)f.width++;f.height=f.lines.length?Math.ceil(f.lines.length*c.lineHeight())+a/4:0;if(f.height%2)f.height++;return f}function W(){var a=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var r=0;a.forEach(function(e){var t=a[e.i-1];var n=e.rotate&&_||!e.rotate&&!_?"width":"height",i=e.rotate&&_||!e.rotate&&!_?"height":"width";if(!t){r=1}else if(t.position+t[i]/2>e.position-e[i]/2){if(r){e.offset=t[n];r=0}else r=1}})}G=G.map(function(e){e.rotate=d._labelRotation;e.space=D.bind(d)(e);var t=U.bind(d)(e);return Object.assign(t,e)});this._rotateLabels=_&&this._labelRotation===undefined?G.some(function(e){return e.truncated}):this._labelRotation;var K=this._labelOffset&&G.some(function(e){return e.truncated});if(this._rotateLabels){G=G.map(function(e){e.rotate=true;var t=U.bind(d)(e);return Object.assign(e,t)})}else if(K){G=G.map(function(e){e.space=D.bind(d)(e,2);var t=U.bind(d)(e);return Object.assign(e,t)});W.bind(this)(G)}var q=[0,0];for(var Y=0;Y<2;Y++){var X=G[Y?G.length-1:0];if(!X)break;var $=X.height,Z=X.position,J=X.rotate,Q=X.width;var ee=Y?C[1]:C[0];var te=(J||!_?$:Q)/2;var ne=Y?Z+te-ee:Z-te-ee;q[Y]=ne}var ie=T[0];var ae=T[T.length-1];var re=[ie-q[0],ae-q[1]];if(this._range){if(this._range[0]!==undefined)re[0]=this._range[0];if(this._range[this._range.length-1]!==undefined)re[1]=this._range[this._range.length-1]}if(re[0]!==ie||re[1]!==ae){P.bind(this)(re);G=M.map(function(e,t){var n=d._shapeConfig.labelConfig.fontFamily(e,t),i=d._shapeConfig.labelConfig.fontSize(e,t),a=d._getPosition(e);var r=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(e,t):i*1.4;return{d:e,i:t,fF:n,fS:i,lineHeight:r,position:a}});G=G.map(function(e){e.rotate=d._rotateLabels;e.space=D.bind(d)(e,K?2:1);var t=U.bind(d)(e);return Object.assign(t,e)});W.bind(this)(G)}var oe=me(G,function(e){return e.height})||0;this._rotateLabels=_&&this._labelRotation===undefined?G.some(function(e){var t=e.i,n=e.height,i=e.position,a=e.truncated;var r=G[t-1];return a||t&&r.position+r.height/2>i-n/2}):this._labelRotation;var se=this._labelOffset?me(G,function(e){return e.offset||0}):0;G.forEach(function(e){return e.offset=e.offset?se:0});var le=this._shape==="Line"?0:H;var ue=this._outerBounds=(n={},WN(n,v,(me(G,function(e){return Math.ceil(e[e.rotate||!_?"width":"height"]+e.offset)})||0)+(G.length?x:0)),WN(n,r,C[C.length-1]-C[0]),WN(n,m,C[0]),n);ue[v]=me([this._minSize,ue[v]]);R[this._orient]+=H;R[b]=this._gridSize!==undefined?me([this._gridSize,le]):this["_".concat(v)]-R[this._orient]-ue[v]-x;ue[v]+=R[b]+R[this._orient];ue[y]=this._align==="start"?this._padding:this._align==="end"?this["_".concat(v)]-ue[v]-this._padding:this["_".concat(v)]/2-ue[v]/2;var he=Ox("g#d3plus-Axis-".concat(this._uuid),{parent:k});this._group=he;var ce=Ox("g.grid",{parent:he}).selectAll("line").data((this._gridSize!==0?this._grid||this._scale==="log"&&!this._gridLog?M:B:[]).map(function(e){return{id:e}}),function(e){return e.id});ce.exit().transition(S).attr("opacity",0).call(this._gridPosition.bind(this)).remove();ce.enter().append("line").attr("opacity",0).attr("clip-path","url(#".concat(o,")")).call(this._gridPosition.bind(this),true).merge(ce).transition(S).attr("opacity",1).call(this._gridPosition.bind(this));var fe=M.filter(function(e,t){return G[t].lines.length&&!B.includes(e)});var de=G.some(function(e){return e.rotate});var ge=B.concat(fe).map(function(t){var e;var n=G.find(function(e){return e.d===t});var i=d._getPosition(t);var a=n?n.space:0;var r=n?n.lines.length:1;var o=n?n.lineHeight:1;var s=n&&d._labelOffset?n.offset:0;var l=_?a:ue.width-R[d._position.opposite]-H-R[d._orient]+x;var u=R[b],h=(H+s)*(w?-1:1),c=w?ue[y]+ue[v]-u:ue[y]+u;var f=(e={id:t,labelBounds:de&&n?{x:-n.width/2+n.fS/4,y:d._orient==="bottom"?h+x+(n.width-o*r)/2:h-x*2-(n.width+o*r)/2,width:n.width,height:n.height}:{x:_?-a/2:d._orient==="left"?-l-x+h:h+x,y:_?d._orient==="bottom"?h+x:h-x-oe:-a/2,width:_?a:l,height:_?oe:a},rotate:n?n.rotate:false,size:M.includes(t)?h:0,text:M.includes(t)?N(t):false,tick:B.includes(t)},WN(e,m,i+(d._scale==="band"?d._d3Scale.bandwidth()/2:0)),WN(e,y,c),e);return f});if(this._shape==="Line"){ge=ge.concat(ge.map(function(e){var t=Object.assign({},e);t[y]+=e.size;return t}))}(new FT[this._shape]).data(ge).duration(this._duration).labelConfig({ellipsis:function e(t){return t&&t.length?"".concat(t,"..."):""},rotate:function e(t){return t.rotate?-90:0}}).select(Ox("g.ticks",{parent:he}).node()).config(this._shapeConfig).render();var pe=he.selectAll("line.bar").data([null]);pe.enter().append("line").attr("class","bar").attr("opacity",0).call(this._barPosition.bind(this)).merge(pe).transition(S).attr("opacity",1).call(this._barPosition.bind(this));this._titleClass.data(this._title?[{text:this._title}]:[]).duration(this._duration).height(R[this._orient]).rotate(this._orient==="left"?-90:this._orient==="right"?90:0).select(Ox("g.d3plus-Axis-title",{parent:he}).node()).text(function(e){return e.text}).verticalAlign("middle").width(T[T.length-1]-T[0]).x(_?T[0]:this._orient==="left"?ue.x+R.left/2-(T[T.length-1]-T[0])/2:ue.x+ue.width-R.right/2-(T[T.length-1]-T[0])/2).y(_?this._orient==="bottom"?ue.y+ue.height-R.bottom:ue.y:T[0]+(T[T.length-1]-T[0])/2-R[this._orient]/2).config(this._titleConfig).render();this._lastScale=this._getPosition.bind(this);if(t)setTimeout(t,this._duration+100);return this}},{key:"align",value:function e(t){return arguments.length?(this._align=t,this):this._align}},{key:"barConfig",value:function e(t){return arguments.length?(this._barConfig=Object.assign(this._barConfig,t),this):this._barConfig}},{key:"domain",value:function e(t){return arguments.length?(this._domain=t,this):this._domain}},{key:"duration",value:function e(t){return arguments.length?(this._duration=t,this):this._duration}},{key:"grid",value:function e(t){return arguments.length?(this._grid=t,this):this._grid}},{key:"gridConfig",value:function e(t){return arguments.length?(this._gridConfig=Object.assign(this._gridConfig,t),this):this._gridConfig}},{key:"gridLog",value:function e(t){return arguments.length?(this._gridLog=t,this):this._gridLog}},{key:"gridSize",value:function e(t){return arguments.length?(this._gridSize=t,this):this._gridSize}},{key:"height",value:function e(t){return arguments.length?(this._height=t,this):this._height}},{key:"labels",value:function e(t){return arguments.length?(this._labels=t,this):this._labels}},{key:"labelOffset",value:function e(t){return arguments.length?(this._labelOffset=t,this):this._labelOffset}},{key:"labelRotation",value:function e(t){return arguments.length?(this._labelRotation=t,this):this._labelRotation}},{key:"maxSize",value:function e(t){return arguments.length?(this._maxSize=t,this):this._maxSize}},{key:"minSize",value:function e(t){return arguments.length?(this._minSize=t,this):this._minSize}},{key:"orient",value:function e(t){if(arguments.length){var n=["top","bottom"].includes(t),i={top:"bottom",right:"left",bottom:"top",left:"right"};this._position={horizontal:n,width:n?"width":"height",height:n?"height":"width",x:n?"x":"y",y:n?"y":"x",opposite:i[t]};return this._orient=t,this}return this._orient}},{key:"outerBounds",value:function e(){return this._outerBounds}},{key:"padding",value:function e(t){return arguments.length?(this._padding=t,this):this._padding}},{key:"paddingInner",value:function e(t){return arguments.length?(this._paddingInner=t,this):this._paddingInner}},{key:"paddingOuter",value:function e(t){return arguments.length?(this._paddingOuter=t,this):this._paddingOuter}},{key:"range",value:function e(t){return arguments.length?(this._range=t,this):this._range}},{key:"scale",value:function e(t){return arguments.length?(this._scale=t,this):this._scale}},{key:"scalePadding",value:function e(t){return arguments.length?(this._scalePadding=t,this):this._scalePadding}},{key:"select",value:function e(t){return arguments.length?(this._select=Rl(t),this):this._select}},{key:"shape",value:function e(t){return arguments.length?(this._shape=t,this):this._shape}},{key:"shapeConfig",value:function e(t){return arguments.length?(this._shapeConfig=Ch(this._shapeConfig,t),this):this._shapeConfig}},{key:"tickFormat",value:function e(t){return arguments.length?(this._tickFormat=t,this):this._tickFormat}},{key:"ticks",value:function e(t){return arguments.length?(this._ticks=t,this):this._ticks}},{key:"tickSize",value:function e(t){return arguments.length?(this._tickSize=t,this):this._tickSize}},{key:"tickSpecifier",value:function e(t){return arguments.length?(this._tickSpecifier=t,this):this._tickSpecifier}},{key:"tickSuffix",value:function e(t){return arguments.length?(this._tickSuffix=t,this):this._tickSuffix}},{key:"timeLocale",value:function e(t){return arguments.length?(this._timeLocale=t,this):this._timeLocale}},{key:"title",value:function e(t){return arguments.length?(this._title=t,this):this._title}},{key:"titleConfig",value:function e(t){return arguments.length?(this._titleConfig=Object.assign(this._titleConfig,t),this):this._titleConfig}},{key:"width",value:function e(t){return arguments.length?(this._width=t,this):this._width}}]);return i}(Tx);function hP(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){hP=function e(t){return typeof t}}else{hP=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return hP(e)}function cP(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function fP(e,t){for(var n=0;n0){var r=(n[t]-n[e-1])/(t-e+1);a=i[t]-i[e-1]-(t-e+1)*r*r}else a=i[t]-n[t]*n[t]/(t+1);if(a<0)return 0;return a}function $P(e,t,n,i,a,r,o){if(e>t)return;var s=Math.floor((e+t)/2);i[n][s]=i[n-1][s-1];a[n][s]=s;var l=n;if(e>n)l=Math.max(l,a[n][e-1]||0);l=Math.max(l,a[n-1][s]||0);var u=s-1;if(t=l;--h){var c=XP(h,s,r,o);if(c+i[n-1][l-1]>=i[n][s])break;var f=XP(l,s,r,o);var d=f+i[n-1][l-1];if(de.length){throw new Error("Cannot generate more classes than there are data values")}var n=KP(e);var i=qP(n);if(i===1){return[n]}var a=YP(t,n.length),r=YP(t,n.length);ZP(n,r,a);var o=a[0]?a[0].length-1:0;var s=[];for(var l=a.length-1;l>=0;l--){var u=a[l][o];s[l]=n.slice(u,o+1);if(l>0)o=u-1}return s}function QP(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){QP=function e(t){return typeof t}}else{QP=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return QP(e)}function eD(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function tD(e,t){for(var n=0;nl){var u=1,h=[];var d=me(this._lineData.map(function(e){return e.words.length}));this._wrapLines=function(){var t=this;u++;if(u>d)return;var o=u===1?this._lineData.slice():this._lineData.filter(function(e){return e.width+e.shapeWidth+t._padding*(e.width?2:1)>l&&e.words.length>=u}).sort(function(e,t){return t.sentence.length-e.sentence.length});if(o.length&&f>o[0].height*u){var s=false;var e=function e(t){var n=o[t];var i=n.og.height*u,a=n.og.width*(1.5*(1/u));var r=hA().fontFamily(n.f).fontSize(n.s).lineHeight(n.lh).width(a).height(i)(n.sentence);if(!r.truncated){n.width=Math.ceil(me(r.lines.map(function(e){return DE(e,{"font-family":n.f,"font-size":n.s})})))+n.s;n.height=r.lines.length*(n.lh+1)}else{s=true;return"break"}};for(var n=0;nf){h=[];break}if(a>l){h=[];this._wrapLines();break}else if(t+af){o=O(this._lineData.map(function(e){return e.shapeWidth+c._padding}))-this._padding;for(var s=0;s=1||u<=-1?Math.round(u).toString().length-1:u.toString().split(".")[1].replace(/([1-9])[1-9].*$/,"$1").length*-1;var c=Math.pow(10,h);return o===t&&e===1?"".concat(a(je([t+c,i.find(function(e){return e>t&&et&&ethis._midpoint;var f=h&&c;var d=this._buckets instanceof Array?this._buckets.length:this._buckets;var g=this._color,p,v;if(g&&!(g instanceof Array)){g=Le(0,d,1).map(function(e){return lS(g,(e+1)/d)}).reverse()}if(this._scale==="jenks"){var m=this._data.map(this._value).filter(function(e){return e!==null&&typeof e==="number"});var y=je([g?g.length:d,m.length]);var _=[];if(this._buckets instanceof Array){v=this._buckets}else{if(f&&this._centered){var b=Math.floor(y/2);var w=y%2;var x=m.filter(function(e){return e=a._midpoint});var C=ze(S);var E=k>C?1:0;var A=C>k?1:0;var R=JP(x,b+w*E);var M=JP(S,b+w*A);_=R.concat(M)}else{_=JP(m,y)}v=_.map(function(e){return e[0]})}var T=new Set(v);if(v.length!==T.size){p=Array.from(T)}if(!g){if(f){g=[this._colorMin,this._colorMid,this._colorMax];var B=v.slice(0,y).filter(function(e,t){return ea._midpoint});var P=v.slice(0,y).filter(function(e,t){return e>a._midpoint&&v[t+1]>a._midpoint});var D=B.map(function(e,t){return!t?g[0]:lS(g[0],t/B.length)});var O=N.map(function(){return g[1]});var z=P.map(function(e,t){return t===P.length-1?g[2]:lS(g[2],1-(t+1)/P.length)});g=D.concat(O).concat(z)}else{g=Le(0,d,1).map(function(e){return lS(a._colorMax,e/d)}).reverse()}}if(m.length<=y){g=g.slice(y-m.length)}g=[g[0]].concat(g);this._colorScale=na().domain(v).range(g)}else{var F=this._buckets instanceof Array?this._buckets:undefined;if(f&&!g){var L=Math.floor(d/2);var I=Le(0,L,1).map(function(e){return!e?a._colorMin:lS(a._colorMin,e/L)});var j=(d%2?[0]:[]).map(function(){return a._colorMid});var H=Le(0,L,1).map(function(e){return!e?a._colorMax:lS(a._colorMax,e/L)}).reverse();g=I.concat(j).concat(H);if(!F){var V=(g.length-1)/2;F=[u[0],this._midpoint,u[1]];F=Le(u[0],this._midpoint,-(u[0]-this._midpoint)/V).concat(Le(this._midpoint,u[1],(u[1]-this._midpoint)/V)).concat([u[1]])}}else{if(!g){if(this._scale==="buckets"||this._scale==="quantile"){g=Le(0,d,1).map(function(e){return lS(h?a._colorMin:a._colorMax,e/d)});if(c)g=g.reverse()}else{g=h?[this._colorMin,lS(this._colorMin,.8)]:[lS(this._colorMax,.8),this._colorMax]}}if(!F){if(this._scale==="quantile"){var G=1/(g.length-1);F=Le(0,1+G/2,G).map(function(e){return Ie(l,e)})}else if(f&&this._color&&this._centered){var U=(this._midpoint-u[0])/Math.floor(g.length/2);var W=(u[1]-this._midpoint)/Math.floor(g.length/2);var K=Le(u[0],this._midpoint,U);var q=Le(this._midpoint,u[1]+W/2,W);F=K.concat(q)}else{var Y=(u[1]-u[0])/(g.length-1);F=Le(u[0],u[1]+Y/2,Y)}}}if(this._scale==="buckets"||this._scale==="quantile"){v=F;g=[g[0]].concat(g)}else if(this._scale==="log"){var X=F.filter(function(e){return e<0});if(X.length){var $=X[0];var Z=X.map(function(e){return-Math.pow(Math.abs($),e/$)});X.forEach(function(e,t){F[F.indexOf(e)]=Z[t]})}var J=F.filter(function(e){return e>0});if(J.length){var Q=J[J.length-1];var ee=J.map(function(e){return Math.pow(Q,e/Q)});J.forEach(function(e,t){F[F.indexOf(e)]=ee[t]})}if(F.includes(0))F[F.indexOf(0)]=1}this._colorScale=(this._scale==="buckets"||this._scale==="quantile"?na:Bi)().domain(F).range(g)}if(this._colorScale.clamp)this._colorScale.clamp(true);var te=this._bucketAxis||!["buckets","jenks","quantile"].includes(this._scale);var ne=eh().duration(this._duration);var ie={enter:{opacity:0},exit:{opacity:0},parent:this._group,transition:ne,update:{opacity:1}};var ae=Ox("g.d3plus-ColorScale-labels",Object.assign({condition:te},ie));var re=Ox("g.d3plus-ColorScale-Rect",Object.assign({condition:te},ie));var oe=Ox("g.d3plus-ColorScale-legend",Object.assign({condition:!te},ie));if(te){var se;var le={x:0,y:0};var ue=u.slice();if(this._bucketAxis){var he=ue[ue.length-1];var ce=ue[ue.length-2];var fe=he?he/10:ce/10;var de=fe>=1||fe<=-1?Math.round(fe).toString().length-1:fe.toString().split(".")[1].replace(/([1-9])[1-9].*$/,"$1").length*-1;var ge=Math.pow(10,de);ue[ue.length-1]=he+ge}var pe=Ch({domain:ue,duration:this._duration,height:this._height,labels:p||v,orient:this._orient,padding:this._padding,scale:this._scale==="log"?"log":"linear",ticks:v,width:this._width},this._axisConfig);var ve=Ch({height:this["_".concat(i)]/2,width:this["_".concat(r)]/2},this._labelConfig||this._axisConfig.titleConfig);this._labelClass.config(ve);var me=[];if(n&&this._labelMin){var ye={"font-family":this._labelClass.fontFamily()(this._labelMin),"font-size":this._labelClass.fontSize()(this._labelMin),"font-weight":this._labelClass.fontWeight()(this._labelMin)};if(ye["font-family"]instanceof Array)ye["font-family"]=ye["font-family"][0];var _e=DE(this._labelMin,ye);if(_e&&_e=0){return 1}}return 0}();function jD(e){var t=false;return function(){if(t){return}t=true;window.Promise.resolve().then(function(){t=false;e()})}}function HD(e){var t=false;return function(){if(!t){t=true;setTimeout(function(){t=false;e()},ID)}}}var VD=LD&&window.Promise;var GD=VD?jD:HD;function UD(e){var t={};return e&&t.toString.call(e)==="[object Function]"}function WD(e,t){if(e.nodeType!==1){return[]}var n=e.ownerDocument.defaultView;var i=n.getComputedStyle(e,null);return t?i[t]:i}function KD(e){if(e.nodeName==="HTML"){return e}return e.parentNode||e.host}function qD(e){if(!e){return document.body}switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=WD(e),n=t.overflow,i=t.overflowX,a=t.overflowY;if(/(auto|scroll|overlay)/.test(n+a+i)){return e}return qD(KD(e))}function YD(e){return e&&e.referenceNode?e.referenceNode:e}var XD=LD&&!!(window.MSInputMethodContext&&document.documentMode);var $D=LD&&/MSIE 10/.test(navigator.userAgent);function ZD(e){if(e===11){return XD}if(e===10){return $D}return XD||$D}function JD(e){if(!e){return document.documentElement}var t=ZD(10)?document.body:null;var n=e.offsetParent||null;while(n===t&&e.nextElementSibling){n=(e=e.nextElementSibling).offsetParent}var i=n&&n.nodeName;if(!i||i==="BODY"||i==="HTML"){return e?e.ownerDocument.documentElement:document.documentElement}if(["TH","TD","TABLE"].indexOf(n.nodeName)!==-1&&WD(n,"position")==="static"){return JD(n)}return n}function QD(e){var t=e.nodeName;if(t==="BODY"){return false}return t==="HTML"||JD(e.firstElementChild)===e}function eO(e){if(e.parentNode!==null){return eO(e.parentNode)}return e}function tO(e,t){if(!e||!e.nodeType||!t||!t.nodeType){return document.documentElement}var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING;var i=n?e:t;var a=n?t:e;var r=document.createRange();r.setStart(i,0);r.setEnd(a,0);var o=r.commonAncestorContainer;if(e!==o&&t!==o||i.contains(a)){if(QD(o)){return o}return JD(o)}var s=eO(e);if(s.host){return tO(s.host,t)}else{return tO(e,eO(t).host)}}function nO(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"top";var n=t==="top"?"scrollTop":"scrollLeft";var i=e.nodeName;if(i==="BODY"||i==="HTML"){var a=e.ownerDocument.documentElement;var r=e.ownerDocument.scrollingElement||a;return r[n]}return e[n]}function iO(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var i=nO(t,"top");var a=nO(t,"left");var r=n?-1:1;e.top+=i*r;e.bottom+=i*r;e.left+=a*r;e.right+=a*r;return e}function aO(e,t){var n=t==="x"?"Left":"Top";var i=n==="Left"?"Right":"Bottom";return parseFloat(e["border"+n+"Width"])+parseFloat(e["border"+i+"Width"])}function rO(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],ZD(10)?parseInt(n["offset"+e])+parseInt(i["margin"+(e==="Height"?"Top":"Left")])+parseInt(i["margin"+(e==="Height"?"Bottom":"Right")]):0)}function oO(e){var t=e.body;var n=e.documentElement;var i=ZD(10)&&getComputedStyle(n);return{height:rO("Height",t,n,i),width:rO("Width",t,n,i)}}var sO=function e(t,n){if(!(t instanceof n)){throw new TypeError("Cannot call a class as a function")}};var lO=function(){function i(e,t){for(var n=0;n2&&arguments[2]!==undefined?arguments[2]:false;var i=ZD(10);var a=t.nodeName==="HTML";var r=fO(e);var o=fO(t);var s=qD(e);var l=WD(t);var u=parseFloat(l.borderTopWidth);var h=parseFloat(l.borderLeftWidth);if(n&&a){o.top=Math.max(o.top,0);o.left=Math.max(o.left,0)}var c=cO({top:r.top-o.top-u,left:r.left-o.left-h,width:r.width,height:r.height});c.marginTop=0;c.marginLeft=0;if(!i&&a){var f=parseFloat(l.marginTop);var d=parseFloat(l.marginLeft);c.top-=u-f;c.bottom-=u-f;c.left-=h-d;c.right-=h-d;c.marginTop=f;c.marginLeft=d}if(i&&!n?t.contains(s):t===s&&s.nodeName!=="BODY"){c=iO(c,t)}return c}function gO(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=e.ownerDocument.documentElement;var i=dO(e,n);var a=Math.max(n.clientWidth,window.innerWidth||0);var r=Math.max(n.clientHeight,window.innerHeight||0);var o=!t?nO(n):0;var s=!t?nO(n,"left"):0;var l={top:o-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:a,height:r};return cO(l)}function pO(e){var t=e.nodeName;if(t==="BODY"||t==="HTML"){return false}if(WD(e,"position")==="fixed"){return true}var n=KD(e);if(!n){return false}return pO(n)}function vO(e){if(!e||!e.parentElement||ZD()){return document.documentElement}var t=e.parentElement;while(t&&WD(t,"transform")==="none"){t=t.parentElement}return t||document.documentElement}function mO(e,t,n,i){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var r={top:0,left:0};var o=a?vO(e):tO(e,YD(t));if(i==="viewport"){r=gO(o,a)}else{var s=void 0;if(i==="scrollParent"){s=qD(KD(t));if(s.nodeName==="BODY"){s=e.ownerDocument.documentElement}}else if(i==="window"){s=e.ownerDocument.documentElement}else{s=i}var l=dO(s,o,a);if(s.nodeName==="HTML"&&!pO(o)){var u=oO(e.ownerDocument),h=u.height,c=u.width;r.top+=l.top-l.marginTop;r.bottom=h+l.top;r.left+=l.left-l.marginLeft;r.right=c+l.left}else{r=l}}n=n||0;var f=typeof n==="number";r.left+=f?n:n.left||0;r.top+=f?n:n.top||0;r.right-=f?n:n.right||0;r.bottom-=f?n:n.bottom||0;return r}function yO(e){var t=e.width,n=e.height;return t*n}function _O(e,t,i,n,a){var r=arguments.length>5&&arguments[5]!==undefined?arguments[5]:0;if(e.indexOf("auto")===-1){return e}var o=mO(i,n,r,a);var s={top:{width:o.width,height:t.top-o.top},right:{width:o.right-t.right,height:o.height},bottom:{width:o.width,height:o.bottom-t.bottom},left:{width:t.left-o.left,height:o.height}};var l=Object.keys(s).map(function(e){return hO({key:e},s[e],{area:yO(s[e])})}).sort(function(e,t){return t.area-e.area});var u=l.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight});var h=u.length>0?u[0].key:l[0].key;var c=e.split("-")[1];return h+(c?"-"+c:"")}function bO(e,t,n){var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var a=i?vO(t):tO(t,YD(n));return dO(n,a,i)}function wO(e){var t=e.ownerDocument.defaultView;var n=t.getComputedStyle(e);var i=parseFloat(n.marginTop||0)+parseFloat(n.marginBottom||0);var a=parseFloat(n.marginLeft||0)+parseFloat(n.marginRight||0);var r={width:e.offsetWidth+a,height:e.offsetHeight+i};return r}function xO(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function kO(e,t,n){n=n.split("-")[0];var i=wO(e);var a={width:i.width,height:i.height};var r=["right","left"].indexOf(n)!==-1;var o=r?"top":"left";var s=r?"left":"top";var l=r?"height":"width";var u=!r?"height":"width";a[o]=t[o]+t[l]/2-i[l]/2;if(n===s){a[s]=t[s]-i[u]}else{a[s]=t[xO(s)]}return a}function SO(e,t){if(Array.prototype.find){return e.find(t)}return e.filter(t)[0]}function CO(e,t,n){if(Array.prototype.findIndex){return e.findIndex(function(e){return e[t]===n})}var i=SO(e,function(e){return e[t]===n});return e.indexOf(i)}function EO(e,n,t){var i=t===undefined?e:e.slice(0,CO(e,"name",t));i.forEach(function(e){if(e["function"]){console.warn("`modifier.function` is deprecated, use `modifier.fn`!")}var t=e["function"]||e.fn;if(e.enabled&&UD(t)){n.offsets.popper=cO(n.offsets.popper);n.offsets.reference=cO(n.offsets.reference);n=t(n,e)}});return n}function AO(){if(this.state.isDestroyed){return}var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:false,offsets:{}};e.offsets.reference=bO(this.state,this.popper,this.reference,this.options.positionFixed);e.placement=_O(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding);e.originalPlacement=e.placement;e.positionFixed=this.options.positionFixed;e.offsets.popper=kO(this.popper,e.offsets.reference,e.placement);e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute";e=EO(this.modifiers,e);if(!this.state.isCreated){this.state.isCreated=true;this.options.onCreate(e)}else{this.options.onUpdate(e)}}function RO(e,i){return e.some(function(e){var t=e.name,n=e.enabled;return n&&t===i})}function MO(e){var t=[false,"ms","Webkit","Moz","O"];var n=e.charAt(0).toUpperCase()+e.slice(1);for(var i=0;io[d]){e.offsets.popper[c]+=s[c]+g-o[d]}e.offsets.popper=cO(e.offsets.popper);var p=s[c]+s[u]/2-g/2;var v=WD(e.instance.popper);var m=parseFloat(v["margin"+h]);var y=parseFloat(v["border"+h+"Width"]);var _=p-e.offsets.popper[c]-m-y;_=Math.max(Math.min(o[u]-g,_),0);e.arrowElement=i;e.offsets.arrow=(n={},uO(n,c,Math.round(_)),uO(n,f,""),n);return e}function qO(e){if(e==="end"){return"start"}else if(e==="start"){return"end"}return e}var YO=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"];var XO=YO.slice(3);function $O(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=XO.indexOf(e);var i=XO.slice(n+1).concat(XO.slice(0,n));return t?i.reverse():i}var ZO={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function JO(p,v){if(RO(p.instance.modifiers,"inner")){return p}if(p.flipped&&p.placement===p.originalPlacement){return p}var m=mO(p.instance.popper,p.instance.reference,v.padding,v.boundariesElement,p.positionFixed);var y=p.placement.split("-")[0];var _=xO(y);var b=p.placement.split("-")[1]||"";var w=[];switch(v.behavior){case ZO.FLIP:w=[y,_];break;case ZO.CLOCKWISE:w=$O(y);break;case ZO.COUNTERCLOCKWISE:w=$O(y,true);break;default:w=v.behavior}w.forEach(function(e,t){if(y!==e||w.length===t+1){return p}y=p.placement.split("-")[0];_=xO(y);var n=p.offsets.popper;var i=p.offsets.reference;var a=Math.floor;var r=y==="left"&&a(n.right)>a(i.left)||y==="right"&&a(n.left)a(i.top)||y==="bottom"&&a(n.top)a(m.right);var l=a(n.top)a(m.bottom);var h=y==="left"&&o||y==="right"&&s||y==="top"&&l||y==="bottom"&&u;var c=["top","bottom"].indexOf(y)!==-1;var f=!!v.flipVariations&&(c&&b==="start"&&o||c&&b==="end"&&s||!c&&b==="start"&&l||!c&&b==="end"&&u);var d=!!v.flipVariationsByContent&&(c&&b==="start"&&s||c&&b==="end"&&o||!c&&b==="start"&&u||!c&&b==="end"&&l);var g=f||d;if(r||h||g){p.flipped=true;if(r||h){y=w[t+1]}if(g){b=qO(b)}p.placement=y+(b?"-"+b:"");p.offsets.popper=hO({},p.offsets.popper,kO(p.instance.popper,p.offsets.reference,p.placement));p=EO(p.instance.modifiers,p,"flip")}});return p}function QO(e){var t=e.offsets,n=t.popper,i=t.reference;var a=e.placement.split("-")[0];var r=Math.floor;var o=["top","bottom"].indexOf(a)!==-1;var s=o?"right":"bottom";var l=o?"left":"top";var u=o?"width":"height";if(n[s]r(i[s])){e.offsets.popper[l]=r(i[s])}return e}function ez(e,t,n,i){var a=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);var r=+a[1];var o=a[2];if(!r){return e}if(o.indexOf("%")===0){var s=void 0;switch(o){case"%p":s=n;break;case"%":case"%r":default:s=i}var l=cO(s);return l[t]/100*r}else if(o==="vh"||o==="vw"){var u=void 0;if(o==="vh"){u=Math.max(document.documentElement.clientHeight,window.innerHeight||0)}else{u=Math.max(document.documentElement.clientWidth,window.innerWidth||0)}return u/100*r}else{return r}}function tz(e,a,r,t){var o=[0,0];var s=["right","left"].indexOf(t)!==-1;var n=e.split(/(\+|\-)/).map(function(e){return e.trim()});var i=n.indexOf(SO(n,function(e){return e.search(/,|\s/)!==-1}));if(n[i]&&n[i].indexOf(",")===-1){console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.")}var l=/\s*,\s*|\s+/;var u=i!==-1?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];u=u.map(function(e,t){var n=(t===1?!s:s)?"height":"width";var i=false;return e.reduce(function(e,t){if(e[e.length-1]===""&&["+","-"].indexOf(t)!==-1){e[e.length-1]=t;i=true;return e}else if(i){e[e.length-1]+=t;i=false;return e}else{return e.concat(t)}},[]).map(function(e){return ez(e,n,a,r)})});u.forEach(function(n,i){n.forEach(function(e,t){if(FO(e)){o[i]+=e*(n[t-1]==="-"?-1:1)}})});return o}function nz(e,t){var n=t.offset;var i=e.placement,a=e.offsets,r=a.popper,o=a.reference;var s=i.split("-")[0];var l=void 0;if(FO(+n)){l=[+n,0]}else{l=tz(n,r,o,s)}if(s==="left"){r.top+=l[0];r.left-=l[1]}else if(s==="right"){r.top+=l[0];r.left+=l[1]}else if(s==="top"){r.left+=l[0];r.top-=l[1]}else if(s==="bottom"){r.left+=l[0];r.top+=l[1]}e.popper=r;return e}function iz(e,a){var t=a.boundariesElement||JD(e.instance.popper);if(e.instance.reference===t){t=JD(t)}var n=MO("transform");var i=e.instance.popper.style;var r=i.top,o=i.left,s=i[n];i.top="";i.left="";i[n]="";var l=mO(e.instance.popper,e.instance.reference,a.padding,t,e.positionFixed);i.top=r;i.left=o;i[n]=s;a.boundaries=l;var u=a.priority;var h=e.offsets.popper;var c={primary:function e(t){var n=h[t];if(h[t]l[t]&&!a.escapeWithReference){i=Math.min(h[n],l[t]-(t==="right"?h.width:h.height))}return uO({},n,i)}};u.forEach(function(e){var t=["left","top"].indexOf(e)!==-1?"primary":"secondary";h=hO({},h,c[t](e))});e.offsets.popper=h;return e}function az(e){var t=e.placement;var n=t.split("-")[0];var i=t.split("-")[1];if(i){var a=e.offsets,r=a.reference,o=a.popper;var s=["bottom","top"].indexOf(n)!==-1;var l=s?"left":"top";var u=s?"width":"height";var h={start:uO({},l,r[l]),end:uO({},l,r[l]+r[u]-o[u])};e.offsets.popper=hO({},o,h[i])}return e}function rz(e){if(!WO(e.instance.modifiers,"hide","preventOverflow")){return e}var t=e.offsets.reference;var n=SO(e.instance.modifiers,function(e){return e.name==="preventOverflow"}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.right2&&arguments[2]!==undefined?arguments[2]:{};sO(this,r);this.scheduleUpdate=function(){return requestAnimationFrame(n.update)};this.update=GD(this.update.bind(this));this.options=hO({},r.Defaults,i);this.state={isDestroyed:false,isCreated:false,scrollParents:[]};this.reference=e&&e.jquery?e[0]:e;this.popper=t&&t.jquery?t[0]:t;this.options.modifiers={};Object.keys(hO({},r.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=hO({},r.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})});this.modifiers=Object.keys(this.options.modifiers).map(function(e){return hO({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order});this.modifiers.forEach(function(e){if(e.enabled&&UD(e.onLoad)){e.onLoad(n.reference,n.popper,n.options,e,n.state)}});this.update();var a=this.options.eventsEnabled;if(a){this.enableEventListeners()}this.state.eventsEnabled=a}lO(r,[{key:"update",value:function e(){return AO.call(this)}},{key:"destroy",value:function e(){return TO.call(this)}},{key:"enableEventListeners",value:function e(){return DO.call(this)}},{key:"disableEventListeners",value:function e(){return zO.call(this)}}]);return r}();uz.Utils=(typeof window!=="undefined"?window:global).PopperUtils;uz.placements=YO;uz.Defaults=lz;function hz(e){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){hz=function e(t){return typeof t}}else{hz=function e(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return hz(e)}function cz(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function fz(e,t){for(var n=0;n0&&arguments[0]!==undefined?arguments[0]:{},n=t.duration,i=n===void 0?600:n,a=t.callback;this.mask.call(this.exit.bind(this),i);this.elem.call(this.exit.bind(this),i);if(a)setTimeout(a,i+100);this._isVisible=false;return this}},{key:"render",value:function e(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=t.callback,i=t.container,a=i===void 0?"body":i,r=t.duration,o=r===void 0?600:r,s=t.html,l=s===void 0?"Please Wait":s,u=t.mask,h=u===void 0?"rgba(0, 0, 0, 0.05)":u,c=t.style,f=c===void 0?{}:c;var d=Rl(a);this.mask=d.selectAll("div.d3plus-Mask").data(h?[h]:[]);this.mask=this.mask.enter().append("div").attr("class","d3plus-Mask").style("opacity",1).merge(this.mask);this.mask.exit().call(this.exit.bind(this),o);jx(this.mask,{"background-color":String,bottom:"0px",left:"0px",position:"absolute",right:"0px",top:"0px"});this.elem=d.selectAll("div.d3plus-Message").data([l]);this.elem=this.elem.enter().append("div").attr("class","d3plus-Message").style("opacity",1).merge(this.elem).html(String);jx(this.elem,f);if(n)setTimeout(n,100);this._isVisible=true;return this}}]);return e}();function Ez(){var e=this._history.length;var t=Ox("g.d3plus-viz-back",{parent:this._select,transition:this._transition,update:{transform:"translate(".concat(this._margin.left,", ").concat(this._margin.top,")")}}).node();this._backClass.data(e?[{text:"← ".concat(this._translate("Back")),x:0,y:0}]:[]).select(t).config(this._backConfig).render();this._margin.top+=e?this._backClass.fontSize()()+this._backClass.padding()()*2:0}function Az(){var i=this;var e=this._data;var t=this._colorScalePosition||"bottom";var n=["top","bottom"].includes(t);var a=this._colorScalePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var r=this._width-(this._margin.left+this._margin.right+a.left+a.right);var o=n?je([this._colorScaleMaxSize,r]):this._width-(this._margin.left+this._margin.right);var s=this._height-(this._margin.bottom+this._margin.top+a.bottom+a.top);var l=!n?je([this._colorScaleMaxSize,s]):this._height-(this._margin.bottom+this._margin.top);var u={opacity:this._colorScalePosition?1:0,transform:"translate(".concat(n?this._margin.left+a.left+(r-o)/2:this._margin.left,", ").concat(n?this._margin.top:this._margin.top+a.top+(s-l)/2,")")};var h=this._colorScale&&e&&e.length>1;var c=Ox("g.d3plus-viz-colorScale",{condition:h&&!this._colorScaleConfig.select,enter:u,parent:this._select,transition:this._transition,update:u}).node();if(h){var f=e.filter(function(e,t){var n=i._colorScale(e,t);return n!==undefined&&n!==null});this._colorScaleClass.align({bottom:"end",left:"start",right:"end",top:"start"}[t]||"bottom").duration(this._duration).data(f).height(l).locale(this._locale).orient(t).select(c).value(this._colorScale).width(o).config(this._colorScaleConfig).render();var d=this._colorScaleClass.outerBounds();if(this._colorScalePosition&&!this._colorScaleConfig.select&&d.height){if(n)this._margin[t]+=d.height+this._legendClass.padding()*2;else this._margin[t]+=d.width+this._legendClass.padding()*2}}else{this._colorScaleClass.config(this._colorScaleConfig)}}var Rz=DN(function(t,e){(function(e){{t.exports=e()}})(function(){return function r(o,s,l){function u(n,e){if(!s[n]){if(!o[n]){var t=typeof ON=="function"&&ON;if(!e&&t)return t(n,!0);if(h)return h(n,!0);var i=new Error("Cannot find module '"+n+"'");throw i.code="MODULE_NOT_FOUND",i}var a=s[n]={exports:{}};o[n][0].call(a.exports,function(e){var t=o[n][1][e];return u(t?t:e)},a,a.exports,r,o,s,l)}return s[n].exports}var h=typeof ON=="function"&&ON;for(var e=0;e= 0x80 (not a basic code point)","invalid-input":"Invalid input"},c=y-_,S=Math.floor,C=String.fromCharCode,f;function E(e){throw new RangeError(h[e])}function d(e,t){var n=e.length;var i=[];while(n--){i[n]=t(e[n])}return i}function g(e,t){var n=e.split("@");var i="";if(n.length>1){i=n[0]+"@";e=n[1]}e=e.replace(u,".");var a=e.split(".");var r=d(a,t).join(".");return i+r}function A(e){var t=[],n=0,i=e.length,a,r;while(n=55296&&a<=56319&&n65535){e-=65536;t+=C(e>>>10&1023|55296);e=56320|e&1023}t+=C(e);return t}).join("")}function R(e){if(e-48<10){return e-22}if(e-65<26){return e-65}if(e-97<26){return e-97}return y}function M(e,t){return e+22+75*(e<26)-((t!=0)<<5)}function T(e,t,n){var i=0;e=n?S(e/o):e>>1;e+=S(e/t);for(;e>c*b>>1;i+=y){e=S(e/c)}return S(i+(c+1)*e/(e+r))}function p(e){var t=[],n=e.length,i,a=0,r=x,o=w,s,l,u,h,c,f,d,g,p;s=e.lastIndexOf(k);if(s<0){s=0}for(l=0;l=128){E("not-basic")}t.push(e.charCodeAt(l))}for(u=s>0?s+1:0;u=n){E("invalid-input")}d=R(e.charCodeAt(u++));if(d>=y||d>S((m-a)/c)){E("overflow")}a+=d*c;g=f<=o?_:f>=o+b?b:f-o;if(dS(m/p)){E("overflow")}c*=p}i=t.length+1;o=T(a-h,i,h==0);if(S(a/i)>m-r){E("overflow")}r+=S(a/i);a%=i;t.splice(a++,0,r)}return v(t)}function B(e){var t,n,i,a,r,o,s,l,u,h,c,f=[],d,g,p,v;e=A(e);d=e.length;t=x;n=0;r=w;for(o=0;o=t&&cS((m-n)/g)){E("overflow")}n+=(s-t)*g;t=s;for(o=0;om){E("overflow")}if(c==t){for(l=n,u=y;;u+=y){h=u<=r?_:u>=r+b?b:u-r;if(l0){c(n.documentElement);clearInterval(e);if(a.type==="view"){l.contentWindow.scrollTo(r,o);if(/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&(l.contentWindow.scrollY!==o||l.contentWindow.scrollX!==r)){n.documentElement.style.top=-o+"px";n.documentElement.style.left=-r+"px";n.documentElement.style.position="absolute"}}t(l)}},50)};n.open();n.write("");u(e,r,o);n.replaceChild(n.adoptNode(s),n.documentElement);n.close()})}},{"./log":13}],3:[function(e,t,n){function i(e){this.r=0;this.g=0;this.b=0;this.a=null;var t=this.fromArray(e)||this.namedColor(e)||this.rgb(e)||this.rgba(e)||this.hex6(e)||this.hex3(e)}i.prototype.darken=function(e){var t=1-e;return new i([Math.round(this.r*t),Math.round(this.g*t),Math.round(this.b*t),this.a])};i.prototype.isTransparent=function(){return this.a===0};i.prototype.isBlack=function(){return this.r===0&&this.g===0&&this.b===0};i.prototype.fromArray=function(e){if(Array.isArray(e)){this.r=Math.min(e[0],255);this.g=Math.min(e[1],255);this.b=Math.min(e[2],255);if(e.length>3){this.a=e[3]}}return Array.isArray(e)};var a=/^#([a-f0-9]{3})$/i;i.prototype.hex3=function(e){var t=null;if((t=e.match(a))!==null){this.r=parseInt(t[1][0]+t[1][0],16);this.g=parseInt(t[1][1]+t[1][1],16);this.b=parseInt(t[1][2]+t[1][2],16)}return t!==null};var r=/^#([a-f0-9]{6})$/i;i.prototype.hex6=function(e){var t=null;if((t=e.match(r))!==null){this.r=parseInt(t[1].substring(0,2),16);this.g=parseInt(t[1].substring(2,4),16);this.b=parseInt(t[1].substring(4,6),16)}return t!==null};var o=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;i.prototype.rgb=function(e){var t=null;if((t=e.match(o))!==null){this.r=Number(t[1]);this.g=Number(t[2]);this.b=Number(t[3])}return t!==null};var s=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;i.prototype.rgba=function(e){var t=null;if((t=e.match(s))!==null){this.r=Number(t[1]);this.g=Number(t[2]);this.b=Number(t[3]);this.a=Number(t[4])}return t!==null};i.prototype.toString=function(){return this.a!==null&&this.a!==1?"rgba("+[this.r,this.g,this.b,this.a].join(",")+")":"rgb("+[this.r,this.g,this.b].join(",")+")"};i.prototype.namedColor=function(e){e=e.toLowerCase();var t=l[e];if(t){this.r=t[0];this.g=t[1];this.b=t[2]}else if(e==="transparent"){this.r=this.g=this.b=this.a=0;return true}return!!t};i.prototype.isColor=true;var l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};t.exports=i},{}],4:[function(e,t,n){var d=e("./support");var o=e("./renderers/canvas");var g=e("./imageloader");var p=e("./nodeparser");var i=e("./nodecontainer");var v=e("./log");var a=e("./utils");var r=e("./clone");var s=e("./proxy").loadUrlDocument;var m=a.getBounds;var c="data-html2canvas-node";var l=0;function u(e,t){var n=l++;t=t||{};if(t.logging){v.options.logging=true;v.options.start=Date.now()}t.async=typeof t.async==="undefined"?true:t.async;t.allowTaint=typeof t.allowTaint==="undefined"?false:t.allowTaint;t.removeContainer=typeof t.removeContainer==="undefined"?true:t.removeContainer;t.javascriptEnabled=typeof t.javascriptEnabled==="undefined"?false:t.javascriptEnabled;t.imageTimeout=typeof t.imageTimeout==="undefined"?1e4:t.imageTimeout;t.renderer=typeof t.renderer==="function"?t.renderer:o;t.strict=!!t.strict;if(typeof e==="string"){if(typeof t.proxy!=="string"){return Promise.reject("Proxy must be used when rendering url")}var i=t.width!=null?t.width:window.innerWidth;var a=t.height!=null?t.height:window.innerHeight;return s(k(e),t.proxy,document,i,a,t).then(function(e){return y(e.contentWindow.document.documentElement,e,t,i,a)})}var r=(e===undefined?[document.documentElement]:e.length?e:[e])[0];r.setAttribute(c+n,n);return f(r.ownerDocument,t,r.ownerDocument.defaultView.innerWidth,r.ownerDocument.defaultView.innerHeight,n).then(function(e){if(typeof t.onrendered==="function"){v("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");t.onrendered(e)}return e})}u.CanvasRenderer=o;u.NodeContainer=i;u.log=v;u.utils=a;var h=typeof document==="undefined"||typeof Object.create!=="function"||typeof document.createElement("canvas").getContext!=="function"?function(){return Promise.reject("No canvas support")}:u;t.exports=h;function f(o,s,l,u,h){return r(o,o,l,u,s,o.defaultView.pageXOffset,o.defaultView.pageYOffset).then(function(e){v("Document cloned");var t=c+h;var n="["+t+"='"+h+"']";o.querySelector(n).removeAttribute(t);var i=e.contentWindow;var a=i.document.querySelector(n);var r=typeof s.onclone==="function"?Promise.resolve(s.onclone(i.document)):Promise.resolve(true);return r.then(function(){return y(a,e,s,l,u)})})}function y(t,n,i,e,a){var r=n.contentWindow;var o=new d(r.document);var s=new g(i,o);var l=m(t);var u=i.type==="view"?e:w(r.document);var h=i.type==="view"?a:x(r.document);var c=new i.renderer(u,h,s,i,document);var f=new p(t,c,o,s,i);return f.ready.then(function(){v("Finished rendering");var e;if(i.type==="view"){e=b(c.canvas,{width:c.canvas.width,height:c.canvas.height,top:0,left:0,x:0,y:0})}else if(t===r.document.body||t===r.document.documentElement||i.canvas!=null){e=c.canvas}else{e=b(c.canvas,{width:i.width!=null?i.width:l.width,height:i.height!=null?i.height:l.height,top:l.top,left:l.left,x:0,y:0})}_(n,i);return e})}function _(e,t){if(t.removeContainer){e.parentNode.removeChild(e);v("Cleaned up container")}}function b(e,t){var n=document.createElement("canvas");var i=Math.min(e.width-1,Math.max(0,t.left));var a=Math.min(e.width,Math.max(1,t.left+t.width));var r=Math.min(e.height-1,Math.max(0,t.top));var o=Math.min(e.height,Math.max(1,t.top+t.height));n.width=t.width;n.height=t.height;var s=a-i;var l=o-r;v("Cropping canvas at:","left:",t.left,"top:",t.top,"width:",s,"height:",l);v("Resulting crop with width",t.width,"and height",t.height,"with x",i,"and y",r);n.getContext("2d").drawImage(e,i,r,s,l,t.x,t.y,s,l);return n}function w(e){return Math.max(Math.max(e.body.scrollWidth,e.documentElement.scrollWidth),Math.max(e.body.offsetWidth,e.documentElement.offsetWidth),Math.max(e.body.clientWidth,e.documentElement.clientWidth))}function x(e){return Math.max(Math.max(e.body.scrollHeight,e.documentElement.scrollHeight),Math.max(e.body.offsetHeight,e.documentElement.offsetHeight),Math.max(e.body.clientHeight,e.documentElement.clientHeight))}function k(e){var t=document.createElement("a");t.href=e;t.href=t.href;return t}},{"./clone":2,"./imageloader":11,"./log":13,"./nodecontainer":14,"./nodeparser":15,"./proxy":16,"./renderers/canvas":20,"./support":22,"./utils":26}],5:[function(e,t,n){var i=e("./log");var a=e("./utils").smallImage;function r(e){this.src=e;i("DummyImageContainer for",e);if(!this.promise||!this.image){i("Initiating DummyImageContainer");r.prototype.image=new Image;var n=this.image;r.prototype.promise=new Promise(function(e,t){n.onload=e;n.onerror=t;n.src=a();if(n.complete===true){e(n)}})}}t.exports=r},{"./log":13,"./utils":26}],6:[function(e,t,n){var l=e("./utils").smallImage;function i(e,t){var n=document.createElement("div"),i=document.createElement("img"),a=document.createElement("span"),r="Hidden Text",o,s;n.style.visibility="hidden";n.style.fontFamily=e;n.style.fontSize=t;n.style.margin=0;n.style.padding=0;document.body.appendChild(n);i.src=l();i.width=1;i.height=1;i.style.margin=0;i.style.padding=0;i.style.verticalAlign="baseline";a.style.fontFamily=e;a.style.fontSize=t;a.style.margin=0;a.style.padding=0;a.appendChild(document.createTextNode(r));n.appendChild(a);n.appendChild(i);o=i.offsetTop-a.offsetTop+1;n.removeChild(a);n.appendChild(document.createTextNode(r));n.style.lineHeight="normal";i.style.verticalAlign="super";s=i.offsetTop-n.offsetTop+1;document.body.removeChild(n);this.baseline=o;this.lineWidth=1;this.middle=s}t.exports=i},{"./utils":26}],7:[function(e,t,n){var i=e("./font");function a(){this.data={}}a.prototype.getMetrics=function(e,t){if(this.data[e+"-"+t]===undefined){this.data[e+"-"+t]=new i(e,t)}return this.data[e+"-"+t]};t.exports=a},{"./font":6}],8:[function(r,e,t){var n=r("./utils");var o=n.getBounds;var a=r("./proxy").loadUrlDocument;function i(t,e,n){this.image=null;this.src=t;var i=this;var a=o(t);this.promise=(!e?this.proxyLoad(n.proxy,a,n):new Promise(function(e){if(t.contentWindow.document.URL==="about:blank"||t.contentWindow.document.documentElement==null){t.contentWindow.onload=t.onload=function(){e(t)}}else{e(t)}})).then(function(e){var t=r("./core");return t(e.contentWindow.document.documentElement,{type:"view",width:e.width,height:e.height,proxy:n.proxy,javascriptEnabled:n.javascriptEnabled,removeContainer:n.removeContainer,allowTaint:n.allowTaint,imageTimeout:n.imageTimeout/2})}).then(function(e){return i.image=e})}i.prototype.proxyLoad=function(e,t,n){var i=this.src;return a(i.src,e,i.ownerDocument,t.width,t.height,n)};e.exports=i},{"./core":4,"./proxy":16,"./utils":26}],9:[function(e,t,n){function i(e){this.src=e.value;this.colorStops=[];this.type=null;this.x0=.5;this.y0=.5;this.x1=.5;this.y1=.5;this.promise=Promise.resolve(true)}i.TYPES={LINEAR:1,RADIAL:2};i.REGEXP_COLORSTOP=/^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;t.exports=i},{}],10:[function(e,t,n){function i(n,i){this.src=n;this.image=new Image;var a=this;this.tainted=null;this.promise=new Promise(function(e,t){a.image.onload=e;a.image.onerror=t;if(i){a.image.crossOrigin="anonymous"}a.image.src=n;if(a.image.complete===true){e(a.image)}})}t.exports=i},{}],11:[function(e,t,n){var r=e("./log");var i=e("./imagecontainer");var a=e("./dummyimagecontainer");var o=e("./proxyimagecontainer");var s=e("./framecontainer");var l=e("./svgcontainer");var u=e("./svgnodecontainer");var h=e("./lineargradientcontainer");var c=e("./webkitgradientcontainer");var f=e("./utils").bind;function d(e,t){this.link=null;this.options=e;this.support=t;this.origin=this.getOrigin(window.location.href)}d.prototype.findImages=function(e){var t=[];e.reduce(function(e,t){switch(t.node.nodeName){case"IMG":return e.concat([{args:[t.node.src],method:"url"}]);case"svg":case"IFRAME":return e.concat([{args:[t.node],method:t.node.nodeName}])}return e},[]).forEach(this.addImage(t,this.loadImage),this);return t};d.prototype.findBackgroundImage=function(e,t){t.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(e,this.loadImage),this);return e};d.prototype.addImage=function(n,i){return function(t){t.args.forEach(function(e){if(!this.imageExists(n,e)){n.splice(0,0,i.call(this,t));r("Added image #"+n.length,typeof e==="string"?e.substring(0,100):e)}},this)}};d.prototype.hasImageBackground=function(e){return e.method!=="none"};d.prototype.loadImage=function(e){if(e.method==="url"){var t=e.args[0];if(this.isSVG(t)&&!this.support.svg&&!this.options.allowTaint){return new l(t)}else if(t.match(/data:image\/.*;base64,/i)){return new i(t.replace(/url\(['"]{0,}|['"]{0,}\)$/gi,""),false)}else if(this.isSameOrigin(t)||this.options.allowTaint===true||this.isSVG(t)){return new i(t,false)}else if(this.support.cors&&!this.options.allowTaint&&this.options.useCORS){return new i(t,true)}else if(this.options.proxy){return new o(t,this.options.proxy)}else{return new a(t)}}else if(e.method==="linear-gradient"){return new h(e)}else if(e.method==="gradient"){return new c(e)}else if(e.method==="svg"){return new u(e.args[0],this.support.svg)}else if(e.method==="IFRAME"){return new s(e.args[0],this.isSameOrigin(e.args[0].src),this.options)}else{return new a(e)}};d.prototype.isSVG=function(e){return e.substring(e.length-3).toLowerCase()==="svg"||l.prototype.isInline(e)};d.prototype.imageExists=function(e,t){return e.some(function(e){return e.src===t})};d.prototype.isSameOrigin=function(e){return this.getOrigin(e)===this.origin};d.prototype.getOrigin=function(e){var t=this.link||(this.link=document.createElement("a"));t.href=e;t.href=t.href;return t.protocol+t.hostname+t.port};d.prototype.getPromise=function(t){return this.timeout(t,this.options.imageTimeout)["catch"](function(){var e=new a(t.src);return e.promise.then(function(e){t.image=e})})};d.prototype.get=function(t){var n=null;return this.images.some(function(e){return(n=e).src===t})?n:null};d.prototype.fetch=function(e){this.images=e.reduce(f(this.findBackgroundImage,this),this.findImages(e));this.images.forEach(function(t,n){t.promise.then(function(){r("Succesfully loaded image #"+(n+1),t)},function(e){r("Failed loading image #"+(n+1),t,e)})});this.ready=Promise.all(this.images.map(this.getPromise,this));r("Finished searching images");return this};d.prototype.timeout=function(n,i){var a;var e=Promise.race([n.promise,new Promise(function(e,t){a=setTimeout(function(){r("Timed out loading image",n);t(n)},i)})]).then(function(e){clearTimeout(a);return e});e["catch"](function(){clearTimeout(a)});return e};t.exports=d},{"./dummyimagecontainer":5,"./framecontainer":8,"./imagecontainer":10,"./lineargradientcontainer":12,"./log":13,"./proxyimagecontainer":17,"./svgcontainer":23,"./svgnodecontainer":24,"./utils":26,"./webkitgradientcontainer":27}],12:[function(e,t,n){var a=e("./gradientcontainer");var r=e("./color");function i(e){a.apply(this,arguments);this.type=a.TYPES.LINEAR;var t=i.REGEXP_DIRECTION.test(e.args[0])||!a.REGEXP_COLORSTOP.test(e.args[0]);if(t){e.args[0].split(/\s+/).reverse().forEach(function(e,t){switch(e){case"left":this.x0=0;this.x1=1;break;case"top":this.y0=0;this.y1=1;break;case"right":this.x0=1;this.x1=0;break;case"bottom":this.y0=1;this.y1=0;break;case"to":var n=this.y0;var i=this.x0;this.y0=this.y1;this.x0=this.x1;this.x1=i;this.y1=n;break;case"center":break;default:var a=parseFloat(e,10)*.01;if(isNaN(a)){break}if(t===0){this.y0=a;this.y1=1-this.y0}else{this.x0=a;this.x1=1-this.x0}break}},this)}else{this.y0=0;this.y1=1}this.colorStops=e.args.slice(t?1:0).map(function(e){var t=e.match(a.REGEXP_COLORSTOP);var n=+t[2];var i=n===0?"%":t[3];return{color:new r(t[1]),stop:i==="%"?n/100:null}});if(this.colorStops[0].stop===null){this.colorStops[0].stop=0}if(this.colorStops[this.colorStops.length-1].stop===null){this.colorStops[this.colorStops.length-1].stop=1}this.colorStops.forEach(function(n,i){if(n.stop===null){this.colorStops.slice(i).some(function(e,t){if(e.stop!==null){n.stop=(e.stop-this.colorStops[i-1].stop)/(t+1)+this.colorStops[i-1].stop;return true}else{return false}},this)}},this)}i.prototype=Object.create(a.prototype);i.REGEXP_DIRECTION=/^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;t.exports=i},{"./color":3,"./gradientcontainer":9}],13:[function(e,t,n){var i=function e(){if(e.options.logging&&window.console&&window.console.log){Function.prototype.bind.call(window.console.log,window.console).apply(window.console,[Date.now()-e.options.start+"ms","html2canvas:"].concat([].slice.call(arguments,0)))}};i.options={logging:false};t.exports=i},{}],14:[function(e,t,n){var r=e("./color");var i=e("./utils");var a=i.getBounds;var o=i.parseBackgrounds;var s=i.offsetBounds;function l(e,t){this.node=e;this.parent=t;this.stack=null;this.bounds=null;this.borders=null;this.clip=[];this.backgroundClip=[];this.offsetBounds=null;this.visible=null;this.computedStyles=null;this.colors={};this.styles={};this.backgroundImages=null;this.transformData=null;this.transformMatrix=null;this.isPseudoElement=false;this.opacity=null}l.prototype.cloneTo=function(e){e.visible=this.visible;e.borders=this.borders;e.bounds=this.bounds;e.clip=this.clip;e.backgroundClip=this.backgroundClip;e.computedStyles=this.computedStyles;e.styles=this.styles;e.backgroundImages=this.backgroundImages;e.opacity=this.opacity};l.prototype.getOpacity=function(){return this.opacity===null?this.opacity=this.cssFloat("opacity"):this.opacity};l.prototype.assignStack=function(e){this.stack=e;e.children.push(this)};l.prototype.isElementVisible=function(){return this.node.nodeType===Node.TEXT_NODE?this.parent.visible:this.css("display")!=="none"&&this.css("visibility")!=="hidden"&&!this.node.hasAttribute("data-html2canvas-ignore")&&(this.node.nodeName!=="INPUT"||this.node.getAttribute("type")!=="hidden")};l.prototype.css=function(e){if(!this.computedStyles){this.computedStyles=this.isPseudoElement?this.parent.computedStyle(this.before?":before":":after"):this.computedStyle(null)}return this.styles[e]||(this.styles[e]=this.computedStyles[e])};l.prototype.prefixedCss=function(t){var e=["webkit","moz","ms","o"];var n=this.css(t);if(n===undefined){e.some(function(e){n=this.css(e+t.substr(0,1).toUpperCase()+t.substr(1));return n!==undefined},this)}return n===undefined?null:n};l.prototype.computedStyle=function(e){return this.node.ownerDocument.defaultView.getComputedStyle(this.node,e)};l.prototype.cssInt=function(e){var t=parseInt(this.css(e),10);return isNaN(t)?0:t};l.prototype.color=function(e){return this.colors[e]||(this.colors[e]=new r(this.css(e)))};l.prototype.cssFloat=function(e){var t=parseFloat(this.css(e));return isNaN(t)?0:t};l.prototype.fontWeight=function(){var e=this.css("fontWeight");switch(parseInt(e,10)){case 401:e="bold";break;case 400:e="normal";break}return e};l.prototype.parseClip=function(){var e=this.css("clip").match(this.CLIP);if(e){return{top:parseInt(e[1],10),right:parseInt(e[2],10),bottom:parseInt(e[3],10),left:parseInt(e[4],10)}}return null};l.prototype.parseBackgroundImages=function(){return this.backgroundImages||(this.backgroundImages=o(this.css("backgroundImage")))};l.prototype.cssList=function(e,t){var n=(this.css(e)||"").split(",");n=n[t||0]||n[0]||"auto";n=n.trim().split(" ");if(n.length===1){n=[n[0],c(n[0])?"auto":n[0]]}return n};l.prototype.parseBackgroundSize=function(e,t,n){var i=this.cssList("backgroundSize",n);var a,r;if(c(i[0])){a=e.width*parseFloat(i[0])/100}else if(/contain|cover/.test(i[0])){var o=e.width/e.height,s=t.width/t.height;return o0){this.renderIndex=0;this.asyncRenderer(this.renderQueue,e)}else{e()}},this))},this))}a.prototype.calculateOverflowClips=function(){this.nodes.forEach(function(e){if(H(e)){if(V(e)){e.appendToDOM()}e.borders=this.parseBorders(e);var t=e.css("overflow")==="hidden"?[e.borders.clip]:[];var n=e.parseClip();if(n&&["absolute","fixed"].indexOf(e.css("position"))!==-1){t.push([["rect",e.bounds.left+n.left,e.bounds.top+n.top,n.right-n.left,n.bottom-n.top]])}e.clip=r(e)?e.parent.clip.concat(t):t;e.backgroundClip=e.css("overflow")!=="hidden"?e.clip.concat([e.borders.clip]):e.clip;if(V(e)){e.cleanDOM()}}else if(G(e)){e.clip=r(e)?e.parent.clip:[]}if(!V(e)){e.bounds=null}},this)};function r(e){return e.parent&&e.parent.clip.length}a.prototype.asyncRenderer=function(e,t,n){n=n||Date.now();this.paint(e[this.renderIndex++]);if(e.length===this.renderIndex){t()}else if(n+20>Date.now()){this.asyncRenderer(e,t,n)}else{setTimeout(p(function(){this.asyncRenderer(e,t)},this),0)}};a.prototype.createPseudoHideStyles=function(e){this.createStyles(e,"."+c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+':before { content: "" !important; display: none !important; }'+"."+c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER+':after { content: "" !important; display: none !important; }')};a.prototype.disableAnimations=function(e){this.createStyles(e,"* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; "+"-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}")};a.prototype.createStyles=function(e,t){var n=e.createElement("style");n.innerHTML=t;e.body.appendChild(n)};a.prototype.getPseudoElements=function(e){var t=[[e]];if(e.node.nodeType===Node.ELEMENT_NODE){var n=this.getPseudoElement(e,":before");var i=this.getPseudoElement(e,":after");if(n){t.push(n)}if(i){t.push(i)}}return X(t)};function y(e){return e.replace(/(\-[a-z])/g,function(e){return e.toUpperCase().replace("-","")})}a.prototype.getPseudoElement=function(e,t){var n=e.computedStyle(t);if(!n||!n.content||n.content==="none"||n.content==="-moz-alt-content"||n.display==="none"){return null}var i=$(n.content);var a=i.substr(0,3)==="url";var r=document.createElement(a?"img":"html2canvaspseudoelement");var o=new c(r,e,t);for(var s=n.length-1;s>=0;s--){var l=y(n.item(s));r.style[l]=n[l]}r.className=c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+" "+c.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;if(a){r.src=v(i)[0].args[0];return[o]}else{var u=document.createTextNode(i);r.appendChild(u);return[o,new h(u,o)]}};a.prototype.getChildren=function(n){return X([].filter.call(n.node.childNodes,O).map(function(e){var t=[e.nodeType===Node.TEXT_NODE?new h(e,n):new u(e,n)].filter(Y);return e.nodeType===Node.ELEMENT_NODE&&t.length&&e.tagName!=="TEXTAREA"?t[0].isElementVisible()?t.concat(this.getChildren(t[0])):[]:t},this))};a.prototype.newStackingContext=function(e,t){var n=new g(t,e.getOpacity(),e.node,e.parent);e.cloneTo(n);var i=t?n.getParentStack(this):n.parent.stack;i.contexts.push(n);e.stack=n};a.prototype.createStackingContexts=function(){this.nodes.forEach(function(e){if(H(e)&&(this.isRootElement(e)||W(e)||z(e)||this.isBodyWithTransparentRoot(e)||e.hasTransform())){this.newStackingContext(e,true)}else if(H(e)&&(F(e)&&M(e)||I(e)||L(e))){this.newStackingContext(e,false)}else{e.assignStack(e.parent.stack)}},this)};a.prototype.isBodyWithTransparentRoot=function(e){return e.node.nodeName==="BODY"&&e.parent.color("backgroundColor").isTransparent()};a.prototype.isRootElement=function(e){return e.parent===null};a.prototype.sortStackingContexts=function(e){e.contexts.sort(U(e.contexts.slice(0)));e.contexts.forEach(this.sortStackingContexts,this)};a.prototype.parseTextBounds=function(o){return function(e,t,n){if(o.parent.css("textDecoration").substr(0,4)!=="none"||e.trim().length!==0){if(this.support.rangeBounds&&!o.parent.hasTransform()){var i=n.slice(0,t).join("").length;return this.getRangeBounds(o.node,i,e.length)}else if(o.node&&typeof o.node.data==="string"){var a=o.node.splitText(e.length);var r=this.getWrapperBounds(o.node,o.parent.hasTransform());o.node=a;return r}}else if(!this.support.rangeBounds||o.parent.hasTransform()){o.node=o.node.splitText(e.length)}return{}}};a.prototype.getWrapperBounds=function(e,t){var n=e.ownerDocument.createElement("html2canvaswrapper");var i=e.parentNode,a=e.cloneNode(true);n.appendChild(e.cloneNode(true));i.replaceChild(n,e);var r=t?m(n):o(n);i.replaceChild(a,n);return r};a.prototype.getRangeBounds=function(e,t,n){var i=this.range||(this.range=e.ownerDocument.createRange());i.setStart(e,t);i.setEnd(e,t+n);return i.getBoundingClientRect()};function _(){}a.prototype.parse=function(e){var t=e.contexts.filter(A);var n=e.children.filter(H);var i=n.filter(j(L));var a=i.filter(j(F)).filter(j(T));var r=n.filter(j(F)).filter(L);var o=i.filter(j(F)).filter(T);var s=e.contexts.concat(i.filter(F)).filter(M);var l=e.children.filter(G).filter(N);var u=e.contexts.filter(R);t.concat(a).concat(r).concat(o).concat(s).concat(l).concat(u).forEach(function(e){this.renderQueue.push(e);if(B(e)){this.parse(e);this.renderQueue.push(new _)}},this)};a.prototype.paint=function(e){try{if(e instanceof _){this.renderer.ctx.restore()}else if(G(e)){if(V(e.parent)){e.parent.appendToDOM()}this.paintText(e);if(V(e.parent)){e.parent.cleanDOM()}}else{this.paintNode(e)}}catch(e){s(e);if(this.options.strict){throw e}}};a.prototype.paintNode=function(e){if(B(e)){this.renderer.setOpacity(e.opacity);this.renderer.ctx.save();if(e.hasTransform()){this.renderer.setTransform(e.parseTransform())}}if(e.node.nodeName==="INPUT"&&e.node.type==="checkbox"){this.paintCheckbox(e)}else if(e.node.nodeName==="INPUT"&&e.node.type==="radio"){this.paintRadio(e)}else{this.paintElement(e)}};a.prototype.paintElement=function(n){var i=n.parseBounds();this.renderer.clip(n.backgroundClip,function(){this.renderer.renderBackground(n,i,n.borders.borders.map(q))},this);this.renderer.clip(n.clip,function(){this.renderer.renderBorders(n.borders.borders)},this);this.renderer.clip(n.backgroundClip,function(){switch(n.node.nodeName){case"svg":case"IFRAME":var e=this.images.get(n.node);if(e){this.renderer.renderImage(n,i,n.borders,e)}else{s("Error loading <"+n.node.nodeName+">",n.node)}break;case"IMG":var t=this.images.get(n.node.src);if(t){this.renderer.renderImage(n,i,n.borders,t)}else{s("Error loading ",n.node.src)}break;case"CANVAS":this.renderer.renderImage(n,i,n.borders,{image:n.node});break;case"SELECT":case"INPUT":case"TEXTAREA":this.paintFormValue(n);break}},this)};a.prototype.paintCheckbox=function(e){var t=e.parseBounds();var n=Math.min(t.width,t.height);var i={width:n-1,height:n-1,top:t.top,left:t.left};var a=[3,3];var r=[a,a,a,a];var o=[1,1,1,1].map(function(e){return{color:new d("#A5A5A5"),width:e}});var s=k(i,r,o);this.renderer.clip(e.backgroundClip,function(){this.renderer.rectangle(i.left+1,i.top+1,i.width-2,i.height-2,new d("#DEDEDE"));this.renderer.renderBorders(w(o,i,s,r));if(e.node.checked){this.renderer.font(new d("#424242"),"normal","normal","bold",n-3+"px","arial");this.renderer.text("✔",i.left+n/6,i.top+n-1)}},this)};a.prototype.paintRadio=function(e){var t=e.parseBounds();var n=Math.min(t.width,t.height)-2;this.renderer.clip(e.backgroundClip,function(){this.renderer.circleStroke(t.left+1,t.top+1,n,new d("#DEDEDE"),1,new d("#A5A5A5"));if(e.node.checked){this.renderer.circle(Math.ceil(t.left+n/4)+1,Math.ceil(t.top+n/4)+1,Math.floor(n/2),new d("#424242"))}},this)};a.prototype.paintFormValue=function(t){var e=t.getValue();if(e.length>0){var n=t.node.ownerDocument;var i=n.createElement("html2canvaswrapper");var a=["lineHeight","textAlign","fontFamily","fontWeight","fontSize","color","paddingLeft","paddingTop","paddingRight","paddingBottom","width","height","borderLeftStyle","borderTopStyle","borderLeftWidth","borderTopWidth","boxSizing","whiteSpace","wordWrap"];a.forEach(function(e){try{i.style[e]=t.css(e)}catch(e){s("html2canvas: Parse: Exception caught in renderFormValue: "+e.message)}});var r=t.parseBounds();i.style.position="fixed";i.style.left=r.left+"px";i.style.top=r.top+"px";i.textContent=e;n.body.appendChild(i);this.paintText(new h(i.firstChild,t));n.body.removeChild(i)}};a.prototype.paintText=function(n){n.applyTextTransform();var e=l.ucs2.decode(n.node.data);var i=(!this.options.letterRendering||P(n))&&!Q(n.node.data)?Z(e):e.map(function(e){return l.ucs2.encode([e])});var t=n.parent.fontWeight();var a=n.parent.css("fontSize");var r=n.parent.css("fontFamily");var o=n.parent.parseTextShadows();this.renderer.font(n.parent.color("color"),n.parent.css("fontStyle"),n.parent.css("fontVariant"),t,a,r);if(o.length){this.renderer.fontShadow(o[0].color,o[0].offsetX,o[0].offsetY,o[0].blur)}else{this.renderer.clearShadow()}this.renderer.clip(n.parent.clip,function(){i.map(this.parseTextBounds(n),this).forEach(function(e,t){if(e){this.renderer.text(i[t],e.left,e.bottom);this.renderTextDecoration(n.parent,e,this.fontMetrics.getMetrics(r,a))}},this)},this)};a.prototype.renderTextDecoration=function(e,t,n){switch(e.css("textDecoration").split(" ")[0]){case"underline":this.renderer.rectangle(t.left,Math.round(t.top+n.baseline+n.lineWidth),t.width,1,e.color("color"));break;case"overline":this.renderer.rectangle(t.left,Math.round(t.top),t.width,1,e.color("color"));break;case"line-through":this.renderer.rectangle(t.left,Math.ceil(t.top+n.middle+n.lineWidth),t.width,1,e.color("color"));break}};var b={inset:[["darken",.6],["darken",.1],["darken",.1],["darken",.6]]};a.prototype.parseBorders=function(r){var e=r.parseBounds();var t=D(r);var n=["Top","Right","Bottom","Left"].map(function(e,t){var n=r.css("border"+e+"Style");var i=r.color("border"+e+"Color");if(n==="inset"&&i.isBlack()){i=new d([255,255,255,i.a])}var a=b[n]?b[n][t]:null;return{width:r.cssInt("border"+e+"Width"),color:a?i[a[0]](a[1]):i,args:null}});var i=k(e,t,n);return{clip:this.parseBackgroundClip(r,i,n,t,e),borders:w(n,e,i,t)}};function w(o,s,l,u){return o.map(function(e,t){if(e.width>0){var n=s.left;var i=s.top;var a=s.width;var r=s.height-o[2].width;switch(t){case 0:r=o[0].width;e.args=C({c1:[n,i],c2:[n+a,i],c3:[n+a-o[1].width,i+r],c4:[n+o[3].width,i+r]},u[0],u[1],l.topLeftOuter,l.topLeftInner,l.topRightOuter,l.topRightInner);break;case 1:n=s.left+s.width-o[1].width;a=o[1].width;e.args=C({c1:[n+a,i],c2:[n+a,i+r+o[2].width],c3:[n,i+r],c4:[n,i+o[0].width]},u[1],u[2],l.topRightOuter,l.topRightInner,l.bottomRightOuter,l.bottomRightInner);break;case 2:i=i+s.height-o[2].width;r=o[2].width;e.args=C({c1:[n+a,i+r],c2:[n,i+r],c3:[n+o[3].width,i],c4:[n+a-o[3].width,i]},u[2],u[3],l.bottomRightOuter,l.bottomRightInner,l.bottomLeftOuter,l.bottomLeftInner);break;case 3:a=o[3].width;e.args=C({c1:[n,i+r+o[2].width],c2:[n,i],c3:[n+a,i+o[0].width],c4:[n+a,i+r]},u[3],u[0],l.bottomLeftOuter,l.bottomLeftInner,l.topLeftOuter,l.topLeftInner);break}}return e})}a.prototype.parseBackgroundClip=function(e,t,n,i,a){var r=e.css("backgroundClip"),o=[];switch(r){case"content-box":case"padding-box":E(o,i[0],i[1],t.topLeftInner,t.topRightInner,a.left+n[3].width,a.top+n[0].width);E(o,i[1],i[2],t.topRightInner,t.bottomRightInner,a.left+a.width-n[1].width,a.top+n[0].width);E(o,i[2],i[3],t.bottomRightInner,t.bottomLeftInner,a.left+a.width-n[1].width,a.top+a.height-n[2].width);E(o,i[3],i[0],t.bottomLeftInner,t.topLeftInner,a.left+n[3].width,a.top+a.height-n[2].width);break;default:E(o,i[0],i[1],t.topLeftOuter,t.topRightOuter,a.left,a.top);E(o,i[1],i[2],t.topRightOuter,t.bottomRightOuter,a.left+a.width,a.top);E(o,i[2],i[3],t.bottomRightOuter,t.bottomLeftOuter,a.left+a.width,a.top+a.height);E(o,i[3],i[0],t.bottomLeftOuter,t.topLeftOuter,a.left,a.top+a.height);break}return o};function x(e,t,n,i){var a=4*((Math.sqrt(2)-1)/3);var r=n*a,o=i*a,s=e+n,l=t+i;return{topLeft:S({x:e,y:l},{x:e,y:l-o},{x:s-r,y:t},{x:s,y:t}),topRight:S({x:e,y:t},{x:e+r,y:t},{x:s,y:l-o},{x:s,y:l}),bottomRight:S({x:s,y:t},{x:s,y:t+o},{x:e+r,y:l},{x:e,y:l}),bottomLeft:S({x:s,y:l},{x:s-r,y:l},{x:e,y:t+o},{x:e,y:t})}}function k(e,t,n){var i=e.left,a=e.top,r=e.width,o=e.height,s=t[0][0]r+n[3].width?0:u-n[3].width,h-n[0].width).topRight.subdivide(.5),bottomRightOuter:x(i+m,a+v,c,f).bottomRight.subdivide(.5),bottomRightInner:x(i+Math.min(m,r-n[3].width),a+Math.min(v,o+n[0].width),Math.max(0,c-n[1].width),f-n[2].width).bottomRight.subdivide(.5),bottomLeftOuter:x(i,a+y,d,g).bottomLeft.subdivide(.5),bottomLeftInner:x(i+n[3].width,a+y,Math.max(0,d-n[3].width),g-n[2].width).bottomLeft.subdivide(.5)}}function S(l,u,h,c){var f=function e(t,n,i){return{x:t.x+(n.x-t.x)*i,y:t.y+(n.y-t.y)*i}};return{start:l,startControl:u,endControl:h,end:c,subdivide:function e(t){var n=f(l,u,t),i=f(u,h,t),a=f(h,c,t),r=f(n,i,t),o=f(i,a,t),s=f(r,o,t);return[S(l,n,r,s),S(s,o,a,c)]},curveTo:function e(t){t.push(["bezierCurve",u.x,u.y,h.x,h.y,c.x,c.y])},curveToReversed:function e(t){t.push(["bezierCurve",h.x,h.y,u.x,u.y,l.x,l.y])}}}function C(e,t,n,i,a,r,o){var s=[];if(t[0]>0||t[1]>0){s.push(["line",i[1].start.x,i[1].start.y]);i[1].curveTo(s)}else{s.push(["line",e.c1[0],e.c1[1]])}if(n[0]>0||n[1]>0){s.push(["line",r[0].start.x,r[0].start.y]);r[0].curveTo(s);s.push(["line",o[0].end.x,o[0].end.y]);o[0].curveToReversed(s)}else{s.push(["line",e.c2[0],e.c2[1]]);s.push(["line",e.c3[0],e.c3[1]])}if(t[0]>0||t[1]>0){s.push(["line",a[1].end.x,a[1].end.y]);a[1].curveToReversed(s)}else{s.push(["line",e.c4[0],e.c4[1]])}return s}function E(e,t,n,i,a,r,o){if(t[0]>0||t[1]>0){e.push(["line",i[0].start.x,i[0].start.y]);i[0].curveTo(e);i[1].curveTo(e)}else{e.push(["line",r,o])}if(n[0]>0||n[1]>0){e.push(["line",a[0].start.x,a[0].start.y])}}function A(e){return e.cssInt("zIndex")<0}function R(e){return e.cssInt("zIndex")>0}function M(e){return e.cssInt("zIndex")===0}function T(e){return["inline","inline-block","inline-table"].indexOf(e.css("display"))!==-1}function B(e){return e instanceof g}function N(e){return e.node.data.trim().length>0}function P(e){return/^(normal|none|0px)$/.test(e.parent.css("letterSpacing"))}function D(i){return["TopLeft","TopRight","BottomRight","BottomLeft"].map(function(e){var t=i.css("border"+e+"Radius");var n=t.split(" ");if(n.length<=1){n[1]=n[0]}return n.map(K)})}function O(e){return e.nodeType===Node.TEXT_NODE||e.nodeType===Node.ELEMENT_NODE}function z(e){var t=e.css("position");var n=["absolute","relative","fixed"].indexOf(t)!==-1?e.css("zIndex"):"auto";return n!=="auto"}function F(e){return e.css("position")!=="static"}function L(e){return e.css("float")!=="none"}function I(e){return["inline-block","inline-table"].indexOf(e.css("display"))!==-1}function j(e){var t=this;return function(){return!e.apply(t,arguments)}}function H(e){return e.node.nodeType===Node.ELEMENT_NODE}function V(e){return e.isPseudoElement===true}function G(e){return e.node.nodeType===Node.TEXT_NODE}function U(n){return function(e,t){return e.cssInt("zIndex")+n.indexOf(e)/n.length-(t.cssInt("zIndex")+n.indexOf(t)/n.length)}}function W(e){return e.getOpacity()<1}function K(e){return parseInt(e,10)}function q(e){return e.width}function Y(e){return e.node.nodeType!==Node.ELEMENT_NODE||["SCRIPT","HEAD","TITLE","OBJECT","BR","OPTION"].indexOf(e.node.nodeName)===-1}function X(e){return[].concat.apply([],e)}function $(e){var t=e.substr(0,1);return t===e.substr(e.length-1)&&t.match(/'|"/)?e.substr(1,e.length-2):e}function Z(e){var t=[],n=0,i=false,a;while(e.length){if(J(e[n])===i){a=e.splice(0,n);if(a.length){t.push(l.ucs2.encode(a))}i=!i;n=0}else{n++}if(n>=e.length){a=e.splice(0,n);if(a.length){t.push(l.ucs2.encode(a))}}}return t}function J(e){return[32,13,10,9,45].indexOf(e)!==-1}function Q(e){return/[^\u0000-\u00ff]/.test(e)}t.exports=a},{"./color":3,"./fontmetrics":7,"./log":13,"./nodecontainer":14,"./pseudoelementcontainer":18,"./stackingcontext":21,"./textcontainer":25,"./utils":26,punycode:1}],16:[function(e,t,n){var o=e("./xhr");var i=e("./utils");var s=e("./log");var l=e("./clone");var u=i.decode64;function h(e,t,n){var i="withCredentials"in new XMLHttpRequest;if(!t){return Promise.reject("No proxy configured")}var a=f(i);var r=d(t,e,a);return i?o(r):c(n,r,a).then(function(e){return u(e.content)})}var a=0;function r(e,t,n){var i="crossOrigin"in new Image;var a=f(i);var r=d(t,e,a);return i?Promise.resolve(r):c(n,r,a).then(function(e){return"data:"+e.type+";base64,"+e.content})}function c(r,e,o){return new Promise(function(t,n){var i=r.createElement("script");var a=function e(){delete window.html2canvas.proxy[o];r.body.removeChild(i)};window.html2canvas.proxy[o]=function(e){a();t(e)};i.src=e;i.onerror=function(e){a();n(e)};r.body.appendChild(i)})}function f(e){return!e?"html2canvas_"+Date.now()+"_"+ ++a+"_"+Math.round(Math.random()*1e5):""}function d(e,t,n){return e+"?url="+encodeURIComponent(t)+(n.length?"&callback=html2canvas.proxy."+n:"")}function g(r){return function(t){var e=new DOMParser,n;try{n=e.parseFromString(t,"text/html")}catch(e){s("DOMParser not supported, falling back to createHTMLDocument");n=document.implementation.createHTMLDocument("");try{n.open();n.write(t);n.close()}catch(e){s("createHTMLDocument write not supported, falling back to document.body.innerHTML");n.body.innerHTML=t}}var i=n.querySelector("base");if(!i||!i.href.host){var a=n.createElement("base");a.href=r;n.head.insertBefore(a,n.head.firstChild)}return n}}function p(e,t,n,i,a,r){return new h(e,t,window.document).then(g(e)).then(function(e){return l(e,n,i,a,r,0,0)})}n.Proxy=h;n.ProxyURL=r;n.loadUrlDocument=p},{"./clone":2,"./log":13,"./utils":26,"./xhr":28}],17:[function(e,t,n){var r=e("./proxy").ProxyURL;function i(n,i){var e=document.createElement("a");e.href=n;n=e.href;this.src=n;this.image=new Image;var a=this;this.promise=new Promise(function(e,t){a.image.crossOrigin="Anonymous";a.image.onload=e;a.image.onerror=t;new r(n,i,document).then(function(e){a.image.src=e})["catch"](t)})}t.exports=i},{"./proxy":16}],18:[function(e,t,n){var i=e("./nodecontainer");function a(e,t,n){i.call(this,e,t);this.isPseudoElement=true;this.before=n===":before"}a.prototype.cloneTo=function(e){a.prototype.cloneTo.call(this,e);e.isPseudoElement=true;e.before=this.before};a.prototype=Object.create(i.prototype);a.prototype.appendToDOM=function(){if(this.before){this.parent.node.insertBefore(this.node,this.parent.node.firstChild)}else{this.parent.node.appendChild(this.node)}this.parent.node.className+=" "+this.getHideClass()};a.prototype.cleanDOM=function(){this.node.parentNode.removeChild(this.node);this.parent.node.className=this.parent.node.className.replace(this.getHideClass(),"")};a.prototype.getHideClass=function(){return this["PSEUDO_HIDE_ELEMENT_CLASS_"+(this.before?"BEFORE":"AFTER")]};a.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE="___html2canvas___pseudoelement_before";a.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER="___html2canvas___pseudoelement_after";t.exports=a},{"./nodecontainer":14}],19:[function(e,t,n){var l=e("./log");function i(e,t,n,i,a){this.width=e;this.height=t;this.images=n;this.options=i;this.document=a}i.prototype.renderImage=function(e,t,n,i){var a=e.cssInt("paddingLeft"),r=e.cssInt("paddingTop"),o=e.cssInt("paddingRight"),s=e.cssInt("paddingBottom"),l=n.borders;var u=t.width-(l[1].width+l[3].width+a+o);var h=t.height-(l[0].width+l[2].width+r+s);this.drawImage(i,0,0,i.image.width||u,i.image.height||h,t.left+a+l[3].width,t.top+r+l[0].width,u,h)};i.prototype.renderBackground=function(e,t,n){if(t.height>0&&t.width>0){this.renderBackgroundColor(e,t);this.renderBackgroundImage(e,t,n)}};i.prototype.renderBackgroundColor=function(e,t){var n=e.color("backgroundColor");if(!n.isTransparent()){this.rectangle(t.left,t.top,t.width,t.height,n)}};i.prototype.renderBorders=function(e){e.forEach(this.renderBorder,this)};i.prototype.renderBorder=function(e){if(!e.color.isTransparent()&&e.args!==null){this.drawShape(e.args,e.color)}};i.prototype.renderBackgroundImage=function(r,o,s){var e=r.parseBackgroundImages();e.reverse().forEach(function(e,t,n){switch(e.method){case"url":var i=this.images.get(e.args[0]);if(i){this.renderBackgroundRepeating(r,o,i,n.length-(t+1),s)}else{l("Error loading background-image",e.args[0])}break;case"linear-gradient":case"gradient":var a=this.images.get(e.value);if(a){this.renderBackgroundGradient(a,o,s)}else{l("Error loading background-image",e.args[0])}break;case"none":break;default:l("Unknown background-image type",e.args[0])}},this)};i.prototype.renderBackgroundRepeating=function(e,t,n,i,a){var r=e.parseBackgroundSize(t,n.image,i);var o=e.parseBackgroundPosition(t,n.image,i,r);var s=e.parseBackgroundRepeat(i);switch(s){case"repeat-x":case"repeat no-repeat":this.backgroundRepeatShape(n,o,r,t,t.left+a[3],t.top+o.top+a[0],99999,r.height,a);break;case"repeat-y":case"no-repeat repeat":this.backgroundRepeatShape(n,o,r,t,t.left+o.left+a[3],t.top+a[0],r.width,99999,a);break;case"no-repeat":this.backgroundRepeatShape(n,o,r,t,t.left+o.left+a[3],t.top+o.top+a[0],r.width,r.height,a);break;default:this.renderBackgroundRepeat(n,o,r,{top:t.top,left:t.left},a[3],a[0]);break}};t.exports=i},{"./log":13}],20:[function(e,t,n){var i=e("../renderer");var a=e("../lineargradientcontainer");var r=e("../log");function o(e,t){i.apply(this,arguments);this.canvas=this.options.canvas||this.document.createElement("canvas");if(!this.options.canvas){this.canvas.width=e;this.canvas.height=t}this.ctx=this.canvas.getContext("2d");this.taintCtx=this.document.createElement("canvas").getContext("2d");this.ctx.textBaseline="bottom";this.variables={};r("Initialized CanvasRenderer with size",e,"x",t)}o.prototype=Object.create(i.prototype);o.prototype.setFillStyle=function(e){this.ctx.fillStyle=_typeof2(e)==="object"&&!!e.isColor?e.toString():e;return this.ctx};o.prototype.rectangle=function(e,t,n,i,a){this.setFillStyle(a).fillRect(e,t,n,i)};o.prototype.circle=function(e,t,n,i){this.setFillStyle(i);this.ctx.beginPath();this.ctx.arc(e+n/2,t+n/2,n/2,0,Math.PI*2,true);this.ctx.closePath();this.ctx.fill()};o.prototype.circleStroke=function(e,t,n,i,a,r){this.circle(e,t,n,i);this.ctx.strokeStyle=r.toString();this.ctx.stroke()};o.prototype.drawShape=function(e,t){this.shape(e);this.setFillStyle(t).fill()};o.prototype.taints=function(t){if(t.tainted===null){this.taintCtx.drawImage(t.image,0,0);try{this.taintCtx.getImageData(0,0,1,1);t.tainted=false}catch(e){this.taintCtx=document.createElement("canvas").getContext("2d");t.tainted=true}}return t.tainted};o.prototype.drawImage=function(e,t,n,i,a,r,o,s,l){if(!this.taints(e)||this.options.allowTaint){this.ctx.drawImage(e.image,t,n,i,a,r,o,s,l)}};o.prototype.clip=function(e,t,n){this.ctx.save();e.filter(s).forEach(function(e){this.shape(e).clip()},this);t.call(n);this.ctx.restore()};o.prototype.shape=function(e){this.ctx.beginPath();e.forEach(function(e,t){if(e[0]==="rect"){this.ctx.rect.apply(this.ctx,e.slice(1))}else{this.ctx[t===0?"moveTo":e[0]+"To"].apply(this.ctx,e.slice(1))}},this);this.ctx.closePath();return this.ctx};o.prototype.font=function(e,t,n,i,a,r){this.setFillStyle(e).font=[t,n,i,a,r].join(" ").split(",")[0]};o.prototype.fontShadow=function(e,t,n,i){this.setVariable("shadowColor",e.toString()).setVariable("shadowOffsetY",t).setVariable("shadowOffsetX",n).setVariable("shadowBlur",i)};o.prototype.clearShadow=function(){this.setVariable("shadowColor","rgba(0,0,0,0)")};o.prototype.setOpacity=function(e){this.ctx.globalAlpha=e};o.prototype.setTransform=function(e){this.ctx.translate(e.origin[0],e.origin[1]);this.ctx.transform.apply(this.ctx,e.matrix);this.ctx.translate(-e.origin[0],-e.origin[1])};o.prototype.setVariable=function(e,t){if(this.variables[e]!==t){this.variables[e]=this.ctx[e]=t}return this};o.prototype.text=function(e,t,n){this.ctx.fillText(e,t,n)};o.prototype.backgroundRepeatShape=function(e,t,n,i,a,r,o,s,l){var u=[["line",Math.round(a),Math.round(r)],["line",Math.round(a+o),Math.round(r)],["line",Math.round(a+o),Math.round(s+r)],["line",Math.round(a),Math.round(s+r)]];this.clip([u],function(){this.renderBackgroundRepeat(e,t,n,i,l[3],l[0])},this)};o.prototype.renderBackgroundRepeat=function(e,t,n,i,a,r){var o=Math.round(i.left+t.left+a),s=Math.round(i.top+t.top+r);this.setFillStyle(this.ctx.createPattern(this.resizeImage(e,n),"repeat"));this.ctx.translate(o,s);this.ctx.fill();this.ctx.translate(-o,-s)};o.prototype.renderBackgroundGradient=function(e,t){if(e instanceof a){var n=this.ctx.createLinearGradient(t.left+t.width*e.x0,t.top+t.height*e.y0,t.left+t.width*e.x1,t.top+t.height*e.y1);e.colorStops.forEach(function(e){n.addColorStop(e.stop,e.color.toString())});this.rectangle(t.left,t.top,t.width,t.height,n)}};o.prototype.resizeImage=function(e,t){var n=e.image;if(n.width===t.width&&n.height===t.height){return n}var i,a=document.createElement("canvas");a.width=t.width;a.height=t.height;i=a.getContext("2d");i.drawImage(n,0,0,n.width,n.height,0,0,t.width,t.height);return a};function s(e){return e.length>0}t.exports=o},{"../lineargradientcontainer":12,"../log":13,"../renderer":19}],21:[function(e,t,n){var a=e("./nodecontainer");function i(e,t,n,i){a.call(this,n,i);this.ownStacking=e;this.contexts=[];this.children=[];this.opacity=(this.parent?this.parent.stack.opacity:1)*t}i.prototype=Object.create(a.prototype);i.prototype.getParentStack=function(e){var t=this.parent?this.parent.stack:null;return t?t.ownStacking?t:t.getParentStack(e):e.stack};t.exports=i},{"./nodecontainer":14}],22:[function(e,t,n){function i(e){this.rangeBounds=this.testRangeBounds(e);this.cors=this.testCORS();this.svg=this.testSVG()}i.prototype.testRangeBounds=function(e){var t,n,i,a,r=false;if(e.createRange){t=e.createRange();if(t.getBoundingClientRect){n=e.createElement("boundtest");n.style.height="123px";n.style.display="block";e.body.appendChild(n);t.selectNode(n);i=t.getBoundingClientRect();a=i.height;if(a===123){r=true}e.body.removeChild(n)}}return r};i.prototype.testCORS=function(){return typeof(new Image).crossOrigin!=="undefined"};i.prototype.testSVG=function(){var e=new Image;var t=document.createElement("canvas");var n=t.getContext("2d");e.src="data:image/svg+xml,";try{n.drawImage(e,0,0);t.toDataURL()}catch(e){return false}return true};t.exports=i},{}],23:[function(e,t,n){var i=e("./xhr");var a=e("./utils").decode64;function r(e){this.src=e;this.image=null;var n=this;this.promise=this.hasFabric().then(function(){return n.isInline(e)?Promise.resolve(n.inlineFormatting(e)):i(e)}).then(function(t){return new Promise(function(e){window.html2canvas.svg.fabric.loadSVGFromString(t,n.createCanvas.call(n,e))})})}r.prototype.hasFabric=function(){return!window.html2canvas.svg||!window.html2canvas.svg.fabric?Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")):Promise.resolve()};r.prototype.inlineFormatting=function(e){return/^data:image\/svg\+xml;base64,/.test(e)?this.decode64(this.removeContentType(e)):this.removeContentType(e)};r.prototype.removeContentType=function(e){return e.replace(/^data:image\/svg\+xml(;base64)?,/,"")};r.prototype.isInline=function(e){return/^data:image\/svg\+xml/i.test(e)};r.prototype.createCanvas=function(i){var a=this;return function(e,t){var n=new window.html2canvas.svg.fabric.StaticCanvas("c");a.image=n.lowerCanvasEl;n.setWidth(t.width).setHeight(t.height).add(window.html2canvas.svg.fabric.util.groupSVGElements(e,t)).renderAll();i(n.lowerCanvasEl)}};r.prototype.decode64=function(e){return typeof window.atob==="function"?window.atob(e):a(e)};t.exports=r},{"./utils":26,"./xhr":28}],24:[function(e,t,n){var i=e("./svgcontainer");function a(n,e){this.src=n;this.image=null;var i=this;this.promise=e?new Promise(function(e,t){i.image=new Image;i.image.onload=e;i.image.onerror=t;i.image.src="data:image/svg+xml,"+(new XMLSerializer).serializeToString(n);if(i.image.complete===true){e(i.image)}}):this.hasFabric().then(function(){return new Promise(function(e){window.html2canvas.svg.fabric.parseSVGDocument(n,i.createCanvas.call(i,e))})})}a.prototype=Object.create(i.prototype);t.exports=a},{"./svgcontainer":23}],25:[function(e,t,n){var i=e("./nodecontainer");function a(e,t){i.call(this,e,t)}a.prototype=Object.create(i.prototype);a.prototype.applyTextTransform=function(){this.node.data=this.transform(this.parent.css("textTransform"))};a.prototype.transform=function(e){var t=this.node.data;switch(e){case"lowercase":return t.toLowerCase();case"capitalize":return t.replace(/(^|\s|:|-|\(|\))([a-z])/g,r);case"uppercase":return t.toUpperCase();default:return t}};function r(e,t,n){if(e.length>0){return t+n.toUpperCase()}}t.exports=a},{"./nodecontainer":14}],26:[function(e,t,n){n.smallImage=function e(){return"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"};n.bind=function(e,t){return function(){return e.apply(t,arguments)}};n.decode64=function(e){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var n=e.length,i,a,r,o,s,l,u,h;var c="";for(i=0;i>4;u=(r&15)<<4|o>>2;h=(o&3)<<6|s;if(o===64){c+=String.fromCharCode(l)}else if(s===64||s===-1){c+=String.fromCharCode(l,u)}else{c+=String.fromCharCode(l,u,h)}}return c};n.getBounds=function(e){if(e.getBoundingClientRect){var t=e.getBoundingClientRect();var n=e.offsetWidth==null?t.width:e.offsetWidth;return{top:t.top,bottom:t.bottom||t.top+t.height,right:t.left+n,left:t.left,width:n,height:e.offsetHeight==null?t.height:e.offsetHeight}}return{}};n.offsetBounds=function(e){var t=e.offsetParent?n.offsetBounds(e.offsetParent):{top:0,left:0};return{top:e.offsetTop+t.top,bottom:e.offsetTop+e.offsetHeight+t.top,right:e.offsetLeft+t.left+e.offsetWidth,left:e.offsetLeft+t.left,width:e.offsetWidth,height:e.offsetHeight}};n.parseBackgrounds=function(e){var t=" \r\n\t",n,i,a,r,o,s=[],l=0,u=0,h,c;var f=function e(){if(n){if(i.substr(0,1)==='"'){i=i.substr(1,i.length-2)}if(i){c.push(i)}if(n.substr(0,1)==="-"&&(r=n.indexOf("-",1)+1)>0){a=n.substr(0,r);n=n.substr(r)}s.push({prefix:a,method:n.toLowerCase(),value:o,args:c,image:null})}c=[];n=a=i=o=""};c=[];n=a=i=o="";e.split("").forEach(function(e){if(l===0&&t.indexOf(e)>-1){return}switch(e){case'"':if(!h){h=e}else if(h===e){h=null}break;case"(":if(h){break}else if(l===0){l=1;o+=e;return}else{u++}break;case")":if(h){break}else if(l===1){if(u===0){l=0;o+=e;f();return}else{u--}}break;case",":if(h){break}else if(l===0){f();return}else if(l===1){if(u===0&&!n.match(/^url$/i)){c.push(i);i="";o+=e;return}}break}o+=e;if(l===0){n+=e}else{i+=e}});f();return s}},{}],27:[function(e,t,n){var i=e("./gradientcontainer");function a(e){i.apply(this,arguments);this.type=e.args[0]==="linear"?i.TYPES.LINEAR:i.TYPES.RADIAL}a.prototype=Object.create(i.prototype);t.exports=a},{"./gradientcontainer":9}],28:[function(e,t,n){function i(i){return new Promise(function(e,t){var n=new XMLHttpRequest;n.open("GET",i);n.onload=function(){if(n.status===200){e(n.responseText)}else{t(new Error(n.statusText))}};n.onerror=function(){t(new Error("Network Error"))};n.send()})}t.exports=i},{}]},{},[4])(4)})});var Mz=function e(t){this.ok=false;this.alpha=1;if(t.charAt(0)=="#"){t=t.substr(1,6)}t=t.replace(/ /g,"");t=t.toLowerCase();var h={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};t=h[t]||t;var c=[{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,example:["rgba(123, 234, 45, 0.8)","rgba(255,234,245,1.0)"],process:function e(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3]),parseFloat(t[4])]}},{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function e(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function e(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function e(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}];for(var n=0;n3){this.alpha=o[3]}this.ok=true}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"};this.toHex=function(){var e=this.r.toString(16);var t=this.g.toString(16);var n=this.b.toString(16);if(e.length==1)e="0"+e;if(t.length==1)t="0"+t;if(n.length==1)n="0"+n;return"#"+e+t+n};this.getHelpXML=function(){var e=new Array;for(var t=0;t "+s.toRGB()+" -> "+s.toHex());o.appendChild(l);o.appendChild(u);r.appendChild(o)}catch(e){}}return r}};var Tz=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];var Bz=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function Nz(e,t,n,i){if(isNaN(i)||i<1)return;i|=0;var a,r,o,s,l,u,h,c,f,d,g,p,v,m,y,_,b,w,x,k,S,C,E,A;var R=i+i+1;var M=t-1;var T=n-1;var B=i+1;var N=B*(B+1)/2;var P=new Pz;var D=P;for(o=1;o>I;if(E!=0){E=255/E;e[u]=(c*L>>I)*E;e[u+1]=(f*L>>I)*E;e[u+2]=(d*L>>I)*E}else{e[u]=e[u+1]=e[u+2]=0}c-=p;f-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=h+((s=a+i+1)>I;if(E>0){E=255/E;e[s]=(c*L>>I)*E;e[s+1]=(f*L>>I)*E;e[s+2]=(d*L>>I)*E}else{e[s]=e[s+1]=e[s+2]=0}c-=p;f-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=a+((s=r+B)65535){e-=65536;var t=55296+(e>>10),n=56320+(e&1023);return String.fromCharCode(t,n)}else{return String.fromCharCode(e)}}function s(e){var t=e.slice(1,-1);if(t in i){return i[t]}else if(t.charAt(0)==="#"){return o(parseInt(t.substr(1).replace("x","0x")))}else{r.error("entity not found:"+e);return e}}function t(e){if(e>p){var t=n.substring(p,e).replace(/&#?\w+;/g,s);f&&l(p);a.characters(t,0,e-p);p=e}}function l(e,t){while(e>=h&&(t=c.exec(n))){u=t.index;h=u+t[0].length;f.lineNumber++}f.columnNumber=e-u+1}var u=0;var h=0;var c=/.*(?:\r\n?|\n)|.*$/g;var f=a.locator;var d=[{currentNSMap:e}];var g={};var p=0;while(true){try{var v=n.indexOf("<",p);if(v<0){if(!n.substr(p).match(/^\s*$/)){var m=a.doc;var y=m.createTextNode(n.substr(p));m.appendChild(y);a.currentElement=y}return}if(v>p){t(v)}switch(n.charAt(v+1)){case"/":var _=n.indexOf(">",v+3);var b=n.substring(v+2,_);var w=d.pop();if(_<0){b=n.substring(v+2).replace(/[\s<].*/,"");r.error("end tag name: "+b+" is not complete:"+w.tagName);_=v+1+b.length}else if(b.match(/\sp){p=_}else{t(Math.max(v,p)+1)}}}function Yz(e,t){t.lineNumber=e.lineNumber;t.columnNumber=e.columnNumber;return t}function Xz(e,t,n,i,a,r){var o;var s;var l=++t;var u=Lz;while(true){var h=e.charAt(l);switch(h){case"=":if(u===Iz){o=e.slice(t,l);u=Hz}else if(u===jz){u=Hz}else{throw new Error("attribute equal must after attrName")}break;case"'":case'"':if(u===Hz||u===Iz){if(u===Iz){r.warning('attribute value must after "="');o=e.slice(t,l)}t=l+1;l=e.indexOf(h,t);if(l>0){s=e.slice(t,l).replace(/&#?\w+;/g,a);n.add(o,s,t-1);u=Gz}else{throw new Error("attribute value no end '"+h+"' match")}}else if(u==Vz){s=e.slice(t,l).replace(/&#?\w+;/g,a);n.add(o,s,t);r.warning('attribute "'+o+'" missed start quot('+h+")!!");t=l+1;u=Gz}else{throw new Error('attribute value must after "="')}break;case"/":switch(u){case Lz:n.setTagName(e.slice(t,l));case Gz:case Uz:case Wz:u=Wz;n.closed=true;case Vz:case Iz:case jz:break;default:throw new Error("attribute invalid close char('/')")}break;case"":r.error("unexpected end of input");if(u==Lz){n.setTagName(e.slice(t,l))}return l;case">":switch(u){case Lz:n.setTagName(e.slice(t,l));case Gz:case Uz:case Wz:break;case Vz:case Iz:s=e.slice(t,l);if(s.slice(-1)==="/"){n.closed=true;s=s.slice(0,-1)}case jz:if(u===jz){s=o}if(u==Vz){r.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s.replace(/&#?\w+;/g,a),t)}else{if(i[""]!=="http://www.w3.org/1999/xhtml"||!s.match(/^(?:disabled|checked|selected)$/i)){r.warning('attribute "'+s+'" missed value!! "'+s+'" instead!!')}n.add(s,s,t)}break;case Hz:throw new Error("attribute value missed!!")}return l;case"€":h=" ";default:if(h<=" "){switch(u){case Lz:n.setTagName(e.slice(t,l));u=Uz;break;case Iz:o=e.slice(t,l);u=jz;break;case Vz:var s=e.slice(t,l).replace(/&#?\w+;/g,a);r.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s,t);case Gz:u=Uz;break}}else{switch(u){case jz:var c=n.tagName;if(i[""]!=="http://www.w3.org/1999/xhtml"||!o.match(/^(?:disabled|checked|selected)$/i)){r.warning('attribute "'+o+'" missed value!! "'+o+'" instead2!!')}n.add(o,o,t);t=l;u=Iz;break;case Gz:r.warning('attribute space is required"'+o+'"!!');case Uz:u=Iz;t=l;break;case Hz:u=Vz;t=l;break;case Wz:throw new Error("elements closed character '/' and '>' must be connected to")}}}l++}}function $z(e,t,n){var i=e.tagName;var a=null;var r=e.length;while(r--){var o=e[r];var s=o.qName;var l=o.value;var u=s.indexOf(":");if(u>0){var h=o.prefix=s.slice(0,u);var c=s.slice(u+1);var f=h==="xmlns"&&c}else{c=s;h=null;f=s==="xmlns"&&""}o.localName=c;if(f!==false){if(a==null){a={};Qz(n,n={})}n[f]=a[f]=l;o.uri="http://www.w3.org/2000/xmlns/";t.startPrefixMapping(f,l)}}var r=e.length;while(r--){o=e[r];var h=o.prefix;if(h){if(h==="xml"){o.uri="http://www.w3.org/XML/1998/namespace"}if(h!=="xmlns"){o.uri=n[h||""]}}}var u=i.indexOf(":");if(u>0){h=e.prefix=i.slice(0,u);c=e.localName=i.slice(u+1)}else{h=null;c=e.localName=i}var d=e.uri=n[h||""];t.startElement(d,c,i,e);if(e.closed){t.endElement(d,c,i);if(a){for(h in a){t.endPrefixMapping(h)}}}else{e.currentNSMap=n;e.localNSMap=a;return true}}function Zz(e,t,n,i,a){if(/^(?:script|textarea)$/i.test(n)){var r=e.indexOf("",t);var o=e.substring(t+1,r);if(/[&<]/.test(o)){if(/^script$/i.test(n)){a.characters(o,0,o.length);return r}o=o.replace(/&#?\w+;/g,i);a.characters(o,0,o.length);return r}}return t+1}function Jz(e,t,n,i){var a=i[n];if(a==null){a=e.lastIndexOf("");if(at){n.comment(e,t+4,r-t-4);return r+3}else{i.error("Unclosed comment");return-1}}else{return-1}default:if(e.substr(t+3,6)=="CDATA["){var r=e.indexOf("]]>",t+9);n.startCDATA();n.characters(e,t+9,r-t-9);n.endCDATA();return r+3}var o=aF(e,t);var s=o.length;if(s>1&&/!doctype/i.test(o[0][0])){var l=o[1][0];var u=s>3&&/^public$/i.test(o[2][0])&&o[3][0];var h=s>4&&o[4][0];var c=o[s-1];n.startDTD(l,u&&u.replace(/^(['"])(.*?)\1$/,"$2"),h&&h.replace(/^(['"])(.*?)\1$/,"$2"));n.endDTD();return c.index+c[0].length}}return-1}function tF(e,t,n){var i=e.indexOf("?>",t);if(i){var a=e.substring(t,i).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(a){var r=a[0].length;n.processingInstruction(a[1],a[2]);return i+2}else{return-1}}return-1}function nF(e){}nF.prototype={setTagName:function e(t){if(!Fz.test(t)){throw new Error("invalid tagName:"+t)}this.tagName=t},add:function e(t,n,i){if(!Fz.test(t)){throw new Error("invalid attribute:"+t)}this[this.length++]={qName:t,value:n,offset:i}},length:0,getLocalName:function e(t){return this[t].localName},getLocator:function e(t){return this[t].locator},getQName:function e(t){return this[t].qName},getURI:function e(t){return this[t].uri},getValue:function e(t){return this[t].value}};function iF(e,t){e.__proto__=t;return e}if(!(iF({},iF.prototype)instanceof iF)){iF=function e(t,n){function i(){}i.prototype=n;i=new i;for(n in t){i[n]=t[n]}return i}}function aF(e,t){var n;var i=[];var a=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;a.lastIndex=t;a.exec(e);while(n=a.exec(e)){i.push(n);if(n[1])return i}}var rF=Kz;var oF={XMLReader:rF};function sF(e,t){for(var n in e){t[n]=e[n]}}function lF(e,t){var n=e.prototype;if(Object.create){var i=Object.create(t.prototype);n.__proto__=i}if(!(n instanceof t)){var a=function e(){};a.prototype=t.prototype;a=new a;sF(n,a);e.prototype=n=a}if(n.constructor!=e){if(typeof e!="function"){console.error("unknow Class:"+e)}n.constructor=e}}var uF="http://www.w3.org/1999/xhtml";var hF={};var cF=hF.ELEMENT_NODE=1;var fF=hF.ATTRIBUTE_NODE=2;var dF=hF.TEXT_NODE=3;var gF=hF.CDATA_SECTION_NODE=4;var pF=hF.ENTITY_REFERENCE_NODE=5;var vF=hF.ENTITY_NODE=6;var mF=hF.PROCESSING_INSTRUCTION_NODE=7;var yF=hF.COMMENT_NODE=8;var _F=hF.DOCUMENT_NODE=9;var bF=hF.DOCUMENT_TYPE_NODE=10;var wF=hF.DOCUMENT_FRAGMENT_NODE=11;var xF=hF.NOTATION_NODE=12;var kF={};var SF={};var CF=kF.INDEX_SIZE_ERR=(SF[1]="Index size error",1);var EF=kF.DOMSTRING_SIZE_ERR=(SF[2]="DOMString size error",2);var AF=kF.HIERARCHY_REQUEST_ERR=(SF[3]="Hierarchy request error",3);var RF=kF.WRONG_DOCUMENT_ERR=(SF[4]="Wrong document",4);var MF=kF.INVALID_CHARACTER_ERR=(SF[5]="Invalid character",5);var TF=kF.NO_DATA_ALLOWED_ERR=(SF[6]="No data allowed",6);var BF=kF.NO_MODIFICATION_ALLOWED_ERR=(SF[7]="No modification allowed",7);var NF=kF.NOT_FOUND_ERR=(SF[8]="Not found",8);var PF=kF.NOT_SUPPORTED_ERR=(SF[9]="Not supported",9);var DF=kF.INUSE_ATTRIBUTE_ERR=(SF[10]="Attribute in use",10);var OF=kF.INVALID_STATE_ERR=(SF[11]="Invalid state",11);var zF=kF.SYNTAX_ERR=(SF[12]="Syntax error",12);var FF=kF.INVALID_MODIFICATION_ERR=(SF[13]="Invalid modification",13);var LF=kF.NAMESPACE_ERR=(SF[14]="Invalid namespace",14);var IF=kF.INVALID_ACCESS_ERR=(SF[15]="Invalid access",15);function jF(e,t){if(t instanceof Error){var n=t}else{n=this;Error.call(this,SF[e]);this.message=SF[e];if(Error.captureStackTrace)Error.captureStackTrace(this,jF)}n.code=e;if(t)this.message=this.message+": "+t;return n}jF.prototype=Error.prototype;sF(kF,jF);function HF(){}HF.prototype={length:0,item:function e(t){return this[t]||null},toString:function e(t,n){for(var i=[],a=0;a=0){var a=t.length-1;while(i0},lookupPrefix:function e(t){var n=this;while(n){var i=n._nsMap;if(i){for(var a in i){if(i[a]==t){return a}}}n=n.nodeType==fF?n.ownerDocument:n.parentNode}return null},lookupNamespaceURI:function e(t){var n=this;while(n){var i=n._nsMap;if(i){if(t in i){return i[t]}}n=n.nodeType==fF?n.ownerDocument:n.parentNode}return null},isDefaultNamespace:function e(t){var n=this.lookupPrefix(t);return n==null}};function $F(e){return e=="<"&&"<"||e==">"&&">"||e=="&"&&"&"||e=='"'&&"""||"&#"+e.charCodeAt()+";"}sF(hF,XF);sF(hF,XF.prototype);function ZF(e,t){if(t(e)){return true}if(e=e.firstChild){do{if(ZF(e,t)){return true}}while(e=e.nextSibling)}}function JF(){}function QF(e,t,n){e&&e._inc++;var i=n.namespaceURI;if(i=="http://www.w3.org/2000/xmlns/"){t._nsMap[n.prefix?n.localName:""]=n.value}}function eL(e,t,n,i){e&&e._inc++;var a=n.namespaceURI;if(a=="http://www.w3.org/2000/xmlns/"){delete t._nsMap[n.prefix?n.localName:""]}}function tL(e,t,n){if(e&&e._inc){e._inc++;var i=t.childNodes;if(n){i[i.length++]=n}else{var a=t.firstChild;var r=0;while(a){i[r++]=a;a=a.nextSibling}i.length=r}}}function nL(e,t){var n=t.previousSibling;var i=t.nextSibling;if(n){n.nextSibling=i}else{e.firstChild=i}if(i){i.previousSibling=n}else{e.lastChild=n}tL(e.ownerDocument,e);return t}function iL(e,t,n){var i=t.parentNode;if(i){i.removeChild(t)}if(t.nodeType===wF){var a=t.firstChild;if(a==null){return t}var r=t.lastChild}else{a=r=t}var o=n?n.previousSibling:e.lastChild;a.previousSibling=o;r.nextSibling=n;if(o){o.nextSibling=a}else{e.firstChild=a}if(n==null){e.lastChild=r}else{n.previousSibling=r}do{a.parentNode=e}while(a!==r&&(a=a.nextSibling));tL(e.ownerDocument||e,e);if(t.nodeType==wF){t.firstChild=t.lastChild=null}return t}function aL(e,t){var n=t.parentNode;if(n){var i=e.lastChild;n.removeChild(t);var i=e.lastChild}var i=e.lastChild;t.parentNode=e;t.previousSibling=i;t.nextSibling=null;if(i){i.nextSibling=t}else{e.firstChild=t}e.lastChild=t;tL(e.ownerDocument,e,t);return t}JF.prototype={nodeName:"#document",nodeType:_F,doctype:null,documentElement:null,_inc:1,insertBefore:function e(t,n){if(t.nodeType==wF){var i=t.firstChild;while(i){var a=i.nextSibling;this.insertBefore(i,n);i=a}return t}if(this.documentElement==null&&t.nodeType==cF){this.documentElement=t}return iL(this,t,n),t.ownerDocument=this,t},removeChild:function e(t){if(this.documentElement==t){this.documentElement=null}return nL(this,t)},importNode:function e(t,n){return wL(this,t,n)},getElementById:function e(t){var n=null;ZF(this.documentElement,function(e){if(e.nodeType==cF){if(e.getAttribute("id")==t){n=e;return true}}});return n},createElement:function e(t){var n=new rL;n.ownerDocument=this;n.nodeName=t;n.tagName=t;n.childNodes=new HF;var i=n.attributes=new UF;i._ownerElement=n;return n},createDocumentFragment:function e(){var t=new pL;t.ownerDocument=this;t.childNodes=new HF;return t},createTextNode:function e(t){var n=new lL;n.ownerDocument=this;n.appendData(t);return n},createComment:function e(t){var n=new uL;n.ownerDocument=this;n.appendData(t);return n},createCDATASection:function e(t){var n=new hL;n.ownerDocument=this;n.appendData(t);return n},createProcessingInstruction:function e(t,n){var i=new vL;i.ownerDocument=this;i.tagName=i.target=t;i.nodeValue=i.data=n;return i},createAttribute:function e(t){var n=new oL;n.ownerDocument=this;n.name=t;n.nodeName=t;n.localName=t;n.specified=true;return n},createEntityReference:function e(t){var n=new gL;n.ownerDocument=this;n.nodeName=t;return n},createElementNS:function e(t,n){var i=new rL;var a=n.split(":");var r=i.attributes=new UF;i.childNodes=new HF;i.ownerDocument=this;i.nodeName=n;i.tagName=n;i.namespaceURI=t;if(a.length==2){i.prefix=a[0];i.localName=a[1]}else{i.localName=n}r._ownerElement=i;return i},createAttributeNS:function e(t,n){var i=new oL;var a=n.split(":");i.ownerDocument=this;i.nodeName=n;i.name=n;i.namespaceURI=t;i.specified=true;if(a.length==2){i.prefix=a[0];i.localName=a[1]}else{i.localName=n}return i}};lF(JF,XF);function rL(){this._nsMap={}}rL.prototype={nodeType:cF,hasAttribute:function e(t){return this.getAttributeNode(t)!=null},getAttribute:function e(t){var n=this.getAttributeNode(t);return n&&n.value||""},getAttributeNode:function e(t){return this.attributes.getNamedItem(t)},setAttribute:function e(t,n){var i=this.ownerDocument.createAttribute(t);i.value=i.nodeValue=""+n;this.setAttributeNode(i)},removeAttribute:function e(t){var n=this.getAttributeNode(t);n&&this.removeAttributeNode(n)},appendChild:function e(t){if(t.nodeType===wF){return this.insertBefore(t,null)}else{return aL(this,t)}},setAttributeNode:function e(t){return this.attributes.setNamedItem(t)},setAttributeNodeNS:function e(t){return this.attributes.setNamedItemNS(t)},removeAttributeNode:function e(t){return this.attributes.removeNamedItem(t.nodeName)},removeAttributeNS:function e(t,n){var i=this.getAttributeNodeNS(t,n);i&&this.removeAttributeNode(i)},hasAttributeNS:function e(t,n){return this.getAttributeNodeNS(t,n)!=null},getAttributeNS:function e(t,n){var i=this.getAttributeNodeNS(t,n);return i&&i.value||""},setAttributeNS:function e(t,n,i){var a=this.ownerDocument.createAttributeNS(t,n);a.value=a.nodeValue=""+i;this.setAttributeNode(a)},getAttributeNodeNS:function e(t,n){return this.attributes.getNamedItemNS(t,n)},getElementsByTagName:function e(i){return new VF(this,function(t){var n=[];ZF(t,function(e){if(e!==t&&e.nodeType==cF&&(i==="*"||e.tagName==i)){n.push(e)}});return n})},getElementsByTagNameNS:function e(i,a){return new VF(this,function(t){var n=[];ZF(t,function(e){if(e!==t&&e.nodeType===cF&&(i==="*"||e.namespaceURI===i)&&(a==="*"||e.localName==a)){n.push(e)}});return n})}};JF.prototype.getElementsByTagName=rL.prototype.getElementsByTagName;JF.prototype.getElementsByTagNameNS=rL.prototype.getElementsByTagNameNS;lF(rL,XF);function oL(){}oL.prototype.nodeType=fF;lF(oL,XF);function sL(){}sL.prototype={data:"",substringData:function e(t,n){return this.data.substring(t,t+n)},appendData:function e(t){t=this.data+t;this.nodeValue=this.data=t;this.length=t.length},insertData:function e(t,n){this.replaceData(t,0,n)},appendChild:function e(t){throw new Error(SF[AF])},deleteData:function e(t,n){this.replaceData(t,n,"")},replaceData:function e(t,n,i){var a=this.data.substring(0,t);var r=this.data.substring(t+n);i=a+i+r;this.nodeValue=this.data=i;this.length=i.length}};lF(sL,XF);function lL(){}lL.prototype={nodeName:"#text",nodeType:dF,splitText:function e(t){var n=this.data;var i=n.substring(t);n=n.substring(0,t);this.data=this.nodeValue=n;this.length=n.length;var a=this.ownerDocument.createTextNode(i);if(this.parentNode){this.parentNode.insertBefore(a,this.nextSibling)}return a}};lF(lL,sL);function uL(){}uL.prototype={nodeName:"#comment",nodeType:yF};lF(uL,sL);function hL(){}hL.prototype={nodeName:"#cdata-section",nodeType:gF};lF(hL,sL);function cL(){}cL.prototype.nodeType=bF;lF(cL,XF);function fL(){}fL.prototype.nodeType=xF;lF(fL,XF);function dL(){}dL.prototype.nodeType=vF;lF(dL,XF);function gL(){}gL.prototype.nodeType=pF;lF(gL,XF);function pL(){}pL.prototype.nodeName="#document-fragment";pL.prototype.nodeType=wF;lF(pL,XF);function vL(){}vL.prototype.nodeType=mF;lF(vL,XF);function mL(){}mL.prototype.serializeToString=function(e,t,n){return yL.call(e,t,n)};XF.prototype.toString=yL;function yL(e,t){var n=[];var i=this.nodeType==9?this.documentElement:this;var a=i.prefix;var r=i.namespaceURI;if(r&&a==null){var a=i.lookupPrefix(r);if(a==null){var o=[{namespace:r,prefix:null}]}}bL(this,n,e,t,o);return n.join("")}function _L(e,t,n){var i=e.prefix||"";var a=e.namespaceURI;if(!i&&!a){return false}if(i==="xml"&&a==="http://www.w3.org/XML/1998/namespace"||a=="http://www.w3.org/2000/xmlns/"){return false}var r=n.length;while(r--){var o=n[r];if(o.prefix==i){return o.namespace!=a}}return true}function bL(e,t,n,i,a){if(i){e=i(e);if(e){if(typeof e=="string"){t.push(e);return}}else{return}}switch(e.nodeType){case cF:if(!a)a=[];var r=a.length;var o=e.attributes;var s=o.length;var l=e.firstChild;var u=e.tagName;n=uF===e.namespaceURI||n;t.push("<",u);for(var h=0;h");if(n&&/^script$/i.test(u)){while(l){if(l.data){t.push(l.data)}else{bL(l,t,n,i,a)}l=l.nextSibling}}else{while(l){bL(l,t,n,i,a);l=l.nextSibling}}t.push("")}else{t.push("/>")}return;case _F:case wF:var l=e.firstChild;while(l){bL(l,t,n,i,a);l=l.nextSibling}return;case fF:return t.push(" ",e.name,'="',e.value.replace(/[<&"]/g,$F),'"');case dF:return t.push(e.data.replace(/[<&]/g,$F));case gF:return t.push("");case yF:return t.push("\x3c!--",e.data,"--\x3e");case bF:var p=e.publicId;var v=e.systemId;t.push("')}else if(v&&v!="."){t.push(' SYSTEM "',v,'">')}else{var m=e.internalSubset;if(m){t.push(" [",m,"]")}t.push(">")}return;case mF:return t.push("");case pF:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function wL(e,t,n){var i;switch(t.nodeType){case cF:i=t.cloneNode(false);i.ownerDocument=e;case wF:break;case fF:n=true;break}if(!i){i=t.cloneNode(false)}i.ownerDocument=e;i.parentNode=null;if(n){var a=t.firstChild;while(a){i.appendChild(wL(e,a,n));a=a.nextSibling}}return i}function xL(e,t,n){var i=new t.constructor;for(var a in t){var r=t[a];if(_typeof2(r)!="object"){if(r!=i[a]){i[a]=r}}}if(t.childNodes){i.childNodes=new HF}i.ownerDocument=e;switch(i.nodeType){case cF:var o=t.attributes;var s=i.attributes=new UF;var l=o.length;s._ownerElement=i;for(var u=0;u",amp:"&",quot:'"',apos:"'"};if(o){a.setDocumentLocator(o)}i.errorHandler=u(r,a,o);i.domBuilder=n.domBuilder||a;if(/\/x?html?$/.test(t)){l.nbsp=" ";l.copy="©";s[""]="http://www.w3.org/1999/xhtml"}s.xml=s.xml||"http://www.w3.org/XML/1998/namespace";if(e){i.parse(e,s,l)}else{i.errorHandler.error("invalid doc source")}return a.doc};function u(i,e,a){if(!i){if(e instanceof h){return e}i=e}var r={};var o=i instanceof Function;a=a||{};function t(t){var n=i[t];if(!n&&o){n=i.length==2?function(e){i(t,e)}:i}r[t]=n&&function(e){n("[xmldom "+t+"]\t"+e+s(a))}||function(){}}t("warning");t("error");t("fatalError");return r}function h(){this.cdata=false}function c(e,t){t.lineNumber=e.lineNumber;t.columnNumber=e.columnNumber}h.prototype={startDocument:function e(){this.doc=(new i).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function e(t,n,i,a){var r=this.doc;var o=r.createElementNS(t,i||n);var s=a.length;f(this,o);this.currentElement=o;this.locator&&c(this.locator,o);for(var l=0;l=t+n||t){return new java.lang.String(e,t,n)+""}return e}}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(e){h.prototype[e]=function(){return null}});function f(e,t){if(!e.currentElement){e.doc.appendChild(t)}else{e.currentElement.appendChild(t)}}var d=oF.XMLReader;var i=t.DOMImplementation=AL.DOMImplementation;t.XMLSerializer=AL.XMLSerializer;t.DOMParser=n});function ML(e,t,n){if(e==null&&t==null&&n==null){var i=document.querySelectorAll("svg");for(var a=0;a~\.\[:]+)/g;var n=/(\.[^\s\+>~\.\[:]+)/g;var i=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi;var o=/(:[\w-]+\([^\)]*\))/gi;var s=/(:[^\s\+>~\.\[:]+)/g;var l=/([^\s\+>~\.\[:]+)/g;var u=function e(t,n){var i=a.match(t);if(i==null){return}r[n]+=i.length;a=a.replace(t," ")};a=a.replace(/:not\(([^\)]*)\)/g," $1 ");a=a.replace(/{[^]*/gm," ");u(e,1);u(t,0);u(n,1);u(i,2);u(o,1);u(s,1);a=a.replace(/[\*\s\+>~]/g," ");a=a.replace(/[#\.]/g," ");u(l,2);return r.join("")}function NL(e){var N={opts:e};var u=TL();if(typeof CanvasRenderingContext2D!="undefined"){CanvasRenderingContext2D.prototype.drawSvg=function(e,t,n,i,a,r){var o={ignoreMouse:true,ignoreAnimation:true,ignoreDimensions:true,ignoreClear:true,offsetX:t,offsetY:n,scaleWidth:i,scaleHeight:a};for(var s in r){if(r.hasOwnProperty(s)){o[s]=r[s]}}ML(this.canvas,e,o)}}N.FRAMERATE=30;N.MAX_VIRTUAL_PIXELS=3e4;N.log=function(e){};if(N.opts.log==true&&typeof console!="undefined"){N.log=function(e){console.log(e)}}N.init=function(e){var t=0;N.UniqueId=function(){t++;return"canvg"+t};N.Definitions={};N.Styles={};N.StylesSpecificity={};N.Animations=[];N.Images=[];N.ctx=e;N.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(e,t){this.viewPorts.push({width:e,height:t})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};this.ComputeSize=function(e){if(e!=null&&typeof e=="number")return e;if(e=="x")return this.width();if(e=="y")return this.height();return Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};N.init();N.ImagesLoaded=function(){for(var e=0;e]*>/,"");var t=new ActiveXObject("Microsoft.XMLDOM");t.async="false";t.loadXML(e);return t}};N.Property=function(e,t){this.name=e;this.value=t};N.Property.prototype.getValue=function(){return this.value};N.Property.prototype.hasValue=function(){return this.value!=null&&this.value!=""};N.Property.prototype.numValue=function(){if(!this.hasValue())return 0;var e=parseFloat(this.value);if((this.value+"").match(/%$/)){e=e/100}return e};N.Property.prototype.valueOrDefault=function(e){if(this.hasValue())return this.value;return e};N.Property.prototype.numValueOrDefault=function(e){if(this.hasValue())return this.numValue();return e};N.Property.prototype.addOpacity=function(e){var t=this.value;if(e.value!=null&&e.value!=""&&typeof this.value=="string"){var n=new Mz(this.value);if(n.ok){t="rgba("+n.r+", "+n.g+", "+n.b+", "+e.numValue()+")"}}return new N.Property(this.name,t)};N.Property.prototype.getDefinition=function(){var e=this.value.match(/#([^\)'"]+)/);if(e){e=e[1]}if(!e){e=this.value}return N.Definitions[e]};N.Property.prototype.isUrlDefinition=function(){return this.value.indexOf("url(")==0};N.Property.prototype.getFillStyleDefinition=function(e,t){var n=this.getDefinition();if(n!=null&&n.createGradient){return n.createGradient(N.ctx,e,t)}if(n!=null&&n.createPattern){if(n.getHrefAttribute().hasValue()){var i=n.attribute("patternTransform");n=n.getHrefAttribute().getDefinition();if(i.hasValue()){n.attribute("patternTransform",true).value=i.value}}return n.createPattern(N.ctx,e)}return null};N.Property.prototype.getDPI=function(e){return 96};N.Property.prototype.getEM=function(e){var t=12;var n=new N.Property("fontSize",N.Font.Parse(N.ctx.font).fontSize);if(n.hasValue())t=n.toPixels(e);return t};N.Property.prototype.getUnits=function(){var e=this.value+"";return e.replace(/[0-9\.\-]/g,"")};N.Property.prototype.toPixels=function(e,t){if(!this.hasValue())return 0;var n=this.value+"";if(n.match(/em$/))return this.numValue()*this.getEM(e);if(n.match(/ex$/))return this.numValue()*this.getEM(e)/2;if(n.match(/px$/))return this.numValue();if(n.match(/pt$/))return this.numValue()*this.getDPI(e)*(1/72);if(n.match(/pc$/))return this.numValue()*15;if(n.match(/cm$/))return this.numValue()*this.getDPI(e)/2.54;if(n.match(/mm$/))return this.numValue()*this.getDPI(e)/25.4;if(n.match(/in$/))return this.numValue()*this.getDPI(e);if(n.match(/%$/))return this.numValue()*N.ViewPort.ComputeSize(e);var i=this.numValue();if(t&&i<1)return i*N.ViewPort.ComputeSize(e);return i};N.Property.prototype.toMilliseconds=function(){if(!this.hasValue())return 0;var e=this.value+"";if(e.match(/s$/))return this.numValue()*1e3;if(e.match(/ms$/))return this.numValue();return this.numValue()};N.Property.prototype.toRadians=function(){if(!this.hasValue())return 0;var e=this.value+"";if(e.match(/deg$/))return this.numValue()*(Math.PI/180);if(e.match(/grad$/))return this.numValue()*(Math.PI/200);if(e.match(/rad$/))return this.numValue();return this.numValue()*(Math.PI/180)};var t={baseline:"alphabetic","before-edge":"top","text-before-edge":"top",middle:"middle",central:"middle","after-edge":"bottom","text-after-edge":"bottom",ideographic:"ideographic",alphabetic:"alphabetic",hanging:"hanging",mathematical:"alphabetic"};N.Property.prototype.toTextBaseline=function(){if(!this.hasValue())return null;return t[this.value]};N.Font=new function(){this.Styles="normal|italic|oblique|inherit";this.Variants="normal|small-caps|inherit";this.Weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";this.CreateFont=function(e,t,n,i,a,r){var o=r!=null?this.Parse(r):this.CreateFont("","","","","",N.ctx.font);return{fontFamily:a||o.fontFamily,fontSize:i||o.fontSize,fontStyle:e||o.fontStyle,fontWeight:n||o.fontWeight,fontVariant:t||o.fontVariant,toString:function e(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var o=this;this.Parse=function(e){var t={};var n=N.trim(N.compressSpaces(e||"")).split(" ");var i={fontSize:false,fontStyle:false,fontWeight:false,fontVariant:false};var a="";for(var r=0;rthis.x2)this.x2=e}if(t!=null){if(isNaN(this.y1)||isNaN(this.y2)){this.y1=t;this.y2=t}if(tthis.y2)this.y2=t}};this.addX=function(e){this.addPoint(e,null)};this.addY=function(e){this.addPoint(null,e)};this.addBoundingBox=function(e){this.addPoint(e.x1,e.y1);this.addPoint(e.x2,e.y2)};this.addQuadraticCurve=function(e,t,n,i,a,r){var o=e+2/3*(n-e);var s=t+2/3*(i-t);var l=o+1/3*(a-e);var u=s+1/3*(r-t);this.addBezierCurve(e,t,o,l,s,u,a,r)};this.addBezierCurve=function(e,t,n,i,a,r,o,s){var l=[e,t],u=[n,i],h=[a,r],c=[o,s];this.addPoint(l[0],l[1]);this.addPoint(c[0],c[1]);for(var f=0;f<=1;f++){var d=function e(t){return Math.pow(1-t,3)*l[f]+3*Math.pow(1-t,2)*t*u[f]+3*(1-t)*Math.pow(t,2)*h[f]+Math.pow(t,3)*c[f]};var g=6*l[f]-12*u[f]+6*h[f];var p=-3*l[f]+9*u[f]-9*h[f]+3*c[f];var v=3*u[f]-3*l[f];if(p==0){if(g==0)continue;var m=-v/g;if(0=0;t--){this.transforms[t].unapply(e)}};this.applyToPoint=function(e){for(var t=0;ta){this.styles[i]=t[i];this.stylesSpecificity[i]=n}}}}}};if(r!=null&&r.nodeType==1){for(var e=0;e0){e.push([this.points[this.points.length-1],e[e.length-1][1]])}return e}};N.Element.polyline.prototype=new N.Element.PathElementBase;N.Element.polygon=function(e){this.base=N.Element.polyline;this.base(e);this.basePath=this.path;this.path=function(e){var t=this.basePath(e);if(e!=null){e.lineTo(this.points[0].x,this.points[0].y);e.closePath()}return t}};N.Element.polygon.prototype=new N.Element.polyline;N.Element.path=function(e){this.base=N.Element.PathElementBase;this.base(e);var t=this.attribute("d").value;t=t.replace(/,/gm," ");for(var n=0;n<2;n++){t=t.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2")}t=t.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");t=t.replace(/([0-9])([+\-])/gm,"$1 $2");for(var n=0;n<2;n++){t=t.replace(/(\.[0-9]*)(\.)/gm,"$1 $2")}t=t.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");t=N.compressSpaces(t);t=N.trim(t);this.PathParser=new function(e){this.tokens=e.split(" ");this.reset=function(){this.i=-1;this.command="";this.previousCommand="";this.start=new N.Point(0,0);this.control=new N.Point(0,0);this.current=new N.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){if(this.isEnd())return true;return this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){switch(this.command){case"m":case"l":case"h":case"v":case"c":case"s":case"q":case"t":case"a":case"z":return true}return false};this.getToken=function(){this.i++;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){var e=new N.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(e)};this.getAsControlPoint=function(){var e=this.getPoint();this.control=e;return e};this.getAsCurrentPoint=function(){var e=this.getPoint();this.current=e;return e};this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"&&this.previousCommand.toLowerCase()!="q"&&this.previousCommand.toLowerCase()!="t"){return this.current}var e=new N.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return e};this.makeAbsolute=function(e){if(this.isRelativeCommand()){e.x+=this.current.x;e.y+=this.current.y}return e};this.addMarker=function(e,t,n){if(n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null){this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)}this.addMarkerAngle(e,t==null?null:t.angleTo(e))};this.addMarkerAngle=function(e,t){this.points.push(e);this.angles.push(t)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var e=0;e1){h*=Math.sqrt(v);c*=Math.sqrt(v)}var m=(d==g?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(c,2)-Math.pow(h,2)*Math.pow(p.y,2)-Math.pow(c,2)*Math.pow(p.x,2))/(Math.pow(h,2)*Math.pow(p.y,2)+Math.pow(c,2)*Math.pow(p.x,2)));if(isNaN(m))m=0;var y=new N.Point(m*h*p.y/c,m*-c*p.x/h);var _=new N.Point((o.x+u.x)/2+Math.cos(f)*y.x-Math.sin(f)*y.y,(o.y+u.y)/2+Math.sin(f)*y.x+Math.cos(f)*y.y);var b=function e(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2))};var w=function e(t,n){return(t[0]*n[0]+t[1]*n[1])/(b(t)*b(n))};var x=function e(t,n){return(t[0]*n[1]=1)E=0;var A=1-g?1:-1;var R=k+A*(E/2);var M=new N.Point(_.x+h*Math.cos(R),_.y+c*Math.sin(R));t.addMarkerAngle(M,R-A*Math.PI/2);t.addMarkerAngle(u,R-A*Math.PI);n.addPoint(u.x,u.y);if(e!=null){var w=h>c?h:c;var T=h>c?1:h/c;var B=h>c?c/h:1;e.translate(_.x,_.y);e.rotate(f);e.scale(T,B);e.arc(0,0,w,k,k+E,1-g);e.scale(1/T,1/B);e.rotate(-f);e.translate(-_.x,-_.y)}}break;case"Z":case"z":if(e!=null)e.closePath();t.current=t.start}}return n};this.getMarkers=function(){var e=this.PathParser.getMarkerPoints();var t=this.PathParser.getMarkerAngles();var n=[];for(var i=0;i1)this.offset=1;var t=this.style("stop-color",true);if(t.value=="")t.value="#000";if(this.style("stop-opacity").hasValue())t=t.addOpacity(this.style("stop-opacity"));this.color=t.value};N.Element.stop.prototype=new N.Element.ElementBase;N.Element.AnimateBase=function(e){this.base=N.Element.ElementBase;this.base(e);N.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").toMilliseconds();this.getProperty=function(){var e=this.attribute("attributeType").value;var t=this.attribute("attributeName").value;if(e=="CSS"){return this.parent.style(t,true)}return this.parent.attribute(t,true)};this.initialValue=null;this.initialUnits="";this.removed=false;this.calcValue=function(){return""};this.update=function(e){if(this.initialValue==null){this.initialValue=this.getProperty().value;this.initialUnits=this.getProperty().getUnits()}if(this.duration>this.maxDuration){if(this.attribute("repeatCount").value=="indefinite"||this.attribute("repeatDur").value=="indefinite"){this.duration=0}else if(this.attribute("fill").valueOrDefault("remove")=="freeze"&&!this.frozen){this.frozen=true;this.parent.animationFrozen=true;this.parent.animationFrozenValue=this.getProperty().value}else if(this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed){this.removed=true;this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue;return true}return false}this.duration=this.duration+e;var t=false;if(this.beginn&&o.attribute("x").hasValue())break;a+=o.measureTextRecursive(e)}return-1*(i=="end"?a:a/2)}return 0};this.renderChild=function(e,t,n,i){var a=n.children[i];if(a.attribute("x").hasValue()){a.x=a.attribute("x").toPixels("x")+t.getAnchorDelta(e,n,i);if(a.attribute("dx").hasValue())a.x+=a.attribute("dx").toPixels("x")}else{if(a.attribute("dx").hasValue())t.x+=a.attribute("dx").toPixels("x");a.x=t.x}t.x=a.x+a.measureText(e);if(a.attribute("y").hasValue()){a.y=a.attribute("y").toPixels("y");if(a.attribute("dy").hasValue())a.y+=a.attribute("dy").toPixels("y")}else{if(a.attribute("dy").hasValue())t.y+=a.attribute("dy").toPixels("y");a.y=t.y}t.y=a.y;a.render(e);for(var i=0;i0&&t[n-1]!=" "&&n0&&t[n-1]!=" "&&(n==t.length-1||t[n+1]==" "))r="initial";if(typeof e.glyphs[i]!="undefined"){a=e.glyphs[i][r];if(a==null&&e.glyphs[i].type=="glyph")a=e.glyphs[i]}}else{a=e.glyphs[i]}if(a==null)a=e.missingGlyph;return a};this.renderChildren=function(e){var t=this.parent.style("font-family").getDefinition();if(t!=null){var n=this.parent.style("font-size").numValueOrDefault(N.Font.Parse(N.ctx.font).fontSize);var i=this.parent.style("font-style").valueOrDefault(N.Font.Parse(N.ctx.font).fontStyle);var a=this.getText();if(t.isRTL)a=a.split("").reverse().join("");var r=N.ToNumberArray(this.parent.attribute("dx").value);for(var o=0;o0){return""}return this.text}};N.Element.tspan.prototype=new N.Element.TextElementBase;N.Element.tref=function(e){this.base=N.Element.TextElementBase;this.base(e);this.getText=function(){var e=this.getHrefAttribute().getDefinition();if(e!=null)return e.children[0].getText()}};N.Element.tref.prototype=new N.Element.TextElementBase;N.Element.a=function(e){this.base=N.Element.TextElementBase;this.base(e);this.hasText=e.childNodes.length>0;for(var t=0;t0){var n=new N.Element.g;n.children=this.children;n.parent=this;n.render(e)}};this.onclick=function(){window.open(this.getHrefAttribute().value)};this.onmousemove=function(){N.ctx.canvas.style.cursor="pointer"}};N.Element.a.prototype=new N.Element.TextElementBase;N.Element.image=function(e){this.base=N.Element.RenderedElementBase;this.base(e);var t=this.getHrefAttribute().value;if(t==""){return}var r=t.match(/\.svg$/);N.Images.push(this);this.loaded=false;if(!r){this.img=document.createElement("img");if(N.opts["useCORS"]==true){this.img.crossOrigin="Anonymous"}var n=this;this.img.onload=function(){n.loaded=true};this.img.onerror=function(){N.log('ERROR: image "'+t+'" not found');n.loaded=true};this.img.src=t}else{this.img=N.ajax(t);this.loaded=true}this.renderChildren=function(e){var t=this.attribute("x").toPixels("x");var n=this.attribute("y").toPixels("y");var i=this.attribute("width").toPixels("x");var a=this.attribute("height").toPixels("y");if(i==0||a==0)return;e.save();if(r){e.drawSvg(this.img,t,n,i,a)}else{e.translate(t,n);N.AspectRatio(e,this.attribute("preserveAspectRatio").value,i,this.img.width,a,this.img.height,0,0);e.drawImage(this.img,0,0)}e.restore()};this.getBoundingBox=function(){var e=this.attribute("x").toPixels("x");var t=this.attribute("y").toPixels("y");var n=this.attribute("width").toPixels("x");var i=this.attribute("height").toPixels("y");return new N.BoundingBox(e,t,e+n,t+i)}};N.Element.image.prototype=new N.Element.RenderedElementBase;N.Element.g=function(e){this.base=N.Element.RenderedElementBase;this.base(e);this.getBoundingBox=function(){var e=new N.BoundingBox;for(var t=0;t0){var m=p[v].indexOf("url");var y=p[v].indexOf(")",m);var _=p[v].substr(m+5,y-m-6);var b=N.parseXml(N.ajax(_));var w=b.getElementsByTagName("font");for(var x=0;xe.length)t=e.length;for(var n=0,i=new Array(t);n0&&!Rl(this).selectAll("image, img, svg").size()){var E=this.cloneNode(true);Rl(E).selectAll("*").each(function(){Rl(this).call(DL);if(Rl(this).attr("opacity")==="0")this.parentNode.removeChild(this)});te.push(Object.assign({},n,{type:"svg",value:E,tag:t}))}else if(this.childNodes.length>0){var A=UL(this),R=zL(A,3),M=R[0],T=R[1],B=R[2];n.scale*=M;n.x+=T;n.y+=B;ne(this,n)}else{var N=this.cloneNode(true);Rl(N).selectAll("*").each(function(){if(Rl(this).attr("opacity")==="0")this.parentNode.removeChild(this)});if(t==="line"){Rl(N).attr("x1",parseFloat(Rl(N).attr("x1"))+n.x);Rl(N).attr("x2",parseFloat(Rl(N).attr("x2"))+n.x);Rl(N).attr("y1",parseFloat(Rl(N).attr("y1"))+n.y);Rl(N).attr("y2",parseFloat(Rl(N).attr("y2"))+n.y)}else if(t==="path"){var P=UL(N),D=zL(P,3),O=D[0],z=D[1],F=D[2];if(Rl(N).attr("transform"))Rl(N).attr("transform","scale(".concat(O,")translate(").concat(z+n.x,",").concat(F+n.y,")"))}Rl(N).call(DL);var L=Rl(N).attr("fill");var I=L&&L.indexOf("url")===0;te.push(Object.assign({},n,{type:"svg",value:N,tag:t}));if(I){var j=Rl(L.slice(4,-1)).node().cloneNode(true);var H=(j.tagName||"").toLowerCase();if(H==="pattern"){var V=UL(N),G=zL(V,3),U=G[0],W=G[1],K=G[2];n.scale*=U;n.x+=W;n.y+=K;ne(j,n)}}}}function ne(e,t){Nl(e.childNodes).each(function(){i.bind(this)(t)})}for(var a=0;a").concat(a,"");f.save();f.translate(q.padding,q.padding);PL(c,l,Object.assign({},GL,{offsetX:t.x,offsetY:t.y}));f.restore();break;case"svg":var u=h?(new XMLSerializer).serializeToString(t.value):t.value.outerHTML;f.save();f.translate(q.padding+n.x+t.x,q.padding+n.y+t.y);f.rect(0,0,n.width,n.height);f.clip();PL(c,u,Object.assign({},GL,{offsetX:t.x+n.x,offsetY:t.y+n.y}));f.restore();break;default:console.warn("uncaught",t);break}}q.callback(c)}}(function(e){var f=e.Uint8Array,t=e.HTMLCanvasElement,n=t&&t.prototype,l=/\s*;\s*base64\s*(?:;|$)/i,u="toDataURL",d,h=function e(t){var n=t.length,i=new f(n/4*3|0),a=0,r=0,o=[0,0],s=0,l=0,u,h,c;while(n--){h=t.charCodeAt(a++);u=d[h-43];if(u!==255&&u!==c){o[1]=o[0];o[0]=h;l=l<<6|u;s++;if(s===4){i[r++]=l>>>16;if(o[1]!==61){i[r++]=l>>>8}if(o[0]!==61){i[r++]=l}s=0}}}return i};if(f){d=new f([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51])}if(t&&(!n.toBlob||!n.toBlobHD)){if(!n.toBlob)n.toBlob=function(e,t){if(!t){t="image/png"}if(this.mozGetAsFile){e(this.mozGetAsFile("canvas",t));return}if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(t)){e(this.msToBlob());return}var n=Array.prototype.slice.call(arguments,1),i=this[u].apply(this,n),a=i.indexOf(","),r=i.substring(a+1),o=l.test(i.substring(0,a)),s;if(Blob.fake){s=new Blob;if(o){s.encoding="base64"}else{s.encoding="URI"}s.data=r;s.size=r.length}else if(f){if(o){s=new Blob([h(r)],{type:t})}else{s=new Blob([decodeURIComponent(r)],{type:t})}}e(s)};if(!n.toBlobHD&&n.toDataURLHD){n.toBlobHD=function(){u="toDataURLHD";var e=this.toBlob();u="toDataURL";return e}}else{n.toBlobHD=n.toBlob}}})(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||PN.content||PN);var KL=DN(function(e){var t=t||function(h){if(typeof h==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var e=h.document,c=function e(){return h.URL||h.webkitURL||h},f=e.createElementNS("http://www.w3.org/1999/xhtml","a"),d="download"in f,g=function e(t){var n=new MouseEvent("click");t.dispatchEvent(n)},p=/constructor/i.test(h.HTMLElement)||h.safari,v=/CriOS\/[\d]+/.test(navigator.userAgent),o=function e(t){(h.setImmediate||h.setTimeout)(function(){throw t},0)},m="application/octet-stream",i=1e3*40,y=function e(t){var n=function e(){if(typeof t==="string"){c().revokeObjectURL(t)}else{t.remove()}};setTimeout(n,i)},_=function e(t,n,i){n=[].concat(n);var a=n.length;while(a--){var r=t["on"+n[a]];if(typeof r==="function"){try{r.call(t,i||t)}catch(e){o(e)}}}},b=function e(t){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)){return new Blob([String.fromCharCode(65279),t],{type:t.type})}return t},a=function e(i,t,n){if(!n){i=b(i)}var a=this,r=i.type,o=r===m,s,l=function e(){_(a,"writestart progress write writeend".split(" "))},u=function e(){if((v||o&&p)&&h.FileReader){var n=new FileReader;n.onloadend=function(){var e=v?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");var t=h.open(e,"_blank");if(!t)h.location.href=e;e=undefined;a.readyState=a.DONE;l()};n.readAsDataURL(i);a.readyState=a.INIT;return}if(!s){s=c().createObjectURL(i)}if(o){h.location.href=s}else{var t=h.open(s,"_blank");if(!t){h.location.href=s}}a.readyState=a.DONE;l();y(s)};a.readyState=a.INIT;if(d){s=c().createObjectURL(i);setTimeout(function(){f.href=s;f.download=t;g(f);l();y(s);a.readyState=a.DONE});return}u()},t=a.prototype,n=function e(t,n,i){return new a(t,n||t.name||"download",i)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=b(e)}return navigator.msSaveOrOpenBlob(e,t)}}t.abort=function(){};t.readyState=t.INIT=0;t.WRITING=1;t.DONE=2;t.error=t.onwritestart=t.onprogress=t.onwrite=t.onabort=t.onerror=t.onwriteend=null;return n}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||PN.content);if(e.exports){e.exports.saveAs=t}});var qL={filename:"download",type:"png"};function YL(e){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};if(!e)return;n=Object.assign({},qL,n);var t=new RegExp(/(MSIE|Trident\/|Edge\/)/i).test(navigator.userAgent);if(!(e instanceof Array)&&n.type==="svg"){var a=t?(new XMLSerializer).serializeToString(e):e.outerHTML;KL.saveAs(new Blob([a],{type:"application/svg+xml"}),"".concat(n.filename,".svg"))}WL(e,Object.assign({},i,{callback:function e(t){if(i.callback)i.callback(t);if(["jpg","png"].includes(n.type)){t.toBlob(function(e){return KL.saveAs(e,"".concat(n.filename,".").concat(n.type))})}}}))}var XL={Button:wP,Radio:PP,Select:WP};function $L(){var c=this;var f=this;var d=this._controlPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var g=["left","right","top","bottom"];var e=function e(t){var l=g[t];var u=(c._controls||[]).filter(function(e){return!e.position&&l==="bottom"||e.position===l});if(c._downloadButton&&c._downloadPosition===l){u.push({data:[{text:c._translate("Download"),value:1}],label:"downloadButton",on:{click:function e(){var t=c._detectResize;if(t)c.detectResize(false).render();YL(c._select.node(),Object.assign({title:c._title||undefined},c._downloadConfig),{callback:function e(){setTimeout(function(){if(t)c.detectResize(t).render()},5e3)}})}},type:"Button"})}var n=l==="top"||l==="bottom";var i={height:n?c._height-(c._margin.top+c._margin.bottom):c._height-(c._margin.top+c._margin.bottom+d.top+d.bottom),width:n?c._width-(c._margin.left+c._margin.right+d.left+d.right):c._width-(c._margin.left+c._margin.right)};i.x=(n?c._margin.left+d.left:c._margin.left)+(l==="right"?c._width-c._margin.bottom:0);i.y=(n?c._margin.top:c._margin.top+d.top)+(l==="bottom"?c._height-c._margin.bottom:0);var a=Ox("foreignObject.d3plus-viz-controls-".concat(l),{condition:u.length,enter:Object.assign({opacity:0},i),exit:Object.assign({opacity:0},i),parent:c._select,transition:c._transition,update:{height:i.height,opacity:1,width:i.width}});var h=a.selectAll("div.d3plus-viz-controls-container").data([null]);h=h.enter().append("xhtml:div").attr("class","d3plus-viz-controls-container").merge(h);if(u.length){var r=function e(t){var n=Object.assign({},u[t]);var i={};if(n.on){var a=function e(t){if({}.hasOwnProperty.call(n.on,t)){i[t]=function(){n.on[t].bind(f)(this.value)}}};for(var r in n.on){a(r)}}var o=n.label||"".concat(l,"-").concat(t);if(!c._controlCache[o]){var s=n.type&&XL[n.type]?n.type:"Select";c._controlCache[o]=(new XL[s]).container(h.node());if(n.checked)c._controlCache[o].checked(n.checked);if(n.selected)c._controlCache[o].selected(n.selected)}delete n.checked;delete n.selected;c._controlCache[o].config(n).config({on:i}).config(c._controlConfig).render()};for(var o=0;o0&&arguments[0]!==undefined?arguments[0]:[];var t=this._legendClass.outerBounds();var n=this._legendPosition;var i=["top","bottom"].includes(n);var a=this._legendPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var r={transform:"translate(".concat(i?this._margin.left+a.left:this._margin.left,", ").concat(i?this._margin.top:this._margin.top+a.top,")")};var s=Ox("g.d3plus-viz-legend",{condition:this._legend&&!this._legendConfig.select,enter:r,parent:this._select,transition:this._transition,update:r}).node();var l=[];var u=function e(t,n){var i=o._shape(t,n);var a=i==="Line"?"stroke":"fill";var r=o._shapeConfig[i]&&o._shapeConfig[i][a]?o._shapeConfig[i][a]:o._shapeConfig[a];return typeof r==="function"?r.bind(o)(t,n):r};var h=function e(t,n){var i=o._shape(t,n);var a=o._shapeConfig[i]&&o._shapeConfig[i].opacity?o._shapeConfig[i].opacity:o._shapeConfig.opacity;return typeof a==="function"?a.bind(o)(t,n):a};var c=function e(t,n){return"".concat(u(t,n),"_").concat(h(t,n))};if(this._legend){X().key(c).rollup(function(e){return l.push(Fx(e,o._aggs))}).entries(this._colorScale?e.filter(function(e,t){return o._colorScale(e,t)===undefined}):e)}l.sort(this._legendSort);var f=l.map(function(e,t){return o._ids(e,t).slice(0,o._drawDepth+1)});this._legendDepth=0;var d=function e(t){var n=f.map(function(e){return e[t]});if(!n.some(function(e){return e instanceof Array})&&Array.from(new Set(n)).length===l.length){o._legendDepth=t;return"break"}};for(var g=0;g<=this._drawDepth;g++){var p=d(g);if(p==="break")break}var v=function e(t,n){var i=o._id(t,n);if(i instanceof Array)i=i[0];return o._hidden.includes(i)||o._solo.length&&!o._solo.includes(i)};this._legendClass.id(c).align(i?"center":n).direction(i?"row":"column").duration(this._duration).data(l.length>this._legendCutoff||this._colorScale?l:[]).height(i?this._height-(this._margin.bottom+this._margin.top):this._height-(this._margin.bottom+this._margin.top+a.bottom+a.top)).locale(this._locale).parent(this).select(s).verticalAlign(!i?"middle":n).width(i?this._width-(this._margin.left+this._margin.right+a.left+a.right):this._width-(this._margin.left+this._margin.right)).shapeConfig(Px.bind(this)(this._shapeConfig,"legend")).shapeConfig({fill:function e(t,n){return v(t,n)?o._hiddenColor(t,n):u(t,n)},labelConfig:{fontOpacity:function e(t,n){return v(t,n)?o._hiddenOpacity(t,n):1}},opacity:h}).config(this._legendConfig).render();if(!this._legendConfig.select&&t.height){if(i)this._margin[n]+=t.height+this._legendClass.padding()*2;else this._margin[n]+=t.width+this._legendClass.padding()*2}}function QL(n){var i=this;if(!(n instanceof Array))n=[n,n];if(JSON.stringify(n)!==JSON.stringify(this._timelineSelection)){this._timelineSelection=n;n=n.map(Number);this.timeFilter(function(e){var t=GN(i._time(e)).getTime();return t>=n[0]&&t<=n[1]}).render()}}function eI(){var t=this;var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var n=this._time&&this._timeline;var i=n?zx(this._data.map(this._time)).map(GN):[];n=n&&i.length>1;var a=this._timelinePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var r={transform:"translate(".concat(this._margin.left+a.left,", 0)")};var o=Ox("g.d3plus-viz-timeline",{condition:n,enter:r,parent:this._select,transition:this._transition,update:r}).node();if(n){var s=this._timelineClass.domain(Fe(i)).duration(this._duration).height(this._height-this._margin.bottom).locale(this._locale).select(o).ticks(i.sort(function(e,t){return+e-+t})).width(this._width-(this._margin.left+this._margin.right+a.left+a.right));if(s.selection()===undefined){this._timelineSelection=Fe(e,this._time).map(GN);s.selection(this._timelineSelection)}var l=this._timelineConfig;s.config(l).on("end",function(e){QL.bind(t)(e);if(l.on&&l.on.end)l.on.end(e)}).render();this._margin.bottom+=s.outerBounds().height+s.padding()*2}}function tI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var t=this._title?this._title(e):false;var n=this._titlePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var a=Ox("g.d3plus-viz-title",{enter:i,parent:this._select,transition:this._transition,update:i}).node();this._titleClass.data(t?[{text:t}]:[]).locale(this._locale).select(a).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._titleConfig).render();this._margin.top+=t?a.getBBox().height:0}function nI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var t=typeof this._total==="function"?O(e.map(this._total)):this._total===true&&this._size?O(e.map(this._size)):false;var n=this._totalPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var a=Ox("g.d3plus-viz-total",{enter:i,parent:this._select,transition:this._transition,update:i}).node();this._totalClass.data(t?[{text:this._totalFormat(t)}]:[]).locale(this._locale).select(a).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._totalConfig).render();this._margin.top+=t?a.getBBox().height+this._totalConfig.padding*2:0}function iI(e,t){if(!e)return undefined;if(e.tagName===undefined||["BODY","HTML"].indexOf(e.tagName)>=0){var n=window["inner".concat(t.charAt(0).toUpperCase()+t.slice(1))];var i=Rl(e);if(t==="width"){n-=parseFloat(i.style("margin-left"),10);n-=parseFloat(i.style("margin-right"),10);n-=parseFloat(i.style("padding-left"),10);n-=parseFloat(i.style("padding-right"),10)}else{n-=parseFloat(i.style("margin-top"),10);n-=parseFloat(i.style("margin-bottom"),10);n-=parseFloat(i.style("padding-top"),10);n-=parseFloat(i.style("padding-bottom"),10)}return n}else{var a=parseFloat(Rl(e).style(t),10);if(typeof a==="number"&&a>0)return a;else return iI(e.parentNode,t)}}function aI(e){return[iI(e,"width"),iI(e,"height")]}function rI(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var n=window.pageXOffset!==undefined?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var i=window.pageYOffset!==undefined?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var a=e.getBoundingClientRect();var r=a.height,o=a.left+n,s=a.top+i,l=a.width;return i+window.innerHeight>s+t&&i+to+t&&n+t=0){this._solo=[];this._hidden=[];this.render()}}else{if(r<0&&this._hidden.length").concat(s("Shift+Click to Hide"))).title(this._legendConfig.label?this._legendClass.label():ZL.bind(this)).position(a).config(Px.bind(this)(this._tooltipConfig)).config(Px.bind(this)(this._legendTooltip)).render()}}function fI(e,t,n){if(e&&this._tooltip(e,t)){this._select.style("cursor","pointer");var i=fl.touches?[fl.touches[0].clientX,fl.touches[0].clientY]:[fl.clientX,fl.clientY];this._tooltipClass.data([n||e]).footer(this._drawDepthe.length)t=e.length;for(var n=0,i=new Array(t);n0&&arguments[0]!==undefined?arguments[0]:false;bI=e;if(bI)this._brushGroup.style("display","inline");else this._brushGroup.style("display","none");if(!bI&&this._zoom){this._container.call(this._zoomBehavior);if(!this._zoomScroll){this._container.on("wheel.zoom",null)}if(!this._zoomPan){this._container.on("mousedown.zoom mousemove.zoom",null).on("touchstart.zoom touchmove.zoom touchend.zoom touchcancel.zoom",null)}}else{this._container.on(".zoom",null)}}function kI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;if(this._zoomGroup){if(!t)this._zoomGroup.attr("transform",e||fl.transform);else this._zoomGroup.transition().duration(t).attr("transform",e||fl.transform)}if(this._renderTiles)this._renderTiles(ch(this._container.node()),t)}function SI(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;if(!this._container)return;var t=this._zoomBehavior.extent().bind(document)()[1].map(function(e){return e/2}),n=this._zoomBehavior.scaleExtent(),i=ch(this._container.node());if(!e){i.k=n[0];i.x=0;i.y=0}else{var a=[(t[0]-i.x)/i.k,(t[1]-i.y)/i.k];i.k=Math.min(n[1],i.k*e);if(i.k<=n[0]){i.k=n[0];i.x=0;i.y=0}else{i.x+=t[0]-(a[0]*i.k+i.x);i.y+=t[1]-(a[1]*i.k+i.y)}}kI.bind(this)(i,this._duration)}function CI(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this._duration;var n=this._zoomBehavior.scaleExtent(),i=ch(this._container.node());if(e){var a=gI(this._zoomBehavior.translateExtent()[1],2),r=a[0],o=a[1],s=e[1][0]-e[0][0],l=e[1][1]-e[0][1];var u=Math.min(n[1],1/Math.max(s/r,l/o));var h,c;if(s/l0)i.x=0;else if(i.x0)i.y=0;else if(i.ye.length)t=e.length;for(var n=0,i=new Array(t);n600:true}function QI(i){return i.reduce(function(e,t,n){if(!n)e+=t;else if(n===i.length-1&&n===1)e+=" and ".concat(t);else if(n===i.length-1)e+=", and ".concat(t);else e+=", ".concat(t);return e},"")}var ej=function(e){WI(n,e);var t=qI(n);function n(){var s;VI(this,n);s=t.call(this);s._aggs={};s._ariaHidden=true;s._attribution=false;s._attributionStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.25)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"400 11px/11px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",margin:"5px",opacity:.75,padding:"4px 6px 3px"};s._backClass=(new kA).on("click",function(){if(s._history.length)s.config(s._history.pop()).render();else s.depth(s._drawDepth-1).filter(false).render()}).on("mousemove",function(){return s._backClass.select().style("cursor","pointer")});s._backConfig={fontSize:10,padding:5,resize:false};s._cache=true;s._color=function(e,t){return s._groupBy[0](e,t)};s._colorScaleClass=new kD;s._colorScaleConfig={};s._colorScalePadding=JI;s._colorScalePosition="bottom";s._colorScaleMaxSize=600;var e=new WP;s._controlCache={};s._controlConfig={selectStyle:Object.assign({margin:"5px"},e.selectStyle())};s._controlPadding=JI;s._data=[];s._dataCutoff=100;s._detectResize=true;s._detectResizeDelay=400;s._detectVisible=true;s._detectVisibleInterval=1e3;s._downloadButton=false;s._downloadConfig={type:"png"};s._downloadPosition="top";s._duration=600;s._hidden=[];s._hiddenColor=Dx("#aaa");s._hiddenOpacity=Dx(.5);s._history=[];s._groupBy=[wh("id")];s._legend=true;s._legendClass=new hD;s._legendConfig={label:ZL.bind(XI(s)),shapeConfig:{ariaLabel:ZL.bind(XI(s)),labelConfig:{fontColor:undefined,fontResize:false,padding:0}}};s._legendCutoff=1;s._legendPadding=JI;s._legendPosition="bottom";s._legendSort=function(e,t){return s._drawLabel(e).localeCompare(s._drawLabel(t))};s._legendTooltip={};s._loadingHTML=function(){return"\n
        \n ".concat(s._translate("Loading Visualization"),'\n ').concat(s._translate("Powered by D3plus"),"\n
        ")};s._loadingMessage=true;s._lrucache=zN(10);s._messageClass=new Cz;s._messageMask="rgba(0, 0, 0, 0.05)";s._messageStyle={bottom:"0",left:"0",position:"absolute",right:"0","text-align":"center",top:"0"};s._noDataHTML=function(){return"\n
        \n ".concat(s._translate("No Data Available"),"\n
        ")};s._noDataMessage=true;s._on={"click.shape":oI.bind(XI(s)),"click.legend":sI.bind(XI(s)),mouseenter:uI.bind(XI(s)),mouseleave:hI.bind(XI(s)),"mousemove.shape":fI.bind(XI(s)),"mousemove.legend":cI.bind(XI(s))};s._queue=[];s._scrollContainer=(typeof window==="undefined"?"undefined":HI(window))===undefined?"":window;s._shape=Dx("Rect");s._shapes=[];s._shapeConfig={ariaLabel:function e(t,n){return s._drawLabel(t,n)},fill:function e(t,n){while(t.__d3plus__&&t.data){t=t.data;n=t.i}if(s._colorScale){var i=s._colorScale(t,n);if(i!==undefined&&i!==null){var a=s._colorScaleClass._colorScale;var r=s._colorScaleClass.color();if(!a)return r instanceof Array?r[r.length-1]:r;else if(!a.domain().length)return a.range()[a.range().length-1];return a(i)}}var o=s._color(t,n);if(hN(o))return o;return rS(o)},labelConfig:{fontColor:function e(t,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(t,n):s._shapeConfig.fill;return oS(i)}},opacity:Dx(1),stroke:function e(t,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(t,n):s._shapeConfig.fill;return hN(i).darker()},role:"presentation",strokeWidth:Dx(0)};s._solo=[];s._svgDesc="";s._svgTitle="";s._timeline=true;s._timelineClass=(new FD).align("end");s._timelineConfig={brushing:false,padding:5};s._timelinePadding=JI;s._threshold=Dx(1e-4);s._thresholdKey=undefined;s._thresholdName=function(){return s._translate("Values")};s._titleClass=new kA;s._titleConfig={ariaHidden:true,fontSize:12,padding:5,resize:false,textAnchor:"middle"};s._titlePadding=JI;s._tooltip=Dx(true);s._tooltipClass=new wz;s._tooltipConfig={pointerEvents:"none",titleStyle:{"max-width":"200px"}};s._totalClass=new kA;s._totalConfig={fontSize:10,padding:5,resize:false,textAnchor:"middle"};s._totalFormat=function(e){return"".concat(s._translate("Total"),": ").concat(VN(e,s._locale))};s._totalPadding=JI;s._zoom=false;s._zoomBehavior=bh();s._zoomBrush=GB();s._zoomBrushHandleSize=1;s._zoomBrushHandleStyle={fill:"#444"};s._zoomBrushSelectionStyle={fill:"#777","stroke-width":0};s._zoomControlStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.75)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"900 15px/21px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",height:"20px",margin:"5px",opacity:.75,padding:0,"text-align":"center",width:"20px"};s._zoomControlStyleActive={background:"rgba(0, 0, 0, 0.75)",color:"rgba(255, 255, 255, 0.75)",opacity:1};s._zoomControlStyleHover={cursor:"pointer",opacity:1};s._zoomFactor=2;s._zoomMax=16;s._zoomPadding=20;s._zoomPan=true;s._zoomScroll=true;return s}UI(n,[{key:"_preDraw",value:function e(){var r=this;var o=this;this._drawDepth=this._depth!==void 0?this._depth:this._groupBy.length-1;this._id=this._groupBy[this._drawDepth];this._ids=function(t,n){return r._groupBy.map(function(e){return!t||t.__d3plus__&&!t.data?undefined:e(t.__d3plus__?t.data:t,t.__d3plus__?t.i:n)}).filter(function(e){return e!==undefined&&e!==null})};this._drawLabel=function(e,t){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:r._drawDepth;if(!e)return"";while(e.__d3plus__&&e.data){e=e.data;t=e.i}if(e._isAggregation){return"".concat(r._thresholdName(e,t)," < ").concat(VN(e._threshold*100,r._locale),"%")}if(r._label)return"".concat(r._label(e,t));var i=o._ids(e,t).slice(0,n+1);var a=i.reverse().find(function(e){return!(e instanceof Array)})||i[i.length-1];return a instanceof Array?QI(a):"".concat(a)};if(this._time&&!this._timeFilter&&this._data.length){var t=this._data.map(this._time).map(GN);var n=this._data[0],i=0;if(this._discrete&&"_".concat(this._discrete)in this&&this["_".concat(this._discrete)](n,i)===this._time(n,i)){this._timeFilter=function(){return true}}else{var a=+me(t);this._timeFilter=function(e,t){return+GN(r._time(e,t))===a}}}this._filteredData=[];this._legendData=[];var s=[];if(this._data.length){s=this._timeFilter?this._data.filter(this._timeFilter):this._data;if(this._filter)s=s.filter(this._filter);var l=X();for(var u=0;u<=this._drawDepth;u++){l.key(this._groupBy[u])}if(this._discrete&&"_".concat(this._discrete)in this)l.key(this["_".concat(this._discrete)]);if(this._discrete&&"_".concat(this._discrete,"2")in this)l.key(this["_".concat(this._discrete,"2")]);var h=l.rollup(function(e){var t=r._data.indexOf(e[0]);var n=r._shape(e[0],t);var i=r._id(e[0],t);var a=Fx(e,r._aggs);if(!r._hidden.includes(i)&&(!r._solo.length||r._solo.includes(i))){if(!r._discrete&&n==="Line")r._filteredData=r._filteredData.concat(e);else r._filteredData.push(a)}r._legendData.push(a)}).entries(s);this._filteredData=this._thresholdFunction(this._filteredData,h)}var c=X().key(this._id).entries(this._filteredData).length;if(c>this._dataCutoff){if(this._userHover===undefined)this._userHover=this._shapeConfig.hoverOpacity||.5;if(this._userDuration===undefined)this._userDuration=this._shapeConfig.duration||600;this._shapeConfig.hoverOpacity=1;this._shapeConfig.duration=0}else if(this._userHover!==undefined){this._shapeConfig.hoverOpacity=this._userHover;this._shapeConfig.duration=this._userDuration}if(this._noDataMessage&&!this._filteredData.length){this._messageClass.render({container:this._select.node().parentNode,html:this._noDataHTML(this),mask:false,style:this._messageStyle})}}},{key:"_draw",value:function e(){if(this._legendPosition==="left"||this._legendPosition==="right")JL.bind(this)(this._filteredData);if(this._colorScalePosition==="left"||this._colorScalePosition==="right"||this._colorScalePosition===false)Az.bind(this)(this._filteredData);Ez.bind(this)();tI.bind(this)(this._filteredData);nI.bind(this)(this._filteredData);eI.bind(this)(this._filteredData);$L.bind(this)(this._filteredData);if(this._legendPosition==="top"||this._legendPosition==="bottom")JL.bind(this)(this._legendData);if(this._colorScalePosition==="top"||this._colorScalePosition==="bottom")Az.bind(this)(this._filteredData);this._shapes=[]}},{key:"_thresholdFunction",value:function e(t){return t}},{key:"render",value:function e(r){var o=this;this._margin={bottom:0,left:0,right:0,top:0};this._padding={bottom:0,left:0,right:0,top:0};this._transition=eh().duration(this._duration);if(this._select===void 0||this._select.node().tagName.toLowerCase()!=="svg"){var t=this._select===void 0?Rl("body").append("div"):this._select;var n=t.append("svg");this.select(n.node())}function s(){var e=this._select.style("display");this._select.style("display","none");var t=aI(this._select.node().parentNode),n=OI(t,2),i=n[0],a=n[1];i-=parseFloat(this._select.style("border-left-width"),10);i-=parseFloat(this._select.style("border-right-width"),10);a-=parseFloat(this._select.style("border-top-width"),10);a-=parseFloat(this._select.style("border-bottom-width"),10);this._select.style("display",e);if(this._autoWidth){this.width(i);this._select.style("width","".concat(this._width,"px")).attr("width","".concat(this._width,"px"))}if(this._autoHeight){this.height(a);this._select.style("height","".concat(this._height,"px")).attr("height","".concat(this._height,"px"))}}if((!this._width||!this._height)&&(!this._detectVisible||rI(this._select.node()))){this._autoWidth=this._width===undefined;this._autoHeight=this._height===undefined;s.bind(this)()}this._select.attr("class","d3plus-viz").attr("aria-hidden",this._ariaHidden).attr("aria-labelledby","".concat(this._uuid,"-title ").concat(this._uuid,"-desc")).attr("role","img").attr("xmlns","http://www.w3.org/2000/svg").attr("xmlns:xlink","http://www.w3.org/1999/xlink").transition(eh).style("width",this._width!==undefined?"".concat(this._width,"px"):undefined).style("height",this._height!==undefined?"".concat(this._height,"px"):undefined).attr("width",this._width!==undefined?"".concat(this._width,"px"):undefined).attr("height",this._height!==undefined?"".concat(this._height,"px"):undefined);var i=Rl(this._select.node().parentNode);var a=i.style("position");if(a==="static")i.style("position","relative");var l=this._select.selectAll("title").data([0]);var u=l.enter().append("title").attr("id","".concat(this._uuid,"-title"));l.merge(u).text(this._svgTitle);var h=this._select.selectAll("desc").data([0]);var c=h.enter().append("desc").attr("id","".concat(this._uuid,"-desc"));h.merge(c).text(this._svgDesc);this._visiblePoll=clearInterval(this._visiblePoll);this._resizePoll=clearTimeout(this._resizePoll);this._scrollPoll=clearTimeout(this._scrollPoll);Rl(this._scrollContainer).on("scroll.".concat(this._uuid),null);Rl(this._scrollContainer).on("resize.".concat(this._uuid),null);if(this._detectVisible&&this._select.style("visibility")==="hidden"){this._visiblePoll=setInterval(function(){if(o._select.style("visibility")!=="hidden"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(r)}},this._detectVisibleInterval)}else if(this._detectVisible&&this._select.style("display")==="none"){this._visiblePoll=setInterval(function(){if(o._select.style("display")!=="none"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(r)}},this._detectVisibleInterval)}else if(this._detectVisible&&!rI(this._select.node())){Rl(this._scrollContainer).on("scroll.".concat(this._uuid),function(){if(!o._scrollPoll){o._scrollPoll=setTimeout(function(){if(rI(o._select.node())){Rl(o._scrollContainer).on("scroll.".concat(o._uuid),null);o.render(r)}o._scrollPoll=clearTimeout(o._scrollPoll)},o._detectVisibleInterval)}})}else{var f=NN();this._queue.forEach(function(e){var t=o._cache?o._lrucache.get("".concat(e[3],"_").concat(e[1])):undefined;if(!t)f.defer.apply(f,BI(e));else o["_".concat(e[3])]=e[2]?e[2](t):t});this._queue=[];if(this._loadingMessage&&f._tasks.length){this._messageClass.render({container:this._select.node().parentNode,html:this._loadingHTML(this),mask:this._filteredData?this._messageMask:false,style:this._messageStyle})}f.awaitAll(function(){var n=o._data instanceof Array&&o._data.length>0?Object.keys(o._data[0]):[];var e=o._select.selectAll("g.data-table").data(!o._ariaHidden&&o._data instanceof Array&&o._data.length?[0]:[]);var t=e.enter().append("g").attr("class","data-table").attr("role","table");e.exit().remove();var i=e.merge(t).selectAll("text").data(o._data instanceof Array?Le(0,o._data.length+1):[]);i.exit().remove();var a=i.merge(i.enter().append("text").attr("role","row")).selectAll("tspan").data(function(e,t){return n.map(function(e){return{role:t?"cell":"columnheader",text:t?o._data[t-1][e]:e}})});a.exit().remove();a.merge(a.enter().append("tspan")).attr("role",function(e){return e.role}).attr("dy","-1000px").html(function(e){return e.text});o._preDraw();o._draw(r);wI.bind(o)();TI.bind(o)();if(o._messageClass._isVisible&&(!o._noDataMessage||o._filteredData.length))o._messageClass.hide();if(o._detectResize&&(o._autoWidth||o._autoHeight)){Rl(o._scrollContainer).on("resize.".concat(o._uuid),function(){o._resizePoll=clearTimeout(o._resizePoll);o._resizePoll=setTimeout(function(){o._resizePoll=clearTimeout(o._resizePoll);s.bind(o)();o.render(r)},o._detectResizeDelay)})}if(r)setTimeout(r,o._duration+100)})}Rl("body").on("touchstart.".concat(this._uuid),dI.bind(this));return this}},{key:"active",value:function e(t){this._active=t;if(this._shapeConfig.activeOpacity!==1){this._shapes.forEach(function(e){return e.active(t)});if(this._legend)this._legendClass.active(t)}return this}},{key:"aggs",value:function e(t){return arguments.length?(this._aggs=Ch(this._aggs,t),this):this._aggs}},{key:"ariaHidden",value:function e(t){return arguments.length?(this._ariaHidden=t,this):this._ariaHidden}},{key:"attribution",value:function e(t){return arguments.length?(this._attribution=t,this):this._attribution}},{key:"attributionStyle",value:function e(t){return arguments.length?(this._attributionStyle=Ch(this._attributionStyle,t),this):this._attributionStyle}},{key:"backConfig",value:function e(t){return arguments.length?(this._backConfig=Ch(this._backConfig,t),this):this._backConfig}},{key:"cache",value:function e(t){return arguments.length?(this._cache=t,this):this._cache}},{key:"color",value:function e(t){return arguments.length?(this._color=!t||typeof t==="function"?t:wh(t),this):this._color}},{key:"colorScale",value:function e(t){return arguments.length?(this._colorScale=!t||typeof t==="function"?t:wh(t),this):this._colorScale}},{key:"colorScaleConfig",value:function e(t){return arguments.length?(this._colorScaleConfig=Ch(this._colorScaleConfig,t),this):this._colorScaleConfig}},{key:"colorScalePadding",value:function e(t){return arguments.length?(this._colorScalePadding=typeof t==="function"?t:Dx(t),this):this._colorScalePadding}},{key:"colorScalePosition",value:function e(t){return arguments.length?(this._colorScalePosition=t,this):this._colorScalePosition}},{key:"colorScaleMaxSize",value:function e(t){return arguments.length?(this._colorScaleMaxSize=t,this):this._colorScaleMaxSize}},{key:"controls",value:function e(t){return arguments.length?(this._controls=t,this):this._controls}},{key:"controlConfig",value:function e(t){return arguments.length?(this._controlConfig=Ch(this._controlConfig,t),this):this._controlConfig}},{key:"controlPadding",value:function e(t){return arguments.length?(this._controlPadding=typeof t==="function"?t:Dx(t),this):this._controlPadding}},{key:"data",value:function e(t,n){if(arguments.length){vB.bind(this)(t,n,"data");this._hidden=[];this._solo=[];return this}return this._data}},{key:"dataCutoff",value:function e(t){return arguments.length?(this._dataCutoff=t,this):this._dataCutoff}},{key:"depth",value:function e(t){return arguments.length?(this._depth=t,this):this._depth}},{key:"detectResize",value:function e(t){return arguments.length?(this._detectResize=t,this):this._detectResize}},{key:"detectResizeDelay",value:function e(t){return arguments.length?(this._detectResizeDelay=t,this):this._detectResizeDelay}},{key:"detectVisible",value:function e(t){return arguments.length?(this._detectVisible=t,this):this._detectVisible}},{key:"detectVisibleInterval",value:function e(t){return arguments.length?(this._detectVisibleInterval=t,this):this._detectVisibleInterval}},{key:"discrete",value:function e(t){return arguments.length?(this._discrete=t,this):this._discrete}},{key:"downloadButton",value:function e(t){return arguments.length?(this._downloadButton=t,this):this._downloadButton}},{key:"downloadConfig",value:function e(t){return arguments.length?(this._downloadConfig=Ch(this._downloadConfig,t),this):this._downloadConfig}},{key:"downloadPosition",value:function e(t){return arguments.length?(this._downloadPosition=t,this):this._downloadPosition}},{key:"duration",value:function e(t){return arguments.length?(this._duration=t,this):this._duration}},{key:"filter",value:function e(t){return arguments.length?(this._filter=t,this):this._filter}},{key:"groupBy",value:function e(t){var n=this;if(!arguments.length)return this._groupBy;if(!(t instanceof Array))t=[t];return this._groupBy=t.map(function(e){if(typeof e==="function")return e;else{if(!n._aggs[e]){n._aggs[e]=function(e,t){var n=zx(e.map(t));return n.length===1?n[0]:n}}return wh(e)}}),this}},{key:"height",value:function e(t){return arguments.length?(this._height=t,this):this._height}},{key:"hiddenColor",value:function e(t){return arguments.length?(this._hiddenColor=typeof t==="function"?t:Dx(t),this):this._hiddenColor}},{key:"hiddenOpacity",value:function e(t){return arguments.length?(this._hiddenOpacity=typeof t==="function"?t:Dx(t),this):this._hiddenOpacity}},{key:"hover",value:function e(t){var i=this;var n=this._hover=t;if(this._shapeConfig.hoverOpacity!==1){if(typeof t==="function"){var a=_e(this._shapes.map(function(e){return e.data()}));a=a.concat(this._legendClass.data());var r=t?a.filter(t):[];var o=[];r.map(this._ids).forEach(function(e){for(var t=1;t<=e.length;t++){o.push(JSON.stringify(e.slice(0,t)))}});o=o.filter(function(e,t){return o.indexOf(e)===t});if(o.length)n=function e(t,n){return o.includes(JSON.stringify(i._ids(t,n)))}}this._shapes.forEach(function(e){return e.hover(n)});if(this._legend)this._legendClass.hover(n)}return this}},{key:"label",value:function e(t){return arguments.length?(this._label=typeof t==="function"?t:Dx(t),this):this._label}},{key:"legend",value:function e(t){return arguments.length?(this._legend=t,this):this._legend}},{key:"legendConfig",value:function e(t){return arguments.length?(this._legendConfig=Ch(this._legendConfig,t),this):this._legendConfig}},{key:"legendCutoff",value:function e(t){return arguments.length?(this._legendCutoff=t,this):this._legendCutoff}},{key:"legendTooltip",value:function e(t){return arguments.length?(this._legendTooltip=Ch(this._legendTooltip,t),this):this._legendTooltip}},{key:"legendPadding",value:function e(t){return arguments.length?(this._legendPadding=typeof t==="function"?t:Dx(t),this):this._legendPadding}},{key:"legendPosition",value:function e(t){return arguments.length?(this._legendPosition=t,this):this._legendPosition}},{key:"legendSort",value:function e(t){return arguments.length?(this._legendSort=t,this):this._legendSort}},{key:"loadingHTML",value:function e(t){return arguments.length?(this._loadingHTML=typeof t==="function"?t:Dx(t),this):this._loadingHTML}},{key:"loadingMessage",value:function e(t){return arguments.length?(this._loadingMessage=t,this):this._loadingMessage}},{key:"messageMask",value:function e(t){return arguments.length?(this._messageMask=t,this):this._messageMask}},{key:"messageStyle",value:function e(t){return arguments.length?(this._messageStyle=Ch(this._messageStyle,t),this):this._messageStyle}},{key:"noDataHTML",value:function e(t){return arguments.length?(this._noDataHTML=typeof t==="function"?t:Dx(t),this):this._noDataHTML}},{key:"noDataMessage",value:function e(t){return arguments.length?(this._noDataMessage=t,this):this._noDataMessage}},{key:"scrollContainer",value:function e(t){return arguments.length?(this._scrollContainer=t,this):this._scrollContainer}},{key:"select",value:function e(t){return arguments.length?(this._select=Rl(t),this):this._select}},{key:"shape",value:function e(t){return arguments.length?(this._shape=typeof t==="function"?t:Dx(t),this):this._shape}},{key:"shapeConfig",value:function e(t){return arguments.length?(this._shapeConfig=Ch(this._shapeConfig,t),this):this._shapeConfig}},{key:"svgDesc",value:function e(t){return arguments.length?(this._svgDesc=t,this):this._svgDesc}},{key:"svgTitle",value:function e(t){return arguments.length?(this._svgTitle=t,this):this._svgTitle}},{key:"threshold",value:function e(t){if(arguments.length){if(typeof t==="function"){this._threshold=t}else if(isFinite(t)&&!isNaN(t)){this._threshold=Dx(t*1)}return this}else return this._threshold}},{key:"thresholdKey",value:function e(t){if(arguments.length){if(typeof t==="function"){this._thresholdKey=t}else{this._thresholdKey=wh(t)}return this}else return this._thresholdKey}},{key:"thresholdName",value:function e(t){return arguments.length?(this._thresholdName=typeof t==="function"?t:Dx(t),this):this._thresholdName}},{key:"time",value:function e(t){if(arguments.length){if(typeof t==="function"){this._time=t}else{this._time=wh(t);if(!this._aggs[t]){this._aggs[t]=function(e,t){var n=zx(e.map(t));return n.length===1?n[0]:n}}}this._timeFilter=false;return this}else return this._time}},{key:"timeFilter",value:function e(t){return arguments.length?(this._timeFilter=t,this):this._timeFilter}},{key:"timeline",value:function e(t){return arguments.length?(this._timeline=t,this):this._timeline}},{key:"timelineConfig",value:function e(t){return arguments.length?(this._timelineConfig=Ch(this._timelineConfig,t),this):this._timelineConfig}},{key:"timelinePadding",value:function e(t){return arguments.length?(this._timelinePadding=typeof t==="function"?t:Dx(t),this):this._timelinePadding}},{key:"title",value:function e(t){return arguments.length?(this._title=typeof t==="function"?t:Dx(t),this):this._title}},{key:"titleConfig",value:function e(t){return arguments.length?(this._titleConfig=Ch(this._titleConfig,t),this):this._titleConfig}},{key:"titlePadding",value:function e(t){return arguments.length?(this._titlePadding=typeof t==="function"?t:Dx(t),this):this._titlePadding}},{key:"tooltip",value:function e(t){return arguments.length?(this._tooltip=typeof t==="function"?t:Dx(t),this):this._tooltip}},{key:"tooltipConfig",value:function e(t){return arguments.length?(this._tooltipConfig=Ch(this._tooltipConfig,t),this):this._tooltipConfig}},{key:"total",value:function e(t){if(arguments.length){if(typeof t==="function")this._total=t;else if(t)this._total=wh(t);else this._total=false;return this}else return this._total}},{key:"totalConfig",value:function e(t){return arguments.length?(this._totalConfig=Ch(this._totalConfig,t),this):this._totalConfig}},{key:"totalFormat",value:function e(t){return arguments.length?(this._totalFormat=t,this):this._totalFormat}},{key:"totalPadding",value:function e(t){return arguments.length?(this._totalPadding=typeof t==="function"?t:Dx(t),this):this._totalPadding}},{key:"width",value:function e(t){return arguments.length?(this._width=t,this):this._width}},{key:"zoom",value:function e(t){return arguments.length?(this._zoom=t,this):this._zoom}},{key:"zoomBrushHandleSize",value:function e(t){return arguments.length?(this._zoomBrushHandleSize=t,this):this._zoomBrushHandleSize}},{key:"zoomBrushHandleStyle",value:function e(t){return arguments.length?(this._zoomBrushHandleStyle=t,this):this._zoomBrushHandleStyle}},{key:"zoomBrushSelectionStyle",value:function e(t){return arguments.length?(this._zoomBrushSelectionStyle=t,this):this._zoomBrushSelectionStyle}},{key:"zoomControlStyle",value:function e(t){return arguments.length?(this._zoomControlStyle=t,this):this._zoomControlStyle}},{key:"zoomControlStyleActive",value:function e(t){return arguments.length?(this._zoomControlStyleActive=t,this):this._zoomControlStyleActive}},{key:"zoomControlStyleHover",value:function e(t){return arguments.length?(this._zoomControlStyleHover=t,this):this._zoomControlStyleHover}},{key:"zoomFactor",value:function e(t){return arguments.length?(this._zoomFactor=t,this):this._zoomFactor}},{key:"zoomMax",value:function e(t){return arguments.length?(this._zoomMax=t,this):this._zoomMax}},{key:"zoomPan",value:function e(t){return arguments.length?(this._zoomPan=t,this):this._zoomPan}},{key:"zoomPadding",value:function e(t){return arguments.length?(this._zoomPadding=t,this):this._zoomPadding}},{key:"zoomScroll",value:function e(t){return arguments.length?(this._zoomScroll=t,this):this._zoomScroll}}]);return n}(Tx);var tj=function(e){"use strict";_inherits2(Y,e);var t=_createSuper2(Y);function Y(){var u;_classCallCheck2(this,Y);u=t.call(this);u._links=[];u._linkSize=Dx(1);u._linkSizeMin=1;u._linkSizeScale="sqrt";u._noDataMessage=false;u._nodes=[];u._on["click.shape"]=function(e,t){u._tooltipClass.data([]).render();if(u._hover&&u._drawDepth>=u._groupBy.length-1){var n="".concat(u._nodeGroupBy&&u._nodeGroupBy[u._drawDepth](e,t)?u._nodeGroupBy[u._drawDepth](e,t):u._id(e,t));if(u._focus&&u._focus===n){u.active(false);u._on.mouseenter.bind(_assertThisInitialized2(u))(e,t);u._focus=undefined;u._zoomToBounds(null)}else{u.hover(false);var i=u._linkLookup[n],a=u._nodeLookup[n];var r=[n];var o=[a.x-a.r,a.x+a.r],s=[a.y-a.r,a.y+a.r];i.forEach(function(e){r.push(e.id);if(e.x-e.ro[1])o[1]=e.x+e.r;if(e.y-e.rs[1])s[1]=e.y+e.r});u.active(function(e,t){if(e.source&&e.target)return e.source.id===n||e.target.id===n;else return r.includes("".concat(u._ids(e,t)[u._drawDepth]))});u._focus=n;var l=ch(u._container.node());o=o.map(function(e){return e*l.k+l.x});s=s.map(function(e){return e*l.k+l.y});u._zoomToBounds([[o[0],s[0]],[o[1],s[1]]])}}};u._on["click.legend"]=function(e,t){var n=u._id(e);var i=u._ids(e);i=i[i.length-1];if(u._hover&&u._drawDepth>=u._groupBy.length-1){if(u._focus&&u._focus===n){u.active(false);u._focus=undefined;u._zoomToBounds(null)}else{u.hover(false);var a=n.map(function(e){return u._nodeLookup[e]});var r=["".concat(i)];var o=[a[0].x-a[0].r,a[0].x+a[0].r],s=[a[0].y-a[0].r,a[0].y+a[0].r];a.forEach(function(e){r.push(e.id);if(e.x-e.ro[1])o[1]=e.x+e.r;if(e.y-e.rs[1])s[1]=e.y+e.r});u.active(function(e,t){if(e.source&&e.target)return r.includes(e.source.id)&&r.includes(e.target.id);else{var n=u._ids(e,t);return r.includes("".concat(n[n.length-1]))}});u._focus=n;var l=ch(u._container.node());o=o.map(function(e){return e*l.k+l.x});s=s.map(function(e){return e*l.k+l.y});u._zoomToBounds([[o[0],s[0]],[o[1],s[1]]])}u._on.mouseenter.bind(_assertThisInitialized2(u))(e,t);u._on["mousemove.legend"].bind(_assertThisInitialized2(u))(e,t)}};u._on.mouseenter=function(){};u._on["mouseleave.shape"]=function(){u.hover(false)};var l=u._on["mousemove.shape"];u._on["mousemove.shape"]=function(e,t){l(e,t);var n="".concat(u._nodeGroupBy&&u._nodeGroupBy[u._drawDepth](e,t)?u._nodeGroupBy[u._drawDepth](e,t):u._id(e,t)),i=u._linkLookup[n]||[],a=u._nodeLookup[n];var r=[n];var o=[a.x-a.r,a.x+a.r],s=[a.y-a.r,a.y+a.r];i.forEach(function(e){r.push(e.id);if(e.x-e.ro[1])o[1]=e.x+e.r;if(e.y-e.rs[1])s[1]=e.y+e.r});u.hover(function(e,t){if(e.source&&e.target)return e.source.id===n||e.target.id===n;else return r.includes("".concat(u._ids(e,t)[u._drawDepth]))})};u._sizeMin=5;u._sizeScale="sqrt";u._shape=Dx("Circle");u._shapeConfig=Ch(u._shapeConfig,{ariaLabel:function e(t,n){var i=u._size?", ".concat(u._size(t,n)):"";return"".concat(u._drawLabel(t,n)).concat(i,".")},labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee"}});u._x=wh("x");u._y=wh("y");u._zoom=true;return u}_createClass2(Y,[{key:"_draw",value:function e(t){var a=this;_get2(_getPrototypeOf2(Y.prototype),"_draw",this).call(this,t);var n=this._height-this._margin.top-this._margin.bottom,i="translate(".concat(this._margin.left,", ").concat(this._margin.top,")"),r=this._transition,o=this._width-this._margin.left-this._margin.right;var s=this._filteredData.reduce(function(e,t,n){e[a._id(t,n)]=t;return e},{});var l=this._nodes.reduce(function(e,t,n){e[a._nodeGroupBy?a._nodeGroupBy[a._drawDepth](t,n):t.id]=t;return e},{});l=Array.from(new Set(Object.keys(s).concat(Object.keys(l)))).map(function(e,t){var n=s[e],i=l[e];if(i===undefined)return false;return{__d3plus__:true,data:n||i,i:t,id:e,fx:n!==undefined&&!isNaN(a._x(n))?a._x(n):a._x(i),fy:n!==undefined&&!isNaN(a._y(n))?a._y(n):a._y(i),node:i,r:a._size?n!==undefined&&a._size(n)!==undefined?a._size(n):a._size(i):a._sizeMin,shape:n!==undefined&&a._shape(n)!==undefined?a._shape(n):a._shape(i)}}).filter(function(e){return e});var u=this._nodeLookup=l.reduce(function(e,t){e[t.id]=t;return e},{});var h=l.map(function(e){return e.node});var c=this._links.map(function(e){var t=_typeof2(e.source);return{size:a._linkSize(e),source:t==="number"?l[h.indexOf(a._nodes[e.source])]:t==="string"?u[e.source]:u[e.source.id],target:t==="number"?l[h.indexOf(a._nodes[e.target])]:t==="string"?u[e.target]:u[e.target.id]}});this._linkLookup=c.reduce(function(e,t){if(!e[t.source.id])e[t.source.id]=[];e[t.source.id].push(t.target);if(!e[t.target.id])e[t.target.id]=[];e[t.target.id].push(t.source);return e},{});var f=l.some(function(e){return e.fx===undefined||e.fy===undefined});if(f){var d=Bi().domain(Fe(c,function(e){return e.size})).range([.1,.5]);var g=De().force("link",Q(c).id(function(e){return e.id}).distance(1).strength(function(e){return d(e.size)}).iterations(4)).force("charge",Oe().strength(-1)).stop();var p=300;var v=.001;var m=1-Math.pow(v,1/p);g.velocityDecay(0);g.alphaMin(v);g.alphaDecay(m);g.alphaDecay(0);g.nodes(l);g.tick(p).stop();var y=l.map(function(e){return[e.vx,e.vy]});var _=0,b=0,w=0;if(y.length===2){_=100}else if(y.length>2){var x=Ke(y);var k=TR(x,{verbose:true});_=k.angle;b=k.cx;w=k.cy}l.forEach(function(e){var t=gR([e.vx,e.vy],-1*(Math.PI/180*_),[b,w]);e.fx=t[0];e.fy=t[1]})}var S=Fe(l.map(function(e){return e.fx})),C=Fe(l.map(function(e){return e.fy}));var E=Bi().domain(S).range([0,o]),A=Bi().domain(C).range([0,n]);var R=(S[1]-S[0])/(C[1]-C[0])||1,M=o/n;if(R>M){var T=n*M/R;A.range([(n-T)/2,n-(n-T)/2])}else{var B=o*R/M;E.range([(o-B)/2,o-(o-B)/2])}l.forEach(function(e){e.x=E(e.fx);e.y=A(e.fy)});var N=Fe(l.map(function(e){return e.r}));var P=this._sizeMax||me([1,je(_e(l.map(function(t){return l.map(function(e){return t===e?null:CA([t.x,t.y],[e.x,e.y])})})))/2]);var D=Fo["scale".concat(this._sizeScale.charAt(0).toUpperCase()).concat(this._sizeScale.slice(1))]().domain(N).range([N[0]===N[1]?P:je([P/2,this._sizeMin]),P]),O=E.domain(),z=A.domain();var F=O[1]-O[0],L=z[1]-z[0];l.forEach(function(e){var t=D(e.r);if(O[0]>E.invert(e.x-t))O[0]=E.invert(e.x-t);if(O[1]A.invert(e.y-t))z[0]=A.invert(e.y-t);if(z[1]M?o:n)/2;l.forEach(function(e){e.x=E(e.fx);e.fx=e.x;e.y=A(e.fy);e.fy=e.y;e.r=D(e.r)||H;e.width=e.r*2;e.height=e.r*2});this._container=this._select.selectAll("svg.d3plus-network").data([0]);this._container=this._container.enter().append("svg").attr("class","d3plus-network").attr("opacity",0).attr("width",o).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top).style("background-color","transparent").merge(this._container);this._container.transition(this._transition).attr("opacity",1).attr("width",o).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top);var V=this._container.selectAll("rect.d3plus-network-hitArea").data([0]);V.enter().append("rect").attr("class","d3plus-network-hitArea").merge(V).attr("width",o).attr("height",n).attr("fill","transparent").on("click",function(){if(a._focus){a.active(false);a._focus=undefined;a._zoomToBounds(null)}});this._zoomGroup=this._container.selectAll("g.d3plus-network-zoomGroup").data([0]);var G=this._zoomGroup=this._zoomGroup.enter().append("g").attr("class","d3plus-network-zoomGroup").merge(this._zoomGroup);var U=Fe(c,function(e){return e.size});if(U[0]!==U[1]){var W=Fo["scale".concat(this._linkSizeScale.charAt(0).toUpperCase()).concat(this._linkSizeScale.slice(1))]().domain(U).range([this._linkSizeMin,D.range()[0]]);c.forEach(function(e){e.size=W(e.size)})}var K=Px.bind(this)(this._shapeConfig,"edge","Path");delete K.on;this._shapes.push((new zT).config(K).strokeWidth(function(e){return e.size}).activeStyle({"stroke-width":function e(t){return t.size}}).d(function(e){return"M".concat(e.source.x,",").concat(e.source.y," ").concat(e.target.x,",").concat(e.target.y)}).data(c).select(Ox("g.d3plus-network-links",{parent:G,transition:r,enter:{transform:i},update:{transform:i}}).node()).render());var q={label:function e(t){return l.length<=a._dataCutoff||a._hover&&a._hover(t)||a._active&&a._active(t)?a._drawLabel(t.data||t.node,t.i):false},select:Ox("g.d3plus-network-nodes",{parent:G,transition:r,enter:{transform:i},update:{transform:i}}).node()};X().key(function(e){return e.shape}).entries(l).forEach(function(e){a._shapes.push((new FT[e.key]).config(Px.bind(a)(a._shapeConfig,"shape",e.key)).config(q).config(q[e.key]||{}).data(e.values).render())});return this}},{key:"hover",value:function e(t){this._hover=t;if(this._nodes.lengtho[1])o[1]=e.x+e.r;if(e.y-e.rs[1])s[1]=e.y+e.r});l.hover(function(e,t){if(e.source&&e.target)return e.source.id===a.id||e.target.id===a.id;else return r.includes(l._ids(e,t)[l._drawDepth])})}};l._on["click.shape"]=function(e){l._center=e.id;l._margin={bottom:0,left:0,right:0,top:0};l._padding={bottom:0,left:0,right:0,top:0};l._draw()};l._sizeMin=5;l._sizeScale="sqrt";l._shape=Dx("Circle");l._shapeConfig=Ch(l._shapeConfig,{ariaLabel:function e(t,n){var i=l._size?", ".concat(l._size(t,n)):"";return"".concat(l._drawLabel(t,n)).concat(i,".")},labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee",strokeWidth:1}});return l}_createClass2(L,[{key:"_draw",value:function e(t){var u=this;_get2(_getPrototypeOf2(L.prototype),"_draw",this).call(this,t);var a=this._filteredData.reduce(function(e,t,n){e[u._id(t,n)]=t;return e},{});var h=this._nodes;if(!this._nodes.length&&this._links.length){var n=Array.from(new Set(this._links.reduce(function(e,t){return e.concat([t.source,t.target])},[])));h=n.map(function(e){return _typeof2(e)==="object"?e:{id:e}})}h=h.reduce(function(e,t,n){e[u._nodeGroupBy?u._nodeGroupBy[u._drawDepth](t,n):u._id(t,n)]=t;return e},{});h=Array.from(new Set(Object.keys(a).concat(Object.keys(h)))).map(function(e,t){var n=a[e],i=h[e];if(i===undefined)return false;return{__d3plus__:true,data:n||i,i:t,id:e,node:i,shape:n!==undefined&&u._shape(n)!==undefined?u._shape(n):u._shape(i)}}).filter(function(e){return e});var i=this._nodeLookup=h.reduce(function(e,t){e[t.id]=t;return e},{});var r=this._links.map(function(n){var e=["source","target"];var t=e.reduce(function(e,t){e[t]=typeof n[t]==="number"?h[n[t]]:i[n[t].id||n[t]];return e},{});t.size=u._linkSize(n);return t});var o=r.reduce(function(e,t){if(!e[t.source.id]){e[t.source.id]=[]}e[t.source.id].push(t);if(!e[t.target.id]){e[t.target.id]=[]}e[t.target.id].push(t);return e},{});var c=this._height-this._margin.top-this._margin.bottom,s="translate(".concat(this._margin.left,", ").concat(this._margin.top,")"),l=this._transition,f=this._width-this._margin.left-this._margin.right;var d=[],g=je([c,f])/2,p=g/3;var v=p,m=p*2;var y=i[this._center];y.x=f/2;y.y=c/2;y.r=this._sizeMin?me([this._sizeMin,v*.65]):this._sizeMax?je([this._sizeMax,v*.65]):v*.65;var _=[y],b=[];o[this._center].forEach(function(e){var t=e.source.id===u._center?e.target:e.source;t.edges=o[t.id].filter(function(e){return e.source.id!==u._center||e.target.id!==u._center});t.edge=e;_.push(t);b.push(t)});b.sort(function(e,t){return e.edges.length-t.edges.length});var w=[];var x=0;b.forEach(function(e){var a=e.id;e.edges=e.edges.filter(function(e){return!_.includes(e.source)&&e.target.id===a||!_.includes(e.target)&&e.source.id===a});x+=e.edges.length||1;e.edges.forEach(function(e){var t=e.source,n=e.target;var i=n.id===a?t:n;_.push(i)})});var k=Math.PI*2;var S=0;b.forEach(function(r,e){var o=r.edges.length||1;var t=k/x*o;if(e===0){S-=t/2}var s=S+t/2-k/4;r.radians=s;r.x=f/2+v*Math.cos(s);r.y=c/2+v*Math.sin(s);S+=t;r.edges.forEach(function(e,t){var n=e.source.id===r.id?e.target:e.source;var i=k/x;var a=s-i*o/2+i/2+i*t;n.radians=a;n.x=f/2+m*Math.cos(a);n.y=c/2+m*Math.sin(a);w.push(n)})});var C=p/2;var E=p/4;var A=C/2-4;if(C/2-4<8){A=je([C/2,8])}var R=E/2-4;if(E/2-4<4){R=je([E/2,4])}if(R>p/10){R=p/10}if(R>A&&R>10){R=A*.75}if(A>R*1.5){A=R*1.5}A=Math.floor(A);R=Math.floor(R);var M;if(this._size){var T=Fe(a,function(e){return e.size});if(T[0]===T[1]){T[0]=0}M=Bi().domain(T).rangeRound([3,je([A,R])]);var B=y.size;y.r=M(B)}else{M=Bi().domain([1,2]).rangeRound([A,R])}w.forEach(function(e){e.ring=2;var t=u._size?e.size:2;e.r=u._sizeMin?me([u._sizeMin,M(t)]):u._sizeMax?je([u._sizeMax,M(t)]):M(t)});b.forEach(function(e){e.ring=1;var t=u._size?e.size:1;e.r=u._sizeMin?me([u._sizeMin,M(t)]):u._sizeMax?je([u._sizeMax,M(t)]):M(t)});h=[y].concat(b).concat(w);b.forEach(function(l){var e=["source","target"];var n=l.edge;e.forEach(function(t){n[t]=h.find(function(e){return e.id===n[t].id})});d.push(n);o[l.id].forEach(function(i){var t=i.source.id===l.id?i.target:i.source;if(t.id!==y.id){var a=w.find(function(e){return e.id===t.id});if(!a){a=b.find(function(e){return e.id===t.id})}if(a){i.spline=true;var r=f/2;var o=c/2;var s=v+(m-v)*.5;var e=["source","target"];e.forEach(function(t,e){i["".concat(t,"X")]=i[t].x+Math.cos(i[t].ring===2?i[t].radians+Math.PI:i[t].radians)*i[t].r;i["".concat(t,"Y")]=i[t].y+Math.sin(i[t].ring===2?i[t].radians+Math.PI:i[t].radians)*i[t].r;i["".concat(t,"BisectX")]=r+s*Math.cos(i[t].radians);i["".concat(t,"BisectY")]=o+s*Math.sin(i[t].radians);i[t]=h.find(function(e){return e.id===i[t].id});if(i[t].edges===undefined)i[t].edges={};var n=e===0?i.target.id:i.source.id;if(i[t].id===l.id){i[t].edges[n]={angle:l.radians+Math.PI,radius:p/2}}else{i[t].edges[n]={angle:a.radians,radius:p/2}}});d.push(i)}}})});h.forEach(function(e){if(e.id!==u._center){var t=u._shapeConfig.labelConfig.fontSize&&u._shapeConfig.labelConfig.fontSize(e)||11;var n=t*1.4;var i=n*2;var a=5;var r=p-e.r;var o=e.radians*(180/Math.PI);var s=e.r+a;var l="start";if(o<-90||o>90){s=-e.r-r-a;l="end";o+=180}e.labelBounds={x:s,y:-n/2,width:r,height:i};e.rotate=o;e.textAnchor=l}else{e.labelBounds={x:-v/2,y:-v/2,width:v,height:v}}});this._linkLookup=r.reduce(function(e,t){if(!e[t.source.id])e[t.source.id]=[];e[t.source.id].push(t.target);if(!e[t.target.id])e[t.target.id]=[];e[t.target.id].push(t.source);return e},{});var N=Fe(r,function(e){return e.size});if(N[0]!==N[1]){var P=je(h,function(e){return e.r});var D=Fo["scale".concat(this._linkSizeScale.charAt(0).toUpperCase()).concat(this._linkSizeScale.slice(1))]().domain(N).range([this._linkSizeMin,P]);r.forEach(function(e){e.size=D(e.size)})}var O=Px.bind(this)(this._shapeConfig,"edge","Path");delete O.on;this._shapes.push((new zT).config(O).strokeWidth(function(e){return e.size}).id(function(e){return"".concat(e.source.id,"_").concat(e.target.id)}).d(function(e){return e.spline?"M".concat(e.sourceX,",").concat(e.sourceY,"C").concat(e.sourceBisectX,",").concat(e.sourceBisectY," ").concat(e.targetBisectX,",").concat(e.targetBisectY," ").concat(e.targetX,",").concat(e.targetY):"M".concat(e.source.x,",").concat(e.source.y," ").concat(e.target.x,",").concat(e.target.y)}).data(d).select(Ox("g.d3plus-rings-links",{parent:this._select,transition:l,enter:{transform:s},update:{transform:s}}).node()).render());var z=this;var F={label:function e(t){return h.length<=u._dataCutoff||u._hover&&u._hover(t)||u._active&&u._active(t)?u._drawLabel(t.data||t.node,t.i):false},labelBounds:function e(t){return t.labelBounds},labelConfig:{fontColor:function e(t){return t.id===u._center?Px.bind(z)(z._shapeConfig,"shape",t.key).labelConfig.fontColor(t):sS(Px.bind(z)(z._shapeConfig,"shape",t.key).fill(t))},fontResize:function e(t){return t.id===u._center},padding:0,textAnchor:function e(t){return i[t.id].textAnchor||Px.bind(z)(z._shapeConfig,"shape",t.key).labelConfig.textAnchor},verticalAlign:function e(t){return t.id===u._center?"middle":"top"}},rotate:function e(t){return i[t.id].rotate||0},select:Ox("g.d3plus-rings-nodes",{parent:this._select,transition:l,enter:{transform:s},update:{transform:s}}).node()};X().key(function(e){return e.shape}).entries(h).forEach(function(e){u._shapes.push((new FT[e.key]).config(Px.bind(u)(u._shapeConfig,"shape",e.key)).config(F).data(e.values).render())});return this}},{key:"center",value:function e(t){return arguments.length?(this._center=t,this):this._center}},{key:"hover",value:function e(t){this._hover=t;this._shapes.forEach(function(e){return e.hover(t)});if(this._legend)this._legendClass.hover(t);return this}},{key:"links",value:function e(t,n){if(arguments.length){vB.bind(this)(t,n,"links");return this}return this._links}},{key:"linkSize",value:function e(t){return arguments.length?(this._linkSize=typeof t==="function"?t:Dx(t),this):this._linkSize}},{key:"linkSizeMin",value:function e(t){return arguments.length?(this._linkSizeMin=t,this):this._linkSizeMin}},{key:"linkSizeScale",value:function e(t){return arguments.length?(this._linkSizeScale=t,this):this._linkSizeScale}},{key:"nodeGroupBy",value:function e(t){var n=this;if(!arguments.length)return this._nodeGroupBy;if(!(t instanceof Array))t=[t];return this._nodeGroupBy=t.map(function(e){if(typeof e==="function")return e;else{if(!n._aggs[e]){n._aggs[e]=function(e,t){var n=Array.from(new Set(e.map(t)));return n.length===1?n[0]:n}}return wh(e)}}),this}},{key:"nodes",value:function e(t,n){if(arguments.length){vB.bind(this)(t,n,"nodes");return this}return this._nodes}},{key:"size",value:function e(t){return arguments.length?(this._size=typeof t==="function"||!t?t:wh(t),this):this._size}},{key:"sizeMax",value:function e(t){return arguments.length?(this._sizeMax=t,this):this._sizeMax}},{key:"sizeMin",value:function e(t){return arguments.length?(this._sizeMin=t,this):this._sizeMin}},{key:"sizeScale",value:function e(t){return arguments.length?(this._sizeScale=t,this):this._sizeScale}}]);return L}(ej);function ij(e){return e.target.depth}function aj(e){return e.depth}function rj(e,t){return t-1-e.height}function oj(e,t){return e.sourceLinks.length?e.depth:t-1}function sj(e){return e.targetLinks.length?e.depth:e.sourceLinks.length?je(e.sourceLinks,ij)-1:0}function lj(e){return function(){return e}}function uj(e,t){return cj(e.source,t.source)||e.index-t.index}function hj(e,t){return cj(e.target,t.target)||e.index-t.index}function cj(e,t){return e.y0-t.y0}function fj(e){return e.value}function dj(e){return e.index}function gj(e){return e.nodes}function pj(e){return e.links}function vj(e,t){var n=e.get(t);if(!n)throw new Error("missing: "+t);return n}function mj(){var o=0,c=0,s=1,f=1,l=24,d=8,t=dj,u=oj,g,p,n=gj,i=pj,v=6;function a(){var e={nodes:n.apply(null,arguments),links:i.apply(null,arguments)};r(e);h(e);m(e);y(e);b(e);return e}a.update=function(e){b(e);return e};a.nodeId=function(e){return arguments.length?(t=typeof e==="function"?e:lj(e),a):t};a.nodeAlign=function(e){return arguments.length?(u=typeof e==="function"?e:lj(e),a):u};a.nodeSort=function(e){return arguments.length?(g=e,a):g};a.nodeWidth=function(e){return arguments.length?(l=+e,a):l};a.nodePadding=function(e){return arguments.length?(d=+e,a):d};a.nodes=function(e){return arguments.length?(n=typeof e==="function"?e:lj(e),a):n};a.links=function(e){return arguments.length?(i=typeof e==="function"?e:lj(e),a):i};a.linkSort=function(e){return arguments.length?(p=e,a):p};a.size=function(e){return arguments.length?(o=c=0,s=+e[0],f=+e[1],a):[s-o,f-c]};a.extent=function(e){return arguments.length?(o=+e[0][0],s=+e[1][0],c=+e[0][1],f=+e[1][1],a):[[o,c],[s,f]]};a.iterations=function(e){return arguments.length?(v=+e,a):v};function r(e){e.nodes.forEach(function(e,t){e.index=t;e.sourceLinks=[];e.targetLinks=[]});var a=E(e.nodes,t);e.links.forEach(function(e,t){e.index=t;var n=e.source,i=e.target;if(_typeof2(n)!=="object")n=e.source=vj(a,n);if(_typeof2(i)!=="object")i=e.target=vj(a,i);n.sourceLinks.push(e);i.targetLinks.push(e)})}function h(e){e.nodes.forEach(function(e){e.value=Math.max(O(e.sourceLinks,fj),O(e.targetLinks,fj))})}function m(e){var t,n,i,a=e.nodes.length;for(t=e.nodes,n=[],i=0;t.length;++i,t=n,n=[]){if(i>a)throw new Error("circular link");t.forEach(function(e){e.depth=i;e.sourceLinks.forEach(function(e){if(n.indexOf(e.target)<0){n.push(e.target)}})})}for(t=e.nodes,n=[],i=0;t.length;++i,t=n,n=[]){if(i>a)throw new Error("circular link");t.forEach(function(e){e.height=i;e.targetLinks.forEach(function(e){if(n.indexOf(e.source)<0){n.push(e.source)}})})}var r=(s-o-l)/(i-1);e.nodes.forEach(function(e){e.layer=Math.max(0,Math.min(i-1,Math.floor(u.call(null,e,i))));e.x1=(e.x0=o+e.layer*r)+l})}function y(e){var t=X().key(function(e){return e.x0}).sortKeys(k).entries(e.nodes).map(function(e){return e.values});o();for(var n=0,i=v;n0))return;var u=(t/n-e.y0)*h;e.y0+=u;e.y1+=u})})}function l(h){t.slice(0,-1).reverse().forEach(function(e){e.forEach(function(e){var t=0;var n=0;var i=_createForOfIteratorHelper(e.sourceLinks),a;try{for(i.s();!(a=i.n()).done;){var r=a.value,o=r.target,s=r.value;var l=s*(o.layer-e.layer);t+=x(e,o)*l;n+=l}}catch(e){i.e(e)}finally{i.f()}if(!(n>0))return;var u=(t/n-e.y0)*h;e.y0+=u;e.y1+=u})})}function u(o){t.forEach(function(e){var t,n,i=c,a=e.length,r;if(g===undefined)e.sort(cj);for(r=0;r1e-6)t.y0+=n,t.y1+=n;i=t.y1+d}})}function h(o){t.forEach(function(e){var t,n,i=f,a=e.length,r;if(g===undefined)e.sort(cj);for(r=a-1;r>=0;--r){t=e[r];n=(t.y1-i)*o;if(n>1e-6)t.y0-=n,t.y1-=n;i=t.y0-d}})}}function _(e){if(p===undefined)e.nodes.forEach(function(e){e.sourceLinks.sort(hj);e.targetLinks.sort(uj)})}function b(e){_(e);e.nodes.forEach(function(e){var t=e.y0,n=t;e.sourceLinks.forEach(function(e){e.y0=t+e.width/2,t+=e.width});e.targetLinks.forEach(function(e){e.y1=n+e.width/2,n+=e.width})})}function w(e,t){var n=e.y0-(e.sourceLinks.length-1)*d/2;var i=_createForOfIteratorHelper(e.sourceLinks),a;try{for(i.s();!(a=i.n()).done;){var r=a.value,o=r.target,s=r.width;if(o===t)break;n+=s+d}}catch(e){i.e(e)}finally{i.f()}var l=_createForOfIteratorHelper(t.targetLinks),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,c=h.source,f=h.width;if(c===e)break;n-=f}}catch(e){l.e(e)}finally{l.f()}return n}function x(e,t){var n=t.y0-(t.targetLinks.length-1)*d/2;var i=_createForOfIteratorHelper(t.targetLinks),a;try{for(i.s();!(a=i.n()).done;){var r=a.value,o=r.source,s=r.width;if(o===e)break;n+=s+d}}catch(e){i.e(e)}finally{i.f()}var l=_createForOfIteratorHelper(e.sourceLinks),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,c=h.target,f=h.width;if(c===t)break;n-=f}}catch(e){l.e(e)}finally{l.f()}return n}return a}function yj(e){return[e.source.x1,e.y0]}function _j(e){return[e.target.x0,e.y1]}function bj(){return oC().source(yj).target(_j)}var wj={center:sj,justify:oj,left:aj,right:rj};var xj=function(e){"use strict";_inherits2(h,e);var t=_createSuper2(h);function h(){var s;_classCallCheck2(this,h);s=t.call(this);s._nodeId=wh("id");s._links=wh("links");s._linksSource="source";s._linksTarget="target";s._noDataMessage=false;s._nodes=wh("nodes");s._nodeAlign=wj.justify;s._nodePadding=8;s._nodeWidth=30;s._on.mouseenter=function(){};s._on["mouseleave.shape"]=function(){s.hover(false)};var l=s._on["mousemove.shape"];s._on["mousemove.shape"]=function(e,t){l(e,t);if(s._focus&&s._focus===e.id){s.hover(false);s._on.mouseenter.bind(_assertThisInitialized2(s))(e,t);s._focus=undefined}else{var n=s._nodeId(e,t),i=s._nodeLookup[n],a=Object.keys(s._nodeLookup).reduce(function(e,t){e[s._nodeLookup[t]]=!isNaN(t)?parseInt(t,10):t;return e},{});var r=s._linkLookup[i];var o=[n];r.forEach(function(e){o.push(a[e])});s.hover(function(e,t){if(e.source&&e.target){return e.source.id===n||e.target.id===n}else{return o.includes(s._nodeId(e,t))}})}};s._path=bj();s._sankey=mj();s._shape=Dx("Rect");s._shapeConfig=Ch(s._shapeConfig,{Path:{fill:"none",hoverStyle:{"stroke-width":function e(t){return Math.max(1,Math.abs(t.source.y1-t.source.y0)*(t.value/t.source.value)-2)}},label:false,stroke:"#DBDBDB",strokeOpacity:.5,strokeWidth:function e(t){return Math.max(1,Math.abs(t.source.y1-t.source.y0)*(t.value/t.source.value)-2)}},Rect:{}});s._value=Dx(1);return s}_createClass2(h,[{key:"_draw",value:function e(t){var a=this;_get2(_getPrototypeOf2(h.prototype),"_draw",this).call(this,t);var n=this._height-this._margin.top-this._margin.bottom,i=this._width-this._margin.left-this._margin.right;var r=Array.isArray(this._nodes)?this._nodes:this._links.reduce(function(e,t){if(!e.includes(t[a._linksSource]))e.push(t[a._linksSource]);if(!e.includes(t[a._linksTarget]))e.push(t[a._linksTarget]);return e},[]).map(function(e){return{id:e}});var o=r.map(function(e,t){return{__d3plus__:true,data:e,i:t,id:a._nodeId(e,t),node:e,shape:"Rect"}});var s=this._nodeLookup=o.reduce(function(e,t,n){e[t.id]=n;return e},{});var l=this._links.map(function(n,e){var t=[a._linksSource,a._linksTarget];var i=t.reduce(function(e,t){e[t]=s[n[t]];return e},{});return{source:i[a._linksSource],target:i[a._linksTarget],value:a._value(n,e)}});this._linkLookup=l.reduce(function(e,t){if(!e[t.source])e[t.source]=[];e[t.source].push(t.target);if(!e[t.target])e[t.target]=[];e[t.target].push(t.source);return e},{});var u="translate(".concat(this._margin.left,", ").concat(this._margin.top,")");this._sankey.nodeAlign(this._nodeAlign).nodePadding(this._nodePadding).nodeWidth(this._nodeWidth).nodes(o).links(l).size([i,n])();this._shapes.push((new zT).config(this._shapeConfig.Path).data(l).d(this._path).select(Ox("g.d3plus-Links",{parent:this._select,enter:{transform:u},update:{transform:u}}).node()).render());X().key(function(e){return e.shape}).entries(o).forEach(function(e){a._shapes.push((new FT[e.key]).data(e.values).height(function(e){return e.y1-e.y0}).width(function(e){return e.x1-e.x0}).x(function(e){return(e.x1+e.x0)/2}).y(function(e){return(e.y1+e.y0)/2}).select(Ox("g.d3plus-sankey-nodes",{parent:a._select,enter:{transform:u},update:{transform:u}}).node()).config(Px.bind(a)(a._shapeConfig,"shape",e.key)).render())});return this}},{key:"hover",value:function e(t){this._hover=t;this._shapes.forEach(function(e){return e.hover(t)});if(this._legend)this._legendClass.hover(t);return this}},{key:"links",value:function e(t,n){if(arguments.length){var i=this._queue.find(function(e){return e[3]==="links"});var a=[pB.bind(this),t,n,"links"];if(i)this._queue[this._queue.indexOf(i)]=a;else this._queue.push(a);return this}return this._links}},{key:"linksSource",value:function e(t){return arguments.length?(this._linksSource=t,this):this._linksSource}},{key:"linksTarget",value:function e(t){return arguments.length?(this._linksTarget=t,this):this._linksTarget}},{key:"nodeAlign",value:function e(t){return arguments.length?(this._nodeAlign=typeof t==="function"?t:wj[t],this):this._nodeAlign}},{key:"nodeId",value:function e(t){return arguments.length?(this._nodeId=typeof t==="function"?t:wh(t),this):this._nodeId}},{key:"nodes",value:function e(t,n){if(arguments.length){var i=this._queue.find(function(e){return e[3]==="nodes"});var a=[pB.bind(this),t,n,"nodes"];if(i)this._queue[this._queue.indexOf(i)]=a;else this._queue.push(a);return this}return this._nodes}},{key:"nodePadding",value:function e(t){return arguments.length?(this._nodePadding=t,this):this._nodePadding}},{key:"nodeWidth",value:function e(t){return arguments.length?(this._nodeWidth=t,this):this._nodeWidth}},{key:"value",value:function e(t){return arguments.length?(this._value=typeof t==="function"?t:wh(t),this):this._value}}]);return h}(ej);e.Network=tj;e.Rings=nj;e.Sankey=xj;Object.defineProperty(e,"__esModule",{value:true})}); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/d3plus-old.full.min.js b/plugins/additionals/assets/javascripts/d3plus-old.full.min.js deleted file mode 100644 index d35f4f8..0000000 --- a/plugins/additionals/assets/javascripts/d3plus-old.full.min.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - d3plus v2.0.0-alpha.25 - Data visualization made easy. A javascript library that extends the popular D3.js to enable fast and beautiful visualizations. - Copyright (c) 2019 D3plus - https://d3plus.org - @license MIT -*/ -(function(t){typeof define==="function"&&define.amd?define(t):t()})(function(){"use strict";var t=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};function e(t,e){return e={exports:{}},t(e,e.exports),e.exports}var n=function(t){return t&&t.Math==Math&&t};var h=n(typeof globalThis=="object"&&globalThis)||n(typeof window=="object"&&window)||n(typeof self=="object"&&self)||n(typeof t=="object"&&t)||Function("return this")();var i=function(t){try{return!!t()}catch(t){return true}};var d=!i(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7});var r={}.propertyIsEnumerable;var a=Object.getOwnPropertyDescriptor;var o=a&&!r.call({1:2},1);var s=o?function t(e){var n=a(this,e);return!!n&&n.enumerable}:r;var g={f:s};var l=function(t,e){return{enumerable:!(t&1),configurable:!(t&2),writable:!(t&4),value:e}};var u={}.toString;var c=function(t){return u.call(t).slice(8,-1)};var f="".split;var b=i(function(){return!Object("z").propertyIsEnumerable(0)})?function(t){return c(t)=="String"?f.call(t,""):Object(t)}:Object;var p=function(t){if(t==undefined)throw TypeError("Can't call method on "+t);return t};var v=function(t){return b(p(t))};var m=function(t){return typeof t==="object"?t!==null:typeof t==="function"};var y=function(t,e){if(!m(t))return t;var n,i;if(e&&typeof(n=t.toString)=="function"&&!m(i=n.call(t)))return i;if(typeof(n=t.valueOf)=="function"&&!m(i=n.call(t)))return i;if(!e&&typeof(n=t.toString)=="function"&&!m(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")};var _={}.hasOwnProperty;var w=function(t,e){return _.call(t,e)};var x=h.document;var k=m(x)&&m(x.createElement);var S=function(t){return k?x.createElement(t):{}};var C=!d&&!i(function(){return Object.defineProperty(S("div"),"a",{get:function(){return 7}}).a!=7});var E=Object.getOwnPropertyDescriptor;var A=d?E:function t(e,n){e=v(e);n=y(n,true);if(C)try{return E(e,n)}catch(t){}if(w(e,n))return l(!g.f.call(e,n),e[n])};var M={f:A};var R=function(t){if(!m(t)){throw TypeError(String(t)+" is not an object")}return t};var T=Object.defineProperty;var O=d?T:function t(e,n,i){R(e);n=y(n,true);R(i);if(C)try{return T(e,n,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");if("value"in i)e[n]=i.value;return e};var B={f:O};var P=d?function(t,e,n){return B.f(t,e,l(1,n))}:function(t,e,n){t[e]=n;return t};var N=function(e,n){try{P(h,e,n)}catch(t){h[e]=n}return n};var D="__core-js_shared__";var z=h[D]||N(D,{});var j=z;var L=e(function(t){(t.exports=function(t,e){return j[t]||(j[t]=e!==undefined?e:{})})("versions",[]).push({version:"3.4.1",mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})});var F=L("native-function-to-string",Function.toString);var I=h.WeakMap;var H=typeof I==="function"&&/native code/.test(F.call(I));var V=0;var G=Math.random();var U=function(t){return"Symbol("+String(t===undefined?"":t)+")_"+(++V+G).toString(36)};var q=L("keys");var W=function(t){return q[t]||(q[t]=U(t))};var K={};var Y=h.WeakMap;var X,$,Z;var J=function(t){return Z(t)?$(t):X(t,{})};var Q=function(n){return function(t){var e;if(!m(t)||(e=$(t)).type!==n){throw TypeError("Incompatible receiver, "+n+" required")}return e}};if(H){var tt=new Y;var et=tt.get;var nt=tt.has;var it=tt.set;X=function(t,e){it.call(tt,t,e);return e};$=function(t){return et.call(tt,t)||{}};Z=function(t){return nt.call(tt,t)}}else{var rt=W("state");K[rt]=true;X=function(t,e){P(t,rt,e);return e};$=function(t){return w(t,rt)?t[rt]:{}};Z=function(t){return w(t,rt)}}var at={set:X,get:$,has:Z,enforce:J,getterFor:Q};var ot=e(function(t){var e=at.get;var s=at.enforce;var l=String(F).split("toString");L("inspectSource",function(t){return F.call(t)});(t.exports=function(t,e,n,i){var r=i?!!i.unsafe:false;var a=i?!!i.enumerable:false;var o=i?!!i.noTargetGet:false;if(typeof n=="function"){if(typeof e=="string"&&!w(n,"name"))P(n,"name",e);s(n).source=l.join(typeof e=="string"?e:"")}if(t===h){if(a)t[e]=n;else N(e,n);return}else if(!r){delete t[e]}else if(!o&&t[e]){a=true}if(a)t[e]=n;else P(t,e,n)})(Function.prototype,"toString",function t(){return typeof this=="function"&&e(this).source||F.call(this)})});var st=h;var lt=function(t){return typeof t=="function"?t:undefined};var ut=function(t,e){return arguments.length<2?lt(st[t])||lt(h[t]):st[t]&&st[t][e]||h[t]&&h[t][e]};var ct=Math.ceil;var ht=Math.floor;var ft=function(t){return isNaN(t=+t)?0:(t>0?ht:ct)(t)};var dt=Math.min;var gt=function(t){return t>0?dt(ft(t),9007199254740991):0};var pt=Math.max;var vt=Math.min;var mt=function(t,e){var n=ft(t);return n<0?pt(n+e,0):vt(n,e)};var yt=function(s){return function(t,e,n){var i=v(t);var r=gt(i.length);var a=mt(n,r);var o;if(s&&e!=e)while(r>a){o=i[a++];if(o!=o)return true}else for(;r>a;a++){if((s||a in i)&&i[a]===e)return s||a||0}return!s&&-1}};var _t={includes:yt(true),indexOf:yt(false)};var bt=_t.indexOf;var wt=function(t,e){var n=v(t);var i=0;var r=[];var a;for(a in n)!w(K,a)&&w(n,a)&&r.push(a);while(e.length>i)if(w(n,a=e[i++])){~bt(r,a)||r.push(a)}return r};var xt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];var kt=xt.concat("length","prototype");var St=Object.getOwnPropertyNames||function t(e){return wt(e,kt)};var Ct={f:St};var Et=Object.getOwnPropertySymbols;var At={f:Et};var Mt=ut("Reflect","ownKeys")||function t(e){var n=Ct.f(R(e));var i=At.f;return i?n.concat(i(e)):n};var Rt=function(t,e){var n=Mt(e);var i=B.f;var r=M.f;for(var a=0;al;l++)if(_||l in a){h=a[l];f=o(h,l,r);if(d){if(g)c[l]=f;else if(f)switch(d){case 3:return true;case 5:return h;case 6:return l;case 2:Xt.call(c,h)}else if(m)return false}}return y?-1:v||m?m:c}};var Zt={forEach:$t(0),map:$t(1),filter:$t(2),some:$t(3),every:$t(4),find:$t(5),findIndex:$t(6)};var Jt=Object.keys||function t(e){return wt(e,xt)};var Qt=d?Object.defineProperties:function t(e,n){R(e);var i=Jt(n);var r=i.length;var a=0;var o;while(r>a)B.f(e,o=i[a++],n[o]);return e};var te=ut("document","documentElement");var ee=W("IE_PROTO");var ne="prototype";var ie=function(){};var re=function(){var t=S("iframe");var e=xt.length;var n="<";var i="script";var r=">";var a="java"+i+":";var o;t.style.display="none";te.appendChild(t);t.src=String(a);o=t.contentWindow.document;o.open();o.write(n+i+r+"document.F=Object"+n+"/"+i+r);o.close();re=o.F;while(e--)delete re[ne][xt[e]];return re()};var ae=Object.create||function t(e,n){var i;if(e!==null){ie[ne]=R(e);i=new ie;ie[ne]=null;i[ee]=e}else i=re();return n===undefined?i:Qt(i,n)};K[ee]=true;var oe=Wt("unscopables");var se=Array.prototype;if(se[oe]==undefined){P(se,oe,ae(null))}var le=function(t){se[oe][t]=true};var ue=Zt.find;var ce="find";var he=true;if(ce in[])Array(1)[ce](function(){he=false});Lt({target:"Array",proto:true,forced:he},{find:function t(e){return ue(this,e,arguments.length>1?arguments[1]:undefined)}});le(ce);var fe=_t.includes;Lt({target:"Array",proto:true},{includes:function t(e){return fe(this,e,arguments.length>1?arguments[1]:undefined)}});le("includes");var de=Object.assign;var ge=!de||i(function(){var t={};var e={};var n=Symbol();var i="abcdefghijklmnopqrst";t[n]=7;i.split("").forEach(function(t){e[t]=t});return de({},t)[n]!=7||Jt(de({},e)).join("")!=i})?function t(e,n){var i=Ht(e);var r=arguments.length;var a=1;var o=At.f;var s=g.f;while(r>a){var l=b(arguments[a++]);var u=o?Jt(l).concat(o(l)):Jt(l);var c=u.length;var h=0;var f;while(c>h){f=u[h++];if(!d||s.call(l,f))i[f]=l[f]}}return i}:de;Lt({target:"Object",stat:true,forced:Object.assign!==ge},{assign:ge});var pe=Wt("match");var ve=function(t){var e;return m(t)&&((e=t[pe])!==undefined?!!e:c(t)=="RegExp")};var me=function(t){if(ve(t)){throw TypeError("The method doesn't accept regular expressions")}return t};var ye=Wt("match");var _e=function(e){var n=/./;try{"/./"[e](n)}catch(t){try{n[ye]=false;return"/./"[e](n)}catch(t){}}return false};Lt({target:"String",proto:true,forced:!_e("includes")},{includes:function t(e){return!!~String(p(this)).indexOf(me(e),arguments.length>1?arguments[1]:undefined)}});var be="".startsWith;var we=Math.min;Lt({target:"String",proto:true,forced:!_e("startsWith")},{startsWith:function t(e){var n=String(p(this));me(e);var i=gt(we(arguments.length>1?arguments[1]:undefined,n.length));var r=String(e);return be?be.call(n,r,i):n.slice(i,i+r.length)===r}});if(typeof window!=="undefined"){(function(){var i=function(t,e){var n=t.nodeType;if(n===3){e.push(t.textContent.replace(/&/,"&").replace(/",">"))}else if(n===1){e.push("<",t.tagName);if(t.hasAttributes()){[].forEach.call(t.attributes,function(t){e.push(" ",t.item.name,"='",t.item.value,"'")})}if(t.hasChildNodes()){e.push(">");[].forEach.call(t.childNodes,function(t){i(t,e)});e.push("")}else{e.push("/>")}}else if(n==8){e.push("\x3c!--",t.nodeValue,"--\x3e")}};Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function(){var t=[];var e=this.firstChild;while(e){i(e,t);e=e.nextSibling}return t.join("")},set:function(t){while(this.firstChild){this.removeChild(this.firstChild)}try{var e=new DOMParser;e.async=false;var n=""+t+"";var i=e.parseFromString(n,"text/xml").documentElement;var r=i.firstChild;while(r){this.appendChild(this.ownerDocument.importNode(r,true));r=r.nextSibling}}catch(t){}}});Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function(){return this.innerHTML},set:function(t){this.innerHTML=t}})})()}});(function(t,e){typeof exports==="object"&&typeof module!=="undefined"?e(exports):typeof define==="function"&&define.amd?define("d3plus",["exports"],e):(t=t||self,e(t.d3plus={}))})(this,function(t){var e="2.0.0-alpha.25";function j(t){if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){j=function(t){return typeof t}}else{j=function(t){return t&&typeof Symbol==="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}}return j(t)}function i(t,e,n){if(e in t){Object.defineProperty(t,e,{value:n,enumerable:true,configurable:true,writable:true})}else{t[e]=n}return t}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);if(t)i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable});n.push.apply(n,i)}return n}function a(e){for(var t=1;te?1:t>=e?0:NaN}function S(o){if(o.length===1)o=n(o);return{left:function t(e,n,i,r){if(i==null)i=0;if(r==null)r=e.length;while(i>>1;if(o(e[a],n)<0)i=a+1;else r=a}return i},right:function t(e,n,i,r){if(i==null)i=0;if(r==null)r=e.length;while(i>>1;if(o(e[a],n)>0)r=a;else i=a+1}return i}}}function n(n){return function(t,e){return y(n(t),e)}}var o=S(y);var u=o.right;function l(t){return t===null?NaN:+t}function Ft(t,e){var n=t.length,i=-1,r,a,o;if(e==null){while(++i=r){a=o=r;while(++ir)a=r;if(o=r){a=o=r;while(++ir)a=r;if(o0)return[t];if(i=e0){t=Math.ceil(t/s);e=Math.floor(e/s);o=new Array(a=Math.ceil(e-t+1));while(++r=0?(a>=s?10:a>=c?5:a>=h?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(a>=s?10:a>=c?5:a>=h?2:1)}function C(t,e,n){var i=Math.abs(e-t)/Math.max(0,n),r=Math.pow(10,Math.floor(Math.log(i)/Math.LN10)),a=i/r;if(a>=s)r*=10;else if(a>=c)r*=5;else if(a>=h)r*=2;return e=1)return+n(t[i-1],i-1,t);var i,r=(i-1)*e,a=Math.floor(r),o=+n(t[a],a,t),s=+n(t[a+1],a+1,t);return o+(s-o)*(r-a)}function Ht(t,e){var n=t.length,i=-1,r,a;if(e==null){while(++i=r){a=r;while(++ia){a=r}}}}}else{while(++i=r){a=r;while(++ia){a=r}}}}}return a}function d(t,e){var n=t.length,i=n,r=-1,a,o=0;if(e==null){while(++r=0){o=t[e];n=o.length;while(--n>=0){a[--r]=o[n]}}return a}function Gt(t,e){var n=t.length,i=-1,r,a;if(e==null){while(++i=r){a=r;while(++ir){a=r}}}}}else{while(++i=r){a=r;while(++ir){a=r}}}}}return a}function Ut(t,e){var n=t.length,i=-1,r,a=0;if(e==null){while(++i0))return i;do{i.push(r=new Date(+t)),o(t,n),a(t)}while(r=t)while(a(t),!n(t)){t.setTime(t-1)}},function(t,e){if(t>=t){if(e<0)while(++e<=0){while(o(t,-1),!n(t)){}}else while(--e>=0){while(o(t,+1),!n(t)){}}}})};if(n){s.count=function(t,e){g.setTime(+t),p.setTime(+e);a(g),a(p);return Math.floor(n(g,p))};s.every=function(e){e=Math.floor(e);return!isFinite(e)||!(e>0)?null:!(e>1)?s:s.filter(i?function(t){return i(t)%e===0}:function(t){return s.count(0,t)%e===0})}}return s}var m=v(function(){},function(t,e){t.setTime(+t+e)},function(t,e){return e-t});m.every=function(n){n=Math.floor(n);if(!isFinite(n)||!(n>0))return null;if(!(n>1))return m;return v(function(t){t.setTime(Math.floor(t/n)*n)},function(t,e){t.setTime(+t+e*n)},function(t,e){return(e-t)/n})};var _=1e3;var b=6e4;var w=36e5;var x=864e5;var k=6048e5;var vt=v(function(t){t.setTime(t-t.getMilliseconds())},function(t,e){t.setTime(+t+e*_)},function(t,e){return(e-t)/_},function(t){return t.getUTCSeconds()});var mt=v(function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*_)},function(t,e){t.setTime(+t+e*b)},function(t,e){return(e-t)/b},function(t){return t.getMinutes()});var yt=v(function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*_-t.getMinutes()*b)},function(t,e){t.setTime(+t+e*w)},function(t,e){return(e-t)/w},function(t){return t.getHours()});var _t=v(function(t){t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*b)/x},function(t){return t.getDate()-1});function A(e){return v(function(t){t.setDate(t.getDate()-(t.getDay()+7-e)%7);t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e*7)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*b)/k})}var bt=A(0);var G=A(1);var M=A(2);var R=A(3);var T=A(4);var O=A(5);var B=A(6);var wt=v(function(t){t.setDate(1);t.setHours(0,0,0,0)},function(t,e){t.setMonth(t.getMonth()+e)},function(t,e){return e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12},function(t){return t.getMonth()});var xt=v(function(t){t.setMonth(0,1);t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t,e){return e.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});xt.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:v(function(t){t.setFullYear(Math.floor(t.getFullYear()/n)*n);t.setMonth(0,1);t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e*n)})};var P=v(function(t){t.setUTCSeconds(0,0)},function(t,e){t.setTime(+t+e*b)},function(t,e){return(e-t)/b},function(t){return t.getUTCMinutes()});var N=v(function(t){t.setUTCMinutes(0,0,0)},function(t,e){t.setTime(+t+e*w)},function(t,e){return(e-t)/w},function(t){return t.getUTCHours()});var U=v(function(t){t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e)},function(t,e){return(e-t)/x},function(t){return t.getUTCDate()-1});function D(e){return v(function(t){t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e*7)},function(t,e){return(e-t)/k})}var z=D(0);var q=D(1);var L=D(2);var F=D(3);var I=D(4);var H=D(5);var V=D(6);var W=v(function(t){t.setUTCDate(1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCMonth(t.getUTCMonth()+e)},function(t,e){return e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12},function(t){return t.getUTCMonth()});var K=v(function(t){t.setUTCMonth(0,1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)},function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});K.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:v(function(t){t.setUTCFullYear(Math.floor(t.getUTCFullYear()/n)*n);t.setUTCMonth(0,1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e*n)})};function Y(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);e.setFullYear(t.y);return e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function X(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));e.setUTCFullYear(t.y);return e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Z(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function J(t){var i=t.dateTime,r=t.date,a=t.time,e=t.periods,n=t.days,o=t.shortDays,s=t.months,l=t.shortMonths;var u=at(e),c=ot(e),h=at(n),f=ot(n),d=at(o),g=ot(o),p=at(s),v=ot(s),m=at(l),y=ot(l);var _={a:P,A:N,b:D,B:z,c:null,d:Nt,e:Nt,f:qt,H:Dt,I:zt,j:jt,L:Lt,m:Wt,M:Kt,p:j,Q:we,s:xe,S:Yt,u:Xt,U:$t,V:Zt,w:Jt,W:Qt,x:null,X:null,y:te,Y:ee,Z:ne,"%":be};var b={a:L,A:F,b:I,B:H,c:null,d:ie,e:ie,f:le,H:re,I:ae,j:oe,L:se,m:ue,M:ce,p:V,Q:we,s:xe,S:he,u:fe,U:de,V:ge,w:pe,W:ve,x:null,X:null,y:me,Y:ye,Z:_e,"%":be};var w={a:E,A:A,b:M,B:R,c:T,d:St,e:St,f:Tt,H:Et,I:Et,j:Ct,L:Rt,m:kt,M:At,p:C,Q:Bt,s:Pt,S:Mt,u:lt,U:ut,V:ct,w:st,W:ht,x:O,X:B,y:dt,Y:ft,Z:gt,"%":Ot};_.x=x(r,_);_.X=x(a,_);_.c=x(i,_);b.x=x(r,b);b.X=x(a,b);b.c=x(i,b);function x(l,u){return function(t){var e=[],n=-1,i=0,r=l.length,a,o,s;if(!(t instanceof Date))t=new Date(+t);while(++n53)return null;if(!("w"in e))e.w=1;if("Z"in e){i=X(Z(e.y)),r=i.getUTCDay();i=r>4||r===0?q.ceil(i):q(i);i=U.offset(i,(e.V-1)*7);e.y=i.getUTCFullYear();e.m=i.getUTCMonth();e.d=i.getUTCDate()+(e.w+6)%7}else{i=o(Z(e.y)),r=i.getDay();i=r>4||r===0?G.ceil(i):G(i);i=_t.offset(i,(e.V-1)*7);e.y=i.getFullYear();e.m=i.getMonth();e.d=i.getDate()+(e.w+6)%7}}else if("W"in e||"U"in e){if(!("w"in e))e.w="u"in e?e.u%7:"W"in e?1:0;r="Z"in e?X(Z(e.y)).getUTCDay():o(Z(e.y)).getDay();e.m=0;e.d="W"in e?(e.w+6)%7+e.W*7-(r+5)%7:e.w+e.U*7-(r+6)%7}if("Z"in e){e.H+=e.Z/100|0;e.M+=e.Z%100;return X(e)}return o(e)}}function S(t,e,n,i){var r=0,a=e.length,o=n.length,s,l;while(r=o)return-1;s=e.charCodeAt(r++);if(s===37){s=e.charAt(r++);l=w[s in Q?e.charAt(r++):s];if(!l||(i=l(t,n,i))<0)return-1}else if(s!=n.charCodeAt(i++)){return-1}}return i}function C(t,e,n){var i=u.exec(e.slice(n));return i?(t.p=c[i[0].toLowerCase()],n+i[0].length):-1}function E(t,e,n){var i=d.exec(e.slice(n));return i?(t.w=g[i[0].toLowerCase()],n+i[0].length):-1}function A(t,e,n){var i=h.exec(e.slice(n));return i?(t.w=f[i[0].toLowerCase()],n+i[0].length):-1}function M(t,e,n){var i=m.exec(e.slice(n));return i?(t.m=y[i[0].toLowerCase()],n+i[0].length):-1}function R(t,e,n){var i=p.exec(e.slice(n));return i?(t.m=v[i[0].toLowerCase()],n+i[0].length):-1}function T(t,e,n){return S(t,i,e,n)}function O(t,e,n){return S(t,r,e,n)}function B(t,e,n){return S(t,a,e,n)}function P(t){return o[t.getDay()]}function N(t){return n[t.getDay()]}function D(t){return l[t.getMonth()]}function z(t){return s[t.getMonth()]}function j(t){return e[+(t.getHours()>=12)]}function L(t){return o[t.getUTCDay()]}function F(t){return n[t.getUTCDay()]}function I(t){return l[t.getUTCMonth()]}function H(t){return s[t.getUTCMonth()]}function V(t){return e[+(t.getUTCHours()>=12)]}return{format:function t(e){var n=x(e+="",_);n.toString=function(){return e};return n},parse:function t(e){var n=k(e+="",Y);n.toString=function(){return e};return n},utcFormat:function t(e){var n=x(e+="",b);n.toString=function(){return e};return n},utcParse:function t(e){var n=k(e,X);n.toString=function(){return e};return n}}}var Q={"-":"",_:" ",0:"0"},tt=/^\s*\d+/,et=/^%/,nt=/[\\^$*+?|[\]().{}]/g;function it(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a68?1900:2e3),n+i[0].length):-1}function gt(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function kt(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function St(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function Ct(t,e,n){var i=tt.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function Et(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function At(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function Mt(t,e,n){var i=tt.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function Rt(t,e,n){var i=tt.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Tt(t,e,n){var i=tt.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function Ot(t,e,n){var i=et.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function Bt(t,e,n){var i=tt.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Pt(t,e,n){var i=tt.exec(e.slice(n));return i?(t.Q=+i[0]*1e3,n+i[0].length):-1}function Nt(t,e){return it(t.getDate(),e,2)}function Dt(t,e){return it(t.getHours(),e,2)}function zt(t,e){return it(t.getHours()%12||12,e,2)}function jt(t,e){return it(1+_t.count(xt(t),t),e,3)}function Lt(t,e){return it(t.getMilliseconds(),e,3)}function qt(t,e){return Lt(t,e)+"000"}function Wt(t,e){return it(t.getMonth()+1,e,2)}function Kt(t,e){return it(t.getMinutes(),e,2)}function Yt(t,e){return it(t.getSeconds(),e,2)}function Xt(t){var e=t.getDay();return e===0?7:e}function $t(t,e){return it(bt.count(xt(t),t),e,2)}function Zt(t,e){var n=t.getDay();t=n>=4||n===0?T(t):T.ceil(t);return it(T.count(xt(t),t)+(xt(t).getDay()===4),e,2)}function Jt(t){return t.getDay()}function Qt(t,e){return it(G.count(xt(t),t),e,2)}function te(t,e){return it(t.getFullYear()%100,e,2)}function ee(t,e){return it(t.getFullYear()%1e4,e,4)}function ne(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+it(e/60|0,"0",2)+it(e%60,"0",2)}function ie(t,e){return it(t.getUTCDate(),e,2)}function re(t,e){return it(t.getUTCHours(),e,2)}function ae(t,e){return it(t.getUTCHours()%12||12,e,2)}function oe(t,e){return it(1+U.count(K(t),t),e,3)}function se(t,e){return it(t.getUTCMilliseconds(),e,3)}function le(t,e){return se(t,e)+"000"}function ue(t,e){return it(t.getUTCMonth()+1,e,2)}function ce(t,e){return it(t.getUTCMinutes(),e,2)}function he(t,e){return it(t.getUTCSeconds(),e,2)}function fe(t){var e=t.getUTCDay();return e===0?7:e}function de(t,e){return it(z.count(K(t),t),e,2)}function ge(t,e){var n=t.getUTCDay();t=n>=4||n===0?I(t):I.ceil(t);return it(I.count(K(t),t)+(K(t).getUTCDay()===4),e,2)}function pe(t){return t.getUTCDay()}function ve(t,e){return it(q.count(K(t),t),e,2)}function me(t,e){return it(t.getUTCFullYear()%100,e,2)}function ye(t,e){return it(t.getUTCFullYear()%1e4,e,4)}function _e(){return"+0000"}function be(){return"%"}function we(t){return+t}function xe(t){return Math.floor(+t/1e3)}var ke;var Se;var Ce;var Ee;var Ae;Me({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function Me(t){ke=J(t);Se=ke.format;Ce=ke.parse;Ee=ke.utcFormat;Ae=ke.utcParse;return ke}var Re="%Y-%m-%dT%H:%M:%S.%LZ";function Te(t){return t.toISOString()}var Oe=Date.prototype.toISOString?Te:Ee(Re);function Be(t){var e=new Date(t);return isNaN(e)?null:e}var Pe=+new Date("2000-01-01T00:00:00.000Z")?Be:Ae(Re);function Ne(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}function De(t,e){switch(arguments.length){case 0:break;case 1:this.interpolator(t);break;default:this.interpolator(e).domain(t);break}return this}var ze="$";function je(){}je.prototype=Le.prototype={constructor:je,has:function t(e){return ze+e in this},get:function t(e){return this[ze+e]},set:function t(e,n){this[ze+e]=n;return this},remove:function t(e){var n=ze+e;return n in this&&delete this[n]},clear:function t(){for(var e in this){if(e[0]===ze)delete this[e]}},keys:function t(){var t=[];for(var e in this){if(e[0]===ze)t.push(e.slice(1))}return t},values:function t(){var t=[];for(var e in this){if(e[0]===ze)t.push(this[e])}return t},entries:function t(){var t=[];for(var e in this){if(e[0]===ze)t.push({key:e.slice(1),value:this[e]})}return t},size:function t(){var t=0;for(var e in this){if(e[0]===ze)++t}return t},empty:function t(){for(var e in this){if(e[0]===ze)return false}return true},each:function t(e){for(var n in this){if(n[0]===ze)e(this[n],n.slice(1),this)}}};function Le(t,e){var n=new je;if(t instanceof je)t.each(function(t,e){n.set(e,t)});else if(Array.isArray(t)){var i=-1,r=t.length,a;if(e==null)while(++i=f.length){if(d!=null)t.sort(d);return g!=null?g(t):t}var e=-1,a=t.length,o=f[n++],s,l,u=Le(),c,h=i();while(++ef.length)return t;var i,r=a[n-1];if(g!=null&&n>=f.length)i=t.entries();else i=[],t.each(function(t,e){i.push({key:e,values:o(t,n)})});return r!=null?i.sort(function(t,e){return r(t.key,e.key)}):i}return n={object:function t(e){return p(e,0,Ie,He)},map:function t(e){return p(e,0,Ve,Ge)},entries:function t(e){return o(p(e,0,Ve,Ge),0)},key:function t(e){f.push(e);return n},sortKeys:function t(e){a[f.length-1]=e;return n},sortValues:function t(e){d=e;return n},rollup:function t(e){g=e;return n}}}function Ie(){return{}}function He(t,e,n){t[e]=n}function Ve(){return Le()}function Ge(t,e,n){t.set(e,n)}function Ue(){}var qe=Le.prototype;Ue.prototype=We.prototype={constructor:Ue,has:qe.has,add:function t(e){e+="";this[ze+e]=e;return this},remove:qe.remove,clear:qe.clear,values:qe.keys,size:qe.size,empty:qe.empty,each:qe.each};function We(t,e){var n=new Ue;if(t instanceof Ue)t.each(function(t){n.add(t)});else if(t){var i=-1,r=t.length;if(e==null)while(++i>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1)):(e=fn.exec(t))?wn(parseInt(e[1],16)):(e=dn.exec(t))?new Cn(e[1],e[2],e[3],1):(e=gn.exec(t))?new Cn(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=pn.exec(t))?xn(e[1],e[2],e[3],e[4]):(e=vn.exec(t))?xn(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=mn.exec(t))?An(e[1],e[2]/100,e[3]/100,1):(e=yn.exec(t))?An(e[1],e[2]/100,e[3]/100,e[4]):_n.hasOwnProperty(t)?wn(_n[t]):t==="transparent"?new Cn(NaN,NaN,NaN,0):null}function wn(t){return new Cn(t>>16&255,t>>8&255,t&255,1)}function xn(t,e,n,i){if(i<=0)t=e=n=NaN;return new Cn(t,e,n,i)}function kn(t){if(!(t instanceof an))t=bn(t);if(!t)return new Cn;t=t.rgb();return new Cn(t.r,t.g,t.b,t.opacity)}function Sn(t,e,n,i){return arguments.length===1?kn(t):new Cn(t,e,n,i==null?1:i)}function Cn(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}nn(Cn,Sn,rn(an,{brighter:function t(e){e=e==null?sn:Math.pow(sn,e);return new Cn(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function t(e){e=e==null?on:Math.pow(on,e);return new Cn(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function t(){return this},displayable:function t(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:function t(){return"#"+En(this.r)+En(this.g)+En(this.b)},toString:function t(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(e===1?")":", "+e+")")}}));function En(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function An(t,e,n,i){if(i<=0)t=e=n=NaN;else if(n<=0||n>=1)t=e=NaN;else if(e<=0)t=NaN;return new Tn(t,e,n,i)}function Mn(t){if(t instanceof Tn)return new Tn(t.h,t.s,t.l,t.opacity);if(!(t instanceof an))t=bn(t);if(!t)return new Tn;if(t instanceof Tn)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,l=(a+r)/2;if(s){if(e===a)o=(n-i)/s+(n0&&l<1?0:o}return new Tn(o,s,l,t.opacity)}function Rn(t,e,n,i){return arguments.length===1?Mn(t):new Tn(t,e,n,i==null?1:i)}function Tn(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}nn(Tn,Rn,rn(an,{brighter:function t(e){e=e==null?sn:Math.pow(sn,e);return new Tn(this.h,this.s,this.l*e,this.opacity)},darker:function t(e){e=e==null?on:Math.pow(on,e);return new Tn(this.h,this.s,this.l*e,this.opacity)},rgb:function t(){var e=this.h%360+(this.h<0)*360,n=isNaN(e)||isNaN(this.s)?0:this.s,i=this.l,r=i+(i<.5?i:1-i)*n,a=2*i-r;return new Cn(On(e>=240?e-240:e+120,a,r),On(e,a,r),On(e<120?e+240:e-120,a,r),this.opacity)},displayable:function t(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));function On(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}var Bn=Math.PI/180;var Pn=180/Math.PI;var Nn=18,Dn=.96422,zn=1,jn=.82521,Ln=4/29,Fn=6/29,In=3*Fn*Fn,Hn=Fn*Fn*Fn;function Vn(t){if(t instanceof Un)return new Un(t.l,t.a,t.b,t.opacity);if(t instanceof Zn)return Jn(t);if(!(t instanceof Cn))t=kn(t);var e=Yn(t.r),n=Yn(t.g),i=Yn(t.b),r=qn((.2225045*e+.7168786*n+.0606169*i)/zn),a,o;if(e===n&&n===i)a=o=r;else{a=qn((.4360747*e+.3850649*n+.1430804*i)/Dn);o=qn((.0139322*e+.0971045*n+.7141733*i)/jn)}return new Un(116*r-16,500*(a-r),200*(r-o),t.opacity)}function Gn(t,e,n,i){return arguments.length===1?Vn(t):new Un(t,e,n,i==null?1:i)}function Un(t,e,n,i){this.l=+t;this.a=+e;this.b=+n;this.opacity=+i}nn(Un,Gn,rn(an,{brighter:function t(e){return new Un(this.l+Nn*(e==null?1:e),this.a,this.b,this.opacity)},darker:function t(e){return new Un(this.l-Nn*(e==null?1:e),this.a,this.b,this.opacity)},rgb:function t(){var e=(this.l+16)/116,n=isNaN(this.a)?e:e+this.a/500,i=isNaN(this.b)?e:e-this.b/200;n=Dn*Wn(n);e=zn*Wn(e);i=jn*Wn(i);return new Cn(Kn(3.1338561*n-1.6168667*e-.4906146*i),Kn(-.9787684*n+1.9161415*e+.033454*i),Kn(.0719453*n-.2289914*e+1.4052427*i),this.opacity)}}));function qn(t){return t>Hn?Math.pow(t,1/3):t/In+Ln}function Wn(t){return t>Fn?t*t*t:In*(t-Ln)}function Kn(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Yn(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Xn(t){if(t instanceof Zn)return new Zn(t.h,t.c,t.l,t.opacity);if(!(t instanceof Un))t=Vn(t);if(t.a===0&&t.b===0)return new Zn(NaN,0e){a=i.slice(e,a);if(s[o])s[o]+=a;else s[++o]=a}if((n=n[0])===(r=r[0])){if(s[o])s[o]+=r;else s[++o]=r}else{s[++o]=null;l.push({i:o,x:yi(n,r)})}e=wi.lastIndex}if(e180)e+=360;else if(e-t>180)t+=360;i.push({i:n.push(u(n)+"rotate(",null,r)-2,x:yi(t,e)})}else if(e){n.push(u(n)+"rotate("+e+r)}}function c(t,e,n,i){if(t!==e){i.push({i:n.push(u(n)+"skewX(",null,r)-2,x:yi(t,e)})}else if(e){n.push(u(n)+"skewX("+e+r)}}function h(t,e,n,i,r,a){if(t!==n||e!==i){var o=r.push(u(r)+"scale(",null,",",null,")");a.push({i:o-4,x:yi(t,n)},{i:o-2,x:yi(e,i)})}else if(n!==1||i!==1){r.push(u(r)+"scale("+n+","+i+")")}}return function(t,e){var r=[],a=[];t=n(t),e=n(e);i(t.translateX,t.translateY,e.translateX,e.translateY,r,a);o(t.rotate,e.rotate,r,a);c(t.skewX,e.skewX,r,a);h(t.scaleX,t.scaleY,e.scaleX,e.scaleY,r,a);t=e=null;return function(t){var e=-1,n=a.length,i;while(++en)i=e,e=n,n=i;return function(t){return Math.max(e,Math.min(n,t))}}function Qi(t,e,n){var i=t[0],r=t[1],a=e[0],o=e[1];if(r2?tr:Qi;u=c=null;return f}function f(t){return isNaN(t=+t)?o:(u||(u=l(e.map(r),n,i)))(r(s(t)))}f.invert=function(t){return s(a((c||(c=l(n,e.map(r),yi)))(t)))};f.domain=function(t){return arguments.length?(e=Xe.call(t,Yi),s===$i||(s=Ji(e)),h()):e.slice()};f.range=function(t){return arguments.length?(n=$e.call(t),h()):n.slice()};f.rangeRound=function(t){return n=$e.call(t),i=Ei,h()};f.clamp=function(t){return arguments.length?(s=t?Ji(e):$i,f):s!==$i};f.interpolate=function(t){return arguments.length?(i=t,h()):i};f.unknown=function(t){return arguments.length?(o=t,f):o};return function(t,e){r=t,a=e;return h()}}function ir(t,e){return nr()(t,e)}function rr(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function ar(t){return t=rr(Math.abs(t)),t?t[1]:NaN}function or(s,l){return function(t,e){var n=t.length,i=[],r=0,a=s[0],o=0;while(n>0&&a>0){if(o+a+1>e)a=Math.max(1,e-o);i.push(t.substring(n-=a,n+a));if((o+=a+1)>e)break;a=s[r=(r+1)%s.length]}return i.reverse().join(l)}}function sr(e){return function(t){return t.replace(/[0-9]/g,function(t){return e[+t]})}}var lr=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ur(t){return new cr(t)}ur.prototype=cr.prototype;function cr(t){if(!(e=lr.exec(t)))throw new Error("invalid format: "+t);var e;this.fill=e[1]||" ";this.align=e[2]||">";this.sign=e[3]||"-";this.symbol=e[4]||"";this.zero=!!e[5];this.width=e[6]&&+e[6];this.comma=!!e[7];this.precision=e[8]&&+e[8].slice(1);this.trim=!!e[9];this.type=e[10]||""}cr.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width==null?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision==null?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function hr(t){t:for(var e=t.length,n=1,i=-1,r;n0){if(!+t[n])break t;i=0}break}}return i>0?t.slice(0,i)+t.slice(r+1):t}var fr;function dr(t,e){var n=rr(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(fr=Math.max(-8,Math.min(8,Math.floor(r/3)))*3)+1,o=i.length;return a===o?i:a>o?i+new Array(a-o+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+rr(t,Math.max(0,e+a-1))[0]}function gr(t,e){var n=rr(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")}var pr={"%":function t(e,n){return(e*100).toFixed(n)},b:function t(e){return Math.round(e).toString(2)},c:function t(e){return e+""},d:function t(e){return Math.round(e).toString(10)},e:function t(e,n){return e.toExponential(n)},f:function t(e,n){return e.toFixed(n)},g:function t(e,n){return e.toPrecision(n)},o:function t(e){return Math.round(e).toString(8)},p:function t(e,n){return gr(e*100,n)},r:gr,s:dr,X:function t(e){return Math.round(e).toString(16).toUpperCase()},x:function t(e){return Math.round(e).toString(16)}};function vr(t){return t}var mr=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function yr(t){var x=t.grouping&&t.thousands?or(t.grouping,t.thousands):vr,i=t.currency,k=t.decimal,S=t.numerals?sr(t.numerals):vr,r=t.percent||"%";function o(t){t=ur(t);var u=t.fill,c=t.align,h=t.sign,e=t.symbol,f=t.zero,d=t.width,g=t.comma,p=t.precision,v=t.trim,m=t.type;if(m==="n")g=true,m="g";else if(!pr[m])p==null&&(p=12),v=true,m="g";if(f||u==="0"&&c==="=")f=true,u="0",c="=";var y=e==="$"?i[0]:e==="#"&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",_=e==="$"?i[1]:/[%p]/.test(m)?r:"";var b=pr[m],w=/[defgprs%]/.test(m);p=p==null?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p));function n(t){var e=y,n=_,i,r,a;if(m==="c"){n=b(t)+n;t=""}else{t=+t;var o=t<0;t=b(Math.abs(t),p);if(v)t=hr(t);if(o&&+t===0)o=false;e=(o?h==="("?h:"-":h==="-"||h==="("?"":h)+e;n=(m==="s"?mr[8+fr/3]:"")+n+(o&&h==="("?")":"");if(w){i=-1,r=t.length;while(++ia||a>57){n=(a===46?k+t.slice(i+1):t.slice(i))+n;t=t.slice(0,i);break}}}}if(g&&!f)t=x(t,Infinity);var s=e.length+t.length+n.length,l=s>1)+e+t+n+l.slice(s);break;default:t=l+e+t+n;break}return S(t)}n.toString=function(){return t+""};return n}function e(t,e){var n=o((t=ur(t),t.type="f",t)),i=Math.max(-8,Math.min(8,Math.floor(ar(e)/3)))*3,r=Math.pow(10,-i),a=mr[8+i/3];return function(t){return n(r*t)+a}}return{format:o,formatPrefix:e}}var _r;var br;var wr;xr({decimal:".",thousands:",",grouping:[3],currency:["$",""]});function xr(t){_r=yr(t);br=_r.format;wr=_r.formatPrefix;return _r}function kr(t){return Math.max(0,-ar(Math.abs(t)))}function Sr(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(ar(e)/3)))*3-ar(Math.abs(t)))}function Cr(t,e){t=Math.abs(t),e=Math.abs(e)-t;return Math.max(0,ar(e)-ar(t))+1}function Er(t,e,n,i){var r=C(t,e,n),a;i=ur(i==null?",f":i);switch(i.type){case"s":{var o=Math.max(Math.abs(t),Math.abs(e));if(i.precision==null&&!isNaN(a=Sr(r,o)))i.precision=a;return wr(i,o)}case"":case"e":case"g":case"p":case"r":{if(i.precision==null&&!isNaN(a=Cr(r,Math.max(Math.abs(t),Math.abs(e)))))i.precision=a-(i.type==="e");break}case"f":case"%":{if(i.precision==null&&!isNaN(a=kr(r)))i.precision=a-(i.type==="%")*2;break}}return br(i)}function Ar(s){var l=s.domain;s.ticks=function(t){var e=l();return pt(e[0],e[e.length-1],t==null?10:t)};s.tickFormat=function(t,e){var n=l();return Er(n[0],n[n.length-1],t==null?10:t,e)};s.nice=function(t){if(t==null)t=10;var e=l(),n=0,i=e.length-1,r=e[n],a=e[i],o;if(a0){r=Math.floor(r/o)*o;a=Math.ceil(a/o)*o;o=f(r,a,t)}else if(o<0){r=Math.ceil(r*o)/o;a=Math.floor(a*o)/o;o=f(r,a,t)}if(o>0){e[n]=Math.floor(r/o)*o;e[i]=Math.ceil(a/o)*o;l(e)}else if(o<0){e[n]=Math.ceil(r*o)/o;e[i]=Math.floor(a*o)/o;l(e)}return s};return s}function Mr(){var t=ir($i,$i);t.copy=function(){return er(t,Mr())};Ne.apply(t,arguments);return Ar(t)}function Rr(e){var n;function i(t){return isNaN(t=+t)?n:t}i.invert=i;i.domain=i.range=function(t){return arguments.length?(e=Xe.call(t,Yi),i):e.slice()};i.unknown=function(t){return arguments.length?(n=t,i):n};i.copy=function(){return Rr(e).unknown(n)};e=arguments.length?Xe.call(e,Yi):[0,1];return Ar(i)}function Tr(t,e){t=t.slice();var n=0,i=t.length-1,r=t[n],a=t[i],o;if(a0)for(;ai)break;h.push(u)}}else for(;a=1;--l){u=s*l;if(ui)break;h.push(u)}}}else{h=pt(a,o,Math.min(o-a,c)).map(p)}return r?h.reverse():h};e.tickFormat=function(t,n){if(n==null)n=d===10?".0e":",";if(typeof n!=="function")n=br(n);if(t===Infinity)return n;if(t==null)t=10;var i=Math.max(1,d*t/e.ticks().length);return function(t){var e=t/p(Math.round(g(t)));if(e*d0?i[e-1]:r[0],e=r?[a[r-1],i]:[a[e-1],a[e]]};s.unknown=function(t){return arguments.length?(e=t,s):s};s.thresholds=function(){return a.slice()};s.copy=function(){return Jr().domain([n,i]).range(o).unknown(e)};return Ne.apply(Ar(s),arguments)}function Qr(){var n=[.5],i=[0,1],e,r=1;function a(t){return t<=t?i[u(n,t,0,r)]:e}a.domain=function(t){return arguments.length?(n=$e.call(t),r=Math.min(n.length,i.length-1),a):n.slice()};a.range=function(t){return arguments.length?(i=$e.call(t),r=Math.min(n.length,i.length-1),a):i.slice()};a.invertExtent=function(t){var e=i.indexOf(t);return[n[e-1],n[e]]};a.unknown=function(t){return arguments.length?(e=t,a):e};a.copy=function(){return Qr().domain(n).range(i).unknown(e)};return Ne.apply(a,arguments)}var ta=1e3,ea=ta*60,na=ea*60,ia=na*24,ra=ia*7,aa=ia*30,oa=ia*365;function sa(t){return new Date(t)}function la(t){return t instanceof Date?+t:+new Date(+t)}function ua(o,e,n,i,r,a,s,l,u){var c=ir($i,$i),h=c.invert,f=c.domain;var d=u(".%L"),g=u(":%S"),p=u("%I:%M"),v=u("%I %p"),m=u("%a %d"),y=u("%b %d"),_=u("%B"),b=u("%Y");var w=[[s,1,ta],[s,5,5*ta],[s,15,15*ta],[s,30,30*ta],[a,1,ea],[a,5,5*ea],[a,15,15*ea],[a,30,30*ea],[r,1,na],[r,3,3*na],[r,6,6*na],[r,12,12*na],[i,1,ia],[i,2,2*ia],[n,1,ra],[e,1,aa],[e,3,3*aa],[o,1,oa]];function x(t){return(s(t)=0&&(e=t.slice(0,n))!=="xmlns")t=t.slice(n+1);return Ma.hasOwnProperty(e)?{space:Ma[e],local:t}:t}function Ta(n){return function(){var t=this.ownerDocument,e=this.namespaceURI;return e===Aa&&t.documentElement.namespaceURI===Aa?t.createElement(n):t.createElementNS(e,n)}}function Oa(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Ba(t){var e=Ra(t);return(e.local?Oa:Ta)(e)}function Pa(){}function Na(t){return t==null?Pa:function(){return this.querySelector(t)}}function Da(t){if(typeof t!=="function")t=Na(t);for(var e=this._groups,n=e.length,i=new Array(n),r=0;r=_)_=y+1;while(!(w=v[_])&&++_=0;){if(o=i[r]){if(a&&o.compareDocumentPosition(a)^4)a.parentNode.insertBefore(o,a);a=o}}}return this}function Qa(n){if(!n)n=to;function t(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}for(var e=this._groups,i=e.length,r=new Array(i),a=0;ae?1:t>=e?0:NaN}function eo(){var t=arguments[0];arguments[0]=this;t.apply(null,arguments);return this}function no(){var t=new Array(this.size()),e=-1;this.each(function(){t[++e]=this});return t}function io(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?vo:typeof e==="function"?yo:mo)(t,e,n==null?"":n)):bo(this.node(),t)}function bo(t,e){return t.style.getPropertyValue(e)||po(t).getComputedStyle(t,null).getPropertyValue(e)}function wo(t){return function(){delete this[t]}}function xo(t,e){return function(){this[t]=e}}function ko(e,n){return function(){var t=n.apply(this,arguments);if(t==null)delete this[e];else this[e]=t}}function So(t,e){return arguments.length>1?this.each((e==null?wo:typeof e==="function"?ko:xo)(t,e)):this.node()[t]}function Co(t){return t.trim().split(/^|\s+/)}function Eo(t){return t.classList||new Ao(t)}function Ao(t){this._node=t;this._names=Co(t.getAttribute("class")||"")}Ao.prototype={add:function t(e){var n=this._names.indexOf(e);if(n<0){this._names.push(e);this._node.setAttribute("class",this._names.join(" "))}},remove:function t(e){var n=this._names.indexOf(e);if(n>=0){this._names.splice(n,1);this._node.setAttribute("class",this._names.join(" "))}},contains:function t(e){return this._names.indexOf(e)>=0}};function Mo(t,e){var n=Eo(t),i=-1,r=e.length;while(++i=0)e=t.slice(n+1),t=t.slice(0,n);return{type:t,name:e}})}function ss(a){return function(){var t=this.__on;if(!t)return;for(var e=0,n=-1,i=t.length,r;e=0)e=t.slice(n+1),t=t.slice(0,n);if(t&&!i.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})}Es.prototype=Cs.prototype={constructor:Es,on:function t(e,n){var i=this._,r=As(e+"",i),a,o=-1,s=r.length;if(arguments.length<2){while(++o0)for(var i=new Array(a),r=0,a,o;r=0)t._call.call(null,e);t=t._next}--Ts}function Ws(){js=(zs=Fs.now())+Ls;Ts=Os=0;try{qs()}finally{Ts=0;Ys();js=0}}function Ks(){var t=Fs.now(),e=t-zs;if(e>Ps)Ls-=e,zs=t}function Ys(){var t,e=Ns,n,i=Infinity;while(e){if(e._call){if(i>e._time)i=e._time;t=e,e=e._next}else{n=e._next,e._next=null;e=t?t._next=n:Ns=n}}Ds=t;Xs(i)}function Xs(t){if(Ts)return;if(Os)Os=clearTimeout(Os);var e=t-js;if(e>24){if(tQs)throw new Error("too late; already scheduled");return n}function ll(t,e){var n=ul(t,e);if(n.state>nl)throw new Error("too late; already running");return n}function ul(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function cl(a,o,s){var l=a.__transition,u;l[o]=s;s.timer=Us(t,0,s.time);function t(t){s.state=tl;s.timer.restart(c,s.delay,s.time);if(s.delay<=t)c(t-s.delay)}function c(t){var e,n,i,r;if(s.state!==tl)return f();for(e in l){r=l[e];if(r.name!==s.name)continue;if(r.state===nl)return $s(c);if(r.state===il){r.state=al;r.timer.stop();r.on.call("interrupt",a,a.__data__,r.index,r.group);delete l[e]}else if(+eel&&i.state=0)t=t.slice(0,e);return!t||t==="start"})}function Hl(n,i,r){var a,o,s=Il(i)?sl:ll;return function(){var t=s(this,n),e=t.on;if(e!==a)(o=(a=e).copy()).on(i,r);t.on=o}}function Vl(t,e){var n=this._id;return arguments.length<2?ul(this.node(),n).on.on(t):this.each(Hl(n,t,e))}function Gl(n){return function(){var t=this.parentNode;for(var e in this.__transition){if(+e!==n)return}if(t)t.removeChild(this)}}function Ul(){return this.on("end.remove",Gl(this._id))}function ql(t){var e=this._name,n=this._id;if(typeof t!=="function")t=Na(t);for(var i=this._groups,r=i.length,a=new Array(r),o=0;o1&&arguments[1]!==undefined?arguments[1]:{};for(var n in e){if({}.hasOwnProperty.call(e,n))t.attr(n,e[n])}}var Su={language:"Afar",location:null,id:4096,tag:"aa",version:"Release 10"};var Cu={language:"Afrikaans",location:null,id:54,tag:"af",version:"Release 7"};var Eu={language:"Aghem",location:null,id:4096,tag:"agq",version:"Release 10"};var Au={language:"Akan",location:null,id:4096,tag:"ak",version:"Release 10"};var Mu={language:"Albanian",location:null,id:28,tag:"sq",version:"Release 7"};var Ru={language:"Alsatian",location:null,id:132,tag:"gsw",version:"Release 7"};var Tu={language:"Amharic",location:null,id:94,tag:"am",version:"Release 7"};var Ou={language:"Arabic",location:null,id:1,tag:"ar",version:"Release 7"};var Bu={language:"Armenian",location:null,id:43,tag:"hy",version:"Release 7"};var Pu={language:"Assamese",location:null,id:77,tag:"as",version:"Release 7"};var Nu={language:"Asturian",location:null,id:4096,tag:"ast",version:"Release 10"};var Du={language:"Asu",location:null,id:4096,tag:"asa",version:"Release 10"};var zu={language:"Azerbaijani (Latin)",location:null,id:44,tag:"az",version:"Release 7"};var ju={language:"Bafia",location:null,id:4096,tag:"ksf",version:"Release 10"};var Lu={language:"Bamanankan",location:null,id:4096,tag:"bm",version:"Release 10"};var Fu={language:"Bangla",location:null,id:69,tag:"bn",version:"Release 7"};var Iu={language:"Basaa",location:null,id:4096,tag:"bas",version:"Release 10"};var Hu={language:"Bashkir",location:null,id:109,tag:"ba",version:"Release 7"};var Vu={language:"Basque",location:null,id:45,tag:"eu",version:"Release 7"};var Gu={language:"Belarusian",location:null,id:35,tag:"be",version:"Release 7"};var Uu={language:"Bemba",location:null,id:4096,tag:"bem",version:"Release 10"};var qu={language:"Bena",location:null,id:4096,tag:"bez",version:"Release 10"};var Wu={language:"Blin",location:null,id:4096,tag:"byn",version:"Release 10"};var Ku={language:"Bodo",location:null,id:4096,tag:"brx",version:"Release 10"};var Yu={language:"Bosnian (Latin)",location:null,id:30746,tag:"bs",version:"Release 7"};var Xu={language:"Breton",location:null,id:126,tag:"br",version:"Release 7"};var $u={language:"Bulgarian",location:null,id:2,tag:"bg",version:"Release 7"};var Zu={language:"Burmese",location:null,id:85,tag:"my",version:"Release 8.1"};var Ju={language:"Catalan",location:null,id:3,tag:"ca",version:"Release 7"};var Qu={language:"Central Kurdish",location:null,id:146,tag:"ku",version:"Release 8"};var tc={language:"Cherokee",location:null,id:92,tag:"chr",version:"Release 8"};var ec={language:"Chiga",location:null,id:4096,tag:"cgg",version:"Release 10"};var nc={language:"Chinese (Simplified)",location:null,id:30724,tag:"zh",version:"Windows 7"};var ic={language:"Congo Swahili",location:null,id:4096,tag:"swc",version:"Release 10"};var rc={language:"Cornish",location:null,id:4096,tag:"kw",version:"Release 10"};var ac={language:"Corsican",location:null,id:131,tag:"co",version:"Release 7"};var oc={language:"Czech",location:null,id:5,tag:"cs",version:"Release 7"};var sc={language:"Danish",location:null,id:6,tag:"da",version:"Release 7"};var lc={language:"Dari",location:null,id:140,tag:"prs",version:"Release 7"};var uc={language:"Divehi",location:null,id:101,tag:"dv",version:"Release 7"};var cc={language:"Duala",location:null,id:4096,tag:"dua",version:"Release 10"};var hc={language:"Dutch",location:null,id:19,tag:"nl",version:"Release 7"};var fc={language:"Dzongkha",location:null,id:4096,tag:"dz",version:"Release 10"};var dc={language:"Embu",location:null,id:4096,tag:"ebu",version:"Release 10"};var gc={language:"English",location:null,id:9,tag:"en",version:"Release 7"};var pc={language:"Esperanto",location:null,id:4096,tag:"eo",version:"Release 10"};var vc={language:"Estonian",location:null,id:37,tag:"et",version:"Release 7"};var mc={language:"Ewe",location:null,id:4096,tag:"ee",version:"Release 10"};var yc={language:"Ewondo",location:null,id:4096,tag:"ewo",version:"Release 10"};var _c={language:"Faroese",location:null,id:56,tag:"fo",version:"Release 7"};var bc={language:"Filipino",location:null,id:100,tag:"fil",version:"Release 7"};var wc={language:"Finnish",location:null,id:11,tag:"fi",version:"Release 7"};var xc={language:"French",location:null,id:12,tag:"fr",version:"Release 7"};var kc={language:"Frisian",location:null,id:98,tag:"fy",version:"Release 7"};var Sc={language:"Friulian",location:null,id:4096,tag:"fur",version:"Release 10"};var Cc={language:"Fulah",location:null,id:103,tag:"ff",version:"Release 8"};var Ec={language:"Galician",location:null,id:86,tag:"gl",version:"Release 7"};var Ac={language:"Ganda",location:null,id:4096,tag:"lg",version:"Release 10"};var Mc={language:"Georgian",location:null,id:55,tag:"ka",version:"Release 7"};var Rc={language:"German",location:null,id:7,tag:"de",version:"Release 7"};var Tc={language:"Greek",location:null,id:8,tag:"el",version:"Release 7"};var Oc={language:"Greenlandic",location:null,id:111,tag:"kl",version:"Release 7"};var Bc={language:"Guarani",location:null,id:116,tag:"gn",version:"Release 8.1"};var Pc={language:"Gujarati",location:null,id:71,tag:"gu",version:"Release 7"};var Nc={language:"Gusii",location:null,id:4096,tag:"guz",version:"Release 10"};var Dc={language:"Hausa (Latin)",location:null,id:104,tag:"ha",version:"Release 7"};var zc={language:"Hawaiian",location:null,id:117,tag:"haw",version:"Release 8"};var jc={language:"Hebrew",location:null,id:13,tag:"he",version:"Release 7"};var Lc={language:"Hindi",location:null,id:57,tag:"hi",version:"Release 7"};var Fc={language:"Hungarian",location:null,id:14,tag:"hu",version:"Release 7"};var Ic={language:"Icelandic",location:null,id:15,tag:"is",version:"Release 7"};var Hc={language:"Igbo",location:null,id:112,tag:"ig",version:"Release 7"};var Vc={language:"Indonesian",location:null,id:33,tag:"id",version:"Release 7"};var Gc={language:"Interlingua",location:null,id:4096,tag:"ia",version:"Release 10"};var Uc={language:"Inuktitut (Latin)",location:null,id:93,tag:"iu",version:"Release 7"};var qc={language:"Irish",location:null,id:60,tag:"ga",version:"Windows 7"};var Wc={language:"Italian",location:null,id:16,tag:"it",version:"Release 7"};var Kc={language:"Japanese",location:null,id:17,tag:"ja",version:"Release 7"};var Yc={language:"Javanese",location:null,id:4096,tag:"jv",version:"Release 8.1"};var Xc={language:"Jola-Fonyi",location:null,id:4096,tag:"dyo",version:"Release 10"};var $c={language:"Kabuverdianu",location:null,id:4096,tag:"kea",version:"Release 10"};var Zc={language:"Kabyle",location:null,id:4096,tag:"kab",version:"Release 10"};var Jc={language:"Kako",location:null,id:4096,tag:"kkj",version:"Release 10"};var Qc={language:"Kalenjin",location:null,id:4096,tag:"kln",version:"Release 10"};var th={language:"Kamba",location:null,id:4096,tag:"kam",version:"Release 10"};var eh={language:"Kannada",location:null,id:75,tag:"kn",version:"Release 7"};var nh={language:"Kashmiri",location:null,id:96,tag:"ks",version:"Release 10"};var ih={language:"Kazakh",location:null,id:63,tag:"kk",version:"Release 7"};var rh={language:"Khmer",location:null,id:83,tag:"km",version:"Release 7"};var ah={language:"K'iche",location:null,id:134,tag:"quc",version:"Release 10"};var oh={language:"Kikuyu",location:null,id:4096,tag:"ki",version:"Release 10"};var sh={language:"Kinyarwanda",location:null,id:135,tag:"rw",version:"Release 7"};var lh={language:"Kiswahili",location:null,id:65,tag:"sw",version:"Release 7"};var uh={language:"Konkani",location:null,id:87,tag:"kok",version:"Release 7"};var ch={language:"Korean",location:null,id:18,tag:"ko",version:"Release 7"};var hh={language:"Koyra Chiini",location:null,id:4096,tag:"khq",version:"Release 10"};var fh={language:"Koyraboro Senni",location:null,id:4096,tag:"ses",version:"Release 10"};var dh={language:"Kwasio",location:null,id:4096,tag:"nmg",version:"Release 10"};var gh={language:"Kyrgyz",location:null,id:64,tag:"ky",version:"Release 7"};var ph={language:"Lakota",location:null,id:4096,tag:"lkt",version:"Release 10"};var vh={language:"Langi",location:null,id:4096,tag:"lag",version:"Release 10"};var mh={language:"Lao",location:null,id:84,tag:"lo",version:"Release 7"};var yh={language:"Latvian",location:null,id:38,tag:"lv",version:"Release 7"};var _h={language:"Lingala",location:null,id:4096,tag:"ln",version:"Release 10"};var bh={language:"Lithuanian",location:null,id:39,tag:"lt",version:"Release 7"};var wh={language:"Low German",location:null,id:4096,tag:"nds",version:"Release 10.2"};var xh={language:"Lower Sorbian",location:null,id:31790,tag:"dsb",version:"Windows 7"};var kh={language:"Luba-Katanga",location:null,id:4096,tag:"lu",version:"Release 10"};var Sh={language:"Luo",location:null,id:4096,tag:"luo",version:"Release 10"};var Ch={language:"Luxembourgish",location:null,id:110,tag:"lb",version:"Release 7"};var Eh={language:"Luyia",location:null,id:4096,tag:"luy",version:"Release 10"};var Ah={language:"Macedonian",location:null,id:47,tag:"mk",version:"Release 7"};var Mh={language:"Machame",location:null,id:4096,tag:"jmc",version:"Release 10"};var Rh={language:"Makhuwa-Meetto",location:null,id:4096,tag:"mgh",version:"Release 10"};var Th={language:"Makonde",location:null,id:4096,tag:"kde",version:"Release 10"};var Oh={language:"Malagasy",location:null,id:4096,tag:"mg",version:"Release 8.1"};var Bh={language:"Malay",location:null,id:62,tag:"ms",version:"Release 7"};var Ph={language:"Malayalam",location:null,id:76,tag:"ml",version:"Release 7"};var Nh={language:"Maltese",location:null,id:58,tag:"mt",version:"Release 7"};var Dh={language:"Manx",location:null,id:4096,tag:"gv",version:"Release 10"};var zh={language:"Maori",location:null,id:129,tag:"mi",version:"Release 7"};var jh={language:"Mapudungun",location:null,id:122,tag:"arn",version:"Release 7"};var Lh={language:"Marathi",location:null,id:78,tag:"mr",version:"Release 7"};var Fh={language:"Masai",location:null,id:4096,tag:"mas",version:"Release 10"};var Ih={language:"Meru",location:null,id:4096,tag:"mer",version:"Release 10"};var Hh={language:"Meta'",location:null,id:4096,tag:"mgo",version:"Release 10"};var Vh={language:"Mohawk",location:null,id:124,tag:"moh",version:"Release 7"};var Gh={language:"Mongolian (Cyrillic)",location:null,id:80,tag:"mn",version:"Release 7"};var Uh={language:"Morisyen",location:null,id:4096,tag:"mfe",version:"Release 10"};var qh={language:"Mundang",location:null,id:4096,tag:"mua",version:"Release 10"};var Wh={language:"N'ko",location:null,id:4096,tag:"nqo",version:"Release 8.1"};var Kh={language:"Nama",location:null,id:4096,tag:"naq",version:"Release 10"};var Yh={language:"Nepali",location:null,id:97,tag:"ne",version:"Release 7"};var Xh={language:"Ngiemboon",location:null,id:4096,tag:"nnh",version:"Release 10"};var $h={language:"Ngomba",location:null,id:4096,tag:"jgo",version:"Release 10"};var Zh={language:"North Ndebele",location:null,id:4096,tag:"nd",version:"Release 10"};var Jh={language:"Norwegian (Bokmal)",location:null,id:20,tag:"no",version:"Release 7"};var Qh={language:"Norwegian (Bokmal)",location:null,id:31764,tag:"nb",version:"Release 7"};var tf={language:"Norwegian (Nynorsk)",location:null,id:30740,tag:"nn",version:"Release 7"};var ef={language:"Nuer",location:null,id:4096,tag:"nus",version:"Release 10"};var nf={language:"Nyankole",location:null,id:4096,tag:"nyn",version:"Release 10"};var rf={language:"Occitan",location:null,id:130,tag:"oc",version:"Release 7"};var af={language:"Odia",location:null,id:72,tag:"or",version:"Release 7"};var of={language:"Oromo",location:null,id:114,tag:"om",version:"Release 8.1"};var sf={language:"Ossetian",location:null,id:4096,tag:"os",version:"Release 10"};var lf={language:"Pashto",location:null,id:99,tag:"ps",version:"Release 7"};var uf={language:"Persian",location:null,id:41,tag:"fa",version:"Release 7"};var cf={language:"Polish",location:null,id:21,tag:"pl",version:"Release 7"};var hf={language:"Portuguese",location:null,id:22,tag:"pt",version:"Release 7"};var ff={language:"Punjabi",location:null,id:70,tag:"pa",version:"Release 7"};var df={language:"Quechua",location:null,id:107,tag:"quz",version:"Release 7"};var gf={language:"Ripuarian",location:null,id:4096,tag:"ksh",version:"Release 10"};var pf={language:"Romanian",location:null,id:24,tag:"ro",version:"Release 7"};var vf={language:"Romansh",location:null,id:23,tag:"rm",version:"Release 7"};var mf={language:"Rombo",location:null,id:4096,tag:"rof",version:"Release 10"};var yf={language:"Rundi",location:null,id:4096,tag:"rn",version:"Release 10"};var _f={language:"Russian",location:null,id:25,tag:"ru",version:"Release 7"};var bf={language:"Rwa",location:null,id:4096,tag:"rwk",version:"Release 10"};var wf={language:"Saho",location:null,id:4096,tag:"ssy",version:"Release 10"};var xf={language:"Sakha",location:null,id:133,tag:"sah",version:"Release 7"};var kf={language:"Samburu",location:null,id:4096,tag:"saq",version:"Release 10"};var Sf={language:"Sami (Inari)",location:null,id:28731,tag:"smn",version:"Windows 7"};var Cf={language:"Sami (Lule)",location:null,id:31803,tag:"smj",version:"Windows 7"};var Ef={language:"Sami (Northern)",location:null,id:59,tag:"se",version:"Release 7"};var Af={language:"Sami (Skolt)",location:null,id:29755,tag:"sms",version:"Windows 7"};var Mf={language:"Sami (Southern)",location:null,id:30779,tag:"sma",version:"Windows 7"};var Rf={language:"Sango",location:null,id:4096,tag:"sg",version:"Release 10"};var Tf={language:"Sangu",location:null,id:4096,tag:"sbp",version:"Release 10"};var Of={language:"Sanskrit",location:null,id:79,tag:"sa",version:"Release 7"};var Bf={language:"Scottish Gaelic",location:null,id:145,tag:"gd",version:"Windows 7"};var Pf={language:"Sena",location:null,id:4096,tag:"seh",version:"Release 10"};var Nf={language:"Serbian (Latin)",location:null,id:31770,tag:"sr",version:"Release 7"};var Df={language:"Sesotho sa Leboa",location:null,id:108,tag:"nso",version:"Release 7"};var zf={language:"Setswana",location:null,id:50,tag:"tn",version:"Release 7"};var jf={language:"Shambala",location:null,id:4096,tag:"ksb",version:"Release 10"};var Lf={language:"Shona",location:null,id:4096,tag:"sn",version:"Release 8.1"};var Ff={language:"Sindhi",location:null,id:89,tag:"sd",version:"Release 8"};var If={language:"Sinhala",location:null,id:91,tag:"si",version:"Release 7"};var Hf={language:"Slovak",location:null,id:27,tag:"sk",version:"Release 7"};var Vf={language:"Slovenian",location:null,id:36,tag:"sl",version:"Release 7"};var Gf={language:"Soga",location:null,id:4096,tag:"xog",version:"Release 10"};var Uf={language:"Somali",location:null,id:119,tag:"so",version:"Release 8.1"};var qf={language:"Sotho",location:null,id:48,tag:"st",version:"Release 8.1"};var Wf={language:"South Ndebele",location:null,id:4096,tag:"nr",version:"Release 10"};var Kf={language:"Spanish",location:null,id:10,tag:"es",version:"Release 7"};var Yf={language:"Standard Moroccan ",location:null,id:4096,tag:"zgh",version:"Release 8.1"};var Xf={language:"Swati",location:null,id:4096,tag:"ss",version:"Release 10"};var $f={language:"Swedish",location:null,id:29,tag:"sv",version:"Release 7"};var Zf={language:"Syriac",location:null,id:90,tag:"syr",version:"Release 7"};var Jf={language:"Tachelhit",location:null,id:4096,tag:"shi",version:"Release 10"};var Qf={language:"Taita",location:null,id:4096,tag:"dav",version:"Release 10"};var td={language:"Tajik (Cyrillic)",location:null,id:40,tag:"tg",version:"Release 7"};var ed={language:"Tamazight (Latin)",location:null,id:95,tag:"tzm",version:"Release 7"};var nd={language:"Tamil",location:null,id:73,tag:"ta",version:"Release 7"};var id={language:"Tasawaq",location:null,id:4096,tag:"twq",version:"Release 10"};var rd={language:"Tatar",location:null,id:68,tag:"tt",version:"Release 7"};var ad={language:"Telugu",location:null,id:74,tag:"te",version:"Release 7"};var od={language:"Teso",location:null,id:4096,tag:"teo",version:"Release 10"};var sd={language:"Thai",location:null,id:30,tag:"th",version:"Release 7"};var ld={language:"Tibetan",location:null,id:81,tag:"bo",version:"Release 7"};var ud={language:"Tigre",location:null,id:4096,tag:"tig",version:"Release 10"};var cd={language:"Tigrinya",location:null,id:115,tag:"ti",version:"Release 8"};var hd={language:"Tongan",location:null,id:4096,tag:"to",version:"Release 10"};var fd={language:"Tsonga",location:null,id:49,tag:"ts",version:"Release 8.1"};var dd={language:"Turkish",location:null,id:31,tag:"tr",version:"Release 7"};var gd={language:"Turkmen",location:null,id:66,tag:"tk",version:"Release 7"};var pd={language:"Ukrainian",location:null,id:34,tag:"uk",version:"Release 7"};var vd={language:"Upper Sorbian",location:null,id:46,tag:"hsb",version:"Release 7"};var md={language:"Urdu",location:null,id:32,tag:"ur",version:"Release 7"};var yd={language:"Uyghur",location:null,id:128,tag:"ug",version:"Release 7"};var _d={language:"Uzbek (Latin)",location:null,id:67,tag:"uz",version:"Release 7"};var bd={language:"Vai",location:null,id:4096,tag:"vai",version:"Release 10"};var wd={language:"Venda",location:null,id:51,tag:"ve",version:"Release 10"};var xd={language:"Vietnamese",location:null,id:42,tag:"vi",version:"Release 7"};var kd={language:"Volapük",location:null,id:4096,tag:"vo",version:"Release 10"};var Sd={language:"Vunjo",location:null,id:4096,tag:"vun",version:"Release 10"};var Cd={language:"Walser",location:null,id:4096,tag:"wae",version:"Release 10"};var Ed={language:"Welsh",location:null,id:82,tag:"cy",version:"Release 7"};var Ad={language:"Wolaytta",location:null,id:4096,tag:"wal",version:"Release 10"};var Md={language:"Wolof",location:null,id:136,tag:"wo",version:"Release 7"};var Rd={language:"Xhosa",location:null,id:52,tag:"xh",version:"Release 7"};var Td={language:"Yangben",location:null,id:4096,tag:"yav",version:"Release 10"};var Od={language:"Yi",location:null,id:120,tag:"ii",version:"Release 7"};var Bd={language:"Yoruba",location:null,id:106,tag:"yo",version:"Release 7"};var Pd={language:"Zarma",location:null,id:4096,tag:"dje",version:"Release 10"};var Nd={language:"Zulu",location:null,id:53,tag:"zu",version:"Release 7"};var Dd={aa:Su,"aa-dj":{language:"Afar",location:"Djibouti",id:4096,tag:"aa-DJ",version:"Release 10"},"aa-er":{language:"Afar",location:"Eritrea",id:4096,tag:"aa-ER",version:"Release 10"},"aa-et":{language:"Afar",location:"Ethiopia",id:4096,tag:"aa-ET",version:"Release 10"},af:Cu,"af-na":{language:"Afrikaans",location:"Namibia",id:4096,tag:"af-NA",version:"Release 10"},"af-za":{language:"Afrikaans",location:"South Africa",id:1078,tag:"af-ZA",version:"Release B"},agq:Eu,"agq-cm":{language:"Aghem",location:"Cameroon",id:4096,tag:"agq-CM",version:"Release 10"},ak:Au,"ak-gh":{language:"Akan",location:"Ghana",id:4096,tag:"ak-GH",version:"Release 10"},sq:Mu,"sq-al":{language:"Albanian",location:"Albania",id:1052,tag:"sq-AL",version:"Release B"},"sq-mk":{language:"Albanian",location:"North Macedonia",id:4096,tag:"sq-MK",version:"Release 10"},gsw:Ru,"gsw-fr":{language:"Alsatian",location:"France",id:1156,tag:"gsw-FR",version:"Release V"},"gsw-li":{language:"Alsatian",location:"Liechtenstein",id:4096,tag:"gsw-LI",version:"Release 10"},"gsw-ch":{language:"Alsatian",location:"Switzerland",id:4096,tag:"gsw-CH",version:"Release 10"},am:Tu,"am-et":{language:"Amharic",location:"Ethiopia",id:1118,tag:"am-ET",version:"Release V"},ar:Ou,"ar-dz":{language:"Arabic",location:"Algeria",id:5121,tag:"ar-DZ",version:"Release B"},"ar-bh":{language:"Arabic",location:"Bahrain",id:15361,tag:"ar-BH",version:"Release B"},"ar-td":{language:"Arabic",location:"Chad",id:4096,tag:"ar-TD",version:"Release 10"},"ar-km":{language:"Arabic",location:"Comoros",id:4096,tag:"ar-KM",version:"Release 10"},"ar-dj":{language:"Arabic",location:"Djibouti",id:4096,tag:"ar-DJ",version:"Release 10"},"ar-eg":{language:"Arabic",location:"Egypt",id:3073,tag:"ar-EG",version:"Release B"},"ar-er":{language:"Arabic",location:"Eritrea",id:4096,tag:"ar-ER",version:"Release 10"},"ar-iq":{language:"Arabic",location:"Iraq",id:2049,tag:"ar-IQ",version:"Release B"},"ar-il":{language:"Arabic",location:"Israel",id:4096,tag:"ar-IL",version:"Release 10"},"ar-jo":{language:"Arabic",location:"Jordan",id:11265,tag:"ar-JO",version:"Release B"},"ar-kw":{language:"Arabic",location:"Kuwait",id:13313,tag:"ar-KW",version:"Release B"},"ar-lb":{language:"Arabic",location:"Lebanon",id:12289,tag:"ar-LB",version:"Release B"},"ar-ly":{language:"Arabic",location:"Libya",id:4097,tag:"ar-LY",version:"Release B"},"ar-mr":{language:"Arabic",location:"Mauritania",id:4096,tag:"ar-MR",version:"Release 10"},"ar-ma":{language:"Arabic",location:"Morocco",id:6145,tag:"ar-MA",version:"Release B"},"ar-om":{language:"Arabic",location:"Oman",id:8193,tag:"ar-OM",version:"Release B"},"ar-ps":{language:"Arabic",location:"Palestinian Authority",id:4096,tag:"ar-PS",version:"Release 10"},"ar-qa":{language:"Arabic",location:"Qatar",id:16385,tag:"ar-QA",version:"Release B"},"ar-sa":{language:"Arabic",location:"Saudi Arabia",id:1025,tag:"ar-SA",version:"Release B"},"ar-so":{language:"Arabic",location:"Somalia",id:4096,tag:"ar-SO",version:"Release 10"},"ar-ss":{language:"Arabic",location:"South Sudan",id:4096,tag:"ar-SS",version:"Release 10"},"ar-sd":{language:"Arabic",location:"Sudan",id:4096,tag:"ar-SD",version:"Release 10"},"ar-sy":{language:"Arabic",location:"Syria",id:10241,tag:"ar-SY",version:"Release B"},"ar-tn":{language:"Arabic",location:"Tunisia",id:7169,tag:"ar-TN",version:"Release B"},"ar-ae":{language:"Arabic",location:"U.A.E.",id:14337,tag:"ar-AE",version:"Release B"},"ar-001":{language:"Arabic",location:"World",id:4096,tag:"ar-001",version:"Release 10"},"ar-ye":{language:"Arabic",location:"Yemen",id:9217,tag:"ar-YE",version:"Release B"},hy:Bu,"hy-am":{language:"Armenian",location:"Armenia",id:1067,tag:"hy-AM",version:"Release C"},as:Pu,"as-in":{language:"Assamese",location:"India",id:1101,tag:"as-IN",version:"Release V"},ast:Nu,"ast-es":{language:"Asturian",location:"Spain",id:4096,tag:"ast-ES",version:"Release 10"},asa:Du,"asa-tz":{language:"Asu",location:"Tanzania",id:4096,tag:"asa-TZ",version:"Release 10"},"az-cyrl":{language:"Azerbaijani (Cyrillic)",location:null,id:29740,tag:"az-Cyrl",version:"Windows 7"},"az-cyrl-az":{language:"Azerbaijani (Cyrillic)",location:"Azerbaijan",id:2092,tag:"az-Cyrl-AZ",version:"Release C"},az:zu,"az-latn":{language:"Azerbaijani (Latin)",location:null,id:30764,tag:"az-Latn",version:"Windows 7"},"az-latn-az":{language:"Azerbaijani (Latin)",location:"Azerbaijan",id:1068,tag:"az-Latn-AZ",version:"Release C"},ksf:ju,"ksf-cm":{language:"Bafia",location:"Cameroon",id:4096,tag:"ksf-CM",version:"Release 10"},bm:Lu,"bm-latn-ml":{language:"Bamanankan (Latin)",location:"Mali",id:4096,tag:"bm-Latn-ML",version:"Release 10"},bn:Fu,"bn-bd":{language:"Bangla",location:"Bangladesh",id:2117,tag:"bn-BD",version:"Release V"},"bn-in":{language:"Bangla",location:"India",id:1093,tag:"bn-IN",version:"Release E1"},bas:Iu,"bas-cm":{language:"Basaa",location:"Cameroon",id:4096,tag:"bas-CM",version:"Release 10"},ba:Hu,"ba-ru":{language:"Bashkir",location:"Russia",id:1133,tag:"ba-RU",version:"Release V"},eu:Vu,"eu-es":{language:"Basque",location:"Spain",id:1069,tag:"eu-ES",version:"Release B"},be:Gu,"be-by":{language:"Belarusian",location:"Belarus",id:1059,tag:"be-BY",version:"Release B"},bem:Uu,"bem-zm":{language:"Bemba",location:"Zambia",id:4096,tag:"bem-ZM",version:"Release 10"},bez:qu,"bez-tz":{language:"Bena",location:"Tanzania",id:4096,tag:"bez-TZ",version:"Release 10"},byn:Wu,"byn-er":{language:"Blin",location:"Eritrea",id:4096,tag:"byn-ER",version:"Release 10"},brx:Ku,"brx-in":{language:"Bodo",location:"India",id:4096,tag:"brx-IN",version:"Release 10"},"bs-cyrl":{language:"Bosnian (Cyrillic)",location:null,id:25626,tag:"bs-Cyrl",version:"Windows 7"},"bs-cyrl-ba":{language:"Bosnian (Cyrillic)",location:"Bosnia and Herzegovina",id:8218,tag:"bs-Cyrl-BA",version:"Release E1"},"bs-latn":{language:"Bosnian (Latin)",location:null,id:26650,tag:"bs-Latn",version:"Windows 7"},bs:Yu,"bs-latn-ba":{language:"Bosnian (Latin)",location:"Bosnia and Herzegovina",id:5146,tag:"bs-Latn-BA",version:"Release E1"},br:Xu,"br-fr":{language:"Breton",location:"France",id:1150,tag:"br-FR",version:"Release V"},bg:$u,"bg-bg":{language:"Bulgarian",location:"Bulgaria",id:1026,tag:"bg-BG",version:"Release B"},my:Zu,"my-mm":{language:"Burmese",location:"Myanmar",id:1109,tag:"my-MM",version:"Release 8.1"},ca:Ju,"ca-ad":{language:"Catalan",location:"Andorra",id:4096,tag:"ca-AD",version:"Release 10"},"ca-fr":{language:"Catalan",location:"France",id:4096,tag:"ca-FR",version:"Release 10"},"ca-it":{language:"Catalan",location:"Italy",id:4096,tag:"ca-IT",version:"Release 10"},"ca-es":{language:"Catalan",location:"Spain",id:1027,tag:"ca-ES",version:"Release B"},"tzm-latn-":{language:"Central Atlas Tamazight ",location:"Morocco",id:4096,tag:"tzm-Latn-",version:"Release 10"},ku:Qu,"ku-arab":{language:"Central Kurdish",location:null,id:31890,tag:"ku-Arab",version:"Release 8"},"ku-arab-iq":{language:"Central Kurdish",location:"Iraq",id:1170,tag:"ku-Arab-IQ",version:"Release 8"},"cd-ru":{language:"Chechen",location:"Russia",id:4096,tag:"cd-RU",version:"Release 10.1"},chr:tc,"chr-cher":{language:"Cherokee",location:null,id:31836,tag:"chr-Cher",version:"Release 8"},"chr-cher-us":{language:"Cherokee",location:"United States",id:1116,tag:"chr-Cher-US",version:"Release 8"},cgg:ec,"cgg-ug":{language:"Chiga",location:"Uganda",id:4096,tag:"cgg-UG",version:"Release 10"},"zh-hans":{language:"Chinese (Simplified)",location:null,id:4,tag:"zh-Hans",version:"Release A"},zh:nc,"zh-cn":{language:"Chinese (Simplified)",location:"People's Republic of China",id:2052,tag:"zh-CN",version:"Release A"},"zh-sg":{language:"Chinese (Simplified)",location:"Singapore",id:4100,tag:"zh-SG",version:"Release A"},"zh-hant":{language:"Chinese (Traditional)",location:null,id:31748,tag:"zh-Hant",version:"Release A"},"zh-hk":{language:"Chinese (Traditional)",location:"Hong Kong S.A.R.",id:3076,tag:"zh-HK",version:"Release A"},"zh-mo":{language:"Chinese (Traditional)",location:"Macao S.A.R.",id:5124,tag:"zh-MO",version:"Release D"},"zh-tw":{language:"Chinese (Traditional)",location:"Taiwan",id:1028,tag:"zh-TW",version:"Release A"},"cu-ru":{language:"Church Slavic",location:"Russia",id:4096,tag:"cu-RU",version:"Release 10.1"},swc:ic,"swc-cd":{language:"Congo Swahili",location:"Congo DRC",id:4096,tag:"swc-CD",version:"Release 10"},kw:rc,"kw-gb":{language:"Cornish",location:"United Kingdom",id:4096,tag:"kw-GB",version:"Release 10"},co:ac,"co-fr":{language:"Corsican",location:"France",id:1155,tag:"co-FR",version:"Release V"},"hr,":{language:"Croatian",location:null,id:26,tag:"hr,",version:"Release 7"},"hr-hr":{language:"Croatian",location:"Croatia",id:1050,tag:"hr-HR",version:"Release A"},"hr-ba":{language:"Croatian (Latin)",location:"Bosnia and Herzegovina",id:4122,tag:"hr-BA",version:"Release E1"},cs:oc,"cs-cz":{language:"Czech",location:"Czech Republic",id:1029,tag:"cs-CZ",version:"Release A"},da:sc,"da-dk":{language:"Danish",location:"Denmark",id:1030,tag:"da-DK",version:"Release A"},"da-gl":{language:"Danish",location:"Greenland",id:4096,tag:"da-GL",version:"Release 10"},prs:lc,"prs-af":{language:"Dari",location:"Afghanistan",id:1164,tag:"prs-AF",version:"Release V"},dv:uc,"dv-mv":{language:"Divehi",location:"Maldives",id:1125,tag:"dv-MV",version:"ReleaseD"},dua:cc,"dua-cm":{language:"Duala",location:"Cameroon",id:4096,tag:"dua-CM",version:"Release 10"},nl:hc,"nl-aw":{language:"Dutch",location:"Aruba",id:4096,tag:"nl-AW",version:"Release 10"},"nl-be":{language:"Dutch",location:"Belgium",id:2067,tag:"nl-BE",version:"Release A"},"nl-bq":{language:"Dutch",location:"Bonaire, Sint Eustatius and Saba",id:4096,tag:"nl-BQ",version:"Release 10"},"nl-cw":{language:"Dutch",location:"Curaçao",id:4096,tag:"nl-CW",version:"Release 10"},"nl-nl":{language:"Dutch",location:"Netherlands",id:1043,tag:"nl-NL",version:"Release A"},"nl-sx":{language:"Dutch",location:"Sint Maarten",id:4096,tag:"nl-SX",version:"Release 10"},"nl-sr":{language:"Dutch",location:"Suriname",id:4096,tag:"nl-SR",version:"Release 10"},dz:fc,"dz-bt":{language:"Dzongkha",location:"Bhutan",id:3153,tag:"dz-BT",version:"Release 10"},ebu:dc,"ebu-ke":{language:"Embu",location:"Kenya",id:4096,tag:"ebu-KE",version:"Release 10"},en:gc,"en-as":{language:"English",location:"American Samoa",id:4096,tag:"en-AS",version:"Release 10"},"en-ai":{language:"English",location:"Anguilla",id:4096,tag:"en-AI",version:"Release 10"},"en-ag":{language:"English",location:"Antigua and Barbuda",id:4096,tag:"en-AG",version:"Release 10"},"en-au":{language:"English",location:"Australia",id:3081,tag:"en-AU",version:"Release A"},"en-at":{language:"English",location:"Austria",id:4096,tag:"en-AT",version:"Release 10.1"},"en-bs":{language:"English",location:"Bahamas",id:4096,tag:"en-BS",version:"Release 10"},"en-bb":{language:"English",location:"Barbados",id:4096,tag:"en-BB",version:"Release 10"},"en-be":{language:"English",location:"Belgium",id:4096,tag:"en-BE",version:"Release 10"},"en-bz":{language:"English",location:"Belize",id:10249,tag:"en-BZ",version:"Release B"},"en-bm":{language:"English",location:"Bermuda",id:4096,tag:"en-BM",version:"Release 10"},"en-bw":{language:"English",location:"Botswana",id:4096,tag:"en-BW",version:"Release 10"},"en-io":{language:"English",location:"British Indian Ocean Territory",id:4096,tag:"en-IO",version:"Release 10"},"en-vg":{language:"English",location:"British Virgin Islands",id:4096,tag:"en-VG",version:"Release 10"},"en-bi":{language:"English",location:"Burundi",id:4096,tag:"en-BI",version:"Release 10.1"},"en-cm":{language:"English",location:"Cameroon",id:4096,tag:"en-CM",version:"Release 10"},"en-ca":{language:"English",location:"Canada",id:4105,tag:"en-CA",version:"Release A"},"en-029":{language:"English",location:"Caribbean",id:9225,tag:"en-029",version:"Release B"},"en-ky":{language:"English",location:"Cayman Islands",id:4096,tag:"en-KY",version:"Release 10"},"en-cx":{language:"English",location:"Christmas Island",id:4096,tag:"en-CX",version:"Release 10"},"en-cc":{language:"English",location:"Cocos [Keeling] Islands",id:4096,tag:"en-CC",version:"Release 10"},"en-ck":{language:"English",location:"Cook Islands",id:4096,tag:"en-CK",version:"Release 10"},"en-cy":{language:"English",location:"Cyprus",id:4096,tag:"en-CY",version:"Release 10.1"},"en-dk":{language:"English",location:"Denmark",id:4096,tag:"en-DK",version:"Release 10.1"},"en-dm":{language:"English",location:"Dominica",id:4096,tag:"en-DM",version:"Release 10"},"en-er":{language:"English",location:"Eritrea",id:4096,tag:"en-ER",version:"Release 10"},"en-150":{language:"English",location:"Europe",id:4096,tag:"en-150",version:"Release 10"},"en-fk":{language:"English",location:"Falkland Islands",id:4096,tag:"en-FK",version:"Release 10"},"en-fi":{language:"English",location:"Finland",id:4096,tag:"en-FI",version:"Release 10.1"},"en-fj":{language:"English",location:"Fiji",id:4096,tag:"en-FJ",version:"Release 10"},"en-gm":{language:"English",location:"Gambia",id:4096,tag:"en-GM",version:"Release 10"},"en-de":{language:"English",location:"Germany",id:4096,tag:"en-DE",version:"Release 10.1"},"en-gh":{language:"English",location:"Ghana",id:4096,tag:"en-GH",version:"Release 10"},"en-gi":{language:"English",location:"Gibraltar",id:4096,tag:"en-GI",version:"Release 10"},"en-gd":{language:"English",location:"Grenada",id:4096,tag:"en-GD",version:"Release 10"},"en-gu":{language:"English",location:"Guam",id:4096,tag:"en-GU",version:"Release 10"},"en-gg":{language:"English",location:"Guernsey",id:4096,tag:"en-GG",version:"Release 10"},"en-gy":{language:"English",location:"Guyana",id:4096,tag:"en-GY",version:"Release 10"},"en-hk":{language:"English",location:"Hong Kong",id:15369,tag:"en-HK",version:"Release 8.1"},"en-in":{language:"English",location:"India",id:16393,tag:"en-IN",version:"Release V"},"en-ie":{language:"English",location:"Ireland",id:6153,tag:"en-IE",version:"Release A"},"en-im":{language:"English",location:"Isle of Man",id:4096,tag:"en-IM",version:"Release 10"},"en-il":{language:"English",location:"Israel",id:4096,tag:"en-IL",version:"Release 10.1"},"en-jm":{language:"English",location:"Jamaica",id:8201,tag:"en-JM",version:"Release B"},"en-je":{language:"English",location:"Jersey",id:4096,tag:"en-JE",version:"Release 10"},"en-ke":{language:"English",location:"Kenya",id:4096,tag:"en-KE",version:"Release 10"},"en-ki":{language:"English",location:"Kiribati",id:4096,tag:"en-KI",version:"Release 10"},"en-ls":{language:"English",location:"Lesotho",id:4096,tag:"en-LS",version:"Release 10"},"en-lr":{language:"English",location:"Liberia",id:4096,tag:"en-LR",version:"Release 10"},"en-mo":{language:"English",location:"Macao SAR",id:4096,tag:"en-MO",version:"Release 10"},"en-mg":{language:"English",location:"Madagascar",id:4096,tag:"en-MG",version:"Release 10"},"en-mw":{language:"English",location:"Malawi",id:4096,tag:"en-MW",version:"Release 10"},"en-my":{language:"English",location:"Malaysia",id:17417,tag:"en-MY",version:"Release V"},"en-mt":{language:"English",location:"Malta",id:4096,tag:"en-MT",version:"Release 10"},"en-mh":{language:"English",location:"Marshall Islands",id:4096,tag:"en-MH",version:"Release 10"},"en-mu":{language:"English",location:"Mauritius",id:4096,tag:"en-MU",version:"Release 10"},"en-fm":{language:"English",location:"Micronesia",id:4096,tag:"en-FM",version:"Release 10"},"en-ms":{language:"English",location:"Montserrat",id:4096,tag:"en-MS",version:"Release 10"},"en-na":{language:"English",location:"Namibia",id:4096,tag:"en-NA",version:"Release 10"},"en-nr":{language:"English",location:"Nauru",id:4096,tag:"en-NR",version:"Release 10"},"en-nl":{language:"English",location:"Netherlands",id:4096,tag:"en-NL",version:"Release 10.1"},"en-nz":{language:"English",location:"New Zealand",id:5129,tag:"en-NZ",version:"Release A"},"en-ng":{language:"English",location:"Nigeria",id:4096,tag:"en-NG",version:"Release 10"},"en-nu":{language:"English",location:"Niue",id:4096,tag:"en-NU",version:"Release 10"},"en-nf":{language:"English",location:"Norfolk Island",id:4096,tag:"en-NF",version:"Release 10"},"en-mp":{language:"English",location:"Northern Mariana Islands",id:4096,tag:"en-MP",version:"Release 10"},"en-pk":{language:"English",location:"Pakistan",id:4096,tag:"en-PK",version:"Release 10"},"en-pw":{language:"English",location:"Palau",id:4096,tag:"en-PW",version:"Release 10"},"en-pg":{language:"English",location:"Papua New Guinea",id:4096,tag:"en-PG",version:"Release 10"},"en-pn":{language:"English",location:"Pitcairn Islands",id:4096,tag:"en-PN",version:"Release 10"},"en-pr":{language:"English",location:"Puerto Rico",id:4096,tag:"en-PR",version:"Release 10"},"en-ph":{language:"English",location:"Republic of the Philippines",id:13321,tag:"en-PH",version:"Release C"},"en-rw":{language:"English",location:"Rwanda",id:4096,tag:"en-RW",version:"Release 10"},"en-kn":{language:"English",location:"Saint Kitts and Nevis",id:4096,tag:"en-KN",version:"Release 10"},"en-lc":{language:"English",location:"Saint Lucia",id:4096,tag:"en-LC",version:"Release 10"},"en-vc":{language:"English",location:"Saint Vincent and the Grenadines",id:4096,tag:"en-VC",version:"Release 10"},"en-ws":{language:"English",location:"Samoa",id:4096,tag:"en-WS",version:"Release 10"},"en-sc":{language:"English",location:"Seychelles",id:4096,tag:"en-SC",version:"Release 10"},"en-sl":{language:"English",location:"Sierra Leone",id:4096,tag:"en-SL",version:"Release 10"},"en-sg":{language:"English",location:"Singapore",id:18441,tag:"en-SG",version:"Release V"},"en-sx":{language:"English",location:"Sint Maarten",id:4096,tag:"en-SX",version:"Release 10"},"en-si":{language:"English",location:"Slovenia",id:4096,tag:"en-SI",version:"Release 10.1"},"en-sb":{language:"English",location:"Solomon Islands",id:4096,tag:"en-SB",version:"Release 10"},"en-za":{language:"English",location:"South Africa",id:7177,tag:"en-ZA",version:"Release B"},"en-ss":{language:"English",location:"South Sudan",id:4096,tag:"en-SS",version:"Release 10"},"en-sh":{language:"English",location:"St Helena, Ascension, Tristan da ",id:4096,tag:"en-SH",version:"Release 10"},"en-sd":{language:"English",location:"Sudan",id:4096,tag:"en-SD",version:"Release 10"},"en-sz":{language:"English",location:"Swaziland",id:4096,tag:"en-SZ",version:"Release 10"},"en-se":{language:"English",location:"Sweden",id:4096,tag:"en-SE",version:"Release 10.1"},"en-ch":{language:"English",location:"Switzerland",id:4096,tag:"en-CH",version:"Release 10.1"},"en-tz":{language:"English",location:"Tanzania",id:4096,tag:"en-TZ",version:"Release 10"},"en-tk":{language:"English",location:"Tokelau",id:4096,tag:"en-TK",version:"Release 10"},"en-to":{language:"English",location:"Tonga",id:4096,tag:"en-TO",version:"Release 10"},"en-tt":{language:"English",location:"Trinidad and Tobago",id:11273,tag:"en-TT",version:"Release B"},"en-tc":{language:"English",location:"Turks and Caicos Islands",id:4096,tag:"en-TC",version:"Release 10"},"en-tv":{language:"English",location:"Tuvalu",id:4096,tag:"en-TV",version:"Release 10"},"en-ug":{language:"English",location:"Uganda",id:4096,tag:"en-UG",version:"Release 10"},"en-gb":{language:"English",location:"United Kingdom",id:2057,tag:"en-GB",version:"Release A"},"en-us":{language:"English",location:"United States",id:1033,tag:"en-US",version:"Release A"},"en-um":{language:"English",location:"US Minor Outlying Islands",id:4096,tag:"en-UM",version:"Release 10"},"en-vi":{language:"English",location:"US Virgin Islands",id:4096,tag:"en-VI",version:"Release 10"},"en-vu":{language:"English",location:"Vanuatu",id:4096,tag:"en-VU",version:"Release 10"},"en-001":{language:"English",location:"World",id:4096,tag:"en-001",version:"Release 10"},"en-zm":{language:"English",location:"Zambia",id:4096,tag:"en-ZM",version:"Release 10"},"en-zw":{language:"English",location:"Zimbabwe",id:12297,tag:"en-ZW",version:"Release C"},eo:pc,"eo-001":{language:"Esperanto",location:"World",id:4096,tag:"eo-001",version:"Release 10"},et:vc,"et-ee":{language:"Estonian",location:"Estonia",id:1061,tag:"et-EE",version:"Release B"},ee:mc,"ee-gh":{language:"Ewe",location:"Ghana",id:4096,tag:"ee-GH",version:"Release 10"},"ee-tg":{language:"Ewe",location:"Togo",id:4096,tag:"ee-TG",version:"Release 10"},ewo:yc,"ewo-cm":{language:"Ewondo",location:"Cameroon",id:4096,tag:"ewo-CM",version:"Release 10"},fo:_c,"fo-dk":{language:"Faroese",location:"Denmark",id:4096,tag:"fo-DK",version:"Release 10.1"},"fo-fo":{language:"Faroese",location:"Faroe Islands",id:1080,tag:"fo-FO",version:"Release B"},fil:bc,"fil-ph":{language:"Filipino",location:"Philippines",id:1124,tag:"fil-PH",version:"Release E2"},fi:wc,"fi-fi":{language:"Finnish",location:"Finland",id:1035,tag:"fi-FI",version:"Release A"},fr:xc,"fr-dz":{language:"French",location:"Algeria",id:4096,tag:"fr-DZ",version:"Release 10"},"fr-be":{language:"French",location:"Belgium",id:2060,tag:"fr-BE",version:"Release A"},"fr-bj":{language:"French",location:"Benin",id:4096,tag:"fr-BJ",version:"Release 10"},"fr-bf":{language:"French",location:"Burkina Faso",id:4096,tag:"fr-BF",version:"Release 10"},"fr-bi":{language:"French",location:"Burundi",id:4096,tag:"fr-BI",version:"Release 10"},"fr-cm":{language:"French",location:"Cameroon",id:11276,tag:"fr-CM",version:"Release 8.1"},"fr-ca":{language:"French",location:"Canada",id:3084,tag:"fr-CA",version:"Release A"},"fr-cf":{language:"French",location:"Central African Republic",id:4096,tag:"fr-CF",version:"Release 10"},"fr-td":{language:"French",location:"Chad",id:4096,tag:"fr-TD",version:"Release 10"},"fr-km":{language:"French",location:"Comoros",id:4096,tag:"fr-KM",version:"Release 10"},"fr-cg":{language:"French",location:"Congo",id:4096,tag:"fr-CG",version:"Release 10"},"fr-cd":{language:"French",location:"Congo, DRC",id:9228,tag:"fr-CD",version:"Release 8.1"},"fr-ci":{language:"French",location:"Côte d'Ivoire",id:12300,tag:"fr-CI",version:"Release 8.1"},"fr-dj":{language:"French",location:"Djibouti",id:4096,tag:"fr-DJ",version:"Release 10"},"fr-gq":{language:"French",location:"Equatorial Guinea",id:4096,tag:"fr-GQ",version:"Release 10"},"fr-fr":{language:"French",location:"France",id:1036,tag:"fr-FR",version:"Release A"},"fr-gf":{language:"French",location:"French Guiana",id:4096,tag:"fr-GF",version:"Release 10"},"fr-pf":{language:"French",location:"French Polynesia",id:4096,tag:"fr-PF",version:"Release 10"},"fr-ga":{language:"French",location:"Gabon",id:4096,tag:"fr-GA",version:"Release 10"},"fr-gp":{language:"French",location:"Guadeloupe",id:4096,tag:"fr-GP",version:"Release 10"},"fr-gn":{language:"French",location:"Guinea",id:4096,tag:"fr-GN",version:"Release 10"},"fr-ht":{language:"French",location:"Haiti",id:15372,tag:"fr-HT",version:"Release 8.1"},"fr-lu":{language:"French",location:"Luxembourg",id:5132,tag:"fr-LU",version:"Release A"},"fr-mg":{language:"French",location:"Madagascar",id:4096,tag:"fr-MG",version:"Release 10"},"fr-ml":{language:"French",location:"Mali",id:13324,tag:"fr-ML",version:"Release 8.1"},"fr-mq":{language:"French",location:"Martinique",id:4096,tag:"fr-MQ",version:"Release 10"},"fr-mr":{language:"French",location:"Mauritania",id:4096,tag:"fr-MR",version:"Release 10"},"fr-mu":{language:"French",location:"Mauritius",id:4096,tag:"fr-MU",version:"Release 10"},"fr-yt":{language:"French",location:"Mayotte",id:4096,tag:"fr-YT",version:"Release 10"},"fr-ma":{language:"French",location:"Morocco",id:14348,tag:"fr-MA",version:"Release 8.1"},"fr-nc":{language:"French",location:"New Caledonia",id:4096,tag:"fr-NC",version:"Release 10"},"fr-ne":{language:"French",location:"Niger",id:4096,tag:"fr-NE",version:"Release 10"},"fr-mc":{language:"French",location:"Principality of Monaco",id:6156,tag:"fr-MC",version:"Release A"},"fr-re":{language:"French",location:"Reunion",id:8204,tag:"fr-RE",version:"Release 8.1"},"fr-rw":{language:"French",location:"Rwanda",id:4096,tag:"fr-RW",version:"Release 10"},"fr-bl":{language:"French",location:"Saint Barthélemy",id:4096,tag:"fr-BL",version:"Release 10"},"fr-mf":{language:"French",location:"Saint Martin",id:4096,tag:"fr-MF",version:"Release 10"},"fr-pm":{language:"French",location:"Saint Pierre and Miquelon",id:4096,tag:"fr-PM",version:"Release 10"},"fr-sn":{language:"French",location:"Senegal",id:10252,tag:"fr-SN",version:"Release 8.1"},"fr-sc":{language:"French",location:"Seychelles",id:4096,tag:"fr-SC",version:"Release 10"},"fr-ch":{language:"French",location:"Switzerland",id:4108,tag:"fr-CH",version:"Release A"},"fr-sy":{language:"French",location:"Syria",id:4096,tag:"fr-SY",version:"Release 10"},"fr-tg":{language:"French",location:"Togo",id:4096,tag:"fr-TG",version:"Release 10"},"fr-tn":{language:"French",location:"Tunisia",id:4096,tag:"fr-TN",version:"Release 10"},"fr-vu":{language:"French",location:"Vanuatu",id:4096,tag:"fr-VU",version:"Release 10"},"fr-wf":{language:"French",location:"Wallis and Futuna",id:4096,tag:"fr-WF",version:"Release 10"},fy:kc,"fy-nl":{language:"Frisian",location:"Netherlands",id:1122,tag:"fy-NL",version:"Release E2"},fur:Sc,"fur-it":{language:"Friulian",location:"Italy",id:4096,tag:"fur-IT",version:"Release 10"},ff:Cc,"ff-latn":{language:"Fulah (Latin)",location:null,id:31847,tag:"ff-Latn",version:"Release 8"},"ff-latn-bf":{language:"Fulah (Latin)",location:"Burkina Faso",id:4096,tag:"ff-Latn-BF",version:"Release 10.4"},"ff-cm":{language:"Fulah",location:"Cameroon",id:4096,tag:"ff-CM",version:"Release 10"},"ff-latn-cm":{language:"Fulah (Latin)",location:"Cameroon",id:4096,tag:"ff-Latn-CM",version:"Release 10.4"},"ff-latn-gm":{language:"Fulah (Latin)",location:"Gambia",id:4096,tag:"ff-Latn-GM",version:"Release 10.4"},"ff-latn-gh":{language:"Fulah (Latin)",location:"Ghana",id:4096,tag:"ff-Latn-GH",version:"Release 10.4"},"ff-gn":{language:"Fulah",location:"Guinea",id:4096,tag:"ff-GN",version:"Release 10"},"ff-latn-gn":{language:"Fulah (Latin)",location:"Guinea",id:4096,tag:"ff-Latn-GN",version:"Release 10.4"},"ff-latn-gw":{language:"Fulah (Latin)",location:"Guinea-Bissau",id:4096,tag:"ff-Latn-GW",version:"Release 10.4"},"ff-latn-lr":{language:"Fulah (Latin)",location:"Liberia",id:4096,tag:"ff-Latn-LR",version:"Release 10.4"},"ff-mr":{language:"Fulah",location:"Mauritania",id:4096,tag:"ff-MR",version:"Release 10"},"ff-latn-mr":{language:"Fulah (Latin)",location:"Mauritania",id:4096,tag:"ff-Latn-MR",version:"Release 10.4"},"ff-latn-ne":{language:"Fulah (Latin)",location:"Niger",id:4096,tag:"ff-Latn-NE",version:"Release 10.4"},"ff-ng":{language:"Fulah",location:"Nigeria",id:4096,tag:"ff-NG",version:"Release 10"},"ff-latn-ng":{language:"Fulah (Latin)",location:"Nigeria",id:4096,tag:"ff-Latn-NG",version:"Release 10.4"},"ff-latn-sn":{language:"Fulah",location:"Senegal",id:2151,tag:"ff-Latn-SN",version:"Release 8"},"ff-latn-sl":{language:"Fulah (Latin)",location:"Sierra Leone",id:4096,tag:"ff-Latn-SL",version:"Release 10.4"},gl:Ec,"gl-es":{language:"Galician",location:"Spain",id:1110,tag:"gl-ES",version:"Release D"},lg:Ac,"lg-ug":{language:"Ganda",location:"Uganda",id:4096,tag:"lg-UG",version:"Release 10"},ka:Mc,"ka-ge":{language:"Georgian",location:"Georgia",id:1079,tag:"ka-GE",version:"Release C"},de:Rc,"de-at":{language:"German",location:"Austria",id:3079,tag:"de-AT",version:"Release A"},"de-be":{language:"German",location:"Belgium",id:4096,tag:"de-BE",version:"Release 10"},"de-de":{language:"German",location:"Germany",id:1031,tag:"de-DE",version:"Release A"},"de-it":{language:"German",location:"Italy",id:4096,tag:"de-IT",version:"Release 10.2"},"de-li":{language:"German",location:"Liechtenstein",id:5127,tag:"de-LI",version:"Release B"},"de-lu":{language:"German",location:"Luxembourg",id:4103,tag:"de-LU",version:"Release B"},"de-ch":{language:"German",location:"Switzerland",id:2055,tag:"de-CH",version:"Release A"},el:Tc,"el-cy":{language:"Greek",location:"Cyprus",id:4096,tag:"el-CY",version:"Release 10"},"el-gr":{language:"Greek",location:"Greece",id:1032,tag:"el-GR",version:"Release A"},kl:Oc,"kl-gl":{language:"Greenlandic",location:"Greenland",id:1135,tag:"kl-GL",version:"Release V"},gn:Bc,"gn-py":{language:"Guarani",location:"Paraguay",id:1140,tag:"gn-PY",version:"Release 8.1"},gu:Pc,"gu-in":{language:"Gujarati",location:"India",id:1095,tag:"gu-IN",version:"Release D"},guz:Nc,"guz-ke":{language:"Gusii",location:"Kenya",id:4096,tag:"guz-KE",version:"Release 10"},ha:Dc,"ha-latn":{language:"Hausa (Latin)",location:null,id:31848,tag:"ha-Latn",version:"Windows 7"},"ha-latn-gh":{language:"Hausa (Latin)",location:"Ghana",id:4096,tag:"ha-Latn-GH",version:"Release 10"},"ha-latn-ne":{language:"Hausa (Latin)",location:"Niger",id:4096,tag:"ha-Latn-NE",version:"Release 10"},"ha-latn-ng":{language:"Hausa (Latin)",location:"Nigeria",id:1128,tag:"ha-Latn-NG",version:"Release V"},haw:zc,"haw-us":{language:"Hawaiian",location:"United States",id:1141,tag:"haw-US",version:"Release 8"},he:jc,"he-il":{language:"Hebrew",location:"Israel",id:1037,tag:"he-IL",version:"Release B"},hi:Lc,"hi-in":{language:"Hindi",location:"India",id:1081,tag:"hi-IN",version:"Release C"},hu:Fc,"hu-hu":{language:"Hungarian",location:"Hungary",id:1038,tag:"hu-HU",version:"Release A"},is:Ic,"is-is":{language:"Icelandic",location:"Iceland",id:1039,tag:"is-IS",version:"Release A"},ig:Hc,"ig-ng":{language:"Igbo",location:"Nigeria",id:1136,tag:"ig-NG",version:"Release V"},id:Vc,"id-id":{language:"Indonesian",location:"Indonesia",id:1057,tag:"id-ID",version:"Release B"},ia:Gc,"ia-fr":{language:"Interlingua",location:"France",id:4096,tag:"ia-FR",version:"Release 10"},"ia-001":{language:"Interlingua",location:"World",id:4096,tag:"ia-001",version:"Release 10"},iu:Uc,"iu-latn":{language:"Inuktitut (Latin)",location:null,id:31837,tag:"iu-Latn",version:"Windows 7"},"iu-latn-ca":{language:"Inuktitut (Latin)",location:"Canada",id:2141,tag:"iu-Latn-CA",version:"Release E2"},"iu-cans":{language:"Inuktitut (Syllabics)",location:null,id:30813,tag:"iu-Cans",version:"Windows 7"},"iu-cans-ca":{language:"Inuktitut (Syllabics)",location:"Canada",id:1117,tag:"iu-Cans-CA",version:"Release V"},ga:qc,"ga-ie":{language:"Irish",location:"Ireland",id:2108,tag:"ga-IE",version:"Release E2"},it:Wc,"it-it":{language:"Italian",location:"Italy",id:1040,tag:"it-IT",version:"Release A"},"it-sm":{language:"Italian",location:"San Marino",id:4096,tag:"it-SM",version:"Release 10"},"it-ch":{language:"Italian",location:"Switzerland",id:2064,tag:"it-CH",version:"Release A"},"it-va":{language:"Italian",location:"Vatican City",id:4096,tag:"it-VA",version:"Release 10.3"},ja:Kc,"ja-jp":{language:"Japanese",location:"Japan",id:1041,tag:"ja-JP",version:"Release A"},jv:Yc,"jv-latn":{language:"Javanese",location:"Latin",id:4096,tag:"jv-Latn",version:"Release 8.1"},"jv-latn-id":{language:"Javanese",location:"Latin, Indonesia",id:4096,tag:"jv-Latn-ID",version:"Release 8.1"},dyo:Xc,"dyo-sn":{language:"Jola-Fonyi",location:"Senegal",id:4096,tag:"dyo-SN",version:"Release 10"},kea:$c,"kea-cv":{language:"Kabuverdianu",location:"Cabo Verde",id:4096,tag:"kea-CV",version:"Release 10"},kab:Zc,"kab-dz":{language:"Kabyle",location:"Algeria",id:4096,tag:"kab-DZ",version:"Release 10"},kkj:Jc,"kkj-cm":{language:"Kako",location:"Cameroon",id:4096,tag:"kkj-CM",version:"Release 10"},kln:Qc,"kln-ke":{language:"Kalenjin",location:"Kenya",id:4096,tag:"kln-KE",version:"Release 10"},kam:th,"kam-ke":{language:"Kamba",location:"Kenya",id:4096,tag:"kam-KE",version:"Release 10"},kn:eh,"kn-in":{language:"Kannada",location:"India",id:1099,tag:"kn-IN",version:"Release D"},ks:nh,"ks-arab":{language:"Kashmiri",location:"Perso-Arabic",id:1120,tag:"ks-Arab",version:"Release 10"},"ks-arab-in":{language:"Kashmiri",location:"Perso-Arabic",id:4096,tag:"ks-Arab-IN",version:"Release 10"},kk:ih,"kk-kz":{language:"Kazakh",location:"Kazakhstan",id:1087,tag:"kk-KZ",version:"Release C"},km:rh,"km-kh":{language:"Khmer",location:"Cambodia",id:1107,tag:"km-KH",version:"Release V"},quc:ah,"quc-latn-gt":{language:"K'iche",location:"Guatemala",id:1158,tag:"quc-Latn-GT",version:"Release 10"},ki:oh,"ki-ke":{language:"Kikuyu",location:"Kenya",id:4096,tag:"ki-KE",version:"Release 10"},rw:sh,"rw-rw":{language:"Kinyarwanda",location:"Rwanda",id:1159,tag:"rw-RW",version:"Release V"},sw:lh,"sw-ke":{language:"Kiswahili",location:"Kenya",id:1089,tag:"sw-KE",version:"Release C"},"sw-tz":{language:"Kiswahili",location:"Tanzania",id:4096,tag:"sw-TZ",version:"Release 10"},"sw-ug":{language:"Kiswahili",location:"Uganda",id:4096,tag:"sw-UG",version:"Release 10"},kok:uh,"kok-in":{language:"Konkani",location:"India",id:1111,tag:"kok-IN",version:"Release C"},ko:ch,"ko-kr":{language:"Korean",location:"Korea",id:1042,tag:"ko-KR",version:"Release A"},"ko-kp":{language:"Korean",location:"North Korea",id:4096,tag:"ko-KP",version:"Release 10.1"},khq:hh,"khq-ml":{language:"Koyra Chiini",location:"Mali",id:4096,tag:"khq-ML",version:"Release 10"},ses:fh,"ses-ml":{language:"Koyraboro Senni",location:"Mali",id:4096,tag:"ses-ML",version:"Release 10"},nmg:dh,"nmg-cm":{language:"Kwasio",location:"Cameroon",id:4096,tag:"nmg-CM",version:"Release 10"},ky:gh,"ky-kg":{language:"Kyrgyz",location:"Kyrgyzstan",id:1088,tag:"ky-KG",version:"Release D"},"ku-arab-ir":{language:"Kurdish",location:"Perso-Arabic, Iran",id:4096,tag:"ku-Arab-IR",version:"Release 10.1"},lkt:ph,"lkt-us":{language:"Lakota",location:"United States",id:4096,tag:"lkt-US",version:"Release 10"},lag:vh,"lag-tz":{language:"Langi",location:"Tanzania",id:4096,tag:"lag-TZ",version:"Release 10"},lo:mh,"lo-la":{language:"Lao",location:"Lao P.D.R.",id:1108,tag:"lo-LA",version:"Release V"},lv:yh,"lv-lv":{language:"Latvian",location:"Latvia",id:1062,tag:"lv-LV",version:"Release B"},ln:_h,"ln-ao":{language:"Lingala",location:"Angola",id:4096,tag:"ln-AO",version:"Release 10"},"ln-cf":{language:"Lingala",location:"Central African Republic",id:4096,tag:"ln-CF",version:"Release 10"},"ln-cg":{language:"Lingala",location:"Congo",id:4096,tag:"ln-CG",version:"Release 10"},"ln-cd":{language:"Lingala",location:"Congo DRC",id:4096,tag:"ln-CD",version:"Release 10"},lt:bh,"lt-lt":{language:"Lithuanian",location:"Lithuania",id:1063,tag:"lt-LT",version:"Release B"},nds:wh,"nds-de":{language:"Low German ",location:"Germany",id:4096,tag:"nds-DE",version:"Release 10.2"},"nds-nl":{language:"Low German",location:"Netherlands",id:4096,tag:"nds-NL",version:"Release 10.2"},dsb:xh,"dsb-de":{language:"Lower Sorbian",location:"Germany",id:2094,tag:"dsb-DE",version:"Release V"},lu:kh,"lu-cd":{language:"Luba-Katanga",location:"Congo DRC",id:4096,tag:"lu-CD",version:"Release 10"},luo:Sh,"luo-ke":{language:"Luo",location:"Kenya",id:4096,tag:"luo-KE",version:"Release 10"},lb:Ch,"lb-lu":{language:"Luxembourgish",location:"Luxembourg",id:1134,tag:"lb-LU",version:"Release E2"},luy:Eh,"luy-ke":{language:"Luyia",location:"Kenya",id:4096,tag:"luy-KE",version:"Release 10"},mk:Ah,"mk-mk":{language:"Macedonian",location:"North Macedonia ",id:1071,tag:"mk-MK",version:"Release C"},jmc:Mh,"jmc-tz":{language:"Machame",location:"Tanzania",id:4096,tag:"jmc-TZ",version:"Release 10"},mgh:Rh,"mgh-mz":{language:"Makhuwa-Meetto",location:"Mozambique",id:4096,tag:"mgh-MZ",version:"Release 10"},kde:Th,"kde-tz":{language:"Makonde",location:"Tanzania",id:4096,tag:"kde-TZ",version:"Release 10"},mg:Oh,"mg-mg":{language:"Malagasy",location:"Madagascar",id:4096,tag:"mg-MG",version:"Release 8.1"},ms:Bh,"ms-bn":{language:"Malay",location:"Brunei Darussalam",id:2110,tag:"ms-BN",version:"Release C"},"ms-my":{language:"Malay",location:"Malaysia",id:1086,tag:"ms-MY",version:"Release C"},ml:Ph,"ml-in":{language:"Malayalam",location:"India",id:1100,tag:"ml-IN",version:"Release E1"},mt:Nh,"mt-mt":{language:"Maltese",location:"Malta",id:1082,tag:"mt-MT",version:"Release E1"},gv:Dh,"gv-im":{language:"Manx",location:"Isle of Man",id:4096,tag:"gv-IM",version:"Release 10"},mi:zh,"mi-nz":{language:"Maori",location:"New Zealand",id:1153,tag:"mi-NZ",version:"Release E1"},arn:jh,"arn-cl":{language:"Mapudungun",location:"Chile",id:1146,tag:"arn-CL",version:"Release E2"},mr:Lh,"mr-in":{language:"Marathi",location:"India",id:1102,tag:"mr-IN",version:"Release C"},mas:Fh,"mas-ke":{language:"Masai",location:"Kenya",id:4096,tag:"mas-KE",version:"Release 10"},"mas-tz":{language:"Masai",location:"Tanzania",id:4096,tag:"mas-TZ",version:"Release 10"},"mzn-ir":{language:"Mazanderani",location:"Iran",id:4096,tag:"mzn-IR",version:"Release 10.1"},mer:Ih,"mer-ke":{language:"Meru",location:"Kenya",id:4096,tag:"mer-KE",version:"Release 10"},mgo:Hh,"mgo-cm":{language:"Meta'",location:"Cameroon",id:4096,tag:"mgo-CM",version:"Release 10"},moh:Vh,"moh-ca":{language:"Mohawk",location:"Canada",id:1148,tag:"moh-CA",version:"Release E2"},mn:Gh,"mn-cyrl":{language:"Mongolian (Cyrillic)",location:null,id:30800,tag:"mn-Cyrl",version:"Windows 7"},"mn-mn":{language:"Mongolian (Cyrillic)",location:"Mongolia",id:1104,tag:"mn-MN",version:"Release D"},"mn-mong":{language:"Mongolian (Traditional ",location:null,id:31824,tag:"mn-Mong",version:"Windows 7"},"mn-mong-":{language:"Mongolian (Traditional ",location:"Mongolia",id:3152,tag:"mn-Mong-",version:"Windows 7"},mfe:Uh,"mfe-mu":{language:"Morisyen",location:"Mauritius",id:4096,tag:"mfe-MU",version:"Release 10"},mua:qh,"mua-cm":{language:"Mundang",location:"Cameroon",id:4096,tag:"mua-CM",version:"Release 10"},nqo:Wh,"nqo-gn":{language:"N'ko",location:"Guinea",id:4096,tag:"nqo-GN",version:"Release 8.1"},naq:Kh,"naq-na":{language:"Nama",location:"Namibia",id:4096,tag:"naq-NA",version:"Release 10"},ne:Yh,"ne-in":{language:"Nepali",location:"India",id:2145,tag:"ne-IN",version:"Release 8.1"},"ne-np":{language:"Nepali",location:"Nepal",id:1121,tag:"ne-NP",version:"Release E2"},nnh:Xh,"nnh-cm":{language:"Ngiemboon",location:"Cameroon",id:4096,tag:"nnh-CM",version:"Release 10"},jgo:$h,"jgo-cm":{language:"Ngomba",location:"Cameroon",id:4096,tag:"jgo-CM",version:"Release 10"},"lrc-iq":{language:"Northern Luri",location:"Iraq",id:4096,tag:"lrc-IQ",version:"Release 10.1"},"lrc-ir":{language:"Northern Luri",location:"Iran",id:4096,tag:"lrc-IR",version:"Release 10.1"},nd:Zh,"nd-zw":{language:"North Ndebele",location:"Zimbabwe",id:4096,tag:"nd-ZW",version:"Release 10"},no:Jh,nb:Qh,"nb-no":{language:"Norwegian (Bokmal)",location:"Norway",id:1044,tag:"nb-NO",version:"Release A"},nn:tf,"nn-no":{language:"Norwegian (Nynorsk)",location:"Norway",id:2068,tag:"nn-NO",version:"Release A"},"nb-sj":{language:"Norwegian Bokmål",location:"Svalbard and Jan Mayen",id:4096,tag:"nb-SJ",version:"Release 10"},nus:ef,"nus-sd":{language:"Nuer",location:"Sudan",id:4096,tag:"nus-SD",version:"Release 10"},"nus-ss":{language:"Nuer",location:"South Sudan",id:4096,tag:"nus-SS",version:"Release 10.1"},nyn:nf,"nyn-ug":{language:"Nyankole",location:"Uganda",id:4096,tag:"nyn-UG",version:"Release 10"},oc:rf,"oc-fr":{language:"Occitan",location:"France",id:1154,tag:"oc-FR",version:"Release V"},or:af,"or-in":{language:"Odia",location:"India",id:1096,tag:"or-IN",version:"Release V"},om:of,"om-et":{language:"Oromo",location:"Ethiopia",id:1138,tag:"om-ET",version:"Release 8.1"},"om-ke":{language:"Oromo",location:"Kenya",id:4096,tag:"om-KE",version:"Release 10"},os:sf,"os-ge":{language:"Ossetian",location:"Cyrillic, Georgia",id:4096,tag:"os-GE",version:"Release 10"},"os-ru":{language:"Ossetian",location:"Cyrillic, Russia",id:4096,tag:"os-RU",version:"Release 10"},ps:lf,"ps-af":{language:"Pashto",location:"Afghanistan",id:1123,tag:"ps-AF",version:"Release E2"},fa:uf,"fa-af":{language:"Persian",location:"Afghanistan",id:4096,tag:"fa-AF",version:"Release 10"},"fa-ir":{language:"Persian",location:"Iran",id:1065,tag:"fa-IR",version:"Release B"},pl:cf,"pl-pl":{language:"Polish",location:"Poland",id:1045,tag:"pl-PL",version:"Release A"},pt:hf,"pt-ao":{language:"Portuguese",location:"Angola",id:4096,tag:"pt-AO",version:"Release 8.1"},"pt-br":{language:"Portuguese",location:"Brazil",id:1046,tag:"pt-BR",version:"ReleaseA"},"pt-cv":{language:"Portuguese",location:"Cabo Verde",id:4096,tag:"pt-CV",version:"Release 10"},"pt-gq":{language:"Portuguese",location:"Equatorial Guinea",id:4096,tag:"pt-GQ",version:"Release 10.2"},"pt-gw":{language:"Portuguese",location:"Guinea-Bissau",id:4096,tag:"pt-GW",version:"Release 10"},"pt-lu":{language:"Portuguese",location:"Luxembourg",id:4096,tag:"pt-LU",version:"Release 10.2"},"pt-mo":{language:"Portuguese",location:"Macao SAR",id:4096,tag:"pt-MO",version:"Release 10"},"pt-mz":{language:"Portuguese",location:"Mozambique",id:4096,tag:"pt-MZ",version:"Release 10"},"pt-pt":{language:"Portuguese",location:"Portugal",id:2070,tag:"pt-PT",version:"Release A"},"pt-st":{language:"Portuguese",location:"São Tomé and Príncipe",id:4096,tag:"pt-ST",version:"Release 10"},"pt-ch":{language:"Portuguese",location:"Switzerland",id:4096,tag:"pt-CH",version:"Release 10.2"},"pt-tl":{language:"Portuguese",location:"Timor-Leste",id:4096,tag:"pt-TL",version:"Release 10"},"prg-001":{language:"Prussian",location:null,id:4096,tag:"prg-001",version:"Release 10.1"},"qps-ploca":{language:"Pseudo Language",location:"Pseudo locale for east Asian/complex ",id:1534,tag:"qps-ploca",version:"Release 7"},"qps-ploc":{language:"Pseudo Language",location:"Pseudo locale used for localization ",id:1281,tag:"qps-ploc",version:"Release 7"},"qps-plocm":{language:"Pseudo Language",location:"Pseudo locale used for localization ",id:2559,tag:"qps-plocm",version:"Release 7"},pa:ff,"pa-arab":{language:"Punjabi",location:null,id:31814,tag:"pa-Arab",version:"Release 8"},"pa-in":{language:"Punjabi",location:"India",id:1094,tag:"pa-IN",version:"Release D"},"pa-arab-pk":{language:"Punjabi",location:"Islamic Republic of Pakistan",id:2118,tag:"pa-Arab-PK",version:"Release 8"},quz:df,"quz-bo":{language:"Quechua",location:"Bolivia",id:1131,tag:"quz-BO",version:"Release E1"},"quz-ec":{language:"Quechua",location:"Ecuador",id:2155,tag:"quz-EC",version:"Release E1"},"quz-pe":{language:"Quechua",location:"Peru",id:3179,tag:"quz-PE",version:"Release E1"},ksh:gf,"ksh-de":{language:"Ripuarian",location:"Germany",id:4096,tag:"ksh-DE",version:"Release 10"},ro:pf,"ro-md":{language:"Romanian",location:"Moldova",id:2072,tag:"ro-MD",version:"Release 8.1"},"ro-ro":{language:"Romanian",location:"Romania",id:1048,tag:"ro-RO",version:"Release A"},rm:vf,"rm-ch":{language:"Romansh",location:"Switzerland",id:1047,tag:"rm-CH",version:"Release E2"},rof:mf,"rof-tz":{language:"Rombo",location:"Tanzania",id:4096,tag:"rof-TZ",version:"Release 10"},rn:yf,"rn-bi":{language:"Rundi",location:"Burundi",id:4096,tag:"rn-BI",version:"Release 10"},ru:_f,"ru-by":{language:"Russian",location:"Belarus",id:4096,tag:"ru-BY",version:"Release 10"},"ru-kz":{language:"Russian",location:"Kazakhstan",id:4096,tag:"ru-KZ",version:"Release 10"},"ru-kg":{language:"Russian",location:"Kyrgyzstan",id:4096,tag:"ru-KG",version:"Release 10"},"ru-md":{language:"Russian",location:"Moldova",id:2073,tag:"ru-MD",version:"Release 10"},"ru-ru":{language:"Russian",location:"Russia",id:1049,tag:"ru-RU",version:"Release A"},"ru-ua":{language:"Russian",location:"Ukraine",id:4096,tag:"ru-UA",version:"Release 10"},rwk:bf,"rwk-tz":{language:"Rwa",location:"Tanzania",id:4096,tag:"rwk-TZ",version:"Release 10"},ssy:wf,"ssy-er":{language:"Saho",location:"Eritrea",id:4096,tag:"ssy-ER",version:"Release 10"},sah:xf,"sah-ru":{language:"Sakha",location:"Russia",id:1157,tag:"sah-RU",version:"Release V"},saq:kf,"saq-ke":{language:"Samburu",location:"Kenya",id:4096,tag:"saq-KE",version:"Release 10"},smn:Sf,"smn-fi":{language:"Sami (Inari)",location:"Finland",id:9275,tag:"smn-FI",version:"Release E1"},smj:Cf,"smj-no":{language:"Sami (Lule)",location:"Norway",id:4155,tag:"smj-NO",version:"Release E1"},"smj-se":{language:"Sami (Lule)",location:"Sweden",id:5179,tag:"smj-SE",version:"Release E1"},se:Ef,"se-fi":{language:"Sami (Northern)",location:"Finland",id:3131,tag:"se-FI",version:"Release E1"},"se-no":{language:"Sami (Northern)",location:"Norway",id:1083,tag:"se-NO",version:"Release E1"},"se-se":{language:"Sami (Northern)",location:"Sweden",id:2107,tag:"se-SE",version:"Release E1"},sms:Af,"sms-fi":{language:"Sami (Skolt)",location:"Finland",id:8251,tag:"sms-FI",version:"Release E1"},sma:Mf,"sma-no":{language:"Sami (Southern)",location:"Norway",id:6203,tag:"sma-NO",version:"Release E1"},"sma-se":{language:"Sami (Southern)",location:"Sweden",id:7227,tag:"sma-SE",version:"Release E1"},sg:Rf,"sg-cf":{language:"Sango",location:"Central African Republic",id:4096,tag:"sg-CF",version:"Release 10"},sbp:Tf,"sbp-tz":{language:"Sangu",location:"Tanzania",id:4096,tag:"sbp-TZ",version:"Release 10"},sa:Of,"sa-in":{language:"Sanskrit",location:"India",id:1103,tag:"sa-IN",version:"Release C"},gd:Bf,"gd-gb":{language:"Scottish Gaelic",location:"United Kingdom",id:1169,tag:"gd-GB",version:"Release 7"},seh:Pf,"seh-mz":{language:"Sena",location:"Mozambique",id:4096,tag:"seh-MZ",version:"Release 10"},"sr-cyrl":{language:"Serbian (Cyrillic)",location:null,id:27674,tag:"sr-Cyrl",version:"Windows 7"},"sr-cyrl-ba":{language:"Serbian (Cyrillic)",location:"Bosnia and Herzegovina",id:7194,tag:"sr-Cyrl-BA",version:"Release E1"},"sr-cyrl-me":{language:"Serbian (Cyrillic)",location:"Montenegro",id:12314,tag:"sr-Cyrl-ME",version:"Release 7"},"sr-cyrl-rs":{language:"Serbian (Cyrillic)",location:"Serbia",id:10266,tag:"sr-Cyrl-RS",version:"Release 7"},"sr-cyrl-cs":{language:"Serbian (Cyrillic)",location:"Serbia and Montenegro (Former)",id:3098,tag:"sr-Cyrl-CS",version:"Release B"},"sr-latn":{language:"Serbian (Latin)",location:null,id:28698,tag:"sr-Latn",version:"Windows 7"},sr:Nf,"sr-latn-ba":{language:"Serbian (Latin)",location:"Bosnia and Herzegovina",id:6170,tag:"sr-Latn-BA",version:"Release E1"},"sr-latn-me":{language:"Serbian (Latin)",location:"Montenegro",id:11290,tag:"sr-Latn-ME",version:"Release 7"},"sr-latn-rs":{language:"Serbian (Latin)",location:"Serbia",id:9242,tag:"sr-Latn-RS",version:"Release 7"},"sr-latn-cs":{language:"Serbian (Latin)",location:"Serbia and Montenegro (Former)",id:2074,tag:"sr-Latn-CS",version:"Release B"},nso:Df,"nso-za":{language:"Sesotho sa Leboa",location:"South Africa",id:1132,tag:"nso-ZA",version:"Release E1"},tn:zf,"tn-bw":{language:"Setswana",location:"Botswana",id:2098,tag:"tn-BW",version:"Release 8"},"tn-za":{language:"Setswana",location:"South Africa",id:1074,tag:"tn-ZA",version:"Release E1"},ksb:jf,"ksb-tz":{language:"Shambala",location:"Tanzania",id:4096,tag:"ksb-TZ",version:"Release 10"},sn:Lf,"sn-latn":{language:"Shona",location:"Latin",id:4096,tag:"sn-Latn",version:"Release 8.1"},"sn-latn-zw":{language:"Shona",location:"Zimbabwe",id:4096,tag:"sn-Latn-ZW",version:"Release 8.1"},sd:Ff,"sd-arab":{language:"Sindhi",location:null,id:31833,tag:"sd-Arab",version:"Release 8"},"sd-arab-pk":{language:"Sindhi",location:"Islamic Republic of Pakistan",id:2137,tag:"sd-Arab-PK",version:"Release 8"},si:If,"si-lk":{language:"Sinhala",location:"Sri Lanka",id:1115,tag:"si-LK",version:"Release V"},sk:Hf,"sk-sk":{language:"Slovak",location:"Slovakia",id:1051,tag:"sk-SK",version:"Release A"},sl:Vf,"sl-si":{language:"Slovenian",location:"Slovenia",id:1060,tag:"sl-SI",version:"Release A"},xog:Gf,"xog-ug":{language:"Soga",location:"Uganda",id:4096,tag:"xog-UG",version:"Release 10"},so:Uf,"so-dj":{language:"Somali",location:"Djibouti",id:4096,tag:"so-DJ",version:"Release 10"},"so-et":{language:"Somali",location:"Ethiopia",id:4096,tag:"so-ET",version:"Release 10"},"so-ke":{language:"Somali",location:"Kenya",id:4096,tag:"so-KE",version:"Release 10"},"so-so":{language:"Somali",location:"Somalia",id:1143,tag:"so-SO",version:"Release 8.1"},st:qf,"st-za":{language:"Sotho",location:"South Africa",id:1072,tag:"st-ZA",version:"Release 8.1"},nr:Wf,"nr-za":{language:"South Ndebele",location:"South Africa",id:4096,tag:"nr-ZA",version:"Release 10"},"st-ls":{language:"Southern Sotho",location:"Lesotho",id:4096,tag:"st-LS",version:"Release 10"},es:Kf,"es-ar":{language:"Spanish",location:"Argentina",id:11274,tag:"es-AR",version:"Release B"},"es-bz":{language:"Spanish",location:"Belize",id:4096,tag:"es-BZ",version:"Release 10.3"},"es-ve":{language:"Spanish",location:"Bolivarian Republic of Venezuela",id:8202,tag:"es-VE",version:"Release B"},"es-bo":{language:"Spanish",location:"Bolivia",id:16394,tag:"es-BO",version:"Release B"},"es-br":{language:"Spanish",location:"Brazil",id:4096,tag:"es-BR",version:"Release 10.2"},"es-cl":{language:"Spanish",location:"Chile",id:13322,tag:"es-CL",version:"Release B"},"es-co":{language:"Spanish",location:"Colombia",id:9226,tag:"es-CO",version:"Release B"},"es-cr":{language:"Spanish",location:"Costa Rica",id:5130,tag:"es-CR",version:"Release B"},"es-cu":{language:"Spanish",location:"Cuba",id:23562,tag:"es-CU",version:"Release 10"},"es-do":{language:"Spanish",location:"Dominican Republic",id:7178,tag:"es-DO",version:"Release B"},"es-ec":{language:"Spanish",location:"Ecuador",id:12298,tag:"es-EC",version:"Release B"},"es-sv":{language:"Spanish",location:"El Salvador",id:17418,tag:"es-SV",version:"Release B"},"es-gq":{language:"Spanish",location:"Equatorial Guinea",id:4096,tag:"es-GQ",version:"Release 10"},"es-gt":{language:"Spanish",location:"Guatemala",id:4106,tag:"es-GT",version:"Release B"},"es-hn":{language:"Spanish",location:"Honduras",id:18442,tag:"es-HN",version:"Release B"},"es-419":{language:"Spanish",location:"Latin America",id:22538,tag:"es-419",version:"Release 8.1"},"es-mx":{language:"Spanish",location:"Mexico",id:2058,tag:"es-MX",version:"Release A"},"es-ni":{language:"Spanish",location:"Nicaragua",id:19466,tag:"es-NI",version:"Release B"},"es-pa":{language:"Spanish",location:"Panama",id:6154,tag:"es-PA",version:"Release B"},"es-py":{language:"Spanish",location:"Paraguay",id:15370,tag:"es-PY",version:"Release B"},"es-pe":{language:"Spanish",location:"Peru",id:10250,tag:"es-PE",version:"Release B"},"es-ph":{language:"Spanish",location:"Philippines",id:4096,tag:"es-PH",version:"Release 10"},"es-pr":{language:"Spanish",location:"Puerto Rico",id:20490,tag:"es-PR",version:"Release B"},"es-es_tradnl":{language:"Spanish",location:"Spain",id:1034,tag:"es-ES_tradnl",version:"Release A"},"es-es":{language:"Spanish",location:"Spain",id:3082,tag:"es-ES",version:"Release A"},"es-us":{language:"Spanish",location:"United States",id:21514,tag:"es-US",version:"Release V"},"es-uy":{language:"Spanish",location:"Uruguay",id:14346,tag:"es-UY",version:"Release B"},zgh:Yf,"zgh-tfng-ma":{language:"Standard Moroccan ",location:"Morocco",id:4096,tag:"zgh-Tfng-MA",version:"Release 8.1"},"zgh-tfng":{language:"Standard Moroccan ",location:"Tifinagh",id:4096,tag:"zgh-Tfng",version:"Release 8.1"},ss:Xf,"ss-za":{language:"Swati",location:"South Africa",id:4096,tag:"ss-ZA",version:"Release 10"},"ss-sz":{language:"Swati",location:"Swaziland",id:4096,tag:"ss-SZ",version:"Release 10"},sv:$f,"sv-ax":{language:"Swedish",location:"Åland Islands",id:4096,tag:"sv-AX",version:"Release 10"},"sv-fi":{language:"Swedish",location:"Finland",id:2077,tag:"sv-FI",version:"ReleaseB"},"sv-se":{language:"Swedish",location:"Sweden",id:1053,tag:"sv-SE",version:"Release A"},syr:Zf,"syr-sy":{language:"Syriac",location:"Syria",id:1114,tag:"syr-SY",version:"Release D"},shi:Jf,"shi-tfng":{language:"Tachelhit",location:"Tifinagh",id:4096,tag:"shi-Tfng",version:"Release 10"},"shi-tfng-ma":{language:"Tachelhit",location:"Tifinagh, Morocco",id:4096,tag:"shi-Tfng-MA",version:"Release 10"},"shi-latn":{language:"Tachelhit (Latin)",location:null,id:4096,tag:"shi-Latn",version:"Release 10"},"shi-latn-ma":{language:"Tachelhit (Latin)",location:"Morocco",id:4096,tag:"shi-Latn-MA",version:"Release 10"},dav:Qf,"dav-ke":{language:"Taita",location:"Kenya",id:4096,tag:"dav-KE",version:"Release 10"},tg:td,"tg-cyrl":{language:"Tajik (Cyrillic)",location:null,id:31784,tag:"tg-Cyrl",version:"Windows 7"},"tg-cyrl-tj":{language:"Tajik (Cyrillic)",location:"Tajikistan",id:1064,tag:"tg-Cyrl-TJ",version:"Release V"},tzm:ed,"tzm-latn":{language:"Tamazight (Latin)",location:null,id:31839,tag:"tzm-Latn",version:"Windows 7"},"tzm-latn-dz":{language:"Tamazight (Latin)",location:"Algeria",id:2143,tag:"tzm-Latn-DZ",version:"Release V"},ta:nd,"ta-in":{language:"Tamil",location:"India",id:1097,tag:"ta-IN",version:"Release C"},"ta-my":{language:"Tamil",location:"Malaysia",id:4096,tag:"ta-MY",version:"Release 10"},"ta-sg":{language:"Tamil",location:"Singapore",id:4096,tag:"ta-SG",version:"Release 10"},"ta-lk":{language:"Tamil",location:"Sri Lanka",id:2121,tag:"ta-LK",version:"Release 8"},twq:id,"twq-ne":{language:"Tasawaq",location:"Niger",id:4096,tag:"twq-NE",version:"Release 10"},tt:rd,"tt-ru":{language:"Tatar",location:"Russia",id:1092,tag:"tt-RU",version:"Release D"},te:ad,"te-in":{language:"Telugu",location:"India",id:1098,tag:"te-IN",version:"Release D"},teo:od,"teo-ke":{language:"Teso",location:"Kenya",id:4096,tag:"teo-KE",version:"Release 10"},"teo-ug":{language:"Teso",location:"Uganda",id:4096,tag:"teo-UG",version:"Release 10"},th:sd,"th-th":{language:"Thai",location:"Thailand",id:1054,tag:"th-TH",version:"Release B"},bo:ld,"bo-in":{language:"Tibetan",location:"India",id:4096,tag:"bo-IN",version:"Release 10"},"bo-cn":{language:"Tibetan",location:"People's Republic of China",id:1105,tag:"bo-CN",version:"Release V"},tig:ud,"tig-er":{language:"Tigre",location:"Eritrea",id:4096,tag:"tig-ER",version:"Release 10"},ti:cd,"ti-er":{language:"Tigrinya",location:"Eritrea",id:2163,tag:"ti-ER",version:"Release 8"},"ti-et":{language:"Tigrinya",location:"Ethiopia",id:1139,tag:"ti-ET",version:"Release 8"},to:hd,"to-to":{language:"Tongan",location:"Tonga",id:4096,tag:"to-TO",version:"Release 10"},ts:fd,"ts-za":{language:"Tsonga",location:"South Africa",id:1073,tag:"ts-ZA",version:"Release 8.1"},tr:dd,"tr-cy":{language:"Turkish",location:"Cyprus",id:4096,tag:"tr-CY",version:"Release 10"},"tr-tr":{language:"Turkish",location:"Turkey",id:1055,tag:"tr-TR",version:"Release A"},tk:gd,"tk-tm":{language:"Turkmen",location:"Turkmenistan",id:1090,tag:"tk-TM",version:"Release V"},uk:pd,"uk-ua":{language:"Ukrainian",location:"Ukraine",id:1058,tag:"uk-UA",version:"Release B"},hsb:vd,"hsb-de":{language:"Upper Sorbian",location:"Germany",id:1070,tag:"hsb-DE",version:"Release V"},ur:md,"ur-in":{language:"Urdu",location:"India",id:2080,tag:"ur-IN",version:"Release 8.1"},"ur-pk":{language:"Urdu",location:"Islamic Republic of Pakistan",id:1056,tag:"ur-PK",version:"Release C"},ug:yd,"ug-cn":{language:"Uyghur",location:"People's Republic of China",id:1152,tag:"ug-CN",version:"Release V"},"uz-arab":{language:"Uzbek",location:"Perso-Arabic",id:4096,tag:"uz-Arab",version:"Release 10"},"uz-arab-af":{language:"Uzbek",location:"Perso-Arabic, Afghanistan",id:4096,tag:"uz-Arab-AF",version:"Release 10"},"uz-cyrl":{language:"Uzbek (Cyrillic)",location:null,id:30787,tag:"uz-Cyrl",version:"Windows 7"},"uz-cyrl-uz":{language:"Uzbek (Cyrillic)",location:"Uzbekistan",id:2115,tag:"uz-Cyrl-UZ",version:"Release C"},uz:_d,"uz-latn":{language:"Uzbek (Latin)",location:null,id:31811,tag:"uz-Latn",version:"Windows 7"},"uz-latn-uz":{language:"Uzbek (Latin)",location:"Uzbekistan",id:1091,tag:"uz-Latn-UZ",version:"Release C"},vai:bd,"vai-vaii":{language:"Vai",location:null,id:4096,tag:"vai-Vaii",version:"Release 10"},"vai-vaii-lr":{language:"Vai",location:"Liberia",id:4096,tag:"vai-Vaii-LR",version:"Release 10"},"vai-latn-lr":{language:"Vai (Latin)",location:"Liberia",id:4096,tag:"vai-Latn-LR",version:"Release 10"},"vai-latn":{language:"Vai (Latin)",location:null,id:4096,tag:"vai-Latn",version:"Release 10"},"ca-es-":{language:"Valencian",location:"Spain",id:2051,tag:"ca-ES-",version:"Release 8"},ve:wd,"ve-za":{language:"Venda",location:"South Africa",id:1075,tag:"ve-ZA",version:"Release 10"},vi:xd,"vi-vn":{language:"Vietnamese",location:"Vietnam",id:1066,tag:"vi-VN",version:"Release B"},vo:kd,"vo-001":{language:"Volapük",location:"World",id:4096,tag:"vo-001",version:"Release 10"},vun:Sd,"vun-tz":{language:"Vunjo",location:"Tanzania",id:4096,tag:"vun-TZ",version:"Release 10"},wae:Cd,"wae-ch":{language:"Walser",location:"Switzerland",id:4096,tag:"wae-CH",version:"Release 10"},cy:Ed,"cy-gb":{language:"Welsh",location:"United Kingdom",id:1106,tag:"cy-GB",version:"ReleaseE1"},wal:Ad,"wal-et":{language:"Wolaytta",location:"Ethiopia",id:4096,tag:"wal-ET",version:"Release 10"},wo:Md,"wo-sn":{language:"Wolof",location:"Senegal",id:1160,tag:"wo-SN",version:"Release V"},xh:Rd,"xh-za":{language:"Xhosa",location:"South Africa",id:1076,tag:"xh-ZA",version:"Release E1"},yav:Td,"yav-cm":{language:"Yangben",location:"Cameroon",id:4096,tag:"yav-CM",version:"Release 10"},ii:Od,"ii-cn":{language:"Yi",location:"People's Republic of China",id:1144,tag:"ii-CN",version:"Release V"},yo:Bd,"yo-bj":{language:"Yoruba",location:"Benin",id:4096,tag:"yo-BJ",version:"Release 10"},"yo-ng":{language:"Yoruba",location:"Nigeria",id:1130,tag:"yo-NG",version:"Release V"},dje:Pd,"dje-ne":{language:"Zarma",location:"Niger",id:4096,tag:"dje-NE",version:"Release 10"},zu:Nd,"zu-za":{language:"Zulu",location:"South Africa",id:1077,tag:"zu-ZA",version:"Release E1"}};var zd={name:"Abkhazian",names:["Abkhazian"],"iso639-2":"abk","iso639-1":"ab"};var jd={name:"Achinese",names:["Achinese"],"iso639-2":"ace","iso639-1":null};var Ld={name:"Acoli",names:["Acoli"],"iso639-2":"ach","iso639-1":null};var Fd={name:"Adangme",names:["Adangme"],"iso639-2":"ada","iso639-1":null};var Id={name:"Adygei",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var Hd={name:"Adyghe",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var Vd={name:"Afar",names:["Afar"],"iso639-2":"aar","iso639-1":"aa"};var Gd={name:"Afrihili",names:["Afrihili"],"iso639-2":"afh","iso639-1":null};var Ud={name:"Afrikaans",names:["Afrikaans"],"iso639-2":"afr","iso639-1":"af"};var qd={name:"Ainu",names:["Ainu"],"iso639-2":"ain","iso639-1":null};var Wd={name:"Akan",names:["Akan"],"iso639-2":"aka","iso639-1":"ak"};var Kd={name:"Akkadian",names:["Akkadian"],"iso639-2":"akk","iso639-1":null};var Yd={name:"Albanian",names:["Albanian"],"iso639-2":"alb/sqi","iso639-1":"sq"};var Xd={name:"Alemannic",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var $d={name:"Aleut",names:["Aleut"],"iso639-2":"ale","iso639-1":null};var Zd={name:"Alsatian",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var Jd={name:"Amharic",names:["Amharic"],"iso639-2":"amh","iso639-1":"am"};var Qd={name:"Angika",names:["Angika"],"iso639-2":"anp","iso639-1":null};var tg={name:"Arabic",names:["Arabic"],"iso639-2":"ara","iso639-1":"ar"};var eg={name:"Aragonese",names:["Aragonese"],"iso639-2":"arg","iso639-1":"an"};var ng={name:"Arapaho",names:["Arapaho"],"iso639-2":"arp","iso639-1":null};var ig={name:"Arawak",names:["Arawak"],"iso639-2":"arw","iso639-1":null};var rg={name:"Armenian",names:["Armenian"],"iso639-2":"arm/hye","iso639-1":"hy"};var ag={name:"Aromanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var og={name:"Arumanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var sg={name:"Assamese",names:["Assamese"],"iso639-2":"asm","iso639-1":"as"};var lg={name:"Asturian",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var ug={name:"Asturleonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var cg={name:"Avaric",names:["Avaric"],"iso639-2":"ava","iso639-1":"av"};var hg={name:"Avestan",names:["Avestan"],"iso639-2":"ave","iso639-1":"ae"};var fg={name:"Awadhi",names:["Awadhi"],"iso639-2":"awa","iso639-1":null};var dg={name:"Aymara",names:["Aymara"],"iso639-2":"aym","iso639-1":"ay"};var gg={name:"Azerbaijani",names:["Azerbaijani"],"iso639-2":"aze","iso639-1":"az"};var pg={name:"Bable",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var vg={name:"Balinese",names:["Balinese"],"iso639-2":"ban","iso639-1":null};var mg={name:"Baluchi",names:["Baluchi"],"iso639-2":"bal","iso639-1":null};var yg={name:"Bambara",names:["Bambara"],"iso639-2":"bam","iso639-1":"bm"};var _g={name:"Basa",names:["Basa"],"iso639-2":"bas","iso639-1":null};var bg={name:"Bashkir",names:["Bashkir"],"iso639-2":"bak","iso639-1":"ba"};var wg={name:"Basque",names:["Basque"],"iso639-2":"baq/eus","iso639-1":"eu"};var xg={name:"Bedawiyet",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var kg={name:"Beja",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var Sg={name:"Belarusian",names:["Belarusian"],"iso639-2":"bel","iso639-1":"be"};var Cg={name:"Bemba",names:["Bemba"],"iso639-2":"bem","iso639-1":null};var Eg={name:"Bengali",names:["Bengali"],"iso639-2":"ben","iso639-1":"bn"};var Ag={name:"Bhojpuri",names:["Bhojpuri"],"iso639-2":"bho","iso639-1":null};var Mg={name:"Bikol",names:["Bikol"],"iso639-2":"bik","iso639-1":null};var Rg={name:"Bilin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var Tg={name:"Bini",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var Og={name:"Bislama",names:["Bislama"],"iso639-2":"bis","iso639-1":"bi"};var Bg={name:"Blin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var Pg={name:"Bliss",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var Ng={name:"Blissymbolics",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var Dg={name:"Blissymbols",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var zg={name:"Bosnian",names:["Bosnian"],"iso639-2":"bos","iso639-1":"bs"};var jg={name:"Braj",names:["Braj"],"iso639-2":"bra","iso639-1":null};var Lg={name:"Breton",names:["Breton"],"iso639-2":"bre","iso639-1":"br"};var Fg={name:"Buginese",names:["Buginese"],"iso639-2":"bug","iso639-1":null};var Ig={name:"Bulgarian",names:["Bulgarian"],"iso639-2":"bul","iso639-1":"bg"};var Hg={name:"Buriat",names:["Buriat"],"iso639-2":"bua","iso639-1":null};var Vg={name:"Burmese",names:["Burmese"],"iso639-2":"bur/mya","iso639-1":"my"};var Gg={name:"Caddo",names:["Caddo"],"iso639-2":"cad","iso639-1":null};var Ug={name:"Castilian",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var qg={name:"Catalan",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var Wg={name:"Cebuano",names:["Cebuano"],"iso639-2":"ceb","iso639-1":null};var Kg={name:"Chagatai",names:["Chagatai"],"iso639-2":"chg","iso639-1":null};var Yg={name:"Chamorro",names:["Chamorro"],"iso639-2":"cha","iso639-1":"ch"};var Xg={name:"Chechen",names:["Chechen"],"iso639-2":"che","iso639-1":"ce"};var $g={name:"Cherokee",names:["Cherokee"],"iso639-2":"chr","iso639-1":null};var Zg={name:"Chewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var Jg={name:"Cheyenne",names:["Cheyenne"],"iso639-2":"chy","iso639-1":null};var Qg={name:"Chibcha",names:["Chibcha"],"iso639-2":"chb","iso639-1":null};var tp={name:"Chichewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var ep={name:"Chinese",names:["Chinese"],"iso639-2":"chi/zho","iso639-1":"zh"};var np={name:"Chipewyan",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null};var ip={name:"Choctaw",names:["Choctaw"],"iso639-2":"cho","iso639-1":null};var rp={name:"Chuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var ap={name:"Chuukese",names:["Chuukese"],"iso639-2":"chk","iso639-1":null};var op={name:"Chuvash",names:["Chuvash"],"iso639-2":"chv","iso639-1":"cv"};var sp={name:"Coptic",names:["Coptic"],"iso639-2":"cop","iso639-1":null};var lp={name:"Cornish",names:["Cornish"],"iso639-2":"cor","iso639-1":"kw"};var up={name:"Corsican",names:["Corsican"],"iso639-2":"cos","iso639-1":"co"};var cp={name:"Cree",names:["Cree"],"iso639-2":"cre","iso639-1":"cr"};var hp={name:"Creek",names:["Creek"],"iso639-2":"mus","iso639-1":null};var fp={name:"Croatian",names:["Croatian"],"iso639-2":"hrv","iso639-1":"hr"};var dp={name:"Czech",names:["Czech"],"iso639-2":"cze/ces","iso639-1":"cs"};var gp={name:"Dakota",names:["Dakota"],"iso639-2":"dak","iso639-1":null};var pp={name:"Danish",names:["Danish"],"iso639-2":"dan","iso639-1":"da"};var vp={name:"Dargwa",names:["Dargwa"],"iso639-2":"dar","iso639-1":null};var mp={name:"Delaware",names:["Delaware"],"iso639-2":"del","iso639-1":null};var yp={name:"Dhivehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var _p={name:"Dimili",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var bp={name:"Dimli",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var wp={name:"Dinka",names:["Dinka"],"iso639-2":"din","iso639-1":null};var xp={name:"Divehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var kp={name:"Dogri",names:["Dogri"],"iso639-2":"doi","iso639-1":null};var Sp={name:"Dogrib",names:["Dogrib"],"iso639-2":"dgr","iso639-1":null};var Cp={name:"Duala",names:["Duala"],"iso639-2":"dua","iso639-1":null};var Ep={name:"Dutch",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var Ap={name:"Dyula",names:["Dyula"],"iso639-2":"dyu","iso639-1":null};var Mp={name:"Dzongkha",names:["Dzongkha"],"iso639-2":"dzo","iso639-1":"dz"};var Rp={name:"Edo",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var Tp={name:"Efik",names:["Efik"],"iso639-2":"efi","iso639-1":null};var Op={name:"Ekajuk",names:["Ekajuk"],"iso639-2":"eka","iso639-1":null};var Bp={name:"Elamite",names:["Elamite"],"iso639-2":"elx","iso639-1":null};var Pp={name:"English",names:["English"],"iso639-2":"eng","iso639-1":"en"};var Np={name:"Erzya",names:["Erzya"],"iso639-2":"myv","iso639-1":null};var Dp={name:"Esperanto",names:["Esperanto"],"iso639-2":"epo","iso639-1":"eo"};var zp={name:"Estonian",names:["Estonian"],"iso639-2":"est","iso639-1":"et"};var jp={name:"Ewe",names:["Ewe"],"iso639-2":"ewe","iso639-1":"ee"};var Lp={name:"Ewondo",names:["Ewondo"],"iso639-2":"ewo","iso639-1":null};var Fp={name:"Fang",names:["Fang"],"iso639-2":"fan","iso639-1":null};var Ip={name:"Fanti",names:["Fanti"],"iso639-2":"fat","iso639-1":null};var Hp={name:"Faroese",names:["Faroese"],"iso639-2":"fao","iso639-1":"fo"};var Vp={name:"Fijian",names:["Fijian"],"iso639-2":"fij","iso639-1":"fj"};var Gp={name:"Filipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var Up={name:"Finnish",names:["Finnish"],"iso639-2":"fin","iso639-1":"fi"};var qp={name:"Flemish",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var Wp={name:"Fon",names:["Fon"],"iso639-2":"fon","iso639-1":null};var Kp={name:"French",names:["French"],"iso639-2":"fre/fra","iso639-1":"fr"};var Yp={name:"Friulian",names:["Friulian"],"iso639-2":"fur","iso639-1":null};var Xp={name:"Fulah",names:["Fulah"],"iso639-2":"ful","iso639-1":"ff"};var $p={name:"Ga",names:["Ga"],"iso639-2":"gaa","iso639-1":null};var Zp={name:"Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"};var Jp={name:"Galician",names:["Galician"],"iso639-2":"glg","iso639-1":"gl"};var Qp={name:"Ganda",names:["Ganda"],"iso639-2":"lug","iso639-1":"lg"};var tv={name:"Gayo",names:["Gayo"],"iso639-2":"gay","iso639-1":null};var ev={name:"Gbaya",names:["Gbaya"],"iso639-2":"gba","iso639-1":null};var nv={name:"Geez",names:["Geez"],"iso639-2":"gez","iso639-1":null};var iv={name:"Georgian",names:["Georgian"],"iso639-2":"geo/kat","iso639-1":"ka"};var rv={name:"German",names:["German"],"iso639-2":"ger/deu","iso639-1":"de"};var av={name:"Gikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var ov={name:"Gilbertese",names:["Gilbertese"],"iso639-2":"gil","iso639-1":null};var sv={name:"Gondi",names:["Gondi"],"iso639-2":"gon","iso639-1":null};var lv={name:"Gorontalo",names:["Gorontalo"],"iso639-2":"gor","iso639-1":null};var uv={name:"Gothic",names:["Gothic"],"iso639-2":"got","iso639-1":null};var cv={name:"Grebo",names:["Grebo"],"iso639-2":"grb","iso639-1":null};var hv={name:"Greenlandic",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var fv={name:"Guarani",names:["Guarani"],"iso639-2":"grn","iso639-1":"gn"};var dv={name:"Gujarati",names:["Gujarati"],"iso639-2":"guj","iso639-1":"gu"};var gv={name:"Haida",names:["Haida"],"iso639-2":"hai","iso639-1":null};var pv={name:"Haitian",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"};var vv={name:"Hausa",names:["Hausa"],"iso639-2":"hau","iso639-1":"ha"};var mv={name:"Hawaiian",names:["Hawaiian"],"iso639-2":"haw","iso639-1":null};var yv={name:"Hebrew",names:["Hebrew"],"iso639-2":"heb","iso639-1":"he"};var _v={name:"Herero",names:["Herero"],"iso639-2":"her","iso639-1":"hz"};var bv={name:"Hiligaynon",names:["Hiligaynon"],"iso639-2":"hil","iso639-1":null};var wv={name:"Hindi",names:["Hindi"],"iso639-2":"hin","iso639-1":"hi"};var xv={name:"Hittite",names:["Hittite"],"iso639-2":"hit","iso639-1":null};var kv={name:"Hmong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var Sv={name:"Hungarian",names:["Hungarian"],"iso639-2":"hun","iso639-1":"hu"};var Cv={name:"Hupa",names:["Hupa"],"iso639-2":"hup","iso639-1":null};var Ev={name:"Iban",names:["Iban"],"iso639-2":"iba","iso639-1":null};var Av={name:"Icelandic",names:["Icelandic"],"iso639-2":"ice/isl","iso639-1":"is"};var Mv={name:"Ido",names:["Ido"],"iso639-2":"ido","iso639-1":"io"};var Rv={name:"Igbo",names:["Igbo"],"iso639-2":"ibo","iso639-1":"ig"};var Tv={name:"Iloko",names:["Iloko"],"iso639-2":"ilo","iso639-1":null};var Ov={name:"Indonesian",names:["Indonesian"],"iso639-2":"ind","iso639-1":"id"};var Bv={name:"Ingush",names:["Ingush"],"iso639-2":"inh","iso639-1":null};var Pv={name:"Interlingue",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Nv={name:"Inuktitut",names:["Inuktitut"],"iso639-2":"iku","iso639-1":"iu"};var Dv={name:"Inupiaq",names:["Inupiaq"],"iso639-2":"ipk","iso639-1":"ik"};var zv={name:"Irish",names:["Irish"],"iso639-2":"gle","iso639-1":"ga"};var jv={name:"Italian",names:["Italian"],"iso639-2":"ita","iso639-1":"it"};var Lv={name:"Japanese",names:["Japanese"],"iso639-2":"jpn","iso639-1":"ja"};var Fv={name:"Javanese",names:["Javanese"],"iso639-2":"jav","iso639-1":"jv"};var Iv={name:"Jingpho",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Hv={name:"Kabardian",names:["Kabardian"],"iso639-2":"kbd","iso639-1":null};var Vv={name:"Kabyle",names:["Kabyle"],"iso639-2":"kab","iso639-1":null};var Gv={name:"Kachin",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Uv={name:"Kalaallisut",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var qv={name:"Kalmyk",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var Wv={name:"Kamba",names:["Kamba"],"iso639-2":"kam","iso639-1":null};var Kv={name:"Kannada",names:["Kannada"],"iso639-2":"kan","iso639-1":"kn"};var Yv={name:"Kanuri",names:["Kanuri"],"iso639-2":"kau","iso639-1":"kr"};var Xv={name:"Kapampangan",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var $v={name:"Karelian",names:["Karelian"],"iso639-2":"krl","iso639-1":null};var Zv={name:"Kashmiri",names:["Kashmiri"],"iso639-2":"kas","iso639-1":"ks"};var Jv={name:"Kashubian",names:["Kashubian"],"iso639-2":"csb","iso639-1":null};var Qv={name:"Kawi",names:["Kawi"],"iso639-2":"kaw","iso639-1":null};var tm={name:"Kazakh",names:["Kazakh"],"iso639-2":"kaz","iso639-1":"kk"};var em={name:"Khasi",names:["Khasi"],"iso639-2":"kha","iso639-1":null};var nm={name:"Khotanese",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var im={name:"Kikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var rm={name:"Kimbundu",names:["Kimbundu"],"iso639-2":"kmb","iso639-1":null};var am={name:"Kinyarwanda",names:["Kinyarwanda"],"iso639-2":"kin","iso639-1":"rw"};var om={name:"Kirdki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var sm={name:"Kirghiz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var lm={name:"Kirmanjki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var um={name:"Klingon",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null};var cm={name:"Komi",names:["Komi"],"iso639-2":"kom","iso639-1":"kv"};var hm={name:"Kongo",names:["Kongo"],"iso639-2":"kon","iso639-1":"kg"};var fm={name:"Konkani",names:["Konkani"],"iso639-2":"kok","iso639-1":null};var dm={name:"Korean",names:["Korean"],"iso639-2":"kor","iso639-1":"ko"};var gm={name:"Kosraean",names:["Kosraean"],"iso639-2":"kos","iso639-1":null};var pm={name:"Kpelle",names:["Kpelle"],"iso639-2":"kpe","iso639-1":null};var vm={name:"Kuanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var mm={name:"Kumyk",names:["Kumyk"],"iso639-2":"kum","iso639-1":null};var ym={name:"Kurdish",names:["Kurdish"],"iso639-2":"kur","iso639-1":"ku"};var _m={name:"Kurukh",names:["Kurukh"],"iso639-2":"kru","iso639-1":null};var bm={name:"Kutenai",names:["Kutenai"],"iso639-2":"kut","iso639-1":null};var wm={name:"Kwanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var xm={name:"Kyrgyz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var km={name:"Ladino",names:["Ladino"],"iso639-2":"lad","iso639-1":null};var Sm={name:"Lahnda",names:["Lahnda"],"iso639-2":"lah","iso639-1":null};var Cm={name:"Lamba",names:["Lamba"],"iso639-2":"lam","iso639-1":null};var Em={name:"Lao",names:["Lao"],"iso639-2":"lao","iso639-1":"lo"};var Am={name:"Latin",names:["Latin"],"iso639-2":"lat","iso639-1":"la"};var Mm={name:"Latvian",names:["Latvian"],"iso639-2":"lav","iso639-1":"lv"};var Rm={name:"Leonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var Tm={name:"Letzeburgesch",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var Om={name:"Lezghian",names:["Lezghian"],"iso639-2":"lez","iso639-1":null};var Bm={name:"Limburgan",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Pm={name:"Limburger",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Nm={name:"Limburgish",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var Dm={name:"Lingala",names:["Lingala"],"iso639-2":"lin","iso639-1":"ln"};var zm={name:"Lithuanian",names:["Lithuanian"],"iso639-2":"lit","iso639-1":"lt"};var jm={name:"Lojban",names:["Lojban"],"iso639-2":"jbo","iso639-1":null};var Lm={name:"Lozi",names:["Lozi"],"iso639-2":"loz","iso639-1":null};var Fm={name:"Luiseno",names:["Luiseno"],"iso639-2":"lui","iso639-1":null};var Im={name:"Lunda",names:["Lunda"],"iso639-2":"lun","iso639-1":null};var Hm={name:"Lushai",names:["Lushai"],"iso639-2":"lus","iso639-1":null};var Vm={name:"Luxembourgish",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var Gm={name:"Macedonian",names:["Macedonian"],"iso639-2":"mac/mkd","iso639-1":"mk"};var Um={name:"Madurese",names:["Madurese"],"iso639-2":"mad","iso639-1":null};var qm={name:"Magahi",names:["Magahi"],"iso639-2":"mag","iso639-1":null};var Wm={name:"Maithili",names:["Maithili"],"iso639-2":"mai","iso639-1":null};var Km={name:"Makasar",names:["Makasar"],"iso639-2":"mak","iso639-1":null};var Ym={name:"Malagasy",names:["Malagasy"],"iso639-2":"mlg","iso639-1":"mg"};var Xm={name:"Malay",names:["Malay"],"iso639-2":"may/msa","iso639-1":"ms"};var $m={name:"Malayalam",names:["Malayalam"],"iso639-2":"mal","iso639-1":"ml"};var Zm={name:"Maldivian",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var Jm={name:"Maltese",names:["Maltese"],"iso639-2":"mlt","iso639-1":"mt"};var Qm={name:"Manchu",names:["Manchu"],"iso639-2":"mnc","iso639-1":null};var ty={name:"Mandar",names:["Mandar"],"iso639-2":"mdr","iso639-1":null};var ey={name:"Mandingo",names:["Mandingo"],"iso639-2":"man","iso639-1":null};var ny={name:"Manipuri",names:["Manipuri"],"iso639-2":"mni","iso639-1":null};var iy={name:"Manx",names:["Manx"],"iso639-2":"glv","iso639-1":"gv"};var ry={name:"Maori",names:["Maori"],"iso639-2":"mao/mri","iso639-1":"mi"};var ay={name:"Mapuche",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var oy={name:"Mapudungun",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var sy={name:"Marathi",names:["Marathi"],"iso639-2":"mar","iso639-1":"mr"};var ly={name:"Mari",names:["Mari"],"iso639-2":"chm","iso639-1":null};var uy={name:"Marshallese",names:["Marshallese"],"iso639-2":"mah","iso639-1":"mh"};var cy={name:"Marwari",names:["Marwari"],"iso639-2":"mwr","iso639-1":null};var hy={name:"Masai",names:["Masai"],"iso639-2":"mas","iso639-1":null};var fy={name:"Mende",names:["Mende"],"iso639-2":"men","iso639-1":null};var dy={name:"Micmac",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null};var gy={name:"Minangkabau",names:["Minangkabau"],"iso639-2":"min","iso639-1":null};var py={name:"Mirandese",names:["Mirandese"],"iso639-2":"mwl","iso639-1":null};var vy={name:"Mohawk",names:["Mohawk"],"iso639-2":"moh","iso639-1":null};var my={name:"Moksha",names:["Moksha"],"iso639-2":"mdf","iso639-1":null};var yy={name:"Moldavian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var _y={name:"Moldovan",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var by={name:"Mong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var wy={name:"Mongo",names:["Mongo"],"iso639-2":"lol","iso639-1":null};var xy={name:"Mongolian",names:["Mongolian"],"iso639-2":"mon","iso639-1":"mn"};var ky={name:"Montenegrin",names:["Montenegrin"],"iso639-2":"cnr","iso639-1":null};var Sy={name:"Mossi",names:["Mossi"],"iso639-2":"mos","iso639-1":null};var Cy={name:"Nauru",names:["Nauru"],"iso639-2":"nau","iso639-1":"na"};var Ey={name:"Navaho",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var Ay={name:"Navajo",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var My={name:"Ndonga",names:["Ndonga"],"iso639-2":"ndo","iso639-1":"ng"};var Ry={name:"Neapolitan",names:["Neapolitan"],"iso639-2":"nap","iso639-1":null};var Ty={name:"Nepali",names:["Nepali"],"iso639-2":"nep","iso639-1":"ne"};var Oy={name:"Newari",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null};var By={name:"Nias",names:["Nias"],"iso639-2":"nia","iso639-1":null};var Py={name:"Niuean",names:["Niuean"],"iso639-2":"niu","iso639-1":null};var Ny={name:"Nogai",names:["Nogai"],"iso639-2":"nog","iso639-1":null};var Dy={name:"Norwegian",names:["Norwegian"],"iso639-2":"nor","iso639-1":"no"};var zy={name:"Nuosu",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"};var jy={name:"Nyamwezi",names:["Nyamwezi"],"iso639-2":"nym","iso639-1":null};var Ly={name:"Nyanja",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var Fy={name:"Nyankole",names:["Nyankole"],"iso639-2":"nyn","iso639-1":null};var Iy={name:"Nyoro",names:["Nyoro"],"iso639-2":"nyo","iso639-1":null};var Hy={name:"Nzima",names:["Nzima"],"iso639-2":"nzi","iso639-1":null};var Vy={name:"Occidental",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Gy={name:"Oirat",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var Uy={name:"Ojibwa",names:["Ojibwa"],"iso639-2":"oji","iso639-1":"oj"};var qy={name:"Oriya",names:["Oriya"],"iso639-2":"ori","iso639-1":"or"};var Wy={name:"Oromo",names:["Oromo"],"iso639-2":"orm","iso639-1":"om"};var Ky={name:"Osage",names:["Osage"],"iso639-2":"osa","iso639-1":null};var Yy={name:"Ossetian",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var Xy={name:"Ossetic",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var $y={name:"Pahlavi",names:["Pahlavi"],"iso639-2":"pal","iso639-1":null};var Zy={name:"Palauan",names:["Palauan"],"iso639-2":"pau","iso639-1":null};var Jy={name:"Pali",names:["Pali"],"iso639-2":"pli","iso639-1":"pi"};var Qy={name:"Pampanga",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var t_={name:"Pangasinan",names:["Pangasinan"],"iso639-2":"pag","iso639-1":null};var e_={name:"Panjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var n_={name:"Papiamento",names:["Papiamento"],"iso639-2":"pap","iso639-1":null};var i_={name:"Pashto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var r_={name:"Pedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var a_={name:"Persian",names:["Persian"],"iso639-2":"per/fas","iso639-1":"fa"};var o_={name:"Phoenician",names:["Phoenician"],"iso639-2":"phn","iso639-1":null};var s_={name:"Pilipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var l_={name:"Pohnpeian",names:["Pohnpeian"],"iso639-2":"pon","iso639-1":null};var u_={name:"Polish",names:["Polish"],"iso639-2":"pol","iso639-1":"pl"};var c_={name:"Portuguese",names:["Portuguese"],"iso639-2":"por","iso639-1":"pt"};var h_={name:"Punjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var f_={name:"Pushto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var d_={name:"Quechua",names:["Quechua"],"iso639-2":"que","iso639-1":"qu"};var g_={name:"Rajasthani",names:["Rajasthani"],"iso639-2":"raj","iso639-1":null};var p_={name:"Rapanui",names:["Rapanui"],"iso639-2":"rap","iso639-1":null};var v_={name:"Rarotongan",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null};var m_={name:"Romanian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var y_={name:"Romansh",names:["Romansh"],"iso639-2":"roh","iso639-1":"rm"};var __={name:"Romany",names:["Romany"],"iso639-2":"rom","iso639-1":null};var b_={name:"Rundi",names:["Rundi"],"iso639-2":"run","iso639-1":"rn"};var w_={name:"Russian",names:["Russian"],"iso639-2":"rus","iso639-1":"ru"};var x_={name:"Sakan",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var k_={name:"Samoan",names:["Samoan"],"iso639-2":"smo","iso639-1":"sm"};var S_={name:"Sandawe",names:["Sandawe"],"iso639-2":"sad","iso639-1":null};var C_={name:"Sango",names:["Sango"],"iso639-2":"sag","iso639-1":"sg"};var E_={name:"Sanskrit",names:["Sanskrit"],"iso639-2":"san","iso639-1":"sa"};var A_={name:"Santali",names:["Santali"],"iso639-2":"sat","iso639-1":null};var M_={name:"Sardinian",names:["Sardinian"],"iso639-2":"srd","iso639-1":"sc"};var R_={name:"Sasak",names:["Sasak"],"iso639-2":"sas","iso639-1":null};var T_={name:"Scots",names:["Scots"],"iso639-2":"sco","iso639-1":null};var O_={name:"Selkup",names:["Selkup"],"iso639-2":"sel","iso639-1":null};var B_={name:"Sepedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var P_={name:"Serbian",names:["Serbian"],"iso639-2":"srp","iso639-1":"sr"};var N_={name:"Serer",names:["Serer"],"iso639-2":"srr","iso639-1":null};var D_={name:"Shan",names:["Shan"],"iso639-2":"shn","iso639-1":null};var z_={name:"Shona",names:["Shona"],"iso639-2":"sna","iso639-1":"sn"};var j_={name:"Sicilian",names:["Sicilian"],"iso639-2":"scn","iso639-1":null};var L_={name:"Sidamo",names:["Sidamo"],"iso639-2":"sid","iso639-1":null};var F_={name:"Siksika",names:["Siksika"],"iso639-2":"bla","iso639-1":null};var I_={name:"Sindhi",names:["Sindhi"],"iso639-2":"snd","iso639-1":"sd"};var H_={name:"Sinhala",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var V_={name:"Sinhalese",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var G_={name:"Slovak",names:["Slovak"],"iso639-2":"slo/slk","iso639-1":"sk"};var U_={name:"Slovenian",names:["Slovenian"],"iso639-2":"slv","iso639-1":"sl"};var q_={name:"Sogdian",names:["Sogdian"],"iso639-2":"sog","iso639-1":null};var W_={name:"Somali",names:["Somali"],"iso639-2":"som","iso639-1":"so"};var K_={name:"Soninke",names:["Soninke"],"iso639-2":"snk","iso639-1":null};var Y_={name:"Spanish",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var X_={name:"Sukuma",names:["Sukuma"],"iso639-2":"suk","iso639-1":null};var $_={name:"Sumerian",names:["Sumerian"],"iso639-2":"sux","iso639-1":null};var Z_={name:"Sundanese",names:["Sundanese"],"iso639-2":"sun","iso639-1":"su"};var J_={name:"Susu",names:["Susu"],"iso639-2":"sus","iso639-1":null};var Q_={name:"Swahili",names:["Swahili"],"iso639-2":"swa","iso639-1":"sw"};var tb={name:"Swati",names:["Swati"],"iso639-2":"ssw","iso639-1":"ss"};var eb={name:"Swedish",names:["Swedish"],"iso639-2":"swe","iso639-1":"sv"};var nb={name:"Syriac",names:["Syriac"],"iso639-2":"syr","iso639-1":null};var ib={name:"Tagalog",names:["Tagalog"],"iso639-2":"tgl","iso639-1":"tl"};var rb={name:"Tahitian",names:["Tahitian"],"iso639-2":"tah","iso639-1":"ty"};var ab={name:"Tajik",names:["Tajik"],"iso639-2":"tgk","iso639-1":"tg"};var ob={name:"Tamashek",names:["Tamashek"],"iso639-2":"tmh","iso639-1":null};var sb={name:"Tamil",names:["Tamil"],"iso639-2":"tam","iso639-1":"ta"};var lb={name:"Tatar",names:["Tatar"],"iso639-2":"tat","iso639-1":"tt"};var ub={name:"Telugu",names:["Telugu"],"iso639-2":"tel","iso639-1":"te"};var cb={name:"Tereno",names:["Tereno"],"iso639-2":"ter","iso639-1":null};var hb={name:"Tetum",names:["Tetum"],"iso639-2":"tet","iso639-1":null};var fb={name:"Thai",names:["Thai"],"iso639-2":"tha","iso639-1":"th"};var db={name:"Tibetan",names:["Tibetan"],"iso639-2":"tib/bod","iso639-1":"bo"};var gb={name:"Tigre",names:["Tigre"],"iso639-2":"tig","iso639-1":null};var pb={name:"Tigrinya",names:["Tigrinya"],"iso639-2":"tir","iso639-1":"ti"};var vb={name:"Timne",names:["Timne"],"iso639-2":"tem","iso639-1":null};var mb={name:"Tiv",names:["Tiv"],"iso639-2":"tiv","iso639-1":null};var yb={name:"Tlingit",names:["Tlingit"],"iso639-2":"tli","iso639-1":null};var _b={name:"Tokelau",names:["Tokelau"],"iso639-2":"tkl","iso639-1":null};var bb={name:"Tsimshian",names:["Tsimshian"],"iso639-2":"tsi","iso639-1":null};var wb={name:"Tsonga",names:["Tsonga"],"iso639-2":"tso","iso639-1":"ts"};var xb={name:"Tswana",names:["Tswana"],"iso639-2":"tsn","iso639-1":"tn"};var kb={name:"Tumbuka",names:["Tumbuka"],"iso639-2":"tum","iso639-1":null};var Sb={name:"Turkish",names:["Turkish"],"iso639-2":"tur","iso639-1":"tr"};var Cb={name:"Turkmen",names:["Turkmen"],"iso639-2":"tuk","iso639-1":"tk"};var Eb={name:"Tuvalu",names:["Tuvalu"],"iso639-2":"tvl","iso639-1":null};var Ab={name:"Tuvinian",names:["Tuvinian"],"iso639-2":"tyv","iso639-1":null};var Mb={name:"Twi",names:["Twi"],"iso639-2":"twi","iso639-1":"tw"};var Rb={name:"Udmurt",names:["Udmurt"],"iso639-2":"udm","iso639-1":null};var Tb={name:"Ugaritic",names:["Ugaritic"],"iso639-2":"uga","iso639-1":null};var Ob={name:"Uighur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var Bb={name:"Ukrainian",names:["Ukrainian"],"iso639-2":"ukr","iso639-1":"uk"};var Pb={name:"Umbundu",names:["Umbundu"],"iso639-2":"umb","iso639-1":null};var Nb={name:"Undetermined",names:["Undetermined"],"iso639-2":"und","iso639-1":null};var Db={name:"Urdu",names:["Urdu"],"iso639-2":"urd","iso639-1":"ur"};var zb={name:"Uyghur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var jb={name:"Uzbek",names:["Uzbek"],"iso639-2":"uzb","iso639-1":"uz"};var Lb={name:"Vai",names:["Vai"],"iso639-2":"vai","iso639-1":null};var Fb={name:"Valencian",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var Ib={name:"Venda",names:["Venda"],"iso639-2":"ven","iso639-1":"ve"};var Hb={name:"Vietnamese",names:["Vietnamese"],"iso639-2":"vie","iso639-1":"vi"};var Vb={name:"Votic",names:["Votic"],"iso639-2":"vot","iso639-1":null};var Gb={name:"Walloon",names:["Walloon"],"iso639-2":"wln","iso639-1":"wa"};var Ub={name:"Waray",names:["Waray"],"iso639-2":"war","iso639-1":null};var qb={name:"Washo",names:["Washo"],"iso639-2":"was","iso639-1":null};var Wb={name:"Welsh",names:["Welsh"],"iso639-2":"wel/cym","iso639-1":"cy"};var Kb={name:"Wolaitta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var Yb={name:"Wolaytta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var Xb={name:"Wolof",names:["Wolof"],"iso639-2":"wol","iso639-1":"wo"};var $b={name:"Xhosa",names:["Xhosa"],"iso639-2":"xho","iso639-1":"xh"};var Zb={name:"Yakut",names:["Yakut"],"iso639-2":"sah","iso639-1":null};var Jb={name:"Yao",names:["Yao"],"iso639-2":"yao","iso639-1":null};var Qb={name:"Yapese",names:["Yapese"],"iso639-2":"yap","iso639-1":null};var tw={name:"Yiddish",names:["Yiddish"],"iso639-2":"yid","iso639-1":"yi"};var ew={name:"Yoruba",names:["Yoruba"],"iso639-2":"yor","iso639-1":"yo"};var nw={name:"Zapotec",names:["Zapotec"],"iso639-2":"zap","iso639-1":null};var iw={name:"Zaza",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var rw={name:"Zazaki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var aw={name:"Zenaga",names:["Zenaga"],"iso639-2":"zen","iso639-1":null};var ow={name:"Zhuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var sw={name:"Zulu",names:["Zulu"],"iso639-2":"zul","iso639-1":"zu"};var lw={name:"Zuni",names:["Zuni"],"iso639-2":"zun","iso639-1":null};var uw={Abkhazian:zd,Achinese:jd,Acoli:Ld,Adangme:Fd,Adygei:Id,Adyghe:Hd,Afar:Vd,Afrihili:Gd,Afrikaans:Ud,"Afro-Asiatic languages":{name:"Afro-Asiatic languages",names:["Afro-Asiatic languages"],"iso639-2":"afa","iso639-1":null},Ainu:qd,Akan:Wd,Akkadian:Kd,Albanian:Yd,Alemannic:Xd,Aleut:$d,"Algonquian languages":{name:"Algonquian languages",names:["Algonquian languages"],"iso639-2":"alg","iso639-1":null},Alsatian:Zd,"Altaic languages":{name:"Altaic languages",names:["Altaic languages"],"iso639-2":"tut","iso639-1":null},Amharic:Jd,Angika:Qd,"Apache languages":{name:"Apache languages",names:["Apache languages"],"iso639-2":"apa","iso639-1":null},Arabic:tg,Aragonese:eg,Arapaho:ng,Arawak:ig,Armenian:rg,Aromanian:ag,"Artificial languages":{name:"Artificial languages",names:["Artificial languages"],"iso639-2":"art","iso639-1":null},Arumanian:og,Assamese:sg,Asturian:lg,Asturleonese:ug,"Athapascan languages":{name:"Athapascan languages",names:["Athapascan languages"],"iso639-2":"ath","iso639-1":null},"Australian languages":{name:"Australian languages",names:["Australian languages"],"iso639-2":"aus","iso639-1":null},"Austronesian languages":{name:"Austronesian languages",names:["Austronesian languages"],"iso639-2":"map","iso639-1":null},Avaric:cg,Avestan:hg,Awadhi:fg,Aymara:dg,Azerbaijani:gg,Bable:pg,Balinese:vg,"Baltic languages":{name:"Baltic languages",names:["Baltic languages"],"iso639-2":"bat","iso639-1":null},Baluchi:mg,Bambara:yg,"Bamileke languages":{name:"Bamileke languages",names:["Bamileke languages"],"iso639-2":"bai","iso639-1":null},"Banda languages":{name:"Banda languages",names:["Banda languages"],"iso639-2":"bad","iso639-1":null},"Bantu languages":{name:"Bantu languages",names:["Bantu languages"],"iso639-2":"bnt","iso639-1":null},Basa:_g,Bashkir:bg,Basque:wg,"Batak languages":{name:"Batak languages",names:["Batak languages"],"iso639-2":"btk","iso639-1":null},Bedawiyet:xg,Beja:kg,Belarusian:Sg,Bemba:Cg,Bengali:Eg,"Berber languages":{name:"Berber languages",names:["Berber languages"],"iso639-2":"ber","iso639-1":null},Bhojpuri:Ag,"Bihari languages":{name:"Bihari languages",names:["Bihari languages"],"iso639-2":"bih","iso639-1":"bh"},Bikol:Mg,Bilin:Rg,Bini:Tg,Bislama:Og,Blin:Bg,Bliss:Pg,Blissymbolics:Ng,Blissymbols:Dg,"Bokmål, Norwegian":{name:"Bokmål, Norwegian",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},Bosnian:zg,Braj:jg,Breton:Lg,Buginese:Fg,Bulgarian:Ig,Buriat:Hg,Burmese:Vg,Caddo:Gg,Castilian:Ug,Catalan:qg,"Caucasian languages":{name:"Caucasian languages",names:["Caucasian languages"],"iso639-2":"cau","iso639-1":null},Cebuano:Wg,"Celtic languages":{name:"Celtic languages",names:["Celtic languages"],"iso639-2":"cel","iso639-1":null},"Central American Indian languages":{name:"Central American Indian languages",names:["Central American Indian languages"],"iso639-2":"cai","iso639-1":null},"Central Khmer":{name:"Central Khmer",names:["Central Khmer"],"iso639-2":"khm","iso639-1":"km"},Chagatai:Kg,"Chamic languages":{name:"Chamic languages",names:["Chamic languages"],"iso639-2":"cmc","iso639-1":null},Chamorro:Yg,Chechen:Xg,Cherokee:$g,Chewa:Zg,Cheyenne:Jg,Chibcha:Qg,Chichewa:tp,Chinese:ep,"Chinook jargon":{name:"Chinook jargon",names:["Chinook jargon"],"iso639-2":"chn","iso639-1":null},Chipewyan:np,Choctaw:ip,Chuang:rp,"Church Slavic":{name:"Church Slavic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Church Slavonic":{name:"Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Chuukese:ap,Chuvash:op,"Classical Nepal Bhasa":{name:"Classical Nepal Bhasa",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Newari":{name:"Classical Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Syriac":{name:"Classical Syriac",names:["Classical Syriac"],"iso639-2":"syc","iso639-1":null},"Cook Islands Maori":{name:"Cook Islands Maori",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null},Coptic:sp,Cornish:lp,Corsican:up,Cree:cp,Creek:hp,"Creoles and pidgins":{name:"Creoles and pidgins",names:["Creoles and pidgins"],"iso639-2":"crp","iso639-1":null},"Creoles and pidgins, English based":{name:"Creoles and pidgins, English based",names:["Creoles and pidgins, English based"],"iso639-2":"cpe","iso639-1":null},"Creoles and pidgins, French-based":{name:"Creoles and pidgins, French-based",names:["Creoles and pidgins, French-based"],"iso639-2":"cpf","iso639-1":null},"Creoles and pidgins, Portuguese-based":{name:"Creoles and pidgins, Portuguese-based",names:["Creoles and pidgins, Portuguese-based"],"iso639-2":"cpp","iso639-1":null},"Crimean Tatar":{name:"Crimean Tatar",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},"Crimean Turkish":{name:"Crimean Turkish",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},Croatian:fp,"Cushitic languages":{name:"Cushitic languages",names:["Cushitic languages"],"iso639-2":"cus","iso639-1":null},Czech:dp,Dakota:gp,Danish:pp,Dargwa:vp,Delaware:mp,"Dene Suline":{name:"Dene Suline",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null},Dhivehi:yp,Dimili:_p,Dimli:bp,Dinka:wp,Divehi:xp,Dogri:kp,Dogrib:Sp,"Dravidian languages":{name:"Dravidian languages",names:["Dravidian languages"],"iso639-2":"dra","iso639-1":null},Duala:Cp,Dutch:Ep,"Dutch, Middle (ca.1050-1350)":{name:"Dutch, Middle (ca.1050-1350)",names:["Dutch, Middle (ca.1050-1350)"],"iso639-2":"dum","iso639-1":null},Dyula:Ap,Dzongkha:Mp,"Eastern Frisian":{name:"Eastern Frisian",names:["Eastern Frisian"],"iso639-2":"frs","iso639-1":null},Edo:Rp,Efik:Tp,"Egyptian (Ancient)":{name:"Egyptian (Ancient)",names:["Egyptian (Ancient)"],"iso639-2":"egy","iso639-1":null},Ekajuk:Op,Elamite:Bp,English:Pp,"English, Middle (1100-1500)":{name:"English, Middle (1100-1500)",names:["English, Middle (1100-1500)"],"iso639-2":"enm","iso639-1":null},"English, Old (ca.450-1100)":{name:"English, Old (ca.450-1100)",names:["English, Old (ca.450-1100)"],"iso639-2":"ang","iso639-1":null},Erzya:Np,Esperanto:Dp,Estonian:zp,Ewe:jp,Ewondo:Lp,Fang:Fp,Fanti:Ip,Faroese:Hp,Fijian:Vp,Filipino:Gp,Finnish:Up,"Finno-Ugrian languages":{name:"Finno-Ugrian languages",names:["Finno-Ugrian languages"],"iso639-2":"fiu","iso639-1":null},Flemish:qp,Fon:Wp,French:Kp,"French, Middle (ca.1400-1600)":{name:"French, Middle (ca.1400-1600)",names:["French, Middle (ca.1400-1600)"],"iso639-2":"frm","iso639-1":null},"French, Old (842-ca.1400)":{name:"French, Old (842-ca.1400)",names:["French, Old (842-ca.1400)"],"iso639-2":"fro","iso639-1":null},Friulian:Yp,Fulah:Xp,Ga:$p,Gaelic:Zp,"Galibi Carib":{name:"Galibi Carib",names:["Galibi Carib"],"iso639-2":"car","iso639-1":null},Galician:Jp,Ganda:Qp,Gayo:tv,Gbaya:ev,Geez:nv,Georgian:iv,German:rv,"German, Low":{name:"German, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"German, Middle High (ca.1050-1500)":{name:"German, Middle High (ca.1050-1500)",names:["German, Middle High (ca.1050-1500)"],"iso639-2":"gmh","iso639-1":null},"German, Old High (ca.750-1050)":{name:"German, Old High (ca.750-1050)",names:["German, Old High (ca.750-1050)"],"iso639-2":"goh","iso639-1":null},"Germanic languages":{name:"Germanic languages",names:["Germanic languages"],"iso639-2":"gem","iso639-1":null},Gikuyu:av,Gilbertese:ov,Gondi:sv,Gorontalo:lv,Gothic:uv,Grebo:cv,"Greek, Ancient (to 1453)":{name:"Greek, Ancient (to 1453)",names:["Greek, Ancient (to 1453)"],"iso639-2":"grc","iso639-1":null},"Greek, Modern (1453-)":{name:"Greek, Modern (1453-)",names:["Greek, Modern (1453-)"],"iso639-2":"gre/ell","iso639-1":"el"},Greenlandic:hv,Guarani:fv,Gujarati:dv,"Gwich'in":{name:"Gwich'in",names:["Gwich'in"],"iso639-2":"gwi","iso639-1":null},Haida:gv,Haitian:pv,"Haitian Creole":{name:"Haitian Creole",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"},Hausa:vv,Hawaiian:mv,Hebrew:yv,Herero:_v,Hiligaynon:bv,"Himachali languages":{name:"Himachali languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Hindi:wv,"Hiri Motu":{name:"Hiri Motu",names:["Hiri Motu"],"iso639-2":"hmo","iso639-1":"ho"},Hittite:xv,Hmong:kv,Hungarian:Sv,Hupa:Cv,Iban:Ev,Icelandic:Av,Ido:Mv,Igbo:Rv,"Ijo languages":{name:"Ijo languages",names:["Ijo languages"],"iso639-2":"ijo","iso639-1":null},Iloko:Tv,"Imperial Aramaic (700-300 BCE)":{name:"Imperial Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},"Inari Sami":{name:"Inari Sami",names:["Inari Sami"],"iso639-2":"smn","iso639-1":null},"Indic languages":{name:"Indic languages",names:["Indic languages"],"iso639-2":"inc","iso639-1":null},"Indo-European languages":{name:"Indo-European languages",names:["Indo-European languages"],"iso639-2":"ine","iso639-1":null},Indonesian:Ov,Ingush:Bv,"Interlingua (International Auxiliary Language Association)":{name:"Interlingua (International Auxiliary Language Association)",names:["Interlingua (International Auxiliary Language Association)"],"iso639-2":"ina","iso639-1":"ia"},Interlingue:Pv,Inuktitut:Nv,Inupiaq:Dv,"Iranian languages":{name:"Iranian languages",names:["Iranian languages"],"iso639-2":"ira","iso639-1":null},Irish:zv,"Irish, Middle (900-1200)":{name:"Irish, Middle (900-1200)",names:["Irish, Middle (900-1200)"],"iso639-2":"mga","iso639-1":null},"Irish, Old (to 900)":{name:"Irish, Old (to 900)",names:["Irish, Old (to 900)"],"iso639-2":"sga","iso639-1":null},"Iroquoian languages":{name:"Iroquoian languages",names:["Iroquoian languages"],"iso639-2":"iro","iso639-1":null},Italian:jv,Japanese:Lv,Javanese:Fv,Jingpho:Iv,"Judeo-Arabic":{name:"Judeo-Arabic",names:["Judeo-Arabic"],"iso639-2":"jrb","iso639-1":null},"Judeo-Persian":{name:"Judeo-Persian",names:["Judeo-Persian"],"iso639-2":"jpr","iso639-1":null},Kabardian:Hv,Kabyle:Vv,Kachin:Gv,Kalaallisut:Uv,Kalmyk:qv,Kamba:Wv,Kannada:Kv,Kanuri:Yv,Kapampangan:Xv,"Kara-Kalpak":{name:"Kara-Kalpak",names:["Kara-Kalpak"],"iso639-2":"kaa","iso639-1":null},"Karachay-Balkar":{name:"Karachay-Balkar",names:["Karachay-Balkar"],"iso639-2":"krc","iso639-1":null},Karelian:$v,"Karen languages":{name:"Karen languages",names:["Karen languages"],"iso639-2":"kar","iso639-1":null},Kashmiri:Zv,Kashubian:Jv,Kawi:Qv,Kazakh:tm,Khasi:em,"Khoisan languages":{name:"Khoisan languages",names:["Khoisan languages"],"iso639-2":"khi","iso639-1":null},Khotanese:nm,Kikuyu:im,Kimbundu:rm,Kinyarwanda:am,Kirdki:om,Kirghiz:sm,Kirmanjki:lm,Klingon:um,Komi:cm,Kongo:hm,Konkani:fm,Korean:dm,Kosraean:gm,Kpelle:pm,"Kru languages":{name:"Kru languages",names:["Kru languages"],"iso639-2":"kro","iso639-1":null},Kuanyama:vm,Kumyk:mm,Kurdish:ym,Kurukh:_m,Kutenai:bm,Kwanyama:wm,Kyrgyz:xm,Ladino:km,Lahnda:Sm,Lamba:Cm,"Land Dayak languages":{name:"Land Dayak languages",names:["Land Dayak languages"],"iso639-2":"day","iso639-1":null},Lao:Em,Latin:Am,Latvian:Mm,Leonese:Rm,Letzeburgesch:Tm,Lezghian:Om,Limburgan:Bm,Limburger:Pm,Limburgish:Nm,Lingala:Dm,Lithuanian:zm,Lojban:jm,"Low German":{name:"Low German",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Low Saxon":{name:"Low Saxon",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Lower Sorbian":{name:"Lower Sorbian",names:["Lower Sorbian"],"iso639-2":"dsb","iso639-1":null},Lozi:Lm,"Luba-Katanga":{name:"Luba-Katanga",names:["Luba-Katanga"],"iso639-2":"lub","iso639-1":"lu"},"Luba-Lulua":{name:"Luba-Lulua",names:["Luba-Lulua"],"iso639-2":"lua","iso639-1":null},Luiseno:Fm,"Lule Sami":{name:"Lule Sami",names:["Lule Sami"],"iso639-2":"smj","iso639-1":null},Lunda:Im,"Luo (Kenya and Tanzania)":{name:"Luo (Kenya and Tanzania)",names:["Luo (Kenya and Tanzania)"],"iso639-2":"luo","iso639-1":null},Lushai:Hm,Luxembourgish:Vm,"Macedo-Romanian":{name:"Macedo-Romanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null},Macedonian:Gm,Madurese:Um,Magahi:qm,Maithili:Wm,Makasar:Km,Malagasy:Ym,Malay:Xm,Malayalam:$m,Maldivian:Zm,Maltese:Jm,Manchu:Qm,Mandar:ty,Mandingo:ey,Manipuri:ny,"Manobo languages":{name:"Manobo languages",names:["Manobo languages"],"iso639-2":"mno","iso639-1":null},Manx:iy,Maori:ry,Mapuche:ay,Mapudungun:oy,Marathi:sy,Mari:ly,Marshallese:uy,Marwari:cy,Masai:hy,"Mayan languages":{name:"Mayan languages",names:["Mayan languages"],"iso639-2":"myn","iso639-1":null},Mende:fy,"Mi'kmaq":{name:"Mi'kmaq",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null},Micmac:dy,Minangkabau:gy,Mirandese:py,Mohawk:vy,Moksha:my,Moldavian:yy,Moldovan:_y,"Mon-Khmer languages":{name:"Mon-Khmer languages",names:["Mon-Khmer languages"],"iso639-2":"mkh","iso639-1":null},Mong:by,Mongo:wy,Mongolian:xy,Montenegrin:ky,Mossi:Sy,"Multiple languages":{name:"Multiple languages",names:["Multiple languages"],"iso639-2":"mul","iso639-1":null},"Munda languages":{name:"Munda languages",names:["Munda languages"],"iso639-2":"mun","iso639-1":null},"N'Ko":{name:"N'Ko",names:["N'Ko"],"iso639-2":"nqo","iso639-1":null},"Nahuatl languages":{name:"Nahuatl languages",names:["Nahuatl languages"],"iso639-2":"nah","iso639-1":null},Nauru:Cy,Navaho:Ey,Navajo:Ay,"Ndebele, North":{name:"Ndebele, North",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Ndebele, South":{name:"Ndebele, South",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},Ndonga:My,Neapolitan:Ry,"Nepal Bhasa":{name:"Nepal Bhasa",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null},Nepali:Ty,Newari:Oy,Nias:By,"Niger-Kordofanian languages":{name:"Niger-Kordofanian languages",names:["Niger-Kordofanian languages"],"iso639-2":"nic","iso639-1":null},"Nilo-Saharan languages":{name:"Nilo-Saharan languages",names:["Nilo-Saharan languages"],"iso639-2":"ssa","iso639-1":null},Niuean:Py,"No linguistic content":{name:"No linguistic content",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},Nogai:Ny,"Norse, Old":{name:"Norse, Old",names:["Norse, Old"],"iso639-2":"non","iso639-1":null},"North American Indian languages":{name:"North American Indian languages",names:["North American Indian languages"],"iso639-2":"nai","iso639-1":null},"North Ndebele":{name:"North Ndebele",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Northern Frisian":{name:"Northern Frisian",names:["Northern Frisian"],"iso639-2":"frr","iso639-1":null},"Northern Sami":{name:"Northern Sami",names:["Northern Sami"],"iso639-2":"sme","iso639-1":"se"},"Northern Sotho":{name:"Northern Sotho",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},Norwegian:Dy,"Norwegian Bokmål":{name:"Norwegian Bokmål",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},"Norwegian Nynorsk":{name:"Norwegian Nynorsk",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},"Not applicable":{name:"Not applicable",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},"Nubian languages":{name:"Nubian languages",names:["Nubian languages"],"iso639-2":"nub","iso639-1":null},Nuosu:zy,Nyamwezi:jy,Nyanja:Ly,Nyankole:Fy,"Nynorsk, Norwegian":{name:"Nynorsk, Norwegian",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},Nyoro:Iy,Nzima:Hy,Occidental:Vy,"Occitan (post 1500)":{name:"Occitan (post 1500)",names:["Occitan (post 1500)"],"iso639-2":"oci","iso639-1":"oc"},"Occitan, Old (to 1500)":{name:"Occitan, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},"Official Aramaic (700-300 BCE)":{name:"Official Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},Oirat:Gy,Ojibwa:Uy,"Old Bulgarian":{name:"Old Bulgarian",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Church Slavonic":{name:"Old Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Newari":{name:"Old Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Old Slavonic":{name:"Old Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Oriya:qy,Oromo:Wy,Osage:Ky,Ossetian:Yy,Ossetic:Xy,"Otomian languages":{name:"Otomian languages",names:["Otomian languages"],"iso639-2":"oto","iso639-1":null},Pahlavi:$y,Palauan:Zy,Pali:Jy,Pampanga:Qy,Pangasinan:t_,Panjabi:e_,Papiamento:n_,"Papuan languages":{name:"Papuan languages",names:["Papuan languages"],"iso639-2":"paa","iso639-1":null},Pashto:i_,Pedi:r_,Persian:a_,"Persian, Old (ca.600-400 B.C.)":{name:"Persian, Old (ca.600-400 B.C.)",names:["Persian, Old (ca.600-400 B.C.)"],"iso639-2":"peo","iso639-1":null},"Philippine languages":{name:"Philippine languages",names:["Philippine languages"],"iso639-2":"phi","iso639-1":null},Phoenician:o_,Pilipino:s_,Pohnpeian:l_,Polish:u_,Portuguese:c_,"Prakrit languages":{name:"Prakrit languages",names:["Prakrit languages"],"iso639-2":"pra","iso639-1":null},"Provençal, Old (to 1500)":{name:"Provençal, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},Punjabi:h_,Pushto:f_,Quechua:d_,Rajasthani:g_,Rapanui:p_,Rarotongan:v_,"Reserved for local use":{name:"Reserved for local use",names:["Reserved for local use"],"iso639-2":"qaa-qtz","iso639-1":null},"Romance languages":{name:"Romance languages",names:["Romance languages"],"iso639-2":"roa","iso639-1":null},Romanian:m_,Romansh:y_,Romany:__,Rundi:b_,Russian:w_,Sakan:x_,"Salishan languages":{name:"Salishan languages",names:["Salishan languages"],"iso639-2":"sal","iso639-1":null},"Samaritan Aramaic":{name:"Samaritan Aramaic",names:["Samaritan Aramaic"],"iso639-2":"sam","iso639-1":null},"Sami languages":{name:"Sami languages",names:["Sami languages"],"iso639-2":"smi","iso639-1":null},Samoan:k_,Sandawe:S_,Sango:C_,Sanskrit:E_,Santali:A_,Sardinian:M_,Sasak:R_,"Saxon, Low":{name:"Saxon, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},Scots:T_,"Scottish Gaelic":{name:"Scottish Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"},Selkup:O_,"Semitic languages":{name:"Semitic languages",names:["Semitic languages"],"iso639-2":"sem","iso639-1":null},Sepedi:B_,Serbian:P_,Serer:N_,Shan:D_,Shona:z_,"Sichuan Yi":{name:"Sichuan Yi",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"},Sicilian:j_,Sidamo:L_,"Sign Languages":{name:"Sign Languages",names:["Sign Languages"],"iso639-2":"sgn","iso639-1":null},Siksika:F_,Sindhi:I_,Sinhala:H_,Sinhalese:V_,"Sino-Tibetan languages":{name:"Sino-Tibetan languages",names:["Sino-Tibetan languages"],"iso639-2":"sit","iso639-1":null},"Siouan languages":{name:"Siouan languages",names:["Siouan languages"],"iso639-2":"sio","iso639-1":null},"Skolt Sami":{name:"Skolt Sami",names:["Skolt Sami"],"iso639-2":"sms","iso639-1":null},"Slave (Athapascan)":{name:"Slave (Athapascan)",names:["Slave (Athapascan)"],"iso639-2":"den","iso639-1":null},"Slavic languages":{name:"Slavic languages",names:["Slavic languages"],"iso639-2":"sla","iso639-1":null},Slovak:G_,Slovenian:U_,Sogdian:q_,Somali:W_,"Songhai languages":{name:"Songhai languages",names:["Songhai languages"],"iso639-2":"son","iso639-1":null},Soninke:K_,"Sorbian languages":{name:"Sorbian languages",names:["Sorbian languages"],"iso639-2":"wen","iso639-1":null},"Sotho, Northern":{name:"Sotho, Northern",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},"Sotho, Southern":{name:"Sotho, Southern",names:["Sotho, Southern"],"iso639-2":"sot","iso639-1":"st"},"South American Indian languages":{name:"South American Indian languages",names:["South American Indian languages"],"iso639-2":"sai","iso639-1":null},"South Ndebele":{name:"South Ndebele",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},"Southern Altai":{name:"Southern Altai",names:["Southern Altai"],"iso639-2":"alt","iso639-1":null},"Southern Sami":{name:"Southern Sami",names:["Southern Sami"],"iso639-2":"sma","iso639-1":null},Spanish:Y_,"Sranan Tongo":{name:"Sranan Tongo",names:["Sranan Tongo"],"iso639-2":"srn","iso639-1":null},"Standard Moroccan Tamazight":{name:"Standard Moroccan Tamazight",names:["Standard Moroccan Tamazight"],"iso639-2":"zgh","iso639-1":null},Sukuma:X_,Sumerian:$_,Sundanese:Z_,Susu:J_,Swahili:Q_,Swati:tb,Swedish:eb,"Swiss German":{name:"Swiss German",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null},Syriac:nb,Tagalog:ib,Tahitian:rb,"Tai languages":{name:"Tai languages",names:["Tai languages"],"iso639-2":"tai","iso639-1":null},Tajik:ab,Tamashek:ob,Tamil:sb,Tatar:lb,Telugu:ub,Tereno:cb,Tetum:hb,Thai:fb,Tibetan:db,Tigre:gb,Tigrinya:pb,Timne:vb,Tiv:mb,"tlhIngan-Hol":{name:"tlhIngan-Hol",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null},Tlingit:yb,"Tok Pisin":{name:"Tok Pisin",names:["Tok Pisin"],"iso639-2":"tpi","iso639-1":null},Tokelau:_b,"Tonga (Nyasa)":{name:"Tonga (Nyasa)",names:["Tonga (Nyasa)"],"iso639-2":"tog","iso639-1":null},"Tonga (Tonga Islands)":{name:"Tonga (Tonga Islands)",names:["Tonga (Tonga Islands)"],"iso639-2":"ton","iso639-1":"to"},Tsimshian:bb,Tsonga:wb,Tswana:xb,Tumbuka:kb,"Tupi languages":{name:"Tupi languages",names:["Tupi languages"],"iso639-2":"tup","iso639-1":null},Turkish:Sb,"Turkish, Ottoman (1500-1928)":{name:"Turkish, Ottoman (1500-1928)",names:["Turkish, Ottoman (1500-1928)"],"iso639-2":"ota","iso639-1":null},Turkmen:Cb,Tuvalu:Eb,Tuvinian:Ab,Twi:Mb,Udmurt:Rb,Ugaritic:Tb,Uighur:Ob,Ukrainian:Bb,Umbundu:Pb,"Uncoded languages":{name:"Uncoded languages",names:["Uncoded languages"],"iso639-2":"mis","iso639-1":null},Undetermined:Nb,"Upper Sorbian":{name:"Upper Sorbian",names:["Upper Sorbian"],"iso639-2":"hsb","iso639-1":null},Urdu:Db,Uyghur:zb,Uzbek:jb,Vai:Lb,Valencian:Fb,Venda:Ib,Vietnamese:Hb,"Volapük":{name:"Volapük",names:["Volapük"],"iso639-2":"vol","iso639-1":"vo"},Votic:Vb,"Wakashan languages":{name:"Wakashan languages",names:["Wakashan languages"],"iso639-2":"wak","iso639-1":null},Walloon:Gb,Waray:Ub,Washo:qb,Welsh:Wb,"Western Frisian":{name:"Western Frisian",names:["Western Frisian"],"iso639-2":"fry","iso639-1":"fy"},"Western Pahari languages":{name:"Western Pahari languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Wolaitta:Kb,Wolaytta:Yb,Wolof:Xb,Xhosa:$b,Yakut:Zb,Yao:Jb,Yapese:Qb,Yiddish:tw,Yoruba:ew,"Yupik languages":{name:"Yupik languages",names:["Yupik languages"],"iso639-2":"ypk","iso639-1":null},"Zande languages":{name:"Zande languages",names:["Zande languages"],"iso639-2":"znd","iso639-1":null},Zapotec:nw,Zaza:iw,Zazaki:rw,Zenaga:aw,Zhuang:ow,Zulu:sw,Zuni:lw};function cw(t,e,n){if(e in t){Object.defineProperty(t,e,{value:n,enumerable:true,configurable:true,writable:true})}else{t[e]=n}return t}var hw=[];var fw=Object.keys(uw);Object.keys(Dd).map(function(t){var e=Dd[t];var n=fw.find(function(t){return t.toLowerCase()===e.language.toLowerCase()});if(e.location&&n){var i;hw.push((i={},cw(i,"name",e.language),cw(i,"location",e.location),cw(i,"tag",e.tag),cw(i,"lcid",e.id),cw(i,"iso639-2",uw[n]["iso639-2"]),cw(i,"iso639-1",uw[n]["iso639-1"]),i))}});var dw={ar:"ar-SA",ca:"ca-ES",da:"da-DK",en:"en-US",ko:"ko-KR",pa:"pa-IN",pt:"pt-BR",sv:"sv-SE"};function gw(e){if(typeof e!=="string"||e.length===5)return e;if(dw[e])return dw[e];var t=hw.filter(function(t){return t["iso639-1"]===e});if(!t.length)return e;else if(t.length===1)return t[0].tag;else if(t.find(function(t){return t.tag==="".concat(e,"-").concat(e.toUpperCase())}))return"".concat(e,"-").concat(e.toUpperCase());else return t[0].tag}function pw(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function vw(){return"".concat(pw()).concat(pw(),"-").concat(pw(),"-").concat(pw(),"-").concat(pw(),"-").concat(pw()).concat(pw()).concat(pw())}var mw="D3PLUS-COMMON-RESET";var yw={and:"y",Back:"Atrás","Click to Expand":"Clic para Ampliar","Click to Hide":"Clic para Ocultar","Click to Highlight":"Clic para Resaltar","Click to Reset":"Clic para Restablecer",Download:"Descargar","Loading Visualization":"Cargando Visualización","No Data Available":"Datos No Disponibles","Powered by D3plus":"Funciona con D3plus",Share:"Porcentaje","Shift+Click to Hide":"Mayús+Clic para Ocultar",Total:"Total",Values:"Valores"};var _w={"es-ES":yw};function bw(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function ww(t,e){for(var n=0;n1&&arguments[1]!==undefined?arguments[1]:i._locale;var n=_w[e];return n&&n[t]?n[t]:t};this._uuid=vw()}xw(t,[{key:"config",value:function n(t){var i=this;if(!this._configDefault){var n={};Sw(this.__proto__).forEach(function(t){var e=i[t]();n[t]=bu(e)?xu({},e):e});this._configDefault=n}if(arguments.length){for(var e in t){if({}.hasOwnProperty.call(t,e)&&e in this){var r=t[e];if(r===mw){if(e==="on")this._on=this._configDefault[e];else this[e](this._configDefault[e])}else{kw(r,this._configDefault[e]);this[e](r)}}}return this}else{var a={};Sw(this.__proto__).forEach(function(t){a[t]=i[t]()});return a}}},{key:"locale",value:function t(e){return arguments.length?(this._locale=gw(e),this):this._locale}},{key:"on",value:function t(e,n){return arguments.length===2?(this._on[e]=n,this):arguments.length?typeof e==="string"?this._on[e]:(this._on=Object.assign({},this._on,e),this):this._on}},{key:"translate",value:function t(e){return arguments.length?(this._translate=e,this):this._translate}},{key:"shapeConfig",value:function t(e){return arguments.length?(this._shapeConfig=xu(this._shapeConfig,e),this):this._shapeConfig}}]);return t}();function Ew(n){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];if(!t||!(t instanceof Array)||!t.length)return undefined;return t.reduce(function(t,e){return Math.abs(e-n)0&&arguments[0]!==undefined?arguments[0]:this._shapeConfig;var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"shape";var e=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var n={duration:this._duration,on:{}};var o=function t(r){return function(t,e,n){var i;while(t.__d3plus__){if(i)t.__d3plusParent__=i;i=t;e=t.i;t=t.data||t.feature}return r.bind(a)(t,e,n||i)}};var s=function t(e,n){for(var i in n){if({}.hasOwnProperty.call(n,i)&&!i.includes(".")||i.includes(".".concat(r))){e.on[i]=o(n[i])}}};var l=function e(t){return t.map(function(t){if(t instanceof Array)return e(t);else if(Aw(t)==="object")return i({},t);else if(typeof t==="function")return o(t);else return t})};var i=function t(e,n){for(var i in n){if({}.hasOwnProperty.call(n,i)){if(i==="on")s(e,n[i]);else if(typeof n[i]==="function"){e[i]=o(n[i])}else if(n[i]instanceof Array){e[i]=l(n[i])}else if(Aw(n[i])==="object"){e[i]={on:{}};t(e[i],n[i])}else e[i]=n[i]}}};i(n,t);if(this._on)s(n,this._on);if(e&&t[e]){i(n,t[e]);if(t[e].on)s(n,t[e].on)}return n}function Rw(e){return function t(){return e}}function Tw(t,e){e=Object.assign({},{condition:true,enter:{},exit:{},parent:ys("body"),transition:hu().duration(0),update:{}},e);var n=/\.([^#]+)/g.exec(t),i=/#([^\.]+)/g.exec(t),r=/^([^.^#]+)/g.exec(t)[1];var a=e.parent.selectAll(t.includes(":")?t.split(":")[1]:t).data(e.condition?[null]:[]);var o=a.enter().append(r).call(ku,e.enter);if(i)o.attr("id",i[1]);if(n)o.attr("class",n[1]);a.exit().transition(e.transition).call(ku,e.exit).remove();var s=o.merge(a);s.transition(e.transition).call(ku,e.update);return s}function Ow(t){return t.filter(function(t,e,n){return n.indexOf(t)===e})}function Bw(r){var a=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var t=Ow(Vt(r.map(function(t){return Ke(t)}))),o={};t.forEach(function(e){var t=r.map(function(t){return t[e]});var n;if(a[e])n=a[e](t);else{var i=t.map(function(t){return t||t===false?t.constructor:t}).filter(function(t){return t!==void 0});if(!i.length)n=undefined;else if(i.indexOf(Array)>=0){n=Vt(t.map(function(t){return t instanceof Array?t:[t]}));n=Ow(n);if(n.length===1)n=n[0]}else if(i.indexOf(String)>=0){n=Ow(t);if(n.length===1)n=n[0]}else if(i.indexOf(Number)>=0)n=Ut(t);else if(i.indexOf(Object)>=0){n=Ow(t.filter(function(t){return t}));if(n.length===1)n=n[0];else n=Bw(n)}else{n=Ow(t.filter(function(t){return t!==void 0}));if(n.length===1)n=n[0]}}o[e]=n});return o}function Pw(t){var r;if(typeof t==="number")r=[t];else r=t.split(/\s+/);if(r.length===1)r=[r[0],r[0],r[0],r[0]];else if(r.length===2)r=r.concat(r);else if(r.length===3)r.push(r[1]);return["top","right","bottom","left"].reduce(function(t,e,n){var i=parseFloat(r[n]);t[e]=i||0;return t},{})}function Nw(){if("-webkit-transform"in document.body.style)return"-webkit-";else if("-moz-transform"in document.body.style)return"-moz-";else if("-ms-transform"in document.body.style)return"-ms-";else if("-o-transform"in document.body.style)return"-o-";else return""}function Dw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};for(var n in e){if({}.hasOwnProperty.call(e,n))t.style(n,e[n])}}var zw={"en-GB":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["£",""]},"en-US":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-CL":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["$",""]},"es-MX":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-ES":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","mm","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["€",""]},"et-EE":{separator:" ",suffixes:["y","z","a","f","p","n","µ","m","","tuhat","miljonit","miljardit","triljonit","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["","eurot"]},"fr-FR":{suffixes:["y","z","a","f","p","n","µ","m","","k","m","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["€",""]}};function jw(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){jw=function t(e){return j(e)}}else{jw=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return jw(t)}var Lw=function t(e,n){return parseFloat(Math.round(e*Math.pow(10,n))/Math.pow(10,n)).toFixed(n)};function Fw(t,e,n){var i=0;if(t){if(t<0)t*=-1;i=1+Math.floor(1e-12+Math.log(t)/Math.LN10);i=Math.max(-24,Math.min(24,Math.floor((i-1)/3)*3))}var r=n[8+i/3];return{number:Lw(r.scale(t),e),symbol:r.symbol}}function Iw(t,e){var n=Math.pow(10,Math.abs(8-e)*3);return{scale:e>8?function(t){return t/n}:function(t){return t*n},symbol:t}}function Hw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"en-US";var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(isFinite(t))t*=1;else return"N/A";var i=t<0;var r=t.toString().split(".")[0].replace("-","").length,a=jw(e)==="object"?e:zw[e]||zw["en-US"],o=a.suffixes.map(Iw);var s=a.delimiters.decimal||".",l=a.separator||"",u=a.delimiters.thousands||",";var c=yr({currency:a.currency||["$",""],decimal:s,grouping:a.grouping||[3],thousands:u});var h;if(n)h=c.format(n)(t);else if(t===0)h="0";else if(r>=3){var f=Fw(c.format(".3r")(t),2,o);var d=parseFloat(f.number).toString().replace(".",s);var g=f.symbol;h="".concat(d).concat(l).concat(g)}else if(r===3)h=c.format(",f")(t);else if(t<1&&t>-1)h=c.format(".2g")(t);else h=c.format(".3g")(t);return"".concat(i&&h.charAt(0)!=="-"?"-":"").concat(h).replace(/(\.[1-9]*)[0]*$/g,"$1").replace(/[.]$/g,"")}function Vw(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function Gw(t,e){for(var n=0;n>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?new vx(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?new vx(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=ex.exec(t))?new vx(e[1],e[2],e[3],1):(e=nx.exec(t))?new vx(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=ix.exec(t))?dx(e[1],e[2],e[3],e[4]):(e=rx.exec(t))?dx(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=ax.exec(t))?bx(e[1],e[2]/100,e[3]/100,1):(e=ox.exec(t))?bx(e[1],e[2]/100,e[3]/100,e[4]):sx.hasOwnProperty(t)?fx(sx[t]):t==="transparent"?new vx(NaN,NaN,NaN,0):null}function fx(t){return new vx(t>>16&255,t>>8&255,t&255,1)}function dx(t,e,n,i){if(i<=0)t=e=n=NaN;return new vx(t,e,n,i)}function gx(t){if(!(t instanceof Yw))t=hx(t);if(!t)return new vx;t=t.rgb();return new vx(t.r,t.g,t.b,t.opacity)}function px(t,e,n,i){return arguments.length===1?gx(t):new vx(t,e,n,i==null?1:i)}function vx(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}Ww(vx,px,Kw(Yw,{brighter:function t(e){e=e==null?$w:Math.pow($w,e);return new vx(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function t(e){e=e==null?Xw:Math.pow(Xw,e);return new vx(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function t(){return this},displayable:function t(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:mx,formatHex:mx,formatRgb:yx,toString:yx}));function mx(){return"#"+_x(this.r)+_x(this.g)+_x(this.b)}function yx(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}function _x(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function bx(t,e,n,i){if(i<=0)t=e=n=NaN;else if(n<=0||n>=1)t=e=NaN;else if(e<=0)t=NaN;return new kx(t,e,n,i)}function wx(t){if(t instanceof kx)return new kx(t.h,t.s,t.l,t.opacity);if(!(t instanceof Yw))t=hx(t);if(!t)return new kx;if(t instanceof kx)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,l=(a+r)/2;if(s){if(e===a)o=(n-i)/s+(n0&&l<1?0:o}return new kx(o,s,l,t.opacity)}function xx(t,e,n,i){return arguments.length===1?wx(t):new kx(t,e,n,i==null?1:i)}function kx(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}Ww(kx,xx,Kw(Yw,{brighter:function t(e){e=e==null?$w:Math.pow($w,e);return new kx(this.h,this.s,this.l*e,this.opacity)},darker:function t(e){e=e==null?Xw:Math.pow(Xw,e);return new kx(this.h,this.s,this.l*e,this.opacity)},rgb:function t(){var e=this.h%360+(this.h<0)*360,n=isNaN(e)||isNaN(this.s)?0:this.s,i=this.l,r=i+(i<.5?i:1-i)*n,a=2*i-r;return new vx(Sx(e>=240?e-240:e+120,a,r),Sx(e,a,r),Sx(e<120?e+240:e-120,a,r),this.opacity)},displayable:function t(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function t(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(e===1?")":", "+e+")")}}));function Sx(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}function Cx(t,e,n){t.prototype=e.prototype=n;n.constructor=t}function Ex(t,e){var n=Object.create(t.prototype);for(var i in e){n[i]=e[i]}return n}function Ax(){}var Mx=.7;var Rx=1/Mx;var Tx="\\s*([+-]?\\d+)\\s*",Ox="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",Bx="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Px=/^#([0-9a-f]{3,8})$/,Nx=new RegExp("^rgb\\("+[Tx,Tx,Tx]+"\\)$"),Dx=new RegExp("^rgb\\("+[Bx,Bx,Bx]+"\\)$"),zx=new RegExp("^rgba\\("+[Tx,Tx,Tx,Ox]+"\\)$"),jx=new RegExp("^rgba\\("+[Bx,Bx,Bx,Ox]+"\\)$"),Lx=new RegExp("^hsl\\("+[Ox,Bx,Bx]+"\\)$"),Fx=new RegExp("^hsla\\("+[Ox,Bx,Bx,Ox]+"\\)$");var Ix={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Cx(Ax,Ux,{copy:function t(e){return Object.assign(new this.constructor,this,e)},displayable:function t(){return this.rgb().displayable()},hex:Hx,formatHex:Hx,formatHsl:Vx,formatRgb:Gx,toString:Gx});function Hx(){return this.rgb().formatHex()}function Vx(){return tk(this).formatHsl()}function Gx(){return this.rgb().formatRgb()}function Ux(t){var e,n;t=(t+"").trim().toLowerCase();return(e=Px.exec(t))?(n=e[1].length,e=parseInt(e[1],16),n===6?qx(e):n===3?new Xx(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?new Xx(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?new Xx(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=Nx.exec(t))?new Xx(e[1],e[2],e[3],1):(e=Dx.exec(t))?new Xx(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=zx.exec(t))?Wx(e[1],e[2],e[3],e[4]):(e=jx.exec(t))?Wx(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Lx.exec(t))?Qx(e[1],e[2]/100,e[3]/100,1):(e=Fx.exec(t))?Qx(e[1],e[2]/100,e[3]/100,e[4]):Ix.hasOwnProperty(t)?qx(Ix[t]):t==="transparent"?new Xx(NaN,NaN,NaN,0):null}function qx(t){return new Xx(t>>16&255,t>>8&255,t&255,1)}function Wx(t,e,n,i){if(i<=0)t=e=n=NaN;return new Xx(t,e,n,i)}function Kx(t){if(!(t instanceof Ax))t=Ux(t);if(!t)return new Xx;t=t.rgb();return new Xx(t.r,t.g,t.b,t.opacity)}function Yx(t,e,n,i){return arguments.length===1?Kx(t):new Xx(t,e,n,i==null?1:i)}function Xx(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}Cx(Xx,Yx,Ex(Ax,{brighter:function t(e){e=e==null?Rx:Math.pow(Rx,e);return new Xx(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function t(e){e=e==null?Mx:Math.pow(Mx,e);return new Xx(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function t(){return this},displayable:function t(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:$x,formatHex:$x,formatRgb:Zx,toString:Zx}));function $x(){return"#"+Jx(this.r)+Jx(this.g)+Jx(this.b)}function Zx(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}function Jx(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function Qx(t,e,n,i){if(i<=0)t=e=n=NaN;else if(n<=0||n>=1)t=e=NaN;else if(e<=0)t=NaN;return new nk(t,e,n,i)}function tk(t){if(t instanceof nk)return new nk(t.h,t.s,t.l,t.opacity);if(!(t instanceof Ax))t=Ux(t);if(!t)return new nk;if(t instanceof nk)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,l=(a+r)/2;if(s){if(e===a)o=(n-i)/s+(n0&&l<1?0:o}return new nk(o,s,l,t.opacity)}function ek(t,e,n,i){return arguments.length===1?tk(t):new nk(t,e,n,i==null?1:i)}function nk(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}Cx(nk,ek,Ex(Ax,{brighter:function t(e){e=e==null?Rx:Math.pow(Rx,e);return new nk(this.h,this.s,this.l*e,this.opacity)},darker:function t(e){e=e==null?Mx:Math.pow(Mx,e);return new nk(this.h,this.s,this.l*e,this.opacity)},rgb:function t(){var e=this.h%360+(this.h<0)*360,n=isNaN(e)||isNaN(this.s)?0:this.s,i=this.l,r=i+(i<.5?i:1-i)*n,a=2*i-r;return new Xx(ik(e>=240?e-240:e+120,a,r),ik(e,a,r),ik(e<120?e+240:e-120,a,r),this.opacity)},displayable:function t(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function t(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(e===1?")":", "+e+")")}}));function ik(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}function rk(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;t=ek(t);e=ek(e);var r=Math.abs(e.h*i-t.h*n);if(r>180)r-=360;var a=(Math.min(t.h,e.h)+r/2)%360;var o=t.l+(e.l*i-t.l*n)/2,s=t.s+(e.s*i-t.s*n)/2;if(a<0)a+=360;return ek("hsl(".concat(a,",").concat(s*100,"%,").concat(o*100,"%)")).toString()}var ak={dark:"#444444",light:"#f7f7f7",missing:"#cccccc",off:"#b22200",on:"#224f20",scale:Je().range(["#b22200","#282f6b","#eace3f","#b35c1e","#224f20","#5f487c","#759143","#419391","#993c88","#e89c89","#ffee8d","#afd5e8","#f7ba77","#a5c697","#c5b5e5","#d1d392","#bbefd0","#e099cf"])};function ok(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};return t in e?e[t]:t in ak?ak[t]:ak.missing}function sk(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if([null,void 0].indexOf(t)>=0)return ok("missing",e);else if(t===true)return ok("on",e);else if(t===false)return ok("off",e);var n=Ux(t);if(!n)return ok("scale",e)(t);return t.toString()}function lk(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};t=Yx(t);var n=(t.r*299+t.g*587+t.b*114)/1e3;return n>=128?ok("dark",e):ok("light",e)}function uk(t){t=ek(t);if(t.l>.45){if(t.s>.8)t.s=.8;t.l=.45}return t.toString()}function ck(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:.5;t=ek(t);e*=1-t.l;t.l+=e;t.s-=e;return t.toString()}function hk(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;t=ek(t);e=ek(e);var r=e.h*i-t.h*n;if(Math.abs(r)>180)r-=360;var a=(t.h-r)%360;var o=t.l-(e.l*i-t.l*n)/2,s=t.s-(e.s*i-t.s*n)/2;if(a<0)a+=360;return ek("hsl(".concat(a,",").concat(s*100,"%,").concat(o*100,"%)")).toString()}var fk=Math.PI,dk=2*fk,gk=1e-6,pk=dk-gk;function vk(){this._x0=this._y0=this._x1=this._y1=null;this._=""}function mk(){return new vk}vk.prototype=mk.prototype={constructor:vk,moveTo:function t(e,n){this._+="M"+(this._x0=this._x1=+e)+","+(this._y0=this._y1=+n)},closePath:function t(){if(this._x1!==null){this._x1=this._x0,this._y1=this._y0;this._+="Z"}},lineTo:function t(e,n){this._+="L"+(this._x1=+e)+","+(this._y1=+n)},quadraticCurveTo:function t(e,n,i,r){this._+="Q"+ +e+","+ +n+","+(this._x1=+i)+","+(this._y1=+r)},bezierCurveTo:function t(e,n,i,r,a,o){this._+="C"+ +e+","+ +n+","+ +i+","+ +r+","+(this._x1=+a)+","+(this._y1=+o)},arcTo:function t(e,n,i,r,a){e=+e,n=+n,i=+i,r=+r,a=+a;var o=this._x1,s=this._y1,l=i-e,u=r-n,c=o-e,h=s-n,f=c*c+h*h;if(a<0)throw new Error("negative radius: "+a);if(this._x1===null){this._+="M"+(this._x1=e)+","+(this._y1=n)}else if(!(f>gk));else if(!(Math.abs(h*l-u*c)>gk)||!a){this._+="L"+(this._x1=e)+","+(this._y1=n)}else{var d=i-o,g=r-s,p=l*l+u*u,v=d*d+g*g,m=Math.sqrt(p),y=Math.sqrt(f),_=a*Math.tan((fk-Math.acos((p+f-v)/(2*m*y)))/2),b=_/y,w=_/m;if(Math.abs(b-1)>gk){this._+="L"+(e+b*c)+","+(n+b*h)}this._+="A"+a+","+a+",0,0,"+ +(h*d>c*g)+","+(this._x1=e+w*l)+","+(this._y1=n+w*u)}},arc:function t(e,n,i,r,a,o){e=+e,n=+n,i=+i,o=!!o;var s=i*Math.cos(r),l=i*Math.sin(r),u=e+s,c=n+l,h=1^o,f=o?r-a:a-r;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null){this._+="M"+u+","+c}else if(Math.abs(this._x1-u)>gk||Math.abs(this._y1-c)>gk){this._+="L"+u+","+c}if(!i)return;if(f<0)f=f%dk+dk;if(f>pk){this._+="A"+i+","+i+",0,1,"+h+","+(e-s)+","+(n-l)+"A"+i+","+i+",0,1,"+h+","+(this._x1=u)+","+(this._y1=c)}else if(f>gk){this._+="A"+i+","+i+",0,"+ +(f>=fk)+","+h+","+(this._x1=e+i*Math.cos(a))+","+(this._y1=n+i*Math.sin(a))}},rect:function t(e,n,i,r){this._+="M"+(this._x0=this._x1=+e)+","+(this._y0=this._y1=+n)+"h"+ +i+"v"+ +r+"h"+-i+"Z"},toString:function t(){return this._}};function yk(e){return function t(){return e}}var _k=Math.abs;var bk=Math.atan2;var wk=Math.cos;var xk=Math.max;var kk=Math.min;var Sk=Math.sin;var Ck=Math.sqrt;var Ek=1e-12;var Ak=Math.PI;var Mk=Ak/2;var Rk=2*Ak;function Tk(t){return t>1?0:t<-1?Ak:Math.acos(t)}function Ok(t){return t>=1?Mk:t<=-1?-Mk:Math.asin(t)}function Bk(t){return t.innerRadius}function Pk(t){return t.outerRadius}function Nk(t){return t.startAngle}function Dk(t){return t.endAngle}function zk(t){return t&&t.padAngle}function jk(t,e,n,i,r,a,o,s){var l=n-t,u=i-e,c=o-r,h=s-a,f=h*l-c*u;if(f*fT*T+O*O)S=E,C=A;return{cx:S,cy:C,x01:-c,y01:-h,x11:S*(r/w-1),y11:C*(r/w-1)}}function Fk(){var L=Bk,F=Pk,I=yk(0),H=null,V=Nk,G=Dk,U=zk,q=null;function e(){var t,e,n=+L.apply(this,arguments),i=+F.apply(this,arguments),r=V.apply(this,arguments)-Mk,a=G.apply(this,arguments)-Mk,o=_k(a-r),s=a>r;if(!q)q=t=mk();if(iEk))q.moveTo(0,0);else if(o>Rk-Ek){q.moveTo(i*wk(r),i*Sk(r));q.arc(0,0,i,r,a,!s);if(n>Ek){q.moveTo(n*wk(a),n*Sk(a));q.arc(0,0,n,a,r,s)}}else{var l=r,u=a,c=r,h=a,f=o,d=o,g=U.apply(this,arguments)/2,p=g>Ek&&(H?+H.apply(this,arguments):Ck(n*n+i*i)),v=kk(_k(i-n)/2,+I.apply(this,arguments)),m=v,y=v,_,b;if(p>Ek){var w=Ok(p/n*Sk(g)),x=Ok(p/i*Sk(g));if((f-=w*2)>Ek)w*=s?1:-1,c+=w,h-=w;else f=0,c=h=(r+a)/2;if((d-=x*2)>Ek)x*=s?1:-1,l+=x,u-=x;else d=0,l=u=(r+a)/2}var k=i*wk(l),S=i*Sk(l),C=n*wk(h),E=n*Sk(h);if(v>Ek){var A=i*wk(u),M=i*Sk(u),R=n*wk(c),T=n*Sk(c),O;if(oEk))q.moveTo(k,S);else if(y>Ek){_=Lk(R,T,k,S,i,y,s);b=Lk(A,M,C,E,i,y,s);q.moveTo(_.cx+_.x01,_.cy+_.y01);if(yEk)||!(f>Ek))q.lineTo(C,E);else if(m>Ek){_=Lk(C,E,A,M,n,-m,s);b=Lk(k,S,R,T,n,-m,s);q.lineTo(_.cx+_.x01,_.cy+_.y01);if(m=n;--i){m.point(l[i],u[i])}m.lineEnd();m.areaEnd()}}if(o){l[e]=+c(a,e,t),u[e]=+f(a,e,t);m.point(h?+h(a,e,t):l[e],d?+d(a,e,t):u[e])}}if(s)return m=null,s+""||null}function t(){return Uk().defined(g).curve(v).context(p)}e.x=function(t){return arguments.length?(c=typeof t==="function"?t:yk(+t),h=null,e):c};e.x0=function(t){return arguments.length?(c=typeof t==="function"?t:yk(+t),e):c};e.x1=function(t){return arguments.length?(h=t==null?null:typeof t==="function"?t:yk(+t),e):h};e.y=function(t){return arguments.length?(f=typeof t==="function"?t:yk(+t),d=null,e):f};e.y0=function(t){return arguments.length?(f=typeof t==="function"?t:yk(+t),e):f};e.y1=function(t){return arguments.length?(d=t==null?null:typeof t==="function"?t:yk(+t),e):d};e.lineX0=e.lineY0=function(){return t().x(c).y(f)};e.lineY1=function(){return t().x(c).y(d)};e.lineX1=function(){return t().x(h).y(f)};e.defined=function(t){return arguments.length?(g=typeof t==="function"?t:yk(!!t),e):g};e.curve=function(t){return arguments.length?(v=t,p!=null&&(m=v(p)),e):v};e.context=function(t){return arguments.length?(t==null?p=m=null:m=v(p=t),e):p};return e}function Wk(t,e){return et?1:e>=t?0:NaN}function Kk(t){return t}function Yk(){var g=Kk,p=Wk,v=null,m=yk(0),y=yk(Rk),_=yk(0);function e(n){var t,e=n.length,i,r,a=0,o=new Array(e),s=new Array(e),l=+m.apply(this,arguments),u=Math.min(Rk,Math.max(-Rk,y.apply(this,arguments)-l)),c,h=Math.min(Math.abs(u)/e,_.apply(this,arguments)),f=h*(u<0?-1:1),d;for(t=0;t0){a+=d}}if(p!=null)o.sort(function(t,e){return p(s[t],s[e])});else if(v!=null)o.sort(function(t,e){return v(n[t],n[e])});for(t=0,r=a?(u-e*f)/a:0;t0?d*r:0)+f,s[i]={data:n[i],index:t,value:d,startAngle:l,endAngle:c,padAngle:h}}return s}e.value=function(t){return arguments.length?(g=typeof t==="function"?t:yk(+t),e):g};e.sortValues=function(t){return arguments.length?(p=t,v=null,e):p};e.sort=function(t){return arguments.length?(v=t,p=null,e):v};e.startAngle=function(t){return arguments.length?(m=typeof t==="function"?t:yk(+t),e):m};e.endAngle=function(t){return arguments.length?(y=typeof t==="function"?t:yk(+t),e):y};e.padAngle=function(t){return arguments.length?(_=typeof t==="function"?t:yk(+t),e):_};return e}var Xk=Zk(Hk);function $k(t){this._curve=t}$k.prototype={areaStart:function t(){this._curve.areaStart()},areaEnd:function t(){this._curve.areaEnd()},lineStart:function t(){this._curve.lineStart()},lineEnd:function t(){this._curve.lineEnd()},point:function t(e,n){this._curve.point(n*Math.sin(e),n*-Math.cos(e))}};function Zk(e){function t(t){return new $k(e(t))}t._curve=e;return t}function Jk(t){var e=t.curve;t.angle=t.x,delete t.x;t.radius=t.y,delete t.y;t.curve=function(t){return arguments.length?e(Zk(t)):e()._curve};return t}function Qk(){return Jk(Uk().curve(Xk))}function tS(){var t=qk().curve(Xk),e=t.curve,n=t.lineX0,i=t.lineX1,r=t.lineY0,a=t.lineY1;t.angle=t.x,delete t.x;t.startAngle=t.x0,delete t.x0;t.endAngle=t.x1,delete t.x1;t.radius=t.y,delete t.y;t.innerRadius=t.y0,delete t.y0;t.outerRadius=t.y1,delete t.y1;t.lineStartAngle=function(){return Jk(n())},delete t.lineX0;t.lineEndAngle=function(){return Jk(i())},delete t.lineX1;t.lineInnerRadius=function(){return Jk(r())},delete t.lineY0;t.lineOuterRadius=function(){return Jk(a())},delete t.lineY1;t.curve=function(t){return arguments.length?e(Zk(t)):e()._curve};return t}function eS(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]}var nS=Array.prototype.slice;function iS(t){return t.source}function rS(t){return t.target}function aS(r){var a=iS,o=rS,s=Vk,l=Gk,u=null;function e(){var t,e=nS.call(arguments),n=a.apply(this,e),i=o.apply(this,e);if(!u)u=t=mk();r(u,+s.apply(this,(e[0]=n,e)),+l.apply(this,e),+s.apply(this,(e[0]=i,e)),+l.apply(this,e));if(t)return u=null,t+""||null}e.source=function(t){return arguments.length?(a=t,e):a};e.target=function(t){return arguments.length?(o=t,e):o};e.x=function(t){return arguments.length?(s=typeof t==="function"?t:yk(+t),e):s};e.y=function(t){return arguments.length?(l=typeof t==="function"?t:yk(+t),e):l};e.context=function(t){return arguments.length?(u=t==null?null:t,e):u};return e}function oS(t,e,n,i,r){t.moveTo(e,n);t.bezierCurveTo(e=(e+i)/2,n,e,r,i,r)}function sS(t,e,n,i,r){t.moveTo(e,n);t.bezierCurveTo(e,n=(n+r)/2,i,n,i,r)}function lS(t,e,n,i,r){var a=eS(e,n),o=eS(e,n=(n+r)/2),s=eS(i,n),l=eS(i,r);t.moveTo(a[0],a[1]);t.bezierCurveTo(o[0],o[1],s[0],s[1],l[0],l[1])}function uS(){return aS(oS)}function cS(){return aS(sS)}function hS(){var t=aS(lS);t.angle=t.x,delete t.x;t.radius=t.y,delete t.y;return t}var fS={draw:function t(e,n){var i=Math.sqrt(n/Ak);e.moveTo(i,0);e.arc(0,0,i,0,Rk)}};var dS={draw:function t(e,n){var i=Math.sqrt(n/5)/2;e.moveTo(-3*i,-i);e.lineTo(-i,-i);e.lineTo(-i,-3*i);e.lineTo(i,-3*i);e.lineTo(i,-i);e.lineTo(3*i,-i);e.lineTo(3*i,i);e.lineTo(i,i);e.lineTo(i,3*i);e.lineTo(-i,3*i);e.lineTo(-i,i);e.lineTo(-3*i,i);e.closePath()}};var gS=Math.sqrt(1/3),pS=gS*2;var vS={draw:function t(e,n){var i=Math.sqrt(n/pS),r=i*gS;e.moveTo(0,-i);e.lineTo(r,0);e.lineTo(0,i);e.lineTo(-r,0);e.closePath()}};var mS=.8908130915292852,yS=Math.sin(Ak/10)/Math.sin(7*Ak/10),_S=Math.sin(Rk/10)*yS,bS=-Math.cos(Rk/10)*yS;var wS={draw:function t(e,n){var i=Math.sqrt(n*mS),r=_S*i,a=bS*i;e.moveTo(0,-i);e.lineTo(r,a);for(var o=1;o<5;++o){var s=Rk*o/5,l=Math.cos(s),u=Math.sin(s);e.lineTo(u*i,-l*i);e.lineTo(l*r-u*a,u*r+l*a)}e.closePath()}};var xS={draw:function t(e,n){var i=Math.sqrt(n),r=-i/2;e.rect(r,r,i,i)}};var kS=Math.sqrt(3);var SS={draw:function t(e,n){var i=-Math.sqrt(n/(kS*3));e.moveTo(0,i*2);e.lineTo(-kS*i,-i);e.lineTo(kS*i,-i);e.closePath()}};var CS=-.5,ES=Math.sqrt(3)/2,AS=1/Math.sqrt(12),MS=(AS/2+1)*3;var RS={draw:function t(e,n){var i=Math.sqrt(n/MS),r=i/2,a=i*AS,o=r,s=i*AS+i,l=-o,u=s;e.moveTo(r,a);e.lineTo(o,s);e.lineTo(l,u);e.lineTo(CS*r-ES*a,ES*r+CS*a);e.lineTo(CS*o-ES*s,ES*o+CS*s);e.lineTo(CS*l-ES*u,ES*l+CS*u);e.lineTo(CS*r+ES*a,CS*a-ES*r);e.lineTo(CS*o+ES*s,CS*s-ES*o);e.lineTo(CS*l+ES*u,CS*u-ES*l);e.closePath()}};var TS=[fS,dS,vS,xS,wS,SS,RS];function OS(){var e=yk(fS),n=yk(64),i=null;function r(){var t;if(!i)i=t=mk();e.apply(this,arguments).draw(i,+n.apply(this,arguments));if(t)return i=null,t+""||null}r.type=function(t){return arguments.length?(e=typeof t==="function"?t:yk(t),r):e};r.size=function(t){return arguments.length?(n=typeof t==="function"?t:yk(+t),r):n};r.context=function(t){return arguments.length?(i=t==null?null:t,r):i};return r}function BS(){}function PS(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function NS(t){this._context=t}NS.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 3:PS(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;break;case 2:this._point=3;this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:PS(this,e,n);break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n}};function DS(t){return new NS(t)}function zS(t){this._context=t}zS.prototype={areaStart:BS,areaEnd:BS,lineStart:function t(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2);this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3);this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3);this._context.closePath();break}case 3:{this.point(this._x2,this._y2);this.point(this._x3,this._y3);this.point(this._x4,this._y4);break}}},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._x2=e,this._y2=n;break;case 1:this._point=2;this._x3=e,this._y3=n;break;case 2:this._point=3;this._x4=e,this._y4=n;this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+n)/6);break;default:PS(this,e,n);break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n}};function jS(t){return new zS(t)}function LS(t){this._context=t}LS.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function t(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var i=(this._x0+4*this._x1+e)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(i,r):this._context.moveTo(i,r);break;case 3:this._point=4;default:PS(this,e,n);break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n}};function FS(t){return new LS(t)}function IS(t,e){this._basis=new NS(t);this._beta=e}IS.prototype={lineStart:function t(){this._x=[];this._y=[];this._basis.lineStart()},lineEnd:function t(){var e=this._x,n=this._y,i=e.length-1;if(i>0){var r=e[0],a=n[0],o=e[i]-r,s=n[i]-a,l=-1,u;while(++l<=i){u=l/i;this._basis.point(this._beta*e[l]+(1-this._beta)*(r+u*o),this._beta*n[l]+(1-this._beta)*(a+u*s))}}this._x=this._y=null;this._basis.lineEnd()},point:function t(e,n){this._x.push(+e);this._y.push(+n)}};var HS=function e(n){function t(t){return n===1?new NS(t):new IS(t,n)}t.beta=function(t){return e(+t)};return t}(.85);function VS(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function GS(t,e){this._context=t;this._k=(1-e)/6}GS.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:VS(this,this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;this._x1=e,this._y1=n;break;case 2:this._point=3;default:VS(this,e,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var US=function e(n){function t(t){return new GS(t,n)}t.tension=function(t){return e(+t)};return t}(0);function qS(t,e){this._context=t;this._k=(1-e)/6}qS.prototype={areaStart:BS,areaEnd:BS,lineStart:function t(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._x3=e,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=e,this._y4=n);break;case 2:this._point=3;this._x5=e,this._y5=n;break;default:VS(this,e,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var WS=function e(n){function t(t){return new qS(t,n)}t.tension=function(t){return e(+t)};return t}(0);function KS(t,e){this._context=t;this._k=(1-e)/6}KS.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function t(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:VS(this,e,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var YS=function e(n){function t(t){return new KS(t,n)}t.tension=function(t){return e(+t)};return t}(0);function XS(t,e,n){var i=t._x1,r=t._y1,a=t._x2,o=t._y2;if(t._l01_a>Ek){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,l=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/l;r=(r*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/l}if(t._l23_a>Ek){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,c=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*u+t._x1*t._l23_2a-e*t._l12_2a)/c;o=(o*u+t._y1*t._l23_2a-n*t._l12_2a)/c}t._context.bezierCurveTo(i,r,a,o,t._x2,t._y2)}function $S(t,e){this._context=t;this._alpha=e}$S.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function t(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;if(this._point){var i=this._x2-e,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+r*r,this._alpha))}switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;break;case 2:this._point=3;default:XS(this,e,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var ZS=function e(n){function t(t){return n?new $S(t,n):new GS(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function JS(t,e){this._context=t;this._alpha=e}JS.prototype={areaStart:BS,areaEnd:BS,lineStart:function t(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function t(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function t(e,n){e=+e,n=+n;if(this._point){var i=this._x2-e,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+r*r,this._alpha))}switch(this._point){case 0:this._point=1;this._x3=e,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=e,this._y4=n);break;case 2:this._point=3;this._x5=e,this._y5=n;break;default:XS(this,e,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var QS=function e(n){function t(t){return n?new JS(t,n):new qS(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function tC(t,e){this._context=t;this._alpha=e}tC.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function t(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;if(this._point){var i=this._x2-e,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:XS(this,e,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var eC=function e(n){function t(t){return n?new tC(t,n):new KS(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function nC(t){this._context=t}nC.prototype={areaStart:BS,areaEnd:BS,lineStart:function t(){this._point=0},lineEnd:function t(){if(this._point)this._context.closePath()},point:function t(e,n){e=+e,n=+n;if(this._point)this._context.lineTo(e,n);else this._point=1,this._context.moveTo(e,n)}};function iC(t){return new nC(t)}function rC(t){return t<0?-1:1}function aC(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),s=(a*r+o*i)/(i+r);return(rC(a)+rC(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function oC(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function sC(t,e,n){var i=t._x0,r=t._y0,a=t._x1,o=t._y1,s=(a-i)/3;t._context.bezierCurveTo(i+s,r+s*e,a-s,o-s*n,a,o)}function lC(t){this._context=t}lC.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:sC(this,this._t0,oC(this,this._t0));break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){var i=NaN;e=+e,n=+n;if(e===this._x1&&n===this._y1)return;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;break;case 2:this._point=3;sC(this,oC(this,i=aC(this,e,n)),i);break;default:sC(this,this._t0,i=aC(this,e,n));break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n;this._t0=i}};function uC(t){this._context=new cC(t)}(uC.prototype=Object.create(lC.prototype)).point=function(t,e){lC.prototype.point.call(this,e,t)};function cC(t){this._context=t}cC.prototype={moveTo:function t(e,n){this._context.moveTo(n,e)},closePath:function t(){this._context.closePath()},lineTo:function t(e,n){this._context.lineTo(n,e)},bezierCurveTo:function t(e,n,i,r,a,o){this._context.bezierCurveTo(n,e,r,i,o,a)}};function hC(t){return new lC(t)}function fC(t){return new uC(t)}function dC(t){this._context=t}dC.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x=[];this._y=[]},lineEnd:function t(){var e=this._x,n=this._y,i=e.length;if(i){this._line?this._context.lineTo(e[0],n[0]):this._context.moveTo(e[0],n[0]);if(i===2){this._context.lineTo(e[1],n[1])}else{var r=gC(e),a=gC(n);for(var o=0,s=1;s=0;--e){r[e]=(o[e]-r[e+1])/a[e]}a[n-1]=(t[n]+r[n-1])/2;for(e=0;e=0)this._t=1-this._t,this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;default:{if(this._t<=0){this._context.lineTo(this._x,n);this._context.lineTo(e,n)}else{var i=this._x*(1-this._t)+e*this._t;this._context.lineTo(i,this._y);this._context.lineTo(i,n)}break}}this._x=e,this._y=n}};function mC(t){return new vC(t,.5)}function yC(t){return new vC(t,0)}function _C(t){return new vC(t,1)}function bC(t,e){if(!((o=t.length)>1))return;for(var n=1,i,r,a=t[e[0]],o,s=a.length;n=0){n[e]=e}return n}function xC(t,e){return t[e]}function kC(){var h=yk([]),f=wC,d=bC,g=xC;function e(t){var e=h.apply(this,arguments),n,i=t.length,r=e.length,a=new Array(r),o;for(n=0;n0))return;for(var n,i,r=0,a=t[0].length,o;r0))return;for(var n,i=0,r,a,o,s,l,u=t[e[0]].length;i0){r[0]=o,r[1]=o+=a}else if(a<0){r[1]=s,r[0]=s+=a}else{r[0]=0,r[1]=a}}}}function EC(t,e){if(!((r=t.length)>0))return;for(var n=0,i=t[e[0]],r,a=i.length;n0)||!((a=(r=t[e[0]]).length)>0))return;for(var n=0,i=1,r,a,o;ia)a=r,n=e}return n}function TC(t){var n=t.map(OC);return wC(t).sort(function(t,e){return n[t]-n[e]})}function OC(t){var e=0,n=-1,i=t.length,r;while(++n]+>/g,""),"text/html");return e.documentElement?e.documentElement.textContent:t}function jC(t,e){e=Object.assign({"font-size":10,"font-family":"sans-serif","font-style":"normal","font-weight":400,"font-variant":"normal"},e);var n=document.createElement("canvas").getContext("2d");var i=[];i.push(e["font-style"]);i.push(e["font-variant"]);i.push(e["font-weight"]);i.push(typeof e["font-size"]==="string"?e["font-size"]:"".concat(e["font-size"],"px"));i.push(e["font-family"]);n.font=i.join(" ");if(t instanceof Array)return t.map(function(t){return n.measureText(zC(t)).width});return n.measureText(zC(t)).width}function LC(t){return t.toString().replace(/^\s+|\s+$/g,"")}function FC(t){return t.toString().replace(/^\s+/,"")}function IC(t){return t.toString().replace(/\s+$/,"")}var HC="abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",VC={},GC=32;var UC,qC,WC,KC;var YC=function t(e){if(!UC){UC=jC(HC,{"font-family":"DejaVuSans","font-size":GC});qC=jC(HC,{"font-family":"-apple-system","font-size":GC});WC=jC(HC,{"font-family":"monospace","font-size":GC});KC=jC(HC,{"font-family":"sans-serif","font-size":GC})}if(!(e instanceof Array))e=e.split(",");e=e.map(function(t){return LC(t)});for(var n=0;n",")","}","]",".","!","?","/","u00BB","u300B","u3009"].concat(nE);var aE="က-ဪဿ-၉ၐ-ၕ";var oE="぀-ゟ゠-ヿ＀-+--}⦅-゚㐀-䶿";var sE="㐀-龿";var lE="ກ-ຮະ-ໄ່-໋ໍ-ໝ";var uE=aE+sE+oE+lE;var cE=new RegExp("(\\".concat(nE.join("|\\"),")*[^\\s|\\").concat(nE.join("|\\"),"]*(\\").concat(nE.join("|\\"),")*"),"g");var hE=new RegExp("[".concat(uE,"]"));var fE=new RegExp("(\\".concat(iE.join("|\\"),")*[").concat(uE,"](\\").concat(rE.join("|\\"),"|\\").concat(eE.join("|\\"),")*|[a-z0-9]+"),"gi");function dE(t){if(!hE.test(t))return $C(t).match(cE).filter(function(t){return t.length});return Vt($C(t).match(cE).map(function(t){if(hE.test(t))return t.match(fE);return[t]}))}function gE(){var d="sans-serif",g=10,p=400,v=200,m,y=null,_=false,b=dE,w=200;function e(t){t=$C(t);if(m===void 0)m=Math.ceil(g*1.4);var e=b(t);var n={"font-family":d,"font-size":g,"font-weight":p,"line-height":m};var i=1,r="",a=false,o=0;var s=[],l=jC(e,n),u=jC(" ",n);for(var c=0;cw){if(!c&&!_){a=true;break}if(s.length>=i)s[i-1]=IC(s[i-1]);i++;if(m*i>v||f>w&&!_||y&&i>y){a=true;break}o=0;s.push(h)}else if(!c)s[0]=h;else s[i-1]+=h;r+=h;o+=f;o+=h.match(/[\s]*$/g)[0].length*u}return{lines:s,sentence:t,truncated:a,widths:jC(s,n),words:e}}e.fontFamily=function(t){return arguments.length?(d=t,e):d};e.fontSize=function(t){return arguments.length?(g=t,e):g};e.fontWeight=function(t){return arguments.length?(p=t,e):p};e.height=function(t){return arguments.length?(v=t,e):v};e.lineHeight=function(t){return arguments.length?(m=t,e):m};e.maxLines=function(t){return arguments.length?(y=t,e):y};e.overflow=function(t){return arguments.length?(_=t,e):_};e.split=function(t){return arguments.length?(b=t,e):b};e.width=function(t){return arguments.length?(w=t,e):w};return e}function pE(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){pE=function t(e){return j(e)}}else{pE=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return pE(t)}function vE(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function mE(t,e){for(var n=0;ny&&(g>s||r&&g>y*a)){if(r){c=jC(b,f);var x=1.165+p/g*.1,k=p*g,S=Ht(c),C=Ut(c,function(t){return t*s})*x;if(S>p||C>k){var E=Math.sqrt(k/C),A=p/S;var M=Gt([E,A]);o=Math.floor(o*M)}var R=Math.floor(g*.8);if(o>R)o=R}w()}if(u.length){var T=l*s;var O=P._rotate(e,n);var B=O===0?_==="top"?0:_==="middle"?g/2-T/2:g-T:0;B-=s*.1;t.push({aH:P._ariaHidden(e,n),data:e,i:n,lines:u,fC:P._fontColor(e,n),fF:f["font-family"],fO:P._fontOpacity(e,n),fW:f["font-weight"],id:P._id(e,n),tA:P._textAnchor(e,n),vA:P._verticalAlign(e,n),widths:h.widths,fS:o,lH:s,w:p,h:g,r:O,x:P._x(e,n)+d.left,y:P._y(e,n)+B+d.top})}return t},[]),function(t){return P._id(t.data,t.i)});var r=hu().duration(this._duration);if(this._duration===0){n.exit().remove()}else{n.exit().transition().delay(this._duration).remove();n.exit().selectAll("text").transition(r).attr("opacity",0).style("opacity",0)}function i(t){t.attr("transform",function(t,e){var n=N._rotateAnchor(t,e);return"translate(".concat(t.x,", ").concat(t.y,") rotate(").concat(t.r,", ").concat(n[0],", ").concat(n[1],")")})}var a=n.enter().append("g").attr("class","d3plus-textBox").attr("id",function(t){return"d3plus-textBox-".concat(JC(t.id))}).call(i).merge(n);var o=XC();a.style("pointer-events",function(t){return P._pointerEvents(t.data,t.i)}).each(function(n){function t(t){t[N._html?"html":"text"](function(t){return IC(t).replace(/&([^\;&]*)/g,function(t,e){return e==="amp"?t:"&".concat(e)}).replace(/<([^A-z^/]+)/g,function(t,e){return"<".concat(e)}).replace(/<$/g,"<").replace(/(<[^>^\/]+>)([^<^>]+)$/g,function(t,e,n){return"".concat(e).concat(n).concat(e.replace("<","]+)(<\/[^>]+>)/g,function(t,e,n){return"".concat(n.replace("]*>([^<^>]+)<\/[^>]+>/g,function(t,e,n){var i=N._html[e]?''):"";return"".concat(i.length?i:"").concat(n).concat(i.length?"":"")})})}function e(t){t.attr("aria-hidden",n.aH).attr("dir",o?"rtl":"ltr").attr("fill",n.fC).attr("text-anchor",n.tA).attr("font-family",n.fF).style("font-family",n.fF).attr("font-size","".concat(n.fS,"px")).style("font-size","".concat(n.fS,"px")).attr("font-weight",n.fW).style("font-weight",n.fW).attr("x","".concat(n.tA==="middle"?n.w/2:o?n.tA==="start"?n.w:0:n.tA==="end"?n.w:2*Math.sin(Math.PI*n.r/180),"px")).attr("y",function(t,e){return n.r===0||n.vA==="top"?"".concat((e+1)*n.lH-(n.lH-n.fS),"px"):n.vA==="middle"?"".concat((n.h+n.fS)/2-(n.lH-n.fS)+(e-n.lines.length/2+.5)*n.lH,"px"):"".concat(n.h-2*(n.lH-n.fS)-(n.lines.length-(e+1))*n.lH+2*Math.cos(Math.PI*n.r/180),"px")})}var i=ys(this).selectAll("text").data(n.lines);if(N._duration===0){i.call(t).call(e);i.exit().remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("unicode-bidi","bidi-override").call(t).call(e).attr("opacity",n.fO).style("opacity",n.fO)}else{i.call(t).transition(r).call(e);i.exit().transition(r).attr("opacity",0).remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("opacity",0).style("opacity",0).call(t).call(e).merge(i).transition(r).delay(N._delay).call(e).attr("opacity",n.fO).style("opacity",n.fO)}}).transition(r).call(i);var s=Object.keys(this._on),l=s.reduce(function(t,n){t[n]=function(t,e){return P._on[n](t.data,e)};return t},{});for(var u=0;u=0)return o[r];else if(a.includes(i)&&e!==0&&e!==l.length-1)return n;else return t.charAt(0).toUpperCase()+t.substr(1).toLowerCase()}else return""}).reduce(function(t,e,n){if(n&&i.charAt(t.length)===" ")t+=" ";t+=e;return t},"")}var RE=function(t,e){var n=e[0]-t[0],i=e[1]-t[1];return n*n+i*i};var TE=function(t,e){return Math.sqrt(RE(t,e))};function OE(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){OE=function t(e){return j(e)}}else{OE=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return OE(t)}function BE(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function PE(t,e){for(var n=0;n0&&arguments[0]!==undefined?arguments[0]:"g";BE(this,e);r=DE(this,jE(e).call(this));r._activeOpacity=.25;r._activeStyle={stroke:function t(e,n){var i=r._fill(e,n);if(["transparent","none"].includes(i))i=r._stroke(e,n);return hx(i).darker(1)},"stroke-width":function t(e,n){var i=r._strokeWidth(e,n)||1;return i*3}};r._ariaLabel=Rw("");r._backgroundImage=Rw(false);r._backgroundImageClass=new qw;r._data=[];r._duration=600;r._fill=Rw("black");r._fillOpacity=Rw(1);r._hoverOpacity=.5;r._hoverStyle={stroke:function t(e,n){var i=r._fill(e,n);if(["transparent","none"].includes(i))i=r._stroke(e,n);return hx(i).darker(.5)},"stroke-width":function t(e,n){var i=r._strokeWidth(e,n)||1;return i*2}};r._id=function(t,e){return t.id!==void 0?t.id:e};r._label=Rw(false);r._labelClass=new CE;r._labelConfig={fontColor:function t(e,n){return lk(r._fill(e,n))},fontSize:12,padding:5};r._name="Shape";r._opacity=Rw(1);r._pointerEvents=Rw("visiblePainted");r._role=Rw("presentation");r._rotate=Rw(0);r._rx=Rw(0);r._ry=Rw(0);r._scale=Rw(1);r._shapeRendering=Rw("geometricPrecision");r._stroke=function(t,e){return hx(r._fill(t,e)).darker(1)};r._strokeDasharray=Rw("0");r._strokeLinecap=Rw("butt");r._strokeOpacity=Rw(1);r._strokeWidth=Rw(0);r._tagName=t;r._textAnchor=Rw("start");r._vectorEffect=Rw("non-scaling-stroke");r._verticalAlign=Rw("top");r._x=yu("x",0);r._y=yu("y",0);return r}NE(e,[{key:"_aes",value:function t(){return{}}},{key:"_applyEvents",value:function t(e){var a=this;var o=Object.keys(this._on);var n=function t(r){e.on(o[r],function(t,e){if(!a._on[o[r]])return;if(t.i!==void 0)e=t.i;if(t.nested&&t.values){var n=ws(a._select.node()),i=t.values.map(function(t){return TE(n,[a._x(t,e),a._y(t,e)])});t=t.values[i.indexOf(Gt(i))]}a._on[o[r]].bind(a)(t,e)})};for(var i=0;i *, g.d3plus-").concat(this._name,"-active > *")).each(function(t){if(t&&t.parentNode)t.parentNode.appendChild(this);else this.parentNode.removeChild(this)});this._group=Tw("g.d3plus-".concat(this._name,"-group"),{parent:this._select});var a=this._update=Tw("g.d3plus-".concat(this._name,"-shape"),{parent:this._group,update:{opacity:this._active?this._activeOpacity:1}}).selectAll(".d3plus-".concat(this._name)).data(i,r);a.order();if(this._duration){a.transition(this._transition).call(this._applyTransform.bind(this))}else{a.call(this._applyTransform.bind(this))}var o=this._enter=a.enter().append(this._tagName).attr("class",function(t,e){return"d3plus-Shape d3plus-".concat(n._name," d3plus-id-").concat(JC(n._nestWrapper(n._id)(t,e)))}).call(this._applyTransform.bind(this)).attr("aria-label",this._ariaLabel).attr("role",this._role).attr("opacity",this._nestWrapper(this._opacity));var s=o.merge(a);var l=s.attr("shape-rendering",this._nestWrapper(this._shapeRendering));if(this._duration){l=l.attr("pointer-events","none").transition(this._transition).transition().delay(100).attr("pointer-events",this._pointerEvents)}l.attr("opacity",this._nestWrapper(this._opacity));var u=this._exit=a.exit();if(this._duration)u.transition().delay(this._duration).remove();else u.remove();this._renderImage();this._renderLabels();this._hoverGroup=Tw("g.d3plus-".concat(this._name,"-hover"),{parent:this._group});this._activeGroup=Tw("g.d3plus-".concat(this._name,"-active"),{parent:this._group});var c=this._group.selectAll(".d3plus-HitArea").data(this._hitArea?i:[],r);c.order().call(this._applyTransform.bind(this));var h=this._name==="Line";h&&this._path.curve(DC["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var f=c.enter().append(h?"path":"rect").attr("class",function(t,e){return"d3plus-HitArea d3plus-id-".concat(JC(n._nestWrapper(n._id)(t,e)))}).attr("fill","black").attr("stroke","black").attr("pointer-events","painted").attr("opacity",0).call(this._applyTransform.bind(this));var d=this;var g=c.merge(f).each(function(t){var e=d._data.indexOf(t);var n=d._hitArea(t,e,d._aes(t,e));return n&&!(d._name==="Line"&&parseFloat(d._strokeWidth(t,e))>10)?ys(this).call(ku,n):ys(this).remove()});c.exit().remove();this._applyEvents(this._hitArea?g:s);setTimeout(function(){if(n._active)n._renderActive();else if(n._hover)n._renderHover();if(e)e()},this._duration+100);return this}},{key:"active",value:function t(e){if(!arguments.length||e===undefined)return this._active;this._active=e;if(this._group){this._renderActive()}return this}},{key:"activeOpacity",value:function t(e){return arguments.length?(this._activeOpacity=e,this):this._activeOpacity}},{key:"activeStyle",value:function t(e){return arguments.length?(this._activeStyle=xu({},this._activeStyle,e),this):this._activeStyle}},{key:"ariaLabel",value:function t(e){return e!==undefined?(this._ariaLabel=typeof e==="function"?e:Rw(e),this):this._ariaLabel}},{key:"backgroundImage",value:function t(e){return arguments.length?(this._backgroundImage=typeof e==="function"?e:Rw(e),this):this._backgroundImage}},{key:"data",value:function t(e){return arguments.length?(this._data=e,this):this._data}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"fill",value:function t(e){return arguments.length?(this._fill=typeof e==="function"?e:Rw(e),this):this._fill}},{key:"fillOpacity",value:function t(e){return arguments.length?(this._fillOpacity=typeof e==="function"?e:Rw(e),this):this._fillOpacity}},{key:"hover",value:function t(e){if(!arguments.length||e===void 0)return this._hover;this._hover=e;if(this._group){this._renderHover()}return this}},{key:"hoverStyle",value:function t(e){return arguments.length?(this._hoverStyle=xu({},this._hoverStyle,e),this):this._hoverStyle}},{key:"hoverOpacity",value:function t(e){return arguments.length?(this._hoverOpacity=e,this):this._hoverOpacity}},{key:"hitArea",value:function t(e){return arguments.length?(this._hitArea=typeof e==="function"?e:Rw(e),this):this._hitArea}},{key:"id",value:function t(e){return arguments.length?(this._id=e,this):this._id}},{key:"label",value:function t(e){return arguments.length?(this._label=typeof e==="function"?e:Rw(e),this):this._label}},{key:"labelBounds",value:function t(e){return arguments.length?(this._labelBounds=typeof e==="function"?e:Rw(e),this):this._labelBounds}},{key:"labelConfig",value:function t(e){return arguments.length?(this._labelConfig=xu(this._labelConfig,e),this):this._labelConfig}},{key:"opacity",value:function t(e){return arguments.length?(this._opacity=typeof e==="function"?e:Rw(e),this):this._opacity}},{key:"pointerEvents",value:function t(e){return arguments.length?(this._pointerEvents=typeof e==="function"?e:Rw(e),this):this._pointerEvents}},{key:"role",value:function t(e){return e!==undefined?(this._role=typeof e==="function"?e:Rw(e),this):this._role}},{key:"rotate",value:function t(e){return arguments.length?(this._rotate=typeof e==="function"?e:Rw(e),this):this._rotate}},{key:"rx",value:function t(e){return arguments.length?(this._rx=typeof e==="function"?e:Rw(e),this):this._rx}},{key:"ry",value:function t(e){return arguments.length?(this._ry=typeof e==="function"?e:Rw(e),this):this._ry}},{key:"scale",value:function t(e){return arguments.length?(this._scale=typeof e==="function"?e:Rw(e),this):this._scale}},{key:"select",value:function t(e){return arguments.length?(this._select=ys(e),this):this._select}},{key:"shapeRendering",value:function t(e){return arguments.length?(this._shapeRendering=typeof e==="function"?e:Rw(e),this):this._shapeRendering}},{key:"sort",value:function t(e){return arguments.length?(this._sort=e,this):this._sort}},{key:"stroke",value:function t(e){return arguments.length?(this._stroke=typeof e==="function"?e:Rw(e),this):this._stroke}},{key:"strokeDasharray",value:function t(e){return arguments.length?(this._strokeDasharray=typeof e==="function"?e:Rw(e),this):this._strokeDasharray}},{key:"strokeLinecap",value:function t(e){return arguments.length?(this._strokeLinecap=typeof e==="function"?e:Rw(e),this):this._strokeLinecap}},{key:"strokeOpacity",value:function t(e){return arguments.length?(this._strokeOpacity=typeof e==="function"?e:Rw(e),this):this._strokeOpacity}},{key:"strokeWidth",value:function t(e){return arguments.length?(this._strokeWidth=typeof e==="function"?e:Rw(e),this):this._strokeWidth}},{key:"textAnchor",value:function t(e){return arguments.length?(this._textAnchor=typeof e==="function"?e:Rw(e),this):this._textAnchor}},{key:"vectorEffect",value:function t(e){return arguments.length?(this._vectorEffect=typeof e==="function"?e:Rw(e),this):this._vectorEffect}},{key:"verticalAlign",value:function t(e){return arguments.length?(this._verticalAlign=typeof e==="function"?e:Rw(e),this):this._verticalAlign}},{key:"x",value:function t(e){return arguments.length?(this._x=typeof e==="function"?e:Rw(e),this):this._x}},{key:"y",value:function t(e){return arguments.length?(this._y=typeof e==="function"?e:Rw(e),this):this._y}}]);return e}(Cw);function HE(t,e){var r=[];var a=[];function o(t,e){if(t.length===1){r.push(t[0]);a.push(t[0])}else{var n=Array(t.length-1);for(var i=0;i=3){e.x1=t[1][0];e.y1=t[1][1]}e.x=t[t.length-1][0];e.y=t[t.length-1][1];if(t.length===4){e.type="C"}else if(t.length===3){e.type="Q"}else{e.type="L"}return e}function GE(t,e){e=e||2;var n=[];var i=t;var r=1/e;for(var a=0;a0){i-=1}else if(i0){i-=1}}}t[i]=(t[i]||0)+1;return t},[]);var r=i.reduce(function(t,e,n){if(n===a.length-1){var i=KE(e,Object.assign({},a[a.length-1]));if(i[0].type==="M"){i.forEach(function(t){t.type="L"})}return t.concat(i)}return t.concat($E(a[n],a[n+1],e))},[]);r.unshift(a[0]);return r}function JE(t){var e=(t||"").match(qE)||[];var n=[];var i;var r;for(var a=0;ab.length){b=ZE(b,w,e)}else if(w.length0){for(var n=0;n1&&nA(t[n[i-2]],t[n[i-1]],t[r])<=0){--i}n[i++]=r}return n.slice(0,i)}function aA(t){if((n=t.length)<3)return null;var e,n,i=new Array(n),r=new Array(n);for(e=0;e=0;--e){u.push(t[i[a[e]][2]])}for(e=+s;ea!==s>a&&r<(o-l)*(a-u)/(s-u)+l)c=!c;o=l,s=u}return c}function sA(t,e,n,i){var r=1e-9;var a=t[0]-e[0],o=n[0]-i[0],s=t[1]-e[1],l=n[1]-i[1];var u=a*l-s*o;if(Math.abs(u)Math.max(t[0],e[0])+i||oMath.max(t[1],e[1])+i)}function dA(t,e,n,i){var r=sA(t,e,n,i);if(!r)return false;return fA(t,e,r)&&fA(n,i,r)}function gA(t,e){var n=-1;var i=t.length;var r=e.length;var a=t[i-1];while(++n2&&arguments[2]!==undefined?arguments[2]:0;var i=1e-9;e=[e[0]+i*Math.cos(n),e[1]+i*Math.sin(n)];var r=e,a=pA(r,2),o=a[0],s=a[1];var l=[o+Math.cos(n),s+Math.sin(n)];var u=0;if(Math.abs(l[0]-o)e[u]){if(_2&&arguments[2]!==undefined?arguments[2]:[0,0];var i=Math.cos(e),r=Math.sin(e),a=t[0]-n[0],o=t[1]-n[1];return[i*a-r*o+n[0],r*a+i*o+n[1]]}var wA=function(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[0,0];return t.map(function(t){return bA(t,e,n)})};function xA(t,e,n){var i=e[0],r=e[1];var a=n[0]-i,o=n[1]-r;if(a!==0||o!==0){var s=((t[0]-i)*a+(t[1]-r)*o)/(a*a+o*o);if(s>1){i=n[0];r=n[1]}else if(s>0){i+=a*s;r+=o*s}}a=t[0]-i;o=t[1]-r;return a*a+o*o}function kA(t,e){var n,i=t[0];var r=[i];for(var a=1,o=t.length;ae){r.push(n);i=n}}if(i!==n)r.push(n);return r}function SA(t,e,n,i,r){var a,o=i;for(var s=e+1;so){a=s;o=l}}if(o>i){if(a-e>1)SA(t,e,a,i,r);r.push(t[a]);if(n-a>1)SA(t,a,n,i,r)}}function CA(t,e){var n=t.length-1;var i=[t[0]];SA(t,0,n,e,i);i.push(t[n]);return i}var EA=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(t.length<=2)return t;var i=e*e;t=n?t:kA(t,i);t=CA(t,i);return t};function AA(t,e){return TA(t)||RA(t,e)||MA()}function MA(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function RA(t,e){if(!(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")){return}var n=[];var i=true;var r=false;var a=undefined;try{for(var o=t[Symbol.iterator](),s;!(i=(s=o.next()).done);i=true){n.push(s.value);if(e&&n.length===e)break}}catch(t){r=true;a=t}finally{try{if(!i&&o["return"]!=null)o["return"]()}finally{if(r)throw a}}return n}function TA(t){if(Array.isArray(t))return t}var OA=.5;var BA=5;var PA={};function NA(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if(t.length<3){if(e.verbose)console.error("polygon has to have at least 3 points",t);return null}var n=[];e=Object.assign({angle:It(-90,90+BA,BA),cache:true,maxAspectRatio:15,minAspectRatio:1,minHeight:0,minWidth:0,nTries:20,tolerance:.02,verbose:false},e);var i=e.angle instanceof Array?e.angle:typeof e.angle==="number"?[e.angle]:typeof e.angle==="string"&&!isNaN(e.angle)?[Number(e.angle)]:[];var r=e.aspectRatio instanceof Array?e.aspectRatio:typeof e.aspectRatio==="number"?[e.aspectRatio]:typeof e.aspectRatio==="string"&&!isNaN(e.aspectRatio)?[Number(e.aspectRatio)]:[];var a=e.origin&&e.origin instanceof Array?e.origin[0]instanceof Array?e.origin:[e.origin]:[];var o;if(e.cache){o=Vt(t).join(",");o+="-".concat(e.minAspectRatio);o+="-".concat(e.maxAspectRatio);o+="-".concat(e.minHeight);o+="-".concat(e.minWidth);o+="-".concat(i.join(","));o+="-".concat(a.join(","));if(PA[o])return PA[o]}var s=Math.abs(tA(t));if(s===0){if(e.verbose)console.error("polygon has 0 area",t);return null}var l=Ft(t,function(t){return t[0]}),u=AA(l,2),c=u[0],h=u[1];var f=Ft(t,function(t){return t[1]}),d=AA(f,2),g=d[0],p=d[1];var v=Math.min(h-c,p-g)*e.tolerance;if(v>0)t=EA(t,v);if(e.events)n.push({type:"simplify",poly:t});var m=Ft(t,function(t){return t[0]});var y=AA(m,2);c=y[0];h=y[1];var _=Ft(t,function(t){return t[1]});var b=AA(_,2);g=b[0];p=b[1];var w=h-c,x=p-g;var k=Math.min(w,x)/50;if(!a.length){var S=eA(t);if(!isFinite(S[0])){if(e.verbose)console.error("cannot find centroid",t);return null}if(oA(t,S))a.push(S);var C=e.nTries;while(C){var E=Math.random()*w+c;var A=Math.random()*x+g;var M=[E,A];if(oA(t,M)){a.push(M)}C--}}if(e.events)n.push({type:"origins",points:a});var R=0;var T=null;for(var O=0;O=k)n.push({type:"aRatio",aRatio:ut});while(ht-ct>=k){var ft=(ct+ht)/2;var dt=ft/ut;var gt=AA(W,2),pt=gt[0],vt=gt[1];var mt=[[pt-ft/2,vt-dt/2],[pt+ft/2,vt-dt/2],[pt+ft/2,vt+dt/2],[pt-ft/2,vt+dt/2]];mt=wA(mt,P,W);var yt=gA(mt,t);if(yt){R=ft*dt;mt.push(mt[0]);T={area:R,cx:pt,cy:vt,width:ft,height:dt,angle:-B,points:mt};ct=ft}else{ht=ft}if(e.events)n.push({type:"rectangle",areaFraction:ft*dt/s,cx:pt,cy:vt,width:ft,height:dt,angle:B,insidePoly:yt})}}}}}if(e.cache){PA[o]=T}return e.events?Object.assign(T||{},{events:n}):T}function DA(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){DA=function t(e){return j(e)}}else{DA=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return DA(t)}function zA(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function jA(t,e){for(var n=0;na[0][1])o=o.reverse();o.push(o[0]);return{points:o}}},{key:"_dataFilter",value:function t(i){var r=this;var e=Fe().key(this._id).entries(i).map(function(t){t.data=Bw(t.values);t.i=i.indexOf(t.values[0]);var e=Ft(t.values.map(r._x).concat(t.values.map(r._x0)).concat(r._x1?t.values.map(r._x1):[]));t.xR=e;t.width=e[1]-e[0];t.x=e[0]+t.width/2;var n=Ft(t.values.map(r._y).concat(t.values.map(r._y0)).concat(r._y1?t.values.map(r._y1):[]));t.yR=n;t.height=n[1]-n[0];t.y=n[0]+t.height/2;t.nested=true;t.translate=[t.x,t.y];t.__d3plusShape__=true;return t});e.key=function(t){return t.key};return e}},{key:"render",value:function t(e){var n=this;HA(GA(a.prototype),"render",this).call(this,e);var i=this._path=qk().defined(this._defined).curve(DC["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).x0(this._x0).x1(this._x1).y(this._y).y0(this._y0).y1(this._y1);var r=qk().defined(function(t){return t}).curve(DC["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).y(this._y).x0(function(t,e){return n._x1?n._x0(t,e)+(n._x1(t,e)-n._x0(t,e))/2:n._x0(t,e)}).x1(function(t,e){return n._x1?n._x0(t,e)+(n._x1(t,e)-n._x0(t,e))/2:n._x0(t,e)}).y0(function(t,e){return n._y1?n._y0(t,e)+(n._y1(t,e)-n._y0(t,e))/2:n._y0(t,e)}).y1(function(t,e){return n._y1?n._y0(t,e)+(n._y1(t,e)-n._y0(t,e))/2:n._y0(t,e)});this._enter.append("path").attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).attr("d",function(t){return r(t.values)}).call(this._applyStyle.bind(this)).transition(this._transition).attrTween("d",function(t){return QE(ys(this).attr("d"),i(t.values))});this._update.select("path").transition(this._transition).attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).attrTween("d",function(t){return QE(ys(this).attr("d"),i(t.values))}).call(this._applyStyle.bind(this));this._exit.select("path").transition(this._transition).attrTween("d",function(t){return QE(ys(this).attr("d"),r(t.values))});return this}},{key:"curve",value:function t(e){return arguments.length?(this._curve=e,this):this._curve}},{key:"defined",value:function t(e){return arguments.length?(this._defined=e,this):this._defined}},{key:"x",value:function t(e){if(!arguments.length)return this._x;this._x=typeof e==="function"?e:Rw(e);this._x0=this._x;return this}},{key:"x0",value:function t(e){if(!arguments.length)return this._x0;this._x0=typeof e==="function"?e:Rw(e);this._x=this._x0;return this}},{key:"x1",value:function t(e){return arguments.length?(this._x1=typeof e==="function"||e===null?e:Rw(e),this):this._x1}},{key:"y",value:function t(e){if(!arguments.length)return this._y;this._y=typeof e==="function"?e:Rw(e);this._y0=this._y;return this}},{key:"y0",value:function t(e){if(!arguments.length)return this._y0;this._y0=typeof e==="function"?e:Rw(e);this._y=this._y0;return this}},{key:"y1",value:function t(e){return arguments.length?(this._y1=typeof e==="function"||e===null?e:Rw(e),this):this._y1}}]);return a}(IE);function KA(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){KA=function t(e){return j(e)}}else{KA=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return KA(t)}function YA(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function XA(t,e){for(var n=0;n=t.initialLength)break}}if(n.length>1&&n.length%2)n.pop();n[n.length-1]+=t.initialLength-Ut(n);if(n.length%2===0)n.push(0);t.initialStrokeArray=n.join(" ")}this._path.curve(DC["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var r=this._enter.append("path").attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).attr("d",function(t){return n._path(t.values)}).call(this._applyStyle.bind(this));var a=this._update.select("path").attr("stroke-dasharray",function(t){return o._strokeDasharray(t.values[0],o._data.indexOf(t.values[0]))});if(this._duration){r.each(i).attr("stroke-dasharray",function(t){return"".concat(t.initialStrokeArray," ").concat(t.initialLength)}).attr("stroke-dashoffset",function(t){return t.initialLength}).transition(this._transition).attr("stroke-dashoffset",0);a=a.transition(this._transition).attrTween("d",function(t){return QE(ys(this).attr("d"),o._path(t.values))});this._exit.selectAll("path").each(i).attr("stroke-dasharray",function(t){return"".concat(t.initialStrokeArray," ").concat(t.initialLength)}).transition(this._transition).attr("stroke-dashoffset",function(t){return-t.initialLength})}else{a=a.attr("d",function(t){return o._path(t.values)})}a.attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).call(this._applyStyle.bind(this));return this}},{key:"_aes",value:function t(e,n){var i=this;return{points:e.values.map(function(t){return[i._x(t,n),i._y(t,n)]})}}},{key:"curve",value:function t(e){return arguments.length?(this._curve=e,this):this._curve}},{key:"defined",value:function t(e){return arguments.length?(this._defined=e,this):this._defined}}]);return s}(IE);function HM(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){HM=function t(e){return j(e)}}else{HM=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return HM(t)}function VM(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function GM(t,e){for(var n=0;nHt(t))r.upperLimit=Ht(t)}else if(e[1]==="extent")r.upperLimit=Ht(t);else if(typeof e[1]==="number")r.upperLimit=E(t,e[1]);var n=r.third-r.first;if(r.orient==="vertical"){r.height=n;r.width=a._rectWidth(r.data,r.i);r.x=a._x(r.data,r.i);r.y=r.first+n/2}else if(r.orient==="horizontal"){r.height=a._rectWidth(r.data,r.i);r.width=n;r.x=r.first+n/2;r.y=a._y(r.data,r.i)}r.values.forEach(function(t,e){var n=r.orient==="vertical"?a._y(t,e):a._x(t,e);if(nr.upperLimit){var i={};i.__d3plus__=true;i.data=t;i.i=e;i.outlier=a._outlier(t,e);if(r.orient==="vertical"){i.x=r.x;i.y=n;o.push(i)}else if(r.orient==="horizontal"){i.y=r.y;i.x=n;o.push(i)}}});r.__d3plus__=true;return r});this._box=(new MM).data(e).x(function(t){return t.x}).y(function(t){return t.y}).select(Tw("g.d3plus-Box",{parent:this._select}).node()).config(Mw.bind(this)(this._rectConfig,"shape")).render();this._median=(new MM).data(e).x(function(t){return t.orient==="vertical"?t.x:t.median}).y(function(t){return t.orient==="vertical"?t.median:t.y}).height(function(t){return t.orient==="vertical"?1:t.height}).width(function(t){return t.orient==="vertical"?t.width:1}).select(Tw("g.d3plus-Box-Median",{parent:this._select}).node()).config(Mw.bind(this)(this._medianConfig,"shape")).render();var c=[];e.forEach(function(t,e){var n=t.x;var i=t.y;var r=t.first-t.lowerLimit;var a=t.upperLimit-t.third;if(t.orient==="vertical"){var o=i-t.height/2;var s=i+t.height/2;c.push({__d3plus__:true,data:t,i:e,x:n,y:o,length:r,orient:"top"},{__d3plus__:true,data:t,i:e,x:n,y:s,length:a,orient:"bottom"})}else if(t.orient==="horizontal"){var l=n+t.width/2;var u=n-t.width/2;c.push({__d3plus__:true,data:t,i:e,x:l,y:i,length:a,orient:"right"},{__d3plus__:true,data:t,i:e,x:u,y:i,length:r,orient:"left"})}});this._whisker=(new ZM).data(c).select(Tw("g.d3plus-Box-Whisker",{parent:this._select}).node()).config(Mw.bind(this)(this._whiskerConfig,"shape")).render();this._whiskerEndpoint=[];Fe().key(function(t){return t.outlier}).entries(o).forEach(function(t){var e=t.key;a._whiskerEndpoint.push((new sR[e]).data(t.values).select(Tw("g.d3plus-Box-Outlier-".concat(e),{parent:a._select}).node()).config(Mw.bind(a)(a._outlierConfig,"shape",e)).render())});return this}},{key:"active",value:function t(e){if(this._box)this._box.active(e);if(this._median)this._median.active(e);if(this._whisker)this._whisker.active(e);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(t){return t.active(e)})}},{key:"data",value:function t(e){return arguments.length?(this._data=e,this):this._data}},{key:"hover",value:function t(e){if(this._box)this._box.hover(e);if(this._median)this._median.hover(e);if(this._whisker)this._whisker.hover(e);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(t){return t.hover(e)})}},{key:"medianConfig",value:function t(e){return arguments.length?(this._medianConfig=xu(this._medianConfig,e),this):this._medianConfig}},{key:"orient",value:function t(e){return arguments.length?(this._orient=typeof e==="function"?e:Rw(e),this):this._orient}},{key:"outlier",value:function t(e){return arguments.length?(this._outlier=typeof e==="function"?e:Rw(e),this):this._outlier}},{key:"outlierConfig",value:function t(e){return arguments.length?(this._outlierConfig=xu(this._outlierConfig,e),this):this._outlierConfig}},{key:"rectConfig",value:function t(e){return arguments.length?(this._rectConfig=xu(this._rectConfig,e),this):this._rectConfig}},{key:"rectWidth",value:function t(e){return arguments.length?(this._rectWidth=typeof e==="function"?e:Rw(e),this):this._rectWidth}},{key:"select",value:function t(e){return arguments.length?(this._select=ys(e),this):this._select}},{key:"whiskerConfig",value:function t(e){return arguments.length?(this._whiskerConfig=xu(this._whiskerConfig,e),this):this._whiskerConfig}},{key:"whiskerMode",value:function t(e){return arguments.length?(this._whiskerMode=e instanceof Array?e:[e,e],this):this._whiskerMode}},{key:"x",value:function t(e){return arguments.length?(this._x=typeof e==="function"?e:yu(e),this):this._x}},{key:"y",value:function t(e){return arguments.length?(this._y=typeof e==="function"?e:yu(e),this):this._y}}]);return e}(Cw);var uR=Math.PI;var cR=function(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"circle";if(t<0)t=uR*2+t;if(n==="square"){var i=45*(uR/180);var r=0,a=0;if(t1&&arguments[1]!==undefined?arguments[1]:20;var n=[],i=/([MLA])([^MLAZ]+)/gi;var r=i.exec(t);while(r!==null){if(["M","L"].includes(r[1]))n.push(r[2].split(",").map(Number));else if(r[1]==="A"){var a=r[2].split(",").map(Number);var o=a.slice(a.length-2,a.length),s=n[n.length-1],l=a[0],u=TE(s,o);var c=Math.acos((l*l+l*l-u*u)/(2*l*l));if(a[2])c=hR*2-c;var h=c/(c/(hR*2)*(l*hR*2)/e);var f=Math.atan2(-s[1],-s[0])-hR;var d=h;while(d5&&t%1===0)return new Date(t);var e="".concat(t);var n=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(e),i=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(e);if(n){var r=n[1];if(r.indexOf("-")===0)e=e.replace(r,r.substr(1));var a=new Date(e);a.setFullYear(r);return a}else if(i){var o=i[1];if(o.indexOf("-")===0)e=e.replace(o,o.substr(1));var s=new Date(e);s.setFullYear(o);return s}else if(!e.includes("/")&&!e.includes(" ")&&(!e.includes("-")||!e.indexOf("-"))){var l=new Date("".concat(e,"/01/01"));l.setFullYear(t);return l}else return new Date(e)}var AR={"de-DE":{dateTime:"%A, der %e. %B %Y, %X",date:"%d.%m.%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"en-GB":{dateTime:"%a %e %b %X %Y",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-US":{dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es-ES":{dateTime:"%A, %e de %B de %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-MX":{dateTime:"%x, %X",date:"%d/%m/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"fr-FR":{dateTime:"%A, le %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],shortDays:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],shortMonths:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"it-IT":{dateTime:"%A %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"]},"pt-BR":{dateTime:"%A, %e de %B de %Y. %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"]}};function MR(t,e,n){if(e in t){Object.defineProperty(t,e,{value:n,enumerable:true,configurable:true,writable:true})}else{t[e]=n}return t}function RR(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){RR=function t(e){return j(e)}}else{RR=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return RR(t)}function TR(t){return PR(t)||BR(t)||OR()}function OR(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function BR(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function PR(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);ee[1]?n.reverse():n}},{key:"_getPosition",value:function t(e){return e<0&&this._d3ScaleNegative?this._d3ScaleNegative(e):this._d3Scale(e)}},{key:"_getRange",value:function t(){var e=[];if(this._d3ScaleNegative)e=this._d3ScaleNegative.range();if(this._d3Scale)e=e.concat(this._d3Scale.range());return e[0]>e[1]?Ft(e).reverse():Ft(e)}},{key:"_getTicks",value:function t(){var e=$r().domain([10,400]).range([10,50]);var n=[];if(this._d3ScaleNegative){var i=this._d3ScaleNegative.range();var r=i[1]-i[0];n=this._d3ScaleNegative.ticks(Math.floor(r/e(r)))}if(this._d3Scale){var a=this._d3Scale.range();var o=a[1]-a[0];n=n.concat(this._d3Scale.ticks(Math.floor(o/e(o))))}return n}},{key:"_gridPosition",value:function t(e){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var i=this._position,r=i.height,a=i.x,o=i.y,s=i.opposite,l=this._margin[s],u=["top","left"].includes(this._orient)?this._outerBounds[o]+this._outerBounds[r]-l:this._outerBounds[o]+l,c=n?this._lastScale||this._getPosition.bind(this):this._getPosition.bind(this),h=["top","left"].includes(this._orient)?l:-l,f=this._scale==="band"?this._d3Scale.bandwidth()/2:0,d=function t(e){return c(e.id)+f};e.call(ku,this._gridConfig).attr("".concat(a,"1"),d).attr("".concat(a,"2"),d).attr("".concat(o,"1"),u).attr("".concat(o,"2"),n?u:u+h)}},{key:"render",value:function t(e){var d=this,n;if(this._select===void 0){this.select(ys("body").append("svg").attr("width","".concat(this._width,"px")).attr("height","".concat(this._height,"px")).node())}var i=this._timeLocale||AR[this._locale]||AR["en-US"];Me(i).format();var h=Se("%a %d"),f=Se("%I %p"),g=Se(".%L"),p=Se("%I:%M"),v=Se("%b"),m=Se(":%S"),y=Se("%b %d"),_=Se("%Y");var r=this._position,a=r.width,b=r.height,w=r.x,x=r.y,k=r.horizontal,S=r.opposite,o="d3plus-Axis-clip-".concat(this._uuid),C=["top","left"].includes(this._orient),E=this._padding,s=this._select,A=[E,this["_".concat(a)]-E],l=hu().duration(this._duration);var u=this._shape==="Circle"?this._shapeConfig.r:this._shape==="Rect"?this._shapeConfig[a]:this._shapeConfig.strokeWidth;var M=typeof u!=="function"?function(){return u}:u;var R=this._margin={top:0,right:0,bottom:0,left:0};var T,O,B;function c(){var r=this;var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this._range;O=t?t.slice():[undefined,undefined];var e=A[0],n=A[1];if(this._range){if(this._range[0]!==undefined)e=this._range[0];if(this._range[this._range.length-1]!==undefined)n=this._range[this._range.length-1]}if(O[0]===undefined||O[0]n)O[1]=n;var i=n-e;if(this._scale==="ordinal"&&this._domain.length>O.length){if(t===this._range){var a=this._domain.length+1;O=It(a).map(function(t){return O[0]+i*(t/(a-1))}).slice(1,a);O=O.map(function(t){return t-O[0]/2})}else{var o=this._domain.length;var s=O[1]-O[0];O=It(o).map(function(t){return O[0]+s*(t/(o-1))})}}else if(t===this._range){var l=$r().domain([10,400]).range([10,50]);var u=this._scale==="time"?this._domain.map(ER):this._domain;var c=pt(u[0],u[1],Math.floor(i/l(i)));B=(this._ticks?this._scale==="time"?this._ticks.map(ER):this._ticks:c).slice();T=(this._labels?this._scale==="time"?this._labels.map(ER):this._labels:c).slice();var h=T.length;if(h){var f=Math.ceil(i/h/2);O=[O[0]+f,O[1]-f]}}this._d3Scale=Ea["scale".concat(this._scale.charAt(0).toUpperCase()).concat(this._scale.slice(1))]().domain(this._scale==="time"?this._domain.map(ER):this._domain);if(this._d3Scale.round)this._d3Scale.round(true);if(this._d3Scale.padding)this._d3Scale.padding(this._scalePadding);if(this._d3Scale.paddingInner)this._d3Scale.paddingInner(this._paddingInner);if(this._d3Scale.paddingOuter)this._d3Scale.paddingOuter(this._paddingOuter);if(this._d3Scale.rangeRound)this._d3Scale.rangeRound(O);else this._d3Scale.range(O);this._d3ScaleNegative=null;if(this._scale==="log"){var d=this._d3Scale.domain();if(d[0]===0)d[0]=1;if(d[d.length-1]===0)d[d.length-1]=-1;var g=this._d3Scale.range();if(d[0]<0&&d[d.length-1]<0){this._d3ScaleNegative=this._d3Scale.copy().domain(d).range(g);this._d3Scale=null}else if(d[0]>0&&d[d.length-1]>0){this._d3Scale.domain(d).range(g)}else{var p=Ir().domain([1,d[d[1]>0?1:0]]).range([0,1]);var v=p(Math.abs(d[d[1]<0?1:0]));var m=v/(v+1)*(g[1]-g[0]);if(d[0]>0)m=g[1]-g[0]-m;this._d3ScaleNegative=this._d3Scale.copy();(d[0]<0?this._d3Scale:this._d3ScaleNegative).domain([Math.sign(d[1]),d[1]]).range([g[0]+m,g[1]]);(d[0]<0?this._d3ScaleNegative:this._d3Scale).domain([d[0],Math.sign(d[0])]).range([g[0],g[0]+m])}}B=(this._ticks?this._scale==="time"?this._ticks.map(ER):this._ticks:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():this._domain).slice();T=(this._labels?this._scale==="time"?this._labels.map(ER):this._labels:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():B).slice();if(this._scale==="log"){T=T.filter(function(t){return Math.abs(t).toString().charAt(0)==="1"&&(r._d3Scale?t!==-1:t!==1)})}else if(this._scale==="time"){B=B.map(Number);T=T.map(Number)}B=B.sort(function(t,e){return r._getPosition(t)-r._getPosition(e)});T=T.sort(function(t,e){return r._getPosition(t)-r._getPosition(e)});if(this._scale==="linear"&&this._tickSuffix==="smallest"){var y=T.filter(function(t){return t>=1e3});if(y.length>0){var _=Math.min.apply(Math,TR(y));var b=1;while(b&&b<7){var w=Math.pow(10,3*b);if(_/w>=1){this._tickUnit=b;b+=1}else{break}}}}var x=[];this._availableTicks=B;B.forEach(function(t,e){var n=M({id:t,tick:true},e);if(r._shape==="Circle")n*=2;var i=r._getPosition(t);if(!x.length||Math.abs(Ew(i,x)-i)>n*2)x.push(i);else x.push(false)});B=B.filter(function(t,e){return x[e]!==false});this._visibleTicks=B}c.bind(this)();function P(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var n=t.i,i=t.position;if(this._scale==="band"){return this._d3Scale.bandwidth()}else{var r=n-e<0?G.length===1||!this._range?A[0]:(i-G[n+e].position)/2-i:i-(i-G[n-e].position)/2;var a=Math.abs(i-r);var o=n+e>G.length-1?G.length===1||!this._range?A[1]:(i-G[n-e].position)/2-i:i-(i-G[n+e].position)/2;var s=Math.abs(i-o);return Gt([a,s])*2}}var N=this._tickFormat?this._tickFormat:function(t){if(d._scale==="log"){var e=Math.round(Math.log(Math.abs(t))/Math.LN10);var n=Math.abs(t).toString().charAt(0);var i="10 ".concat("".concat(e).split("").map(function(t){return"⁰¹²³⁴⁵⁶⁷⁸⁹"[t]}).join(""));if(n!=="1")i="".concat(n," x ").concat(i);return t<0?"-".concat(i):i}else if(d._scale==="time"){return(vt(t)=1e3?s[d._tickUnit+8]:"";var u=r/Math.pow(10,3*d._tickUnit);var c=Hw(u,a,",.".concat(u.toString().length,"r"));return"".concat(c).concat(o).concat(l)}else{return Hw(r,d._locale)}};if(this._title){var D=this._titleConfig,z=D.fontFamily,j=D.fontSize,L=D.lineHeight;var F=gE().fontFamily(typeof z==="function"?z():z).fontSize(typeof j==="function"?j():j).lineHeight(typeof L==="function"?L():L).width(O[O.length-1]-O[0]-E*2).height(this["_".concat(b)]-this._tickSize-E*2);var I=F(this._title).lines.length;R[this._orient]=I*F.lineHeight()+E}var H=this._shape==="Circle"?typeof this._shapeConfig.r==="function"?this._shapeConfig.r({tick:true}):this._shapeConfig.r:this._shape==="Rect"?typeof this._shapeConfig[b]==="function"?this._shapeConfig[b]({tick:true}):this._shapeConfig[b]:this._tickSize,V=M({tick:true});if(typeof H==="function")H=Ht(B.map(H));if(this._shape==="Rect")H/=2;if(typeof V==="function")V=Ht(B.map(V));if(this._shape!=="Circle")V/=2;var G=T.map(function(t,e){var n=d._shapeConfig.labelConfig.fontFamily(t,e),i=d._shapeConfig.labelConfig.fontSize(t,e),r=d._getPosition(t);var a=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(t,e):i*1.4;return{d:t,i:e,fF:n,fS:i,lineHeight:a,position:r}});function U(t){var e=t.d,n=t.i,i=t.fF,r=t.fS,a=t.rotate,o=t.space;var s=a?"width":"height",l=a?"height":"width";var u=gE().fontFamily(i).fontSize(r).lineHeight(this._shapeConfig.lineHeight?this._shapeConfig.lineHeight(e,n):undefined)[l](k?o:Gt([this._maxSize,this._width])-H-E-this._margin.left-this._margin.right)[s](k?Gt([this._maxSize,this._height])-H-E-this._margin.top-this._margin.bottom:o);var c=u(N(e));c.lines=c.lines.filter(function(t){return t!==""});c.width=c.lines.length?Math.ceil(Ht(c.widths))+r/4:0;if(c.width%2)c.width++;c.height=c.lines.length?Math.ceil(c.lines.length*u.lineHeight())+r/4:0;if(c.height%2)c.height++;return c}G=G.map(function(t){t.rotate=d._labelRotation;t.space=P.bind(d)(t);var e=U.bind(d)(t);return Object.assign(e,t)});this._rotateLabels=k&&this._labelRotation===undefined?G.some(function(t){return t.truncated}):this._labelRotation;if(this._rotateLabels){G=G.map(function(t){t.rotate=true;var e=U.bind(d)(t);return Object.assign(t,e)})}var q=[0,0];for(var W=0;W<2;W++){var K=G[W?G.length-1:0];if(!K)break;var Y=K.height,X=K.position,$=K.rotate,Z=K.width;var J=W?A[1]:A[0];var Q=($||!k?Y:Z)/2;var tt=W?X+Q-J:X-Q-J;q[W]=tt}var et=O[0];var nt=O[O.length-1];var it=[et-q[0],nt-q[1]];if(this._range){if(this._range[0]!==undefined)it[0]=this._range[0];if(this._range[this._range.length-1]!==undefined)it[1]=this._range[this._range.length-1]}if(it[0]!==et||it[1]!==nt){c.bind(this)(it);G=T.map(function(t,e){var n=d._shapeConfig.labelConfig.fontFamily(t,e),i=d._shapeConfig.labelConfig.fontSize(t,e),r=d._getPosition(t);var a=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(t,e):i*1.4;return{d:t,i:e,fF:n,fS:i,lineHeight:a,position:r}});G=G.map(function(t){t.rotate=d._rotateLabels;t.space=P.bind(d)(t);var e=U.bind(d)(t);return Object.assign(e,t)})}var rt=Ht(G,function(t){return t.height})||0;this._rotateLabels=k&&this._labelRotation===undefined?G.some(function(t){var e=t.i,n=t.height,i=t.position,r=t.truncated;var a=G[e-1];return r||e&&a.position+a.height/2>i-n/2}):this._labelRotation;if(this._rotateLabels){var at=0;G=G.map(function(t){t.space=P.bind(d)(t,2);var e=U.bind(d)(t);t=Object.assign(t,e);var n=G[t.i-1];if(!n){at=1}else if(n.position+n.height/2>t.position){if(at){t.offset=n.width;at=0}else at=1}return t})}var ot=this._labelOffset?Ht(G,function(t){return t.offset||0}):0;G.forEach(function(t){return t.offset=t.offset?ot:0});var st=this._shape==="Line"?0:H;var lt=this._outerBounds=(n={},MR(n,b,(Ht(G,function(t){return Math.ceil(t[t.rotate||!k?"width":"height"]+t.offset)})||0)+(G.length?E:0)),MR(n,a,A[A.length-1]-A[0]),MR(n,w,A[0]),n);R[this._orient]+=H;R[S]=this._gridSize!==undefined?Ht([this._gridSize,st]):this["_".concat(b)]-R[this._orient]-lt[b]-E;lt[b]+=R[S]+R[this._orient];lt[x]=this._align==="start"?this._padding:this._align==="end"?this["_".concat(b)]-lt[b]-this._padding:this["_".concat(b)]/2-lt[b]/2;var ut=Tw("g#d3plus-Axis-".concat(this._uuid),{parent:s});this._group=ut;var ct=Tw("g.grid",{parent:ut}).selectAll("line").data((this._gridSize!==0?this._grid||this._scale==="log"&&!this._gridLog?T:B:[]).map(function(t){return{id:t}}),function(t){return t.id});ct.exit().transition(l).attr("opacity",0).call(this._gridPosition.bind(this)).remove();ct.enter().append("line").attr("opacity",0).attr("clip-path","url(#".concat(o,")")).call(this._gridPosition.bind(this),true).merge(ct).transition(l).attr("opacity",1).call(this._gridPosition.bind(this));var ht=T.filter(function(t,e){return G[e].lines.length&&!B.includes(t)});var ft=G.some(function(t){return t.rotate});var dt=B.concat(ht).map(function(e){var t;var n=G.find(function(t){return t.d===e});var i=d._getPosition(e);var r=n?n.space:0;var a=n?n.lines.length:1;var o=n?n.lineHeight:1;var s=n&&d._labelOffset?n.offset:0;var l=k?r:lt.width-R[d._position.opposite]-H-R[d._orient]+E;var u=R[S],c=(H+s)*(C?-1:1),h=C?lt[x]+lt[b]-u:lt[x]+u;var f=(t={id:e,labelBounds:ft&&n?{x:-n.width/2+n.fS/4,y:d._orient==="bottom"?c+E+(n.width-o*a)/2:c-E*2-(n.width+o*a)/2,width:n.width,height:n.height}:{x:k?-r/2:d._orient==="left"?-l-E+c:c+E,y:k?d._orient==="bottom"?c+E:c-E-rt:-r/2,width:k?r:l,height:k?rt:r},rotate:n?n.rotate:false,size:T.includes(e)?c:0,text:T.includes(e)?N(e):false,tick:B.includes(e)},MR(t,w,i+(d._scale==="band"?d._d3Scale.bandwidth()/2:0)),MR(t,x,h),t);return f});if(this._shape==="Line"){dt=dt.concat(dt.map(function(t){var e=Object.assign({},t);e[x]+=t.size;return e}))}(new CR[this._shape]).data(dt).duration(this._duration).labelConfig({ellipsis:function t(e){return e&&e.length?"".concat(e,"..."):""},rotate:function t(e){return e.rotate?-90:0}}).select(Tw("g.ticks",{parent:ut}).node()).config(this._shapeConfig).render();var gt=ut.selectAll("line.bar").data([null]);gt.enter().append("line").attr("class","bar").attr("opacity",0).call(this._barPosition.bind(this)).merge(gt).transition(l).attr("opacity",1).call(this._barPosition.bind(this));this._titleClass.data(this._title?[{text:this._title}]:[]).duration(this._duration).height(R[this._orient]).rotate(this._orient==="left"?-90:this._orient==="right"?90:0).select(Tw("g.d3plus-Axis-title",{parent:ut}).node()).text(function(t){return t.text}).verticalAlign("middle").width(O[O.length-1]-O[0]).x(k?O[0]:this._orient==="left"?lt.x+R.left/2-(O[O.length-1]-O[0])/2:lt.x+lt.width-R.right/2-(O[O.length-1]-O[0])/2).y(k?this._orient==="bottom"?lt.y+lt.height-R.bottom:lt.y:O[0]+(O[O.length-1]-O[0])/2-R[this._orient]/2).config(this._titleConfig).render();this._lastScale=this._getPosition.bind(this);if(e)setTimeout(e,this._duration+100);return this}},{key:"align",value:function t(e){return arguments.length?(this._align=e,this):this._align}},{key:"barConfig",value:function t(e){return arguments.length?(this._barConfig=Object.assign(this._barConfig,e),this):this._barConfig}},{key:"domain",value:function t(e){return arguments.length?(this._domain=e,this):this._domain}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"grid",value:function t(e){return arguments.length?(this._grid=e,this):this._grid}},{key:"gridConfig",value:function t(e){return arguments.length?(this._gridConfig=Object.assign(this._gridConfig,e),this):this._gridConfig}},{key:"gridLog",value:function t(e){return arguments.length?(this._gridLog=e,this):this._gridLog}},{key:"gridSize",value:function t(e){return arguments.length?(this._gridSize=e,this):this._gridSize}},{key:"height",value:function t(e){return arguments.length?(this._height=e,this):this._height}},{key:"labels",value:function t(e){return arguments.length?(this._labels=e,this):this._labels}},{key:"labelOffset",value:function t(e){return arguments.length?(this._labelOffset=e,this):this._labelOffset}},{key:"labelRotation",value:function t(e){return arguments.length?(this._labelRotation=e,this):this._labelRotation}},{key:"maxSize",value:function t(e){return arguments.length?(this._maxSize=e,this):this._maxSize}},{key:"orient",value:function t(e){if(arguments.length){var n=["top","bottom"].includes(e),i={top:"bottom",right:"left",bottom:"top",left:"right"};this._position={horizontal:n,width:n?"width":"height",height:n?"height":"width",x:n?"x":"y",y:n?"y":"x",opposite:i[e]};return this._orient=e,this}return this._orient}},{key:"outerBounds",value:function t(){return this._outerBounds}},{key:"padding",value:function t(e){return arguments.length?(this._padding=e,this):this._padding}},{key:"paddingInner",value:function t(e){return arguments.length?(this._paddingInner=e,this):this._paddingInner}},{key:"paddingOuter",value:function t(e){return arguments.length?(this._paddingOuter=e,this):this._paddingOuter}},{key:"range",value:function t(e){return arguments.length?(this._range=e,this):this._range}},{key:"scale",value:function t(e){return arguments.length?(this._scale=e,this):this._scale}},{key:"scalePadding",value:function t(e){return arguments.length?(this._scalePadding=e,this):this._scalePadding}},{key:"select",value:function t(e){return arguments.length?(this._select=ys(e),this):this._select}},{key:"shape",value:function t(e){return arguments.length?(this._shape=e,this):this._shape}},{key:"shapeConfig",value:function t(e){return arguments.length?(this._shapeConfig=xu(this._shapeConfig,e),this):this._shapeConfig}},{key:"tickFormat",value:function t(e){return arguments.length?(this._tickFormat=e,this):this._tickFormat}},{key:"ticks",value:function t(e){return arguments.length?(this._ticks=e,this):this._ticks}},{key:"tickSize",value:function t(e){return arguments.length?(this._tickSize=e,this):this._tickSize}},{key:"tickSpecifier",value:function t(e){return arguments.length?(this._tickSpecifier=e,this):this._tickSpecifier}},{key:"tickSuffix",value:function t(e){return arguments.length?(this._tickSuffix=e,this):this._tickSuffix}},{key:"timeLocale",value:function t(e){return arguments.length?(this._timeLocale=e,this):this._timeLocale}},{key:"title",value:function t(e){return arguments.length?(this._title=e,this):this._title}},{key:"titleConfig",value:function t(e){return arguments.length?(this._titleConfig=Object.assign(this._titleConfig,e),this):this._titleConfig}},{key:"width",value:function t(e){return arguments.length?(this._width=e,this):this._width}}]);return e}(Cw);function GR(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){GR=function t(e){return j(e)}}else{GR=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return GR(t)}function UR(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function qR(t,e){if(e&&(GR(e)==="object"||typeof e==="function")){return e}return WR(t)}function WR(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function KR(t){KR=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return KR(t)}function YR(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)XR(t,e)}function XR(t,e){XR=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return XR(t,e)}var $R=function(t){YR(e,t);function e(){var t;UR(this,e);t=qR(this,KR(e).call(this));t.orient("bottom");return t}return e}(VR);function ZR(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){ZR=function t(e){return j(e)}}else{ZR=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return ZR(t)}function JR(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function QR(t,e){if(e&&(ZR(e)==="object"||typeof e==="function")){return e}return tT(t)}function tT(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function eT(t){eT=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return eT(t)}function nT(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)iT(t,e)}function iT(t,e){iT=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return iT(t,e)}var rT=function(t){nT(e,t);function e(){var t;JR(this,e);t=QR(this,eT(e).call(this));t.orient("left");return t}return e}(VR);function aT(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){aT=function t(e){return j(e)}}else{aT=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return aT(t)}function oT(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function sT(t,e){if(e&&(aT(e)==="object"||typeof e==="function")){return e}return lT(t)}function lT(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function uT(t){uT=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return uT(t)}function cT(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)hT(t,e)}function hT(t,e){hT=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return hT(t,e)}var fT=function(t){cT(e,t);function e(){var t;oT(this,e);t=sT(this,uT(e).call(this));t.orient("right");return t}return e}(VR);function dT(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){dT=function t(e){return j(e)}}else{dT=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return dT(t)}function gT(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function pT(t,e){if(e&&(dT(e)==="object"||typeof e==="function")){return e}return vT(t)}function vT(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function mT(t){mT=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return mT(t)}function yT(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)_T(t,e)}function _T(t,e){_T=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return _T(t,e)}var bT=function(t){yT(e,t);function e(){var t;gT(this,e);t=pT(this,mT(e).call(this));t.orient("top");return t}return e}(VR);function wT(t,e,n){t.prototype=e.prototype=n;n.constructor=t}function xT(t,e){var n=Object.create(t.prototype);for(var i in e){n[i]=e[i]}return n}function kT(){}var ST=.7;var CT=1/ST;var ET="\\s*([+-]?\\d+)\\s*",AT="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",MT="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",RT=/^#([0-9a-f]{3,8})$/,TT=new RegExp("^rgb\\("+[ET,ET,ET]+"\\)$"),OT=new RegExp("^rgb\\("+[MT,MT,MT]+"\\)$"),BT=new RegExp("^rgba\\("+[ET,ET,ET,AT]+"\\)$"),PT=new RegExp("^rgba\\("+[MT,MT,MT,AT]+"\\)$"),NT=new RegExp("^hsl\\("+[AT,MT,MT]+"\\)$"),DT=new RegExp("^hsla\\("+[AT,MT,MT,AT]+"\\)$");var zT={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};wT(kT,IT,{copy:function t(e){return Object.assign(new this.constructor,this,e)},displayable:function t(){return this.rgb().displayable()},hex:jT,formatHex:jT,formatHsl:LT,formatRgb:FT,toString:FT});function jT(){return this.rgb().formatHex()}function LT(){return $T(this).formatHsl()}function FT(){return this.rgb().formatRgb()}function IT(t){var e,n;t=(t+"").trim().toLowerCase();return(e=RT.exec(t))?(n=e[1].length,e=parseInt(e[1],16),n===6?HT(e):n===3?new qT(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?new qT(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?new qT(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=TT.exec(t))?new qT(e[1],e[2],e[3],1):(e=OT.exec(t))?new qT(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=BT.exec(t))?VT(e[1],e[2],e[3],e[4]):(e=PT.exec(t))?VT(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=NT.exec(t))?XT(e[1],e[2]/100,e[3]/100,1):(e=DT.exec(t))?XT(e[1],e[2]/100,e[3]/100,e[4]):zT.hasOwnProperty(t)?HT(zT[t]):t==="transparent"?new qT(NaN,NaN,NaN,0):null}function HT(t){return new qT(t>>16&255,t>>8&255,t&255,1)}function VT(t,e,n,i){if(i<=0)t=e=n=NaN;return new qT(t,e,n,i)}function GT(t){if(!(t instanceof kT))t=IT(t);if(!t)return new qT;t=t.rgb();return new qT(t.r,t.g,t.b,t.opacity)}function UT(t,e,n,i){return arguments.length===1?GT(t):new qT(t,e,n,i==null?1:i)}function qT(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}wT(qT,UT,xT(kT,{brighter:function t(e){e=e==null?CT:Math.pow(CT,e);return new qT(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function t(e){e=e==null?ST:Math.pow(ST,e);return new qT(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function t(){return this},displayable:function t(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:WT,formatHex:WT,formatRgb:KT,toString:KT}));function WT(){return"#"+YT(this.r)+YT(this.g)+YT(this.b)}function KT(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}function YT(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function XT(t,e,n,i){if(i<=0)t=e=n=NaN;else if(n<=0||n>=1)t=e=NaN;else if(e<=0)t=NaN;return new JT(t,e,n,i)}function $T(t){if(t instanceof JT)return new JT(t.h,t.s,t.l,t.opacity);if(!(t instanceof kT))t=IT(t);if(!t)return new JT;if(t instanceof JT)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,l=(a+r)/2;if(s){if(e===a)o=(n-i)/s+(n0&&l<1?0:o}return new JT(o,s,l,t.opacity)}function ZT(t,e,n,i){return arguments.length===1?$T(t):new JT(t,e,n,i==null?1:i)}function JT(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}wT(JT,ZT,xT(kT,{brighter:function t(e){e=e==null?CT:Math.pow(CT,e);return new JT(this.h,this.s,this.l*e,this.opacity)},darker:function t(e){e=e==null?ST:Math.pow(ST,e);return new JT(this.h,this.s,this.l*e,this.opacity)},rgb:function t(){var e=this.h%360+(this.h<0)*360,n=isNaN(e)||isNaN(this.s)?0:this.s,i=this.l,r=i+(i<.5?i:1-i)*n,a=2*i-r;return new qT(QT(e>=240?e-240:e+120,a,r),QT(e,a,r),QT(e<120?e+240:e-120,a,r),this.opacity)},displayable:function t(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function t(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(e===1?")":", "+e+")")}}));function QT(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}function tO(){return new eO}function eO(){this.reset()}eO.prototype={constructor:eO,reset:function t(){this.s=this.t=0},add:function t(e){iO(nO,e,this.t);iO(this,nO.s,this.s);if(this.s)this.t+=nO.t;else this.s=nO.t},valueOf:function t(){return this.s}};var nO=new eO;function iO(t,e,n){var i=t.s=e+n,r=i-e,a=i-r;t.t=e-a+(n-r)}var rO=1e-6;var aO=1e-12;var oO=Math.PI;var sO=oO/2;var lO=oO/4;var uO=oO*2;var cO=180/oO;var hO=oO/180;var fO=Math.abs;var dO=Math.atan;var gO=Math.atan2;var pO=Math.cos;var vO=Math.ceil;var mO=Math.exp;var yO=Math.log;var _O=Math.pow;var bO=Math.sin;var wO=Math.sign||function(t){return t>0?1:t<0?-1:0};var xO=Math.sqrt;var kO=Math.tan;function SO(t){return t>1?0:t<-1?oO:Math.acos(t)}function CO(t){return t>1?sO:t<-1?-sO:Math.asin(t)}function EO(t){return(t=bO(t/2))*t}function AO(){}function MO(t,e){if(t&&TO.hasOwnProperty(t.type)){TO[t.type](t,e)}}var RO={Feature:function t(e,n){MO(e.geometry,n)},FeatureCollection:function t(e,n){var i=e.features,r=-1,a=i.length;while(++r=0?1:-1,r=i*n,a=pO(e),o=bO(e),s=IO*o,l=FO*a+s*pO(r),u=s*i*bO(r);NO.add(gO(u,l));LO=t,FO=a,IO=o}function WO(t){DO.reset();PO(t,HO);return DO*2}function KO(t){return[gO(t[1],t[0]),CO(t[2])]}function YO(t){var e=t[0],n=t[1],i=pO(n);return[i*pO(e),i*bO(e),bO(n)]}function XO(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function $O(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function ZO(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function JO(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function QO(t){var e=xO(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var tB,eB,nB,iB,rB,aB,oB,sB,lB=tO(),uB,cB;var hB={point:fB,lineStart:gB,lineEnd:pB,polygonStart:function t(){hB.point=vB;hB.lineStart=mB;hB.lineEnd=yB;lB.reset();HO.polygonStart()},polygonEnd:function t(){HO.polygonEnd();hB.point=fB;hB.lineStart=gB;hB.lineEnd=pB;if(NO<0)tB=-(nB=180),eB=-(iB=90);else if(lB>rO)iB=90;else if(lB<-rO)eB=-90;cB[0]=tB,cB[1]=nB},sphere:function t(){tB=-(nB=180),eB=-(iB=90)}};function fB(t,e){uB.push(cB=[tB=t,nB=t]);if(eiB)iB=e}function dB(t,e){var n=YO([t*hO,e*hO]);if(sB){var i=$O(sB,n),r=[i[1],-i[0],0],a=$O(r,i);QO(a);a=KO(a);var o=t-rB,s=o>0?1:-1,l=a[0]*cO*s,u,c=fO(o)>180;if(c^(s*rBiB)iB=u}else if(l=(l+360)%360-180,c^(s*rBiB)iB=e}if(c){if(t_B(tB,nB))nB=t}else{if(_B(t,nB)>_B(tB,nB))tB=t}}else{if(nB>=tB){if(tnB)nB=t}else{if(t>rB){if(_B(tB,t)>_B(tB,nB))nB=t}else{if(_B(t,nB)>_B(tB,nB))tB=t}}}}else{uB.push(cB=[tB=t,nB=t])}if(eiB)iB=e;sB=n,rB=t}function gB(){hB.point=dB}function pB(){cB[0]=tB,cB[1]=nB;hB.point=fB;sB=null}function vB(t,e){if(sB){var n=t-rB;lB.add(fO(n)>180?n+(n>0?360:-360):n)}else{aB=t,oB=e}HO.point(t,e);dB(t,e)}function mB(){HO.lineStart()}function yB(){vB(aB,oB);HO.lineEnd();if(fO(lB)>rO)tB=-(nB=180);cB[0]=tB,cB[1]=nB;sB=null}function _B(t,e){return(e-=t)<0?e+360:e}function bB(t,e){return t[0]-e[0]}function wB(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:e_B(i[0],i[1]))i[1]=r[1];if(_B(r[0],i[1])>_B(i[0],i[1]))i[0]=r[0]}else{a.push(i=r)}}for(o=-Infinity,n=a.length-1,e=0,i=a[n];e<=n;i=r,++e){r=a[e];if((s=_B(i[1],r[0]))>o)o=s,tB=r[0],nB=i[1]}}uB=cB=null;return tB===Infinity||eB===Infinity?[[NaN,NaN],[NaN,NaN]]:[[tB,eB],[nB,iB]]}var kB,SB,CB,EB,AB,MB,RB,TB,OB,BB,PB,NB,DB,zB,jB,LB;var FB={sphere:AO,point:IB,lineStart:VB,lineEnd:qB,polygonStart:function t(){FB.lineStart=WB;FB.lineEnd=KB},polygonEnd:function t(){FB.lineStart=VB;FB.lineEnd=qB}};function IB(t,e){t*=hO,e*=hO;var n=pO(e);HB(n*pO(t),n*bO(t),bO(e))}function HB(t,e,n){++kB;CB+=(t-CB)/kB;EB+=(e-EB)/kB;AB+=(n-AB)/kB}function VB(){FB.point=GB}function GB(t,e){t*=hO,e*=hO;var n=pO(e);zB=n*pO(t);jB=n*bO(t);LB=bO(e);FB.point=UB;HB(zB,jB,LB)}function UB(t,e){t*=hO,e*=hO;var n=pO(e),i=n*pO(t),r=n*bO(t),a=bO(e),o=gO(xO((o=jB*a-LB*r)*o+(o=LB*i-zB*a)*o+(o=zB*r-jB*i)*o),zB*i+jB*r+LB*a);SB+=o;MB+=o*(zB+(zB=i));RB+=o*(jB+(jB=r));TB+=o*(LB+(LB=a));HB(zB,jB,LB)}function qB(){FB.point=IB}function WB(){FB.point=YB}function KB(){XB(NB,DB);FB.point=IB}function YB(t,e){NB=t,DB=e;t*=hO,e*=hO;FB.point=XB;var n=pO(e);zB=n*pO(t);jB=n*bO(t);LB=bO(e);HB(zB,jB,LB)}function XB(t,e){t*=hO,e*=hO;var n=pO(e),i=n*pO(t),r=n*bO(t),a=bO(e),o=jB*a-LB*r,s=LB*i-zB*a,l=zB*r-jB*i,u=xO(o*o+s*s+l*l),c=CO(u),h=u&&-c/u;OB+=h*o;BB+=h*s;PB+=h*l;SB+=c;MB+=c*(zB+(zB=i));RB+=c*(jB+(jB=r));TB+=c*(LB+(LB=a));HB(zB,jB,LB)}function $B(t){kB=SB=CB=EB=AB=MB=RB=TB=OB=BB=PB=0;PO(t,FB);var e=OB,n=BB,i=PB,r=e*e+n*n+i*i;if(roO?t+Math.round(-t/uO)*uO:t,e]}QB.invert=QB;function tP(t,e,n){return(t%=uO)?e||n?JB(nP(t),iP(e,n)):nP(t):e||n?iP(e,n):QB}function eP(n){return function(t,e){return t+=n,[t>oO?t-uO:t<-oO?t+uO:t,e]}}function nP(t){var e=eP(t);e.invert=eP(-t);return e}function iP(t,e){var s=pO(t),l=bO(t),u=pO(e),c=bO(e);function n(t,e){var n=pO(e),i=pO(t)*n,r=bO(t)*n,a=bO(e),o=a*s+i*l;return[gO(r*u-o*c,i*s-a*l),CO(o*u+r*c)]}n.invert=function(t,e){var n=pO(e),i=pO(t)*n,r=bO(t)*n,a=bO(e),o=a*u-r*c;return[gO(r*u+a*c,i*s+o*l),CO(o*s-i*l)]};return n}function rP(e){e=tP(e[0]*hO,e[1]*hO,e.length>2?e[2]*hO:0);function t(t){t=e(t[0]*hO,t[1]*hO);return t[0]*=cO,t[1]*=cO,t}t.invert=function(t){t=e.invert(t[0]*hO,t[1]*hO);return t[0]*=cO,t[1]*=cO,t};return t}function aP(t,e,n,i,r,a){if(!n)return;var o=pO(e),s=bO(e),l=i*n;if(r==null){r=e+i*uO;a=e-l/2}else{r=oP(o,r);a=oP(o,a);if(i>0?ra)r+=i*uO}for(var u,c=r;i>0?c>a:c1)e.push(e.pop().concat(e.shift()))},result:function t(){var t=e;e=[];i=null;return t}}}function uP(t,e){return fO(t[0]-e[0])=0;--l){a.point((h=c[l])[0],h[1])}}else{i(f.x,f.p.x,-1,a)}f=f.p}f=f.o;c=f.z;d=!d}while(!f.v);a.lineEnd()}}function fP(t){if(!(e=t.length))return;var e,n=0,i=t[0],r;while(++n=0?1:-1,C=S*k,E=C>oO,A=p*w;dP.add(gO(A*S*bO(C),v*x+A*pO(C)));o+=E?k+S*uO:k;if(E^d>=n^_>=n){var M=$O(YO(f),YO(y));QO(M);var R=$O(a,M);QO(R);var T=(E^k>=0?-1:1)*CO(R[2]);if(i>T||i===T&&(M[0]||M[1])){s+=E^k>=0?1:-1}}}}return(o<-rO||o0){if(!c)s.polygonStart(),c=true;s.lineStart();for(n=0;n1&&t&2)e.push(e.pop().concat(e.shift()));f.push(e.filter(mP))}return i}}function mP(t){return t.length>1}function yP(t,e){return((t=t.x)[0]<0?t[1]-sO-rO:sO-t[1])-((e=e.x)[0]<0?e[1]-sO-rO:sO-e[1])}var _P=vP(function(){return true},bP,xP,[-oO,-sO]);function bP(a){var o=NaN,s=NaN,l=NaN,u;return{lineStart:function t(){a.lineStart();u=1},point:function t(e,n){var i=e>0?oO:-oO,r=fO(e-o);if(fO(r-oO)0?sO:-sO);a.point(l,s);a.lineEnd();a.lineStart();a.point(i,s);a.point(e,s);u=0}else if(l!==i&&r>=oO){if(fO(o-l)rO?dO((bO(e)*(a=pO(i))*bO(n)-bO(i)*(r=pO(e))*bO(t))/(r*a*o)):(e+i)/2}function xP(t,e,n,i){var r;if(t==null){r=n*sO;i.point(-oO,r);i.point(0,r);i.point(oO,r);i.point(oO,0);i.point(oO,-r);i.point(0,-r);i.point(-oO,-r);i.point(-oO,0);i.point(-oO,r)}else if(fO(t[0]-e[0])>rO){var a=t[0]0,p=fO(T)>rO;function t(t,e,n,i){aP(i,r,a,n,t,e)}function v(t,e){return pO(t)*pO(e)>T}function e(l){var u,c,h,f,d;return{lineStart:function t(){f=h=false;d=1},point:function t(e,n){var i=[e,n],r,a=v(e,n),o=g?a?0:y(e,n):a?y(e+(e<0?oO:-oO),n):0;if(!u&&(f=h=a))l.lineStart();if(a!==h){r=m(u,i);if(!r||uP(u,r)||uP(i,r)){i[0]+=rO;i[1]+=rO;a=v(i[0],i[1])}}if(a!==h){d=0;if(a){l.lineStart();r=m(i,u);l.point(r[0],r[1])}else{r=m(u,i);l.point(r[0],r[1]);l.lineEnd()}u=r}else if(p&&u&&g^a){var s;if(!(o&c)&&(s=m(i,u,true))){d=0;if(g){l.lineStart();l.point(s[0][0],s[0][1]);l.point(s[1][0],s[1][1]);l.lineEnd()}else{l.point(s[1][0],s[1][1]);l.lineEnd();l.lineStart();l.point(s[0][0],s[0][1])}}}if(a&&(!u||!uP(u,i))){l.point(i[0],i[1])}u=i,h=a,c=o},lineEnd:function t(){if(h)l.lineEnd();u=null},clean:function t(){return d|(f&&h)<<1}}}function m(t,e,n){var i=YO(t),r=YO(e);var a=[1,0,0],o=$O(i,r),s=XO(o,o),l=o[0],u=s-l*l;if(!u)return!n&&t;var c=T*s/u,h=-T*l/u,f=$O(a,o),d=JO(a,c),g=JO(o,h);ZO(d,g);var p=f,v=XO(d,p),m=XO(p,p),y=v*v-m*(XO(d,d)-1);if(y<0)return;var _=xO(y),b=JO(p,(-v-_)/m);ZO(b,d);b=KO(b);if(!n)return b;var w=t[0],x=e[0],k=t[1],S=e[1],C;if(x0^b[1]<(fO(b[0]-w)oO^(w<=b[0]&&b[0]<=x)){var R=JO(p,(-v+_)/m);ZO(R,d);return[b,KO(R)]}}function y(t,e){var n=g?r:oO-r,i=0;if(t<-n)i|=1;else if(t>n)i|=2;if(e<-n)i|=4;else if(e>n)i|=8;return i}return vP(v,e,t,g?[0,-r]:[-oO,r-oO])}function SP(t,e,n,i,r,a){var o=t[0],s=t[1],l=e[0],u=e[1],c=0,h=1,f=l-o,d=u-s,g;g=n-o;if(!f&&g>0)return;g/=f;if(f<0){if(g0){if(g>h)return;if(g>c)c=g}g=r-o;if(!f&&g<0)return;g/=f;if(f<0){if(g>h)return;if(g>c)c=g}else if(f>0){if(g0)return;g/=d;if(d<0){if(g0){if(g>h)return;if(g>c)c=g}g=a-s;if(!d&&g<0)return;g/=d;if(d<0){if(g>h)return;if(g>c)c=g}else if(d>0){if(g0)t[0]=o+c*f,t[1]=s+c*d;if(h<1)e[0]=o+h*f,e[1]=s+h*d;return true}var CP=1e9,EP=-CP;function AP(x,k,S,C){function E(t,e){return x<=t&&t<=S&&k<=e&&e<=C}function A(t,e,n,i){var r=0,a=0;if(t==null||(r=o(t,n))!==(a=o(e,n))||s(t,e)<0^n>0){do{i.point(r===0||r===3?x:S,r>1?C:k)}while((r=(r+n+4)%4)!==a)}else{i.point(e[0],e[1])}}function o(t,e){return fO(t[0]-x)0?0:3:fO(t[0]-S)0?2:1:fO(t[1]-k)0?1:0:e>0?3:2}function M(t,e){return s(t.x,e.x)}function s(t,e){var n=o(t,1),i=o(e,1);return n!==i?n-i:n===0?e[1]-t[1]:n===1?t[0]-e[0]:n===2?t[1]-e[1]:e[0]-t[0]}return function(i){var a=i,t=lP(),r,h,o,s,l,u,c,f,d,g,p;var e={point:n,lineStart:_,lineEnd:b,polygonStart:m,polygonEnd:y};function n(t,e){if(E(t,e))a.point(t,e)}function v(){var t=0;for(var e=0,n=h.length;eC&&(u-s)*(C-l)>(c-l)*(x-s))++t}else{if(c<=C&&(u-s)*(C-l)<(c-l)*(x-s))--t}}}return t}function m(){a=t,r=[],h=[],p=true}function y(){var t=v(),e=p&&t,n=(r=Vt(r)).length;if(e||n){i.polygonStart();if(e){i.lineStart();A(null,null,1,i);i.lineEnd()}if(n){hP(r,M,t,A,i)}i.polygonEnd()}a=i,r=h=o=null}function _(){e.point=w;if(h)h.push(o=[]);g=true;d=false;c=f=NaN}function b(){if(r){w(s,l);if(u&&d)t.rejoin();r.push(t.result())}e.point=n;if(d)a.lineEnd()}function w(t,e){var n=E(t,e);if(h)o.push([t,e]);if(g){s=t,l=e,u=n;g=false;if(n){a.lineStart();a.point(t,e)}}else{if(n&&d)a.point(t,e);else{var i=[c=Math.max(EP,Math.min(CP,c)),f=Math.max(EP,Math.min(CP,f))],r=[t=Math.max(EP,Math.min(CP,t)),e=Math.max(EP,Math.min(CP,e))];if(SP(i,r,x,k,S,C)){if(!d){a.lineStart();a.point(i[0],i[1])}a.point(r[0],r[1]);if(!n)a.lineEnd();p=false}else if(n){a.lineStart();a.point(t,e);p=false}}}c=t,f=e,d=n}return e}}function MP(){var n=0,i=0,r=960,a=500,o,s,l;return l={stream:function t(e){return o&&s===e?o:o=AP(n,i,r,a)(s=e)},extent:function t(e){return arguments.length?(n=+e[0][0],i=+e[0][1],r=+e[1][0],a=+e[1][1],o=s=null,l):[[n,i],[r,a]]}}}var RP=tO(),TP,OP,BP;var PP={sphere:AO,point:AO,lineStart:NP,lineEnd:AO,polygonStart:AO,polygonEnd:AO};function NP(){PP.point=zP;PP.lineEnd=DP}function DP(){PP.point=PP.lineEnd=AO}function zP(t,e){t*=hO,e*=hO;TP=t,OP=bO(e),BP=pO(e);PP.point=jP}function jP(t,e){t*=hO,e*=hO;var n=bO(e),i=pO(e),r=fO(t-TP),a=pO(r),o=bO(r),s=i*o,l=BP*n-OP*i*a,u=OP*n+BP*i*a;RP.add(gO(xO(s*s+l*l),u));TP=t,OP=n,BP=i}function LP(t){RP.reset();PO(t,PP);return+RP}var FP=[null,null],IP={type:"LineString",coordinates:FP};function HP(t,e){FP[0]=t;FP[1]=e;return LP(IP)}var VP={Feature:function t(e,n){return UP(e.geometry,n)},FeatureCollection:function t(e,n){var i=e.features,r=-1,a=i.length;while(++r0){r=HP(t[a],t[a-1]);if(r>0&&n<=r&&i<=r&&(n+i-r)*(1-Math.pow((n-i)/r,2))rO}).map(d)).concat(It(vO(o/c)*c,a,c).filter(function(t){return fO(t%f)>rO}).map(g))}y.lines=function(){return t().map(function(t){return{type:"LineString",coordinates:t}})};y.outline=function(){return{type:"Polygon",coordinates:[p(r).concat(v(s).slice(1),p(i).reverse().slice(1),v(l).reverse().slice(1))]}};y.extent=function(t){if(!arguments.length)return y.extentMinor();return y.extentMajor(t).extentMinor(t)};y.extentMajor=function(t){if(!arguments.length)return[[r,l],[i,s]];r=+t[0][0],i=+t[1][0];l=+t[0][1],s=+t[1][1];if(r>i)t=r,r=i,i=t;if(l>s)t=l,l=s,s=t;return y.precision(m)};y.extentMinor=function(t){if(!arguments.length)return[[n,o],[e,a]];n=+t[0][0],e=+t[1][0];o=+t[0][1],a=+t[1][1];if(n>e)t=n,n=e,e=t;if(o>a)t=o,o=a,a=t;return y.precision(m)};y.step=function(t){if(!arguments.length)return y.stepMinor();return y.stepMajor(t).stepMinor(t)};y.stepMajor=function(t){if(!arguments.length)return[h,f];h=+t[0],f=+t[1];return y};y.stepMinor=function(t){if(!arguments.length)return[u,c];u=+t[0],c=+t[1];return y};y.precision=function(t){if(!arguments.length)return m;m=+t;d=ZP(o,a,90);g=JP(n,e,m);p=ZP(l,s,90);v=JP(r,i,m);return y};return y.extentMajor([[-180,-90+rO],[180,90-rO]]).extentMinor([[-180,-80-rO],[180,80+rO]])}function tN(){return QP()()}function eN(t,e){var n=t[0]*hO,i=t[1]*hO,r=e[0]*hO,a=e[1]*hO,o=pO(i),s=bO(i),l=pO(a),u=bO(a),c=o*pO(n),h=o*bO(n),f=l*pO(r),d=l*bO(r),g=2*CO(xO(EO(a-i)+o*l*EO(r-n))),p=bO(g);var v=g?function(t){var e=bO(t*=g)/p,n=bO(g-t)/p,i=n*c+e*f,r=n*h+e*d,a=n*s+e*u;return[gO(r,i)*cO,gO(a,xO(i*i+r*r))*cO]}:function(){return[n*cO,i*cO]};v.distance=g;return v}function nN(t){return t}var iN=tO(),rN=tO(),aN,oN,sN,lN;var uN={point:AO,lineStart:AO,lineEnd:AO,polygonStart:function t(){uN.lineStart=cN;uN.lineEnd=dN},polygonEnd:function t(){uN.lineStart=uN.lineEnd=uN.point=AO;iN.add(fO(rN));rN.reset()},result:function t(){var e=iN/2;iN.reset();return e}};function cN(){uN.point=hN}function hN(t,e){uN.point=fN;aN=sN=t,oN=lN=e}function fN(t,e){rN.add(lN*t-sN*e);sN=t,lN=e}function dN(){fN(aN,oN)}var gN=Infinity,pN=gN,vN=-gN,mN=vN;var yN={point:_N,lineStart:AO,lineEnd:AO,polygonStart:AO,polygonEnd:AO,result:function t(){var e=[[gN,pN],[vN,mN]];vN=mN=-(pN=gN=Infinity);return e}};function _N(t,e){if(tvN)vN=t;if(emN)mN=e}var bN=0,wN=0,xN=0,kN=0,SN=0,CN=0,EN=0,AN=0,MN=0,RN,TN,ON,BN;var PN={point:NN,lineStart:DN,lineEnd:LN,polygonStart:function t(){PN.lineStart=FN;PN.lineEnd=IN},polygonEnd:function t(){PN.point=NN;PN.lineStart=DN;PN.lineEnd=LN},result:function t(){var e=MN?[EN/MN,AN/MN]:CN?[kN/CN,SN/CN]:xN?[bN/xN,wN/xN]:[NaN,NaN];bN=wN=xN=kN=SN=CN=EN=AN=MN=0;return e}};function NN(t,e){bN+=t;wN+=e;++xN}function DN(){PN.point=zN}function zN(t,e){PN.point=jN;NN(ON=t,BN=e)}function jN(t,e){var n=t-ON,i=e-BN,r=xO(n*n+i*i);kN+=r*(ON+t)/2;SN+=r*(BN+e)/2;CN+=r;NN(ON=t,BN=e)}function LN(){PN.point=NN}function FN(){PN.point=HN}function IN(){VN(RN,TN)}function HN(t,e){PN.point=VN;NN(RN=ON=t,TN=BN=e)}function VN(t,e){var n=t-ON,i=e-BN,r=xO(n*n+i*i);kN+=r*(ON+t)/2;SN+=r*(BN+e)/2;CN+=r;r=BN*t-ON*e;EN+=r*(ON+t);AN+=r*(BN+e);MN+=r*3;NN(ON=t,BN=e)}function GN(t){this._context=t}GN.prototype={_radius:4.5,pointRadius:function t(e){return this._radius=e,this},polygonStart:function t(){this._line=0},polygonEnd:function t(){this._line=NaN},lineStart:function t(){this._point=0},lineEnd:function t(){if(this._line===0)this._context.closePath();this._point=NaN},point:function t(e,n){switch(this._point){case 0:{this._context.moveTo(e,n);this._point=1;break}case 1:{this._context.lineTo(e,n);break}default:{this._context.moveTo(e+this._radius,n);this._context.arc(e,n,this._radius,0,uO);break}}},result:AO};var UN=tO(),qN,WN,KN,YN,XN;var $N={point:AO,lineStart:function t(){$N.point=ZN},lineEnd:function t(){if(qN)JN(WN,KN);$N.point=AO},polygonStart:function t(){qN=true},polygonEnd:function t(){qN=null},result:function t(){var e=+UN;UN.reset();return e}};function ZN(t,e){$N.point=JN;WN=YN=t,KN=XN=e}function JN(t,e){YN-=t,XN-=e;UN.add(xO(YN*YN+XN*XN));YN=t,XN=e}function QN(){this._string=[]}QN.prototype={_radius:4.5,_circle:tD(4.5),pointRadius:function t(e){if((e=+e)!==this._radius)this._radius=e,this._circle=null;return this},polygonStart:function t(){this._line=0},polygonEnd:function t(){this._line=NaN},lineStart:function t(){this._point=0},lineEnd:function t(){if(this._line===0)this._string.push("Z");this._point=NaN},point:function t(e,n){switch(this._point){case 0:{this._string.push("M",e,",",n);this._point=1;break}case 1:{this._string.push("L",e,",",n);break}default:{if(this._circle==null)this._circle=tD(this._radius);this._string.push("M",e,",",n,this._circle);break}}},result:function t(){if(this._string.length){var t=this._string.join("");this._string=[];return t}else{return null}}};function tD(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function eD(e,n){var i=4.5,r,a;function o(t){if(t){if(typeof i==="function")a.pointRadius(+i.apply(this,arguments));PO(t,r(a))}return a.result()}o.area=function(t){PO(t,r(uN));return uN.result()};o.measure=function(t){PO(t,r($N));return $N.result()};o.bounds=function(t){PO(t,r(yN));return yN.result()};o.centroid=function(t){PO(t,r(PN));return PN.result()};o.projection=function(t){return arguments.length?(r=t==null?(e=null,nN):(e=t).stream,o):e};o.context=function(t){if(!arguments.length)return n;a=t==null?(n=null,new QN):new GN(n=t);if(typeof i!=="function")a.pointRadius(i);return o};o.pointRadius=function(t){if(!arguments.length)return i;i=typeof t==="function"?t:(a.pointRadius(+t),+t);return o};return o.projection(e).context(n)}function nD(t){return{stream:iD(t)}}function iD(i){return function(t){var e=new rD;for(var n in i){e[n]=i[n]}e.stream=t;return e}}function rD(){}rD.prototype={constructor:rD,point:function t(e,n){this.stream.point(e,n)},sphere:function t(){this.stream.sphere()},lineStart:function t(){this.stream.lineStart()},lineEnd:function t(){this.stream.lineEnd()},polygonStart:function t(){this.stream.polygonStart()},polygonEnd:function t(){this.stream.polygonEnd()}};function aD(t,e,n){var i=t.clipExtent&&t.clipExtent();t.scale(150).translate([0,0]);if(i!=null)t.clipExtent(null);PO(n,t.stream(yN));e(yN.result());if(i!=null)t.clipExtent(i);return t}function oD(o,s,t){return aD(o,function(t){var e=s[1][0]-s[0][0],n=s[1][1]-s[0][1],i=Math.min(e/(t[1][0]-t[0][0]),n/(t[1][1]-t[0][1])),r=+s[0][0]+(e-i*(t[1][0]+t[0][0]))/2,a=+s[0][1]+(n-i*(t[1][1]+t[0][1]))/2;o.scale(150*i).translate([r,a])},t)}function sD(t,e,n){return oD(t,[[0,0],e],n)}function lD(a,o,t){return aD(a,function(t){var e=+o,n=e/(t[1][0]-t[0][0]),i=(e-n*(t[1][0]+t[0][0]))/2,r=-n*t[0][1];a.scale(150*n).translate([i,r])},t)}function uD(a,o,t){return aD(a,function(t){var e=+o,n=e/(t[1][1]-t[0][1]),i=-n*t[0][0],r=(e-n*(t[1][1]+t[0][1]))/2;a.scale(150*n).translate([i,r])},t)}var cD=16,hD=pO(30*hO);function fD(t,e){return+e?gD(t,e):dD(t)}function dD(i){return iD({point:function t(e,n){e=i(e,n);this.stream.point(e[0],e[1])}})}function gD(R,T){function O(t,e,n,i,r,a,o,s,l,u,c,h,f,d){var g=o-t,p=s-e,v=g*g+p*p;if(v>4*T&&f--){var m=i+u,y=r+c,_=a+h,b=xO(m*m+y*y+_*_),w=CO(_/=b),x=fO(fO(_)-1)T||fO((g*E+p*A)/v-.5)>.3||i*u+r*c+a*h2?t[2]%360*hO:0,A()):[l*cO,u*cO,c*cO]};C.angle=function(t){return arguments.length?(f=t%360*hO,A()):f*cO};C.precision=function(t){return arguments.length?(b=fD(w,_=t*t),M()):xO(_)};C.fitExtent=function(t,e){return oD(C,t,e)};C.fitSize=function(t,e){return sD(C,t,e)};C.fitWidth=function(t,e){return lD(C,t,e)};C.fitHeight=function(t,e){return uD(C,t,e)};function A(){var t=yD(i,0,0,f).apply(null,n(o,s)),e=(f?yD:mD)(i,r-t[0],a-t[1],f);h=tP(l,u,c);w=JB(n,e);x=JB(h,w);b=fD(w,_);return M()}function M(){k=S=null;return C}return function(){n=t.apply(this,arguments);C.invert=n.invert&&E;return A()}}function wD(t){var e=0,n=oO/3,i=bD(t),r=i(e,n);r.parallels=function(t){return arguments.length?i(e=t[0]*hO,n=t[1]*hO):[e*cO,n*cO]};return r}function xD(t){var n=pO(t);function e(t,e){return[t*n,bO(e)/n]}e.invert=function(t,e){return[t/n,CO(e*n)]};return e}function kD(t,e){var n=bO(t),i=(n+bO(e))/2;if(fO(i)=.12&&r<.234&&i>=-.425&&i<-.214?o:r>=.166&&r<.234&&i>=-.214&&i<-.115?l:a).invert(t)};h.stream=function(t){return e&&n===t?e:e=ED([a.stream(n=t),o.stream(t),l.stream(t)])};h.precision=function(t){if(!arguments.length)return a.precision();a.precision(t),o.precision(t),l.precision(t);return f()};h.scale=function(t){if(!arguments.length)return a.scale();a.scale(t),o.scale(t*.35),l.scale(t);return h.translate(a.translate())};h.translate=function(t){if(!arguments.length)return a.translate();var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.455*e,i-.238*e],[n+.455*e,i+.238*e]]).stream(c);s=o.translate([n-.307*e,i+.201*e]).clipExtent([[n-.425*e+rO,i+.12*e+rO],[n-.214*e-rO,i+.234*e-rO]]).stream(c);u=l.translate([n-.205*e,i+.212*e]).clipExtent([[n-.214*e+rO,i+.166*e+rO],[n-.115*e-rO,i+.234*e-rO]]).stream(c);return f()};h.fitExtent=function(t,e){return oD(h,t,e)};h.fitSize=function(t,e){return sD(h,t,e)};h.fitWidth=function(t,e){return lD(h,t,e)};h.fitHeight=function(t,e){return uD(h,t,e)};function f(){e=n=null;return h}return h.scale(1070)}function MD(a){return function(t,e){var n=pO(t),i=pO(e),r=a(n*i);return[r*i*bO(t),r*bO(e)]}}function RD(o){return function(t,e){var n=xO(t*t+e*e),i=o(n),r=bO(i),a=pO(i);return[gO(t*r,n*a),CO(n&&e*r/n)]}}var TD=MD(function(t){return xO(2/(1+t))});TD.invert=RD(function(t){return 2*CO(t/2)});function OD(){return _D(TD).scale(124.75).clipAngle(180-.001)}var BD=MD(function(t){return(t=SO(t))&&t/bO(t)});BD.invert=RD(function(t){return t});function PD(){return _D(BD).scale(79.4188).clipAngle(180-.001)}function ND(t,e){return[t,yO(kO((sO+e)/2))]}ND.invert=function(t,e){return[t,2*dO(mO(e))-sO]};function DD(){return zD(ND).scale(961/uO)}function zD(n){var i=_D(n),e=i.center,r=i.scale,a=i.translate,o=i.clipExtent,s=null,l,u,c;i.scale=function(t){return arguments.length?(r(t),h()):r()};i.translate=function(t){return arguments.length?(a(t),h()):a()};i.center=function(t){return arguments.length?(e(t),h()):e()};i.clipExtent=function(t){return arguments.length?(t==null?s=l=u=c=null:(s=+t[0][0],l=+t[0][1],u=+t[1][0],c=+t[1][1]),h()):s==null?null:[[s,l],[u,c]]};function h(){var t=oO*r(),e=i(rP(i.rotate()).invert([0,0]));return o(s==null?[[e[0]-t,e[1]-t],[e[0]+t,e[1]+t]]:n===ND?[[Math.max(e[0]-t,s),l],[Math.min(e[0]+t,u),c]]:[[s,Math.max(e[1]-t,l)],[u,Math.min(e[1]+t,c)]])}return h()}function jD(t){return kO((sO+t)/2)}function LD(t,e){var n=pO(t),r=t===e?bO(t):yO(n/pO(e))/yO(jD(e)/jD(t)),a=n*_O(jD(t),r)/r;if(!r)return ND;function i(t,e){if(a>0){if(e<-sO+rO)e=-sO+rO}else{if(e>sO-rO)e=sO-rO}var n=a/_O(jD(e),r);return[n*bO(r*t),a-n*pO(r*t)]}i.invert=function(t,e){var n=a-e,i=wO(r)*xO(t*t+n*n);return[gO(t,fO(n))/r*wO(n),2*dO(_O(a/i,1/r))-sO]};return i}function FD(){return wD(LD).scale(109.5).parallels([30,30])}function ID(t,e){return[t,e]}ID.invert=ID;function HD(){return _D(ID).scale(152.63)}function VD(t,e){var n=pO(t),r=t===e?bO(t):(n-pO(e))/(e-t),a=n/r+t;if(fO(r)rO&&--i>0);return[t/(.8707+(a=n*n)*(-.131979+a*(-.013791+a*a*a*(.003971-.001529*a)))),n]};function iz(){return _D(nz).scale(175.295)}function rz(t,e){return[pO(e)*bO(t),bO(e)]}rz.invert=RD(CO);function az(){return _D(rz).scale(249.5).clipAngle(90+rO)}function oz(t,e){var n=pO(e),i=1+pO(t)*n;return[n*bO(t)/i,bO(e)/i]}oz.invert=RD(function(t){return 2*dO(t)});function sz(){return _D(oz).scale(250).clipAngle(142)}function lz(t,e){return[yO(kO((sO+e)/2)),-t]}lz.invert=function(t,e){return[-e,2*dO(mO(t))-sO]};function uz(){var t=zD(lz),e=t.center,n=t.rotate;t.center=function(t){return arguments.length?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])};t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):(t=n(),[t[0],t[1],t[2]-90])};return n([0,0,90]).scale(159.155)}var cz=Object.freeze({__proto__:null,geoArea:WO,geoBounds:xB,geoCentroid:$B,geoCircle:sP,geoClipAntimeridian:_P,geoClipCircle:kP,geoClipExtent:MP,geoClipRectangle:AP,geoContains:$P,geoDistance:HP,geoGraticule:QP,geoGraticule10:tN,geoInterpolate:eN,geoLength:LP,geoPath:eD,geoAlbers:CD,geoAlbersUsa:AD,geoAzimuthalEqualArea:OD,geoAzimuthalEqualAreaRaw:TD,geoAzimuthalEquidistant:PD,geoAzimuthalEquidistantRaw:BD,geoConicConformal:FD,geoConicConformalRaw:LD,geoConicEqualArea:SD,geoConicEqualAreaRaw:kD,geoConicEquidistant:GD,geoConicEquidistantRaw:VD,geoEqualEarth:ZD,geoEqualEarthRaw:$D,geoEquirectangular:HD,geoEquirectangularRaw:ID,geoGnomonic:QD,geoGnomonicRaw:JD,geoIdentity:ez,geoProjection:_D,geoProjectionMutator:bD,geoMercator:DD,geoMercatorRaw:ND,geoNaturalEarth1:iz,geoNaturalEarth1Raw:nz,geoOrthographic:az,geoOrthographicRaw:rz,geoStereographic:sz,geoStereographicRaw:oz,geoTransverseMercator:uz,geoTransverseMercatorRaw:lz,geoRotation:rP,geoStream:PO,geoTransform:nD});function hz(){var u=0,c=0,h=960,f=500,d=(u+h)/2,g=(c+f)/2,p=256,v=0,m=true;function e(){var t=Math.max(Math.log(p)/Math.LN2-8,0),n=Math.round(t+v),i=1<1&&arguments[1]!==undefined?arguments[1]:"data";return t.reduce(function(t,e){var n=[];if(Array.isArray(e)){n=e}else{if(e[i]){n=e[i]}else{console.warn('d3plus-viz: Please implement a "dataFormat" callback to concat the arrays manually (consider using the d3plus.dataConcat method in your callback). Currently unable to concatenate (using key: "'.concat(i,'") the following response:'),e)}}return t.concat(n)},[])};var _z=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"data";var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"headers";return t[e].map(function(i){return t[n].reduce(function(t,e,n){return t[e]=i[n],t},{})})};function bz(r,t){var a,o=Cs("beforesend","progress","load","error"),s,l=Le(),u=new XMLHttpRequest,c=null,h=null,i,f,d=0;if(typeof XDomainRequest!=="undefined"&&!("withCredentials"in u)&&/^(http(s)?:)?\/\//.test(r))u=new XDomainRequest;"onload"in u?u.onload=u.onerror=u.ontimeout=e:u.onreadystatechange=function(t){u.readyState>3&&e(t)};function e(t){var e=u.status,n;if(!e&&xz(u)||e>=200&&e<300||e===304){if(i){try{n=i.call(a,u)}catch(t){o.call("error",a,t);return}}else{n=u}o.call("load",a,n)}else{o.call("error",a,t)}}u.onprogress=function(t){o.call("progress",a,t)};a={header:function t(e,n){e=(e+"").toLowerCase();if(arguments.length<2)return l.get(e);if(n==null)l.remove(e);else l.set(e,n+"");return a},mimeType:function t(e){if(!arguments.length)return s;s=e==null?null:e+"";return a},responseType:function t(e){if(!arguments.length)return f;f=e;return a},timeout:function t(e){if(!arguments.length)return d;d=+e;return a},user:function t(e){return arguments.length<1?c:(c=e==null?null:e+"",a)},password:function t(e){return arguments.length<1?h:(h=e==null?null:e+"",a)},response:function t(e){i=e;return a},get:function t(e,n){return a.send("GET",e,n)},post:function t(e,n){return a.send("POST",e,n)},send:function t(e,n,i){u.open(e,r,true,c,h);if(s!=null&&!l.has("accept"))l.set("accept",s+",*/*");if(u.setRequestHeader)l.each(function(t,e){u.setRequestHeader(e,t)});if(s!=null&&u.overrideMimeType)u.overrideMimeType(s);if(f!=null)u.responseType=f;if(d>0)u.timeout=d;if(i==null&&typeof n==="function")i=n,n=null;if(i!=null&&i.length===1)i=wz(i);if(i!=null)a.on("error",i).on("load",function(t){i(null,t)});o.call("beforesend",a,u);u.send(n==null?null:n);return a},abort:function t(){u.abort();return a},on:function t(){var e=o.on.apply(o,arguments);return e===o?a:e}};if(t!=null){if(typeof t!=="function")throw new Error("invalid callback: "+t);return a.get(t)}return a}function wz(n){return function(t,e){n(t==null?e:null)}}function xz(t){var e=t.responseType;return e&&e!=="text"?t.response:t.responseText}function kz(i,r){return function(t,e){var n=bz(t).mimeType(i).response(r);if(e!=null){if(typeof e!=="function")throw new Error("invalid callback: "+e);return n.get(e)}return n}}var Sz=kz("application/json",function(t){return JSON.parse(t.responseText)});var Cz=kz("text/plain",function(t){return t.responseText});var Ez={},Az={},Mz=34,Rz=10,Tz=13;function Oz(t){return new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+'] || ""'}).join(",")+"}")}function Bz(n,i){var r=Oz(n);return function(t,e){return i(r(t),e,n)}}function Pz(t){var n=Object.create(null),i=[];t.forEach(function(t){for(var e in t){if(!(e in n)){i.push(n[e]=e)}}});return i}function Nz(t,e){var n=t+"",i=n.length;return i9999?"+"+Nz(t,6):Nz(t,4)}function zz(t){var e=t.getUTCHours(),n=t.getUTCMinutes(),i=t.getUTCSeconds(),r=t.getUTCMilliseconds();return isNaN(t)?"Invalid Date":Dz(t.getUTCFullYear())+"-"+Nz(t.getUTCMonth()+1,2)+"-"+Nz(t.getUTCDate(),2)+(r?"T"+Nz(e,2)+":"+Nz(n,2)+":"+Nz(i,2)+"."+Nz(r,3)+"Z":i?"T"+Nz(e,2)+":"+Nz(n,2)+":"+Nz(i,2)+"Z":n||e?"T"+Nz(e,2)+":"+Nz(n,2)+"Z":"")}function jz(i){var e=new RegExp('["'+i+"\n\r]"),h=i.charCodeAt(0);function t(t,n){var i,r,e=a(t,function(t,e){if(i)return i(t,e-1);r=t,i=n?Bz(t,n):Oz(t)});e.columns=r||[];return e}function a(i,t){var e=[],r=i.length,a=0,n=0,o,s=r<=0,l=false;if(i.charCodeAt(r-1)===Rz)--r;if(i.charCodeAt(r-1)===Tz)--r;function u(){if(s)return Az;if(l)return l=false,Ez;var t,e=a,n;if(i.charCodeAt(e)===Mz){while(a++=r)s=true;else if((n=i.charCodeAt(a++))===Rz)l=true;else if(n===Tz){l=true;if(i.charCodeAt(a)===Rz)++a}return i.slice(e+1,t-1).replace(/""/g,'"')}while(aMath.abs(t[1]-M[1]))C=true;else S=true}M=t;x=true;Qz();N()}function N(){var t;b=M[0]-A[0];w=M[1]-A[1];switch(i){case ej:case tj:{if(r)b=Math.max(l-u,Math.min(g-p,b)),c=u+b,v=p+b;if(a)w=Math.max(h-f,Math.min(m-y,w)),d=f+w,_=y+w;break}case nj:{if(r<0)b=Math.max(l-u,Math.min(g-u,b)),c=u+b,v=p;else if(r>0)b=Math.max(l-p,Math.min(g-p,b)),c=u,v=p+b;if(a<0)w=Math.max(h-f,Math.min(m-f,w)),d=f+w,_=y;else if(a>0)w=Math.max(h-y,Math.min(m-y,w)),d=f,_=y+w;break}case ij:{if(r)c=Math.max(l,Math.min(g,u-b*r)),v=Math.max(l,Math.min(g,p+b*r));if(a)d=Math.max(h,Math.min(m,f-w*a)),_=Math.max(h,Math.min(m,y+w*a));break}}if(v0)u=c-b;if(a<0)y=_-w;else if(a>0)f=d-w;i=ej;O.attr("cursor",cj.selection);N()}break}default:return}Qz()}function j(){switch(ns.keyCode){case 16:{if(k){S=C=k=false;N()}break}case 18:{if(i===ij){if(r<0)p=v;else if(r>0)u=c;if(a<0)y=_;else if(a>0)f=d;i=nj;N()}break}case 32:{if(i===ej){if(ns.altKey){if(r)p=v-b*r,u=c+b*r;if(a)y=_-w*a,f=d+w*a;i=ij}else{if(r<0)p=v;else if(r>0)u=c;if(a<0)y=_;else if(a>0)f=d;i=nj}O.attr("cursor",cj[n]);N()}break}default:return}Qz()}}function l(){G(this,arguments).moved()}function u(){G(this,arguments).ended()}function c(){var t=this.__brush||{selection:null};t.extent=aj(e.apply(this,arguments));t.dim=L;return t}a.extent=function(t){return arguments.length?(e=typeof t==="function"?t:$z(aj(t)),a):e};a.filter=function(t){return arguments.length?(F=typeof t==="function"?t:$z(!!t),a):F};a.touchable=function(t){return arguments.length?(i=typeof t==="function"?t:$z(!!t),a):i};a.handleSize=function(t){return arguments.length?(r=+t,a):r};a.keyModifiers=function(t){return arguments.length?(I=!!t,a):I};a.on=function(){var t=n.on.apply(n,arguments);return t===n?a:t};return a}function kj(t,e,n){t.prototype=e.prototype=n;n.constructor=t}function Sj(t,e){var n=Object.create(t.prototype);for(var i in e){n[i]=e[i]}return n}function Cj(){}var Ej=.7;var Aj=1/Ej;var Mj="\\s*([+-]?\\d+)\\s*",Rj="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",Tj="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Oj=/^#([0-9a-f]{3,8})$/,Bj=new RegExp("^rgb\\("+[Mj,Mj,Mj]+"\\)$"),Pj=new RegExp("^rgb\\("+[Tj,Tj,Tj]+"\\)$"),Nj=new RegExp("^rgba\\("+[Mj,Mj,Mj,Rj]+"\\)$"),Dj=new RegExp("^rgba\\("+[Tj,Tj,Tj,Rj]+"\\)$"),zj=new RegExp("^hsl\\("+[Rj,Tj,Tj]+"\\)$"),jj=new RegExp("^hsla\\("+[Rj,Tj,Tj,Rj]+"\\)$");var Lj={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};kj(Cj,Vj,{copy:function t(e){return Object.assign(new this.constructor,this,e)},displayable:function t(){return this.rgb().displayable()},hex:Fj,formatHex:Fj,formatHsl:Ij,formatRgb:Hj,toString:Hj});function Fj(){return this.rgb().formatHex()}function Ij(){return Jj(this).formatHsl()}function Hj(){return this.rgb().formatRgb()}function Vj(t){var e,n;t=(t+"").trim().toLowerCase();return(e=Oj.exec(t))?(n=e[1].length,e=parseInt(e[1],16),n===6?Gj(e):n===3?new Kj(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?new Kj(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?new Kj(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=Bj.exec(t))?new Kj(e[1],e[2],e[3],1):(e=Pj.exec(t))?new Kj(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=Nj.exec(t))?Uj(e[1],e[2],e[3],e[4]):(e=Dj.exec(t))?Uj(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=zj.exec(t))?Zj(e[1],e[2]/100,e[3]/100,1):(e=jj.exec(t))?Zj(e[1],e[2]/100,e[3]/100,e[4]):Lj.hasOwnProperty(t)?Gj(Lj[t]):t==="transparent"?new Kj(NaN,NaN,NaN,0):null}function Gj(t){return new Kj(t>>16&255,t>>8&255,t&255,1)}function Uj(t,e,n,i){if(i<=0)t=e=n=NaN;return new Kj(t,e,n,i)}function qj(t){if(!(t instanceof Cj))t=Vj(t);if(!t)return new Kj;t=t.rgb();return new Kj(t.r,t.g,t.b,t.opacity)}function Wj(t,e,n,i){return arguments.length===1?qj(t):new Kj(t,e,n,i==null?1:i)}function Kj(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}kj(Kj,Wj,Sj(Cj,{brighter:function t(e){e=e==null?Aj:Math.pow(Aj,e);return new Kj(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function t(e){e=e==null?Ej:Math.pow(Ej,e);return new Kj(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function t(){return this},displayable:function t(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Yj,formatHex:Yj,formatRgb:Xj,toString:Xj}));function Yj(){return"#"+$j(this.r)+$j(this.g)+$j(this.b)}function Xj(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}function $j(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function Zj(t,e,n,i){if(i<=0)t=e=n=NaN;else if(n<=0||n>=1)t=e=NaN;else if(e<=0)t=NaN;return new tL(t,e,n,i)}function Jj(t){if(t instanceof tL)return new tL(t.h,t.s,t.l,t.opacity);if(!(t instanceof Cj))t=Vj(t);if(!t)return new tL;if(t instanceof tL)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,l=(a+r)/2;if(s){if(e===a)o=(n-i)/s+(n0&&l<1?0:o}return new tL(o,s,l,t.opacity)}function Qj(t,e,n,i){return arguments.length===1?Jj(t):new tL(t,e,n,i==null?1:i)}function tL(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}kj(tL,Qj,Sj(Cj,{brighter:function t(e){e=e==null?Aj:Math.pow(Aj,e);return new tL(this.h,this.s,this.l*e,this.opacity)},darker:function t(e){e=e==null?Ej:Math.pow(Ej,e);return new tL(this.h,this.s,this.l*e,this.opacity)},rgb:function t(){var e=this.h%360+(this.h<0)*360,n=isNaN(e)||isNaN(this.s)?0:this.s,i=this.l,r=i+(i<.5?i:1-i)*n,a=2*i-r;return new Kj(eL(e>=240?e-240:e+120,a,r),eL(e,a,r),eL(e<120?e+240:e-120,a,r),this.opacity)},displayable:function t(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function t(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(e===1?")":", "+e+")")}}));function eL(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}var nL=[].slice;var iL={};function rL(t){this._size=t;this._call=this._error=null;this._tasks=[];this._data=[];this._waiting=this._active=this._ended=this._start=0}rL.prototype=cL.prototype={constructor:rL,defer:function t(e){if(typeof e!=="function")throw new Error("invalid callback");if(this._call)throw new Error("defer after await");if(this._error!=null)return this;var n=nL.call(arguments,1);n.push(e);++this._waiting,this._tasks.push(n);aL(this);return this},abort:function t(){if(this._error==null)lL(this,new Error("abort"));return this},await:function t(n){if(typeof n!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=function(t,e){n.apply(null,[t].concat(e))};uL(this);return this},awaitAll:function t(e){if(typeof e!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=e;uL(this);return this}};function aL(e){if(!e._start){try{oL(e)}catch(t){if(e._tasks[e._ended+e._active-1])lL(e,t);else if(!e._data)throw t}}}function oL(t){while(t._start=t._waiting&&t._active=0){if(i=t._tasks[n]){t._tasks[n]=null;if(i.abort){try{i.abort()}catch(e){}}}}t._active=NaN;uL(t)}function uL(t){if(!t._active&&t._call){var e=t._data;t._data=undefined;t._call(t._error,e)}}function cL(t){if(t==null)t=Infinity;else if(!((t=+t)>=1))throw new Error("invalid concurrency");return new rL(t)}function hL(t){return function(){return t}}function fL(t,e,n){this.target=t;this.type=e;this.transform=n}function dL(t,e,n){this.k=t;this.x=e;this.y=n}dL.prototype={constructor:dL,scale:function t(e){return e===1?this:new dL(this.k*e,this.x,this.y)},translate:function t(e,n){return e===0&n===0?this:new dL(this.k,this.x+this.k*e,this.y+this.k*n)},apply:function t(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function t(e){return e*this.k+this.x},applyY:function t(e){return e*this.k+this.y},invert:function t(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function t(e){return(e-this.x)/this.k},invertY:function t(e){return(e-this.y)/this.k},rescaleX:function t(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function t(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function t(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var gL=new dL(1,0,0);pL.prototype=dL.prototype;function pL(t){while(!t.__zoom){if(!(t=t.parentNode))return gL}return t.__zoom}function vL(){ns.stopImmediatePropagation()}function mL(){ns.preventDefault();ns.stopImmediatePropagation()}function yL(){return!ns.ctrlKey&&!ns.button}function _L(){var t=this;if(t instanceof SVGElement){t=t.ownerSVGElement||t;if(t.hasAttribute("viewBox")){t=t.viewBox.baseVal;return[[t.x,t.y],[t.x+t.width,t.y+t.height]]}return[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}return[[0,0],[t.clientWidth,t.clientHeight]]}function bL(){return this.__zoom||gL}function wL(){return-ns.deltaY*(ns.deltaMode===1?.05:ns.deltaMode?1:.002)}function xL(){return navigator.maxTouchPoints||"ontouchstart"in this}function kL(t,e,n){var i=t.invertX(e[0][0])-n[0][0],r=t.invertX(e[1][0])-n[1][0],a=t.invertY(e[0][1])-n[0][1],o=t.invertY(e[1][1])-n[1][1];return t.translate(r>i?(i+r)/2:Math.min(0,i)||Math.max(0,r),o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o))}function SL(){var s=yL,h=_L,d=kL,a=wL,e=xL,o=[0,Infinity],g=[[-Infinity,-Infinity],[Infinity,Infinity]],l=250,f=Wi,n=Cs("start","zoom","end"),p,u,c=500,v=150,m=0;function y(t){t.property("__zoom",bL).on("wheel.zoom",r).on("mousedown.zoom",S).on("dblclick.zoom",C).filter(e).on("touchstart.zoom",E).on("touchmove.zoom",A).on("touchend.zoom touchcancel.zoom",M).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}y.transform=function(t,e,n){var i=t.selection?t.selection():t;i.property("__zoom",bL);if(t!==i){x(t,e,n)}else{i.interrupt().each(function(){k(this,arguments).start().zoom(null,typeof e==="function"?e.apply(this,arguments):e).end()})}};y.scaleBy=function(t,n,e){y.scaleTo(t,function(){var t=this.__zoom.k,e=typeof n==="function"?n.apply(this,arguments):n;return t*e},e)};y.scaleTo=function(t,a,o){y.transform(t,function(){var t=h.apply(this,arguments),e=this.__zoom,n=o==null?w(t):typeof o==="function"?o.apply(this,arguments):o,i=e.invert(n),r=typeof a==="function"?a.apply(this,arguments):a;return d(b(_(e,r),n,i),t,g)},o)};y.translateBy=function(t,e,n){y.transform(t,function(){return d(this.__zoom.translate(typeof e==="function"?e.apply(this,arguments):e,typeof n==="function"?n.apply(this,arguments):n),h.apply(this,arguments),g)})};y.translateTo=function(t,i,r,a){y.transform(t,function(){var t=h.apply(this,arguments),e=this.__zoom,n=a==null?w(t):typeof a==="function"?a.apply(this,arguments):a;return d(gL.translate(n[0],n[1]).scale(e.k).translate(typeof i==="function"?-i.apply(this,arguments):-i,typeof r==="function"?-r.apply(this,arguments):-r),t,g)},a)};function _(t,e){e=Math.max(o[0],Math.min(o[1],e));return e===t.k?t:new dL(e,t.x,t.y)}function b(t,e,n){var i=e[0]-n[0]*t.k,r=e[1]-n[1]*t.k;return i===t.x&&r===t.y?t:new dL(t.k,i,r)}function w(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function x(t,u,c){t.on("start.zoom",function(){k(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){k(this,arguments).end()}).tween("zoom",function(){var t=this,e=arguments,i=k(t,e),n=h.apply(t,e),r=c==null?w(n):typeof c==="function"?c.apply(t,e):c,a=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),o=t.__zoom,s=typeof u==="function"?u.apply(t,e):u,l=f(o.invert(r).concat(a/o.k),s.invert(r).concat(a/s.k));return function(t){if(t===1)t=s;else{var e=l(t),n=a/e[2];t=new dL(n,r[0]-e[0]*n,r[1]-e[1]*n)}i.zoom(null,t)}})}function k(t,e,n){return!n&&t.__zooming||new i(t,e)}function i(t,e){this.that=t;this.args=e;this.active=0;this.extent=h.apply(t,e);this.taps=0}i.prototype={start:function t(){if(++this.active===1){this.that.__zooming=this;this.emit("start")}return this},zoom:function t(e,n){if(this.mouse&&e!=="mouse")this.mouse[1]=n.invert(this.mouse[0]);if(this.touch0&&e!=="touch")this.touch0[1]=n.invert(this.touch0[0]);if(this.touch1&&e!=="touch")this.touch1[1]=n.invert(this.touch1[0]);this.that.__zoom=n;this.emit("zoom");return this},end:function t(){if(--this.active===0){delete this.that.__zooming;this.emit("end")}return this},emit:function t(e){cs(new fL(y,e,this.that.__zoom),n.apply,n,[e,this.that,this.args])}};function r(){if(!s.apply(this,arguments))return;var t=k(this,arguments),e=this.__zoom,n=Math.max(o[0],Math.min(o[1],e.k*Math.pow(2,a.apply(this,arguments)))),i=ws(this);if(t.wheel){if(t.mouse[0][0]!==i[0]||t.mouse[0][1]!==i[1]){t.mouse[1]=e.invert(t.mouse[0]=i)}clearTimeout(t.wheel)}else if(e.k===n)return;else{t.mouse=[i,e.invert(i)];hl(this);t.start()}mL();t.wheel=setTimeout(r,v);t.zoom("mouse",d(b(_(e,n),t.mouse[0],t.mouse[1]),t.extent,g));function r(){t.wheel=null;t.end()}}function S(){if(u||!s.apply(this,arguments))return;var n=k(this,arguments,true),t=ys(ns.view).on("mousemove.zoom",a,true).on("mouseup.zoom",o,true),e=ws(this),i=ns.clientX,r=ns.clientY;Yz(ns.view);vL();n.mouse=[e,this.__zoom.invert(e)];hl(this);n.start();function a(){mL();if(!n.moved){var t=ns.clientX-i,e=ns.clientY-r;n.moved=t*t+e*e>m}n.zoom("mouse",d(b(n.that.__zoom,n.mouse[0]=ws(n.that),n.mouse[1]),n.extent,g))}function o(){t.on("mousemove.zoom mouseup.zoom",null);Xz(ns.view,n.moved);mL();n.end()}}function C(){if(!s.apply(this,arguments))return;var t=this.__zoom,e=ws(this),n=t.invert(e),i=t.k*(ns.shiftKey?.5:2),r=d(b(_(t,i),e,n),h.apply(this,arguments),g);mL();if(l>0)ys(this).transition().duration(l).call(x,r,e);else ys(this).call(y.transform,r)}function E(){if(!s.apply(this,arguments))return;var t=ns.touches,e=t.length,n=k(this,arguments,ns.changedTouches.length===e),i,r,a,o;vL();for(r=0;rn.capacity)this.remove(n.linkedList.end.key);return this};t.update=function(t,e){if(this.has(t))this.set(t,e(this.get(t)));return this};t.remove=function(t){var e=this._LRUCacheState;var n=e.hash[t];if(!n)return this;if(n===e.linkedList.head)e.linkedList.head=n.p;if(n===e.linkedList.end)e.linkedList.end=n.n;s(n.n,n.p);delete e.hash[t];delete e.data[t];e.linkedList.length-=1;return this};t.removeAll=function(){this._LRUCacheState=new n(this._LRUCacheState.capacity);return this};t.info=function(){var t=this._LRUCacheState;return{capacity:t.capacity,length:t.linkedList.length}};t.keys=function(){var t=[];var e=this._LRUCacheState.linkedList.head;while(e){t.push(e.key);e=e.p}return t};t.has=function(t){return!!this._LRUCacheState.hash[t]};t.staleKey=function(){return this._LRUCacheState.linkedList.end&&this._LRUCacheState.linkedList.end.key};t.popStale=function(){var t=this.staleKey();if(!t)return null;var e=[t,this._LRUCacheState.data[t]];this.remove(t);return e};function n(t){this.capacity=t>0?+t:Number.MAX_SAFE_INTEGER||Number.MAX_VALUE;this.data=Object.create?Object.create(null):{};this.hash=Object.create?Object.create(null):{};this.linkedList=new i}function i(){this.length=0;this.head=null;this.end=null}function a(t){this.key=t;this.p=null;this.n=null}function o(t,e){if(e===t.head)return;if(!t.end){t.end=e}else if(t.end===e){t.end=e.n}s(e.n,e.p);s(e,t.head);t.head=e;t.head.n=null}function s(t,e){if(t===e)return;if(t)t.p=e;if(e)e.n=t}return e})});function RL(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){RL=function t(e){return j(e)}}else{RL=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return RL(t)}function TL(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function OL(t,e){for(var n=0;n0){var a=(n[e]-n[t-1])/(e-t+1);r=i[e]-i[t-1]-(e-t+1)*a*a}else r=i[e]-n[e]*n[e]/(e+1);if(r<0)return 0;return r}function uF(t,e,n,i,r,a,o){if(t>e)return;var s=Math.floor((t+e)/2);i[n][s]=i[n-1][s-1];r[n][s]=s;var l=n;if(t>n)l=Math.max(l,r[n][t-1]||0);l=Math.max(l,r[n-1][s]||0);var u=s-1;if(e=l;--c){var h=lF(c,s,a,o);if(h+i[n-1][l-1]>=i[n][s])break;var f=lF(l,s,a,o);var d=f+i[n-1][l-1];if(dt.length){throw new Error("Cannot generate more classes than there are data values")}var n=aF(t);var i=oF(n);if(i===1){return[n]}var r=sF(e,n.length),a=sF(e,n.length);cF(n,a,r);var o=r[0]?r[0].length-1:0;var s=[];for(var l=r.length-1;l>=0;l--){var u=r[l][o];s[l]=n.slice(u,o+1);if(l>0)o=u-1}return s}function fF(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){fF=function t(e){return j(e)}}else{fF=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return fF(t)}function dF(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function gF(t,e){for(var n=0;nl){var u=1,c=[];var d=Ht(this._lineData.map(function(t){return t.words.length}));this._wrapLines=function(){var e=this;u++;if(u>d)return;var o=u===1?this._lineData.slice():this._lineData.filter(function(t){return t.width+t.shapeWidth+e._padding*(t.width?2:1)>l&&t.words.length>=u}).sort(function(t,e){return e.sentence.length-t.sentence.length});if(o.length&&f>o[0].height*u){var s=false;var t=function t(e){var n=o[e];var i=n.og.height*u,r=n.og.width*(1.5*(1/u));var a=gE().fontFamily(n.f).fontSize(n.s).lineHeight(n.lh).width(r).height(i)(n.sentence);if(!a.truncated){n.width=Math.ceil(Ht(a.lines.map(function(t){return jC(t,{"font-family":n.f,"font-size":n.s})})))+n.s;n.height=a.lines.length*(n.lh+1)}else{s=true;return"break"}};for(var n=0;nf){c=[];break}if(r>l){c=[];this._wrapLines();break}else if(e+rf){o=Ut(this._lineData.map(function(t){return t.shapeWidth+h._padding}))-this._padding;for(var s=0;sthis._midpoint;var h=u&&c;var f=this._color,d,g;if(f&&!(f instanceof Array)){f=It(0,this._buckets,1).map(function(t){return ck(f,(t+1)/n._buckets)}).reverse()}if(this._scale==="jenks"){var p=this._data.map(this._value).filter(function(t){return t!==null&&typeof t==="number"});var v=Gt([f?f.length:this._buckets,p.length]);var m=hF(p,v);g=Vt(m.map(function(t,e){return e===m.length-1?[t[0],t[t.length-1]]:[t[0]]}));var y=new Set(g);if(g.length!==y.size){d=Array.from(y)}if(!f){if(h){f=[this._colorMin,this._colorMid,this._colorMax];var _=g.slice(0,v).filter(function(t,e){return tn._midpoint});var w=g.slice(0,v).filter(function(t,e){return t>n._midpoint&&g[e+1]>n._midpoint});var x=_.map(function(t,e){return!e?f[0]:ck(f[0],e/_.length)});var k=b.map(function(){return f[1]});var S=w.map(function(t,e){return e===w.length-1?f[2]:ck(f[2],1-(e+1)/w.length)});f=x.concat(k).concat(S)}else{f=It(0,this._buckets,1).map(function(t){return ck(n._colorMax,t/n._buckets)}).reverse()}}if(p.length<=v){f=f.slice(v-p.length)}this._colorScale=Qr().domain(g).range(["black"].concat(f).concat(f[f.length-1]))}else{var C;if(h&&!f){var E=Math.floor(this._buckets/2);var A=It(0,E,1).map(function(t){return!t?n._colorMin:ck(n._colorMin,t/E)});var M=(this._buckets%2?[0]:[]).map(function(){return n._colorMid});var R=It(0,E,1).map(function(t){return!t?n._colorMax:ck(n._colorMax,t/E)}).reverse();f=A.concat(M).concat(R);var T=(f.length-1)/2;C=[l[0],this._midpoint,l[1]];C=It(l[0],this._midpoint,-(l[0]-this._midpoint)/T).concat(It(this._midpoint,l[1],(l[1]-this._midpoint)/T)).concat([l[1]])}else{if(!f){if(this._scale==="buckets"){f=It(0,this._buckets,1).map(function(t){return ck(u?n._colorMin:n._colorMax,t/n._buckets)});if(c)f=f.reverse()}else{f=u?[this._colorMin,ck(this._colorMin,.8)]:[ck(this._colorMax,.8),this._colorMax]}}var O=(l[1]-l[0])/(f.length-1);C=It(l[0],l[1]+O/2,O)}if(this._scale==="buckets"){g=C.concat([C[C.length-1]])}this._colorScale=Mr().domain(C).range(f)}if(this._bucketAxis||!["buckets","jenks"].includes(this._scale)){var B;var P=xu({domain:i?l:l.reverse(),duration:this._duration,height:this._height,labels:d||g,orient:this._orient,padding:this._padding,ticks:g,width:this._width},this._axisConfig);this._axisTest.select(Tw("g.d3plus-ColorScale-axisTest",{enter:{opacity:0},parent:this._group}).node()).config(P).duration(0).render();var N=this._axisTest.outerBounds();this._outerBounds[a]=this["_".concat(a)]-this._padding*2;this._outerBounds[r]=N[r]+this._size;this._outerBounds[o]=this._padding;this._outerBounds[s]=this._padding;if(this._align==="middle")this._outerBounds[s]=(this["_".concat(r)]-this._outerBounds[r])/2;else if(this._align==="end")this._outerBounds[s]=this["_".concat(r)]-this._padding-this._outerBounds[r];var D=this._outerBounds[s]+(["bottom","right"].includes(this._orient)?this._size:0)-(P.padding||this._axisClass.padding());this._axisClass.select(Tw("g.d3plus-ColorScale-axis",{parent:this._group,update:{transform:"translate(".concat(i?0:D,", ").concat(i?D:0,")")}}).node()).config(P).align("start").render();var z=this._axisTest._getPosition.bind(this._axisTest);var j=this._axisTest._getRange();var L=this._group.selectAll("defs").data([0]);var F=L.enter().append("defs");F.append("linearGradient").attr("id","gradient-".concat(this._uuid));L=F.merge(L);L.select("linearGradient").attr("".concat(o,"1"),i?"0%":"100%").attr("".concat(o,"2"),i?"100%":"0%").attr("".concat(s,"1"),"0%").attr("".concat(s,"2"),"0%");var I=L.select("linearGradient").selectAll("stop").data(f);var H=this._colorScale.domain();var V=Mr().domain([H[0],H[H.length-1]]).range([0,100]);I.enter().append("stop").merge(I).attr("offset",function(t,e){return"".concat(V(H[e]),"%")}).attr("stop-color",String);var G=function t(e,n){var i=Math.abs(z(g[n+1])-z(e));return i||2};this._rectClass.data(g?g.slice(0,g.length-1):[0]).id(function(t,e){return e}).select(Tw("g.d3plus-ColorScale-Rect",{parent:this._group}).node()).config((B={duration:this._duration,fill:g?function(t){return n._colorScale(t)}:"url(#gradient-".concat(this._uuid,")")},kF(B,o,g?function(t,e){return z(t)+G(t,e)/2-(["left","right"].includes(n._orient)?G(t,e):0)}:j[0]+(j[1]-j[0])/2),kF(B,s,this._outerBounds[s]+(["top","left"].includes(this._orient)?N[r]:0)+this._size/2),kF(B,a,g?G:j[1]-j[0]),kF(B,r,this._size),B)).config(this._rectConfig).render()}else{var U=this._axisConfig.tickFormat?this._axisConfig.tickFormat:function(t){return t};var q=g.reduce(function(t,e,n){if(n!==g.length-1){var i=g[n+1];t.push({color:f[n],id:e===i?"".concat(U(e),"+"):"".concat(U(e)," - ").concat(U(i))})}return t},[]);var W=xu({align:i?"center":{start:"left",middle:"center",end:"right"}[this._align],direction:i?"row":"column",duration:this._duration,height:this._height,padding:this._padding,shapeConfig:xu({duration:this._duration},this._axisConfig.shapeConfig||{}),title:this._axisConfig.title,titleConfig:this._axisConfig.titleConfig||{},width:this._width,verticalAlign:i?{start:"top",middle:"middle",end:"bottom"}[this._align]:"middle"},this._legendConfig);this._legendClass.data(q).select(Tw("g.d3plus-ColorScale-legend",{parent:this._group}).node()).config(W).render();this._outerBounds=this._legendClass.outerBounds()}if(e)setTimeout(e,this._duration+100);return this}},{key:"axisConfig",value:function t(e){return arguments.length?(this._axisConfig=xu(this._axisConfig,e),this):this._axisConfig}},{key:"align",value:function t(e){return arguments.length?(this._align=e,this):this._align}},{key:"buckets",value:function t(e){return arguments.length?(this._buckets=e,this):this._buckets}},{key:"bucketAxis",value:function t(e){return arguments.length?(this._bucketAxis=e,this):this._bucketAxis}},{key:"color",value:function t(e){return arguments.length?(this._color=e,this):this._color}},{key:"colorMax",value:function t(e){return arguments.length?(this._colorMax=e,this):this._colorMax}},{key:"colorMid",value:function t(e){return arguments.length?(this._colorMid=e,this):this._colorMid}},{key:"colorMin",value:function t(e){return arguments.length?(this._colorMin=e,this):this._colorMin}},{key:"data",value:function t(e){return arguments.length?(this._data=e,this):this._data}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"height",value:function t(e){return arguments.length?(this._height=e,this):this._height}},{key:"legendConfig",value:function t(e){return arguments.length?(this._legendConfig=xu(this._legendConfig,e),this):this._legendConfig}},{key:"midpoint",value:function t(e){return arguments.length?(this._midpoint=e,this):this._midpoint}},{key:"orient",value:function t(e){return arguments.length?(this._orient=e,this):this._orient}},{key:"outerBounds",value:function t(){return this._outerBounds}},{key:"padding",value:function t(e){return arguments.length?(this._padding=e,this):this._padding}},{key:"rectConfig",value:function t(e){return arguments.length?(this._rectConfig=xu(this._rectConfig,e),this):this._rectConfig}},{key:"scale",value:function t(e){return arguments.length?(this._scale=e,this):this._scale}},{key:"select",value:function t(e){return arguments.length?(this._select=ys(e),this):this._select}},{key:"size",value:function t(e){return arguments.length?(this._size=e,this):this._size}},{key:"value",value:function t(e){return arguments.length?(this._value=typeof e==="function"?e:Rw(e),this):this._value}},{key:"width",value:function t(e){return arguments.length?(this._width=e,this):this._width}}]);return e}(Cw);function PF(t){return function(){return t}}function NF(t,e,n){this.target=t;this.type=e;this.selection=n}function DF(){ns.stopImmediatePropagation()}function zF(){ns.preventDefault();ns.stopImmediatePropagation()}var jF={name:"drag"},LF={name:"space"},FF={name:"handle"},IF={name:"center"};var HF={name:"x",handles:["e","w"].map(YF),input:function t(e,n){return e&&[[e[0],n[0][1]],[e[1],n[1][1]]]},output:function t(e){return e&&[e[0][0],e[1][0]]}};var VF={name:"y",handles:["n","s"].map(YF),input:function t(e,n){return e&&[[n[0][0],e[0]],[n[1][0],e[1]]]},output:function t(e){return e&&[e[0][1],e[1][1]]}};var GF={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"};var UF={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"};var qF={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"};var WF={overlay:+1,selection:+1,n:null,e:+1,s:null,w:-1,nw:-1,ne:+1,se:+1,sw:-1};var KF={overlay:+1,selection:+1,n:-1,e:null,s:+1,w:null,nw:-1,ne:-1,se:+1,sw:+1};function YF(t){return{type:t}}function XF(){return!ns.button}function $F(){var t=this.ownerSVGElement||this;return[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function ZF(t){while(!t.__brush){if(!(t=t.parentNode))return}return t.__brush}function JF(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function QF(){return tI(HF)}function tI(j){var e=$F,L=XF,n=Cs(r,"start","brush","end"),i=6,F;function r(t){var e=t.property("__brush",s).selectAll(".overlay").data([YF("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",GF.overlay).merge(e).each(function(){var t=ZF(this).extent;ys(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])});t.selectAll(".selection").data([YF("selection")]).enter().append("rect").attr("class","selection").attr("cursor",GF.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var n=t.selectAll(".handle").data(j.handles,function(t){return t.type});n.exit().remove();n.enter().append("rect").attr("class",function(t){return"handle handle--"+t.type}).attr("cursor",function(t){return GF[t.type]});t.each(I).attr("fill","none").attr("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush touchstart.brush",o)}r.move=function(t,s){if(t.selection){t.on("start.brush",function(){H(this,arguments).beforestart().start()}).on("interrupt.brush end.brush",function(){H(this,arguments).end()}).tween("brush",function(){var e=this,n=e.__brush,i=H(e,arguments),t=n.selection,r=j.input(typeof s==="function"?s.apply(this,arguments):s,n.extent),a=Ci(t,r);function o(t){n.selection=t===1&&JF(r)?null:a(t);I.call(e);i.brush()}return t&&r?o:o(1)})}else{t.each(function(){var t=this,e=arguments,n=t.__brush,i=j.input(typeof s==="function"?s.apply(t,e):s,n.extent),r=H(t,e).beforestart();hl(t);n.selection=i==null||JF(i)?null:i;I.call(t);r.start().brush().end()})}};function I(){var t=ys(this),e=ZF(this).selection;if(e){t.selectAll(".selection").style("display",null).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1]);t.selectAll(".handle").style("display",null).attr("x",function(t){return t.type[t.type.length-1]==="e"?e[1][0]-i/2:e[0][0]-i/2}).attr("y",function(t){return t.type[0]==="s"?e[1][1]-i/2:e[0][1]-i/2}).attr("width",function(t){return t.type==="n"||t.type==="s"?e[1][0]-e[0][0]+i:i}).attr("height",function(t){return t.type==="e"||t.type==="w"?e[1][1]-e[0][1]+i:i})}else{t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}}function H(t,e){return t.__brush.emitter||new a(t,e)}function a(t,e){this.that=t;this.args=e;this.state=t.__brush;this.active=0}a.prototype={beforestart:function t(){if(++this.active===1)this.state.emitter=this,this.starting=true;return this},start:function t(){if(this.starting)this.starting=false,this.emit("start");return this},brush:function t(){this.emit("brush");return this},end:function t(){if(--this.active===0)delete this.state.emitter,this.emit("end");return this},emit:function t(e){cs(new NF(r,e,j.output(this.state.selection)),n.apply,n,[e,this.that,this.args])}};function o(){if(ns.touches){if(ns.changedTouches.lengthMath.abs(t[1]-A[1]))C=true;else S=true}A=t;x=true;zF();P()}function P(){var t;b=A[0]-E[0];w=A[1]-E[1];switch(i){case LF:case jF:{if(r)b=Math.max(l-u,Math.min(g-p,b)),c=u+b,v=p+b;if(a)w=Math.max(h-f,Math.min(m-y,w)),d=f+w,_=y+w;break}case FF:{if(r<0)b=Math.max(l-u,Math.min(g-u,b)),c=u+b,v=p;else if(r>0)b=Math.max(l-p,Math.min(g-p,b)),c=u,v=p+b;if(a<0)w=Math.max(h-f,Math.min(m-f,w)),d=f+w,_=y;else if(a>0)w=Math.max(h-y,Math.min(m-y,w)),d=f,_=y+w;break}case IF:{if(r)c=Math.max(l,Math.min(g,u-b*r)),v=Math.max(l,Math.min(g,p+b*r));if(a)d=Math.max(h,Math.min(m,f-w*a)),_=Math.max(h,Math.min(m,y+w*a));break}}if(v0)u=c-b;if(a<0)y=_-w;else if(a>0)f=d-w;i=LF;T.attr("cursor",GF.selection);P()}break}default:return}zF()}function z(){switch(ns.keyCode){case 16:{if(k){S=C=k=false;P()}break}case 18:{if(i===IF){if(r<0)p=v;else if(r>0)u=c;if(a<0)y=_;else if(a>0)f=d;i=FF;P()}break}case 32:{if(i===LF){if(ns.altKey){if(r)p=v-b*r,u=c+b*r;if(a)y=_-w*a,f=d+w*a;i=IF}else{if(r<0)p=v;else if(r>0)u=c;if(a<0)y=_;else if(a>0)f=d;i=FF}T.attr("cursor",GF[n]);P()}break}default:return}zF()}}function s(){var t=this.__brush||{selection:null};t.extent=e.apply(this,arguments);t.dim=j;return t}r.extent=function(t){return arguments.length?(e=typeof t==="function"?t:PF([[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]]),r):e};r.filter=function(t){return arguments.length?(L=typeof t==="function"?t:PF(!!t),r):L};r.handleSize=function(t){return arguments.length?(i=+t,r):i};r.on=function(){var t=n.on.apply(n,arguments);return t===n?r:t};return r}function eI(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){eI=function t(e){return j(e)}}else{eI=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return eI(t)}function nI(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function iI(t,e){for(var n=0;n=0){return 1}}return 0}();function pI(t){var e=false;return function(){if(e){return}e=true;window.Promise.resolve().then(function(){e=false;t()})}}function vI(t){var e=false;return function(){if(!e){e=true;setTimeout(function(){e=false;t()},gI)}}}var mI=dI&&window.Promise;var yI=mI?pI:vI;function _I(t){var e={};return t&&e.toString.call(t)==="[object Function]"}function bI(t,e){if(t.nodeType!==1){return[]}var n=t.ownerDocument.defaultView;var i=n.getComputedStyle(t,null);return e?i[e]:i}function wI(t){if(t.nodeName==="HTML"){return t}return t.parentNode||t.host}function xI(t){if(!t){return document.body}switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=bI(t),n=e.overflow,i=e.overflowX,r=e.overflowY;if(/(auto|scroll|overlay)/.test(n+r+i)){return t}return xI(wI(t))}function kI(t){return t&&t.referenceNode?t.referenceNode:t}var SI=dI&&!!(window.MSInputMethodContext&&document.documentMode);var CI=dI&&/MSIE 10/.test(navigator.userAgent);function EI(t){if(t===11){return SI}if(t===10){return CI}return SI||CI}function AI(t){if(!t){return document.documentElement}var e=EI(10)?document.body:null;var n=t.offsetParent||null;while(n===e&&t.nextElementSibling){n=(t=t.nextElementSibling).offsetParent}var i=n&&n.nodeName;if(!i||i==="BODY"||i==="HTML"){return t?t.ownerDocument.documentElement:document.documentElement}if(["TH","TD","TABLE"].indexOf(n.nodeName)!==-1&&bI(n,"position")==="static"){return AI(n)}return n}function MI(t){var e=t.nodeName;if(e==="BODY"){return false}return e==="HTML"||AI(t.firstElementChild)===t}function RI(t){if(t.parentNode!==null){return RI(t.parentNode)}return t}function TI(t,e){if(!t||!t.nodeType||!e||!e.nodeType){return document.documentElement}var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING;var i=n?t:e;var r=n?e:t;var a=document.createRange();a.setStart(i,0);a.setEnd(r,0);var o=a.commonAncestorContainer;if(t!==o&&e!==o||i.contains(r)){if(MI(o)){return o}return AI(o)}var s=RI(t);if(s.host){return TI(s.host,e)}else{return TI(t,RI(e).host)}}function OI(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"top";var n=e==="top"?"scrollTop":"scrollLeft";var i=t.nodeName;if(i==="BODY"||i==="HTML"){var r=t.ownerDocument.documentElement;var a=t.ownerDocument.scrollingElement||r;return a[n]}return t[n]}function BI(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var i=OI(e,"top");var r=OI(e,"left");var a=n?-1:1;t.top+=i*a;t.bottom+=i*a;t.left+=r*a;t.right+=r*a;return t}function PI(t,e){var n=e==="x"?"Left":"Top";var i=n==="Left"?"Right":"Bottom";return parseFloat(t["border"+n+"Width"],10)+parseFloat(t["border"+i+"Width"],10)}function NI(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],EI(10)?parseInt(n["offset"+t])+parseInt(i["margin"+(t==="Height"?"Top":"Left")])+parseInt(i["margin"+(t==="Height"?"Bottom":"Right")]):0)}function DI(t){var e=t.body;var n=t.documentElement;var i=EI(10)&&getComputedStyle(n);return{height:NI("Height",e,n,i),width:NI("Width",e,n,i)}}var zI=function t(e,n){if(!(e instanceof n)){throw new TypeError("Cannot call a class as a function")}};var jI=function(){function i(t,e){for(var n=0;n2&&arguments[2]!==undefined?arguments[2]:false;var i=EI(10);var r=e.nodeName==="HTML";var a=HI(t);var o=HI(e);var s=xI(t);var l=bI(e);var u=parseFloat(l.borderTopWidth,10);var c=parseFloat(l.borderLeftWidth,10);if(n&&r){o.top=Math.max(o.top,0);o.left=Math.max(o.left,0)}var h=II({top:a.top-o.top-u,left:a.left-o.left-c,width:a.width,height:a.height});h.marginTop=0;h.marginLeft=0;if(!i&&r){var f=parseFloat(l.marginTop,10);var d=parseFloat(l.marginLeft,10);h.top-=u-f;h.bottom-=u-f;h.left-=c-d;h.right-=c-d;h.marginTop=f;h.marginLeft=d}if(i&&!n?e.contains(s):e===s&&s.nodeName!=="BODY"){h=BI(h,e)}return h}function GI(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=t.ownerDocument.documentElement;var i=VI(t,n);var r=Math.max(n.clientWidth,window.innerWidth||0);var a=Math.max(n.clientHeight,window.innerHeight||0);var o=!e?OI(n):0;var s=!e?OI(n,"left"):0;var l={top:o-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:r,height:a};return II(l)}function UI(t){var e=t.nodeName;if(e==="BODY"||e==="HTML"){return false}if(bI(t,"position")==="fixed"){return true}var n=wI(t);if(!n){return false}return UI(n)}function qI(t){if(!t||!t.parentElement||EI()){return document.documentElement}var e=t.parentElement;while(e&&bI(e,"transform")==="none"){e=e.parentElement}return e||document.documentElement}function WI(t,e,n,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var a={top:0,left:0};var o=r?qI(t):TI(t,kI(e));if(i==="viewport"){a=GI(o,r)}else{var s=void 0;if(i==="scrollParent"){s=xI(wI(e));if(s.nodeName==="BODY"){s=t.ownerDocument.documentElement}}else if(i==="window"){s=t.ownerDocument.documentElement}else{s=i}var l=VI(s,o,r);if(s.nodeName==="HTML"&&!UI(o)){var u=DI(t.ownerDocument),c=u.height,h=u.width;a.top+=l.top-l.marginTop;a.bottom=c+l.top;a.left+=l.left-l.marginLeft;a.right=h+l.left}else{a=l}}n=n||0;var f=typeof n==="number";a.left+=f?n:n.left||0;a.top+=f?n:n.top||0;a.right-=f?n:n.right||0;a.bottom-=f?n:n.bottom||0;return a}function KI(t){var e=t.width,n=t.height;return e*n}function YI(t,e,i,n,r){var a=arguments.length>5&&arguments[5]!==undefined?arguments[5]:0;if(t.indexOf("auto")===-1){return t}var o=WI(i,n,a,r);var s={top:{width:o.width,height:e.top-o.top},right:{width:o.right-e.right,height:o.height},bottom:{width:o.width,height:o.bottom-e.bottom},left:{width:e.left-o.left,height:o.height}};var l=Object.keys(s).map(function(t){return FI({key:t},s[t],{area:KI(s[t])})}).sort(function(t,e){return e.area-t.area});var u=l.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight});var c=u.length>0?u[0].key:l[0].key;var h=t.split("-")[1];return c+(h?"-"+h:"")}function XI(t,e,n){var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var r=i?qI(e):TI(e,kI(n));return VI(n,r,i)}function $I(t){var e=t.ownerDocument.defaultView;var n=e.getComputedStyle(t);var i=parseFloat(n.marginTop||0)+parseFloat(n.marginBottom||0);var r=parseFloat(n.marginLeft||0)+parseFloat(n.marginRight||0);var a={width:t.offsetWidth+r,height:t.offsetHeight+i};return a}function ZI(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function JI(t,e,n){n=n.split("-")[0];var i=$I(t);var r={width:i.width,height:i.height};var a=["right","left"].indexOf(n)!==-1;var o=a?"top":"left";var s=a?"left":"top";var l=a?"height":"width";var u=!a?"height":"width";r[o]=e[o]+e[l]/2-i[l]/2;if(n===s){r[s]=e[s]-i[u]}else{r[s]=e[ZI(s)]}return r}function QI(t,e){if(Array.prototype.find){return t.find(e)}return t.filter(e)[0]}function tH(t,e,n){if(Array.prototype.findIndex){return t.findIndex(function(t){return t[e]===n})}var i=QI(t,function(t){return t[e]===n});return t.indexOf(i)}function eH(t,n,e){var i=e===undefined?t:t.slice(0,tH(t,"name",e));i.forEach(function(t){if(t["function"]){console.warn("`modifier.function` is deprecated, use `modifier.fn`!")}var e=t["function"]||t.fn;if(t.enabled&&_I(e)){n.offsets.popper=II(n.offsets.popper);n.offsets.reference=II(n.offsets.reference);n=e(n,t)}});return n}function nH(){if(this.state.isDestroyed){return}var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:false,offsets:{}};t.offsets.reference=XI(this.state,this.popper,this.reference,this.options.positionFixed);t.placement=YI(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding);t.originalPlacement=t.placement;t.positionFixed=this.options.positionFixed;t.offsets.popper=JI(this.popper,t.offsets.reference,t.placement);t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute";t=eH(this.modifiers,t);if(!this.state.isCreated){this.state.isCreated=true;this.options.onCreate(t)}else{this.options.onUpdate(t)}}function iH(t,i){return t.some(function(t){var e=t.name,n=t.enabled;return n&&e===i})}function rH(t){var e=[false,"ms","Webkit","Moz","O"];var n=t.charAt(0).toUpperCase()+t.slice(1);for(var i=0;io[d]){t.offsets.popper[h]+=s[h]+g-o[d]}t.offsets.popper=II(t.offsets.popper);var p=s[h]+s[u]/2-g/2;var v=bI(t.instance.popper);var m=parseFloat(v["margin"+c],10);var y=parseFloat(v["border"+c+"Width"],10);var _=p-t.offsets.popper[h]-m-y;_=Math.max(Math.min(o[u]-g,_),0);t.arrowElement=i;t.offsets.arrow=(n={},LI(n,h,Math.round(_)),LI(n,f,""),n);return t}function xH(t){if(t==="end"){return"start"}else if(t==="start"){return"end"}return t}var kH=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"];var SH=kH.slice(3);function CH(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=SH.indexOf(t);var i=SH.slice(n+1).concat(SH.slice(0,n));return e?i.reverse():i}var EH={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function AH(p,v){if(iH(p.instance.modifiers,"inner")){return p}if(p.flipped&&p.placement===p.originalPlacement){return p}var m=WI(p.instance.popper,p.instance.reference,v.padding,v.boundariesElement,p.positionFixed);var y=p.placement.split("-")[0];var _=ZI(y);var b=p.placement.split("-")[1]||"";var w=[];switch(v.behavior){case EH.FLIP:w=[y,_];break;case EH.CLOCKWISE:w=CH(y);break;case EH.COUNTERCLOCKWISE:w=CH(y,true);break;default:w=v.behavior}w.forEach(function(t,e){if(y!==t||w.length===e+1){return p}y=p.placement.split("-")[0];_=ZI(y);var n=p.offsets.popper;var i=p.offsets.reference;var r=Math.floor;var a=y==="left"&&r(n.right)>r(i.left)||y==="right"&&r(n.left)r(i.top)||y==="bottom"&&r(n.top)r(m.right);var l=r(n.top)r(m.bottom);var c=y==="left"&&o||y==="right"&&s||y==="top"&&l||y==="bottom"&&u;var h=["top","bottom"].indexOf(y)!==-1;var f=!!v.flipVariations&&(h&&b==="start"&&o||h&&b==="end"&&s||!h&&b==="start"&&l||!h&&b==="end"&&u);var d=!!v.flipVariationsByContent&&(h&&b==="start"&&s||h&&b==="end"&&o||!h&&b==="start"&&u||!h&&b==="end"&&l);var g=f||d;if(a||c||g){p.flipped=true;if(a||c){y=w[e+1]}if(g){b=xH(b)}p.placement=y+(b?"-"+b:"");p.offsets.popper=FI({},p.offsets.popper,JI(p.instance.popper,p.offsets.reference,p.placement));p=eH(p.instance.modifiers,p,"flip")}});return p}function MH(t){var e=t.offsets,n=e.popper,i=e.reference;var r=t.placement.split("-")[0];var a=Math.floor;var o=["top","bottom"].indexOf(r)!==-1;var s=o?"right":"bottom";var l=o?"left":"top";var u=o?"width":"height";if(n[s]a(i[s])){t.offsets.popper[l]=a(i[s])}return t}function RH(t,e,n,i){var r=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);var a=+r[1];var o=r[2];if(!a){return t}if(o.indexOf("%")===0){var s=void 0;switch(o){case"%p":s=n;break;case"%":case"%r":default:s=i}var l=II(s);return l[e]/100*a}else if(o==="vh"||o==="vw"){var u=void 0;if(o==="vh"){u=Math.max(document.documentElement.clientHeight,window.innerHeight||0)}else{u=Math.max(document.documentElement.clientWidth,window.innerWidth||0)}return u/100*a}else{return a}}function TH(t,r,a,e){var o=[0,0];var s=["right","left"].indexOf(e)!==-1;var n=t.split(/(\+|\-)/).map(function(t){return t.trim()});var i=n.indexOf(QI(n,function(t){return t.search(/,|\s/)!==-1}));if(n[i]&&n[i].indexOf(",")===-1){console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.")}var l=/\s*,\s*|\s+/;var u=i!==-1?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];u=u.map(function(t,e){var n=(e===1?!s:s)?"height":"width";var i=false;return t.reduce(function(t,e){if(t[t.length-1]===""&&["+","-"].indexOf(e)!==-1){t[t.length-1]=e;i=true;return t}else if(i){t[t.length-1]+=e;i=false;return t}else{return t.concat(e)}},[]).map(function(t){return RH(t,n,r,a)})});u.forEach(function(n,i){n.forEach(function(t,e){if(fH(t)){o[i]+=t*(n[e-1]==="-"?-1:1)}})});return o}function OH(t,e){var n=e.offset;var i=t.placement,r=t.offsets,a=r.popper,o=r.reference;var s=i.split("-")[0];var l=void 0;if(fH(+n)){l=[+n,0]}else{l=TH(n,a,o,s)}if(s==="left"){a.top+=l[0];a.left-=l[1]}else if(s==="right"){a.top+=l[0];a.left+=l[1]}else if(s==="top"){a.left+=l[0];a.top-=l[1]}else if(s==="bottom"){a.left+=l[0];a.top+=l[1]}t.popper=a;return t}function BH(t,r){var e=r.boundariesElement||AI(t.instance.popper);if(t.instance.reference===e){e=AI(e)}var n=rH("transform");var i=t.instance.popper.style;var a=i.top,o=i.left,s=i[n];i.top="";i.left="";i[n]="";var l=WI(t.instance.popper,t.instance.reference,r.padding,e,t.positionFixed);i.top=a;i.left=o;i[n]=s;r.boundaries=l;var u=r.priority;var c=t.offsets.popper;var h={primary:function t(e){var n=c[e];if(c[e]l[e]&&!r.escapeWithReference){i=Math.min(c[n],l[e]-(e==="right"?c.width:c.height))}return LI({},n,i)}};u.forEach(function(t){var e=["left","top"].indexOf(t)!==-1?"primary":"secondary";c=FI({},c,h[e](t))});t.offsets.popper=c;return t}function PH(t){var e=t.placement;var n=e.split("-")[0];var i=e.split("-")[1];if(i){var r=t.offsets,a=r.reference,o=r.popper;var s=["bottom","top"].indexOf(n)!==-1;var l=s?"left":"top";var u=s?"width":"height";var c={start:LI({},l,a[l]),end:LI({},l,a[l]+a[u]-o[u])};t.offsets.popper=FI({},o,c[i])}return t}function NH(t){if(!bH(t.instance.modifiers,"hide","preventOverflow")){return t}var e=t.offsets.reference;var n=QI(t.instance.modifiers,function(t){return t.name==="preventOverflow"}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&arguments[2]!==undefined?arguments[2]:{};zI(this,a);this.scheduleUpdate=function(){return requestAnimationFrame(n.update)};this.update=yI(this.update.bind(this));this.options=FI({},a.Defaults,i);this.state={isDestroyed:false,isCreated:false,scrollParents:[]};this.reference=t&&t.jquery?t[0]:t;this.popper=e&&e.jquery?e[0]:e;this.options.modifiers={};Object.keys(FI({},a.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=FI({},a.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})});this.modifiers=Object.keys(this.options.modifiers).map(function(t){return FI({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order});this.modifiers.forEach(function(t){if(t.enabled&&_I(t.onLoad)){t.onLoad(n.reference,n.popper,n.options,t,n.state)}});this.update();var r=this.options.eventsEnabled;if(r){this.enableEventListeners()}this.state.eventsEnabled=r}jI(a,[{key:"update",value:function t(){return nH.call(this)}},{key:"destroy",value:function t(){return aH.call(this)}},{key:"enableEventListeners",value:function t(){return uH.call(this)}},{key:"disableEventListeners",value:function t(){return hH.call(this)}}]);return a}();LH.Utils=(typeof window!=="undefined"?window:global).PopperUtils;LH.placements=kH;LH.Defaults=jH;function FH(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){FH=function t(e){return j(e)}}else{FH=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return FH(t)}function IH(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function HH(t,e){for(var n=0;n0&&arguments[0]!==undefined?arguments[0]:{},n=e.duration,i=n===void 0?600:n,r=e.callback;this.mask.call(this.exit.bind(this),i);this.elem.call(this.exit.bind(this),i);if(r)setTimeout(r,i+100);this._isVisible=false;return this}},{key:"render",value:function t(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.callback,i=e.container,r=i===void 0?"body":i,a=e.duration,o=a===void 0?600:a,s=e.html,l=s===void 0?"Please Wait":s,u=e.mask,c=u===void 0?"rgba(0, 0, 0, 0.05)":u,h=e.style,f=h===void 0?{}:h;var d=ys(r).style("position","relative");this.mask=d.selectAll("div.d3plus-Mask").data(c?[c]:[]);this.mask=this.mask.enter().append("div").attr("class","d3plus-Mask").style("opacity",1).merge(this.mask);this.mask.exit().call(this.exit.bind(this),o);Dw(this.mask,{"background-color":String,bottom:"0px",left:"0px",position:"absolute",right:"0px",top:"0px"});this.elem=d.selectAll("div.d3plus-Message").data([l]);this.elem=this.elem.enter().append("div").attr("class","d3plus-Message").style("opacity",1).merge(this.elem).html(String);Dw(this.elem,f);if(n)setTimeout(n,100);this._isVisible=true;return this}}]);return t}();function QH(){var t=this._history.length;var e=Tw("g.d3plus-viz-back",{parent:this._select,transition:this._transition,update:{transform:"translate(".concat(this._margin.left,", ").concat(this._margin.top,")")}}).node();this._backClass.data(t?[{text:"← ".concat(this._translate("Back")),x:0,y:0}]:[]).select(e).config(this._backConfig).render();this._margin.top+=t?this._backClass.fontSize()()+this._backClass.padding()()*2:0}function tV(){var i=this;var t=this._data;var e=this._colorScalePosition||"bottom";var n=["top","bottom"].includes(e);var r=this._colorScalePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var a=this._width-(this._margin.left+this._margin.right+r.left+r.right);var o=n?Gt([this._colorScaleMaxSize,a]):this._width-(this._margin.left+this._margin.right);var s=this._height-(this._margin.bottom+this._margin.top+r.bottom+r.top);var l=!n?Gt([this._colorScaleMaxSize,s]):this._height-(this._margin.bottom+this._margin.top);var u={opacity:this._colorScalePosition?1:0,transform:"translate(".concat(n?this._margin.left+r.left+(a-o)/2:this._margin.left,", ").concat(n?this._margin.top:this._margin.top+r.top+(s-l)/2,")")};var c=this._colorScale&&t&&t.length>1;var h=Tw("g.d3plus-viz-colorScale",{condition:c&&!this._colorScaleConfig.select,enter:u,parent:this._select,transition:this._transition,update:u}).node();if(c){var f=t.filter(function(t,e){var n=i._colorScale(t,e);return n!==undefined&&n!==null});this._colorScaleClass.align({bottom:"end",left:"start",right:"end",top:"start"}[e]||"bottom").duration(this._duration).data(f).height(l).locale(this._locale).orient(e).select(h).value(this._colorScale).width(o).config(this._colorScaleConfig).render();var d=this._colorScaleClass.outerBounds();if(this._colorScalePosition&&!this._colorScaleConfig.select&&d.height){if(n)this._margin[e]+=d.height+this._legendClass.padding()*2;else this._margin[e]+=d.width+this._legendClass.padding()*2}}else{this._colorScaleClass.config(this._colorScaleConfig)}}var eV=AL(function(e,t){(function(t){{e.exports=t()}})(function(){return function a(o,s,l){function u(n,t){if(!s[n]){if(!o[n]){var e=typeof EL=="function"&&EL;if(!t&&e)return e(n,!0);if(c)return c(n,!0);var i=new Error("Cannot find module '"+n+"'");throw i.code="MODULE_NOT_FOUND",i}var r=s[n]={exports:{}};o[n][0].call(r.exports,function(t){var e=o[n][1][t];return u(e?e:t)},r,r.exports,a,o,s,l)}return s[n].exports}var c=typeof EL=="function"&&EL;for(var t=0;t= 0x80 (not a basic code point)","invalid-input":"Invalid input"},h=y-_,S=Math.floor,C=String.fromCharCode,f;function E(t){throw new RangeError(c[t])}function d(t,e){var n=t.length;var i=[];while(n--){i[n]=e(t[n])}return i}function g(t,e){var n=t.split("@");var i="";if(n.length>1){i=n[0]+"@";t=n[1]}t=t.replace(u,".");var r=t.split(".");var a=d(r,e).join(".");return i+a}function A(t){var e=[],n=0,i=t.length,r,a;while(n=55296&&r<=56319&&n65535){t-=65536;e+=C(t>>>10&1023|55296);t=56320|t&1023}e+=C(t);return e}).join("")}function M(t){if(t-48<10){return t-22}if(t-65<26){return t-65}if(t-97<26){return t-97}return y}function R(t,e){return t+22+75*(t<26)-((e!=0)<<5)}function T(t,e,n){var i=0;t=n?S(t/o):t>>1;t+=S(t/e);for(;t>h*b>>1;i+=y){t=S(t/h)}return S(i+(h+1)*t/(t+a))}function p(t){var e=[],n=t.length,i,r=0,a=x,o=w,s,l,u,c,h,f,d,g,p;s=t.lastIndexOf(k);if(s<0){s=0}for(l=0;l=128){E("not-basic")}e.push(t.charCodeAt(l))}for(u=s>0?s+1:0;u=n){E("invalid-input")}d=M(t.charCodeAt(u++));if(d>=y||d>S((m-r)/h)){E("overflow")}r+=d*h;g=f<=o?_:f>=o+b?b:f-o;if(dS(m/p)){E("overflow")}h*=p}i=e.length+1;o=T(r-c,i,c==0);if(S(r/i)>m-a){E("overflow")}a+=S(r/i);r%=i;e.splice(r++,0,a)}return v(e)}function O(t){var e,n,i,r,a,o,s,l,u,c,h,f=[],d,g,p,v;t=A(t);d=t.length;e=x;n=0;a=w;for(o=0;o=e&&hS((m-n)/g)){E("overflow")}n+=(s-e)*g;e=s;for(o=0;om){E("overflow")}if(h==e){for(l=n,u=y;;u+=y){c=u<=a?_:u>=a+b?b:u-a;if(l0){h(n.documentElement);clearInterval(t);if(r.type==="view"){l.contentWindow.scrollTo(a,o);if(/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&(l.contentWindow.scrollY!==o||l.contentWindow.scrollX!==a)){n.documentElement.style.top=-o+"px";n.documentElement.style.left=-a+"px";n.documentElement.style.position="absolute"}}e(l)}},50)};n.open();n.write("");u(t,a,o);n.replaceChild(n.adoptNode(s),n.documentElement);n.close()})}},{"./log":13}],3:[function(t,e,n){function i(t){this.r=0;this.g=0;this.b=0;this.a=null;var e=this.fromArray(t)||this.namedColor(t)||this.rgb(t)||this.rgba(t)||this.hex6(t)||this.hex3(t)}i.prototype.darken=function(t){var e=1-t;return new i([Math.round(this.r*e),Math.round(this.g*e),Math.round(this.b*e),this.a])};i.prototype.isTransparent=function(){return this.a===0};i.prototype.isBlack=function(){return this.r===0&&this.g===0&&this.b===0};i.prototype.fromArray=function(t){if(Array.isArray(t)){this.r=Math.min(t[0],255);this.g=Math.min(t[1],255);this.b=Math.min(t[2],255);if(t.length>3){this.a=t[3]}}return Array.isArray(t)};var r=/^#([a-f0-9]{3})$/i;i.prototype.hex3=function(t){var e=null;if((e=t.match(r))!==null){this.r=parseInt(e[1][0]+e[1][0],16);this.g=parseInt(e[1][1]+e[1][1],16);this.b=parseInt(e[1][2]+e[1][2],16)}return e!==null};var a=/^#([a-f0-9]{6})$/i;i.prototype.hex6=function(t){var e=null;if((e=t.match(a))!==null){this.r=parseInt(e[1].substring(0,2),16);this.g=parseInt(e[1].substring(2,4),16);this.b=parseInt(e[1].substring(4,6),16)}return e!==null};var o=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;i.prototype.rgb=function(t){var e=null;if((e=t.match(o))!==null){this.r=Number(e[1]);this.g=Number(e[2]);this.b=Number(e[3])}return e!==null};var s=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;i.prototype.rgba=function(t){var e=null;if((e=t.match(s))!==null){this.r=Number(e[1]);this.g=Number(e[2]);this.b=Number(e[3]);this.a=Number(e[4])}return e!==null};i.prototype.toString=function(){return this.a!==null&&this.a!==1?"rgba("+[this.r,this.g,this.b,this.a].join(",")+")":"rgb("+[this.r,this.g,this.b].join(",")+")"};i.prototype.namedColor=function(t){t=t.toLowerCase();var e=l[t];if(e){this.r=e[0];this.g=e[1];this.b=e[2]}else if(t==="transparent"){this.r=this.g=this.b=this.a=0;return true}return!!e};i.prototype.isColor=true;var l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};e.exports=i},{}],4:[function(t,e,n){var d=t("./support");var o=t("./renderers/canvas");var g=t("./imageloader");var p=t("./nodeparser");var i=t("./nodecontainer");var v=t("./log");var r=t("./utils");var a=t("./clone");var s=t("./proxy").loadUrlDocument;var m=r.getBounds;var h="data-html2canvas-node";var l=0;function u(t,e){var n=l++;e=e||{};if(e.logging){v.options.logging=true;v.options.start=Date.now()}e.async=typeof e.async==="undefined"?true:e.async;e.allowTaint=typeof e.allowTaint==="undefined"?false:e.allowTaint;e.removeContainer=typeof e.removeContainer==="undefined"?true:e.removeContainer;e.javascriptEnabled=typeof e.javascriptEnabled==="undefined"?false:e.javascriptEnabled;e.imageTimeout=typeof e.imageTimeout==="undefined"?1e4:e.imageTimeout;e.renderer=typeof e.renderer==="function"?e.renderer:o;e.strict=!!e.strict;if(typeof t==="string"){if(typeof e.proxy!=="string"){return Promise.reject("Proxy must be used when rendering url")}var i=e.width!=null?e.width:window.innerWidth;var r=e.height!=null?e.height:window.innerHeight;return s(k(t),e.proxy,document,i,r,e).then(function(t){return y(t.contentWindow.document.documentElement,t,e,i,r)})}var a=(t===undefined?[document.documentElement]:t.length?t:[t])[0];a.setAttribute(h+n,n);return f(a.ownerDocument,e,a.ownerDocument.defaultView.innerWidth,a.ownerDocument.defaultView.innerHeight,n).then(function(t){if(typeof e.onrendered==="function"){v("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");e.onrendered(t)}return t})}u.CanvasRenderer=o;u.NodeContainer=i;u.log=v;u.utils=r;var c=typeof document==="undefined"||typeof Object.create!=="function"||typeof document.createElement("canvas").getContext!=="function"?function(){return Promise.reject("No canvas support")}:u;e.exports=c;function f(o,s,l,u,c){return a(o,o,l,u,s,o.defaultView.pageXOffset,o.defaultView.pageYOffset).then(function(t){v("Document cloned");var e=h+c;var n="["+e+"='"+c+"']";o.querySelector(n).removeAttribute(e);var i=t.contentWindow;var r=i.document.querySelector(n);var a=typeof s.onclone==="function"?Promise.resolve(s.onclone(i.document)):Promise.resolve(true);return a.then(function(){return y(r,t,s,l,u)})})}function y(e,n,i,t,r){var a=n.contentWindow;var o=new d(a.document);var s=new g(i,o);var l=m(e);var u=i.type==="view"?t:w(a.document);var c=i.type==="view"?r:x(a.document);var h=new i.renderer(u,c,s,i,document);var f=new p(e,h,o,s,i);return f.ready.then(function(){v("Finished rendering");var t;if(i.type==="view"){t=b(h.canvas,{width:h.canvas.width,height:h.canvas.height,top:0,left:0,x:0,y:0})}else if(e===a.document.body||e===a.document.documentElement||i.canvas!=null){t=h.canvas}else{t=b(h.canvas,{width:i.width!=null?i.width:l.width,height:i.height!=null?i.height:l.height,top:l.top,left:l.left,x:0,y:0})}_(n,i);return t})}function _(t,e){if(e.removeContainer){t.parentNode.removeChild(t);v("Cleaned up container")}}function b(t,e){var n=document.createElement("canvas");var i=Math.min(t.width-1,Math.max(0,e.left));var r=Math.min(t.width,Math.max(1,e.left+e.width));var a=Math.min(t.height-1,Math.max(0,e.top));var o=Math.min(t.height,Math.max(1,e.top+e.height));n.width=e.width;n.height=e.height;var s=r-i;var l=o-a;v("Cropping canvas at:","left:",e.left,"top:",e.top,"width:",s,"height:",l);v("Resulting crop with width",e.width,"and height",e.height,"with x",i,"and y",a);n.getContext("2d").drawImage(t,i,a,s,l,e.x,e.y,s,l);return n}function w(t){return Math.max(Math.max(t.body.scrollWidth,t.documentElement.scrollWidth),Math.max(t.body.offsetWidth,t.documentElement.offsetWidth),Math.max(t.body.clientWidth,t.documentElement.clientWidth))}function x(t){return Math.max(Math.max(t.body.scrollHeight,t.documentElement.scrollHeight),Math.max(t.body.offsetHeight,t.documentElement.offsetHeight),Math.max(t.body.clientHeight,t.documentElement.clientHeight))}function k(t){var e=document.createElement("a");e.href=t;e.href=e.href;return e}},{"./clone":2,"./imageloader":11,"./log":13,"./nodecontainer":14,"./nodeparser":15,"./proxy":16,"./renderers/canvas":20,"./support":22,"./utils":26}],5:[function(t,e,n){var i=t("./log");var r=t("./utils").smallImage;function a(t){this.src=t;i("DummyImageContainer for",t);if(!this.promise||!this.image){i("Initiating DummyImageContainer");a.prototype.image=new Image;var n=this.image;a.prototype.promise=new Promise(function(t,e){n.onload=t;n.onerror=e;n.src=r();if(n.complete===true){t(n)}})}}e.exports=a},{"./log":13,"./utils":26}],6:[function(t,e,n){var l=t("./utils").smallImage;function i(t,e){var n=document.createElement("div"),i=document.createElement("img"),r=document.createElement("span"),a="Hidden Text",o,s;n.style.visibility="hidden";n.style.fontFamily=t;n.style.fontSize=e;n.style.margin=0;n.style.padding=0;document.body.appendChild(n);i.src=l();i.width=1;i.height=1;i.style.margin=0;i.style.padding=0;i.style.verticalAlign="baseline";r.style.fontFamily=t;r.style.fontSize=e;r.style.margin=0;r.style.padding=0;r.appendChild(document.createTextNode(a));n.appendChild(r);n.appendChild(i);o=i.offsetTop-r.offsetTop+1;n.removeChild(r);n.appendChild(document.createTextNode(a));n.style.lineHeight="normal";i.style.verticalAlign="super";s=i.offsetTop-n.offsetTop+1;document.body.removeChild(n);this.baseline=o;this.lineWidth=1;this.middle=s}e.exports=i},{"./utils":26}],7:[function(t,e,n){var i=t("./font");function r(){this.data={}}r.prototype.getMetrics=function(t,e){if(this.data[t+"-"+e]===undefined){this.data[t+"-"+e]=new i(t,e)}return this.data[t+"-"+e]};e.exports=r},{"./font":6}],8:[function(a,t,e){var n=a("./utils");var o=n.getBounds;var r=a("./proxy").loadUrlDocument;function i(e,t,n){this.image=null;this.src=e;var i=this;var r=o(e);this.promise=(!t?this.proxyLoad(n.proxy,r,n):new Promise(function(t){if(e.contentWindow.document.URL==="about:blank"||e.contentWindow.document.documentElement==null){e.contentWindow.onload=e.onload=function(){t(e)}}else{t(e)}})).then(function(t){var e=a("./core");return e(t.contentWindow.document.documentElement,{type:"view",width:t.width,height:t.height,proxy:n.proxy,javascriptEnabled:n.javascriptEnabled,removeContainer:n.removeContainer,allowTaint:n.allowTaint,imageTimeout:n.imageTimeout/2})}).then(function(t){return i.image=t})}i.prototype.proxyLoad=function(t,e,n){var i=this.src;return r(i.src,t,i.ownerDocument,e.width,e.height,n)};t.exports=i},{"./core":4,"./proxy":16,"./utils":26}],9:[function(t,e,n){function i(t){this.src=t.value;this.colorStops=[];this.type=null;this.x0=.5;this.y0=.5;this.x1=.5;this.y1=.5;this.promise=Promise.resolve(true)}i.TYPES={LINEAR:1,RADIAL:2};i.REGEXP_COLORSTOP=/^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;e.exports=i},{}],10:[function(t,e,n){function i(n,i){this.src=n;this.image=new Image;var r=this;this.tainted=null;this.promise=new Promise(function(t,e){r.image.onload=t;r.image.onerror=e;if(i){r.image.crossOrigin="anonymous"}r.image.src=n;if(r.image.complete===true){t(r.image)}})}e.exports=i},{}],11:[function(t,e,n){var a=t("./log");var i=t("./imagecontainer");var r=t("./dummyimagecontainer");var o=t("./proxyimagecontainer");var s=t("./framecontainer");var l=t("./svgcontainer");var u=t("./svgnodecontainer");var c=t("./lineargradientcontainer");var h=t("./webkitgradientcontainer");var f=t("./utils").bind;function d(t,e){this.link=null;this.options=t;this.support=e;this.origin=this.getOrigin(window.location.href)}d.prototype.findImages=function(t){var e=[];t.reduce(function(t,e){switch(e.node.nodeName){case"IMG":return t.concat([{args:[e.node.src],method:"url"}]);case"svg":case"IFRAME":return t.concat([{args:[e.node],method:e.node.nodeName}])}return t},[]).forEach(this.addImage(e,this.loadImage),this);return e};d.prototype.findBackgroundImage=function(t,e){e.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(t,this.loadImage),this);return t};d.prototype.addImage=function(n,i){return function(e){e.args.forEach(function(t){if(!this.imageExists(n,t)){n.splice(0,0,i.call(this,e));a("Added image #"+n.length,typeof t==="string"?t.substring(0,100):t)}},this)}};d.prototype.hasImageBackground=function(t){return t.method!=="none"};d.prototype.loadImage=function(t){if(t.method==="url"){var e=t.args[0];if(this.isSVG(e)&&!this.support.svg&&!this.options.allowTaint){return new l(e)}else if(e.match(/data:image\/.*;base64,/i)){return new i(e.replace(/url\(['"]{0,}|['"]{0,}\)$/gi,""),false)}else if(this.isSameOrigin(e)||this.options.allowTaint===true||this.isSVG(e)){return new i(e,false)}else if(this.support.cors&&!this.options.allowTaint&&this.options.useCORS){return new i(e,true)}else if(this.options.proxy){return new o(e,this.options.proxy)}else{return new r(e)}}else if(t.method==="linear-gradient"){return new c(t)}else if(t.method==="gradient"){return new h(t)}else if(t.method==="svg"){return new u(t.args[0],this.support.svg)}else if(t.method==="IFRAME"){return new s(t.args[0],this.isSameOrigin(t.args[0].src),this.options)}else{return new r(t)}};d.prototype.isSVG=function(t){return t.substring(t.length-3).toLowerCase()==="svg"||l.prototype.isInline(t)};d.prototype.imageExists=function(t,e){return t.some(function(t){return t.src===e})};d.prototype.isSameOrigin=function(t){return this.getOrigin(t)===this.origin};d.prototype.getOrigin=function(t){var e=this.link||(this.link=document.createElement("a"));e.href=t;e.href=e.href;return e.protocol+e.hostname+e.port};d.prototype.getPromise=function(e){return this.timeout(e,this.options.imageTimeout)["catch"](function(){var t=new r(e.src);return t.promise.then(function(t){e.image=t})})};d.prototype.get=function(e){var n=null;return this.images.some(function(t){return(n=t).src===e})?n:null};d.prototype.fetch=function(t){this.images=t.reduce(f(this.findBackgroundImage,this),this.findImages(t));this.images.forEach(function(e,n){e.promise.then(function(){a("Succesfully loaded image #"+(n+1),e)},function(t){a("Failed loading image #"+(n+1),e,t)})});this.ready=Promise.all(this.images.map(this.getPromise,this));a("Finished searching images");return this};d.prototype.timeout=function(n,i){var r;var t=Promise.race([n.promise,new Promise(function(t,e){r=setTimeout(function(){a("Timed out loading image",n);e(n)},i)})]).then(function(t){clearTimeout(r);return t});t["catch"](function(){clearTimeout(r)});return t};e.exports=d},{"./dummyimagecontainer":5,"./framecontainer":8,"./imagecontainer":10,"./lineargradientcontainer":12,"./log":13,"./proxyimagecontainer":17,"./svgcontainer":23,"./svgnodecontainer":24,"./utils":26,"./webkitgradientcontainer":27}],12:[function(t,e,n){var r=t("./gradientcontainer");var a=t("./color");function i(t){r.apply(this,arguments);this.type=r.TYPES.LINEAR;var e=i.REGEXP_DIRECTION.test(t.args[0])||!r.REGEXP_COLORSTOP.test(t.args[0]);if(e){t.args[0].split(/\s+/).reverse().forEach(function(t,e){switch(t){case"left":this.x0=0;this.x1=1;break;case"top":this.y0=0;this.y1=1;break;case"right":this.x0=1;this.x1=0;break;case"bottom":this.y0=1;this.y1=0;break;case"to":var n=this.y0;var i=this.x0;this.y0=this.y1;this.x0=this.x1;this.x1=i;this.y1=n;break;case"center":break;default:var r=parseFloat(t,10)*.01;if(isNaN(r)){break}if(e===0){this.y0=r;this.y1=1-this.y0}else{this.x0=r;this.x1=1-this.x0}break}},this)}else{this.y0=0;this.y1=1}this.colorStops=t.args.slice(e?1:0).map(function(t){var e=t.match(r.REGEXP_COLORSTOP);var n=+e[2];var i=n===0?"%":e[3];return{color:new a(e[1]),stop:i==="%"?n/100:null}});if(this.colorStops[0].stop===null){this.colorStops[0].stop=0}if(this.colorStops[this.colorStops.length-1].stop===null){this.colorStops[this.colorStops.length-1].stop=1}this.colorStops.forEach(function(n,i){if(n.stop===null){this.colorStops.slice(i).some(function(t,e){if(t.stop!==null){n.stop=(t.stop-this.colorStops[i-1].stop)/(e+1)+this.colorStops[i-1].stop;return true}else{return false}},this)}},this)}i.prototype=Object.create(r.prototype);i.REGEXP_DIRECTION=/^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;e.exports=i},{"./color":3,"./gradientcontainer":9}],13:[function(t,e,n){var i=function t(){if(t.options.logging&&window.console&&window.console.log){Function.prototype.bind.call(window.console.log,window.console).apply(window.console,[Date.now()-t.options.start+"ms","html2canvas:"].concat([].slice.call(arguments,0)))}};i.options={logging:false};e.exports=i},{}],14:[function(t,e,n){var a=t("./color");var i=t("./utils");var r=i.getBounds;var o=i.parseBackgrounds;var s=i.offsetBounds;function l(t,e){this.node=t;this.parent=e;this.stack=null;this.bounds=null;this.borders=null;this.clip=[];this.backgroundClip=[];this.offsetBounds=null;this.visible=null;this.computedStyles=null;this.colors={};this.styles={};this.backgroundImages=null;this.transformData=null;this.transformMatrix=null;this.isPseudoElement=false;this.opacity=null}l.prototype.cloneTo=function(t){t.visible=this.visible;t.borders=this.borders;t.bounds=this.bounds;t.clip=this.clip;t.backgroundClip=this.backgroundClip;t.computedStyles=this.computedStyles;t.styles=this.styles;t.backgroundImages=this.backgroundImages;t.opacity=this.opacity};l.prototype.getOpacity=function(){return this.opacity===null?this.opacity=this.cssFloat("opacity"):this.opacity};l.prototype.assignStack=function(t){this.stack=t;t.children.push(this)};l.prototype.isElementVisible=function(){return this.node.nodeType===Node.TEXT_NODE?this.parent.visible:this.css("display")!=="none"&&this.css("visibility")!=="hidden"&&!this.node.hasAttribute("data-html2canvas-ignore")&&(this.node.nodeName!=="INPUT"||this.node.getAttribute("type")!=="hidden")};l.prototype.css=function(t){if(!this.computedStyles){this.computedStyles=this.isPseudoElement?this.parent.computedStyle(this.before?":before":":after"):this.computedStyle(null)}return this.styles[t]||(this.styles[t]=this.computedStyles[t])};l.prototype.prefixedCss=function(e){var t=["webkit","moz","ms","o"];var n=this.css(e);if(n===undefined){t.some(function(t){n=this.css(t+e.substr(0,1).toUpperCase()+e.substr(1));return n!==undefined},this)}return n===undefined?null:n};l.prototype.computedStyle=function(t){return this.node.ownerDocument.defaultView.getComputedStyle(this.node,t)};l.prototype.cssInt=function(t){var e=parseInt(this.css(t),10);return isNaN(e)?0:e};l.prototype.color=function(t){return this.colors[t]||(this.colors[t]=new a(this.css(t)))};l.prototype.cssFloat=function(t){var e=parseFloat(this.css(t));return isNaN(e)?0:e};l.prototype.fontWeight=function(){var t=this.css("fontWeight");switch(parseInt(t,10)){case 401:t="bold";break;case 400:t="normal";break}return t};l.prototype.parseClip=function(){var t=this.css("clip").match(this.CLIP);if(t){return{top:parseInt(t[1],10),right:parseInt(t[2],10),bottom:parseInt(t[3],10),left:parseInt(t[4],10)}}return null};l.prototype.parseBackgroundImages=function(){return this.backgroundImages||(this.backgroundImages=o(this.css("backgroundImage")))};l.prototype.cssList=function(t,e){var n=(this.css(t)||"").split(",");n=n[e||0]||n[0]||"auto";n=n.trim().split(" ");if(n.length===1){n=[n[0],h(n[0])?"auto":n[0]]}return n};l.prototype.parseBackgroundSize=function(t,e,n){var i=this.cssList("backgroundSize",n);var r,a;if(h(i[0])){r=t.width*parseFloat(i[0])/100}else if(/contain|cover/.test(i[0])){var o=t.width/t.height,s=e.width/e.height;return o0){this.renderIndex=0;this.asyncRenderer(this.renderQueue,t)}else{t()}},this))},this))}r.prototype.calculateOverflowClips=function(){this.nodes.forEach(function(t){if(H(t)){if(V(t)){t.appendToDOM()}t.borders=this.parseBorders(t);var e=t.css("overflow")==="hidden"?[t.borders.clip]:[];var n=t.parseClip();if(n&&["absolute","fixed"].indexOf(t.css("position"))!==-1){e.push([["rect",t.bounds.left+n.left,t.bounds.top+n.top,n.right-n.left,n.bottom-n.top]])}t.clip=a(t)?t.parent.clip.concat(e):e;t.backgroundClip=t.css("overflow")!=="hidden"?t.clip.concat([t.borders.clip]):t.clip;if(V(t)){t.cleanDOM()}}else if(G(t)){t.clip=a(t)?t.parent.clip:[]}if(!V(t)){t.bounds=null}},this)};function a(t){return t.parent&&t.parent.clip.length}r.prototype.asyncRenderer=function(t,e,n){n=n||Date.now();this.paint(t[this.renderIndex++]);if(t.length===this.renderIndex){e()}else if(n+20>Date.now()){this.asyncRenderer(t,e,n)}else{setTimeout(p(function(){this.asyncRenderer(t,e)},this),0)}};r.prototype.createPseudoHideStyles=function(t){this.createStyles(t,"."+h.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+':before { content: "" !important; display: none !important; }'+"."+h.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER+':after { content: "" !important; display: none !important; }')};r.prototype.disableAnimations=function(t){this.createStyles(t,"* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; "+"-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}")};r.prototype.createStyles=function(t,e){var n=t.createElement("style");n.innerHTML=e;t.body.appendChild(n)};r.prototype.getPseudoElements=function(t){var e=[[t]];if(t.node.nodeType===Node.ELEMENT_NODE){var n=this.getPseudoElement(t,":before");var i=this.getPseudoElement(t,":after");if(n){e.push(n)}if(i){e.push(i)}}return X(e)};function y(t){return t.replace(/(\-[a-z])/g,function(t){return t.toUpperCase().replace("-","")})}r.prototype.getPseudoElement=function(t,e){var n=t.computedStyle(e);if(!n||!n.content||n.content==="none"||n.content==="-moz-alt-content"||n.display==="none"){return null}var i=$(n.content);var r=i.substr(0,3)==="url";var a=document.createElement(r?"img":"html2canvaspseudoelement");var o=new h(a,t,e);for(var s=n.length-1;s>=0;s--){var l=y(n.item(s));a.style[l]=n[l]}a.className=h.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+" "+h.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;if(r){a.src=v(i)[0].args[0];return[o]}else{var u=document.createTextNode(i);a.appendChild(u);return[o,new c(u,o)]}};r.prototype.getChildren=function(n){return X([].filter.call(n.node.childNodes,D).map(function(t){var e=[t.nodeType===Node.TEXT_NODE?new c(t,n):new u(t,n)].filter(Y);return t.nodeType===Node.ELEMENT_NODE&&e.length&&t.tagName!=="TEXTAREA"?e[0].isElementVisible()?e.concat(this.getChildren(e[0])):[]:e},this))};r.prototype.newStackingContext=function(t,e){var n=new g(e,t.getOpacity(),t.node,t.parent);t.cloneTo(n);var i=e?n.getParentStack(this):n.parent.stack;i.contexts.push(n);t.stack=n};r.prototype.createStackingContexts=function(){this.nodes.forEach(function(t){if(H(t)&&(this.isRootElement(t)||q(t)||z(t)||this.isBodyWithTransparentRoot(t)||t.hasTransform())){this.newStackingContext(t,true)}else if(H(t)&&(j(t)&&R(t)||F(t)||L(t))){this.newStackingContext(t,false)}else{t.assignStack(t.parent.stack)}},this)};r.prototype.isBodyWithTransparentRoot=function(t){return t.node.nodeName==="BODY"&&t.parent.color("backgroundColor").isTransparent()};r.prototype.isRootElement=function(t){return t.parent===null};r.prototype.sortStackingContexts=function(t){t.contexts.sort(U(t.contexts.slice(0)));t.contexts.forEach(this.sortStackingContexts,this)};r.prototype.parseTextBounds=function(o){return function(t,e,n){if(o.parent.css("textDecoration").substr(0,4)!=="none"||t.trim().length!==0){if(this.support.rangeBounds&&!o.parent.hasTransform()){var i=n.slice(0,e).join("").length;return this.getRangeBounds(o.node,i,t.length)}else if(o.node&&typeof o.node.data==="string"){var r=o.node.splitText(t.length);var a=this.getWrapperBounds(o.node,o.parent.hasTransform());o.node=r;return a}}else if(!this.support.rangeBounds||o.parent.hasTransform()){o.node=o.node.splitText(t.length)}return{}}};r.prototype.getWrapperBounds=function(t,e){var n=t.ownerDocument.createElement("html2canvaswrapper");var i=t.parentNode,r=t.cloneNode(true);n.appendChild(t.cloneNode(true));i.replaceChild(n,t);var a=e?m(n):o(n);i.replaceChild(r,n);return a};r.prototype.getRangeBounds=function(t,e,n){var i=this.range||(this.range=t.ownerDocument.createRange());i.setStart(t,e);i.setEnd(t,e+n);return i.getBoundingClientRect()};function _(){}r.prototype.parse=function(t){var e=t.contexts.filter(A);var n=t.children.filter(H);var i=n.filter(I(L));var r=i.filter(I(j)).filter(I(T));var a=n.filter(I(j)).filter(L);var o=i.filter(I(j)).filter(T);var s=t.contexts.concat(i.filter(j)).filter(R);var l=t.children.filter(G).filter(B);var u=t.contexts.filter(M);e.concat(r).concat(a).concat(o).concat(s).concat(l).concat(u).forEach(function(t){this.renderQueue.push(t);if(O(t)){this.parse(t);this.renderQueue.push(new _)}},this)};r.prototype.paint=function(t){try{if(t instanceof _){this.renderer.ctx.restore()}else if(G(t)){if(V(t.parent)){t.parent.appendToDOM()}this.paintText(t);if(V(t.parent)){t.parent.cleanDOM()}}else{this.paintNode(t)}}catch(t){s(t);if(this.options.strict){throw t}}};r.prototype.paintNode=function(t){if(O(t)){this.renderer.setOpacity(t.opacity);this.renderer.ctx.save();if(t.hasTransform()){this.renderer.setTransform(t.parseTransform())}}if(t.node.nodeName==="INPUT"&&t.node.type==="checkbox"){this.paintCheckbox(t)}else if(t.node.nodeName==="INPUT"&&t.node.type==="radio"){this.paintRadio(t)}else{this.paintElement(t)}};r.prototype.paintElement=function(n){var i=n.parseBounds();this.renderer.clip(n.backgroundClip,function(){this.renderer.renderBackground(n,i,n.borders.borders.map(K))},this);this.renderer.clip(n.clip,function(){this.renderer.renderBorders(n.borders.borders)},this);this.renderer.clip(n.backgroundClip,function(){switch(n.node.nodeName){case"svg":case"IFRAME":var t=this.images.get(n.node);if(t){this.renderer.renderImage(n,i,n.borders,t)}else{s("Error loading <"+n.node.nodeName+">",n.node)}break;case"IMG":var e=this.images.get(n.node.src);if(e){this.renderer.renderImage(n,i,n.borders,e)}else{s("Error loading ",n.node.src)}break;case"CANVAS":this.renderer.renderImage(n,i,n.borders,{image:n.node});break;case"SELECT":case"INPUT":case"TEXTAREA":this.paintFormValue(n);break}},this)};r.prototype.paintCheckbox=function(t){var e=t.parseBounds();var n=Math.min(e.width,e.height);var i={width:n-1,height:n-1,top:e.top,left:e.left};var r=[3,3];var a=[r,r,r,r];var o=[1,1,1,1].map(function(t){return{color:new d("#A5A5A5"),width:t}});var s=k(i,a,o);this.renderer.clip(t.backgroundClip,function(){this.renderer.rectangle(i.left+1,i.top+1,i.width-2,i.height-2,new d("#DEDEDE"));this.renderer.renderBorders(w(o,i,s,a));if(t.node.checked){this.renderer.font(new d("#424242"),"normal","normal","bold",n-3+"px","arial");this.renderer.text("✔",i.left+n/6,i.top+n-1)}},this)};r.prototype.paintRadio=function(t){var e=t.parseBounds();var n=Math.min(e.width,e.height)-2;this.renderer.clip(t.backgroundClip,function(){this.renderer.circleStroke(e.left+1,e.top+1,n,new d("#DEDEDE"),1,new d("#A5A5A5"));if(t.node.checked){this.renderer.circle(Math.ceil(e.left+n/4)+1,Math.ceil(e.top+n/4)+1,Math.floor(n/2),new d("#424242"))}},this)};r.prototype.paintFormValue=function(e){var t=e.getValue();if(t.length>0){var n=e.node.ownerDocument;var i=n.createElement("html2canvaswrapper");var r=["lineHeight","textAlign","fontFamily","fontWeight","fontSize","color","paddingLeft","paddingTop","paddingRight","paddingBottom","width","height","borderLeftStyle","borderTopStyle","borderLeftWidth","borderTopWidth","boxSizing","whiteSpace","wordWrap"];r.forEach(function(t){try{i.style[t]=e.css(t)}catch(t){s("html2canvas: Parse: Exception caught in renderFormValue: "+t.message)}});var a=e.parseBounds();i.style.position="fixed";i.style.left=a.left+"px";i.style.top=a.top+"px";i.textContent=t;n.body.appendChild(i);this.paintText(new c(i.firstChild,e));n.body.removeChild(i)}};r.prototype.paintText=function(n){n.applyTextTransform();var t=l.ucs2.decode(n.node.data);var i=(!this.options.letterRendering||P(n))&&!Q(n.node.data)?Z(t):t.map(function(t){return l.ucs2.encode([t])});var e=n.parent.fontWeight();var r=n.parent.css("fontSize");var a=n.parent.css("fontFamily");var o=n.parent.parseTextShadows();this.renderer.font(n.parent.color("color"),n.parent.css("fontStyle"),n.parent.css("fontVariant"),e,r,a);if(o.length){this.renderer.fontShadow(o[0].color,o[0].offsetX,o[0].offsetY,o[0].blur)}else{this.renderer.clearShadow()}this.renderer.clip(n.parent.clip,function(){i.map(this.parseTextBounds(n),this).forEach(function(t,e){if(t){this.renderer.text(i[e],t.left,t.bottom);this.renderTextDecoration(n.parent,t,this.fontMetrics.getMetrics(a,r))}},this)},this)};r.prototype.renderTextDecoration=function(t,e,n){switch(t.css("textDecoration").split(" ")[0]){case"underline":this.renderer.rectangle(e.left,Math.round(e.top+n.baseline+n.lineWidth),e.width,1,t.color("color"));break;case"overline":this.renderer.rectangle(e.left,Math.round(e.top),e.width,1,t.color("color"));break;case"line-through":this.renderer.rectangle(e.left,Math.ceil(e.top+n.middle+n.lineWidth),e.width,1,t.color("color"));break}};var b={inset:[["darken",.6],["darken",.1],["darken",.1],["darken",.6]]};r.prototype.parseBorders=function(a){var t=a.parseBounds();var e=N(a);var n=["Top","Right","Bottom","Left"].map(function(t,e){var n=a.css("border"+t+"Style");var i=a.color("border"+t+"Color");if(n==="inset"&&i.isBlack()){i=new d([255,255,255,i.a])}var r=b[n]?b[n][e]:null;return{width:a.cssInt("border"+t+"Width"),color:r?i[r[0]](r[1]):i,args:null}});var i=k(t,e,n);return{clip:this.parseBackgroundClip(a,i,n,e,t),borders:w(n,t,i,e)}};function w(o,s,l,u){return o.map(function(t,e){if(t.width>0){var n=s.left;var i=s.top;var r=s.width;var a=s.height-o[2].width;switch(e){case 0:a=o[0].width;t.args=C({c1:[n,i],c2:[n+r,i],c3:[n+r-o[1].width,i+a],c4:[n+o[3].width,i+a]},u[0],u[1],l.topLeftOuter,l.topLeftInner,l.topRightOuter,l.topRightInner);break;case 1:n=s.left+s.width-o[1].width;r=o[1].width;t.args=C({c1:[n+r,i],c2:[n+r,i+a+o[2].width],c3:[n,i+a],c4:[n,i+o[0].width]},u[1],u[2],l.topRightOuter,l.topRightInner,l.bottomRightOuter,l.bottomRightInner);break;case 2:i=i+s.height-o[2].width;a=o[2].width;t.args=C({c1:[n+r,i+a],c2:[n,i+a],c3:[n+o[3].width,i],c4:[n+r-o[3].width,i]},u[2],u[3],l.bottomRightOuter,l.bottomRightInner,l.bottomLeftOuter,l.bottomLeftInner);break;case 3:r=o[3].width;t.args=C({c1:[n,i+a+o[2].width],c2:[n,i],c3:[n+r,i+o[0].width],c4:[n+r,i+a]},u[3],u[0],l.bottomLeftOuter,l.bottomLeftInner,l.topLeftOuter,l.topLeftInner);break}}return t})}r.prototype.parseBackgroundClip=function(t,e,n,i,r){var a=t.css("backgroundClip"),o=[];switch(a){case"content-box":case"padding-box":E(o,i[0],i[1],e.topLeftInner,e.topRightInner,r.left+n[3].width,r.top+n[0].width);E(o,i[1],i[2],e.topRightInner,e.bottomRightInner,r.left+r.width-n[1].width,r.top+n[0].width);E(o,i[2],i[3],e.bottomRightInner,e.bottomLeftInner,r.left+r.width-n[1].width,r.top+r.height-n[2].width);E(o,i[3],i[0],e.bottomLeftInner,e.topLeftInner,r.left+n[3].width,r.top+r.height-n[2].width);break;default:E(o,i[0],i[1],e.topLeftOuter,e.topRightOuter,r.left,r.top);E(o,i[1],i[2],e.topRightOuter,e.bottomRightOuter,r.left+r.width,r.top);E(o,i[2],i[3],e.bottomRightOuter,e.bottomLeftOuter,r.left+r.width,r.top+r.height);E(o,i[3],i[0],e.bottomLeftOuter,e.topLeftOuter,r.left,r.top+r.height);break}return o};function x(t,e,n,i){var r=4*((Math.sqrt(2)-1)/3);var a=n*r,o=i*r,s=t+n,l=e+i;return{topLeft:S({x:t,y:l},{x:t,y:l-o},{x:s-a,y:e},{x:s,y:e}),topRight:S({x:t,y:e},{x:t+a,y:e},{x:s,y:l-o},{x:s,y:l}),bottomRight:S({x:s,y:e},{x:s,y:e+o},{x:t+a,y:l},{x:t,y:l}),bottomLeft:S({x:s,y:l},{x:s-a,y:l},{x:t,y:e+o},{x:t,y:e})}}function k(t,e,n){var i=t.left,r=t.top,a=t.width,o=t.height,s=e[0][0]a+n[3].width?0:u-n[3].width,c-n[0].width).topRight.subdivide(.5),bottomRightOuter:x(i+m,r+v,h,f).bottomRight.subdivide(.5),bottomRightInner:x(i+Math.min(m,a-n[3].width),r+Math.min(v,o+n[0].width),Math.max(0,h-n[1].width),f-n[2].width).bottomRight.subdivide(.5),bottomLeftOuter:x(i,r+y,d,g).bottomLeft.subdivide(.5),bottomLeftInner:x(i+n[3].width,r+y,Math.max(0,d-n[3].width),g-n[2].width).bottomLeft.subdivide(.5)}}function S(l,u,c,h){var f=function t(e,n,i){return{x:e.x+(n.x-e.x)*i,y:e.y+(n.y-e.y)*i}};return{start:l,startControl:u,endControl:c,end:h,subdivide:function t(e){var n=f(l,u,e),i=f(u,c,e),r=f(c,h,e),a=f(n,i,e),o=f(i,r,e),s=f(a,o,e);return[S(l,n,a,s),S(s,o,r,h)]},curveTo:function t(e){e.push(["bezierCurve",u.x,u.y,c.x,c.y,h.x,h.y])},curveToReversed:function t(e){e.push(["bezierCurve",c.x,c.y,u.x,u.y,l.x,l.y])}}}function C(t,e,n,i,r,a,o){var s=[];if(e[0]>0||e[1]>0){s.push(["line",i[1].start.x,i[1].start.y]);i[1].curveTo(s)}else{s.push(["line",t.c1[0],t.c1[1]])}if(n[0]>0||n[1]>0){s.push(["line",a[0].start.x,a[0].start.y]);a[0].curveTo(s);s.push(["line",o[0].end.x,o[0].end.y]);o[0].curveToReversed(s)}else{s.push(["line",t.c2[0],t.c2[1]]);s.push(["line",t.c3[0],t.c3[1]])}if(e[0]>0||e[1]>0){s.push(["line",r[1].end.x,r[1].end.y]);r[1].curveToReversed(s)}else{s.push(["line",t.c4[0],t.c4[1]])}return s}function E(t,e,n,i,r,a,o){if(e[0]>0||e[1]>0){t.push(["line",i[0].start.x,i[0].start.y]);i[0].curveTo(t);i[1].curveTo(t)}else{t.push(["line",a,o])}if(n[0]>0||n[1]>0){t.push(["line",r[0].start.x,r[0].start.y])}}function A(t){return t.cssInt("zIndex")<0}function M(t){return t.cssInt("zIndex")>0}function R(t){return t.cssInt("zIndex")===0}function T(t){return["inline","inline-block","inline-table"].indexOf(t.css("display"))!==-1}function O(t){return t instanceof g}function B(t){return t.node.data.trim().length>0}function P(t){return/^(normal|none|0px)$/.test(t.parent.css("letterSpacing"))}function N(i){return["TopLeft","TopRight","BottomRight","BottomLeft"].map(function(t){var e=i.css("border"+t+"Radius");var n=e.split(" ");if(n.length<=1){n[1]=n[0]}return n.map(W)})}function D(t){return t.nodeType===Node.TEXT_NODE||t.nodeType===Node.ELEMENT_NODE}function z(t){var e=t.css("position");var n=["absolute","relative","fixed"].indexOf(e)!==-1?t.css("zIndex"):"auto";return n!=="auto"}function j(t){return t.css("position")!=="static"}function L(t){return t.css("float")!=="none"}function F(t){return["inline-block","inline-table"].indexOf(t.css("display"))!==-1}function I(t){var e=this;return function(){return!t.apply(e,arguments)}}function H(t){return t.node.nodeType===Node.ELEMENT_NODE}function V(t){return t.isPseudoElement===true}function G(t){return t.node.nodeType===Node.TEXT_NODE}function U(n){return function(t,e){return t.cssInt("zIndex")+n.indexOf(t)/n.length-(e.cssInt("zIndex")+n.indexOf(e)/n.length)}}function q(t){return t.getOpacity()<1}function W(t){return parseInt(t,10)}function K(t){return t.width}function Y(t){return t.node.nodeType!==Node.ELEMENT_NODE||["SCRIPT","HEAD","TITLE","OBJECT","BR","OPTION"].indexOf(t.node.nodeName)===-1}function X(t){return[].concat.apply([],t)}function $(t){var e=t.substr(0,1);return e===t.substr(t.length-1)&&e.match(/'|"/)?t.substr(1,t.length-2):t}function Z(t){var e=[],n=0,i=false,r;while(t.length){if(J(t[n])===i){r=t.splice(0,n);if(r.length){e.push(l.ucs2.encode(r))}i=!i;n=0}else{n++}if(n>=t.length){r=t.splice(0,n);if(r.length){e.push(l.ucs2.encode(r))}}}return e}function J(t){return[32,13,10,9,45].indexOf(t)!==-1}function Q(t){return/[^\u0000-\u00ff]/.test(t)}e.exports=r},{"./color":3,"./fontmetrics":7,"./log":13,"./nodecontainer":14,"./pseudoelementcontainer":18,"./stackingcontext":21,"./textcontainer":25,"./utils":26,punycode:1}],16:[function(t,e,n){var o=t("./xhr");var i=t("./utils");var s=t("./log");var l=t("./clone");var u=i.decode64;function c(t,e,n){var i="withCredentials"in new XMLHttpRequest;if(!e){return Promise.reject("No proxy configured")}var r=f(i);var a=d(e,t,r);return i?o(a):h(n,a,r).then(function(t){return u(t.content)})}var r=0;function a(t,e,n){var i="crossOrigin"in new Image;var r=f(i);var a=d(e,t,r);return i?Promise.resolve(a):h(n,a,r).then(function(t){return"data:"+t.type+";base64,"+t.content})}function h(a,t,o){return new Promise(function(e,n){var i=a.createElement("script");var r=function t(){delete window.html2canvas.proxy[o];a.body.removeChild(i)};window.html2canvas.proxy[o]=function(t){r();e(t)};i.src=t;i.onerror=function(t){r();n(t)};a.body.appendChild(i)})}function f(t){return!t?"html2canvas_"+Date.now()+"_"+ ++r+"_"+Math.round(Math.random()*1e5):""}function d(t,e,n){return t+"?url="+encodeURIComponent(e)+(n.length?"&callback=html2canvas.proxy."+n:"")}function g(a){return function(e){var t=new DOMParser,n;try{n=t.parseFromString(e,"text/html")}catch(t){s("DOMParser not supported, falling back to createHTMLDocument");n=document.implementation.createHTMLDocument("");try{n.open();n.write(e);n.close()}catch(t){s("createHTMLDocument write not supported, falling back to document.body.innerHTML");n.body.innerHTML=e}}var i=n.querySelector("base");if(!i||!i.href.host){var r=n.createElement("base");r.href=a;n.head.insertBefore(r,n.head.firstChild)}return n}}function p(t,e,n,i,r,a){return new c(t,e,window.document).then(g(t)).then(function(t){return l(t,n,i,r,a,0,0)})}n.Proxy=c;n.ProxyURL=a;n.loadUrlDocument=p},{"./clone":2,"./log":13,"./utils":26,"./xhr":28}],17:[function(t,e,n){var a=t("./proxy").ProxyURL;function i(n,i){var t=document.createElement("a");t.href=n;n=t.href;this.src=n;this.image=new Image;var r=this;this.promise=new Promise(function(t,e){r.image.crossOrigin="Anonymous";r.image.onload=t;r.image.onerror=e;new a(n,i,document).then(function(t){r.image.src=t})["catch"](e)})}e.exports=i},{"./proxy":16}],18:[function(t,e,n){var i=t("./nodecontainer");function r(t,e,n){i.call(this,t,e);this.isPseudoElement=true;this.before=n===":before"}r.prototype.cloneTo=function(t){r.prototype.cloneTo.call(this,t);t.isPseudoElement=true;t.before=this.before};r.prototype=Object.create(i.prototype);r.prototype.appendToDOM=function(){if(this.before){this.parent.node.insertBefore(this.node,this.parent.node.firstChild)}else{this.parent.node.appendChild(this.node)}this.parent.node.className+=" "+this.getHideClass()};r.prototype.cleanDOM=function(){this.node.parentNode.removeChild(this.node);this.parent.node.className=this.parent.node.className.replace(this.getHideClass(),"")};r.prototype.getHideClass=function(){return this["PSEUDO_HIDE_ELEMENT_CLASS_"+(this.before?"BEFORE":"AFTER")]};r.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE="___html2canvas___pseudoelement_before";r.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER="___html2canvas___pseudoelement_after";e.exports=r},{"./nodecontainer":14}],19:[function(t,e,n){var l=t("./log");function i(t,e,n,i,r){this.width=t;this.height=e;this.images=n;this.options=i;this.document=r}i.prototype.renderImage=function(t,e,n,i){var r=t.cssInt("paddingLeft"),a=t.cssInt("paddingTop"),o=t.cssInt("paddingRight"),s=t.cssInt("paddingBottom"),l=n.borders;var u=e.width-(l[1].width+l[3].width+r+o);var c=e.height-(l[0].width+l[2].width+a+s);this.drawImage(i,0,0,i.image.width||u,i.image.height||c,e.left+r+l[3].width,e.top+a+l[0].width,u,c)};i.prototype.renderBackground=function(t,e,n){if(e.height>0&&e.width>0){this.renderBackgroundColor(t,e);this.renderBackgroundImage(t,e,n)}};i.prototype.renderBackgroundColor=function(t,e){var n=t.color("backgroundColor");if(!n.isTransparent()){this.rectangle(e.left,e.top,e.width,e.height,n)}};i.prototype.renderBorders=function(t){t.forEach(this.renderBorder,this)};i.prototype.renderBorder=function(t){if(!t.color.isTransparent()&&t.args!==null){this.drawShape(t.args,t.color)}};i.prototype.renderBackgroundImage=function(a,o,s){var t=a.parseBackgroundImages();t.reverse().forEach(function(t,e,n){switch(t.method){case"url":var i=this.images.get(t.args[0]);if(i){this.renderBackgroundRepeating(a,o,i,n.length-(e+1),s)}else{l("Error loading background-image",t.args[0])}break;case"linear-gradient":case"gradient":var r=this.images.get(t.value);if(r){this.renderBackgroundGradient(r,o,s)}else{l("Error loading background-image",t.args[0])}break;case"none":break;default:l("Unknown background-image type",t.args[0])}},this)};i.prototype.renderBackgroundRepeating=function(t,e,n,i,r){var a=t.parseBackgroundSize(e,n.image,i);var o=t.parseBackgroundPosition(e,n.image,i,a);var s=t.parseBackgroundRepeat(i);switch(s){case"repeat-x":case"repeat no-repeat":this.backgroundRepeatShape(n,o,a,e,e.left+r[3],e.top+o.top+r[0],99999,a.height,r);break;case"repeat-y":case"no-repeat repeat":this.backgroundRepeatShape(n,o,a,e,e.left+o.left+r[3],e.top+r[0],a.width,99999,r);break;case"no-repeat":this.backgroundRepeatShape(n,o,a,e,e.left+o.left+r[3],e.top+o.top+r[0],a.width,a.height,r);break;default:this.renderBackgroundRepeat(n,o,a,{top:e.top,left:e.left},r[3],r[0]);break}};e.exports=i},{"./log":13}],20:[function(t,e,n){var i=t("../renderer");var r=t("../lineargradientcontainer");var a=t("../log");function o(t,e){i.apply(this,arguments);this.canvas=this.options.canvas||this.document.createElement("canvas");if(!this.options.canvas){this.canvas.width=t;this.canvas.height=e}this.ctx=this.canvas.getContext("2d");this.taintCtx=this.document.createElement("canvas").getContext("2d");this.ctx.textBaseline="bottom";this.variables={};a("Initialized CanvasRenderer with size",t,"x",e)}o.prototype=Object.create(i.prototype);o.prototype.setFillStyle=function(t){this.ctx.fillStyle=j(t)==="object"&&!!t.isColor?t.toString():t;return this.ctx};o.prototype.rectangle=function(t,e,n,i,r){this.setFillStyle(r).fillRect(t,e,n,i)};o.prototype.circle=function(t,e,n,i){this.setFillStyle(i);this.ctx.beginPath();this.ctx.arc(t+n/2,e+n/2,n/2,0,Math.PI*2,true);this.ctx.closePath();this.ctx.fill()};o.prototype.circleStroke=function(t,e,n,i,r,a){this.circle(t,e,n,i);this.ctx.strokeStyle=a.toString();this.ctx.stroke()};o.prototype.drawShape=function(t,e){this.shape(t);this.setFillStyle(e).fill()};o.prototype.taints=function(e){if(e.tainted===null){this.taintCtx.drawImage(e.image,0,0);try{this.taintCtx.getImageData(0,0,1,1);e.tainted=false}catch(t){this.taintCtx=document.createElement("canvas").getContext("2d");e.tainted=true}}return e.tainted};o.prototype.drawImage=function(t,e,n,i,r,a,o,s,l){if(!this.taints(t)||this.options.allowTaint){this.ctx.drawImage(t.image,e,n,i,r,a,o,s,l)}};o.prototype.clip=function(t,e,n){this.ctx.save();t.filter(s).forEach(function(t){this.shape(t).clip()},this);e.call(n);this.ctx.restore()};o.prototype.shape=function(t){this.ctx.beginPath();t.forEach(function(t,e){if(t[0]==="rect"){this.ctx.rect.apply(this.ctx,t.slice(1))}else{this.ctx[e===0?"moveTo":t[0]+"To"].apply(this.ctx,t.slice(1))}},this);this.ctx.closePath();return this.ctx};o.prototype.font=function(t,e,n,i,r,a){this.setFillStyle(t).font=[e,n,i,r,a].join(" ").split(",")[0]};o.prototype.fontShadow=function(t,e,n,i){this.setVariable("shadowColor",t.toString()).setVariable("shadowOffsetY",e).setVariable("shadowOffsetX",n).setVariable("shadowBlur",i)};o.prototype.clearShadow=function(){this.setVariable("shadowColor","rgba(0,0,0,0)")};o.prototype.setOpacity=function(t){this.ctx.globalAlpha=t};o.prototype.setTransform=function(t){this.ctx.translate(t.origin[0],t.origin[1]);this.ctx.transform.apply(this.ctx,t.matrix);this.ctx.translate(-t.origin[0],-t.origin[1])};o.prototype.setVariable=function(t,e){if(this.variables[t]!==e){this.variables[t]=this.ctx[t]=e}return this};o.prototype.text=function(t,e,n){this.ctx.fillText(t,e,n)};o.prototype.backgroundRepeatShape=function(t,e,n,i,r,a,o,s,l){var u=[["line",Math.round(r),Math.round(a)],["line",Math.round(r+o),Math.round(a)],["line",Math.round(r+o),Math.round(s+a)],["line",Math.round(r),Math.round(s+a)]];this.clip([u],function(){this.renderBackgroundRepeat(t,e,n,i,l[3],l[0])},this)};o.prototype.renderBackgroundRepeat=function(t,e,n,i,r,a){var o=Math.round(i.left+e.left+r),s=Math.round(i.top+e.top+a);this.setFillStyle(this.ctx.createPattern(this.resizeImage(t,n),"repeat"));this.ctx.translate(o,s);this.ctx.fill();this.ctx.translate(-o,-s)};o.prototype.renderBackgroundGradient=function(t,e){if(t instanceof r){var n=this.ctx.createLinearGradient(e.left+e.width*t.x0,e.top+e.height*t.y0,e.left+e.width*t.x1,e.top+e.height*t.y1);t.colorStops.forEach(function(t){n.addColorStop(t.stop,t.color.toString())});this.rectangle(e.left,e.top,e.width,e.height,n)}};o.prototype.resizeImage=function(t,e){var n=t.image;if(n.width===e.width&&n.height===e.height){return n}var i,r=document.createElement("canvas");r.width=e.width;r.height=e.height;i=r.getContext("2d");i.drawImage(n,0,0,n.width,n.height,0,0,e.width,e.height);return r};function s(t){return t.length>0}e.exports=o},{"../lineargradientcontainer":12,"../log":13,"../renderer":19}],21:[function(t,e,n){var r=t("./nodecontainer");function i(t,e,n,i){r.call(this,n,i);this.ownStacking=t;this.contexts=[];this.children=[];this.opacity=(this.parent?this.parent.stack.opacity:1)*e}i.prototype=Object.create(r.prototype);i.prototype.getParentStack=function(t){var e=this.parent?this.parent.stack:null;return e?e.ownStacking?e:e.getParentStack(t):t.stack};e.exports=i},{"./nodecontainer":14}],22:[function(t,e,n){function i(t){this.rangeBounds=this.testRangeBounds(t);this.cors=this.testCORS();this.svg=this.testSVG()}i.prototype.testRangeBounds=function(t){var e,n,i,r,a=false;if(t.createRange){e=t.createRange();if(e.getBoundingClientRect){n=t.createElement("boundtest");n.style.height="123px";n.style.display="block";t.body.appendChild(n);e.selectNode(n);i=e.getBoundingClientRect();r=i.height;if(r===123){a=true}t.body.removeChild(n)}}return a};i.prototype.testCORS=function(){return typeof(new Image).crossOrigin!=="undefined"};i.prototype.testSVG=function(){var t=new Image;var e=document.createElement("canvas");var n=e.getContext("2d");t.src="data:image/svg+xml,";try{n.drawImage(t,0,0);e.toDataURL()}catch(t){return false}return true};e.exports=i},{}],23:[function(t,e,n){var i=t("./xhr");var r=t("./utils").decode64;function a(t){this.src=t;this.image=null;var n=this;this.promise=this.hasFabric().then(function(){return n.isInline(t)?Promise.resolve(n.inlineFormatting(t)):i(t)}).then(function(e){return new Promise(function(t){window.html2canvas.svg.fabric.loadSVGFromString(e,n.createCanvas.call(n,t))})})}a.prototype.hasFabric=function(){return!window.html2canvas.svg||!window.html2canvas.svg.fabric?Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")):Promise.resolve()};a.prototype.inlineFormatting=function(t){return/^data:image\/svg\+xml;base64,/.test(t)?this.decode64(this.removeContentType(t)):this.removeContentType(t)};a.prototype.removeContentType=function(t){return t.replace(/^data:image\/svg\+xml(;base64)?,/,"")};a.prototype.isInline=function(t){return/^data:image\/svg\+xml/i.test(t)};a.prototype.createCanvas=function(i){var r=this;return function(t,e){var n=new window.html2canvas.svg.fabric.StaticCanvas("c");r.image=n.lowerCanvasEl;n.setWidth(e.width).setHeight(e.height).add(window.html2canvas.svg.fabric.util.groupSVGElements(t,e)).renderAll();i(n.lowerCanvasEl)}};a.prototype.decode64=function(t){return typeof window.atob==="function"?window.atob(t):r(t)};e.exports=a},{"./utils":26,"./xhr":28}],24:[function(t,e,n){var i=t("./svgcontainer");function r(n,t){this.src=n;this.image=null;var i=this;this.promise=t?new Promise(function(t,e){i.image=new Image;i.image.onload=t;i.image.onerror=e;i.image.src="data:image/svg+xml,"+(new XMLSerializer).serializeToString(n);if(i.image.complete===true){t(i.image)}}):this.hasFabric().then(function(){return new Promise(function(t){window.html2canvas.svg.fabric.parseSVGDocument(n,i.createCanvas.call(i,t))})})}r.prototype=Object.create(i.prototype);e.exports=r},{"./svgcontainer":23}],25:[function(t,e,n){var i=t("./nodecontainer");function r(t,e){i.call(this,t,e)}r.prototype=Object.create(i.prototype);r.prototype.applyTextTransform=function(){this.node.data=this.transform(this.parent.css("textTransform"))};r.prototype.transform=function(t){var e=this.node.data;switch(t){case"lowercase":return e.toLowerCase();case"capitalize":return e.replace(/(^|\s|:|-|\(|\))([a-z])/g,a);case"uppercase":return e.toUpperCase();default:return e}};function a(t,e,n){if(t.length>0){return e+n.toUpperCase()}}e.exports=r},{"./nodecontainer":14}],26:[function(t,e,n){n.smallImage=function t(){return"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"};n.bind=function(t,e){return function(){return t.apply(e,arguments)}};n.decode64=function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var n=t.length,i,r,a,o,s,l,u,c;var h="";for(i=0;i>4;u=(a&15)<<4|o>>2;c=(o&3)<<6|s;if(o===64){h+=String.fromCharCode(l)}else if(s===64||s===-1){h+=String.fromCharCode(l,u)}else{h+=String.fromCharCode(l,u,c)}}return h};n.getBounds=function(t){if(t.getBoundingClientRect){var e=t.getBoundingClientRect();var n=t.offsetWidth==null?e.width:t.offsetWidth;return{top:e.top,bottom:e.bottom||e.top+e.height,right:e.left+n,left:e.left,width:n,height:t.offsetHeight==null?e.height:t.offsetHeight}}return{}};n.offsetBounds=function(t){var e=t.offsetParent?n.offsetBounds(t.offsetParent):{top:0,left:0};return{top:t.offsetTop+e.top,bottom:t.offsetTop+t.offsetHeight+e.top,right:t.offsetLeft+e.left+t.offsetWidth,left:t.offsetLeft+e.left,width:t.offsetWidth,height:t.offsetHeight}};n.parseBackgrounds=function(t){var e=" \r\n\t",n,i,r,a,o,s=[],l=0,u=0,c,h;var f=function t(){if(n){if(i.substr(0,1)==='"'){i=i.substr(1,i.length-2)}if(i){h.push(i)}if(n.substr(0,1)==="-"&&(a=n.indexOf("-",1)+1)>0){r=n.substr(0,a);n=n.substr(a)}s.push({prefix:r,method:n.toLowerCase(),value:o,args:h,image:null})}h=[];n=r=i=o=""};h=[];n=r=i=o="";t.split("").forEach(function(t){if(l===0&&e.indexOf(t)>-1){return}switch(t){case'"':if(!c){c=t}else if(c===t){c=null}break;case"(":if(c){break}else if(l===0){l=1;o+=t;return}else{u++}break;case")":if(c){break}else if(l===1){if(u===0){l=0;o+=t;f();return}else{u--}}break;case",":if(c){break}else if(l===0){f();return}else if(l===1){if(u===0&&!n.match(/^url$/i)){h.push(i);i="";o+=t;return}}break}o+=t;if(l===0){n+=t}else{i+=t}});f();return s}},{}],27:[function(t,e,n){var i=t("./gradientcontainer");function r(t){i.apply(this,arguments);this.type=t.args[0]==="linear"?i.TYPES.LINEAR:i.TYPES.RADIAL}r.prototype=Object.create(i.prototype);e.exports=r},{"./gradientcontainer":9}],28:[function(t,e,n){function i(i){return new Promise(function(t,e){var n=new XMLHttpRequest;n.open("GET",i);n.onload=function(){if(n.status===200){t(n.responseText)}else{e(new Error(n.statusText))}};n.onerror=function(){e(new Error("Network Error"))};n.send()})}e.exports=i},{}]},{},[4])(4)})});var nV=function t(e){this.ok=false;this.alpha=1;if(e.charAt(0)=="#"){e=e.substr(1,6)}e=e.replace(/ /g,"");e=e.toLowerCase();var c={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};e=c[e]||e;var h=[{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,example:["rgba(123, 234, 45, 0.8)","rgba(255,234,245,1.0)"],process:function t(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3]),parseFloat(e[4])]}},{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function t(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function t(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function t(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}}];for(var n=0;n3){this.alpha=o[3]}this.ok=true}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"};this.toHex=function(){var t=this.r.toString(16);var e=this.g.toString(16);var n=this.b.toString(16);if(t.length==1)t="0"+t;if(e.length==1)e="0"+e;if(n.length==1)n="0"+n;return"#"+t+e+n};this.getHelpXML=function(){var t=new Array;for(var e=0;e "+s.toRGB()+" -> "+s.toHex());o.appendChild(l);o.appendChild(u);a.appendChild(o)}catch(t){}}return a}};var iV=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];var rV=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function aV(t,e,n,i){if(isNaN(i)||i<1)return;i|=0;var r,a,o,s,l,u,c,h,f,d,g,p,v,m,y,_,b,w,x,k,S,C,E,A;var M=i+i+1;var R=e-1;var T=n-1;var O=i+1;var B=O*(O+1)/2;var P=new oV;var N=P;for(o=1;o>F;if(E!=0){E=255/E;t[u]=(h*L>>F)*E;t[u+1]=(f*L>>F)*E;t[u+2]=(d*L>>F)*E}else{t[u]=t[u+1]=t[u+2]=0}h-=p;f-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=c+((s=r+i+1)>F;if(E>0){E=255/E;t[s]=(h*L>>F)*E;t[s+1]=(f*L>>F)*E;t[s+2]=(d*L>>F)*E}else{t[s]=t[s+1]=t[s+2]=0}h-=p;f-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=r+((s=a+O)65535){t-=65536;var e=55296+(t>>10),n=56320+(t&1023);return String.fromCharCode(e,n)}else{return String.fromCharCode(t)}}function s(t){var e=t.slice(1,-1);if(e in i){return i[e]}else if(e.charAt(0)==="#"){return o(parseInt(e.substr(1).replace("x","0x")))}else{a.error("entity not found:"+t);return t}}function e(t){if(t>p){var e=n.substring(p,t).replace(/&#?\w+;/g,s);f&&l(p);r.characters(e,0,t-p);p=t}}function l(t,e){while(t>=c&&(e=h.exec(n))){u=e.index;c=u+e[0].length;f.lineNumber++}f.columnNumber=t-u+1}var u=0;var c=0;var h=/.*(?:\r\n?|\n)|.*$/g;var f=r.locator;var d=[{currentNSMap:t}];var g={};var p=0;while(true){try{var v=n.indexOf("<",p);if(v<0){if(!n.substr(p).match(/^\s*$/)){var m=r.doc;var y=m.createTextNode(n.substr(p));m.appendChild(y);r.currentElement=y}return}if(v>p){e(v)}switch(n.charAt(v+1)){case"/":var _=n.indexOf(">",v+3);var b=n.substring(v+2,_);var w=d.pop();if(_<0){b=n.substring(v+2).replace(/[\s<].*/,"");a.error("end tag name: "+b+" is not complete:"+w.tagName);_=v+1+b.length}else if(b.match(/\sp){p=_}else{e(Math.max(v,p)+1)}}}function wV(t,e){e.lineNumber=t.lineNumber;e.columnNumber=t.columnNumber;return e}function xV(t,e,n,i,r,a){var o;var s;var l=++e;var u=hV;while(true){var c=t.charAt(l);switch(c){case"=":if(u===fV){o=t.slice(e,l);u=gV}else if(u===dV){u=gV}else{throw new Error("attribute equal must after attrName")}break;case"'":case'"':if(u===gV||u===fV){if(u===fV){a.warning('attribute value must after "="');o=t.slice(e,l)}e=l+1;l=t.indexOf(c,e);if(l>0){s=t.slice(e,l).replace(/&#?\w+;/g,r);n.add(o,s,e-1);u=vV}else{throw new Error("attribute value no end '"+c+"' match")}}else if(u==pV){s=t.slice(e,l).replace(/&#?\w+;/g,r);n.add(o,s,e);a.warning('attribute "'+o+'" missed start quot('+c+")!!");e=l+1;u=vV}else{throw new Error('attribute value must after "="')}break;case"/":switch(u){case hV:n.setTagName(t.slice(e,l));case vV:case mV:case yV:u=yV;n.closed=true;case pV:case fV:case dV:break;default:throw new Error("attribute invalid close char('/')")}break;case"":a.error("unexpected end of input");if(u==hV){n.setTagName(t.slice(e,l))}return l;case">":switch(u){case hV:n.setTagName(t.slice(e,l));case vV:case mV:case yV:break;case pV:case fV:s=t.slice(e,l);if(s.slice(-1)==="/"){n.closed=true;s=s.slice(0,-1)}case dV:if(u===dV){s=o}if(u==pV){a.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s.replace(/&#?\w+;/g,r),e)}else{if(i[""]!=="http://www.w3.org/1999/xhtml"||!s.match(/^(?:disabled|checked|selected)$/i)){a.warning('attribute "'+s+'" missed value!! "'+s+'" instead!!')}n.add(s,s,e)}break;case gV:throw new Error("attribute value missed!!")}return l;case"€":c=" ";default:if(c<=" "){switch(u){case hV:n.setTagName(t.slice(e,l));u=mV;break;case fV:o=t.slice(e,l);u=dV;break;case pV:var s=t.slice(e,l).replace(/&#?\w+;/g,r);a.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s,e);case vV:u=mV;break}}else{switch(u){case dV:var h=n.tagName;if(i[""]!=="http://www.w3.org/1999/xhtml"||!o.match(/^(?:disabled|checked|selected)$/i)){a.warning('attribute "'+o+'" missed value!! "'+o+'" instead2!!')}n.add(o,o,e);e=l;u=fV;break;case vV:a.warning('attribute space is required"'+o+'"!!');case mV:u=fV;e=l;break;case gV:u=pV;e=l;break;case yV:throw new Error("elements closed character '/' and '>' must be connected to")}}}l++}}function kV(t,e,n){var i=t.tagName;var r=null;var a=t.length;while(a--){var o=t[a];var s=o.qName;var l=o.value;var u=s.indexOf(":");if(u>0){var c=o.prefix=s.slice(0,u);var h=s.slice(u+1);var f=c==="xmlns"&&h}else{h=s;c=null;f=s==="xmlns"&&""}o.localName=h;if(f!==false){if(r==null){r={};EV(n,n={})}n[f]=r[f]=l;o.uri="http://www.w3.org/2000/xmlns/";e.startPrefixMapping(f,l)}}var a=t.length;while(a--){o=t[a];var c=o.prefix;if(c){if(c==="xml"){o.uri="http://www.w3.org/XML/1998/namespace"}if(c!=="xmlns"){o.uri=n[c||""]}}}var u=i.indexOf(":");if(u>0){c=t.prefix=i.slice(0,u);h=t.localName=i.slice(u+1)}else{c=null;h=t.localName=i}var d=t.uri=n[c||""];e.startElement(d,h,i,t);if(t.closed){e.endElement(d,h,i);if(r){for(c in r){e.endPrefixMapping(c)}}}else{t.currentNSMap=n;t.localNSMap=r;return true}}function SV(t,e,n,i,r){if(/^(?:script|textarea)$/i.test(n)){var a=t.indexOf("",e);var o=t.substring(e+1,a);if(/[&<]/.test(o)){if(/^script$/i.test(n)){r.characters(o,0,o.length);return a}o=o.replace(/&#?\w+;/g,i);r.characters(o,0,o.length);return a}}return e+1}function CV(t,e,n,i){var r=i[n];if(r==null){r=t.lastIndexOf("");if(re){n.comment(t,e+4,a-e-4);return a+3}else{i.error("Unclosed comment");return-1}}else{return-1}default:if(t.substr(e+3,6)=="CDATA["){var a=t.indexOf("]]>",e+9);n.startCDATA();n.characters(t,e+9,a-e-9);n.endCDATA();return a+3}var o=OV(t,e);var s=o.length;if(s>1&&/!doctype/i.test(o[0][0])){var l=o[1][0];var u=s>3&&/^public$/i.test(o[2][0])&&o[3][0];var c=s>4&&o[4][0];var h=o[s-1];n.startDTD(l,u&&u.replace(/^(['"])(.*?)\1$/,"$2"),c&&c.replace(/^(['"])(.*?)\1$/,"$2"));n.endDTD();return h.index+h[0].length}}return-1}function MV(t,e,n){var i=t.indexOf("?>",e);if(i){var r=t.substring(e,i).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(r){var a=r[0].length;n.processingInstruction(r[1],r[2]);return i+2}else{return-1}}return-1}function RV(t){}RV.prototype={setTagName:function t(e){if(!cV.test(e)){throw new Error("invalid tagName:"+e)}this.tagName=e},add:function t(e,n,i){if(!cV.test(e)){throw new Error("invalid attribute:"+e)}this[this.length++]={qName:e,value:n,offset:i}},length:0,getLocalName:function t(e){return this[e].localName},getLocator:function t(e){return this[e].locator},getQName:function t(e){return this[e].qName},getURI:function t(e){return this[e].uri},getValue:function t(e){return this[e].value}};function TV(t,e){t.__proto__=e;return t}if(!(TV({},TV.prototype)instanceof TV)){TV=function t(e,n){function i(){}i.prototype=n;i=new i;for(n in e){i[n]=e[n]}return i}}function OV(t,e){var n;var i=[];var r=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;r.lastIndex=e;r.exec(t);while(n=r.exec(t)){i.push(n);if(n[1])return i}}var BV=_V;var PV={XMLReader:BV};function NV(t,e){for(var n in t){e[n]=t[n]}}function DV(t,e){var n=t.prototype;if(Object.create){var i=Object.create(e.prototype);n.__proto__=i}if(!(n instanceof e)){var r=function t(){};r.prototype=e.prototype;r=new r;NV(n,r);t.prototype=n=r}if(n.constructor!=t){if(typeof t!="function"){console.error("unknow Class:"+t)}n.constructor=t}}var zV="http://www.w3.org/1999/xhtml";var jV={};var LV=jV.ELEMENT_NODE=1;var FV=jV.ATTRIBUTE_NODE=2;var IV=jV.TEXT_NODE=3;var HV=jV.CDATA_SECTION_NODE=4;var VV=jV.ENTITY_REFERENCE_NODE=5;var GV=jV.ENTITY_NODE=6;var UV=jV.PROCESSING_INSTRUCTION_NODE=7;var qV=jV.COMMENT_NODE=8;var WV=jV.DOCUMENT_NODE=9;var KV=jV.DOCUMENT_TYPE_NODE=10;var YV=jV.DOCUMENT_FRAGMENT_NODE=11;var XV=jV.NOTATION_NODE=12;var $V={};var ZV={};var JV=$V.INDEX_SIZE_ERR=(ZV[1]="Index size error",1);var QV=$V.DOMSTRING_SIZE_ERR=(ZV[2]="DOMString size error",2);var tG=$V.HIERARCHY_REQUEST_ERR=(ZV[3]="Hierarchy request error",3);var eG=$V.WRONG_DOCUMENT_ERR=(ZV[4]="Wrong document",4);var nG=$V.INVALID_CHARACTER_ERR=(ZV[5]="Invalid character",5);var iG=$V.NO_DATA_ALLOWED_ERR=(ZV[6]="No data allowed",6);var rG=$V.NO_MODIFICATION_ALLOWED_ERR=(ZV[7]="No modification allowed",7);var aG=$V.NOT_FOUND_ERR=(ZV[8]="Not found",8);var oG=$V.NOT_SUPPORTED_ERR=(ZV[9]="Not supported",9);var sG=$V.INUSE_ATTRIBUTE_ERR=(ZV[10]="Attribute in use",10);var lG=$V.INVALID_STATE_ERR=(ZV[11]="Invalid state",11);var uG=$V.SYNTAX_ERR=(ZV[12]="Syntax error",12);var cG=$V.INVALID_MODIFICATION_ERR=(ZV[13]="Invalid modification",13);var hG=$V.NAMESPACE_ERR=(ZV[14]="Invalid namespace",14);var fG=$V.INVALID_ACCESS_ERR=(ZV[15]="Invalid access",15);function dG(t,e){if(e instanceof Error){var n=e}else{n=this;Error.call(this,ZV[t]);this.message=ZV[t];if(Error.captureStackTrace)Error.captureStackTrace(this,dG)}n.code=t;if(e)this.message=this.message+": "+e;return n}dG.prototype=Error.prototype;NV($V,dG);function gG(){}gG.prototype={length:0,item:function t(e){return this[e]||null},toString:function t(e,n){for(var i=[],r=0;r=0){var r=e.length-1;while(i0},lookupPrefix:function t(e){var n=this;while(n){var i=n._nsMap;if(i){for(var r in i){if(i[r]==e){return r}}}n=n.nodeType==FV?n.ownerDocument:n.parentNode}return null},lookupNamespaceURI:function t(e){var n=this;while(n){var i=n._nsMap;if(i){if(e in i){return i[e]}}n=n.nodeType==FV?n.ownerDocument:n.parentNode}return null},isDefaultNamespace:function t(e){var n=this.lookupPrefix(e);return n==null}};function kG(t){return t=="<"&&"<"||t==">"&&">"||t=="&"&&"&"||t=='"'&&"""||"&#"+t.charCodeAt()+";"}NV(jV,xG);NV(jV,xG.prototype);function SG(t,e){if(e(t)){return true}if(t=t.firstChild){do{if(SG(t,e)){return true}}while(t=t.nextSibling)}}function CG(){}function EG(t,e,n){t&&t._inc++;var i=n.namespaceURI;if(i=="http://www.w3.org/2000/xmlns/"){e._nsMap[n.prefix?n.localName:""]=n.value}}function AG(t,e,n,i){t&&t._inc++;var r=n.namespaceURI;if(r=="http://www.w3.org/2000/xmlns/"){delete e._nsMap[n.prefix?n.localName:""]}}function MG(t,e,n){if(t&&t._inc){t._inc++;var i=e.childNodes;if(n){i[i.length++]=n}else{var r=e.firstChild;var a=0;while(r){i[a++]=r;r=r.nextSibling}i.length=a}}}function RG(t,e){var n=e.previousSibling;var i=e.nextSibling;if(n){n.nextSibling=i}else{t.firstChild=i}if(i){i.previousSibling=n}else{t.lastChild=n}MG(t.ownerDocument,t);return e}function TG(t,e,n){var i=e.parentNode;if(i){i.removeChild(e)}if(e.nodeType===YV){var r=e.firstChild;if(r==null){return e}var a=e.lastChild}else{r=a=e}var o=n?n.previousSibling:t.lastChild;r.previousSibling=o;a.nextSibling=n;if(o){o.nextSibling=r}else{t.firstChild=r}if(n==null){t.lastChild=a}else{n.previousSibling=a}do{r.parentNode=t}while(r!==a&&(r=r.nextSibling));MG(t.ownerDocument||t,t);if(e.nodeType==YV){e.firstChild=e.lastChild=null}return e}function OG(t,e){var n=e.parentNode;if(n){var i=t.lastChild;n.removeChild(e);var i=t.lastChild}var i=t.lastChild;e.parentNode=t;e.previousSibling=i;e.nextSibling=null;if(i){i.nextSibling=e}else{t.firstChild=e}t.lastChild=e;MG(t.ownerDocument,t,e);return e}CG.prototype={nodeName:"#document",nodeType:WV,doctype:null,documentElement:null,_inc:1,insertBefore:function t(e,n){if(e.nodeType==YV){var i=e.firstChild;while(i){var r=i.nextSibling;this.insertBefore(i,n);i=r}return e}if(this.documentElement==null&&e.nodeType==LV){this.documentElement=e}return TG(this,e,n),e.ownerDocument=this,e},removeChild:function t(e){if(this.documentElement==e){this.documentElement=null}return RG(this,e)},importNode:function t(e,n){return YG(this,e,n)},getElementById:function t(e){var n=null;SG(this.documentElement,function(t){if(t.nodeType==LV){if(t.getAttribute("id")==e){n=t;return true}}});return n},createElement:function t(e){var n=new BG;n.ownerDocument=this;n.nodeName=e;n.tagName=e;n.childNodes=new gG;var i=n.attributes=new mG;i._ownerElement=n;return n},createDocumentFragment:function t(){var e=new VG;e.ownerDocument=this;e.childNodes=new gG;return e},createTextNode:function t(e){var n=new DG;n.ownerDocument=this;n.appendData(e);return n},createComment:function t(e){var n=new zG;n.ownerDocument=this;n.appendData(e);return n},createCDATASection:function t(e){var n=new jG;n.ownerDocument=this;n.appendData(e);return n},createProcessingInstruction:function t(e,n){var i=new GG;i.ownerDocument=this;i.tagName=i.target=e;i.nodeValue=i.data=n;return i},createAttribute:function t(e){var n=new PG;n.ownerDocument=this;n.name=e;n.nodeName=e;n.localName=e;n.specified=true;return n},createEntityReference:function t(e){var n=new HG;n.ownerDocument=this;n.nodeName=e;return n},createElementNS:function t(e,n){var i=new BG;var r=n.split(":");var a=i.attributes=new mG;i.childNodes=new gG;i.ownerDocument=this;i.nodeName=n;i.tagName=n;i.namespaceURI=e;if(r.length==2){i.prefix=r[0];i.localName=r[1]}else{i.localName=n}a._ownerElement=i;return i},createAttributeNS:function t(e,n){var i=new PG;var r=n.split(":");i.ownerDocument=this;i.nodeName=n;i.name=n;i.namespaceURI=e;i.specified=true;if(r.length==2){i.prefix=r[0];i.localName=r[1]}else{i.localName=n}return i}};DV(CG,xG);function BG(){this._nsMap={}}BG.prototype={nodeType:LV,hasAttribute:function t(e){return this.getAttributeNode(e)!=null},getAttribute:function t(e){var n=this.getAttributeNode(e);return n&&n.value||""},getAttributeNode:function t(e){return this.attributes.getNamedItem(e)},setAttribute:function t(e,n){var i=this.ownerDocument.createAttribute(e);i.value=i.nodeValue=""+n;this.setAttributeNode(i)},removeAttribute:function t(e){var n=this.getAttributeNode(e);n&&this.removeAttributeNode(n)},appendChild:function t(e){if(e.nodeType===YV){return this.insertBefore(e,null)}else{return OG(this,e)}},setAttributeNode:function t(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function t(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function t(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function t(e,n){var i=this.getAttributeNodeNS(e,n);i&&this.removeAttributeNode(i)},hasAttributeNS:function t(e,n){return this.getAttributeNodeNS(e,n)!=null},getAttributeNS:function t(e,n){var i=this.getAttributeNodeNS(e,n);return i&&i.value||""},setAttributeNS:function t(e,n,i){var r=this.ownerDocument.createAttributeNS(e,n);r.value=r.nodeValue=""+i;this.setAttributeNode(r)},getAttributeNodeNS:function t(e,n){return this.attributes.getNamedItemNS(e,n)},getElementsByTagName:function t(i){return new pG(this,function(e){var n=[];SG(e,function(t){if(t!==e&&t.nodeType==LV&&(i==="*"||t.tagName==i)){n.push(t)}});return n})},getElementsByTagNameNS:function t(i,r){return new pG(this,function(e){var n=[];SG(e,function(t){if(t!==e&&t.nodeType===LV&&(i==="*"||t.namespaceURI===i)&&(r==="*"||t.localName==r)){n.push(t)}});return n})}};CG.prototype.getElementsByTagName=BG.prototype.getElementsByTagName;CG.prototype.getElementsByTagNameNS=BG.prototype.getElementsByTagNameNS;DV(BG,xG);function PG(){}PG.prototype.nodeType=FV;DV(PG,xG);function NG(){}NG.prototype={data:"",substringData:function t(e,n){return this.data.substring(e,e+n)},appendData:function t(e){e=this.data+e;this.nodeValue=this.data=e;this.length=e.length},insertData:function t(e,n){this.replaceData(e,0,n)},appendChild:function t(e){throw new Error(ZV[tG])},deleteData:function t(e,n){this.replaceData(e,n,"")},replaceData:function t(e,n,i){var r=this.data.substring(0,e);var a=this.data.substring(e+n);i=r+i+a;this.nodeValue=this.data=i;this.length=i.length}};DV(NG,xG);function DG(){}DG.prototype={nodeName:"#text",nodeType:IV,splitText:function t(e){var n=this.data;var i=n.substring(e);n=n.substring(0,e);this.data=this.nodeValue=n;this.length=n.length;var r=this.ownerDocument.createTextNode(i);if(this.parentNode){this.parentNode.insertBefore(r,this.nextSibling)}return r}};DV(DG,NG);function zG(){}zG.prototype={nodeName:"#comment",nodeType:qV};DV(zG,NG);function jG(){}jG.prototype={nodeName:"#cdata-section",nodeType:HV};DV(jG,NG);function LG(){}LG.prototype.nodeType=KV;DV(LG,xG);function FG(){}FG.prototype.nodeType=XV;DV(FG,xG);function IG(){}IG.prototype.nodeType=GV;DV(IG,xG);function HG(){}HG.prototype.nodeType=VV;DV(HG,xG);function VG(){}VG.prototype.nodeName="#document-fragment";VG.prototype.nodeType=YV;DV(VG,xG);function GG(){}GG.prototype.nodeType=UV;DV(GG,xG);function UG(){}UG.prototype.serializeToString=function(t,e,n){return qG.call(t,e,n)};xG.prototype.toString=qG;function qG(t,e){var n=[];var i=this.nodeType==9?this.documentElement:this;var r=i.prefix;var a=i.namespaceURI;if(a&&r==null){var r=i.lookupPrefix(a);if(r==null){var o=[{namespace:a,prefix:null}]}}KG(this,n,t,e,o);return n.join("")}function WG(t,e,n){var i=t.prefix||"";var r=t.namespaceURI;if(!i&&!r){return false}if(i==="xml"&&r==="http://www.w3.org/XML/1998/namespace"||r=="http://www.w3.org/2000/xmlns/"){return false}var a=n.length;while(a--){var o=n[a];if(o.prefix==i){return o.namespace!=r}}return true}function KG(t,e,n,i,r){if(i){t=i(t);if(t){if(typeof t=="string"){e.push(t);return}}else{return}}switch(t.nodeType){case LV:if(!r)r=[];var a=r.length;var o=t.attributes;var s=o.length;var l=t.firstChild;var u=t.tagName;n=zV===t.namespaceURI||n;e.push("<",u);for(var c=0;c");if(n&&/^script$/i.test(u)){while(l){if(l.data){e.push(l.data)}else{KG(l,e,n,i,r)}l=l.nextSibling}}else{while(l){KG(l,e,n,i,r);l=l.nextSibling}}e.push("")}else{e.push("/>")}return;case WV:case YV:var l=t.firstChild;while(l){KG(l,e,n,i,r);l=l.nextSibling}return;case FV:return e.push(" ",t.name,'="',t.value.replace(/[<&"]/g,kG),'"');case IV:return e.push(t.data.replace(/[<&]/g,kG));case HV:return e.push("");case qV:return e.push("\x3c!--",t.data,"--\x3e");case KV:var p=t.publicId;var v=t.systemId;e.push("')}else if(v&&v!="."){e.push(' SYSTEM "',v,'">')}else{var m=t.internalSubset;if(m){e.push(" [",m,"]")}e.push(">")}return;case UV:return e.push("");case VV:return e.push("&",t.nodeName,";");default:e.push("??",t.nodeName)}}function YG(t,e,n){var i;switch(e.nodeType){case LV:i=e.cloneNode(false);i.ownerDocument=t;case YV:break;case FV:n=true;break}if(!i){i=e.cloneNode(false)}i.ownerDocument=t;i.parentNode=null;if(n){var r=e.firstChild;while(r){i.appendChild(YG(t,r,n));r=r.nextSibling}}return i}function XG(t,e,n){var i=new e.constructor;for(var r in e){var a=e[r];if(j(a)!="object"){if(a!=i[r]){i[r]=a}}}if(e.childNodes){i.childNodes=new gG}i.ownerDocument=t;switch(i.nodeType){case LV:var o=e.attributes;var s=i.attributes=new mG;var l=o.length;s._ownerElement=i;for(var u=0;u",amp:"&",quot:'"',apos:"'"};if(o){r.setDocumentLocator(o)}i.errorHandler=u(a,r,o);i.domBuilder=n.domBuilder||r;if(/\/x?html?$/.test(e)){l.nbsp=" ";l.copy="©";s[""]="http://www.w3.org/1999/xhtml"}s.xml=s.xml||"http://www.w3.org/XML/1998/namespace";if(t){i.parse(t,s,l)}else{i.errorHandler.error("invalid doc source")}return r.doc};function u(i,t,r){if(!i){if(t instanceof c){return t}i=t}var a={};var o=i instanceof Function;r=r||{};function e(e){var n=i[e];if(!n&&o){n=i.length==2?function(t){i(e,t)}:i}a[e]=n&&function(t){n("[xmldom "+e+"]\t"+t+s(r))}||function(){}}e("warning");e("error");e("fatalError");return a}function c(){this.cdata=false}function h(t,e){e.lineNumber=t.lineNumber;e.columnNumber=t.columnNumber}c.prototype={startDocument:function t(){this.doc=(new i).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function t(e,n,i,r){var a=this.doc;var o=a.createElementNS(e,i||n);var s=r.length;f(this,o);this.currentElement=o;this.locator&&h(this.locator,o);for(var l=0;l=e+n||e){return new java.lang.String(t,e,n)+""}return t}}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(t){c.prototype[t]=function(){return null}});function f(t,e){if(!t.currentElement){t.doc.appendChild(e)}else{t.currentElement.appendChild(e)}}var d=PV.XMLReader;var i=e.DOMImplementation=tU.DOMImplementation;e.XMLSerializer=tU.XMLSerializer;e.DOMParser=n});var nU=eU.DOMImplementation;var iU=eU.XMLSerializer;var rU=eU.DOMParser;function aU(t,e,n){if(t==null&&e==null&&n==null){var i=document.querySelectorAll("svg");for(var r=0;r~\.\[:]+)/g;var n=/(\.[^\s\+>~\.\[:]+)/g;var i=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi;var o=/(:[\w-]+\([^\)]*\))/gi;var s=/(:[^\s\+>~\.\[:]+)/g;var l=/([^\s\+>~\.\[:]+)/g;var u=function t(e,n){var i=r.match(e);if(i==null){return}a[n]+=i.length;r=r.replace(e," ")};r=r.replace(/:not\(([^\)]*)\)/g," $1 ");r=r.replace(/{[^]*/gm," ");u(t,1);u(e,0);u(n,1);u(i,2);u(o,1);u(s,1);r=r.replace(/[\*\s\+>~]/g," ");r=r.replace(/[#\.]/g," ");u(l,2);return a.join("")}function lU(t){var B={opts:t};var u=oU();if(typeof CanvasRenderingContext2D!="undefined"){CanvasRenderingContext2D.prototype.drawSvg=function(t,e,n,i,r,a){var o={ignoreMouse:true,ignoreAnimation:true,ignoreDimensions:true,ignoreClear:true,offsetX:e,offsetY:n,scaleWidth:i,scaleHeight:r};for(var s in a){if(a.hasOwnProperty(s)){o[s]=a[s]}}aU(this.canvas,t,o)}}B.FRAMERATE=30;B.MAX_VIRTUAL_PIXELS=3e4;B.log=function(t){};if(B.opts.log==true&&typeof console!="undefined"){B.log=function(t){console.log(t)}}B.init=function(t){var e=0;B.UniqueId=function(){e++;return"canvg"+e};B.Definitions={};B.Styles={};B.StylesSpecificity={};B.Animations=[];B.Images=[];B.ctx=t;B.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(t,e){this.viewPorts.push({width:t,height:e})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};this.ComputeSize=function(t){if(t!=null&&typeof t=="number")return t;if(t=="x")return this.width();if(t=="y")return this.height();return Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};B.init();B.ImagesLoaded=function(){for(var t=0;t]*>/,"");var e=new ActiveXObject("Microsoft.XMLDOM");e.async="false";e.loadXML(t);return e}};B.Property=function(t,e){this.name=t;this.value=e};B.Property.prototype.getValue=function(){return this.value};B.Property.prototype.hasValue=function(){return this.value!=null&&this.value!=""};B.Property.prototype.numValue=function(){if(!this.hasValue())return 0;var t=parseFloat(this.value);if((this.value+"").match(/%$/)){t=t/100}return t};B.Property.prototype.valueOrDefault=function(t){if(this.hasValue())return this.value;return t};B.Property.prototype.numValueOrDefault=function(t){if(this.hasValue())return this.numValue();return t};B.Property.prototype.addOpacity=function(t){var e=this.value;if(t.value!=null&&t.value!=""&&typeof this.value=="string"){var n=new nV(this.value);if(n.ok){e="rgba("+n.r+", "+n.g+", "+n.b+", "+t.numValue()+")"}}return new B.Property(this.name,e)};B.Property.prototype.getDefinition=function(){var t=this.value.match(/#([^\)'"]+)/);if(t){t=t[1]}if(!t){t=this.value}return B.Definitions[t]};B.Property.prototype.isUrlDefinition=function(){return this.value.indexOf("url(")==0};B.Property.prototype.getFillStyleDefinition=function(t,e){var n=this.getDefinition();if(n!=null&&n.createGradient){return n.createGradient(B.ctx,t,e)}if(n!=null&&n.createPattern){if(n.getHrefAttribute().hasValue()){var i=n.attribute("patternTransform");n=n.getHrefAttribute().getDefinition();if(i.hasValue()){n.attribute("patternTransform",true).value=i.value}}return n.createPattern(B.ctx,t)}return null};B.Property.prototype.getDPI=function(t){return 96};B.Property.prototype.getEM=function(t){var e=12;var n=new B.Property("fontSize",B.Font.Parse(B.ctx.font).fontSize);if(n.hasValue())e=n.toPixels(t);return e};B.Property.prototype.getUnits=function(){var t=this.value+"";return t.replace(/[0-9\.\-]/g,"")};B.Property.prototype.toPixels=function(t,e){if(!this.hasValue())return 0;var n=this.value+"";if(n.match(/em$/))return this.numValue()*this.getEM(t);if(n.match(/ex$/))return this.numValue()*this.getEM(t)/2;if(n.match(/px$/))return this.numValue();if(n.match(/pt$/))return this.numValue()*this.getDPI(t)*(1/72);if(n.match(/pc$/))return this.numValue()*15;if(n.match(/cm$/))return this.numValue()*this.getDPI(t)/2.54;if(n.match(/mm$/))return this.numValue()*this.getDPI(t)/25.4;if(n.match(/in$/))return this.numValue()*this.getDPI(t);if(n.match(/%$/))return this.numValue()*B.ViewPort.ComputeSize(t);var i=this.numValue();if(e&&i<1)return i*B.ViewPort.ComputeSize(t);return i};B.Property.prototype.toMilliseconds=function(){if(!this.hasValue())return 0;var t=this.value+"";if(t.match(/s$/))return this.numValue()*1e3;if(t.match(/ms$/))return this.numValue();return this.numValue()};B.Property.prototype.toRadians=function(){if(!this.hasValue())return 0;var t=this.value+"";if(t.match(/deg$/))return this.numValue()*(Math.PI/180);if(t.match(/grad$/))return this.numValue()*(Math.PI/200);if(t.match(/rad$/))return this.numValue();return this.numValue()*(Math.PI/180)};var e={baseline:"alphabetic","before-edge":"top","text-before-edge":"top",middle:"middle",central:"middle","after-edge":"bottom","text-after-edge":"bottom",ideographic:"ideographic",alphabetic:"alphabetic",hanging:"hanging",mathematical:"alphabetic"};B.Property.prototype.toTextBaseline=function(){if(!this.hasValue())return null;return e[this.value]};B.Font=new function(){this.Styles="normal|italic|oblique|inherit";this.Variants="normal|small-caps|inherit";this.Weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";this.CreateFont=function(t,e,n,i,r,a){var o=a!=null?this.Parse(a):this.CreateFont("","","","","",B.ctx.font);return{fontFamily:r||o.fontFamily,fontSize:i||o.fontSize,fontStyle:t||o.fontStyle,fontWeight:n||o.fontWeight,fontVariant:e||o.fontVariant,toString:function t(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var o=this;this.Parse=function(t){var e={};var n=B.trim(B.compressSpaces(t||"")).split(" ");var i={fontSize:false,fontStyle:false,fontWeight:false,fontVariant:false};var r="";for(var a=0;athis.x2)this.x2=t}if(e!=null){if(isNaN(this.y1)||isNaN(this.y2)){this.y1=e;this.y2=e}if(ethis.y2)this.y2=e}};this.addX=function(t){this.addPoint(t,null)};this.addY=function(t){this.addPoint(null,t)};this.addBoundingBox=function(t){this.addPoint(t.x1,t.y1);this.addPoint(t.x2,t.y2)};this.addQuadraticCurve=function(t,e,n,i,r,a){var o=t+2/3*(n-t);var s=e+2/3*(i-e);var l=o+1/3*(r-t);var u=s+1/3*(a-e);this.addBezierCurve(t,e,o,l,s,u,r,a)};this.addBezierCurve=function(t,e,n,i,r,a,o,s){var l=[t,e],u=[n,i],c=[r,a],h=[o,s];this.addPoint(l[0],l[1]);this.addPoint(h[0],h[1]);for(var f=0;f<=1;f++){var d=function t(e){return Math.pow(1-e,3)*l[f]+3*Math.pow(1-e,2)*e*u[f]+3*(1-e)*Math.pow(e,2)*c[f]+Math.pow(e,3)*h[f]};var g=6*l[f]-12*u[f]+6*c[f];var p=-3*l[f]+9*u[f]-9*c[f]+3*h[f];var v=3*u[f]-3*l[f];if(p==0){if(g==0)continue;var m=-v/g;if(0=0;e--){this.transforms[e].unapply(t)}};this.applyToPoint=function(t){for(var e=0;er){this.styles[i]=e[i];this.stylesSpecificity[i]=n}}}}}};if(a!=null&&a.nodeType==1){for(var t=0;t0){t.push([this.points[this.points.length-1],t[t.length-1][1]])}return t}};B.Element.polyline.prototype=new B.Element.PathElementBase;B.Element.polygon=function(t){this.base=B.Element.polyline;this.base(t);this.basePath=this.path;this.path=function(t){var e=this.basePath(t);if(t!=null){t.lineTo(this.points[0].x,this.points[0].y);t.closePath()}return e}};B.Element.polygon.prototype=new B.Element.polyline;B.Element.path=function(t){this.base=B.Element.PathElementBase;this.base(t);var e=this.attribute("d").value;e=e.replace(/,/gm," ");for(var n=0;n<2;n++){e=e.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2")}e=e.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");e=e.replace(/([0-9])([+\-])/gm,"$1 $2");for(var n=0;n<2;n++){e=e.replace(/(\.[0-9]*)(\.)/gm,"$1 $2")}e=e.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");e=B.compressSpaces(e);e=B.trim(e);this.PathParser=new function(t){this.tokens=t.split(" ");this.reset=function(){this.i=-1;this.command="";this.previousCommand="";this.start=new B.Point(0,0);this.control=new B.Point(0,0);this.current=new B.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){if(this.isEnd())return true;return this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){switch(this.command){case"m":case"l":case"h":case"v":case"c":case"s":case"q":case"t":case"a":case"z":return true}return false};this.getToken=function(){this.i++;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){var t=new B.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)};this.getAsControlPoint=function(){var t=this.getPoint();this.control=t;return t};this.getAsCurrentPoint=function(){var t=this.getPoint();this.current=t;return t};this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"&&this.previousCommand.toLowerCase()!="q"&&this.previousCommand.toLowerCase()!="t"){return this.current}var t=new B.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return t};this.makeAbsolute=function(t){if(this.isRelativeCommand()){t.x+=this.current.x;t.y+=this.current.y}return t};this.addMarker=function(t,e,n){if(n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null){this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)}this.addMarkerAngle(t,e==null?null:e.angleTo(t))};this.addMarkerAngle=function(t,e){this.points.push(t);this.angles.push(e)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var t=0;t1){c*=Math.sqrt(v);h*=Math.sqrt(v)}var m=(d==g?-1:1)*Math.sqrt((Math.pow(c,2)*Math.pow(h,2)-Math.pow(c,2)*Math.pow(p.y,2)-Math.pow(h,2)*Math.pow(p.x,2))/(Math.pow(c,2)*Math.pow(p.y,2)+Math.pow(h,2)*Math.pow(p.x,2)));if(isNaN(m))m=0;var y=new B.Point(m*c*p.y/h,m*-h*p.x/c);var _=new B.Point((o.x+u.x)/2+Math.cos(f)*y.x-Math.sin(f)*y.y,(o.y+u.y)/2+Math.sin(f)*y.x+Math.cos(f)*y.y);var b=function t(e){return Math.sqrt(Math.pow(e[0],2)+Math.pow(e[1],2))};var w=function t(e,n){return(e[0]*n[0]+e[1]*n[1])/(b(e)*b(n))};var x=function t(e,n){return(e[0]*n[1]=1)E=0;var A=1-g?1:-1;var M=k+A*(E/2);var R=new B.Point(_.x+c*Math.cos(M),_.y+h*Math.sin(M));e.addMarkerAngle(R,M-A*Math.PI/2);e.addMarkerAngle(u,M-A*Math.PI);n.addPoint(u.x,u.y);if(t!=null){var w=c>h?c:h;var T=c>h?1:c/h;var O=c>h?h/c:1;t.translate(_.x,_.y);t.rotate(f);t.scale(T,O);t.arc(0,0,w,k,k+E,1-g);t.scale(1/T,1/O);t.rotate(-f);t.translate(-_.x,-_.y)}}break;case"Z":case"z":if(t!=null)t.closePath();e.current=e.start}}return n};this.getMarkers=function(){var t=this.PathParser.getMarkerPoints();var e=this.PathParser.getMarkerAngles();var n=[];for(var i=0;i1)this.offset=1;var e=this.style("stop-color",true);if(e.value=="")e.value="#000";if(this.style("stop-opacity").hasValue())e=e.addOpacity(this.style("stop-opacity"));this.color=e.value};B.Element.stop.prototype=new B.Element.ElementBase;B.Element.AnimateBase=function(t){this.base=B.Element.ElementBase;this.base(t);B.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").toMilliseconds();this.getProperty=function(){var t=this.attribute("attributeType").value;var e=this.attribute("attributeName").value;if(t=="CSS"){return this.parent.style(e,true)}return this.parent.attribute(e,true)};this.initialValue=null;this.initialUnits="";this.removed=false;this.calcValue=function(){return""};this.update=function(t){if(this.initialValue==null){this.initialValue=this.getProperty().value;this.initialUnits=this.getProperty().getUnits()}if(this.duration>this.maxDuration){if(this.attribute("repeatCount").value=="indefinite"||this.attribute("repeatDur").value=="indefinite"){this.duration=0}else if(this.attribute("fill").valueOrDefault("remove")=="freeze"&&!this.frozen){this.frozen=true;this.parent.animationFrozen=true;this.parent.animationFrozenValue=this.getProperty().value}else if(this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed){this.removed=true;this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue;return true}return false}this.duration=this.duration+t;var e=false;if(this.beginn&&o.attribute("x").hasValue())break;r+=o.measureTextRecursive(t)}return-1*(i=="end"?r:r/2)}return 0};this.renderChild=function(t,e,n,i){var r=n.children[i];if(r.attribute("x").hasValue()){r.x=r.attribute("x").toPixels("x")+e.getAnchorDelta(t,n,i);if(r.attribute("dx").hasValue())r.x+=r.attribute("dx").toPixels("x")}else{if(r.attribute("dx").hasValue())e.x+=r.attribute("dx").toPixels("x");r.x=e.x}e.x=r.x+r.measureText(t);if(r.attribute("y").hasValue()){r.y=r.attribute("y").toPixels("y");if(r.attribute("dy").hasValue())r.y+=r.attribute("dy").toPixels("y")}else{if(r.attribute("dy").hasValue())e.y+=r.attribute("dy").toPixels("y");r.y=e.y}e.y=r.y;r.render(t);for(var i=0;i0&&e[n-1]!=" "&&n0&&e[n-1]!=" "&&(n==e.length-1||e[n+1]==" "))a="initial";if(typeof t.glyphs[i]!="undefined"){r=t.glyphs[i][a];if(r==null&&t.glyphs[i].type=="glyph")r=t.glyphs[i]}}else{r=t.glyphs[i]}if(r==null)r=t.missingGlyph;return r};this.renderChildren=function(t){var e=this.parent.style("font-family").getDefinition();if(e!=null){var n=this.parent.style("font-size").numValueOrDefault(B.Font.Parse(B.ctx.font).fontSize);var i=this.parent.style("font-style").valueOrDefault(B.Font.Parse(B.ctx.font).fontStyle);var r=this.getText();if(e.isRTL)r=r.split("").reverse().join("");var a=B.ToNumberArray(this.parent.attribute("dx").value);for(var o=0;o0){return""}return this.text}};B.Element.tspan.prototype=new B.Element.TextElementBase;B.Element.tref=function(t){this.base=B.Element.TextElementBase;this.base(t);this.getText=function(){var t=this.getHrefAttribute().getDefinition();if(t!=null)return t.children[0].getText()}};B.Element.tref.prototype=new B.Element.TextElementBase;B.Element.a=function(t){this.base=B.Element.TextElementBase;this.base(t);this.hasText=t.childNodes.length>0;for(var e=0;e0){var n=new B.Element.g;n.children=this.children;n.parent=this;n.render(t)}};this.onclick=function(){window.open(this.getHrefAttribute().value)};this.onmousemove=function(){B.ctx.canvas.style.cursor="pointer"}};B.Element.a.prototype=new B.Element.TextElementBase;B.Element.image=function(t){this.base=B.Element.RenderedElementBase;this.base(t);var e=this.getHrefAttribute().value;if(e==""){return}var a=e.match(/\.svg$/);B.Images.push(this);this.loaded=false;if(!a){this.img=document.createElement("img");if(B.opts["useCORS"]==true){this.img.crossOrigin="Anonymous"}var n=this;this.img.onload=function(){n.loaded=true};this.img.onerror=function(){B.log('ERROR: image "'+e+'" not found');n.loaded=true};this.img.src=e}else{this.img=B.ajax(e);this.loaded=true}this.renderChildren=function(t){var e=this.attribute("x").toPixels("x");var n=this.attribute("y").toPixels("y");var i=this.attribute("width").toPixels("x");var r=this.attribute("height").toPixels("y");if(i==0||r==0)return;t.save();if(a){t.drawSvg(this.img,e,n,i,r)}else{t.translate(e,n);B.AspectRatio(t,this.attribute("preserveAspectRatio").value,i,this.img.width,r,this.img.height,0,0);t.drawImage(this.img,0,0)}t.restore()};this.getBoundingBox=function(){var t=this.attribute("x").toPixels("x");var e=this.attribute("y").toPixels("y");var n=this.attribute("width").toPixels("x");var i=this.attribute("height").toPixels("y");return new B.BoundingBox(t,e,t+n,e+i)}};B.Element.image.prototype=new B.Element.RenderedElementBase;B.Element.g=function(t){this.base=B.Element.RenderedElementBase;this.base(t);this.getBoundingBox=function(){var t=new B.BoundingBox;for(var e=0;e0){var m=p[v].indexOf("url");var y=p[v].indexOf(")",m);var _=p[v].substr(m+5,y-m-6);var b=B.parseXml(B.ajax(_));var w=b.getElementsByTagName("font");for(var x=0;x0&&!ys(this).selectAll("image, img, svg").size()){var E=this.cloneNode(true);ys(E).selectAll("*").each(function(){ys(this).call(cU);if(ys(this).attr("opacity")==="0")this.parentNode.removeChild(this)});et.push(Object.assign({},n,{type:"svg",value:E,tag:e}))}else if(this.childNodes.length>0){var A=yU(this),M=fU(A,3),R=M[0],T=M[1],O=M[2];n.scale*=R;n.x+=T;n.y+=O;nt(this,n)}else{var B=this.cloneNode(true);ys(B).selectAll("*").each(function(){if(ys(this).attr("opacity")==="0")this.parentNode.removeChild(this)});if(e==="line"){ys(B).attr("x1",parseFloat(ys(B).attr("x1"))+n.x);ys(B).attr("x2",parseFloat(ys(B).attr("x2"))+n.x);ys(B).attr("y1",parseFloat(ys(B).attr("y1"))+n.y);ys(B).attr("y2",parseFloat(ys(B).attr("y2"))+n.y)}else if(e==="path"){var P=yU(B),N=fU(P,3),D=N[0],z=N[1],j=N[2];if(ys(B).attr("transform"))ys(B).attr("transform","scale(".concat(D,")translate(").concat(z+n.x,",").concat(j+n.y,")"))}ys(B).call(cU);var L=ys(B).attr("fill");var F=L&&L.indexOf("url")===0;et.push(Object.assign({},n,{type:"svg",value:B,tag:e}));if(F){var I=ys(L.slice(4,-1)).node().cloneNode(true);var H=(I.tagName||"").toLowerCase();if(H==="pattern"){var V=yU(B),G=fU(V,3),U=G[0],q=G[1],W=G[2];n.scale*=U;n.x+=q;n.y+=W;nt(I,n)}}}}function nt(t,e){xs(t.childNodes).each(function(){i.bind(this)(e)})}for(var r=0;r").concat(r,"");f.save();f.translate(K.padding,K.padding);uU(h,l,Object.assign({},mU,{offsetX:e.x,offsetY:e.y}));f.restore();break;case"svg":var u=c?(new XMLSerializer).serializeToString(e.value):e.value.outerHTML;f.save();f.translate(K.padding+n.x+e.x,K.padding+n.y+e.y);f.rect(0,0,n.width,n.height);f.clip();uU(h,u,Object.assign({},mU,{offsetX:e.x+n.x,offsetY:e.y+n.y}));f.restore();break;default:console.warn("uncaught",e);break}}K.callback(h)}}(function(t){var f=t.Uint8Array,e=t.HTMLCanvasElement,n=e&&e.prototype,l=/\s*;\s*base64\s*(?:;|$)/i,u="toDataURL",d,c=function t(e){var n=e.length,i=new f(n/4*3|0),r=0,a=0,o=[0,0],s=0,l=0,u,c,h;while(n--){c=e.charCodeAt(r++);u=d[c-43];if(u!==255&&u!==h){o[1]=o[0];o[0]=c;l=l<<6|u;s++;if(s===4){i[a++]=l>>>16;if(o[1]!==61){i[a++]=l>>>8}if(o[0]!==61){i[a++]=l}s=0}}}return i};if(f){d=new f([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51])}if(e&&(!n.toBlob||!n.toBlobHD)){if(!n.toBlob)n.toBlob=function(t,e){if(!e){e="image/png"}if(this.mozGetAsFile){t(this.mozGetAsFile("canvas",e));return}if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(e)){t(this.msToBlob());return}var n=Array.prototype.slice.call(arguments,1),i=this[u].apply(this,n),r=i.indexOf(","),a=i.substring(r+1),o=l.test(i.substring(0,r)),s;if(Blob.fake){s=new Blob;if(o){s.encoding="base64"}else{s.encoding="URI"}s.data=a;s.size=a.length}else if(f){if(o){s=new Blob([c(a)],{type:e})}else{s=new Blob([decodeURIComponent(a)],{type:e})}}t(s)};if(!n.toBlobHD&&n.toDataURLHD){n.toBlobHD=function(){u="toDataURLHD";var t=this.toBlob();u="toDataURL";return t}}else{n.toBlobHD=n.toBlob}}})(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||CL.content||CL);var bU=AL(function(t){var e=e||function(c){if(typeof c==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=c.document,h=function t(){return c.URL||c.webkitURL||c},f=t.createElementNS("http://www.w3.org/1999/xhtml","a"),d="download"in f,g=function t(e){var n=new MouseEvent("click");e.dispatchEvent(n)},p=/constructor/i.test(c.HTMLElement)||c.safari,v=/CriOS\/[\d]+/.test(navigator.userAgent),o=function t(e){(c.setImmediate||c.setTimeout)(function(){throw e},0)},m="application/octet-stream",i=1e3*40,y=function t(e){var n=function t(){if(typeof e==="string"){h().revokeObjectURL(e)}else{e.remove()}};setTimeout(n,i)},_=function t(e,n,i){n=[].concat(n);var r=n.length;while(r--){var a=e["on"+n[r]];if(typeof a==="function"){try{a.call(e,i||e)}catch(t){o(t)}}}},b=function t(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},r=function t(i,e,n){if(!n){i=b(i)}var r=this,a=i.type,o=a===m,s,l=function t(){_(r,"writestart progress write writeend".split(" "))},u=function t(){if((v||o&&p)&&c.FileReader){var n=new FileReader;n.onloadend=function(){var t=v?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");var e=c.open(t,"_blank");if(!e)c.location.href=t;t=undefined;r.readyState=r.DONE;l()};n.readAsDataURL(i);r.readyState=r.INIT;return}if(!s){s=h().createObjectURL(i)}if(o){c.location.href=s}else{var e=c.open(s,"_blank");if(!e){c.location.href=s}}r.readyState=r.DONE;l();y(s)};r.readyState=r.INIT;if(d){s=h().createObjectURL(i);setTimeout(function(){f.href=s;f.download=e;g(f);l();y(s);r.readyState=r.DONE});return}u()},e=r.prototype,n=function t(e,n,i){return new r(e,n||e.name||"download",i)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(t,e,n){e=e||t.name||"download";if(!n){t=b(t)}return navigator.msSaveOrOpenBlob(t,e)}}e.abort=function(){};e.readyState=e.INIT=0;e.WRITING=1;e.DONE=2;e.error=e.onwritestart=e.onprogress=e.onwrite=e.onabort=e.onerror=e.onwriteend=null;return n}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||CL.content);if(t.exports){t.exports.saveAs=e}});var wU=bU.saveAs;var xU={filename:"download",type:"png"};function kU(t){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};if(!t)return;n=Object.assign({},xU,n);var e=new RegExp(/(MSIE|Trident\/|Edge\/)/i).test(navigator.userAgent);if(!(t instanceof Array)&&n.type==="svg"){var r=e?(new XMLSerializer).serializeToString(t):t.outerHTML;wU(new Blob([r],{type:"application/svg+xml"}),"".concat(n.filename,".svg"))}_U(t,Object.assign({},i,{callback:function t(e){if(i.callback)i.callback(e);if(["jpg","png"].includes(n.type)){e.toBlob(function(t){return wU(t,"".concat(n.filename,".").concat(n.type))})}}}))}var SU={Button:LL,Radio:YL,Select:rF};function CU(){var h=this;var f=this;var d=this._controlPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var g=["left","right","top","bottom"];var t=function t(e){var l=g[e];var u=(h._controls||[]).filter(function(t){return!t.position&&l==="bottom"||t.position===l});if(h._downloadButton&&h._downloadPosition===l){u.push({data:[{text:h._translate("Download"),value:1}],label:"downloadButton",on:{click:function t(){var e=h._detectResize;if(e)h.detectResize(false).render();kU(h._select.node(),Object.assign({title:h._title||undefined},h._downloadConfig),{callback:function t(){setTimeout(function(){if(e)h.detectResize(e).render()},5e3)}})}},type:"Button"})}var n=l==="top"||l==="bottom";var i={height:n?h._height-(h._margin.top+h._margin.bottom):h._height-(h._margin.top+h._margin.bottom+d.top+d.bottom),width:n?h._width-(h._margin.left+h._margin.right+d.left+d.right):h._width-(h._margin.left+h._margin.right)};i.x=(n?h._margin.left+d.left:h._margin.left)+(l==="right"?h._width-h._margin.bottom:0);i.y=(n?h._margin.top:h._margin.top+d.top)+(l==="bottom"?h._height-h._margin.bottom:0);var r=Tw("foreignObject.d3plus-viz-controls-".concat(l),{condition:u.length,enter:Object.assign({opacity:0},i),exit:Object.assign({opacity:0},i),parent:h._select,transition:h._transition,update:{height:i.height,opacity:1,width:i.width}});var c=r.selectAll("div.d3plus-viz-controls-container").data([null]);c=c.enter().append("xhtml:div").attr("class","d3plus-viz-controls-container").merge(c);if(u.length){var a=function t(e){var n=Object.assign({},u[e]);var i={};if(n.on){var r=function t(e){if({}.hasOwnProperty.call(n.on,e)){i[e]=function(){n.on[e].bind(f)(this.value)}}};for(var a in n.on){r(a)}}var o=n.label||"".concat(l,"-").concat(e);if(!h._controlCache[o]){var s=n.type&&SU[n.type]?n.type:"Select";h._controlCache[o]=(new SU[s]).container(c.node());if(n.checked)h._controlCache[o].checked(n.checked);if(n.selected)h._controlCache[o].selected(n.selected)}delete n.checked;delete n.selected;h._controlCache[o].config(n).config({on:i}).config(h._controlConfig).render()};for(var o=0;o0&&arguments[0]!==undefined?arguments[0]:[];if(this._legend){var e=this._legendClass.outerBounds();var n=this._legendPosition;var i=["top","bottom"].includes(n);var r=this._legendPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var a={transform:"translate(".concat(i?this._margin.left+r.left:this._margin.left,", ").concat(i?this._margin.top:this._margin.top+r.top,")")};var s=Tw("g.d3plus-viz-legend",{condition:this._legend&&!this._legendConfig.select,enter:a,parent:this._select,transition:this._transition,update:a}).node();var l=[];var u=function t(e,n){var i=o._shape(e,n);var r=i==="Line"?"stroke":"fill";var a=o._shapeConfig[i]&&o._shapeConfig[i][r]?o._shapeConfig[i][r]:o._shapeConfig[r];return typeof a==="function"?a(e,n):a};var c=function t(e,n){var i=o._shape(e,n);var r=o._shapeConfig[i]&&o._shapeConfig[i].opacity?o._shapeConfig[i].opacity:o._shapeConfig.opacity;return typeof r==="function"?r(e,n):r};var h=function t(e,n){return"".concat(u(e,n),"_").concat(c(e,n))};Fe().key(h).rollup(function(t){return l.push(Bw(t,o._aggs))}).entries(this._colorScale?t.filter(function(t,e){return o._colorScale(t,e)===undefined}):t);l.sort(this._legendSort);var f=l.map(function(t,e){return o._ids(t,e).slice(0,o._drawDepth+1)});this._legendDepth=0;var d=function t(e){var n=f.map(function(t){return t[e]});if(!n.some(function(t){return t instanceof Array})&&Array.from(new Set(n)).length===l.length){o._legendDepth=e;return"break"}};for(var g=0;g<=this._drawDepth;g++){var p=d(g);if(p==="break")break}var v=function t(e,n){var i=o._id(e,n);if(i instanceof Array)i=i[0];return o._hidden.includes(i)||o._solo.length&&!o._solo.includes(i)};this._legendClass.id(h).align(i?"center":n).direction(i?"row":"column").duration(this._duration).data(l.length>this._legendCutoff||this._colorScale?l:[]).height(i?this._height-(this._margin.bottom+this._margin.top):this._height-(this._margin.bottom+this._margin.top+r.bottom+r.top)).locale(this._locale).select(s).verticalAlign(!i?"middle":n).width(i?this._width-(this._margin.left+this._margin.right+r.left+r.right):this._width-(this._margin.left+this._margin.right)).shapeConfig(Mw.bind(this)(this._shapeConfig,"legend")).config(this._legendConfig).shapeConfig({fill:function t(e,n){return v(e,n)?o._hiddenColor(e,n):u(e,n)},labelConfig:{fontOpacity:function t(e,n){return v(e,n)?o._hiddenOpacity(e,n):1}},opacity:c}).render();if(!this._legendConfig.select&&e.height){if(i)this._margin[n]+=e.height+this._legendClass.padding()*2;else this._margin[n]+=e.width+this._legendClass.padding()*2}}}function MU(n){var i=this;if(!(n instanceof Array))n=[n,n];if(JSON.stringify(n)!==JSON.stringify(this._timelineSelection)){this._timelineSelection=n;n=n.map(Number);this.timeFilter(function(t){var e=ER(i._time(t)).getTime();return e>=n[0]&&e<=n[1]}).render()}}function RU(){var e=this;var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var n=this._time&&this._timeline;var i=n?Ow(this._data.map(this._time)).map(ER):[];n=n&&i.length>1;var r=this._timelinePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var a={transform:"translate(".concat(this._margin.left+r.left,", 0)")};var o=Tw("g.d3plus-viz-timeline",{condition:n,enter:a,parent:this._select,transition:this._transition,update:a}).node();if(n){var s=this._timelineClass.domain(Ft(i)).duration(this._duration).height(this._height-this._margin.bottom).locale(this._locale).select(o).ticks(i.sort(function(t,e){return+t-+e})).width(this._width-(this._margin.left+this._margin.right+r.left+r.right));if(s.selection()===undefined){this._timelineSelection=Ft(t,this._time).map(ER);s.selection(this._timelineSelection)}var l=this._timelineConfig;s.config(l).on("end",function(t){MU.bind(e)(t);if(l.on&&l.on.end)l.on.end(t)}).render();this._margin.bottom+=s.outerBounds().height+s.padding()*2}}function TU(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var e=this._title?this._title(t):false;var n=this._titlePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var r=Tw("g.d3plus-viz-title",{enter:i,parent:this._select,transition:this._transition,update:i}).node();this._titleClass.data(e?[{text:e}]:[]).locale(this._locale).select(r).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._titleConfig).render();this._margin.top+=e?r.getBBox().height:0}function OU(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var e=typeof this._total==="function"?Ut(t.map(this._total)):this._total===true&&this._size?Ut(t.map(this._size)):false;var n=this._totalPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var r=Tw("g.d3plus-viz-total",{enter:i,parent:this._select,transition:this._transition,update:i}).node();var a=typeof e==="number";this._totalClass.data(a?[{text:this._totalFormat(e)}]:[]).locale(this._locale).select(r).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._totalConfig).render();this._margin.top+=a?r.getBBox().height+this._totalConfig.padding*2:0}function BU(t,e){if(!t)return undefined;if(t.tagName===undefined||["BODY","HTML"].indexOf(t.tagName)>=0){var n=window["inner".concat(e.charAt(0).toUpperCase()+e.slice(1))];var i=ys(t);if(e==="width"){n-=parseFloat(i.style("margin-left"),10);n-=parseFloat(i.style("margin-right"),10);n-=parseFloat(i.style("padding-left"),10);n-=parseFloat(i.style("padding-right"),10)}else{n-=parseFloat(i.style("margin-top"),10);n-=parseFloat(i.style("margin-bottom"),10);n-=parseFloat(i.style("padding-top"),10);n-=parseFloat(i.style("padding-bottom"),10)}return n}else{var r=parseFloat(ys(t).style(e),10);if(typeof r==="number"&&r>0)return r;else return BU(t.parentNode,e)}}function PU(t){return[BU(t,"width"),BU(t,"height")]}function NU(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var n=window.pageXOffset!==undefined?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var i=window.pageYOffset!==undefined?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var r=t.getBoundingClientRect();var a=r.height,o=r.left+n,s=r.top+i,l=r.width;return i+window.innerHeight>s+e&&i+eo+e&&n+e=0){this._solo=[];this._hidden=[];this.render()}}else{if(a<0&&this._hidden.length").concat(s("Shift+Click to Hide"))).title(this._legendConfig.label?this._legendClass.label():EU.bind(this)).position(r).config(Mw.bind(this)(this._tooltipConfig)).config(Mw.bind(this)(this._legendTooltip)).render()}}function HU(t,e,n){if(this._tooltip&&t){this._select.style("cursor","pointer");var i=ns.touches?[ns.touches[0].clientX,ns.touches[0].clientY]:[ns.clientX,ns.clientY];this._tooltipClass.data([n||t]).footer(this._drawDepth0&&arguments[0]!==undefined?arguments[0]:false;KU=t;if(KU)this._brushGroup.style("display","inline");else this._brushGroup.style("display","none");if(!KU&&this._zoom){this._container.call(this._zoomBehavior);if(!this._zoomScroll){this._container.on("wheel.zoom",null)}if(!this._zoomPan){this._container.on("mousedown.zoom mousemove.zoom",null).on("touchstart.zoom touchmove.zoom touchend.zoom touchcancel.zoom",null)}}else{this._container.on(".zoom",null)}}function $U(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;if(this._zoomGroup){if(!e)this._zoomGroup.attr("transform",t||ns.transform);else this._zoomGroup.transition().duration(e).attr("transform",t||ns.transform)}if(this._renderTiles)this._renderTiles(pL(this._container.node()),e)}function ZU(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;if(!this._container)return;var e=this._zoomBehavior.extent().bind(document)()[1].map(function(t){return t/2}),n=this._zoomBehavior.scaleExtent(),i=pL(this._container.node());if(!t){i.k=n[0];i.x=0;i.y=0}else{var r=[(e[0]-i.x)/i.k,(e[1]-i.y)/i.k];i.k=Math.min(n[1],i.k*t);if(i.k<=n[0]){i.k=n[0];i.x=0;i.y=0}else{i.x+=e[0]-(r[0]*i.k+i.x);i.y+=e[1]-(r[1]*i.k+i.y)}}$U.bind(this)(i,this._duration)}function JU(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this._duration;var n=this._zoomBehavior.scaleExtent(),i=pL(this._container.node());if(t){var r=GU(this._zoomBehavior.translateExtent()[1],2),a=r[0],o=r[1],s=t[1][0]-t[0][0],l=t[1][1]-t[0][1];var u=Math.min(n[1],1/Math.max(s/a,l/o));var c,h;if(s/l0)i.x=0;else if(i.x0)i.y=0;else if(i.y600:true}function wq(i){return i.reduce(function(t,e,n){if(!n)t+=e;else if(n===i.length-1&&n===1)t+=" and ".concat(e);else if(n===i.length-1)t+=", and ".concat(e);else t+=", ".concat(e);return t},"")}var xq=function(t){yq(e,t);function e(){var s;fq(this,e);s=pq(this,vq(e).call(this));s._aggs={};s._ariaHidden=true;s._backClass=(new CE).on("click",function(){if(s._history.length)s.config(s._history.pop()).render();else s.depth(s._drawDepth-1).filter(false).render()}).on("mousemove",function(){return s._backClass.select().style("cursor","pointer")});s._backConfig={fontSize:10,padding:5,resize:false};s._cache=true;s._color=function(t,e){return s._groupBy[0](t,e)};s._colorScaleClass=new BF;s._colorScaleConfig={};s._colorScalePadding=bq;s._colorScalePosition="bottom";s._colorScaleMaxSize=600;var t=new rF;s._controlCache={};s._controlConfig={selectStyle:Object.assign({margin:"5px"},t.selectStyle())};s._controlPadding=bq;s._data=[];s._dataCutoff=100;s._detectResize=true;s._detectResizeDelay=400;s._detectVisible=true;s._detectVisibleInterval=1e3;s._downloadButton=false;s._downloadConfig={type:"png"};s._downloadPosition="top";s._duration=600;s._hidden=[];s._hiddenColor=Rw("#aaa");s._hiddenOpacity=Rw(.5);s._history=[];s._groupBy=[yu("id")];s._legend=true;s._legendClass=new wF;s._legendConfig={label:EU.bind(mq(s)),shapeConfig:{ariaLabel:EU.bind(mq(s)),labelConfig:{fontColor:undefined,fontResize:false,padding:0}}};s._legendCutoff=1;s._legendPadding=bq;s._legendPosition="bottom";s._legendSort=function(t,e){return s._drawLabel(t).localeCompare(s._drawLabel(e))};s._legendTooltip={};s._loadingHTML=function(){return"\n ")};s._loadingMessage=true;s._lrucache=ML(10);s._messageClass=new JH;s._messageMask="rgba(0, 0, 0, 0.05)";s._messageStyle={bottom:"0",left:"0",position:"absolute",right:"0","text-align":"center",top:"0"};s._noDataHTML=function(){return"\n
        \n ".concat(s._translate("No Data Available"),"\n
        ")};s._noDataMessage=true;s._on={"click.shape":DU.bind(mq(s)),"click.legend":zU.bind(mq(s)),mouseenter:LU.bind(mq(s)),mouseleave:FU.bind(mq(s)),"mousemove.shape":HU.bind(mq(s)),"mousemove.legend":IU.bind(mq(s))};s._queue=[];s._scrollContainer=(typeof window==="undefined"?"undefined":hq(window))===undefined?"":window;s._shape=Rw("Rect");s._shapes=[];s._shapeConfig={ariaLabel:function t(e,n){return s._drawLabel(e,n)},fill:function t(e,n){while(e.__d3plus__&&e.data){e=e.data;n=e.i}if(s._colorScale){var i=s._colorScale(e,n);if(i!==undefined&&i!==null){var r=s._colorScaleClass._colorScale;var a=s._colorScaleClass.color();if(!r)return a instanceof Array?a[a.length-1]:a;else if(!r.domain().length)return r.range()[r.range().length-1];return r(i)}}var o=s._color(e,n);if(Vj(o))return o;return sk(o)},labelConfig:{fontColor:function t(e,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(e,n):s._shapeConfig.fill;return lk(i)}},opacity:Rw(1),stroke:function t(e,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(e,n):s._shapeConfig.fill;return Vj(i).darker()},role:"presentation",strokeWidth:Rw(0)};s._solo=[];s._svgDesc="";s._svgTitle="";s._timeline=true;s._timelineClass=(new fI).align("end");s._timelineConfig={brushing:false,padding:5};s._timelinePadding=bq;s._threshold=Rw(1e-4);s._thresholdKey=undefined;s._thresholdName=function(){return s._translate("Values")};s._titleClass=new CE;s._titleConfig={ariaHidden:true,fontSize:12,padding:5,resize:false,textAnchor:"middle"};s._titlePadding=bq;s._tooltip=true;s._tooltipClass=new YH;s._tooltipConfig={pointerEvents:"none",titleStyle:{"max-width":"200px"}};s._totalClass=new CE;s._totalConfig={fontSize:10,padding:5,resize:false,textAnchor:"middle"};s._totalFormat=function(t){return"".concat(s._translate("Total"),": ").concat(Hw(t,s._locale))};s._totalPadding=bq;s._zoom=false;s._zoomBehavior=SL();s._zoomBrush=wj();s._zoomBrushHandleSize=1;s._zoomBrushHandleStyle={fill:"#444"};s._zoomBrushSelectionStyle={fill:"#777","stroke-width":0};s._zoomControlStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.75)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"900 15px/21px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",height:"20px",margin:"5px",opacity:.75,padding:0,"text-align":"center",width:"20px"};s._zoomControlStyleActive={background:"rgba(0, 0, 0, 0.75)",color:"rgba(255, 255, 255, 0.75)",opacity:1};s._zoomControlStyleHover={cursor:"pointer",opacity:1};s._zoomFactor=2;s._zoomMax=16;s._zoomPadding=20;s._zoomPan=true;s._zoomScroll=true;return s}gq(e,[{key:"_preDraw",value:function t(){var a=this;var o=this;this._drawDepth=this._depth!==void 0?this._depth:this._groupBy.length-1;this._id=this._groupBy[this._drawDepth];this._ids=function(e,n){return a._groupBy.map(function(t){return!e||e.__d3plus__&&!e.data?undefined:t(e.__d3plus__?e.data:e,e.__d3plus__?e.i:n)}).filter(function(t){return t!==undefined&&t!==null})};this._drawLabel=function(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:a._drawDepth;if(!t)return"";if(t._isAggregation){return"".concat(a._thresholdName(t,e)," < ").concat(Hw(t._threshold*100,a._locale),"%")}while(t.__d3plus__&&t.data){t=t.data;e=t.i}if(a._label)return a._label(t,e);var i=o._ids(t,e).slice(0,n+1);var r=i.reverse().find(function(t){return!(t instanceof Array)})||i[i.length-1];return r instanceof Array?wq(r):"".concat(r)};if(this._time&&!this._timeFilter&&this._data.length){var e=this._data.map(this._time).map(ER);var n=this._data[0],i=0;if(this._discrete&&"_".concat(this._discrete)in this&&this["_".concat(this._discrete)](n,i)===this._time(n,i)){this._timeFilter=function(){return true}}else{var r=+Ht(e);this._timeFilter=function(t,e){return+ER(a._time(t,e))===r}}}this._filteredData=[];this._legendData=[];var s=[];if(this._data.length){s=this._timeFilter?this._data.filter(this._timeFilter):this._data;if(this._filter)s=s.filter(this._filter);var l=Fe();for(var u=0;u<=this._drawDepth;u++){l.key(this._groupBy[u])}if(this._discrete&&"_".concat(this._discrete)in this)l.key(this["_".concat(this._discrete)]);if(this._discrete&&"_".concat(this._discrete,"2")in this)l.key(this["_".concat(this._discrete,"2")]);var c=l.rollup(function(t){var e=a._data.indexOf(t[0]);var n=a._shape(t[0],e);var i=a._id(t[0],e);var r=Bw(t,a._aggs);if(!a._hidden.includes(i)&&(!a._solo.length||a._solo.includes(i))){if(!a._discrete&&n==="Line")a._filteredData=a._filteredData.concat(t);else a._filteredData.push(r)}a._legendData.push(r)}).entries(s);this._filteredData=this._thresholdFunction(this._filteredData,c)}var h=Fe().key(this._id).entries(this._filteredData).length;if(h>this._dataCutoff){if(this._userHover===undefined)this._userHover=this._shapeConfig.hoverOpacity||.5;if(this._userDuration===undefined)this._userDuration=this._shapeConfig.duration||600;this._shapeConfig.hoverOpacity=1;this._shapeConfig.duration=0}else if(this._userHover!==undefined){this._shapeConfig.hoverOpacity=this._userHover;this._shapeConfig.duration=this._userDuration}if(this._noDataMessage&&!this._filteredData.length){this._messageClass.render({container:this._select.node().parentNode,html:this._noDataHTML(this),mask:false,style:this._messageStyle})}}},{key:"_draw",value:function t(){if(this._legendPosition==="left"||this._legendPosition==="right")AU.bind(this)(this._filteredData);if(this._colorScalePosition==="left"||this._colorScalePosition==="right"||this._colorScalePosition===false)tV.bind(this)(this._filteredData);QH.bind(this)();TU.bind(this)(this._filteredData);OU.bind(this)(this._filteredData);RU.bind(this)(this._filteredData);CU.bind(this)(this._filteredData);if(this._legendPosition==="top"||this._legendPosition==="bottom")AU.bind(this)(this._legendData);if(this._colorScalePosition==="top"||this._colorScalePosition==="bottom")tV.bind(this)(this._filteredData);this._shapes=[]}},{key:"_thresholdFunction",value:function t(e){return e}},{key:"render",value:function t(a){var o=this;this._margin={bottom:0,left:0,right:0,top:0};this._padding={bottom:0,left:0,right:0,top:0};this._transition=hu().duration(this._duration);if(this._select===void 0||this._select.node().tagName.toLowerCase()!=="svg"){var e=this._select===void 0?ys("body").append("div"):this._select;var n=e.append("svg");this.select(n.node())}function s(){var t=this._select.style("display");this._select.style("display","none");var e=PU(this._select.node().parentNode),n=sq(e,2),i=n[0],r=n[1];i-=parseFloat(this._select.style("border-left-width"),10);i-=parseFloat(this._select.style("border-right-width"),10);r-=parseFloat(this._select.style("border-top-width"),10);r-=parseFloat(this._select.style("border-bottom-width"),10);this._select.style("display",t);if(this._autoWidth){this.width(i);this._select.style("width","".concat(this._width,"px")).attr("width","".concat(this._width,"px"))}if(this._autoHeight){this.height(r);this._select.style("height","".concat(this._height,"px")).attr("height","".concat(this._height,"px"))}}if((!this._width||!this._height)&&(!this._detectVisible||NU(this._select.node()))){this._autoWidth=this._width===undefined;this._autoHeight=this._height===undefined;s.bind(this)()}this._select.attr("class","d3plus-viz").attr("aria-hidden",this._ariaHidden).attr("aria-labelledby","".concat(this._uuid,"-title ").concat(this._uuid,"-desc")).attr("role","img").transition(hu).style("width",this._width!==undefined?"".concat(this._width,"px"):undefined).style("height",this._height!==undefined?"".concat(this._height,"px"):undefined).attr("width",this._width!==undefined?"".concat(this._width,"px"):undefined).attr("height",this._height!==undefined?"".concat(this._height,"px"):undefined);var i=this._select.selectAll("title").data([0]);var r=i.enter().append("title").attr("id","".concat(this._uuid,"-title"));i.merge(r).text(this._svgTitle);var l=this._select.selectAll("desc").data([0]);var u=l.enter().append("desc").attr("id","".concat(this._uuid,"-desc"));l.merge(u).text(this._svgDesc);this._visiblePoll=clearInterval(this._visiblePoll);this._resizePoll=clearTimeout(this._resizePoll);this._scrollPoll=clearTimeout(this._scrollPoll);ys(this._scrollContainer).on("scroll.".concat(this._uuid),null);ys(this._scrollContainer).on("resize.".concat(this._uuid),null);if(this._detectVisible&&this._select.style("visibility")==="hidden"){this._visiblePoll=setInterval(function(){if(o._select.style("visibility")!=="hidden"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(a)}},this._detectVisibleInterval)}else if(this._detectVisible&&this._select.style("display")==="none"){this._visiblePoll=setInterval(function(){if(o._select.style("display")!=="none"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(a)}},this._detectVisibleInterval)}else if(this._detectVisible&&!NU(this._select.node())){ys(this._scrollContainer).on("scroll.".concat(this._uuid),function(){if(!o._scrollPoll){o._scrollPoll=setTimeout(function(){if(NU(o._select.node())){ys(o._scrollContainer).on("scroll.".concat(o._uuid),null);o.render(a)}o._scrollPoll=clearTimeout(o._scrollPoll)},o._detectVisibleInterval)}})}else{var c=cL();if(this._loadingMessage){this._messageClass.render({container:this._select.node().parentNode,html:this._loadingHTML(this),mask:this._filteredData?this._messageMask:false,style:this._messageStyle})}this._queue.forEach(function(t){var e=o._cache?o._lrucache.get(t[1]):undefined;if(!e)c.defer.apply(c,iq(t));else o["_".concat(t[3])]=e});this._queue=[];c.awaitAll(function(){var n=o._data instanceof Array&&o._data.length>0?Object.keys(o._data[0]):[];var t=o._select.selectAll("g.data-table").data(!o._ariaHidden&&o._data instanceof Array&&o._data.length?[0]:[]);var e=t.enter().append("g").attr("class","data-table").attr("role","table");t.exit().remove();var i=t.merge(e).selectAll("text").data(o._data instanceof Array?It(0,o._data.length+1):[]);i.exit().remove();var r=i.merge(i.enter().append("text").attr("role","row")).selectAll("tspan").data(function(t,e){return n.map(function(t){return{role:e?"cell":"columnheader",text:e?o._data[e-1][t]:t}})});r.exit().remove();r.merge(r.enter().append("tspan")).attr("role",function(t){return t.role}).attr("dy","-1000px").html(function(t){return t.text});o._preDraw();o._draw(a);YU.bind(o)();if(o._messageClass._isVisible&&(!o._noDataMessage||o._filteredData.length))o._messageClass.hide();if(o._detectResize&&(o._autoWidth||o._autoHeight)){ys(o._scrollContainer).on("resize.".concat(o._uuid),function(){o._resizePoll=clearTimeout(o._resizePoll);o._resizePoll=setTimeout(function(){o._resizePoll=clearTimeout(o._resizePoll);s.bind(o)();o.render(a)},o._detectResizeDelay)})}if(a)setTimeout(a,o._duration+100)})}ys("body").on("touchstart.".concat(this._uuid),VU.bind(this));return this}},{key:"active",value:function t(e){this._active=e;if(this._shapeConfig.activeOpacity!==1){this._shapes.forEach(function(t){return t.active(e)});if(this._legend)this._legendClass.active(e)}return this}},{key:"aggs",value:function t(e){return arguments.length?(this._aggs=xu(this._aggs,e),this):this._aggs}},{key:"ariaHidden",value:function t(e){return arguments.length?(this._ariaHidden=e,this):this._ariaHidden}},{key:"backConfig",value:function t(e){return arguments.length?(this._backConfig=xu(this._backConfig,e),this):this._backConfig}},{key:"cache",value:function t(e){return arguments.length?(this._cache=e,this):this._cache}},{key:"color",value:function t(e){return arguments.length?(this._color=!e||typeof e==="function"?e:yu(e),this):this._color}},{key:"colorScale",value:function t(e){return arguments.length?(this._colorScale=!e||typeof e==="function"?e:yu(e),this):this._colorScale}},{key:"colorScaleConfig",value:function t(e){return arguments.length?(this._colorScaleConfig=xu(this._colorScaleConfig,e),this):this._colorScaleConfig}},{key:"colorScalePadding",value:function t(e){return arguments.length?(this._colorScalePadding=typeof e==="function"?e:Rw(e),this):this._colorScalePadding}},{key:"colorScalePosition",value:function t(e){return arguments.length?(this._colorScalePosition=e,this):this._colorScalePosition}},{key:"colorScaleMaxSize",value:function t(e){return arguments.length?(this._colorScaleMaxSize=e,this):this._colorScaleMaxSize}},{key:"controls",value:function t(e){return arguments.length?(this._controls=e,this):this._controls}},{key:"controlConfig",value:function t(e){return arguments.length?(this._controlConfig=xu(this._controlConfig,e),this):this._controlConfig}},{key:"controlPadding",value:function t(e){return arguments.length?(this._controlPadding=typeof e==="function"?e:Rw(e),this):this._controlPadding}},{key:"data",value:function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="data"});var r=[Wz.bind(this),e,n,"data"];if(i)this._queue[this._queue.indexOf(i)]=r;else this._queue.push(r);this._hidden=[];this._solo=[];return this}return this._data}},{key:"dataCutoff",value:function t(e){return arguments.length?(this._dataCutoff=e,this):this._dataCutoff}},{key:"depth",value:function t(e){return arguments.length?(this._depth=e,this):this._depth}},{key:"detectResize",value:function t(e){return arguments.length?(this._detectResize=e,this):this._detectResize}},{key:"detectResizeDelay",value:function t(e){return arguments.length?(this._detectResizeDelay=e,this):this._detectResizeDelay}},{key:"detectVisible",value:function t(e){return arguments.length?(this._detectVisible=e,this):this._detectVisible}},{key:"detectVisibleInterval",value:function t(e){return arguments.length?(this._detectVisibleInterval=e,this):this._detectVisibleInterval}},{key:"discrete",value:function t(e){return arguments.length?(this._discrete=e,this):this._discrete}},{key:"downloadButton",value:function t(e){return arguments.length?(this._downloadButton=e,this):this._downloadButton}},{key:"downloadConfig",value:function t(e){return arguments.length?(this._downloadConfig=xu(this._downloadConfig,e),this):this._downloadConfig}},{key:"downloadPosition",value:function t(e){return arguments.length?(this._downloadPosition=e,this):this._downloadPosition}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"filter",value:function t(e){return arguments.length?(this._filter=e,this):this._filter}},{key:"groupBy",value:function t(e){var n=this;if(!arguments.length)return this._groupBy;if(!(e instanceof Array))e=[e];return this._groupBy=e.map(function(t){if(typeof t==="function")return t;else{if(!n._aggs[t]){n._aggs[t]=function(t){var e=Ow(t);return e.length===1?e[0]:e}}return yu(t)}}),this}},{key:"height",value:function t(e){return arguments.length?(this._height=e,this):this._height}},{key:"hiddenColor",value:function t(e){return arguments.length?(this._hiddenColor=typeof e==="function"?e:Rw(e),this):this._hiddenColor}},{key:"hiddenOpacity",value:function t(e){return arguments.length?(this._hiddenOpacity=typeof e==="function"?e:Rw(e),this):this._hiddenOpacity}},{key:"hover",value:function t(e){var i=this;var n=this._hover=e;if(this._shapeConfig.hoverOpacity!==1){if(typeof e==="function"){var r=Vt(this._shapes.map(function(t){return t.data()}));r=r.concat(this._legendClass.data());var a=e?r.filter(e):[];var o=[];a.map(this._ids).forEach(function(t){for(var e=1;e<=t.length;e++){o.push(JSON.stringify(t.slice(0,e)))}});o=o.filter(function(t,e){return o.indexOf(t)===e});if(o.length)n=function t(e,n){return o.includes(JSON.stringify(i._ids(e,n)))}}this._shapes.forEach(function(t){return t.hover(n)});if(this._legend)this._legendClass.hover(n)}return this}},{key:"label",value:function t(e){return arguments.length?(this._label=typeof e==="function"?e:Rw(e),this):this._label}},{key:"legend",value:function t(e){return arguments.length?(this._legend=e,this):this._legend}},{key:"legendConfig",value:function t(e){return arguments.length?(this._legendConfig=xu(this._legendConfig,e),this):this._legendConfig}},{key:"legendCutoff",value:function t(e){return arguments.length?(this._legendCutoff=e,this):this._legendCutoff}},{key:"legendTooltip",value:function t(e){return arguments.length?(this._legendTooltip=xu(this._legendTooltip,e),this):this._legendTooltip}},{key:"legendPadding",value:function t(e){return arguments.length?(this._legendPadding=typeof e==="function"?e:Rw(e),this):this._legendPadding}},{key:"legendPosition",value:function t(e){return arguments.length?(this._legendPosition=e,this):this._legendPosition}},{key:"legendSort",value:function t(e){return arguments.length?(this._legendSort=e,this):this._legendSort}},{key:"loadingHTML",value:function t(e){return arguments.length?(this._loadingHTML=typeof e==="function"?e:Rw(e),this):this._loadingHTML}},{key:"loadingMessage",value:function t(e){return arguments.length?(this._loadingMessage=e,this):this._loadingMessage}},{key:"messageMask",value:function t(e){return arguments.length?(this._messageMask=e,this):this._messageMask}},{key:"messageStyle",value:function t(e){return arguments.length?(this._messageStyle=xu(this._messageStyle,e),this):this._messageStyle}},{key:"noDataHTML",value:function t(e){return arguments.length?(this._noDataHTML=typeof e==="function"?e:Rw(e),this):this._noDataHTML}},{key:"noDataMessage",value:function t(e){return arguments.length?(this._noDataMessage=e,this):this._noDataMessage}},{key:"scrollContainer",value:function t(e){return arguments.length?(this._scrollContainer=e,this):this._scrollContainer}},{key:"select",value:function t(e){return arguments.length?(this._select=ys(e),this):this._select}},{key:"shape",value:function t(e){return arguments.length?(this._shape=typeof e==="function"?e:Rw(e),this):this._shape}},{key:"shapeConfig",value:function t(e){return arguments.length?(this._shapeConfig=xu(this._shapeConfig,e),this):this._shapeConfig}},{key:"svgDesc",value:function t(e){return arguments.length?(this._svgDesc=e,this):this._svgDesc}},{key:"svgTitle",value:function t(e){return arguments.length?(this._svgTitle=e,this):this._svgTitle}},{key:"threshold",value:function t(e){if(arguments.length){if(typeof e==="function"){this._threshold=e}else if(isFinite(e)&&!isNaN(e)){this._threshold=Rw(e*1)}return this}else return this._threshold}},{key:"thresholdKey",value:function t(e){if(arguments.length){if(typeof e==="function"){this._thresholdKey=e}else{this._thresholdKey=yu(e)}return this}else return this._thresholdKey}},{key:"thresholdName",value:function t(e){return arguments.length?(this._thresholdName=typeof e==="function"?e:Rw(e),this):this._thresholdName}},{key:"time",value:function t(e){if(arguments.length){if(typeof e==="function"){this._time=e}else{this._time=yu(e);if(!this._aggs[e]){this._aggs[e]=function(t){var e=Ow(t);return e.length===1?e[0]:e}}}this._timeFilter=false;return this}else return this._time}},{key:"timeFilter",value:function t(e){return arguments.length?(this._timeFilter=e,this):this._timeFilter}},{key:"timeline",value:function t(e){return arguments.length?(this._timeline=e,this):this._timeline}},{key:"timelineConfig",value:function t(e){return arguments.length?(this._timelineConfig=xu(this._timelineConfig,e),this):this._timelineConfig}},{key:"timelinePadding",value:function t(e){return arguments.length?(this._timelinePadding=typeof e==="function"?e:Rw(e),this):this._timelinePadding}},{key:"title",value:function t(e){return arguments.length?(this._title=typeof e==="function"?e:Rw(e),this):this._title}},{key:"titleConfig",value:function t(e){return arguments.length?(this._titleConfig=xu(this._titleConfig,e),this):this._titleConfig}},{key:"titlePadding",value:function t(e){return arguments.length?(this._titlePadding=typeof e==="function"?e:Rw(e),this):this._titlePadding}},{key:"tooltip",value:function t(e){return arguments.length?(this._tooltip=e,this):this._tooltip}},{key:"tooltipConfig",value:function t(e){return arguments.length?(this._tooltipConfig=xu(this._tooltipConfig,e),this):this._tooltipConfig}},{key:"total",value:function t(e){if(arguments.length){if(typeof e==="function")this._total=e;else if(e)this._total=yu(e);else this._total=false;return this}else return this._total}},{key:"totalConfig",value:function t(e){return arguments.length?(this._totalConfig=xu(this._totalConfig,e),this):this._totalConfig}},{key:"totalFormat",value:function t(e){return arguments.length?(this._totalFormat=e,this):this._totalFormat}},{key:"totalPadding",value:function t(e){return arguments.length?(this._totalPadding=typeof e==="function"?e:Rw(e),this):this._totalPadding}},{key:"width",value:function t(e){return arguments.length?(this._width=e,this):this._width}},{key:"zoom",value:function t(e){return arguments.length?(this._zoom=e,this):this._zoom}},{key:"zoomBrushHandleSize",value:function t(e){return arguments.length?(this._zoomBrushHandleSize=e,this):this._zoomBrushHandleSize}},{key:"zoomBrushHandleStyle",value:function t(e){return arguments.length?(this._zoomBrushHandleStyle=e,this):this._zoomBrushHandleStyle}},{key:"zoomBrushSelectionStyle",value:function t(e){return arguments.length?(this._zoomBrushSelectionStyle=e,this):this._zoomBrushSelectionStyle}},{key:"zoomControlStyle",value:function t(e){return arguments.length?(this._zoomControlStyle=e,this):this._zoomControlStyle}},{key:"zoomControlStyleActive",value:function t(e){return arguments.length?(this._zoomControlStyleActive=e,this):this._zoomControlStyleActive}},{key:"zoomControlStyleHover",value:function t(e){return arguments.length?(this._zoomControlStyleHover=e,this):this._zoomControlStyleHover}},{key:"zoomFactor",value:function t(e){return arguments.length?(this._zoomFactor=e,this):this._zoomFactor}},{key:"zoomMax",value:function t(e){return arguments.length?(this._zoomMax=e,this):this._zoomMax}},{key:"zoomPan",value:function t(e){return arguments.length?(this._zoomPan=e,this):this._zoomPan}},{key:"zoomPadding",value:function t(e){return arguments.length?(this._zoomPadding=e,this):this._zoomPadding}},{key:"zoomScroll",value:function t(e){return arguments.length?(this._zoomScroll=e,this):this._zoomScroll}}]);return e}(Cw);function kq(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){kq=function t(e){return j(e)}}else{kq=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return kq(t)}function Sq(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function Cq(t,e){for(var n=0;n1&&arguments[1]!==undefined?arguments[1]:0;var r=[];if(this._tiles){r=this._tileGen.extent(this._zoomBehavior.translateExtent()).scale(this._projection.scale()*(2*Math.PI)*e.k).translate(e.apply(this._projection.translate()))();this._tileGroup.transition().duration(i).attr("transform",e)}var a=this._tileGroup.selectAll("image.d3plus-geomap-tile").data(r,function(t){return"".concat(t.x,"-").concat(t.y,"-").concat(t.z)});a.exit().transition().duration(i).attr("opacity",0).remove();var o=r.scale/e.k;a.enter().append("image").attr("class","d3plus-geomap-tile").attr("opacity",0).attr("xlink:href",function(t){return n._tileUrl.replace("{s}",["a","b","c"][Math.random()*3|0]).replace("{z}",t.z).replace("{x}",t.x).replace("{y}",t.y)}).attr("width",o).attr("height",o).attr("x",function(t){return t.x*o+r.translate[0]*o-e.x/e.k}).attr("y",function(t){return t.y*o+r.translate[1]*o-e.y/e.k}).transition().duration(i).attr("opacity",1);a.attr("width",o).attr("height",o).attr("x",function(t){return t.x*o+r.translate[0]*o-e.x/e.k}).attr("y",function(t){return t.y*o+r.translate[1]*o-e.y/e.k})}},{key:"_draw",value:function t(e){var i=this;Rq(Oq(C.prototype),"_draw",this).call(this,e);var n=this._height-this._margin.top-this._margin.bottom,r=this._width-this._margin.left-this._margin.right;this._container=this._select.selectAll("svg.d3plus-geomap").data([0]);this._container=this._container.enter().append("svg").attr("class","d3plus-geomap").attr("opacity",0).attr("width",r).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top).style("background-color",this._ocean||"transparent").merge(this._container);this._container.transition(this._transition).attr("opacity",1).attr("width",r).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top);var a=this._container.selectAll("rect.d3plus-geomap-ocean").data([0]);a.enter().append("rect").attr("class","d3plus-geomap-ocean").merge(a).attr("width",r).attr("height",n).attr("fill",this._ocean||"transparent");this._tileGroup=this._container.selectAll("g.d3plus-geomap-tileGroup").data([0]);this._tileGroup=this._tileGroup.enter().append("g").attr("class","d3plus-geomap-tileGroup").merge(this._tileGroup);this._zoomGroup=this._container.selectAll("g.d3plus-geomap-zoomGroup").data([0]);this._zoomGroup=this._zoomGroup.enter().append("g").attr("class","d3plus-geomap-zoomGroup").merge(this._zoomGroup);var o=this._zoomGroup.selectAll("g.d3plus-geomap-paths").data([0]);o=o.enter().append("g").attr("class","d3plus-geomap-paths").merge(o);var s=this._coordData=this._topojson?Nq(this._topojson,this._topojsonKey):{type:"FeatureCollection",features:[]};if(this._topojsonFilter)s.features=s.features.filter(this._topojsonFilter);var l=this._path=eD().projection(this._projection);var u=this._filteredData.filter(function(t,e){return i._point(t,e)instanceof Array});var c=this._filteredData.filter(function(t,e){return!(i._point(t,e)instanceof Array)}).reduce(function(t,e){t[i._id(e)]=e;return t},{});var h=s.features.reduce(function(t,e){var n=i._topojsonId(e);t.push({__d3plus__:true,data:c[n],feature:e,id:n});return t},[]);var f=Ea["scale".concat(this._pointSizeScale.charAt(0).toUpperCase()).concat(this._pointSizeScale.slice(1))]().domain(Ft(u,function(t,e){return i._pointSize(t,e)})).range([this._pointSizeMin,this._pointSizeMax]);if(!this._zoomSet){var d=this._fitObject?Nq(this._fitObject,this._fitKey):s;this._extentBounds={type:"FeatureCollection",features:this._fitFilter?d.features.filter(this._fitFilter):d.features.slice()};this._extentBounds.features=this._extentBounds.features.reduce(function(t,e){if(e.geometry){var n={type:e.type,id:e.id,geometry:{coordinates:e.geometry.coordinates,type:e.geometry.type}};if(e.geometry.type==="MultiPolygon"&&e.geometry.coordinates.length>1){var i=[],r=[];e.geometry.coordinates.forEach(function(t){n.geometry.coordinates=[t];i.push(l.area(n))});n.geometry.coordinates=[e.geometry.coordinates[i.indexOf(Ht(i))]];var a=l.centroid(n);e.geometry.coordinates.forEach(function(t){n.geometry.coordinates=[t];r.push(TE(l.centroid(n),a))});var o=E(i.reduce(function(t,e,n){if(e)t.push(i[n]/e);return t},[]),.9);n.geometry.coordinates=e.geometry.coordinates.filter(function(t,e){var n=r[e];return n===0||i[e]/n>=o})}t.push(n)}return t},[]);if(!this._extentBounds.features.length&&u.length){var g=[[undefined,undefined],[undefined,undefined]];u.forEach(function(t,e){var n=i._projection(i._point(t,e));if(g[0][0]===void 0||n[0]g[1][0])g[1][0]=n[0];if(g[0][1]===void 0||n[1]g[1][1])g[1][1]=n[1]});this._extentBounds={type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"MultiPoint",coordinates:g.map(function(t){return i._projection.invert(t)})}}]};var p=Ht(u,function(t,e){return f(i._pointSize(t,e))});this._projectionPadding.top+=p;this._projectionPadding.right+=p;this._projectionPadding.bottom+=p;this._projectionPadding.left+=p}this._zoomBehavior.extent([[0,0],[r,n]]).scaleExtent([1,this._zoomMax]).translateExtent([[0,0],[r,n]]);this._zoomSet=true}this._projection=this._projection.fitExtent(this._extentBounds.features.length?[[this._projectionPadding.left,this._projectionPadding.top],[r-this._projectionPadding.right,n-this._projectionPadding.bottom]]:[[0,0],[r,n]],this._extentBounds.features.length?this._extentBounds:{type:"Sphere"});this._shapes.push((new SR).data(h).d(function(t){return l(t.feature)}).select(o.node()).x(0).y(0).config(Mw.bind(this)(this._shapeConfig,"shape","Path")).render());var v=this._zoomGroup.selectAll("g.d3plus-geomap-pins").data([0]);v=v.enter().append("g").attr("class","d3plus-geomap-pins").merge(v);var m=(new vM).config(Mw.bind(this)(this._shapeConfig,"shape","Circle")).data(u).r(function(t,e){return f(i._pointSize(t,e))}).select(v.node()).sort(function(t,e){return i._pointSize(e)-i._pointSize(t)}).x(function(t,e){return i._projection(i._point(t,e))[0]}).y(function(t,e){return i._projection(i._point(t,e))[1]});var y=Object.keys(this._on);var _=y.filter(function(t){return t.includes(".Circle")}),b=y.filter(function(t){return!t.includes(".")}),w=y.filter(function(t){return t.includes(".shape")});for(var x=0;x=0){e+=n[i].value}t.value=e}function iW(){return this.eachAfter(nW)}function rW(t){var e=this,n,i=[e],r,a,o;do{n=i.reverse(),i=[];while(e=n.pop()){t(e),r=e.children;if(r)for(a=0,o=r.length;a=0;--r){n.push(i[r])}}return this}function oW(t){var e=this,n=[e],i=[],r,a,o;while(e=n.pop()){i.push(e),r=e.children;if(r)for(a=0,o=r.length;a=0){e+=n[i].value}t.value=e})}function lW(e){return this.eachBefore(function(t){if(t.children){t.children.sort(e)}})}function uW(t){var e=this,n=cW(e,t),i=[e];while(e!==n){e=e.parent;i.push(e)}var r=i.length;while(t!==n){i.splice(r,0,t);t=t.parent}return i}function cW(t,e){if(t===e)return t;var n=t.ancestors(),i=e.ancestors(),r=null;t=n.pop();e=i.pop();while(t===e){r=t;t=n.pop();e=i.pop()}return r}function hW(){var t=this,e=[t];while(t=t.parent){e.push(t)}return e}function fW(){var e=[];this.each(function(t){e.push(t)});return e}function dW(){var e=[];this.eachBefore(function(t){if(!t.children){e.push(t)}});return e}function gW(){var e=this,n=[];e.each(function(t){if(t!==e){n.push({source:t.parent,target:t})}});return n}function pW(t,e){var n=new bW(t),i=+t.value&&(n.value=t.value),r,a=[n],o,s,l,u;if(e==null)e=mW;while(r=a.pop()){if(i)r.value=+r.data.value;if((s=e(r.data))&&(u=s.length)){r.children=new Array(u);for(l=u-1;l>=0;--l){a.push(o=r.children[l]=new bW(s[l]));o.parent=r;o.depth=r.depth+1}}}return n.eachBefore(_W)}function vW(){return pW(this).eachBefore(yW)}function mW(t){return t.children}function yW(t){t.data=t.data.data}function _W(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function bW(t){this.data=t;this.depth=this.height=0;this.parent=null}bW.prototype=pW.prototype={constructor:bW,count:iW,each:rW,eachAfter:oW,eachBefore:aW,sum:sW,sort:lW,path:uW,ancestors:hW,descendants:fW,leaves:dW,links:gW,copy:vW};var wW=Array.prototype.slice;function xW(t){var e=t.length,n,i;while(e){i=Math.random()*e--|0;n=t[e];t[e]=t[i];t[i]=n}return t}function kW(t){var e=0,n=(t=xW(wW.call(t))).length,i=[],r,a;while(e0&&n*n>i*i+r*r}function AW(t,e){for(var n=0;nl){r=(u+l-a)/(2*u);s=Math.sqrt(Math.max(0,l/u-r*r));n.x=t.x-r*i-s*o;n.y=t.y-r*o+s*i}else{r=(u+a-l)/(2*u);s=Math.sqrt(Math.max(0,a/u-r*r));n.x=e.x+r*i-s*o;n.y=e.y+r*o+s*i}}else{n.x=e.x+n.r;n.y=e.y}}function PW(t,e){var n=t.r+e.r-1e-6,i=e.x-t.x,r=e.y-t.y;return n>0&&n*n>i*i+r*r}function NW(t){var e=t._,n=t.next._,i=e.r+n.r,r=(e.x*n.r+n.x*e.r)/i,a=(e.y*n.r+n.y*e.r)/i;return r*r+a*a}function DW(t){this._=t;this.next=null;this.previous=null}function zW(t){if(!(r=t.length))return 0;var e,n,i,r,a,o,s,l,u,c,h;e=t[0],e.x=0,e.y=0;if(!(r>1))return e.r;n=t[1],e.x=-n.r,n.x=e.r,n.y=0;if(!(r>2))return e.r+n.r;BW(n,e,i=t[2]);e=new DW(e),n=new DW(n),i=new DW(i);e.next=i.previous=n;n.next=e.previous=i;i.next=n.previous=e;t:for(s=3;s=0){a=i[r];a.z+=e;a.m+=e;e+=a.s+(n+=a.c)}}function QW(t,e,n){return t.a.parent===e.parent?t.a:n}function tK(t,e){this._=t;this.parent=null;this.children=null;this.A=null;this.a=this;this.z=0;this.m=0;this.c=0;this.s=0;this.t=null;this.i=e}tK.prototype=Object.create(bW.prototype);function eK(t){var e=new tK(t,0),n,i=[e],r,a,o,s;while(n=i.pop()){if(a=n._.children){n.children=new Array(s=a.length);for(o=s-1;o>=0;--o){i.push(r=n.children[o]=new tK(a[o],o));r.parent=n}}}(e.parent=new tK(null,0)).children=[e];return e}function nK(){var f=YW,u=1,c=1,h=null;function e(t){var e=eK(t);e.eachAfter(d),e.parent.m=-e.z;e.eachBefore(g);if(h)t.eachBefore(p);else{var n=t,i=t,r=t;t.eachBefore(function(t){if(t.xi.x)i=t;if(t.depth>r.depth)r=t});var a=n===i?1:f(n,i)/2,o=a-n.x,s=u/(i.x+a+o),l=c/(r.depth||1);t.eachBefore(function(t){t.x=(t.x+o)*s;t.y=t.depth*l})}return t}function d(t){var e=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(e){JW(t);var r=(e[0].z+e[e.length-1].z)/2;if(i){t.z=i.z+f(t._,i._);t.m=t.z-r}else{t.z=r}}else if(i){t.z=i.z+f(t._,i._)}t.parent.A=a(t,i,t.parent.A||n[0])}function g(t){t._.x=t.z+t.parent.m;t.m+=t.parent.m}function a(t,e,n){if(e){var i=t,r=t,a=e,o=i.parent.children[0],s=i.m,l=r.m,u=a.m,c=o.m,h;while(a=$W(a),i=XW(i),a&&i){o=XW(o);r=$W(r);r.a=t;h=a.z+u-i.z-s+f(a._,i._);if(h>0){ZW(QW(a,t,n),t,h);s+=h;l+=h}u+=a.m;s+=i.m;c+=o.m;l+=r.m}if(a&&!$W(r)){r.t=a;r.m+=u-l}if(i&&!XW(o)){o.t=i;o.m+=s-c;n=t}}return n}function p(t){t.x*=u;t.y=t.depth*c}e.separation=function(t){return arguments.length?(f=t,e):f};e.size=function(t){return arguments.length?(h=false,u=+t[0],c=+t[1],e):h?null:[u,c]};e.nodeSize=function(t){return arguments.length?(h=true,u=+t[0],c=+t[1],e):h?[u,c]:null};return e}function iK(t,e,n,i,r){var a=t.children,o,s=-1,l=a.length,u=t.value&&(r-n)/t.value;while(++sy)y=u;x=v*v*w;_=Math.max(y/x,x/m);if(_>b){v-=u;break}b=_}o.push(l={value:v,dice:d1?t:1)};return t}(rK);function sK(){var o=oK,e=false,n=1,i=1,s=[0],l=FW,u=FW,c=FW,h=FW,f=FW;function r(t){t.x0=t.y0=0;t.x1=n;t.y1=i;t.eachBefore(a);s=[0];if(e)t.eachBefore(WW);return t}function a(t){var e=s[t.depth],n=t.x0+e,i=t.y0+e,r=t.x1-e,a=t.y1-e;if(r1&&arguments[1]!==undefined?arguments[1]:[];if(t.values){t.values.forEach(function(t){n.push(t);e(t,n)})}else{n.push(t)}return n};var SK=function(t){wK(c,t);function c(){var a;dK(this,c);a=vK(this,bK(c).call(this));a._layoutPadding=1;a._on.mouseenter=function(){};var e=a._on["mousemove.legend"];a._on["mousemove.legend"]=function(n,t){e(n,t);var i=a._ids(n,t);var r=kK(n);a.hover(function(e){var t=Object.keys(e).filter(function(t){return t!=="value"}).every(function(t){return n[t]&&n[t].includes(e[t])});if(t)r.push(e);else if(i.includes(e.key))r.push.apply(r,uK(kK(e,[e])));return r.includes(e)})};var n=a._on["mousemove.shape"];a._on["mousemove.shape"]=function(e,t){if(e.__d3plusTooltip__)n(e,t);a.hover(function(t){return kK(e,[e]).includes(t)})};a._pack=VW();a._packOpacity=Rw(.25);a._shape=Rw("Circle");a._shapeConfig=xu(a._shapeConfig,{Circle:{label:function t(e){return e.parent&&!e.children?e.id:false},labelConfig:{fontResize:true},opacity:function t(e){return e.__d3plusOpacity__}}});a._sort=function(t,e){return e.value-t.value};a._sum=yu("value");return a}pK(c,[{key:"_draw",value:function t(e){var n=this;yK(bK(c.prototype),"_draw",this).call(this,e);var i=this._height-this._margin.top-this._margin.bottom,r=this._width-this._margin.left-this._margin.right;var a=Math.min(i,r);var o="translate(".concat((r-a)/2,", ").concat((i-a)/2,")");var s=Fe();for(var l=0;l<=this._drawDepth;l++){s.key(this._groupBy[l])}s=s.entries(this._filteredData);var u=this._pack.padding(this._layoutPadding).size([a,a])(pW({key:s.key,values:s},function(t){return t.values}).sum(this._sum).sort(this._sort)).descendants();u.forEach(function(t,e){t.__d3plus__=true;t.i=e;t.id=t.parent?t.parent.data.key:null;t.data.__d3plusOpacity__=t.height?n._packOpacity(t.data,e):1;t.data.__d3plusTooltip__=!t.height?true:false});this._shapes.push((new vM).data(u).select(Tw("g.d3plus-Pack",{parent:this._select,enter:{transform:o},update:{transform:o}}).node()).config(Mw.bind(this)(this._shapeConfig,"shape","Circle")).render());return this}},{key:"hover",value:function t(e){this._hover=e;this._shapes.forEach(function(t){return t.hover(e)});if(this._legend)this._legendClass.hover(e);return this}},{key:"layoutPadding",value:function t(e){return arguments.length?(this._layoutPadding=e,this):this._layoutPadding}},{key:"packOpacity",value:function t(e){return arguments.length?(this._packOpacity=typeof e==="function"?e:Rw(e),this):this._packOpacity}},{key:"sort",value:function t(e){return arguments.length?(this._sort=e,this):this._sort}},{key:"sum",value:function t(e){return arguments.length?(this._sum=typeof e==="function"?e:yu(e),this):this._sum}}]);return c}(xq);function CK(t,e){if(!(e instanceof Array))e=[e];var n=Fe();for(var i=0;i1})).select(Tw("g.d3plus-Tree-Links",p).node()).config(Mw.bind(this)(this._shapeConfig,"shape","Path")).config({d:function t(e){var n=h._shapeConfig.r;if(typeof n==="function")n=n(e.data,e.i);var i=e.parent.x-e.x+(h._orient==="vertical"?0:n),r=e.parent.y-e.y+(h._orient==="vertical"?n:0),a=h._orient==="vertical"?0:-n,o=h._orient==="vertical"?-n:0;return h._orient==="vertical"?"M".concat(a,",").concat(o,"C").concat(a,",").concat((o+r)/2," ").concat(i,",").concat((o+r)/2," ").concat(i,",").concat(r):"M".concat(a,",").concat(o,"C").concat((a+i)/2,",").concat(o," ").concat((a+i)/2,",").concat(r," ").concat(i,",").concat(r)},id:function t(e,n){return h._ids(e,n).join("-")}}).render());this._shapes.push((new vM).data(a).select(Tw("g.d3plus-Tree-Shapes",p).node()).config(Mw.bind(this)(this._shapeConfig,"shape","Circle")).config({id:function t(e,n){return h._ids(e,n).join("-")},label:function t(e,n){if(h._label)return h._label(e.data,n);var i=h._ids(e,n).slice(0,e.depth);return i[i.length-1]},labelConfig:{textAnchor:function t(e){return h._orient==="vertical"?"middle":e.data.children&&e.data.depth!==h._groupBy.length?"end":"start"},verticalAlign:function t(e){return h._orient==="vertical"?e.data.depth===1?"bottom":"top":"middle"}},hitArea:function t(e,n,i){var r=h._labelHeight,a=h._labelWidths[e.depth-1];return{width:h._orient==="vertical"?a:i.r*2+a,height:h._orient==="horizontal"?r:i.r*2+r,x:h._orient==="vertical"?-a/2:e.children&&e.depth!==h._groupBy.length?-(i.r+a):-i.r,y:h._orient==="horizontal"?-r/2:e.children&&e.depth!==h._groupBy.length?-(i.r+h._labelHeight):-i.r}},labelBounds:function t(e,n,i){var r;var a=h._labelHeight,o=h._orient==="vertical"?"height":"width",s=h._labelWidths[e.depth-1],l=h._orient==="vertical"?"width":"height",u=h._orient==="vertical"?"x":"y",c=h._orient==="vertical"?"y":"x";return r={},MK(r,l,s),MK(r,o,a),MK(r,u,-s/2),MK(r,c,e.children&&e.depth!==h._groupBy.length?-(i.r+a):i.r),r}}).render());return this}},{key:"orient",value:function t(e){return arguments.length?(this._orient=e,this):this._orient}},{key:"separation",value:function t(e){return arguments.length?(this._separation=e,this):this._separation}}]);return v}(xq);function IK(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){IK=function t(e){return j(e)}}else{IK=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return IK(t)}function HK(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function VK(t,e){for(var n=0;n-1?i:undefined;n.data=Bw(n.data.values);n.x=n.x0+(n.x1-n.x0)/2;n.y=n.y0+(n.y1-n.y0)/2;o.push(n)}}}if(a.children)l(a.children);this._rankData=o.sort(this._sort).map(function(t){return t.data});var u=a.value;o.forEach(function(t){t.share=n._sum(t.data,t.i)/u});var c="translate(".concat(this._margin.left,", ").concat(this._margin.top,")");var h=Mw.bind(this)(this._shapeConfig,"shape","Rect");var f=h.labelConfig.fontMin;var d=h.labelConfig.padding;this._shapes.push((new MM).data(o).label(function(t){return[n._drawLabel(t.data,t.i),"".concat(Hw(t.share*100,n._locale),"%")]}).select(Tw("g.d3plus-Treemap",{parent:this._select,enter:{transform:c},update:{transform:c}}).node()).config({height:function t(e){return e.y1-e.y0},labelBounds:function t(e,n,i){var r=i.height;var a=Math.min(50,(r-d*2)*.5);if(a=m)return;var a=y[r];var o=n.filter(function(t){return a(t)===i.key});if(r+1===m){var s=[];var l=Math.min(1,Math.max(0,_(o)));if(!isFinite(l)||isNaN(l))return;var u=l*e;var c=o.length;while(c--){var h=o[c];if(b(h)0){var d=Bw(s,v);d._isAggregation=true;d._threshold=l;t.push(d)}}else{var g=i.values;var p=g.length;while(p--){w(t,e,o,g[p],r+1)}}}return e}},{key:"layoutPadding",value:function t(e){return arguments.length?(this._layoutPadding=typeof e==="function"?e:Rw(e),this):this._layoutPadding}},{key:"sort",value:function t(e){return arguments.length?(this._sort=e,this):this._sort}},{key:"sum",value:function t(e){if(arguments.length){this._sum=typeof e==="function"?e:yu(e);this._thresholdKey=this._sum;return this}else return this._sum}},{key:"tile",value:function t(e){return arguments.length?(this._tile=e,this):this._tile}}]);return g}(xq);function JK(t){return function(){return t}}function QK(){return(Math.random()-.5)*1e-6}function tY(t){var e=+this._x.call(null,t),n=+this._y.call(null,t);return eY(this.cover(e,n),e,n,t)}function eY(t,e,n,i){if(isNaN(e)||isNaN(n))return t;var r,a=t._root,o={data:i},s=t._x0,l=t._y0,u=t._x1,c=t._y1,h,f,d,g,p,v,m,y;if(!a)return t._root=o,t;while(a.length){if(p=e>=(h=(s+u)/2))s=h;else u=h;if(v=n>=(f=(l+c)/2))l=f;else c=f;if(r=a,!(a=a[m=v<<1|p]))return r[m]=o,t}d=+t._x.call(null,a.data);g=+t._y.call(null,a.data);if(e===d&&n===g)return o.next=a,r?r[m]=o:t._root=o,t;do{r=r?r[m]=new Array(4):t._root=new Array(4);if(p=e>=(h=(s+u)/2))s=h;else u=h;if(v=n>=(f=(l+c)/2))l=f;else c=f}while((m=v<<1|p)===(y=(g>=f)<<1|d>=h));return r[y]=a,r[m]=o,t}function nY(t){var e,n,i=t.length,r,a,o=new Array(i),s=new Array(i),l=Infinity,u=Infinity,c=-Infinity,h=-Infinity;for(n=0;nc)c=r;if(ah)h=a}if(l>c||u>h)return this;this.cover(l,u).cover(c,h);for(n=0;nt||t>=r||i>e||e>=a){u=(ec||(s=g.y0)>h||(l=g.x1)=m)<<1|t>=v){g=f[f.length-1];f[f.length-1]=f[f.length-1-p];f[f.length-1-p]=g}}else{var y=t-+this._x.call(null,d.data),_=e-+this._y.call(null,d.data),b=y*y+_*_;if(b=(f=(o+l)/2))o=f;else l=f;if(p=h>=(d=(s+u)/2))s=d;else u=d;if(!(e=n,n=n[v=p<<1|g]))return this;if(!n.length)break;if(e[v+1&3]||e[v+2&3]||e[v+3&3])i=e,m=v}while(n.data!==t){if(!(r=n,n=n.next))return this}if(a=n.next)delete n.next;if(r)return a?r.next=a:delete r.next,this;if(!e)return this._root=a,this;a?e[v]=a:delete e[v];if((n=e[0]||e[1]||e[2]||e[3])&&n===(e[3]||e[2]||e[1]||e[0])&&!n.length){if(i)i[m]=n;else this._root=n}return this}function uY(t){for(var e=0,n=t.length;e1?(n==null?c.remove(e):c.set(e,d(n)),a):c.get(e)},find:function t(e,n,i){var r=0,a=h.length,o,s,l,u,c;if(i==null)i=Infinity;else i*=i;for(r=0;r1?(i.on(e,n),a):i.on(e)}}}function TY(){var r,l,u,i=JK(-30),c,h=1,f=Infinity,d=.81;function e(t){var e,n=r.length,i=yY(r,CY,EY).visitAfter(a);for(u=t,e=0;e=f)return;if(t.data!==l||t.next){if(r===0)r=QK(),s+=r*r;if(a===0)a=QK(),s+=a*a;if(s=u._groupBy.length-1){var n="".concat(u._nodeGroupBy&&u._nodeGroupBy[u._drawDepth](t,e)?u._nodeGroupBy[u._drawDepth](t,e):u._id(t,e));if(u._focus&&u._focus===n){u.active(false);u._on.mouseenter.bind(zY(u))(t,e);u._focus=undefined;u._zoomToBounds(null)}else{u.hover(false);var i=u._linkLookup[n],r=u._nodeLookup[n];var a=[n];var o=[r.x-r.r,r.x+r.r],s=[r.y-r.r,r.y+r.r];i.forEach(function(t){a.push(t.id);if(t.x-t.ro[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});u.active(function(t,e){if(t.source&&t.target)return t.source.id===n||t.target.id===n;else return a.includes("".concat(u._ids(t,e)[u._drawDepth]))});u._focus=n;var l=pL(u._container.node());o=o.map(function(t){return t*l.k+l.x});s=s.map(function(t){return t*l.k+l.y});u._zoomToBounds([[o[0],s[0]],[o[1],s[1]]])}}};u._on["click.legend"]=function(t,e){var n=u._id(t);var i=u._ids(t);i=i[i.length-1];if(u._hover&&u._drawDepth>=u._groupBy.length-1){if(u._focus&&u._focus===n){u.active(false);u._focus=undefined;u._zoomToBounds(null)}else{u.hover(false);var r=n.map(function(t){return u._nodeLookup[t]});var a=["".concat(i)];var o=[r[0].x-r[0].r,r[0].x+r[0].r],s=[r[0].y-r[0].r,r[0].y+r[0].r];r.forEach(function(t){a.push(t.id);if(t.x-t.ro[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});u.active(function(t,e){if(t.source&&t.target)return a.includes(t.source.id)&&a.includes(t.target.id);else{var n=u._ids(t,e);return a.includes("".concat(n[n.length-1]))}});u._focus=n;var l=pL(u._container.node());o=o.map(function(t){return t*l.k+l.x});s=s.map(function(t){return t*l.k+l.y});u._zoomToBounds([[o[0],s[0]],[o[1],s[1]]])}u._on.mouseenter.bind(zY(u))(t,e);u._on["mousemove.legend"].bind(zY(u))(t,e)}};u._on.mouseenter=function(){};u._on["mouseleave.shape"]=function(){u.hover(false)};var l=u._on["mousemove.shape"];u._on["mousemove.shape"]=function(t,e){l(t,e);var n="".concat(u._nodeGroupBy&&u._nodeGroupBy[u._drawDepth](t,e)?u._nodeGroupBy[u._drawDepth](t,e):u._id(t,e)),i=u._linkLookup[n],r=u._nodeLookup[n];var a=[n];var o=[r.x-r.r,r.x+r.r],s=[r.y-r.r,r.y+r.r];i.forEach(function(t){a.push(t.id);if(t.x-t.ro[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});u.hover(function(t,e){if(t.source&&t.target)return t.source.id===n||t.target.id===n;else return a.includes("".concat(u._ids(t,e)[u._drawDepth]))})};u._sizeMin=5;u._sizeScale="sqrt";u._shape=Rw("Circle");u._shapeConfig=xu(u._shapeConfig,{ariaLabel:function t(e,n){var i=u._size?", ".concat(u._size(e,n)):"";return"".concat(u._drawLabel(e,n)).concat(i,".")},labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee"}});u._x=yu("x");u._y=yu("y");u._zoom=true;return u}NY(W,[{key:"_draw",value:function t(e){var r=this;jY(FY(W.prototype),"_draw",this).call(this,e);var n=this._height-this._margin.top-this._margin.bottom,i="translate(".concat(this._margin.left,", ").concat(this._margin.top,")"),a=this._transition,o=this._width-this._margin.left-this._margin.right;var s=this._filteredData.reduce(function(t,e,n){t[r._id(e,n)]=e;return t},{});var l=this._nodes.reduce(function(t,e,n){t[r._nodeGroupBy?r._nodeGroupBy[r._drawDepth](e,n):e.id]=e;return t},{});l=Array.from(new Set(Object.keys(s).concat(Object.keys(l)))).map(function(t,e){var n=s[t],i=l[t];if(i===undefined)return false;return{__d3plus__:true,data:n||i,i:e,id:t,fx:n!==undefined&&r._x(n)!==undefined?r._x(n):r._x(i),fy:n!==undefined&&r._y(n)!==undefined?r._y(n):r._y(i),node:i,r:r._size?n!==undefined&&r._size(n)!==undefined?r._size(n):r._size(i):r._sizeMin,shape:n!==undefined&&r._shape(n)!==undefined?r._shape(n):r._shape(i)}}).filter(function(t){return t});var u=this._nodeLookup=l.reduce(function(t,e){t[e.id]=e;return t},{});var c=l.map(function(t){return t.node});var h=this._links.map(function(t){var e=OY(t.source);return{size:r._linkSize(t),source:e==="number"?l[c.indexOf(r._nodes[t.source])]:e==="string"?u[t.source]:u[t.source.id],target:e==="number"?l[c.indexOf(r._nodes[t.target])]:e==="string"?u[t.target]:u[t.target.id]}});this._linkLookup=h.reduce(function(t,e){if(!t[e.source.id])t[e.source.id]=[];t[e.source.id].push(e.target);if(!t[e.target.id])t[e.target.id]=[];t[e.target.id].push(e.source);return t},{});var f=l.some(function(t){return t.fx===undefined||t.fy===undefined});if(f){var d=Mr().domain(Ft(h,function(t){return t.size})).range([.1,.5]);var g=RY().force("link",SY(h).id(function(t){return t.id}).distance(1).strength(function(t){return d(t.size)}).iterations(4)).force("charge",TY().strength(-1)).stop();var p=300;var v=.001;var m=1-Math.pow(v,1/p);g.velocityDecay(0);g.alphaMin(v);g.alphaDecay(m);g.alphaDecay(0);g.nodes(l);g.tick(p).stop();var y=aA(l.map(function(t){return[t.vx,t.vy]}));var _=NA(y),b=_.angle,w=_.cx,x=_.cy;l.forEach(function(t){var e=bA([t.vx,t.vy],-1*(Math.PI/180*b),[w,x]);t.fx=e[0];t.fy=e[1]})}var k=Ft(l.map(function(t){return t.fx})),S=Ft(l.map(function(t){return t.fy}));var C=Mr().domain(k).range([0,o]),E=Mr().domain(S).range([0,n]);var A=(k[1]-k[0])/(S[1]-S[0]),M=o/n;if(A>M){var R=n*M/A;E.range([(n-R)/2,n-(n-R)/2])}else{var T=o*A/M;C.range([(o-T)/2,o-(o-T)/2])}l.forEach(function(t){t.x=C(t.fx);t.y=E(t.fy)});var O=Ft(l.map(function(t){return t.r}));var B=this._sizeMax||Ht([1,Gt(Vt(l.map(function(e){return l.map(function(t){return e===t?null:TE([e.x,e.y],[t.x,t.y])})})))/2]);var P=Ea["scale".concat(this._sizeScale.charAt(0).toUpperCase()).concat(this._sizeScale.slice(1))]().domain(O).range([O[0]===O[1]?B:Gt([B/2,this._sizeMin]),B]),N=C.domain(),D=E.domain();var z=N[1]-N[0],j=D[1]-D[0];l.forEach(function(t){var e=P(t.r);if(N[0]>C.invert(t.x-e))N[0]=C.invert(t.x-e);if(N[1]E.invert(t.y-e))D[0]=E.invert(t.y-e);if(D[1]o[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});l.hover(function(t,e){if(t.source&&t.target)return t.source.id===r.id||t.target.id===r.id;else return a.includes(l._ids(t,e)[l._drawDepth])})}};l._on["click.shape"]=function(t){l._center=t.id;l._draw()};l._sizeMin=5;l._sizeScale="sqrt";l._shape=Rw("Circle");l._shapeConfig=xu(l._shapeConfig,{ariaLabel:function t(e,n){var i=l._size?", ".concat(l._size(e,n)):"";return"".concat(l._drawLabel(e,n)).concat(i,".")},labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee",strokeWidth:1}});return l}WY(L,[{key:"_draw",value:function t(e){var u=this;XY(ZY(L.prototype),"_draw",this).call(this,e);var r=this._filteredData.reduce(function(t,e,n){t[u._id(e,n)]=e;return t},{});var c=this._nodes;if(!this._nodes.length&&this._links.length){var n=Array.from(new Set(this._links.reduce(function(t,e){return t.concat([e.source,e.target])},[])));c=n.map(function(t){return GY(t)==="object"?t:{id:t}})}c=c.reduce(function(t,e,n){t[u._nodeGroupBy?u._nodeGroupBy[u._drawDepth](e,n):u._id(e,n)]=e;return t},{});c=Array.from(new Set(Object.keys(r).concat(Object.keys(c)))).map(function(t,e){var n=r[t],i=c[t];if(i===undefined)return false;return{__d3plus__:true,data:n||i,i:e,id:t,node:i,shape:n!==undefined&&u._shape(n)!==undefined?u._shape(n):u._shape(i)}}).filter(function(t){return t});var i=this._nodeLookup=c.reduce(function(t,e){t[e.id]=e;return t},{});var a=this._links.map(function(n){var t=["source","target"];var e=t.reduce(function(t,e){t[e]=typeof n[e]==="number"?c[n[e]]:i[n[e].id||n[e]];return t},{});e.size=u._linkSize(n);return e});var o=a.reduce(function(t,e){if(!t[e.source.id]){t[e.source.id]=[]}t[e.source.id].push(e);if(!t[e.target.id]){t[e.target.id]=[]}t[e.target.id].push(e);return t},{});var h=this._height-this._margin.top-this._margin.bottom,s="translate(".concat(this._margin.left,", ").concat(this._margin.top,")"),l=this._transition,f=this._width-this._margin.left-this._margin.right;var d=[],g=Gt([h,f])/2,p=g/3;var v=p,m=p*2;var y=i[this._center];y.x=f/2;y.y=h/2;y.r=this._sizeMin?Ht([this._sizeMin,v*.65]):this._sizeMax?Gt([this._sizeMax,v*.65]):v*.65;var _=[y],b=[];o[this._center].forEach(function(t){var e=t.source.id===u._center?t.target:t.source;e.edges=o[e.id].filter(function(t){return t.source.id!==u._center||t.target.id!==u._center});e.edge=t;_.push(e);b.push(e)});b.sort(function(t,e){return t.edges.length-e.edges.length});var w=[];var x=0;b.forEach(function(t){var r=t.id;t.edges=t.edges.filter(function(t){return!_.includes(t.source)&&t.target.id===r||!_.includes(t.target)&&t.source.id===r});x+=t.edges.length||1;t.edges.forEach(function(t){var e=t.source,n=t.target;var i=n.id===r?e:n;_.push(i)})});var k=Math.PI*2;var S=0;b.forEach(function(a,t){var o=a.edges.length||1;var e=k/x*o;if(t===0){S-=e/2}var s=S+e/2-k/4;a.radians=s;a.x=f/2+v*Math.cos(s);a.y=h/2+v*Math.sin(s);S+=e;a.edges.forEach(function(t,e){var n=t.source.id===a.id?t.target:t.source;var i=k/x;var r=s-i*o/2+i/2+i*e;n.radians=r;n.x=f/2+m*Math.cos(r);n.y=h/2+m*Math.sin(r);w.push(n)})});var C=p/2;var E=p/4;var A=C/2-4;if(C/2-4<8){A=Gt([C/2,8])}var M=E/2-4;if(E/2-4<4){M=Gt([E/2,4])}if(M>p/10){M=p/10}if(M>A&&M>10){M=A*.75}if(A>M*1.5){A=M*1.5}A=Math.floor(A);M=Math.floor(M);var R;if(this._size){var T=Ft(r,function(t){return t.size});if(T[0]===T[1]){T[0]=0}R=Mr().domain(T).rangeRound([3,Gt([A,M])]);var O=y.size;y.r=R(O)}else{R=Mr().domain([1,2]).rangeRound([A,M])}w.forEach(function(t){t.ring=2;var e=u._size?t.size:2;t.r=u._sizeMin?Ht([u._sizeMin,R(e)]):u._sizeMax?Gt([u._sizeMax,R(e)]):R(e)});b.forEach(function(t){t.ring=1;var e=u._size?t.size:1;t.r=u._sizeMin?Ht([u._sizeMin,R(e)]):u._sizeMax?Gt([u._sizeMax,R(e)]):R(e)});c=[y].concat(b).concat(w);b.forEach(function(l){var t=["source","target"];var n=l.edge;t.forEach(function(e){n[e]=c.find(function(t){return t.id===n[e].id})});d.push(n);o[l.id].forEach(function(i){var e=i.source.id===l.id?i.target:i.source;if(e.id!==y.id){var r=w.find(function(t){return t.id===e.id});if(!r){r=b.find(function(t){return t.id===e.id})}if(r){i.spline=true;var a=f/2;var o=h/2;var s=v+(m-v)*.5;var t=["source","target"];t.forEach(function(e,t){i["".concat(e,"X")]=i[e].x+Math.cos(i[e].ring===2?i[e].radians+Math.PI:i[e].radians)*i[e].r;i["".concat(e,"Y")]=i[e].y+Math.sin(i[e].ring===2?i[e].radians+Math.PI:i[e].radians)*i[e].r;i["".concat(e,"BisectX")]=a+s*Math.cos(i[e].radians);i["".concat(e,"BisectY")]=o+s*Math.sin(i[e].radians);i[e]=c.find(function(t){return t.id===i[e].id});if(i[e].edges===undefined)i[e].edges={};var n=t===0?i.target.id:i.source.id;if(i[e].id===l.id){i[e].edges[n]={angle:l.radians+Math.PI,radius:p/2}}else{i[e].edges[n]={angle:r.radians,radius:p/2}}});d.push(i)}}})});c.forEach(function(t){if(t.id!==u._center){var e=u._shapeConfig.labelConfig.fontSize&&u._shapeConfig.labelConfig.fontSize(t)||11;var n=e*1.4;var i=n*2;var r=5;var a=p-t.r;var o=t.radians*(180/Math.PI);var s=t.r+r;var l="start";if(o<-90||o>90){s=-t.r-a-r;l="end";o+=180}t.labelBounds={x:s,y:-n/2,width:a,height:i};t.rotate=o;t.textAnchor=l}else{t.labelBounds={x:-v/2,y:-v/2,width:v,height:v}}});this._linkLookup=a.reduce(function(t,e){if(!t[e.source.id])t[e.source.id]=[];t[e.source.id].push(e.target);if(!t[e.target.id])t[e.target.id]=[];t[e.target.id].push(e.source);return t},{});var B=Ft(a,function(t){return t.size});if(B[0]!==B[1]){var P=Gt(c,function(t){return t.r});var N=Ea["scale".concat(this._linkSizeScale.charAt(0).toUpperCase()).concat(this._linkSizeScale.slice(1))]().domain(B).range([this._linkSizeMin,P]);a.forEach(function(t){t.size=N(t.size)})}var D=Mw.bind(this)(this._shapeConfig,"edge","Path");delete D.on;this._shapes.push((new SR).config(D).strokeWidth(function(t){return t.size}).id(function(t){return"".concat(t.source.id,"_").concat(t.target.id)}).d(function(t){return t.spline?"M".concat(t.sourceX,",").concat(t.sourceY,"C").concat(t.sourceBisectX,",").concat(t.sourceBisectY," ").concat(t.targetBisectX,",").concat(t.targetBisectY," ").concat(t.targetX,",").concat(t.targetY):"M".concat(t.source.x,",").concat(t.source.y," ").concat(t.target.x,",").concat(t.target.y)}).data(d).select(Tw("g.d3plus-rings-links",{parent:this._select,transition:l,enter:{transform:s},update:{transform:s}}).node()).render());var z=this;var j={label:function t(e){return c.length<=u._dataCutoff||u._hover&&u._hover(e)||u._active&&u._active(e)?u._drawLabel(e.data||e.node,e.i):false},labelBounds:function t(e){return e.labelBounds},labelConfig:{fontColor:function t(e){return e.id===u._center?Mw.bind(z)(z._shapeConfig,"shape",e.key).labelConfig.fontColor(e):uk(Mw.bind(z)(z._shapeConfig,"shape",e.key).fill(e))},fontResize:function t(e){return e.id===u._center},padding:0,textAnchor:function t(e){return i[e.id].textAnchor||Mw.bind(z)(z._shapeConfig,"shape",e.key).labelConfig.textAnchor},verticalAlign:function t(e){return e.id===u._center?"middle":"top"}},rotate:function t(e){return i[e.id].rotate||0},select:Tw("g.d3plus-rings-nodes",{parent:this._select,transition:l,enter:{transform:s},update:{transform:s}}).node()};Fe().key(function(t){return t.shape}).entries(c).forEach(function(t){u._shapes.push((new CR[t.key]).config(Mw.bind(u)(u._shapeConfig,"shape",t.key)).config(j).data(t.values).render())});return this}},{key:"center",value:function t(e){return arguments.length?(this._center=e,this):this._center}},{key:"hover",value:function t(e){this._hover=e;this._shapes.forEach(function(t){return t.hover(e)});if(this._legend)this._legendClass.hover(e);return this}},{key:"links",value:function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="links"});var r=[Wz.bind(this),e,n,"links"];if(i)this._queue[this._queue.indexOf(i)]=r;else this._queue.push(r);return this}return this._links}},{key:"linkSize",value:function t(e){return arguments.length?(this._linkSize=typeof e==="function"?e:Rw(e),this):this._linkSize}},{key:"linkSizeMin",value:function t(e){return arguments.length?(this._linkSizeMin=e,this):this._linkSizeMin}},{key:"linkSizeScale",value:function t(e){return arguments.length?(this._linkSizeScale=e,this):this._linkSizeScale}},{key:"nodeGroupBy",value:function t(e){var n=this;if(!arguments.length)return this._nodeGroupBy;if(!(e instanceof Array))e=[e];return this._nodeGroupBy=e.map(function(t){if(typeof t==="function")return t;else{if(!n._aggs[t]){n._aggs[t]=function(t){var e=Array.from(new Set(t));return e.length===1?e[0]:e}}return yu(t)}}),this}},{key:"nodes",value:function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="nodes"});var r=[Wz.bind(this),e,n,"nodes"];if(i)this._queue[this._queue.indexOf(i)]=r;else this._queue.push(r);return this}return this._nodes}},{key:"size",value:function t(e){return arguments.length?(this._size=typeof e==="function"||!e?e:yu(e),this):this._size}},{key:"sizeMax",value:function t(e){return arguments.length?(this._sizeMax=e,this):this._sizeMax}},{key:"sizeMin",value:function t(e){return arguments.length?(this._sizeMin=e,this):this._sizeMin}},{key:"sizeScale",value:function t(e){return arguments.length?(this._sizeScale=e,this):this._sizeScale}}]);return L}(xq);function eX(t){return t.target.depth}function nX(t){return t.depth}function iX(t,e){return e-1-t.height}function rX(t,e){return t.sourceLinks.length?t.depth:e-1}function aX(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?Gt(t.sourceLinks,eX)-1:0}function oX(t){return function(){return t}}function sX(t,e){return uX(t.source,e.source)||t.index-e.index}function lX(t,e){return uX(t.target,e.target)||t.index-e.index}function uX(t,e){return t.y0-e.y0}function cX(t){return t.value}function hX(t){return(t.y0+t.y1)/2}function fX(t){return hX(t.source)*t.value}function dX(t){return hX(t.target)*t.value}function gX(t){return t.index}function pX(t){return t.nodes}function vX(t){return t.links}function mX(t,e){var n=t.get(e);if(!n)throw new Error("missing: "+e);return n}function yX(){var a=0,l=0,o=1,u=1,s=24,c=8,e=gX,h=rX,n=pX,i=vX,f=32;function r(){var t={nodes:n.apply(null,arguments),links:i.apply(null,arguments)};d(t);g(t);p(t);v(t);m(t);return t}r.update=function(t){m(t);return t};r.nodeId=function(t){return arguments.length?(e=typeof t==="function"?t:oX(t),r):e};r.nodeAlign=function(t){return arguments.length?(h=typeof t==="function"?t:oX(t),r):h};r.nodeWidth=function(t){return arguments.length?(s=+t,r):s};r.nodePadding=function(t){return arguments.length?(c=+t,r):c};r.nodes=function(t){return arguments.length?(n=typeof t==="function"?t:oX(t),r):n};r.links=function(t){return arguments.length?(i=typeof t==="function"?t:oX(t),r):i};r.size=function(t){return arguments.length?(a=l=0,o=+t[0],u=+t[1],r):[o-a,u-l]};r.extent=function(t){return arguments.length?(a=+t[0][0],o=+t[1][0],l=+t[0][1],u=+t[1][1],r):[[a,l],[o,u]]};r.iterations=function(t){return arguments.length?(f=+t,r):f};function d(t){t.nodes.forEach(function(t,e){t.index=e;t.sourceLinks=[];t.targetLinks=[]});var r=Le(t.nodes,e);t.links.forEach(function(t,e){t.index=e;var n=t.source,i=t.target;if(j(n)!=="object")n=t.source=mX(r,n);if(j(i)!=="object")i=t.target=mX(r,i);n.sourceLinks.push(t);i.targetLinks.push(t)})}function g(t){t.nodes.forEach(function(t){t.value=Math.max(Ut(t.sourceLinks,cX),Ut(t.targetLinks,cX))})}function p(t){var e,n,i;for(e=t.nodes,n=[],i=0;e.length;++i,e=n,n=[]){e.forEach(function(t){t.depth=i;t.sourceLinks.forEach(function(t){if(n.indexOf(t.target)<0){n.push(t.target)}})})}for(e=t.nodes,n=[],i=0;e.length;++i,e=n,n=[]){e.forEach(function(t){t.height=i;t.targetLinks.forEach(function(t){if(n.indexOf(t.source)<0){n.push(t.source)}})})}var r=(o-a-s)/(i-1);t.nodes.forEach(function(t){t.x1=(t.x0=a+Math.max(0,Math.min(i-1,Math.floor(h.call(null,t,i))))*r)+s})}function v(t){var e=Fe().key(function(t){return t.x0}).sortKeys(y).entries(t.nodes).map(function(t){return t.values});r();s();for(var n=1,i=f;i>0;--i){o(n*=.99);s();a(n);s()}function r(){var n=Gt(e,function(t){return(u-l-(t.length-1)*c)/Ut(t,cX)});e.forEach(function(t){t.forEach(function(t,e){t.y1=(t.y0=e)+t.value*n})});t.links.forEach(function(t){t.width=t.value*n})}function a(n){e.forEach(function(t){t.forEach(function(t){if(t.targetLinks.length){var e=(Ut(t.targetLinks,fX)/Ut(t.targetLinks,cX)-hX(t))*n;t.y0+=e,t.y1+=e}})})}function o(n){e.slice().reverse().forEach(function(t){t.forEach(function(t){if(t.sourceLinks.length){var e=(Ut(t.sourceLinks,dX)/Ut(t.sourceLinks,cX)-hX(t))*n;t.y0+=e,t.y1+=e}})})}function s(){e.forEach(function(t){var e,n,i=l,r=t.length,a;t.sort(uX);for(a=0;a0)e.y0+=n,e.y1+=n;i=e.y1+c}n=i-c-u;if(n>0){i=e.y0-=n,e.y1-=n;for(a=r-2;a>=0;--a){e=t[a];n=e.y1+c-i;if(n>0)e.y0-=n,e.y1-=n;i=e.y0}}})}}function m(t){t.nodes.forEach(function(t){t.sourceLinks.sort(lX);t.targetLinks.sort(sX)});t.nodes.forEach(function(t){var e=t.y0,n=e;t.sourceLinks.forEach(function(t){t.y0=e+t.width/2,e+=t.width});t.targetLinks.forEach(function(t){t.y1=n+t.width/2,n+=t.width})})}return r}function _X(t){return[t.source.x1,t.y0]}function bX(t){return[t.target.x0,t.y1]}function wX(){return uS().source(_X).target(bX)}function xX(t){if(typeof Symbol==="function"&&j(Symbol.iterator)==="symbol"){xX=function t(e){return j(e)}}else{xX=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":j(e)}}return xX(t)}function kX(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function SX(t,e){for(var n=0;n0}))});g=v.map(function(t){return Ut(t.filter(function(t){return t<0}))})}else{p=n.map(function(t){return t[d?c:u]});g=p}var m=h(Ht(p));if(d?mh(0))m+=d?-l:l;m=h.invert(m);var y=h(Gt(g));if(d?y>h(0):yf[1])f[1]=m;if(y0}))});g=v.map(function(t){return Ut(t.filter(function(t){return t<0}))})}else{p=n.map(function(t){return t[d?c:u]});g=p}var m=h(Ht(p));m+=d?-l:l;m=h.invert(m);var y=h(Gt(g));y+=d?l:-l;y=h.invert(y);if(m>f[1])f[1]=m;if(yf[1])f[1]=i}if(s.invert&&s(t[h])-p[0]d[0])d[0]=r}if(s.invert&&p[1]-s(t[h])c[1])c[1]=f;if(this._discrete==="x")c.reverse();u.domain(c);return[i,r]}function IX(t){var e=t.data,s=t.x,l=t.y,n=t.x2,i=t.y2,u=t.config;var c=n?"x2":"x";var h=i?"y2":"y";var f=s.domain().slice(),d=l.domain().slice();var g=s.range(),p=l.range();if(!s.invert&&s.padding)DX(s,e,this._discrete);if(!l.invert&&l.padding)DX(l,e,this._discrete);e.forEach(function(t){var e=u.height(t.data,t.i),n=u.width(t.data,t.i);if(s.invert&&s(t[c])-g[0]f[1])f[1]=r}if(l.invert&&l(t[h])-p[0]d[0])d[0]=a}if(l.invert&&p[1]-l(t[h])0))return;var i,r,a,o,s;var l=t[e[0]].length;for(var u=0;u=0){i[0]=s,i[1]=s+=r}else if(r<0){i[1]=o,i[0]=o+=r}else{i[0]=s}}}}var r$=function(t){ZX(Lt,t);function Lt(){var r;GX(this,Lt);r=WX(this,$X(Lt).call(this));r._annotations=[];r._backgroundConfig={duration:0,fill:"transparent"};r._barPadding=0;r._buffer={Bar:zX,Box:jX,Circle:LX,Line:FX,Rect:IX};r._confidenceConfig={fillOpacity:Rw(.5)};r._discreteCutoff=100;r._groupPadding=5;r._shape=Rw("Circle");r._shapeConfig=xu(r._shapeConfig,{Area:{label:function t(e,n){return r._stacked?r._drawLabel(e,n):false},labelConfig:{fontResize:true}},ariaLabel:function t(e,n){var i="";if(e.nested)i="".concat(r._drawLabel(e.data,e.i));else{i="".concat(r._drawLabel(e,n));if(r._x(e,n)!==undefined)i+=", x: ".concat(r._x(e,n));if(r._y(e,n)!==undefined)i+=", y: ".concat(r._y(e,n));if(r._x2(e,n)!==undefined)i+=", x2: ".concat(r._x2(e,n));if(r._y2(e,n)!==undefined)i+=", y2: ".concat(r._y2(e,n))}return"".concat(i,".")},Bar:{labelConfig:{textAnchor:function t(){return r._discrete==="x"?"middle":"end"},verticalAlign:function t(){return r._discrete==="x"?"top":"middle"}}},Circle:{r:QX.bind(KX(r))},Line:{fill:Rw("none"),label:false,stroke:function t(e,n){return sk(r._id(e,n))},strokeWidth:Rw(1)},Rect:{height:function t(e){return QX.bind(KX(r))(e)*2},width:function t(e){return QX.bind(KX(r))(e)*2}}});r._shapeOrder=["Area","Path","Bar","Box","Line","Rect","Circle"];r._shapeSort=function(t,e){return r._shapeOrder.indexOf(t)-r._shapeOrder.indexOf(e)};r._sizeMax=20;r._sizeMin=5;r._sizeScale="sqrt";r._stackOffset=i$;r._stackOrder=e$;r._timelineConfig=xu(r._timelineConfig,{brushing:true});r._x=yu("x");r._xAxis=(new $R).align("end");r._xTest=(new $R).align("end").gridSize(0);r._xConfig={};r._xCutoff=150;r._x2=yu("x2");r._x2Axis=(new bT).align("start");r._x2Test=(new bT).align("start").gridSize(0);r._x2Config={padding:0};r._y=yu("y");r._yAxis=(new rT).align("start");r._yTest=(new rT).align("start").gridSize(0);r._yConfig={gridConfig:{stroke:function t(e){var n=r._yAxis.domain();return n[n.length-1]===e.id?"transparent":"#ccc"}}};r._yCutoff=150;r._y2=yu("y2");r._y2Axis=(new fT).align("end");r._y2Test=(new rT).align("end").gridSize(0);r._y2Config={};return r}qX(Lt,[{key:"_draw",value:function t(e){var R=this;if(!this._filteredData.length)return this;var s=function t(e,n){return R._stacked?"".concat(R._groupBy.length>1?R._ids(e,n).slice(0,-1).join("_"):"group"):"".concat(R._ids(e,n).join("_"))};var l=this._filteredData.map(function(t,e){return{__d3plus__:true,data:t,group:s(t,e),i:e,hci:R._confidence&&R._confidence[1]&&R._confidence[1](t,e),id:R._ids(t,e).slice(0,R._drawDepth+1).join("_"),lci:R._confidence&&R._confidence[0]&&R._confidence[0](t,e),shape:R._shape(t,e),x:R._x(t,e),x2:R._x2(t,e),y:R._y(t,e),y2:R._y2(t,e)}});this._formattedData=l;if(this._size){var n=Ft(l,function(t){return R._size(t.data)});this._sizeScaleD3=function(){return R._sizeMin};this._sizeScaleD3=Ea["scale".concat(this._sizeScale.charAt(0).toUpperCase()).concat(this._sizeScale.slice(1))]().domain(n).range([n[0]===n[1]?this._sizeMax:Gt([this._sizeMax/2,this._sizeMin]),this._sizeMax])}else{this._sizeScaleD3=function(){return R._sizeMin}}var i=l.some(function(t){return t.x2!==undefined}),r=l.some(function(t){return t.y2!==undefined});var a=this._height-this._margin.top-this._margin.bottom,u=this._discrete?this._discrete==="x"?"y":"x":undefined,o=this._discrete?this._discrete==="x"?"y2":"x2":undefined,c=[u,o].filter(function(t){return t}),h=this._select,f=this._transition,T=this._width-this._margin.left-this._margin.right;var d=this._time&&l[0].x2===this._time(l[0].data,l[0].i),g=this._time&&l[0].x===this._time(l[0].data,l[0].i),p=this._time&&l[0].y2===this._time(l[0].data,l[0].i),v=this._time&&l[0].y===this._time(l[0].data,l[0].i);for(var m=0;mn)b[t][0]=n;else if(b[t]&&b[t][1]this._discreteCutoff||this._width>this._xCutoff;var Z=this._discrete==="y"&&this._height>this._discreteCutoff||this._height>this._yCutoff;var J={gridConfig:{stroke:!this._discrete||this._discrete==="x"?this._yTest.gridConfig().stroke:"transparent"},locale:this._locale,scalePadding:G.padding?G.padding():0};if(!$){J.barConfig={stroke:"transparent"};J.tickSize=0;J.shapeConfig={labelBounds:function t(e,n){var i=e.labelBounds,r=i.width,a=i.y;var o=R._height/2;var s=n?-o:0;return{x:s,y:a,width:r,height:o}},labelConfig:{padding:0,rotate:0,verticalAlign:function t(e){return e.id===it[0]?"top":"bottom"}},labelRotation:false}}var Q=Tw("g.d3plus-plot-test",{enter:{opacity:0},parent:this._select}),tt=this._discrete==="x"&&!d?b.x2:undefined,et=!Z?Ft(b.x):this._discrete==="x"&&!g?b.x:undefined,nt=this._discrete==="y"&&!p?b.y2:undefined,it=!$?Ft(b.y):this._discrete==="y"&&!v?b.y:undefined;if(Z){this._yTest.domain(j).height(a).maxSize(T/2).range([undefined,undefined]).scale(L.toLowerCase()).select(Q.node()).ticks(it).width(T).config(J).config(this._yConfig).render()}var rt=this._yTest.outerBounds();var at=rt.width?rt.width+this._yTest.padding():undefined;if(r){this._y2Test.domain(F).height(a).range([undefined,undefined]).scale(I.toLowerCase()).select(Q.node()).ticks(nt).width(T).config(J).config(X).config(this._y2Config).render()}var ot=this._y2Test.outerBounds();var st=ot.width?ot.width+this._y2Test.padding():undefined;var lt={gridConfig:{stroke:!this._discrete||this._discrete==="y"?this._xTest.gridConfig().stroke:"transparent"},locale:this._locale,scalePadding:H.padding?H.padding():0};if(!Z){lt.barConfig={stroke:"transparent"};lt.tickSize=0;lt.shapeConfig={labelBounds:function t(e,n){var i=e.labelBounds,r=i.height,a=i.y;var o=R._width/2;var s=n?-o:0;return{x:s,y:a,width:o,height:r}},labelConfig:{padding:0,rotate:0,textAnchor:function t(e){return e.id===et[0]?"start":"end"}},labelRotation:false}}if($){this._xTest.domain(P).height(a).maxSize(a/2).range([undefined,undefined]).scale(N.toLowerCase()).select(Q.node()).ticks(et).width(T).config(lt).config(this._xConfig).render()}if(i){this._x2Test.domain(D).height(a).range([undefined,undefined]).scale(z.toLowerCase()).select(Q.node()).ticks(tt).width(T).config(lt).tickSize(0).config(Y).config(this._x2Config).render()}var ut=this._xTest._getRange();var ct=this._x2Test._getRange();var ht=this._x2Test.outerBounds();var ft=i?ht.height+this._x2Test.padding():0;var dt=Ht([at,ut[0],ct[0]]);if($){this._xTest.range([dt,undefined]).render()}var gt=Z?this._yTest.shapeConfig().labelConfig.fontSize()/2:0;var pt=Ht([st,T-ut[1],T-ct[1]]);var vt=this._xTest.outerBounds();var mt=vt.height+(Z?this._xTest.padding():0);this._padding.left+=dt;this._padding.right+=pt;this._padding.bottom+=mt;this._padding.top+=ft+gt;YX($X(Lt.prototype),"_draw",this).call(this,e);var yt=this._margin.left+this._margin.right;var _t=this._margin.top+this._margin.bottom;var bt=[ft,a-(mt+gt+_t)];if(Z){this._yTest.domain(j).height(a).maxSize(T/2).range(bt).scale(L.toLowerCase()).select(Q.node()).ticks(it).width(T).config(J).config(this._yConfig).render()}rt=this._yTest.outerBounds();at=rt.width?rt.width+this._yTest.padding():undefined;dt=Ht([at,ut[0],ct[0]]);if(r){this._y2Test.config(J).domain(F).gridSize(0).height(a).range(bt).scale(I.toLowerCase()).select(Q.node()).width(T-Ht([0,pt-st])).title(false).config(this._y2Config).config(X).render()}ot=this._y2Test.outerBounds();st=ot.width?ot.width+this._y2Test.padding():undefined;pt=Ht([0,st,T-ut[1],T-ct[1]]);var wt=[dt,T-(pt+yt)];var xt=Tw("g.d3plus-plot-background",{parent:h,transition:f});var kt="translate(".concat(this._margin.left,", ").concat(this._margin.top+ft+gt,")");var St="translate(".concat(this._margin.left,", ").concat(this._margin.top+gt,")");var Ct=$&&Tw("g.d3plus-plot-x-axis",{parent:h,transition:f,enter:{transform:kt},update:{transform:kt}});var Et=i&&Tw("g.d3plus-plot-x2-axis",{parent:h,transition:f,enter:{transform:St},update:{transform:St}});var At=dt>at?dt-at:0;var Mt="translate(".concat(this._margin.left+At,", ").concat(this._margin.top+gt,")");var Rt=Z&&Tw("g.d3plus-plot-y-axis",{parent:h,transition:f,enter:{transform:Mt},update:{transform:Mt}});var Tt="translate(-".concat(this._margin.right,", ").concat(this._margin.top+gt,")");var Ot=r&&Tw("g.d3plus-plot-y2-axis",{parent:h,transition:f,enter:{transform:Tt},update:{transform:Tt}});this._xAxis.domain(P).height(a-(ft+gt+_t)).maxSize(a/2).range(wt).scale(N.toLowerCase()).select($?Ct.node():undefined).ticks(et).width(T).config(lt).config(this._xConfig).render();if(i){this._x2Axis.domain(D).height(a-(mt+gt+_t)).range(wt).scale(z.toLowerCase()).select(Et.node()).ticks(tt).width(T).config(lt).config(Y).config(this._x2Config).render()}H=function t(e,n){if(n==="x2"){if(R._x2Config.scale==="log"&&e===0)e=D[0]<0?-1:1;return R._x2Axis._getPosition.bind(R._x2Axis)(e)}else{if(R._xConfig.scale==="log"&&e===0)e=P[0]<0?-1:1;return R._xAxis._getPosition.bind(R._xAxis)(e)}};bt=[this._xAxis.outerBounds().y+ft,a-(mt+gt+_t)];this._yAxis.domain(j).height(a).maxSize(T/2).range(bt).scale(L.toLowerCase()).select(Z?Rt.node():undefined).ticks(it).width(wt[wt.length-1]).config(J).config(this._yConfig).render();if(r){this._y2Axis.config(J).domain(r?F:j).gridSize(0).height(a).range(bt).scale(r?I.toLowerCase():L.toLowerCase()).select(Ot.node()).width(T-Ht([0,pt-st])).title(false).config(this._y2Config).config(X).render()}G=function t(e,n){if(n==="y2"){if(R._y2Config.scale==="log"&&e===0)e=F[0]<0?-1:1;return R._y2Axis._getPosition.bind(R._y2Axis)(e)-ft}else{if(R._yConfig.scale==="log"&&e===0)e=j[0]<0?-1:1;return R._yAxis._getPosition.bind(R._yAxis)(e)-ft}};(new MM).data([{}]).select(xt.node()).x(wt[0]+(wt[1]-wt[0])/2).width(wt[1]-wt[0]).y(this._margin.top+gt+bt[0]+(bt[1]-bt[0])/2).height(bt[1]-bt[0]).config(this._backgroundConfig).render();var Bt=Tw("g.d3plus-plot-annotations",{parent:h,transition:f,enter:{transform:kt},update:{transform:kt}}).node();this._annotations.forEach(function(t){(new CR[t.shape]).config(t).config({x:function t(e){return e.x2?H(e.x2,"x2"):H(e.x)},x0:R._discrete==="x"?function(t){return t.x2?H(t.x2,"x2"):H(t.x)}:H(b.x[0]),x1:R._discrete==="x"?null:function(t){return t.x2?H(t.x2,"x2"):H(t.x)},y:function t(e){return e.y2?G(e.y2,"y2"):G(e.y)},y0:R._discrete==="y"?function(t){return t.y2?G(t.y2,"y2"):G(t.y)}:G(b.y[1])-Pt,y1:R._discrete==="y"?null:function(t){return t.y2?G(t.y2,"y2"):G(t.y)-Pt}}).select(Bt).render()});var Pt=this._xAxis.barConfig()["stroke-width"];if(Pt)Pt/=2;var Nt=this._discrete||"x";var Dt={duration:this._duration,label:function t(e){return R._drawLabel(e.data,e.i)},select:Tw("g.d3plus-plot-shapes",{parent:h,transition:f,enter:{transform:kt},update:{transform:kt}}).node(),x:function t(e){return e.x2?H(e.x2,"x2"):H(e.x)},x0:Nt==="x"?function(t){return t.x2?H(t.x2,"x2"):H(t.x)}:H(typeof this._baseline==="number"?this._baseline:b.x[0]),x1:Nt==="x"?null:function(t){return t.x2?H(t.x2,"x2"):H(t.x)},y:function t(e){return e.y2?G(e.y2,"y2"):G(e.y)},y0:Nt==="y"?function(t){return t.y2?G(t.y2,"y2"):G(t.y)}:G(typeof this._baseline==="number"?this._baseline:b.y[1])-Pt,y1:Nt==="y"?null:function(t){return t.y2?G(t.y2,"y2"):G(t.y)-Pt}};if(this._stacked){var zt=u==="x"?H:G;Dt["".concat(u)]=Dt["".concat(u,"0")]=function(t){var e=x.indexOf(t.id),n=_.indexOf(t.discrete);return e>=0?zt(w[e][n][0]):zt(b[u][u==="x"?0:1])};Dt["".concat(u,"1")]=function(t){var e=x.indexOf(t.id),n=_.indexOf(t.discrete);return e>=0?zt(w[e][n][1]):zt(b[u][u==="x"?0:1])}}var jt=Object.keys(this._on);q.forEach(function(e){var n=(new CR[e.key]).config(Dt).data(e.values);if(e.key==="Bar"){var t;var i=R._discrete==="x"?H:G;var r=R._discrete==="x"?N:L;var a=R._discrete==="x"?P:j;var o=R._discrete==="x"?wt:bt;if(r!=="Point"&&a.length===2){t=(i(e.values[R._discrete==="x"?0:e.values.length-1][R._discrete])-i(a[0]))*2}else if(a.length>1)t=i(a[1])-i(a[0]);else t=o[o.length-1]-o[0];if(R._groupPadding0}).sort(function(t,e){return t.start-e.start});var r;if(this._groupBy.length>1&&this._drawDepth>0){var a=Fe();var o=function t(e){a.key(function(t){return n._groupBy[e](t.data,t.i)})};for(var s=0;s=this._padding*2?g-this._padding:g>2?g-2:g).label(function(t,e){return n._drawLabel(t.data,e)}).select(Tw("g.d3plus-priestley-shapes",{parent:this._select}).node()).width(function(t){var e=Math.abs(f(t.end)-f(t.start));return e>2?e-2:e}).x(function(t){return f(t.start)+(f(t.end)-f(t.start))/2}).y(function(t){return d(t.lane)}).config(Mw.bind(this)(this._shapeConfig,"shape","Rect")).render());return this}},{key:"axisConfig",value:function t(e){return arguments.length?(this._axisConfig=xu(this._axisConfig,e),this):this._axisConfig}},{key:"end",value:function t(e){if(arguments.length){if(typeof e==="function")this._end=e;else{this._end=yu(e);if(!this._aggs[e])this._aggs[e]=function(t){return Ht(t)}}return this}else return this._end}},{key:"start",value:function t(e){if(arguments.length){if(typeof e==="function")this._start=e;else{this._start=yu(e);if(!this._aggs[e])this._aggs[e]=function(t){return Gt(t)}}return this}else return this._start}}]);return p}(xq);t.Area=WA;t.AreaPlot=f$;t.Axis=VR;t.AxisBottom=$R;t.AxisLeft=rT;t.AxisRight=fT;t.AxisTop=bT;t.Bar=rM;t.BarChart=b$;t.BaseClass=Cw;t.Box=lR;t.BoxWhisker=M$;t.BumpChart=z$;t.Circle=vM;t.ColorScale=BF;t.Donut=eW;t.Geomap=Dq;t.Image=qw;t.Legend=wF;t.Line=IM;t.LinePlot=U$;t.Network=VY;t.Pack=SK;t.Path=SR;t.Pie=Kq;t.Plot=r$;t.Priestley=kZ;t.RESET=mw;t.Radar=iZ;t.Rect=MM;t.Rings=tX;t.Sankey=NX;t.Shape=IE;t.StackedArea=hZ;t.TextBox=CE;t.Timeline=fI;t.Tooltip=YH;t.Tree=FK;t.Treemap=ZK;t.Viz=xq;t.Whisker=ZM;t.accessor=yu;t.assign=xu;t.attrize=ku;t.ckmeans=hF;t.closest=Ew;t.colorAdd=rk;t.colorAssign=sk;t.colorContrast=lk;t.colorDefaults=ak;t.colorLegible=uk;t.colorLighter=ck;t.colorSubtract=hk;t.configPrep=Mw;t.constant=Rw;t.dataConcat=yz;t.dataFold=_z;t.dataLoad=Wz;t.date=ER;t.elem=Tw;t.findLocale=gw;t.fontExists=YC;t.formatAbbreviate=Hw;t.formatLocale=zw;t.isObject=bu;t.largestRect=NA;t.lineIntersection=sA;t.merge=Bw;t.parseSides=Pw;t.path2polygon=fR;t.pointDistance=TE;t.pointDistanceSquared=RE;t.pointRotate=bA;t.polygonInside=gA;t.polygonRayCast=_A;t.polygonRotate=wA;t.prefix=Nw;t.rtl=XC;t.segmentBoxContains=fA;t.segmentsIntersect=dA;t.shapeEdgePoint=cR;t.simplify=EA;t.stringify=$C;t.strip=JC;t.stylize=Dw;t.textSplit=dE;t.textWidth=jC;t.textWrap=gE;t.titleCase=ME;t.trim=LC;t.trimLeft=FC;t.trimRight=IC;t.unique=Ow;t.uuid=vw;t.version=e;Object.defineProperty(t,"__esModule",{value:true})}); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/d3plus.full.min.js b/plugins/additionals/assets/javascripts/d3plus.full.min.js index 7399be1..626ac4a 100755 --- a/plugins/additionals/assets/javascripts/d3plus.full.min.js +++ b/plugins/additionals/assets/javascripts/d3plus.full.min.js @@ -1,32 +1,31 @@ -function _createForOfIteratorHelper(e,t){var n;if(typeof Symbol==="undefined"||e[Symbol.iterator]==null){if(Array.isArray(e)||(n=_unsupportedIterableToArray2(e))||t&&e&&typeof e.length==="number"){if(n)e=n;var i=0;var r=function t(){};return{s:r,n:function t(){if(i>=e.length)return{done:true};return{done:false,value:e[i++]}},e:function t(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a=true,o=false,s;return{s:function t(){n=e[Symbol.iterator]()},n:function t(){var e=n.next();a=e.done;return e},e:function t(e){o=true;s=e},f:function t(){try{if(!a&&n["return"]!=null)n["return"]()}finally{if(o)throw s}}}}function _unsupportedIterableToArray2(t,e){if(!t)return;if(typeof t==="string")return _arrayLikeToArray2(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray2(t,e)}function _arrayLikeToArray2(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,i=new Array(e);n0?dt:ht)(e)};var pt=Math.min;var vt=function t(e){return e>0?pt(gt(e),9007199254740991):0};var mt=Math.max;var yt=Math.min;var _t=function t(e,n){var i=gt(e);return i<0?mt(i+n,0):yt(i,n)};var bt=function t(s){return function(t,e,n){var i=m(t);var r=vt(i.length);var a=_t(n,r);var o;if(s&&e!=e)while(r>a){o=i[a++];if(o!=o)return true}else for(;r>a;a++){if((s||a in i)&&i[a]===e)return s||a||0}return!s&&-1}};var wt={includes:bt(true),indexOf:bt(false)};var xt=wt.indexOf;var kt=function t(e,n){var i=m(e);var r=0;var a=[];var o;for(o in i){!x(X,o)&&x(i,o)&&a.push(o)}while(n.length>r){if(x(i,o=n[r++])){~xt(a,o)||a.push(o)}}return a};var St=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];var Ct=St.concat("length","prototype");var Et=Object.getOwnPropertyNames||function t(e){return kt(e,Ct)};var At={f:Et};var Rt=Object.getOwnPropertySymbols;var Mt={f:Rt};var Tt=ft("Reflect","ownKeys")||function t(e){var n=At.f(T(e));var i=Mt.f;return i?n.concat(i(e)):n};var Pt=function t(e,n){var i=Tt(n);var r=B.f;var a=M.f;for(var o=0;ou;u++){if(_||u in a){f=a[u];h=o(f,u,r);if(d){if(g)c[u]=h;else if(h)switch(d){case 3:return true;case 5:return f;case 6:return u;case 2:Qt.call(c,f)}else if(m)return false}}}return y?-1:v||m?m:c}};var ee={forEach:te(0),map:te(1),filter:te(2),some:te(3),every:te(4),find:te(5),findIndex:te(6)};var ne=Object.keys||function t(e){return kt(e,St)};var ie=d?Object.defineProperties:function t(e,n){T(e);var i=ne(n);var r=i.length;var a=0;var o;while(r>a){B.f(e,o=i[a++],n[o])}return e};var re=ft("document","documentElement");var ae=">";var oe="<";var se="prototype";var ue="script";var le=Y("IE_PROTO");var ce=function t(){};var fe=function t(e){return oe+ue+ae+e+oe+"/"+ue+ae};var he=function t(e){e.write(fe(""));e.close();var n=e.parentWindow.Object;e=null;return n};var de=function t(){var e=C("iframe");var n="java"+ue+":";var i;e.style.display="none";re.appendChild(e);e.src=String(n);i=e.contentWindow.document;i.open();i.write(fe("document.F=Object"));i.close();return i.F};var ge;var pe=function t(){try{ge=document.domain&&new ActiveXObject("htmlfile")}catch(t){}pe=ge?he(ge):de();var e=St.length;while(e--){delete pe[se][St[e]]}return pe()};X[le]=true;var ve=Object.create||function t(e,n){var i;if(e!==null){ce[se]=T(e);i=new ce;ce[se]=null;i[le]=e}else i=pe();return n===undefined?i:ie(i,n)};var me=Zt("unscopables");var ye=Array.prototype;if(ye[me]==undefined){B.f(ye,me,{configurable:true,value:ve(null)})}var _e=function t(e){ye[me][e]=true};var be=Object.defineProperty;var we={};var xe=function t(e){throw e};var ke=function t(e,n){if(x(we,e))return we[e];if(!n)n={};var i=[][e];var r=x(n,"ACCESSORS")?n.ACCESSORS:false;var a=x(n,0)?n[0]:xe;var o=x(n,1)?n[1]:undefined;return we[e]=!!i&&!s(function(){if(r&&!d)return true;var t={length:-1};if(r)be(t,1,{enumerable:true,get:xe});else t[1]=1;i.call(t,a,o)})};var Se=ee.find;var Ce="find";var Ee=true;var Ae=ke(Ce);if(Ce in[])Array(1)[Ce](function(){Ee=false});It({target:"Array",proto:true,forced:Ee||!Ae},{find:function t(e){return Se(this,e,arguments.length>1?arguments[1]:undefined)}});_e(Ce);var Re=wt.includes;var Me=ke("indexOf",{ACCESSORS:true,1:0});It({target:"Array",proto:true,forced:!Me},{includes:function t(e){return Re(this,e,arguments.length>1?arguments[1]:undefined)}});_e("includes");var Te=Object.assign;var Pe=Object.defineProperty;var Oe=!Te||s(function(){if(d&&Te({b:1},Te(Pe({},"a",{enumerable:true,get:function t(){Pe(this,"b",{value:3,enumerable:false})}}),{b:2})).b!==1)return true;var t={};var e={};var n=Symbol();var i="abcdefghijklmnopqrst";t[n]=7;i.split("").forEach(function(t){e[t]=t});return Te({},t)[n]!=7||ne(Te({},e)).join("")!=i})?function t(e,n){var i=Vt(e);var r=arguments.length;var a=1;var o=Mt.f;var s=g.f;while(r>a){var u=b(arguments[a++]);var l=o?ne(u).concat(o(u)):ne(u);var c=l.length;var f=0;var h;while(c>f){h=l[f++];if(!d||s.call(u,h))i[h]=u[h]}}return i}:Te;It({target:"Object",stat:true,forced:Object.assign!==Oe},{assign:Oe});var Be=Zt("match");var De=function t(e){var n;return y(e)&&((n=e[Be])!==undefined?!!n:f(e)=="RegExp")};var Ne=function t(e){if(De(e)){throw TypeError("The method doesn't accept regular expressions")}return e};var ze=Zt("match");var je=function t(e){var n=/./;try{"/./"[e](n)}catch(t){try{n[ze]=false;return"/./"[e](n)}catch(t){}}return false};It({target:"String",proto:true,forced:!je("includes")},{includes:function t(e){return!!~String(v(this)).indexOf(Ne(e),arguments.length>1?arguments[1]:undefined)}});var Le=M.f;var Fe="".startsWith;var Ie=Math.min;var He=je("startsWith");var Ge=!He&&!!function(){var t=Le(String.prototype,"startsWith");return t&&!t.writable}();It({target:"String",proto:true,forced:!Ge&&!He},{startsWith:function t(e){var n=String(v(this));Ne(e);var i=vt(Ie(arguments.length>1?arguments[1]:undefined,n.length));var r=String(e);return Fe?Fe.call(n,r,i):n.slice(i,i+r.length)===r}});if(typeof window!=="undefined"){(function(){try{if(typeof SVGElement==="undefined"||Boolean(SVGElement.prototype.innerHTML)){return}}catch(t){return}function n(t){switch(t.nodeType){case 1:return r(t);case 3:return e(t);case 8:return i(t)}}function e(t){return t.textContent.replace(/&/g,"&").replace(//g,">")}function i(t){return"\x3c!--"+t.nodeValue+"--\x3e"}function r(t){var e="";e+="<"+t.tagName;if(t.hasAttributes()){[].forEach.call(t.attributes,function(t){e+=" "+t.name+'="'+t.value+'"'})}e+=">";if(t.hasChildNodes()){[].forEach.call(t.childNodes,function(t){e+=n(t)})}e+="";return e}Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function t(){var e="";[].forEach.call(this.childNodes,function(t){e+=n(t)});return e},set:function t(e){while(this.firstChild){this.removeChild(this.firstChild)}try{var n=new DOMParser;n.async=false;var i=""+e+"";var r=n.parseFromString(i,"text/xml").documentElement;[].forEach.call(r.childNodes,function(t){this.appendChild(this.ownerDocument.importNode(t,true))}.bind(this))}catch(t){throw new Error("Error parsing markup string")}}});Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function t(){return this.innerHTML},set:function t(e){this.innerHTML=e}})})()}});(function(t,e){(typeof exports==="undefined"?"undefined":_typeof2(exports))==="object"&&typeof module!=="undefined"?e(exports):typeof define==="function"&&define.amd?define("d3plus",["exports"],e):(t=typeof globalThis!=="undefined"?globalThis:t||self,e(t.d3plus={}))})(this,function(t){var e="2.0.0-alpha.30";function k(t,e){return te?1:t>=e?0:NaN}function S(o){if(o.length===1)o=n(o);return{left:function t(e,n,i,r){if(i==null)i=0;if(r==null)r=e.length;while(i>>1;if(o(e[a],n)<0)i=a+1;else r=a}return i},right:function t(e,n,i,r){if(i==null)i=0;if(r==null)r=e.length;while(i>>1;if(o(e[a],n)>0)r=a;else i=a+1}return i}}}function n(n){return function(t,e){return k(n(t),e)}}var i=S(k);var l=i.right;function c(t){return t===null?NaN:+t}function r(t,e){var n=t.length,i=0,r=-1,a=0,o,s,u=0;if(e==null){while(++r1)return u/(i-1)}function se(t,e){var n=r(t,e);return n?Math.sqrt(n):n}function ue(t,e){var n=t.length,i=-1,r,a,o;if(e==null){while(++i=r){a=o=r;while(++ir)a=r;if(o=r){a=o=r;while(++ir)a=r;if(o0)return[t];if(i=e0){t=Math.ceil(t/s);e=Math.floor(e/s);o=new Array(a=Math.ceil(e-t+1));while(++r=0?(a>=o?10:a>=s?5:a>=u?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(a>=o?10:a>=s?5:a>=u?2:1)}function C(t,e,n){var i=Math.abs(e-t)/Math.max(0,n),r=Math.pow(10,Math.floor(Math.log(i)/Math.LN10)),a=i/r;if(a>=o)r*=10;else if(a>=s)r*=5;else if(a>=u)r*=2;return e=1)return+n(t[i-1],i-1,t);var i,r=(i-1)*e,a=Math.floor(r),o=+n(t[a],a,t),s=+n(t[a+1],a+1,t);return o+(s-o)*(r-a)}function ce(t,e){var n=t.length,i=-1,r,a;if(e==null){while(++i=r){a=r;while(++ia){a=r}}}}}else{while(++i=r){a=r;while(++ia){a=r}}}}}return a}function fe(t,e){var n=t.length,i=n,r=-1,a,o=0;if(e==null){while(++r=0){o=t[e];n=o.length;while(--n>=0){a[--r]=o[n]}}return a}function de(t,e){var n=t.length,i=-1,r,a;if(e==null){while(++i=r){a=r;while(++ir){a=r}}}}}else{while(++i=r){a=r;while(++ir){a=r}}}}}return a}function ge(t,e){var n=t.length,i=-1,r,a=0;if(e==null){while(++i0))return i;do{i.push(r=new Date(+t)),o(t,n),a(t)}while(r=t)while(a(t),!n(t)){t.setTime(t-1)}},function(t,e){if(t>=t){if(e<0)while(++e<=0){while(o(t,-1),!n(t)){}}else while(--e>=0){while(o(t,+1),!n(t)){}}}})};if(n){s.count=function(t,e){h.setTime(+t),d.setTime(+e);a(h),a(d);return Math.floor(n(h,d))};s.every=function(e){e=Math.floor(e);return!isFinite(e)||!(e>0)?null:!(e>1)?s:s.filter(i?function(t){return i(t)%e===0}:function(t){return s.count(0,t)%e===0})}}return s}var a=g(function(){},function(t,e){t.setTime(+t+e)},function(t,e){return e-t});a.every=function(n){n=Math.floor(n);if(!isFinite(n)||!(n>0))return null;if(!(n>1))return a;return g(function(t){t.setTime(Math.floor(t/n)*n)},function(t,e){t.setTime(+t+e*n)},function(t,e){return(e-t)/n})};var p=1e3;var v=6e4;var m=36e5;var y=864e5;var _=6048e5;var mt=g(function(t){t.setTime(t-t.getMilliseconds())},function(t,e){t.setTime(+t+e*p)},function(t,e){return(e-t)/p},function(t){return t.getUTCSeconds()});var yt=g(function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*p)},function(t,e){t.setTime(+t+e*v)},function(t,e){return(e-t)/v},function(t){return t.getMinutes()});var _t=g(function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*p-t.getMinutes()*v)},function(t,e){t.setTime(+t+e*m)},function(t,e){return(e-t)/m},function(t){return t.getHours()});var bt=g(function(t){t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*v)/y},function(t){return t.getDate()-1});function b(e){return g(function(t){t.setDate(t.getDate()-(t.getDay()+7-e)%7);t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e*7)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*v)/_})}var wt=b(0);var W=b(1);var w=b(2);var x=b(3);var E=b(4);var A=b(5);var R=b(6);var xt=g(function(t){t.setDate(1);t.setHours(0,0,0,0)},function(t,e){t.setMonth(t.getMonth()+e)},function(t,e){return e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12},function(t){return t.getMonth()});var kt=g(function(t){t.setMonth(0,1);t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t,e){return e.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});kt.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:g(function(t){t.setFullYear(Math.floor(t.getFullYear()/n)*n);t.setMonth(0,1);t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e*n)})};var M=g(function(t){t.setUTCSeconds(0,0)},function(t,e){t.setTime(+t+e*v)},function(t,e){return(e-t)/v},function(t){return t.getUTCMinutes()});var T=g(function(t){t.setUTCMinutes(0,0,0)},function(t,e){t.setTime(+t+e*m)},function(t,e){return(e-t)/m},function(t){return t.getUTCHours()});var q=g(function(t){t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e)},function(t,e){return(e-t)/y},function(t){return t.getUTCDate()-1});function P(e){return g(function(t){t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e*7)},function(t,e){return(e-t)/_})}var O=P(0);var K=P(1);var B=P(2);var D=P(3);var N=P(4);var z=P(5);var j=P(6);var L=g(function(t){t.setUTCDate(1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCMonth(t.getUTCMonth()+e)},function(t,e){return e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12},function(t){return t.getUTCMonth()});var F=g(function(t){t.setUTCMonth(0,1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)},function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});F.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:g(function(t){t.setUTCFullYear(Math.floor(t.getUTCFullYear()/n)*n);t.setUTCMonth(0,1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e*n)})};function Y(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);e.setFullYear(t.y);return e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function X(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));e.setUTCFullYear(t.y);return e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Z(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}function I(t){var i=t.dateTime,r=t.date,a=t.time,e=t.periods,n=t.days,o=t.shortDays,s=t.months,u=t.shortMonths;var l=tt(e),c=et(e),f=tt(n),h=et(n),d=tt(o),g=et(o),p=tt(s),v=et(s),m=tt(u),y=et(u);var _={a:B,A:D,b:N,B:z,c:null,d:Tt,e:Tt,f:Nt,g:Kt,G:Xt,H:Pt,I:Ot,j:Bt,L:Dt,m:jt,M:Lt,p:j,q:L,Q:Ee,s:Ae,S:Ft,u:It,U:Ht,V:Vt,w:Ut,W:Wt,x:null,X:null,y:qt,Y:Yt,Z:Zt,"%":Ce};var b={a:F,A:I,b:H,B:G,c:null,d:$t,e:$t,f:ne,g:we,G:ke,H:Jt,I:Qt,j:te,L:ee,m:ie,M:re,p:V,q:U,Q:Ee,s:Ae,S:ae,u:oe,U:pe,V:me,w:ye,W:_e,x:null,X:null,y:be,Y:xe,Z:Se,"%":Ce};var w={a:E,A:A,b:R,B:M,c:T,d:ht,e:ht,f:Et,g:ut,G:st,H:gt,I:gt,j:dt,L:Ct,m:ft,M:pt,p:C,q:ct,Q:Rt,s:Mt,S:St,u:it,U:rt,V:at,w:nt,W:ot,x:P,X:O,y:ut,Y:st,Z:lt,"%":At};_.x=x(r,_);_.X=x(a,_);_.c=x(i,_);b.x=x(r,b);b.X=x(a,b);b.c=x(i,b);function x(u,l){return function(t){var e=[],n=-1,i=0,r=u.length,a,o,s;if(!(t instanceof Date))t=new Date(+t);while(++n53)return null;if(!("w"in e))e.w=1;if("Z"in e){i=X(Z(e.y,0,1)),r=i.getUTCDay();i=r>4||r===0?K.ceil(i):K(i);i=q.offset(i,(e.V-1)*7);e.y=i.getUTCFullYear();e.m=i.getUTCMonth();e.d=i.getUTCDate()+(e.w+6)%7}else{i=Y(Z(e.y,0,1)),r=i.getDay();i=r>4||r===0?W.ceil(i):W(i);i=bt.offset(i,(e.V-1)*7);e.y=i.getFullYear();e.m=i.getMonth();e.d=i.getDate()+(e.w+6)%7}}else if("W"in e||"U"in e){if(!("w"in e))e.w="u"in e?e.u%7:"W"in e?1:0;r="Z"in e?X(Z(e.y,0,1)).getUTCDay():Y(Z(e.y,0,1)).getDay();e.m=0;e.d="W"in e?(e.w+6)%7+e.W*7-(r+5)%7:e.w+e.U*7-(r+6)%7}if("Z"in e){e.H+=e.Z/100|0;e.M+=e.Z%100;return X(e)}return Y(e)}}function S(t,e,n,i){var r=0,a=e.length,o=n.length,s,u;while(r=o)return-1;s=e.charCodeAt(r++);if(s===37){s=e.charAt(r++);u=w[s in J?e.charAt(r++):s];if(!u||(i=u(t,n,i))<0)return-1}else if(s!=n.charCodeAt(i++)){return-1}}return i}function C(t,e,n){var i=l.exec(e.slice(n));return i?(t.p=c[i[0].toLowerCase()],n+i[0].length):-1}function E(t,e,n){var i=d.exec(e.slice(n));return i?(t.w=g[i[0].toLowerCase()],n+i[0].length):-1}function A(t,e,n){var i=f.exec(e.slice(n));return i?(t.w=h[i[0].toLowerCase()],n+i[0].length):-1}function R(t,e,n){var i=m.exec(e.slice(n));return i?(t.m=y[i[0].toLowerCase()],n+i[0].length):-1}function M(t,e,n){var i=p.exec(e.slice(n));return i?(t.m=v[i[0].toLowerCase()],n+i[0].length):-1}function T(t,e,n){return S(t,i,e,n)}function P(t,e,n){return S(t,r,e,n)}function O(t,e,n){return S(t,a,e,n)}function B(t){return o[t.getDay()]}function D(t){return n[t.getDay()]}function N(t){return u[t.getMonth()]}function z(t){return s[t.getMonth()]}function j(t){return e[+(t.getHours()>=12)]}function L(t){return 1+~~(t.getMonth()/3)}function F(t){return o[t.getUTCDay()]}function I(t){return n[t.getUTCDay()]}function H(t){return u[t.getUTCMonth()]}function G(t){return s[t.getUTCMonth()]}function V(t){return e[+(t.getUTCHours()>=12)]}function U(t){return 1+~~(t.getUTCMonth()/3)}return{format:function t(e){var n=x(e+="",_);n.toString=function(){return e};return n},parse:function t(e){var n=k(e+="",false);n.toString=function(){return e};return n},utcFormat:function t(e){var n=x(e+="",b);n.toString=function(){return e};return n},utcParse:function t(e){var n=k(e+="",true);n.toString=function(){return e};return n}}}var J={"-":"",_:" ",0:"0"},H=/^\s*\d+/,G=/^%/,V=/[\\^$*+?|[\]().{}]/g;function U(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a68?1900:2e3),n+i[0].length):-1}function lt(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function ct(t,e,n){var i=H.exec(e.slice(n,n+1));return i?(t.q=i[0]*3-3,n+i[0].length):-1}function ft(t,e,n){var i=H.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function ht(t,e,n){var i=H.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function dt(t,e,n){var i=H.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function gt(t,e,n){var i=H.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function pt(t,e,n){var i=H.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function St(t,e,n){var i=H.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function Ct(t,e,n){var i=H.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Et(t,e,n){var i=H.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function At(t,e,n){var i=G.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function Rt(t,e,n){var i=H.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Mt(t,e,n){var i=H.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}function Tt(t,e){return U(t.getDate(),e,2)}function Pt(t,e){return U(t.getHours(),e,2)}function Ot(t,e){return U(t.getHours()%12||12,e,2)}function Bt(t,e){return U(1+bt.count(kt(t),t),e,3)}function Dt(t,e){return U(t.getMilliseconds(),e,3)}function Nt(t,e){return Dt(t,e)+"000"}function jt(t,e){return U(t.getMonth()+1,e,2)}function Lt(t,e){return U(t.getMinutes(),e,2)}function Ft(t,e){return U(t.getSeconds(),e,2)}function It(t){var e=t.getDay();return e===0?7:e}function Ht(t,e){return U(wt.count(kt(t)-1,t),e,2)}function Gt(t){var e=t.getDay();return e>=4||e===0?E(t):E.ceil(t)}function Vt(t,e){t=Gt(t);return U(E.count(kt(t),t)+(kt(t).getDay()===4),e,2)}function Ut(t){return t.getDay()}function Wt(t,e){return U(W.count(kt(t)-1,t),e,2)}function qt(t,e){return U(t.getFullYear()%100,e,2)}function Kt(t,e){t=Gt(t);return U(t.getFullYear()%100,e,2)}function Yt(t,e){return U(t.getFullYear()%1e4,e,4)}function Xt(t,e){var n=t.getDay();t=n>=4||n===0?E(t):E.ceil(t);return U(t.getFullYear()%1e4,e,4)}function Zt(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+U(e/60|0,"0",2)+U(e%60,"0",2)}function $t(t,e){return U(t.getUTCDate(),e,2)}function Jt(t,e){return U(t.getUTCHours(),e,2)}function Qt(t,e){return U(t.getUTCHours()%12||12,e,2)}function te(t,e){return U(1+q.count(F(t),t),e,3)}function ee(t,e){return U(t.getUTCMilliseconds(),e,3)}function ne(t,e){return ee(t,e)+"000"}function ie(t,e){return U(t.getUTCMonth()+1,e,2)}function re(t,e){return U(t.getUTCMinutes(),e,2)}function ae(t,e){return U(t.getUTCSeconds(),e,2)}function oe(t){var e=t.getUTCDay();return e===0?7:e}function pe(t,e){return U(O.count(F(t)-1,t),e,2)}function ve(t){var e=t.getUTCDay();return e>=4||e===0?N(t):N.ceil(t)}function me(t,e){t=ve(t);return U(N.count(F(t),t)+(F(t).getUTCDay()===4),e,2)}function ye(t){return t.getUTCDay()}function _e(t,e){return U(K.count(F(t)-1,t),e,2)}function be(t,e){return U(t.getUTCFullYear()%100,e,2)}function we(t,e){t=ve(t);return U(t.getUTCFullYear()%100,e,2)}function xe(t,e){return U(t.getUTCFullYear()%1e4,e,4)}function ke(t,e){var n=t.getUTCDay();t=n>=4||n===0?N(t):N.ceil(t);return U(t.getUTCFullYear()%1e4,e,4)}function Se(){return"+0000"}function Ce(){return"%"}function Ee(t){return+t}function Ae(t){return Math.floor(+t/1e3)}var Re;var Me;var Te;var Pe;var Oe;Be({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function Be(t){Re=I(t);Me=Re.format;Te=Re.parse;Pe=Re.utcFormat;Oe=Re.utcParse;return Re}function De(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}function Ne(t,e){switch(arguments.length){case 0:break;case 1:this.interpolator(t);break;default:this.interpolator(e).domain(t);break}return this}var ze="$";function je(){}je.prototype=Le.prototype={constructor:je,has:function t(e){return ze+e in this},get:function t(e){return this[ze+e]},set:function t(e,n){this[ze+e]=n;return this},remove:function t(e){var n=ze+e;return n in this&&delete this[n]},clear:function t(){for(var e in this){if(e[0]===ze)delete this[e]}},keys:function t(){var t=[];for(var e in this){if(e[0]===ze)t.push(e.slice(1))}return t},values:function t(){var t=[];for(var e in this){if(e[0]===ze)t.push(this[e])}return t},entries:function t(){var t=[];for(var e in this){if(e[0]===ze)t.push({key:e.slice(1),value:this[e]})}return t},size:function t(){var t=0;for(var e in this){if(e[0]===ze)++t}return t},empty:function t(){for(var e in this){if(e[0]===ze)return false}return true},each:function t(e){for(var n in this){if(n[0]===ze)e(this[n],n.slice(1),this)}}};function Le(t,e){var n=new je;if(t instanceof je)t.each(function(t,e){n.set(e,t)});else if(Array.isArray(t)){var i=-1,r=t.length,a;if(e==null)while(++i=h.length){if(d!=null)t.sort(d);return g!=null?g(t):t}var e=-1,a=t.length,o=h[n++],s,u,l=Le(),c,f=i();while(++eh.length)return t;var i,r=a[n-1];if(g!=null&&n>=h.length)i=t.entries();else i=[],t.each(function(t,e){i.push({key:e,values:o(t,n)})});return r!=null?i.sort(function(t,e){return r(t.key,e.key)}):i}return n={object:function t(e){return p(e,0,Ie,He)},map:function t(e){return p(e,0,Ge,Ve)},entries:function t(e){return o(p(e,0,Ge,Ve),0)},key:function t(e){h.push(e);return n},sortKeys:function t(e){a[h.length-1]=e;return n},sortValues:function t(e){d=e;return n},rollup:function t(e){g=e;return n}}}function Ie(){return{}}function He(t,e,n){t[e]=n}function Ge(){return Le()}function Ve(t,e,n){t.set(e,n)}function Ue(){}var We=Le.prototype;Ue.prototype=qe.prototype={constructor:Ue,has:We.has,add:function t(e){e+="";this[ze+e]=e;return this},remove:We.remove,clear:We.clear,values:We.keys,size:We.size,empty:We.empty,each:We.each};function qe(t,e){var n=new Ue;if(t instanceof Ue)t.each(function(t){n.add(t)});else if(t){var i=-1,r=t.length;if(e==null)while(++i>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Sn(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Sn(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=hn.exec(t))?new An(e[1],e[2],e[3],1):(e=dn.exec(t))?new An(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=gn.exec(t))?Sn(e[1],e[2],e[3],e[4]):(e=pn.exec(t))?Sn(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=vn.exec(t))?Pn(e[1],e[2]/100,e[3]/100,1):(e=mn.exec(t))?Pn(e[1],e[2]/100,e[3]/100,e[4]):yn.hasOwnProperty(t)?kn(yn[t]):t==="transparent"?new An(NaN,NaN,NaN,0):null}function kn(t){return new An(t>>16&255,t>>8&255,t&255,1)}function Sn(t,e,n,i){if(i<=0)t=e=n=NaN;return new An(t,e,n,i)}function Cn(t){if(!(t instanceof an))t=xn(t);if(!t)return new An;t=t.rgb();return new An(t.r,t.g,t.b,t.opacity)}function En(t,e,n,i){return arguments.length===1?Cn(t):new An(t,e,n,i==null?1:i)}function An(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}nn(An,En,rn(an,{brighter:function t(e){e=e==null?sn:Math.pow(sn,e);return new An(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function t(e){e=e==null?on:Math.pow(on,e);return new An(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function t(){return this},displayable:function t(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Rn,formatHex:Rn,formatRgb:Mn,toString:Mn}));function Rn(){return"#"+Tn(this.r)+Tn(this.g)+Tn(this.b)}function Mn(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}function Tn(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function Pn(t,e,n,i){if(i<=0)t=e=n=NaN;else if(n<=0||n>=1)t=e=NaN;else if(e<=0)t=NaN;return new Dn(t,e,n,i)}function On(t){if(t instanceof Dn)return new Dn(t.h,t.s,t.l,t.opacity);if(!(t instanceof an))t=xn(t);if(!t)return new Dn;if(t instanceof Dn)return t;t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),o=NaN,s=a-r,u=(a+r)/2;if(s){if(e===a)o=(n-i)/s+(n0&&u<1?0:o}return new Dn(o,s,u,t.opacity)}function Bn(t,e,n,i){return arguments.length===1?On(t):new Dn(t,e,n,i==null?1:i)}function Dn(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}nn(Dn,Bn,rn(an,{brighter:function t(e){e=e==null?sn:Math.pow(sn,e);return new Dn(this.h,this.s,this.l*e,this.opacity)},darker:function t(e){e=e==null?on:Math.pow(on,e);return new Dn(this.h,this.s,this.l*e,this.opacity)},rgb:function t(){var e=this.h%360+(this.h<0)*360,n=isNaN(e)||isNaN(this.s)?0:this.s,i=this.l,r=i+(i<.5?i:1-i)*n,a=2*i-r;return new An(Nn(e>=240?e-240:e+120,a,r),Nn(e,a,r),Nn(e<120?e+240:e-120,a,r),this.opacity)},displayable:function t(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function t(){var e=this.opacity;e=isNaN(e)?1:Math.max(0,Math.min(1,e));return(e===1?"hsl(":"hsla(")+(this.h||0)+", "+(this.s||0)*100+"%, "+(this.l||0)*100+"%"+(e===1?")":", "+e+")")}}));function Nn(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}function zn(t){return function(){return t}}function jn(e,n){return function(t){return e+t*n}}function Ln(e,n,i){return e=Math.pow(e,i),n=Math.pow(n,i)-e,i=1/i,function(t){return Math.pow(e+t*n,i)}}function Fn(n){return(n=+n)===1?In:function(t,e){return e-t?Ln(t,e,n):zn(isNaN(t)?e:t)}}function In(t,e){var n=e-t;return n?jn(t,n):zn(isNaN(t)?e:t)}var Hn=function t(e){var o=Fn(e);function n(e,t){var n=o((e=En(e)).r,(t=En(t)).r),i=o(e.g,t.g),r=o(e.b,t.b),a=In(e.opacity,t.opacity);return function(t){e.r=n(t);e.g=i(t);e.b=r(t);e.opacity=a(t);return e+""}}n.gamma=t;return n}(1);function Gn(e,n){if(!n)n=[];var i=e?Math.min(n.length,e.length):0,r=n.slice(),a;return function(t){for(a=0;ae){a=i.slice(e,a);if(s[o])s[o]+=a;else s[++o]=a}if((n=n[0])===(r=r[0])){if(s[o])s[o]+=r;else s[++o]=r}else{s[++o]=null;u.push({i:o,x:qn(n,r)})}e=Xn.lastIndex}if(e180)e+=360;else if(e-t>180)t+=360;i.push({i:n.push(l(n)+"rotate(",null,r)-2,x:qn(t,e)})}else if(e){n.push(l(n)+"rotate("+e+r)}}function c(t,e,n,i){if(t!==e){i.push({i:n.push(l(n)+"skewX(",null,r)-2,x:qn(t,e)})}else if(e){n.push(l(n)+"skewX("+e+r)}}function f(t,e,n,i,r,a){if(t!==n||e!==i){var o=r.push(l(r)+"scale(",null,",",null,")");a.push({i:o-4,x:qn(t,n)},{i:o-2,x:qn(e,i)})}else if(n!==1||i!==1){r.push(l(r)+"scale("+n+","+i+")")}}return function(t,e){var r=[],a=[];t=n(t),e=n(e);i(t.translateX,t.translateY,e.translateX,e.translateY,r,a);o(t.rotate,e.rotate,r,a);c(t.skewX,e.skewX,r,a);f(t.scaleX,t.scaleY,e.scaleX,e.scaleY,r,a);t=e=null;return function(t){var e=-1,n=a.length,i;while(++en)i=e,e=n,n=i;return function(t){return Math.max(e,Math.min(n,t))}}function Ai(t,e,n){var i=t[0],r=t[1],a=e[0],o=e[1];if(r2?Ri:Ai;l=c=null;return h}function h(t){return isNaN(t=+t)?o:(l||(l=u(e.map(r),n,i)))(r(s(t)))}h.invert=function(t){return s(a((c||(c=u(n,e.map(r),qn)))(t)))};h.domain=function(t){return arguments.length?(e=Xe.call(t,xi),s===Si||(s=Ei(e)),f()):e.slice()};h.range=function(t){return arguments.length?(n=Ze.call(t),f()):n.slice()};h.rangeRound=function(t){return n=Ze.call(t),i=ti,f()};h.clamp=function(t){return arguments.length?(s=t?Ei(e):Si,h):s!==Si};h.interpolate=function(t){return arguments.length?(i=t,f()):i};h.unknown=function(t){return arguments.length?(o=t,h):o};return function(t,e){r=t,a=e;return f()}}function Pi(t,e){return Ti()(t,e)}function Oi(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function Bi(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function Di(t){return t=Bi(Math.abs(t)),t?t[1]:NaN}function Ni(s,u){return function(t,e){var n=t.length,i=[],r=0,a=s[0],o=0;while(n>0&&a>0){if(o+a+1>e)a=Math.max(1,e-o);i.push(t.substring(n-=a,n+a));if((o+=a+1)>e)break;a=s[r=(r+1)%s.length]}return i.reverse().join(u)}}function zi(e){return function(t){return t.replace(/[0-9]/g,function(t){return e[+t]})}}var ji=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Li(t){if(!(e=ji.exec(t)))throw new Error("invalid format: "+t);var e;return new Fi({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}Li.prototype=Fi.prototype;function Fi(t){this.fill=t.fill===undefined?" ":t.fill+"";this.align=t.align===undefined?">":t.align+"";this.sign=t.sign===undefined?"-":t.sign+"";this.symbol=t.symbol===undefined?"":t.symbol+"";this.zero=!!t.zero;this.width=t.width===undefined?undefined:+t.width;this.comma=!!t.comma;this.precision=t.precision===undefined?undefined:+t.precision;this.trim=!!t.trim;this.type=t.type===undefined?"":t.type+""}Fi.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===undefined?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===undefined?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function Ii(t){t:for(var e=t.length,n=1,i=-1,r;n0)i=0;break}}return i>0?t.slice(0,i)+t.slice(r+1):t}var Hi;function Gi(t,e){var n=Bi(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(Hi=Math.max(-8,Math.min(8,Math.floor(r/3)))*3)+1,o=i.length;return a===o?i:a>o?i+new Array(a-o+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+Bi(t,Math.max(0,e+a-1))[0]}function Vi(t,e){var n=Bi(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")}var Ui={"%":function t(e,n){return(e*100).toFixed(n)},b:function t(e){return Math.round(e).toString(2)},c:function t(e){return e+""},d:Oi,e:function t(e,n){return e.toExponential(n)},f:function t(e,n){return e.toFixed(n)},g:function t(e,n){return e.toPrecision(n)},o:function t(e){return Math.round(e).toString(8)},p:function t(e,n){return Vi(e*100,n)},r:Vi,s:Gi,X:function t(e){return Math.round(e).toString(16).toUpperCase()},x:function t(e){return Math.round(e).toString(16)}};function Wi(t){return t}var qi=Array.prototype.map,Ki=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Yi(t){var x=t.grouping===undefined||t.thousands===undefined?Wi:Ni(qi.call(t.grouping,Number),t.thousands+""),i=t.currency===undefined?"":t.currency[0]+"",r=t.currency===undefined?"":t.currency[1]+"",k=t.decimal===undefined?".":t.decimal+"",S=t.numerals===undefined?Wi:zi(qi.call(t.numerals,String)),a=t.percent===undefined?"%":t.percent+"",C=t.minus===undefined?"-":t.minus+"",E=t.nan===undefined?"NaN":t.nan+"";function o(t){t=Li(t);var l=t.fill,c=t.align,f=t.sign,e=t.symbol,h=t.zero,d=t.width,g=t.comma,p=t.precision,v=t.trim,m=t.type;if(m==="n")g=true,m="g";else if(!Ui[m])p===undefined&&(p=12),v=true,m="g";if(h||l==="0"&&c==="=")h=true,l="0",c="=";var y=e==="$"?i:e==="#"&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",_=e==="$"?r:/[%p]/.test(m)?a:"";var b=Ui[m],w=/[defgprs%]/.test(m);p=p===undefined?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,p)):Math.max(0,Math.min(20,p));function n(t){var e=y,n=_,i,r,a;if(m==="c"){n=b(t)+n;t=""}else{t=+t;var o=t<0||1/t<0;t=isNaN(t)?E:b(Math.abs(t),p);if(v)t=Ii(t);if(o&&+t===0&&f!=="+")o=false;e=(o?f==="("?f:C:f==="-"||f==="("?"":f)+e;n=(m==="s"?Ki[8+Hi/3]:"")+n+(o&&f==="("?")":"");if(w){i=-1,r=t.length;while(++ia||a>57){n=(a===46?k+t.slice(i+1):t.slice(i))+n;t=t.slice(0,i);break}}}}if(g&&!h)t=x(t,Infinity);var s=e.length+t.length+n.length,u=s>1)+e+t+n+u.slice(s);break;default:t=u+e+t+n;break}return S(t)}n.toString=function(){return t+""};return n}function e(t,e){var n=o((t=Li(t),t.type="f",t)),i=Math.max(-8,Math.min(8,Math.floor(Di(e)/3)))*3,r=Math.pow(10,-i),a=Ki[8+i/3];return function(t){return n(r*t)+a}}return{format:o,formatPrefix:e}}var Xi;var Zi;var $i;Ji({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"});function Ji(t){Xi=Yi(t);Zi=Xi.format;$i=Xi.formatPrefix;return Xi}function Qi(t){return Math.max(0,-Di(Math.abs(t)))}function tr(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Di(e)/3)))*3-Di(Math.abs(t)))}function er(t,e){t=Math.abs(t),e=Math.abs(e)-t;return Math.max(0,Di(e)-Di(t))+1}function nr(t,e,n,i){var r=C(t,e,n),a;i=Li(i==null?",f":i);switch(i.type){case"s":{var o=Math.max(Math.abs(t),Math.abs(e));if(i.precision==null&&!isNaN(a=tr(r,o)))i.precision=a;return $i(i,o)}case"":case"e":case"g":case"p":case"r":{if(i.precision==null&&!isNaN(a=er(r,Math.max(Math.abs(t),Math.abs(e)))))i.precision=a-(i.type==="e");break}case"f":case"%":{if(i.precision==null&&!isNaN(a=Qi(r)))i.precision=a-(i.type==="%")*2;break}}return Zi(i)}function ir(s){var u=s.domain;s.ticks=function(t){var e=u();return vt(e[0],e[e.length-1],t==null?10:t)};s.tickFormat=function(t,e){var n=u();return nr(n[0],n[n.length-1],t==null?10:t,e)};s.nice=function(t){if(t==null)t=10;var e=u(),n=0,i=e.length-1,r=e[n],a=e[i],o;if(a0){r=Math.floor(r/o)*o;a=Math.ceil(a/o)*o;o=f(r,a,t)}else if(o<0){r=Math.ceil(r*o)/o;a=Math.floor(a*o)/o;o=f(r,a,t)}if(o>0){e[n]=Math.floor(r/o)*o;e[i]=Math.ceil(a/o)*o;u(e)}else if(o<0){e[n]=Math.ceil(r*o)/o;e[i]=Math.floor(a*o)/o;u(e)}return s};return s}function rr(){var t=Pi(Si,Si);t.copy=function(){return Mi(t,rr())};De.apply(t,arguments);return ir(t)}function ar(e){var n;function i(t){return isNaN(t=+t)?n:t}i.invert=i;i.domain=i.range=function(t){return arguments.length?(e=Xe.call(t,xi),i):e.slice()};i.unknown=function(t){return arguments.length?(n=t,i):n};i.copy=function(){return ar(e).unknown(n)};e=arguments.length?Xe.call(e,xi):[0,1];return ir(i)}function or(t,e){t=t.slice();var n=0,i=t.length-1,r=t[n],a=t[i],o;if(a0)for(;ai)break;f.push(l)}}else for(;a=1;--u){l=s*u;if(li)break;f.push(l)}}}else{f=vt(a,o,Math.min(o-a,c)).map(p)}return r?f.reverse():f};e.tickFormat=function(t,n){if(n==null)n=d===10?".0e":",";if(typeof n!=="function")n=Zi(n);if(t===Infinity)return n;if(t==null)t=10;var i=Math.max(1,d*t/e.ticks().length);return function(t){var e=t/p(Math.round(g(t)));if(e*d0?i[e-1]:r[0],e=r?[a[r-1],i]:[a[e-1],a[e]]};s.unknown=function(t){return arguments.length?(e=t,s):s};s.thresholds=function(){return a.slice()};s.copy=function(){return Rr().domain([n,i]).range(o).unknown(e)};return De.apply(ir(s),arguments)}function Mr(){var n=[.5],i=[0,1],e,r=1;function a(t){return t<=t?i[l(n,t,0,r)]:e}a.domain=function(t){return arguments.length?(n=Ze.call(t),r=Math.min(n.length,i.length-1),a):n.slice()};a.range=function(t){return arguments.length?(i=Ze.call(t),r=Math.min(n.length,i.length-1),a):i.slice()};a.invertExtent=function(t){var e=i.indexOf(t);return[n[e-1],n[e]]};a.unknown=function(t){return arguments.length?(e=t,a):e};a.copy=function(){return Mr().domain(n).range(i).unknown(e)};return De.apply(a,arguments)}var Tr=1e3,Pr=Tr*60,Or=Pr*60,Br=Or*24,Dr=Br*7,Nr=Br*30,zr=Br*365;function jr(t){return new Date(t)}function Lr(t){return t instanceof Date?+t:+new Date(+t)}function Fr(o,e,n,i,r,a,s,u,l){var c=Pi(Si,Si),f=c.invert,h=c.domain;var d=l(".%L"),g=l(":%S"),p=l("%I:%M"),v=l("%I %p"),m=l("%a %d"),y=l("%b %d"),_=l("%B"),b=l("%Y");var w=[[s,1,Tr],[s,5,5*Tr],[s,15,15*Tr],[s,30,30*Tr],[a,1,Pr],[a,5,5*Pr],[a,15,15*Pr],[a,30,30*Pr],[r,1,Or],[r,3,3*Or],[r,6,6*Or],[r,12,12*Or],[i,1,Br],[i,2,2*Br],[n,1,Dr],[e,1,Nr],[e,3,3*Nr],[o,1,zr]];function x(t){return(s(t)=0&&(e=t.slice(0,n))!=="xmlns")t=t.slice(n+1);return ra.hasOwnProperty(e)?{space:ra[e],local:t}:t}function oa(n){return function(){var t=this.ownerDocument,e=this.namespaceURI;return e===ia&&t.documentElement.namespaceURI===ia?t.createElement(n):t.createElementNS(e,n)}}function sa(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function ua(t){var e=aa(t);return(e.local?sa:oa)(e)}function la(){}function ca(t){return t==null?la:function(){return this.querySelector(t)}}function fa(t){if(typeof t!=="function")t=ca(t);for(var e=this._groups,n=e.length,i=new Array(n),r=0;r=_)_=y+1;while(!(w=v[_])&&++_=0;){if(o=i[r]){if(a&&o.compareDocumentPosition(a)^4)a.parentNode.insertBefore(o,a);a=o}}}return this}function Ma(n){if(!n)n=Ta;function t(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}for(var e=this._groups,i=e.length,r=new Array(i),a=0;ae?1:t>=e?0:NaN}function Pa(){var t=arguments[0];arguments[0]=this;t.apply(null,arguments);return this}function Oa(){var t=new Array(this.size()),e=-1;this.each(function(){t[++e]=this});return t}function Ba(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?Wa:typeof e==="function"?Ka:qa)(t,e,n==null?"":n)):Xa(this.node(),t)}function Xa(t,e){return t.style.getPropertyValue(e)||Ua(t).getComputedStyle(t,null).getPropertyValue(e)}function Za(t){return function(){delete this[t]}}function $a(t,e){return function(){this[t]=e}}function Ja(e,n){return function(){var t=n.apply(this,arguments);if(t==null)delete this[e];else this[e]=t}}function Qa(t,e){return arguments.length>1?this.each((e==null?Za:typeof e==="function"?Ja:$a)(t,e)):this.node()[t]}function to(t){return t.trim().split(/^|\s+/)}function eo(t){return t.classList||new no(t)}function no(t){this._node=t;this._names=to(t.getAttribute("class")||"")}no.prototype={add:function t(e){var n=this._names.indexOf(e);if(n<0){this._names.push(e);this._node.setAttribute("class",this._names.join(" "))}},remove:function t(e){var n=this._names.indexOf(e);if(n>=0){this._names.splice(n,1);this._node.setAttribute("class",this._names.join(" "))}},contains:function t(e){return this._names.indexOf(e)>=0}};function io(t,e){var n=eo(t),i=-1,r=e.length;while(++i=0)e=t.slice(n+1),t=t.slice(0,n);return{type:t,name:e}})}function jo(a){return function(){var t=this.__on;if(!t)return;for(var e=0,n=-1,i=t.length,r;e=0)e=t.slice(n+1),t=t.slice(0,n);if(t&&!i.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})}ns.prototype=es.prototype={constructor:ns,on:function t(e,n){var i=this._,r=is(e+"",i),a,o=-1,s=r.length;if(arguments.length<2){while(++o0)for(var i=new Array(a),r=0,a,o;r=0)t._call.call(null,e);t=t._next}--os}function xs(){ds=(hs=ps.now())+gs;os=ss=0;try{ws()}finally{os=0;Ss();ds=0}}function ks(){var t=ps.now(),e=t-hs;if(e>ls)gs-=e,hs=t}function Ss(){var t,e=cs,n,i=Infinity;while(e){if(e._call){if(i>e._time)i=e._time;t=e,e=e._next}else{n=e._next,e._next=null;e=t?t._next=n:cs=n}}fs=t;Cs(i)}function Cs(t){if(os)return;if(ss)ss=clearTimeout(ss);var e=t-ds;if(e>24){if(tMs)throw new Error("too late; already scheduled");return n}function Ls(t,e){var n=Fs(t,e);if(n.state>Os)throw new Error("too late; already running");return n}function Fs(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Is(a,o,s){var u=a.__transition,l;u[o]=s;s.timer=bs(t,0,s.time);function t(t){s.state=Ts;s.timer.restart(c,s.delay,s.time);if(s.delay<=t)c(t-s.delay)}function c(t){var e,n,i,r;if(s.state!==Ts)return h();for(e in u){r=u[e];if(r.name!==s.name)continue;if(r.state===Os)return Es(c);if(r.state===Bs){r.state=Ns;r.timer.stop();r.on.call("interrupt",a,a.__data__,r.index,r.group);delete u[e]}else if(+ePs&&i.state=0)t=t.slice(0,e);return!t||t==="start"})}function mu(n,i,r){var a,o,s=vu(i)?js:Ls;return function(){var t=s(this,n),e=t.on;if(e!==a)(o=(a=e).copy()).on(i,r);t.on=o}}function yu(t,e){var n=this._id;return arguments.length<2?Fs(this.node(),n).on.on(t):this.each(mu(n,t,e))}function _u(n){return function(){var t=this.parentNode;for(var e in this.__transition){if(+e!==n)return}if(t)t.removeChild(this)}}function bu(){return this.on("end.remove",_u(this._id))}function wu(t){var e=this._name,n=this._id;if(typeof t!=="function")t=ca(t);for(var i=this._groups,r=i.length,a=new Array(r),o=0;o1&&arguments[1]!==undefined?arguments[1]:{};for(var n in e){if({}.hasOwnProperty.call(e,n))t.attr(n,e[n])}}var il={language:"Afar",location:null,id:4096,tag:"aa",version:"Release 10"};var rl={language:"Afrikaans",location:null,id:54,tag:"af",version:"Release 7"};var al={language:"Aghem",location:null,id:4096,tag:"agq",version:"Release 10"};var ol={language:"Akan",location:null,id:4096,tag:"ak",version:"Release 10"};var sl={language:"Albanian",location:null,id:28,tag:"sq",version:"Release 7"};var ul={language:"Alsatian",location:null,id:132,tag:"gsw",version:"Release 7"};var ll={language:"Amharic",location:null,id:94,tag:"am",version:"Release 7"};var cl={language:"Arabic",location:null,id:1,tag:"ar",version:"Release 7"};var fl={language:"Armenian",location:null,id:43,tag:"hy",version:"Release 7"};var hl={language:"Assamese",location:null,id:77,tag:"as",version:"Release 7"};var dl={language:"Asturian",location:null,id:4096,tag:"ast",version:"Release 10"};var gl={language:"Asu",location:null,id:4096,tag:"asa",version:"Release 10"};var pl={language:"Azerbaijani (Latin)",location:null,id:44,tag:"az",version:"Release 7"};var vl={language:"Bafia",location:null,id:4096,tag:"ksf",version:"Release 10"};var ml={language:"Bamanankan",location:null,id:4096,tag:"bm",version:"Release 10"};var yl={language:"Bangla",location:null,id:69,tag:"bn",version:"Release 7"};var _l={language:"Basaa",location:null,id:4096,tag:"bas",version:"Release 10"};var bl={language:"Bashkir",location:null,id:109,tag:"ba",version:"Release 7"};var wl={language:"Basque",location:null,id:45,tag:"eu",version:"Release 7"};var xl={language:"Belarusian",location:null,id:35,tag:"be",version:"Release 7"};var kl={language:"Bemba",location:null,id:4096,tag:"bem",version:"Release 10"};var Sl={language:"Bena",location:null,id:4096,tag:"bez",version:"Release 10"};var Cl={language:"Blin",location:null,id:4096,tag:"byn",version:"Release 10"};var El={language:"Bodo",location:null,id:4096,tag:"brx",version:"Release 10"};var Al={language:"Bosnian (Latin)",location:null,id:30746,tag:"bs",version:"Release 7"};var Rl={language:"Breton",location:null,id:126,tag:"br",version:"Release 7"};var Ml={language:"Bulgarian",location:null,id:2,tag:"bg",version:"Release 7"};var Tl={language:"Burmese",location:null,id:85,tag:"my",version:"Release 8.1"};var Pl={language:"Catalan",location:null,id:3,tag:"ca",version:"Release 7"};var Ol={language:"Cebuano",location:null,id:4096,tag:"ceb",version:"Release 10.5"};var Bl={language:"Central Kurdish",location:null,id:146,tag:"ku",version:"Release 8"};var Dl={language:"Chakma",location:null,id:4096,tag:"ccp",version:"Release 10.5"};var Nl={language:"Cherokee",location:null,id:92,tag:"chr",version:"Release 8"};var zl={language:"Chiga",location:null,id:4096,tag:"cgg",version:"Release 10"};var jl={language:"Chinese (Simplified)",location:null,id:30724,tag:"zh",version:"Windows 7"};var Ll={language:"Congo Swahili",location:null,id:4096,tag:"swc",version:"Release 10"};var Fl={language:"Cornish",location:null,id:4096,tag:"kw",version:"Release 10"};var Il={language:"Corsican",location:null,id:131,tag:"co",version:"Release 7"};var Hl={language:"Czech",location:null,id:5,tag:"cs",version:"Release 7"};var Gl={language:"Danish",location:null,id:6,tag:"da",version:"Release 7"};var Vl={language:"Dari",location:null,id:140,tag:"prs",version:"Release 7"};var Ul={language:"Divehi",location:null,id:101,tag:"dv",version:"Release 7"};var Wl={language:"Duala",location:null,id:4096,tag:"dua",version:"Release 10"};var ql={language:"Dutch",location:null,id:19,tag:"nl",version:"Release 7"};var Kl={language:"Dzongkha",location:null,id:4096,tag:"dz",version:"Release 10"};var Yl={language:"Embu",location:null,id:4096,tag:"ebu",version:"Release 10"};var Xl={language:"English",location:null,id:9,tag:"en",version:"Release 7"};var Zl={language:"Esperanto",location:null,id:4096,tag:"eo",version:"Release 10"};var $l={language:"Estonian",location:null,id:37,tag:"et",version:"Release 7"};var Jl={language:"Ewe",location:null,id:4096,tag:"ee",version:"Release 10"};var Ql={language:"Ewondo",location:null,id:4096,tag:"ewo",version:"Release 10"};var tc={language:"Faroese",location:null,id:56,tag:"fo",version:"Release 7"};var ec={language:"Filipino",location:null,id:100,tag:"fil",version:"Release 7"};var nc={language:"Finnish",location:null,id:11,tag:"fi",version:"Release 7"};var ic={language:"French",location:null,id:12,tag:"fr",version:"Release 7"};var rc={language:"Frisian",location:null,id:98,tag:"fy",version:"Release 7"};var ac={language:"Friulian",location:null,id:4096,tag:"fur",version:"Release 10"};var oc={language:"Fulah",location:null,id:103,tag:"ff",version:"Release 8"};var sc={language:"Galician",location:null,id:86,tag:"gl",version:"Release 7"};var uc={language:"Ganda",location:null,id:4096,tag:"lg",version:"Release 10"};var lc={language:"Georgian",location:null,id:55,tag:"ka",version:"Release 7"};var cc={language:"German",location:null,id:7,tag:"de",version:"Release 7"};var fc={language:"Greek",location:null,id:8,tag:"el",version:"Release 7"};var hc={language:"Greenlandic",location:null,id:111,tag:"kl",version:"Release 7"};var dc={language:"Guarani",location:null,id:116,tag:"gn",version:"Release 8.1"};var gc={language:"Gujarati",location:null,id:71,tag:"gu",version:"Release 7"};var pc={language:"Gusii",location:null,id:4096,tag:"guz",version:"Release 10"};var vc={language:"Hausa (Latin)",location:null,id:104,tag:"ha",version:"Release 7"};var mc={language:"Hawaiian",location:null,id:117,tag:"haw",version:"Release 8"};var yc={language:"Hebrew",location:null,id:13,tag:"he",version:"Release 7"};var _c={language:"Hindi",location:null,id:57,tag:"hi",version:"Release 7"};var bc={language:"Hungarian",location:null,id:14,tag:"hu",version:"Release 7"};var wc={language:"Icelandic",location:null,id:15,tag:"is",version:"Release 7"};var xc={language:"Igbo",location:null,id:112,tag:"ig",version:"Release 7"};var kc={language:"Indonesian",location:null,id:33,tag:"id",version:"Release 7"};var Sc={language:"Interlingua",location:null,id:4096,tag:"ia",version:"Release 10"};var Cc={language:"Inuktitut (Latin)",location:null,id:93,tag:"iu",version:"Release 7"};var Ec={language:"Irish",location:null,id:60,tag:"ga",version:"Windows 7"};var Ac={language:"Italian",location:null,id:16,tag:"it",version:"Release 7"};var Rc={language:"Japanese",location:null,id:17,tag:"ja",version:"Release 7"};var Mc={language:"Javanese",location:null,id:4096,tag:"jv",version:"Release 8.1"};var Tc={language:"Jola-Fonyi",location:null,id:4096,tag:"dyo",version:"Release 10"};var Pc={language:"Kabuverdianu",location:null,id:4096,tag:"kea",version:"Release 10"};var Oc={language:"Kabyle",location:null,id:4096,tag:"kab",version:"Release 10"};var Bc={language:"Kako",location:null,id:4096,tag:"kkj",version:"Release 10"};var Dc={language:"Kalenjin",location:null,id:4096,tag:"kln",version:"Release 10"};var Nc={language:"Kamba",location:null,id:4096,tag:"kam",version:"Release 10"};var zc={language:"Kannada",location:null,id:75,tag:"kn",version:"Release 7"};var jc={language:"Kashmiri",location:null,id:96,tag:"ks",version:"Release 10"};var Lc={language:"Kazakh",location:null,id:63,tag:"kk",version:"Release 7"};var Fc={language:"Khmer",location:null,id:83,tag:"km",version:"Release 7"};var Ic={language:"K'iche",location:null,id:134,tag:"quc",version:"Release 10"};var Hc={language:"Kikuyu",location:null,id:4096,tag:"ki",version:"Release 10"};var Gc={language:"Kinyarwanda",location:null,id:135,tag:"rw",version:"Release 7"};var Vc={language:"Kiswahili",location:null,id:65,tag:"sw",version:"Release 7"};var Uc={language:"Konkani",location:null,id:87,tag:"kok",version:"Release 7"};var Wc={language:"Korean",location:null,id:18,tag:"ko",version:"Release 7"};var qc={language:"Koyra Chiini",location:null,id:4096,tag:"khq",version:"Release 10"};var Kc={language:"Koyraboro Senni",location:null,id:4096,tag:"ses",version:"Release 10"};var Yc={language:"Kwasio",location:null,id:4096,tag:"nmg",version:"Release 10"};var Xc={language:"Kyrgyz",location:null,id:64,tag:"ky",version:"Release 7"};var Zc={language:"Lakota",location:null,id:4096,tag:"lkt",version:"Release 10"};var $c={language:"Langi",location:null,id:4096,tag:"lag",version:"Release 10"};var Jc={language:"Lao",location:null,id:84,tag:"lo",version:"Release 7"};var Qc={language:"Latvian",location:null,id:38,tag:"lv",version:"Release 7"};var tf={language:"Lingala",location:null,id:4096,tag:"ln",version:"Release 10"};var ef={language:"Lithuanian",location:null,id:39,tag:"lt",version:"Release 7"};var nf={language:"Low German",location:null,id:4096,tag:"nds",version:"Release 10.2"};var rf={language:"Lower Sorbian",location:null,id:31790,tag:"dsb",version:"Windows 7"};var af={language:"Luba-Katanga",location:null,id:4096,tag:"lu",version:"Release 10"};var of={language:"Luo",location:null,id:4096,tag:"luo",version:"Release 10"};var sf={language:"Luxembourgish",location:null,id:110,tag:"lb",version:"Release 7"};var uf={language:"Luyia",location:null,id:4096,tag:"luy",version:"Release 10"};var lf={language:"Macedonian",location:null,id:47,tag:"mk",version:"Release 7"};var cf={language:"Machame",location:null,id:4096,tag:"jmc",version:"Release 10"};var ff={language:"Makhuwa-Meetto",location:null,id:4096,tag:"mgh",version:"Release 10"};var hf={language:"Makonde",location:null,id:4096,tag:"kde",version:"Release 10"};var df={language:"Malagasy",location:null,id:4096,tag:"mg",version:"Release 8.1"};var gf={language:"Malay",location:null,id:62,tag:"ms",version:"Release 7"};var pf={language:"Malayalam",location:null,id:76,tag:"ml",version:"Release 7"};var vf={language:"Maltese",location:null,id:58,tag:"mt",version:"Release 7"};var mf={language:"Manx",location:null,id:4096,tag:"gv",version:"Release 10"};var yf={language:"Maori",location:null,id:129,tag:"mi",version:"Release 7"};var _f={language:"Mapudungun",location:null,id:122,tag:"arn",version:"Release 7"};var bf={language:"Marathi",location:null,id:78,tag:"mr",version:"Release 7"};var wf={language:"Masai",location:null,id:4096,tag:"mas",version:"Release 10"};var xf={language:"Meru",location:null,id:4096,tag:"mer",version:"Release 10"};var kf={language:"Meta'",location:null,id:4096,tag:"mgo",version:"Release 10"};var Sf={language:"Mohawk",location:null,id:124,tag:"moh",version:"Release 7"};var Cf={language:"Mongolian (Cyrillic)",location:null,id:80,tag:"mn",version:"Release 7"};var Ef={language:"Morisyen",location:null,id:4096,tag:"mfe",version:"Release 10"};var Af={language:"Mundang",location:null,id:4096,tag:"mua",version:"Release 10"};var Rf={language:"N'ko",location:null,id:4096,tag:"nqo",version:"Release 8.1"};var Mf={language:"Nama",location:null,id:4096,tag:"naq",version:"Release 10"};var Tf={language:"Nepali",location:null,id:97,tag:"ne",version:"Release 7"};var Pf={language:"Ngiemboon",location:null,id:4096,tag:"nnh",version:"Release 10"};var Of={language:"Ngomba",location:null,id:4096,tag:"jgo",version:"Release 10"};var Bf={language:"North Ndebele",location:null,id:4096,tag:"nd",version:"Release 10"};var Df={language:"Norwegian (Bokmal)",location:null,id:20,tag:"no",version:"Release 7"};var Nf={language:"Norwegian (Bokmal)",location:null,id:31764,tag:"nb",version:"Release 7"};var zf={language:"Norwegian (Nynorsk)",location:null,id:30740,tag:"nn",version:"Release 7"};var jf={language:"Nuer",location:null,id:4096,tag:"nus",version:"Release 10"};var Lf={language:"Nyankole",location:null,id:4096,tag:"nyn",version:"Release 10"};var Ff={language:"Occitan",location:null,id:130,tag:"oc",version:"Release 7"};var If={language:"Odia",location:null,id:72,tag:"or",version:"Release 7"};var Hf={language:"Oromo",location:null,id:114,tag:"om",version:"Release 8.1"};var Gf={language:"Ossetian",location:null,id:4096,tag:"os",version:"Release 10"};var Vf={language:"Pashto",location:null,id:99,tag:"ps",version:"Release 7"};var Uf={language:"Persian",location:null,id:41,tag:"fa",version:"Release 7"};var Wf={language:"Polish",location:null,id:21,tag:"pl",version:"Release 7"};var qf={language:"Portuguese",location:null,id:22,tag:"pt",version:"Release 7"};var Kf={language:"Punjabi",location:null,id:70,tag:"pa",version:"Release 7"};var Yf={language:"Quechua",location:null,id:107,tag:"quz",version:"Release 7"};var Xf={language:"Ripuarian",location:null,id:4096,tag:"ksh",version:"Release 10"};var Zf={language:"Romanian",location:null,id:24,tag:"ro",version:"Release 7"};var $f={language:"Romansh",location:null,id:23,tag:"rm",version:"Release 7"};var Jf={language:"Rombo",location:null,id:4096,tag:"rof",version:"Release 10"};var Qf={language:"Rundi",location:null,id:4096,tag:"rn",version:"Release 10"};var th={language:"Russian",location:null,id:25,tag:"ru",version:"Release 7"};var eh={language:"Rwa",location:null,id:4096,tag:"rwk",version:"Release 10"};var nh={language:"Saho",location:null,id:4096,tag:"ssy",version:"Release 10"};var ih={language:"Sakha",location:null,id:133,tag:"sah",version:"Release 7"};var rh={language:"Samburu",location:null,id:4096,tag:"saq",version:"Release 10"};var ah={language:"Sami (Inari)",location:null,id:28731,tag:"smn",version:"Windows 7"};var oh={language:"Sami (Lule)",location:null,id:31803,tag:"smj",version:"Windows 7"};var sh={language:"Sami (Northern)",location:null,id:59,tag:"se",version:"Release 7"};var uh={language:"Sami (Skolt)",location:null,id:29755,tag:"sms",version:"Windows 7"};var lh={language:"Sami (Southern)",location:null,id:30779,tag:"sma",version:"Windows 7"};var ch={language:"Sango",location:null,id:4096,tag:"sg",version:"Release 10"};var fh={language:"Sangu",location:null,id:4096,tag:"sbp",version:"Release 10"};var hh={language:"Sanskrit",location:null,id:79,tag:"sa",version:"Release 7"};var dh={language:"Scottish Gaelic",location:null,id:145,tag:"gd",version:"Windows 7"};var gh={language:"Sena",location:null,id:4096,tag:"seh",version:"Release 10"};var ph={language:"Serbian (Latin)",location:null,id:31770,tag:"sr",version:"Release 7"};var vh={language:"Sesotho sa Leboa",location:null,id:108,tag:"nso",version:"Release 7"};var mh={language:"Setswana",location:null,id:50,tag:"tn",version:"Release 7"};var yh={language:"Shambala",location:null,id:4096,tag:"ksb",version:"Release 10"};var _h={language:"Shona",location:null,id:4096,tag:"sn",version:"Release 8.1"};var bh={language:"Sindhi",location:null,id:89,tag:"sd",version:"Release 8"};var wh={language:"Sinhala",location:null,id:91,tag:"si",version:"Release 7"};var xh={language:"Slovak",location:null,id:27,tag:"sk",version:"Release 7"};var kh={language:"Slovenian",location:null,id:36,tag:"sl",version:"Release 7"};var Sh={language:"Soga",location:null,id:4096,tag:"xog",version:"Release 10"};var Ch={language:"Somali",location:null,id:119,tag:"so",version:"Release 8.1"};var Eh={language:"Sotho",location:null,id:48,tag:"st",version:"Release 8.1"};var Ah={language:"South Ndebele",location:null,id:4096,tag:"nr",version:"Release 10"};var Rh={language:"Spanish",location:null,id:10,tag:"es",version:"Release 7"};var Mh={language:"Standard Moroccan Tamazight",location:null,id:4096,tag:"zgh",version:"Release 8.1"};var Th={language:"Swati",location:null,id:4096,tag:"ss",version:"Release 10"};var Ph={language:"Swedish",location:null,id:29,tag:"sv",version:"Release 7"};var Oh={language:"Syriac",location:null,id:90,tag:"syr",version:"Release 7"};var Bh={language:"Tachelhit",location:null,id:4096,tag:"shi",version:"Release 10"};var Dh={language:"Taita",location:null,id:4096,tag:"dav",version:"Release 10"};var Nh={language:"Tajik (Cyrillic)",location:null,id:40,tag:"tg",version:"Release 7"};var zh={language:"Tamazight (Latin)",location:null,id:95,tag:"tzm",version:"Release 7"};var jh={language:"Tamil",location:null,id:73,tag:"ta",version:"Release 7"};var Lh={language:"Tasawaq",location:null,id:4096,tag:"twq",version:"Release 10"};var Fh={language:"Tatar",location:null,id:68,tag:"tt",version:"Release 7"};var Ih={language:"Telugu",location:null,id:74,tag:"te",version:"Release 7"};var Hh={language:"Teso",location:null,id:4096,tag:"teo",version:"Release 10"};var Gh={language:"Thai",location:null,id:30,tag:"th",version:"Release 7"};var Vh={language:"Tibetan",location:null,id:81,tag:"bo",version:"Release 7"};var Uh={language:"Tigre",location:null,id:4096,tag:"tig",version:"Release 10"};var Wh={language:"Tigrinya",location:null,id:115,tag:"ti",version:"Release 8"};var qh={language:"Tongan",location:null,id:4096,tag:"to",version:"Release 10"};var Kh={language:"Tsonga",location:null,id:49,tag:"ts",version:"Release 8.1"};var Yh={language:"Turkish",location:null,id:31,tag:"tr",version:"Release 7"};var Xh={language:"Turkmen",location:null,id:66,tag:"tk",version:"Release 7"};var Zh={language:"Ukrainian",location:null,id:34,tag:"uk",version:"Release 7"};var $h={language:"Upper Sorbian",location:null,id:46,tag:"hsb",version:"Release 7"};var Jh={language:"Urdu",location:null,id:32,tag:"ur",version:"Release 7"};var Qh={language:"Uyghur",location:null,id:128,tag:"ug",version:"Release 7"};var td={language:"Uzbek (Latin)",location:null,id:67,tag:"uz",version:"Release 7"};var ed={language:"Vai",location:null,id:4096,tag:"vai",version:"Release 10"};var nd={language:"Venda",location:null,id:51,tag:"ve",version:"Release 10"};var id={language:"Vietnamese",location:null,id:42,tag:"vi",version:"Release 7"};var rd={language:"Volapük",location:null,id:4096,tag:"vo",version:"Release 10"};var ad={language:"Vunjo",location:null,id:4096,tag:"vun",version:"Release 10"};var od={language:"Walser",location:null,id:4096,tag:"wae",version:"Release 10"};var sd={language:"Welsh",location:null,id:82,tag:"cy",version:"Release 7"};var ud={language:"Wolaytta",location:null,id:4096,tag:"wal",version:"Release 10"};var ld={language:"Wolof",location:null,id:136,tag:"wo",version:"Release 7"};var cd={language:"Xhosa",location:null,id:52,tag:"xh",version:"Release 7"};var fd={language:"Yangben",location:null,id:4096,tag:"yav",version:"Release 10"};var hd={language:"Yi",location:null,id:120,tag:"ii",version:"Release 7"};var dd={language:"Yoruba",location:null,id:106,tag:"yo",version:"Release 7"};var gd={language:"Zarma",location:null,id:4096,tag:"dje",version:"Release 10"};var pd={language:"Zulu",location:null,id:53,tag:"zu",version:"Release 7"};var vd={aa:il,"aa-dj":{language:"Afar",location:"Djibouti",id:4096,tag:"aa-DJ",version:"Release 10"},"aa-er":{language:"Afar",location:"Eritrea",id:4096,tag:"aa-ER",version:"Release 10"},"aa-et":{language:"Afar",location:"Ethiopia",id:4096,tag:"aa-ET",version:"Release 10"},af:rl,"af-na":{language:"Afrikaans",location:"Namibia",id:4096,tag:"af-NA",version:"Release 10"},"af-za":{language:"Afrikaans",location:"South Africa",id:1078,tag:"af-ZA",version:"Release B"},agq:al,"agq-cm":{language:"Aghem",location:"Cameroon",id:4096,tag:"agq-CM",version:"Release 10"},ak:ol,"ak-gh":{language:"Akan",location:"Ghana",id:4096,tag:"ak-GH",version:"Release 10"},sq:sl,"sq-al":{language:"Albanian",location:"Albania",id:1052,tag:"sq-AL",version:"Release B"},"sq-mk":{language:"Albanian",location:"North Macedonia",id:4096,tag:"sq-MK",version:"Release 10"},gsw:ul,"gsw-fr":{language:"Alsatian",location:"France",id:1156,tag:"gsw-FR",version:"Release V"},"gsw-li":{language:"Alsatian",location:"Liechtenstein",id:4096,tag:"gsw-LI",version:"Release 10"},"gsw-ch":{language:"Alsatian",location:"Switzerland",id:4096,tag:"gsw-CH",version:"Release 10"},am:ll,"am-et":{language:"Amharic",location:"Ethiopia",id:1118,tag:"am-ET",version:"Release V"},ar:cl,"ar-dz":{language:"Arabic",location:"Algeria",id:5121,tag:"ar-DZ",version:"Release B"},"ar-bh":{language:"Arabic",location:"Bahrain",id:15361,tag:"ar-BH",version:"Release B"},"ar-td":{language:"Arabic",location:"Chad",id:4096,tag:"ar-TD",version:"Release 10"},"ar-km":{language:"Arabic",location:"Comoros",id:4096,tag:"ar-KM",version:"Release 10"},"ar-dj":{language:"Arabic",location:"Djibouti",id:4096,tag:"ar-DJ",version:"Release 10"},"ar-eg":{language:"Arabic",location:"Egypt",id:3073,tag:"ar-EG",version:"Release B"},"ar-er":{language:"Arabic",location:"Eritrea",id:4096,tag:"ar-ER",version:"Release 10"},"ar-iq":{language:"Arabic",location:"Iraq",id:2049,tag:"ar-IQ",version:"Release B"},"ar-il":{language:"Arabic",location:"Israel",id:4096,tag:"ar-IL",version:"Release 10"},"ar-jo":{language:"Arabic",location:"Jordan",id:11265,tag:"ar-JO",version:"Release B"},"ar-kw":{language:"Arabic",location:"Kuwait",id:13313,tag:"ar-KW",version:"Release B"},"ar-lb":{language:"Arabic",location:"Lebanon",id:12289,tag:"ar-LB",version:"Release B"},"ar-ly":{language:"Arabic",location:"Libya",id:4097,tag:"ar-LY",version:"Release B"},"ar-mr":{language:"Arabic",location:"Mauritania",id:4096,tag:"ar-MR",version:"Release 10"},"ar-ma":{language:"Arabic",location:"Morocco",id:6145,tag:"ar-MA",version:"Release B"},"ar-om":{language:"Arabic",location:"Oman",id:8193,tag:"ar-OM",version:"Release B"},"ar-ps":{language:"Arabic",location:"Palestinian Authority",id:4096,tag:"ar-PS",version:"Release 10"},"ar-qa":{language:"Arabic",location:"Qatar",id:16385,tag:"ar-QA",version:"Release B"},"ar-sa":{language:"Arabic",location:"Saudi Arabia",id:1025,tag:"ar-SA",version:"Release B"},"ar-so":{language:"Arabic",location:"Somalia",id:4096,tag:"ar-SO",version:"Release 10"},"ar-ss":{language:"Arabic",location:"South Sudan",id:4096,tag:"ar-SS",version:"Release 10"},"ar-sd":{language:"Arabic",location:"Sudan",id:4096,tag:"ar-SD",version:"Release 10"},"ar-sy":{language:"Arabic",location:"Syria",id:10241,tag:"ar-SY",version:"Release B"},"ar-tn":{language:"Arabic",location:"Tunisia",id:7169,tag:"ar-TN",version:"Release B"},"ar-ae":{language:"Arabic",location:"U.A.E.",id:14337,tag:"ar-AE",version:"Release B"},"ar-001":{language:"Arabic",location:"World",id:4096,tag:"ar-001",version:"Release 10"},"ar-ye":{language:"Arabic",location:"Yemen",id:9217,tag:"ar-YE",version:"Release B"},hy:fl,"hy-am":{language:"Armenian",location:"Armenia",id:1067,tag:"hy-AM",version:"Release C"},as:hl,"as-in":{language:"Assamese",location:"India",id:1101,tag:"as-IN",version:"Release V"},ast:dl,"ast-es":{language:"Asturian",location:"Spain",id:4096,tag:"ast-ES",version:"Release 10"},asa:gl,"asa-tz":{language:"Asu",location:"Tanzania",id:4096,tag:"asa-TZ",version:"Release 10"},"az-cyrl":{language:"Azerbaijani (Cyrillic)",location:null,id:29740,tag:"az-Cyrl",version:"Windows 7"},"az-cyrl-az":{language:"Azerbaijani (Cyrillic)",location:"Azerbaijan",id:2092,tag:"az-Cyrl-AZ",version:"Release C"},az:pl,"az-latn":{language:"Azerbaijani (Latin)",location:null,id:30764,tag:"az-Latn",version:"Windows 7"},"az-latn-az":{language:"Azerbaijani (Latin)",location:"Azerbaijan",id:1068,tag:"az-Latn-AZ",version:"Release C"},ksf:vl,"ksf-cm":{language:"Bafia",location:"Cameroon",id:4096,tag:"ksf-CM",version:"Release 10"},bm:ml,"bm-latn-ml":{language:"Bamanankan (Latin)",location:"Mali",id:4096,tag:"bm-Latn-ML",version:"Release 10"},bn:yl,"bn-bd":{language:"Bangla",location:"Bangladesh",id:2117,tag:"bn-BD",version:"Release V"},"bn-in":{language:"Bangla",location:"India",id:1093,tag:"bn-IN",version:"Release E1"},bas:_l,"bas-cm":{language:"Basaa",location:"Cameroon",id:4096,tag:"bas-CM",version:"Release 10"},ba:bl,"ba-ru":{language:"Bashkir",location:"Russia",id:1133,tag:"ba-RU",version:"Release V"},eu:wl,"eu-es":{language:"Basque",location:"Spain",id:1069,tag:"eu-ES",version:"Release B"},be:xl,"be-by":{language:"Belarusian",location:"Belarus",id:1059,tag:"be-BY",version:"Release B"},bem:kl,"bem-zm":{language:"Bemba",location:"Zambia",id:4096,tag:"bem-ZM",version:"Release 10"},bez:Sl,"bez-tz":{language:"Bena",location:"Tanzania",id:4096,tag:"bez-TZ",version:"Release 10"},byn:Cl,"byn-er":{language:"Blin",location:"Eritrea",id:4096,tag:"byn-ER",version:"Release 10"},brx:El,"brx-in":{language:"Bodo",location:"India",id:4096,tag:"brx-IN",version:"Release 10"},"bs-cyrl":{language:"Bosnian (Cyrillic)",location:null,id:25626,tag:"bs-Cyrl",version:"Windows 7"},"bs-cyrl-ba":{language:"Bosnian (Cyrillic)",location:"Bosnia and Herzegovina",id:8218,tag:"bs-Cyrl-BA",version:"Release E1"},"bs-latn":{language:"Bosnian (Latin)",location:null,id:26650,tag:"bs-Latn",version:"Windows 7"},bs:Al,"bs-latn-ba":{language:"Bosnian (Latin)",location:"Bosnia and Herzegovina",id:5146,tag:"bs-Latn-BA",version:"Release E1"},br:Rl,"br-fr":{language:"Breton",location:"France",id:1150,tag:"br-FR",version:"Release V"},bg:Ml,"bg-bg":{language:"Bulgarian",location:"Bulgaria",id:1026,tag:"bg-BG",version:"Release B"},my:Tl,"my-mm":{language:"Burmese",location:"Myanmar",id:1109,tag:"my-MM",version:"Release 8.1"},ca:Pl,"ca-ad":{language:"Catalan",location:"Andorra",id:4096,tag:"ca-AD",version:"Release 10"},"ca-fr":{language:"Catalan",location:"France",id:4096,tag:"ca-FR",version:"Release 10"},"ca-it":{language:"Catalan",location:"Italy",id:4096,tag:"ca-IT",version:"Release 10"},"ca-es":{language:"Catalan",location:"Spain",id:1027,tag:"ca-ES",version:"Release B"},ceb:Ol,"ceb-latn":{language:"Cebuan (Latin)",location:null,id:4096,tag:"ceb-Latn",version:"Release 10.5"},"ceb-latn-ph":{language:"Cebuan (Latin)",location:"Philippines",id:4096,tag:"ceb-Latn-PH",version:"Release 10.5"},"tzm-latn-":{language:"Central Atlas Tamazight (Latin)",location:"Morocco",id:4096,tag:"tzm-Latn-",version:"Release 10"},ku:Bl,"ku-arab":{language:"Central Kurdish",location:null,id:31890,tag:"ku-Arab",version:"Release 8"},"ku-arab-iq":{language:"Central Kurdish",location:"Iraq",id:1170,tag:"ku-Arab-IQ",version:"Release 8"},ccp:Dl,"ccp-cakm":{language:"Chakma",location:"Chakma",id:4096,tag:"ccp-Cakm",version:"Release 10.5"},"ccp-cakm-":{language:"Chakma",location:"India",id:4096,tag:"ccp-Cakm-",version:"Release 10.5"},"cd-ru":{language:"Chechen",location:"Russia",id:4096,tag:"cd-RU",version:"Release 10.1"},chr:Nl,"chr-cher":{language:"Cherokee",location:null,id:31836,tag:"chr-Cher",version:"Release 8"},"chr-cher-us":{language:"Cherokee",location:"United States",id:1116,tag:"chr-Cher-US",version:"Release 8"},cgg:zl,"cgg-ug":{language:"Chiga",location:"Uganda",id:4096,tag:"cgg-UG",version:"Release 10"},"zh-hans":{language:"Chinese (Simplified)",location:null,id:4,tag:"zh-Hans",version:"Release A"},zh:jl,"zh-cn":{language:"Chinese (Simplified)",location:"People's Republic of China",id:2052,tag:"zh-CN",version:"Release A"},"zh-sg":{language:"Chinese (Simplified)",location:"Singapore",id:4100,tag:"zh-SG",version:"Release A"},"zh-hant":{language:"Chinese (Traditional)",location:null,id:31748,tag:"zh-Hant",version:"Release A"},"zh-hk":{language:"Chinese (Traditional)",location:"Hong Kong S.A.R.",id:3076,tag:"zh-HK",version:"Release A"},"zh-mo":{language:"Chinese (Traditional)",location:"Macao S.A.R.",id:5124,tag:"zh-MO",version:"Release D"},"zh-tw":{language:"Chinese (Traditional)",location:"Taiwan",id:1028,tag:"zh-TW",version:"Release A"},"cu-ru":{language:"Church Slavic",location:"Russia",id:4096,tag:"cu-RU",version:"Release 10.1"},swc:Ll,"swc-cd":{language:"Congo Swahili",location:"Congo DRC",id:4096,tag:"swc-CD",version:"Release 10"},kw:Fl,"kw-gb":{language:"Cornish",location:"United Kingdom",id:4096,tag:"kw-GB",version:"Release 10"},co:Il,"co-fr":{language:"Corsican",location:"France",id:1155,tag:"co-FR",version:"Release V"},"hr,":{language:"Croatian",location:null,id:26,tag:"hr,",version:"Release 7"},"hr-hr":{language:"Croatian",location:"Croatia",id:1050,tag:"hr-HR",version:"Release A"},"hr-ba":{language:"Croatian (Latin)",location:"Bosnia and Herzegovina",id:4122,tag:"hr-BA",version:"Release E1"},cs:Hl,"cs-cz":{language:"Czech",location:"Czech Republic",id:1029,tag:"cs-CZ",version:"Release A"},da:Gl,"da-dk":{language:"Danish",location:"Denmark",id:1030,tag:"da-DK",version:"Release A"},"da-gl":{language:"Danish",location:"Greenland",id:4096,tag:"da-GL",version:"Release 10"},prs:Vl,"prs-af":{language:"Dari",location:"Afghanistan",id:1164,tag:"prs-AF",version:"Release V"},dv:Ul,"dv-mv":{language:"Divehi",location:"Maldives",id:1125,tag:"dv-MV",version:"Release D"},dua:Wl,"dua-cm":{language:"Duala",location:"Cameroon",id:4096,tag:"dua-CM",version:"Release 10"},nl:ql,"nl-aw":{language:"Dutch",location:"Aruba",id:4096,tag:"nl-AW",version:"Release 10"},"nl-be":{language:"Dutch",location:"Belgium",id:2067,tag:"nl-BE",version:"Release A"},"nl-bq":{language:"Dutch",location:"Bonaire, Sint Eustatius and Saba",id:4096,tag:"nl-BQ",version:"Release 10"},"nl-cw":{language:"Dutch",location:"Curaçao",id:4096,tag:"nl-CW",version:"Release 10"},"nl-nl":{language:"Dutch",location:"Netherlands",id:1043,tag:"nl-NL",version:"Release A"},"nl-sx":{language:"Dutch",location:"Sint Maarten",id:4096,tag:"nl-SX",version:"Release 10"},"nl-sr":{language:"Dutch",location:"Suriname",id:4096,tag:"nl-SR",version:"Release 10"},dz:Kl,"dz-bt":{language:"Dzongkha",location:"Bhutan",id:3153,tag:"dz-BT",version:"Release 10"},ebu:Yl,"ebu-ke":{language:"Embu",location:"Kenya",id:4096,tag:"ebu-KE",version:"Release 10"},en:Xl,"en-as":{language:"English",location:"American Samoa",id:4096,tag:"en-AS",version:"Release 10"},"en-ai":{language:"English",location:"Anguilla",id:4096,tag:"en-AI",version:"Release 10"},"en-ag":{language:"English",location:"Antigua and Barbuda",id:4096,tag:"en-AG",version:"Release 10"},"en-au":{language:"English",location:"Australia",id:3081,tag:"en-AU",version:"Release A"},"en-at":{language:"English",location:"Austria",id:4096,tag:"en-AT",version:"Release 10.1"},"en-bs":{language:"English",location:"Bahamas",id:4096,tag:"en-BS",version:"Release 10"},"en-bb":{language:"English",location:"Barbados",id:4096,tag:"en-BB",version:"Release 10"},"en-be":{language:"English",location:"Belgium",id:4096,tag:"en-BE",version:"Release 10"},"en-bz":{language:"English",location:"Belize",id:10249,tag:"en-BZ",version:"Release B"},"en-bm":{language:"English",location:"Bermuda",id:4096,tag:"en-BM",version:"Release 10"},"en-bw":{language:"English",location:"Botswana",id:4096,tag:"en-BW",version:"Release 10"},"en-io":{language:"English",location:"British Indian Ocean Territory",id:4096,tag:"en-IO",version:"Release 10"},"en-vg":{language:"English",location:"British Virgin Islands",id:4096,tag:"en-VG",version:"Release 10"},"en-bi":{language:"English",location:"Burundi",id:4096,tag:"en-BI",version:"Release 10.1"},"en-cm":{language:"English",location:"Cameroon",id:4096,tag:"en-CM",version:"Release 10"},"en-ca":{language:"English",location:"Canada",id:4105,tag:"en-CA",version:"Release A"},"en-029":{language:"English",location:"Caribbean",id:9225,tag:"en-029",version:"Release B"},"en-ky":{language:"English",location:"Cayman Islands",id:4096,tag:"en-KY",version:"Release 10"},"en-cx":{language:"English",location:"Christmas Island",id:4096,tag:"en-CX",version:"Release 10"},"en-cc":{language:"English",location:"Cocos [Keeling] Islands",id:4096,tag:"en-CC",version:"Release 10"},"en-ck":{language:"English",location:"Cook Islands",id:4096,tag:"en-CK",version:"Release 10"},"en-cy":{language:"English",location:"Cyprus",id:4096,tag:"en-CY",version:"Release 10.1"},"en-dk":{language:"English",location:"Denmark",id:4096,tag:"en-DK",version:"Release 10.1"},"en-dm":{language:"English",location:"Dominica",id:4096,tag:"en-DM",version:"Release 10"},"en-er":{language:"English",location:"Eritrea",id:4096,tag:"en-ER",version:"Release 10"},"en-150":{language:"English",location:"Europe",id:4096,tag:"en-150",version:"Release 10"},"en-fk":{language:"English",location:"Falkland Islands",id:4096,tag:"en-FK",version:"Release 10"},"en-fi":{language:"English",location:"Finland",id:4096,tag:"en-FI",version:"Release 10.1"},"en-fj":{language:"English",location:"Fiji",id:4096,tag:"en-FJ",version:"Release 10"},"en-gm":{language:"English",location:"Gambia",id:4096,tag:"en-GM",version:"Release 10"},"en-de":{language:"English",location:"Germany",id:4096,tag:"en-DE",version:"Release 10.1"},"en-gh":{language:"English",location:"Ghana",id:4096,tag:"en-GH",version:"Release 10"},"en-gi":{language:"English",location:"Gibraltar",id:4096,tag:"en-GI",version:"Release 10"},"en-gd":{language:"English",location:"Grenada",id:4096,tag:"en-GD",version:"Release 10"},"en-gu":{language:"English",location:"Guam",id:4096,tag:"en-GU",version:"Release 10"},"en-gg":{language:"English",location:"Guernsey",id:4096,tag:"en-GG",version:"Release 10"},"en-gy":{language:"English",location:"Guyana",id:4096,tag:"en-GY",version:"Release 10"},"en-hk":{language:"English",location:"Hong Kong",id:15369,tag:"en-HK",version:"Release 8.1"},"en-in":{language:"English",location:"India",id:16393,tag:"en-IN",version:"Release V"},"en-ie":{language:"English",location:"Ireland",id:6153,tag:"en-IE",version:"Release A"},"en-im":{language:"English",location:"Isle of Man",id:4096,tag:"en-IM",version:"Release 10"},"en-il":{language:"English",location:"Israel",id:4096,tag:"en-IL",version:"Release 10.1"},"en-jm":{language:"English",location:"Jamaica",id:8201,tag:"en-JM",version:"Release B"},"en-je":{language:"English",location:"Jersey",id:4096,tag:"en-JE",version:"Release 10"},"en-ke":{language:"English",location:"Kenya",id:4096,tag:"en-KE",version:"Release 10"},"en-ki":{language:"English",location:"Kiribati",id:4096,tag:"en-KI",version:"Release 10"},"en-ls":{language:"English",location:"Lesotho",id:4096,tag:"en-LS",version:"Release 10"},"en-lr":{language:"English",location:"Liberia",id:4096,tag:"en-LR",version:"Release 10"},"en-mo":{language:"English",location:"Macao SAR",id:4096,tag:"en-MO",version:"Release 10"},"en-mg":{language:"English",location:"Madagascar",id:4096,tag:"en-MG",version:"Release 10"},"en-mw":{language:"English",location:"Malawi",id:4096,tag:"en-MW",version:"Release 10"},"en-my":{language:"English",location:"Malaysia",id:17417,tag:"en-MY",version:"Release V"},"en-mt":{language:"English",location:"Malta",id:4096,tag:"en-MT",version:"Release 10"},"en-mh":{language:"English",location:"Marshall Islands",id:4096,tag:"en-MH",version:"Release 10"},"en-mu":{language:"English",location:"Mauritius",id:4096,tag:"en-MU",version:"Release 10"},"en-fm":{language:"English",location:"Micronesia",id:4096,tag:"en-FM",version:"Release 10"},"en-ms":{language:"English",location:"Montserrat",id:4096,tag:"en-MS",version:"Release 10"},"en-na":{language:"English",location:"Namibia",id:4096,tag:"en-NA",version:"Release 10"},"en-nr":{language:"English",location:"Nauru",id:4096,tag:"en-NR",version:"Release 10"},"en-nl":{language:"English",location:"Netherlands",id:4096,tag:"en-NL",version:"Release 10.1"},"en-nz":{language:"English",location:"New Zealand",id:5129,tag:"en-NZ",version:"Release A"},"en-ng":{language:"English",location:"Nigeria",id:4096,tag:"en-NG",version:"Release 10"},"en-nu":{language:"English",location:"Niue",id:4096,tag:"en-NU",version:"Release 10"},"en-nf":{language:"English",location:"Norfolk Island",id:4096,tag:"en-NF",version:"Release 10"},"en-mp":{language:"English",location:"Northern Mariana Islands",id:4096,tag:"en-MP",version:"Release 10"},"en-pk":{language:"English",location:"Pakistan",id:4096,tag:"en-PK",version:"Release 10"},"en-pw":{language:"English",location:"Palau",id:4096,tag:"en-PW",version:"Release 10"},"en-pg":{language:"English",location:"Papua New Guinea",id:4096,tag:"en-PG",version:"Release 10"},"en-pn":{language:"English",location:"Pitcairn Islands",id:4096,tag:"en-PN",version:"Release 10"},"en-pr":{language:"English",location:"Puerto Rico",id:4096,tag:"en-PR",version:"Release 10"},"en-ph":{language:"English",location:"Republic of the Philippines",id:13321,tag:"en-PH",version:"Release C"},"en-rw":{language:"English",location:"Rwanda",id:4096,tag:"en-RW",version:"Release 10"},"en-kn":{language:"English",location:"Saint Kitts and Nevis",id:4096,tag:"en-KN",version:"Release 10"},"en-lc":{language:"English",location:"Saint Lucia",id:4096,tag:"en-LC",version:"Release 10"},"en-vc":{language:"English",location:"Saint Vincent and the Grenadines",id:4096,tag:"en-VC",version:"Release 10"},"en-ws":{language:"English",location:"Samoa",id:4096,tag:"en-WS",version:"Release 10"},"en-sc":{language:"English",location:"Seychelles",id:4096,tag:"en-SC",version:"Release 10"},"en-sl":{language:"English",location:"Sierra Leone",id:4096,tag:"en-SL",version:"Release 10"},"en-sg":{language:"English",location:"Singapore",id:18441,tag:"en-SG",version:"Release V"},"en-sx":{language:"English",location:"Sint Maarten",id:4096,tag:"en-SX",version:"Release 10"},"en-si":{language:"English",location:"Slovenia",id:4096,tag:"en-SI",version:"Release 10.1"},"en-sb":{language:"English",location:"Solomon Islands",id:4096,tag:"en-SB",version:"Release 10"},"en-za":{language:"English",location:"South Africa",id:7177,tag:"en-ZA",version:"Release B"},"en-ss":{language:"English",location:"South Sudan",id:4096,tag:"en-SS",version:"Release 10"},"en-sh":{language:"English",location:"St Helena, Ascension, Tristan da Cunha",id:4096,tag:"en-SH",version:"Release 10"},"en-sd":{language:"English",location:"Sudan",id:4096,tag:"en-SD",version:"Release 10"},"en-sz":{language:"English",location:"Swaziland",id:4096,tag:"en-SZ",version:"Release 10"},"en-se":{language:"English",location:"Sweden",id:4096,tag:"en-SE",version:"Release 10.1"},"en-ch":{language:"English",location:"Switzerland",id:4096,tag:"en-CH",version:"Release 10.1"},"en-tz":{language:"English",location:"Tanzania",id:4096,tag:"en-TZ",version:"Release 10"},"en-tk":{language:"English",location:"Tokelau",id:4096,tag:"en-TK",version:"Release 10"},"en-to":{language:"English",location:"Tonga",id:4096,tag:"en-TO",version:"Release 10"},"en-tt":{language:"English",location:"Trinidad and Tobago",id:11273,tag:"en-TT",version:"Release B"},"en-tc":{language:"English",location:"Turks and Caicos Islands",id:4096,tag:"en-TC",version:"Release 10"},"en-tv":{language:"English",location:"Tuvalu",id:4096,tag:"en-TV",version:"Release 10"},"en-ug":{language:"English",location:"Uganda",id:4096,tag:"en-UG",version:"Release 10"},"en-ae":{language:"English",location:"United Arab Emirates",id:19465,tag:"en-AE",version:"Release 10.5"},"en-gb":{language:"English",location:"United Kingdom",id:2057,tag:"en-GB",version:"Release A"},"en-us":{language:"English",location:"United States",id:1033,tag:"en-US",version:"Release A"},"en-um":{language:"English",location:"US Minor Outlying Islands",id:4096,tag:"en-UM",version:"Release 10"},"en-vi":{language:"English",location:"US Virgin Islands",id:4096,tag:"en-VI",version:"Release 10"},"en-vu":{language:"English",location:"Vanuatu",id:4096,tag:"en-VU",version:"Release 10"},"en-001":{language:"English",location:"World",id:4096,tag:"en-001",version:"Release 10"},"en-zm":{language:"English",location:"Zambia",id:4096,tag:"en-ZM",version:"Release 10"},"en-zw":{language:"English",location:"Zimbabwe",id:12297,tag:"en-ZW",version:"Release C"},eo:Zl,"eo-001":{language:"Esperanto",location:"World",id:4096,tag:"eo-001",version:"Release 10"},et:$l,"et-ee":{language:"Estonian",location:"Estonia",id:1061,tag:"et-EE",version:"Release B"},ee:Jl,"ee-gh":{language:"Ewe",location:"Ghana",id:4096,tag:"ee-GH",version:"Release 10"},"ee-tg":{language:"Ewe",location:"Togo",id:4096,tag:"ee-TG",version:"Release 10"},ewo:Ql,"ewo-cm":{language:"Ewondo",location:"Cameroon",id:4096,tag:"ewo-CM",version:"Release 10"},fo:tc,"fo-dk":{language:"Faroese",location:"Denmark",id:4096,tag:"fo-DK",version:"Release 10.1"},"fo-fo":{language:"Faroese",location:"Faroe Islands",id:1080,tag:"fo-FO",version:"Release B"},fil:ec,"fil-ph":{language:"Filipino",location:"Philippines",id:1124,tag:"fil-PH",version:"Release E2"},fi:nc,"fi-fi":{language:"Finnish",location:"Finland",id:1035,tag:"fi-FI",version:"Release A"},fr:ic,"fr-dz":{language:"French",location:"Algeria",id:4096,tag:"fr-DZ",version:"Release 10"},"fr-be":{language:"French",location:"Belgium",id:2060,tag:"fr-BE",version:"Release A"},"fr-bj":{language:"French",location:"Benin",id:4096,tag:"fr-BJ",version:"Release 10"},"fr-bf":{language:"French",location:"Burkina Faso",id:4096,tag:"fr-BF",version:"Release 10"},"fr-bi":{language:"French",location:"Burundi",id:4096,tag:"fr-BI",version:"Release 10"},"fr-cm":{language:"French",location:"Cameroon",id:11276,tag:"fr-CM",version:"Release 8.1"},"fr-ca":{language:"French",location:"Canada",id:3084,tag:"fr-CA",version:"Release A"},"fr-cf":{language:"French",location:"Central African Republic",id:4096,tag:"fr-CF",version:"Release10"},"fr-td":{language:"French",location:"Chad",id:4096,tag:"fr-TD",version:"Release 10"},"fr-km":{language:"French",location:"Comoros",id:4096,tag:"fr-KM",version:"Release 10"},"fr-cg":{language:"French",location:"Congo",id:4096,tag:"fr-CG",version:"Release 10"},"fr-cd":{language:"French",location:"Congo, DRC",id:9228,tag:"fr-CD",version:"Release 8.1"},"fr-ci":{language:"French",location:"Côte d'Ivoire",id:12300,tag:"fr-CI",version:"Release 8.1"},"fr-dj":{language:"French",location:"Djibouti",id:4096,tag:"fr-DJ",version:"Release 10"},"fr-gq":{language:"French",location:"Equatorial Guinea",id:4096,tag:"fr-GQ",version:"Release 10"},"fr-fr":{language:"French",location:"France",id:1036,tag:"fr-FR",version:"Release A"},"fr-gf":{language:"French",location:"French Guiana",id:4096,tag:"fr-GF",version:"Release 10"},"fr-pf":{language:"French",location:"French Polynesia",id:4096,tag:"fr-PF",version:"Release 10"},"fr-ga":{language:"French",location:"Gabon",id:4096,tag:"fr-GA",version:"Release 10"},"fr-gp":{language:"French",location:"Guadeloupe",id:4096,tag:"fr-GP",version:"Release 10"},"fr-gn":{language:"French",location:"Guinea",id:4096,tag:"fr-GN",version:"Release 10"},"fr-ht":{language:"French",location:"Haiti",id:15372,tag:"fr-HT",version:"Release 8.1"},"fr-lu":{language:"French",location:"Luxembourg",id:5132,tag:"fr-LU",version:"Release A"},"fr-mg":{language:"French",location:"Madagascar",id:4096,tag:"fr-MG",version:"Release 10"},"fr-ml":{language:"French",location:"Mali",id:13324,tag:"fr-ML",version:"Release 8.1"},"fr-mq":{language:"French",location:"Martinique",id:4096,tag:"fr-MQ",version:"Release 10"},"fr-mr":{language:"French",location:"Mauritania",id:4096,tag:"fr-MR",version:"Release 10"},"fr-mu":{language:"French",location:"Mauritius",id:4096,tag:"fr-MU",version:"Release 10"},"fr-yt":{language:"French",location:"Mayotte",id:4096,tag:"fr-YT",version:"Release 10"},"fr-ma":{language:"French",location:"Morocco",id:14348,tag:"fr-MA",version:"Release 8.1"},"fr-nc":{language:"French",location:"New Caledonia",id:4096,tag:"fr-NC",version:"Release 10"},"fr-ne":{language:"French",location:"Niger",id:4096,tag:"fr-NE",version:"Release 10"},"fr-mc":{language:"French",location:"Principality of Monaco",id:6156,tag:"fr-MC",version:"Release A"},"fr-re":{language:"French",location:"Reunion",id:8204,tag:"fr-RE",version:"Release 8.1"},"fr-rw":{language:"French",location:"Rwanda",id:4096,tag:"fr-RW",version:"Release 10"},"fr-bl":{language:"French",location:"Saint Barthélemy",id:4096,tag:"fr-BL",version:"Release 10"},"fr-mf":{language:"French",location:"Saint Martin",id:4096,tag:"fr-MF",version:"Release 10"},"fr-pm":{language:"French",location:"Saint Pierre and Miquelon",id:4096,tag:"fr-PM",version:"Release 10"},"fr-sn":{language:"French",location:"Senegal",id:10252,tag:"fr-SN",version:"Release 8.1"},"fr-sc":{language:"French",location:"Seychelles",id:4096,tag:"fr-SC",version:"Release 10"},"fr-ch":{language:"French",location:"Switzerland",id:4108,tag:"fr-CH",version:"Release A"},"fr-sy":{language:"French",location:"Syria",id:4096,tag:"fr-SY",version:"Release 10"},"fr-tg":{language:"French",location:"Togo",id:4096,tag:"fr-TG",version:"Release 10"},"fr-tn":{language:"French",location:"Tunisia",id:4096,tag:"fr-TN",version:"Release 10"},"fr-vu":{language:"French",location:"Vanuatu",id:4096,tag:"fr-VU",version:"Release 10"},"fr-wf":{language:"French",location:"Wallis and Futuna",id:4096,tag:"fr-WF",version:"Release 10"},fy:rc,"fy-nl":{language:"Frisian",location:"Netherlands",id:1122,tag:"fy-NL",version:"Release E2"},fur:ac,"fur-it":{language:"Friulian",location:"Italy",id:4096,tag:"fur-IT",version:"Release 10"},ff:oc,"ff-latn":{language:"Fulah (Latin)",location:null,id:31847,tag:"ff-Latn",version:"Release 8"},"ff-latn-bf":{language:"Fulah (Latin)",location:"Burkina Faso",id:4096,tag:"ff-Latn-BF",version:"Release 10.4"},"ff-cm":{language:"Fulah",location:"Cameroon",id:4096,tag:"ff-CM",version:"Release 10"},"ff-latn-cm":{language:"Fulah (Latin)",location:"Cameroon",id:4096,tag:"ff-Latn-CM",version:"Release 10.4"},"ff-latn-gm":{language:"Fulah (Latin)",location:"Gambia",id:4096,tag:"ff-Latn-GM",version:"Release 10.4"},"ff-latn-gh":{language:"Fulah (Latin)",location:"Ghana",id:4096,tag:"ff-Latn-GH",version:"Release 10.4"},"ff-gn":{language:"Fulah",location:"Guinea",id:4096,tag:"ff-GN",version:"Release 10"},"ff-latn-gn":{language:"Fulah (Latin)",location:"Guinea",id:4096,tag:"ff-Latn-GN",version:"Release 10.4"},"ff-latn-gw":{language:"Fulah (Latin)",location:"Guinea-Bissau",id:4096,tag:"ff-Latn-GW",version:"Release 10.4"},"ff-latn-lr":{language:"Fulah (Latin)",location:"Liberia",id:4096,tag:"ff-Latn-LR",version:"Release 10.4"},"ff-mr":{language:"Fulah",location:"Mauritania",id:4096,tag:"ff-MR",version:"Release 10"},"ff-latn-mr":{language:"Fulah (Latin)",location:"Mauritania",id:4096,tag:"ff-Latn-MR",version:"Release 10.4"},"ff-latn-ne":{language:"Fulah (Latin)",location:"Niger",id:4096,tag:"ff-Latn-NE",version:"Release 10.4"},"ff-ng":{language:"Fulah",location:"Nigeria",id:4096,tag:"ff-NG",version:"Release 10"},"ff-latn-ng":{language:"Fulah (Latin)",location:"Nigeria",id:4096,tag:"ff-Latn-NG",version:"Release 10.4"},"ff-latn-sn":{language:"Fulah",location:"Senegal",id:2151,tag:"ff-Latn-SN",version:"Release 8"},"ff-latn-sl":{language:"Fulah (Latin)",location:"Sierra Leone",id:4096,tag:"ff-Latn-SL",version:"Release 10.4"},gl:sc,"gl-es":{language:"Galician",location:"Spain",id:1110,tag:"gl-ES",version:"Release D"},lg:uc,"lg-ug":{language:"Ganda",location:"Uganda",id:4096,tag:"lg-UG",version:"Release 10"},ka:lc,"ka-ge":{language:"Georgian",location:"Georgia",id:1079,tag:"ka-GE",version:"Release C"},de:cc,"de-at":{language:"German",location:"Austria",id:3079,tag:"de-AT",version:"Release A"},"de-be":{language:"German",location:"Belgium",id:4096,tag:"de-BE",version:"Release 10"},"de-de":{language:"German",location:"Germany",id:1031,tag:"de-DE",version:"Release A"},"de-it":{language:"German",location:"Italy",id:4096,tag:"de-IT",version:"Release 10.2"},"de-li":{language:"German",location:"Liechtenstein",id:5127,tag:"de-LI",version:"Release B"},"de-lu":{language:"German",location:"Luxembourg",id:4103,tag:"de-LU",version:"Release B"},"de-ch":{language:"German",location:"Switzerland",id:2055,tag:"de-CH",version:"Release A"},el:fc,"el-cy":{language:"Greek",location:"Cyprus",id:4096,tag:"el-CY",version:"Release 10"},"el-gr":{language:"Greek",location:"Greece",id:1032,tag:"el-GR",version:"Release A"},kl:hc,"kl-gl":{language:"Greenlandic",location:"Greenland",id:1135,tag:"kl-GL",version:"Release V"},gn:dc,"gn-py":{language:"Guarani",location:"Paraguay",id:1140,tag:"gn-PY",version:"Release 8.1"},gu:gc,"gu-in":{language:"Gujarati",location:"India",id:1095,tag:"gu-IN",version:"Release D"},guz:pc,"guz-ke":{language:"Gusii",location:"Kenya",id:4096,tag:"guz-KE",version:"Release 10"},ha:vc,"ha-latn":{language:"Hausa (Latin)",location:null,id:31848,tag:"ha-Latn",version:"Windows 7"},"ha-latn-gh":{language:"Hausa (Latin)",location:"Ghana",id:4096,tag:"ha-Latn-GH",version:"Release 10"},"ha-latn-ne":{language:"Hausa (Latin)",location:"Niger",id:4096,tag:"ha-Latn-NE",version:"Release 10"},"ha-latn-ng":{language:"Hausa (Latin)",location:"Nigeria",id:1128,tag:"ha-Latn-NG",version:"Release V"},haw:mc,"haw-us":{language:"Hawaiian",location:"United States",id:1141,tag:"haw-US",version:"Release 8"},he:yc,"he-il":{language:"Hebrew",location:"Israel",id:1037,tag:"he-IL",version:"Release B"},hi:_c,"hi-in":{language:"Hindi",location:"India",id:1081,tag:"hi-IN",version:"Release C"},hu:bc,"hu-hu":{language:"Hungarian",location:"Hungary",id:1038,tag:"hu-HU",version:"Release A"},is:wc,"is-is":{language:"Icelandic",location:"Iceland",id:1039,tag:"is-IS",version:"Release A"},ig:xc,"ig-ng":{language:"Igbo",location:"Nigeria",id:1136,tag:"ig-NG",version:"Release V"},id:kc,"id-id":{language:"Indonesian",location:"Indonesia",id:1057,tag:"id-ID",version:"Release B"},ia:Sc,"ia-fr":{language:"Interlingua",location:"France",id:4096,tag:"ia-FR",version:"Release 10"},"ia-001":{language:"Interlingua",location:"World",id:4096,tag:"ia-001",version:"Release 10"},iu:Cc,"iu-latn":{language:"Inuktitut (Latin)",location:null,id:31837,tag:"iu-Latn",version:"Windows 7"},"iu-latn-ca":{language:"Inuktitut (Latin)",location:"Canada",id:2141,tag:"iu-Latn-CA",version:"Release E2"},"iu-cans":{language:"Inuktitut (Syllabics)",location:null,id:30813,tag:"iu-Cans",version:"Windows 7"},"iu-cans-ca":{language:"Inuktitut (Syllabics)",location:"Canada",id:1117,tag:"iu-Cans-CA",version:"Release V"},ga:Ec,"ga-ie":{language:"Irish",location:"Ireland",id:2108,tag:"ga-IE",version:"Release E2"},it:Ac,"it-it":{language:"Italian",location:"Italy",id:1040,tag:"it-IT",version:"Release A"},"it-sm":{language:"Italian",location:"San Marino",id:4096,tag:"it-SM",version:"Release 10"},"it-ch":{language:"Italian",location:"Switzerland",id:2064,tag:"it-CH",version:"Release A"},"it-va":{language:"Italian",location:"Vatican City",id:4096,tag:"it-VA",version:"Release 10.3"},ja:Rc,"ja-jp":{language:"Japanese",location:"Japan",id:1041,tag:"ja-JP",version:"Release A"},jv:Mc,"jv-latn":{language:"Javanese",location:"Latin",id:4096,tag:"jv-Latn",version:"Release 8.1"},"jv-latn-id":{language:"Javanese",location:"Latin, Indonesia",id:4096,tag:"jv-Latn-ID",version:"Release 8.1"},dyo:Tc,"dyo-sn":{language:"Jola-Fonyi",location:"Senegal",id:4096,tag:"dyo-SN",version:"Release 10"},kea:Pc,"kea-cv":{language:"Kabuverdianu",location:"Cabo Verde",id:4096,tag:"kea-CV",version:"Release 10"},kab:Oc,"kab-dz":{language:"Kabyle",location:"Algeria",id:4096,tag:"kab-DZ",version:"Release 10"},kkj:Bc,"kkj-cm":{language:"Kako",location:"Cameroon",id:4096,tag:"kkj-CM",version:"Release 10"},kln:Dc,"kln-ke":{language:"Kalenjin",location:"Kenya",id:4096,tag:"kln-KE",version:"Release 10"},kam:Nc,"kam-ke":{language:"Kamba",location:"Kenya",id:4096,tag:"kam-KE",version:"Release 10"},kn:zc,"kn-in":{language:"Kannada",location:"India",id:1099,tag:"kn-IN",version:"Release D"},ks:jc,"ks-arab":{language:"Kashmiri",location:"Perso-Arabic",id:1120,tag:"ks-Arab",version:"Release 10"},"ks-arab-in":{language:"Kashmiri",location:"Perso-Arabic",id:4096,tag:"ks-Arab-IN",version:"Release 10"},kk:Lc,"kk-kz":{language:"Kazakh",location:"Kazakhstan",id:1087,tag:"kk-KZ",version:"Release C"},km:Fc,"km-kh":{language:"Khmer",location:"Cambodia",id:1107,tag:"km-KH",version:"Release V"},quc:Ic,"quc-latn-gt":{language:"K'iche",location:"Guatemala",id:1158,tag:"quc-Latn-GT",version:"Release 10"},ki:Hc,"ki-ke":{language:"Kikuyu",location:"Kenya",id:4096,tag:"ki-KE",version:"Release 10"},rw:Gc,"rw-rw":{language:"Kinyarwanda",location:"Rwanda",id:1159,tag:"rw-RW",version:"Release V"},sw:Vc,"sw-ke":{language:"Kiswahili",location:"Kenya",id:1089,tag:"sw-KE",version:"Release C"},"sw-tz":{language:"Kiswahili",location:"Tanzania",id:4096,tag:"sw-TZ",version:"Release 10"},"sw-ug":{language:"Kiswahili",location:"Uganda",id:4096,tag:"sw-UG",version:"Release 10"},kok:Uc,"kok-in":{language:"Konkani",location:"India",id:1111,tag:"kok-IN",version:"Release C"},ko:Wc,"ko-kr":{language:"Korean",location:"Korea",id:1042,tag:"ko-KR",version:"Release A"},"ko-kp":{language:"Korean",location:"North Korea",id:4096,tag:"ko-KP",version:"Release 10.1"},khq:qc,"khq-ml":{language:"Koyra Chiini",location:"Mali",id:4096,tag:"khq-ML",version:"Release 10"},ses:Kc,"ses-ml":{language:"Koyraboro Senni",location:"Mali",id:4096,tag:"ses-ML",version:"Release 10"},nmg:Yc,"nmg-cm":{language:"Kwasio",location:"Cameroon",id:4096,tag:"nmg-CM",version:"Release 10"},ky:Xc,"ky-kg":{language:"Kyrgyz",location:"Kyrgyzstan",id:1088,tag:"ky-KG",version:"Release D"},"ku-arab-ir":{language:"Kurdish",location:"Perso-Arabic, Iran",id:4096,tag:"ku-Arab-IR",version:"Release 10.1"},lkt:Zc,"lkt-us":{language:"Lakota",location:"United States",id:4096,tag:"lkt-US",version:"Release 10"},lag:$c,"lag-tz":{language:"Langi",location:"Tanzania",id:4096,tag:"lag-TZ",version:"Release 10"},lo:Jc,"lo-la":{language:"Lao",location:"Lao P.D.R.",id:1108,tag:"lo-LA",version:"Release V"},lv:Qc,"lv-lv":{language:"Latvian",location:"Latvia",id:1062,tag:"lv-LV",version:"Release B"},ln:tf,"ln-ao":{language:"Lingala",location:"Angola",id:4096,tag:"ln-AO",version:"Release 10"},"ln-cf":{language:"Lingala",location:"Central African Republic",id:4096,tag:"ln-CF",version:"Release 10"},"ln-cg":{language:"Lingala",location:"Congo",id:4096,tag:"ln-CG",version:"Release 10"},"ln-cd":{language:"Lingala",location:"Congo DRC",id:4096,tag:"ln-CD",version:"Release 10"},lt:ef,"lt-lt":{language:"Lithuanian",location:"Lithuania",id:1063,tag:"lt-LT",version:"Release B"},nds:nf,"nds-de":{language:"Low German",location:"Germany",id:4096,tag:"nds-DE",version:"Release 10.2"},"nds-nl":{language:"Low German",location:"Netherlands",id:4096,tag:"nds-NL",version:"Release 10.2"},dsb:rf,"dsb-de":{language:"Lower Sorbian",location:"Germany",id:2094,tag:"dsb-DE",version:"Release V"},lu:af,"lu-cd":{language:"Luba-Katanga",location:"Congo DRC",id:4096,tag:"lu-CD",version:"Release 10"},luo:of,"luo-ke":{language:"Luo",location:"Kenya",id:4096,tag:"luo-KE",version:"Release 10"},lb:sf,"lb-lu":{language:"Luxembourgish",location:"Luxembourg",id:1134,tag:"lb-LU",version:"Release E2"},luy:uf,"luy-ke":{language:"Luyia",location:"Kenya",id:4096,tag:"luy-KE",version:"Release 10"},mk:lf,"mk-mk":{language:"Macedonian",location:"North Macedonia",id:1071,tag:"mk-MK",version:"Release C"},jmc:cf,"jmc-tz":{language:"Machame",location:"Tanzania",id:4096,tag:"jmc-TZ",version:"Release 10"},mgh:ff,"mgh-mz":{language:"Makhuwa-Meetto",location:"Mozambique",id:4096,tag:"mgh-MZ",version:"Release 10"},kde:hf,"kde-tz":{language:"Makonde",location:"Tanzania",id:4096,tag:"kde-TZ",version:"Release 10"},mg:df,"mg-mg":{language:"Malagasy",location:"Madagascar",id:4096,tag:"mg-MG",version:"Release 8.1"},ms:gf,"ms-bn":{language:"Malay",location:"Brunei Darussalam",id:2110,tag:"ms-BN",version:"Release C"},"ms-my":{language:"Malay",location:"Malaysia",id:1086,tag:"ms-MY",version:"Release C"},ml:pf,"ml-in":{language:"Malayalam",location:"India",id:1100,tag:"ml-IN",version:"Release E1"},mt:vf,"mt-mt":{language:"Maltese",location:"Malta",id:1082,tag:"mt-MT",version:"Release E1"},gv:mf,"gv-im":{language:"Manx",location:"Isle of Man",id:4096,tag:"gv-IM",version:"Release 10"},mi:yf,"mi-nz":{language:"Maori",location:"New Zealand",id:1153,tag:"mi-NZ",version:"Release E1"},arn:_f,"arn-cl":{language:"Mapudungun",location:"Chile",id:1146,tag:"arn-CL",version:"Release E2"},mr:bf,"mr-in":{language:"Marathi",location:"India",id:1102,tag:"mr-IN",version:"Release C"},mas:wf,"mas-ke":{language:"Masai",location:"Kenya",id:4096,tag:"mas-KE",version:"Release 10"},"mas-tz":{language:"Masai",location:"Tanzania",id:4096,tag:"mas-TZ",version:"Release 10"},"mzn-ir":{language:"Mazanderani",location:"Iran",id:4096,tag:"mzn-IR",version:"Release 10.1"},mer:xf,"mer-ke":{language:"Meru",location:"Kenya",id:4096,tag:"mer-KE",version:"Release 10"},mgo:kf,"mgo-cm":{language:"Meta'",location:"Cameroon",id:4096,tag:"mgo-CM",version:"Release 10"},moh:Sf,"moh-ca":{language:"Mohawk",location:"Canada",id:1148,tag:"moh-CA",version:"Release E2"},mn:Cf,"mn-cyrl":{language:"Mongolian (Cyrillic)",location:null,id:30800,tag:"mn-Cyrl",version:"Windows 7"},"mn-mn":{language:"Mongolian (Cyrillic)",location:"Mongolia",id:1104,tag:"mn-MN",version:"Release D"},"mn-mong":{language:"Mongolian (Traditional Mongolian)",location:null,id:31824,tag:"mn-Mong",version:"Windows 7"},"mn-mong-cn":{language:"Mongolian (Traditional Mongolian)",location:"People's Republic of China",id:2128,tag:"mn-Mong-CN",version:"Windows V"},"mn-mong-mn":{language:"Mongolian (Traditional Mongolian)",location:"Mongolia",id:3152,tag:"mn-Mong-MN",version:"Windows 7"},mfe:Ef,"mfe-mu":{language:"Morisyen",location:"Mauritius",id:4096,tag:"mfe-MU",version:"Release 10"},mua:Af,"mua-cm":{language:"Mundang",location:"Cameroon",id:4096,tag:"mua-CM",version:"Release 10"},nqo:Rf,"nqo-gn":{language:"N'ko",location:"Guinea",id:4096,tag:"nqo-GN",version:"Release 8.1"},naq:Mf,"naq-na":{language:"Nama",location:"Namibia",id:4096,tag:"naq-NA",version:"Release 10"},ne:Tf,"ne-in":{language:"Nepali",location:"India",id:2145,tag:"ne-IN",version:"Release 8.1"},"ne-np":{language:"Nepali",location:"Nepal",id:1121,tag:"ne-NP",version:"Release E2"},nnh:Pf,"nnh-cm":{language:"Ngiemboon",location:"Cameroon",id:4096,tag:"nnh-CM",version:"Release 10"},jgo:Of,"jgo-cm":{language:"Ngomba",location:"Cameroon",id:4096,tag:"jgo-CM",version:"Release 10"},"lrc-iq":{language:"Northern Luri",location:"Iraq",id:4096,tag:"lrc-IQ",version:"Release 10.1"},"lrc-ir":{language:"Northern Luri",location:"Iran",id:4096,tag:"lrc-IR",version:"Release 10.1"},nd:Bf,"nd-zw":{language:"North Ndebele",location:"Zimbabwe",id:4096,tag:"nd-ZW",version:"Release 10"},no:Df,nb:Nf,"nb-no":{language:"Norwegian (Bokmal)",location:"Norway",id:1044,tag:"nb-NO",version:"Release A"},nn:zf,"nn-no":{language:"Norwegian (Nynorsk)",location:"Norway",id:2068,tag:"nn-NO",version:"Release A"},"nb-sj":{language:"Norwegian Bokmål",location:"Svalbard and Jan Mayen",id:4096,tag:"nb-SJ",version:"Release 10"},nus:jf,"nus-sd":{language:"Nuer",location:"Sudan",id:4096,tag:"nus-SD",version:"Release 10"},"nus-ss":{language:"Nuer",location:"South Sudan",id:4096,tag:"nus-SS",version:"Release 10.1"},nyn:Lf,"nyn-ug":{language:"Nyankole",location:"Uganda",id:4096,tag:"nyn-UG",version:"Release 10"},oc:Ff,"oc-fr":{language:"Occitan",location:"France",id:1154,tag:"oc-FR",version:"Release V"},or:If,"or-in":{language:"Odia",location:"India",id:1096,tag:"or-IN",version:"Release V"},om:Hf,"om-et":{language:"Oromo",location:"Ethiopia",id:1138,tag:"om-ET",version:"Release 8.1"},"om-ke":{language:"Oromo",location:"Kenya",id:4096,tag:"om-KE",version:"Release 10"},os:Gf,"os-ge":{language:"Ossetian",location:"Cyrillic, Georgia",id:4096,tag:"os-GE",version:"Release 10"},"os-ru":{language:"Ossetian",location:"Cyrillic, Russia",id:4096,tag:"os-RU",version:"Release 10"},ps:Vf,"ps-af":{language:"Pashto",location:"Afghanistan",id:1123,tag:"ps-AF",version:"Release E2"},"ps-pk":{language:"Pashto",location:"Pakistan",id:4096,tag:"ps-PK",version:"Release 10.5"},fa:Uf,"fa-af":{language:"Persian",location:"Afghanistan",id:4096,tag:"fa-AF",version:"Release 10"},"fa-ir":{language:"Persian",location:"Iran",id:1065,tag:"fa-IR",version:"Release B"},pl:Wf,"pl-pl":{language:"Polish",location:"Poland",id:1045,tag:"pl-PL",version:"Release A"},pt:qf,"pt-ao":{language:"Portuguese",location:"Angola",id:4096,tag:"pt-AO",version:"Release 8.1"},"pt-br":{language:"Portuguese",location:"Brazil",id:1046,tag:"pt-BR",version:"Release A"},"pt-cv":{language:"Portuguese",location:"Cabo Verde",id:4096,tag:"pt-CV",version:"Release 10"},"pt-gq":{language:"Portuguese",location:"Equatorial Guinea",id:4096,tag:"pt-GQ",version:"Release 10.2"},"pt-gw":{language:"Portuguese",location:"Guinea-Bissau",id:4096,tag:"pt-GW",version:"Release 10"},"pt-lu":{language:"Portuguese",location:"Luxembourg",id:4096,tag:"pt-LU",version:"Release 10.2"},"pt-mo":{language:"Portuguese",location:"Macao SAR",id:4096,tag:"pt-MO",version:"Release 10"},"pt-mz":{language:"Portuguese",location:"Mozambique",id:4096,tag:"pt-MZ",version:"Release 10"},"pt-pt":{language:"Portuguese",location:"Portugal",id:2070,tag:"pt-PT",version:"Release A"},"pt-st":{language:"Portuguese",location:"São Tomé and Príncipe",id:4096,tag:"pt-ST",version:"Release 10"},"pt-ch":{language:"Portuguese",location:"Switzerland",id:4096,tag:"pt-CH",version:"Release 10.2"},"pt-tl":{language:"Portuguese",location:"Timor-Leste",id:4096,tag:"pt-TL",version:"Release 10"},"prg-001":{language:"Prussian",location:null,id:4096,tag:"prg-001",version:"Release 10.1"},"qps-ploca":{language:"Pseudo Language",location:"Pseudo locale for east Asian/complex script localization testing",id:1534,tag:"qps-ploca",version:"Release 7"},"qps-ploc":{language:"Pseudo Language",location:"Pseudo locale used for localization testing",id:1281,tag:"qps-ploc",version:"Release 7"},"qps-plocm":{language:"Pseudo Language",location:"Pseudo locale used for localization testing of mirrored locales",id:2559,tag:"qps-plocm",version:"Release 7"},pa:Kf,"pa-arab":{language:"Punjabi",location:null,id:31814,tag:"pa-Arab",version:"Release 8"},"pa-in":{language:"Punjabi",location:"India",id:1094,tag:"pa-IN",version:"Release D"},"pa-arab-pk":{language:"Punjabi",location:"Islamic Republic of Pakistan",id:2118,tag:"pa-Arab-PK",version:"Release 8"},quz:Yf,"quz-bo":{language:"Quechua",location:"Bolivia",id:1131,tag:"quz-BO",version:"Release E1"},"quz-ec":{language:"Quechua",location:"Ecuador",id:2155,tag:"quz-EC",version:"Release E1"},"quz-pe":{language:"Quechua",location:"Peru",id:3179,tag:"quz-PE",version:"Release E1"},ksh:Xf,"ksh-de":{language:"Ripuarian",location:"Germany",id:4096,tag:"ksh-DE",version:"Release 10"},ro:Zf,"ro-md":{language:"Romanian",location:"Moldova",id:2072,tag:"ro-MD",version:"Release 8.1"},"ro-ro":{language:"Romanian",location:"Romania",id:1048,tag:"ro-RO",version:"Release A"},rm:$f,"rm-ch":{language:"Romansh",location:"Switzerland",id:1047,tag:"rm-CH",version:"Release E2"},rof:Jf,"rof-tz":{language:"Rombo",location:"Tanzania",id:4096,tag:"rof-TZ",version:"Release 10"},rn:Qf,"rn-bi":{language:"Rundi",location:"Burundi",id:4096,tag:"rn-BI",version:"Release 10"},ru:th,"ru-by":{language:"Russian",location:"Belarus",id:4096,tag:"ru-BY",version:"Release 10"},"ru-kz":{language:"Russian",location:"Kazakhstan",id:4096,tag:"ru-KZ",version:"Release 10"},"ru-kg":{language:"Russian",location:"Kyrgyzstan",id:4096,tag:"ru-KG",version:"Release 10"},"ru-md":{language:"Russian",location:"Moldova",id:2073,tag:"ru-MD",version:"Release 10"},"ru-ru":{language:"Russian",location:"Russia",id:1049,tag:"ru-RU",version:"Release A"},"ru-ua":{language:"Russian",location:"Ukraine",id:4096,tag:"ru-UA",version:"Release 10"},rwk:eh,"rwk-tz":{language:"Rwa",location:"Tanzania",id:4096,tag:"rwk-TZ",version:"Release 10"},ssy:nh,"ssy-er":{language:"Saho",location:"Eritrea",id:4096,tag:"ssy-ER",version:"Release 10"},sah:ih,"sah-ru":{language:"Sakha",location:"Russia",id:1157,tag:"sah-RU",version:"Release V"},saq:rh,"saq-ke":{language:"Samburu",location:"Kenya",id:4096,tag:"saq-KE",version:"Release 10"},smn:ah,"smn-fi":{language:"Sami (Inari)",location:"Finland",id:9275,tag:"smn-FI",version:"Release E1"},smj:oh,"smj-no":{language:"Sami (Lule)",location:"Norway",id:4155,tag:"smj-NO",version:"Release E1"},"smj-se":{language:"Sami (Lule)",location:"Sweden",id:5179,tag:"smj-SE",version:"Release E1"},se:sh,"se-fi":{language:"Sami (Northern)",location:"Finland",id:3131,tag:"se-FI",version:"Release E1"},"se-no":{language:"Sami (Northern)",location:"Norway",id:1083,tag:"se-NO",version:"Release E1"},"se-se":{language:"Sami (Northern)",location:"Sweden",id:2107,tag:"se-SE",version:"Release E1"},sms:uh,"sms-fi":{language:"Sami (Skolt)",location:"Finland",id:8251,tag:"sms-FI",version:"Release E1"},sma:lh,"sma-no":{language:"Sami (Southern)",location:"Norway",id:6203,tag:"sma-NO",version:"Release E1"},"sma-se":{language:"Sami (Southern)",location:"Sweden",id:7227,tag:"sma-SE",version:"Release E1"},sg:ch,"sg-cf":{language:"Sango",location:"Central African Republic",id:4096,tag:"sg-CF",version:"Release 10"},sbp:fh,"sbp-tz":{language:"Sangu",location:"Tanzania",id:4096,tag:"sbp-TZ",version:"Release 10"},sa:hh,"sa-in":{language:"Sanskrit",location:"India",id:1103,tag:"sa-IN",version:"Release C"},gd:dh,"gd-gb":{language:"Scottish Gaelic",location:"United Kingdom",id:1169,tag:"gd-GB",version:"Release 7"},seh:gh,"seh-mz":{language:"Sena",location:"Mozambique",id:4096,tag:"seh-MZ",version:"Release 10"},"sr-cyrl":{language:"Serbian (Cyrillic)",location:null,id:27674,tag:"sr-Cyrl",version:"Windows 7"},"sr-cyrl-ba":{language:"Serbian (Cyrillic)",location:"Bosnia and Herzegovina",id:7194,tag:"sr-Cyrl-BA",version:"Release E1"},"sr-cyrl-me":{language:"Serbian (Cyrillic)",location:"Montenegro",id:12314,tag:"sr-Cyrl-ME",version:"Release 7"},"sr-cyrl-rs":{language:"Serbian (Cyrillic)",location:"Serbia",id:10266,tag:"sr-Cyrl-RS",version:"Release 7"},"sr-cyrl-cs":{language:"Serbian (Cyrillic)",location:"Serbia and Montenegro (Former)",id:3098,tag:"sr-Cyrl-CS",version:"Release B"},"sr-latn":{language:"Serbian (Latin)",location:null,id:28698,tag:"sr-Latn",version:"Windows 7"},sr:ph,"sr-latn-ba":{language:"Serbian (Latin)",location:"Bosnia and Herzegovina",id:6170,tag:"sr-Latn-BA",version:"Release E1"},"sr-latn-me":{language:"Serbian (Latin)",location:"Montenegro",id:11290,tag:"sr-Latn-ME",version:"Release 7"},"sr-latn-rs":{language:"Serbian (Latin)",location:"Serbia",id:9242,tag:"sr-Latn-RS",version:"Release 7"},"sr-latn-cs":{language:"Serbian (Latin)",location:"Serbia and Montenegro (Former)",id:2074,tag:"sr-Latn-CS",version:"Release B"},nso:vh,"nso-za":{language:"Sesotho sa Leboa",location:"South Africa",id:1132,tag:"nso-ZA",version:"Release E1"},tn:mh,"tn-bw":{language:"Setswana",location:"Botswana",id:2098,tag:"tn-BW",version:"Release 8"},"tn-za":{language:"Setswana",location:"South Africa",id:1074,tag:"tn-ZA",version:"Release E1"},ksb:yh,"ksb-tz":{language:"Shambala",location:"Tanzania",id:4096,tag:"ksb-TZ",version:"Release 10"},sn:_h,"sn-latn":{language:"Shona",location:"Latin",id:4096,tag:"sn-Latn",version:"Release 8.1"},"sn-latn-zw":{language:"Shona",location:"Zimbabwe",id:4096,tag:"sn-Latn-ZW",version:"Release 8.1"},sd:bh,"sd-arab":{language:"Sindhi",location:null,id:31833,tag:"sd-Arab",version:"Release 8"},"sd-arab-pk":{language:"Sindhi",location:"Islamic Republic of Pakistan",id:2137,tag:"sd-Arab-PK",version:"Release 8"},si:wh,"si-lk":{language:"Sinhala",location:"Sri Lanka",id:1115,tag:"si-LK",version:"Release V"},sk:xh,"sk-sk":{language:"Slovak",location:"Slovakia",id:1051,tag:"sk-SK",version:"Release A"},sl:kh,"sl-si":{language:"Slovenian",location:"Slovenia",id:1060,tag:"sl-SI",version:"Release A"},xog:Sh,"xog-ug":{language:"Soga",location:"Uganda",id:4096,tag:"xog-UG",version:"Release 10"},so:Ch,"so-dj":{language:"Somali",location:"Djibouti",id:4096,tag:"so-DJ",version:"Release 10"},"so-et":{language:"Somali",location:"Ethiopia",id:4096,tag:"so-ET",version:"Release 10"},"so-ke":{language:"Somali",location:"Kenya",id:4096,tag:"so-KE",version:"Release 10"},"so-so":{language:"Somali",location:"Somalia",id:1143,tag:"so-SO",version:"Release 8.1"},st:Eh,"st-za":{language:"Sotho",location:"South Africa",id:1072,tag:"st-ZA",version:"Release 8.1"},nr:Ah,"nr-za":{language:"South Ndebele",location:"South Africa",id:4096,tag:"nr-ZA",version:"Release 10"},"st-ls":{language:"Southern Sotho",location:"Lesotho",id:4096,tag:"st-LS",version:"Release 10"},es:Rh,"es-ar":{language:"Spanish",location:"Argentina",id:11274,tag:"es-AR",version:"Release B"},"es-bz":{language:"Spanish",location:"Belize",id:4096,tag:"es-BZ",version:"Release 10.3"},"es-ve":{language:"Spanish",location:"Bolivarian Republic of Venezuela",id:8202,tag:"es-VE",version:"Release B"},"es-bo":{language:"Spanish",location:"Bolivia",id:16394,tag:"es-BO",version:"Release B"},"es-br":{language:"Spanish",location:"Brazil",id:4096,tag:"es-BR",version:"Release 10.2"},"es-cl":{language:"Spanish",location:"Chile",id:13322,tag:"es-CL",version:"Release B"},"es-co":{language:"Spanish",location:"Colombia",id:9226,tag:"es-CO",version:"Release B"},"es-cr":{language:"Spanish",location:"Costa Rica",id:5130,tag:"es-CR",version:"Release B"},"es-cu":{language:"Spanish",location:"Cuba",id:23562,tag:"es-CU",version:"Release 10"},"es-do":{language:"Spanish",location:"Dominican Republic",id:7178,tag:"es-DO",version:"Release B"},"es-ec":{language:"Spanish",location:"Ecuador",id:12298,tag:"es-EC",version:"Release B"},"es-sv":{language:"Spanish",location:"El Salvador",id:17418,tag:"es-SV",version:"Release B"},"es-gq":{language:"Spanish",location:"Equatorial Guinea",id:4096,tag:"es-GQ",version:"Release 10"},"es-gt":{language:"Spanish",location:"Guatemala",id:4106,tag:"es-GT",version:"Release B"},"es-hn":{language:"Spanish",location:"Honduras",id:18442,tag:"es-HN",version:"Release B"},"es-419":{language:"Spanish",location:"Latin America",id:22538,tag:"es-419",version:"Release 8.1"},"es-mx":{language:"Spanish",location:"Mexico",id:2058,tag:"es-MX",version:"Release A"},"es-ni":{language:"Spanish",location:"Nicaragua",id:19466,tag:"es-NI",version:"Release B"},"es-pa":{language:"Spanish",location:"Panama",id:6154,tag:"es-PA",version:"Release B"},"es-py":{language:"Spanish",location:"Paraguay",id:15370,tag:"es-PY",version:"Release B"},"es-pe":{language:"Spanish",location:"Peru",id:10250,tag:"es-PE",version:"Release B"},"es-ph":{language:"Spanish",location:"Philippines",id:4096,tag:"es-PH",version:"Release 10"},"es-pr":{language:"Spanish",location:"Puerto Rico",id:20490,tag:"es-PR",version:"Release B"},"es-es_tradnl":{language:"Spanish",location:"Spain",id:1034,tag:"es-ES_tradnl",version:"Release A"},"es-es":{language:"Spanish",location:"Spain",id:3082,tag:"es-ES",version:"Release A"},"es-us":{language:"Spanish",location:"UnitedStates",id:21514,tag:"es-US",version:"Release V"},"es-uy":{language:"Spanish",location:"Uruguay",id:14346,tag:"es-UY",version:"Release B"},zgh:Mh,"zgh-tfng-ma":{language:"Standard Moroccan Tamazight",location:"Morocco",id:4096,tag:"zgh-Tfng-MA",version:"Release 8.1"},"zgh-tfng":{language:"Standard Moroccan Tamazight",location:"Tifinagh",id:4096,tag:"zgh-Tfng",version:"Release 8.1"},ss:Th,"ss-za":{language:"Swati",location:"South Africa",id:4096,tag:"ss-ZA",version:"Release 10"},"ss-sz":{language:"Swati",location:"Swaziland",id:4096,tag:"ss-SZ",version:"Release 10"},sv:Ph,"sv-ax":{language:"Swedish",location:"Åland Islands",id:4096,tag:"sv-AX",version:"Release 10"},"sv-fi":{language:"Swedish",location:"Finland",id:2077,tag:"sv-FI",version:"Release B"},"sv-se":{language:"Swedish",location:"Sweden",id:1053,tag:"sv-SE",version:"Release A"},syr:Oh,"syr-sy":{language:"Syriac",location:"Syria",id:1114,tag:"syr-SY",version:"Release D"},shi:Bh,"shi-tfng":{language:"Tachelhit",location:"Tifinagh",id:4096,tag:"shi-Tfng",version:"Release 10"},"shi-tfng-ma":{language:"Tachelhit",location:"Tifinagh, Morocco",id:4096,tag:"shi-Tfng-MA",version:"Release 10"},"shi-latn":{language:"Tachelhit (Latin)",location:null,id:4096,tag:"shi-Latn",version:"Release 10"},"shi-latn-ma":{language:"Tachelhit (Latin)",location:"Morocco",id:4096,tag:"shi-Latn-MA",version:"Release 10"},dav:Dh,"dav-ke":{language:"Taita",location:"Kenya",id:4096,tag:"dav-KE",version:"Release 10"},tg:Nh,"tg-cyrl":{language:"Tajik (Cyrillic)",location:null,id:31784,tag:"tg-Cyrl",version:"Windows 7"},"tg-cyrl-tj":{language:"Tajik (Cyrillic)",location:"Tajikistan",id:1064,tag:"tg-Cyrl-TJ",version:"Release V"},tzm:zh,"tzm-latn":{language:"Tamazight (Latin)",location:null,id:31839,tag:"tzm-Latn",version:"Windows 7"},"tzm-latn-dz":{language:"Tamazight (Latin)",location:"Algeria",id:2143,tag:"tzm-Latn-DZ",version:"Release V"},ta:jh,"ta-in":{language:"Tamil",location:"India",id:1097,tag:"ta-IN",version:"Release C"},"ta-my":{language:"Tamil",location:"Malaysia",id:4096,tag:"ta-MY",version:"Release 10"},"ta-sg":{language:"Tamil",location:"Singapore",id:4096,tag:"ta-SG",version:"Release 10"},"ta-lk":{language:"Tamil",location:"Sri Lanka",id:2121,tag:"ta-LK",version:"Release 8"},twq:Lh,"twq-ne":{language:"Tasawaq",location:"Niger",id:4096,tag:"twq-NE",version:"Release 10"},tt:Fh,"tt-ru":{language:"Tatar",location:"Russia",id:1092,tag:"tt-RU",version:"Release D"},te:Ih,"te-in":{language:"Telugu",location:"India",id:1098,tag:"te-IN",version:"Release D"},teo:Hh,"teo-ke":{language:"Teso",location:"Kenya",id:4096,tag:"teo-KE",version:"Release 10"},"teo-ug":{language:"Teso",location:"Uganda",id:4096,tag:"teo-UG",version:"Release 10"},th:Gh,"th-th":{language:"Thai",location:"Thailand",id:1054,tag:"th-TH",version:"Release B"},bo:Vh,"bo-in":{language:"Tibetan",location:"India",id:4096,tag:"bo-IN",version:"Release 10"},"bo-cn":{language:"Tibetan",location:"People's Republic of China",id:1105,tag:"bo-CN",version:"Release V"},tig:Uh,"tig-er":{language:"Tigre",location:"Eritrea",id:4096,tag:"tig-ER",version:"Release 10"},ti:Wh,"ti-er":{language:"Tigrinya",location:"Eritrea",id:2163,tag:"ti-ER",version:"Release 8"},"ti-et":{language:"Tigrinya",location:"Ethiopia",id:1139,tag:"ti-ET",version:"Release 8"},to:qh,"to-to":{language:"Tongan",location:"Tonga",id:4096,tag:"to-TO",version:"Release 10"},ts:Kh,"ts-za":{language:"Tsonga",location:"South Africa",id:1073,tag:"ts-ZA",version:"Release 8.1"},tr:Yh,"tr-cy":{language:"Turkish",location:"Cyprus",id:4096,tag:"tr-CY",version:"Release 10"},"tr-tr":{language:"Turkish",location:"Turkey",id:1055,tag:"tr-TR",version:"Release A"},tk:Xh,"tk-tm":{language:"Turkmen",location:"Turkmenistan",id:1090,tag:"tk-TM",version:"Release V"},uk:Zh,"uk-ua":{language:"Ukrainian",location:"Ukraine",id:1058,tag:"uk-UA",version:"Release B"},hsb:$h,"hsb-de":{language:"Upper Sorbian",location:"Germany",id:1070,tag:"hsb-DE",version:"Release V"},ur:Jh,"ur-in":{language:"Urdu",location:"India",id:2080,tag:"ur-IN",version:"Release 8.1"},"ur-pk":{language:"Urdu",location:"Islamic Republic of Pakistan",id:1056,tag:"ur-PK",version:"Release C"},ug:Qh,"ug-cn":{language:"Uyghur",location:"People's Republic of China",id:1152,tag:"ug-CN",version:"Release V"},"uz-arab":{language:"Uzbek",location:"Perso-Arabic",id:4096,tag:"uz-Arab",version:"Release 10"},"uz-arab-af":{language:"Uzbek",location:"Perso-Arabic, Afghanistan",id:4096,tag:"uz-Arab-AF",version:"Release 10"},"uz-cyrl":{language:"Uzbek (Cyrillic)",location:null,id:30787,tag:"uz-Cyrl",version:"Windows 7"},"uz-cyrl-uz":{language:"Uzbek (Cyrillic)",location:"Uzbekistan",id:2115,tag:"uz-Cyrl-UZ",version:"Release C"},uz:td,"uz-latn":{language:"Uzbek (Latin)",location:null,id:31811,tag:"uz-Latn",version:"Windows7"},"uz-latn-uz":{language:"Uzbek (Latin)",location:"Uzbekistan",id:1091,tag:"uz-Latn-UZ",version:"Release C"},vai:ed,"vai-vaii":{language:"Vai",location:null,id:4096,tag:"vai-Vaii",version:"Release 10"},"vai-vaii-lr":{language:"Vai",location:"Liberia",id:4096,tag:"vai-Vaii-LR",version:"Release 10"},"vai-latn-lr":{language:"Vai (Latin)",location:"Liberia",id:4096,tag:"vai-Latn-LR",version:"Release 10"},"vai-latn":{language:"Vai (Latin)",location:null,id:4096,tag:"vai-Latn",version:"Release 10"},"ca-es-":{language:"Valencian",location:"Spain",id:2051,tag:"ca-ES-",version:"Release 8"},ve:nd,"ve-za":{language:"Venda",location:"South Africa",id:1075,tag:"ve-ZA",version:"Release 10"},vi:id,"vi-vn":{language:"Vietnamese",location:"Vietnam",id:1066,tag:"vi-VN",version:"Release B"},vo:rd,"vo-001":{language:"Volapük",location:"World",id:4096,tag:"vo-001",version:"Release 10"},vun:ad,"vun-tz":{language:"Vunjo",location:"Tanzania",id:4096,tag:"vun-TZ",version:"Release 10"},wae:od,"wae-ch":{language:"Walser",location:"Switzerland",id:4096,tag:"wae-CH",version:"Release 10"},cy:sd,"cy-gb":{language:"Welsh",location:"United Kingdom",id:1106,tag:"cy-GB",version:"ReleaseE1"},wal:ud,"wal-et":{language:"Wolaytta",location:"Ethiopia",id:4096,tag:"wal-ET",version:"Release 10"},wo:ld,"wo-sn":{language:"Wolof",location:"Senegal",id:1160,tag:"wo-SN",version:"Release V"},xh:cd,"xh-za":{language:"Xhosa",location:"South Africa",id:1076,tag:"xh-ZA",version:"Release E1"},yav:fd,"yav-cm":{language:"Yangben",location:"Cameroon",id:4096,tag:"yav-CM",version:"Release 10"},ii:hd,"ii-cn":{language:"Yi",location:"People's Republic of China",id:1144,tag:"ii-CN",version:"Release V"},yo:dd,"yo-bj":{language:"Yoruba",location:"Benin",id:4096,tag:"yo-BJ",version:"Release 10"},"yo-ng":{language:"Yoruba",location:"Nigeria",id:1130,tag:"yo-NG",version:"Release V"},dje:gd,"dje-ne":{language:"Zarma",location:"Niger",id:4096,tag:"dje-NE",version:"Release 10"},zu:pd,"zu-za":{language:"Zulu",location:"South Africa",id:1077,tag:"zu-ZA",version:"Release E1"}};var md={name:"Abkhazian",names:["Abkhazian"],"iso639-2":"abk","iso639-1":"ab"};var yd={name:"Achinese",names:["Achinese"],"iso639-2":"ace","iso639-1":null};var _d={name:"Acoli",names:["Acoli"],"iso639-2":"ach","iso639-1":null};var bd={name:"Adangme",names:["Adangme"],"iso639-2":"ada","iso639-1":null};var wd={name:"Adygei",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var xd={name:"Adyghe",names:["Adyghe","Adygei"],"iso639-2":"ady","iso639-1":null};var kd={name:"Afar",names:["Afar"],"iso639-2":"aar","iso639-1":"aa"};var Sd={name:"Afrihili",names:["Afrihili"],"iso639-2":"afh","iso639-1":null};var Cd={name:"Afrikaans",names:["Afrikaans"],"iso639-2":"afr","iso639-1":"af"};var Ed={name:"Ainu",names:["Ainu"],"iso639-2":"ain","iso639-1":null};var Ad={name:"Akan",names:["Akan"],"iso639-2":"aka","iso639-1":"ak"};var Rd={name:"Akkadian",names:["Akkadian"],"iso639-2":"akk","iso639-1":null};var Md={name:"Albanian",names:["Albanian"],"iso639-2":"alb/sqi","iso639-1":"sq"};var Td={name:"Alemannic",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var Pd={name:"Aleut",names:["Aleut"],"iso639-2":"ale","iso639-1":null};var Od={name:"Alsatian",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null};var Bd={name:"Amharic",names:["Amharic"],"iso639-2":"amh","iso639-1":"am"};var Dd={name:"Angika",names:["Angika"],"iso639-2":"anp","iso639-1":null};var Nd={name:"Arabic",names:["Arabic"],"iso639-2":"ara","iso639-1":"ar"};var zd={name:"Aragonese",names:["Aragonese"],"iso639-2":"arg","iso639-1":"an"};var jd={name:"Arapaho",names:["Arapaho"],"iso639-2":"arp","iso639-1":null};var Ld={name:"Arawak",names:["Arawak"],"iso639-2":"arw","iso639-1":null};var Fd={name:"Armenian",names:["Armenian"],"iso639-2":"arm/hye","iso639-1":"hy"};var Id={name:"Aromanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var Hd={name:"Arumanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null};var Gd={name:"Assamese",names:["Assamese"],"iso639-2":"asm","iso639-1":"as"};var Vd={name:"Asturian",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var Ud={name:"Asturleonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var Wd={name:"Avaric",names:["Avaric"],"iso639-2":"ava","iso639-1":"av"};var qd={name:"Avestan",names:["Avestan"],"iso639-2":"ave","iso639-1":"ae"};var Kd={name:"Awadhi",names:["Awadhi"],"iso639-2":"awa","iso639-1":null};var Yd={name:"Aymara",names:["Aymara"],"iso639-2":"aym","iso639-1":"ay"};var Xd={name:"Azerbaijani",names:["Azerbaijani"],"iso639-2":"aze","iso639-1":"az"};var Zd={name:"Bable",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var $d={name:"Balinese",names:["Balinese"],"iso639-2":"ban","iso639-1":null};var Jd={name:"Baluchi",names:["Baluchi"],"iso639-2":"bal","iso639-1":null};var Qd={name:"Bambara",names:["Bambara"],"iso639-2":"bam","iso639-1":"bm"};var tg={name:"Basa",names:["Basa"],"iso639-2":"bas","iso639-1":null};var eg={name:"Bashkir",names:["Bashkir"],"iso639-2":"bak","iso639-1":"ba"};var ng={name:"Basque",names:["Basque"],"iso639-2":"baq/eus","iso639-1":"eu"};var ig={name:"Bedawiyet",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var rg={name:"Beja",names:["Beja","Bedawiyet"],"iso639-2":"bej","iso639-1":null};var ag={name:"Belarusian",names:["Belarusian"],"iso639-2":"bel","iso639-1":"be"};var og={name:"Bemba",names:["Bemba"],"iso639-2":"bem","iso639-1":null};var sg={name:"Bengali",names:["Bengali"],"iso639-2":"ben","iso639-1":"bn"};var ug={name:"Bhojpuri",names:["Bhojpuri"],"iso639-2":"bho","iso639-1":null};var lg={name:"Bikol",names:["Bikol"],"iso639-2":"bik","iso639-1":null};var cg={name:"Bilin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var fg={name:"Bini",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var hg={name:"Bislama",names:["Bislama"],"iso639-2":"bis","iso639-1":"bi"};var dg={name:"Blin",names:["Blin","Bilin"],"iso639-2":"byn","iso639-1":null};var gg={name:"Bliss",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var pg={name:"Blissymbolics",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var vg={name:"Blissymbols",names:["Blissymbols","Blissymbolics","Bliss"],"iso639-2":"zbl","iso639-1":null};var mg={name:"Bosnian",names:["Bosnian"],"iso639-2":"bos","iso639-1":"bs"};var yg={name:"Braj",names:["Braj"],"iso639-2":"bra","iso639-1":null};var _g={name:"Breton",names:["Breton"],"iso639-2":"bre","iso639-1":"br"};var bg={name:"Buginese",names:["Buginese"],"iso639-2":"bug","iso639-1":null};var wg={name:"Bulgarian",names:["Bulgarian"],"iso639-2":"bul","iso639-1":"bg"};var xg={name:"Buriat",names:["Buriat"],"iso639-2":"bua","iso639-1":null};var kg={name:"Burmese",names:["Burmese"],"iso639-2":"bur/mya","iso639-1":"my"};var Sg={name:"Caddo",names:["Caddo"],"iso639-2":"cad","iso639-1":null};var Cg={name:"Castilian",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var Eg={name:"Catalan",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var Ag={name:"Cebuano",names:["Cebuano"],"iso639-2":"ceb","iso639-1":null};var Rg={name:"Chagatai",names:["Chagatai"],"iso639-2":"chg","iso639-1":null};var Mg={name:"Chamorro",names:["Chamorro"],"iso639-2":"cha","iso639-1":"ch"};var Tg={name:"Chechen",names:["Chechen"],"iso639-2":"che","iso639-1":"ce"};var Pg={name:"Cherokee",names:["Cherokee"],"iso639-2":"chr","iso639-1":null};var Og={name:"Chewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var Bg={name:"Cheyenne",names:["Cheyenne"],"iso639-2":"chy","iso639-1":null};var Dg={name:"Chibcha",names:["Chibcha"],"iso639-2":"chb","iso639-1":null};var Ng={name:"Chichewa",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var zg={name:"Chinese",names:["Chinese"],"iso639-2":"chi/zho","iso639-1":"zh"};var jg={name:"Chipewyan",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null};var Lg={name:"Choctaw",names:["Choctaw"],"iso639-2":"cho","iso639-1":null};var Fg={name:"Chuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var Ig={name:"Chuukese",names:["Chuukese"],"iso639-2":"chk","iso639-1":null};var Hg={name:"Chuvash",names:["Chuvash"],"iso639-2":"chv","iso639-1":"cv"};var Gg={name:"Coptic",names:["Coptic"],"iso639-2":"cop","iso639-1":null};var Vg={name:"Cornish",names:["Cornish"],"iso639-2":"cor","iso639-1":"kw"};var Ug={name:"Corsican",names:["Corsican"],"iso639-2":"cos","iso639-1":"co"};var Wg={name:"Cree",names:["Cree"],"iso639-2":"cre","iso639-1":"cr"};var qg={name:"Creek",names:["Creek"],"iso639-2":"mus","iso639-1":null};var Kg={name:"Croatian",names:["Croatian"],"iso639-2":"hrv","iso639-1":"hr"};var Yg={name:"Czech",names:["Czech"],"iso639-2":"cze/ces","iso639-1":"cs"};var Xg={name:"Dakota",names:["Dakota"],"iso639-2":"dak","iso639-1":null};var Zg={name:"Danish",names:["Danish"],"iso639-2":"dan","iso639-1":"da"};var $g={name:"Dargwa",names:["Dargwa"],"iso639-2":"dar","iso639-1":null};var Jg={name:"Delaware",names:["Delaware"],"iso639-2":"del","iso639-1":null};var Qg={name:"Dhivehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var tp={name:"Dimili",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var ep={name:"Dimli",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var np={name:"Dinka",names:["Dinka"],"iso639-2":"din","iso639-1":null};var ip={name:"Divehi",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var rp={name:"Dogri",names:["Dogri"],"iso639-2":"doi","iso639-1":null};var ap={name:"Dogrib",names:["Dogrib"],"iso639-2":"dgr","iso639-1":null};var op={name:"Duala",names:["Duala"],"iso639-2":"dua","iso639-1":null};var sp={name:"Dutch",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var up={name:"Dyula",names:["Dyula"],"iso639-2":"dyu","iso639-1":null};var lp={name:"Dzongkha",names:["Dzongkha"],"iso639-2":"dzo","iso639-1":"dz"};var cp={name:"Edo",names:["Bini","Edo"],"iso639-2":"bin","iso639-1":null};var fp={name:"Efik",names:["Efik"],"iso639-2":"efi","iso639-1":null};var hp={name:"Ekajuk",names:["Ekajuk"],"iso639-2":"eka","iso639-1":null};var dp={name:"Elamite",names:["Elamite"],"iso639-2":"elx","iso639-1":null};var gp={name:"English",names:["English"],"iso639-2":"eng","iso639-1":"en"};var pp={name:"Erzya",names:["Erzya"],"iso639-2":"myv","iso639-1":null};var vp={name:"Esperanto",names:["Esperanto"],"iso639-2":"epo","iso639-1":"eo"};var mp={name:"Estonian",names:["Estonian"],"iso639-2":"est","iso639-1":"et"};var yp={name:"Ewe",names:["Ewe"],"iso639-2":"ewe","iso639-1":"ee"};var _p={name:"Ewondo",names:["Ewondo"],"iso639-2":"ewo","iso639-1":null};var bp={name:"Fang",names:["Fang"],"iso639-2":"fan","iso639-1":null};var wp={name:"Fanti",names:["Fanti"],"iso639-2":"fat","iso639-1":null};var xp={name:"Faroese",names:["Faroese"],"iso639-2":"fao","iso639-1":"fo"};var kp={name:"Fijian",names:["Fijian"],"iso639-2":"fij","iso639-1":"fj"};var Sp={name:"Filipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var Cp={name:"Finnish",names:["Finnish"],"iso639-2":"fin","iso639-1":"fi"};var Ep={name:"Flemish",names:["Dutch","Flemish"],"iso639-2":"dut/nld","iso639-1":"nl"};var Ap={name:"Fon",names:["Fon"],"iso639-2":"fon","iso639-1":null};var Rp={name:"French",names:["French"],"iso639-2":"fre/fra","iso639-1":"fr"};var Mp={name:"Friulian",names:["Friulian"],"iso639-2":"fur","iso639-1":null};var Tp={name:"Fulah",names:["Fulah"],"iso639-2":"ful","iso639-1":"ff"};var Pp={name:"Ga",names:["Ga"],"iso639-2":"gaa","iso639-1":null};var Op={name:"Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"};var Bp={name:"Galician",names:["Galician"],"iso639-2":"glg","iso639-1":"gl"};var Dp={name:"Ganda",names:["Ganda"],"iso639-2":"lug","iso639-1":"lg"};var Np={name:"Gayo",names:["Gayo"],"iso639-2":"gay","iso639-1":null};var zp={name:"Gbaya",names:["Gbaya"],"iso639-2":"gba","iso639-1":null};var jp={name:"Geez",names:["Geez"],"iso639-2":"gez","iso639-1":null};var Lp={name:"Georgian",names:["Georgian"],"iso639-2":"geo/kat","iso639-1":"ka"};var Fp={name:"German",names:["German"],"iso639-2":"ger/deu","iso639-1":"de"};var Ip={name:"Gikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var Hp={name:"Gilbertese",names:["Gilbertese"],"iso639-2":"gil","iso639-1":null};var Gp={name:"Gondi",names:["Gondi"],"iso639-2":"gon","iso639-1":null};var Vp={name:"Gorontalo",names:["Gorontalo"],"iso639-2":"gor","iso639-1":null};var Up={name:"Gothic",names:["Gothic"],"iso639-2":"got","iso639-1":null};var Wp={name:"Grebo",names:["Grebo"],"iso639-2":"grb","iso639-1":null};var qp={name:"Greenlandic",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var Kp={name:"Guarani",names:["Guarani"],"iso639-2":"grn","iso639-1":"gn"};var Yp={name:"Gujarati",names:["Gujarati"],"iso639-2":"guj","iso639-1":"gu"};var Xp={name:"Haida",names:["Haida"],"iso639-2":"hai","iso639-1":null};var Zp={name:"Haitian",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"};var $p={name:"Hausa",names:["Hausa"],"iso639-2":"hau","iso639-1":"ha"};var Jp={name:"Hawaiian",names:["Hawaiian"],"iso639-2":"haw","iso639-1":null};var Qp={name:"Hebrew",names:["Hebrew"],"iso639-2":"heb","iso639-1":"he"};var tv={name:"Herero",names:["Herero"],"iso639-2":"her","iso639-1":"hz"};var ev={name:"Hiligaynon",names:["Hiligaynon"],"iso639-2":"hil","iso639-1":null};var nv={name:"Hindi",names:["Hindi"],"iso639-2":"hin","iso639-1":"hi"};var iv={name:"Hittite",names:["Hittite"],"iso639-2":"hit","iso639-1":null};var rv={name:"Hmong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var av={name:"Hungarian",names:["Hungarian"],"iso639-2":"hun","iso639-1":"hu"};var ov={name:"Hupa",names:["Hupa"],"iso639-2":"hup","iso639-1":null};var sv={name:"Iban",names:["Iban"],"iso639-2":"iba","iso639-1":null};var uv={name:"Icelandic",names:["Icelandic"],"iso639-2":"ice/isl","iso639-1":"is"};var lv={name:"Ido",names:["Ido"],"iso639-2":"ido","iso639-1":"io"};var cv={name:"Igbo",names:["Igbo"],"iso639-2":"ibo","iso639-1":"ig"};var fv={name:"Iloko",names:["Iloko"],"iso639-2":"ilo","iso639-1":null};var hv={name:"Indonesian",names:["Indonesian"],"iso639-2":"ind","iso639-1":"id"};var dv={name:"Ingush",names:["Ingush"],"iso639-2":"inh","iso639-1":null};var gv={name:"Interlingue",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var pv={name:"Inuktitut",names:["Inuktitut"],"iso639-2":"iku","iso639-1":"iu"};var vv={name:"Inupiaq",names:["Inupiaq"],"iso639-2":"ipk","iso639-1":"ik"};var mv={name:"Irish",names:["Irish"],"iso639-2":"gle","iso639-1":"ga"};var yv={name:"Italian",names:["Italian"],"iso639-2":"ita","iso639-1":"it"};var _v={name:"Japanese",names:["Japanese"],"iso639-2":"jpn","iso639-1":"ja"};var bv={name:"Javanese",names:["Javanese"],"iso639-2":"jav","iso639-1":"jv"};var wv={name:"Jingpho",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var xv={name:"Kabardian",names:["Kabardian"],"iso639-2":"kbd","iso639-1":null};var kv={name:"Kabyle",names:["Kabyle"],"iso639-2":"kab","iso639-1":null};var Sv={name:"Kachin",names:["Kachin","Jingpho"],"iso639-2":"kac","iso639-1":null};var Cv={name:"Kalaallisut",names:["Kalaallisut","Greenlandic"],"iso639-2":"kal","iso639-1":"kl"};var Ev={name:"Kalmyk",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var Av={name:"Kamba",names:["Kamba"],"iso639-2":"kam","iso639-1":null};var Rv={name:"Kannada",names:["Kannada"],"iso639-2":"kan","iso639-1":"kn"};var Mv={name:"Kanuri",names:["Kanuri"],"iso639-2":"kau","iso639-1":"kr"};var Tv={name:"Kapampangan",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var Pv={name:"Karelian",names:["Karelian"],"iso639-2":"krl","iso639-1":null};var Ov={name:"Kashmiri",names:["Kashmiri"],"iso639-2":"kas","iso639-1":"ks"};var Bv={name:"Kashubian",names:["Kashubian"],"iso639-2":"csb","iso639-1":null};var Dv={name:"Kawi",names:["Kawi"],"iso639-2":"kaw","iso639-1":null};var Nv={name:"Kazakh",names:["Kazakh"],"iso639-2":"kaz","iso639-1":"kk"};var zv={name:"Khasi",names:["Khasi"],"iso639-2":"kha","iso639-1":null};var jv={name:"Khotanese",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var Lv={name:"Kikuyu",names:["Kikuyu","Gikuyu"],"iso639-2":"kik","iso639-1":"ki"};var Fv={name:"Kimbundu",names:["Kimbundu"],"iso639-2":"kmb","iso639-1":null};var Iv={name:"Kinyarwanda",names:["Kinyarwanda"],"iso639-2":"kin","iso639-1":"rw"};var Hv={name:"Kirdki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var Gv={name:"Kirghiz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var Vv={name:"Kirmanjki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var Uv={name:"Klingon",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null};var Wv={name:"Komi",names:["Komi"],"iso639-2":"kom","iso639-1":"kv"};var qv={name:"Kongo",names:["Kongo"],"iso639-2":"kon","iso639-1":"kg"};var Kv={name:"Konkani",names:["Konkani"],"iso639-2":"kok","iso639-1":null};var Yv={name:"Korean",names:["Korean"],"iso639-2":"kor","iso639-1":"ko"};var Xv={name:"Kosraean",names:["Kosraean"],"iso639-2":"kos","iso639-1":null};var Zv={name:"Kpelle",names:["Kpelle"],"iso639-2":"kpe","iso639-1":null};var $v={name:"Kuanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var Jv={name:"Kumyk",names:["Kumyk"],"iso639-2":"kum","iso639-1":null};var Qv={name:"Kurdish",names:["Kurdish"],"iso639-2":"kur","iso639-1":"ku"};var tm={name:"Kurukh",names:["Kurukh"],"iso639-2":"kru","iso639-1":null};var em={name:"Kutenai",names:["Kutenai"],"iso639-2":"kut","iso639-1":null};var nm={name:"Kwanyama",names:["Kuanyama","Kwanyama"],"iso639-2":"kua","iso639-1":"kj"};var im={name:"Kyrgyz",names:["Kirghiz","Kyrgyz"],"iso639-2":"kir","iso639-1":"ky"};var rm={name:"Ladino",names:["Ladino"],"iso639-2":"lad","iso639-1":null};var am={name:"Lahnda",names:["Lahnda"],"iso639-2":"lah","iso639-1":null};var om={name:"Lamba",names:["Lamba"],"iso639-2":"lam","iso639-1":null};var sm={name:"Lao",names:["Lao"],"iso639-2":"lao","iso639-1":"lo"};var um={name:"Latin",names:["Latin"],"iso639-2":"lat","iso639-1":"la"};var lm={name:"Latvian",names:["Latvian"],"iso639-2":"lav","iso639-1":"lv"};var cm={name:"Leonese",names:["Asturian","Bable","Leonese","Asturleonese"],"iso639-2":"ast","iso639-1":null};var fm={name:"Letzeburgesch",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var hm={name:"Lezghian",names:["Lezghian"],"iso639-2":"lez","iso639-1":null};var dm={name:"Limburgan",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var gm={name:"Limburger",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var pm={name:"Limburgish",names:["Limburgan","Limburger","Limburgish"],"iso639-2":"lim","iso639-1":"li"};var vm={name:"Lingala",names:["Lingala"],"iso639-2":"lin","iso639-1":"ln"};var mm={name:"Lithuanian",names:["Lithuanian"],"iso639-2":"lit","iso639-1":"lt"};var ym={name:"Lojban",names:["Lojban"],"iso639-2":"jbo","iso639-1":null};var _m={name:"Lozi",names:["Lozi"],"iso639-2":"loz","iso639-1":null};var bm={name:"Luiseno",names:["Luiseno"],"iso639-2":"lui","iso639-1":null};var wm={name:"Lunda",names:["Lunda"],"iso639-2":"lun","iso639-1":null};var xm={name:"Lushai",names:["Lushai"],"iso639-2":"lus","iso639-1":null};var km={name:"Luxembourgish",names:["Luxembourgish","Letzeburgesch"],"iso639-2":"ltz","iso639-1":"lb"};var Sm={name:"Macedonian",names:["Macedonian"],"iso639-2":"mac/mkd","iso639-1":"mk"};var Cm={name:"Madurese",names:["Madurese"],"iso639-2":"mad","iso639-1":null};var Em={name:"Magahi",names:["Magahi"],"iso639-2":"mag","iso639-1":null};var Am={name:"Maithili",names:["Maithili"],"iso639-2":"mai","iso639-1":null};var Rm={name:"Makasar",names:["Makasar"],"iso639-2":"mak","iso639-1":null};var Mm={name:"Malagasy",names:["Malagasy"],"iso639-2":"mlg","iso639-1":"mg"};var Tm={name:"Malay",names:["Malay"],"iso639-2":"may/msa","iso639-1":"ms"};var Pm={name:"Malayalam",names:["Malayalam"],"iso639-2":"mal","iso639-1":"ml"};var Om={name:"Maldivian",names:["Divehi","Dhivehi","Maldivian"],"iso639-2":"div","iso639-1":"dv"};var Bm={name:"Maltese",names:["Maltese"],"iso639-2":"mlt","iso639-1":"mt"};var Dm={name:"Manchu",names:["Manchu"],"iso639-2":"mnc","iso639-1":null};var Nm={name:"Mandar",names:["Mandar"],"iso639-2":"mdr","iso639-1":null};var zm={name:"Mandingo",names:["Mandingo"],"iso639-2":"man","iso639-1":null};var jm={name:"Manipuri",names:["Manipuri"],"iso639-2":"mni","iso639-1":null};var Lm={name:"Manx",names:["Manx"],"iso639-2":"glv","iso639-1":"gv"};var Fm={name:"Maori",names:["Maori"],"iso639-2":"mao/mri","iso639-1":"mi"};var Im={name:"Mapuche",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var Hm={name:"Mapudungun",names:["Mapudungun","Mapuche"],"iso639-2":"arn","iso639-1":null};var Gm={name:"Marathi",names:["Marathi"],"iso639-2":"mar","iso639-1":"mr"};var Vm={name:"Mari",names:["Mari"],"iso639-2":"chm","iso639-1":null};var Um={name:"Marshallese",names:["Marshallese"],"iso639-2":"mah","iso639-1":"mh"};var Wm={name:"Marwari",names:["Marwari"],"iso639-2":"mwr","iso639-1":null};var qm={name:"Masai",names:["Masai"],"iso639-2":"mas","iso639-1":null};var Km={name:"Mende",names:["Mende"],"iso639-2":"men","iso639-1":null};var Ym={name:"Micmac",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null};var Xm={name:"Minangkabau",names:["Minangkabau"],"iso639-2":"min","iso639-1":null};var Zm={name:"Mirandese",names:["Mirandese"],"iso639-2":"mwl","iso639-1":null};var $m={name:"Mohawk",names:["Mohawk"],"iso639-2":"moh","iso639-1":null};var Jm={name:"Moksha",names:["Moksha"],"iso639-2":"mdf","iso639-1":null};var Qm={name:"Moldavian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var ty={name:"Moldovan",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var ey={name:"Mong",names:["Hmong","Mong"],"iso639-2":"hmn","iso639-1":null};var ny={name:"Mongo",names:["Mongo"],"iso639-2":"lol","iso639-1":null};var iy={name:"Mongolian",names:["Mongolian"],"iso639-2":"mon","iso639-1":"mn"};var ry={name:"Montenegrin",names:["Montenegrin"],"iso639-2":"cnr","iso639-1":null};var ay={name:"Mossi",names:["Mossi"],"iso639-2":"mos","iso639-1":null};var oy={name:"Nauru",names:["Nauru"],"iso639-2":"nau","iso639-1":"na"};var sy={name:"Navaho",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var uy={name:"Navajo",names:["Navajo","Navaho"],"iso639-2":"nav","iso639-1":"nv"};var ly={name:"Ndonga",names:["Ndonga"],"iso639-2":"ndo","iso639-1":"ng"};var cy={name:"Neapolitan",names:["Neapolitan"],"iso639-2":"nap","iso639-1":null};var fy={name:"Nepali",names:["Nepali"],"iso639-2":"nep","iso639-1":"ne"};var hy={name:"Newari",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null};var dy={name:"Nias",names:["Nias"],"iso639-2":"nia","iso639-1":null};var gy={name:"Niuean",names:["Niuean"],"iso639-2":"niu","iso639-1":null};var py={name:"Nogai",names:["Nogai"],"iso639-2":"nog","iso639-1":null};var vy={name:"Norwegian",names:["Norwegian"],"iso639-2":"nor","iso639-1":"no"};var my={name:"Nuosu",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"};var yy={name:"Nyamwezi",names:["Nyamwezi"],"iso639-2":"nym","iso639-1":null};var _y={name:"Nyanja",names:["Chichewa","Chewa","Nyanja"],"iso639-2":"nya","iso639-1":"ny"};var by={name:"Nyankole",names:["Nyankole"],"iso639-2":"nyn","iso639-1":null};var wy={name:"Nyoro",names:["Nyoro"],"iso639-2":"nyo","iso639-1":null};var xy={name:"Nzima",names:["Nzima"],"iso639-2":"nzi","iso639-1":null};var ky={name:"Occidental",names:["Interlingue","Occidental"],"iso639-2":"ile","iso639-1":"ie"};var Sy={name:"Oirat",names:["Kalmyk","Oirat"],"iso639-2":"xal","iso639-1":null};var Cy={name:"Ojibwa",names:["Ojibwa"],"iso639-2":"oji","iso639-1":"oj"};var Ey={name:"Oriya",names:["Oriya"],"iso639-2":"ori","iso639-1":"or"};var Ay={name:"Oromo",names:["Oromo"],"iso639-2":"orm","iso639-1":"om"};var Ry={name:"Osage",names:["Osage"],"iso639-2":"osa","iso639-1":null};var My={name:"Ossetian",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var Ty={name:"Ossetic",names:["Ossetian","Ossetic"],"iso639-2":"oss","iso639-1":"os"};var Py={name:"Pahlavi",names:["Pahlavi"],"iso639-2":"pal","iso639-1":null};var Oy={name:"Palauan",names:["Palauan"],"iso639-2":"pau","iso639-1":null};var By={name:"Pali",names:["Pali"],"iso639-2":"pli","iso639-1":"pi"};var Dy={name:"Pampanga",names:["Pampanga","Kapampangan"],"iso639-2":"pam","iso639-1":null};var Ny={name:"Pangasinan",names:["Pangasinan"],"iso639-2":"pag","iso639-1":null};var zy={name:"Panjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var jy={name:"Papiamento",names:["Papiamento"],"iso639-2":"pap","iso639-1":null};var Ly={name:"Pashto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var Fy={name:"Pedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var Iy={name:"Persian",names:["Persian"],"iso639-2":"per/fas","iso639-1":"fa"};var Hy={name:"Phoenician",names:["Phoenician"],"iso639-2":"phn","iso639-1":null};var Gy={name:"Pilipino",names:["Filipino","Pilipino"],"iso639-2":"fil","iso639-1":null};var Vy={name:"Pohnpeian",names:["Pohnpeian"],"iso639-2":"pon","iso639-1":null};var Uy={name:"Polish",names:["Polish"],"iso639-2":"pol","iso639-1":"pl"};var Wy={name:"Portuguese",names:["Portuguese"],"iso639-2":"por","iso639-1":"pt"};var qy={name:"Punjabi",names:["Panjabi","Punjabi"],"iso639-2":"pan","iso639-1":"pa"};var Ky={name:"Pushto",names:["Pushto","Pashto"],"iso639-2":"pus","iso639-1":"ps"};var Yy={name:"Quechua",names:["Quechua"],"iso639-2":"que","iso639-1":"qu"};var Xy={name:"Rajasthani",names:["Rajasthani"],"iso639-2":"raj","iso639-1":null};var Zy={name:"Rapanui",names:["Rapanui"],"iso639-2":"rap","iso639-1":null};var $y={name:"Rarotongan",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null};var Jy={name:"Romanian",names:["Romanian","Moldavian","Moldovan"],"iso639-2":"rum/ron","iso639-1":"ro"};var Qy={name:"Romansh",names:["Romansh"],"iso639-2":"roh","iso639-1":"rm"};var t_={name:"Romany",names:["Romany"],"iso639-2":"rom","iso639-1":null};var e_={name:"Rundi",names:["Rundi"],"iso639-2":"run","iso639-1":"rn"};var n_={name:"Russian",names:["Russian"],"iso639-2":"rus","iso639-1":"ru"};var i_={name:"Sakan",names:["Khotanese","Sakan"],"iso639-2":"kho","iso639-1":null};var r_={name:"Samoan",names:["Samoan"],"iso639-2":"smo","iso639-1":"sm"};var a_={name:"Sandawe",names:["Sandawe"],"iso639-2":"sad","iso639-1":null};var o_={name:"Sango",names:["Sango"],"iso639-2":"sag","iso639-1":"sg"};var s_={name:"Sanskrit",names:["Sanskrit"],"iso639-2":"san","iso639-1":"sa"};var u_={name:"Santali",names:["Santali"],"iso639-2":"sat","iso639-1":null};var l_={name:"Sardinian",names:["Sardinian"],"iso639-2":"srd","iso639-1":"sc"};var c_={name:"Sasak",names:["Sasak"],"iso639-2":"sas","iso639-1":null};var f_={name:"Scots",names:["Scots"],"iso639-2":"sco","iso639-1":null};var h_={name:"Selkup",names:["Selkup"],"iso639-2":"sel","iso639-1":null};var d_={name:"Sepedi",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null};var g_={name:"Serbian",names:["Serbian"],"iso639-2":"srp","iso639-1":"sr"};var p_={name:"Serer",names:["Serer"],"iso639-2":"srr","iso639-1":null};var v_={name:"Shan",names:["Shan"],"iso639-2":"shn","iso639-1":null};var m_={name:"Shona",names:["Shona"],"iso639-2":"sna","iso639-1":"sn"};var y_={name:"Sicilian",names:["Sicilian"],"iso639-2":"scn","iso639-1":null};var __={name:"Sidamo",names:["Sidamo"],"iso639-2":"sid","iso639-1":null};var b_={name:"Siksika",names:["Siksika"],"iso639-2":"bla","iso639-1":null};var w_={name:"Sindhi",names:["Sindhi"],"iso639-2":"snd","iso639-1":"sd"};var x_={name:"Sinhala",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var k_={name:"Sinhalese",names:["Sinhala","Sinhalese"],"iso639-2":"sin","iso639-1":"si"};var S_={name:"Slovak",names:["Slovak"],"iso639-2":"slo/slk","iso639-1":"sk"};var C_={name:"Slovenian",names:["Slovenian"],"iso639-2":"slv","iso639-1":"sl"};var E_={name:"Sogdian",names:["Sogdian"],"iso639-2":"sog","iso639-1":null};var A_={name:"Somali",names:["Somali"],"iso639-2":"som","iso639-1":"so"};var R_={name:"Soninke",names:["Soninke"],"iso639-2":"snk","iso639-1":null};var M_={name:"Spanish",names:["Spanish","Castilian"],"iso639-2":"spa","iso639-1":"es"};var T_={name:"Sukuma",names:["Sukuma"],"iso639-2":"suk","iso639-1":null};var P_={name:"Sumerian",names:["Sumerian"],"iso639-2":"sux","iso639-1":null};var O_={name:"Sundanese",names:["Sundanese"],"iso639-2":"sun","iso639-1":"su"};var B_={name:"Susu",names:["Susu"],"iso639-2":"sus","iso639-1":null};var D_={name:"Swahili",names:["Swahili"],"iso639-2":"swa","iso639-1":"sw"};var N_={name:"Swati",names:["Swati"],"iso639-2":"ssw","iso639-1":"ss"};var z_={name:"Swedish",names:["Swedish"],"iso639-2":"swe","iso639-1":"sv"};var j_={name:"Syriac",names:["Syriac"],"iso639-2":"syr","iso639-1":null};var L_={name:"Tagalog",names:["Tagalog"],"iso639-2":"tgl","iso639-1":"tl"};var F_={name:"Tahitian",names:["Tahitian"],"iso639-2":"tah","iso639-1":"ty"};var I_={name:"Tajik",names:["Tajik"],"iso639-2":"tgk","iso639-1":"tg"};var H_={name:"Tamashek",names:["Tamashek"],"iso639-2":"tmh","iso639-1":null};var G_={name:"Tamil",names:["Tamil"],"iso639-2":"tam","iso639-1":"ta"};var V_={name:"Tatar",names:["Tatar"],"iso639-2":"tat","iso639-1":"tt"};var U_={name:"Telugu",names:["Telugu"],"iso639-2":"tel","iso639-1":"te"};var W_={name:"Tereno",names:["Tereno"],"iso639-2":"ter","iso639-1":null};var q_={name:"Tetum",names:["Tetum"],"iso639-2":"tet","iso639-1":null};var K_={name:"Thai",names:["Thai"],"iso639-2":"tha","iso639-1":"th"};var Y_={name:"Tibetan",names:["Tibetan"],"iso639-2":"tib/bod","iso639-1":"bo"};var X_={name:"Tigre",names:["Tigre"],"iso639-2":"tig","iso639-1":null};var Z_={name:"Tigrinya",names:["Tigrinya"],"iso639-2":"tir","iso639-1":"ti"};var $_={name:"Timne",names:["Timne"],"iso639-2":"tem","iso639-1":null};var J_={name:"Tiv",names:["Tiv"],"iso639-2":"tiv","iso639-1":null};var Q_={name:"Tlingit",names:["Tlingit"],"iso639-2":"tli","iso639-1":null};var tb={name:"Tokelau",names:["Tokelau"],"iso639-2":"tkl","iso639-1":null};var eb={name:"Tsimshian",names:["Tsimshian"],"iso639-2":"tsi","iso639-1":null};var nb={name:"Tsonga",names:["Tsonga"],"iso639-2":"tso","iso639-1":"ts"};var ib={name:"Tswana",names:["Tswana"],"iso639-2":"tsn","iso639-1":"tn"};var rb={name:"Tumbuka",names:["Tumbuka"],"iso639-2":"tum","iso639-1":null};var ab={name:"Turkish",names:["Turkish"],"iso639-2":"tur","iso639-1":"tr"};var ob={name:"Turkmen",names:["Turkmen"],"iso639-2":"tuk","iso639-1":"tk"};var sb={name:"Tuvalu",names:["Tuvalu"],"iso639-2":"tvl","iso639-1":null};var ub={name:"Tuvinian",names:["Tuvinian"],"iso639-2":"tyv","iso639-1":null};var lb={name:"Twi",names:["Twi"],"iso639-2":"twi","iso639-1":"tw"};var cb={name:"Udmurt",names:["Udmurt"],"iso639-2":"udm","iso639-1":null};var fb={name:"Ugaritic",names:["Ugaritic"],"iso639-2":"uga","iso639-1":null};var hb={name:"Uighur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var db={name:"Ukrainian",names:["Ukrainian"],"iso639-2":"ukr","iso639-1":"uk"};var gb={name:"Umbundu",names:["Umbundu"],"iso639-2":"umb","iso639-1":null};var pb={name:"Undetermined",names:["Undetermined"],"iso639-2":"und","iso639-1":null};var vb={name:"Urdu",names:["Urdu"],"iso639-2":"urd","iso639-1":"ur"};var mb={name:"Uyghur",names:["Uighur","Uyghur"],"iso639-2":"uig","iso639-1":"ug"};var yb={name:"Uzbek",names:["Uzbek"],"iso639-2":"uzb","iso639-1":"uz"};var _b={name:"Vai",names:["Vai"],"iso639-2":"vai","iso639-1":null};var bb={name:"Valencian",names:["Catalan","Valencian"],"iso639-2":"cat","iso639-1":"ca"};var wb={name:"Venda",names:["Venda"],"iso639-2":"ven","iso639-1":"ve"};var xb={name:"Vietnamese",names:["Vietnamese"],"iso639-2":"vie","iso639-1":"vi"};var kb={name:"Votic",names:["Votic"],"iso639-2":"vot","iso639-1":null};var Sb={name:"Walloon",names:["Walloon"],"iso639-2":"wln","iso639-1":"wa"};var Cb={name:"Waray",names:["Waray"],"iso639-2":"war","iso639-1":null};var Eb={name:"Washo",names:["Washo"],"iso639-2":"was","iso639-1":null};var Ab={name:"Welsh",names:["Welsh"],"iso639-2":"wel/cym","iso639-1":"cy"};var Rb={name:"Wolaitta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var Mb={name:"Wolaytta",names:["Wolaitta","Wolaytta"],"iso639-2":"wal","iso639-1":null};var Tb={name:"Wolof",names:["Wolof"],"iso639-2":"wol","iso639-1":"wo"};var Pb={name:"Xhosa",names:["Xhosa"],"iso639-2":"xho","iso639-1":"xh"};var Ob={name:"Yakut",names:["Yakut"],"iso639-2":"sah","iso639-1":null};var Bb={name:"Yao",names:["Yao"],"iso639-2":"yao","iso639-1":null};var Db={name:"Yapese",names:["Yapese"],"iso639-2":"yap","iso639-1":null};var Nb={name:"Yiddish",names:["Yiddish"],"iso639-2":"yid","iso639-1":"yi"};var zb={name:"Yoruba",names:["Yoruba"],"iso639-2":"yor","iso639-1":"yo"};var jb={name:"Zapotec",names:["Zapotec"],"iso639-2":"zap","iso639-1":null};var Lb={name:"Zaza",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var Fb={name:"Zazaki",names:["Zaza","Dimili","Dimli","Kirdki","Kirmanjki","Zazaki"],"iso639-2":"zza","iso639-1":null};var Ib={name:"Zenaga",names:["Zenaga"],"iso639-2":"zen","iso639-1":null};var Hb={name:"Zhuang",names:["Zhuang","Chuang"],"iso639-2":"zha","iso639-1":"za"};var Gb={name:"Zulu",names:["Zulu"],"iso639-2":"zul","iso639-1":"zu"};var Vb={name:"Zuni",names:["Zuni"],"iso639-2":"zun","iso639-1":null};var Ub={Abkhazian:md,Achinese:yd,Acoli:_d,Adangme:bd,Adygei:wd,Adyghe:xd,Afar:kd,Afrihili:Sd,Afrikaans:Cd,"Afro-Asiatic languages":{name:"Afro-Asiatic languages",names:["Afro-Asiatic languages"],"iso639-2":"afa","iso639-1":null},Ainu:Ed,Akan:Ad,Akkadian:Rd,Albanian:Md,Alemannic:Td,Aleut:Pd,"Algonquian languages":{name:"Algonquian languages",names:["Algonquian languages"],"iso639-2":"alg","iso639-1":null},Alsatian:Od,"Altaic languages":{name:"Altaic languages",names:["Altaic languages"],"iso639-2":"tut","iso639-1":null},Amharic:Bd,Angika:Dd,"Apache languages":{name:"Apache languages",names:["Apache languages"],"iso639-2":"apa","iso639-1":null},Arabic:Nd,Aragonese:zd,Arapaho:jd,Arawak:Ld,Armenian:Fd,Aromanian:Id,"Artificial languages":{name:"Artificial languages",names:["Artificial languages"],"iso639-2":"art","iso639-1":null},Arumanian:Hd,Assamese:Gd,Asturian:Vd,Asturleonese:Ud,"Athapascan languages":{name:"Athapascan languages",names:["Athapascan languages"],"iso639-2":"ath","iso639-1":null},"Australian languages":{name:"Australian languages",names:["Australian languages"],"iso639-2":"aus","iso639-1":null},"Austronesian languages":{name:"Austronesian languages",names:["Austronesian languages"],"iso639-2":"map","iso639-1":null},Avaric:Wd,Avestan:qd,Awadhi:Kd,Aymara:Yd,Azerbaijani:Xd,Bable:Zd,Balinese:$d,"Baltic languages":{name:"Baltic languages",names:["Baltic languages"],"iso639-2":"bat","iso639-1":null},Baluchi:Jd,Bambara:Qd,"Bamileke languages":{name:"Bamileke languages",names:["Bamileke languages"],"iso639-2":"bai","iso639-1":null},"Banda languages":{name:"Banda languages",names:["Banda languages"],"iso639-2":"bad","iso639-1":null},"Bantu languages":{name:"Bantu languages",names:["Bantu languages"],"iso639-2":"bnt","iso639-1":null},Basa:tg,Bashkir:eg,Basque:ng,"Batak languages":{name:"Batak languages",names:["Batak languages"],"iso639-2":"btk","iso639-1":null},Bedawiyet:ig,Beja:rg,Belarusian:ag,Bemba:og,Bengali:sg,"Berber languages":{name:"Berber languages",names:["Berber languages"],"iso639-2":"ber","iso639-1":null},Bhojpuri:ug,"Bihari languages":{name:"Bihari languages",names:["Bihari languages"],"iso639-2":"bih","iso639-1":"bh"},Bikol:lg,Bilin:cg,Bini:fg,Bislama:hg,Blin:dg,Bliss:gg,Blissymbolics:pg,Blissymbols:vg,"Bokmål, Norwegian":{name:"Bokmål, Norwegian",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},Bosnian:mg,Braj:yg,Breton:_g,Buginese:bg,Bulgarian:wg,Buriat:xg,Burmese:kg,Caddo:Sg,Castilian:Cg,Catalan:Eg,"Caucasian languages":{name:"Caucasian languages",names:["Caucasian languages"],"iso639-2":"cau","iso639-1":null},Cebuano:Ag,"Celtic languages":{name:"Celtic languages",names:["Celtic languages"],"iso639-2":"cel","iso639-1":null},"Central American Indian languages":{name:"Central American Indian languages",names:["Central American Indian languages"],"iso639-2":"cai","iso639-1":null},"Central Khmer":{name:"Central Khmer",names:["Central Khmer"],"iso639-2":"khm","iso639-1":"km"},Chagatai:Rg,"Chamic languages":{name:"Chamic languages",names:["Chamic languages"],"iso639-2":"cmc","iso639-1":null},Chamorro:Mg,Chechen:Tg,Cherokee:Pg,Chewa:Og,Cheyenne:Bg,Chibcha:Dg,Chichewa:Ng,Chinese:zg,"Chinook jargon":{name:"Chinook jargon",names:["Chinook jargon"],"iso639-2":"chn","iso639-1":null},Chipewyan:jg,Choctaw:Lg,Chuang:Fg,"Church Slavic":{name:"Church Slavic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Church Slavonic":{name:"Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Chuukese:Ig,Chuvash:Hg,"Classical Nepal Bhasa":{name:"Classical Nepal Bhasa",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Newari":{name:"Classical Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Classical Syriac":{name:"Classical Syriac",names:["Classical Syriac"],"iso639-2":"syc","iso639-1":null},"Cook Islands Maori":{name:"Cook Islands Maori",names:["Rarotongan","Cook Islands Maori"],"iso639-2":"rar","iso639-1":null},Coptic:Gg,Cornish:Vg,Corsican:Ug,Cree:Wg,Creek:qg,"Creoles and pidgins":{name:"Creoles and pidgins",names:["Creoles and pidgins"],"iso639-2":"crp","iso639-1":null},"Creoles and pidgins, English based":{name:"Creoles and pidgins, English based",names:["Creoles and pidgins, English based"],"iso639-2":"cpe","iso639-1":null},"Creoles and pidgins, French-based":{name:"Creoles and pidgins, French-based",names:["Creoles and pidgins, French-based"],"iso639-2":"cpf","iso639-1":null},"Creoles and pidgins, Portuguese-based":{name:"Creoles and pidgins, Portuguese-based",names:["Creoles and pidgins, Portuguese-based"],"iso639-2":"cpp","iso639-1":null},"Crimean Tatar":{name:"Crimean Tatar",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},"Crimean Turkish":{name:"Crimean Turkish",names:["Crimean Tatar","Crimean Turkish"],"iso639-2":"crh","iso639-1":null},Croatian:Kg,"Cushitic languages":{name:"Cushitic languages",names:["Cushitic languages"],"iso639-2":"cus","iso639-1":null},Czech:Yg,Dakota:Xg,Danish:Zg,Dargwa:$g,Delaware:Jg,"Dene Suline":{name:"Dene Suline",names:["Chipewyan","Dene Suline"],"iso639-2":"chp","iso639-1":null},Dhivehi:Qg,Dimili:tp,Dimli:ep,Dinka:np,Divehi:ip,Dogri:rp,Dogrib:ap,"Dravidian languages":{name:"Dravidian languages",names:["Dravidian languages"],"iso639-2":"dra","iso639-1":null},Duala:op,Dutch:sp,"Dutch, Middle (ca.1050-1350)":{name:"Dutch, Middle (ca.1050-1350)",names:["Dutch, Middle (ca.1050-1350)"],"iso639-2":"dum","iso639-1":null},Dyula:up,Dzongkha:lp,"Eastern Frisian":{name:"Eastern Frisian",names:["Eastern Frisian"],"iso639-2":"frs","iso639-1":null},Edo:cp,Efik:fp,"Egyptian (Ancient)":{name:"Egyptian (Ancient)",names:["Egyptian (Ancient)"],"iso639-2":"egy","iso639-1":null},Ekajuk:hp,Elamite:dp,English:gp,"English, Middle (1100-1500)":{name:"English, Middle (1100-1500)",names:["English, Middle (1100-1500)"],"iso639-2":"enm","iso639-1":null},"English, Old (ca.450-1100)":{name:"English, Old (ca.450-1100)",names:["English, Old (ca.450-1100)"],"iso639-2":"ang","iso639-1":null},Erzya:pp,Esperanto:vp,Estonian:mp,Ewe:yp,Ewondo:_p,Fang:bp,Fanti:wp,Faroese:xp,Fijian:kp,Filipino:Sp,Finnish:Cp,"Finno-Ugrian languages":{name:"Finno-Ugrian languages",names:["Finno-Ugrian languages"],"iso639-2":"fiu","iso639-1":null},Flemish:Ep,Fon:Ap,French:Rp,"French, Middle (ca.1400-1600)":{name:"French, Middle (ca.1400-1600)",names:["French, Middle (ca.1400-1600)"],"iso639-2":"frm","iso639-1":null},"French, Old (842-ca.1400)":{name:"French, Old (842-ca.1400)",names:["French, Old (842-ca.1400)"],"iso639-2":"fro","iso639-1":null},Friulian:Mp,Fulah:Tp,Ga:Pp,Gaelic:Op,"Galibi Carib":{name:"Galibi Carib",names:["Galibi Carib"],"iso639-2":"car","iso639-1":null},Galician:Bp,Ganda:Dp,Gayo:Np,Gbaya:zp,Geez:jp,Georgian:Lp,German:Fp,"German, Low":{name:"German, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"German, Middle High (ca.1050-1500)":{name:"German, Middle High (ca.1050-1500)",names:["German, Middle High (ca.1050-1500)"],"iso639-2":"gmh","iso639-1":null},"German, Old High (ca.750-1050)":{name:"German, Old High (ca.750-1050)",names:["German, Old High (ca.750-1050)"],"iso639-2":"goh","iso639-1":null},"Germanic languages":{name:"Germanic languages",names:["Germanic languages"],"iso639-2":"gem","iso639-1":null},Gikuyu:Ip,Gilbertese:Hp,Gondi:Gp,Gorontalo:Vp,Gothic:Up,Grebo:Wp,"Greek, Ancient (to 1453)":{name:"Greek, Ancient (to 1453)",names:["Greek, Ancient (to 1453)"],"iso639-2":"grc","iso639-1":null},"Greek, Modern (1453-)":{name:"Greek, Modern (1453-)",names:["Greek, Modern (1453-)"],"iso639-2":"gre/ell","iso639-1":"el"},Greenlandic:qp,Guarani:Kp,Gujarati:Yp,"Gwich'in":{name:"Gwich'in",names:["Gwich'in"],"iso639-2":"gwi","iso639-1":null},Haida:Xp,Haitian:Zp,"Haitian Creole":{name:"Haitian Creole",names:["Haitian","Haitian Creole"],"iso639-2":"hat","iso639-1":"ht"},Hausa:$p,Hawaiian:Jp,Hebrew:Qp,Herero:tv,Hiligaynon:ev,"Himachali languages":{name:"Himachali languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Hindi:nv,"Hiri Motu":{name:"Hiri Motu",names:["Hiri Motu"],"iso639-2":"hmo","iso639-1":"ho"},Hittite:iv,Hmong:rv,Hungarian:av,Hupa:ov,Iban:sv,Icelandic:uv,Ido:lv,Igbo:cv,"Ijo languages":{name:"Ijo languages",names:["Ijo languages"],"iso639-2":"ijo","iso639-1":null},Iloko:fv,"Imperial Aramaic (700-300 BCE)":{name:"Imperial Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},"Inari Sami":{name:"Inari Sami",names:["Inari Sami"],"iso639-2":"smn","iso639-1":null},"Indic languages":{name:"Indic languages",names:["Indic languages"],"iso639-2":"inc","iso639-1":null},"Indo-European languages":{name:"Indo-European languages",names:["Indo-European languages"],"iso639-2":"ine","iso639-1":null},Indonesian:hv,Ingush:dv,"Interlingua (International Auxiliary Language Association)":{name:"Interlingua (International Auxiliary Language Association)",names:["Interlingua (International Auxiliary Language Association)"],"iso639-2":"ina","iso639-1":"ia"},Interlingue:gv,Inuktitut:pv,Inupiaq:vv,"Iranian languages":{name:"Iranian languages",names:["Iranian languages"],"iso639-2":"ira","iso639-1":null},Irish:mv,"Irish, Middle (900-1200)":{name:"Irish, Middle (900-1200)",names:["Irish, Middle (900-1200)"],"iso639-2":"mga","iso639-1":null},"Irish, Old (to 900)":{name:"Irish, Old (to 900)",names:["Irish, Old (to 900)"],"iso639-2":"sga","iso639-1":null},"Iroquoian languages":{name:"Iroquoian languages",names:["Iroquoian languages"],"iso639-2":"iro","iso639-1":null},Italian:yv,Japanese:_v,Javanese:bv,Jingpho:wv,"Judeo-Arabic":{name:"Judeo-Arabic",names:["Judeo-Arabic"],"iso639-2":"jrb","iso639-1":null},"Judeo-Persian":{name:"Judeo-Persian",names:["Judeo-Persian"],"iso639-2":"jpr","iso639-1":null},Kabardian:xv,Kabyle:kv,Kachin:Sv,Kalaallisut:Cv,Kalmyk:Ev,Kamba:Av,Kannada:Rv,Kanuri:Mv,Kapampangan:Tv,"Kara-Kalpak":{name:"Kara-Kalpak",names:["Kara-Kalpak"],"iso639-2":"kaa","iso639-1":null},"Karachay-Balkar":{name:"Karachay-Balkar",names:["Karachay-Balkar"],"iso639-2":"krc","iso639-1":null},Karelian:Pv,"Karen languages":{name:"Karen languages",names:["Karen languages"],"iso639-2":"kar","iso639-1":null},Kashmiri:Ov,Kashubian:Bv,Kawi:Dv,Kazakh:Nv,Khasi:zv,"Khoisan languages":{name:"Khoisan languages",names:["Khoisan languages"],"iso639-2":"khi","iso639-1":null},Khotanese:jv,Kikuyu:Lv,Kimbundu:Fv,Kinyarwanda:Iv,Kirdki:Hv,Kirghiz:Gv,Kirmanjki:Vv,Klingon:Uv,Komi:Wv,Kongo:qv,Konkani:Kv,Korean:Yv,Kosraean:Xv,Kpelle:Zv,"Kru languages":{name:"Kru languages",names:["Kru languages"],"iso639-2":"kro","iso639-1":null},Kuanyama:$v,Kumyk:Jv,Kurdish:Qv,Kurukh:tm,Kutenai:em,Kwanyama:nm,Kyrgyz:im,Ladino:rm,Lahnda:am,Lamba:om,"Land Dayak languages":{name:"Land Dayak languages",names:["Land Dayak languages"],"iso639-2":"day","iso639-1":null},Lao:sm,Latin:um,Latvian:lm,Leonese:cm,Letzeburgesch:fm,Lezghian:hm,Limburgan:dm,Limburger:gm,Limburgish:pm,Lingala:vm,Lithuanian:mm,Lojban:ym,"Low German":{name:"Low German",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Low Saxon":{name:"Low Saxon",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},"Lower Sorbian":{name:"Lower Sorbian",names:["Lower Sorbian"],"iso639-2":"dsb","iso639-1":null},Lozi:_m,"Luba-Katanga":{name:"Luba-Katanga",names:["Luba-Katanga"],"iso639-2":"lub","iso639-1":"lu"},"Luba-Lulua":{name:"Luba-Lulua",names:["Luba-Lulua"],"iso639-2":"lua","iso639-1":null},Luiseno:bm,"Lule Sami":{name:"Lule Sami",names:["Lule Sami"],"iso639-2":"smj","iso639-1":null},Lunda:wm,"Luo (Kenya and Tanzania)":{name:"Luo (Kenya and Tanzania)",names:["Luo (Kenya and Tanzania)"],"iso639-2":"luo","iso639-1":null},Lushai:xm,Luxembourgish:km,"Macedo-Romanian":{name:"Macedo-Romanian",names:["Aromanian","Arumanian","Macedo-Romanian"],"iso639-2":"rup","iso639-1":null},Macedonian:Sm,Madurese:Cm,Magahi:Em,Maithili:Am,Makasar:Rm,Malagasy:Mm,Malay:Tm,Malayalam:Pm,Maldivian:Om,Maltese:Bm,Manchu:Dm,Mandar:Nm,Mandingo:zm,Manipuri:jm,"Manobo languages":{name:"Manobo languages",names:["Manobo languages"],"iso639-2":"mno","iso639-1":null},Manx:Lm,Maori:Fm,Mapuche:Im,Mapudungun:Hm,Marathi:Gm,Mari:Vm,Marshallese:Um,Marwari:Wm,Masai:qm,"Mayan languages":{name:"Mayan languages",names:["Mayan languages"],"iso639-2":"myn","iso639-1":null},Mende:Km,"Mi'kmaq":{name:"Mi'kmaq",names:["Mi'kmaq","Micmac"],"iso639-2":"mic","iso639-1":null},Micmac:Ym,Minangkabau:Xm,Mirandese:Zm,Mohawk:$m,Moksha:Jm,Moldavian:Qm,Moldovan:ty,"Mon-Khmer languages":{name:"Mon-Khmer languages",names:["Mon-Khmer languages"],"iso639-2":"mkh","iso639-1":null},Mong:ey,Mongo:ny,Mongolian:iy,Montenegrin:ry,Mossi:ay,"Multiple languages":{name:"Multiple languages",names:["Multiple languages"],"iso639-2":"mul","iso639-1":null},"Munda languages":{name:"Munda languages",names:["Munda languages"],"iso639-2":"mun","iso639-1":null},"N'Ko":{name:"N'Ko",names:["N'Ko"],"iso639-2":"nqo","iso639-1":null},"Nahuatl languages":{name:"Nahuatl languages",names:["Nahuatl languages"],"iso639-2":"nah","iso639-1":null},Nauru:oy,Navaho:sy,Navajo:uy,"Ndebele, North":{name:"Ndebele, North",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Ndebele, South":{name:"Ndebele, South",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},Ndonga:ly,Neapolitan:cy,"Nepal Bhasa":{name:"Nepal Bhasa",names:["Nepal Bhasa","Newari"],"iso639-2":"new","iso639-1":null},Nepali:fy,Newari:hy,Nias:dy,"Niger-Kordofanian languages":{name:"Niger-Kordofanian languages",names:["Niger-Kordofanian languages"],"iso639-2":"nic","iso639-1":null},"Nilo-Saharan languages":{name:"Nilo-Saharan languages",names:["Nilo-Saharan languages"],"iso639-2":"ssa","iso639-1":null},Niuean:gy,"No linguistic content":{name:"No linguistic content",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},Nogai:py,"Norse, Old":{name:"Norse, Old",names:["Norse, Old"],"iso639-2":"non","iso639-1":null},"North American Indian languages":{name:"North American Indian languages",names:["North American Indian languages"],"iso639-2":"nai","iso639-1":null},"North Ndebele":{name:"North Ndebele",names:["Ndebele, North","North Ndebele"],"iso639-2":"nde","iso639-1":"nd"},"Northern Frisian":{name:"Northern Frisian",names:["Northern Frisian"],"iso639-2":"frr","iso639-1":null},"Northern Sami":{name:"Northern Sami",names:["Northern Sami"],"iso639-2":"sme","iso639-1":"se"},"Northern Sotho":{name:"Northern Sotho",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},Norwegian:vy,"Norwegian Bokmål":{name:"Norwegian Bokmål",names:["Bokmål, Norwegian","Norwegian Bokmål"],"iso639-2":"nob","iso639-1":"nb"},"Norwegian Nynorsk":{name:"Norwegian Nynorsk",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},"Not applicable":{name:"Not applicable",names:["No linguistic content","Not applicable"],"iso639-2":"zxx","iso639-1":null},"Nubian languages":{name:"Nubian languages",names:["Nubian languages"],"iso639-2":"nub","iso639-1":null},Nuosu:my,Nyamwezi:yy,Nyanja:_y,Nyankole:by,"Nynorsk, Norwegian":{name:"Nynorsk, Norwegian",names:["Norwegian Nynorsk","Nynorsk, Norwegian"],"iso639-2":"nno","iso639-1":"nn"},Nyoro:wy,Nzima:xy,Occidental:ky,"Occitan (post 1500)":{name:"Occitan (post 1500)",names:["Occitan (post 1500)"],"iso639-2":"oci","iso639-1":"oc"},"Occitan, Old (to 1500)":{name:"Occitan, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},"Official Aramaic (700-300 BCE)":{name:"Official Aramaic (700-300 BCE)",names:["Official Aramaic (700-300 BCE)","Imperial Aramaic (700-300 BCE)"],"iso639-2":"arc","iso639-1":null},Oirat:Sy,Ojibwa:Cy,"Old Bulgarian":{name:"Old Bulgarian",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Church Slavonic":{name:"Old Church Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},"Old Newari":{name:"Old Newari",names:["Classical Newari","Old Newari","Classical Nepal Bhasa"],"iso639-2":"nwc","iso639-1":null},"Old Slavonic":{name:"Old Slavonic",names:["Church Slavic","Old Slavonic","Church Slavonic","Old Bulgarian","Old Church Slavonic"],"iso639-2":"chu","iso639-1":"cu"},Oriya:Ey,Oromo:Ay,Osage:Ry,Ossetian:My,Ossetic:Ty,"Otomian languages":{name:"Otomian languages",names:["Otomian languages"],"iso639-2":"oto","iso639-1":null},Pahlavi:Py,Palauan:Oy,Pali:By,Pampanga:Dy,Pangasinan:Ny,Panjabi:zy,Papiamento:jy,"Papuan languages":{name:"Papuan languages",names:["Papuan languages"],"iso639-2":"paa","iso639-1":null},Pashto:Ly,Pedi:Fy,Persian:Iy,"Persian, Old (ca.600-400 B.C.)":{name:"Persian, Old (ca.600-400 B.C.)",names:["Persian, Old (ca.600-400 B.C.)"],"iso639-2":"peo","iso639-1":null},"Philippine languages":{name:"Philippine languages",names:["Philippine languages"],"iso639-2":"phi","iso639-1":null},Phoenician:Hy,Pilipino:Gy,Pohnpeian:Vy,Polish:Uy,Portuguese:Wy,"Prakrit languages":{name:"Prakrit languages",names:["Prakrit languages"],"iso639-2":"pra","iso639-1":null},"Provençal, Old (to 1500)":{name:"Provençal, Old (to 1500)",names:["Provençal, Old (to 1500)","Occitan, Old (to 1500)"],"iso639-2":"pro","iso639-1":null},Punjabi:qy,Pushto:Ky,Quechua:Yy,Rajasthani:Xy,Rapanui:Zy,Rarotongan:$y,"Reserved for local use":{name:"Reserved for local use",names:["Reserved for local use"],"iso639-2":"qaa-qtz","iso639-1":null},"Romance languages":{name:"Romance languages",names:["Romance languages"],"iso639-2":"roa","iso639-1":null},Romanian:Jy,Romansh:Qy,Romany:t_,Rundi:e_,Russian:n_,Sakan:i_,"Salishan languages":{name:"Salishan languages",names:["Salishan languages"],"iso639-2":"sal","iso639-1":null},"Samaritan Aramaic":{name:"Samaritan Aramaic",names:["Samaritan Aramaic"],"iso639-2":"sam","iso639-1":null},"Sami languages":{name:"Sami languages",names:["Sami languages"],"iso639-2":"smi","iso639-1":null},Samoan:r_,Sandawe:a_,Sango:o_,Sanskrit:s_,Santali:u_,Sardinian:l_,Sasak:c_,"Saxon, Low":{name:"Saxon, Low",names:["Low German","Low Saxon","German, Low","Saxon, Low"],"iso639-2":"nds","iso639-1":null},Scots:f_,"Scottish Gaelic":{name:"Scottish Gaelic",names:["Gaelic","Scottish Gaelic"],"iso639-2":"gla","iso639-1":"gd"},Selkup:h_,"Semitic languages":{name:"Semitic languages",names:["Semitic languages"],"iso639-2":"sem","iso639-1":null},Sepedi:d_,Serbian:g_,Serer:p_,Shan:v_,Shona:m_,"Sichuan Yi":{name:"Sichuan Yi",names:["Sichuan Yi","Nuosu"],"iso639-2":"iii","iso639-1":"ii"},Sicilian:y_,Sidamo:__,"Sign Languages":{name:"Sign Languages",names:["Sign Languages"],"iso639-2":"sgn","iso639-1":null},Siksika:b_,Sindhi:w_,Sinhala:x_,Sinhalese:k_,"Sino-Tibetan languages":{name:"Sino-Tibetan languages",names:["Sino-Tibetan languages"],"iso639-2":"sit","iso639-1":null},"Siouan languages":{name:"Siouan languages",names:["Siouan languages"],"iso639-2":"sio","iso639-1":null},"Skolt Sami":{name:"Skolt Sami",names:["Skolt Sami"],"iso639-2":"sms","iso639-1":null},"Slave (Athapascan)":{name:"Slave (Athapascan)",names:["Slave (Athapascan)"],"iso639-2":"den","iso639-1":null},"Slavic languages":{name:"Slavic languages",names:["Slavic languages"],"iso639-2":"sla","iso639-1":null},Slovak:S_,Slovenian:C_,Sogdian:E_,Somali:A_,"Songhai languages":{name:"Songhai languages",names:["Songhai languages"],"iso639-2":"son","iso639-1":null},Soninke:R_,"Sorbian languages":{name:"Sorbian languages",names:["Sorbian languages"],"iso639-2":"wen","iso639-1":null},"Sotho, Northern":{name:"Sotho, Northern",names:["Pedi","Sepedi","Northern Sotho"],"iso639-2":"nso","iso639-1":null},"Sotho, Southern":{name:"Sotho, Southern",names:["Sotho, Southern"],"iso639-2":"sot","iso639-1":"st"},"South American Indian languages":{name:"South American Indian languages",names:["South American Indian languages"],"iso639-2":"sai","iso639-1":null},"South Ndebele":{name:"South Ndebele",names:["Ndebele, South","South Ndebele"],"iso639-2":"nbl","iso639-1":"nr"},"Southern Altai":{name:"Southern Altai",names:["Southern Altai"],"iso639-2":"alt","iso639-1":null},"Southern Sami":{name:"Southern Sami",names:["Southern Sami"],"iso639-2":"sma","iso639-1":null},Spanish:M_,"Sranan Tongo":{name:"Sranan Tongo",names:["Sranan Tongo"],"iso639-2":"srn","iso639-1":null},"Standard Moroccan Tamazight":{name:"Standard Moroccan Tamazight",names:["Standard Moroccan Tamazight"],"iso639-2":"zgh","iso639-1":null},Sukuma:T_,Sumerian:P_,Sundanese:O_,Susu:B_,Swahili:D_,Swati:N_,Swedish:z_,"Swiss German":{name:"Swiss German",names:["Swiss German","Alemannic","Alsatian"],"iso639-2":"gsw","iso639-1":null},Syriac:j_,Tagalog:L_,Tahitian:F_,"Tai languages":{name:"Tai languages",names:["Tai languages"],"iso639-2":"tai","iso639-1":null},Tajik:I_,Tamashek:H_,Tamil:G_,Tatar:V_,Telugu:U_,Tereno:W_,Tetum:q_,Thai:K_,Tibetan:Y_,Tigre:X_,Tigrinya:Z_,Timne:$_,Tiv:J_,"tlhIngan-Hol":{name:"tlhIngan-Hol",names:["Klingon","tlhIngan-Hol"],"iso639-2":"tlh","iso639-1":null},Tlingit:Q_,"Tok Pisin":{name:"Tok Pisin",names:["Tok Pisin"],"iso639-2":"tpi","iso639-1":null},Tokelau:tb,"Tonga (Nyasa)":{name:"Tonga (Nyasa)",names:["Tonga (Nyasa)"],"iso639-2":"tog","iso639-1":null},"Tonga (Tonga Islands)":{name:"Tonga (Tonga Islands)",names:["Tonga (Tonga Islands)"],"iso639-2":"ton","iso639-1":"to"},Tsimshian:eb,Tsonga:nb,Tswana:ib,Tumbuka:rb,"Tupi languages":{name:"Tupi languages",names:["Tupi languages"],"iso639-2":"tup","iso639-1":null},Turkish:ab,"Turkish, Ottoman (1500-1928)":{name:"Turkish, Ottoman (1500-1928)",names:["Turkish, Ottoman (1500-1928)"],"iso639-2":"ota","iso639-1":null},Turkmen:ob,Tuvalu:sb,Tuvinian:ub,Twi:lb,Udmurt:cb,Ugaritic:fb,Uighur:hb,Ukrainian:db,Umbundu:gb,"Uncoded languages":{name:"Uncoded languages",names:["Uncoded languages"],"iso639-2":"mis","iso639-1":null},Undetermined:pb,"Upper Sorbian":{name:"Upper Sorbian",names:["Upper Sorbian"],"iso639-2":"hsb","iso639-1":null},Urdu:vb,Uyghur:mb,Uzbek:yb,Vai:_b,Valencian:bb,Venda:wb,Vietnamese:xb,"Volapük":{name:"Volapük",names:["Volapük"],"iso639-2":"vol","iso639-1":"vo"},Votic:kb,"Wakashan languages":{name:"Wakashan languages",names:["Wakashan languages"],"iso639-2":"wak","iso639-1":null},Walloon:Sb,Waray:Cb,Washo:Eb,Welsh:Ab,"Western Frisian":{name:"Western Frisian",names:["Western Frisian"],"iso639-2":"fry","iso639-1":"fy"},"Western Pahari languages":{name:"Western Pahari languages",names:["Himachali languages","Western Pahari languages"],"iso639-2":"him","iso639-1":null},Wolaitta:Rb,Wolaytta:Mb,Wolof:Tb,Xhosa:Pb,Yakut:Ob,Yao:Bb,Yapese:Db,Yiddish:Nb,Yoruba:zb,"Yupik languages":{name:"Yupik languages",names:["Yupik languages"],"iso639-2":"ypk","iso639-1":null},"Zande languages":{name:"Zande languages",names:["Zande languages"],"iso639-2":"znd","iso639-1":null},Zapotec:jb,Zaza:Lb,Zazaki:Fb,Zenaga:Ib,Zhuang:Hb,Zulu:Gb,Zuni:Vb};function Wb(t,e,n){if(e in t){Object.defineProperty(t,e,{value:n,enumerable:true,configurable:true,writable:true})}else{t[e]=n}return t}var qb=[];var Kb=Object.keys(Ub);Object.keys(vd).map(function(t){var e=vd[t];var n=Kb.find(function(t){return t.toLowerCase()===e.language.toLowerCase()});if(e.location&&n){var i;qb.push((i={},Wb(i,"name",e.language),Wb(i,"location",e.location),Wb(i,"tag",e.tag),Wb(i,"lcid",e.id),Wb(i,"iso639-2",Ub[n]["iso639-2"]),Wb(i,"iso639-1",Ub[n]["iso639-1"]),i))}});var Yb={ar:"ar-SA",ca:"ca-ES",da:"da-DK",en:"en-US",ko:"ko-KR",pa:"pa-IN",pt:"pt-BR",sv:"sv-SE"};function Xb(e){if(typeof e!=="string"||e.length===5)return e;if(Yb[e])return Yb[e];var t=qb.filter(function(t){return t["iso639-1"]===e});if(!t.length)return e;else if(t.length===1)return t[0].tag;else if(t.find(function(t){return t.tag==="".concat(e,"-").concat(e.toUpperCase())}))return"".concat(e,"-").concat(e.toUpperCase());else return t[0].tag}function Zb(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function $b(){return"".concat(Zb()).concat(Zb(),"-").concat(Zb(),"-").concat(Zb(),"-").concat(Zb(),"-").concat(Zb()).concat(Zb()).concat(Zb())}var Jb="D3PLUS-COMMON-RESET";var Qb={and:"y",Back:"Atrás","Click to Expand":"Clic para Ampliar","Click to Hide":"Clic para Ocultar","Click to Highlight":"Clic para Resaltar","Click to Reset":"Clic para Restablecer",Download:"Descargar","Loading Visualization":"Cargando Visualización","No Data Available":"Datos No Disponibles","Powered by D3plus":"Funciona con D3plus",Share:"Porcentaje","Shift+Click to Hide":"Mayús+Clic para Ocultar",Total:"Total",Values:"Valores"};var tw={"es-ES":Qb};function ew(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function nw(t,e){for(var n=0;n1&&arguments[1]!==undefined?arguments[1]:i._locale;var n=tw[e];return n&&n[t]?n[t]:t};this._uuid=$b()}iw(t,[{key:"config",value:function n(t){var i=this;if(!this._configDefault){var n={};aw(this.__proto__).forEach(function(t){var e=i[t]();if(e!==i)n[t]=Qu(e)?el({},e):e});this._configDefault=n}if(arguments.length){for(var e in t){if({}.hasOwnProperty.call(t,e)&&e in this){var r=t[e];if(r===Jb){if(e==="on")this._on=this._configDefault[e];else this[e](this._configDefault[e])}else{rw(r,this._configDefault[e]);this[e](r)}}}return this}else{var a={};aw(this.__proto__).forEach(function(t){a[t]=i[t]()});return a}}},{key:"locale",value:function t(e){return arguments.length?(this._locale=Xb(e),this):this._locale}},{key:"on",value:function t(e,n){return arguments.length===2?(this._on[e]=n,this):arguments.length?typeof e==="string"?this._on[e]:(this._on=Object.assign({},this._on,e),this):this._on}},{key:"parent",value:function t(e){return arguments.length?(this._parent=e,this):this._parent}},{key:"translate",value:function t(e){return arguments.length?(this._translate=e,this):this._translate}},{key:"shapeConfig",value:function t(e){return arguments.length?(this._shapeConfig=el(this._shapeConfig,e),this):this._shapeConfig}}]);return t}();function sw(n){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];if(!t||!(t instanceof Array)||!t.length)return undefined;return t.reduce(function(t,e){return Math.abs(e-n)0&&arguments[0]!==undefined?arguments[0]:this._shapeConfig;var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"shape";var e=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var n={duration:this._duration,on:{}};var o=function t(r){return function(t,e,n){var i;while(t.__d3plus__){if(i)t.__d3plusParent__=i;i=t;e=t.i;t=t.data||t.feature}return r.bind(a)(t,e,n||i)}};var s=function t(e,n){for(var i in n){if({}.hasOwnProperty.call(n,i)&&!i.includes(".")||i.includes(".".concat(r))){e.on[i]=o(n[i])}}};var u=function e(t){return t.map(function(t){if(t instanceof Array)return e(t);else if(uw(t)==="object")return i({},t);else if(typeof t==="function")return o(t);else return t})};var i=function t(e,n){for(var i in n){if({}.hasOwnProperty.call(n,i)){if(i==="on")s(e,n[i]);else if(typeof n[i]==="function"){e[i]=o(n[i])}else if(n[i]instanceof Array){e[i]=u(n[i])}else if(uw(n[i])==="object"){e[i]={on:{}};t(e[i],n[i])}else e[i]=n[i]}}};i(n,t);if(this._on)s(n,this._on);if(e&&t[e]){i(n,t[e]);if(t[e].on)s(n,t[e].on)}return n}function cw(e){return function t(){return e}}function fw(t,e){e=Object.assign({},{condition:true,enter:{},exit:{},parent:Yo("body"),transition:Uu().duration(0),update:{}},e);var n=/\.([^#]+)/g.exec(t),i=/#([^\.]+)/g.exec(t),r=/^([^.^#]+)/g.exec(t)[1];var a=e.parent.selectAll(t.includes(":")?t.split(":")[1]:t).data(e.condition?[null]:[]);var o=a.enter().append(r).call(nl,e.enter);if(i)o.attr("id",i[1]);if(n)o.attr("class",n[1]);a.exit().transition(e.transition).call(nl,e.exit).remove();var s=o.merge(a);s.transition(e.transition).call(nl,e.update);return s}function hw(t){return t.filter(function(t,e,n){return n.indexOf(t)===e})}function dw(r){var a=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var t=hw(he(r.map(function(t){return Ke(t)}))),o={};t.forEach(function(e){var t;if(a[e])t=a[e](r,function(t){return t[e]});else{var n=r.map(function(t){return t[e]});var i=n.map(function(t){return t||t===false?t.constructor:t}).filter(function(t){return t!==void 0});if(!i.length)t=undefined;else if(i.indexOf(Array)>=0){t=he(n.map(function(t){return t instanceof Array?t:[t]}));t=hw(t);if(t.length===1)t=t[0]}else if(i.indexOf(String)>=0){t=hw(n);if(t.length===1)t=t[0]}else if(i.indexOf(Number)>=0)t=ge(n);else if(i.indexOf(Object)>=0){t=hw(n.filter(function(t){return t}));if(t.length===1)t=t[0];else t=dw(t)}else{t=hw(n.filter(function(t){return t!==void 0}));if(t.length===1)t=t[0]}}o[e]=t});return o}function gw(t){var r;if(typeof t==="number")r=[t];else r=t.split(/\s+/);if(r.length===1)r=[r[0],r[0],r[0],r[0]];else if(r.length===2)r=r.concat(r);else if(r.length===3)r.push(r[1]);return["top","right","bottom","left"].reduce(function(t,e,n){var i=parseFloat(r[n]);t[e]=i||0;return t},{})}function pw(){if("-webkit-transform"in document.body.style)return"-webkit-";else if("-moz-transform"in document.body.style)return"-moz-";else if("-ms-transform"in document.body.style)return"-ms-";else if("-o-transform"in document.body.style)return"-o-";else return""}function vw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};for(var n in e){if({}.hasOwnProperty.call(e,n))t.style(n,e[n])}}var mw={"en-GB":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","T","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["£",""]},"en-US":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","B","T","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-CL":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["$",""]},"es-MX":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","M","MM","B","T","Q","Z","Y"],grouping:[3],delimiters:{thousands:",",decimal:"."},currency:["$",""]},"es-ES":{separator:"",suffixes:["y","z","a","f","p","n","µ","m","","k","mm","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:".",decimal:","},currency:["€",""]},"et-EE":{separator:" ",suffixes:["y","z","a","f","p","n","µ","m","","tuhat","miljonit","miljardit","triljonit","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["","eurot"]},"fr-FR":{suffixes:["y","z","a","f","p","n","µ","m","","k","m","b","t","q","Q","Z","Y"],grouping:[3],delimiters:{thousands:" ",decimal:","},currency:["€",""]}};function yw(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){yw=function t(e){return typeof e}}else{yw=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return yw(t)}var _w=function t(e,n){return parseFloat(Math.round(e*Math.pow(10,n))/Math.pow(10,n)).toFixed(n)};function bw(t,e,n){var i=0;if(t){if(t<0)t*=-1;i=1+Math.floor(1e-12+Math.log(t)/Math.LN10);i=Math.max(-24,Math.min(24,Math.floor((i-1)/3)*3))}var r=n[8+i/3];return{number:_w(r.scale(t),e),symbol:r.symbol}}function ww(t,e){var n=Math.pow(10,Math.abs(8-e)*3);return{scale:e>8?function(t){return t/n}:function(t){return t*n},symbol:t}}function xw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"en-US";var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(isFinite(t))t*=1;else return"N/A";var i=t<0;var r=t.toString().split(".")[0].replace("-","").length,a=yw(e)==="object"?e:mw[e]||mw["en-US"],o=a.suffixes.map(ww);var s=a.delimiters.decimal||".",u=a.separator||"",l=a.delimiters.thousands||",";var c=Yi({currency:a.currency||["$",""],decimal:s,grouping:a.grouping||[3],thousands:l});var f;if(n)f=c.format(n)(t);else if(t===0)f="0";else if(r>=3){var h=bw(c.format(".3r")(t),2,o);var d=parseFloat(h.number).toString().replace(".",s);var g=h.symbol;f="".concat(d).concat(u).concat(g)}else if(r===3)f=c.format(",f")(t);else if(t<1&&t>-1)f=c.format(".2g")(t);else f=c.format(".3g")(t);return"".concat(i&&f.charAt(0)!=="-"?"-":"").concat(f).replace(/(\.[0]*[1-9]*)[0]*$/g,"$1").replace(/\.[0]*$/g,"")}function kw(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function Sw(t,e){for(var n=0;n2&&arguments[2]!==undefined?arguments[2]:1;var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;t=Bn(t);e=Bn(e);var r=Math.abs(e.h*i-t.h*n);if(r>180)r-=360;var a=(Math.min(t.h,e.h)+r/2)%360;var o=t.l+(e.l*i-t.l*n)/2,s=t.s+(e.s*i-t.s*n)/2;if(a<0)a+=360;return Bn("hsl(".concat(a,",").concat(s*100,"%,").concat(o*100,"%)")).toString()}var Rw={dark:"#444444",light:"#f7f7f7",missing:"#cccccc",off:"#b22200",on:"#224f20",scale:Je().range(["#b22200","#282f6b","#eace3f","#b35c1e","#224f20","#5f487c","#759143","#419391","#993c88","#e89c89","#ffee8d","#afd5e8","#f7ba77","#a5c697","#c5b5e5","#d1d392","#bbefd0","#e099cf"])};function Mw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};return t in e?e[t]:t in Rw?Rw[t]:Rw.missing}function Tw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if([null,void 0].indexOf(t)>=0)return Mw("missing",e);else if(t===true)return Mw("on",e);else if(t===false)return Mw("off",e);var n=xn(t);if(!n)return Mw("scale",e)(t);return t.toString()}function Pw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};t=En(t);var n=(t.r*299+t.g*587+t.b*114)/1e3;return n>=128?Mw("dark",e):Mw("light",e)}function Ow(t){t=Bn(t);if(t.l>.45){if(t.s>.8)t.s=.8;t.l=.45}return t.toString()}function Bw(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:.5;t=Bn(t);e*=1-t.l;t.l+=e;t.s-=e;return t.toString()}function Dw(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;t=Bn(t);e=Bn(e);var r=e.h*i-t.h*n;if(Math.abs(r)>180)r-=360;var a=(t.h-r)%360;var o=t.l-(e.l*i-t.l*n)/2,s=t.s-(e.s*i-t.s*n)/2;if(a<0)a+=360;return Bn("hsl(".concat(a,",").concat(s*100,"%,").concat(o*100,"%)")).toString()}var Nw=Math.PI,zw=2*Nw,jw=1e-6,Lw=zw-jw;function Fw(){this._x0=this._y0=this._x1=this._y1=null;this._=""}function Iw(){return new Fw}Fw.prototype=Iw.prototype={constructor:Fw,moveTo:function t(e,n){this._+="M"+(this._x0=this._x1=+e)+","+(this._y0=this._y1=+n)},closePath:function t(){if(this._x1!==null){this._x1=this._x0,this._y1=this._y0;this._+="Z"}},lineTo:function t(e,n){this._+="L"+(this._x1=+e)+","+(this._y1=+n)},quadraticCurveTo:function t(e,n,i,r){this._+="Q"+ +e+","+ +n+","+(this._x1=+i)+","+(this._y1=+r)},bezierCurveTo:function t(e,n,i,r,a,o){this._+="C"+ +e+","+ +n+","+ +i+","+ +r+","+(this._x1=+a)+","+(this._y1=+o)},arcTo:function t(e,n,i,r,a){e=+e,n=+n,i=+i,r=+r,a=+a;var o=this._x1,s=this._y1,u=i-e,l=r-n,c=o-e,f=s-n,h=c*c+f*f;if(a<0)throw new Error("negative radius: "+a);if(this._x1===null){this._+="M"+(this._x1=e)+","+(this._y1=n)}else if(!(h>jw));else if(!(Math.abs(f*u-l*c)>jw)||!a){this._+="L"+(this._x1=e)+","+(this._y1=n)}else{var d=i-o,g=r-s,p=u*u+l*l,v=d*d+g*g,m=Math.sqrt(p),y=Math.sqrt(h),_=a*Math.tan((Nw-Math.acos((p+h-v)/(2*m*y)))/2),b=_/y,w=_/m;if(Math.abs(b-1)>jw){this._+="L"+(e+b*c)+","+(n+b*f)}this._+="A"+a+","+a+",0,0,"+ +(f*d>c*g)+","+(this._x1=e+w*u)+","+(this._y1=n+w*l)}},arc:function t(e,n,i,r,a,o){e=+e,n=+n,i=+i,o=!!o;var s=i*Math.cos(r),u=i*Math.sin(r),l=e+s,c=n+u,f=1^o,h=o?r-a:a-r;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null){this._+="M"+l+","+c}else if(Math.abs(this._x1-l)>jw||Math.abs(this._y1-c)>jw){this._+="L"+l+","+c}if(!i)return;if(h<0)h=h%zw+zw;if(h>Lw){this._+="A"+i+","+i+",0,1,"+f+","+(e-s)+","+(n-u)+"A"+i+","+i+",0,1,"+f+","+(this._x1=l)+","+(this._y1=c)}else if(h>jw){this._+="A"+i+","+i+",0,"+ +(h>=Nw)+","+f+","+(this._x1=e+i*Math.cos(a))+","+(this._y1=n+i*Math.sin(a))}},rect:function t(e,n,i,r){this._+="M"+(this._x0=this._x1=+e)+","+(this._y0=this._y1=+n)+"h"+ +i+"v"+ +r+"h"+-i+"Z"},toString:function t(){return this._}};function Hw(e){return function t(){return e}}var Gw=Math.abs;var Vw=Math.atan2;var Uw=Math.cos;var Ww=Math.max;var qw=Math.min;var Kw=Math.sin;var Yw=Math.sqrt;var Xw=1e-12;var Zw=Math.PI;var $w=Zw/2;var Jw=2*Zw;function Qw(t){return t>1?0:t<-1?Zw:Math.acos(t)}function tx(t){return t>=1?$w:t<=-1?-$w:Math.asin(t)}function ex(t){return t.innerRadius}function nx(t){return t.outerRadius}function ix(t){return t.startAngle}function rx(t){return t.endAngle}function ax(t){return t&&t.padAngle}function ox(t,e,n,i,r,a,o,s){var u=n-t,l=i-e,c=o-r,f=s-a,h=f*u-c*l;if(h*hT*T+P*P)S=E,C=A;return{cx:S,cy:C,x01:-c,y01:-f,x11:S*(r/w-1),y11:C*(r/w-1)}}function ux(){var L=ex,F=nx,I=Hw(0),H=null,G=ix,V=rx,U=ax,W=null;function e(){var t,e,n=+L.apply(this,arguments),i=+F.apply(this,arguments),r=G.apply(this,arguments)-$w,a=V.apply(this,arguments)-$w,o=Gw(a-r),s=a>r;if(!W)W=t=Iw();if(iXw))W.moveTo(0,0);else if(o>Jw-Xw){W.moveTo(i*Uw(r),i*Kw(r));W.arc(0,0,i,r,a,!s);if(n>Xw){W.moveTo(n*Uw(a),n*Kw(a));W.arc(0,0,n,a,r,s)}}else{var u=r,l=a,c=r,f=a,h=o,d=o,g=U.apply(this,arguments)/2,p=g>Xw&&(H?+H.apply(this,arguments):Yw(n*n+i*i)),v=qw(Gw(i-n)/2,+I.apply(this,arguments)),m=v,y=v,_,b;if(p>Xw){var w=tx(p/n*Kw(g)),x=tx(p/i*Kw(g));if((h-=w*2)>Xw)w*=s?1:-1,c+=w,f-=w;else h=0,c=f=(r+a)/2;if((d-=x*2)>Xw)x*=s?1:-1,u+=x,l-=x;else d=0,u=l=(r+a)/2}var k=i*Uw(u),S=i*Kw(u),C=n*Uw(f),E=n*Kw(f);if(v>Xw){var A=i*Uw(l),R=i*Kw(l),M=n*Uw(c),T=n*Kw(c),P;if(oXw))W.moveTo(k,S);else if(y>Xw){_=sx(M,T,k,S,i,y,s);b=sx(A,R,C,E,i,y,s);W.moveTo(_.cx+_.x01,_.cy+_.y01);if(yXw)||!(h>Xw))W.lineTo(C,E);else if(m>Xw){_=sx(C,E,A,R,n,-m,s);b=sx(k,S,M,T,n,-m,s);W.lineTo(_.cx+_.x01,_.cy+_.y01);if(m=n;--i){m.point(u[i],l[i])}m.lineEnd();m.areaEnd()}}if(o){u[e]=+c(a,e,t),l[e]=+h(a,e,t);m.point(f?+f(a,e,t):u[e],d?+d(a,e,t):l[e])}}if(s)return m=null,s+""||null}function t(){return dx().defined(g).curve(v).context(p)}e.x=function(t){return arguments.length?(c=typeof t==="function"?t:Hw(+t),f=null,e):c};e.x0=function(t){return arguments.length?(c=typeof t==="function"?t:Hw(+t),e):c};e.x1=function(t){return arguments.length?(f=t==null?null:typeof t==="function"?t:Hw(+t),e):f};e.y=function(t){return arguments.length?(h=typeof t==="function"?t:Hw(+t),d=null,e):h};e.y0=function(t){return arguments.length?(h=typeof t==="function"?t:Hw(+t),e):h};e.y1=function(t){return arguments.length?(d=t==null?null:typeof t==="function"?t:Hw(+t),e):d};e.lineX0=e.lineY0=function(){return t().x(c).y(h)};e.lineY1=function(){return t().x(c).y(d)};e.lineX1=function(){return t().x(f).y(h)};e.defined=function(t){return arguments.length?(g=typeof t==="function"?t:Hw(!!t),e):g};e.curve=function(t){return arguments.length?(v=t,p!=null&&(m=v(p)),e):v};e.context=function(t){return arguments.length?(t==null?p=m=null:m=v(p=t),e):p};return e}function px(t,e){return et?1:e>=t?0:NaN}function vx(t){return t}function mx(){var g=vx,p=px,v=null,m=Hw(0),y=Hw(Jw),_=Hw(0);function e(n){var t,e=n.length,i,r,a=0,o=new Array(e),s=new Array(e),u=+m.apply(this,arguments),l=Math.min(Jw,Math.max(-Jw,y.apply(this,arguments)-u)),c,f=Math.min(Math.abs(l)/e,_.apply(this,arguments)),h=f*(l<0?-1:1),d;for(t=0;t0){a+=d}}if(p!=null)o.sort(function(t,e){return p(s[t],s[e])});else if(v!=null)o.sort(function(t,e){return v(n[t],n[e])});for(t=0,r=a?(l-e*h)/a:0;t0?d*r:0)+h,s[i]={data:n[i],index:t,value:d,startAngle:u,endAngle:c,padAngle:f}}return s}e.value=function(t){return arguments.length?(g=typeof t==="function"?t:Hw(+t),e):g};e.sortValues=function(t){return arguments.length?(p=t,v=null,e):p};e.sort=function(t){return arguments.length?(v=t,p=null,e):v};e.startAngle=function(t){return arguments.length?(m=typeof t==="function"?t:Hw(+t),e):m};e.endAngle=function(t){return arguments.length?(y=typeof t==="function"?t:Hw(+t),e):y};e.padAngle=function(t){return arguments.length?(_=typeof t==="function"?t:Hw(+t),e):_};return e}var yx=bx(cx);function _x(t){this._curve=t}_x.prototype={areaStart:function t(){this._curve.areaStart()},areaEnd:function t(){this._curve.areaEnd()},lineStart:function t(){this._curve.lineStart()},lineEnd:function t(){this._curve.lineEnd()},point:function t(e,n){this._curve.point(n*Math.sin(e),n*-Math.cos(e))}};function bx(e){function t(t){return new _x(e(t))}t._curve=e;return t}function wx(t){var e=t.curve;t.angle=t.x,delete t.x;t.radius=t.y,delete t.y;t.curve=function(t){return arguments.length?e(bx(t)):e()._curve};return t}function xx(){return wx(dx().curve(yx))}function kx(){var t=gx().curve(yx),e=t.curve,n=t.lineX0,i=t.lineX1,r=t.lineY0,a=t.lineY1;t.angle=t.x,delete t.x;t.startAngle=t.x0,delete t.x0;t.endAngle=t.x1,delete t.x1;t.radius=t.y,delete t.y;t.innerRadius=t.y0,delete t.y0;t.outerRadius=t.y1,delete t.y1;t.lineStartAngle=function(){return wx(n())},delete t.lineX0;t.lineEndAngle=function(){return wx(i())},delete t.lineX1;t.lineInnerRadius=function(){return wx(r())},delete t.lineY0;t.lineOuterRadius=function(){return wx(a())},delete t.lineY1;t.curve=function(t){return arguments.length?e(bx(t)):e()._curve};return t}function Sx(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]}var Cx=Array.prototype.slice;function Ex(t){return t.source}function Ax(t){return t.target}function Rx(r){var a=Ex,o=Ax,s=fx,u=hx,l=null;function e(){var t,e=Cx.call(arguments),n=a.apply(this,e),i=o.apply(this,e);if(!l)l=t=Iw();r(l,+s.apply(this,(e[0]=n,e)),+u.apply(this,e),+s.apply(this,(e[0]=i,e)),+u.apply(this,e));if(t)return l=null,t+""||null}e.source=function(t){return arguments.length?(a=t,e):a};e.target=function(t){return arguments.length?(o=t,e):o};e.x=function(t){return arguments.length?(s=typeof t==="function"?t:Hw(+t),e):s};e.y=function(t){return arguments.length?(u=typeof t==="function"?t:Hw(+t),e):u};e.context=function(t){return arguments.length?(l=t==null?null:t,e):l};return e}function Mx(t,e,n,i,r){t.moveTo(e,n);t.bezierCurveTo(e=(e+i)/2,n,e,r,i,r)}function Tx(t,e,n,i,r){t.moveTo(e,n);t.bezierCurveTo(e,n=(n+r)/2,i,n,i,r)}function Px(t,e,n,i,r){var a=Sx(e,n),o=Sx(e,n=(n+r)/2),s=Sx(i,n),u=Sx(i,r);t.moveTo(a[0],a[1]);t.bezierCurveTo(o[0],o[1],s[0],s[1],u[0],u[1])}function Ox(){return Rx(Mx)}function Bx(){return Rx(Tx)}function Dx(){var t=Rx(Px);t.angle=t.x,delete t.x;t.radius=t.y,delete t.y;return t}var Nx={draw:function t(e,n){var i=Math.sqrt(n/Zw);e.moveTo(i,0);e.arc(0,0,i,0,Jw)}};var zx={draw:function t(e,n){var i=Math.sqrt(n/5)/2;e.moveTo(-3*i,-i);e.lineTo(-i,-i);e.lineTo(-i,-3*i);e.lineTo(i,-3*i);e.lineTo(i,-i);e.lineTo(3*i,-i);e.lineTo(3*i,i);e.lineTo(i,i);e.lineTo(i,3*i);e.lineTo(-i,3*i);e.lineTo(-i,i);e.lineTo(-3*i,i);e.closePath()}};var jx=Math.sqrt(1/3),Lx=jx*2;var Fx={draw:function t(e,n){var i=Math.sqrt(n/Lx),r=i*jx;e.moveTo(0,-i);e.lineTo(r,0);e.lineTo(0,i);e.lineTo(-r,0);e.closePath()}};var Ix=.8908130915292852,Hx=Math.sin(Zw/10)/Math.sin(7*Zw/10),Gx=Math.sin(Jw/10)*Hx,Vx=-Math.cos(Jw/10)*Hx;var Ux={draw:function t(e,n){var i=Math.sqrt(n*Ix),r=Gx*i,a=Vx*i;e.moveTo(0,-i);e.lineTo(r,a);for(var o=1;o<5;++o){var s=Jw*o/5,u=Math.cos(s),l=Math.sin(s);e.lineTo(l*i,-u*i);e.lineTo(u*r-l*a,l*r+u*a)}e.closePath()}};var Wx={draw:function t(e,n){var i=Math.sqrt(n),r=-i/2;e.rect(r,r,i,i)}};var qx=Math.sqrt(3);var Kx={draw:function t(e,n){var i=-Math.sqrt(n/(qx*3));e.moveTo(0,i*2);e.lineTo(-qx*i,-i);e.lineTo(qx*i,-i);e.closePath()}};var Yx=-.5,Xx=Math.sqrt(3)/2,Zx=1/Math.sqrt(12),$x=(Zx/2+1)*3;var Jx={draw:function t(e,n){var i=Math.sqrt(n/$x),r=i/2,a=i*Zx,o=r,s=i*Zx+i,u=-o,l=s;e.moveTo(r,a);e.lineTo(o,s);e.lineTo(u,l);e.lineTo(Yx*r-Xx*a,Xx*r+Yx*a);e.lineTo(Yx*o-Xx*s,Xx*o+Yx*s);e.lineTo(Yx*u-Xx*l,Xx*u+Yx*l);e.lineTo(Yx*r+Xx*a,Yx*a-Xx*r);e.lineTo(Yx*o+Xx*s,Yx*s-Xx*o);e.lineTo(Yx*u+Xx*l,Yx*l-Xx*u);e.closePath()}};var Qx=[Nx,zx,Fx,Wx,Ux,Kx,Jx];function tk(){var e=Hw(Nx),n=Hw(64),i=null;function r(){var t;if(!i)i=t=Iw();e.apply(this,arguments).draw(i,+n.apply(this,arguments));if(t)return i=null,t+""||null}r.type=function(t){return arguments.length?(e=typeof t==="function"?t:Hw(t),r):e};r.size=function(t){return arguments.length?(n=typeof t==="function"?t:Hw(+t),r):n};r.context=function(t){return arguments.length?(i=t==null?null:t,r):i};return r}function ek(){}function nk(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function ik(t){this._context=t}ik.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 3:nk(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;break;case 2:this._point=3;this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:nk(this,e,n);break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n}};function rk(t){return new ik(t)}function ak(t){this._context=t}ak.prototype={areaStart:ek,areaEnd:ek,lineStart:function t(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2);this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3);this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3);this._context.closePath();break}case 3:{this.point(this._x2,this._y2);this.point(this._x3,this._y3);this.point(this._x4,this._y4);break}}},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._x2=e,this._y2=n;break;case 1:this._point=2;this._x3=e,this._y3=n;break;case 2:this._point=3;this._x4=e,this._y4=n;this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+n)/6);break;default:nk(this,e,n);break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n}};function ok(t){return new ak(t)}function sk(t){this._context=t}sk.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function t(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var i=(this._x0+4*this._x1+e)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(i,r):this._context.moveTo(i,r);break;case 3:this._point=4;default:nk(this,e,n);break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n}};function uk(t){return new sk(t)}function lk(t,e){this._basis=new ik(t);this._beta=e}lk.prototype={lineStart:function t(){this._x=[];this._y=[];this._basis.lineStart()},lineEnd:function t(){var e=this._x,n=this._y,i=e.length-1;if(i>0){var r=e[0],a=n[0],o=e[i]-r,s=n[i]-a,u=-1,l;while(++u<=i){l=u/i;this._basis.point(this._beta*e[u]+(1-this._beta)*(r+l*o),this._beta*n[u]+(1-this._beta)*(a+l*s))}}this._x=this._y=null;this._basis.lineEnd()},point:function t(e,n){this._x.push(+e);this._y.push(+n)}};var ck=function e(n){function t(t){return n===1?new ik(t):new lk(t,n)}t.beta=function(t){return e(+t)};return t}(.85);function fk(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function hk(t,e){this._context=t;this._k=(1-e)/6}hk.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:fk(this,this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;this._x1=e,this._y1=n;break;case 2:this._point=3;default:fk(this,e,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var dk=function e(n){function t(t){return new hk(t,n)}t.tension=function(t){return e(+t)};return t}(0);function gk(t,e){this._context=t;this._k=(1-e)/6}gk.prototype={areaStart:ek,areaEnd:ek,lineStart:function t(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._x3=e,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=e,this._y4=n);break;case 2:this._point=3;this._x5=e,this._y5=n;break;default:fk(this,e,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var pk=function e(n){function t(t){return new gk(t,n)}t.tension=function(t){return e(+t)};return t}(0);function vk(t,e){this._context=t;this._k=(1-e)/6}vk.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function t(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:fk(this,e,n);break}this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var mk=function e(n){function t(t){return new vk(t,n)}t.tension=function(t){return e(+t)};return t}(0);function yk(t,e,n){var i=t._x1,r=t._y1,a=t._x2,o=t._y2;if(t._l01_a>Xw){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/u;r=(r*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Xw){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,c=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*l+t._x1*t._l23_2a-e*t._l12_2a)/c;o=(o*l+t._y1*t._l23_2a-n*t._l12_2a)/c}t._context.bezierCurveTo(i,r,a,o,t._x2,t._y2)}function _k(t,e){this._context=t;this._alpha=e}_k.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function t(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;if(this._point){var i=this._x2-e,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+r*r,this._alpha))}switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;break;case 2:this._point=3;default:yk(this,e,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var bk=function e(n){function t(t){return n?new _k(t,n):new hk(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function wk(t,e){this._context=t;this._alpha=e}wk.prototype={areaStart:ek,areaEnd:ek,lineStart:function t(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function t(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function t(e,n){e=+e,n=+n;if(this._point){var i=this._x2-e,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+r*r,this._alpha))}switch(this._point){case 0:this._point=1;this._x3=e,this._y3=n;break;case 1:this._point=2;this._context.moveTo(this._x4=e,this._y4=n);break;case 2:this._point=3;this._x5=e,this._y5=n;break;default:yk(this,e,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var xk=function e(n){function t(t){return n?new wk(t,n):new gk(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function kk(t,e){this._context=t;this._alpha=e}kk.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function t(){if(this._line||this._line!==0&&this._point===3)this._context.closePath();this._line=1-this._line},point:function t(e,n){e=+e,n=+n;if(this._point){var i=this._x2-e,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(i*i+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:yk(this,e,n);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=e;this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Sk=function e(n){function t(t){return n?new kk(t,n):new vk(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function Ck(t){this._context=t}Ck.prototype={areaStart:ek,areaEnd:ek,lineStart:function t(){this._point=0},lineEnd:function t(){if(this._point)this._context.closePath()},point:function t(e,n){e=+e,n=+n;if(this._point)this._context.lineTo(e,n);else this._point=1,this._context.moveTo(e,n)}};function Ek(t){return new Ck(t)}function Ak(t){return t<0?-1:1}function Rk(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),s=(a*r+o*i)/(i+r);return(Ak(a)+Ak(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function Mk(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function Tk(t,e,n){var i=t._x0,r=t._y0,a=t._x1,o=t._y1,s=(a-i)/3;t._context.bezierCurveTo(i+s,r+s*e,a-s,o-s*n,a,o)}function Pk(t){this._context=t}Pk.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN;this._point=0},lineEnd:function t(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Tk(this,this._t0,Mk(this,this._t0));break}if(this._line||this._line!==0&&this._point===1)this._context.closePath();this._line=1-this._line},point:function t(e,n){var i=NaN;e=+e,n=+n;if(e===this._x1&&n===this._y1)return;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;break;case 2:this._point=3;Tk(this,Mk(this,i=Rk(this,e,n)),i);break;default:Tk(this,this._t0,i=Rk(this,e,n));break}this._x0=this._x1,this._x1=e;this._y0=this._y1,this._y1=n;this._t0=i}};function Ok(t){this._context=new Bk(t)}(Ok.prototype=Object.create(Pk.prototype)).point=function(t,e){Pk.prototype.point.call(this,e,t)};function Bk(t){this._context=t}Bk.prototype={moveTo:function t(e,n){this._context.moveTo(n,e)},closePath:function t(){this._context.closePath()},lineTo:function t(e,n){this._context.lineTo(n,e)},bezierCurveTo:function t(e,n,i,r,a,o){this._context.bezierCurveTo(n,e,r,i,o,a)}};function Dk(t){return new Pk(t)}function Nk(t){return new Ok(t)}function zk(t){this._context=t}zk.prototype={areaStart:function t(){this._line=0},areaEnd:function t(){this._line=NaN},lineStart:function t(){this._x=[];this._y=[]},lineEnd:function t(){var e=this._x,n=this._y,i=e.length;if(i){this._line?this._context.lineTo(e[0],n[0]):this._context.moveTo(e[0],n[0]);if(i===2){this._context.lineTo(e[1],n[1])}else{var r=jk(e),a=jk(n);for(var o=0,s=1;s=0;--e){r[e]=(o[e]-r[e+1])/a[e]}a[n-1]=(t[n]+r[n-1])/2;for(e=0;e=0)this._t=1-this._t,this._line=1-this._line},point:function t(e,n){e=+e,n=+n;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break;case 1:this._point=2;default:{if(this._t<=0){this._context.lineTo(this._x,n);this._context.lineTo(e,n)}else{var i=this._x*(1-this._t)+e*this._t;this._context.lineTo(i,this._y);this._context.lineTo(i,n)}break}}this._x=e,this._y=n}};function Ik(t){return new Fk(t,.5)}function Hk(t){return new Fk(t,0)}function Gk(t){return new Fk(t,1)}function Vk(t,e){if(!((o=t.length)>1))return;for(var n=1,i,r,a=t[e[0]],o,s=a.length;n=0){n[e]=e}return n}function Wk(t,e){return t[e]}function qk(){var f=Hw([]),h=Uk,d=Vk,g=Wk;function e(t){var e=f.apply(this,arguments),n,i=t.length,r=e.length,a=new Array(r),o;for(n=0;n0))return;for(var n,i,r=0,a=t[0].length,o;r0))return;for(var n,i=0,r,a,o,s,u,l=t[e[0]].length;i0){r[0]=o,r[1]=o+=a}else if(a<0){r[1]=s,r[0]=s+=a}else{r[0]=0,r[1]=a}}}}function Xk(t,e){if(!((r=t.length)>0))return;for(var n=0,i=t[e[0]],r,a=i.length;n0)||!((a=(r=t[e[0]]).length)>0))return;for(var n=0,i=1,r,a,o;ia)a=r,n=e}return n}function Qk(t){var n=t.map(tS);return Uk(t).sort(function(t,e){return n[t]-n[e]})}function tS(t){var e=0,n=-1,i=t.length,r;while(++n]+>/g,""),"text/html");return e.documentElement?e.documentElement.textContent:t}function oS(t,e){e=Object.assign({"font-size":10,"font-family":"sans-serif","font-style":"normal","font-weight":400,"font-variant":"normal"},e);var n=document.createElement("canvas").getContext("2d");var i=[];i.push(e["font-style"]);i.push(e["font-variant"]);i.push(e["font-weight"]);i.push(typeof e["font-size"]==="string"?e["font-size"]:"".concat(e["font-size"],"px"));i.push(e["font-family"]);n.font=i.join(" ");if(t instanceof Array)return t.map(function(t){return n.measureText(aS(t)).width});return n.measureText(aS(t)).width}function sS(t){return t.toString().replace(/^\s+|\s+$/g,"")}function uS(t){return t.toString().replace(/^\s+/,"")}function lS(t){return t.toString().replace(/\s+$/,"")}var cS="abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",fS={},hS=32;var dS,gS,pS,vS;var mS=function t(e){if(!dS){dS=oS(cS,{"font-family":"DejaVuSans","font-size":hS});gS=oS(cS,{"font-family":"-apple-system","font-size":hS});pS=oS(cS,{"font-family":"monospace","font-size":hS});vS=oS(cS,{"font-family":"sans-serif","font-size":hS})}if(!(e instanceof Array))e=e.split(",");e=e.map(function(t){return sS(t)});for(var n=0;n",")","}","]",".","!","?","/","u00BB","u300B","u3009"].concat(CS);var RS="က-ဪဿ-၉ၐ-ၕ";var MS="぀-ゟ゠-ヿ＀-+--}⦅-゚㐀-䶿";var TS="㐀-龿";var PS="ກ-ຮະ-ໄ່-໋ໍ-ໝ";var OS=RS+TS+MS+PS;var BS=new RegExp("(\\".concat(CS.join("|\\"),")*[^\\s|\\").concat(CS.join("|\\"),"]*(\\").concat(CS.join("|\\"),")*"),"g");var DS=new RegExp("[".concat(OS,"]"));var NS=new RegExp("(\\".concat(ES.join("|\\"),")*[").concat(OS,"](\\").concat(AS.join("|\\"),"|\\").concat(SS.join("|\\"),")*|[a-z0-9]+"),"gi");function zS(t){if(!DS.test(t))return _S(t).match(BS).filter(function(t){return t.length});return he(_S(t).match(BS).map(function(t){if(DS.test(t))return t.match(NS);return[t]}))}function jS(){var d="sans-serif",g=10,p=400,v=200,m,y=null,_=false,b=zS,w=200;function e(t){t=_S(t);if(m===void 0)m=Math.ceil(g*1.4);var e=b(t);var n={"font-family":d,"font-size":g,"font-weight":p,"line-height":m};var i=1,r="",a=false,o=0;var s=[],u=oS(e,n),l=oS(" ",n);for(var c=0;cw){if(!c&&!_){a=true;break}if(s.length>=i)s[i-1]=lS(s[i-1]);i++;if(m*i>v||h>w&&!_||y&&i>y){a=true;break}o=0;s.push(f)}else if(!c)s[0]=f;else s[i-1]+=f;r+=f;o+=h;o+=f.match(/[\s]*$/g)[0].length*l}return{lines:s,sentence:t,truncated:a,widths:oS(s,n),words:e}}e.fontFamily=function(t){return arguments.length?(d=t,e):d};e.fontSize=function(t){return arguments.length?(g=t,e):g};e.fontWeight=function(t){return arguments.length?(p=t,e):p};e.height=function(t){return arguments.length?(v=t,e):v};e.lineHeight=function(t){return arguments.length?(m=t,e):m};e.maxLines=function(t){return arguments.length?(y=t,e):y};e.overflow=function(t){return arguments.length?(_=t,e):_};e.split=function(t){return arguments.length?(b=t,e):b};e.width=function(t){return arguments.length?(w=t,e):w};return e}function LS(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){LS=function t(e){return typeof e}}else{LS=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return LS(t)}function FS(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function IS(t,e){for(var n=0;ny&&(g>s||r&&g>y*a)){if(r){c=oS(b,h);var x=1.165+p/g*.1,k=p*g,S=ce(c),C=ge(c,function(t){return t*s})*x;if(S>p||C>k){var E=Math.sqrt(k/C),A=p/S;var R=de([E,A]);o=Math.floor(o*R)}var M=Math.floor(g*.8);if(o>M)o=M}w()}if(l.length){var T=u*s;var P=B._rotate(e,n);var O=P===0?_==="top"?0:_==="middle"?g/2-T/2:g-T:0;O-=s*.1;t.push({aH:B._ariaHidden(e,n),data:e,i:n,lines:l,fC:B._fontColor(e,n),fStroke:B._fontStroke(e,n),fSW:B._fontStrokeWidth(e,n),fF:h["font-family"],fO:B._fontOpacity(e,n),fW:h["font-weight"],id:B._id(e,n),tA:B._textAnchor(e,n),vA:B._verticalAlign(e,n),widths:f.widths,fS:o,lH:s,w:p,h:g,r:P,x:B._x(e,n)+d.left,y:B._y(e,n)+O+d.top})}return t},[]),function(t){return B._id(t.data,t.i)});var r=Uu().duration(this._duration);if(this._duration===0){n.exit().remove()}else{n.exit().transition().delay(this._duration).remove();n.exit().selectAll("text").transition(r).attr("opacity",0).style("opacity",0)}function i(t){t.attr("transform",function(t,e){var n=D._rotateAnchor(t,e);return"translate(".concat(t.x,", ").concat(t.y,") rotate(").concat(t.r,", ").concat(n[0],", ").concat(n[1],")")})}var a=n.enter().append("g").attr("class","d3plus-textBox").attr("id",function(t){return"d3plus-textBox-".concat(wS(t.id))}).call(i).merge(n);var o=yS();a.order().style("pointer-events",function(t){return B._pointerEvents(t.data,t.i)}).each(function(n){function t(t){t[D._html?"html":"text"](function(t){return lS(t).replace(/&([^\;&]*)/g,function(t,e){return e==="amp"?t:"&".concat(e)}).replace(/<([^A-z^/]+)/g,function(t,e){return"<".concat(e)}).replace(/<$/g,"<").replace(/(<[^>^\/]+>)([^<^>]+)$/g,function(t,e,n){return"".concat(e).concat(n).concat(e.replace("<","]+)(<\/[^>]+>)/g,function(t,e,n){return"".concat(n.replace("]*>([^<^>]+)<\/[^>]+>/g,function(t,e,n){var i=D._html[e]?''):"";return"".concat(i.length?i:"").concat(n).concat(i.length?"":"")})})}function e(t){t.attr("aria-hidden",n.aH).attr("dir",o?"rtl":"ltr").attr("fill",n.fC).attr("stroke",n.fStroke).attr("stroke-width",n.fSW).attr("text-anchor",n.tA).attr("font-family",n.fF).style("font-family",n.fF).attr("font-size","".concat(n.fS,"px")).style("font-size","".concat(n.fS,"px")).attr("font-weight",n.fW).style("font-weight",n.fW).attr("x","".concat(n.tA==="middle"?n.w/2:o?n.tA==="start"?n.w:0:n.tA==="end"?n.w:2*Math.sin(Math.PI*n.r/180),"px")).attr("y",function(t,e){return n.r===0||n.vA==="top"?"".concat((e+1)*n.lH-(n.lH-n.fS),"px"):n.vA==="middle"?"".concat((n.h+n.fS)/2-(n.lH-n.fS)+(e-n.lines.length/2+.5)*n.lH,"px"):"".concat(n.h-2*(n.lH-n.fS)-(n.lines.length-(e+1))*n.lH+2*Math.cos(Math.PI*n.r/180),"px")})}var i=Yo(this).selectAll("text").data(n.lines);if(D._duration===0){i.call(t).call(e);i.exit().remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("unicode-bidi","bidi-override").call(t).call(e).attr("opacity",n.fO).style("opacity",n.fO)}else{i.call(t).transition(r).call(e);i.exit().transition(r).attr("opacity",0).remove();i.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("opacity",0).style("opacity",0).call(t).call(e).merge(i).transition(r).delay(D._delay).call(e).attr("opacity",n.fO).style("opacity",n.fO)}}).transition(r).call(i);var s=Object.keys(this._on),u=s.reduce(function(t,n){t[n]=function(t,e){return B._on[n](t.data,e)};return t},{});for(var l=0;l=0)return o[r];else if(a.includes(i)&&e!==0&&e!==u.length-1)return n;else return t.charAt(0).toUpperCase()+t.substr(1).toLowerCase()}else return""}).reduce(function(t,e,n){if(n&&i.charAt(t.length)===" ")t+=" ";t+=e;return t},"")}var tC=function t(e,n){var i=n[0]-e[0],r=n[1]-e[1];return i*i+r*r};var eC=function t(e,n){return Math.sqrt(tC(e,n))};function nC(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){nC=function t(e){return typeof e}}else{nC=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return nC(t)}function iC(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function rC(t,e){for(var n=0;n0&&arguments[0]!==undefined?arguments[0]:"g";iC(this,n);r=e.call(this);r._activeOpacity=.25;r._activeStyle={stroke:function t(e,n){var i=r._fill(e,n);if(["transparent","none"].includes(i))i=r._stroke(e,n);return xn(i).darker(1)},"stroke-width":function t(e,n){var i=r._strokeWidth(e,n)||1;return i*3}};r._ariaLabel=cw("");r._backgroundImage=cw(false);r._backgroundImageClass=new Ew;r._data=[];r._duration=600;r._fill=cw("black");r._fillOpacity=cw(1);r._hoverOpacity=.5;r._hoverStyle={stroke:function t(e,n){var i=r._fill(e,n);if(["transparent","none"].includes(i))i=r._stroke(e,n);return xn(i).darker(.5)},"stroke-width":function t(e,n){var i=r._strokeWidth(e,n)||1;return i*2}};r._id=function(t,e){return t.id!==void 0?t.id:e};r._label=cw(false);r._labelClass=new ZS;r._labelConfig={fontColor:function t(e,n){return Pw(r._fill(e,n))},fontSize:12,padding:5};r._name="Shape";r._opacity=cw(1);r._pointerEvents=cw("visiblePainted");r._role=cw("presentation");r._rotate=cw(0);r._rx=cw(0);r._ry=cw(0);r._scale=cw(1);r._shapeRendering=cw("geometricPrecision");r._stroke=function(t,e){return xn(r._fill(t,e)).darker(1)};r._strokeDasharray=cw("0");r._strokeLinecap=cw("butt");r._strokeOpacity=cw(1);r._strokeWidth=cw(0);r._tagName=t;r._textAnchor=cw("start");r._vectorEffect=cw("non-scaling-stroke");r._verticalAlign=cw("top");r._x=$u("x",0);r._y=$u("y",0);return r}aC(n,[{key:"_aes",value:function t(){return{}}},{key:"_applyEvents",value:function t(e){var o=this;var s=Object.keys(this._on);var n=function t(a){e.on(s[a],function(t,e){if(!o._on[s[a]])return;if(t.i!==void 0)e=t.i;if(t.nested&&t.values){var n=function t(e,n){if(o._discrete==="x")return[o._x(e,n),i[1]];else if(o._discrete==="y")return[i[0],o._y(e,n)];else return[o._x(e,n),o._y(e,n)]};var i=$o(o._select.node()),r=t.values.map(function(t){return eC(i,n(t,e))});e=r.indexOf(de(r));t=t.values[e]}o._on[s[a]].bind(o)(t,e)})};for(var i=0;i *, g.d3plus-").concat(this._name,"-active > *")).each(function(t){if(t&&t.parentNode)t.parentNode.appendChild(this);else this.parentNode.removeChild(this)});this._group=fw("g.d3plus-".concat(this._name,"-group"),{parent:this._select});var a=this._update=fw("g.d3plus-".concat(this._name,"-shape"),{parent:this._group,update:{opacity:this._active?this._activeOpacity:1}}).selectAll(".d3plus-".concat(this._name)).data(i,r);a.order();if(this._duration){a.transition(this._transition).call(this._applyTransform.bind(this))}else{a.call(this._applyTransform.bind(this))}var o=this._enter=a.enter().append(this._tagName).attr("class",function(t,e){return"d3plus-Shape d3plus-".concat(n._name," d3plus-id-").concat(wS(n._nestWrapper(n._id)(t,e)))}).call(this._applyTransform.bind(this)).attr("aria-label",this._ariaLabel).attr("role",this._role).attr("opacity",this._nestWrapper(this._opacity));var s=o.merge(a);var u=s.attr("shape-rendering",this._nestWrapper(this._shapeRendering));if(this._duration){u=u.attr("pointer-events","none").transition(this._transition).transition().delay(100).attr("pointer-events",this._pointerEvents)}u.attr("opacity",this._nestWrapper(this._opacity));var l=this._exit=a.exit();if(this._duration)l.transition().delay(this._duration).remove();else l.remove();this._renderImage();this._renderLabels();this._hoverGroup=fw("g.d3plus-".concat(this._name,"-hover"),{parent:this._group});this._activeGroup=fw("g.d3plus-".concat(this._name,"-active"),{parent:this._group});var c=this._group.selectAll(".d3plus-HitArea").data(this._hitArea&&Object.keys(this._on).length?i:[],r);c.order().call(this._applyTransform.bind(this));var f=this._name==="Line";f&&this._path.curve(rS["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var h=c.enter().append(f?"path":"rect").attr("class",function(t,e){return"d3plus-HitArea d3plus-id-".concat(wS(n._nestWrapper(n._id)(t,e)))}).attr("fill","black").attr("stroke","black").attr("pointer-events","painted").attr("opacity",0).call(this._applyTransform.bind(this));var d=this;var g=c.merge(h).each(function(t){var e=d._data.indexOf(t);var n=d._hitArea(t,e,d._aes(t,e));return n&&!(d._name==="Line"&&parseFloat(d._strokeWidth(t,e))>10)?Yo(this).call(nl,n):Yo(this).remove()});c.exit().remove();this._applyEvents(this._hitArea?g:s);setTimeout(function(){if(n._active)n._renderActive();else if(n._hover)n._renderHover();if(e)e()},this._duration+100);return this}},{key:"active",value:function t(e){if(!arguments.length||e===undefined)return this._active;this._active=e;if(this._group){this._renderActive()}return this}},{key:"activeOpacity",value:function t(e){return arguments.length?(this._activeOpacity=e,this):this._activeOpacity}},{key:"activeStyle",value:function t(e){return arguments.length?(this._activeStyle=el({},this._activeStyle,e),this):this._activeStyle}},{key:"ariaLabel",value:function t(e){return e!==undefined?(this._ariaLabel=typeof e==="function"?e:cw(e),this):this._ariaLabel}},{key:"backgroundImage",value:function t(e){return arguments.length?(this._backgroundImage=typeof e==="function"?e:cw(e),this):this._backgroundImage}},{key:"data",value:function t(e){return arguments.length?(this._data=e,this):this._data}},{key:"discrete",value:function t(e){return arguments.length?(this._discrete=e,this):this._discrete}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"fill",value:function t(e){return arguments.length?(this._fill=typeof e==="function"?e:cw(e),this):this._fill}},{key:"fillOpacity",value:function t(e){return arguments.length?(this._fillOpacity=typeof e==="function"?e:cw(e),this):this._fillOpacity}},{key:"hover",value:function t(e){if(!arguments.length||e===void 0)return this._hover;this._hover=e;if(this._group){this._renderHover()}return this}},{key:"hoverStyle",value:function t(e){return arguments.length?(this._hoverStyle=el({},this._hoverStyle,e),this):this._hoverStyle}},{key:"hoverOpacity",value:function t(e){return arguments.length?(this._hoverOpacity=e,this):this._hoverOpacity}},{key:"hitArea",value:function t(e){return arguments.length?(this._hitArea=typeof e==="function"?e:cw(e),this):this._hitArea}},{key:"id",value:function t(e){return arguments.length?(this._id=e,this):this._id}},{key:"label",value:function t(e){return arguments.length?(this._label=typeof e==="function"?e:cw(e),this):this._label}},{key:"labelBounds",value:function t(e){return arguments.length?(this._labelBounds=typeof e==="function"?e:cw(e),this):this._labelBounds}},{key:"labelConfig",value:function t(e){return arguments.length?(this._labelConfig=el(this._labelConfig,e),this):this._labelConfig}},{key:"opacity",value:function t(e){return arguments.length?(this._opacity=typeof e==="function"?e:cw(e),this):this._opacity}},{key:"pointerEvents",value:function t(e){return arguments.length?(this._pointerEvents=typeof e==="function"?e:cw(e),this):this._pointerEvents}},{key:"role",value:function t(e){return e!==undefined?(this._role=typeof e==="function"?e:cw(e),this):this._role}},{key:"rotate",value:function t(e){return arguments.length?(this._rotate=typeof e==="function"?e:cw(e),this):this._rotate}},{key:"rx",value:function t(e){return arguments.length?(this._rx=typeof e==="function"?e:cw(e),this):this._rx}},{key:"ry",value:function t(e){return arguments.length?(this._ry=typeof e==="function"?e:cw(e),this):this._ry}},{key:"scale",value:function t(e){return arguments.length?(this._scale=typeof e==="function"?e:cw(e),this):this._scale}},{key:"select",value:function t(e){return arguments.length?(this._select=Yo(e),this):this._select}},{key:"shapeRendering",value:function t(e){return arguments.length?(this._shapeRendering=typeof e==="function"?e:cw(e),this):this._shapeRendering}},{key:"sort",value:function t(e){return arguments.length?(this._sort=e,this):this._sort}},{key:"stroke",value:function t(e){return arguments.length?(this._stroke=typeof e==="function"?e:cw(e),this):this._stroke}},{key:"strokeDasharray",value:function t(e){return arguments.length?(this._strokeDasharray=typeof e==="function"?e:cw(e),this):this._strokeDasharray}},{key:"strokeLinecap",value:function t(e){return arguments.length?(this._strokeLinecap=typeof e==="function"?e:cw(e),this):this._strokeLinecap}},{key:"strokeOpacity",value:function t(e){return arguments.length?(this._strokeOpacity=typeof e==="function"?e:cw(e),this):this._strokeOpacity}},{key:"strokeWidth",value:function t(e){return arguments.length?(this._strokeWidth=typeof e==="function"?e:cw(e),this):this._strokeWidth}},{key:"textAnchor",value:function t(e){return arguments.length?(this._textAnchor=typeof e==="function"?e:cw(e),this):this._textAnchor}},{key:"vectorEffect",value:function t(e){return arguments.length?(this._vectorEffect=typeof e==="function"?e:cw(e),this):this._vectorEffect}},{key:"verticalAlign",value:function t(e){return arguments.length?(this._verticalAlign=typeof e==="function"?e:cw(e),this):this._verticalAlign}},{key:"x",value:function t(e){return arguments.length?(this._x=typeof e==="function"?e:cw(e),this):this._x}},{key:"y",value:function t(e){return arguments.length?(this._y=typeof e==="function"?e:cw(e),this):this._y}}]);return n}(ow);function gC(t,e){var r=[];var a=[];function o(t,e){if(t.length===1){r.push(t[0]);a.push(t[0])}else{var n=Array(t.length-1);for(var i=0;i=3){e.x1=t[1][0];e.y1=t[1][1]}e.x=t[t.length-1][0];e.y=t[t.length-1][1];if(t.length===4){e.type="C"}else if(t.length===3){e.type="Q"}else{e.type="L"}return e}function vC(t,e){e=e||2;var n=[];var i=t;var r=1/e;for(var a=0;a0){i-=1}else if(i0){i-=1}}}t[i]=(t[i]||0)+1;return t},[]);var r=i.reduce(function(t,e,n){if(n===a.length-1){var i=bC(e,Object.assign({},a[a.length-1]));if(i[0].type==="M"){i.forEach(function(t){t.type="L"})}return t.concat(i)}return t.concat(kC(a[n],a[n+1],e))},[]);r.unshift(a[0]);return r}function CC(t){var e=(t||"").match(yC)||[];var n=[];var i;var r;for(var a=0;a0&&c[c.length-1].type==="Z"){c.pop()}if(f.length>0&&f[f.length-1].type==="Z"){f.pop()}if(!c.length){c.push(f[0])}else if(!f.length){f.push(c[0])}var i=Math.abs(f.length-c.length);if(i!==0){if(f.length>c.length){c=SC(c,f,e)}else if(f.length0){for(var n=0;n1&&TC(t[n[i-2]],t[n[i-1]],t[r])<=0){--i}n[i++]=r}return n.slice(0,i)}function BC(t){if((n=t.length)<3)return null;var e,n,i=new Array(n),r=new Array(n);for(e=0;e=0;--e){l.push(t[i[a[e]][2]])}for(e=+s;ea!==s>a&&r<(o-u)*(a-l)/(s-l)+u)c=!c;o=u,s=l}return c}function NC(t,e,n,i){var r=1e-9;var a=t[0]-e[0],o=n[0]-i[0],s=t[1]-e[1],u=n[1]-i[1];var l=a*u-s*o;if(Math.abs(l)t.length)e=t.length;for(var n=0,i=new Array(e);nMath.max(t[0],e[0])+i||oMath.max(t[1],e[1])+i)}function VC(t,e,n,i){var r=NC(t,e,n,i);if(!r)return false;return GC(t,e,r)&&GC(n,i,r)}function UC(t,e){var n=-1;var i=t.length;var r=e.length;var a=t[i-1];while(++nt.length)e=t.length;for(var n=0,i=new Array(e);n2&&arguments[2]!==undefined?arguments[2]:0;var i=1e-9;e=[e[0]+i*Math.cos(n),e[1]+i*Math.sin(n)];var r=e,a=WC(r,2),o=a[0],s=a[1];var u=[o+Math.cos(n),s+Math.sin(n)];var l=0;if(Math.abs(u[0]-o)e[l]){if(_2&&arguments[2]!==undefined?arguments[2]:[0,0];var i=Math.cos(e),r=Math.sin(e),a=t[0]-n[0],o=t[1]-n[1];return[i*a-r*o+n[0],r*a+i*o+n[1]]}var QC=function t(e,n){var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[0,0];return e.map(function(t){return JC(t,n,i)})};function tE(t,e,n){var i=e[0],r=e[1];var a=n[0]-i,o=n[1]-r;if(a!==0||o!==0){var s=((t[0]-i)*a+(t[1]-r)*o)/(a*a+o*o);if(s>1){i=n[0];r=n[1]}else if(s>0){i+=a*s;r+=o*s}}a=t[0]-i;o=t[1]-r;return a*a+o*o}function eE(t,e){var n,i=t[0];var r=[i];for(var a=1,o=t.length;ae){r.push(n);i=n}}if(i!==n)r.push(n);return r}function nE(t,e,n,i,r){var a,o=i;for(var s=e+1;so){a=s;o=u}}if(o>i){if(a-e>1)nE(t,e,a,i,r);r.push(t[a]);if(n-a>1)nE(t,a,n,i,r)}}function iE(t,e){var n=t.length-1;var i=[t[0]];nE(t,0,n,e,i);i.push(t[n]);return i}var rE=function t(e){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(e.length<=2)return e;var r=n*n;e=i?e:eE(e,r);e=iE(e,r);return e};function aE(t,e){return cE(t)||lE(t,e)||sE(t,e)||oE()}function oE(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function sE(t,e){if(!t)return;if(typeof t==="string")return uE(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return uE(t,e)}function uE(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,i=new Array(e);n1&&arguments[1]!==undefined?arguments[1]:{};if(t.length<3){if(e.verbose)console.error("polygon has to have at least 3 points",t);return null}var n=[];e=Object.assign({angle:le(-90,90+hE,hE),cache:true,maxAspectRatio:15,minAspectRatio:1,minHeight:0,minWidth:0,nTries:20,tolerance:.02,verbose:false},e);var i=e.angle instanceof Array?e.angle:typeof e.angle==="number"?[e.angle]:typeof e.angle==="string"&&!isNaN(e.angle)?[Number(e.angle)]:[];var r=e.aspectRatio instanceof Array?e.aspectRatio:typeof e.aspectRatio==="number"?[e.aspectRatio]:typeof e.aspectRatio==="string"&&!isNaN(e.aspectRatio)?[Number(e.aspectRatio)]:[];var a=e.origin&&e.origin instanceof Array?e.origin[0]instanceof Array?e.origin:[e.origin]:[];var o;if(e.cache){o=he(t).join(",");o+="-".concat(e.minAspectRatio);o+="-".concat(e.maxAspectRatio);o+="-".concat(e.minHeight);o+="-".concat(e.minWidth);o+="-".concat(i.join(","));o+="-".concat(a.join(","));if(dE[o])return dE[o]}var s=Math.abs(RC(t));if(s===0){if(e.verbose)console.error("polygon has 0 area",t);return null}var u=ue(t,function(t){return t[0]}),l=aE(u,2),c=l[0],f=l[1];var h=ue(t,function(t){return t[1]}),d=aE(h,2),g=d[0],p=d[1];var v=Math.min(f-c,p-g)*e.tolerance;if(v>0)t=rE(t,v);if(e.events)n.push({type:"simplify",poly:t});var m=ue(t,function(t){return t[0]});var y=aE(m,2);c=y[0];f=y[1];var _=ue(t,function(t){return t[1]});var b=aE(_,2);g=b[0];p=b[1];var w=f-c,x=p-g;var k=Math.min(w,x)/50;if(!a.length){var S=MC(t);if(!isFinite(S[0])){if(e.verbose)console.error("cannot find centroid",t);return null}if(DC(t,S))a.push(S);var C=e.nTries;while(C){var E=Math.random()*w+c;var A=Math.random()*x+g;var R=[E,A];if(DC(t,R)){a.push(R)}C--}}if(e.events)n.push({type:"origins",points:a});var M=0;var T=null;for(var P=0;P=k)n.push({type:"aRatio",aRatio:lt});while(ft-ct>=k){var ht=(ct+ft)/2;var dt=ht/lt;var gt=aE(q,2),pt=gt[0],vt=gt[1];var mt=[[pt-ht/2,vt-dt/2],[pt+ht/2,vt-dt/2],[pt+ht/2,vt+dt/2],[pt-ht/2,vt+dt/2]];mt=QC(mt,B,q);var yt=UC(mt,t);if(yt){M=ht*dt;mt.push(mt[0]);T={area:M,cx:pt,cy:vt,width:ht,height:dt,angle:-O,points:mt};ct=ht}else{ft=ht}if(e.events)n.push({type:"rectangle",areaFraction:ht*dt/s,cx:pt,cy:vt,width:ht,height:dt,angle:O,insidePoly:yt})}}}}}if(e.cache){dE[o]=T}return e.events?Object.assign(T||{},{events:n}):T}function pE(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){pE=function t(e){return typeof e}}else{pE=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return pE(t)}function vE(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function mE(t,e){for(var n=0;na[0][1])o=o.reverse();o.push(o[0]);return{points:o}}},{key:"_dataFilter",value:function t(i){var r=this;var e=Fe().key(this._id).entries(i).map(function(t){t.data=dw(t.values);t.i=i.indexOf(t.values[0]);var e=ue(t.values.map(r._x).concat(t.values.map(r._x0)).concat(r._x1?t.values.map(r._x1):[]));t.xR=e;t.width=e[1]-e[0];t.x=e[0]+t.width/2;var n=ue(t.values.map(r._y).concat(t.values.map(r._y0)).concat(r._y1?t.values.map(r._y1):[]));t.yR=n;t.height=n[1]-n[0];t.y=n[0]+t.height/2;t.nested=true;t.translate=[t.x,t.y];t.__d3plusShape__=true;return t});e.key=function(t){return t.key};return e}},{key:"render",value:function t(e){var n=this;_E(AE(a.prototype),"render",this).call(this,e);var i=this._path=gx().defined(this._defined).curve(rS["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).x0(this._x0).x1(this._x1).y(this._y).y0(this._y0).y1(this._y1);var r=gx().defined(function(t){return t}).curve(rS["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).x(this._x).y(this._y).x0(function(t,e){return n._x1?n._x0(t,e)+(n._x1(t,e)-n._x0(t,e))/2:n._x0(t,e)}).x1(function(t,e){return n._x1?n._x0(t,e)+(n._x1(t,e)-n._x0(t,e))/2:n._x0(t,e)}).y0(function(t,e){return n._y1?n._y0(t,e)+(n._y1(t,e)-n._y0(t,e))/2:n._y0(t,e)}).y1(function(t,e){return n._y1?n._y0(t,e)+(n._y1(t,e)-n._y0(t,e))/2:n._y0(t,e)});this._enter.append("path").attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).attr("d",function(t){return r(t.values)}).call(this._applyStyle.bind(this)).transition(this._transition).attrTween("d",function(t){return AC(Yo(this).attr("d"),i(t.values))});this._update.select("path").transition(this._transition).attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).attrTween("d",function(t){return AC(Yo(this).attr("d"),i(t.values))}).call(this._applyStyle.bind(this));this._exit.select("path").transition(this._transition).attrTween("d",function(t){return AC(Yo(this).attr("d"),r(t.values))});return this}},{key:"curve",value:function t(e){return arguments.length?(this._curve=e,this):this._curve}},{key:"defined",value:function t(e){return arguments.length?(this._defined=e,this):this._defined}},{key:"x",value:function t(e){if(!arguments.length)return this._x;this._x=typeof e==="function"?e:cw(e);this._x0=this._x;return this}},{key:"x0",value:function t(e){if(!arguments.length)return this._x0;this._x0=typeof e==="function"?e:cw(e);this._x=this._x0;return this}},{key:"x1",value:function t(e){return arguments.length?(this._x1=typeof e==="function"||e===null?e:cw(e),this):this._x1}},{key:"y",value:function t(e){if(!arguments.length)return this._y;this._y=typeof e==="function"?e:cw(e);this._y0=this._y;return this}},{key:"y0",value:function t(e){if(!arguments.length)return this._y0;this._y0=typeof e==="function"?e:cw(e);this._y=this._y0;return this}},{key:"y1",value:function t(e){return arguments.length?(this._y1=typeof e==="function"||e===null?e:cw(e),this):this._y1}}]);return a}(dC);function ME(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){ME=function t(e){return typeof e}}else{ME=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return ME(t)}function TE(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function PE(t,e){for(var n=0;n=t.initialLength)break}}if(n.length>1&&n.length%2)n.pop();n[n.length-1]+=t.initialLength-ge(n);if(n.length%2===0)n.push(0);t.initialStrokeArray=n.join(" ")}this._path.curve(rS["curve".concat(this._curve.charAt(0).toUpperCase()).concat(this._curve.slice(1))]).defined(this._defined).x(this._x).y(this._y);var r=this._enter.append("path").attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).attr("d",function(t){return n._path(t.values)}).call(this._applyStyle.bind(this));var a=this._update.select("path").attr("stroke-dasharray",function(t){return o._strokeDasharray(t.values[0],o._data.indexOf(t.values[0]))});if(this._duration){r.each(i).attr("stroke-dasharray",function(t){return"".concat(t.initialStrokeArray," ").concat(t.initialLength)}).attr("stroke-dashoffset",function(t){return t.initialLength}).transition(this._transition).attr("stroke-dashoffset",0);a=a.transition(this._transition).attrTween("d",function(t){return AC(Yo(this).attr("d"),o._path(t.values))});this._exit.selectAll("path").each(i).attr("stroke-dasharray",function(t){return"".concat(t.initialStrokeArray," ").concat(t.initialLength)}).transition(this._transition).attr("stroke-dashoffset",function(t){return-t.initialLength})}else{a=a.attr("d",function(t){return o._path(t.values)})}a.attr("transform",function(t){return"translate(".concat(-t.xR[0]-t.width/2,", ").concat(-t.yR[0]-t.height/2,")")}).call(this._applyStyle.bind(this));return this}},{key:"_aes",value:function t(e,n){var i=this;return{points:e.values.map(function(t){return[i._x(t,n),i._y(t,n)]})}}},{key:"curve",value:function t(e){return arguments.length?(this._curve=e,this):this._curve}},{key:"defined",value:function t(e){return arguments.length?(this._defined=e,this):this._defined}}]);return s}(dC);function PA(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){PA=function t(e){return typeof e}}else{PA=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return PA(t)}function OA(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function BA(t,e){for(var n=0;nce(t))r.upperLimit=ce(t)}else if(e[1]==="extent")r.upperLimit=ce(t);else if(typeof e[1]==="number")r.upperLimit=zt(t,e[1]);var n=r.third-r.first;if(r.orient==="vertical"){r.height=n;r.width=a._rectWidth(r.data,r.i);r.x=a._x(r.data,r.i);r.y=r.first+n/2}else if(r.orient==="horizontal"){r.height=a._rectWidth(r.data,r.i);r.width=n;r.x=r.first+n/2;r.y=a._y(r.data,r.i)}r.values.forEach(function(t,e){var n=r.orient==="vertical"?a._y(t,e):a._x(t,e);if(nr.upperLimit){var i={};i.__d3plus__=true;i.data=t;i.i=e;i.outlier=a._outlier(t,e);if(r.orient==="vertical"){i.x=r.x;i.y=n;o.push(i)}else if(r.orient==="horizontal"){i.y=r.y;i.x=n;o.push(i)}}});r.__d3plus__=true;return r});this._box=(new vA).data(e).x(function(t){return t.x}).y(function(t){return t.y}).select(fw("g.d3plus-Box",{parent:this._select}).node()).config(lw.bind(this)(this._rectConfig,"shape")).render();this._median=(new vA).data(e).x(function(t){return t.orient==="vertical"?t.x:t.median}).y(function(t){return t.orient==="vertical"?t.median:t.y}).height(function(t){return t.orient==="vertical"?1:t.height}).width(function(t){return t.orient==="vertical"?t.width:1}).select(fw("g.d3plus-Box-Median",{parent:this._select}).node()).config(lw.bind(this)(this._medianConfig,"shape")).render();var c=[];e.forEach(function(t,e){var n=t.x;var i=t.y;var r=t.first-t.lowerLimit;var a=t.upperLimit-t.third;if(t.orient==="vertical"){var o=i-t.height/2;var s=i+t.height/2;c.push({__d3plus__:true,data:t,i:e,x:n,y:o,length:r,orient:"top"},{__d3plus__:true,data:t,i:e,x:n,y:s,length:a,orient:"bottom"})}else if(t.orient==="horizontal"){var u=n+t.width/2;var l=n-t.width/2;c.push({__d3plus__:true,data:t,i:e,x:u,y:i,length:a,orient:"right"},{__d3plus__:true,data:t,i:e,x:l,y:i,length:r,orient:"left"})}});this._whisker=(new VA).data(c).select(fw("g.d3plus-Box-Whisker",{parent:this._select}).node()).config(lw.bind(this)(this._whiskerConfig,"shape")).render();this._whiskerEndpoint=[];Fe().key(function(t){return t.outlier}).entries(o).forEach(function(t){var e=t.key;a._whiskerEndpoint.push((new eR[e]).data(t.values).select(fw("g.d3plus-Box-Outlier-".concat(e),{parent:a._select}).node()).config(lw.bind(a)(a._outlierConfig,"shape",e)).render())});return this}},{key:"active",value:function t(e){if(this._box)this._box.active(e);if(this._median)this._median.active(e);if(this._whisker)this._whisker.active(e);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(t){return t.active(e)})}},{key:"data",value:function t(e){return arguments.length?(this._data=e,this):this._data}},{key:"hover",value:function t(e){if(this._box)this._box.hover(e);if(this._median)this._median.hover(e);if(this._whisker)this._whisker.hover(e);if(this._whiskerEndpoint)this._whiskerEndpoint.forEach(function(t){return t.hover(e)})}},{key:"medianConfig",value:function t(e){return arguments.length?(this._medianConfig=el(this._medianConfig,e),this):this._medianConfig}},{key:"orient",value:function t(e){return arguments.length?(this._orient=typeof e==="function"?e:cw(e),this):this._orient}},{key:"outlier",value:function t(e){return arguments.length?(this._outlier=typeof e==="function"?e:cw(e),this):this._outlier}},{key:"outlierConfig",value:function t(e){return arguments.length?(this._outlierConfig=el(this._outlierConfig,e),this):this._outlierConfig}},{key:"rectConfig",value:function t(e){return arguments.length?(this._rectConfig=el(this._rectConfig,e),this):this._rectConfig}},{key:"rectWidth",value:function t(e){return arguments.length?(this._rectWidth=typeof e==="function"?e:cw(e),this):this._rectWidth}},{key:"select",value:function t(e){return arguments.length?(this._select=Yo(e),this):this._select}},{key:"whiskerConfig",value:function t(e){return arguments.length?(this._whiskerConfig=el(this._whiskerConfig,e),this):this._whiskerConfig}},{key:"whiskerMode",value:function t(e){return arguments.length?(this._whiskerMode=e instanceof Array?e:[e,e],this):this._whiskerMode}},{key:"x",value:function t(e){return arguments.length?(this._x=typeof e==="function"?e:$u(e),this):this._x}},{key:"y",value:function t(e){return arguments.length?(this._y=typeof e==="function"?e:$u(e),this):this._y}}]);return n}(ow);var iR=Math.PI;var rR=function t(e,n){var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"circle";if(e<0)e=iR*2+e;if(i==="square"){var r=45*(iR/180);var a=0,o=0;if(e1&&arguments[1]!==undefined?arguments[1]:20;var i=[],r=/([MLA])([^MLAZ]+)/gi;var a=r.exec(e);while(a!==null){if(["M","L"].includes(a[1]))i.push(a[2].split(",").map(Number));else if(a[1]==="A"){var o=a[2].split(",").map(Number);var s=o.slice(o.length-2,o.length),u=i[i.length-1],l=o[0],c=eC(u,s);var f=Math.acos((l*l+l*l-c*c)/(2*l*l));if(o[2])f=aR*2-f;var h=f/(f/(aR*2)*(l*aR*2)/n);var d=Math.atan2(-u[1],-u[0])-aR;var g=h;while(g5&&t%1===0)return new Date(t);var e="".concat(t);var n=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(e),i=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(e);if(n){var r=n[1];if(r.indexOf("-")===0)e=e.replace(r,r.substr(1));var a=new Date(e);a.setFullYear(r);return a}else if(i){var o=i[1];if(o.indexOf("-")===0)e=e.replace(o,o.substr(1));var s=new Date(e);s.setFullYear(o);return s}else if(!e.includes("/")&&!e.includes(" ")&&(!e.includes("-")||!e.indexOf("-"))){var u=new Date("".concat(e,"/01/01"));u.setFullYear(t);return u}else return new Date(e)}var kR={"de-DE":{dateTime:"%A, der %e. %B %Y, %X",date:"%d.%m.%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],shortDays:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],shortMonths:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"]},"en-GB":{dateTime:"%a %e %b %X %Y",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"en-US":{dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]},"es-ES":{dateTime:"%A, %e de %B de %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"es-MX":{dateTime:"%x, %X",date:"%d/%m/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],shortDays:["dom","lun","mar","mié","jue","vie","sáb"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],shortMonths:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"]},"fr-FR":{dateTime:"%A, le %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],shortDays:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],shortMonths:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."]},"it-IT":{dateTime:"%A %e %B %Y, %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],shortDays:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],shortMonths:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"]},"pt-BR":{dateTime:"%A, %e de %B de %Y. %X",date:"%d/%m/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],shortDays:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],shortMonths:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"]}};function SR(t,e,n){if(e in t){Object.defineProperty(t,e,{value:n,enumerable:true,configurable:true,writable:true})}else{t[e]=n}return t}function CR(t){return MR(t)||RR(t)||AR(t)||ER()}function ER(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function AR(t,e){if(!t)return;if(typeof t==="string")return TR(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return TR(t,e)}function RR(t){if(typeof Symbol!=="undefined"&&Symbol.iterator in Object(t))return Array.from(t)}function MR(t){if(Array.isArray(t))return TR(t)}function TR(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,i=new Array(e);ne[1]?n.reverse():n}},{key:"_getPosition",value:function t(e){return e<0&&this._d3ScaleNegative?this._d3ScaleNegative(e):this._d3Scale(e)}},{key:"_getRange",value:function t(){var e=[];if(this._d3ScaleNegative)e=this._d3ScaleNegative.range();if(this._d3Scale)e=e.concat(this._d3Scale.range());return e[0]>e[1]?ue(e).reverse():ue(e)}},{key:"_getTicks",value:function t(){var e=Er().domain([10,400]).range([10,50]);var n=[];if(this._d3ScaleNegative){var i=this._d3ScaleNegative.range();var r=i[1]-i[0];n=this._d3ScaleNegative.ticks(Math.floor(r/e(r)))}if(this._d3Scale){var a=this._d3Scale.range();var o=a[1]-a[0];n=n.concat(this._d3Scale.ticks(Math.floor(o/e(o))))}return n}},{key:"_gridPosition",value:function t(e){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var i=this._position,r=i.height,a=i.x,o=i.y,s=i.opposite,u=this._margin[s],l=["top","left"].includes(this._orient)?this._outerBounds[o]+this._outerBounds[r]-u:this._outerBounds[o]+u,c=n?this._lastScale||this._getPosition.bind(this):this._getPosition.bind(this),f=["top","left"].includes(this._orient)?u:-u,h=this._scale==="band"?this._d3Scale.bandwidth()/2:0,d=function t(e){return c(e.id)+h};e.call(nl,this._gridConfig).attr("".concat(a,"1"),d).attr("".concat(a,"2"),d).attr("".concat(o,"1"),l).attr("".concat(o,"2"),n?l:l+f)}},{key:"render",value:function t(e){var d=this,n;if(this._select===void 0){this.select(Yo("body").append("svg").attr("width","".concat(this._width,"px")).attr("height","".concat(this._height,"px")).node())}var i=this._timeLocale||kR[this._locale]||kR["en-US"];Be(i).format();var s=Me("%a %d"),u=Me("%I %p"),l=Me(".%L"),c=Me("%I:%M"),f=Me("%b"),h=Me(":%S"),g=Me("%b %d"),p=Me("%Y");var r=this._position,a=r.width,v=r.height,m=r.x,y=r.y,_=r.horizontal,b=r.opposite,o="d3plus-Axis-clip-".concat(this._uuid),w=["top","left"].includes(this._orient),x=this._padding,k=this._select,C=[x,this["_".concat(a)]-x],S=Uu().duration(this._duration);var E=this._shape==="Circle"?this._shapeConfig.r:this._shape==="Rect"?this._shapeConfig[a]:this._shapeConfig.strokeWidth;var A=typeof E!=="function"?function(){return E}:E;var R=this._margin={top:0,right:0,bottom:0,left:0};var M,T,P;var O=this._tickFormat?this._tickFormat:function(t){if(d._scale==="time"){return(mt(t)=1e3?i[d._tickUnit+8]:"";var a=t/Math.pow(10,3*d._tickUnit);var o=xw(a,e,",.".concat(a.toString().length,"r"));return"".concat(o).concat(n).concat(r)}else{return xw(t,d._locale)}};function B(){var r=this;var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this._range;T=t?t.slice():[undefined,undefined];var e=C[0],n=C[1];if(this._range){if(this._range[0]!==undefined)e=this._range[0];if(this._range[this._range.length-1]!==undefined)n=this._range[this._range.length-1]}if(T[0]===undefined||T[0]n)T[1]=n;var i=n-e;if(this._scale==="ordinal"&&this._domain.length>T.length){if(t===this._range){var a=this._domain.length+1;T=le(a).map(function(t){return T[0]+i*(t/(a-1))}).slice(1,a);T=T.map(function(t){return t-T[0]/2})}else{var o=this._domain.length;var s=T[1]-T[0];T=le(o).map(function(t){return T[0]+s*(t/(o-1))})}}else if(t===this._range){var u=Er().domain([10,400]).range([10,50]);var l=this._scale==="time"?this._domain.map(xR):this._domain;var c=vt(l[0],l[1],Math.floor(i/u(i)));P=(this._ticks?this._scale==="time"?this._ticks.map(xR):this._ticks:c).slice();M=(this._labels?this._scale==="time"?this._labels.map(xR):this._labels:c).slice();var f=M.length;if(f){var h=Math.ceil(i/f/2);T=[T[0]+h,T[1]-h]}}var d="scale".concat(this._scale.charAt(0).toUpperCase()).concat(this._scale.slice(1));this._d3Scale=na[d]().domain(this._scale==="time"?this._domain.map(xR):this._domain).range(T);if(this._d3Scale.padding)this._d3Scale.padding(this._scalePadding);if(this._d3Scale.paddingInner)this._d3Scale.paddingInner(this._paddingInner);if(this._d3Scale.paddingOuter)this._d3Scale.paddingOuter(this._paddingOuter);this._d3ScaleNegative=null;if(this._scale==="log"){var g=this._d3Scale.domain();if(g[0]===0){g[0]=Math.abs(g[g.length-1])<=1?1e-6:1;if(g[g.length-1]<0)g[0]*=-1}else if(g[g.length-1]===0){g[g.length-1]=Math.abs(g[0])<=1?1e-6:1;if(g[0]<0)g[g.length-1]*=-1}var p=this._d3Scale.range();if(g[0]<0&&g[g.length-1]<0){this._d3ScaleNegative=this._d3Scale.copy().domain(g).range(p);this._d3Scale=null}else if(g[0]>0&&g[g.length-1]>0){this._d3Scale.domain(g).range(p)}else{var v=vr().domain([1,g[g[1]>0?1:0]]).range([0,1]);var m=v(Math.abs(g[g[1]<0?1:0]));var y=m/(m+1)*(p[1]-p[0]);if(g[0]>0)y=p[1]-p[0]-y;this._d3ScaleNegative=this._d3Scale.copy();(g[0]<0?this._d3Scale:this._d3ScaleNegative).domain([Math.sign(g[1]),g[1]]).range([p[0]+y,p[1]]);(g[0]<0?this._d3ScaleNegative:this._d3Scale).domain([g[0],Math.sign(g[0])]).range([p[0],p[0]+y])}}P=(this._ticks?this._scale==="time"?this._ticks.map(xR):this._ticks:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():this._domain).slice();M=(this._labels?this._scale==="time"?this._labels.map(xR):this._labels:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():P).slice();if(this._scale==="log"){var _=M.filter(function(t,e){return!e||e===M.length-1||Math.abs(t).toString().charAt(0)==="1"&&(r._d3Scale?t!==-1:t!==1)});if(_.length>2){M=_}else if(M.length>=10){M=M.filter(function(t){return t%5===0||O(t).substr(-1)==="1"})}if(M.includes(-1)&&M.includes(1)&&M.some(function(t){return t>10||t<10})){M.splice(M.indexOf(-1),1)}}if(this._scale==="time"){P=P.map(Number);M=M.map(Number)}P=P.sort(function(t,e){return r._getPosition(t)-r._getPosition(e)});M=M.sort(function(t,e){return r._getPosition(t)-r._getPosition(e)});if(this._scale==="linear"&&this._tickSuffix==="smallest"){var b=M.filter(function(t){return t>=1e3});if(b.length>0){var w=Math.min.apply(Math,CR(b));var x=1;while(x&&x<7){var k=Math.pow(10,3*x);if(w/k>=1){this._tickUnit=x;x+=1}else{break}}}}var S=[];this._availableTicks=P;P.forEach(function(t,e){var n=A({id:t,tick:true},e);if(r._shape==="Circle")n*=2;var i=r._getPosition(t);if(!S.length||Math.abs(sw(i,S)-i)>n*2)S.push(i);else S.push(false)});P=P.filter(function(t,e){return S[e]!==false});this._visibleTicks=P}B.bind(this)();function D(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var n=t.i,i=t.position;if(this._scale==="band"){return this._d3Scale.bandwidth()}else{var r=n-e<0?V.length===1||!this._range?C[0]:(i-V[n+e].position)/2-i:i-(i-V[n-e].position)/2;var a=Math.abs(i-r);var o=n+e>V.length-1?V.length===1||!this._range?C[1]:(i-V[n-e].position)/2-i:i-(i-V[n+e].position)/2;var s=Math.abs(i-o);return de([a,s])*2}}if(this._title){var N=this._titleConfig,z=N.fontFamily,j=N.fontSize,L=N.lineHeight;var F=jS().fontFamily(typeof z==="function"?z():z).fontSize(typeof j==="function"?j():j).lineHeight(typeof L==="function"?L():L).width(T[T.length-1]-T[0]-x*2).height(this["_".concat(v)]-this._tickSize-x*2);var I=F(this._title).lines.length;R[this._orient]=I*F.lineHeight()+x}var H=this._shape==="Circle"?typeof this._shapeConfig.r==="function"?this._shapeConfig.r({tick:true}):this._shapeConfig.r:this._shape==="Rect"?typeof this._shapeConfig[v]==="function"?this._shapeConfig[v]({tick:true}):this._shapeConfig[v]:this._tickSize,G=A({tick:true});if(typeof H==="function")H=ce(P.map(H));if(this._shape==="Rect")H/=2;if(typeof G==="function")G=ce(P.map(G));if(this._shape!=="Circle")G/=2;var V=M.map(function(t,e){var n=d._shapeConfig.labelConfig.fontFamily(t,e),i=d._shapeConfig.labelConfig.fontSize(t,e),r=d._getPosition(t);var a=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(t,e):i*1.4;return{d:t,i:e,fF:n,fS:i,lineHeight:a,position:r}});function U(t){var e=t.d,n=t.i,i=t.fF,r=t.fS,a=t.rotate,o=t.space;var s=a?"width":"height",u=a?"height":"width";var l=de([this._maxSize,this._width]);var c=de([this._maxSize,this._height]);var f=jS().fontFamily(i).fontSize(r).lineHeight(this._shapeConfig.lineHeight?this._shapeConfig.lineHeight(e,n):undefined)[u](_?o:l-H-x-this._margin.left-this._margin.right)[s](_?c-H-x-this._margin.top-this._margin.bottom:o);var h=f(O(e));h.lines=h.lines.filter(function(t){return t!==""});h.width=h.lines.length?Math.ceil(ce(h.widths))+r/4:0;if(h.width%2)h.width++;h.height=h.lines.length?Math.ceil(h.lines.length*f.lineHeight())+r/4:0;if(h.height%2)h.height++;return h}function W(){var r=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var a=0;r.forEach(function(t){var e=r[t.i-1];var n=t.rotate&&_||!t.rotate&&!_?"width":"height",i=t.rotate&&_||!t.rotate&&!_?"height":"width";if(!e){a=1}else if(e.position+e[i]/2>t.position-t[i]/2){if(a){t.offset=e[n];a=0}else a=1}})}V=V.map(function(t){t.rotate=d._labelRotation;t.space=D.bind(d)(t);var e=U.bind(d)(t);return Object.assign(e,t)});this._rotateLabels=_&&this._labelRotation===undefined?V.some(function(t){return t.truncated}):this._labelRotation;var q=this._labelOffset&&V.some(function(t){return t.truncated});if(this._rotateLabels){V=V.map(function(t){t.rotate=true;var e=U.bind(d)(t);return Object.assign(t,e)})}else if(q){V=V.map(function(t){t.space=D.bind(d)(t,2);var e=U.bind(d)(t);return Object.assign(t,e)});W.bind(this)(V)}var K=[0,0];for(var Y=0;Y<2;Y++){var X=V[Y?V.length-1:0];if(!X)break;var Z=X.height,$=X.position,J=X.rotate,Q=X.width;var tt=Y?C[1]:C[0];var et=(J||!_?Z:Q)/2;var nt=Y?$+et-tt:$-et-tt;K[Y]=nt}var it=T[0];var rt=T[T.length-1];var at=[it-K[0],rt-K[1]];if(this._range){if(this._range[0]!==undefined)at[0]=this._range[0];if(this._range[this._range.length-1]!==undefined)at[1]=this._range[this._range.length-1]}if(at[0]!==it||at[1]!==rt){B.bind(this)(at);V=M.map(function(t,e){var n=d._shapeConfig.labelConfig.fontFamily(t,e),i=d._shapeConfig.labelConfig.fontSize(t,e),r=d._getPosition(t);var a=d._shapeConfig.lineHeight?d._shapeConfig.lineHeight(t,e):i*1.4;return{d:t,i:e,fF:n,fS:i,lineHeight:a,position:r}});V=V.map(function(t){t.rotate=d._rotateLabels;t.space=D.bind(d)(t,q?2:1);var e=U.bind(d)(t);return Object.assign(e,t)});W.bind(this)(V)}var ot=ce(V,function(t){return t.height})||0;this._rotateLabels=_&&this._labelRotation===undefined?V.some(function(t){var e=t.i,n=t.height,i=t.position,r=t.truncated;var a=V[e-1];return r||e&&a.position+a.height/2>i-n/2}):this._labelRotation;var st=this._labelOffset?ce(V,function(t){return t.offset||0}):0;V.forEach(function(t){return t.offset=t.offset?st:0});var ut=this._shape==="Line"?0:H;var lt=this._outerBounds=(n={},SR(n,v,(ce(V,function(t){return Math.ceil(t[t.rotate||!_?"width":"height"]+t.offset)})||0)+(V.length?x:0)),SR(n,a,C[C.length-1]-C[0]),SR(n,m,C[0]),n);lt[v]=ce([this._minSize,lt[v]]);R[this._orient]+=H;R[b]=this._gridSize!==undefined?ce([this._gridSize,ut]):this["_".concat(v)]-R[this._orient]-lt[v]-x;lt[v]+=R[b]+R[this._orient];lt[y]=this._align==="start"?this._padding:this._align==="end"?this["_".concat(v)]-lt[v]-this._padding:this["_".concat(v)]/2-lt[v]/2;var ct=fw("g#d3plus-Axis-".concat(this._uuid),{parent:k});this._group=ct;var ft=fw("g.grid",{parent:ct}).selectAll("line").data((this._gridSize!==0?this._grid||this._scale==="log"&&!this._gridLog?M:P:[]).map(function(t){return{id:t}}),function(t){return t.id});ft.exit().transition(S).attr("opacity",0).call(this._gridPosition.bind(this)).remove();ft.enter().append("line").attr("opacity",0).attr("clip-path","url(#".concat(o,")")).call(this._gridPosition.bind(this),true).merge(ft).transition(S).attr("opacity",1).call(this._gridPosition.bind(this));var ht=M.filter(function(t,e){return V[e].lines.length&&!P.includes(t)});var dt=V.some(function(t){return t.rotate});var gt=P.concat(ht).map(function(e){var t;var n=V.find(function(t){return t.d===e});var i=d._getPosition(e);var r=n?n.space:0;var a=n?n.lines.length:1;var o=n?n.lineHeight:1;var s=n&&d._labelOffset?n.offset:0;var u=_?r:lt.width-R[d._position.opposite]-H-R[d._orient]+x;var l=R[b],c=(H+s)*(w?-1:1),f=w?lt[y]+lt[v]-l:lt[y]+l;var h=(t={id:e,labelBounds:dt&&n?{x:-n.width/2+n.fS/4,y:d._orient==="bottom"?c+x+(n.width-o*a)/2:c-x*2-(n.width+o*a)/2,width:n.width,height:n.height}:{x:_?-r/2:d._orient==="left"?-u-x+c:c+x,y:_?d._orient==="bottom"?c+x:c-x-ot:-r/2,width:_?r:u,height:_?ot:r},rotate:n?n.rotate:false,size:M.includes(e)?c:0,text:M.includes(e)?O(e):false,tick:P.includes(e)},SR(t,m,i+(d._scale==="band"?d._d3Scale.bandwidth()/2:0)),SR(t,y,f),t);return h});if(this._shape==="Line"){gt=gt.concat(gt.map(function(t){var e=Object.assign({},t);e[y]+=t.size;return e}))}(new wR[this._shape]).data(gt).duration(this._duration).labelConfig({ellipsis:function t(e){return e&&e.length?"".concat(e,"..."):""},rotate:function t(e){return e.rotate?-90:0}}).select(fw("g.ticks",{parent:ct}).node()).config(this._shapeConfig).render();var pt=ct.selectAll("line.bar").data([null]);pt.enter().append("line").attr("class","bar").attr("opacity",0).call(this._barPosition.bind(this)).merge(pt).transition(S).attr("opacity",1).call(this._barPosition.bind(this));this._titleClass.data(this._title?[{text:this._title}]:[]).duration(this._duration).height(R[this._orient]).rotate(this._orient==="left"?-90:this._orient==="right"?90:0).select(fw("g.d3plus-Axis-title",{parent:ct}).node()).text(function(t){return t.text}).verticalAlign("middle").width(T[T.length-1]-T[0]).x(_?T[0]:this._orient==="left"?lt.x+R.left/2-(T[T.length-1]-T[0])/2:lt.x+lt.width-R.right/2-(T[T.length-1]-T[0])/2).y(_?this._orient==="bottom"?lt.y+lt.height-R.bottom:lt.y:T[0]+(T[T.length-1]-T[0])/2-R[this._orient]/2).config(this._titleConfig).render();this._lastScale=this._getPosition.bind(this);if(e)setTimeout(e,this._duration+100);return this}},{key:"align",value:function t(e){return arguments.length?(this._align=e,this):this._align}},{key:"barConfig",value:function t(e){return arguments.length?(this._barConfig=Object.assign(this._barConfig,e),this):this._barConfig}},{key:"domain",value:function t(e){return arguments.length?(this._domain=e,this):this._domain}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"grid",value:function t(e){return arguments.length?(this._grid=e,this):this._grid}},{key:"gridConfig",value:function t(e){return arguments.length?(this._gridConfig=Object.assign(this._gridConfig,e),this):this._gridConfig}},{key:"gridLog",value:function t(e){return arguments.length?(this._gridLog=e,this):this._gridLog}},{key:"gridSize",value:function t(e){return arguments.length?(this._gridSize=e,this):this._gridSize}},{key:"height",value:function t(e){return arguments.length?(this._height=e,this):this._height}},{key:"labels",value:function t(e){return arguments.length?(this._labels=e,this):this._labels}},{key:"labelOffset",value:function t(e){return arguments.length?(this._labelOffset=e,this):this._labelOffset}},{key:"labelRotation",value:function t(e){return arguments.length?(this._labelRotation=e,this):this._labelRotation}},{key:"maxSize",value:function t(e){return arguments.length?(this._maxSize=e,this):this._maxSize}},{key:"minSize",value:function t(e){return arguments.length?(this._minSize=e,this):this._minSize}},{key:"orient",value:function t(e){if(arguments.length){var n=["top","bottom"].includes(e),i={top:"bottom",right:"left",bottom:"top",left:"right"};this._position={horizontal:n,width:n?"width":"height",height:n?"height":"width",x:n?"x":"y",y:n?"y":"x",opposite:i[e]};return this._orient=e,this}return this._orient}},{key:"outerBounds",value:function t(){return this._outerBounds}},{key:"padding",value:function t(e){return arguments.length?(this._padding=e,this):this._padding}},{key:"paddingInner",value:function t(e){return arguments.length?(this._paddingInner=e,this):this._paddingInner}},{key:"paddingOuter",value:function t(e){return arguments.length?(this._paddingOuter=e,this):this._paddingOuter}},{key:"range",value:function t(e){return arguments.length?(this._range=e,this):this._range}},{key:"scale",value:function t(e){return arguments.length?(this._scale=e,this):this._scale}},{key:"scalePadding",value:function t(e){return arguments.length?(this._scalePadding=e,this):this._scalePadding}},{key:"select",value:function t(e){return arguments.length?(this._select=Yo(e),this):this._select}},{key:"shape",value:function t(e){return arguments.length?(this._shape=e,this):this._shape}},{key:"shapeConfig",value:function t(e){return arguments.length?(this._shapeConfig=el(this._shapeConfig,e),this):this._shapeConfig}},{key:"tickFormat",value:function t(e){return arguments.length?(this._tickFormat=e,this):this._tickFormat}},{key:"ticks",value:function t(e){return arguments.length?(this._ticks=e,this):this._ticks}},{key:"tickSize",value:function t(e){return arguments.length?(this._tickSize=e,this):this._tickSize}},{key:"tickSpecifier",value:function t(e){return arguments.length?(this._tickSpecifier=e,this):this._tickSpecifier}},{key:"tickSuffix",value:function t(e){return arguments.length?(this._tickSuffix=e,this):this._tickSuffix}},{key:"timeLocale",value:function t(e){return arguments.length?(this._timeLocale=e,this):this._timeLocale}},{key:"title",value:function t(e){return arguments.length?(this._title=e,this):this._title}},{key:"titleConfig",value:function t(e){return arguments.length?(this._titleConfig=Object.assign(this._titleConfig,e),this):this._titleConfig}},{key:"width",value:function t(e){return arguments.length?(this._width=e,this):this._width}}]);return i}(ow);function VR(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){VR=function t(e){return typeof e}}else{VR=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return VR(t)}function UR(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function WR(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)qR(t,e)}function qR(t,e){qR=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return qR(t,e)}function KR(r){var a=ZR();return function t(){var e=$R(r),n;if(a){var i=$R(this).constructor;n=Reflect.construct(e,arguments,i)}else{n=e.apply(this,arguments)}return YR(this,n)}}function YR(t,e){if(e&&(VR(e)==="object"||typeof e==="function")){return e}return XR(t)}function XR(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function ZR(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Date.prototype.toString.call(Reflect.construct(Date,[],function(){}));return true}catch(t){return false}}function $R(t){$R=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return $R(t)}var JR=function(t){WR(n,t);var e=KR(n);function n(){var t;UR(this,n);t=e.call(this);t.orient("bottom");return t}return n}(GR);function QR(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){QR=function t(e){return typeof e}}else{QR=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return QR(t)}function tM(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function eM(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)nM(t,e)}function nM(t,e){nM=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return nM(t,e)}function iM(r){var a=oM();return function t(){var e=sM(r),n;if(a){var i=sM(this).constructor;n=Reflect.construct(e,arguments,i)}else{n=e.apply(this,arguments)}return rM(this,n)}}function rM(t,e){if(e&&(QR(e)==="object"||typeof e==="function")){return e}return aM(t)}function aM(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function oM(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Date.prototype.toString.call(Reflect.construct(Date,[],function(){}));return true}catch(t){return false}}function sM(t){sM=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return sM(t)}var uM=function(t){eM(n,t);var e=iM(n);function n(){var t;tM(this,n);t=e.call(this);t.orient("left");return t}return n}(GR);function lM(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){lM=function t(e){return typeof e}}else{lM=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return lM(t)}function cM(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function fM(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)hM(t,e)}function hM(t,e){hM=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return hM(t,e)}function dM(r){var a=vM();return function t(){var e=mM(r),n;if(a){var i=mM(this).constructor;n=Reflect.construct(e,arguments,i)}else{n=e.apply(this,arguments)}return gM(this,n)}}function gM(t,e){if(e&&(lM(e)==="object"||typeof e==="function")){return e}return pM(t)}function pM(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function vM(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Date.prototype.toString.call(Reflect.construct(Date,[],function(){}));return true}catch(t){return false}}function mM(t){mM=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return mM(t)}var yM=function(t){fM(n,t);var e=dM(n);function n(){var t;cM(this,n);t=e.call(this);t.orient("right");return t}return n}(GR);function _M(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_M=function t(e){return typeof e}}else{_M=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return _M(t)}function bM(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function wM(t,e){if(typeof e!=="function"&&e!==null){throw new TypeError("Super expression must either be null or a function")}t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:true,configurable:true}});if(e)xM(t,e)}function xM(t,e){xM=Object.setPrototypeOf||function t(e,n){e.__proto__=n;return e};return xM(t,e)}function kM(r){var a=EM();return function t(){var e=AM(r),n;if(a){var i=AM(this).constructor;n=Reflect.construct(e,arguments,i)}else{n=e.apply(this,arguments)}return SM(this,n)}}function SM(t,e){if(e&&(_M(e)==="object"||typeof e==="function")){return e}return CM(t)}function CM(t){if(t===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return t}function EM(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Date.prototype.toString.call(Reflect.construct(Date,[],function(){}));return true}catch(t){return false}}function AM(t){AM=Object.setPrototypeOf?Object.getPrototypeOf:function t(e){return e.__proto__||Object.getPrototypeOf(e)};return AM(t)}var RM=function(t){wM(n,t);var e=kM(n);function n(){var t;bM(this,n);t=e.call(this);t.orient("top");return t}return n}(GR);var MM=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};function TM(t,e,i){return i={path:e,exports:{},require:function t(e,n){return PM(e,n===undefined||n===null?i.path:n)}},t(i,i.exports),i.exports}function PM(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}var OM=TM(function(e,t){(function(t){{e.exports=t()}})(function(){return function a(o,s,u){function l(n,t){if(!s[n]){if(!o[n]){var e=typeof PM=="function"&&PM;if(!t&&e)return e(n,!0);if(c)return c(n,!0);var i=new Error("Cannot find module '"+n+"'");throw i.code="MODULE_NOT_FOUND",i}var r=s[n]={exports:{}};o[n][0].call(r.exports,function(t){var e=o[n][1][t];return l(e?e:t)},r,r.exports,a,o,s,u)}return s[n].exports}var c=typeof PM=="function"&&PM;for(var t=0;t= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=y-_,S=Math.floor,C=String.fromCharCode,h;function E(t){throw new RangeError(c[t])}function d(t,e){var n=t.length;var i=[];while(n--){i[n]=e(t[n])}return i}function g(t,e){var n=t.split("@");var i="";if(n.length>1){i=n[0]+"@";t=n[1]}t=t.replace(l,".");var r=t.split(".");var a=d(r,e).join(".");return i+a}function A(t){var e=[],n=0,i=t.length,r,a;while(n=55296&&r<=56319&&n65535){t-=65536;e+=C(t>>>10&1023|55296);t=56320|t&1023}e+=C(t);return e}).join("")}function R(t){if(t-48<10){return t-22}if(t-65<26){return t-65}if(t-97<26){return t-97}return y}function M(t,e){return t+22+75*(t<26)-((e!=0)<<5)}function T(t,e,n){var i=0;t=n?S(t/o):t>>1;t+=S(t/e);for(;t>f*b>>1;i+=y){t=S(t/f)}return S(i+(f+1)*t/(t+a))}function p(t){var e=[],n=t.length,i,r=0,a=x,o=w,s,u,l,c,f,h,d,g,p;s=t.lastIndexOf(k);if(s<0){s=0}for(u=0;u=128){E("not-basic")}e.push(t.charCodeAt(u))}for(l=s>0?s+1:0;l=n){E("invalid-input")}d=R(t.charCodeAt(l++));if(d>=y||d>S((m-r)/f)){E("overflow")}r+=d*f;g=h<=o?_:h>=o+b?b:h-o;if(dS(m/p)){E("overflow")}f*=p}i=e.length+1;o=T(r-c,i,c==0);if(S(r/i)>m-a){E("overflow")}a+=S(r/i);r%=i;e.splice(r++,0,a)}return v(e)}function P(t){var e,n,i,r,a,o,s,u,l,c,f,h=[],d,g,p,v;t=A(t);d=t.length;e=x;n=0;a=w;for(o=0;o=e&&fS((m-n)/g)){E("overflow")}n+=(s-e)*g;e=s;for(o=0;om){E("overflow")}if(f==e){for(u=n,l=y;;l+=y){c=l<=a?_:l>=a+b?b:l-a;if(u0){f(n.documentElement);clearInterval(t);if(r.type==="view"){u.contentWindow.scrollTo(a,o);if(/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&(u.contentWindow.scrollY!==o||u.contentWindow.scrollX!==a)){n.documentElement.style.top=-o+"px";n.documentElement.style.left=-a+"px";n.documentElement.style.position="absolute"}}e(u)}},50)};n.open();n.write("");l(t,a,o);n.replaceChild(n.adoptNode(s),n.documentElement);n.close()})}},{"./log":13}],3:[function(t,e,n){function i(t){this.r=0;this.g=0;this.b=0;this.a=null;var e=this.fromArray(t)||this.namedColor(t)||this.rgb(t)||this.rgba(t)||this.hex6(t)||this.hex3(t)}i.prototype.darken=function(t){var e=1-t;return new i([Math.round(this.r*e),Math.round(this.g*e),Math.round(this.b*e),this.a])};i.prototype.isTransparent=function(){return this.a===0};i.prototype.isBlack=function(){return this.r===0&&this.g===0&&this.b===0};i.prototype.fromArray=function(t){if(Array.isArray(t)){this.r=Math.min(t[0],255);this.g=Math.min(t[1],255);this.b=Math.min(t[2],255);if(t.length>3){this.a=t[3]}}return Array.isArray(t)};var r=/^#([a-f0-9]{3})$/i;i.prototype.hex3=function(t){var e=null;if((e=t.match(r))!==null){this.r=parseInt(e[1][0]+e[1][0],16);this.g=parseInt(e[1][1]+e[1][1],16);this.b=parseInt(e[1][2]+e[1][2],16)}return e!==null};var a=/^#([a-f0-9]{6})$/i;i.prototype.hex6=function(t){var e=null;if((e=t.match(a))!==null){this.r=parseInt(e[1].substring(0,2),16);this.g=parseInt(e[1].substring(2,4),16);this.b=parseInt(e[1].substring(4,6),16)}return e!==null};var o=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;i.prototype.rgb=function(t){var e=null;if((e=t.match(o))!==null){this.r=Number(e[1]);this.g=Number(e[2]);this.b=Number(e[3])}return e!==null};var s=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;i.prototype.rgba=function(t){var e=null;if((e=t.match(s))!==null){this.r=Number(e[1]);this.g=Number(e[2]);this.b=Number(e[3]);this.a=Number(e[4])}return e!==null};i.prototype.toString=function(){return this.a!==null&&this.a!==1?"rgba("+[this.r,this.g,this.b,this.a].join(",")+")":"rgb("+[this.r,this.g,this.b].join(",")+")"};i.prototype.namedColor=function(t){t=t.toLowerCase();var e=u[t];if(e){this.r=e[0];this.g=e[1];this.b=e[2]}else if(t==="transparent"){this.r=this.g=this.b=this.a=0;return true}return!!e};i.prototype.isColor=true;var u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};e.exports=i},{}],4:[function(t,e,n){var d=t("./support");var o=t("./renderers/canvas");var g=t("./imageloader");var p=t("./nodeparser");var i=t("./nodecontainer");var v=t("./log");var r=t("./utils");var a=t("./clone");var s=t("./proxy").loadUrlDocument;var m=r.getBounds;var f="data-html2canvas-node";var u=0;function l(t,e){var n=u++;e=e||{};if(e.logging){v.options.logging=true;v.options.start=Date.now()}e.async=typeof e.async==="undefined"?true:e.async;e.allowTaint=typeof e.allowTaint==="undefined"?false:e.allowTaint;e.removeContainer=typeof e.removeContainer==="undefined"?true:e.removeContainer;e.javascriptEnabled=typeof e.javascriptEnabled==="undefined"?false:e.javascriptEnabled;e.imageTimeout=typeof e.imageTimeout==="undefined"?1e4:e.imageTimeout;e.renderer=typeof e.renderer==="function"?e.renderer:o;e.strict=!!e.strict;if(typeof t==="string"){if(typeof e.proxy!=="string"){return Promise.reject("Proxy must be used when rendering url")}var i=e.width!=null?e.width:window.innerWidth;var r=e.height!=null?e.height:window.innerHeight;return s(k(t),e.proxy,document,i,r,e).then(function(t){return y(t.contentWindow.document.documentElement,t,e,i,r)})}var a=(t===undefined?[document.documentElement]:t.length?t:[t])[0];a.setAttribute(f+n,n);return h(a.ownerDocument,e,a.ownerDocument.defaultView.innerWidth,a.ownerDocument.defaultView.innerHeight,n).then(function(t){if(typeof e.onrendered==="function"){v("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");e.onrendered(t)}return t})}l.CanvasRenderer=o;l.NodeContainer=i;l.log=v;l.utils=r;var c=typeof document==="undefined"||typeof Object.create!=="function"||typeof document.createElement("canvas").getContext!=="function"?function(){return Promise.reject("No canvas support")}:l;e.exports=c;function h(o,s,u,l,c){return a(o,o,u,l,s,o.defaultView.pageXOffset,o.defaultView.pageYOffset).then(function(t){v("Document cloned");var e=f+c;var n="["+e+"='"+c+"']";o.querySelector(n).removeAttribute(e);var i=t.contentWindow;var r=i.document.querySelector(n);var a=typeof s.onclone==="function"?Promise.resolve(s.onclone(i.document)):Promise.resolve(true);return a.then(function(){return y(r,t,s,u,l)})})}function y(e,n,i,t,r){var a=n.contentWindow;var o=new d(a.document);var s=new g(i,o);var u=m(e);var l=i.type==="view"?t:w(a.document);var c=i.type==="view"?r:x(a.document);var f=new i.renderer(l,c,s,i,document);var h=new p(e,f,o,s,i);return h.ready.then(function(){v("Finished rendering");var t;if(i.type==="view"){t=b(f.canvas,{width:f.canvas.width,height:f.canvas.height,top:0,left:0,x:0,y:0})}else if(e===a.document.body||e===a.document.documentElement||i.canvas!=null){t=f.canvas}else{t=b(f.canvas,{width:i.width!=null?i.width:u.width,height:i.height!=null?i.height:u.height,top:u.top,left:u.left,x:0,y:0})}_(n,i);return t})}function _(t,e){if(e.removeContainer){t.parentNode.removeChild(t);v("Cleaned up container")}}function b(t,e){var n=document.createElement("canvas");var i=Math.min(t.width-1,Math.max(0,e.left));var r=Math.min(t.width,Math.max(1,e.left+e.width));var a=Math.min(t.height-1,Math.max(0,e.top));var o=Math.min(t.height,Math.max(1,e.top+e.height));n.width=e.width;n.height=e.height;var s=r-i;var u=o-a;v("Cropping canvas at:","left:",e.left,"top:",e.top,"width:",s,"height:",u);v("Resulting crop with width",e.width,"and height",e.height,"with x",i,"and y",a);n.getContext("2d").drawImage(t,i,a,s,u,e.x,e.y,s,u);return n}function w(t){return Math.max(Math.max(t.body.scrollWidth,t.documentElement.scrollWidth),Math.max(t.body.offsetWidth,t.documentElement.offsetWidth),Math.max(t.body.clientWidth,t.documentElement.clientWidth))}function x(t){return Math.max(Math.max(t.body.scrollHeight,t.documentElement.scrollHeight),Math.max(t.body.offsetHeight,t.documentElement.offsetHeight),Math.max(t.body.clientHeight,t.documentElement.clientHeight))}function k(t){var e=document.createElement("a");e.href=t;e.href=e.href;return e}},{"./clone":2,"./imageloader":11,"./log":13,"./nodecontainer":14,"./nodeparser":15,"./proxy":16,"./renderers/canvas":20,"./support":22,"./utils":26}],5:[function(t,e,n){var i=t("./log");var r=t("./utils").smallImage;function a(t){this.src=t;i("DummyImageContainer for",t);if(!this.promise||!this.image){i("Initiating DummyImageContainer");a.prototype.image=new Image;var n=this.image;a.prototype.promise=new Promise(function(t,e){n.onload=t;n.onerror=e;n.src=r();if(n.complete===true){t(n)}})}}e.exports=a},{"./log":13,"./utils":26}],6:[function(t,e,n){var u=t("./utils").smallImage;function i(t,e){var n=document.createElement("div"),i=document.createElement("img"),r=document.createElement("span"),a="Hidden Text",o,s;n.style.visibility="hidden";n.style.fontFamily=t;n.style.fontSize=e;n.style.margin=0;n.style.padding=0;document.body.appendChild(n);i.src=u();i.width=1;i.height=1;i.style.margin=0;i.style.padding=0;i.style.verticalAlign="baseline";r.style.fontFamily=t;r.style.fontSize=e;r.style.margin=0;r.style.padding=0;r.appendChild(document.createTextNode(a));n.appendChild(r);n.appendChild(i);o=i.offsetTop-r.offsetTop+1;n.removeChild(r);n.appendChild(document.createTextNode(a));n.style.lineHeight="normal";i.style.verticalAlign="super";s=i.offsetTop-n.offsetTop+1;document.body.removeChild(n);this.baseline=o;this.lineWidth=1;this.middle=s}e.exports=i},{"./utils":26}],7:[function(t,e,n){var i=t("./font");function r(){this.data={}}r.prototype.getMetrics=function(t,e){if(this.data[t+"-"+e]===undefined){this.data[t+"-"+e]=new i(t,e)}return this.data[t+"-"+e]};e.exports=r},{"./font":6}],8:[function(a,t,e){var n=a("./utils");var o=n.getBounds;var r=a("./proxy").loadUrlDocument;function i(e,t,n){this.image=null;this.src=e;var i=this;var r=o(e);this.promise=(!t?this.proxyLoad(n.proxy,r,n):new Promise(function(t){if(e.contentWindow.document.URL==="about:blank"||e.contentWindow.document.documentElement==null){e.contentWindow.onload=e.onload=function(){t(e)}}else{t(e)}})).then(function(t){var e=a("./core");return e(t.contentWindow.document.documentElement,{type:"view",width:t.width,height:t.height,proxy:n.proxy,javascriptEnabled:n.javascriptEnabled,removeContainer:n.removeContainer,allowTaint:n.allowTaint,imageTimeout:n.imageTimeout/2})}).then(function(t){return i.image=t})}i.prototype.proxyLoad=function(t,e,n){var i=this.src;return r(i.src,t,i.ownerDocument,e.width,e.height,n)};t.exports=i},{"./core":4,"./proxy":16,"./utils":26}],9:[function(t,e,n){function i(t){this.src=t.value;this.colorStops=[];this.type=null;this.x0=.5;this.y0=.5;this.x1=.5;this.y1=.5;this.promise=Promise.resolve(true)}i.TYPES={LINEAR:1,RADIAL:2};i.REGEXP_COLORSTOP=/^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;e.exports=i},{}],10:[function(t,e,n){function i(n,i){this.src=n;this.image=new Image;var r=this;this.tainted=null;this.promise=new Promise(function(t,e){r.image.onload=t;r.image.onerror=e;if(i){r.image.crossOrigin="anonymous"}r.image.src=n;if(r.image.complete===true){t(r.image)}})}e.exports=i},{}],11:[function(t,e,n){var a=t("./log");var i=t("./imagecontainer");var r=t("./dummyimagecontainer");var o=t("./proxyimagecontainer");var s=t("./framecontainer");var u=t("./svgcontainer");var l=t("./svgnodecontainer");var c=t("./lineargradientcontainer");var f=t("./webkitgradientcontainer");var h=t("./utils").bind;function d(t,e){this.link=null;this.options=t;this.support=e;this.origin=this.getOrigin(window.location.href)}d.prototype.findImages=function(t){var e=[];t.reduce(function(t,e){switch(e.node.nodeName){case"IMG":return t.concat([{args:[e.node.src],method:"url"}]);case"svg":case"IFRAME":return t.concat([{args:[e.node],method:e.node.nodeName}])}return t},[]).forEach(this.addImage(e,this.loadImage),this);return e};d.prototype.findBackgroundImage=function(t,e){e.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(t,this.loadImage),this);return t};d.prototype.addImage=function(n,i){return function(e){e.args.forEach(function(t){if(!this.imageExists(n,t)){n.splice(0,0,i.call(this,e));a("Added image #"+n.length,typeof t==="string"?t.substring(0,100):t)}},this)}};d.prototype.hasImageBackground=function(t){return t.method!=="none"};d.prototype.loadImage=function(t){if(t.method==="url"){var e=t.args[0];if(this.isSVG(e)&&!this.support.svg&&!this.options.allowTaint){return new u(e)}else if(e.match(/data:image\/.*;base64,/i)){return new i(e.replace(/url\(['"]{0,}|['"]{0,}\)$/gi,""),false)}else if(this.isSameOrigin(e)||this.options.allowTaint===true||this.isSVG(e)){return new i(e,false)}else if(this.support.cors&&!this.options.allowTaint&&this.options.useCORS){return new i(e,true)}else if(this.options.proxy){return new o(e,this.options.proxy)}else{return new r(e)}}else if(t.method==="linear-gradient"){return new c(t)}else if(t.method==="gradient"){return new f(t)}else if(t.method==="svg"){return new l(t.args[0],this.support.svg)}else if(t.method==="IFRAME"){return new s(t.args[0],this.isSameOrigin(t.args[0].src),this.options)}else{return new r(t)}};d.prototype.isSVG=function(t){return t.substring(t.length-3).toLowerCase()==="svg"||u.prototype.isInline(t)};d.prototype.imageExists=function(t,e){return t.some(function(t){return t.src===e})};d.prototype.isSameOrigin=function(t){return this.getOrigin(t)===this.origin};d.prototype.getOrigin=function(t){var e=this.link||(this.link=document.createElement("a"));e.href=t;e.href=e.href;return e.protocol+e.hostname+e.port};d.prototype.getPromise=function(e){return this.timeout(e,this.options.imageTimeout)["catch"](function(){var t=new r(e.src);return t.promise.then(function(t){e.image=t})})};d.prototype.get=function(e){var n=null;return this.images.some(function(t){return(n=t).src===e})?n:null};d.prototype.fetch=function(t){this.images=t.reduce(h(this.findBackgroundImage,this),this.findImages(t));this.images.forEach(function(e,n){e.promise.then(function(){a("Succesfully loaded image #"+(n+1),e)},function(t){a("Failed loading image #"+(n+1),e,t)})});this.ready=Promise.all(this.images.map(this.getPromise,this));a("Finished searching images");return this};d.prototype.timeout=function(n,i){var r;var t=Promise.race([n.promise,new Promise(function(t,e){r=setTimeout(function(){a("Timed out loading image",n);e(n)},i)})]).then(function(t){clearTimeout(r);return t});t["catch"](function(){clearTimeout(r)});return t};e.exports=d},{"./dummyimagecontainer":5,"./framecontainer":8,"./imagecontainer":10,"./lineargradientcontainer":12,"./log":13,"./proxyimagecontainer":17,"./svgcontainer":23,"./svgnodecontainer":24,"./utils":26,"./webkitgradientcontainer":27}],12:[function(t,e,n){var r=t("./gradientcontainer");var a=t("./color");function i(t){r.apply(this,arguments);this.type=r.TYPES.LINEAR;var e=i.REGEXP_DIRECTION.test(t.args[0])||!r.REGEXP_COLORSTOP.test(t.args[0]);if(e){t.args[0].split(/\s+/).reverse().forEach(function(t,e){switch(t){case"left":this.x0=0;this.x1=1;break;case"top":this.y0=0;this.y1=1;break;case"right":this.x0=1;this.x1=0;break;case"bottom":this.y0=1;this.y1=0;break;case"to":var n=this.y0;var i=this.x0;this.y0=this.y1;this.x0=this.x1;this.x1=i;this.y1=n;break;case"center":break;default:var r=parseFloat(t,10)*.01;if(isNaN(r)){break}if(e===0){this.y0=r;this.y1=1-this.y0}else{this.x0=r;this.x1=1-this.x0}break}},this)}else{this.y0=0;this.y1=1}this.colorStops=t.args.slice(e?1:0).map(function(t){var e=t.match(r.REGEXP_COLORSTOP);var n=+e[2];var i=n===0?"%":e[3];return{color:new a(e[1]),stop:i==="%"?n/100:null}});if(this.colorStops[0].stop===null){this.colorStops[0].stop=0}if(this.colorStops[this.colorStops.length-1].stop===null){this.colorStops[this.colorStops.length-1].stop=1}this.colorStops.forEach(function(n,i){if(n.stop===null){this.colorStops.slice(i).some(function(t,e){if(t.stop!==null){n.stop=(t.stop-this.colorStops[i-1].stop)/(e+1)+this.colorStops[i-1].stop;return true}else{return false}},this)}},this)}i.prototype=Object.create(r.prototype);i.REGEXP_DIRECTION=/^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;e.exports=i},{"./color":3,"./gradientcontainer":9}],13:[function(t,e,n){var i=function t(){if(t.options.logging&&window.console&&window.console.log){Function.prototype.bind.call(window.console.log,window.console).apply(window.console,[Date.now()-t.options.start+"ms","html2canvas:"].concat([].slice.call(arguments,0)))}};i.options={logging:false};e.exports=i},{}],14:[function(t,e,n){var a=t("./color");var i=t("./utils");var r=i.getBounds;var o=i.parseBackgrounds;var s=i.offsetBounds;function u(t,e){this.node=t;this.parent=e;this.stack=null;this.bounds=null;this.borders=null;this.clip=[];this.backgroundClip=[];this.offsetBounds=null;this.visible=null;this.computedStyles=null;this.colors={};this.styles={};this.backgroundImages=null;this.transformData=null;this.transformMatrix=null;this.isPseudoElement=false;this.opacity=null}u.prototype.cloneTo=function(t){t.visible=this.visible;t.borders=this.borders;t.bounds=this.bounds;t.clip=this.clip;t.backgroundClip=this.backgroundClip;t.computedStyles=this.computedStyles;t.styles=this.styles;t.backgroundImages=this.backgroundImages;t.opacity=this.opacity};u.prototype.getOpacity=function(){return this.opacity===null?this.opacity=this.cssFloat("opacity"):this.opacity};u.prototype.assignStack=function(t){this.stack=t;t.children.push(this)};u.prototype.isElementVisible=function(){return this.node.nodeType===Node.TEXT_NODE?this.parent.visible:this.css("display")!=="none"&&this.css("visibility")!=="hidden"&&!this.node.hasAttribute("data-html2canvas-ignore")&&(this.node.nodeName!=="INPUT"||this.node.getAttribute("type")!=="hidden")};u.prototype.css=function(t){if(!this.computedStyles){this.computedStyles=this.isPseudoElement?this.parent.computedStyle(this.before?":before":":after"):this.computedStyle(null)}return this.styles[t]||(this.styles[t]=this.computedStyles[t])};u.prototype.prefixedCss=function(e){var t=["webkit","moz","ms","o"];var n=this.css(e);if(n===undefined){t.some(function(t){n=this.css(t+e.substr(0,1).toUpperCase()+e.substr(1));return n!==undefined},this)}return n===undefined?null:n};u.prototype.computedStyle=function(t){return this.node.ownerDocument.defaultView.getComputedStyle(this.node,t)};u.prototype.cssInt=function(t){var e=parseInt(this.css(t),10);return isNaN(e)?0:e};u.prototype.color=function(t){return this.colors[t]||(this.colors[t]=new a(this.css(t)))};u.prototype.cssFloat=function(t){var e=parseFloat(this.css(t));return isNaN(e)?0:e};u.prototype.fontWeight=function(){var t=this.css("fontWeight");switch(parseInt(t,10)){case 401:t="bold";break;case 400:t="normal";break}return t};u.prototype.parseClip=function(){var t=this.css("clip").match(this.CLIP);if(t){return{top:parseInt(t[1],10),right:parseInt(t[2],10),bottom:parseInt(t[3],10),left:parseInt(t[4],10)}}return null};u.prototype.parseBackgroundImages=function(){return this.backgroundImages||(this.backgroundImages=o(this.css("backgroundImage")))};u.prototype.cssList=function(t,e){var n=(this.css(t)||"").split(",");n=n[e||0]||n[0]||"auto";n=n.trim().split(" ");if(n.length===1){n=[n[0],f(n[0])?"auto":n[0]]}return n};u.prototype.parseBackgroundSize=function(t,e,n){var i=this.cssList("backgroundSize",n);var r,a;if(f(i[0])){r=t.width*parseFloat(i[0])/100}else if(/contain|cover/.test(i[0])){var o=t.width/t.height,s=e.width/e.height;return o0){this.renderIndex=0;this.asyncRenderer(this.renderQueue,t)}else{t()}},this))},this))}r.prototype.calculateOverflowClips=function(){this.nodes.forEach(function(t){if(H(t)){if(G(t)){t.appendToDOM()}t.borders=this.parseBorders(t);var e=t.css("overflow")==="hidden"?[t.borders.clip]:[];var n=t.parseClip();if(n&&["absolute","fixed"].indexOf(t.css("position"))!==-1){e.push([["rect",t.bounds.left+n.left,t.bounds.top+n.top,n.right-n.left,n.bottom-n.top]])}t.clip=a(t)?t.parent.clip.concat(e):e;t.backgroundClip=t.css("overflow")!=="hidden"?t.clip.concat([t.borders.clip]):t.clip;if(G(t)){t.cleanDOM()}}else if(V(t)){t.clip=a(t)?t.parent.clip:[]}if(!G(t)){t.bounds=null}},this)};function a(t){return t.parent&&t.parent.clip.length}r.prototype.asyncRenderer=function(t,e,n){n=n||Date.now();this.paint(t[this.renderIndex++]);if(t.length===this.renderIndex){e()}else if(n+20>Date.now()){this.asyncRenderer(t,e,n)}else{setTimeout(p(function(){this.asyncRenderer(t,e)},this),0)}};r.prototype.createPseudoHideStyles=function(t){this.createStyles(t,"."+f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+':before { content: "" !important; display: none !important; }'+"."+f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER+':after { content: "" !important; display: none !important; }')};r.prototype.disableAnimations=function(t){this.createStyles(t,"* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; "+"-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}")};r.prototype.createStyles=function(t,e){var n=t.createElement("style");n.innerHTML=e;t.body.appendChild(n)};r.prototype.getPseudoElements=function(t){var e=[[t]];if(t.node.nodeType===Node.ELEMENT_NODE){var n=this.getPseudoElement(t,":before");var i=this.getPseudoElement(t,":after");if(n){e.push(n)}if(i){e.push(i)}}return X(e)};function y(t){return t.replace(/(\-[a-z])/g,function(t){return t.toUpperCase().replace("-","")})}r.prototype.getPseudoElement=function(t,e){var n=t.computedStyle(e);if(!n||!n.content||n.content==="none"||n.content==="-moz-alt-content"||n.display==="none"){return null}var i=Z(n.content);var r=i.substr(0,3)==="url";var a=document.createElement(r?"img":"html2canvaspseudoelement");var o=new f(a,t,e);for(var s=n.length-1;s>=0;s--){var u=y(n.item(s));a.style[u]=n[u]}a.className=f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+" "+f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;if(r){a.src=v(i)[0].args[0];return[o]}else{var l=document.createTextNode(i);a.appendChild(l);return[o,new c(l,o)]}};r.prototype.getChildren=function(n){return X([].filter.call(n.node.childNodes,N).map(function(t){var e=[t.nodeType===Node.TEXT_NODE?new c(t,n):new l(t,n)].filter(Y);return t.nodeType===Node.ELEMENT_NODE&&e.length&&t.tagName!=="TEXTAREA"?e[0].isElementVisible()?e.concat(this.getChildren(e[0])):[]:e},this))};r.prototype.newStackingContext=function(t,e){var n=new g(e,t.getOpacity(),t.node,t.parent);t.cloneTo(n);var i=e?n.getParentStack(this):n.parent.stack;i.contexts.push(n);t.stack=n};r.prototype.createStackingContexts=function(){this.nodes.forEach(function(t){if(H(t)&&(this.isRootElement(t)||W(t)||z(t)||this.isBodyWithTransparentRoot(t)||t.hasTransform())){this.newStackingContext(t,true)}else if(H(t)&&(j(t)&&M(t)||F(t)||L(t))){this.newStackingContext(t,false)}else{t.assignStack(t.parent.stack)}},this)};r.prototype.isBodyWithTransparentRoot=function(t){return t.node.nodeName==="BODY"&&t.parent.color("backgroundColor").isTransparent()};r.prototype.isRootElement=function(t){return t.parent===null};r.prototype.sortStackingContexts=function(t){t.contexts.sort(U(t.contexts.slice(0)));t.contexts.forEach(this.sortStackingContexts,this)};r.prototype.parseTextBounds=function(o){return function(t,e,n){if(o.parent.css("textDecoration").substr(0,4)!=="none"||t.trim().length!==0){if(this.support.rangeBounds&&!o.parent.hasTransform()){var i=n.slice(0,e).join("").length;return this.getRangeBounds(o.node,i,t.length)}else if(o.node&&typeof o.node.data==="string"){var r=o.node.splitText(t.length);var a=this.getWrapperBounds(o.node,o.parent.hasTransform());o.node=r;return a}}else if(!this.support.rangeBounds||o.parent.hasTransform()){o.node=o.node.splitText(t.length)}return{}}};r.prototype.getWrapperBounds=function(t,e){var n=t.ownerDocument.createElement("html2canvaswrapper");var i=t.parentNode,r=t.cloneNode(true);n.appendChild(t.cloneNode(true));i.replaceChild(n,t);var a=e?m(n):o(n);i.replaceChild(r,n);return a};r.prototype.getRangeBounds=function(t,e,n){var i=this.range||(this.range=t.ownerDocument.createRange());i.setStart(t,e);i.setEnd(t,e+n);return i.getBoundingClientRect()};function _(){}r.prototype.parse=function(t){var e=t.contexts.filter(A);var n=t.children.filter(H);var i=n.filter(I(L));var r=i.filter(I(j)).filter(I(T));var a=n.filter(I(j)).filter(L);var o=i.filter(I(j)).filter(T);var s=t.contexts.concat(i.filter(j)).filter(M);var u=t.children.filter(V).filter(O);var l=t.contexts.filter(R);e.concat(r).concat(a).concat(o).concat(s).concat(u).concat(l).forEach(function(t){this.renderQueue.push(t);if(P(t)){this.parse(t);this.renderQueue.push(new _)}},this)};r.prototype.paint=function(t){try{if(t instanceof _){this.renderer.ctx.restore()}else if(V(t)){if(G(t.parent)){t.parent.appendToDOM()}this.paintText(t);if(G(t.parent)){t.parent.cleanDOM()}}else{this.paintNode(t)}}catch(t){s(t);if(this.options.strict){throw t}}};r.prototype.paintNode=function(t){if(P(t)){this.renderer.setOpacity(t.opacity);this.renderer.ctx.save();if(t.hasTransform()){this.renderer.setTransform(t.parseTransform())}}if(t.node.nodeName==="INPUT"&&t.node.type==="checkbox"){this.paintCheckbox(t)}else if(t.node.nodeName==="INPUT"&&t.node.type==="radio"){this.paintRadio(t)}else{this.paintElement(t)}};r.prototype.paintElement=function(n){var i=n.parseBounds();this.renderer.clip(n.backgroundClip,function(){this.renderer.renderBackground(n,i,n.borders.borders.map(K))},this);this.renderer.clip(n.clip,function(){this.renderer.renderBorders(n.borders.borders)},this);this.renderer.clip(n.backgroundClip,function(){switch(n.node.nodeName){case"svg":case"IFRAME":var t=this.images.get(n.node);if(t){this.renderer.renderImage(n,i,n.borders,t)}else{s("Error loading <"+n.node.nodeName+">",n.node)}break;case"IMG":var e=this.images.get(n.node.src);if(e){this.renderer.renderImage(n,i,n.borders,e)}else{s("Error loading ",n.node.src)}break;case"CANVAS":this.renderer.renderImage(n,i,n.borders,{image:n.node});break;case"SELECT":case"INPUT":case"TEXTAREA":this.paintFormValue(n);break}},this)};r.prototype.paintCheckbox=function(t){var e=t.parseBounds();var n=Math.min(e.width,e.height);var i={width:n-1,height:n-1,top:e.top,left:e.left};var r=[3,3];var a=[r,r,r,r];var o=[1,1,1,1].map(function(t){return{color:new d("#A5A5A5"),width:t}});var s=k(i,a,o);this.renderer.clip(t.backgroundClip,function(){this.renderer.rectangle(i.left+1,i.top+1,i.width-2,i.height-2,new d("#DEDEDE"));this.renderer.renderBorders(w(o,i,s,a));if(t.node.checked){this.renderer.font(new d("#424242"),"normal","normal","bold",n-3+"px","arial");this.renderer.text("✔",i.left+n/6,i.top+n-1)}},this)};r.prototype.paintRadio=function(t){var e=t.parseBounds();var n=Math.min(e.width,e.height)-2;this.renderer.clip(t.backgroundClip,function(){this.renderer.circleStroke(e.left+1,e.top+1,n,new d("#DEDEDE"),1,new d("#A5A5A5"));if(t.node.checked){this.renderer.circle(Math.ceil(e.left+n/4)+1,Math.ceil(e.top+n/4)+1,Math.floor(n/2),new d("#424242"))}},this)};r.prototype.paintFormValue=function(e){var t=e.getValue();if(t.length>0){var n=e.node.ownerDocument;var i=n.createElement("html2canvaswrapper");var r=["lineHeight","textAlign","fontFamily","fontWeight","fontSize","color","paddingLeft","paddingTop","paddingRight","paddingBottom","width","height","borderLeftStyle","borderTopStyle","borderLeftWidth","borderTopWidth","boxSizing","whiteSpace","wordWrap"];r.forEach(function(t){try{i.style[t]=e.css(t)}catch(t){s("html2canvas: Parse: Exception caught in renderFormValue: "+t.message)}});var a=e.parseBounds();i.style.position="fixed";i.style.left=a.left+"px";i.style.top=a.top+"px";i.textContent=t;n.body.appendChild(i);this.paintText(new c(i.firstChild,e));n.body.removeChild(i)}};r.prototype.paintText=function(n){n.applyTextTransform();var t=u.ucs2.decode(n.node.data);var i=(!this.options.letterRendering||B(n))&&!Q(n.node.data)?$(t):t.map(function(t){return u.ucs2.encode([t])});var e=n.parent.fontWeight();var r=n.parent.css("fontSize");var a=n.parent.css("fontFamily");var o=n.parent.parseTextShadows();this.renderer.font(n.parent.color("color"),n.parent.css("fontStyle"),n.parent.css("fontVariant"),e,r,a);if(o.length){this.renderer.fontShadow(o[0].color,o[0].offsetX,o[0].offsetY,o[0].blur)}else{this.renderer.clearShadow()}this.renderer.clip(n.parent.clip,function(){i.map(this.parseTextBounds(n),this).forEach(function(t,e){if(t){this.renderer.text(i[e],t.left,t.bottom);this.renderTextDecoration(n.parent,t,this.fontMetrics.getMetrics(a,r))}},this)},this)};r.prototype.renderTextDecoration=function(t,e,n){switch(t.css("textDecoration").split(" ")[0]){case"underline":this.renderer.rectangle(e.left,Math.round(e.top+n.baseline+n.lineWidth),e.width,1,t.color("color"));break;case"overline":this.renderer.rectangle(e.left,Math.round(e.top),e.width,1,t.color("color"));break;case"line-through":this.renderer.rectangle(e.left,Math.ceil(e.top+n.middle+n.lineWidth),e.width,1,t.color("color"));break}};var b={inset:[["darken",.6],["darken",.1],["darken",.1],["darken",.6]]};r.prototype.parseBorders=function(a){var t=a.parseBounds();var e=D(a);var n=["Top","Right","Bottom","Left"].map(function(t,e){var n=a.css("border"+t+"Style");var i=a.color("border"+t+"Color");if(n==="inset"&&i.isBlack()){i=new d([255,255,255,i.a])}var r=b[n]?b[n][e]:null;return{width:a.cssInt("border"+t+"Width"),color:r?i[r[0]](r[1]):i,args:null}});var i=k(t,e,n);return{clip:this.parseBackgroundClip(a,i,n,e,t),borders:w(n,t,i,e)}};function w(o,s,u,l){return o.map(function(t,e){if(t.width>0){var n=s.left;var i=s.top;var r=s.width;var a=s.height-o[2].width;switch(e){case 0:a=o[0].width;t.args=C({c1:[n,i],c2:[n+r,i],c3:[n+r-o[1].width,i+a],c4:[n+o[3].width,i+a]},l[0],l[1],u.topLeftOuter,u.topLeftInner,u.topRightOuter,u.topRightInner);break;case 1:n=s.left+s.width-o[1].width;r=o[1].width;t.args=C({c1:[n+r,i],c2:[n+r,i+a+o[2].width],c3:[n,i+a],c4:[n,i+o[0].width]},l[1],l[2],u.topRightOuter,u.topRightInner,u.bottomRightOuter,u.bottomRightInner);break;case 2:i=i+s.height-o[2].width;a=o[2].width;t.args=C({c1:[n+r,i+a],c2:[n,i+a],c3:[n+o[3].width,i],c4:[n+r-o[3].width,i]},l[2],l[3],u.bottomRightOuter,u.bottomRightInner,u.bottomLeftOuter,u.bottomLeftInner);break;case 3:r=o[3].width;t.args=C({c1:[n,i+a+o[2].width],c2:[n,i],c3:[n+r,i+o[0].width],c4:[n+r,i+a]},l[3],l[0],u.bottomLeftOuter,u.bottomLeftInner,u.topLeftOuter,u.topLeftInner);break}}return t})}r.prototype.parseBackgroundClip=function(t,e,n,i,r){var a=t.css("backgroundClip"),o=[];switch(a){case"content-box":case"padding-box":E(o,i[0],i[1],e.topLeftInner,e.topRightInner,r.left+n[3].width,r.top+n[0].width);E(o,i[1],i[2],e.topRightInner,e.bottomRightInner,r.left+r.width-n[1].width,r.top+n[0].width);E(o,i[2],i[3],e.bottomRightInner,e.bottomLeftInner,r.left+r.width-n[1].width,r.top+r.height-n[2].width);E(o,i[3],i[0],e.bottomLeftInner,e.topLeftInner,r.left+n[3].width,r.top+r.height-n[2].width);break;default:E(o,i[0],i[1],e.topLeftOuter,e.topRightOuter,r.left,r.top);E(o,i[1],i[2],e.topRightOuter,e.bottomRightOuter,r.left+r.width,r.top);E(o,i[2],i[3],e.bottomRightOuter,e.bottomLeftOuter,r.left+r.width,r.top+r.height);E(o,i[3],i[0],e.bottomLeftOuter,e.topLeftOuter,r.left,r.top+r.height);break}return o};function x(t,e,n,i){var r=4*((Math.sqrt(2)-1)/3);var a=n*r,o=i*r,s=t+n,u=e+i;return{topLeft:S({x:t,y:u},{x:t,y:u-o},{x:s-a,y:e},{x:s,y:e}),topRight:S({x:t,y:e},{x:t+a,y:e},{x:s,y:u-o},{x:s,y:u}),bottomRight:S({x:s,y:e},{x:s,y:e+o},{x:t+a,y:u},{x:t,y:u}),bottomLeft:S({x:s,y:u},{x:s-a,y:u},{x:t,y:e+o},{x:t,y:e})}}function k(t,e,n){var i=t.left,r=t.top,a=t.width,o=t.height,s=e[0][0]a+n[3].width?0:l-n[3].width,c-n[0].width).topRight.subdivide(.5),bottomRightOuter:x(i+m,r+v,f,h).bottomRight.subdivide(.5),bottomRightInner:x(i+Math.min(m,a-n[3].width),r+Math.min(v,o+n[0].width),Math.max(0,f-n[1].width),h-n[2].width).bottomRight.subdivide(.5),bottomLeftOuter:x(i,r+y,d,g).bottomLeft.subdivide(.5),bottomLeftInner:x(i+n[3].width,r+y,Math.max(0,d-n[3].width),g-n[2].width).bottomLeft.subdivide(.5)}}function S(u,l,c,f){var h=function t(e,n,i){return{x:e.x+(n.x-e.x)*i,y:e.y+(n.y-e.y)*i}};return{start:u,startControl:l,endControl:c,end:f,subdivide:function t(e){var n=h(u,l,e),i=h(l,c,e),r=h(c,f,e),a=h(n,i,e),o=h(i,r,e),s=h(a,o,e);return[S(u,n,a,s),S(s,o,r,f)]},curveTo:function t(e){e.push(["bezierCurve",l.x,l.y,c.x,c.y,f.x,f.y])},curveToReversed:function t(e){e.push(["bezierCurve",c.x,c.y,l.x,l.y,u.x,u.y])}}}function C(t,e,n,i,r,a,o){var s=[];if(e[0]>0||e[1]>0){s.push(["line",i[1].start.x,i[1].start.y]);i[1].curveTo(s)}else{s.push(["line",t.c1[0],t.c1[1]])}if(n[0]>0||n[1]>0){s.push(["line",a[0].start.x,a[0].start.y]);a[0].curveTo(s);s.push(["line",o[0].end.x,o[0].end.y]);o[0].curveToReversed(s)}else{s.push(["line",t.c2[0],t.c2[1]]);s.push(["line",t.c3[0],t.c3[1]])}if(e[0]>0||e[1]>0){s.push(["line",r[1].end.x,r[1].end.y]);r[1].curveToReversed(s)}else{s.push(["line",t.c4[0],t.c4[1]])}return s}function E(t,e,n,i,r,a,o){if(e[0]>0||e[1]>0){t.push(["line",i[0].start.x,i[0].start.y]);i[0].curveTo(t);i[1].curveTo(t)}else{t.push(["line",a,o])}if(n[0]>0||n[1]>0){t.push(["line",r[0].start.x,r[0].start.y])}}function A(t){return t.cssInt("zIndex")<0}function R(t){return t.cssInt("zIndex")>0}function M(t){return t.cssInt("zIndex")===0}function T(t){return["inline","inline-block","inline-table"].indexOf(t.css("display"))!==-1}function P(t){return t instanceof g}function O(t){return t.node.data.trim().length>0}function B(t){return/^(normal|none|0px)$/.test(t.parent.css("letterSpacing"))}function D(i){return["TopLeft","TopRight","BottomRight","BottomLeft"].map(function(t){var e=i.css("border"+t+"Radius");var n=e.split(" ");if(n.length<=1){n[1]=n[0]}return n.map(q)})}function N(t){return t.nodeType===Node.TEXT_NODE||t.nodeType===Node.ELEMENT_NODE}function z(t){var e=t.css("position");var n=["absolute","relative","fixed"].indexOf(e)!==-1?t.css("zIndex"):"auto";return n!=="auto"}function j(t){return t.css("position")!=="static"}function L(t){return t.css("float")!=="none"}function F(t){return["inline-block","inline-table"].indexOf(t.css("display"))!==-1}function I(t){var e=this;return function(){return!t.apply(e,arguments)}}function H(t){return t.node.nodeType===Node.ELEMENT_NODE}function G(t){return t.isPseudoElement===true}function V(t){return t.node.nodeType===Node.TEXT_NODE}function U(n){return function(t,e){return t.cssInt("zIndex")+n.indexOf(t)/n.length-(e.cssInt("zIndex")+n.indexOf(e)/n.length)}}function W(t){return t.getOpacity()<1}function q(t){return parseInt(t,10)}function K(t){return t.width}function Y(t){return t.node.nodeType!==Node.ELEMENT_NODE||["SCRIPT","HEAD","TITLE","OBJECT","BR","OPTION"].indexOf(t.node.nodeName)===-1}function X(t){return[].concat.apply([],t)}function Z(t){var e=t.substr(0,1);return e===t.substr(t.length-1)&&e.match(/'|"/)?t.substr(1,t.length-2):t}function $(t){var e=[],n=0,i=false,r;while(t.length){if(J(t[n])===i){r=t.splice(0,n);if(r.length){e.push(u.ucs2.encode(r))}i=!i;n=0}else{n++}if(n>=t.length){r=t.splice(0,n);if(r.length){e.push(u.ucs2.encode(r))}}}return e}function J(t){return[32,13,10,9,45].indexOf(t)!==-1}function Q(t){return/[^\u0000-\u00ff]/.test(t)}e.exports=r},{"./color":3,"./fontmetrics":7,"./log":13,"./nodecontainer":14,"./pseudoelementcontainer":18,"./stackingcontext":21,"./textcontainer":25,"./utils":26,punycode:1}],16:[function(t,e,n){var o=t("./xhr");var i=t("./utils");var s=t("./log");var u=t("./clone");var l=i.decode64;function c(t,e,n){var i="withCredentials"in new XMLHttpRequest;if(!e){return Promise.reject("No proxy configured")}var r=h(i);var a=d(e,t,r);return i?o(a):f(n,a,r).then(function(t){return l(t.content)})}var r=0;function a(t,e,n){var i="crossOrigin"in new Image;var r=h(i);var a=d(e,t,r);return i?Promise.resolve(a):f(n,a,r).then(function(t){return"data:"+t.type+";base64,"+t.content})}function f(a,t,o){return new Promise(function(e,n){var i=a.createElement("script");var r=function t(){delete window.html2canvas.proxy[o];a.body.removeChild(i)};window.html2canvas.proxy[o]=function(t){r();e(t)};i.src=t;i.onerror=function(t){r();n(t)};a.body.appendChild(i)})}function h(t){return!t?"html2canvas_"+Date.now()+"_"+ ++r+"_"+Math.round(Math.random()*1e5):""}function d(t,e,n){return t+"?url="+encodeURIComponent(e)+(n.length?"&callback=html2canvas.proxy."+n:"")}function g(a){return function(e){var t=new DOMParser,n;try{n=t.parseFromString(e,"text/html")}catch(t){s("DOMParser not supported, falling back to createHTMLDocument");n=document.implementation.createHTMLDocument("");try{n.open();n.write(e);n.close()}catch(t){s("createHTMLDocument write not supported, falling back to document.body.innerHTML");n.body.innerHTML=e}}var i=n.querySelector("base");if(!i||!i.href.host){var r=n.createElement("base");r.href=a;n.head.insertBefore(r,n.head.firstChild)}return n}}function p(t,e,n,i,r,a){return new c(t,e,window.document).then(g(t)).then(function(t){return u(t,n,i,r,a,0,0)})}n.Proxy=c;n.ProxyURL=a;n.loadUrlDocument=p},{"./clone":2,"./log":13,"./utils":26,"./xhr":28}],17:[function(t,e,n){var a=t("./proxy").ProxyURL;function i(n,i){var t=document.createElement("a");t.href=n;n=t.href;this.src=n;this.image=new Image;var r=this;this.promise=new Promise(function(t,e){r.image.crossOrigin="Anonymous";r.image.onload=t;r.image.onerror=e;new a(n,i,document).then(function(t){r.image.src=t})["catch"](e)})}e.exports=i},{"./proxy":16}],18:[function(t,e,n){var i=t("./nodecontainer");function r(t,e,n){i.call(this,t,e);this.isPseudoElement=true;this.before=n===":before"}r.prototype.cloneTo=function(t){r.prototype.cloneTo.call(this,t);t.isPseudoElement=true;t.before=this.before};r.prototype=Object.create(i.prototype);r.prototype.appendToDOM=function(){if(this.before){this.parent.node.insertBefore(this.node,this.parent.node.firstChild)}else{this.parent.node.appendChild(this.node)}this.parent.node.className+=" "+this.getHideClass()};r.prototype.cleanDOM=function(){this.node.parentNode.removeChild(this.node);this.parent.node.className=this.parent.node.className.replace(this.getHideClass(),"")};r.prototype.getHideClass=function(){return this["PSEUDO_HIDE_ELEMENT_CLASS_"+(this.before?"BEFORE":"AFTER")]};r.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE="___html2canvas___pseudoelement_before";r.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER="___html2canvas___pseudoelement_after";e.exports=r},{"./nodecontainer":14}],19:[function(t,e,n){var u=t("./log");function i(t,e,n,i,r){this.width=t;this.height=e;this.images=n;this.options=i;this.document=r}i.prototype.renderImage=function(t,e,n,i){var r=t.cssInt("paddingLeft"),a=t.cssInt("paddingTop"),o=t.cssInt("paddingRight"),s=t.cssInt("paddingBottom"),u=n.borders;var l=e.width-(u[1].width+u[3].width+r+o);var c=e.height-(u[0].width+u[2].width+a+s);this.drawImage(i,0,0,i.image.width||l,i.image.height||c,e.left+r+u[3].width,e.top+a+u[0].width,l,c)};i.prototype.renderBackground=function(t,e,n){if(e.height>0&&e.width>0){this.renderBackgroundColor(t,e);this.renderBackgroundImage(t,e,n)}};i.prototype.renderBackgroundColor=function(t,e){var n=t.color("backgroundColor");if(!n.isTransparent()){this.rectangle(e.left,e.top,e.width,e.height,n)}};i.prototype.renderBorders=function(t){t.forEach(this.renderBorder,this)};i.prototype.renderBorder=function(t){if(!t.color.isTransparent()&&t.args!==null){this.drawShape(t.args,t.color)}};i.prototype.renderBackgroundImage=function(a,o,s){var t=a.parseBackgroundImages();t.reverse().forEach(function(t,e,n){switch(t.method){case"url":var i=this.images.get(t.args[0]);if(i){this.renderBackgroundRepeating(a,o,i,n.length-(e+1),s)}else{u("Error loading background-image",t.args[0])}break;case"linear-gradient":case"gradient":var r=this.images.get(t.value);if(r){this.renderBackgroundGradient(r,o,s)}else{u("Error loading background-image",t.args[0])}break;case"none":break;default:u("Unknown background-image type",t.args[0])}},this)};i.prototype.renderBackgroundRepeating=function(t,e,n,i,r){var a=t.parseBackgroundSize(e,n.image,i);var o=t.parseBackgroundPosition(e,n.image,i,a);var s=t.parseBackgroundRepeat(i);switch(s){case"repeat-x":case"repeat no-repeat":this.backgroundRepeatShape(n,o,a,e,e.left+r[3],e.top+o.top+r[0],99999,a.height,r);break;case"repeat-y":case"no-repeat repeat":this.backgroundRepeatShape(n,o,a,e,e.left+o.left+r[3],e.top+r[0],a.width,99999,r);break;case"no-repeat":this.backgroundRepeatShape(n,o,a,e,e.left+o.left+r[3],e.top+o.top+r[0],a.width,a.height,r);break;default:this.renderBackgroundRepeat(n,o,a,{top:e.top,left:e.left},r[3],r[0]);break}};e.exports=i},{"./log":13}],20:[function(t,e,n){var i=t("../renderer");var r=t("../lineargradientcontainer");var a=t("../log");function o(t,e){i.apply(this,arguments);this.canvas=this.options.canvas||this.document.createElement("canvas");if(!this.options.canvas){this.canvas.width=t;this.canvas.height=e}this.ctx=this.canvas.getContext("2d");this.taintCtx=this.document.createElement("canvas").getContext("2d");this.ctx.textBaseline="bottom";this.variables={};a("Initialized CanvasRenderer with size",t,"x",e)}o.prototype=Object.create(i.prototype);o.prototype.setFillStyle=function(t){this.ctx.fillStyle=_typeof2(t)==="object"&&!!t.isColor?t.toString():t;return this.ctx};o.prototype.rectangle=function(t,e,n,i,r){this.setFillStyle(r).fillRect(t,e,n,i)};o.prototype.circle=function(t,e,n,i){this.setFillStyle(i);this.ctx.beginPath();this.ctx.arc(t+n/2,e+n/2,n/2,0,Math.PI*2,true);this.ctx.closePath();this.ctx.fill()};o.prototype.circleStroke=function(t,e,n,i,r,a){this.circle(t,e,n,i);this.ctx.strokeStyle=a.toString();this.ctx.stroke()};o.prototype.drawShape=function(t,e){this.shape(t);this.setFillStyle(e).fill()};o.prototype.taints=function(e){if(e.tainted===null){this.taintCtx.drawImage(e.image,0,0);try{this.taintCtx.getImageData(0,0,1,1);e.tainted=false}catch(t){this.taintCtx=document.createElement("canvas").getContext("2d");e.tainted=true}}return e.tainted};o.prototype.drawImage=function(t,e,n,i,r,a,o,s,u){if(!this.taints(t)||this.options.allowTaint){this.ctx.drawImage(t.image,e,n,i,r,a,o,s,u)}};o.prototype.clip=function(t,e,n){this.ctx.save();t.filter(s).forEach(function(t){this.shape(t).clip()},this);e.call(n);this.ctx.restore()};o.prototype.shape=function(t){this.ctx.beginPath();t.forEach(function(t,e){if(t[0]==="rect"){this.ctx.rect.apply(this.ctx,t.slice(1))}else{this.ctx[e===0?"moveTo":t[0]+"To"].apply(this.ctx,t.slice(1))}},this);this.ctx.closePath();return this.ctx};o.prototype.font=function(t,e,n,i,r,a){this.setFillStyle(t).font=[e,n,i,r,a].join(" ").split(",")[0]};o.prototype.fontShadow=function(t,e,n,i){this.setVariable("shadowColor",t.toString()).setVariable("shadowOffsetY",e).setVariable("shadowOffsetX",n).setVariable("shadowBlur",i)};o.prototype.clearShadow=function(){this.setVariable("shadowColor","rgba(0,0,0,0)")};o.prototype.setOpacity=function(t){this.ctx.globalAlpha=t};o.prototype.setTransform=function(t){this.ctx.translate(t.origin[0],t.origin[1]);this.ctx.transform.apply(this.ctx,t.matrix);this.ctx.translate(-t.origin[0],-t.origin[1])};o.prototype.setVariable=function(t,e){if(this.variables[t]!==e){this.variables[t]=this.ctx[t]=e}return this};o.prototype.text=function(t,e,n){this.ctx.fillText(t,e,n)};o.prototype.backgroundRepeatShape=function(t,e,n,i,r,a,o,s,u){var l=[["line",Math.round(r),Math.round(a)],["line",Math.round(r+o),Math.round(a)],["line",Math.round(r+o),Math.round(s+a)],["line",Math.round(r),Math.round(s+a)]];this.clip([l],function(){this.renderBackgroundRepeat(t,e,n,i,u[3],u[0])},this)};o.prototype.renderBackgroundRepeat=function(t,e,n,i,r,a){var o=Math.round(i.left+e.left+r),s=Math.round(i.top+e.top+a);this.setFillStyle(this.ctx.createPattern(this.resizeImage(t,n),"repeat"));this.ctx.translate(o,s);this.ctx.fill();this.ctx.translate(-o,-s)};o.prototype.renderBackgroundGradient=function(t,e){if(t instanceof r){var n=this.ctx.createLinearGradient(e.left+e.width*t.x0,e.top+e.height*t.y0,e.left+e.width*t.x1,e.top+e.height*t.y1);t.colorStops.forEach(function(t){n.addColorStop(t.stop,t.color.toString())});this.rectangle(e.left,e.top,e.width,e.height,n)}};o.prototype.resizeImage=function(t,e){var n=t.image;if(n.width===e.width&&n.height===e.height){return n}var i,r=document.createElement("canvas");r.width=e.width;r.height=e.height;i=r.getContext("2d");i.drawImage(n,0,0,n.width,n.height,0,0,e.width,e.height);return r};function s(t){return t.length>0}e.exports=o},{"../lineargradientcontainer":12,"../log":13,"../renderer":19}],21:[function(t,e,n){var r=t("./nodecontainer");function i(t,e,n,i){r.call(this,n,i);this.ownStacking=t;this.contexts=[];this.children=[];this.opacity=(this.parent?this.parent.stack.opacity:1)*e}i.prototype=Object.create(r.prototype);i.prototype.getParentStack=function(t){var e=this.parent?this.parent.stack:null;return e?e.ownStacking?e:e.getParentStack(t):t.stack};e.exports=i},{"./nodecontainer":14}],22:[function(t,e,n){function i(t){this.rangeBounds=this.testRangeBounds(t);this.cors=this.testCORS();this.svg=this.testSVG()}i.prototype.testRangeBounds=function(t){var e,n,i,r,a=false;if(t.createRange){e=t.createRange();if(e.getBoundingClientRect){n=t.createElement("boundtest");n.style.height="123px";n.style.display="block";t.body.appendChild(n);e.selectNode(n);i=e.getBoundingClientRect();r=i.height;if(r===123){a=true}t.body.removeChild(n)}}return a};i.prototype.testCORS=function(){return typeof(new Image).crossOrigin!=="undefined"};i.prototype.testSVG=function(){var t=new Image;var e=document.createElement("canvas");var n=e.getContext("2d");t.src="data:image/svg+xml,";try{n.drawImage(t,0,0);e.toDataURL()}catch(t){return false}return true};e.exports=i},{}],23:[function(t,e,n){var i=t("./xhr");var r=t("./utils").decode64;function a(t){this.src=t;this.image=null;var n=this;this.promise=this.hasFabric().then(function(){return n.isInline(t)?Promise.resolve(n.inlineFormatting(t)):i(t)}).then(function(e){return new Promise(function(t){window.html2canvas.svg.fabric.loadSVGFromString(e,n.createCanvas.call(n,t))})})}a.prototype.hasFabric=function(){return!window.html2canvas.svg||!window.html2canvas.svg.fabric?Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")):Promise.resolve()};a.prototype.inlineFormatting=function(t){return/^data:image\/svg\+xml;base64,/.test(t)?this.decode64(this.removeContentType(t)):this.removeContentType(t)};a.prototype.removeContentType=function(t){return t.replace(/^data:image\/svg\+xml(;base64)?,/,"")};a.prototype.isInline=function(t){return/^data:image\/svg\+xml/i.test(t)};a.prototype.createCanvas=function(i){var r=this;return function(t,e){var n=new window.html2canvas.svg.fabric.StaticCanvas("c");r.image=n.lowerCanvasEl;n.setWidth(e.width).setHeight(e.height).add(window.html2canvas.svg.fabric.util.groupSVGElements(t,e)).renderAll();i(n.lowerCanvasEl)}};a.prototype.decode64=function(t){return typeof window.atob==="function"?window.atob(t):r(t)};e.exports=a},{"./utils":26,"./xhr":28}],24:[function(t,e,n){var i=t("./svgcontainer");function r(n,t){this.src=n;this.image=null;var i=this;this.promise=t?new Promise(function(t,e){i.image=new Image;i.image.onload=t;i.image.onerror=e;i.image.src="data:image/svg+xml,"+(new XMLSerializer).serializeToString(n);if(i.image.complete===true){t(i.image)}}):this.hasFabric().then(function(){return new Promise(function(t){window.html2canvas.svg.fabric.parseSVGDocument(n,i.createCanvas.call(i,t))})})}r.prototype=Object.create(i.prototype);e.exports=r},{"./svgcontainer":23}],25:[function(t,e,n){var i=t("./nodecontainer");function r(t,e){i.call(this,t,e)}r.prototype=Object.create(i.prototype);r.prototype.applyTextTransform=function(){this.node.data=this.transform(this.parent.css("textTransform"))};r.prototype.transform=function(t){var e=this.node.data;switch(t){case"lowercase":return e.toLowerCase();case"capitalize":return e.replace(/(^|\s|:|-|\(|\))([a-z])/g,a);case"uppercase":return e.toUpperCase();default:return e}};function a(t,e,n){if(t.length>0){return e+n.toUpperCase()}}e.exports=r},{"./nodecontainer":14}],26:[function(t,e,n){n.smallImage=function t(){return"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"};n.bind=function(t,e){return function(){return t.apply(e,arguments)}};n.decode64=function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var n=t.length,i,r,a,o,s,u,l,c;var f="";for(i=0;i>4;l=(a&15)<<4|o>>2;c=(o&3)<<6|s;if(o===64){f+=String.fromCharCode(u)}else if(s===64||s===-1){f+=String.fromCharCode(u,l)}else{f+=String.fromCharCode(u,l,c)}}return f};n.getBounds=function(t){if(t.getBoundingClientRect){var e=t.getBoundingClientRect();var n=t.offsetWidth==null?e.width:t.offsetWidth;return{top:e.top,bottom:e.bottom||e.top+e.height,right:e.left+n,left:e.left,width:n,height:t.offsetHeight==null?e.height:t.offsetHeight}}return{}};n.offsetBounds=function(t){var e=t.offsetParent?n.offsetBounds(t.offsetParent):{top:0,left:0};return{top:t.offsetTop+e.top,bottom:t.offsetTop+t.offsetHeight+e.top,right:t.offsetLeft+e.left+t.offsetWidth,left:t.offsetLeft+e.left,width:t.offsetWidth,height:t.offsetHeight}};n.parseBackgrounds=function(t){var e=" \r\n\t",n,i,r,a,o,s=[],u=0,l=0,c,f;var h=function t(){if(n){if(i.substr(0,1)==='"'){i=i.substr(1,i.length-2)}if(i){f.push(i)}if(n.substr(0,1)==="-"&&(a=n.indexOf("-",1)+1)>0){r=n.substr(0,a);n=n.substr(a)}s.push({prefix:r,method:n.toLowerCase(),value:o,args:f,image:null})}f=[];n=r=i=o=""};f=[];n=r=i=o="";t.split("").forEach(function(t){if(u===0&&e.indexOf(t)>-1){return}switch(t){case'"':if(!c){c=t}else if(c===t){c=null}break;case"(":if(c){break}else if(u===0){u=1;o+=t;return}else{l++}break;case")":if(c){break}else if(u===1){if(l===0){u=0;o+=t;h();return}else{l--}}break;case",":if(c){break}else if(u===0){h();return}else if(u===1){if(l===0&&!n.match(/^url$/i)){f.push(i);i="";o+=t;return}}break}o+=t;if(u===0){n+=t}else{i+=t}});h();return s}},{}],27:[function(t,e,n){var i=t("./gradientcontainer");function r(t){i.apply(this,arguments);this.type=t.args[0]==="linear"?i.TYPES.LINEAR:i.TYPES.RADIAL}r.prototype=Object.create(i.prototype);e.exports=r},{"./gradientcontainer":9}],28:[function(t,e,n){function i(i){return new Promise(function(t,e){var n=new XMLHttpRequest;n.open("GET",i);n.onload=function(){if(n.status===200){t(n.responseText)}else{e(new Error(n.statusText))}};n.onerror=function(){e(new Error("Network Error"))};n.send()})}e.exports=i},{}]},{},[4])(4)})});var BM=function t(e){this.ok=false;this.alpha=1;if(e.charAt(0)=="#"){e=e.substr(1,6)}e=e.replace(/ /g,"");e=e.toLowerCase();var c={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};e=c[e]||e;var f=[{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,example:["rgba(123, 234, 45, 0.8)","rgba(255,234,245,1.0)"],process:function t(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3]),parseFloat(e[4])]}},{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function t(e){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function t(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function t(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}}];for(var n=0;n3){this.alpha=o[3]}this.ok=true}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"};this.toHex=function(){var t=this.r.toString(16);var e=this.g.toString(16);var n=this.b.toString(16);if(t.length==1)t="0"+t;if(e.length==1)e="0"+e;if(n.length==1)n="0"+n;return"#"+t+e+n};this.getHelpXML=function(){var t=new Array;for(var e=0;e "+s.toRGB()+" -> "+s.toHex());o.appendChild(u);o.appendChild(l);a.appendChild(o)}catch(t){}}return a}};var DM=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];var NM=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function zM(t,e,n,i){if(isNaN(i)||i<1)return;i|=0;var r,a,o,s,u,l,c,f,h,d,g,p,v,m,y,_,b,w,x,k,S,C,E,A;var R=i+i+1;var M=e-1;var T=n-1;var P=i+1;var O=P*(P+1)/2;var B=new jM;var D=B;for(o=1;o>F;if(E!=0){E=255/E;t[l]=(f*L>>F)*E;t[l+1]=(h*L>>F)*E;t[l+2]=(d*L>>F)*E}else{t[l]=t[l+1]=t[l+2]=0}f-=p;h-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=c+((s=r+i+1)>F;if(E>0){E=255/E;t[s]=(f*L>>F)*E;t[s+1]=(h*L>>F)*E;t[s+2]=(d*L>>F)*E}else{t[s]=t[s+1]=t[s+2]=0}f-=p;h-=v;d-=m;g-=y;p-=z.r;v-=z.g;m-=z.b;y-=z.a;s=r+((s=a+P)65535){t-=65536;var e=55296+(t>>10),n=56320+(t&1023);return String.fromCharCode(e,n)}else{return String.fromCharCode(t)}}function s(t){var e=t.slice(1,-1);if(e in i){return i[e]}else if(e.charAt(0)==="#"){return o(parseInt(e.substr(1).replace("x","0x")))}else{a.error("entity not found:"+t);return t}}function e(t){if(t>p){var e=n.substring(p,t).replace(/&#?\w+;/g,s);h&&u(p);r.characters(e,0,t-p);p=t}}function u(t,e){while(t>=c&&(e=f.exec(n))){l=e.index;c=l+e[0].length;h.lineNumber++}h.columnNumber=t-l+1}var l=0;var c=0;var f=/.*(?:\r\n?|\n)|.*$/g;var h=r.locator;var d=[{currentNSMap:t}];var g={};var p=0;while(true){try{var v=n.indexOf("<",p);if(v<0){if(!n.substr(p).match(/^\s*$/)){var m=r.doc;var y=m.createTextNode(n.substr(p));m.appendChild(y);r.currentElement=y}return}if(v>p){e(v)}switch(n.charAt(v+1)){case"/":var _=n.indexOf(">",v+3);var b=n.substring(v+2,_);var w=d.pop();if(_<0){b=n.substring(v+2).replace(/[\s<].*/,"");a.error("end tag name: "+b+" is not complete:"+w.tagName);_=v+1+b.length}else if(b.match(/\sp){p=_}else{e(Math.max(v,p)+1)}}}function JM(t,e){e.lineNumber=t.lineNumber;e.columnNumber=t.columnNumber;return e}function QM(t,e,n,i,r,a){var o;var s;var u=++e;var l=GM;while(true){var c=t.charAt(u);switch(c){case"=":if(l===VM){o=t.slice(e,u);l=WM}else if(l===UM){l=WM}else{throw new Error("attribute equal must after attrName")}break;case"'":case'"':if(l===WM||l===VM){if(l===VM){a.warning('attribute value must after "="');o=t.slice(e,u)}e=u+1;u=t.indexOf(c,e);if(u>0){s=t.slice(e,u).replace(/&#?\w+;/g,r);n.add(o,s,e-1);l=KM}else{throw new Error("attribute value no end '"+c+"' match")}}else if(l==qM){s=t.slice(e,u).replace(/&#?\w+;/g,r);n.add(o,s,e);a.warning('attribute "'+o+'" missed start quot('+c+")!!");e=u+1;l=KM}else{throw new Error('attribute value must after "="')}break;case"/":switch(l){case GM:n.setTagName(t.slice(e,u));case KM:case YM:case XM:l=XM;n.closed=true;case qM:case VM:case UM:break;default:throw new Error("attribute invalid close char('/')")}break;case"":a.error("unexpected end of input");if(l==GM){n.setTagName(t.slice(e,u))}return u;case">":switch(l){case GM:n.setTagName(t.slice(e,u));case KM:case YM:case XM:break;case qM:case VM:s=t.slice(e,u);if(s.slice(-1)==="/"){n.closed=true;s=s.slice(0,-1)}case UM:if(l===UM){s=o}if(l==qM){a.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s.replace(/&#?\w+;/g,r),e)}else{if(i[""]!=="http://www.w3.org/1999/xhtml"||!s.match(/^(?:disabled|checked|selected)$/i)){a.warning('attribute "'+s+'" missed value!! "'+s+'" instead!!')}n.add(s,s,e)}break;case WM:throw new Error("attribute value missed!!")}return u;case"€":c=" ";default:if(c<=" "){switch(l){case GM:n.setTagName(t.slice(e,u));l=YM;break;case VM:o=t.slice(e,u);l=UM;break;case qM:var s=t.slice(e,u).replace(/&#?\w+;/g,r);a.warning('attribute "'+s+'" missed quot(")!!');n.add(o,s,e);case KM:l=YM;break}}else{switch(l){case UM:var f=n.tagName;if(i[""]!=="http://www.w3.org/1999/xhtml"||!o.match(/^(?:disabled|checked|selected)$/i)){a.warning('attribute "'+o+'" missed value!! "'+o+'" instead2!!')}n.add(o,o,e);e=u;l=VM;break;case KM:a.warning('attribute space is required"'+o+'"!!');case YM:l=VM;e=u;break;case WM:l=qM;e=u;break;case XM:throw new Error("elements closed character '/' and '>' must be connected to")}}}u++}}function tT(t,e,n){var i=t.tagName;var r=null;var a=t.length;while(a--){var o=t[a];var s=o.qName;var u=o.value;var l=s.indexOf(":");if(l>0){var c=o.prefix=s.slice(0,l);var f=s.slice(l+1);var h=c==="xmlns"&&f}else{f=s;c=null;h=s==="xmlns"&&""}o.localName=f;if(h!==false){if(r==null){r={};iT(n,n={})}n[h]=r[h]=u;o.uri="http://www.w3.org/2000/xmlns/";e.startPrefixMapping(h,u)}}var a=t.length;while(a--){o=t[a];var c=o.prefix;if(c){if(c==="xml"){o.uri="http://www.w3.org/XML/1998/namespace"}if(c!=="xmlns"){o.uri=n[c||""]}}}var l=i.indexOf(":");if(l>0){c=t.prefix=i.slice(0,l);f=t.localName=i.slice(l+1)}else{c=null;f=t.localName=i}var d=t.uri=n[c||""];e.startElement(d,f,i,t);if(t.closed){e.endElement(d,f,i);if(r){for(c in r){e.endPrefixMapping(c)}}}else{t.currentNSMap=n;t.localNSMap=r;return true}}function eT(t,e,n,i,r){if(/^(?:script|textarea)$/i.test(n)){var a=t.indexOf("",e);var o=t.substring(e+1,a);if(/[&<]/.test(o)){if(/^script$/i.test(n)){r.characters(o,0,o.length);return a}o=o.replace(/&#?\w+;/g,i);r.characters(o,0,o.length);return a}}return e+1}function nT(t,e,n,i){var r=i[n];if(r==null){r=t.lastIndexOf("");if(re){n.comment(t,e+4,a-e-4);return a+3}else{i.error("Unclosed comment");return-1}}else{return-1}default:if(t.substr(e+3,6)=="CDATA["){var a=t.indexOf("]]>",e+9);n.startCDATA();n.characters(t,e+9,a-e-9);n.endCDATA();return a+3}var o=uT(t,e);var s=o.length;if(s>1&&/!doctype/i.test(o[0][0])){var u=o[1][0];var l=s>3&&/^public$/i.test(o[2][0])&&o[3][0];var c=s>4&&o[4][0];var f=o[s-1];n.startDTD(u,l&&l.replace(/^(['"])(.*?)\1$/,"$2"),c&&c.replace(/^(['"])(.*?)\1$/,"$2"));n.endDTD();return f.index+f[0].length}}return-1}function aT(t,e,n){var i=t.indexOf("?>",e);if(i){var r=t.substring(e,i).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(r){var a=r[0].length;n.processingInstruction(r[1],r[2]);return i+2}else{return-1}}return-1}function oT(t){}oT.prototype={setTagName:function t(e){if(!HM.test(e)){throw new Error("invalid tagName:"+e)}this.tagName=e},add:function t(e,n,i){if(!HM.test(e)){throw new Error("invalid attribute:"+e)}this[this.length++]={qName:e,value:n,offset:i}},length:0,getLocalName:function t(e){return this[e].localName},getLocator:function t(e){return this[e].locator},getQName:function t(e){return this[e].qName},getURI:function t(e){return this[e].uri},getValue:function t(e){return this[e].value}};function sT(t,e){t.__proto__=e;return t}if(!(sT({},sT.prototype)instanceof sT)){sT=function t(e,n){function i(){}i.prototype=n;i=new i;for(n in e){i[n]=e[n]}return i}}function uT(t,e){var n;var i=[];var r=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;r.lastIndex=e;r.exec(t);while(n=r.exec(t)){i.push(n);if(n[1])return i}}var lT=ZM;var cT={XMLReader:lT};function fT(t,e){for(var n in t){e[n]=t[n]}}function hT(t,e){var n=t.prototype;if(Object.create){var i=Object.create(e.prototype);n.__proto__=i}if(!(n instanceof e)){var r=function t(){};r.prototype=e.prototype;r=new r;fT(n,r);t.prototype=n=r}if(n.constructor!=t){if(typeof t!="function"){console.error("unknow Class:"+t)}n.constructor=t}}var dT="http://www.w3.org/1999/xhtml";var gT={};var pT=gT.ELEMENT_NODE=1;var vT=gT.ATTRIBUTE_NODE=2;var mT=gT.TEXT_NODE=3;var yT=gT.CDATA_SECTION_NODE=4;var _T=gT.ENTITY_REFERENCE_NODE=5;var bT=gT.ENTITY_NODE=6;var wT=gT.PROCESSING_INSTRUCTION_NODE=7;var xT=gT.COMMENT_NODE=8;var kT=gT.DOCUMENT_NODE=9;var ST=gT.DOCUMENT_TYPE_NODE=10;var CT=gT.DOCUMENT_FRAGMENT_NODE=11;var ET=gT.NOTATION_NODE=12;var AT={};var RT={};var MT=AT.INDEX_SIZE_ERR=(RT[1]="Index size error",1);var TT=AT.DOMSTRING_SIZE_ERR=(RT[2]="DOMString size error",2);var PT=AT.HIERARCHY_REQUEST_ERR=(RT[3]="Hierarchy request error",3);var OT=AT.WRONG_DOCUMENT_ERR=(RT[4]="Wrong document",4);var BT=AT.INVALID_CHARACTER_ERR=(RT[5]="Invalid character",5);var DT=AT.NO_DATA_ALLOWED_ERR=(RT[6]="No data allowed",6);var NT=AT.NO_MODIFICATION_ALLOWED_ERR=(RT[7]="No modification allowed",7);var zT=AT.NOT_FOUND_ERR=(RT[8]="Not found",8);var jT=AT.NOT_SUPPORTED_ERR=(RT[9]="Not supported",9);var LT=AT.INUSE_ATTRIBUTE_ERR=(RT[10]="Attribute in use",10);var FT=AT.INVALID_STATE_ERR=(RT[11]="Invalid state",11);var IT=AT.SYNTAX_ERR=(RT[12]="Syntax error",12);var HT=AT.INVALID_MODIFICATION_ERR=(RT[13]="Invalid modification",13);var GT=AT.NAMESPACE_ERR=(RT[14]="Invalid namespace",14);var VT=AT.INVALID_ACCESS_ERR=(RT[15]="Invalid access",15);function UT(t,e){if(e instanceof Error){var n=e}else{n=this;Error.call(this,RT[t]);this.message=RT[t];if(Error.captureStackTrace)Error.captureStackTrace(this,UT)}n.code=t;if(e)this.message=this.message+": "+e;return n}UT.prototype=Error.prototype;fT(AT,UT);function WT(){}WT.prototype={length:0,item:function t(e){return this[e]||null},toString:function t(e,n){for(var i=[],r=0;r=0){var r=e.length-1;while(i0},lookupPrefix:function t(e){var n=this;while(n){var i=n._nsMap;if(i){for(var r in i){if(i[r]==e){return r}}}n=n.nodeType==vT?n.ownerDocument:n.parentNode}return null},lookupNamespaceURI:function t(e){var n=this;while(n){var i=n._nsMap;if(i){if(e in i){return i[e]}}n=n.nodeType==vT?n.ownerDocument:n.parentNode}return null},isDefaultNamespace:function t(e){var n=this.lookupPrefix(e);return n==null}};function tP(t){return t=="<"&&"<"||t==">"&&">"||t=="&"&&"&"||t=='"'&&"""||"&#"+t.charCodeAt()+";"}fT(gT,QT);fT(gT,QT.prototype);function eP(t,e){if(e(t)){return true}if(t=t.firstChild){do{if(eP(t,e)){return true}}while(t=t.nextSibling)}}function nP(){}function iP(t,e,n){t&&t._inc++;var i=n.namespaceURI;if(i=="http://www.w3.org/2000/xmlns/"){e._nsMap[n.prefix?n.localName:""]=n.value}}function rP(t,e,n,i){t&&t._inc++;var r=n.namespaceURI;if(r=="http://www.w3.org/2000/xmlns/"){delete e._nsMap[n.prefix?n.localName:""]}}function aP(t,e,n){if(t&&t._inc){t._inc++;var i=e.childNodes;if(n){i[i.length++]=n}else{var r=e.firstChild;var a=0;while(r){i[a++]=r;r=r.nextSibling}i.length=a}}}function oP(t,e){var n=e.previousSibling;var i=e.nextSibling;if(n){n.nextSibling=i}else{t.firstChild=i}if(i){i.previousSibling=n}else{t.lastChild=n}aP(t.ownerDocument,t);return e}function sP(t,e,n){var i=e.parentNode;if(i){i.removeChild(e)}if(e.nodeType===CT){var r=e.firstChild;if(r==null){return e}var a=e.lastChild}else{r=a=e}var o=n?n.previousSibling:t.lastChild;r.previousSibling=o;a.nextSibling=n;if(o){o.nextSibling=r}else{t.firstChild=r}if(n==null){t.lastChild=a}else{n.previousSibling=a}do{r.parentNode=t}while(r!==a&&(r=r.nextSibling));aP(t.ownerDocument||t,t);if(e.nodeType==CT){e.firstChild=e.lastChild=null}return e}function uP(t,e){var n=e.parentNode;if(n){var i=t.lastChild;n.removeChild(e);var i=t.lastChild}var i=t.lastChild;e.parentNode=t;e.previousSibling=i;e.nextSibling=null;if(i){i.nextSibling=e}else{t.firstChild=e}t.lastChild=e;aP(t.ownerDocument,t,e);return e}nP.prototype={nodeName:"#document",nodeType:kT,doctype:null,documentElement:null,_inc:1,insertBefore:function t(e,n){if(e.nodeType==CT){var i=e.firstChild;while(i){var r=i.nextSibling;this.insertBefore(i,n);i=r}return e}if(this.documentElement==null&&e.nodeType==pT){this.documentElement=e}return sP(this,e,n),e.ownerDocument=this,e},removeChild:function t(e){if(this.documentElement==e){this.documentElement=null}return oP(this,e)},importNode:function t(e,n){return CP(this,e,n)},getElementById:function t(e){var n=null;eP(this.documentElement,function(t){if(t.nodeType==pT){if(t.getAttribute("id")==e){n=t;return true}}});return n},createElement:function t(e){var n=new lP;n.ownerDocument=this;n.nodeName=e;n.tagName=e;n.childNodes=new WT;var i=n.attributes=new YT;i._ownerElement=n;return n},createDocumentFragment:function t(){var e=new _P;e.ownerDocument=this;e.childNodes=new WT;return e},createTextNode:function t(e){var n=new hP;n.ownerDocument=this;n.appendData(e);return n},createComment:function t(e){var n=new dP;n.ownerDocument=this;n.appendData(e);return n},createCDATASection:function t(e){var n=new gP;n.ownerDocument=this;n.appendData(e);return n},createProcessingInstruction:function t(e,n){var i=new bP;i.ownerDocument=this;i.tagName=i.target=e;i.nodeValue=i.data=n;return i},createAttribute:function t(e){var n=new cP;n.ownerDocument=this;n.name=e;n.nodeName=e;n.localName=e;n.specified=true;return n},createEntityReference:function t(e){var n=new yP;n.ownerDocument=this;n.nodeName=e;return n},createElementNS:function t(e,n){var i=new lP;var r=n.split(":");var a=i.attributes=new YT;i.childNodes=new WT;i.ownerDocument=this;i.nodeName=n;i.tagName=n;i.namespaceURI=e;if(r.length==2){i.prefix=r[0];i.localName=r[1]}else{i.localName=n}a._ownerElement=i;return i},createAttributeNS:function t(e,n){var i=new cP;var r=n.split(":");i.ownerDocument=this;i.nodeName=n;i.name=n;i.namespaceURI=e;i.specified=true;if(r.length==2){i.prefix=r[0];i.localName=r[1]}else{i.localName=n}return i}};hT(nP,QT);function lP(){this._nsMap={}}lP.prototype={nodeType:pT,hasAttribute:function t(e){return this.getAttributeNode(e)!=null},getAttribute:function t(e){var n=this.getAttributeNode(e);return n&&n.value||""},getAttributeNode:function t(e){return this.attributes.getNamedItem(e)},setAttribute:function t(e,n){var i=this.ownerDocument.createAttribute(e);i.value=i.nodeValue=""+n;this.setAttributeNode(i)},removeAttribute:function t(e){var n=this.getAttributeNode(e);n&&this.removeAttributeNode(n)},appendChild:function t(e){if(e.nodeType===CT){return this.insertBefore(e,null)}else{return uP(this,e)}},setAttributeNode:function t(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function t(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function t(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function t(e,n){var i=this.getAttributeNodeNS(e,n);i&&this.removeAttributeNode(i)},hasAttributeNS:function t(e,n){return this.getAttributeNodeNS(e,n)!=null},getAttributeNS:function t(e,n){var i=this.getAttributeNodeNS(e,n);return i&&i.value||""},setAttributeNS:function t(e,n,i){var r=this.ownerDocument.createAttributeNS(e,n);r.value=r.nodeValue=""+i;this.setAttributeNode(r)},getAttributeNodeNS:function t(e,n){return this.attributes.getNamedItemNS(e,n)},getElementsByTagName:function t(i){return new qT(this,function(e){var n=[];eP(e,function(t){if(t!==e&&t.nodeType==pT&&(i==="*"||t.tagName==i)){n.push(t)}});return n})},getElementsByTagNameNS:function t(i,r){return new qT(this,function(e){var n=[];eP(e,function(t){if(t!==e&&t.nodeType===pT&&(i==="*"||t.namespaceURI===i)&&(r==="*"||t.localName==r)){n.push(t)}});return n})}};nP.prototype.getElementsByTagName=lP.prototype.getElementsByTagName;nP.prototype.getElementsByTagNameNS=lP.prototype.getElementsByTagNameNS;hT(lP,QT);function cP(){}cP.prototype.nodeType=vT;hT(cP,QT);function fP(){}fP.prototype={data:"",substringData:function t(e,n){return this.data.substring(e,e+n)},appendData:function t(e){e=this.data+e;this.nodeValue=this.data=e;this.length=e.length},insertData:function t(e,n){this.replaceData(e,0,n)},appendChild:function t(e){throw new Error(RT[PT])},deleteData:function t(e,n){this.replaceData(e,n,"")},replaceData:function t(e,n,i){var r=this.data.substring(0,e);var a=this.data.substring(e+n);i=r+i+a;this.nodeValue=this.data=i;this.length=i.length}};hT(fP,QT);function hP(){}hP.prototype={nodeName:"#text",nodeType:mT,splitText:function t(e){var n=this.data;var i=n.substring(e);n=n.substring(0,e);this.data=this.nodeValue=n;this.length=n.length;var r=this.ownerDocument.createTextNode(i);if(this.parentNode){this.parentNode.insertBefore(r,this.nextSibling)}return r}};hT(hP,fP);function dP(){}dP.prototype={nodeName:"#comment",nodeType:xT};hT(dP,fP);function gP(){}gP.prototype={nodeName:"#cdata-section",nodeType:yT};hT(gP,fP);function pP(){}pP.prototype.nodeType=ST;hT(pP,QT);function vP(){}vP.prototype.nodeType=ET;hT(vP,QT);function mP(){}mP.prototype.nodeType=bT;hT(mP,QT);function yP(){}yP.prototype.nodeType=_T;hT(yP,QT);function _P(){}_P.prototype.nodeName="#document-fragment";_P.prototype.nodeType=CT;hT(_P,QT);function bP(){}bP.prototype.nodeType=wT;hT(bP,QT);function wP(){}wP.prototype.serializeToString=function(t,e,n){return xP.call(t,e,n)};QT.prototype.toString=xP;function xP(t,e){var n=[];var i=this.nodeType==9?this.documentElement:this;var r=i.prefix;var a=i.namespaceURI;if(a&&r==null){var r=i.lookupPrefix(a);if(r==null){var o=[{namespace:a,prefix:null}]}}SP(this,n,t,e,o);return n.join("")}function kP(t,e,n){var i=t.prefix||"";var r=t.namespaceURI;if(!i&&!r){return false}if(i==="xml"&&r==="http://www.w3.org/XML/1998/namespace"||r=="http://www.w3.org/2000/xmlns/"){return false}var a=n.length;while(a--){var o=n[a];if(o.prefix==i){return o.namespace!=r}}return true}function SP(t,e,n,i,r){if(i){t=i(t);if(t){if(typeof t=="string"){e.push(t);return}}else{return}}switch(t.nodeType){case pT:if(!r)r=[];var a=r.length;var o=t.attributes;var s=o.length;var u=t.firstChild;var l=t.tagName;n=dT===t.namespaceURI||n;e.push("<",l);for(var c=0;c");if(n&&/^script$/i.test(l)){while(u){if(u.data){e.push(u.data)}else{SP(u,e,n,i,r)}u=u.nextSibling}}else{while(u){SP(u,e,n,i,r);u=u.nextSibling}}e.push("")}else{e.push("/>")}return;case kT:case CT:var u=t.firstChild;while(u){SP(u,e,n,i,r);u=u.nextSibling}return;case vT:return e.push(" ",t.name,'="',t.value.replace(/[<&"]/g,tP),'"');case mT:return e.push(t.data.replace(/[<&]/g,tP));case yT:return e.push("");case xT:return e.push("\x3c!--",t.data,"--\x3e");case ST:var p=t.publicId;var v=t.systemId;e.push("')}else if(v&&v!="."){e.push(' SYSTEM "',v,'">')}else{var m=t.internalSubset;if(m){e.push(" [",m,"]")}e.push(">")}return;case wT:return e.push("");case _T:return e.push("&",t.nodeName,";");default:e.push("??",t.nodeName)}}function CP(t,e,n){var i;switch(e.nodeType){case pT:i=e.cloneNode(false);i.ownerDocument=t;case CT:break;case vT:n=true;break}if(!i){i=e.cloneNode(false)}i.ownerDocument=t;i.parentNode=null;if(n){var r=e.firstChild;while(r){i.appendChild(CP(t,r,n));r=r.nextSibling}}return i}function EP(t,e,n){var i=new e.constructor;for(var r in e){var a=e[r];if(_typeof2(a)!="object"){if(a!=i[r]){i[r]=a}}}if(e.childNodes){i.childNodes=new WT}i.ownerDocument=t;switch(i.nodeType){case pT:var o=e.attributes;var s=i.attributes=new YT;var u=o.length;s._ownerElement=i;for(var l=0;l",amp:"&",quot:'"',apos:"'"};if(o){r.setDocumentLocator(o)}i.errorHandler=l(a,r,o);i.domBuilder=n.domBuilder||r;if(/\/x?html?$/.test(e)){u.nbsp=" ";u.copy="©";s[""]="http://www.w3.org/1999/xhtml"}s.xml=s.xml||"http://www.w3.org/XML/1998/namespace";if(t){i.parse(t,s,u)}else{i.errorHandler.error("invalid doc source")}return r.doc};function l(i,t,r){if(!i){if(t instanceof c){return t}i=t}var a={};var o=i instanceof Function;r=r||{};function e(e){var n=i[e];if(!n&&o){n=i.length==2?function(t){i(e,t)}:i}a[e]=n&&function(t){n("[xmldom "+e+"]\t"+t+s(r))}||function(){}}e("warning");e("error");e("fatalError");return a}function c(){this.cdata=false}function f(t,e){e.lineNumber=t.lineNumber;e.columnNumber=t.columnNumber}c.prototype={startDocument:function t(){this.doc=(new i).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function t(e,n,i,r){var a=this.doc;var o=a.createElementNS(e,i||n);var s=r.length;h(this,o);this.currentElement=o;this.locator&&f(this.locator,o);for(var u=0;u=e+n||e){return new java.lang.String(t,e,n)+""}return t}}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(t){c.prototype[t]=function(){return null}});function h(t,e){if(!t.currentElement){t.doc.appendChild(e)}else{t.currentElement.appendChild(e)}}var d=cT.XMLReader;var i=e.DOMImplementation=PP.DOMImplementation;e.XMLSerializer=PP.XMLSerializer;e.DOMParser=n});function BP(t,e,n){if(t==null&&e==null&&n==null){var i=document.querySelectorAll("svg");for(var r=0;r~\.\[:]+)/g;var n=/(\.[^\s\+>~\.\[:]+)/g;var i=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi;var o=/(:[\w-]+\([^\)]*\))/gi;var s=/(:[^\s\+>~\.\[:]+)/g;var u=/([^\s\+>~\.\[:]+)/g;var l=function t(e,n){var i=r.match(e);if(i==null){return}a[n]+=i.length;r=r.replace(e," ")};r=r.replace(/:not\(([^\)]*)\)/g," $1 ");r=r.replace(/{[^]*/gm," ");l(t,1);l(e,0);l(n,1);l(i,2);l(o,1);l(s,1);r=r.replace(/[\*\s\+>~]/g," ");r=r.replace(/[#\.]/g," ");l(u,2);return a.join("")}function zP(t){var O={opts:t};var l=DP();if(typeof CanvasRenderingContext2D!="undefined"){CanvasRenderingContext2D.prototype.drawSvg=function(t,e,n,i,r,a){var o={ignoreMouse:true,ignoreAnimation:true,ignoreDimensions:true,ignoreClear:true,offsetX:e,offsetY:n,scaleWidth:i,scaleHeight:r};for(var s in a){if(a.hasOwnProperty(s)){o[s]=a[s]}}BP(this.canvas,t,o)}}O.FRAMERATE=30;O.MAX_VIRTUAL_PIXELS=3e4;O.log=function(t){};if(O.opts.log==true&&typeof console!="undefined"){O.log=function(t){console.log(t)}}O.init=function(t){var e=0;O.UniqueId=function(){e++;return"canvg"+e};O.Definitions={};O.Styles={};O.StylesSpecificity={};O.Animations=[];O.Images=[];O.ctx=t;O.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(t,e){this.viewPorts.push({width:t,height:e})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};this.ComputeSize=function(t){if(t!=null&&typeof t=="number")return t;if(t=="x")return this.width();if(t=="y")return this.height();return Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};O.init();O.ImagesLoaded=function(){for(var t=0;t]*>/,"");var e=new ActiveXObject("Microsoft.XMLDOM");e.async="false";e.loadXML(t);return e}};O.Property=function(t,e){this.name=t;this.value=e};O.Property.prototype.getValue=function(){return this.value};O.Property.prototype.hasValue=function(){return this.value!=null&&this.value!=""};O.Property.prototype.numValue=function(){if(!this.hasValue())return 0;var t=parseFloat(this.value);if((this.value+"").match(/%$/)){t=t/100}return t};O.Property.prototype.valueOrDefault=function(t){if(this.hasValue())return this.value;return t};O.Property.prototype.numValueOrDefault=function(t){if(this.hasValue())return this.numValue();return t};O.Property.prototype.addOpacity=function(t){var e=this.value;if(t.value!=null&&t.value!=""&&typeof this.value=="string"){var n=new BM(this.value);if(n.ok){e="rgba("+n.r+", "+n.g+", "+n.b+", "+t.numValue()+")"}}return new O.Property(this.name,e)};O.Property.prototype.getDefinition=function(){var t=this.value.match(/#([^\)'"]+)/);if(t){t=t[1]}if(!t){t=this.value}return O.Definitions[t]};O.Property.prototype.isUrlDefinition=function(){return this.value.indexOf("url(")==0};O.Property.prototype.getFillStyleDefinition=function(t,e){var n=this.getDefinition();if(n!=null&&n.createGradient){return n.createGradient(O.ctx,t,e)}if(n!=null&&n.createPattern){if(n.getHrefAttribute().hasValue()){var i=n.attribute("patternTransform");n=n.getHrefAttribute().getDefinition();if(i.hasValue()){n.attribute("patternTransform",true).value=i.value}}return n.createPattern(O.ctx,t)}return null};O.Property.prototype.getDPI=function(t){return 96};O.Property.prototype.getEM=function(t){var e=12;var n=new O.Property("fontSize",O.Font.Parse(O.ctx.font).fontSize);if(n.hasValue())e=n.toPixels(t);return e};O.Property.prototype.getUnits=function(){var t=this.value+"";return t.replace(/[0-9\.\-]/g,"")};O.Property.prototype.toPixels=function(t,e){if(!this.hasValue())return 0;var n=this.value+"";if(n.match(/em$/))return this.numValue()*this.getEM(t);if(n.match(/ex$/))return this.numValue()*this.getEM(t)/2;if(n.match(/px$/))return this.numValue();if(n.match(/pt$/))return this.numValue()*this.getDPI(t)*(1/72);if(n.match(/pc$/))return this.numValue()*15;if(n.match(/cm$/))return this.numValue()*this.getDPI(t)/2.54;if(n.match(/mm$/))return this.numValue()*this.getDPI(t)/25.4;if(n.match(/in$/))return this.numValue()*this.getDPI(t);if(n.match(/%$/))return this.numValue()*O.ViewPort.ComputeSize(t);var i=this.numValue();if(e&&i<1)return i*O.ViewPort.ComputeSize(t);return i};O.Property.prototype.toMilliseconds=function(){if(!this.hasValue())return 0;var t=this.value+"";if(t.match(/s$/))return this.numValue()*1e3;if(t.match(/ms$/))return this.numValue();return this.numValue()};O.Property.prototype.toRadians=function(){if(!this.hasValue())return 0;var t=this.value+"";if(t.match(/deg$/))return this.numValue()*(Math.PI/180);if(t.match(/grad$/))return this.numValue()*(Math.PI/200);if(t.match(/rad$/))return this.numValue();return this.numValue()*(Math.PI/180)};var e={baseline:"alphabetic","before-edge":"top","text-before-edge":"top",middle:"middle",central:"middle","after-edge":"bottom","text-after-edge":"bottom",ideographic:"ideographic",alphabetic:"alphabetic",hanging:"hanging",mathematical:"alphabetic"};O.Property.prototype.toTextBaseline=function(){if(!this.hasValue())return null;return e[this.value]};O.Font=new function(){this.Styles="normal|italic|oblique|inherit";this.Variants="normal|small-caps|inherit";this.Weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";this.CreateFont=function(t,e,n,i,r,a){var o=a!=null?this.Parse(a):this.CreateFont("","","","","",O.ctx.font);return{fontFamily:r||o.fontFamily,fontSize:i||o.fontSize,fontStyle:t||o.fontStyle,fontWeight:n||o.fontWeight,fontVariant:e||o.fontVariant,toString:function t(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var o=this;this.Parse=function(t){var e={};var n=O.trim(O.compressSpaces(t||"")).split(" ");var i={fontSize:false,fontStyle:false,fontWeight:false,fontVariant:false};var r="";for(var a=0;athis.x2)this.x2=t}if(e!=null){if(isNaN(this.y1)||isNaN(this.y2)){this.y1=e;this.y2=e}if(ethis.y2)this.y2=e}};this.addX=function(t){this.addPoint(t,null)};this.addY=function(t){this.addPoint(null,t)};this.addBoundingBox=function(t){this.addPoint(t.x1,t.y1);this.addPoint(t.x2,t.y2)};this.addQuadraticCurve=function(t,e,n,i,r,a){var o=t+2/3*(n-t);var s=e+2/3*(i-e);var u=o+1/3*(r-t);var l=s+1/3*(a-e);this.addBezierCurve(t,e,o,u,s,l,r,a)};this.addBezierCurve=function(t,e,n,i,r,a,o,s){var u=[t,e],l=[n,i],c=[r,a],f=[o,s];this.addPoint(u[0],u[1]);this.addPoint(f[0],f[1]);for(var h=0;h<=1;h++){var d=function t(e){return Math.pow(1-e,3)*u[h]+3*Math.pow(1-e,2)*e*l[h]+3*(1-e)*Math.pow(e,2)*c[h]+Math.pow(e,3)*f[h]};var g=6*u[h]-12*l[h]+6*c[h];var p=-3*u[h]+9*l[h]-9*c[h]+3*f[h];var v=3*l[h]-3*u[h];if(p==0){if(g==0)continue;var m=-v/g;if(0=0;e--){this.transforms[e].unapply(t)}};this.applyToPoint=function(t){for(var e=0;er){this.styles[i]=e[i];this.stylesSpecificity[i]=n}}}}}};if(a!=null&&a.nodeType==1){for(var t=0;t0){t.push([this.points[this.points.length-1],t[t.length-1][1]])}return t}};O.Element.polyline.prototype=new O.Element.PathElementBase;O.Element.polygon=function(t){this.base=O.Element.polyline;this.base(t);this.basePath=this.path;this.path=function(t){var e=this.basePath(t);if(t!=null){t.lineTo(this.points[0].x,this.points[0].y);t.closePath()}return e}};O.Element.polygon.prototype=new O.Element.polyline;O.Element.path=function(t){this.base=O.Element.PathElementBase;this.base(t);var e=this.attribute("d").value;e=e.replace(/,/gm," ");for(var n=0;n<2;n++){e=e.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2")}e=e.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");e=e.replace(/([0-9])([+\-])/gm,"$1 $2");for(var n=0;n<2;n++){e=e.replace(/(\.[0-9]*)(\.)/gm,"$1 $2")}e=e.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");e=O.compressSpaces(e);e=O.trim(e);this.PathParser=new function(t){this.tokens=t.split(" ");this.reset=function(){this.i=-1;this.command="";this.previousCommand="";this.start=new O.Point(0,0);this.control=new O.Point(0,0);this.current=new O.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){if(this.isEnd())return true;return this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){switch(this.command){case"m":case"l":case"h":case"v":case"c":case"s":case"q":case"t":case"a":case"z":return true}return false};this.getToken=function(){this.i++;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){var t=new O.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)};this.getAsControlPoint=function(){var t=this.getPoint();this.control=t;return t};this.getAsCurrentPoint=function(){var t=this.getPoint();this.current=t;return t};this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"&&this.previousCommand.toLowerCase()!="q"&&this.previousCommand.toLowerCase()!="t"){return this.current}var t=new O.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return t};this.makeAbsolute=function(t){if(this.isRelativeCommand()){t.x+=this.current.x;t.y+=this.current.y}return t};this.addMarker=function(t,e,n){if(n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null){this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)}this.addMarkerAngle(t,e==null?null:e.angleTo(t))};this.addMarkerAngle=function(t,e){this.points.push(t);this.angles.push(e)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var t=0;t1){c*=Math.sqrt(v);f*=Math.sqrt(v)}var m=(d==g?-1:1)*Math.sqrt((Math.pow(c,2)*Math.pow(f,2)-Math.pow(c,2)*Math.pow(p.y,2)-Math.pow(f,2)*Math.pow(p.x,2))/(Math.pow(c,2)*Math.pow(p.y,2)+Math.pow(f,2)*Math.pow(p.x,2)));if(isNaN(m))m=0;var y=new O.Point(m*c*p.y/f,m*-f*p.x/c);var _=new O.Point((o.x+l.x)/2+Math.cos(h)*y.x-Math.sin(h)*y.y,(o.y+l.y)/2+Math.sin(h)*y.x+Math.cos(h)*y.y);var b=function t(e){return Math.sqrt(Math.pow(e[0],2)+Math.pow(e[1],2))};var w=function t(e,n){return(e[0]*n[0]+e[1]*n[1])/(b(e)*b(n))};var x=function t(e,n){return(e[0]*n[1]=1)E=0;var A=1-g?1:-1;var R=k+A*(E/2);var M=new O.Point(_.x+c*Math.cos(R),_.y+f*Math.sin(R));e.addMarkerAngle(M,R-A*Math.PI/2);e.addMarkerAngle(l,R-A*Math.PI);n.addPoint(l.x,l.y);if(t!=null){var w=c>f?c:f;var T=c>f?1:c/f;var P=c>f?f/c:1;t.translate(_.x,_.y);t.rotate(h);t.scale(T,P);t.arc(0,0,w,k,k+E,1-g);t.scale(1/T,1/P);t.rotate(-h);t.translate(-_.x,-_.y)}}break;case"Z":case"z":if(t!=null)t.closePath();e.current=e.start}}return n};this.getMarkers=function(){var t=this.PathParser.getMarkerPoints();var e=this.PathParser.getMarkerAngles();var n=[];for(var i=0;i1)this.offset=1;var e=this.style("stop-color",true);if(e.value=="")e.value="#000";if(this.style("stop-opacity").hasValue())e=e.addOpacity(this.style("stop-opacity"));this.color=e.value};O.Element.stop.prototype=new O.Element.ElementBase;O.Element.AnimateBase=function(t){this.base=O.Element.ElementBase;this.base(t);O.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").toMilliseconds();this.getProperty=function(){var t=this.attribute("attributeType").value;var e=this.attribute("attributeName").value;if(t=="CSS"){return this.parent.style(e,true)}return this.parent.attribute(e,true)};this.initialValue=null;this.initialUnits="";this.removed=false;this.calcValue=function(){return""};this.update=function(t){if(this.initialValue==null){this.initialValue=this.getProperty().value;this.initialUnits=this.getProperty().getUnits()}if(this.duration>this.maxDuration){if(this.attribute("repeatCount").value=="indefinite"||this.attribute("repeatDur").value=="indefinite"){this.duration=0}else if(this.attribute("fill").valueOrDefault("remove")=="freeze"&&!this.frozen){this.frozen=true;this.parent.animationFrozen=true;this.parent.animationFrozenValue=this.getProperty().value}else if(this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed){this.removed=true;this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue;return true}return false}this.duration=this.duration+t;var e=false;if(this.beginn&&o.attribute("x").hasValue())break;r+=o.measureTextRecursive(t)}return-1*(i=="end"?r:r/2)}return 0};this.renderChild=function(t,e,n,i){var r=n.children[i];if(r.attribute("x").hasValue()){r.x=r.attribute("x").toPixels("x")+e.getAnchorDelta(t,n,i);if(r.attribute("dx").hasValue())r.x+=r.attribute("dx").toPixels("x")}else{if(r.attribute("dx").hasValue())e.x+=r.attribute("dx").toPixels("x");r.x=e.x}e.x=r.x+r.measureText(t);if(r.attribute("y").hasValue()){r.y=r.attribute("y").toPixels("y");if(r.attribute("dy").hasValue())r.y+=r.attribute("dy").toPixels("y")}else{if(r.attribute("dy").hasValue())e.y+=r.attribute("dy").toPixels("y");r.y=e.y}e.y=r.y;r.render(t);for(var i=0;i0&&e[n-1]!=" "&&n0&&e[n-1]!=" "&&(n==e.length-1||e[n+1]==" "))a="initial";if(typeof t.glyphs[i]!="undefined"){r=t.glyphs[i][a];if(r==null&&t.glyphs[i].type=="glyph")r=t.glyphs[i]}}else{r=t.glyphs[i]}if(r==null)r=t.missingGlyph;return r};this.renderChildren=function(t){var e=this.parent.style("font-family").getDefinition();if(e!=null){var n=this.parent.style("font-size").numValueOrDefault(O.Font.Parse(O.ctx.font).fontSize);var i=this.parent.style("font-style").valueOrDefault(O.Font.Parse(O.ctx.font).fontStyle);var r=this.getText();if(e.isRTL)r=r.split("").reverse().join("");var a=O.ToNumberArray(this.parent.attribute("dx").value);for(var o=0;o0){return""}return this.text}};O.Element.tspan.prototype=new O.Element.TextElementBase;O.Element.tref=function(t){this.base=O.Element.TextElementBase;this.base(t);this.getText=function(){var t=this.getHrefAttribute().getDefinition();if(t!=null)return t.children[0].getText()}};O.Element.tref.prototype=new O.Element.TextElementBase;O.Element.a=function(t){this.base=O.Element.TextElementBase;this.base(t);this.hasText=t.childNodes.length>0;for(var e=0;e0){var n=new O.Element.g;n.children=this.children;n.parent=this;n.render(t)}};this.onclick=function(){window.open(this.getHrefAttribute().value)};this.onmousemove=function(){O.ctx.canvas.style.cursor="pointer"}};O.Element.a.prototype=new O.Element.TextElementBase;O.Element.image=function(t){this.base=O.Element.RenderedElementBase;this.base(t);var e=this.getHrefAttribute().value;if(e==""){return}var a=e.match(/\.svg$/);O.Images.push(this);this.loaded=false;if(!a){this.img=document.createElement("img");if(O.opts["useCORS"]==true){this.img.crossOrigin="Anonymous"}var n=this;this.img.onload=function(){n.loaded=true};this.img.onerror=function(){O.log('ERROR: image "'+e+'" not found');n.loaded=true};this.img.src=e}else{this.img=O.ajax(e);this.loaded=true}this.renderChildren=function(t){var e=this.attribute("x").toPixels("x");var n=this.attribute("y").toPixels("y");var i=this.attribute("width").toPixels("x");var r=this.attribute("height").toPixels("y");if(i==0||r==0)return;t.save();if(a){t.drawSvg(this.img,e,n,i,r)}else{t.translate(e,n);O.AspectRatio(t,this.attribute("preserveAspectRatio").value,i,this.img.width,r,this.img.height,0,0);t.drawImage(this.img,0,0)}t.restore()};this.getBoundingBox=function(){var t=this.attribute("x").toPixels("x");var e=this.attribute("y").toPixels("y");var n=this.attribute("width").toPixels("x");var i=this.attribute("height").toPixels("y");return new O.BoundingBox(t,e,t+n,e+i)}};O.Element.image.prototype=new O.Element.RenderedElementBase;O.Element.g=function(t){this.base=O.Element.RenderedElementBase;this.base(t);this.getBoundingBox=function(){var t=new O.BoundingBox;for(var e=0;e0){var m=p[v].indexOf("url");var y=p[v].indexOf(")",m);var _=p[v].substr(m+5,y-m-6);var b=O.parseXml(O.ajax(_));var w=b.getElementsByTagName("font");for(var x=0;xt.length)e=t.length;for(var n=0,i=new Array(e);n0&&!Yo(this).selectAll("image, img, svg").size()){var E=this.cloneNode(true);Yo(E).selectAll("*").each(function(){Yo(this).call(LP);if(Yo(this).attr("opacity")==="0")this.parentNode.removeChild(this)});et.push(Object.assign({},n,{type:"svg",value:E,tag:e}))}else if(this.childNodes.length>0){var A=YP(this),R=IP(A,3),M=R[0],T=R[1],P=R[2];n.scale*=M;n.x+=T;n.y+=P;nt(this,n)}else{var O=this.cloneNode(true);Yo(O).selectAll("*").each(function(){if(Yo(this).attr("opacity")==="0")this.parentNode.removeChild(this)});if(e==="line"){Yo(O).attr("x1",parseFloat(Yo(O).attr("x1"))+n.x);Yo(O).attr("x2",parseFloat(Yo(O).attr("x2"))+n.x);Yo(O).attr("y1",parseFloat(Yo(O).attr("y1"))+n.y);Yo(O).attr("y2",parseFloat(Yo(O).attr("y2"))+n.y)}else if(e==="path"){var B=YP(O),D=IP(B,3),N=D[0],z=D[1],j=D[2];if(Yo(O).attr("transform"))Yo(O).attr("transform","scale(".concat(N,")translate(").concat(z+n.x,",").concat(j+n.y,")"))}Yo(O).call(LP);var L=Yo(O).attr("fill");var F=L&&L.indexOf("url")===0;et.push(Object.assign({},n,{type:"svg",value:O,tag:e}));if(F){var I=Yo(L.slice(4,-1)).node().cloneNode(true);var H=(I.tagName||"").toLowerCase();if(H==="pattern"){var G=YP(O),V=IP(G,3),U=V[0],W=V[1],q=V[2];n.scale*=U;n.x+=W;n.y+=q;nt(I,n)}}}}function nt(t,e){Jo(t.childNodes).each(function(){i.bind(this)(e)})}for(var r=0;r").concat(r,"");h.save();h.translate(K.padding,K.padding);jP(f,u,Object.assign({},KP,{offsetX:e.x,offsetY:e.y}));h.restore();break;case"svg":var l=c?(new XMLSerializer).serializeToString(e.value):e.value.outerHTML;h.save();h.translate(K.padding+n.x+e.x,K.padding+n.y+e.y);h.rect(0,0,n.width,n.height);h.clip();jP(f,l,Object.assign({},KP,{offsetX:e.x+n.x,offsetY:e.y+n.y}));h.restore();break;default:console.warn("uncaught",e);break}}K.callback(f)}}(function(t){var h=t.Uint8Array,e=t.HTMLCanvasElement,n=e&&e.prototype,u=/\s*;\s*base64\s*(?:;|$)/i,l="toDataURL",d,c=function t(e){var n=e.length,i=new h(n/4*3|0),r=0,a=0,o=[0,0],s=0,u=0,l,c,f;while(n--){c=e.charCodeAt(r++);l=d[c-43];if(l!==255&&l!==f){o[1]=o[0];o[0]=c;u=u<<6|l;s++;if(s===4){i[a++]=u>>>16;if(o[1]!==61){i[a++]=u>>>8}if(o[0]!==61){i[a++]=u}s=0}}}return i};if(h){d=new h([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51])}if(e&&(!n.toBlob||!n.toBlobHD)){if(!n.toBlob)n.toBlob=function(t,e){if(!e){e="image/png"}if(this.mozGetAsFile){t(this.mozGetAsFile("canvas",e));return}if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(e)){t(this.msToBlob());return}var n=Array.prototype.slice.call(arguments,1),i=this[l].apply(this,n),r=i.indexOf(","),a=i.substring(r+1),o=u.test(i.substring(0,r)),s;if(Blob.fake){s=new Blob;if(o){s.encoding="base64"}else{s.encoding="URI"}s.data=a;s.size=a.length}else if(h){if(o){s=new Blob([c(a)],{type:e})}else{s=new Blob([decodeURIComponent(a)],{type:e})}}t(s)};if(!n.toBlobHD&&n.toDataURLHD){n.toBlobHD=function(){l="toDataURLHD";var t=this.toBlob();l="toDataURL";return t}}else{n.toBlobHD=n.toBlob}}})(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||MM.content||MM);var ZP=TM(function(t){var e=e||function(c){if(typeof c==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=c.document,f=function t(){return c.URL||c.webkitURL||c},h=t.createElementNS("http://www.w3.org/1999/xhtml","a"),d="download"in h,g=function t(e){var n=new MouseEvent("click");e.dispatchEvent(n)},p=/constructor/i.test(c.HTMLElement)||c.safari,v=/CriOS\/[\d]+/.test(navigator.userAgent),o=function t(e){(c.setImmediate||c.setTimeout)(function(){throw e},0)},m="application/octet-stream",i=1e3*40,y=function t(e){var n=function t(){if(typeof e==="string"){f().revokeObjectURL(e)}else{e.remove()}};setTimeout(n,i)},_=function t(e,n,i){n=[].concat(n);var r=n.length;while(r--){var a=e["on"+n[r]];if(typeof a==="function"){try{a.call(e,i||e)}catch(t){o(t)}}}},b=function t(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},r=function t(i,e,n){if(!n){i=b(i)}var r=this,a=i.type,o=a===m,s,u=function t(){_(r,"writestart progress write writeend".split(" "))},l=function t(){if((v||o&&p)&&c.FileReader){var n=new FileReader;n.onloadend=function(){var t=v?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");var e=c.open(t,"_blank");if(!e)c.location.href=t;t=undefined;r.readyState=r.DONE;u()};n.readAsDataURL(i);r.readyState=r.INIT;return}if(!s){s=f().createObjectURL(i)}if(o){c.location.href=s}else{var e=c.open(s,"_blank");if(!e){c.location.href=s}}r.readyState=r.DONE;u();y(s)};r.readyState=r.INIT;if(d){s=f().createObjectURL(i);setTimeout(function(){h.href=s;h.download=e;g(h);u();y(s);r.readyState=r.DONE});return}l()},e=r.prototype,n=function t(e,n,i){return new r(e,n||e.name||"download",i)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(t,e,n){e=e||t.name||"download";if(!n){t=b(t)}return navigator.msSaveOrOpenBlob(t,e)}}e.abort=function(){};e.readyState=e.INIT=0;e.WRITING=1;e.DONE=2;e.error=e.onwritestart=e.onprogress=e.onwrite=e.onabort=e.onerror=e.onwriteend=null;return n}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||MM.content);if(t.exports){t.exports.saveAs=e}});var $P={filename:"download",type:"png"};function JP(t){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var i=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};if(!t)return;n=Object.assign({},$P,n);var e=new RegExp(/(MSIE|Trident\/|Edge\/)/i).test(navigator.userAgent);if(!(t instanceof Array)&&n.type==="svg"){var r=e?(new XMLSerializer).serializeToString(t):t.outerHTML;ZP.saveAs(new Blob([r],{type:"application/svg+xml"}),"".concat(n.filename,".svg"))}XP(t,Object.assign({},i,{callback:function t(e){if(i.callback)i.callback(e);if(["jpg","png"].includes(n.type)){e.toBlob(function(t){return ZP.saveAs(t,"".concat(n.filename,".").concat(n.type))})}}}))}function QP(){Oo.preventDefault();Oo.stopImmediatePropagation()}function tO(t){var e=t.document.documentElement,n=Yo(t).on("dragstart.drag",QP,true);if("onselectstart"in e){n.on("selectstart.drag",QP,true)}else{e.__noselect=e.style.MozUserSelect;e.style.MozUserSelect="none"}}function eO(t,e){var n=t.document.documentElement,i=Yo(t).on("dragstart.drag",null);if(e){i.on("click.drag",QP,true);setTimeout(function(){i.on("click.drag",null)},0)}if("onselectstart"in n){i.on("selectstart.drag",null)}else{n.style.MozUserSelect=n.__noselect;delete n.__noselect}}function nO(t){return function(){return t}}function iO(t,e,n){this.target=t;this.type=e;this.transform=n}function rO(t,e,n){this.k=t;this.x=e;this.y=n}rO.prototype={constructor:rO,scale:function t(e){return e===1?this:new rO(this.k*e,this.x,this.y)},translate:function t(e,n){return e===0&n===0?this:new rO(this.k,this.x+this.k*e,this.y+this.k*n)},apply:function t(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function t(e){return e*this.k+this.x},applyY:function t(e){return e*this.k+this.y},invert:function t(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function t(e){return(e-this.x)/this.k},invertY:function t(e){return(e-this.y)/this.k},rescaleX:function t(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function t(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function t(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var aO=new rO(1,0,0);oO.prototype=rO.prototype;function oO(t){while(!t.__zoom){if(!(t=t.parentNode))return aO}return t.__zoom}function sO(){Oo.stopImmediatePropagation()}function uO(){Oo.preventDefault();Oo.stopImmediatePropagation()}function lO(){return!Oo.ctrlKey&&!Oo.button}function cO(){var t=this;if(t instanceof SVGElement){t=t.ownerSVGElement||t;if(t.hasAttribute("viewBox")){t=t.viewBox.baseVal;return[[t.x,t.y],[t.x+t.width,t.y+t.height]]}return[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}return[[0,0],[t.clientWidth,t.clientHeight]]}function fO(){return this.__zoom||aO}function hO(){return-Oo.deltaY*(Oo.deltaMode===1?.05:Oo.deltaMode?1:.002)}function dO(){return navigator.maxTouchPoints||"ontouchstart"in this}function gO(t,e,n){var i=t.invertX(e[0][0])-n[0][0],r=t.invertX(e[1][0])-n[1][0],a=t.invertY(e[0][1])-n[0][1],o=t.invertY(e[1][1])-n[1][1];return t.translate(r>i?(i+r)/2:Math.min(0,i)||Math.max(0,r),o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o))}function pO(){var s=lO,f=cO,d=gO,a=hO,e=dO,o=[0,Infinity],g=[[-Infinity,-Infinity],[Infinity,Infinity]],u=250,h=bi,n=es("start","zoom","end"),p,l,c=500,v=150,m=0;function y(t){t.property("__zoom",fO).on("wheel.zoom",r).on("mousedown.zoom",S).on("dblclick.zoom",C).filter(e).on("touchstart.zoom",E).on("touchmove.zoom",A).on("touchend.zoom touchcancel.zoom",R).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}y.transform=function(t,e,n){var i=t.selection?t.selection():t;i.property("__zoom",fO);if(t!==i){x(t,e,n)}else{i.interrupt().each(function(){k(this,arguments).start().zoom(null,typeof e==="function"?e.apply(this,arguments):e).end()})}};y.scaleBy=function(t,n,e){y.scaleTo(t,function(){var t=this.__zoom.k,e=typeof n==="function"?n.apply(this,arguments):n;return t*e},e)};y.scaleTo=function(t,a,o){y.transform(t,function(){var t=f.apply(this,arguments),e=this.__zoom,n=o==null?w(t):typeof o==="function"?o.apply(this,arguments):o,i=e.invert(n),r=typeof a==="function"?a.apply(this,arguments):a;return d(b(_(e,r),n,i),t,g)},o)};y.translateBy=function(t,e,n){y.transform(t,function(){return d(this.__zoom.translate(typeof e==="function"?e.apply(this,arguments):e,typeof n==="function"?n.apply(this,arguments):n),f.apply(this,arguments),g)})};y.translateTo=function(t,i,r,a){y.transform(t,function(){var t=f.apply(this,arguments),e=this.__zoom,n=a==null?w(t):typeof a==="function"?a.apply(this,arguments):a;return d(aO.translate(n[0],n[1]).scale(e.k).translate(typeof i==="function"?-i.apply(this,arguments):-i,typeof r==="function"?-r.apply(this,arguments):-r),t,g)},a)};function _(t,e){e=Math.max(o[0],Math.min(o[1],e));return e===t.k?t:new rO(e,t.x,t.y)}function b(t,e,n){var i=e[0]-n[0]*t.k,r=e[1]-n[1]*t.k;return i===t.x&&r===t.y?t:new rO(t.k,i,r)}function w(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function x(t,l,c){t.on("start.zoom",function(){k(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){k(this,arguments).end()}).tween("zoom",function(){var t=this,e=arguments,i=k(t,e),n=f.apply(t,e),r=c==null?w(n):typeof c==="function"?c.apply(t,e):c,a=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),o=t.__zoom,s=typeof l==="function"?l.apply(t,e):l,u=h(o.invert(r).concat(a/o.k),s.invert(r).concat(a/s.k));return function(t){if(t===1)t=s;else{var e=u(t),n=a/e[2];t=new rO(n,r[0]-e[0]*n,r[1]-e[1]*n)}i.zoom(null,t)}})}function k(t,e,n){return!n&&t.__zooming||new i(t,e)}function i(t,e){this.that=t;this.args=e;this.active=0;this.extent=f.apply(t,e);this.taps=0}i.prototype={start:function t(){if(++this.active===1){this.that.__zooming=this;this.emit("start")}return this},zoom:function t(e,n){if(this.mouse&&e!=="mouse")this.mouse[1]=n.invert(this.mouse[0]);if(this.touch0&&e!=="touch")this.touch0[1]=n.invert(this.touch0[0]);if(this.touch1&&e!=="touch")this.touch1[1]=n.invert(this.touch1[0]);this.that.__zoom=n;this.emit("zoom");return this},end:function t(){if(--this.active===0){delete this.that.__zooming;this.emit("end")}return this},emit:function t(e){Io(new iO(y,e,this.that.__zoom),n.apply,n,[e,this.that,this.args])}};function r(){if(!s.apply(this,arguments))return;var t=k(this,arguments),e=this.__zoom,n=Math.max(o[0],Math.min(o[1],e.k*Math.pow(2,a.apply(this,arguments)))),i=$o(this);if(t.wheel){if(t.mouse[0][0]!==i[0]||t.mouse[0][1]!==i[1]){t.mouse[1]=e.invert(t.mouse[0]=i)}clearTimeout(t.wheel)}else if(e.k===n)return;else{t.mouse=[i,e.invert(i)];Hs(this);t.start()}uO();t.wheel=setTimeout(r,v);t.zoom("mouse",d(b(_(e,n),t.mouse[0],t.mouse[1]),t.extent,g));function r(){t.wheel=null;t.end()}}function S(){if(l||!s.apply(this,arguments))return;var n=k(this,arguments,true),t=Yo(Oo.view).on("mousemove.zoom",a,true).on("mouseup.zoom",o,true),e=$o(this),i=Oo.clientX,r=Oo.clientY;tO(Oo.view);sO();n.mouse=[e,this.__zoom.invert(e)];Hs(this);n.start();function a(){uO();if(!n.moved){var t=Oo.clientX-i,e=Oo.clientY-r;n.moved=t*t+e*e>m}n.zoom("mouse",d(b(n.that.__zoom,n.mouse[0]=$o(n.that),n.mouse[1]),n.extent,g))}function o(){t.on("mousemove.zoom mouseup.zoom",null);eO(Oo.view,n.moved);uO();n.end()}}function C(){if(!s.apply(this,arguments))return;var t=this.__zoom,e=$o(this),n=t.invert(e),i=t.k*(Oo.shiftKey?.5:2),r=d(b(_(t,i),e,n),f.apply(this,arguments),g);uO();if(u>0)Yo(this).transition().duration(u).call(x,r,e);else Yo(this).call(y.transform,r)}function E(){if(!s.apply(this,arguments))return;var t=Oo.touches,e=t.length,n=k(this,arguments,Oo.changedTouches.length===e),i,r,a,o;sO();for(r=0;r0?1:t<0?-1:0};var LO=Math.sqrt;var FO=Math.tan;function IO(t){return t>1?0:t<-1?xO:Math.acos(t)}function HO(t){return t>1?kO:t<-1?-kO:Math.asin(t)}function GO(t){return(t=zO(t/2))*t}function VO(){}function UO(t,e){if(t&&qO.hasOwnProperty(t.type)){qO[t.type](t,e)}}var WO={Feature:function t(e,n){UO(e.geometry,n)},FeatureCollection:function t(e,n){var i=e.features,r=-1,a=i.length;while(++r=0?1:-1,r=i*n,a=PO(e),o=zO(e),s=nB*o,u=eB*a+s*PO(r),l=s*i*zO(r);ZO.add(TO(l,u));tB=t,eB=a,nB=o}function uB(t){$O.reset();XO(t,iB);return $O*2}function lB(t){return[TO(t[1],t[0]),HO(t[2])]}function cB(t){var e=t[0],n=t[1],i=PO(n);return[i*PO(e),i*zO(e),zO(n)]}function fB(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function hB(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function dB(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function gB(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function pB(t){var e=LO(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var vB,mB,yB,_B,bB,wB,xB,kB,SB=vO(),CB,EB;var AB={point:RB,lineStart:TB,lineEnd:PB,polygonStart:function t(){AB.point=OB;AB.lineStart=BB;AB.lineEnd=DB;SB.reset();iB.polygonStart()},polygonEnd:function t(){iB.polygonEnd();AB.point=RB;AB.lineStart=TB;AB.lineEnd=PB;if(ZO<0)vB=-(yB=180),mB=-(_B=90);else if(SB>bO)_B=90;else if(SB<-bO)mB=-90;EB[0]=vB,EB[1]=yB},sphere:function t(){vB=-(yB=180),mB=-(_B=90)}};function RB(t,e){CB.push(EB=[vB=t,yB=t]);if(e_B)_B=e}function MB(t,e){var n=cB([t*AO,e*AO]);if(kB){var i=hB(kB,n),r=[i[1],-i[0],0],a=hB(r,i);pB(a);a=lB(a);var o=t-bB,s=o>0?1:-1,u=a[0]*EO*s,l,c=RO(o)>180;if(c^(s*bB_B)_B=l}else if(u=(u+360)%360-180,c^(s*bB_B)_B=e}if(c){if(tNB(vB,yB))yB=t}else{if(NB(t,yB)>NB(vB,yB))vB=t}}else{if(yB>=vB){if(tyB)yB=t}else{if(t>bB){if(NB(vB,t)>NB(vB,yB))yB=t}else{if(NB(t,yB)>NB(vB,yB))vB=t}}}}else{CB.push(EB=[vB=t,yB=t])}if(e_B)_B=e;kB=n,bB=t}function TB(){AB.point=MB}function PB(){EB[0]=vB,EB[1]=yB;AB.point=RB;kB=null}function OB(t,e){if(kB){var n=t-bB;SB.add(RO(n)>180?n+(n>0?360:-360):n)}else{wB=t,xB=e}iB.point(t,e);MB(t,e)}function BB(){iB.lineStart()}function DB(){OB(wB,xB);iB.lineEnd();if(RO(SB)>bO)vB=-(yB=180);EB[0]=vB,EB[1]=yB;kB=null}function NB(t,e){return(e-=t)<0?e+360:e}function zB(t,e){return t[0]-e[0]}function jB(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eNB(i[0],i[1]))i[1]=r[1];if(NB(r[0],i[1])>NB(i[0],i[1]))i[0]=r[0]}else{a.push(i=r)}}for(o=-Infinity,n=a.length-1,e=0,i=a[n];e<=n;i=r,++e){r=a[e];if((s=NB(i[1],r[0]))>o)o=s,vB=r[0],yB=i[1]}}CB=EB=null;return vB===Infinity||mB===Infinity?[[NaN,NaN],[NaN,NaN]]:[[vB,mB],[yB,_B]]}var FB,IB,HB,GB,VB,UB,WB,qB,KB,YB,XB,ZB,$B,JB,QB,tD;var eD={sphere:VO,point:nD,lineStart:rD,lineEnd:sD,polygonStart:function t(){eD.lineStart=uD;eD.lineEnd=lD},polygonEnd:function t(){eD.lineStart=rD;eD.lineEnd=sD}};function nD(t,e){t*=AO,e*=AO;var n=PO(e);iD(n*PO(t),n*zO(t),zO(e))}function iD(t,e,n){++FB;HB+=(t-HB)/FB;GB+=(e-GB)/FB;VB+=(n-VB)/FB}function rD(){eD.point=aD}function aD(t,e){t*=AO,e*=AO;var n=PO(e);JB=n*PO(t);QB=n*zO(t);tD=zO(e);eD.point=oD;iD(JB,QB,tD)}function oD(t,e){t*=AO,e*=AO;var n=PO(e),i=n*PO(t),r=n*zO(t),a=zO(e),o=TO(LO((o=QB*a-tD*r)*o+(o=tD*i-JB*a)*o+(o=JB*r-QB*i)*o),JB*i+QB*r+tD*a);IB+=o;UB+=o*(JB+(JB=i));WB+=o*(QB+(QB=r));qB+=o*(tD+(tD=a));iD(JB,QB,tD)}function sD(){eD.point=nD}function uD(){eD.point=cD}function lD(){fD(ZB,$B);eD.point=nD}function cD(t,e){ZB=t,$B=e;t*=AO,e*=AO;eD.point=fD;var n=PO(e);JB=n*PO(t);QB=n*zO(t);tD=zO(e);iD(JB,QB,tD)}function fD(t,e){t*=AO,e*=AO;var n=PO(e),i=n*PO(t),r=n*zO(t),a=zO(e),o=QB*a-tD*r,s=tD*i-JB*a,u=JB*r-QB*i,l=LO(o*o+s*s+u*u),c=HO(l),f=l&&-c/l;KB+=f*o;YB+=f*s;XB+=f*u;IB+=c;UB+=c*(JB+(JB=i));WB+=c*(QB+(QB=r));qB+=c*(tD+(tD=a));iD(JB,QB,tD)}function hD(t){FB=IB=HB=GB=VB=UB=WB=qB=KB=YB=XB=0;XO(t,eD);var e=KB,n=YB,i=XB,r=e*e+n*n+i*i;if(rxO?t+Math.round(-t/CO)*CO:t,e]}pD.invert=pD;function vD(t,e,n){return(t%=CO)?e||n?gD(yD(t),_D(e,n)):yD(t):e||n?_D(e,n):pD}function mD(n){return function(t,e){return t+=n,[t>xO?t-CO:t<-xO?t+CO:t,e]}}function yD(t){var e=mD(t);e.invert=mD(-t);return e}function _D(t,e){var s=PO(t),u=zO(t),l=PO(e),c=zO(e);function n(t,e){var n=PO(e),i=PO(t)*n,r=zO(t)*n,a=zO(e),o=a*s+i*u;return[TO(r*l-o*c,i*s-a*u),HO(o*l+r*c)]}n.invert=function(t,e){var n=PO(e),i=PO(t)*n,r=zO(t)*n,a=zO(e),o=a*l-r*c;return[TO(r*l+a*c,i*s+o*u),HO(o*s-i*u)]};return n}function bD(e){e=vD(e[0]*AO,e[1]*AO,e.length>2?e[2]*AO:0);function t(t){t=e(t[0]*AO,t[1]*AO);return t[0]*=EO,t[1]*=EO,t}t.invert=function(t){t=e.invert(t[0]*AO,t[1]*AO);return t[0]*=EO,t[1]*=EO,t};return t}function wD(t,e,n,i,r,a){if(!n)return;var o=PO(e),s=zO(e),u=i*n;if(r==null){r=e+i*CO;a=e-u/2}else{r=xD(o,r);a=xD(o,a);if(i>0?ra)r+=i*CO}for(var l,c=r;i>0?c>a:c1)e.push(e.pop().concat(e.shift()))},result:function t(){var t=e;e=[];r=null;return t}}}function CD(t,e){return RO(t[0]-e[0])=0;--u){a.point((f=c[u])[0],f[1])}}else{i(h.x,h.p.x,-1,a)}h=h.p}h=h.o;c=h.z;d=!d}while(!h.v);a.lineEnd()}}function RD(t){if(!(e=t.length))return;var e,n=0,i=t[0],r;while(++n=0?1:-1,C=S*k,E=C>xO,A=p*w;MD.add(TO(A*S*zO(C),v*x+A*PO(C)));o+=E?k+S*CO:k;if(E^d>=n^_>=n){var R=hB(cB(h),cB(y));pB(R);var M=hB(a,R);pB(M);var T=(E^k>=0?-1:1)*HO(M[2]);if(i>T||i===T&&(R[0]||R[1])){s+=E^k>=0?1:-1}}}}return(o<-bO||o0){if(!c)s.polygonStart(),c=true;s.lineStart();for(n=0;n1&&t&2)e.push(e.pop().concat(e.shift()));h.push(e.filter(BD))}return i}}function BD(t){return t.length>1}function DD(t,e){return((t=t.x)[0]<0?t[1]-kO-bO:kO-t[1])-((e=e.x)[0]<0?e[1]-kO-bO:kO-e[1])}var ND=OD(function(){return true},zD,LD,[-xO,-kO]);function zD(a){var o=NaN,s=NaN,u=NaN,l;return{lineStart:function t(){a.lineStart();l=1},point:function t(e,n){var i=e>0?xO:-xO,r=RO(e-o);if(RO(r-xO)0?kO:-kO);a.point(u,s);a.lineEnd();a.lineStart();a.point(i,s);a.point(e,s);l=0}else if(u!==i&&r>=xO){if(RO(o-u)bO?MO((zO(e)*(a=PO(i))*zO(n)-zO(i)*(r=PO(e))*zO(t))/(r*a*o)):(e+i)/2}function LD(t,e,n,i){var r;if(t==null){r=n*kO;i.point(-xO,r);i.point(0,r);i.point(xO,r);i.point(xO,0);i.point(xO,-r);i.point(0,-r);i.point(-xO,-r);i.point(-xO,0);i.point(-xO,r)}else if(RO(t[0]-e[0])>bO){var a=t[0]0,p=RO(T)>bO;function t(t,e,n,i){wD(i,r,a,n,t,e)}function v(t,e){return PO(t)*PO(e)>T}function e(u){var l,c,f,h,d;return{lineStart:function t(){h=f=false;d=1},point:function t(e,n){var i=[e,n],r,a=v(e,n),o=g?a?0:y(e,n):a?y(e+(e<0?xO:-xO),n):0;if(!l&&(h=f=a))u.lineStart();if(a!==f){r=m(l,i);if(!r||CD(l,r)||CD(i,r))i[2]=1}if(a!==f){d=0;if(a){u.lineStart();r=m(i,l);u.point(r[0],r[1])}else{r=m(l,i);u.point(r[0],r[1],2);u.lineEnd()}l=r}else if(p&&l&&g^a){var s;if(!(o&c)&&(s=m(i,l,true))){d=0;if(g){u.lineStart();u.point(s[0][0],s[0][1]);u.point(s[1][0],s[1][1]);u.lineEnd()}else{u.point(s[1][0],s[1][1]);u.lineEnd();u.lineStart();u.point(s[0][0],s[0][1],3)}}}if(a&&(!l||!CD(l,i))){u.point(i[0],i[1])}l=i,f=a,c=o},lineEnd:function t(){if(f)u.lineEnd();l=null},clean:function t(){return d|(h&&f)<<1}}}function m(t,e,n){var i=cB(t),r=cB(e);var a=[1,0,0],o=hB(i,r),s=fB(o,o),u=o[0],l=s-u*u;if(!l)return!n&&t;var c=T*s/l,f=-T*u/l,h=hB(a,o),d=gB(a,c),g=gB(o,f);dB(d,g);var p=h,v=fB(d,p),m=fB(p,p),y=v*v-m*(fB(d,d)-1);if(y<0)return;var _=LO(y),b=gB(p,(-v-_)/m);dB(b,d);b=lB(b);if(!n)return b;var w=t[0],x=e[0],k=t[1],S=e[1],C;if(x0^b[1]<(RO(b[0]-w)xO^(w<=b[0]&&b[0]<=x)){var M=gB(p,(-v+_)/m);dB(M,d);return[b,lB(M)]}}function y(t,e){var n=g?r:xO-r,i=0;if(t<-n)i|=1;else if(t>n)i|=2;if(e<-n)i|=4;else if(e>n)i|=8;return i}return OD(v,e,t,g?[0,-r]:[-xO,r-xO])}function ID(t,e,n,i,r,a){var o=t[0],s=t[1],u=e[0],l=e[1],c=0,f=1,h=u-o,d=l-s,g;g=n-o;if(!h&&g>0)return;g/=h;if(h<0){if(g0){if(g>f)return;if(g>c)c=g}g=r-o;if(!h&&g<0)return;g/=h;if(h<0){if(g>f)return;if(g>c)c=g}else if(h>0){if(g0)return;g/=d;if(d<0){if(g0){if(g>f)return;if(g>c)c=g}g=a-s;if(!d&&g<0)return;g/=d;if(d<0){if(g>f)return;if(g>c)c=g}else if(d>0){if(g0)t[0]=o+c*h,t[1]=s+c*d;if(f<1)e[0]=o+f*h,e[1]=s+f*d;return true}var HD=1e9,GD=-HD;function VD(x,k,S,C){function E(t,e){return x<=t&&t<=S&&k<=e&&e<=C}function A(t,e,n,i){var r=0,a=0;if(t==null||(r=o(t,n))!==(a=o(e,n))||s(t,e)<0^n>0){do{i.point(r===0||r===3?x:S,r>1?C:k)}while((r=(r+n+4)%4)!==a)}else{i.point(e[0],e[1])}}function o(t,e){return RO(t[0]-x)0?0:3:RO(t[0]-S)0?2:1:RO(t[1]-k)0?1:0:e>0?3:2}function R(t,e){return s(t.x,e.x)}function s(t,e){var n=o(t,1),i=o(e,1);return n!==i?n-i:n===0?e[1]-t[1]:n===1?t[0]-e[0]:n===2?t[1]-e[1]:e[0]-t[0]}return function(i){var a=i,t=SD(),r,f,o,s,u,l,c,h,d,g,p;var e={point:n,lineStart:_,lineEnd:b,polygonStart:m,polygonEnd:y};function n(t,e){if(E(t,e))a.point(t,e)}function v(){var t=0;for(var e=0,n=f.length;eC&&(l-s)*(C-u)>(c-u)*(x-s))++t}else{if(c<=C&&(l-s)*(C-u)<(c-u)*(x-s))--t}}}return t}function m(){a=t,r=[],f=[],p=true}function y(){var t=v(),e=p&&t,n=(r=he(r)).length;if(e||n){i.polygonStart();if(e){i.lineStart();A(null,null,1,i);i.lineEnd()}if(n){AD(r,R,t,A,i)}i.polygonEnd()}a=i,r=f=o=null}function _(){e.point=w;if(f)f.push(o=[]);g=true;d=false;c=h=NaN}function b(){if(r){w(s,u);if(l&&d)t.rejoin();r.push(t.result())}e.point=n;if(d)a.lineEnd()}function w(t,e){var n=E(t,e);if(f)o.push([t,e]);if(g){s=t,u=e,l=n;g=false;if(n){a.lineStart();a.point(t,e)}}else{if(n&&d)a.point(t,e);else{var i=[c=Math.max(GD,Math.min(HD,c)),h=Math.max(GD,Math.min(HD,h))],r=[t=Math.max(GD,Math.min(HD,t)),e=Math.max(GD,Math.min(HD,e))];if(ID(i,r,x,k,S,C)){if(!d){a.lineStart();a.point(i[0],i[1])}a.point(r[0],r[1]);if(!n)a.lineEnd();p=false}else if(n){a.lineStart();a.point(t,e);p=false}}}c=t,h=e,d=n}return e}}function UD(){var n=0,i=0,r=960,a=500,o,s,u;return u={stream:function t(e){return o&&s===e?o:o=VD(n,i,r,a)(s=e)},extent:function t(e){return arguments.length?(n=+e[0][0],i=+e[0][1],r=+e[1][0],a=+e[1][1],o=s=null,u):[[n,i],[r,a]]}}}var WD=vO(),qD,KD,YD;var XD={sphere:VO,point:VO,lineStart:ZD,lineEnd:VO,polygonStart:VO,polygonEnd:VO};function ZD(){XD.point=JD;XD.lineEnd=$D}function $D(){XD.point=XD.lineEnd=VO}function JD(t,e){t*=AO,e*=AO;qD=t,KD=zO(e),YD=PO(e);XD.point=QD}function QD(t,e){t*=AO,e*=AO;var n=zO(e),i=PO(e),r=RO(t-qD),a=PO(r),o=zO(r),s=i*o,u=YD*n-KD*i*a,l=KD*n+YD*i*a;WD.add(TO(LO(s*s+u*u),l));qD=t,KD=n,YD=i}function tN(t){WD.reset();XO(t,XD);return+WD}var eN=[null,null],nN={type:"LineString",coordinates:eN};function iN(t,e){eN[0]=t;eN[1]=e;return tN(nN)}var rN={Feature:function t(e,n){return oN(e.geometry,n)},FeatureCollection:function t(e,n){var i=e.features,r=-1,a=i.length;while(++r0){r=iN(t[a],t[a-1]);if(r>0&&n<=r&&i<=r&&(n+i-r)*(1-Math.pow((n-i)/r,2))bO}).map(d)).concat(le(OO(o/c)*c,a,c).filter(function(t){return RO(t%h)>bO}).map(g))}y.lines=function(){return t().map(function(t){return{type:"LineString",coordinates:t}})};y.outline=function(){return{type:"Polygon",coordinates:[p(r).concat(v(s).slice(1),p(i).reverse().slice(1),v(u).reverse().slice(1))]}};y.extent=function(t){if(!arguments.length)return y.extentMinor();return y.extentMajor(t).extentMinor(t)};y.extentMajor=function(t){if(!arguments.length)return[[r,u],[i,s]];r=+t[0][0],i=+t[1][0];u=+t[0][1],s=+t[1][1];if(r>i)t=r,r=i,i=t;if(u>s)t=u,u=s,s=t;return y.precision(m)};y.extentMinor=function(t){if(!arguments.length)return[[n,o],[e,a]];n=+t[0][0],e=+t[1][0];o=+t[0][1],a=+t[1][1];if(n>e)t=n,n=e,e=t;if(o>a)t=o,o=a,a=t;return y.precision(m)};y.step=function(t){if(!arguments.length)return y.stepMinor();return y.stepMajor(t).stepMinor(t)};y.stepMajor=function(t){if(!arguments.length)return[f,h];f=+t[0],h=+t[1];return y};y.stepMinor=function(t){if(!arguments.length)return[l,c];l=+t[0],c=+t[1];return y};y.precision=function(t){if(!arguments.length)return m;m=+t;d=dN(o,a,90);g=gN(n,e,m);p=dN(u,s,90);v=gN(r,i,m);return y};return y.extentMajor([[-180,-90+bO],[180,90-bO]]).extentMinor([[-180,-80-bO],[180,80+bO]])}function vN(){return pN()()}function mN(t,e){var n=t[0]*AO,i=t[1]*AO,r=e[0]*AO,a=e[1]*AO,o=PO(i),s=zO(i),u=PO(a),l=zO(a),c=o*PO(n),f=o*zO(n),h=u*PO(r),d=u*zO(r),g=2*HO(LO(GO(a-i)+o*u*GO(r-n))),p=zO(g);var v=g?function(t){var e=zO(t*=g)/p,n=zO(g-t)/p,i=n*c+e*h,r=n*f+e*d,a=n*s+e*l;return[TO(r,i)*EO,TO(a,LO(i*i+r*r))*EO]}:function(){return[n*EO,i*EO]};v.distance=g;return v}function yN(t){return t}var _N=vO(),bN=vO(),wN,xN,kN,SN;var CN={point:VO,lineStart:VO,lineEnd:VO,polygonStart:function t(){CN.lineStart=EN;CN.lineEnd=MN},polygonEnd:function t(){CN.lineStart=CN.lineEnd=CN.point=VO;_N.add(RO(bN));bN.reset()},result:function t(){var e=_N/2;_N.reset();return e}};function EN(){CN.point=AN}function AN(t,e){CN.point=RN;wN=kN=t,xN=SN=e}function RN(t,e){bN.add(SN*t-kN*e);kN=t,SN=e}function MN(){RN(wN,xN)}var TN=Infinity,PN=TN,ON=-TN,BN=ON;var DN={point:NN,lineStart:VO,lineEnd:VO,polygonStart:VO,polygonEnd:VO,result:function t(){var e=[[TN,PN],[ON,BN]];ON=BN=-(PN=TN=Infinity);return e}};function NN(t,e){if(tON)ON=t;if(eBN)BN=e}var zN=0,jN=0,LN=0,FN=0,IN=0,HN=0,GN=0,VN=0,UN=0,WN,qN,KN,YN;var XN={point:ZN,lineStart:$N,lineEnd:tz,polygonStart:function t(){XN.lineStart=ez;XN.lineEnd=nz},polygonEnd:function t(){XN.point=ZN;XN.lineStart=$N;XN.lineEnd=tz},result:function t(){var e=UN?[GN/UN,VN/UN]:HN?[FN/HN,IN/HN]:LN?[zN/LN,jN/LN]:[NaN,NaN];zN=jN=LN=FN=IN=HN=GN=VN=UN=0;return e}};function ZN(t,e){zN+=t;jN+=e;++LN}function $N(){XN.point=JN}function JN(t,e){XN.point=QN;ZN(KN=t,YN=e)}function QN(t,e){var n=t-KN,i=e-YN,r=LO(n*n+i*i);FN+=r*(KN+t)/2;IN+=r*(YN+e)/2;HN+=r;ZN(KN=t,YN=e)}function tz(){XN.point=ZN}function ez(){XN.point=iz}function nz(){rz(WN,qN)}function iz(t,e){XN.point=rz;ZN(WN=KN=t,qN=YN=e)}function rz(t,e){var n=t-KN,i=e-YN,r=LO(n*n+i*i);FN+=r*(KN+t)/2;IN+=r*(YN+e)/2;HN+=r;r=YN*t-KN*e;GN+=r*(KN+t);VN+=r*(YN+e);UN+=r*3;ZN(KN=t,YN=e)}function az(t){this._context=t}az.prototype={_radius:4.5,pointRadius:function t(e){return this._radius=e,this},polygonStart:function t(){this._line=0},polygonEnd:function t(){this._line=NaN},lineStart:function t(){this._point=0},lineEnd:function t(){if(this._line===0)this._context.closePath();this._point=NaN},point:function t(e,n){switch(this._point){case 0:{this._context.moveTo(e,n);this._point=1;break}case 1:{this._context.lineTo(e,n);break}default:{this._context.moveTo(e+this._radius,n);this._context.arc(e,n,this._radius,0,CO);break}}},result:VO};var oz=vO(),sz,uz,lz,cz,fz;var hz={point:VO,lineStart:function t(){hz.point=dz},lineEnd:function t(){if(sz)gz(uz,lz);hz.point=VO},polygonStart:function t(){sz=true},polygonEnd:function t(){sz=null},result:function t(){var e=+oz;oz.reset();return e}};function dz(t,e){hz.point=gz;uz=cz=t,lz=fz=e}function gz(t,e){cz-=t,fz-=e;oz.add(LO(cz*cz+fz*fz));cz=t,fz=e}function pz(){this._string=[]}pz.prototype={_radius:4.5,_circle:vz(4.5),pointRadius:function t(e){if((e=+e)!==this._radius)this._radius=e,this._circle=null;return this},polygonStart:function t(){this._line=0},polygonEnd:function t(){this._line=NaN},lineStart:function t(){this._point=0},lineEnd:function t(){if(this._line===0)this._string.push("Z");this._point=NaN},point:function t(e,n){switch(this._point){case 0:{this._string.push("M",e,",",n);this._point=1;break}case 1:{this._string.push("L",e,",",n);break}default:{if(this._circle==null)this._circle=vz(this._radius);this._string.push("M",e,",",n,this._circle);break}}},result:function t(){if(this._string.length){var t=this._string.join("");this._string=[];return t}else{return null}}};function vz(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function mz(e,n){var i=4.5,r,a;function o(t){if(t){if(typeof i==="function")a.pointRadius(+i.apply(this,arguments));XO(t,r(a))}return a.result()}o.area=function(t){XO(t,r(CN));return CN.result()};o.measure=function(t){XO(t,r(hz));return hz.result()};o.bounds=function(t){XO(t,r(DN));return DN.result()};o.centroid=function(t){XO(t,r(XN));return XN.result()};o.projection=function(t){return arguments.length?(r=t==null?(e=null,yN):(e=t).stream,o):e};o.context=function(t){if(!arguments.length)return n;a=t==null?(n=null,new pz):new az(n=t);if(typeof i!=="function")a.pointRadius(i);return o};o.pointRadius=function(t){if(!arguments.length)return i;i=typeof t==="function"?t:(a.pointRadius(+t),+t);return o};return o.projection(e).context(n)}function yz(t){return{stream:_z(t)}}function _z(i){return function(t){var e=new bz;for(var n in i){e[n]=i[n]}e.stream=t;return e}}function bz(){}bz.prototype={constructor:bz,point:function t(e,n){this.stream.point(e,n)},sphere:function t(){this.stream.sphere()},lineStart:function t(){this.stream.lineStart()},lineEnd:function t(){this.stream.lineEnd()},polygonStart:function t(){this.stream.polygonStart()},polygonEnd:function t(){this.stream.polygonEnd()}};function wz(t,e,n){var i=t.clipExtent&&t.clipExtent();t.scale(150).translate([0,0]);if(i!=null)t.clipExtent(null);XO(n,t.stream(DN));e(DN.result());if(i!=null)t.clipExtent(i);return t}function xz(o,s,t){return wz(o,function(t){var e=s[1][0]-s[0][0],n=s[1][1]-s[0][1],i=Math.min(e/(t[1][0]-t[0][0]),n/(t[1][1]-t[0][1])),r=+s[0][0]+(e-i*(t[1][0]+t[0][0]))/2,a=+s[0][1]+(n-i*(t[1][1]+t[0][1]))/2;o.scale(150*i).translate([r,a])},t)}function kz(t,e,n){return xz(t,[[0,0],e],n)}function Sz(a,o,t){return wz(a,function(t){var e=+o,n=e/(t[1][0]-t[0][0]),i=(e-n*(t[1][0]+t[0][0]))/2,r=-n*t[0][1];a.scale(150*n).translate([i,r])},t)}function Cz(a,o,t){return wz(a,function(t){var e=+o,n=e/(t[1][1]-t[0][1]),i=-n*t[0][0],r=(e-n*(t[1][1]+t[0][1]))/2;a.scale(150*n).translate([i,r])},t)}var Ez=16,Az=PO(30*AO);function Rz(t,e){return+e?Tz(t,e):Mz(t)}function Mz(i){return _z({point:function t(e,n){e=i(e,n);this.stream.point(e[0],e[1])}})}function Tz(M,T){function P(t,e,n,i,r,a,o,s,u,l,c,f,h,d){var g=o-t,p=s-e,v=g*g+p*p;if(v>4*T&&h--){var m=i+l,y=r+c,_=a+f,b=LO(m*m+y*y+_*_),w=HO(_/=b),x=RO(RO(_)-1)T||RO((g*E+p*A)/v-.5)>.3||i*l+r*c+a*f2?t[2]%360*AO:0,M()):[u*EO,l*EO,c*EO]};A.angle=function(t){return arguments.length?(h=t%360*AO,M()):h*EO};A.reflectX=function(t){return arguments.length?(d=t?-1:1,M()):d<0};A.reflectY=function(t){return arguments.length?(g=t?-1:1,M()):g<0};A.precision=function(t){return arguments.length?(x=Rz(k,w=t*t),T()):LO(w)};A.fitExtent=function(t,e){return xz(A,t,e)};A.fitSize=function(t,e){return kz(A,t,e)};A.fitWidth=function(t,e){return Sz(A,t,e)};A.fitHeight=function(t,e){return Cz(A,t,e)};function M(){var t=Dz(i,0,0,d,g,h).apply(null,n(o,s)),e=(h?Dz:Bz)(i,r-t[0],a-t[1],d,g,h);f=vD(u,l,c);k=gD(n,e);S=gD(f,k);x=Rz(k,w);return T()}function T(){C=E=null;return A}return function(){n=t.apply(this,arguments);A.invert=n.invert&&R;return M()}}function jz(t){var e=0,n=xO/3,i=zz(t),r=i(e,n);r.parallels=function(t){return arguments.length?i(e=t[0]*AO,n=t[1]*AO):[e*EO,n*EO]};return r}function Lz(t){var n=PO(t);function e(t,e){return[t*n,zO(e)/n]}e.invert=function(t,e){return[t/n,HO(e*n)]};return e}function Fz(t,e){var n=zO(t),r=(n+zO(e))/2;if(RO(r)=.12&&r<.234&&i>=-.425&&i<-.214?o:r>=.166&&r<.234&&i>=-.214&&i<-.115?u:a).invert(t)};f.stream=function(t){return e&&n===t?e:e=Gz([a.stream(n=t),o.stream(t),u.stream(t)])};f.precision=function(t){if(!arguments.length)return a.precision();a.precision(t),o.precision(t),u.precision(t);return h()};f.scale=function(t){if(!arguments.length)return a.scale();a.scale(t),o.scale(t*.35),u.scale(t);return f.translate(a.translate())};f.translate=function(t){if(!arguments.length)return a.translate();var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.455*e,i-.238*e],[n+.455*e,i+.238*e]]).stream(c);s=o.translate([n-.307*e,i+.201*e]).clipExtent([[n-.425*e+bO,i+.12*e+bO],[n-.214*e-bO,i+.234*e-bO]]).stream(c);l=u.translate([n-.205*e,i+.212*e]).clipExtent([[n-.214*e+bO,i+.166*e+bO],[n-.115*e-bO,i+.234*e-bO]]).stream(c);return h()};f.fitExtent=function(t,e){return xz(f,t,e)};f.fitSize=function(t,e){return kz(f,t,e)};f.fitWidth=function(t,e){return Sz(f,t,e)};f.fitHeight=function(t,e){return Cz(f,t,e)};function h(){e=n=null;return f}return f.scale(1070)}function Uz(a){return function(t,e){var n=PO(t),i=PO(e),r=a(n*i);return[r*i*zO(t),r*zO(e)]}}function Wz(o){return function(t,e){var n=LO(t*t+e*e),i=o(n),r=zO(i),a=PO(i);return[TO(t*r,n*a),HO(n&&e*r/n)]}}var qz=Uz(function(t){return LO(2/(1+t))});qz.invert=Wz(function(t){return 2*HO(t/2)});function Kz(){return Nz(qz).scale(124.75).clipAngle(180-.001)}var Yz=Uz(function(t){return(t=IO(t))&&t/zO(t)});Yz.invert=Wz(function(t){return t});function Xz(){return Nz(Yz).scale(79.4188).clipAngle(180-.001)}function Zz(t,e){return[t,DO(FO((kO+e)/2))]}Zz.invert=function(t,e){return[t,2*MO(BO(e))-kO]};function $z(){return Jz(Zz).scale(961/CO)}function Jz(n){var i=Nz(n),e=i.center,r=i.scale,a=i.translate,o=i.clipExtent,s=null,u,l,c;i.scale=function(t){return arguments.length?(r(t),f()):r()};i.translate=function(t){return arguments.length?(a(t),f()):a()};i.center=function(t){return arguments.length?(e(t),f()):e()};i.clipExtent=function(t){return arguments.length?(t==null?s=u=l=c=null:(s=+t[0][0],u=+t[0][1],l=+t[1][0],c=+t[1][1]),f()):s==null?null:[[s,u],[l,c]]};function f(){var t=xO*r(),e=i(bD(i.rotate()).invert([0,0]));return o(s==null?[[e[0]-t,e[1]-t],[e[0]+t,e[1]+t]]:n===Zz?[[Math.max(e[0]-t,s),u],[Math.min(e[0]+t,l),c]]:[[s,Math.max(e[1]-t,u)],[l,Math.min(e[1]+t,c)]])}return f()}function Qz(t){return FO((kO+t)/2)}function tj(t,e){var n=PO(t),a=t===e?zO(t):DO(n/PO(e))/DO(Qz(e)/Qz(t)),o=n*NO(Qz(t),a)/a;if(!a)return Zz;function i(t,e){if(o>0){if(e<-kO+bO)e=-kO+bO}else{if(e>kO-bO)e=kO-bO}var n=o/NO(Qz(e),a);return[n*zO(a*t),o-n*PO(a*t)]}i.invert=function(t,e){var n=o-e,i=jO(a)*LO(t*t+n*n),r=TO(t,RO(n))*jO(n);if(n*a<0)r-=xO*jO(t)*jO(n);return[r/a,2*MO(NO(o/i,1/a))-kO]};return i}function ej(){return jz(tj).scale(109.5).parallels([30,30])}function nj(t,e){return[t,e]}nj.invert=nj;function ij(){return Nz(nj).scale(152.63)}function rj(t,e){var n=PO(t),r=t===e?zO(t):(n-PO(e))/(e-t),a=n/r+t;if(RO(r)bO&&--i>0);return[t/(.8707+(a=n*n)*(-.131979+a*(-.013791+a*a*a*(.003971-.001529*a)))),n]};function yj(){return Nz(mj).scale(175.295)}function _j(t,e){return[PO(e)*zO(t),zO(e)]}_j.invert=Wz(HO);function bj(){return Nz(_j).scale(249.5).clipAngle(90+bO)}function wj(t,e){var n=PO(e),i=1+PO(t)*n;return[n*zO(t)/i,zO(e)/i]}wj.invert=Wz(function(t){return 2*MO(t)});function xj(){return Nz(wj).scale(250).clipAngle(142)}function kj(t,e){return[DO(FO((kO+e)/2)),-t]}kj.invert=function(t,e){return[-e,2*MO(BO(t))-kO]};function Sj(){var t=Jz(kj),e=t.center,n=t.rotate;t.center=function(t){return arguments.length?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])};t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):(t=n(),[t[0],t[1],t[2]-90])};return n([0,0,90]).scale(159.155)}var Cj=Object.freeze({__proto__:null,geoArea:uB,geoBounds:LB,geoCentroid:hD,geoCircle:kD,geoClipAntimeridian:ND,geoClipCircle:FD,geoClipExtent:UD,geoClipRectangle:VD,geoContains:hN,geoDistance:iN,geoGraticule:pN,geoGraticule10:vN,geoInterpolate:mN,geoLength:tN,geoPath:mz,geoAlbers:Hz,geoAlbersUsa:Vz,geoAzimuthalEqualArea:Kz,geoAzimuthalEqualAreaRaw:qz,geoAzimuthalEquidistant:Xz,geoAzimuthalEquidistantRaw:Yz,geoConicConformal:ej,geoConicConformalRaw:tj,geoConicEqualArea:Iz,geoConicEqualAreaRaw:Fz,geoConicEquidistant:aj,geoConicEquidistantRaw:rj,geoEqualEarth:dj,geoEqualEarthRaw:hj,geoEquirectangular:ij,geoEquirectangularRaw:nj,geoGnomonic:pj,geoGnomonicRaw:gj,geoIdentity:vj,geoProjection:Nz,geoProjectionMutator:zz,geoMercator:$z,geoMercatorRaw:Zz,geoNaturalEarth1:yj,geoNaturalEarth1Raw:mj,geoOrthographic:bj,geoOrthographicRaw:_j,geoStereographic:xj,geoStereographicRaw:wj,geoTransverseMercator:Sj,geoTransverseMercatorRaw:kj,geoRotation:bD,geoStream:XO,geoTransform:yz});var Ej=Math.abs;var Aj=Math.atan;var Rj=Math.atan2;var Mj=Math.cos;var Tj=Math.exp;var Pj=Math.floor;var Oj=Math.log;var Bj=Math.max;var Dj=Math.min;var Nj=Math.pow;var zj=Math.round;var jj=Math.sign||function(t){return t>0?1:t<0?-1:0};var Lj=Math.sin;var Fj=Math.tan;var Ij=1e-6;var Hj=1e-12;var Gj=Math.PI;var Vj=Gj/2;var Uj=Gj/4;var Wj=Math.SQRT1_2;var qj=tL(2);var Kj=tL(Gj);var Yj=Gj*2;var Xj=180/Gj;var Zj=Gj/180;function $j(t){return t?t/Math.sin(t):1}function Jj(t){return t>1?Vj:t<-1?-Vj:Math.asin(t)}function Qj(t){return t>1?0:t<-1?Gj:Math.acos(t)}function tL(t){return t>0?Math.sqrt(t):0}function eL(t){t=Tj(2*t);return(t-1)/(t+1)}function nL(t){return(Tj(t)-Tj(-t))/2}function iL(t){return(Tj(t)+Tj(-t))/2}function rL(t){return Oj(t+tL(t*t+1))}function aL(t){return Oj(t+tL(t*t-1))}function oL(h){var t=Fj(h/2),d=2*Oj(Mj(h/2))/(t*t);function e(t,e){var n=Mj(t),i=Mj(e),r=Lj(e),a=i*n,o=-((1-a?Oj((1+a)/2)/(1-a):-.5)+d/(1+a));return[o*i*Lj(t),o*r]}e.invert=function(t,e){var n=tL(t*t+e*e),i=-h/2,r=50,a;if(!n)return[0,0];do{var o=i/2,s=Mj(o),u=Lj(o),l=u/s,c=-Oj(Ej(s));i-=a=(2/l*c-d*l-n)/(-c/(u*u)+1-d/(2*s*s))*(s<0?.7:1)}while(Ej(a)>Ij&&--r>0);var f=Lj(i);return[Rj(t*f,n*Mj(i)),Jj(e*f/n)]};return e}function sL(){var e=Vj,n=zz(oL),t=n(e);t.radius=function(t){return arguments.length?n(e=t*Zj):e*Xj};return t.scale(179.976).clipAngle(147)}function uL(t,e){var n=Mj(e),i=$j(Qj(n*Mj(t/=2)));return[2*n*Lj(t)*i,Lj(e)*i]}uL.invert=function(t,e){if(t*t+4*e*e>Gj*Gj+Ij)return;var n=t,i=e,r=25;do{var a=Lj(n),o=Lj(n/2),s=Mj(n/2),u=Lj(i),l=Mj(i),c=Lj(2*i),f=u*u,h=l*l,d=o*o,g=1-h*s*s,p=g?Qj(l*s)*tL(v=1/g):v=0,v,m=2*p*l*o-t,y=p*u-e,_=v*(h*d+p*l*s*f),b=v*(.5*a*c-p*2*u*o),w=v*.25*(c*o-p*u*h*a),x=v*(f*s+p*d*l),k=b*w-x*_;if(!k)break;var S=(y*b-m*x)/k,C=(m*w-y*_)/k;n-=S,i-=C}while((Ej(S)>Ij||Ej(C)>Ij)&&--r>0);return[n,i]};function lL(){return Nz(uL).scale(152.63)}function cL(t){var _=Lj(t),b=Mj(t),w=t>=0?1:-1,x=Fj(w*t),k=(1+_-b)/2;function e(t,e){var n=Mj(e),i=Mj(t/=2);return[(1+n)*Lj(t),(w*e>-Rj(i,x)-.001?0:-w*10)+k+Lj(e)*b-(1+n)*_*i]}e.invert=function(t,e){var n=0,i=0,r=50;do{var a=Mj(n),o=Lj(n),s=Mj(i),u=Lj(i),l=1+s,c=l*o-t,f=k+u*b-l*_*a-e,h=l*a/2,d=-o*u,g=_*l*o/2,p=b*s+_*a*u,v=d*g-p*h,m=(f*d-c*p)/v/2,y=(c*g-f*h)/v;if(Ej(y)>2)y/=2;n-=m,i-=y}while((Ej(m)>Ij||Ej(y)>Ij)&&--r>0);return w*i>-Rj(Mj(n),x)-.001?[n*2,i]:null};return e}function fL(){var a=20*Zj,o=a>=0?1:-1,s=Fj(o*a),e=zz(cL),u=e(a),l=u.stream;u.parallel=function(t){if(!arguments.length)return a*Xj;s=Fj((o=(a=t*Zj)>=0?1:-1)*a);return e(a)};u.stream=function(t){var e=u.rotate(),n=l(t),i=(u.rotate([0,0]),l(t)),r=u.precision();u.rotate(e);n.sphere=function(){i.polygonStart(),i.lineStart();for(var t=o*-180;o*t<180;t+=o*90){i.point(t,o*90)}if(a)while(o*(t-=3*o*r)>=-180){i.point(t,o*-Rj(Mj(t*Zj/2),s)*Xj)}i.lineEnd(),i.polygonEnd()};return n};return u.scale(218.695).center([0,28.0974])}function hL(t,e){var n=Fj(e/2),i=tL(1-n*n),r=1+i*Mj(t/=2),a=Lj(t)*i/r,o=n/r,s=a*a,u=o*o;return[4/3*a*(3+s-3*u),4/3*o*(3+3*s-u)]}hL.invert=function(t,e){t*=3/8,e*=3/8;if(!t&&Ej(e)>1)return null;var n=t*t,i=e*e,r=1+n+i,a=tL((r-tL(r*r-4*e*e))/2),o=Jj(a)/3,s=a?aL(Ej(e/a))/3:rL(Ej(t))/3,u=Mj(o),l=iL(s),c=l*l-u*u;return[jj(t)*2*Rj(nL(s)*u,.25-c),jj(e)*2*Rj(l*Lj(o),.25+c)]};function dL(){return Nz(hL).scale(66.1603)}var gL=tL(8),pL=Oj(1+qj);function vL(t,e){var n=Ej(e);return nHj&&--i>0);return[t/(Mj(n)*(gL-1/Lj(n))),jj(e)*n]};function mL(){return Nz(vL).scale(112.314)}function yL(t){var u=2*Gj/t;function e(t,e){var n=Yz(t,e);if(Ej(t)>Vj){var i=Rj(n[1],n[0]),r=tL(n[0]*n[0]+n[1]*n[1]),a=u*zj((i-Vj)/u)+Vj,o=Rj(Lj(i-=a),2-Mj(i));i=a+Jj(Gj/r*Lj(o))-o;n[0]=r*Mj(i);n[1]=r*Lj(i)}return n}e.invert=function(t,e){var n=tL(t*t+e*e);if(n>Vj){var i=Rj(e,t),r=u*zj((i-Vj)/u)+Vj,a=i>r?-1:1,o=n*Mj(r-i),s=1/Fj(a*Qj((o-Gj)/tL(Gj*(Gj-2*o)+n*n)));i=r+2*Aj((s+a*tL(s*s-3))/3);t=n*Mj(i),e=n*Lj(i)}return Yz.invert(t,e)};return e}function _L(){var o=5,e=zz(yL),i=e(o),r=i.stream,s=.01,u=-Mj(s*Zj),l=Lj(s*Zj);i.lobes=function(t){return arguments.length?e(o=+t):o};i.stream=function(t){var e=i.rotate(),n=r(t),a=(i.rotate([0,0]),r(t));i.rotate(e);n.sphere=function(){a.polygonStart(),a.lineStart();for(var t=0,e=360/o,n=2*Gj/o,i=90-180/o,r=Vj;t0&&Ej(r)>Ij);return i<0?NaN:n}function SL(x,k,S){if(k===undefined)k=40;if(S===undefined)S=Hj;return function(t,e,n,i){var r,a,o;n=n===undefined?0:+n;i=i===undefined?0:+i;for(var s=0;sr){n-=a/=2;i-=o/=2;continue}r=f;var h=(n>0?-1:1)*S,d=(i>0?-1:1)*S,g=x(n+h,i),p=x(n,i+d),v=(g[0]-u[0])/h,m=(g[1]-u[1])/h,y=(p[0]-u[0])/d,_=(p[1]-u[1])/d,b=_*v-m*y,w=(Ej(b)<.5?.5:1)/b;a=(c*y-l*_)*w;o=(l*m-c*v)*w;n+=a;i+=o;if(Ej(a)0){i[1]*=1+r/1.5*i[0]*i[0]}return i}t.invert=SL(t);return t}function EL(){return Nz(CL()).rotate([-16.5,-42]).scale(176.57).center([7.93,.09])}function AL(t,e){var n=t*Lj(e),i=30,r;do{e-=r=(e+Lj(e)-n)/(1+Mj(e))}while(Ej(r)>Ij&&--i>0);return e/2}function RL(n,i,r){function t(t,e){return[n*t*Mj(e=AL(r,e)),i*Lj(e)]}t.invert=function(t,e){return e=Jj(e/i),[t/(n*Mj(e)),Jj((2*e+Lj(2*e))/r)]};return t}var ML=RL(qj/Vj,qj,Gj);function TL(){return Nz(ML).scale(169.529)}var PL=2.00276,OL=1.11072;function BL(t,e){var n=AL(Gj,e);return[PL*t/(1/Mj(e)+OL/Mj(n)),(e+qj*Lj(n))/PL]}BL.invert=function(t,e){var n=PL*e,i=e<0?-Uj:Uj,r=25,a,o;do{o=n-qj*Lj(i);i-=a=(Lj(2*i)+2*i-Gj*Lj(o))/(2*Mj(2*i)+2+Gj*Mj(o)*qj*Mj(i))}while(Ej(a)>Ij&&--r>0);o=n-qj*Lj(i);return[t*(1/Mj(o)+OL/Mj(i))/PL,o]};function DL(){return Nz(BL).scale(160.857)}function NL(t){var e=0,n=zz(t),i=n(e);i.parallel=function(t){return arguments.length?n(e=t*Zj):e*Xj};return i}function zL(t,e){return[t*Mj(e),e]}zL.invert=function(t,e){return[t/Mj(e),e]};function jL(){return Nz(zL).scale(152.63)}function LL(r){if(!r)return zL;var a=1/Fj(r);function t(t,e){var n=a+r-e,i=n?t*Mj(e)/n:n;return[n*Lj(i),a-n*Mj(i)]}t.invert=function(t,e){var n=tL(t*t+(e=a-e)*e),i=a+r-n;return[n/Mj(i)*Rj(t,e),i]};return t}function FL(){return NL(LL).scale(123.082).center([0,26.1441]).parallel(45)}function IL(o){function t(t,e){var n=Vj-e,i=n?t*o*Lj(n)/n:n;return[n*Lj(i)/o,Vj-n*Mj(i)]}t.invert=function(t,e){var n=t*o,i=Vj-e,r=tL(n*n+i*i),a=Rj(n,i);return[(r?r/Lj(r):1)*a/o,Vj-r]};return t}function HL(){var e=.5,n=zz(IL),t=n(e);t.fraction=function(t){return arguments.length?n(e=+t):e};return t.scale(158.837)}var GL=RL(1,4/Gj,Gj);function VL(){return Nz(GL).scale(152.63)}function UL(t,e,n,i,r,a){var o=Mj(a),s;if(Ej(t)>1||Ej(a)>1){s=Qj(n*r+e*i*o)}else{var u=Lj(t/2),l=Lj(a/2);s=2*Jj(tL(u*u+e*i*l*l))}return Ej(s)>Ij?[s,Rj(i*Lj(a),e*r-n*i*o)]:[0,0]}function WL(t,e,n){return Qj((t*t+e*e-n*n)/(2*t*e))}function qL(t){return t-2*Gj*Pj((t+Gj)/(2*Gj))}function KL(t,e,n){var c=[[t[0],t[1],Lj(t[1]),Mj(t[1])],[e[0],e[1],Lj(e[1]),Mj(e[1])],[n[0],n[1],Lj(n[1]),Mj(n[1])]];for(var i=c[2],r,a=0;a<3;++a,i=r){r=c[a];i.v=UL(r[1]-i[1],i[3],i[2],r[3],r[2],r[0]-i[0]);i.point=[0,0]}var o=WL(c[0].v[0],c[2].v[0],c[1].v[0]),f=WL(c[0].v[0],c[1].v[0],c[2].v[0]),h=Gj-o;c[2].point[1]=0;c[0].point[0]=-(c[1].point[0]=c[0].v[0]/2);var d=[c[2].point[0]=c[0].point[0]+c[2].v[0]*Mj(o),2*(c[0].point[1]=c[1].point[1]=c[2].v[0]*Lj(o))];function s(t,e){var n=Lj(e),i=Mj(e),r=new Array(3),a;for(a=0;a<3;++a){var o=c[a];r[a]=UL(e-o[1],o[3],o[2],i,n,t-o[0]);if(!r[a][0])return o.point;r[a][1]=qL(r[a][1]-o.v[1])}var s=d.slice();for(a=0;a<3;++a){var u=a==2?0:a+1;var l=WL(c[a].v[0],r[a][0],r[u][0]);if(r[a][1]<0)l=-l;if(!a){s[0]+=r[a][0]*Mj(l);s[1]-=r[a][0]*Lj(l)}else if(a==1){l=f-l;s[0]-=r[a][0]*Mj(l);s[1]-=r[a][0]*Lj(l)}else{l=h-l;s[0]+=r[a][0]*Mj(l);s[1]+=r[a][0]*Lj(l)}}s[0]/=3,s[1]/=3;return s}return s}function YL(t){return t[0]*=Zj,t[1]*=Zj,t}function XL(){return ZL([0,22],[45,22],[22.5,-22]).scale(380).center([22.5,2])}function ZL(t,e,n){var i=hD({type:"MultiPoint",coordinates:[t,e,n]}),r=[-i[0],-i[1]],a=bD(r),o=KL(YL(a(t)),YL(a(e)),YL(a(n)));o.invert=SL(o);var s=Nz(o).rotate(r),u=s.center;delete s.rotate;s.center=function(t){return arguments.length?u(a(t)):a.invert(u())};return s.clipAngle(90)}function $L(t,e){var n=tL(1-Lj(e));return[2/Kj*t*n,Kj*(1-n)]}$L.invert=function(t,e){var n=(n=e/Kj-1)*n;return[n>0?t*tL(Gj/n)/2:0,Jj(1-n)]};function JL(){return Nz($L).scale(95.6464).center([0,30])}function QL(t){var i=Fj(t);function e(t,e){return[t,(t?t/Lj(t):1)*(Lj(e)*Mj(t)-i*Mj(e))]}e.invert=i?function(t,e){if(t)e*=Lj(t)/t;var n=Mj(t);return[t,2*Rj(tL(n*n+i*i-e*e)-n,i-e)]}:function(t,e){return[t,Jj(t?e*Fj(t)/t:e)]};return e}function tF(){return NL(QL).scale(249.828).clipAngle(90)}var eF=tL(3);function nF(t,e){return[eF*t*(2*Mj(2*e/3)-1)/Kj,eF*Kj*Lj(e/3)]}nF.invert=function(t,e){var n=3*Jj(e/(eF*Kj));return[Kj*t/(eF*(2*Mj(2*n/3)-1)),n]};function iF(){return Nz(nF).scale(156.19)}function rF(t){var n=Mj(t);function e(t,e){return[t*n,Lj(e)/n]}e.invert=function(t,e){return[t/n,Jj(e*n)]};return e}function aF(){return NL(rF).parallel(38.58).scale(195.044)}function oF(t){var n=Mj(t);function e(t,e){return[t*n,(1+n)*Fj(e/2)]}e.invert=function(t,e){return[t/n,Aj(e/(1+n))*2]};return e}function sF(){return NL(oF).scale(124.75)}function uF(t,e){var n=tL(8/(3*Gj));return[n*t*(1-Ej(e)/Gj),n*e]}uF.invert=function(t,e){var n=tL(8/(3*Gj)),i=e/n;return[t/(n*(1-Ej(i)/Gj)),i]};function lF(){return Nz(uF).scale(165.664)}function cF(t,e){var n=tL(4-3*Lj(Ej(e)));return[2/tL(6*Gj)*t*n,jj(e)*tL(2*Gj/3)*(2-n)]}cF.invert=function(t,e){var n=2-Ej(e)/tL(2*Gj/3);return[t*tL(6*Gj)/(2*n),jj(e)*Jj((4-n*n)/3)]};function fF(){return Nz(cF).scale(165.664)}function hF(t,e){var n=tL(Gj*(4+Gj));return[2/n*t*(1+tL(1-4*e*e/(Gj*Gj))),4/n*e]}hF.invert=function(t,e){var n=tL(Gj*(4+Gj))/2;return[t*n/(1+tL(1-e*e*(4+Gj)/(4*Gj))),e*n/2]};function dF(){return Nz(hF).scale(180.739)}function gF(t,e){var n=(2+Vj)*Lj(e);e/=2;for(var i=0,r=Infinity;i<10&&Ej(r)>Ij;i++){var a=Mj(e);e-=r=(e+Lj(e)*(a+2)-n)/(2*a*(1+a))}return[2/tL(Gj*(4+Gj))*t*(1+Mj(e)),2*tL(Gj/(4+Gj))*Lj(e)]}gF.invert=function(t,e){var n=e*tL((4+Gj)/Gj)/2,i=Jj(n),r=Mj(i);return[t/(2/tL(Gj*(4+Gj))*(1+r)),Jj((i+n*(r+2))/(2+Vj))]};function pF(){return Nz(gF).scale(180.739)}function vF(t,e){return[t*(1+Mj(e))/tL(2+Gj),2*e/tL(2+Gj)]}vF.invert=function(t,e){var n=tL(2+Gj),i=e*n/2;return[n*t/(1+Mj(i)),i]};function mF(){return Nz(vF).scale(173.044)}function yF(t,e){var n=(1+Vj)*Lj(e);for(var i=0,r=Infinity;i<10&&Ej(r)>Ij;i++){e-=r=(e+Lj(e)-n)/(1+Mj(e))}n=tL(2+Gj);return[t*(1+Mj(e))/n,2*e/n]}yF.invert=function(t,e){var n=1+Vj,i=tL(n/2);return[t*2*i/(1+Mj(e*=i)),Jj((e+Lj(e))/n)]};function _F(){return Nz(yF).scale(173.044)}var bF=3+2*qj;function wF(t,e){var n=Lj(t/=2),i=Mj(t),r=tL(Mj(e)),a=Mj(e/=2),o=Lj(e)/(a+qj*i*r),s=tL(2/(1+o*o)),u=tL((qj*a+(i+n)*r)/(qj*a+(i-n)*r));return[bF*(s*(u-1/u)-2*Oj(u)),bF*(s*o*(u+1/u)-2*Aj(o))]}wF.invert=function(t,e){if(!(a=hL.invert(t/1.2,e*1.065)))return null;var n=a[0],i=a[1],r=20,a;t/=bF,e/=bF;do{var o=n/2,s=i/2,u=Lj(o),l=Mj(o),c=Lj(s),f=Mj(s),h=Mj(i),d=tL(h),g=c/(f+qj*l*d),p=g*g,v=tL(2/(1+p)),m=qj*f+(l+u)*d,y=qj*f+(l-u)*d,_=m/y,b=tL(_),w=b-1/b,x=b+1/b,k=v*w-2*Oj(b)-t,S=v*g*x-2*Aj(g)-e,C=c&&Wj*d*u*p/c,E=(qj*l*f+d)/(2*(f+qj*l*d)*(f+qj*l*d)*d),A=-.5*g*v*v*v,R=A*C,M=A*E,T=(T=2*f+qj*d*(l-u))*T*b,P=(qj*l*f*d+h)/T,O=-(qj*u*c)/(d*T),B=w*R-2*P/b+v*(P+P/_),D=w*M-2*O/b+v*(O+O/_),N=g*x*R-2*C/(1+p)+v*x*C+v*g*(P-P/_),z=g*x*M-2*E/(1+p)+v*x*E+v*g*(O-O/_),j=D*N-z*B;if(!j)break;var L=(S*D-k*z)/j,F=(k*N-S*B)/j;n-=L;i=Bj(-Vj,Dj(Vj,i-F))}while((Ej(L)>Ij||Ej(F)>Ij)&&--r>0);return Ej(Ej(i)-Vj)b){var o=tL(a),s=Rj(r,i),u=_*zj(s/_),l=s-u,c=y*Mj(l),f=(y*Lj(l)-l*Lj(c))/(Vj-c),h=DF(l,f),d=(Gj-y)/NF(h,c,Gj);i=o;var g=50,p;do{i-=p=(y+NF(h,c,i)*d-o)/(h(i)*d)}while(Ej(p)>Ij&&--g>0);r=l*Lj(i);if(ib){var i=tL(n),r=Rj(e,t),a=_*zj(r/_),o=r-a;t=i*Mj(o);e=i*Lj(o);var s=t-Vj,u=Lj(t),l=e/u,c=tIj||Ej(a)>Ij)&&--o>0);return[n,i]};return t}var LF=jF(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555);function FF(){return Nz(LF).scale(149.995)}var IF=jF(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742);function HF(){return Nz(IF).scale(153.93)}var GF=jF(5/6*Gj,-.62636,-.0344,0,1.3493,-.05524,0,.045);function VF(){return Nz(GF).scale(130.945)}function UF(t,e){var n=t*t,i=e*e;return[t*(1-.162388*i)*(.87-952426e-9*n*n),e*(1+i/12)]}UF.invert=function(t,e){var n=t,i=e,r=50,a;do{var o=i*i;i-=a=(i*(1+o/12)-e)/(1+o/4)}while(Ej(a)>Ij&&--r>0);r=50;t/=1-.162388*o;do{var s=(s=n*n)*s;n-=a=(n*(.87-952426e-9*s)-t)/(.87-.00476213*s)}while(Ej(a)>Ij&&--r>0);return[n,i]};function WF(){return Nz(UF).scale(131.747)}var qF=jF(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762);function KF(){return Nz(qF).scale(131.087)}function YF(a){var o=a(Vj,0)[0]-a(-Vj,0)[0];function t(t,e){var n=t>0?-.5:.5,i=a(t+n*Gj,e);i[0]-=n*o;return i}if(a.invert)t.invert=function(t,e){var n=t>0?-.5:.5,i=a.invert(t+n*o,e),r=i[0]-n*Gj;if(r<-Gj)r+=2*Gj;else if(r>Gj)r-=2*Gj;i[0]=r;return i};return t}function XF(t,e){var n=jj(t),i=jj(e),r=Mj(e),a=Mj(t)*r,o=Lj(t)*r,s=Lj(i*e);t=Ej(Rj(o,s));e=Jj(a);if(Ej(t-Vj)>Ij)t%=Vj;var u=ZF(t>Gj/4?Vj-t:t,e);if(t>Gj/4)s=u[0],u[0]=-u[1],u[1]=-s;return u[0]*=n,u[1]*=-i,u}XF.invert=function(t,e){if(Ej(t)>1)t=jj(t)*2-t;if(Ej(e)>1)e=jj(e)*2-e;var n=jj(t),i=jj(e),r=-n*t,a=-i*e,o=a/r<1,s=$F(o?a:r,o?r:a),u=s[0],l=s[1],c=Mj(l);if(o)u=-Vj-u;return[n*(Rj(Lj(u)*c,-Lj(l))+Gj),i*Jj(Mj(u)*c)]};function ZF(t,e){if(e===Vj)return[0,0];var n=Lj(e),i=n*n,r=i*i,a=1+r,o=1+3*r,s=1-r,u=Jj(1/tL(a)),l=s+i*a*u,c=(1-n)/l,f=tL(c),h=c*a,d=tL(h),g=f*s,p,v;if(t===0)return[0,-(g+i*d)];var m=Mj(e),y=1/m,_=2*n*m,b=(-3*i+u*o)*_,w=(-l*m-(1-n)*b)/(l*l),x=.5*w/f,k=s*x-2*i*f*_,S=i*a*w+c*o*_,C=-y*_,E=-y*S,A=-2*y*k,R=4*t/Gj,M;if(t>.222*Gj||e.175*Gj){p=(g+i*tL(h*(1+r)-g*g))/(1+r);if(t>Gj/4)return[p,p];var T=p,P=.5*p;p=.5*(P+T),v=50;do{var O=tL(h-p*p),B=p*(A+C*O)+E*Jj(p/d)-R;if(!B)break;if(B<0)P=p;else T=p;p=.5*(P+T)}while(Ej(T-P)>Ij&&--v>0)}else{p=Ij,v=25;do{var D=p*p,N=tL(h-D),z=A+C*N,j=p*z+E*Jj(p/d)-R,L=z+(E-C*D)/N;p-=M=N?j/L:0}while(Ej(M)>Ij&&--v>0)}return[p,-g-i*tL(h-p*p)]}function $F(t,e){var n=0,i=1,r=.5,a=50;while(true){var o=r*r,s=tL(r),u=Jj(1/tL(1+o)),l=1-o+r*(1+o)*u,c=(1-s)/l,f=tL(c),h=c*(1+o),d=f*(1-o),g=h-t*t,p=tL(g),v=e+d+r*p;if(Ej(i-n)0)n=r;else i=r;r=.5*(n+i)}if(!a)return null;var m=Jj(s),y=Mj(m),_=1/y,b=2*s*y,w=(-3*r+u*(1+3*o))*b,x=(-l*y-(1-s)*w)/(l*l),k=.5*x/f,S=(1-o)*k-2*r*f*b,C=-2*_*S,E=-_*b,A=-_*(r*(1+o)*x+c*(1+3*o)*b);return[Gj/4*(t*(C+E*p)+A*Jj(t/tL(h))),m]}function JF(){return Nz(YF(XF)).scale(239.75)}function QF(t,e,n){var i,r,a;if(!t){r=tI(e,1-n);return[[0,r[0]/r[1]],[1/r[1],0],[r[2]/r[1],0]]}i=tI(t,n);if(!e)return[[i[0],0],[i[1],0],[i[2],0]];r=tI(e,1-n);a=r[1]*r[1]+n*i[0]*i[0]*r[0]*r[0];return[[i[0]*r[2]/a,i[1]*i[2]*r[0]*r[1]/a],[i[1]*r[1]/a,-i[0]*i[2]*r[0]*r[2]/a],[i[2]*r[1]*r[2]/a,-n*i[0]*i[1]*r[0]/a]]}function tI(t,e){var n,i,r,a,o;if(e=1-Ij){n=(1-e)/4;i=iL(t);a=eL(t);r=1/i;o=i*nL(t);return[a+n*(o-t)/(i*i),r-n*a*r*(o-t),r+n*a*r*(o+t),2*Aj(Tj(t))-Vj+n*(o-t)/i]}var s=[1,0,0,0,0,0,0,0,0],u=[tL(e),0,0,0,0,0,0,0,0],l=0;i=tL(1-e);o=1;while(Ej(u[l]/s[l])>Ij&&l<8){n=s[l++];u[l]=(n-i)/2;s[l]=(n+i)/2;i=tL(n*i);o*=2}r=o*s[l]*t;do{a=u[l]*Lj(i=r)/s[l];r=(Jj(a)+r)/2}while(--l);return[Lj(r),a=Mj(r),a/Mj(r-i),r]}function eI(t,e,n){var i=Ej(t),r=Ej(e),a=nL(r);if(i){var o=1/Lj(i),s=1/(Fj(i)*Fj(i)),u=-(s+n*(a*a*o*o)-1+n),l=(n-1)*s,c=(-u+tL(u*u-4*l))/2;return[nI(Aj(1/tL(c)),n)*jj(t),nI(Aj(tL((c/s-1)/n)),1-n)*jj(e)]}return[0,nI(Aj(a),1-n)*jj(e)]}function nI(t,e){if(!e)return t;if(e===1)return Oj(Fj(t/2+Uj));var n=1,i=tL(1-e),r=tL(e);for(var a=0;Ej(r)>Ij;a++){if(t%Gj){var o=Aj(i*Fj(t)/n);if(o<0)o+=Gj;t+=o+~~(t/Gj)*Gj}else t+=t;r=(n+i)/2;i=tL(n*i);r=((n=r)-i)/2}return t/(Nj(2,a)*n)}function iI(t,e){var n=(qj-1)/(qj+1),i=tL(1-n*n),r=nI(Vj,i*i),a=-1,o=Oj(Fj(Gj/4+Ej(e)/2)),s=Tj(a*o)/tL(n),u=rI(s*Mj(a*t),s*Lj(a*t)),l=eI(u[0],u[1],i*i);return[-l[1],(e>=0?1:-1)*(.5*r-l[0])]}function rI(t,e){var n=t*t,i=e+1,r=1-n-e*e;return[.5*((t>=0?Vj:-Vj)-Rj(r,2*t)),-.25*Oj(r*r+4*n)+.5*Oj(i*i+n)]}function aI(t,e){var n=e[0]*e[0]+e[1]*e[1];return[(t[0]*e[0]+t[1]*e[1])/n,(t[1]*e[0]-t[0]*e[1])/n]}iI.invert=function(t,e){var n=(qj-1)/(qj+1),i=tL(1-n*n),r=nI(Vj,i*i),a=-1,o=QF(.5*r-e,-t,i*i),s=aI(o[0],o[1]),u=Rj(s[1],s[0])/a;return[u,2*Aj(Tj(.5/a*Oj(n*s[0]*s[0]+n*s[1]*s[1])))-Vj]};function oI(){return Nz(YF(iI)).scale(151.496)}function sI(t){var f=Lj(t),l=Mj(t),h=uI(t);h.invert=uI(-t);function e(t,e){var n=h(t,e);t=n[0],e=n[1];var i=Lj(e),r=Mj(e),a=Mj(t),o=Qj(f*i+l*r*a),s=Lj(o),u=Ej(s)>Ij?o/s:1;return[u*l*Lj(t),(Ej(t)>Vj?u:-u)*(f*r-l*i*a)]}e.invert=function(t,e){var n=tL(t*t+e*e),i=-Lj(n),r=Mj(n),a=n*r,o=-e*i,s=n*f,u=tL(a*a+o*o-s*s),l=Rj(a*s+o*u,o*s-a*u),c=(n>Vj?-1:1)*Rj(t*i,n*Mj(l)*r+e*Lj(l)*i);return h.invert(c,l)};return e}function uI(t){var o=Lj(t),s=Mj(t);return function(t,e){var n=Mj(e),i=Mj(t)*n,r=Lj(t)*n,a=Lj(e);return[Rj(r,i*s-a*o),Jj(a*s+i*o)]}}function lI(){var n=0,i=zz(sI),r=i(n),e=r.rotate,t=r.stream,o=kD();r.parallel=function(t){if(!arguments.length)return n*Xj;var e=r.rotate();return i(n=t*Zj).rotate(e)};r.rotate=function(t){if(!arguments.length)return t=e.call(r),t[1]+=n*Xj,t;e.call(r,[t[0],t[1]-n*Xj]);o.center([-t[0],-t[1]]);return r};r.stream=function(a){a=t(a);a.sphere=function(){a.polygonStart();var t=.01,e=o.radius(90-t)().coordinates[0],n=e.length-1,i=-1,r;a.lineStart();while(++i=0){a.point((r=e[i])[0],r[1])}a.lineEnd();a.polygonEnd()};return a};return r.scale(79.4187).parallel(45).clipAngle(180-.001)}var cI=3,fI=Jj(1-1/cI)*Xj,hI=rF(0);function dI(a){var o=fI*Zj,s=$L(Gj,o)[0]-$L(-Gj,o)[0],u=hI(0,o)[1],l=$L(0,o)[1],c=Kj-l,f=Yj/a,h=4/Yj,d=u+c*c*4/Yj;function t(t,e){var n,i=Ej(e);if(i>o){var r=Dj(a-1,Bj(0,Pj((t+Gj)/f)));t+=Gj*(a-1)/a-r*f;n=$L(t,i);n[0]=n[0]*Yj/s-Yj*(a-1)/(2*a)+r*Yj/a;n[1]=u+(n[1]-l)*4*c/Yj;if(e<0)n[1]=-n[1]}else{n=hI(t,e)}n[0]*=h,n[1]/=d;return n}t.invert=function(t,e){t/=h,e*=d;var n=Ej(e);if(n>u){var i=Dj(a-1,Bj(0,Pj((t+Gj)/f)));t=(t+Gj*(a-1)/a-i*f)*s/Yj;var r=$L.invert(t,.25*(n-u)*Yj/c+l);r[0]-=Gj*(a-1)/a-i*f;if(e<0)r[1]=-r[1];return r}return hI.invert(t,e)};return t}function gI(t,e){return[t,e&1?90-Ij:fI]}function pI(t,e){return[t,e&1?-90+Ij:-fI]}function vI(t){return[t[0]*(1-Ij),t[1]]}function mI(t){var e=[].concat(le(-180,180+t/2,t).map(gI),le(180,-180-t/2,-t).map(pI));return{type:"Polygon",coordinates:[t===180?e.map(vI):e]}}function yI(){var r=4,e=zz(dI),a=e(r),o=a.stream;a.lobes=function(t){return arguments.length?e(r=+t):r};a.stream=function(t){var e=a.rotate(),n=o(t),i=(a.rotate([0,0]),o(t));a.rotate(e);n.sphere=function(){XO(mI(180/r),i)};return n};return a.scale(239.75)}function _I(h){var d=1+h,t=Lj(1/d),g=Jj(t),p=2*tL(Gj/(v=Gj+4*g*d)),v,m=.5*p*(d+tL(h*(2+h))),y=h*h,_=d*d;function e(t,e){var n=1-Lj(e),i,r;if(n&&n<2){var a=Vj-e,o=25,s;do{var u=Lj(a),l=Mj(a),c=g+Rj(u,d-l),f=1+_-2*d*l;a-=s=(a-y*g-d*u+f*c-.5*n*v)/(2*d*u*c)}while(Ej(s)>Hj&&--o>0);i=p*tL(f);r=t*c/Gj}else{i=p*(h+n);r=t*g/Gj}return[i*Lj(r),m-i*Mj(r)]}e.invert=function(t,e){var n=t*t+(e-=m)*e,i=(1+_-n/(p*p))/(2*d),r=Qj(i),a=Lj(r),o=g+Rj(a,d-i);return[Jj(t/tL(n))*Gj/o,Jj(1-2*(r-y*g-d*a+(1+_-2*d*i)*o)/v)]};return e}function bI(){var e=1,n=zz(_I),t=n(e);t.ratio=function(t){return arguments.length?n(e=+t):e};return t.scale(167.774).center([0,18.67])}var wI=.7109889596207567;var xI=.0528035274542;function kI(t,e){return e>-wI?(t=ML(t,e),t[1]+=xI,t):zL(t,e)}kI.invert=function(t,e){return e>-wI?ML.invert(t,e-xI):zL.invert(t,e)};function SI(){return Nz(kI).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}function CI(t,e){return Ej(e)>wI?(t=ML(t,e),t[1]-=e>0?xI:-xI,t):zL(t,e)}CI.invert=function(t,e){return Ej(e)>wI?ML.invert(t,e+(e>0?xI:-xI)):zL.invert(t,e)};function EI(){return Nz(CI).scale(152.63)}function AI(n,i,a,t){var o=tL(4*Gj/(2*a+(1+n-i/2)*Lj(2*a)+(n+i)/2*Lj(4*a)+i/2*Lj(6*a))),s=tL(t*Lj(a)*tL((1+n*Mj(2*a)+i*Mj(4*a))/(1+n+i))),u=a*c(1);function l(t){return tL(1+n*Mj(2*t)+i*Mj(4*t))}function c(t){var e=t*a;return(2*e+(1+n-i/2)*Lj(2*e)+(n+i)/2*Lj(4*e)+i/2*Lj(6*e))/a}function r(t){return l(t)*Lj(t)}var e=function t(e,n){var i=a*kL(c,u*Lj(n)/a,n/Gj);if(isNaN(i))i=a*jj(n);var r=o*l(i);return[r*s*e/Gj*Mj(i),r/s*Lj(i)]};e.invert=function(t,e){var n=kL(r,e*s/o);return[t*Gj/(Mj(n)*o*s*l(n)),Jj(a*c(n/a)/u)]};if(a===0){o=tL(t/Gj);e=function t(e,n){return[e*o,Lj(n)/o]};e.invert=function(t,e){return[t/o,Jj(e*o)]}}return e}function RI(){var e=1,n=0,i=45*Zj,r=2,a=zz(AI),t=a(e,n,i,r);t.a=function(t){return arguments.length?a(e=+t,n,i,r):e};t.b=function(t){return arguments.length?a(e,n=+t,i,r):n};t.psiMax=function(t){return arguments.length?a(e,n,i=+t*Zj,r):i*Xj};t.ratio=function(t){return arguments.length?a(e,n,i,r=+t):r};return t.scale(180.739)}function MI(t,e,n,i,r,a,o,s,u,l,c){if(c.nanEncountered){return NaN}var f,h,d,g,p,v,m,y,_,b;f=n-e;h=t(e+f*.25);d=t(n-f*.25);if(isNaN(h)){c.nanEncountered=true;return}if(isNaN(d)){c.nanEncountered=true;return}g=f*(i+4*h+r)/12;p=f*(r+4*d+a)/12;v=g+p;b=(v-o)/15;if(l>u){c.maxDepthCount++;return v+b}else if(Math.abs(b)>1;do{if(u[i]>t)n=i;else e=i;i=e+n>>1}while(i>e);var r=u[i+1]-u[i];if(r)r=(t-u[i+1])/r;return(i+1+r)/o}var f=2*c(1)/Gj*r/t;var h=function t(e,n){var i=c(Ej(Lj(n))),r=a(i)*e;i/=f;return[r,n>=0?i:-i]};h.invert=function(t,e){var n;e*=f;if(Ej(e)<1)n=jj(e)*Jj(i(Ej(e))*r);return[t/a(Ej(e)),n]};return h}function OI(){var e=0,n=2.5,i=1.183136,r=zz(PI),t=r(e,n,i);t.alpha=function(t){return arguments.length?r(e=+t,n,i):e};t.k=function(t){return arguments.length?r(e,n=+t,i):n};t.gamma=function(t){return arguments.length?r(e,n,i=+t):i};return t.scale(152.63)}function BI(t,e){return Ej(t[0]-e[0])=0;--u){n=t[1][u];i=n[0][0],r=n[0][1],a=n[1][1];o=n[2][0],s=n[2][1];e.push(DI([[o-Ij,s-Ij],[o-Ij,a+Ij],[i+Ij,a+Ij],[i+Ij,r-Ij]],30))}return{type:"Polygon",coordinates:[he(e)]}}function zI(u,l,t){var r,c;function f(t,e){var n=e<0?-1:+1,i=l[+(e<0)];for(var r=0,a=i.length-1;ri[r][2][0];++r){}var o=u(t-i[r][1][0],e);o[0]+=u(i[r][1][0],n*e>n*i[r][0][1]?i[r][0][1]:e)[0];return o}if(t){f.invert=t(f)}else if(u.invert){f.invert=function(t,e){var n=c[+(e<0)],i=l[+(e<0)];for(var r=0,a=n.length;rr)a=i,i=r,r=a;return[[e,i],[n,r]]})});return a};if(l!=null)a.lobes(l);return a}var jI=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function LI(){return zI(BL,jI).scale(160.857)}var FI=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function II(){return zI(CI,FI).scale(152.63)}var HI=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function GI(){return zI(ML,HI).scale(169.529)}var VI=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function UI(){return zI(ML,VI).scale(169.529).rotate([20,0])}var WI=[[[[-180,35],[-30,90],[0,35]],[[0,35],[30,90],[180,35]]],[[[-180,-10],[-102,-90],[-65,-10]],[[-65,-10],[5,-90],[77,-10]],[[77,-10],[103,-90],[180,-10]]]];function qI(){return zI(kI,WI,SL).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}var KI=[[[[-180,0],[-110,90],[-40,0]],[[-40,0],[0,90],[40,0]],[[40,0],[110,90],[180,0]]],[[[-180,0],[-110,-90],[-40,0]],[[-40,0],[0,-90],[40,0]],[[40,0],[110,-90],[180,0]]]];function YI(){return zI(zL,KI).scale(152.63).rotate([-20,0])}function XI(t,e){return[3/Yj*t*tL(Gj*Gj/3-e*e),e]}XI.invert=function(t,e){return[Yj/3*t/tL(Gj*Gj/3-e*e),e]};function ZI(){return Nz(XI).scale(158.837)}function $I(o){function t(t,e){if(Ej(Ej(e)-Vj)2)return null;t/=2,e/=2;var i=t*t,r=e*e,a=2*e/(1+i+r);a=Nj((1+a)/(1-a),1/o);return[Rj(2*t,1-i-r)/o,Jj((a-1)/(a+1))]};return t}function JI(){var e=.5,n=zz($I),t=n(e);t.spacing=function(t){return arguments.length?n(e=+t):e};return t.scale(124.75)}var QI=Gj/qj;function tH(t,e){return[t*(1+tL(Mj(e)))/2,e/(Mj(e/2)*Mj(t/6))]}tH.invert=function(t,e){var n=Ej(t),i=Ej(e),r=Ij,a=Vj;if(iIj||Ej(v)>Ij)&&--r>0);return r&&[n,i]};function iH(){return Nz(nH).scale(139.98)}function rH(t,e){return[Lj(t)/Mj(e),Fj(e)*Mj(t)]}rH.invert=function(t,e){var n=t*t,i=e*e,r=i+1,a=n+r,o=t?Wj*tL((a-tL(a*a-4*n))/n):1/tL(r);return[Jj(t*o),jj(e)*Qj(o)]};function aH(){return Nz(rH).scale(144.049).clipAngle(90-.001)}function oH(r){var a=Mj(r),o=Fj(Uj+r/2);function t(t,e){var n=e-r,i=Ej(n)=0){s=y[o];u=s[0]+r*(c=u)-a*l;l=s[1]+r*l+a*c}u=r*(c=u)-a*l;l=r*l+a*c;return[u,l]}t.invert=function(t,e){var n=20,i=t,r=e;do{var a=_,o=y[a],s=o[0],u=o[1],l=0,c=0,f;while(--a>=0){o=y[a];l=s+i*(f=l)-r*c;c=u+i*c+r*f;s=o[0]+i*(f=s)-r*u;u=o[1]+i*u+r*f}l=s+i*(f=l)-r*c;c=u+i*c+r*f;s=i*(f=s)-r*u-t;u=i*u+r*f-e;var h=l*l+c*c,d,g;i-=d=(s*l+u*c)/h;r-=g=(u*l-s*c)/h}while(Ej(d)+Ej(g)>Ij*Ij&&--n>0);if(n){var p=tL(i*i+r*r),v=2*Aj(p*.5),m=Lj(v);return[Rj(i*m,p*Mj(v)),p?Jj(r*m/p):0]}};return t}var fH=[[.9972523,0],[.0052513,-.0041175],[.0074606,.0048125],[-.0153783,-.1968253],[.0636871,-.1408027],[.3660976,-.2937382]],hH=[[.98879,0],[0,0],[-.050909,0],[0,0],[.075528,0]],dH=[[.984299,0],[.0211642,.0037608],[-.1036018,-.0575102],[-.0329095,-.0320119],[.0499471,.1223335],[.026046,.0899805],[7388e-7,-.1435792],[.0075848,-.1334108],[-.0216473,.0776645],[-.0225161,.0853673]],gH=[[.9245,0],[0,0],[.01943,0]],pH=[[.721316,0],[0,0],[-.00881625,-.00617325]];function vH(){return wH(fH,[152,-64]).scale(1400).center([-160.908,62.4864]).clipAngle(30).angle(7.8)}function mH(){return wH(hH,[95,-38]).scale(1e3).clipAngle(55).center([-96.5563,38.8675])}function yH(){return wH(dH,[120,-45]).scale(359.513).clipAngle(55).center([-117.474,53.0628])}function _H(){return wH(gH,[-20,-18]).scale(209.091).center([20,16.7214]).clipAngle(82)}function bH(){return wH(pH,[165,10]).scale(250).clipAngle(130).center([-165,-10])}function wH(t,e){var n=Nz(cH(t)).rotate(e).clipAngle(90),i=bD(e),r=n.center;delete n.rotate;n.center=function(t){return arguments.length?r(i(t)):i.invert(r())};return n}var xH=tL(6),kH=tL(7);function SH(t,e){var n=Jj(7*Lj(e)/(3*xH));return[xH*t*(2*Mj(2*n/3)-1)/kH,9*Lj(n/3)/kH]}SH.invert=function(t,e){var n=3*Jj(e*kH/9);return[t*kH/(xH*(2*Mj(2*n/3)-1)),Jj(Lj(n)*3*xH/7)]};function CH(){return Nz(SH).scale(164.859)}function EH(t,e){var n=(1+Wj)*Lj(e),i=e;for(var r=0,a;r<25;r++){i-=a=(Lj(i/2)+Lj(i)-n)/(.5*Mj(i/2)+Mj(i));if(Ej(a)Hj&&--i>0);a=n*n;o=a*a;s=a*o;return[t/(.84719-.13063*a+s*s*(-.04515+.05494*a-.02326*o+.00331*s)),n]};function PH(){return Nz(TH).scale(175.295)}function OH(t,e){return[t*(1+Mj(e))/2,2*(e-Fj(e/2))]}OH.invert=function(t,e){var n=e/2;for(var i=0,r=Infinity;i<10&&Ej(r)>Ij;++i){var a=Mj(e/2);e-=r=(e-Fj(e/2)-n)/(1-.5/(a*a))}return[2*t/(1+Mj(e)),e]};function BH(){return Nz(OH).scale(152.63)}var DH=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function NH(){return zI(bL(Infinity),DH).rotate([20,0]).scale(152.63)}function zH(t,e){var n=Lj(e),i=Mj(e),r=jj(t);if(t===0||Ej(e)===Vj)return[0,e];else if(e===0)return[t,0];else if(Ej(t)===Vj)return[t*i,Vj*n];var a=Gj/(2*t)-2*t/Gj,o=2*e/Gj,s=(1-o*o)/(n-o);var u=a*a,l=s*s,c=1+u/l,f=1+l/u;var h=(a*n/s-a/2)/c,d=(l*n/u+s/2)/f,g=h*h+i*i/c,p=d*d-(l*n*n/u+s*n-1)/f;return[Vj*(h+tL(g)*r),Vj*(d+tL(p<0?0:p)*jj(-e*a)*r)]}zH.invert=function(t,e){t/=Vj;e/=Vj;var n=t*t,i=e*e,r=n+i,a=Gj*Gj;return[t?(r-1+tL((1-r)*(1-r)+4*n))/(2*t)*Vj:0,kL(function(t){return r*(Gj*Lj(t)-2*t)*Gj+4*t*t*(e-Lj(t))+2*Gj*t-a*e},0)]};function jH(){return Nz(zH).scale(127.267)}var LH=1.0148,FH=.23185,IH=-.14499,HH=.02406,GH=LH,VH=5*FH,UH=7*IH,WH=9*HH,qH=1.790857183;function KH(t,e){var n=e*e;return[t,e*(LH+n*n*(FH+n*(IH+HH*n)))]}KH.invert=function(t,e){if(e>qH)e=qH;else if(e<-qH)e=-qH;var n=e,i;do{var r=n*n;n-=i=(n*(LH+r*r*(FH+r*(IH+HH*r)))-e)/(GH+r*r*(VH+r*(UH+WH*r)))}while(Ej(i)>Ij);return[t,n]};function YH(){return Nz(KH).scale(139.319)}function XH(t,e){if(Ej(e)Ij&&--r>0);o=Fj(i);return[(Ej(e)=0;){i=e[s];if(n[0]===i[0]&&n[1]===i[1]){if(a)return[a,n];a=n}}}}function sG(t){var e=t.length,n=[];for(var i=t[e-1],r=0;r0?[-e[0],0]:[180-e[0],180])};var i=cG.map(function(t){return{face:t,project:e(t)}});[-1,0,0,1,0,1,4,5].forEach(function(t,e){var n=i[t];n&&(n.children||(n.children=[])).push(i[e])});return iG(i[0],function(t,e){return i[t<-Gj/2?e<0?6:4:t<0?e<0?2:0:ti^d>i&&n<(h-l)*(i-c)/(d-c)+l)r=!r}return r}function kG(t,e){var n=e.stream,i;if(!n)throw new Error("invalid projection");switch(t&&t.type){case"Feature":i=CG;break;case"FeatureCollection":i=SG;break;default:i=AG;break}return i(t,n)}function SG(t,e){return{type:"FeatureCollection",features:t.features.map(function(t){return CG(t,e)})}}function CG(t,e){return{type:"Feature",id:t.id,properties:t.properties,geometry:AG(t.geometry,e)}}function EG(t,e){return{type:"GeometryCollection",geometries:t.geometries.map(function(t){return AG(t,e)})}}function AG(t,e){if(!t)return null;if(t.type==="GeometryCollection")return EG(t,e);var n;switch(t.type){case"Point":n=TG;break;case"MultiPoint":n=TG;break;case"LineString":n=PG;break;case"MultiLineString":n=PG;break;case"Polygon":n=OG;break;case"MultiPolygon":n=OG;break;case"Sphere":n=OG;break;default:return null}XO(t,e(n));return n.result()}var RG=[],MG=[];var TG={point:function t(e,n){RG.push([e,n])},result:function t(){var t=!RG.length?null:RG.length<2?{type:"Point",coordinates:RG[0]}:{type:"MultiPoint",coordinates:RG};RG=[];return t}};var PG={lineStart:bG,point:function t(e,n){RG.push([e,n])},lineEnd:function t(){if(RG.length)MG.push(RG),RG=[]},result:function t(){var t=!MG.length?null:MG.length<2?{type:"LineString",coordinates:MG[0]}:{type:"MultiLineString",coordinates:MG};MG=[];return t}};var OG={polygonStart:bG,lineStart:bG,point:function t(e,n){RG.push([e,n])},lineEnd:function t(){var e=RG.length;if(e){do{RG.push(RG[0].slice())}while(++e<4);MG.push(RG),RG=[]}},polygonEnd:bG,result:function t(){if(!MG.length)return null;var i=[],e=[];MG.forEach(function(t){if(wG(t))i.push([t]);else e.push(t)});e.forEach(function(e){var n=e[0];i.some(function(t){if(xG(t[0],n)){t.push(e);return true}})||i.push([e])});MG=[];return!i.length?null:i.length>1?{type:"MultiPolygon",coordinates:i}:{type:"Polygon",coordinates:i[0]}}};function BG(c){var f=c(Vj,0)[0]-c(-Vj,0)[0];function t(t,e){var n=Ej(t)0?t-Gj:t+Gj,e),r=(i[0]-i[1])*Wj,a=(i[0]+i[1])*Wj;if(n)return[r,a];var o=f*Wj,s=r>0^a>0?-1:1;return[s*r-jj(a)*o,s*a-jj(r)*o]}if(c.invert)t.invert=function(t,e){var n=(t+e)*Wj,i=(e-t)*Wj,r=Ej(n)<.5*f&&Ej(i)<.5*f;if(!r){var a=f*Wj,o=n>0^i>0?-1:1,s=-o*t+(i>0?1:-1)*a,u=-o*e+(n>0?1:-1)*a;n=(-s-u)*Wj;i=(s-u)*Wj}var l=c.invert(n,i);if(!r)l[0]+=n>0?Gj:-Gj;return l};return Nz(t).rotate([-90,-90,45]).clipAngle(180-.001)}function DG(){return BG(XF).scale(176.423)}function NG(){return BG(iI).scale(111.48)}function zG(t,r){if(!(0<=(r=+r)&&r<=20))throw new Error("invalid digits");function a(t){var e=t.length,n=2,i=new Array(e);i[0]=+t[0].toFixed(r);i[1]=+t[1].toFixed(r);while(n2||r[0]!=e[0]||r[1]!=e[1]){n.push(r);e=r}}if(n.length===1&&t.length>1){n.push(a(t[t.length-1]))}return n}function o(t){return t.map(i)}function s(t){if(t==null)return t;var e;switch(t.type){case"GeometryCollection":e={type:"GeometryCollection",geometries:t.geometries.map(s)};break;case"Point":e={type:"Point",coordinates:a(t.coordinates)};break;case"MultiPoint":e={type:t.type,coordinates:n(t.coordinates)};break;case"LineString":e={type:t.type,coordinates:i(t.coordinates)};break;case"MultiLineString":case"Polygon":e={type:t.type,coordinates:o(t.coordinates)};break;case"MultiPolygon":e={type:"MultiPolygon",coordinates:t.coordinates.map(o)};break;default:return t}if(t.bbox!=null)e.bbox=t.bbox;return e}function e(t){var e={type:"Feature",properties:t.properties,geometry:s(t.geometry)};if(t.id!=null)e.id=t.id;if(t.bbox!=null)e.bbox=t.bbox;return e}if(t!=null)switch(t.type){case"Feature":return e(t);case"FeatureCollection":{var u={type:"FeatureCollection",features:t.features.map(e)};if(t.bbox!=null)u.bbox=t.bbox;return u}default:return s(t)}return t}function jG(f){var h=Lj(f);function t(t,e){var n=h?Fj(t*h/2)/h:t/2;if(!e)return[2*n,-f];var i=2*Aj(n*Lj(e)),r=1/Fj(e);return[Lj(i)*r,e+(1-Mj(i))*r-f]}t.invert=function(t,e){if(Ej(e+=f)Ij&&--r>0);var l=t*(o=Fj(i)),c=Fj(Ej(e)0?Vj:-Vj)*(u+r*(c-o)/2+r*r*(c-2*u+o)/2)]}IG.invert=function(t,e){var n=e/Vj,i=n*90,r=Dj(18,Ej(i/5)),a=Bj(0,Pj(r));do{var o=FG[a][1],s=FG[a+1][1],u=FG[Dj(19,a+2)][1],l=u-o,c=u-2*s+o,f=2*(Ej(n)-s)/l,h=c/l,d=f*(1-h*f*(1-2*h*f));if(d>=0||a===1){i=(e>=0?5:-5)*(d+r);var g=50,p;do{r=Dj(18,Ej(i)/5);a=Pj(r);d=r-a;o=FG[a][1];s=FG[a+1][1];u=FG[Dj(19,a+2)][1];i-=(p=(e>=0?Vj:-Vj)*(s+d*(u-o)/2+d*d*(u-2*s+o)/2)-e)*Xj}while(Ej(p)>Hj&&--g>0);break}}while(--a>=0);var v=FG[a][0],m=FG[a+1][0],y=FG[Dj(19,a+2)][0];return[t/(m+d*(y-v)/2+d*d*(y-2*m+v)/2),i*Zj]};function HG(){return Nz(IG).scale(152.63)}function GG(a){function t(t,e){var n=Mj(e),i=(a-1)/(a-n*Mj(t));return[i*n*Lj(t),i*Lj(e)]}t.invert=function(t,e){var n=t*t+e*e,i=tL(n),r=(a-tL(1-n*(a+1)/(a-1)))/((a-1)/i+i/(a-1));return[Rj(t*r,i*tL(1-r*r)),i?Jj(e*r/i):0]};return t}function VG(a,t){var o=GG(a);if(!t)return o;var s=Mj(t),u=Lj(t);function e(t,e){var n=o(t,e),i=n[1],r=i*u/(a-1)+s;return[n[0]*s/r,i/r]}e.invert=function(t,e){var n=(a-1)/(a-1-e*u);return o.invert(n*t,n*e*s)};return e}function UG(){var e=2,n=0,i=zz(VG),t=i(e,n);t.distance=function(t){if(!arguments.length)return e;return i(e=+t,n)};t.tilt=function(t){if(!arguments.length)return n*Xj;return i(e,n=t*Zj)};return t.scale(432.147).clipAngle(Qj(1/e)*Xj-1e-6)}var WG=1e-4,qG=1e4,KG=-180,YG=KG+WG,XG=180,ZG=XG-WG,$G=-90,JG=$G+WG,QG=90,tV=QG-WG;function eV(t){return t.length>0}function nV(t){return Math.floor(t*qG)/qG}function iV(t){return t===$G||t===QG?[0,t]:[KG,nV(t)]}function rV(t){var e=t[0],n=t[1],i=false;if(e<=YG)e=KG,i=true;else if(e>=ZG)e=XG,i=true;if(n<=JG)n=$G,i=true;else if(n>=tV)n=QG,i=true;return i?[e,n]:t}function aV(t){return t.map(rV)}function oV(t,e,n){for(var i=0,r=t.length;i=ZG||c<=JG||c>=tV){a[o]=rV(u);for(var f=o+1;fYG&&dJG&&g=s)break;n.push({index:-1,polygon:e,ring:a=a.slice(f-1)});a[0]=iV(a[0][1]);o=-1;s=a.length}}}}function sV(t){var e,n=t.length;var i={},r={},a,o,s,u,l;for(e=0;e0?Gj-s:s)*Xj],l=Nz(t(o)).rotate(u),c=bD(u),f=l.center;delete l.rotate;l.center=function(t){return arguments.length?f(c(t)):c.invert(f())};return l.clipAngle(90)}function gV(t){var i=Mj(t);function e(t,e){var n=gj(t,e);n[0]*=i;return n}e.invert=function(t,e){return gj.invert(t/i,e)};return e}function pV(){return vV([-158,21.5],[-77,39]).clipAngle(60).scale(400)}function vV(t,e){return dV(gV,t,e)}function mV(a){if(!(a*=2))return Yz;var s=-a/2,u=-s,o=a*a,l=Fj(u),c=.5/Lj(u);function t(t,e){var n=Qj(Mj(e)*Mj(t-s)),i=Qj(Mj(e)*Mj(t-u)),r=e<0?-1:1;n*=n,i*=i;return[(n-i)/(2*a),r*tL(4*o*i-(o-n+i)*(o-n+i))/(2*a)]}t.invert=function(t,e){var n=e*e,i=Mj(tL(n+(a=t+s)*a)),r=Mj(tL(n+(a=t+u)*a)),a,o;return[Rj(o=i-r,a=(i+r)*l),(e<0?-1:1)*Qj(tL(a*a+o*o)*c)]};return t}function yV(){return _V([-158,21.5],[-77,39]).clipAngle(130).scale(122.571)}function _V(t,e){return dV(mV,t,e)}function bV(t,e){if(Ej(e)Ij&&--s>0);return[jj(t)*(tL(r*r+4)+r)*Gj/4,Vj*o]};function AV(){return Nz(EV).scale(127.16)}function RV(o,s,u,l,c){function t(t,e){var n=u*Lj(l*e),i=tL(1-n*n),r=tL(2/(1+i*Mj(t*=c)));return[o*i*r*Lj(t),s*n*r]}t.invert=function(t,e){var n=t/o,i=e/s,r=tL(n*n+i*i),a=2*Jj(r/2);return[Rj(t*Fj(a),o*r)/c,r&&Jj(e*Lj(a)/(s*u*r))/l]};return t}function MV(t,e,n,i){var r=Gj/3;t=Bj(t,Ij);e=Bj(e,Ij);t=Dj(t,Vj);e=Dj(e,Gj-Ij);n=Bj(n,0);n=Dj(n,100-Ij);i=Bj(i,Ij);var a=n/100+1;var o=i/100;var s=Qj(a*Mj(r))/r,u=Lj(t)/Lj(s*Vj),l=e/Gj,c=tL(o*Lj(t/2)/Lj(e/2)),f=c/tL(l*u*s),h=1/(c*tL(l*u*s));return RV(f,h,u,s,l)}function TV(){var e=65*Zj,n=60*Zj,i=20,r=200,a=zz(MV),t=a(e,n,i,r);t.poleline=function(t){return arguments.length?a(e=+t*Zj,n,i,r):e*Xj};t.parallels=function(t){return arguments.length?a(e,n=+t*Zj,i,r):n*Xj};t.inflation=function(t){return arguments.length?a(e,n,i=+t,r):i};t.ratio=function(t){return arguments.length?a(e,n,i,r=+t):r};return t.scale(163.775)}function PV(){return TV().poleline(65).parallels(60).inflation(0).ratio(200).scale(172.633)}var OV=4*Gj+3*tL(3),BV=2*tL(2*Gj*tL(3)/OV);var DV=RL(BV*tL(3)/Gj,BV,OV/6);function NV(){return Nz(DV).scale(176.84)}function zV(t,e){return[t*tL(1-3*e*e/(Gj*Gj)),e]}zV.invert=function(t,e){return[t/tL(1-3*e*e/(Gj*Gj)),e]};function jV(){return Nz(zV).scale(152.63)}function LV(t,e){var n=Mj(e),i=Mj(t)*n,r=1-i,a=Mj(t=Rj(Lj(t)*n,-Lj(e))),o=Lj(t);n=tL(1-i*i);return[o*n-a*r,-a*n-o*r]}LV.invert=function(t,e){var n=(t*t+e*e)/-2,i=tL(-n*(2+n)),r=e*n+t*i,a=t*n-e*i,o=tL(a*a+r*r);return[Rj(i*r,o*(1+n)),o?-Jj(i*a/o):0]};function FV(){return Nz(LV).rotate([0,-90,45]).scale(124.75).clipAngle(180-.001)}function IV(t,e){var n=uL(t,e);return[(n[0]+t/Vj)/2,(n[1]+e)/2]}IV.invert=function(t,e){var n=t,i=e,r=25;do{var a=Mj(i),o=Lj(i),s=Lj(2*i),u=o*o,l=a*a,c=Lj(n),f=Mj(n/2),h=Lj(n/2),d=h*h,g=1-l*f*f,p=g?Qj(a*f)*tL(v=1/g):v=0,v,m=.5*(2*p*a*h+n/Vj)-t,y=.5*(p*o+i)-e,_=.5*v*(l*d+p*a*f*u)+.5/Vj,b=v*(c*s/4-p*o*h),w=.125*v*(s*h-p*o*l*c),x=.5*v*(u*f+p*d*a)+.5,k=b*w-x*_,S=(y*b-m*x)/k,C=(m*w-y*_)/k;n-=S,i-=C}while((Ej(S)>Ij||Ej(C)>Ij)&&--r>0);return[n,i]};function HV(){return Nz(IV).scale(158.837)}var GV=Object.freeze({__proto__:null,geoAiry:sL,geoAiryRaw:oL,geoAitoff:lL,geoAitoffRaw:uL,geoArmadillo:fL,geoArmadilloRaw:cL,geoAugust:dL,geoAugustRaw:hL,geoBaker:mL,geoBakerRaw:vL,geoBerghaus:_L,geoBerghausRaw:yL,geoBertin1953:EL,geoBertin1953Raw:CL,geoBoggs:DL,geoBoggsRaw:BL,geoBonne:FL,geoBonneRaw:LL,geoBottomley:HL,geoBottomleyRaw:IL,geoBromley:VL,geoBromleyRaw:GL,geoChamberlin:ZL,geoChamberlinRaw:KL,geoChamberlinAfrica:XL,geoCollignon:JL,geoCollignonRaw:$L,geoCraig:tF,geoCraigRaw:QL,geoCraster:iF,geoCrasterRaw:nF,geoCylindricalEqualArea:aF,geoCylindricalEqualAreaRaw:rF,geoCylindricalStereographic:sF,geoCylindricalStereographicRaw:oF,geoEckert1:lF,geoEckert1Raw:uF,geoEckert2:fF,geoEckert2Raw:cF,geoEckert3:dF,geoEckert3Raw:hF,geoEckert4:pF,geoEckert4Raw:gF,geoEckert5:mF,geoEckert5Raw:vF,geoEckert6:_F,geoEckert6Raw:yF,geoEisenlohr:xF,geoEisenlohrRaw:wF,geoFahey:CF,geoFaheyRaw:SF,geoFoucaut:AF,geoFoucautRaw:EF,geoFoucautSinusoidal:MF,geoFoucautSinusoidalRaw:RF,geoGilbert:OF,geoGingery:zF,geoGingeryRaw:BF,geoGinzburg4:FF,geoGinzburg4Raw:LF,geoGinzburg5:HF,geoGinzburg5Raw:IF,geoGinzburg6:VF,geoGinzburg6Raw:GF,geoGinzburg8:WF,geoGinzburg8Raw:UF,geoGinzburg9:KF,geoGinzburg9Raw:qF,geoGringorten:JF,geoGringortenRaw:XF,geoGuyou:oI,geoGuyouRaw:iI,geoHammer:xL,geoHammerRaw:bL,geoHammerRetroazimuthal:lI,geoHammerRetroazimuthalRaw:sI,geoHealpix:yI,geoHealpixRaw:dI,geoHill:bI,geoHillRaw:_I,geoHomolosine:EI,geoHomolosineRaw:CI,geoHufnagel:RI,geoHufnagelRaw:AI,geoHyperelliptical:OI,geoHyperellipticalRaw:PI,geoInterrupt:zI,geoInterruptedBoggs:LI,geoInterruptedHomolosine:II,geoInterruptedMollweide:GI,geoInterruptedMollweideHemispheres:UI,geoInterruptedSinuMollweide:qI,geoInterruptedSinusoidal:YI,geoKavrayskiy7:ZI,geoKavrayskiy7Raw:XI,geoLagrange:JI,geoLagrangeRaw:$I,geoLarrivee:eH,geoLarriveeRaw:tH,geoLaskowski:iH,geoLaskowskiRaw:nH,geoLittrow:aH,geoLittrowRaw:rH,geoLoximuthal:sH,geoLoximuthalRaw:oH,geoMiller:lH,geoMillerRaw:uH,geoModifiedStereographic:wH,geoModifiedStereographicRaw:cH,geoModifiedStereographicAlaska:vH,geoModifiedStereographicGs48:mH,geoModifiedStereographicGs50:yH,geoModifiedStereographicMiller:_H,geoModifiedStereographicLee:bH,geoMollweide:TL,geoMollweideRaw:ML,geoMtFlatPolarParabolic:CH,geoMtFlatPolarParabolicRaw:SH,geoMtFlatPolarQuartic:AH,geoMtFlatPolarQuarticRaw:EH,geoMtFlatPolarSinusoidal:MH,geoMtFlatPolarSinusoidalRaw:RH,geoNaturalEarth:yj,geoNaturalEarthRaw:mj,geoNaturalEarth2:PH,geoNaturalEarth2Raw:TH,geoNellHammer:BH,geoNellHammerRaw:OH,geoInterruptedQuarticAuthalic:NH,geoNicolosi:jH,geoNicolosiRaw:zH,geoPatterson:YH,geoPattersonRaw:KH,geoPolyconic:ZH,geoPolyconicRaw:XH,geoPolyhedral:iG,geoPolyhedralButterfly:fG,geoPolyhedralCollignon:gG,geoPolyhedralWaterman:pG,geoProject:kG,geoGringortenQuincuncial:DG,geoPeirceQuincuncial:NG,geoPierceQuincuncial:NG,geoQuantize:zG,geoQuincuncial:BG,geoRectangularPolyconic:LG,geoRectangularPolyconicRaw:jG,geoRobinson:HG,geoRobinsonRaw:IG,geoSatellite:UG,geoSatelliteRaw:VG,geoSinuMollweide:SI,geoSinuMollweideRaw:kI,geoSinusoidal:jL,geoSinusoidalRaw:zL,geoStitch:cV,geoTimes:hV,geoTimesRaw:fV,geoTwoPointAzimuthal:vV,geoTwoPointAzimuthalRaw:gV,geoTwoPointAzimuthalUsa:pV,geoTwoPointEquidistant:_V,geoTwoPointEquidistantRaw:mV,geoTwoPointEquidistantUsa:yV,geoVanDerGrinten:wV,geoVanDerGrintenRaw:bV,geoVanDerGrinten2:kV,geoVanDerGrinten2Raw:xV,geoVanDerGrinten3:CV,geoVanDerGrinten3Raw:SV,geoVanDerGrinten4:AV,geoVanDerGrinten4Raw:EV,geoWagner:TV,geoWagner7:PV,geoWagnerRaw:MV,geoWagner4:NV,geoWagner4Raw:DV,geoWagner6:jV,geoWagner6Raw:zV,geoWiechel:FV,geoWiechelRaw:LV,geoWinkel3:HV,geoWinkel3Raw:IV});var VV=1e-6;function UV(){}var WV=Infinity,qV=WV,KV=-WV,YV=KV;var XV={point:ZV,lineStart:UV,lineEnd:UV,polygonStart:UV,polygonEnd:UV,result:function t(){var e=[[WV,qV],[KV,YV]];KV=YV=-(qV=WV=Infinity);return e}};function ZV(t,e){if(tKV)KV=t;if(eYV)YV=e}function $V(t,e,n){var i=e[1][0]-e[0][0],r=e[1][1]-e[0][1],a=t.clipExtent&&t.clipExtent();t.scale(150).translate([0,0]);if(a!=null)t.clipExtent(null);XO(n,t.stream(XV));var o=XV.result(),s=Math.min(i/(o[1][0]-o[0][0]),r/(o[1][1]-o[0][1])),u=+e[0][0]+(i-s*(o[1][0]+o[0][0]))/2,l=+e[0][1]+(r-s*(o[1][1]+o[0][1]))/2;if(a!=null)t.clipExtent(a);return t.scale(s*150).translate([u,l])}function JV(t,e,n){return $V(t,[[0,0],e],n)}function QV(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=.12&&r<.234&&i>=-.425&&i<-.214?a:r>=.166&&r<.234&&i>=-.214&&i<-.115?s:l).invert(t)};f.stream=function(t){return e&&n===t?e:e=QV([l.stream(n=t),a.stream(t),s.stream(t)])};f.precision=function(t){if(!arguments.length)return l.precision();l.precision(t),a.precision(t),s.precision(t);return h()};f.scale=function(t){if(!arguments.length)return l.scale();l.scale(t),a.scale(t*.35),s.scale(t);return f.translate(l.translate())};f.translate=function(t){if(!arguments.length)return l.translate();var e=l.scale(),n=+t[0],i=+t[1];r=l.translate(t).clipExtent([[n-.455*e,i-.238*e],[n+.455*e,i+.238*e]]).stream(c);o=a.translate([n-.307*e,i+.201*e]).clipExtent([[n-.425*e+VV,i+.12*e+VV],[n-.214*e-VV,i+.234*e-VV]]).stream(c);u=s.translate([n-.205*e,i+.212*e]).clipExtent([[n-.214*e+VV,i+.166*e+VV],[n-.115*e-VV,i+.234*e-VV]]).stream(c);return h()};f.fitExtent=function(t,e){return $V(f,t,e)};f.fitSize=function(t,e){return JV(f,t,e)};function h(){e=n=null;return f}f.drawCompositionBorders=function(t){var e=l([-102.91,26.3]);var n=l([-104,27.5]);var i=l([-108,29.1]);var r=l([-110,29.1]);var a=l([-110,26.7]);var o=l([-112.8,27.6]);var s=l([-114.3,30.6]);var u=l([-119.3,30.1]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.moveTo(a[0],a[1]);t.lineTo(o[0],o[1]);t.lineTo(s[0],s[1]);t.lineTo(u[0],u[1])};f.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return f.scale(1070)}function eU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=.12&&r<.234&&i>=-.425&&i<-.214?a:r>=.166&&r<.234&&i>=-.214&&i<-.115?s:r>=.2064&&r<.2413&&i>=.312&&i<.385?l:r>=.09&&r<.1197&&i>=-.4243&&i<-.3232?f:r>=-.0518&&r<.0895&&i>=-.4243&&i<-.3824?d:w).invert(t)};v.stream=function(t){return e&&n===t?e:e=eU([w.stream(n=t),a.stream(t),s.stream(t),l.stream(t),f.stream(t),d.stream(t)])};v.precision=function(t){if(!arguments.length){return w.precision()}w.precision(t);a.precision(t);s.precision(t);l.precision(t);f.precision(t);d.precision(t);return m()};v.scale=function(t){if(!arguments.length){return w.scale()}w.scale(t);a.scale(t*.35);s.scale(t);l.scale(t);f.scale(t*2);d.scale(t);return v.translate(w.translate())};v.translate=function(t){if(!arguments.length){return w.translate()}var e=w.scale(),n=+t[0],i=+t[1];r=w.translate(t).clipExtent([[n-.455*e,i-.238*e],[n+.455*e,i+.238*e]]).stream(p);o=a.translate([n-.307*e,i+.201*e]).clipExtent([[n-.425*e+VV,i+.12*e+VV],[n-.214*e-VV,i+.233*e-VV]]).stream(p);u=s.translate([n-.205*e,i+.212*e]).clipExtent([[n-.214*e+VV,i+.166*e+VV],[n-.115*e-VV,i+.233*e-VV]]).stream(p);c=l.translate([n+.35*e,i+.224*e]).clipExtent([[n+.312*e+VV,i+.2064*e+VV],[n+.385*e-VV,i+.233*e-VV]]).stream(p);h=f.translate([n-.492*e,i+.09*e]).clipExtent([[n-.4243*e+VV,i+.0903*e+VV],[n-.3233*e-VV,i+.1197*e-VV]]).stream(p);g=d.translate([n-.408*e,i+.018*e]).clipExtent([[n-.4244*e+VV,i-.0519*e+VV],[n-.3824*e-VV,i+.0895*e-VV]]).stream(p);return m()};v.fitExtent=function(t,e){return $V(v,t,e)};v.fitSize=function(t,e){return JV(v,t,e)};function m(){e=n=null;return v}v.drawCompositionBorders=function(t){var e=w([-110.4641,28.2805]);var n=w([-104.0597,28.9528]);var i=w([-103.7049,25.1031]);var r=w([-109.8337,24.4531]);var a=w([-124.4745,28.1407]);var o=w([-110.931,30.8844]);var s=w([-109.8337,24.4531]);var u=w([-122.4628,21.8562]);var l=w([-76.8579,25.1544]);var c=w([-72.429,24.2097]);var f=w([-72.8265,22.7056]);var h=w([-77.1852,23.6392]);var d=w([-125.0093,29.7791]);var g=w([-118.5193,31.3262]);var p=w([-118.064,29.6912]);var v=w([-124.4369,28.169]);var m=w([-128.1314,37.4582]);var y=w([-125.2132,38.214]);var _=w([-122.3616,30.5115]);var b=w([-125.0315,29.8211]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();t.moveTo(a[0],a[1]);t.lineTo(o[0],o[1]);t.lineTo(s[0],s[1]);t.lineTo(s[0],s[1]);t.lineTo(u[0],u[1]);t.closePath();t.moveTo(l[0],l[1]);t.lineTo(c[0],c[1]);t.lineTo(f[0],f[1]);t.lineTo(f[0],f[1]);t.lineTo(h[0],h[1]);t.closePath();t.moveTo(d[0],d[1]);t.lineTo(g[0],g[1]);t.lineTo(p[0],p[1]);t.lineTo(p[0],p[1]);t.lineTo(v[0],v[1]);t.closePath();t.moveTo(m[0],m[1]);t.lineTo(y[0],y[1]);t.lineTo(_[0],_[1]);t.lineTo(_[0],_[1]);t.lineTo(b[0],b[1]);t.closePath()};v.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return v.scale(1070)}function iU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=.05346&&r<.0897&&i>=-.13388&&i<-.0322?o:a).invert(t)};l.stream=function(t){return e&&n===t?e:e=iU([a.stream(n=t),o.stream(t)])};l.precision=function(t){if(!arguments.length){return a.precision()}a.precision(t);o.precision(t);return c()};l.scale=function(t){if(!arguments.length){return a.scale()}a.scale(t);o.scale(t);return l.translate(a.translate())};l.translate=function(t){if(!arguments.length){return a.translate()}var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.06857*e,i-.1288*e],[n+.13249*e,i+.06*e]]).stream(u);s=o.translate([n+.1*e,i-.094*e]).clipExtent([[n-.1331*e+VV,i+.053457*e+VV],[n-.0354*e-VV,i+.08969*e-VV]]).stream(u);return c()};l.fitExtent=function(t,e){return $V(l,t,e)};l.fitSize=function(t,e){return JV(l,t,e)};function c(){e=n=null;return l}l.drawCompositionBorders=function(t){var e=a([-14.034675,34.965007]);var n=a([-7.4208899,35.536988]);var i=a([-7.3148275,33.54359]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1])};l.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return l.scale(2700)}function aU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=.0093&&r<.03678&&i>=-.03875&&i<-.0116?a:r>=-.0412&&r<.0091&&i>=-.07782&&i<-.01166?s:l).invert(t)};f.stream=function(t){return e&&n===t?e:e=aU([l.stream(n=t),a.stream(t),s.stream(t)])};f.precision=function(t){if(!arguments.length){return l.precision()}l.precision(t);a.precision(t);s.precision(t);return h()};f.scale=function(t){if(!arguments.length){return l.scale()}l.scale(t);a.scale(t);s.scale(t*.6);return f.translate(l.translate())};f.translate=function(t){if(!arguments.length){return l.translate()}var e=l.scale(),n=+t[0],i=+t[1];r=l.translate(t).clipExtent([[n-.0115*e,i-.1138*e],[n+.2105*e,i+.0673*e]]).stream(c);o=a.translate([n-.0265*e,i+.025*e]).clipExtent([[n-.0388*e+VV,i+.0093*e+VV],[n-.0116*e-VV,i+.0368*e-VV]]).stream(c);u=s.translate([n-.045*e,i+-.02*e]).clipExtent([[n-.0778*e+VV,i-.0413*e+VV],[n-.0117*e-VV,i+.0091*e-VV]]).stream(c);return h()};f.fitExtent=function(t,e){return $V(f,t,e)};f.fitSize=function(t,e){return JV(f,t,e)};function h(){e=n=null;return f}f.drawCompositionBorders=function(t){var e=l([-12.8351,38.7113]);var n=l([-10.8482,38.7633]);var i=l([-10.8181,37.2072]);var r=l([-12.7345,37.1573]);var a=l([-16.0753,41.4436]);var o=l([-10.9168,41.6861]);var s=l([-10.8557,38.7747]);var u=l([-15.6728,38.5505]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();t.moveTo(a[0],a[1]);t.lineTo(o[0],o[1]);t.lineTo(s[0],s[1]);t.lineTo(s[0],s[1]);t.lineTo(u[0],u[1]);t.closePath()};f.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return f.scale(4200)}function sU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=-.0676&&r<-.026&&i>=-.0857&&i<-.0263?o:a).invert(t)};l.stream=function(t){return e&&n===t?e:e=sU([a.stream(n=t),o.stream(t)])};l.precision=function(t){if(!arguments.length){return a.precision()}a.precision(t);o.precision(t);return c()};l.scale=function(t){if(!arguments.length){return a.scale()}a.scale(t);o.scale(t);return l.translate(a.translate())};l.translate=function(t){if(!arguments.length){return a.translate()}var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.0262*e,i-.0734*e],[n+.1741*e,i+.079*e]]).stream(u);s=o.translate([n-.06*e,i-.04*e]).clipExtent([[n-.0857*e+VV,i-.0676*e+VV],[n-.0263*e-VV,i-.026*e-VV]]).stream(u);return c()};l.fitExtent=function(t,e){return $V(l,t,e)};l.fitSize=function(t,e){return JV(l,t,e)};function c(){e=n=null;return l}l.drawCompositionBorders=function(t){var e=a([-84.9032,2.3757]);var n=a([-81.5047,2.3708]);var i=a([-81.5063,-.01]);var r=a([-84.9086,-.005]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath()};l.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return l.scale(3500)}function lU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=.2582&&r<.32&&i>=-.1036&&i<-.087?a:r>=-.01298&&r<.0133&&i>=-.11396&&i<-.05944?s:r>=.01539&&r<.03911&&i>=-.089&&i<-.0588?l:d).invert(t)};h.stream=function(t){return e&&n===t?e:e=lU([d.stream(n=t),a.stream(t),s.stream(t),l.stream(t)])};h.precision=function(t){if(!arguments.length){return d.precision()}d.precision(t);a.precision(t);s.precision(t);l.precision(t);return g()};h.scale=function(t){if(!arguments.length){return d.scale()}d.scale(t);a.scale(t*.15);s.scale(t*1.5);l.scale(t*1.5);return h.translate(d.translate())};h.translate=function(t){if(!arguments.length){return d.translate()}var e=d.scale(),n=+t[0],i=+t[1];r=d.translate(t).clipExtent([[n-.059*e,i-.3835*e],[n+.4498*e,i+.3375*e]]).stream(f);o=a.translate([n-.087*e,i+.17*e]).clipExtent([[n-.1166*e+VV,i+.2582*e+VV],[n-.06*e-VV,i+.32*e-VV]]).stream(f);u=s.translate([n-.092*e,i-0*e]).clipExtent([[n-.114*e+VV,i-.013*e+VV],[n-.0594*e-VV,i+.0133*e-VV]]).stream(f);c=l.translate([n-.089*e,i-.0265*e]).clipExtent([[n-.089*e+VV,i+.0154*e+VV],[n-.0588*e-VV,i+.0391*e-VV]]).stream(f);return g()};h.fitExtent=function(t,e){return $V(h,t,e)};h.fitSize=function(t,e){return JV(h,t,e)};function g(){e=n=null;return h}h.drawCompositionBorders=function(t){var e=d([-82.6999,-51.3043]);var n=d([-77.5442,-51.6631]);var i=d([-78.0254,-55.186]);var r=d([-83.6106,-54.7785]);var a=d([-80.0638,-35.984]);var o=d([-76.2153,-36.1811]);var s=d([-76.2994,-37.6839]);var u=d([-80.2231,-37.4757]);var l=d([-78.442,-37.706]);var c=d([-76.263,-37.8054]);var f=d([-76.344,-39.1595]);var h=d([-78.5638,-39.0559]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();t.moveTo(a[0],a[1]);t.lineTo(o[0],o[1]);t.lineTo(s[0],s[1]);t.lineTo(s[0],s[1]);t.lineTo(u[0],u[1]);t.closePath();t.moveTo(l[0],l[1]);t.lineTo(c[0],c[1]);t.lineTo(f[0],f[1]);t.lineTo(f[0],f[1]);t.lineTo(h[0],h[1]);t.closePath()};h.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return h.scale(700)}function fU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=-.10925&&r<-.02701&&i>=-.135&&i<-.0397?a:r>=.04713&&r<.11138&&i>=-.03986&&i<.051?s:l).invert(t)};f.stream=function(t){return e&&n===t?e:e=fU([l.stream(n=t),a.stream(t),s.stream(t)])};f.precision=function(t){if(!arguments.length){return l.precision()}l.precision(t);a.precision(t);s.precision(t);return h()};f.scale=function(t){if(!arguments.length){return l.scale()}l.scale(t);a.scale(t);s.scale(t*.7);return f.translate(l.translate())};f.translate=function(t){if(!arguments.length){return l.translate()}var e=l.scale(),n=+t[0],i=+t[1];r=l.translate(t).clipExtent([[n-.1352*e,i-.1091*e],[n+.117*e,i+.098*e]]).stream(c);o=a.translate([n-.0425*e,i-.005*e]).clipExtent([[n-.135*e+VV,i-.1093*e+VV],[n-.0397*e-VV,i-.027*e-VV]]).stream(c);u=s.translate(t).clipExtent([[n-.0399*e+VV,i+.0471*e+VV],[n+.051*e-VV,i+.1114*e-VV]]).stream(c);return h()};f.fitExtent=function(t,e){return $V(f,t,e)};f.fitSize=function(t,e){return JV(f,t,e)};function h(){e=n=null;return f}f.drawCompositionBorders=function(t){var e=l([126.01320483689143,41.621090310215585]);var n=l([133.04304387025903,42.15087523707186]);var i=l([133.3021766080688,37.43975444725098]);var r=l([126.87889168628224,36.95488945159779]);var a=l([132.9,29.8]);var o=l([134,33]);var s=l([139.3,33.2]);var u=l([139.16,30.5]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();t.moveTo(a[0],a[1]);t.lineTo(o[0],o[1]);t.lineTo(s[0],s[1]);t.lineTo(u[0],u[1])};f.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return f.scale(2200)}function dU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=.029&&r<.0864&&i>=-.14&&i<-.0996?o:r>=0&&r<.029&&i>=-.14&&i<-.0996?u:r>=-.032&&r<0&&i>=-.14&&i<-.0996?c:r>=-.052&&r<-.032&&i>=-.14&&i<-.0996?h:r>=-.076&&r<.052&&i>=-.14&&i<-.0996?g:r>=-.076&&r<-.052&&i>=.0967&&i<.1371?v:r>=-.052&&r<-.02&&i>=.0967&&i<.1371?y:r>=-.02&&r<.012&&i>=.0967&&i<.1371?b:r>=.012&&r<.033&&i>=.0967&&i<.1371?x:r>=.033&&r<.0864&&i>=.0967&&i<.1371?S:a).invert(t)};M.stream=function(t){return e&&n===t?e:e=dU([a.stream(n=t),o.stream(t),u.stream(t),c.stream(t),h.stream(t),g.stream(t),v.stream(t),y.stream(t),b.stream(t),x.stream(t),S.stream(t),E.stream(t)])};M.precision=function(t){if(!arguments.length){return a.precision()}a.precision(t);o.precision(t);u.precision(t);c.precision(t);h.precision(t);g.precision(t);v.precision(t);y.precision(t);b.precision(t);x.precision(t);S.precision(t);E.precision(t);return T()};M.scale=function(t){if(!arguments.length){return a.scale()}a.scale(t);o.scale(t*.6);u.scale(t*1.6);c.scale(t*1.4);h.scale(t*5);g.scale(t*1.3);v.scale(t*1.6);y.scale(t*1.2);b.scale(t*.3);x.scale(t*2.7);S.scale(t*.5);E.scale(t*.06);return M.translate(a.translate())};M.translate=function(t){if(!arguments.length){return a.translate()}var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.0996*e,i-.0908*e],[n+.0967*e,i+.0864*e]]).stream(R);s=o.translate([n-.12*e,i+.0575*e]).clipExtent([[n-.14*e+VV,i+.029*e+VV],[n-.0996*e-VV,i+.0864*e-VV]]).stream(R);l=u.translate([n-.12*e,i+.013*e]).clipExtent([[n-.14*e+VV,i+0*e+VV],[n-.0996*e-VV,i+.029*e-VV]]).stream(R);f=c.translate([n-.12*e,i-.014*e]).clipExtent([[n-.14*e+VV,i-.032*e+VV],[n-.0996*e-VV,i+0*e-VV]]).stream(R);d=h.translate([n-.12*e,i-.044*e]).clipExtent([[n-.14*e+VV,i-.052*e+VV],[n-.0996*e-VV,i-.032*e-VV]]).stream(R);p=g.translate([n-.12*e,i-.065*e]).clipExtent([[n-.14*e+VV,i-.076*e+VV],[n-.0996*e-VV,i-.052*e-VV]]).stream(R);m=v.translate([n+.117*e,i-.064*e]).clipExtent([[n+.0967*e+VV,i-.076*e+VV],[n+.1371*e-VV,i-.052*e-VV]]).stream(R);_=y.translate([n+.116*e,i-.0355*e]).clipExtent([[n+.0967*e+VV,i-.052*e+VV],[n+.1371*e-VV,i-.02*e-VV]]).stream(R);w=b.translate([n+.116*e,i-.0048*e]).clipExtent([[n+.0967*e+VV,i-.02*e+VV],[n+.1371*e-VV,i+.012*e-VV]]).stream(R);k=x.translate([n+.116*e,i+.022*e]).clipExtent([[n+.0967*e+VV,i+.012*e+VV],[n+.1371*e-VV,i+.033*e-VV]]).stream(R);A=E.translate([n+.11*e,i+.045*e]).clipExtent([[n+.0967*e+VV,i+.033*e+VV],[n+.1371*e-VV,i+.06*e-VV]]).stream(R);C=S.translate([n+.115*e,i+.075*e]).clipExtent([[n+.0967*e+VV,i+.06*e+VV],[n+.1371*e-VV,i+.0864*e-VV]]).stream(R);return T()};M.fitExtent=function(t,e){return $V(M,t,e)};M.fitSize=function(t,e){return JV(M,t,e)};function T(){e=n=null;return M}M.drawCompositionBorders=function(t){var e,n,i,r;e=a([-7.938886725111036,43.7219460918835]);n=a([-4.832080896458295,44.12930268549372]);i=a([-4.205299743793263,40.98096346967365]);r=a([-7.071796453126152,40.610037319181444]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([-8.42751373617692,45.32889452553031]);n=a([-5.18599305777107,45.7566442062976]);i=a([-4.832080905154431,44.129302726751426]);r=a([-7.938886737126192,43.72194613263854]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([-9.012656899657046,47.127733821030176]);n=a([-5.6105244772793155,47.579777861410626]);i=a([-5.185993067168585,45.756644248170346]);r=a([-8.427513749141811,45.32889456686326]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([-9.405747558985553,48.26506375557457]);n=a([-5.896175018439575,48.733352850851624]);i=a([-5.610524487556043,47.57977790393761]);r=a([-9.012656913808351,47.127733862971255]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([-9.908436061346974,49.642448789505856]);n=a([-6.262026716233124,50.131426841787174]);i=a([-5.896175029331232,48.73335289377258]);r=a([-9.40574757396393,48.26506379787767]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([11.996907706504462,50.16039028163579]);n=a([15.649907879773343,49.68279246765253]);i=a([15.156712840526632,48.30371557625831]);r=a([11.64122661754411,48.761078240546816]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([11.641226606955788,48.7610781975889]);n=a([15.156712825832164,48.30371553390465]);i=a([14.549932166241172,46.4866532486199]);r=a([11.204443787952183,46.91899233914248]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([11.204443778297161,46.918992296823646]);n=a([14.549932152815039,46.486653206856396]);i=a([13.994409796764009,44.695833444323256]);r=a([10.805306599253848,45.105133870684924]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([10.805306590412085,45.10513382903308]);n=a([13.99440978444733,44.695833403183606]);i=a([13.654633799024392,43.53552468558152]);r=a([10.561516803980956,43.930671459798624]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([10.561516795617383,43.93067141859757]);n=a([13.654633787361952,43.5355246448671]);i=a([12.867691604239901,40.640701985019405]);r=a([9.997809515987688,41.00288343254471]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([10.8,42.4]);n=a([12.8,42.13]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1])};M.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return M.scale(2700)}function pU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=-.31&&r<-.24&&i>=.14&&i<.24?o:r>=-.24&&r<-.17&&i>=.14&&i<.24?u:r>=-.17&&r<-.12&&i>=.21&&i<.24?h:r>=-.17&&r<-.14&&i>=.14&&i<.165?g:r>=-.17&&r<-.1&&i>=.14&&i<.24?c:r>=-.1&&r<-.03&&i>=.14&&i<.24?v:r>=-.03&&r<.04&&i>=.14&&i<.24?y:r>=-.31&&r<-.24&&i>=.24&&i<.34?b:r>=-.24&&r<-.17&&i>=.24&&i<.34?x:r>=-.17&&r<-.1&&i>=.24&&i<.34?S:r>=-.1&&r<-.03&&i>=.24&&i<.34?E:a).invert(t)};M.stream=function(t){return e&&n===t?e:e=pU([a.stream(n=t),u.stream(t),b.stream(t),o.stream(t),y.stream(t),v.stream(t),x.stream(t),S.stream(t),E.stream(t),c.stream(t),h.stream(t),g.stream(t)])};M.precision=function(t){if(!arguments.length){return a.precision()}a.precision(t);u.precision(t);b.precision(t);o.precision(t);y.precision(t);v.precision(t);x.precision(t);S.precision(t);E.precision(t);c.precision(t);h.precision(t);g.precision(t);return T()};M.scale=function(t){if(!arguments.length){return a.scale()}a.scale(t);o.scale(t*3);u.scale(t*.8);b.scale(t*3.5);S.scale(t*2.7);c.scale(t*2);h.scale(t*2);g.scale(t*2);v.scale(t*3);y.scale(t);x.scale(t*5.5);E.scale(t*6);return M.translate(a.translate())};M.translate=function(t){if(!arguments.length){return a.translate()}var e=a.scale(),n=+t[0],i=+t[1];r=a.translate([n-.08*e,i]).clipExtent([[n-.51*e,i-.33*e],[n+.5*e,i+.33*e]]).stream(R);s=o.translate([n+.19*e,i-.275*e]).clipExtent([[n+.14*e+VV,i-.31*e+VV],[n+.24*e-VV,i-.24*e-VV]]).stream(R);l=u.translate([n+.19*e,i-.205*e]).clipExtent([[n+.14*e+VV,i-.24*e+VV],[n+.24*e-VV,i-.17*e-VV]]).stream(R);f=c.translate([n+.19*e,i-.135*e]).clipExtent([[n+.14*e+VV,i-.17*e+VV],[n+.24*e-VV,i-.1*e-VV]]).stream(R);d=h.translate([n+.225*e,i-.147*e]).clipExtent([[n+.21*e+VV,i-.17*e+VV],[n+.24*e-VV,i-.12*e-VV]]).stream(R);p=g.translate([n+.153*e,i-.15*e]).clipExtent([[n+.14*e+VV,i-.17*e+VV],[n+.165*e-VV,i-.14*e-VV]]).stream(R);m=v.translate([n+.19*e,i-.065*e]).clipExtent([[n+.14*e+VV,i-.1*e+VV],[n+.24*e-VV,i-.03*e-VV]]).stream(R);_=y.translate([n+.19*e,i+.005*e]).clipExtent([[n+.14*e+VV,i-.03*e+VV],[n+.24*e-VV,i+.04*e-VV]]).stream(R);w=b.translate([n+.29*e,i-.275*e]).clipExtent([[n+.24*e+VV,i-.31*e+VV],[n+.34*e-VV,i-.24*e-VV]]).stream(R);k=x.translate([n+.29*e,i-.205*e]).clipExtent([[n+.24*e+VV,i-.24*e+VV],[n+.34*e-VV,i-.17*e-VV]]).stream(R);C=S.translate([n+.29*e,i-.135*e]).clipExtent([[n+.24*e+VV,i-.17*e+VV],[n+.34*e-VV,i-.1*e-VV]]).stream(R);A=E.translate([n+.29*e,i-.065*e]).clipExtent([[n+.24*e+VV,i-.1*e+VV],[n+.34*e-VV,i-.03*e-VV]]).stream(R);return T()};M.fitExtent=function(t,e){return $V(M,t,e)};M.fitSize=function(t,e){return JV(M,t,e)};function T(){e=n=null;return M}M.drawCompositionBorders=function(t){var e,n,i,r;e=a([42.45755610828648,63.343658547914934]);n=a([52.65837266667029,59.35045080290929]);i=a([47.19754502247785,56.12653496548117]);r=a([37.673034273363044,59.61638268506111]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([59.41110754003403,62.35069727399336]);n=a([66.75050228640794,57.11797303636038]);i=a([60.236065725110436,54.63331433818992]);r=a([52.65837313153311,59.350450804599355]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([48.81091130080243,66.93353402634641]);n=a([59.41110730654679,62.35069740653086]);i=a([52.6583728974441,59.3504509222445]);r=a([42.45755631675751,63.34365868805821]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([31.054198418446475,52.1080673766184]);n=a([39.09869284884117,49.400700047190554]);i=a([36.0580811499175,46.02944174908498]);r=a([28.690508588835726,48.433126979386415]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([33.977877745912025,55.849945501331]);n=a([42.75328432167726,52.78455122462353]);i=a([39.09869297540224,49.400700176148625]);r=a([31.05419851807008,52.10806751810923]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([52.658372900759296,59.35045068526415]);n=a([60.23606549583304,54.63331423800264]);i=a([54.6756370953122,51.892298789399455]);r=a([47.19754524788189,56.126534861222794]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([47.19754506082455,56.126534735591456]);n=a([54.675636900123514,51.892298681337095]);i=a([49.94448648951486,48.98775484983285]);r=a([42.75328468716108,52.78455126060818]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([42.75328453416769,52.78455113209101]);n=a([49.94448632339758,48.98775473706457]);i=a([45.912339990394315,45.99361784987003]);r=a([39.09869317356607,49.40070009378711]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([37.673034114296634,59.61638254183119]);n=a([47.197544835420544,56.126534839849846]);i=a([42.75328447467064,52.78455135314068]);r=a([33.977877870363905,55.849945644671145]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([44.56748486446032,57.26489367845818]);i=a([43.9335791193588,53.746540942601726]);r=a([43,56]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([37.673034114296634,59.61638254183119]);n=a([40.25902691953466,58.83002044222639]);i=a([38.458270492742024,57.26232178028002]);r=a([35.97754948030156,58.00266637992386]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath()};M.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return M.scale(750)}function mU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=-.0521&&r<.0229&&i>=-.0111&&i<.1?o:a).invert(t)};l.stream=function(t){return e&&n===t?e:e=mU([a.stream(n=t),o.stream(t)])};l.precision=function(t){if(!arguments.length){return a.precision()}a.precision(t);o.precision(t);return c()};l.scale=function(t){if(!arguments.length){return a.scale()}a.scale(t);o.scale(t*.615);return l.translate(a.translate())};l.translate=function(t){if(!arguments.length){return a.translate()}var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.11*e,i-.0521*e],[n-.0111*e,i+.0521*e]]).stream(u);s=o.translate([n+.09*e,i-0*e]).clipExtent([[n-.0111*e+VV,i-.0521*e+VV],[n+.1*e-VV,i+.024*e-VV]]).stream(u);return c()};l.fitExtent=function(t,e){return $V(l,t,e)};l.fitSize=function(t,e){return JV(l,t,e)};function c(){e=n=null;return l}l.drawCompositionBorders=function(t){var e=a([106.3214,2.0228]);var n=a([105.1843,2.3761]);var i=a([104.2151,3.3618]);var r=a([104.215,4.5651]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1])};l.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return l.scale(4800)}function _U(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=-.02&&r<0&&i>=-.038&&i<-.005?o:r>=0&&r<.02&&i>=-.038&&i<-.005?u:a).invert(t)};f.stream=function(t){return e&&n===t?e:e=_U([a.stream(n=t),o.stream(t),u.stream(t)])};f.precision=function(t){if(!arguments.length){return a.precision()}a.precision(t);o.precision(t);u.precision(t);return h()};f.scale=function(t){if(!arguments.length){return a.scale()}a.scale(t);o.scale(t*1.5);u.scale(t*4);return f.translate(a.translate())};f.translate=function(t){if(!arguments.length){return a.translate()}var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.005*e,i-.02*e],[n+.038*e,i+.02*e]]).stream(c);s=o.translate([n-.025*e,i-.01*e]).clipExtent([[n-.038*e+VV,i-.02*e+VV],[n-.005*e-VV,i+0*e-VV]]).stream(c);l=u.translate([n-.025*e,i+.01*e]).clipExtent([[n-.038*e+VV,i-0*e+VV],[n-.005*e-VV,i+.02*e-VV]]).stream(c);return h()};f.fitExtent=function(t,e){return $V(f,t,e)};f.fitSize=function(t,e){return JV(f,t,e)};function h(){e=n=null;return f}f.drawCompositionBorders=function(t){var e,n,i,r;e=a([9.21327272751682,2.645820439454123]);n=a([11.679126293239872,2.644755519268689]);i=a([11.676845389029227,.35307824637606433]);r=a([9.213572917774014,.35414205204417754]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([7.320873711543669,2.64475551449975]);n=a([9.213272722738658,2.645820434679803]);i=a([9.213422896480349,1.4999812505283054]);r=a([7.322014760520787,1.4989168878985566]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath();e=a([7.3220147605302905,1.4989168783492766]);n=a([9.213422896481598,1.499981240979021]);i=a([9.213572912999604,.354142056817247]);r=a([7.323154615739809,.353078251154504]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath()};f.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return f.scale(12e3)}function wU(r){var a=r.length;return{point:function t(e,n){var i=-1;while(++i=-.089&&r<.06&&i>=.029&&i<.046?o:a).invert(t)};l.stream=function(t){return e&&n===t?e:e=wU([a.stream(n=t),o.stream(t)])};l.precision=function(t){if(!arguments.length)return a.precision();a.precision(t),o.precision(t);return c()};l.scale=function(t){if(!arguments.length)return a.scale();a.scale(t),o.scale(t);return l.translate(a.translate())};l.translate=function(t){if(!arguments.length)return a.translate();var e=a.scale(),n=+t[0],i=+t[1];r=a.translate(t).clipExtent([[n-.065*e,i-.089*e],[n+.075*e,i+.089*e]]).stream(u);s=o.translate([n+.01*e,i+.025*e]).clipExtent([[n+.029*e+VV,i-.089*e+VV],[n+.046*e-VV,i-.06*e-VV]]).stream(u);return c()};l.fitExtent=function(t,e){return $V(l,t,e)};l.fitSize=function(t,e){return JV(l,t,e)};function c(){e=n=null;return l}l.drawCompositionBorders=function(t){var e,n,i,r;e=a([-1.113205870242365,59.64920050773357]);n=a([.807899092399606,59.59085836472269]);i=a([.5778611961420386,57.93467822832577]);r=a([-1.25867782078448,57.99029450085142]);t.moveTo(e[0],e[1]);t.lineTo(n[0],n[1]);t.lineTo(i[0],i[1]);t.lineTo(r[0],r[1]);t.closePath()};l.getCompositionBorders=function(){var t=Iw();this.drawCompositionBorders(t);return t.toString()};return l.scale(2800)}var kU=Object.freeze({__proto__:null,geoAlbersUsa:tU,geoAlbersUsaTerritories:nU,geoConicConformalSpain:rU,geoConicConformalPortugal:oU,geoMercatorEcuador:uU,geoTransverseMercatorChile:cU,geoConicEquidistantJapan:hU,geoConicConformalFrance:gU,geoConicConformalEurope:vU,geoMercatorMalaysia:yU,geoMercatorEquatorialGuinea:bU,geoAlbersUk:xU});function SU(t){return t.k}function CU(t){return[t.x,t.y]}function EU(t){return function(){return t}}function AU(){var g=0,p=0,v=960,m=500;var y=true,_=true;var b=256;var w=SU;var x=CU;var k=0;function e(){var t=+w.apply(this,arguments);var e=x.apply(this,arguments);var n=Math.log2(t/b);var i=Math.round(Math.max(n+k,0));var r=Math.pow(2,n-i)*b;var a=+e[0]-t/2;var o=+e[1]-t/2;var s=Math.max(y?0:-Infinity,Math.floor((g-a)/r));var u=Math.min(y?1<1&&arguments[1]!==undefined?arguments[1]:"data";return e.reduce(function(t,e){var n=[];if(Array.isArray(e)){n=e}else{if(e[i]){n=e[i]}else{console.warn('d3plus-viz: Please implement a "dataFormat" callback to concat the arrays manually (consider using the d3plus.dataConcat method in your callback). Currently unable to concatenate (using key: "'.concat(i,'") the following response:'),e)}}return t.concat(n)},[])};var NU=function t(e){var n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"data";var r=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"headers";return e[n].map(function(i){return e[r].reduce(function(t,e,n){return t[e]=i[n],t},{})})};function zU(r,t){var a,o=es("beforesend","progress","load","error"),s,u=Le(),l=new XMLHttpRequest,c=null,f=null,i,h,d=0;if(typeof XDomainRequest!=="undefined"&&!("withCredentials"in l)&&/^(http(s)?:)?\/\//.test(r))l=new XDomainRequest;"onload"in l?l.onload=l.onerror=l.ontimeout=e:l.onreadystatechange=function(t){l.readyState>3&&e(t)};function e(t){var e=l.status,n;if(!e&&LU(l)||e>=200&&e<300||e===304){if(i){try{n=i.call(a,l)}catch(t){o.call("error",a,t);return}}else{n=l}o.call("load",a,n)}else{o.call("error",a,t)}}l.onprogress=function(t){o.call("progress",a,t)};a={header:function t(e,n){e=(e+"").toLowerCase();if(arguments.length<2)return u.get(e);if(n==null)u.remove(e);else u.set(e,n+"");return a},mimeType:function t(e){if(!arguments.length)return s;s=e==null?null:e+"";return a},responseType:function t(e){if(!arguments.length)return h;h=e;return a},timeout:function t(e){if(!arguments.length)return d;d=+e;return a},user:function t(e){return arguments.length<1?c:(c=e==null?null:e+"",a)},password:function t(e){return arguments.length<1?f:(f=e==null?null:e+"",a)},response:function t(e){i=e;return a},get:function t(e,n){return a.send("GET",e,n)},post:function t(e,n){return a.send("POST",e,n)},send:function t(e,n,i){l.open(e,r,true,c,f);if(s!=null&&!u.has("accept"))u.set("accept",s+",*/*");if(l.setRequestHeader)u.each(function(t,e){l.setRequestHeader(e,t)});if(s!=null&&l.overrideMimeType)l.overrideMimeType(s);if(h!=null)l.responseType=h;if(d>0)l.timeout=d;if(i==null&&typeof n==="function")i=n,n=null;if(i!=null&&i.length===1)i=jU(i);if(i!=null)a.on("error",i).on("load",function(t){i(null,t)});o.call("beforesend",a,l);l.send(n==null?null:n);return a},abort:function t(){l.abort();return a},on:function t(){var e=o.on.apply(o,arguments);return e===o?a:e}};if(t!=null){if(typeof t!=="function")throw new Error("invalid callback: "+t);return a.get(t)}return a}function jU(n){return function(t,e){n(t==null?e:null)}}function LU(t){var e=t.responseType;return e&&e!=="text"?t.response:t.responseText}function FU(i,r){return function(t,e){var n=zU(t).mimeType(i).response(r);if(e!=null){if(typeof e!=="function")throw new Error("invalid callback: "+e);return n.get(e)}return n}}var IU=FU("application/json",function(t){return JSON.parse(t.responseText)});var HU=FU("text/plain",function(t){return t.responseText});var GU={},VU={},UU=34,WU=10,qU=13;function KU(t){return new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+'] || ""'}).join(",")+"}")}function YU(n,i){var r=KU(n);return function(t,e){return i(r(t),e,n)}}function XU(t){var n=Object.create(null),i=[];t.forEach(function(t){for(var e in t){if(!(e in n)){i.push(n[e]=e)}}});return i}function ZU(t,e){var n=t+"",i=n.length;return i9999?"+"+ZU(t,6):ZU(t,4)}function JU(t){var e=t.getUTCHours(),n=t.getUTCMinutes(),i=t.getUTCSeconds(),r=t.getUTCMilliseconds();return isNaN(t)?"Invalid Date":$U(t.getUTCFullYear())+"-"+ZU(t.getUTCMonth()+1,2)+"-"+ZU(t.getUTCDate(),2)+(r?"T"+ZU(e,2)+":"+ZU(n,2)+":"+ZU(i,2)+"."+ZU(r,3)+"Z":i?"T"+ZU(e,2)+":"+ZU(n,2)+":"+ZU(i,2)+"Z":n||e?"T"+ZU(e,2)+":"+ZU(n,2)+"Z":"")}function QU(i){var e=new RegExp('["'+i+"\n\r]"),f=i.charCodeAt(0);function t(t,n){var i,r,e=a(t,function(t,e){if(i)return i(t,e-1);r=t,i=n?YU(t,n):KU(t)});e.columns=r||[];return e}function a(i,t){var e=[],r=i.length,a=0,n=0,o,s=r<=0,u=false;if(i.charCodeAt(r-1)===WU)--r;if(i.charCodeAt(r-1)===qU)--r;function l(){if(s)return VU;if(u)return u=false,GU;var t,e=a,n;if(i.charCodeAt(e)===UU){while(a++=r)s=true;else if((n=i.charCodeAt(a++))===WU)u=true;else if(n===qU){u=true;if(i.charCodeAt(a)===WU)++a}return i.slice(e+1,t-1).replace(/""/g,'"')}while(aMath.abs(t[1]-R[1]))C=true;else S=true}R=t;x=true;dW();D()}function D(){var t;b=R[0]-A[0];w=R[1]-A[1];switch(i){case pW:case gW:{if(r)b=Math.max(u-l,Math.min(g-p,b)),c=l+b,v=p+b;if(a)w=Math.max(f-h,Math.min(m-y,w)),d=h+w,_=y+w;break}case vW:{if(r<0)b=Math.max(u-l,Math.min(g-l,b)),c=l+b,v=p;else if(r>0)b=Math.max(u-p,Math.min(g-p,b)),c=l,v=p+b;if(a<0)w=Math.max(f-h,Math.min(m-h,w)),d=h+w,_=y;else if(a>0)w=Math.max(f-y,Math.min(m-y,w)),d=h,_=y+w;break}case mW:{if(r)c=Math.max(u,Math.min(g,l-b*r)),v=Math.max(u,Math.min(g,p+b*r));if(a)d=Math.max(f,Math.min(m,h-w*a)),_=Math.max(f,Math.min(m,y+w*a));break}}if(v0)l=c-b;if(a<0)y=_-w;else if(a>0)h=d-w;i=pW;P.attr("cursor",SW.selection);D()}break}default:return}dW()}function j(){switch(Oo.keyCode){case 16:{if(k){S=C=k=false;D()}break}case 18:{if(i===mW){if(r<0)p=v;else if(r>0)l=c;if(a<0)y=_;else if(a>0)h=d;i=vW;D()}break}case 32:{if(i===pW){if(Oo.altKey){if(r)p=v-b*r,l=c+b*r;if(a)y=_-w*a,h=d+w*a;i=mW}else{if(r<0)p=v;else if(r>0)l=c;if(a<0)y=_;else if(a>0)h=d;i=vW}P.attr("cursor",SW[n]);D()}break}default:return}dW()}}function u(){V(this,arguments).moved()}function l(){V(this,arguments).ended()}function c(){var t=this.__brush||{selection:null};t.extent=_W(e.apply(this,arguments));t.dim=L;return t}a.extent=function(t){return arguments.length?(e=typeof t==="function"?t:cW(_W(t)),a):e};a.filter=function(t){return arguments.length?(F=typeof t==="function"?t:cW(!!t),a):F};a.touchable=function(t){return arguments.length?(i=typeof t==="function"?t:cW(!!t),a):i};a.handleSize=function(t){return arguments.length?(r=+t,a):r};a.keyModifiers=function(t){return arguments.length?(I=!!t,a):I};a.on=function(){var t=n.on.apply(n,arguments);return t===n?a:t};return a}var LW=[].slice;var FW={};function IW(t){this._size=t;this._call=this._error=null;this._tasks=[];this._data=[];this._waiting=this._active=this._ended=this._start=0}IW.prototype=qW.prototype={constructor:IW,defer:function t(e){if(typeof e!=="function")throw new Error("invalid callback");if(this._call)throw new Error("defer after await");if(this._error!=null)return this;var n=LW.call(arguments,1);n.push(e);++this._waiting,this._tasks.push(n);HW(this);return this},abort:function t(){if(this._error==null)UW(this,new Error("abort"));return this},await:function t(n){if(typeof n!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=function(t,e){n.apply(null,[t].concat(e))};WW(this);return this},awaitAll:function t(e){if(typeof e!=="function")throw new Error("invalid callback");if(this._call)throw new Error("multiple await");this._call=e;WW(this);return this}};function HW(e){if(!e._start){try{GW(e)}catch(t){if(e._tasks[e._ended+e._active-1])UW(e,t);else if(!e._data)throw t}}}function GW(t){while(t._start=t._waiting&&t._active=0){if(i=t._tasks[n]){t._tasks[n]=null;if(i.abort){try{i.abort()}catch(e){}}}}t._active=NaN;WW(t)}function WW(t){if(!t._active&&t._call){var e=t._data;t._data=undefined;t._call(t._error,e)}}function qW(t){if(t==null)t=Infinity;else if(!((t=+t)>=1))throw new Error("invalid concurrency");return new IW(t)}var KW=TM(function(n){(function(t,e){{n.exports=e()}})((typeof window==="undefined"?"undefined":_typeof2(window))==="object"?window:MM,function(){var r=void 0;function e(t){if(!(this instanceof e))return new e(t);this._LRUCacheState=new n(t)}var t=e.prototype;t.get=function(t){var e=this._LRUCacheState;var n=e.hash[t];if(!n)return;o(e.linkedList,n);return e.data[t]};t.set=function(t,e){var n=this._LRUCacheState;var i=n.hash[t];if(e===r)return this;if(!i){n.hash[t]=new a(t);n.linkedList.length+=1;i=n.hash[t]}o(n.linkedList,i);n.data[t]=e;if(n.linkedList.length>n.capacity)this.remove(n.linkedList.end.key);return this};t.update=function(t,e){if(this.has(t))this.set(t,e(this.get(t)));return this};t.remove=function(t){var e=this._LRUCacheState;var n=e.hash[t];if(!n)return this;if(n===e.linkedList.head)e.linkedList.head=n.p;if(n===e.linkedList.end)e.linkedList.end=n.n;s(n.n,n.p);delete e.hash[t];delete e.data[t];e.linkedList.length-=1;return this};t.removeAll=function(){this._LRUCacheState=new n(this._LRUCacheState.capacity);return this};t.info=function(){var t=this._LRUCacheState;return{capacity:t.capacity,length:t.linkedList.length}};t.keys=function(){var t=[];var e=this._LRUCacheState.linkedList.head;while(e){t.push(e.key);e=e.p}return t};t.has=function(t){return!!this._LRUCacheState.hash[t]};t.staleKey=function(){return this._LRUCacheState.linkedList.end&&this._LRUCacheState.linkedList.end.key};t.popStale=function(){var t=this.staleKey();if(!t)return null;var e=[t,this._LRUCacheState.data[t]];this.remove(t);return e};function n(t){this.capacity=t>0?+t:Number.MAX_SAFE_INTEGER||Number.MAX_VALUE;this.data=Object.create?Object.create(null):{};this.hash=Object.create?Object.create(null):{};this.linkedList=new i}function i(){this.length=0;this.head=null;this.end=null}function a(t){this.key=t;this.p=null;this.n=null}function o(t,e){if(e===t.head)return;if(!t.end){t.end=e}else if(t.end===e){t.end=e.n}s(e.n,e.p);s(e,t.head);t.head=e;t.head.n=null}function s(t,e){if(t===e)return;if(t)t.p=e;if(e)e.n=t}return e})});function YW(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){YW=function t(e){return typeof e}}else{YW=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return YW(t)}function XW(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function ZW(t,e){for(var n=0;n0){var a=(n[e]-n[t-1])/(e-t+1);r=i[e]-i[t-1]-(e-t+1)*a*a}else r=i[e]-n[e]*n[e]/(e+1);if(r<0)return 0;return r}function Dq(t,e,n,i,r,a,o){if(t>e)return;var s=Math.floor((t+e)/2);i[n][s]=i[n-1][s-1];r[n][s]=s;var u=n;if(t>n)u=Math.max(u,r[n][t-1]||0);u=Math.max(u,r[n-1][s]||0);var l=s-1;if(e=u;--c){var f=Bq(c,s,a,o);if(f+i[n-1][u-1]>=i[n][s])break;var h=Bq(u,s,a,o);var d=h+i[n-1][u-1];if(dt.length){throw new Error("Cannot generate more classes than there are data values")}var n=Tq(t);var i=Pq(n);if(i===1){return[n]}var r=Oq(e,n.length),a=Oq(e,n.length);Nq(n,a,r);var o=r[0]?r[0].length-1:0;var s=[];for(var u=r.length-1;u>=0;u--){var l=r[u][o];s[u]=n.slice(l,o+1);if(u>0)o=l-1}return s}function jq(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){jq=function t(e){return typeof e}}else{jq=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return jq(t)}function Lq(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function Fq(t,e){for(var n=0;nu){var l=1,c=[];var d=ce(this._lineData.map(function(t){return t.words.length}));this._wrapLines=function(){var e=this;l++;if(l>d)return;var o=l===1?this._lineData.slice():this._lineData.filter(function(t){return t.width+t.shapeWidth+e._padding*(t.width?2:1)>u&&t.words.length>=l}).sort(function(t,e){return e.sentence.length-t.sentence.length});if(o.length&&h>o[0].height*l){var s=false;var t=function t(e){var n=o[e];var i=n.og.height*l,r=n.og.width*(1.5*(1/l));var a=jS().fontFamily(n.f).fontSize(n.s).lineHeight(n.lh).width(r).height(i)(n.sentence);if(!a.truncated){n.width=Math.ceil(ce(a.lines.map(function(t){return oS(t,{"font-family":n.f,"font-size":n.s})})))+n.s;n.height=a.lines.length*(n.lh+1)}else{s=true;return"break"}};for(var n=0;nh){c=[];break}if(r>u){c=[];this._wrapLines();break}else if(e+rh){o=ge(this._lineData.map(function(t){return t.shapeWidth+f._padding}))-this._padding;for(var s=0;s=1||l<=-1?Math.round(l).toString().length-1:l.toString().split(".")[1].replace(/([1-9])[1-9].*$/,"$1").length*-1;var f=Math.pow(10,c);return o===e&&t===1?"".concat(r(de([e+f,i.find(function(t){return t>e&&te&&tthis._midpoint;var h=c&&f;var d=this._buckets instanceof Array?this._buckets.length:this._buckets;var g=this._color,p,v;if(g&&!(g instanceof Array)){g=le(0,d,1).map(function(t){return Bw(g,(t+1)/d)}).reverse()}if(this._scale==="jenks"){var m=this._data.map(this._value).filter(function(t){return t!==null&&typeof t==="number"});var y=de([g?g.length:d,m.length]);var _=[];if(this._buckets instanceof Array){v=this._buckets}else{if(h&&this._centered){var b=Math.floor(y/2);var w=y%2;var x=m.filter(function(t){return t=r._midpoint});var C=se(S);var E=k>C?1:0;var A=C>k?1:0;var R=zq(x,b+w*E);var M=zq(S,b+w*A);_=R.concat(M)}else{_=zq(m,y)}v=_.map(function(t){return t[0]})}var T=new Set(v);if(v.length!==T.size){p=Array.from(T)}if(!g){if(h){g=[this._colorMin,this._colorMid,this._colorMax];var P=v.slice(0,y).filter(function(t,e){return tr._midpoint});var B=v.slice(0,y).filter(function(t,e){return t>r._midpoint&&v[e+1]>r._midpoint});var D=P.map(function(t,e){return!e?g[0]:Bw(g[0],e/P.length)});var N=O.map(function(){return g[1]});var z=B.map(function(t,e){return e===B.length-1?g[2]:Bw(g[2],1-(e+1)/B.length)});g=D.concat(N).concat(z)}else{g=le(0,d,1).map(function(t){return Bw(r._colorMax,t/d)}).reverse()}}if(m.length<=y){g=g.slice(y-m.length)}g=[g[0]].concat(g);this._colorScale=Mr().domain(v).range(g)}else{var j=this._buckets instanceof Array?this._buckets:undefined;if(h&&!g){var L=Math.floor(d/2);var F=le(0,L,1).map(function(t){return!t?r._colorMin:Bw(r._colorMin,t/L)});var I=(d%2?[0]:[]).map(function(){return r._colorMid});var H=le(0,L,1).map(function(t){return!t?r._colorMax:Bw(r._colorMax,t/L)}).reverse();g=F.concat(I).concat(H);if(!j){var G=(g.length-1)/2;j=[l[0],this._midpoint,l[1]];j=le(l[0],this._midpoint,-(l[0]-this._midpoint)/G).concat(le(this._midpoint,l[1],(l[1]-this._midpoint)/G)).concat([l[1]])}}else{if(!g){if(this._scale==="buckets"||this._scale==="quantile"){g=le(0,d,1).map(function(t){return Bw(c?r._colorMin:r._colorMax,t/d)});if(f)g=g.reverse()}else{g=c?[this._colorMin,Bw(this._colorMin,.8)]:[Bw(this._colorMax,.8),this._colorMax]}}if(!j){if(this._scale==="quantile"){var V=1/(g.length-1);j=le(0,1+V/2,V).map(function(t){return zt(u,t)})}else if(h&&this._color&&this._centered){var U=(this._midpoint-l[0])/Math.floor(g.length/2);var W=(l[1]-this._midpoint)/Math.floor(g.length/2);var q=le(l[0],this._midpoint,U);var K=le(this._midpoint,l[1]+W/2,W);j=q.concat(K)}else{var Y=(l[1]-l[0])/(g.length-1);j=le(l[0],l[1]+Y/2,Y)}}}if(this._scale==="buckets"||this._scale==="quantile"){v=j;g=[g[0]].concat(g)}else if(this._scale==="log"){var X=j.filter(function(t){return t<0});if(X.length){var Z=X[0];var $=X.map(function(t){return-Math.pow(Math.abs(Z),t/Z)});X.forEach(function(t,e){j[j.indexOf(t)]=$[e]})}var J=j.filter(function(t){return t>0});if(J.length){var Q=J[J.length-1];var tt=J.map(function(t){return Math.pow(Q,t/Q)});J.forEach(function(t,e){j[j.indexOf(t)]=tt[e]})}if(j.includes(0))j[j.indexOf(0)]=1}this._colorScale=(this._scale==="buckets"||this._scale==="quantile"?Mr:rr)().domain(j).range(g)}if(this._colorScale.clamp)this._colorScale.clamp(true);var et=this._bucketAxis||!["buckets","jenks","quantile"].includes(this._scale);var nt=Uu().duration(this._duration);var it={enter:{opacity:0},exit:{opacity:0},parent:this._group,transition:nt,update:{opacity:1}};var rt=fw("g.d3plus-ColorScale-labels",Object.assign({condition:et},it));var at=fw("g.d3plus-ColorScale-Rect",Object.assign({condition:et},it));var ot=fw("g.d3plus-ColorScale-legend",Object.assign({condition:!et},it));if(et){var st;var ut={x:0,y:0};var lt=l.slice();if(this._bucketAxis){var ct=lt[lt.length-1];var ft=lt[lt.length-2];var ht=ct?ct/10:ft/10;var dt=ht>=1||ht<=-1?Math.round(ht).toString().length-1:ht.toString().split(".")[1].replace(/([1-9])[1-9].*$/,"$1").length*-1;var gt=Math.pow(10,dt);lt[lt.length-1]=ct+gt}var pt=el({domain:lt,duration:this._duration,height:this._height,labels:p||v,orient:this._orient,padding:this._padding,scale:this._scale==="log"?"log":"linear",ticks:v,width:this._width},this._axisConfig);var vt=el({height:this["_".concat(i)]/2,width:this["_".concat(a)]/2},this._labelConfig||this._axisConfig.titleConfig);this._labelClass.config(vt);var mt=[];if(n&&this._labelMin){var yt={"font-family":this._labelClass.fontFamily()(this._labelMin),"font-size":this._labelClass.fontSize()(this._labelMin),"font-weight":this._labelClass.fontWeight()(this._labelMin)};if(yt["font-family"]instanceof Array)yt["font-family"]=yt["font-family"][0];var _t=oS(this._labelMin,yt);if(_t&&_t>>0;if(r===0)return false;var o=n|0;var a=Math.max(o>=0?o:r-Math.abs(o),0);function s(t,e){return t===e||typeof t==="number"&&typeof e==="number"&&isNaN(t)&&isNaN(e)}while(ae?1:t>=e?0:NaN};var E=function(o){if(o.length===1){o=n(o)}return{left:function(t,e,n,i){if(n==null){n=0}if(i==null){i=t.length}while(n>>1;if(o(t[r],e)<0){n=r+1}else{i=r}}return n},right:function(t,e,n,i){if(n==null){n=0}if(i==null){i=t.length}while(n>>1;if(o(t[r],e)>0){i=r}else{n=r+1}}return n}}};function n(n){return function(t,e){return s(n(t),e)}}var i=E(s);var u=i.right;var h=function(t){return t===null?NaN:+t};var Ht=function(t,e){var n=t.length,i=-1,r,o,a;if(e==null){while(++i=r){o=a=r;while(++ir){o=r}if(a=r){o=a=r;while(++ir){o=r}if(a0){return[t]}if(i=e0){t=Math.ceil(t/s);e=Math.floor(e/s);a=new Array(o=Math.ceil(e-t+1));while(++r=0?(o>=a?10:o>=l?5:o>=f?2:1)*Math.pow(10,r):-Math.pow(10,-r)/(o>=a?10:o>=l?5:o>=f?2:1)}function S(t,e,n){var i=Math.abs(e-t)/Math.max(0,n),r=Math.pow(10,Math.floor(Math.log(i)/Math.LN10)),o=i/r;if(o>=a){r*=10}else if(o>=l){r*=5}else if(o>=f){r*=2}return e=1){return+n(t[i-1],i-1,t)}var i,r=(i-1)*e,o=Math.floor(r),a=+n(t[o],o,t),s=+n(t[o+1],o+1,t);return a+(s-a)*(r-o)};var Ut=function(t,e){var n=t.length,i=-1,r,o;if(e==null){while(++i=r){o=r;while(++io){o=r}}}}}else{while(++i=r){o=r;while(++io){o=r}}}}}return o};var r=function(t,e){var n=t.length,i=n,r=-1,o,a=0;if(e==null){while(++r=0){a=t[e];n=a.length;while(--n>=0){o[--r]=a[n]}}return o};var qt=function(t,e){var n=t.length,i=-1,r,o;if(e==null){while(++i=r){o=r;while(++ir){o=r}}}}}else{while(++i=r){o=r;while(++ir){o=r}}}}}return o};var Xt=function(t,e){var n=t.length,i=-1,r,o=0;if(e==null){while(++i=c.length){if(d!=null){t.sort(d)}return p!=null?p(t):t}var e=-1,o=t.length,a=c[n++],s,u,h=_(),l,f=i();while(++ec.length){return t}var i,r=e[n-1];if(p!=null&&n>=c.length){i=t.entries()}else{i=[],t.each(function(t,e){i.push({key:e,values:o(t,n)})})}return r!=null?i.sort(function(t,e){return r(t.key,e.key)}):i}return n={object:function(t){return g(t,0,y,m)},map:function(t){return g(t,0,b,x)},entries:function(t){return o(g(t,0,b,x),0)},key:function(t){c.push(t);return n},sortKeys:function(t){e[c.length-1]=t;return n},sortValues:function(t){d=t;return n},rollup:function(t){p=t;return n}}};function y(){return{}}function m(t,e,n){t[e]=n}function b(){return _()}function x(t,e,n){t.set(e,n)}var p=function(t){var e=[];for(var n in t){e.push(n)}return e};var g=Array.prototype;var k=g.map;var w=g.slice;var C={name:"implicit"};function M(i){var o=_(),a=[],r=C;i=i==null?[]:w.call(i);function s(t){var e=t+"",n=o.get(e);if(!n){if(r!==C){return r}o.set(e,n=a.push(t))}return i[(n-1)%i.length]}s.domain=function(t){if(!arguments.length){return a.slice()}a=[],o=_();var e=-1,n=t.length,i,r;while(++e>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1)):(e=H.exec(t))?Z(parseInt(e[1],16)):(e=V.exec(t))?new et(e[1],e[2],e[3],1):(e=U.exec(t))?new et(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=W.exec(t))?K(e[1],e[2],e[3],e[4]):(e=q.exec(t))?K(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=X.exec(t))?it(e[1],e[2]/100,e[3]/100,1):(e=G.exec(t))?it(e[1],e[2]/100,e[3]/100,e[4]):Y.hasOwnProperty(t)?Z(Y[t]):t==="transparent"?new et(NaN,NaN,NaN,0):null}function Z(t){return new et(t>>16&255,t>>8&255,t&255,1)}function K(t,e,n,i){if(i<=0){t=e=n=NaN}return new et(t,e,n,i)}function J(t){if(!(t instanceof z)){t=Q(t)}if(!t){return new et}t=t.rgb();return new et(t.r,t.g,t.b,t.opacity)}function tt(t,e,n,i){return arguments.length===1?J(t):new et(t,e,n,i==null?1:i)}function et(t,e,n,i){this.r=+t;this.g=+e;this.b=+n;this.opacity=+i}N(et,tt,P(z,{brighter:function(t){t=t==null?F:Math.pow(F,t);return new et(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){t=t==null?O:Math.pow(O,t);return new et(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&(0<=this.g&&this.g<=255)&&(0<=this.b&&this.b<=255)&&(0<=this.opacity&&this.opacity<=1)},hex:function(){return"#"+nt(this.r)+nt(this.g)+nt(this.b)},toString:function(){var t=this.opacity;t=isNaN(t)?1:Math.max(0,Math.min(1,t));return(t===1?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(t===1?")":", "+t+")")}}));function nt(t){t=Math.max(0,Math.min(255,Math.round(t)||0));return(t<16?"0":"")+t.toString(16)}function it(t,e,n,i){if(i<=0){t=e=n=NaN}else if(n<=0||n>=1){t=e=NaN}else if(e<=0){t=NaN}return new at(t,e,n,i)}function rt(t){if(t instanceof at){return new at(t.h,t.s,t.l,t.opacity)}if(!(t instanceof z)){t=Q(t)}if(!t){return new at}if(t instanceof at){return t}t=t.rgb();var e=t.r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),o=Math.max(e,n,i),a=NaN,s=o-r,u=(o+r)/2;if(s){if(e===o){a=(n-i)/s+(n0&&u<1?0:a}return new at(a,s,u,t.opacity)}function ot(t,e,n,i){return arguments.length===1?rt(t):new at(t,e,n,i==null?1:i)}function at(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}N(at,ot,P(z,{brighter:function(t){t=t==null?F:Math.pow(F,t);return new at(this.h,this.s,this.l*t,this.opacity)},darker:function(t){t=t==null?O:Math.pow(O,t);return new at(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new et(st(t>=240?t-240:t+120,r,i),st(t,r,i),st(t<120?t+240:t-120,r,i),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&(0<=this.l&&this.l<=1)&&(0<=this.opacity&&this.opacity<=1)}}));function st(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}var ut=Math.PI/180;var ht=180/Math.PI;var lt=18;var ft=.96422;var ct=1;var dt=.82521;var pt=4/29;var gt=6/29;var vt=3*gt*gt;var _t=gt*gt*gt;function yt(t){if(t instanceof bt){return new bt(t.l,t.a,t.b,t.opacity)}if(t instanceof kt){if(isNaN(t.h)){return new bt(t.l,0,0,t.opacity)}var e=t.h*ut;return new bt(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}if(!(t instanceof et)){t=J(t)}var n=Et(t.r),i=Et(t.g),r=Et(t.b),o=xt((.2225045*n+.7168786*i+.0606169*r)/ct),a,s;if(n===i&&i===r){a=s=o}else{a=xt((.4360747*n+.3850649*i+.1430804*r)/ft);s=xt((.0139322*n+.0971045*i+.7141733*r)/dt)}return new bt(116*o-16,500*(a-o),200*(o-s),t.opacity)}function mt(t,e,n,i){return arguments.length===1?yt(t):new bt(t,e,n,i==null?1:i)}function bt(t,e,n,i){this.l=+t;this.a=+e;this.b=+n;this.opacity=+i}N(bt,mt,P(z,{brighter:function(t){return new bt(this.l+lt*(t==null?1:t),this.a,this.b,this.opacity)},darker:function(t){return new bt(this.l-lt*(t==null?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;e=ft*wt(e);t=ct*wt(t);n=dt*wt(n);return new et(Ct(3.1338561*e-1.6168667*t-.4906146*n),Ct(-.9787684*e+1.9161415*t+.033454*n),Ct(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}}));function xt(t){return t>_t?Math.pow(t,1/3):t/vt+pt}function wt(t){return t>gt?t*t*t:vt*(t-pt)}function Ct(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Et(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function St(t){if(t instanceof kt){return new kt(t.h,t.c,t.l,t.opacity)}if(!(t instanceof bt)){t=yt(t)}if(t.a===0&&t.b===0){return new kt(NaN,0,t.l,t.opacity)}var e=Math.atan2(t.b,t.a)*ht;return new kt(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function At(t,e,n,i){return arguments.length===1?St(t):new kt(t,e,n,i==null?1:i)}function kt(t,e,n,i){this.h=+t;this.c=+e;this.l=+n;this.opacity=+i}N(kt,At,P(z,{brighter:function(t){return new kt(this.h,this.c,this.l+lt*(t==null?1:t),this.opacity)},darker:function(t){return new kt(this.h,this.c,this.l-lt*(t==null?1:t),this.opacity)},rgb:function(){return yt(this).rgb()}}));var Mt=-.14861;var Tt=+1.78277;var Bt=-.29227;var Dt=-.90649;var Nt=+1.97294;var Pt=Nt*Dt;var zt=Nt*Tt;var Ot=Tt*Bt-Dt*Mt;function Ft(t){if(t instanceof It){return new It(t.h,t.s,t.l,t.opacity)}if(!(t instanceof et)){t=J(t)}var e=t.r/255,n=t.g/255,i=t.b/255,r=(Ot*i+Pt*e-zt*n)/(Ot+Pt-zt),o=i-r,a=(Nt*(n-r)-Bt*o)/Dt,s=Math.sqrt(a*a+o*o)/(Nt*r*(1-r)),u=s?Math.atan2(a,o)*ht-120:NaN;return new It(u<0?u+360:u,s,r,t.opacity)}function Rt(t,e,n,i){return arguments.length===1?Ft(t):new It(t,e,n,i==null?1:i)}function It(t,e,n,i){this.h=+t;this.s=+e;this.l=+n;this.opacity=+i}N(It,Rt,P(z,{brighter:function(t){t=t==null?F:Math.pow(F,t);return new It(this.h,this.s,this.l*t,this.opacity)},darker:function(t){t=t==null?O:Math.pow(O,t);return new It(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*ut,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),i=Math.cos(t),r=Math.sin(t);return new et(255*(e+n*(Mt*i+Tt*r)),255*(e+n*(Bt*i+Dt*r)),255*(e+n*(Nt*i)),this.opacity)}}));var Lt=function(t){return function(){return t}};function jt(e,n){return function(t){return e+t*n}}function Yt(e,n,i){return e=Math.pow(e,i),n=Math.pow(n,i)-e,i=1/i,function(t){return Math.pow(e+t*n,i)}}function $t(t,e){var n=e-t;return n?jt(t,n>180||n<-180?n-360*Math.round(n/360):n):Lt(isNaN(t)?e:t)}function Qt(n){return(n=+n)===1?Zt:function(t,e){return e-t?Yt(t,e,n):Lt(isNaN(t)?e:t)}}function Zt(t,e){var n=e-t;return n?jt(t,n):Lt(isNaN(t)?e:t)}var Kt=function t(e){var a=Qt(e);function n(e,t){var n=a((e=tt(e)).r,(t=tt(t)).r),i=a(e.g,t.g),r=a(e.b,t.b),o=Zt(e.opacity,t.opacity);return function(t){e.r=n(t);e.g=i(t);e.b=r(t);e.opacity=o(t);return e+""}}n.gamma=t;return n}(1);var Jt=function(t,e){var n=e?e.length:0,i=t?Math.min(n,t.length):0,r=new Array(i),o=new Array(n),a;for(a=0;ae){o=i.slice(e,o);if(s[a]){s[a]+=o}else{s[++a]=o}}if((n=n[0])===(r=r[0])){if(s[a]){s[a]+=r}else{s[++a]=r}}else{s[++a]=null;u.push({i:a,x:ee(n,r)})}e=re.lastIndex}if(e180){e+=360}else if(e-t>180){t+=360}i.push({i:n.push(h(n)+"rotate(",null,r)-2,x:ee(t,e)})}else if(e){n.push(h(n)+"rotate("+e+r)}}function l(t,e,n,i){if(t!==e){i.push({i:n.push(h(n)+"skewX(",null,r)-2,x:ee(t,e)})}else if(e){n.push(h(n)+"skewX("+e+r)}}function f(t,e,n,i,r,o){if(t!==n||e!==i){var a=r.push(h(r)+"scale(",null,",",null,")");o.push({i:a-4,x:ee(t,n)},{i:a-2,x:ee(e,i)})}else if(n!==1||i!==1){r.push(h(r)+"scale("+n+","+i+")")}}return function(t,e){var r=[],o=[];t=n(t),e=n(e);i(t.translateX,t.translateY,e.translateX,e.translateY,r,o);a(t.rotate,e.rotate,r,o);l(t.skewX,e.skewX,r,o);f(t.scaleX,t.scaleY,e.scaleX,e.scaleY,r,o);t=e=null;return function(t){var e=-1,n=o.length,i;while(++e=n?1:i(t)}}}function je(t){return function(e,n){var i=t(e=+e,n=+n);return function(t){return t<=0?e:t>=1?n:i(t)}}}function He(t,e,n,i){var r=t[0],o=t[1],a=e[0],s=e[1];if(o2?Ve:He;u=h=null;return t}function t(t){return(u||(u=s(i,r,a?Le(e):e,o)))(+t)}t.invert=function(t){return(h||(h=s(r,i,Ie,a?je(n):n)))(+t)};t.domain=function(t){return arguments.length?(i=k.call(t,Fe),l()):i.slice()};t.range=function(t){return arguments.length?(r=w.call(t),l()):r.slice()};t.rangeRound=function(t){return r=w.call(t),o=he,l()};t.clamp=function(t){return arguments.length?(a=!!t,l()):a};t.interpolate=function(t){return arguments.length?(o=t,l()):o};return l()}var qe=function(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0){return null}var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]};var Xe=function(t){return t=qe(Math.abs(t)),t?t[1]:NaN};var Ge=function(s,u){return function(t,e){var n=t.length,i=[],r=0,o=s[0],a=0;while(n>0&&o>0){if(a+o+1>e){o=Math.max(1,e-a)}i.push(t.substring(n-=o,n+o));if((a+=o+1)>e){break}o=s[r=(r+1)%s.length]}return i.reverse().join(u)}};var Ye=function(e){return function(t){return t.replace(/[0-9]/g,function(t){return e[+t]})}};var $e=/^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Qe(t){return new Ze(t)}Qe.prototype=Ze.prototype;function Ze(t){if(!(e=$e.exec(t))){throw new Error("invalid format: "+t)}var e;this.fill=e[1]||" ";this.align=e[2]||">";this.sign=e[3]||"-";this.symbol=e[4]||"";this.zero=!!e[5];this.width=e[6]&&+e[6];this.comma=!!e[7];this.precision=e[8]&&+e[8].slice(1);this.trim=!!e[9];this.type=e[10]||""}Ze.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width==null?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision==null?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};var Ke=function(t){t:for(var e=t.length,n=1,i=-1,r;n0){if(!+t[n]){break t}i=0}break}}return i>0?t.slice(0,i)+t.slice(r+1):t};var Je;var tn=function(t,e){var n=qe(t,e);if(!n){return t+""}var i=n[0],r=n[1],o=r-(Je=Math.max(-8,Math.min(8,Math.floor(r/3)))*3)+1,a=i.length;return o===a?i:o>a?i+new Array(o-a+1).join("0"):o>0?i.slice(0,o)+"."+i.slice(o):"0."+new Array(1-o).join("0")+qe(t,Math.max(0,e+o-1))[0]};var en=function(t,e){var n=qe(t,e);if(!n){return t+""}var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")};var nn={"%":function(t,e){return(t*100).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return en(t*100,e)},r:en,s:tn,X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};var rn=function(t){return t};var on=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];var an=function(t){var w=t.grouping&&t.thousands?Ge(t.grouping,t.thousands):rn,i=t.currency,C=t.decimal,E=t.numerals?Ye(t.numerals):rn,r=t.percent||"%";function a(t){t=Qe(t);var h=t.fill,l=t.align,f=t.sign,e=t.symbol,c=t.zero,d=t.width,p=t.comma,g=t.precision,v=t.trim,_=t.type;if(_==="n"){p=true,_="g"}else if(!nn[_]){g==null&&(g=12),v=true,_="g"}if(c||h==="0"&&l==="="){c=true,h="0",l="="}var y=e==="$"?i[0]:e==="#"&&/[boxX]/.test(_)?"0"+_.toLowerCase():"",m=e==="$"?i[1]:/[%p]/.test(_)?r:"";var b=nn[_],x=/[defgprs%]/.test(_);g=g==null?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,g)):Math.max(0,Math.min(20,g));function n(t){var e=y,n=m,i,r,o;if(_==="c"){n=b(t)+n;t=""}else{t=+t;var a=t<0;t=b(Math.abs(t),g);if(v){t=Ke(t)}if(a&&+t===0){a=false}e=(a?f==="("?f:"-":f==="-"||f==="("?"":f)+e;n=(_==="s"?on[8+Je/3]:"")+n+(a&&f==="("?")":"");if(x){i=-1,r=t.length;while(++io||o>57){n=(o===46?C+t.slice(i+1):t.slice(i))+n;t=t.slice(0,i);break}}}}if(p&&!c){t=w(t,Infinity)}var s=e.length+t.length+n.length,u=s>1)+e+t+n+u.slice(s);break;default:t=u+e+t+n;break}return E(t)}n.toString=function(){return t+""};return n}function e(t,e){var n=a((t=Qe(t),t.type="f",t)),i=Math.max(-8,Math.min(8,Math.floor(Xe(e)/3)))*3,r=Math.pow(10,-i),o=on[8+i/3];return function(t){return n(r*t)+o}}return{format:a,formatPrefix:e}};var sn;var un;var hn;ln({decimal:".",thousands:",",grouping:[3],currency:["$",""]});function ln(t){sn=an(t);un=sn.format;hn=sn.formatPrefix;return sn}var fn=function(t){return Math.max(0,-Xe(Math.abs(t)))};var cn=function(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Xe(e)/3)))*3-Xe(Math.abs(t)))};var dn=function(t,e){t=Math.abs(t),e=Math.abs(e)-t;return Math.max(0,Xe(e)-Xe(t))+1};var pn=function(t,e,n){var i=t[0],r=t[t.length-1],o=S(i,r,e==null?10:e),a;n=Qe(n==null?",f":n);switch(n.type){case"s":{var s=Math.max(Math.abs(i),Math.abs(r));if(n.precision==null&&!isNaN(a=cn(o,s))){n.precision=a}return hn(n,s)}case"":case"e":case"g":case"p":case"r":{if(n.precision==null&&!isNaN(a=dn(o,Math.max(Math.abs(i),Math.abs(r))))){n.precision=a-(n.type==="e")}break}case"f":case"%":{if(n.precision==null&&!isNaN(a=fn(o))){n.precision=a-(n.type==="%")*2}break}}return un(n)};function gn(s){var u=s.domain;s.ticks=function(t){var e=u();return v(e[0],e[e.length-1],t==null?10:t)};s.tickFormat=function(t,e){return pn(u(),t,e)};s.nice=function(t){if(t==null){t=10}var e=u(),n=0,i=e.length-1,r=e[n],o=e[i],a;if(o0){r=Math.floor(r/a)*a;o=Math.ceil(o/a)*a;a=c(r,o,t)}else if(a<0){r=Math.ceil(r*a)/a;o=Math.floor(o*a)/a;a=c(r,o,t)}if(a>0){e[n]=Math.floor(r/a)*a;e[i]=Math.ceil(o/a)*a;u(e)}else if(a<0){e[n]=Math.ceil(r*a)/a;e[i]=Math.floor(o*a)/a;u(e)}return s};return s}function vn(){var t=We(Ie,ee);t.copy=function(){return Ue(t,vn())};return gn(t)}function _n(){var e=[0,1];function n(t){return+t}n.invert=n;n.domain=n.range=function(t){return arguments.length?(e=k.call(t,Fe),n):e.slice()};n.copy=function(){return _n().domain(e)};return gn(n)}var yn=function(t,e){t=t.slice();var n=0,i=t.length-1,r=t[n],o=t[i],a;if(o0){for(;oi){break}f.push(h)}}}else{for(;o=1;--u){h=s*u;if(hi){break}f.push(h)}}}}else{f=v(o,a,Math.min(a-o,l)).map(g)}return r?f.reverse():f};e.tickFormat=function(t,n){if(n==null){n=d===10?".0e":","}if(typeof n!=="function"){n=un(n)}if(t===Infinity){return n}if(t==null){t=10}var i=Math.max(1,d*t/e.ticks().length);return function(t){var e=t/g(Math.round(p(t)));if(e*d0?i[e-1]:r[0],e=r?[o[r-1],i]:[o[e-1],o[e]]};e.copy=function(){return Bn().domain([n,i]).range(a)};return gn(e)}function Dn(){var n=[.5],i=[0,1],e=1;function r(t){if(t<=t){return i[u(n,t,0,e)]}}r.domain=function(t){return arguments.length?(n=w.call(t),e=Math.min(n.length,i.length-1),r):n.slice()};r.range=function(t){return arguments.length?(i=w.call(t),e=Math.min(n.length,i.length-1),r):i.slice()};r.invertExtent=function(t){var e=i.indexOf(t);return[n[e-1],n[e]]};r.copy=function(){return Dn().domain(n).range(i)};return r}var Nn=new Date;var Pn=new Date;function zn(o,a,n,i){function s(t){return o(t=new Date(+t)),t}s.floor=s;s.ceil=function(t){return o(t=new Date(t-1)),a(t,1),o(t),t};s.round=function(t){var e=s(t),n=s.ceil(t);return t-e0)){return i}do{i.push(r=new Date(+t)),a(t,n),o(t)}while(r=t){while(o(t),!n(t)){t.setTime(t-1)}}},function(t,e){if(t>=t){if(e<0){while(++e<=0){while(a(t,-1),!n(t)){}}}else{while(--e>=0){while(a(t,+1),!n(t)){}}}}})};if(n){s.count=function(t,e){Nn.setTime(+t),Pn.setTime(+e);o(Nn),o(Pn);return Math.floor(n(Nn,Pn))};s.every=function(e){e=Math.floor(e);return!isFinite(e)||!(e>0)?null:!(e>1)?s:s.filter(i?function(t){return i(t)%e===0}:function(t){return s.count(0,t)%e===0})}}return s}var On=zn(function(){},function(t,e){t.setTime(+t+e)},function(t,e){return e-t});On.every=function(n){n=Math.floor(n);if(!isFinite(n)||!(n>0)){return null}if(!(n>1)){return On}return zn(function(t){t.setTime(Math.floor(t/n)*n)},function(t,e){t.setTime(+t+e*n)},function(t,e){return(e-t)/n})};var Fn=1e3;var Rn=6e4;var In=36e5;var Ln=864e5;var jn=6048e5;var Hn=zn(function(t){t.setTime(Math.floor(t/Fn)*Fn)},function(t,e){t.setTime(+t+e*Fn)},function(t,e){return(e-t)/Fn},function(t){return t.getUTCSeconds()});var Vn=zn(function(t){t.setTime(Math.floor(t/Rn)*Rn)},function(t,e){t.setTime(+t+e*Rn)},function(t,e){return(e-t)/Rn},function(t){return t.getMinutes()});var Un=zn(function(t){var e=t.getTimezoneOffset()*Rn%In;if(e<0){e+=In}t.setTime(Math.floor((+t-e)/In)*In+e)},function(t,e){t.setTime(+t+e*In)},function(t,e){return(e-t)/In},function(t){return t.getHours()});var Wn=zn(function(t){t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Rn)/Ln},function(t){return t.getDate()-1});function qn(e){return zn(function(t){t.setDate(t.getDate()-(t.getDay()+7-e)%7);t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e*7)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Rn)/jn})}var Xn=qn(0);var Gn=qn(1);var Yn=qn(2);var $n=qn(3);var Qn=qn(4);var Zn=qn(5);var Kn=qn(6);var Jn=zn(function(t){t.setDate(1);t.setHours(0,0,0,0)},function(t,e){t.setMonth(t.getMonth()+e)},function(t,e){return e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12},function(t){return t.getMonth()});var ti=zn(function(t){t.setMonth(0,1);t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t,e){return e.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});ti.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:zn(function(t){t.setFullYear(Math.floor(t.getFullYear()/n)*n);t.setMonth(0,1);t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e*n)})};var ei=zn(function(t){t.setUTCSeconds(0,0)},function(t,e){t.setTime(+t+e*Rn)},function(t,e){return(e-t)/Rn},function(t){return t.getUTCMinutes()});var ni=zn(function(t){t.setUTCMinutes(0,0,0)},function(t,e){t.setTime(+t+e*In)},function(t,e){return(e-t)/In},function(t){return t.getUTCHours()});var ii=zn(function(t){t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e)},function(t,e){return(e-t)/Ln},function(t){return t.getUTCDate()-1});function ri(e){return zn(function(t){t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e*7)},function(t,e){return(e-t)/jn})}var oi=ri(0);var ai=ri(1);var si=ri(2);var ui=ri(3);var hi=ri(4);var li=ri(5);var fi=ri(6);var ci=zn(function(t){t.setUTCDate(1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCMonth(t.getUTCMonth()+e)},function(t,e){return e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12},function(t){return t.getUTCMonth()});var di=zn(function(t){t.setUTCMonth(0,1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)},function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});di.every=function(n){return!isFinite(n=Math.floor(n))||!(n>0)?null:zn(function(t){t.setUTCFullYear(Math.floor(t.getUTCFullYear()/n)*n);t.setUTCMonth(0,1);t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e*n)})};function pi(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);e.setFullYear(t.y);return e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function gi(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));e.setUTCFullYear(t.y);return e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function vi(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function _i(t){var i=t.dateTime,r=t.date,o=t.time,e=t.periods,n=t.days,a=t.shortDays,s=t.months,u=t.shortMonths;var h=Ei(e),l=Si(e),f=Ei(n),c=Si(n),d=Ei(a),p=Si(a),g=Ei(s),v=Si(s),_=Ei(u),y=Si(u);var m={a:P,A:z,b:O,B:F,c:null,d:qi,e:qi,f:Qi,H:Xi,I:Gi,j:Yi,L:$i,m:Zi,M:Ki,p:R,Q:Ar,s:kr,S:Ji,u:tr,U:er,V:nr,w:ir,W:rr,x:null,X:null,y:or,Y:ar,Z:sr,"%":Sr};var b={a:I,A:L,b:j,B:H,c:null,d:ur,e:ur,f:dr,H:hr,I:lr,j:fr,L:cr,m:pr,M:gr,p:V,Q:Ar,s:kr,S:vr,u:_r,U:yr,V:mr,w:br,W:xr,x:null,X:null,y:wr,Y:Cr,Z:Er,"%":Sr};var x={a:A,A:k,b:M,B:T,c:B,d:Oi,e:Oi,f:Hi,H:Ri,I:Ri,j:Fi,L:ji,m:zi,M:Ii,p:S,Q:Ui,s:Wi,S:Li,u:ki,U:Mi,V:Ti,w:Ai,W:Bi,x:D,X:N,y:Ni,Y:Di,Z:Pi,"%":Vi};m.x=w(r,m);m.X=w(o,m);m.c=w(i,m);b.x=w(r,b);b.X=w(o,b);b.c=w(i,b);function w(u,h){return function(t){var e=[],n=-1,i=0,r=u.length,o,a,s;if(!(t instanceof Date)){t=new Date(+t)}while(++n53){return null}if(!("w"in e)){e.w=1}if("Z"in e){i=gi(vi(e.y)),r=i.getUTCDay();i=r>4||r===0?ai.ceil(i):ai(i);i=ii.offset(i,(e.V-1)*7);e.y=i.getUTCFullYear();e.m=i.getUTCMonth();e.d=i.getUTCDate()+(e.w+6)%7}else{i=a(vi(e.y)),r=i.getDay();i=r>4||r===0?Gn.ceil(i):Gn(i);i=Wn.offset(i,(e.V-1)*7);e.y=i.getFullYear();e.m=i.getMonth();e.d=i.getDate()+(e.w+6)%7}}else if("W"in e||"U"in e){if(!("w"in e)){e.w="u"in e?e.u%7:"W"in e?1:0}r="Z"in e?gi(vi(e.y)).getUTCDay():a(vi(e.y)).getDay();e.m=0;e.d="W"in e?(e.w+6)%7+e.W*7-(r+5)%7:e.w+e.U*7-(r+6)%7}if("Z"in e){e.H+=e.Z/100|0;e.M+=e.Z%100;return gi(e)}return a(e)}}function E(t,e,n,i){var r=0,o=e.length,a=n.length,s,u;while(r=a){return-1}s=e.charCodeAt(r++);if(s===37){s=e.charAt(r++);u=x[s in yi?e.charAt(r++):s];if(!u||(i=u(t,n,i))<0){return-1}}else if(s!=n.charCodeAt(i++)){return-1}}return i}function S(t,e,n){var i=h.exec(e.slice(n));return i?(t.p=l[i[0].toLowerCase()],n+i[0].length):-1}function A(t,e,n){var i=d.exec(e.slice(n));return i?(t.w=p[i[0].toLowerCase()],n+i[0].length):-1}function k(t,e,n){var i=f.exec(e.slice(n));return i?(t.w=c[i[0].toLowerCase()],n+i[0].length):-1}function M(t,e,n){var i=_.exec(e.slice(n));return i?(t.m=y[i[0].toLowerCase()],n+i[0].length):-1}function T(t,e,n){var i=g.exec(e.slice(n));return i?(t.m=v[i[0].toLowerCase()],n+i[0].length):-1}function B(t,e,n){return E(t,i,e,n)}function D(t,e,n){return E(t,r,e,n)}function N(t,e,n){return E(t,o,e,n)}function P(t){return a[t.getDay()]}function z(t){return n[t.getDay()]}function O(t){return u[t.getMonth()]}function F(t){return s[t.getMonth()]}function R(t){return e[+(t.getHours()>=12)]}function I(t){return a[t.getUTCDay()]}function L(t){return n[t.getUTCDay()]}function j(t){return u[t.getUTCMonth()]}function H(t){return s[t.getUTCMonth()]}function V(t){return e[+(t.getUTCHours()>=12)]}return{format:function(t){var e=w(t+="",m);e.toString=function(){return t};return e},parse:function(t){var e=C(t+="",pi);e.toString=function(){return t};return e},utcFormat:function(t){var e=w(t+="",b);e.toString=function(){return t};return e},utcParse:function(t){var e=C(t,gi);e.toString=function(){return t};return e}}}var yi={"-":"",_:" ",0:"0"};var mi=/^\s*\d+/;var bi=/^%/;var xi=/[\\^$*+?|[\]().{}]/g;function wi(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",o=r.length;return i+(o68?1900:2e3),n+i[0].length):-1}function Pi(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function zi(t,e,n){var i=mi.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function Oi(t,e,n){var i=mi.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function Fi(t,e,n){var i=mi.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function Ri(t,e,n){var i=mi.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function Ii(t,e,n){var i=mi.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function Li(t,e,n){var i=mi.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function ji(t,e,n){var i=mi.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Hi(t,e,n){var i=mi.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function Vi(t,e,n){var i=bi.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function Ui(t,e,n){var i=mi.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Wi(t,e,n){var i=mi.exec(e.slice(n));return i?(t.Q=+i[0]*1e3,n+i[0].length):-1}function qi(t,e){return wi(t.getDate(),e,2)}function Xi(t,e){return wi(t.getHours(),e,2)}function Gi(t,e){return wi(t.getHours()%12||12,e,2)}function Yi(t,e){return wi(1+Wn.count(ti(t),t),e,3)}function $i(t,e){return wi(t.getMilliseconds(),e,3)}function Qi(t,e){return $i(t,e)+"000"}function Zi(t,e){return wi(t.getMonth()+1,e,2)}function Ki(t,e){return wi(t.getMinutes(),e,2)}function Ji(t,e){return wi(t.getSeconds(),e,2)}function tr(t){var e=t.getDay();return e===0?7:e}function er(t,e){return wi(Xn.count(ti(t),t),e,2)}function nr(t,e){var n=t.getDay();t=n>=4||n===0?Qn(t):Qn.ceil(t);return wi(Qn.count(ti(t),t)+(ti(t).getDay()===4),e,2)}function ir(t){return t.getDay()}function rr(t,e){return wi(Gn.count(ti(t),t),e,2)}function or(t,e){return wi(t.getFullYear()%100,e,2)}function ar(t,e){return wi(t.getFullYear()%1e4,e,4)}function sr(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+wi(e/60|0,"0",2)+wi(e%60,"0",2)}function ur(t,e){return wi(t.getUTCDate(),e,2)}function hr(t,e){return wi(t.getUTCHours(),e,2)}function lr(t,e){return wi(t.getUTCHours()%12||12,e,2)}function fr(t,e){return wi(1+ii.count(di(t),t),e,3)}function cr(t,e){return wi(t.getUTCMilliseconds(),e,3)}function dr(t,e){return cr(t,e)+"000"}function pr(t,e){return wi(t.getUTCMonth()+1,e,2)}function gr(t,e){return wi(t.getUTCMinutes(),e,2)}function vr(t,e){return wi(t.getUTCSeconds(),e,2)}function _r(t){var e=t.getUTCDay();return e===0?7:e}function yr(t,e){return wi(oi.count(di(t),t),e,2)}function mr(t,e){var n=t.getUTCDay();t=n>=4||n===0?hi(t):hi.ceil(t);return wi(hi.count(di(t),t)+(di(t).getUTCDay()===4),e,2)}function br(t){return t.getUTCDay()}function xr(t,e){return wi(ai.count(di(t),t),e,2)}function wr(t,e){return wi(t.getUTCFullYear()%100,e,2)}function Cr(t,e){return wi(t.getUTCFullYear()%1e4,e,4)}function Er(){return"+0000"}function Sr(){return"%"}function Ar(t){return+t}function kr(t){return Math.floor(+t/1e3)}var Mr;var Tr;var Br;var Dr;Nr({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function Nr(t){Mr=_i(t);Tr=Mr.format;Br=Mr.utcFormat;Dr=Mr.utcParse;return Mr}var Pr="%Y-%m-%dT%H:%M:%S.%LZ";function zr(t){return t.toISOString()}var Or=Date.prototype.toISOString?zr:Br(Pr);function Fr(t){var e=new Date(t);return isNaN(e)?null:e}var Rr=+new Date("2000-01-01T00:00:00.000Z")?Fr:Dr(Pr);var Ir=1e3;var Lr=Ir*60;var jr=Lr*60;var Hr=jr*24;var Vr=Hr*7;var Ur=Hr*30;var Wr=Hr*365;function qr(t){return new Date(t)}function Xr(t){return t instanceof Date?+t:+new Date(+t)}function Gr(a,e,n,i,r,o,s,u,h){var l=We(Ie,ee),f=l.invert,c=l.domain;var d=h(".%L"),p=h(":%S"),g=h("%I:%M"),v=h("%I %p"),_=h("%a %d"),y=h("%b %d"),m=h("%B"),b=h("%Y");var x=[[s,1,Ir],[s,5,5*Ir],[s,15,15*Ir],[s,30,30*Ir],[o,1,Lr],[o,5,5*Lr],[o,15,15*Lr],[o,30,30*Lr],[r,1,jr],[r,3,3*jr],[r,6,6*jr],[r,12,12*jr],[i,1,Hr],[i,2,2*Hr],[n,1,Vr],[e,1,Ur],[e,3,3*Ur],[a,1,Wr]];function w(t){return(s(t)=0&&(e=t.slice(0,n))!=="xmlns"){t=t.slice(n+1)}return Jr.hasOwnProperty(e)?{space:Jr[e],local:t}:t};function eo(n){return function(){var t=this.ownerDocument,e=this.namespaceURI;return e===Kr&&t.documentElement.namespaceURI===Kr?t.createElement(n):t.createElementNS(e,n)}}function no(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}var io=function(t){var e=to(t);return(e.local?no:eo)(e)};function ro(){}var oo=function(t){return t==null?ro:function(){return this.querySelector(t)}};var ao=function(t){if(typeof t!=="function"){t=oo(t)}for(var e=this._groups,n=e.length,i=new Array(n),r=0;r=m){m=y+1}while(!(x=v[m])&&++m=0;){if(a=i[r]){if(o&&o!==a.nextSibling){o.parentNode.insertBefore(a,o)}o=a}}}return this};var ko=function(n){if(!n){n=Mo}function t(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}for(var e=this._groups,i=e.length,r=new Array(i),o=0;oe?1:t>=e?0:NaN}var To=function(){var t=arguments[0];arguments[0]=this;t.apply(null,arguments);return this};var Bo=function(){var t=new Array(this.size()),e=-1;this.each(function(){t[++e]=this});return t};var Do=function(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?Uo:typeof e==="function"?qo:Wo)(t,e,n==null?"":n)):Go(this.node(),t)};function Go(t,e){return t.style.getPropertyValue(e)||Vo(t).getComputedStyle(t,null).getPropertyValue(e)}function Yo(t){return function(){delete this[t]}}function $o(t,e){return function(){this[t]=e}}function Qo(e,n){return function(){var t=n.apply(this,arguments);if(t==null){delete this[e]}else{this[e]=t}}}var Zo=function(t,e){return arguments.length>1?this.each((e==null?Yo:typeof e==="function"?Qo:$o)(t,e)):this.node()[t]};function Ko(t){return t.trim().split(/^|\s+/)}function Jo(t){return t.classList||new ta(t)}function ta(t){this._node=t;this._names=Ko(t.getAttribute("class")||"")}ta.prototype={add:function(t){var e=this._names.indexOf(t);if(e<0){this._names.push(t);this._node.setAttribute("class",this._names.join(" "))}},remove:function(t){var e=this._names.indexOf(t);if(e>=0){this._names.splice(e,1);this._node.setAttribute("class",this._names.join(" "))}},contains:function(t){return this._names.indexOf(t)>=0}};function ea(t,e){var n=Jo(t),i=-1,r=e.length;while(++i=0){e=t.slice(n+1),t=t.slice(0,n)}return{type:t,name:e}})}function za(a){return function(){var t=this;var e=this.__on;if(!e){return}for(var n=0,i=-1,r=e.length,o;n=0){e=t.slice(n+1),t=t.slice(0,n)}if(t&&!i.hasOwnProperty(t)){throw new Error("unknown type: "+t)}return{type:t,name:e}})}Ja.prototype=Ka.prototype={constructor:Ja,on:function(t,e){var n=this._,i=ts(t+"",n),r,o=-1,a=i.length;if(arguments.length<2){while(++o0){for(var i=new Array(o),r=0,o,a;r=0){t._call.call(null,e)}t=t._next}--is}function ms(){ls=(hs=cs.now())+fs;is=rs=0;try{ys()}finally{is=0;xs();ls=0}}function bs(){var t=cs.now(),e=t-hs;if(e>as){fs-=e,hs=t}}function xs(){var t,e=ss,n,i=Infinity;while(e){if(e._call){if(i>e._time){i=e._time}t=e,e=e._next}else{n=e._next,e._next=null;e=t?t._next=n:ss=n}}us=t;ws(i)}function ws(t){if(is){return}if(rs){rs=clearTimeout(rs)}var e=t-ls;if(e>24){if(tAs){throw new Error("too late; already scheduled")}return n}function Os(t,e){var n=Fs(t,e);if(n.state>Ms){throw new Error("too late; already started")}return n}function Fs(t,e){var n=t.__transition;if(!n||!(n=n[e])){throw new Error("transition not found")}return n}function Rs(o,a,s){var u=o.__transition,h;u[a]=s;s.timer=_s(t,0,s.time);function t(t){s.state=ks;s.timer.restart(l,s.delay,s.time);if(s.delay<=t){l(t-s.delay)}}function l(t){var e,n,i,r;if(s.state!==ks){return c()}for(e in u){r=u[e];if(r.name!==s.name){continue}if(r.state===Ts){return Cs(l)}if(r.state===Bs){r.state=Ns;r.timer.stop();r.on.call("interrupt",o,o.__data__,r.index,r.group);delete u[e]}else if(+eMs&&i.state=0){t=t.slice(0,e)}return!t||t==="start"})}function cu(n,i,r){var o,a,s=fu(i)?zs:Os;return function(){var t=s(this,n),e=t.on;if(e!==o){(a=(o=e).copy()).on(i,r)}t.on=a}}var du=function(t,e){var n=this._id;return arguments.length<2?Fs(this.node(),n).on.on(t):this.each(cu(n,t,e))};function pu(i){return function(){var t=this;var e=this.parentNode;for(var n in t.__transition){if(+n!==i){return}}if(e){e.removeChild(this)}}}var gu=function(){return this.on("end.remove",pu(this._id))};var vu=function(t){var e=this._name,n=this._id;if(typeof t!=="function"){t=oo(t)}for(var i=this._groups,r=i.length,o=new Array(r),a=0;a=0){n=Wt(t.map(function(t){return t instanceof Array?t:[t]}));n=Array.from(new Set(n));if(n.length===1){n=n[0]}}else if(i.indexOf(String)>=0){n=Array.from(new Set(t));if(n.length===1){n=n[0]}}else if(i.indexOf(Number)>=0){n=Xt(t)}else if(i.indexOf(Object)>=0){n=Ju(t.filter(function(t){return t}))}else{n=Array.from(new Set(t.filter(function(t){return t!==void 0})));if(n.length===1){n=n[0]}}}a[e]=n});return a}var th=function(t){var r;if(typeof t==="number"){r=[t]}else{r=t.split(/\s+/)}if(r.length===1){r=[r[0],r[0],r[0],r[0]]}else if(r.length===2){r=r.concat(r)}else if(r.length===3){r.push(r[1])}return["top","right","bottom","left"].reduce(function(t,e,n){var i=parseFloat(r[n]);t[e]=i||0;return t},{})};var eh=function(){if("-webkit-transform"in document.body.style){return"-webkit-"}else if("-moz-transform"in document.body.style){return"-moz-"}else if("-ms-transform"in document.body.style){return"-ms-"}else if("-o-transform"in document.body.style){return"-o-"}else{return""}};var nh=function(t,e){if(e===void 0){e={}}for(var n in e){if({}.hasOwnProperty.call(e,n)){t.style(n,e[n])}}};var ih=function t(){this._duration=600;this._height=ju("height");this._id=ju("id");this._pointerEvents=Zu("auto");this._select;this._url=ju("url");this._width=ju("width");this._x=ju("x",0);this._y=ju("y",0)};ih.prototype.render=function t(e){var n=this;if(this._select===void 0){this.select(qa("body").append("svg").style("width",window.innerWidth+"px").style("height",window.innerHeight+"px").style("display","block").node())}var i=this._select.selectAll(".d3plus-Image").data(this._data,this._id);var r=i.enter().append("image").attr("class","d3plus-Image").attr("opacity",0).attr("width",0).attr("height",0).attr("x",function(t,e){return n._x(t,e)+n._width(t,e)/2}).attr("y",function(t,e){return n._y(t,e)+n._height(t,e)/2});var o=Pu().duration(this._duration),a=this,s=r.merge(i);s.attr("xlink:href",this._url).style("pointer-events",this._pointerEvents).transition(o).attr("opacity",1).attr("width",function(t,e){return n._width(t,e)}).attr("height",function(t,e){return n._height(t,e)}).attr("x",function(t,e){return n._x(t,e)}).attr("y",function(t,e){return n._y(t,e)}).each(function(t,e){var n=qa(this),i=a._url(t,e);var r=i.indexOf("http://")===0||i.indexOf("https://")===0;if(!r||i.indexOf(window.location.hostname)===0){var o=new ih;o.src=i;o.crossOrigin="Anonymous";o.onload=function(){var t=document.createElement("canvas");t.width=this.width;t.height=this.height;var e=t.getContext("2d");e.drawImage(this,0,0);n.attr("xlink:href",t.toDataURL("image/png"))}}});i.exit().transition(o).attr("width",function(t,e){return n._width(t,e)}).attr("height",function(t,e){return n._height(t,e)}).attr("x",function(t,e){return n._x(t,e)}).attr("y",function(t,e){return n._y(t,e)}).attr("opacity",0).remove();if(e){setTimeout(e,this._duration+100)}return this};ih.prototype.data=function t(e){return arguments.length?(this._data=e,this):this._data};ih.prototype.duration=function t(e){return arguments.length?(this._duration=e,this):this._duration};ih.prototype.height=function t(e){return arguments.length?(this._height=typeof e==="function"?e:Zu(e),this):this._height};ih.prototype.id=function t(e){return arguments.length?(this._id=e,this):this._id};ih.prototype.pointerEvents=function t(e){return arguments.length?(this._pointerEvents=typeof e==="function"?e:Zu(e),this):this._pointerEvents};ih.prototype.select=function t(e){return arguments.length?(this._select=qa(e),this):this._select};ih.prototype.url=function t(e){return arguments.length?(this._url=e,this):this._url};ih.prototype.width=function t(e){return arguments.length?(this._width=typeof e==="function"?e:Zu(e),this):this._width};ih.prototype.x=function t(e){return arguments.length?(this._x=typeof e==="function"?e:Zu(e),this):this._x};ih.prototype.y=function t(e){return arguments.length?(this._y=typeof e==="function"?e:Zu(e),this):this._y};var rh=function(t,e,n,i){if(n===void 0){n=1}if(i===void 0){i=1}t=ot(t);e=ot(e);var r=Math.abs(e.h*i-t.h*n);if(r>180){r-=360}var o=(Math.min(t.h,e.h)+r/2)%360;var a=t.l+(e.l*i-t.l*n)/2,s=t.s+(e.s*i-t.s*n)/2;if(o<0){o+=360}return ot("hsl("+o+","+s*100+"%,"+a*100+"%)").toString()};var oh=Array.prototype;var ah=oh.slice;var sh={name:"implicit"};function uh(i){var o=_(),a=[],r=sh;i=i==null?[]:ah.call(i);function s(t){var e=t+"",n=o.get(e);if(!n){if(r!==sh){return r}o.set(e,n=a.push(t))}return i[(n-1)%i.length]}s.domain=function(t){if(!arguments.length){return a.slice()}a=[],o=_();var e=-1,n=t.length,i,r;while(++e=0){return yh("missing",e)}else if(t===true){return yh("on",e)}else if(t===false){return yh("off",e)}var n=Q(t);if(!n){return yh("scale",e)(t)}return t.toString()};var bh=function(t,e){if(e===void 0){e={}}t=tt(t);var n=(t.r*299+t.g*587+t.b*114)/1e3;return n>=128?yh("dark",e):yh("light",e)};var xh=function(t){t=ot(t);if(t.l>.45){if(t.s>.8){t.s=.8}t.l=.45}return t.toString()};var wh=function(t,e){if(e===void 0){e=.5}t=ot(t);e*=1-t.l;t.l+=e;t.s-=e;return t.toString()};var Ch=function(t,e,n,i){if(n===void 0){n=1}if(i===void 0){i=1}t=ot(t);e=ot(e);var r=e.h*i-t.h*n;if(Math.abs(r)>180){r-=360}var o=(t.h-r)%360;var a=t.l-(e.l*i-t.l*n)/2,s=t.s-(e.s*i-t.s*n)/2;if(o<0){o+=360}return ot("hsl("+o+","+s*100+"%,"+a*100+"%)").toString()};var Eh=Math.PI;var Sh=2*Eh;var Ah=1e-6;var kh=Sh-Ah;function Mh(){this._x0=this._y0=this._x1=this._y1=null;this._=""}function Th(){return new Mh}Mh.prototype=Th.prototype={constructor:Mh,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){if(this._x1!==null){this._x1=this._x0,this._y1=this._y0;this._+="Z"}},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,n,i){this._+="Q"+ +t+","+ +e+","+(this._x1=+n)+","+(this._y1=+i)},bezierCurveTo:function(t,e,n,i,r,o){this._+="C"+ +t+","+ +e+","+ +n+","+ +i+","+(this._x1=+r)+","+(this._y1=+o)},arcTo:function(t,e,n,i,r){t=+t,e=+e,n=+n,i=+i,r=+r;var o=this._x1,a=this._y1,s=n-t,u=i-e,h=o-t,l=a-e,f=h*h+l*l;if(r<0){throw new Error("negative radius: "+r)}if(this._x1===null){this._+="M"+(this._x1=t)+","+(this._y1=e)}else if(!(f>Ah)){}else if(!(Math.abs(l*s-u*h)>Ah)||!r){this._+="L"+(this._x1=t)+","+(this._y1=e)}else{var c=n-o,d=i-a,p=s*s+u*u,g=c*c+d*d,v=Math.sqrt(p),_=Math.sqrt(f),y=r*Math.tan((Eh-Math.acos((p+f-g)/(2*v*_)))/2),m=y/_,b=y/v;if(Math.abs(m-1)>Ah){this._+="L"+(t+m*h)+","+(e+m*l)}this._+="A"+r+","+r+",0,0,"+ +(l*c>h*d)+","+(this._x1=t+b*s)+","+(this._y1=e+b*u)}},arc:function(t,e,n,i,r,o){t=+t,e=+e,n=+n;var a=n*Math.cos(i),s=n*Math.sin(i),u=t+a,h=e+s,l=1^o,f=o?i-r:r-i;if(n<0){throw new Error("negative radius: "+n)}if(this._x1===null){this._+="M"+u+","+h}else if(Math.abs(this._x1-u)>Ah||Math.abs(this._y1-h)>Ah){this._+="L"+u+","+h}if(!n){return}if(f<0){f=f%Sh+Sh}if(f>kh){this._+="A"+n+","+n+",0,1,"+l+","+(t-a)+","+(e-s)+"A"+n+","+n+",0,1,"+l+","+(this._x1=u)+","+(this._y1=h)}else if(f>Ah){this._+="A"+n+","+n+",0,"+ +(f>=Eh)+","+l+","+(this._x1=t+n*Math.cos(r))+","+(this._y1=e+n*Math.sin(r))}},rect:function(t,e,n,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +i+"h"+-n+"Z"},toString:function(){return this._}};var Bh=function(e){return function t(){return e}};var Dh=Math.abs;var Nh=Math.atan2;var Ph=Math.cos;var zh=Math.max;var Oh=Math.min;var Fh=Math.sin;var Rh=Math.sqrt;var Ih=1e-12;var Lh=Math.PI;var jh=Lh/2;var Hh=2*Lh;function Vh(t){return t>1?0:t<-1?Lh:Math.acos(t)}function Uh(t){return t>=1?jh:t<=-1?-jh:Math.asin(t)}function Wh(t){return t.innerRadius}function qh(t){return t.outerRadius}function Xh(t){return t.startAngle}function Gh(t){return t.endAngle}function Yh(t){return t&&t.padAngle}function $h(t,e,n,i,r,o,a,s){var u=n-t,h=i-e,l=a-r,f=s-o,c=(l*(e-o)-f*(t-r))/(f*u-l*h);return[t+c*u,e+c*h]}function Qh(t,e,n,i,r,o,a){var s=t-n,u=e-i,h=(a?o:-o)/Rh(s*s+u*u),l=h*u,f=-h*s,c=t+l,d=e+f,p=n+l,g=i+f,v=(c+p)/2,_=(d+g)/2,y=p-c,m=g-d,b=y*y+m*m,x=r-o,w=c*g-p*d,C=(m<0?-1:1)*Rh(zh(0,x*x*b-w*w)),E=(w*m-y*C)/b,S=(-w*y-m*C)/b,A=(w*m+y*C)/b,k=(-w*y+m*C)/b,M=E-v,T=S-_,B=A-v,D=k-_;if(M*M+T*T>B*B+D*D){E=A,S=k}return{cx:E,cy:S,x01:-l,y01:-f,x11:E*(r/x-1),y11:S*(r/x-1)}}var Zh=function(){var I=Wh,L=qh,j=Bh(0),H=null,V=Xh,U=Gh,W=Yh,q=null;function e(){var t,e,n=+I.apply(this,arguments),i=+L.apply(this,arguments),r=V.apply(this,arguments)-jh,o=U.apply(this,arguments)-jh,a=Dh(o-r),s=o>r;if(!q){q=t=Th()}if(iIh)){q.moveTo(0,0)}else if(a>Hh-Ih){q.moveTo(i*Ph(r),i*Fh(r));q.arc(0,0,i,r,o,!s);if(n>Ih){q.moveTo(n*Ph(o),n*Fh(o));q.arc(0,0,n,o,r,s)}}else{var u=r,h=o,l=r,f=o,c=a,d=a,p=W.apply(this,arguments)/2,g=p>Ih&&(H?+H.apply(this,arguments):Rh(n*n+i*i)),v=Oh(Dh(i-n)/2,+j.apply(this,arguments)),_=v,y=v,m,b;if(g>Ih){var x=Uh(g/n*Fh(p)),w=Uh(g/i*Fh(p));if((c-=x*2)>Ih){x*=s?1:-1,l+=x,f-=x}else{c=0,l=f=(r+o)/2}if((d-=w*2)>Ih){w*=s?1:-1,u+=w,h-=w}else{d=0,u=h=(r+o)/2}}var C=i*Ph(u),E=i*Fh(u),S=n*Ph(f),A=n*Fh(f);if(v>Ih){var k=i*Ph(h),M=i*Fh(h),T=n*Ph(l),B=n*Fh(l);if(aIh?$h(C,E,T,B,k,M,S,A):[S,A],N=C-D[0],P=E-D[1],z=k-D[0],O=M-D[1],F=1/Fh(Vh((N*z+P*O)/(Rh(N*N+P*P)*Rh(z*z+O*O)))/2),R=Rh(D[0]*D[0]+D[1]*D[1]);_=Oh(v,(n-R)/(F-1));y=Oh(v,(i-R)/(F+1))}}if(!(d>Ih)){q.moveTo(C,E)}else if(y>Ih){m=Qh(T,B,C,E,i,y,s);b=Qh(k,M,S,A,i,y,s);q.moveTo(m.cx+m.x01,m.cy+m.y01);if(yIh)||!(c>Ih)){q.lineTo(S,A)}else if(_>Ih){m=Qh(S,A,k,M,n,-_,s);b=Qh(C,E,T,B,n,-_,s);q.lineTo(m.cx+m.x01,m.cy+m.y01);if(_=n;--i){_.point(u[i],h[i])}_.lineEnd();_.areaEnd()}}if(a){u[e]=+l(o,e,t),h[e]=+c(o,e,t);_.point(f?+f(o,e,t):u[e],d?+d(o,e,t):h[e])}}if(s){return _=null,s+""||null}}function t(){return nl().defined(p).curve(v).context(g)}e.x=function(t){return arguments.length?(l=typeof t==="function"?t:Bh(+t),f=null,e):l};e.x0=function(t){return arguments.length?(l=typeof t==="function"?t:Bh(+t),e):l};e.x1=function(t){return arguments.length?(f=t==null?null:typeof t==="function"?t:Bh(+t),e):f};e.y=function(t){return arguments.length?(c=typeof t==="function"?t:Bh(+t),d=null,e):c};e.y0=function(t){return arguments.length?(c=typeof t==="function"?t:Bh(+t),e):c};e.y1=function(t){return arguments.length?(d=t==null?null:typeof t==="function"?t:Bh(+t),e):d};e.lineX0=e.lineY0=function(){return t().x(l).y(c)};e.lineY1=function(){return t().x(l).y(d)};e.lineX1=function(){return t().x(f).y(c)};e.defined=function(t){return arguments.length?(p=typeof t==="function"?t:Bh(!!t),e):p};e.curve=function(t){return arguments.length?(v=t,g!=null&&(_=v(g)),e):v};e.context=function(t){return arguments.length?(t==null?g=_=null:_=v(g=t),e):g};return e};var rl=function(t,e){return et?1:e>=t?0:NaN};var ol=function(t){return t};var al=function(){var p=ol,g=rl,v=null,_=Bh(0),y=Bh(Hh),m=Bh(0);function e(n){var t,e=n.length,i,r,o=0,a=new Array(e),s=new Array(e),u=+_.apply(this,arguments),h=Math.min(Hh,Math.max(-Hh,y.apply(this,arguments)-u)),l,f=Math.min(Math.abs(h)/e,m.apply(this,arguments)),c=f*(h<0?-1:1),d;for(t=0;t0){o+=d}}if(g!=null){a.sort(function(t,e){return g(s[t],s[e])})}else if(v!=null){a.sort(function(t,e){return v(n[t],n[e])})}for(t=0,r=o?(h-e*c)/o:0;t0?d*r:0)+c,s[i]={data:n[i],index:t,value:d,startAngle:u,endAngle:l,padAngle:f}}return s}e.value=function(t){return arguments.length?(p=typeof t==="function"?t:Bh(+t),e):p};e.sortValues=function(t){return arguments.length?(g=t,v=null,e):g};e.sort=function(t){return arguments.length?(v=t,g=null,e):v};e.startAngle=function(t){return arguments.length?(_=typeof t==="function"?t:Bh(+t),e):_};e.endAngle=function(t){return arguments.length?(y=typeof t==="function"?t:Bh(+t),e):y};e.padAngle=function(t){return arguments.length?(m=typeof t==="function"?t:Bh(+t),e):m};return e};var sl=hl(Jh);function ul(t){this._curve=t}ul.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}};function hl(e){function t(t){return new ul(e(t))}t._curve=e;return t}function ll(t){var e=t.curve;t.angle=t.x,delete t.x;t.radius=t.y,delete t.y;t.curve=function(t){return arguments.length?e(hl(t)):e()._curve};return t}var fl=function(){return ll(nl().curve(sl))};var cl=function(){var t=il().curve(sl),e=t.curve,n=t.lineX0,i=t.lineX1,r=t.lineY0,o=t.lineY1;t.angle=t.x,delete t.x;t.startAngle=t.x0,delete t.x0;t.endAngle=t.x1,delete t.x1;t.radius=t.y,delete t.y;t.innerRadius=t.y0,delete t.y0;t.outerRadius=t.y1,delete t.y1;t.lineStartAngle=function(){return ll(n())},delete t.lineX0;t.lineEndAngle=function(){return ll(i())},delete t.lineX1;t.lineInnerRadius=function(){return ll(r())},delete t.lineY0;t.lineOuterRadius=function(){return ll(o())},delete t.lineY1;t.curve=function(t){return arguments.length?e(hl(t)):e()._curve};return t};var dl=function(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]};var pl=Array.prototype.slice;function gl(t){return t.source}function vl(t){return t.target}function _l(r){var o=gl,a=vl,s=tl,u=el,h=null;function e(){var t,e=pl.call(arguments),n=o.apply(this,e),i=a.apply(this,e);if(!h){h=t=Th()}r(h,+s.apply(this,(e[0]=n,e)),+u.apply(this,e),+s.apply(this,(e[0]=i,e)),+u.apply(this,e));if(t){return h=null,t+""||null}}e.source=function(t){return arguments.length?(o=t,e):o};e.target=function(t){return arguments.length?(a=t,e):a};e.x=function(t){return arguments.length?(s=typeof t==="function"?t:Bh(+t),e):s};e.y=function(t){return arguments.length?(u=typeof t==="function"?t:Bh(+t),e):u};e.context=function(t){return arguments.length?(h=t==null?null:t,e):h};return e}function yl(t,e,n,i,r){t.moveTo(e,n);t.bezierCurveTo(e=(e+i)/2,n,e,r,i,r)}function ml(t,e,n,i,r){t.moveTo(e,n);t.bezierCurveTo(e,n=(n+r)/2,i,n,i,r)}function bl(t,e,n,i,r){var o=dl(e,n),a=dl(e,n=(n+r)/2),s=dl(i,n),u=dl(i,r);t.moveTo(o[0],o[1]);t.bezierCurveTo(a[0],a[1],s[0],s[1],u[0],u[1])}function xl(){return _l(yl)}function wl(){return _l(ml)}function Cl(){var t=_l(bl);t.angle=t.x,delete t.x;t.radius=t.y,delete t.y;return t}var El={draw:function(t,e){var n=Math.sqrt(e/Lh);t.moveTo(n,0);t.arc(0,0,n,0,Hh)}};var Sl={draw:function(t,e){var n=Math.sqrt(e/5)/2;t.moveTo(-3*n,-n);t.lineTo(-n,-n);t.lineTo(-n,-3*n);t.lineTo(n,-3*n);t.lineTo(n,-n);t.lineTo(3*n,-n);t.lineTo(3*n,n);t.lineTo(n,n);t.lineTo(n,3*n);t.lineTo(-n,3*n);t.lineTo(-n,n);t.lineTo(-3*n,n);t.closePath()}};var Al=Math.sqrt(1/3);var kl=Al*2;var Ml={draw:function(t,e){var n=Math.sqrt(e/kl),i=n*Al;t.moveTo(0,-n);t.lineTo(i,0);t.lineTo(0,n);t.lineTo(-i,0);t.closePath()}};var Tl=.8908130915292852;var Bl=Math.sin(Lh/10)/Math.sin(7*Lh/10);var Dl=Math.sin(Hh/10)*Bl;var Nl=-Math.cos(Hh/10)*Bl;var Pl={draw:function(t,e){var n=Math.sqrt(e*Tl),i=Dl*n,r=Nl*n;t.moveTo(0,-n);t.lineTo(i,r);for(var o=1;o<5;++o){var a=Hh*o/5,s=Math.cos(a),u=Math.sin(a);t.lineTo(u*n,-s*n);t.lineTo(s*i-u*r,u*i+s*r)}t.closePath()}};var zl={draw:function(t,e){var n=Math.sqrt(e),i=-n/2;t.rect(i,i,n,n)}};var Ol=Math.sqrt(3);var Fl={draw:function(t,e){var n=-Math.sqrt(e/(Ol*3));t.moveTo(0,n*2);t.lineTo(-Ol*n,-n);t.lineTo(Ol*n,-n);t.closePath()}};var Rl=-.5;var Il=Math.sqrt(3)/2;var Ll=1/Math.sqrt(12);var jl=(Ll/2+1)*3;var Hl={draw:function(t,e){var n=Math.sqrt(e/jl),i=n/2,r=n*Ll,o=i,a=n*Ll+n,s=-o,u=a;t.moveTo(i,r);t.lineTo(o,a);t.lineTo(s,u);t.lineTo(Rl*i-Il*r,Il*i+Rl*r);t.lineTo(Rl*o-Il*a,Il*o+Rl*a);t.lineTo(Rl*s-Il*u,Il*s+Rl*u);t.lineTo(Rl*i+Il*r,Rl*r-Il*i);t.lineTo(Rl*o+Il*a,Rl*a-Il*o);t.lineTo(Rl*s+Il*u,Rl*u-Il*s);t.closePath()}};var Vl=[El,Sl,Ml,zl,Pl,Fl,Hl];var Ul=function(){var e=Bh(El),n=Bh(64),i=null;function r(){var t;if(!i){i=t=Th()}e.apply(this,arguments).draw(i,+n.apply(this,arguments));if(t){return i=null,t+""||null}}r.type=function(t){return arguments.length?(e=typeof t==="function"?t:Bh(t),r):e};r.size=function(t){return arguments.length?(n=typeof t==="function"?t:Bh(+t),r):n};r.context=function(t){return arguments.length?(i=t==null?null:t,r):i};return r};var Wl=function(){};function ql(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Xl(t){this._context=t}Xl.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function(){switch(this._point){case 3:ql(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1){this._context.closePath()}this._line=1-this._line},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:ql(this,t,e);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=e}};var Gl=function(t){return new Xl(t)};function Yl(t){this._context=t}Yl.prototype={areaStart:Wl,areaEnd:Wl,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN;this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2);this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3);this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3);this._context.closePath();break}case 3:{this.point(this._x2,this._y2);this.point(this._x3,this._y3);this.point(this._x4,this._y4);break}}},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;this._x2=t,this._y2=e;break;case 1:this._point=2;this._x3=t,this._y3=e;break;case 2:this._point=3;this._x4=t,this._y4=e;this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:ql(this,t,e);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=e}};var $l=function(t){return new Yl(t)};function Ql(t){this._context=t}Ql.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN;this._point=0},lineEnd:function(){if(this._line||this._line!==0&&this._point===3){this._context.closePath()}this._line=1-this._line},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:ql(this,t,e);break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=e}};var Zl=function(t){return new Ql(t)};function Kl(t,e){this._basis=new Xl(t);this._beta=e}Kl.prototype={lineStart:function(){this._x=[];this._y=[];this._basis.lineStart()},lineEnd:function(){var t=this;var e=this._x,n=this._y,i=e.length-1;if(i>0){var r=e[0],o=n[0],a=e[i]-r,s=n[i]-o,u=-1,h;while(++u<=i){h=u/i;t._basis.point(t._beta*e[u]+(1-t._beta)*(r+h*a),t._beta*n[u]+(1-t._beta)*(o+h*s))}}this._x=this._y=null;this._basis.lineEnd()},point:function(t,e){this._x.push(+t);this._y.push(+e)}};var Jl=function e(n){function t(t){return n===1?new Xl(t):new Kl(t,n)}t.beta=function(t){return e(+t)};return t}(.85);function tf(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function ef(t,e){this._context=t;this._k=(1-e)/6}ef.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:tf(this,this._x1,this._y1);break}if(this._line||this._line!==0&&this._point===1){this._context.closePath()}this._line=1-this._line},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;this._x1=t,this._y1=e;break;case 2:this._point=3;default:tf(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=e}};var nf=function e(n){function t(t){return new ef(t,n)}t.tension=function(t){return e(+t)};return t}(0);function rf(t,e){this._context=t;this._k=(1-e)/6}rf.prototype={areaStart:Wl,areaEnd:Wl,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;this._x3=t,this._y3=e;break;case 1:this._point=2;this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3;this._x5=t,this._y5=e;break;default:tf(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=e}};var of=function e(n){function t(t){return new rf(t,n)}t.tension=function(t){return e(+t)};return t}(0);function af(t,e){this._context=t;this._k=(1-e)/6}af.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._point=0},lineEnd:function(){if(this._line||this._line!==0&&this._point===3){this._context.closePath()}this._line=1-this._line},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:tf(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=e}};var sf=function e(n){function t(t){return new af(t,n)}t.tension=function(t){return e(+t)};return t}(0);function uf(t,e,n){var i=t._x1,r=t._y1,o=t._x2,a=t._y2;if(t._l01_a>Ih){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/u;r=(r*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Ih){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*h+t._x1*t._l23_2a-e*t._l12_2a)/l;a=(a*h+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(i,r,o,a,t._x2,t._y2)}function hf(t,e){this._context=t;this._alpha=e}hf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}if(this._line||this._line!==0&&this._point===1){this._context.closePath()}this._line=1-this._line},point:function(t,e){t=+t,e=+e;if(this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:uf(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=e}};var lf=function e(n){function t(t){return n?new hf(t,n):new ef(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function ff(t,e){this._context=t;this._alpha=e}ff.prototype={areaStart:Wl,areaEnd:Wl,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3);this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3);this._context.closePath();break}case 3:{this.point(this._x3,this._y3);this.point(this._x4,this._y4);this.point(this._x5,this._y5);break}}},point:function(t,e){t=+t,e=+e;if(this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;this._x3=t,this._y3=e;break;case 1:this._point=2;this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3;this._x5=t,this._y5=e;break;default:uf(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=e}};var cf=function e(n){function t(t){return n?new ff(t,n):new rf(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function df(t,e){this._context=t;this._alpha=e}df.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN;this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){if(this._line||this._line!==0&&this._point===3){this._context.closePath()}this._line=1-this._line},point:function(t,e){t=+t,e=+e;if(this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:uf(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a;this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a;this._x0=this._x1,this._x1=this._x2,this._x2=t;this._y0=this._y1,this._y1=this._y2,this._y2=e}};var pf=function e(n){function t(t){return n?new df(t,n):new af(t,0)}t.alpha=function(t){return e(+t)};return t}(.5);function gf(t){this._context=t}gf.prototype={areaStart:Wl,areaEnd:Wl,lineStart:function(){this._point=0},lineEnd:function(){if(this._point){this._context.closePath()}},point:function(t,e){t=+t,e=+e;if(this._point){this._context.lineTo(t,e)}else{this._point=1,this._context.moveTo(t,e)}}};var vf=function(t){return new gf(t)};function _f(t){return t<0?-1:1}function yf(t,e,n){var i=t._x1-t._x0,r=e-t._x1,o=(t._y1-t._y0)/(i||r<0&&-0),a=(n-t._y1)/(r||i<0&&-0),s=(o*r+a*i)/(i+r);return(_f(o)+_f(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(s))||0}function mf(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function bf(t,e,n){var i=t._x0,r=t._y0,o=t._x1,a=t._y1,s=(o-i)/3;t._context.bezierCurveTo(i+s,r+s*e,o-s,a-s*n,o,a)}function xf(t){this._context=t}xf.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN;this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:bf(this,this._t0,mf(this,this._t0));break}if(this._line||this._line!==0&&this._point===1){this._context.closePath()}this._line=1-this._line},point:function(t,e){var n=NaN;t=+t,e=+e;if(t===this._x1&&e===this._y1){return}switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;bf(this,mf(this,n=yf(this,t,e)),n);break;default:bf(this,this._t0,n=yf(this,t,e));break}this._x0=this._x1,this._x1=t;this._y0=this._y1,this._y1=e;this._t0=n}};function wf(t){this._context=new Cf(t)}(wf.prototype=Object.create(xf.prototype)).point=function(t,e){xf.prototype.point.call(this,e,t)};function Cf(t){this._context=t}Cf.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,r,o){this._context.bezierCurveTo(e,t,i,n,o,r)}};function Ef(t){return new xf(t)}function Sf(t){return new wf(t)}function Af(t){this._context=t}Af.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[];this._y=[]},lineEnd:function(){var t=this;var e=this._x,n=this._y,i=e.length;if(i){this._line?this._context.lineTo(e[0],n[0]):this._context.moveTo(e[0],n[0]);if(i===2){this._context.lineTo(e[1],n[1])}else{var r=kf(e),o=kf(n);for(var a=0,s=1;s=0;--e){r[e]=(a[e]-r[e+1])/o[e]}o[n-1]=(t[n]+r[n-1])/2;for(e=0;e=0){this._t=1-this._t,this._line=1-this._line}},point:function(t,e){t=+t,e=+e;switch(this._point){case 0:this._point=1;this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0){this._context.lineTo(this._x,e);this._context.lineTo(t,e)}else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y);this._context.lineTo(n,e)}break}}this._x=t,this._y=e}};var Bf=function(t){return new Tf(t,.5)};function Df(t){return new Tf(t,0)}function Nf(t){return new Tf(t,1)}var Pf=function(t,e){if(!((a=t.length)>1)){return}for(var n=1,i,r,o=t[e[0]],a,s=o.length;n=0){n[e]=e}return n};function Of(t,e){return t[e]}var Ff=function(){var f=Bh([]),c=zf,d=Pf,p=Of;function e(t){var e=f.apply(this,arguments),n,i=t.length,r=e.length,o=new Array(r),a;for(n=0;n0)){return}for(var n,i,r=0,o=t[0].length,a;r1)){return}for(var n,i=0,r,o,a,s,u,h=t[e[0]].length;i=0){r[0]=a,r[1]=a+=o}else if(o<0){r[1]=s,r[0]=s+=o}else{r[0]=a}}}};var Lf=function(t,e){if(!((r=t.length)>0)){return}for(var n=0,i=t[e[0]],r,o=i.length;n0)||!((o=(r=t[e[0]]).length)>0)){return}for(var n=0,i=1,r,o,a;i",")","}","]",".","!","?","u00BB","u300B","u3009"].concat(cc);var gc="က-ဪဿ-၉ၐ-ၕ";var vc="぀-ゟ゠-ヿ＀-+--}⦅-゚㐀-䶿";var _c="㐀-龿";var yc="ກ-ຮະ-ໄ່-໋ໍ-ໝ";var mc=gc+_c+yc;var bc=new RegExp("(\\"+cc.join("|\\")+")*[^\\s|\\"+cc.join("|\\")+"]*(\\"+cc.join("|\\")+")*","g");var xc=new RegExp("["+vc+"]");var wc=new RegExp("["+mc+"]");var Cc=new RegExp("(\\"+dc.join("|\\")+")*["+mc+"](\\"+pc.join("|\\")+"|\\"+fc.join("|\\")+")*|[a-z0-9]+","gi");var Ec=function(t){if(!wc.test(t)){return ac(t).match(bc).filter(function(t){return t.length})}return Wt(ac(t).match(bc).map(function(t){if(!xc.test(t)&&wc.test(t)){return t.match(Cc)}return[t]}))};var Sc=function(){var d="sans-serif",p=10,g=400,v=200,_,y=false,m=Ec,b=200;function e(t){t=ac(t);if(_===void 0){_=Math.ceil(p*1.4)}var e=m(t);var n={"font-family":d,"font-size":p,"font-weight":g,"line-height":_};var i=1,r="",o=false,a=0;var s=[],u=Gf(e,n),h=Gf(" ",n);for(var l=0;lb){if(!l&&!y){o=true;break}s[i-1]=Qf(s[i-1]);i++;if(_*i>v||c>b&&!y){o=true;break}a=0;s.push(f)}else if(!l){s[0]=f}else{s[i-1]+=f}r+=f;a+=c;a+=f.match(/[\s]*$/g)[0].length*h}return{lines:s,sentence:t,truncated:o,widths:Gf(s,n),words:e}}e.fontFamily=function(t){return arguments.length?(d=t,e):d};e.fontSize=function(t){return arguments.length?(p=t,e):p};e.fontWeight=function(t){return arguments.length?(g=t,e):g};e.height=function(t){return arguments.length?(v=t,e):v};e.lineHeight=function(t){return arguments.length?(_=t,e):_};e.overflow=function(t){return arguments.length?(y=t,e):y};e.split=function(t){return arguments.length?(m=t,e):m};e.width=function(t){return arguments.length?(b=t,e):b};return e};var Ac=function(t){function e(){var n=this;t.call(this);this._delay=0;this._duration=0;this._ellipsis=function(t,e){return e?t.replace(/\.|,$/g,"")+"...":""};this._fontColor=Zu("black");this._fontFamily=Zu(["Roboto","Helvetica Neue","HelveticaNeue","Helvetica","Arial","sans-serif"]);this._fontMax=Zu(50);this._fontMin=Zu(8);this._fontOpacity=Zu(1);this._fontResize=Zu(false);this._fontSize=Zu(10);this._fontWeight=Zu(400);this._height=ju("height",200);this._id=function(t,e){return t.id||""+e};this._lineHeight=function(t,e){return n._fontSize(t,e)*1.2};this._on={};this._overflow=Zu(false);this._padding=Zu(0);this._pointerEvents=Zu("auto");this._rotate=Zu(0);this._rotateAnchor=function(t){return[t.w/2,t.h/2]};this._split=Ec;this._text=ju("text");this._textAnchor=Zu("start");this._verticalAlign=Zu("top");this._width=ju("width",200);this._x=ju("x",0);this._y=ju("y",0)}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype.render=function t(e){var N=this;if(this._select===void 0){this.select(qa("body").append("svg").style("width",window.innerWidth+"px").style("height",window.innerHeight+"px").node())}var P=this;var n=this._select.selectAll(".d3plus-textBox").data(this._data.reduce(function(t,e,n){var i=N._text(e,n);if(i===void 0){return t}var r=N._fontResize(e,n);var o=N._lineHeight(e,n)/N._fontSize(e,n);var a=r?N._fontMax(e,n):N._fontSize(e,n),s=r?a*o:N._lineHeight(e,n),u=1,h=[],l,f;var c={"font-family":rc(N._fontFamily(e,n)),"font-size":a,"font-weight":N._fontWeight(e,n),"line-height":s};var d=th(N._padding(e,n));var p=N._height(e,n)-(d.top+d.bottom),g=N._width(e,n)-(d.left+d.right);var v=Sc().fontFamily(c["font-family"]).fontSize(a).fontWeight(c["font-weight"]).lineHeight(s).height(p).overflow(N._overflow(e,n)).width(g);var _=N._fontMax(e,n),y=N._fontMin(e,n),m=N._verticalAlign(e,n),b=N._split(i,n);function x(){if(a_){a=_}if(r){s=a*o;v.fontSize(a).lineHeight(s);c["font-size"]=a;c["line-height"]=s}f=v(i);h=f.lines.filter(function(t){return t!==""});u=h.length;if(f.truncated){if(r){a--;if(ay&&(p>s||r&&p>y*o)){if(r){l=Gf(b,c);var w=1.165+g/p*.1,C=g*p,E=Ut(l),S=Xt(l,function(t){return t*s})*w;if(E>g||S>C){var A=Math.sqrt(C/S),k=g/E;var M=qt([A,k]);a=Math.floor(a*M)}var T=Math.floor(p*.8);if(a>T){a=T}}x()}if(h.length){var B=u*s;var D=m==="top"?0:m==="middle"?p/2-B/2:p-B;D-=s*.1;t.push({data:e,i:n,lines:h,fC:N._fontColor(e,n),fF:c["font-family"],fO:N._fontOpacity(e,n),fW:c["font-weight"],id:N._id(e,n),tA:N._textAnchor(e,n),widths:f.widths,fS:a,lH:s,w:g,h:p,x:N._x(e,n)+d.left,y:N._y(e,n)+D+d.top})}return t},[]),this._id);var i=Pu().duration(this._duration);if(this._duration===0){n.exit().remove()}else{n.exit().transition().delay(this._duration).remove();n.exit().selectAll("text").transition(i).attr("opacity",0)}function r(t){t.attr("transform",function(t,e){var n=P._rotateAnchor(t,e);return"translate("+t.x+", "+t.y+") rotate("+P._rotate(t,e)+", "+n[0]+", "+n[1]+")"})}var o=n.enter().append("g").attr("class","d3plus-textBox").attr("id",function(t){return"d3plus-textBox-"+uc(t.id)}).call(r).merge(n);var a=oc();o.style("pointer-events",function(t){return N._pointerEvents(t.data,t.i)}).each(function(n){function t(t){t.text(function(t){return Qf(t)}).attr("dir",a?"rtl":"ltr").attr("fill",n.fC).attr("text-anchor",n.tA).attr("font-family",n.fF).style("font-family",n.fF).attr("font-size",n.fS+"px").style("font-size",n.fS+"px").attr("font-weight",n.fW).style("font-weight",n.fW).attr("opacity",n.fO).style("opacity",n.fO).attr("x",(n.tA==="middle"?n.w/2:a?n.tA==="start"?n.w:0:n.tA==="end"?n.w:0)+"px").attr("y",function(t,e){return(e+1)*n.lH-(n.lH-n.fS)+"px"})}var e=qa(this).selectAll("text").data(n.lines);if(P._duration===0){e.call(t);e.exit().remove();e.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("unicode-bidi","bidi-override").call(t)}else{e.transition(i).call(t);e.exit().transition(i).attr("opacity",0).remove();e.enter().append("text").attr("dominant-baseline","alphabetic").style("baseline-shift","0%").attr("opacity",0).call(t).merge(e).transition(i).delay(P._delay).call(t).attr("opacity",1)}}).transition(i).call(r);var s=Object.keys(this._on),u=s.reduce(function(t,n){t[n]=function(t,e){return N._on[n](t.data,e)};return t},{});for(var h=0;h=0){return a[r]}else if(o.includes(i)&&e!==0&&e!==u.length-1){return n}else{return t.charAt(0).toUpperCase()+t.substr(1).toLowerCase()}}else{return""}}).reduce(function(t,e,n){if(n&&i.charAt(t.length)===" "){t+=" "}t+=e;return t},"")};var Bc=function(t,e){var n=e[0]-t[0],i=e[1]-t[1];return n*n+i*i};var Dc=function(t,e){return Math.sqrt(Bc(t,e))};var Nc=function(e){function t(t){var i=this;if(t===void 0){t="g"}e.call(this);this._activeOpacity=.25;this._activeStyle={stroke:function(t,e){var n=i._fill(t,e);if(["transparent","none"].includes(n)){n=i._stroke(t,e)}return Q(n).darker(1)},"stroke-width":function(t,e){var n=i._strokeWidth(t,e)||1;return n*3}};this._backgroundImage=Zu(false);this._backgroundImageClass=new ih;this._data=[];this._duration=600;this._fill=Zu("black");this._fillOpacity=Zu(1);this._hoverOpacity=.5;this._hoverStyle={stroke:function(t,e){var n=i._fill(t,e);if(["transparent","none"].includes(n)){n=i._stroke(t,e)}return Q(n).darker(.5)},"stroke-width":function(t,e){var n=i._strokeWidth(t,e)||1;return n*2}};this._id=function(t,e){return t.id!==void 0?t.id:e};this._label=Zu(false);this._labelClass=new Ac;this._labelConfig={fontColor:function(t,e){return bh(i._fill(t,e))},fontSize:12,padding:5};this._name="Shape";this._opacity=Zu(1);this._pointerEvents=Zu("visiblePainted");this._rotate=Zu(0);this._rx=Zu(0);this._ry=Zu(0);this._scale=Zu(1);this._shapeRendering=Zu("geometricPrecision");this._stroke=function(t,e){return Q(i._fill(t,e)).darker(1)};this._strokeDasharray=Zu("0");this._strokeLinecap=Zu("butt");this._strokeOpacity=Zu(1);this._strokeWidth=Zu(0);this._tagName=t;this._textAnchor=Zu("start");this._vectorEffect=Zu("non-scaling-stroke");this._verticalAlign=Zu("top");this._x=ju("x",0);this._y=ju("y",0)}if(e){t.__proto__=e}t.prototype=Object.create(e&&e.prototype);t.prototype.constructor=t;t.prototype._aes=function t(){return{}};t.prototype._applyEvents=function t(e){var o=this;var a=Object.keys(this._on);var n=function(r){e.on(a[r],function(t,e){if(!o._on[a[r]]){return}if(t.i!==void 0){e=t.i}if(t.nested&&t.values){var n=Ya(o._select.node()),i=t.values.map(function(t){return Dc(n,[o._x(t,e),o._y(t,e)])});t=t.values[i.indexOf(qt(i))]}o._on[a[r]].bind(o)(t,e)})};for(var i=0;i *, g.d3plus-"+this._name+"-active > *").each(function(t){if(t&&t.parentNode){t.parentNode.appendChild(this)}else{this.parentNode.removeChild(this)}});this._group=Ku("g.d3plus-"+this._name+"-group",{parent:this._select});var o=this._update=Ku("g.d3plus-"+this._name+"-shape",{parent:this._group,update:{opacity:this._active?this._activeOpacity:1}}).selectAll(".d3plus-"+this._name).data(i,r);o.order().transition(this._transition).call(this._applyTransform.bind(this));var a=this._enter=o.enter().append(this._tagName).attr("class",function(t,e){return"d3plus-Shape d3plus-"+n._name+" d3plus-id-"+uc(n._nestWrapper(n._id)(t,e))}).call(this._applyTransform.bind(this)).attr("opacity",this._nestWrapper(this._opacity));var s=a.merge(o);s.attr("shape-rendering",this._nestWrapper(this._shapeRendering)).attr("pointer-events","none").transition(this._transition).attr("opacity",this._nestWrapper(this._opacity)).transition().attr("pointer-events",this._pointerEvents);var u=this._exit=o.exit();u.transition().delay(this._duration).remove();this._renderImage();this._renderLabels();this._hoverGroup=Ku("g.d3plus-"+this._name+"-hover",{parent:this._group});this._activeGroup=Ku("g.d3plus-"+this._name+"-active",{parent:this._group});var h=this._group.selectAll(".d3plus-HitArea").data(this._hitArea?i:[],r);h.order().call(this._applyTransform.bind(this));var l=this._name==="Line";l&&this._path.curve(Xf["curve"+this._curve.charAt(0).toUpperCase()+this._curve.slice(1)]).defined(this._defined).x(this._x).y(this._y);var f=h.enter().append(l?"path":"rect").attr("class",function(t,e){return"d3plus-HitArea d3plus-id-"+uc(n._nestWrapper(n._id)(t,e))}).attr("fill","black").attr("stroke","black").attr("pointer-events","painted").attr("opacity",0).call(this._applyTransform.bind(this));var c=this;var d=h.merge(f).each(function(t){var e=c._data.indexOf(t);var n=c._hitArea(t,e,c._aes(t,e));return n&&!(c._name==="Line"&&parseFloat(c._strokeWidth(t,e))>10)?qa(this).call(Uu,n):qa(this).remove()});h.exit().remove();this._applyEvents(this._hitArea?d:s);setTimeout(function(){if(n._active){n._renderActive()}else if(n._hover){n._renderHover()}if(e){e()}},this._duration+100);return this};t.prototype.active=function t(e){if(!arguments.length||e===undefined){return this._active}this._active=e;if(this._group){this._renderActive()}return this};t.prototype.activeOpacity=function t(e){return arguments.length?(this._activeOpacity=e,this):this._activeOpacity};t.prototype.activeStyle=function t(e){return arguments.length?(this._activeStyle=Vu({},this._activeStyle,e),this):this._activeStyle};t.prototype.backgroundImage=function t(e){return arguments.length?(this._backgroundImage=typeof e==="function"?e:Zu(e),this):this._backgroundImage};t.prototype.data=function t(e){return arguments.length?(this._data=e,this):this._data};t.prototype.duration=function t(e){return arguments.length?(this._duration=e,this):this._duration};t.prototype.fill=function t(e){return arguments.length?(this._fill=typeof e==="function"?e:Zu(e),this):this._fill};t.prototype.fillOpacity=function t(e){return arguments.length?(this._fillOpacity=typeof e==="function"?e:Zu(e),this):this._fillOpacity};t.prototype.hover=function t(e){if(!arguments.length||e===void 0){return this._hover}this._hover=e;if(this._group){this._renderHover()}return this};t.prototype.hoverStyle=function t(e){return arguments.length?(this._hoverStyle=Vu({},this._hoverStyle,e),this):this._hoverStyle};t.prototype.hoverOpacity=function t(e){return arguments.length?(this._hoverOpacity=e,this):this._hoverOpacity};t.prototype.hitArea=function t(e){return arguments.length?(this._hitArea=typeof e==="function"?e:Zu(e),this):this._hitArea};t.prototype.id=function t(e){return arguments.length?(this._id=e,this):this._id};t.prototype.label=function t(e){return arguments.length?(this._label=typeof e==="function"?e:Zu(e),this):this._label};t.prototype.labelBounds=function t(e){return arguments.length?(this._labelBounds=typeof e==="function"?e:Zu(e),this):this._labelBounds};t.prototype.labelConfig=function t(e){return arguments.length?(this._labelConfig=Vu(this._labelConfig,e),this):this._labelConfig};t.prototype.opacity=function t(e){return arguments.length?(this._opacity=typeof e==="function"?e:Zu(e),this):this._opacity};t.prototype.pointerEvents=function t(e){return arguments.length?(this._pointerEvents=typeof e==="function"?e:Zu(e),this):this._pointerEvents};t.prototype.rotate=function t(e){return arguments.length?(this._rotate=typeof e==="function"?e:Zu(e),this):this._rotate};t.prototype.rx=function t(e){return arguments.length?(this._rx=typeof e==="function"?e:Zu(e),this):this._rx};t.prototype.ry=function t(e){return arguments.length?(this._ry=typeof e==="function"?e:Zu(e),this):this._ry};t.prototype.scale=function t(e){return arguments.length?(this._scale=typeof e==="function"?e:Zu(e),this):this._scale};t.prototype.select=function t(e){return arguments.length?(this._select=qa(e),this):this._select};t.prototype.shapeRendering=function t(e){return arguments.length?(this._shapeRendering=typeof e==="function"?e:Zu(e),this):this._shapeRendering};t.prototype.sort=function t(e){return arguments.length?(this._sort=e,this):this._sort};t.prototype.stroke=function t(e){return arguments.length?(this._stroke=typeof e==="function"?e:Zu(e),this):this._stroke};t.prototype.strokeDasharray=function t(e){return arguments.length?(this._strokeDasharray=typeof e==="function"?e:Zu(e),this):this._strokeDasharray};t.prototype.strokeLinecap=function t(e){return arguments.length?(this._strokeLinecap=typeof e==="function"?e:Zu(e),this):this._strokeLinecap};t.prototype.strokeOpacity=function t(e){return arguments.length?(this._strokeOpacity=typeof e==="function"?e:Zu(e),this):this._strokeOpacity};t.prototype.strokeWidth=function t(e){return arguments.length?(this._strokeWidth=typeof e==="function"?e:Zu(e),this):this._strokeWidth};t.prototype.textAnchor=function t(e){return arguments.length?(this._textAnchor=typeof e==="function"?e:Zu(e),this):this._textAnchor};t.prototype.vectorEffect=function t(e){return arguments.length?(this._vectorEffect=typeof e==="function"?e:Zu(e),this):this._vectorEffect};t.prototype.verticalAlign=function t(e){return arguments.length?(this._verticalAlign=typeof e==="function"?e:Zu(e),this):this._verticalAlign};t.prototype.x=function t(e){return arguments.length?(this._x=typeof e==="function"?e:Zu(e),this):this._x};t.prototype.y=function t(e){return arguments.length?(this._y=typeof e==="function"?e:Zu(e),this):this._y};return t}(Yu);function Pc(t,e){var r=[];var o=[];function a(t,e){if(t.length===1){r.push(t[0]);o.push(t[0])}else{var n=Array(t.length-1);for(var i=0;i=3){e.x1=t[1][0];e.y1=t[1][1]}e.x=t[t.length-1][0];e.y=t[t.length-1][1];if(t.length===4){e.type="C"}else if(t.length===3){e.type="Q"}else{e.type="L"}return e}function Oc(t,e){e=e||2;var n=[];var i=t;var r=1/e;for(var o=0;o0){i-=1}else if(i0){i-=1}}}t[i]=(t[i]||0)+1;return t},[]);var r=i.reduce(function(t,e,n){if(n===o.length-1){var i=Ic(e,Object.assign({},o[o.length-1]));if(i[0].type==="M"){i.forEach(function(t){t.type="L"})}return t.concat(i)}return t.concat(Vc(o[n],o[n+1],e))},[]);r.unshift(o[0]);return r}function Wc(t){if(t==null){return""}return t.trim().replace(/[Z]/gi,"").replace(/\s+/," ").replace(/([MLCSTQAHV])\s*/gi,"$1")}function qc(t,n,e){var i=Wc(t);var r=Wc(n);var o=i===""?[]:i.split(/(?=[MLCSTQAHV])/gi);var a=r===""?[]:r.split(/(?=[MLCSTQAHV])/gi);if(!o.length&&!a.length){return function t(){return""}}if(!o.length){o.push(a[0])}else if(!a.length){a.push(o[0])}var s=o.map(Lc);var u=a.map(Lc);var h=Math.abs(a.length-o.length);if(h!==0){if(u.length>s.length){s=Uc(s,u,e)}else if(u.lengtho!==s>o&&r<(a-u)*(o-h)/(s-h)+u){l=!l}a=u,s=h}return l};var $c=function(t,e,n,i){var r=1e-9;var o=t[0]-e[0],a=n[0]-i[0],s=t[1]-e[1],u=n[1]-i[1];var h=o*u-s*a;if(Math.abs(h)Math.max(t[0],e[0])+i||oMath.max(t[1],e[1])+i)};var Zc=function(t,e,n,i){var r=$c(t,e,n,i);if(!r){return false}return Qc(t,e,r)&&Qc(n,i,r)};var Kc=function(t,e){var n=-1;var i=t.length;var r=e.length;var o=t[i-1];while(++ne[s]){if(_1){i=n[0];r=n[1]}else if(s>0){i+=o*s;r+=a*s}}o=t[0]-i;a=t[1]-r;return o*o+a*a}function id(t,e){var n,i=t[0];var r=[i];for(var o=1,a=t.length;oe){r.push(n);i=n}}if(i!==n){r.push(n)}return r}function rd(t,e,n,i,r){var o,a=i;for(var s=e+1;sa){o=s;a=u}}if(a>i){if(o-e>1){rd(t,e,o,i,r)}r.push(t[o]);if(n-o>1){rd(t,o,n,i,r)}}}function od(t,e){var n=t.length-1;var i=[t[0]];rd(t,0,n,e,i);i.push(t[n]);return i}var ad=function(t,e,n){if(e===void 0){e=1}if(n===void 0){n=false}if(t.length<=2){return t}var i=e*e;t=n?t:id(t,i);t=od(t,i);return t};var sd=.5;var ud=5;var hd={};var ld=function(t,e){var n,i;if(e===void 0){e={}}if(t.length<3){if(e.verbose){console.error("polygon has to have at least 3 points",t)}return null}var r=[];e=Object.assign({angle:Vt(-90,90+ud,ud),cache:true,maxAspectRatio:15,minAspectRatio:1,minHeight:0,minWidth:0,nTries:20,tolerance:.02,verbose:false},e);var o=e.angle instanceof Array?e.angle:typeof e.angle==="number"?[e.angle]:typeof e.angle==="string"&&!isNaN(e.angle)?[Number(e.angle)]:[];var a=e.aspectRatio instanceof Array?e.aspectRatio:typeof e.aspectRatio==="number"?[e.aspectRatio]:typeof e.aspectRatio==="string"&&!isNaN(e.aspectRatio)?[Number(e.aspectRatio)]:[];var s=e.origin&&e.origin instanceof Array?e.origin[0]instanceof Array?e.origin:[e.origin]:[];var u;if(e.cache){u=Wt(t).join(",");u+="-"+e.minAspectRatio;u+="-"+e.maxAspectRatio;u+="-"+e.minHeight;u+="-"+e.minWidth;u+="-"+o.join(",");u+="-"+s.join(",");if(hd[u]){return hd[u]}}var h=Math.abs(Xc(t));if(h===0){if(e.verbose){console.error("polygon has 0 area",t)}return null}var l=Ht(t,function(t){return t[0]});var f=l[0];var c=l[1];var d=Ht(t,function(t){return t[1]});var p=d[0];var g=d[1];var v=Math.min(c-f,g-p)*e.tolerance;if(v>0){t=ad(t,v)}if(e.events){r.push({type:"simplify",poly:t})}n=Ht(t,function(t){return t[0]}),f=n[0],c=n[1];i=Ht(t,function(t){return t[1]}),p=i[0],g=i[1];var _=[c-f,g-p];var y=_[0];var m=_[1];var b=Math.min(y,m)/50;if(!s.length){var x=Gc(t);if(isNaN(x[0])){if(e.verbose){console.error("cannot find centroid",t)}return null}if(Yc(t,x)){s.push(x)}while(s.length=b){r.push({type:"aRatio",aRatio:et})}while(it-nt>=b){var rt=(nt+it)/2;var ot=rt/et;var at=j[0];var st=j[1];var ut=[[at-rt/2,st-ot/2],[at+rt/2,st-ot/2],[at+rt/2,st+ot/2],[at-rt/2,st+ot/2]];ut=ed(ut,T,j);var ht=Kc(ut,t);if(ht){S=rt*ot;ut.push(ut[0]);A={area:S,cx:at,cy:st,width:rt,height:ot,angle:-M,points:ut};nt=rt}else{it=rt}if(e.events){r.push({type:"rectangle",areaFraction:rt*ot/h,cx:at,cy:st,width:rt,height:ot,angle:M,insidePoly:ht})}}}}}}if(e.cache){hd[u]=A}return e.events?Object.assign(A||{},{events:r}):A};var fd=function(o){function t(){var r=this;o.call(this);this._curve="linear";this._defined=function(){return true};this._labelBounds=function(t,e,n){var i=ld(n.points);if(!i){return null}return{angle:i.angle,width:i.width,height:i.height,x:i.cx-i.width/2-r._x(t,e),y:i.cy-i.height/2-r._y(t,e)}};this._labelConfig=Object.assign(this._labelConfig,{textAnchor:"middle",verticalAlign:"middle"});this._name="Area";this._x=ju("x");this._x0=ju("x");this._x1=null;this._y=Zu(0);this._y0=Zu(0);this._y1=ju("y")}if(o){t.__proto__=o}t.prototype=Object.create(o&&o.prototype);t.prototype.constructor=t;t.prototype._aes=function t(e){var n=this;var i=e.values.slice().sort(function(t,e){return n._y1?n._x(t)-n._x(e):n._y(t)-n._y(e)});var r=i.map(function(t,e){return[n._x0(t,e),n._y0(t,e)]});var o=i.reverse().map(function(t,e){return n._y1?[n._x(t,e),n._y1(t,e)]:[n._x1(t,e),n._y(t,e)]});var a=r.concat(o);if(r[0][1]>o[0][1]){a=a.reverse()}a.push(a[0]);return{points:a}};t.prototype._dataFilter=function t(i){var r=this;var e=Gt().key(this._id).entries(i).map(function(t){t.data=Ju(t.values);t.i=i.indexOf(t.values[0]);var e=Ht(t.values.map(r._x).concat(t.values.map(r._x0)).concat(r._x1?t.values.map(r._x1):[]));t.xR=e;t.width=e[1]-e[0];t.x=e[0]+t.width/2;var n=Ht(t.values.map(r._y).concat(t.values.map(r._y0)).concat(r._y1?t.values.map(r._y1):[]));t.yR=n;t.height=n[1]-n[0];t.y=n[0]+t.height/2;t.nested=true;t.translate=[t.x,t.y];t.__d3plusShape__=true;return t});e.key=function(t){return t.key};return e};t.prototype.render=function t(e){o.prototype.render.call(this,e);var n=this._path=il().defined(this._defined).curve(Xf["curve"+this._curve.charAt(0).toUpperCase()+this._curve.slice(1)]).x(this._x).x0(this._x0).x1(this._x1).y(this._y).y0(this._y0).y1(this._y1);var i=il().defined(function(t){return t}).curve(Xf["curve"+this._curve.charAt(0).toUpperCase()+this._curve.slice(1)]).x(this._x).x0(this._x0).x1(this._x1).y(this._y).y0(this._y0).y1(this._y1);this._enter.append("path").attr("transform",function(t){return"translate("+(-t.xR[0]-t.width/2)+", "+(-t.yR[0]-t.height/2)+")"}).attr("d",function(t){return n(t.values)}).call(this._applyStyle.bind(this));this._update.select("path").transition(this._transition).attr("transform",function(t){return"translate("+(-t.xR[0]-t.width/2)+", "+(-t.yR[0]-t.height/2)+")"}).attrTween("d",function(t){return qc(qa(this).attr("d"),n(t.values))}).call(this._applyStyle.bind(this));this._exit.select("path").transition(this._transition).attrTween("d",function(t){return qc(qa(this).attr("d"),i(t.values))});return this};t.prototype.curve=function t(e){return arguments.length?(this._curve=e,this):this._curve};t.prototype.defined=function t(e){return arguments.length?(this._defined=e,this):this._defined};t.prototype.x=function t(e){if(!arguments.length){return this._x}this._x=typeof e==="function"?e:Zu(e);this._x0=this._x;return this};t.prototype.x0=function t(e){if(!arguments.length){return this._x0}this._x0=typeof e==="function"?e:Zu(e);this._x=this._x0;return this};t.prototype.x1=function t(e){return arguments.length?(this._x1=typeof e==="function"||e===null?e:Zu(e),this):this._x1};t.prototype.y=function t(e){if(!arguments.length){return this._y}this._y=typeof e==="function"?e:Zu(e);this._y0=this._y;return this};t.prototype.y0=function t(e){if(!arguments.length){return this._y0}this._y0=typeof e==="function"?e:Zu(e);this._y=this._y0;return this};t.prototype.y1=function t(e){return arguments.length?(this._y1=typeof e==="function"||e===null?e:Zu(e),this):this._y1};return t}(Nc);var cd=function(r){function t(){var i=this;r.call(this,"rect");this._name="Bar";this._height=Zu(10);this._labelBounds=function(t,e,n){return{width:n.width,height:n.height,x:i._x1!==null?i._getX(t,e):-n.width/2,y:i._x1===null?i._getY(t,e):-n.height/2}};this._width=Zu(10);this._x=ju("x");this._x0=ju("x");this._x1=null;this._y=Zu(0);this._y0=Zu(0);this._y1=ju("y")}if(r){t.__proto__=r}t.prototype=Object.create(r&&r.prototype);t.prototype.constructor=t;t.prototype.render=function t(e){var n=this;r.prototype.render.call(this,e);this._enter.attr("width",function(t,e){return n._x1===null?n._getWidth(t,e):0}).attr("height",function(t,e){return n._x1!==null?n._getHeight(t,e):0}).attr("x",function(t,e){return n._x1===null?-n._getWidth(t,e)/2:0}).attr("y",function(t,e){return n._x1!==null?-n._getHeight(t,e)/2:0}).call(this._applyStyle.bind(this)).transition(this._transition).call(this._applyPosition.bind(this));this._update.transition(this._transition).call(this._applyStyle.bind(this)).call(this._applyPosition.bind(this));this._exit.transition(this._transition).attr("width",function(t,e){return n._x1===null?n._getWidth(t,e):0}).attr("height",function(t,e){return n._x1!==null?n._getHeight(t,e):0}).attr("x",function(t,e){return n._x1===null?-n._getWidth(t,e)/2:0}).attr("y",function(t,e){return n._x1!==null?-n._getHeight(t,e)/2:0});return this};t.prototype._aes=function t(e,n){return{height:this._getHeight(e,n),width:this._getWidth(e,n)}};t.prototype._applyPosition=function t(e){var n=this;e.attr("width",function(t,e){return n._getWidth(t,e)}).attr("height",function(t,e){return n._getHeight(t,e)}).attr("x",function(t,e){return n._x1!==null?n._getX(t,e):-n._getWidth(t,e)/2}).attr("y",function(t,e){return n._x1===null?n._getY(t,e):-n._getHeight(t,e)/2})};t.prototype._getHeight=function t(e,n){if(this._x1!==null){return this._height(e,n)}return Math.abs(this._y1(e,n)-this._y(e,n))};t.prototype._getWidth=function t(e,n){if(this._x1===null){return this._width(e,n)}return Math.abs(this._x1(e,n)-this._x(e,n))};t.prototype._getX=function t(e,n){var i=this._x1===null?this._x(e,n):this._x1(e,n)-this._x(e,n);if(i<0){return i}else{return 0}};t.prototype._getY=function t(e,n){var i=this._x1!==null?this._y(e,n):this._y1(e,n)-this._y(e,n);if(i<0){return i}else{return 0}};t.prototype.height=function t(e){return arguments.length?(this._height=typeof e==="function"?e:Zu(e),this):this._height};t.prototype.width=function t(e){return arguments.length?(this._width=typeof e==="function"?e:Zu(e),this):this._width};t.prototype.x0=function t(e){if(!arguments.length){return this._x0}this._x0=typeof e==="function"?e:Zu(e);this._x=this._x0;return this};t.prototype.x1=function t(e){return arguments.length?(this._x1=typeof e==="function"||e===null?e:Zu(e),this):this._x1};t.prototype.y0=function t(e){if(!arguments.length){return this._y0}this._y0=typeof e==="function"?e:Zu(e);this._y=this._y0;return this};t.prototype.y1=function t(e){return arguments.length?(this._y1=typeof e==="function"||e===null?e:Zu(e),this):this._y1};return t}(Nc);var dd=function(n){function t(){n.call(this,"circle");this._labelBounds=function(t,e,n){return{width:n.r*1.5,height:n.r*1.5,x:-n.r*.75,y:-n.r*.75}};this._labelConfig=Vu(this._labelConfig,{textAnchor:"middle",verticalAlign:"middle"});this._name="Circle";this._r=ju("r")}if(n){t.__proto__=n}t.prototype=Object.create(n&&n.prototype);t.prototype.constructor=t;t.prototype._applyPosition=function t(e){var n=this;e.attr("r",function(t,e){return n._r(t,e)}).attr("x",function(t,e){return-n._r(t,e)/2}).attr("y",function(t,e){return-n._r(t,e)/2})};t.prototype.render=function t(e){n.prototype.render.call(this,e);this._enter.attr("r",0).attr("x",0).attr("y",0).call(this._applyStyle.bind(this)).transition(this._transition).call(this._applyPosition.bind(this));this._update.transition(this._transition).call(this._applyStyle.bind(this)).call(this._applyPosition.bind(this));this._exit.transition(this._transition).attr("r",0).attr("x",0).attr("y",0);return this};t.prototype._aes=function t(e,n){return{r:this._r(e,n)}};t.prototype.r=function t(e){return arguments.length?(this._r=typeof e==="function"?e:Zu(e),this):this._r};return t}(Nc);var pd=function(r){function t(){var e=this;r.call(this);this._curve="linear";this._defined=function(t){return t};this._fill=Zu("none");this._hitArea=Zu({d:function(t){return e._path(t.values)},fill:"none","stroke-width":10,transform:null});this._name="Line";this._path=nl();this._stroke=Zu("black");this._strokeWidth=Zu(1)}if(r){t.__proto__=r}t.prototype=Object.create(r&&r.prototype);t.prototype.constructor=t;t.prototype._dataFilter=function t(i){var r=this;var e=Gt().key(this._id).entries(i).map(function(t){t.data=Ju(t.values);t.i=i.indexOf(t.values[0]);var e=Ht(t.values,r._x);t.xR=e;t.width=e[1]-e[0];t.x=e[0]+t.width/2;var n=Ht(t.values,r._y);t.yR=n;t.height=n[1]-n[0];t.y=n[0]+t.height/2;t.nested=true;t.translate=[t.x,t.y];t.__d3plusShape__=true;return t});e.key=function(t){return t.key};return e};t.prototype.render=function t(e){var n=this;r.prototype.render.call(this,e);var i=this;this._path.curve(Xf["curve"+this._curve.charAt(0).toUpperCase()+this._curve.slice(1)]).defined(this._defined).x(this._x).y(this._y);this._enter.append("path").attr("transform",function(t){return"translate("+(-t.xR[0]-t.width/2)+", "+(-t.yR[0]-t.height/2)+")"}).attr("d",function(t){return n._path(t.values)}).call(this._applyStyle.bind(this));this._update.select("path").transition(this._transition).attr("transform",function(t){return"translate("+(-t.xR[0]-t.width/2)+", "+(-t.yR[0]-t.height/2)+")"}).attrTween("d",function(t){return qc(qa(this).attr("d"),i._path(t.values))}).call(this._applyStyle.bind(this));return this};t.prototype._aes=function t(e,n){var i=this;return{points:e.values.map(function(t){return[i._x(t,n),i._y(t,n)]})}};t.prototype.curve=function t(e){return arguments.length?(this._curve=e,this):this._curve};t.prototype.defined=function t(e){return arguments.length?(this._defined=e,this):this._defined};return t}(Nc);var gd=Math.PI;var vd=function(t,e,n){if(n===void 0){n="circle"}if(t<0){t=gd*2+t}if(n==="square"){var i=45*(gd/180);var r=0,o=0;if(t5&&t%1===0){return new Date(t)}var e=""+t;var n=new RegExp(/^\d{1,2}[./-]\d{1,2}[./-](-*\d{1,4})$/g).exec(e),i=new RegExp(/^[A-z]{1,3} [A-z]{1,3} \d{1,2} (-*\d{1,4}) \d{1,2}:\d{1,2}:\d{1,2} [A-z]{1,3}-*\d{1,4} \([A-z]{1,3}\)/g).exec(e);if(n){var r=n[1];if(r.indexOf("-")===0){e=e.replace(r,r.substr(1))}var o=new Date(e);o.setFullYear(r);return o}else if(i){var a=i[1];if(a.indexOf("-")===0){e=e.replace(a,a.substr(1))}var s=new Date(e);s.setFullYear(a);return s}else if(!e.includes("/")&&!e.includes(" ")&&(!e.includes("-")||!e.indexOf("-"))){var u=new Date(e+"/01/01");u.setFullYear(t);return u}else{return new Date(e)}};var Cd=function(t){function e(){var e=this;t.call(this);this._align="middle";this._barConfig={stroke:"#000","stroke-width":1};this._domain=[0,10];this._duration=600;this._gridConfig={stroke:"#ccc","stroke-width":1};this._height=400;this._labelOffset=false;this.orient("bottom");this._outerBounds={width:0,height:0,x:0,y:0};this._padding=5;this._paddingInner=.1;this._paddingOuter=.1;this._rotateLabels=false;this._scale="linear";this._shape="Line";this._shapeConfig={fill:"#000",height:function(t){return t.tick?8:0},label:function(t){return t.text},labelBounds:function(t){return t.labelBounds},labelConfig:{fontColor:"#000",fontFamily:(new Ac).fontFamily(),fontResize:false,fontSize:Zu(10),padding:0,textAnchor:function(){var t=oc();return e._orient==="left"?t?"start":"end":e._orient==="right"?t?"end":"start":e._rotateLabels?e._orient==="bottom"?"end":"start":"middle"},verticalAlign:function(){return e._orient==="bottom"?"top":e._orient==="top"?"bottom":"middle"}},r:function(t){return t.tick?4:0},stroke:"#000",strokeWidth:1,width:function(t){return t.tick?8:0}};this._tickSize=5;this._titleClass=new Ac;this._titleConfig={fontSize:12,textAnchor:"middle"};this._width=400}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype._barPosition=function t(e){var n=this._position;var i=n.height;var r=n.x;var o=n.y;var a=n.opposite;var s=this._getDomain(),u=this._margin[a],h=["top","left"].includes(this._orient)?this._outerBounds[o]+this._outerBounds[i]-u:this._outerBounds[o]+u;e.call(Uu,this._barConfig).attr(r+"1",this._getPosition(s[0])-(this._scale==="band"?this._d3Scale.step()-this._d3Scale.bandwidth():0)).attr(r+"2",this._getPosition(s[s.length-1])+(this._scale==="band"?this._d3Scale.step():0)).attr(o+"1",h).attr(o+"2",h)};e.prototype._getDomain=function t(){var e=[];if(this._d3ScaleNegative){e=this._d3ScaleNegative.domain()}if(this._d3Scale){e=e.concat(this._d3Scale.domain())}var n=this._scale==="ordinal"?e:Ht(e);return e[0]>e[1]?n.reverse():n};e.prototype._getPosition=function t(e){return e<0&&this._d3ScaleNegative?this._d3ScaleNegative(e):this._d3Scale(e)};e.prototype._getRange=function t(){var e=[];if(this._d3ScaleNegative){e=this._d3ScaleNegative.range()}if(this._d3Scale){e=e.concat(this._d3Scale.range())}return e[0]>e[1]?Ht(e).reverse():Ht(e)};e.prototype._getTicks=function t(){var e=Mn().domain([10,400]).range([10,50]);var n=[];if(this._d3ScaleNegative){var i=this._d3ScaleNegative.range();var r=i[1]-i[0];n=this._d3ScaleNegative.ticks(Math.floor(r/e(r)))}if(this._d3Scale){var o=this._d3Scale.range();var a=o[1]-o[0];n=n.concat(this._d3Scale.ticks(Math.floor(a/e(a))))}return n};e.prototype._gridPosition=function t(e,n){if(n===void 0){n=false}var i=this._position;var r=i.height;var o=i.x;var a=i.y;var s=i.opposite;var u=this._margin[s],h=["top","left"].includes(this._orient)?this._outerBounds[a]+this._outerBounds[r]-u:this._outerBounds[a]+u,l=n?this._lastScale||this._getPosition.bind(this):this._getPosition.bind(this),f=["top","left"].includes(this._orient)?u:-u,c=this._scale==="band"?this._d3Scale.bandwidth()/2:0,d=function(t){return l(t.id)+c};e.call(Uu,this._gridConfig).attr(o+"1",d).attr(o+"2",d).attr(a+"1",h).attr(a+"2",n?h:h+f)};e.prototype.render=function t(e){var y=this;var n;if(this._select===void 0){this.select(qa("body").append("svg").attr("width",this._width+"px").attr("height",this._height+"px").node())}var i=this._position;var r=i.width;var m=i.height;var b=i.x;var x=i.y;var w=i.horizontal;var C=i.opposite;var o="d3plus-Axis-clip-"+this._uuid,E=["top","left"].includes(this._orient),S=this._padding,a=this._select,s=Pu().duration(this._duration);var u=this._range?this._range.slice():[undefined,undefined];if(u[0]===void 0){u[0]=S}if(u[1]===void 0){u[1]=this["_"+r]-S}this._size=u[1]-u[0];if(this._scale==="ordinal"&&this._domain.length>u.length){u=Vt(this._domain.length).map(function(t){return y._size*(t/(y._domain.length-1))+u[0]})}var A=this._margin={top:0,right:0,bottom:0,left:0};if(this._title){var h=this._titleConfig;var l=h.fontFamily;var f=h.fontSize;var c=h.lineHeight;var d=Sc().fontFamily(typeof l==="function"?l():l).fontSize(typeof f==="function"?f():f).lineHeight(typeof c==="function"?c():c).width(this._size).height(this["_"+m]-this._tickSize-S);var p=d(this._title).lines.length;A[this._orient]=p*d.lineHeight()+S}this._d3Scale=Zr["scale"+this._scale.charAt(0).toUpperCase()+this._scale.slice(1)]().domain(this._scale==="time"?this._domain.map(wd):this._domain);if(this._d3Scale.rangeRound){this._d3Scale.rangeRound(u)}else{this._d3Scale.range(u)}if(this._d3Scale.round){this._d3Scale.round(true)}if(this._d3Scale.paddingInner){this._d3Scale.paddingInner(this._paddingInner)}if(this._d3Scale.paddingOuter){this._d3Scale.paddingOuter(this._paddingOuter)}this._d3ScaleNegative=null;if(this._scale==="log"){var g=this._d3Scale.domain();if(g[0]===0){g[0]=1}if(g[g.length-1]===0){g[g.length-1]=-1}var v=this._d3Scale.range();if(g[0]<0&&g[g.length-1]<0){this._d3ScaleNegative=this._d3Scale.copy().domain(g).range(v);this._d3Scale=null}else if(g[0]>0&&g[g.length-1]>0){this._d3Scale.domain(g).range(v)}else{var _=Sn().domain([1,g[g[1]>0?1:0]]).range([0,1]);var k=_(Math.abs(g[g[1]<0?1:0]));var M=k/(k+1)*(v[1]-v[0]);if(g[0]>0){M=v[1]-v[0]-M}this._d3ScaleNegative=this._d3Scale.copy();(g[0]<0?this._d3Scale:this._d3ScaleNegative).domain([Math.sign(g[1]),g[1]]).range([v[0]+M,v[1]]);(g[0]<0?this._d3ScaleNegative:this._d3Scale).domain([g[0],Math.sign(g[0])]).range([v[0],v[0]+M])}}var T=this._ticks?this._scale==="time"?this._ticks.map(wd):this._ticks:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():this._domain;var B=this._labels?this._scale==="time"?this._labels.map(wd):this._labels:(this._d3Scale?this._d3Scale.ticks:this._d3ScaleNegative.ticks)?this._getTicks():T;T=T.slice();B=B.slice();if(this._scale==="log"){B=B.filter(function(t){return Math.abs(t).toString().charAt(0)==="1"&&(y._d3Scale?t!==-1:t!==1)})}var D="⁰¹²³⁴⁵⁶⁷⁸⁹";var N=this._tickFormat?this._tickFormat:function(t){if(y._scale==="log"){var e=Math.round(Math.log(Math.abs(t))/Math.LN10);var n=Math.abs(t).toString().charAt(0);var i="10 "+(""+e).split("").map(function(t){return D[t]}).join("");if(n!=="1"){i=n+" x "+i}return t<0?"-"+i:i}return y._d3Scale.tickFormat?y._d3Scale.tickFormat(B.length-1)(t):t};if(this._scale==="time"){T=T.map(Number);B=B.map(Number)}else if(this._scale==="ordinal"){B=B.filter(function(t){return T.includes(t)})}T=T.sort(function(t,e){return y._getPosition(t)-y._getPosition(e)});B=B.sort(function(t,e){return y._getPosition(t)-y._getPosition(e)});var P=this._shape==="Circle"?this._shapeConfig.r:this._shape==="Rect"?this._shapeConfig[r]:this._shapeConfig.strokeWidth;var z=typeof P!=="function"?function(){return P}:P;var O=[];this._availableTicks=T;T.forEach(function(t,e){var n=z({id:t,tick:true},e);if(y._shape==="Circle"){n*=2}var i=y._getPosition(t);if(!O.length||Math.abs($u(i,O)-i)>n*2){O.push(i)}else{O.push(false)}});T=T.filter(function(t,e){return O[e]!==false});this._visibleTicks=T;var F=this._shape==="Circle"?typeof this._shapeConfig.r==="function"?this._shapeConfig.r({tick:true}):this._shapeConfig.r:this._shape==="Rect"?typeof this._shapeConfig[m]==="function"?this._shapeConfig[m]({tick:true}):this._shapeConfig[m]:this._tickSize,R=z({tick:true});if(typeof F==="function"){F=Ut(T.map(F))}if(this._shape==="Rect"){F/=2}if(typeof R==="function"){R=Ut(T.map(R))}if(this._shape!=="Circle"){R/=2}if(this._scale==="band"){this._space=this._d3Scale.bandwidth()}else if(B.length>1){this._space=0;for(var I=0;Iy._space){y._space=L}}}else{this._space=this._size}var j=B.map(function(t,e){var n=y._shapeConfig.labelConfig.fontFamily(t,e),i=y._shapeConfig.labelConfig.fontSize(t,e);var r=Sc().fontFamily(n).fontSize(i).lineHeight(y._shapeConfig.lineHeight?y._shapeConfig.lineHeight(t,e):undefined).width(w?y._space*2:y._maxSize?y._maxSize-F-S-y._margin.left-y._margin.right-y._tickSize:y._width-F-S).height(w?y._height-F-S:y._space*2);var o=r(N(t));o.lines=o.lines.filter(function(t){return t!==""});o.d=t;o.fS=i;o.width=o.lines.length?Math.ceil(Ut(o.lines.map(function(t){return Gf(t,{"font-family":n,"font-size":i})})))+i/4:0;o.height=o.lines.length?Math.ceil(o.lines.length*(r.lineHeight()+1)):0;o.offset=0;o.hidden=false;if(o.width%2){o.width++}return o});var H=Ut(j,function(t){return t.height})||0;if(w&&typeof this._labelRotation==="undefined"){for(var V=0;Vy._getPosition(Z)-K:false;var tt=Y||J;if(tt){y._rotateLabels=true;break}}}else if(w){this._rotateLabels=this._labelRotation}if(this._rotateLabels){j=B.map(function(t,e){var n=j[e];var i=y._shapeConfig.labelConfig.fontFamily(t,e),r=y._shapeConfig.labelConfig.fontSize(t,e);var o=y._shapeConfig.lineHeight?y._shapeConfig.lineHeight(t,e):r*1.4;var a=Sc().fontFamily(i).fontSize(r).lineHeight(y._shapeConfig.lineHeight?y._shapeConfig.lineHeight(t,e):undefined).height(o*2+1).width(y._maxSize?y._maxSize-y._margin.top-y._margin.bottom-y._tickSize:y._height);var s=y._getPosition(t);var u=B[e-1]||false;var h=B[e+1]||false;var l=u?s-o*2>y._getPosition(u)+o*2:h?s+o*21&&f.widths[0]>80;var d=l&&c?f.widths[0]/1.6:f.widths[0];var p=l&&c?o*2:o;return Object.assign(n,{height:d||0,lineHeight:o,numLines:l&&c?2:1,width:p||0})})}j.forEach(function(t,e){if(e){var n=j[e-1];if(!n.offset&&y._getPosition(t.d)-t[r]/2u[it]){var ht=ut-u[it];if(this._range===void 0||this._range[it]===void 0){this._size-=ht;u[it]-=ht}else if(this._range){nt[it]+=ht}}if(u.length>2){u=Vt(this._domain.length).map(function(t){return y._size*(t/(u.length-1))+u[0]})}u=u.map(Math.round);if(this._d3ScaleNegative){var lt=this._d3ScaleNegative.range();this._d3ScaleNegative[this._d3ScaleNegative.rangeRound?"rangeRound":"range"](this._d3Scale&&this._d3Scale.range()[0]1){this._space=0;for(var ct=0;cty._space){y._space=dt}}}else{this._space=this._size}var pt=this._shape==="Line"?0:F;var gt=this._outerBounds=(n={},n[m]=(Ut(j,function(t){return Math.ceil(t[m])})||0)+(j.length?S:0),n[r]=nt[it]-nt[0],n[b]=nt[0],n);A[this._orient]+=F;A[C]=this._gridSize!==void 0?Ut([this._gridSize,pt]):this["_"+m]-A[this._orient]-gt[m]-S;gt[m]+=A[C]+A[this._orient];gt[x]=this._align==="start"?this._padding:this._align==="end"?this["_"+m]-gt[m]-this._padding:this["_"+m]/2-gt[m]/2;var vt=Ku("g#d3plus-Axis-"+this._uuid,{parent:a});this._group=vt;var _t=Ku("g.grid",{parent:vt}).selectAll("line").data((this._gridSize!==0?this._grid||T:[]).map(function(t){return{id:t}}),function(t){return t.id});_t.exit().transition(s).attr("opacity",0).call(this._gridPosition.bind(this)).remove();_t.enter().append("line").attr("opacity",0).attr("clip-path","url(#"+o+")").call(this._gridPosition.bind(this),true).merge(_t).transition(s).attr("opacity",1).call(this._gridPosition.bind(this));var yt=B.filter(function(t,e){return j[e].lines.length&&!T.includes(t)});var mt=T.concat(yt).map(function(e){var t=j.filter(function(t){return t.d===e});var n=t.length?j.indexOf(t[0]):undefined;var i=y._getPosition(e);var r=t.length&&y._labelOffset?t[0].offset:0;var o=w?y._space:gt.width-A[y._position.opposite]-F-A[y._orient]+S;var a=t.length&&n>0?j.filter(function(t,e){return!t.hidden&&t.offset>=r&&e=r&&e>n}):false;s=s.length?s[0]:false;var u=Math.min(a?i-y._getPosition(a.d):o,s?y._getPosition(s.d)-i:o);if(t.length&&t[0].width>o){t[0].hidden=true;t[0].offset=r=0}var h=A[C],l=(F+r)*(E?-1:1),f=E?gt[x]+gt[m]-h:gt[x]+h;var c={id:e,labelBounds:{x:w?-u/2:y._orient==="left"?-o-S+l:l+S,y:w?y._orient==="bottom"?l+S:l-S-H:-u/2,width:w?u:o,height:w?H:u},size:T.includes(e)?l:0,text:B.includes(e)?N(e):false,tick:T.includes(e)};c[b]=i+(y._scale==="band"?y._d3Scale.bandwidth()/2:0);c[x]=f;var d=y._rotateLabels&&j.find(function(t){return t.d===e});if(d){var p=d.lineHeight;var g=d.numLines;var v=d.height;var _=d.width;c=Object.assign(c,{labelBounds:{x:-v/2,y:y._orient==="bottom"?l+S+(v-p*g)/2:l-S*2-(v+p*g)/2,width:v,height:_+1}})}return c});if(this._shape==="Line"){mt=mt.concat(mt.map(function(t){var e=Object.assign({},t);e[x]+=t.size;return e}))}(new xd[this._shape]).data(mt).duration(this._duration).labelConfig({ellipsis:function(t){return t&&t.length?t+"...":""},rotate:this._rotateLabels?-90:0}).select(Ku("g.ticks",{parent:vt}).node()).config(this._shapeConfig).render();var bt=vt.selectAll("line.bar").data([null]);bt.enter().append("line").attr("class","bar").attr("opacity",0).call(this._barPosition.bind(this)).merge(bt).transition(s).attr("opacity",1).call(this._barPosition.bind(this));this._titleClass.data(this._title?[{text:this._title}]:[]).duration(this._duration).height(A[this._orient]).rotate(this._orient==="left"?-90:this._orient==="right"?90:0).select(Ku("g.d3plus-Axis-title",{parent:vt}).node()).text(function(t){return t.text}).verticalAlign("middle").width(gt[r]).x(w?gt.x:this._orient==="left"?gt.x+A[this._orient]/2-gt[r]/2:gt.x+gt.width-A[this._orient]/2-gt[r]/2).y(w?this._orient==="bottom"?gt.y+gt.height-A.bottom+S:gt.y:gt.y-A[this._orient]/2+gt[r]/2).config(this._titleConfig).render();this._lastScale=this._getPosition.bind(this);if(e){setTimeout(e,this._duration+100)}return this};e.prototype.align=function t(e){return arguments.length?(this._align=e,this):this._align};e.prototype.barConfig=function t(e){return arguments.length?(this._barConfig=Object.assign(this._barConfig,e),this):this._barConfig};e.prototype.domain=function t(e){return arguments.length?(this._domain=e,this):this._domain};e.prototype.duration=function t(e){return arguments.length?(this._duration=e,this):this._duration};e.prototype.grid=function t(e){return arguments.length?(this._grid=e,this):this._grid};e.prototype.gridConfig=function t(e){return arguments.length?(this._gridConfig=Object.assign(this._gridConfig,e),this):this._gridConfig};e.prototype.gridSize=function t(e){return arguments.length?(this._gridSize=e,this):this._gridSize};e.prototype.height=function t(e){return arguments.length?(this._height=e,this):this._height};e.prototype.labels=function t(e){return arguments.length?(this._labels=e,this):this._labels};e.prototype.labelOffset=function t(e){return arguments.length?(this._labelOffset=e,this):this._labelOffset};e.prototype.labelRotation=function t(e){return arguments.length?(this._labelRotation=e,this):this._labelRotation};e.prototype.maxSize=function t(e){return arguments.length?(this._maxSize=e,this):this._maxSize};e.prototype.orient=function t(e){if(arguments.length){var n=["top","bottom"].includes(e),i={top:"bottom",right:"left",bottom:"top",left:"right"};this._position={horizontal:n,width:n?"width":"height",height:n?"height":"width",x:n?"x":"y",y:n?"y":"x",opposite:i[e]};return this._orient=e,this}return this._orient};e.prototype.outerBounds=function t(){return this._outerBounds};e.prototype.padding=function t(e){return arguments.length?(this._padding=e,this):this._padding};e.prototype.paddingInner=function t(e){return arguments.length?(this._paddingInner=e,this):this._paddingInner};e.prototype.paddingOuter=function t(e){return arguments.length?(this._paddingOuter=e,this):this._paddingOuter};e.prototype.range=function t(e){return arguments.length?(this._range=e,this):this._range};e.prototype.scale=function t(e){return arguments.length?(this._scale=e,this):this._scale};e.prototype.select=function t(e){return arguments.length?(this._select=qa(e),this):this._select};e.prototype.shape=function t(e){return arguments.length?(this._shape=e,this):this._shape};e.prototype.shapeConfig=function t(e){return arguments.length?(this._shapeConfig=Vu(this._shapeConfig,e),this):this._shapeConfig};e.prototype.tickFormat=function t(e){return arguments.length?(this._tickFormat=e,this):this._tickFormat};e.prototype.ticks=function t(e){return arguments.length?(this._ticks=e,this):this._ticks};e.prototype.tickSize=function t(e){return arguments.length?(this._tickSize=e,this):this._tickSize};e.prototype.title=function t(e){return arguments.length?(this._title=e,this):this._title};e.prototype.titleConfig=function t(e){return arguments.length?(this._titleConfig=Object.assign(this._titleConfig,e),this):this._titleConfig};e.prototype.width=function t(e){return arguments.length?(this._width=e,this):this._width};return e}(Yu);var Ed=function(t){function e(){t.call(this);this.orient("bottom")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;return e}(Cd);var Sd=function(t){function e(){t.call(this);this.orient("left")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;return e}(Cd);var Ad=function(t){function e(){t.call(this);this.orient("right")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;return e}(Cd);var kd=function(t){function e(){t.call(this);this.orient("top")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;return e}(Cd);var Md=function(){return new Td};function Td(){this.reset()}Td.prototype={constructor:Td,reset:function(){this.s=this.t=0},add:function(t){Dd(Bd,t,this.t);Dd(this,Bd.s,this.s);if(this.s){this.t+=Bd.t}else{this.s=Bd.t}},valueOf:function(){return this.s}};var Bd=new Td;function Dd(t,e,n){var i=t.s=e+n,r=i-e,o=i-r;t.t=e-o+(n-r)}var Nd=1e-6;var Pd=1e-12;var zd=Math.PI;var Od=zd/2;var Fd=zd/4;var Rd=zd*2;var Id=180/zd;var Ld=zd/180;var jd=Math.abs;var Hd=Math.atan;var Vd=Math.atan2;var Ud=Math.cos;var Wd=Math.ceil;var qd=Math.exp;var Xd=Math.log;var Gd=Math.pow;var Yd=Math.sin;var $d=Math.sign||function(t){return t>0?1:t<0?-1:0};var Qd=Math.sqrt;var Zd=Math.tan;function Kd(t){return t>1?0:t<-1?zd:Math.acos(t)}function Jd(t){return t>1?Od:t<-1?-Od:Math.asin(t)}function tp(t){return(t=Yd(t/2))*t}function ep(){}function np(t,e){if(t&&rp.hasOwnProperty(t.type)){rp[t.type](t,e)}}var ip={Feature:function(t,e){np(t.geometry,e)},FeatureCollection:function(t,e){var n=t.features,i=-1,r=n.length;while(++i=0?1:-1,r=i*n,o=Ud(e),a=Yd(e),s=pp*a,u=dp*o+s*Ud(r),h=s*i*Yd(r);up.add(Vd(h,u));cp=t,dp=o,pp=a}var bp=function(t){hp.reset();sp(t,gp);return hp*2};function xp(t){return[Vd(t[1],t[0]),Jd(t[2])]}function wp(t){var e=t[0],n=t[1],i=Ud(n);return[i*Ud(e),i*Yd(e),Yd(n)]}function Cp(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Ep(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function Sp(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function Ap(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function kp(t){var e=Qd(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var Mp;var Tp;var Bp;var Dp;var Np;var Pp;var zp;var Op;var Fp=Md();var Rp;var Ip;var Lp={point:jp,lineStart:Vp,lineEnd:Up,polygonStart:function(){Lp.point=Wp;Lp.lineStart=qp;Lp.lineEnd=Xp;Fp.reset();gp.polygonStart()},polygonEnd:function(){gp.polygonEnd();Lp.point=jp;Lp.lineStart=Vp;Lp.lineEnd=Up;if(up<0){Mp=-(Bp=180),Tp=-(Dp=90)}else if(Fp>Nd){Dp=90}else if(Fp<-Nd){Tp=-90}Ip[0]=Mp,Ip[1]=Bp}};function jp(t,e){Rp.push(Ip=[Mp=t,Bp=t]);if(eDp){Dp=e}}function Hp(t,e){var n=wp([t*Ld,e*Ld]);if(Op){var i=Ep(Op,n),r=[i[1],-i[0],0],o=Ep(r,i);kp(o);o=xp(o);var a=t-Np,s=a>0?1:-1,u=o[0]*Id*s,h,l=jd(a)>180;if(l^(s*NpDp){Dp=h}}else if(u=(u+360)%360-180,l^(s*NpDp){Dp=e}}if(l){if(tGp(Mp,Bp)){Bp=t}}else{if(Gp(t,Bp)>Gp(Mp,Bp)){Mp=t}}}else{if(Bp>=Mp){if(tBp){Bp=t}}else{if(t>Np){if(Gp(Mp,t)>Gp(Mp,Bp)){Bp=t}}else{if(Gp(t,Bp)>Gp(Mp,Bp)){Mp=t}}}}}else{Rp.push(Ip=[Mp=t,Bp=t])}if(eDp){Dp=e}Op=n,Np=t}function Vp(){Lp.point=Hp}function Up(){Ip[0]=Mp,Ip[1]=Bp;Lp.point=jp;Op=null}function Wp(t,e){if(Op){var n=t-Np;Fp.add(jd(n)>180?n+(n>0?360:-360):n)}else{Pp=t,zp=e}gp.point(t,e);Hp(t,e)}function qp(){gp.lineStart()}function Xp(){Wp(Pp,zp);gp.lineEnd();if(jd(Fp)>Nd){Mp=-(Bp=180)}Ip[0]=Mp,Ip[1]=Bp;Op=null}function Gp(t,e){return(e-=t)<0?e+360:e}function Yp(t,e){return t[0]-e[0]}function $p(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eGp(i[0],i[1])){i[1]=r[1]}if(Gp(r[0],i[1])>Gp(i[0],i[1])){i[0]=r[0]}}else{o.push(i=r)}}for(a=-Infinity,n=o.length-1,e=0,i=o[n];e<=n;i=r,++e){r=o[e];if((s=Gp(i[1],r[0]))>a){a=s,Mp=r[0],Bp=i[1]}}}Rp=Ip=null;return Mp===Infinity||Tp===Infinity?[[NaN,NaN],[NaN,NaN]]:[[Mp,Tp],[Bp,Dp]]};var Zp;var Kp;var Jp;var tg;var eg;var ng;var ig;var rg;var og;var ag;var sg;var ug;var hg;var lg;var fg;var cg;var dg={sphere:ep,point:pg,lineStart:vg,lineEnd:mg,polygonStart:function(){dg.lineStart=bg;dg.lineEnd=xg},polygonEnd:function(){dg.lineStart=vg;dg.lineEnd=mg}};function pg(t,e){t*=Ld,e*=Ld;var n=Ud(e);gg(n*Ud(t),n*Yd(t),Yd(e))}function gg(t,e,n){++Zp;Jp+=(t-Jp)/Zp;tg+=(e-tg)/Zp;eg+=(n-eg)/Zp}function vg(){dg.point=_g}function _g(t,e){t*=Ld,e*=Ld;var n=Ud(e);lg=n*Ud(t);fg=n*Yd(t);cg=Yd(e);dg.point=yg;gg(lg,fg,cg)}function yg(t,e){t*=Ld,e*=Ld;var n=Ud(e),i=n*Ud(t),r=n*Yd(t),o=Yd(e),a=Vd(Qd((a=fg*o-cg*r)*a+(a=cg*i-lg*o)*a+(a=lg*r-fg*i)*a),lg*i+fg*r+cg*o);Kp+=a;ng+=a*(lg+(lg=i));ig+=a*(fg+(fg=r));rg+=a*(cg+(cg=o));gg(lg,fg,cg)}function mg(){dg.point=pg}function bg(){dg.point=wg}function xg(){Cg(ug,hg);dg.point=pg}function wg(t,e){ug=t,hg=e;t*=Ld,e*=Ld;dg.point=Cg;var n=Ud(e);lg=n*Ud(t);fg=n*Yd(t);cg=Yd(e);gg(lg,fg,cg)}function Cg(t,e){t*=Ld,e*=Ld;var n=Ud(e),i=n*Ud(t),r=n*Yd(t),o=Yd(e),a=fg*o-cg*r,s=cg*i-lg*o,u=lg*r-fg*i,h=Qd(a*a+s*s+u*u),l=Jd(h),f=h&&-l/h;og+=f*a;ag+=f*s;sg+=f*u;Kp+=l;ng+=l*(lg+(lg=i));ig+=l*(fg+(fg=r));rg+=l*(cg+(cg=o));gg(lg,fg,cg)}var Eg=function(t){Zp=Kp=Jp=tg=eg=ng=ig=rg=og=ag=sg=0;sp(t,dg);var e=og,n=ag,i=sg,r=e*e+n*n+i*i;if(rzd?t-Rd:t<-zd?t+Rd:t,e]}kg.invert=kg;function Mg(t,e,n){return(t%=Rd)?e||n?Ag(Bg(t),Dg(e,n)):Bg(t):e||n?Dg(e,n):kg}function Tg(n){return function(t,e){return t+=n,[t>zd?t-Rd:t<-zd?t+Rd:t,e]}}function Bg(t){var e=Tg(t);e.invert=Tg(-t);return e}function Dg(t,e){var s=Ud(t),u=Yd(t),h=Ud(e),l=Yd(e);function n(t,e){var n=Ud(e),i=Ud(t)*n,r=Yd(t)*n,o=Yd(e),a=o*s+i*u;return[Vd(r*h-a*l,i*s-o*u),Jd(a*h+r*l)]}n.invert=function(t,e){var n=Ud(e),i=Ud(t)*n,r=Yd(t)*n,o=Yd(e),a=o*h-r*l;return[Vd(r*h+o*l,i*s+a*u),Jd(a*s-i*u)]};return n}var Ng=function(e){e=Mg(e[0]*Ld,e[1]*Ld,e.length>2?e[2]*Ld:0);function t(t){t=e(t[0]*Ld,t[1]*Ld);return t[0]*=Id,t[1]*=Id,t}t.invert=function(t){t=e.invert(t[0]*Ld,t[1]*Ld);return t[0]*=Id,t[1]*=Id,t};return t};function Pg(t,e,n,i,r,o){if(!n){return}var a=Ud(e),s=Yd(e),u=i*n;if(r==null){r=e+i*Rd;o=e-u/2}else{r=zg(a,r);o=zg(a,o);if(i>0?ro){r+=i*Rd}}for(var h,l=r;i>0?l>o:l1){e.push(e.pop().concat(e.shift()))}},result:function(){var t=e;e=[];n=null;return t}}};var Rg=function(t,e){return jd(t[0]-e[0])=0;--u){o.point((f=l[u])[0],f[1])}}else{i(c.x,c.p.x,-1,o)}c=c.p}c=c.o;l=c.z;d=!d}while(!c.v);o.lineEnd()}};function jg(t){if(!(e=t.length)){return}var e,n=0,i=t[0],r;while(++n=0?1:-1,S=E*C,A=S>zd,k=g*x;Hg.add(Vd(k*E*Yd(S),v*w+k*Ud(S)));a+=A?C+E*Rd:C;if(A^d>=n^m>=n){var M=Ep(wp(c),wp(y));kp(M);var T=Ep(o,M);kp(T);var B=(A^C>=0?-1:1)*Jd(T[2]);if(i>B||i===B&&(M[0]||M[1])){s+=A^C>=0?1:-1}}}}return(a<-Nd||a0){if(!l){s.polygonStart(),l=true}s.lineStart();for(n=0;n1&&t&2){e.push(e.pop().concat(e.shift()))}c.push(e.filter(Wg))}return e}};function Wg(t){return t.length>1}function qg(t,e){return((t=t.x)[0]<0?t[1]-Od-Nd:Od-t[1])-((e=e.x)[0]<0?e[1]-Od-Nd:Od-e[1])}var Xg=Ug(function(){return true},Gg,$g,[-zd,-Od]);function Gg(r){var o=NaN,a=NaN,s=NaN,u;return{lineStart:function(){r.lineStart();u=1},point:function(t,e){var n=t>0?zd:-zd,i=jd(t-o);if(jd(i-zd)0?Od:-Od);r.point(s,a);r.lineEnd();r.lineStart();r.point(n,a);r.point(t,a);u=0}else if(s!==n&&i>=zd){if(jd(o-s)Nd?Hd((Yd(e)*(o=Ud(i))*Yd(n)-Yd(i)*(r=Ud(e))*Yd(t))/(r*o*a)):(e+i)/2}function $g(t,e,n,i){var r;if(t==null){r=n*Od;i.point(-zd,r);i.point(0,r);i.point(zd,r);i.point(zd,0);i.point(zd,-r);i.point(0,-r);i.point(-zd,-r);i.point(-zd,0);i.point(-zd,r)}else if(jd(t[0]-e[0])>Nd){var o=t[0]0,p=jd(B)>Nd;function t(t,e,n,i){Pg(i,r,o,n,t,e)}function g(t,e){return Ud(t)*Ud(e)>B}function e(s){var u,h,l,f,c;return{lineStart:function(){f=l=false;c=1},point:function(t,e){var n=[t,e],i,r=g(t,e),o=d?r?0:_(t,e):r?_(t+(t<0?zd:-zd),e):0;if(!u&&(f=l=r)){s.lineStart()}if(r!==l){i=v(u,n);if(!i||Rg(u,i)||Rg(n,i)){n[0]+=Nd;n[1]+=Nd;r=g(n[0],n[1])}}if(r!==l){c=0;if(r){s.lineStart();i=v(n,u);s.point(i[0],i[1])}else{i=v(u,n);s.point(i[0],i[1]);s.lineEnd()}u=i}else if(p&&u&&d^r){var a;if(!(o&h)&&(a=v(n,u,true))){c=0;if(d){s.lineStart();s.point(a[0][0],a[0][1]);s.point(a[1][0],a[1][1]);s.lineEnd()}else{s.point(a[1][0],a[1][1]);s.lineEnd();s.lineStart();s.point(a[0][0],a[0][1])}}}if(r&&(!u||!Rg(u,n))){s.point(n[0],n[1])}u=n,l=r,h=o},lineEnd:function(){if(l){s.lineEnd()}u=null},clean:function(){return c|(f&&l)<<1}}}function v(t,e,n){var i=wp(t),r=wp(e);var o=[1,0,0],a=Ep(i,r),s=Cp(a,a),u=a[0],h=s-u*u;if(!h){return!n&&t}var l=B*s/h,f=-B*u/h,c=Ep(o,a),d=Ap(o,l),p=Ap(a,f);Sp(d,p);var g=c,v=Cp(d,g),_=Cp(g,g),y=v*v-_*(Cp(d,d)-1);if(y<0){return}var m=Qd(y),b=Ap(g,(-v-m)/_);Sp(b,d);b=xp(b);if(!n){return b}var x=t[0],w=e[0],C=t[1],E=e[1],S;if(w0^b[1]<(jd(b[0]-x)zd^(x<=b[0]&&b[0]<=w)){var T=Ap(g,(-v+m)/_);Sp(T,d);return[b,xp(T)]}}function _(t,e){var n=d?r:zd-r,i=0;if(t<-n){i|=1}else if(t>n){i|=2}if(e<-n){i|=4}else if(e>n){i|=8}return i}return Ug(g,e,t,d?[0,-r]:[-zd,r-zd])};var Zg=function(t,e,n,i,r,o){var a=t[0],s=t[1],u=e[0],h=e[1],l=0,f=1,c=u-a,d=h-s,p;p=n-a;if(!c&&p>0){return}p/=c;if(c<0){if(p0){if(p>f){return}if(p>l){l=p}}p=r-a;if(!c&&p<0){return}p/=c;if(c<0){if(p>f){return}if(p>l){l=p}}else if(c>0){if(p0){return}p/=d;if(d<0){if(p0){if(p>f){return}if(p>l){l=p}}p=o-s;if(!d&&p<0){return}p/=d;if(d<0){if(p>f){return}if(p>l){l=p}}else if(d>0){if(p0){t[0]=a+l*c,t[1]=s+l*d}if(f<1){e[0]=a+f*c,e[1]=s+f*d}return true};var Kg=1e9;var Jg=-Kg;function tv(w,C,E,S){function A(t,e){return w<=t&&t<=E&&C<=e&&e<=S}function k(t,e,n,i){var r=0,o=0;if(t==null||(r=a(t,n))!==(o=a(e,n))||s(t,e)<0^n>0){do{i.point(r===0||r===3?w:E,r>1?S:C)}while((r=(r+n+4)%4)!==o)}else{i.point(e[0],e[1])}}function a(t,e){return jd(t[0]-w)0?0:3:jd(t[0]-E)0?2:1:jd(t[1]-C)0?1:0:e>0?3:2}function M(t,e){return s(t.x,e.x)}function s(t,e){var n=a(t,1),i=a(e,1);return n!==i?n-i:n===0?e[1]-t[1]:n===1?t[0]-e[0]:n===2?t[1]-e[1]:e[0]-t[0]}return function(i){var o=i,t=Fg(),r,f,a,s,u,h,l,c,d,p,g;var e={point:n,lineStart:m,lineEnd:b,polygonStart:_,polygonEnd:y};function n(t,e){if(A(t,e)){o.point(t,e)}}function v(){var t=0;for(var e=0,n=f.length;eS&&(h-s)*(S-u)>(l-u)*(w-s)){++t}}else{if(l<=S&&(h-s)*(S-u)<(l-u)*(w-s)){--t}}}}return t}function _(){o=t,r=[],f=[],g=true}function y(){var t=v(),e=g&&t,n=(r=Wt(r)).length;if(e||n){i.polygonStart();if(e){i.lineStart();k(null,null,1,i);i.lineEnd()}if(n){Lg(r,M,t,k,i)}i.polygonEnd()}o=i,r=f=a=null}function m(){e.point=x;if(f){f.push(a=[])}p=true;d=false;l=c=NaN}function b(){if(r){x(s,u);if(h&&d){t.rejoin()}r.push(t.result())}e.point=n;if(d){o.lineEnd()}}function x(t,e){var n=A(t,e);if(f){a.push([t,e])}if(p){s=t,u=e,h=n;p=false;if(n){o.lineStart();o.point(t,e)}}else{if(n&&d){o.point(t,e)}else{var i=[l=Math.max(Jg,Math.min(Kg,l)),c=Math.max(Jg,Math.min(Kg,c))],r=[t=Math.max(Jg,Math.min(Kg,t)),e=Math.max(Jg,Math.min(Kg,e))];if(Zg(i,r,w,C,E,S)){if(!d){o.lineStart();o.point(i[0],i[1])}o.point(r[0],r[1]);if(!n){o.lineEnd()}g=false}else if(n){o.lineStart();o.point(t,e);g=false}}}l=t,c=e,d=n}return e}}var ev=function(){var e=0,n=0,i=960,r=500,o,a,s;return s={stream:function(t){return o&&a===t?o:o=tv(e,n,i,r)(a=t)},extent:function(t){return arguments.length?(e=+t[0][0],n=+t[0][1],i=+t[1][0],r=+t[1][1],o=a=null,s):[[e,n],[i,r]]}}};var nv=Md();var iv;var rv;var ov;var av={sphere:ep,point:ep,lineStart:sv,lineEnd:ep,polygonStart:ep,polygonEnd:ep};function sv(){av.point=hv;av.lineEnd=uv}function uv(){av.point=av.lineEnd=ep}function hv(t,e){t*=Ld,e*=Ld;iv=t,rv=Yd(e),ov=Ud(e);av.point=lv}function lv(t,e){t*=Ld,e*=Ld;var n=Yd(e),i=Ud(e),r=jd(t-iv),o=Ud(r),a=Yd(r),s=i*a,u=ov*n-rv*i*o,h=rv*n+ov*i*o;nv.add(Vd(Qd(s*s+u*u),h));iv=t,rv=n,ov=i}var fv=function(t){nv.reset();sp(t,av);return+nv};var cv=[null,null];var dv={type:"LineString",coordinates:cv};var pv=function(t,e){cv[0]=t;cv[1]=e;return fv(dv)};var gv={Feature:function(t,e){return _v(t.geometry,e)},FeatureCollection:function(t,e){var n=t.features,i=-1,r=n.length;while(++iNd}).map(d)).concat(Vt(Wd(a/l)*l,o,l).filter(function(t){return jd(t%c)>Nd}).map(p))}y.lines=function(){return t().map(function(t){return{type:"LineString",coordinates:t}})};y.outline=function(){return{type:"Polygon",coordinates:[g(r).concat(v(s).slice(1),g(i).reverse().slice(1),v(u).reverse().slice(1))]}};y.extent=function(t){if(!arguments.length){return y.extentMinor()}return y.extentMajor(t).extentMinor(t)};y.extentMajor=function(t){if(!arguments.length){return[[r,u],[i,s]]}r=+t[0][0],i=+t[1][0];u=+t[0][1],s=+t[1][1];if(r>i){t=r,r=i,i=t}if(u>s){t=u,u=s,s=t}return y.precision(_)};y.extentMinor=function(t){if(!arguments.length){return[[n,a],[e,o]]}n=+t[0][0],e=+t[1][0];a=+t[0][1],o=+t[1][1];if(n>e){t=n,n=e,e=t}if(a>o){t=a,a=o,o=t}return y.precision(_)};y.step=function(t){if(!arguments.length){return y.stepMinor()}return y.stepMajor(t).stepMinor(t)};y.stepMajor=function(t){if(!arguments.length){return[f,c]}f=+t[0],c=+t[1];return y};y.stepMinor=function(t){if(!arguments.length){return[h,l]}h=+t[0],l=+t[1];return y};y.precision=function(t){if(!arguments.length){return _}_=+t;d=Ev(a,o,90);p=Sv(n,e,_);g=Ev(u,s,90);v=Sv(r,i,_);return y};return y.extentMajor([[-180,-90+Nd],[180,90-Nd]]).extentMinor([[-180,-80-Nd],[180,80+Nd]])}function kv(){return Av()()}var Mv=function(t,e){var n=t[0]*Ld,i=t[1]*Ld,r=e[0]*Ld,o=e[1]*Ld,a=Ud(i),s=Yd(i),u=Ud(o),h=Yd(o),l=a*Ud(n),f=a*Yd(n),c=u*Ud(r),d=u*Yd(r),p=2*Jd(Qd(tp(o-i)+a*u*tp(r-n))),g=Yd(p);var v=p?function(t){var e=Yd(t*=p)/g,n=Yd(p-t)/g,i=n*l+e*c,r=n*f+e*d,o=n*s+e*h;return[Vd(r,i)*Id,Vd(o,Qd(i*i+r*r))*Id]}:function(){return[n*Id,i*Id]};v.distance=p;return v};var Tv=function(t){return t};var Bv=Md();var Dv=Md();var Nv;var Pv;var zv;var Ov;var Fv={point:ep,lineStart:ep,lineEnd:ep,polygonStart:function(){Fv.lineStart=Rv;Fv.lineEnd=jv},polygonEnd:function(){Fv.lineStart=Fv.lineEnd=Fv.point=ep;Bv.add(jd(Dv));Dv.reset()},result:function(){var t=Bv/2;Bv.reset();return t}};function Rv(){Fv.point=Iv}function Iv(t,e){Fv.point=Lv;Nv=zv=t,Pv=Ov=e}function Lv(t,e){Dv.add(Ov*t-zv*e);zv=t,Ov=e}function jv(){Lv(Nv,Pv)}var Hv=Infinity;var Vv=Hv;var Uv=-Hv;var Wv=Uv;var qv={point:Xv,lineStart:ep,lineEnd:ep,polygonStart:ep,polygonEnd:ep,result:function(){var t=[[Hv,Vv],[Uv,Wv]];Uv=Wv=-(Vv=Hv=Infinity);return t}};function Xv(t,e){if(tUv){Uv=t}if(eWv){Wv=e}}var Gv=0;var Yv=0;var $v=0;var Qv=0;var Zv=0;var Kv=0;var Jv=0;var t_=0;var e_=0;var n_;var i_;var r_;var o_;var a_={point:s_,lineStart:u_,lineEnd:f_,polygonStart:function(){a_.lineStart=c_;a_.lineEnd=d_},polygonEnd:function(){a_.point=s_;a_.lineStart=u_;a_.lineEnd=f_},result:function(){var t=e_?[Jv/e_,t_/e_]:Kv?[Qv/Kv,Zv/Kv]:$v?[Gv/$v,Yv/$v]:[NaN,NaN];Gv=Yv=$v=Qv=Zv=Kv=Jv=t_=e_=0;return t}};function s_(t,e){Gv+=t;Yv+=e;++$v}function u_(){a_.point=h_}function h_(t,e){a_.point=l_;s_(r_=t,o_=e)}function l_(t,e){var n=t-r_,i=e-o_,r=Qd(n*n+i*i);Qv+=r*(r_+t)/2;Zv+=r*(o_+e)/2;Kv+=r;s_(r_=t,o_=e)}function f_(){a_.point=s_}function c_(){a_.point=p_}function d_(){g_(n_,i_)}function p_(t,e){a_.point=g_;s_(n_=r_=t,i_=o_=e)}function g_(t,e){var n=t-r_,i=e-o_,r=Qd(n*n+i*i);Qv+=r*(r_+t)/2;Zv+=r*(o_+e)/2;Kv+=r;r=o_*t-r_*e;Jv+=r*(r_+t);t_+=r*(o_+e);e_+=r*3;s_(r_=t,o_=e)}function v_(t){this._context=t}v_.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){if(this._line===0){this._context.closePath()}this._point=NaN},point:function(t,e){switch(this._point){case 0:{this._context.moveTo(t,e);this._point=1;break}case 1:{this._context.lineTo(t,e);break}default:{this._context.moveTo(t+this._radius,e);this._context.arc(t,e,this._radius,0,Rd);break}}},result:ep};var __=Md();var y_;var m_;var b_;var x_;var w_;var C_={point:ep,lineStart:function(){C_.point=E_},lineEnd:function(){if(y_){S_(m_,b_)}C_.point=ep},polygonStart:function(){y_=true},polygonEnd:function(){y_=null},result:function(){var t=+__;__.reset();return t}};function E_(t,e){C_.point=S_;m_=x_=t,b_=w_=e}function S_(t,e){x_-=t,w_-=e;__.add(Qd(x_*x_+w_*w_));x_=t,w_=e}function A_(){this._string=[]}A_.prototype={_radius:4.5,_circle:k_(4.5),pointRadius:function(t){if((t=+t)!==this._radius){this._radius=t,this._circle=null}return this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){if(this._line===0){this._string.push("Z")}this._point=NaN},point:function(t,e){switch(this._point){case 0:{this._string.push("M",t,",",e);this._point=1;break}case 1:{this._string.push("L",t,",",e);break}default:{if(this._circle==null){this._circle=k_(this._radius)}this._string.push("M",t,",",e,this._circle);break}}},result:function(){if(this._string.length){var t=this._string.join("");this._string=[];return t}else{return null}}};function k_(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}var M_=function(e,n){var i=4.5,r,o;function a(t){if(t){if(typeof i==="function"){o.pointRadius(+i.apply(this,arguments))}sp(t,r(o))}return o.result()}a.area=function(t){sp(t,r(Fv));return Fv.result()};a.measure=function(t){sp(t,r(C_));return C_.result()};a.bounds=function(t){sp(t,r(qv));return qv.result()};a.centroid=function(t){sp(t,r(a_));return a_.result()};a.projection=function(t){return arguments.length?(r=t==null?(e=null,Tv):(e=t).stream,a):e};a.context=function(t){if(!arguments.length){return n}o=t==null?(n=null,new A_):new v_(n=t);if(typeof i!=="function"){o.pointRadius(i)}return a};a.pointRadius=function(t){if(!arguments.length){return i}i=typeof t==="function"?t:(o.pointRadius(+t),+t);return a};return a.projection(e).context(n)};var T_=function(t){return{stream:B_(t)}};function B_(i){return function(t){var e=new D_;for(var n in i){e[n]=i[n]}e.stream=t;return e}}function D_(){}D_.prototype={constructor:D_,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};function N_(t,e,n){var i=t.clipExtent&&t.clipExtent();t.scale(150).translate([0,0]);if(i!=null){t.clipExtent(null)}sp(n,t.stream(qv));e(qv.result());if(i!=null){t.clipExtent(i)}return t}function P_(a,s,t){return N_(a,function(t){var e=s[1][0]-s[0][0],n=s[1][1]-s[0][1],i=Math.min(e/(t[1][0]-t[0][0]),n/(t[1][1]-t[0][1])),r=+s[0][0]+(e-i*(t[1][0]+t[0][0]))/2,o=+s[0][1]+(n-i*(t[1][1]+t[0][1]))/2;a.scale(150*i).translate([r,o])},t)}function z_(t,e,n){return P_(t,[[0,0],e],n)}function O_(o,a,t){return N_(o,function(t){var e=+a,n=e/(t[1][0]-t[0][0]),i=(e-n*(t[1][0]+t[0][0]))/2,r=-n*t[0][1];o.scale(150*n).translate([i,r])},t)}function F_(o,a,t){return N_(o,function(t){var e=+a,n=e/(t[1][1]-t[0][1]),i=-n*t[0][0],r=(e-n*(t[1][1]+t[0][1]))/2;o.scale(150*n).translate([i,r])},t)}var R_=16;var I_=Ud(30*Ld);var L_=function(t,e){return+e?H_(t,e):j_(t)};function j_(n){return B_({point:function(t,e){t=n(t,e);this.stream.point(t[0],t[1])}})}function H_(T,B){function D(t,e,n,i,r,o,a,s,u,h,l,f,c,d){var p=a-t,g=s-e,v=p*p+g*g;if(v>4*B&&c--){var _=i+h,y=r+l,m=o+f,b=Qd(_*_+y*y+m*m),x=Jd(m/=b),w=jd(jd(m)-1)B||jd((p*A+g*k)/v-.5)>.3||i*h+r*l+o*f2?t[2]%360*Ld:0,k()):[u*Id,h*Id,l*Id]};S.angle=function(t){return arguments.length?(c=t%360*Ld,k()):c*Id};S.precision=function(t){return arguments.length?(b=L_(x,m=t*t),M()):Qd(m)};S.fitExtent=function(t,e){return P_(S,t,e)};S.fitSize=function(t,e){return z_(S,t,e)};S.fitWidth=function(t,e){return O_(S,t,e)};S.fitHeight=function(t,e){return F_(S,t,e)};function k(){var t=q_(i,0,0,c).apply(null,n(a,s)),e=(c?q_:W_)(i,r-t[0],o-t[1],c);f=Mg(u,h,l);x=Ag(n,e);w=Ag(f,x);b=L_(x,m);return M()}function M(){C=E=null;return S}return function(){n=t.apply(this,arguments);S.invert=n.invert&&A;return k()}}function Y_(t){var e=0,n=zd/3,i=G_(t),r=i(e,n);r.parallels=function(t){return arguments.length?i(e=t[0]*Ld,n=t[1]*Ld):[e*Id,n*Id]};return r}function $_(t){var n=Ud(t);function e(t,e){return[t*n,Yd(e)/n]}e.invert=function(t,e){return[t/n,Jd(e*n)]};return e}function Q_(t,e){var n=Yd(t),i=(n+Yd(e))/2;if(jd(i)=.12&&r<.234&&i>=-.425&&i<-.214?a:r>=.166&&r<.234&&i>=-.214&&i<-.115?u:o).invert(t)};f.stream=function(t){return e&&n===t?e:e=J_([o.stream(n=t),a.stream(t),u.stream(t)])};f.precision=function(t){if(!arguments.length){return o.precision()}o.precision(t),a.precision(t),u.precision(t);return c()};f.scale=function(t){if(!arguments.length){return o.scale()}o.scale(t),a.scale(t*.35),u.scale(t);return f.translate(o.translate())};f.translate=function(t){if(!arguments.length){return o.translate()}var e=o.scale(),n=+t[0],i=+t[1];r=o.translate(t).clipExtent([[n-.455*e,i-.238*e],[n+.455*e,i+.238*e]]).stream(l);s=a.translate([n-.307*e,i+.201*e]).clipExtent([[n-.425*e+Nd,i+.12*e+Nd],[n-.214*e-Nd,i+.234*e-Nd]]).stream(l);h=u.translate([n-.205*e,i+.212*e]).clipExtent([[n-.214*e+Nd,i+.166*e+Nd],[n-.115*e-Nd,i+.234*e-Nd]]).stream(l);return c()};f.fitExtent=function(t,e){return P_(f,t,e)};f.fitSize=function(t,e){return z_(f,t,e)};f.fitWidth=function(t,e){return O_(f,t,e)};f.fitHeight=function(t,e){return F_(f,t,e)};function c(){e=n=null;return f}return f.scale(1070)};function ey(o){return function(t,e){var n=Ud(t),i=Ud(e),r=o(n*i);return[r*i*Yd(t),r*Yd(e)]}}function ny(a){return function(t,e){var n=Qd(t*t+e*e),i=a(n),r=Yd(i),o=Ud(i);return[Vd(t*r,n*o),Jd(n&&e*r/n)]}}var iy=ey(function(t){return Qd(2/(1+t))});iy.invert=ny(function(t){return 2*Jd(t/2)});var ry=function(){return X_(iy).scale(124.75).clipAngle(180-.001)};var oy=ey(function(t){return(t=Kd(t))&&t/Yd(t)});oy.invert=ny(function(t){return t});var ay=function(){return X_(oy).scale(79.4188).clipAngle(180-.001)};function sy(t,e){return[t,Xd(Zd((Od+e)/2))]}sy.invert=function(t,e){return[t,2*Hd(qd(e))-Od]};var uy=function(){return hy(sy).scale(961/Rd)};function hy(n){var i=X_(n),e=i.center,r=i.scale,o=i.translate,a=i.clipExtent,s=null,u,h,l;i.scale=function(t){return arguments.length?(r(t),f()):r()};i.translate=function(t){return arguments.length?(o(t),f()):o()};i.center=function(t){return arguments.length?(e(t),f()):e()};i.clipExtent=function(t){return arguments.length?(t==null?s=u=h=l=null:(s=+t[0][0],u=+t[0][1],h=+t[1][0],l=+t[1][1]),f()):s==null?null:[[s,u],[h,l]]};function f(){var t=zd*r(),e=i(Ng(i.rotate()).invert([0,0]));return a(s==null?[[e[0]-t,e[1]-t],[e[0]+t,e[1]+t]]:n===sy?[[Math.max(e[0]-t,s),u],[Math.min(e[0]+t,h),l]]:[[s,Math.max(e[1]-t,u)],[h,Math.min(e[1]+t,l)]])}return f()}function ly(t){return Zd((Od+t)/2)}function fy(t,e){var n=Ud(t),r=t===e?Yd(t):Xd(n/Ud(e))/Xd(ly(e)/ly(t)),o=n*Gd(ly(t),r)/r;if(!r){return sy}function i(t,e){if(o>0){if(e<-Od+Nd){e=-Od+Nd}}else{if(e>Od-Nd){e=Od-Nd}}var n=o/Gd(ly(e),r);return[n*Yd(r*t),o-n*Ud(r*t)]}i.invert=function(t,e){var n=o-e,i=$d(r)*Qd(t*t+n*n);return[Vd(t,jd(n))/r*$d(n),2*Hd(Gd(o/i,1/r))-Od]};return i}var cy=function(){return Y_(fy).scale(109.5).parallels([30,30])};function dy(t,e){return[t,e]}dy.invert=dy;var py=function(){return X_(dy).scale(152.63)};function gy(t,e){var n=Ud(t),r=t===e?Yd(t):(n-Ud(e))/(e-t),o=n/r+t;if(jd(r)Nd&&--i>0);return[t/(.8707+(o=n*n)*(-.131979+o*(-.013791+o*o*o*(.003971-.001529*o)))),n]};var wy=function(){return X_(xy).scale(175.295)};function Cy(t,e){return[Ud(e)*Yd(t),Yd(e)]}Cy.invert=ny(Jd);var Ey=function(){return X_(Cy).scale(249.5).clipAngle(90+Nd)};function Sy(t,e){var n=Ud(e),i=1+Ud(t)*n;return[n*Yd(t)/i,Yd(e)/i]}Sy.invert=ny(function(t){return 2*Hd(t)});var Ay=function(){return X_(Sy).scale(250).clipAngle(142)};function ky(t,e){return[Xd(Zd((Od+e)/2)),-t]}ky.invert=function(t,e){return[-e,2*Hd(qd(t))-Od]};var My=function(){var t=hy(ky),e=t.center,n=t.rotate;t.center=function(t){return arguments.length?e([-t[1],t[0]]):(t=e(),[t[1],-t[0]])};t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):(t=n(),[t[0],t[1],t[2]-90])};return n([0,0,90]).scale(159.155)};var Ty=Object.freeze({geoArea:bp,geoBounds:Qp,geoCentroid:Eg,geoCircle:Og,geoClipAntimeridian:Xg,geoClipCircle:Qg,geoClipExtent:ev,geoClipRectangle:tv,geoContains:Cv,geoDistance:pv,geoGraticule:Av,geoGraticule10:kv,geoInterpolate:Mv,geoLength:fv,geoPath:M_,geoAlbers:K_,geoAlbersUsa:ty,geoAzimuthalEqualArea:ry,geoAzimuthalEqualAreaRaw:iy,geoAzimuthalEquidistant:ay,geoAzimuthalEquidistantRaw:oy,geoConicConformal:cy,geoConicConformalRaw:fy,geoConicEqualArea:Z_,geoConicEqualAreaRaw:Q_,geoConicEquidistant:vy,geoConicEquidistantRaw:gy,geoEquirectangular:py,geoEquirectangularRaw:dy,geoGnomonic:yy,geoGnomonicRaw:_y,geoIdentity:by,geoProjection:X_,geoProjectionMutator:G_,geoMercator:uy,geoMercatorRaw:sy,geoNaturalEarth1:wy,geoNaturalEarth1Raw:xy,geoOrthographic:Ey,geoOrthographicRaw:Cy,geoStereographic:Ay,geoStereographicRaw:Sy,geoTransverseMercator:My,geoTransverseMercatorRaw:ky,geoRotation:Ng,geoStream:sp,geoTransform:T_});var By=function(){var h=0,l=0,f=960,c=500,d=(h+f)/2,p=(l+c)/2,g=256,v=0,_=true;function e(){var t=Math.max(Math.log(g)/Math.LN2-8,0),n=Math.round(t+v),i=1<3&&e(t)};function e(t){var e=u.status,n;if(!e&&jy(u)||e>=200&&e<300||e===304){if(f){try{n=f.call(r,u)}catch(t){o.call("error",r,t);return}}else{n=u}o.call("load",r,n)}else{o.call("error",r,t)}}u.onprogress=function(t){o.call("progress",r,t)};r={header:function(t,e){t=(t+"").toLowerCase();if(arguments.length<2){return s.get(t)}if(e==null){s.remove(t)}else{s.set(t,e+"")}return r},mimeType:function(t){if(!arguments.length){return a}a=t==null?null:t+"";return r},responseType:function(t){if(!arguments.length){return c}c=t;return r},timeout:function(t){if(!arguments.length){return d}d=+t;return r},user:function(t){return arguments.length<1?h:(h=t==null?null:t+"",r)},password:function(t){return arguments.length<1?l:(l=t==null?null:t+"",r)},response:function(t){f=t;return r},get:function(t,e){return r.send("GET",t,e)},post:function(t,e){return r.send("POST",t,e)},send:function(t,e,n){u.open(t,i,true,h,l);if(a!=null&&!s.has("accept")){s.set("accept",a+",*/*")}if(u.setRequestHeader){s.each(function(t,e){u.setRequestHeader(e,t)})}if(a!=null&&u.overrideMimeType){u.overrideMimeType(a)}if(c!=null){u.responseType=c}if(d>0){u.timeout=d}if(n==null&&typeof e==="function"){n=e,e=null}if(n!=null&&n.length===1){n=Ly(n)}if(n!=null){r.on("error",n).on("load",function(t){n(null,t)})}o.call("beforesend",r,u);u.send(e==null?null:e);return r},abort:function(){u.abort();return r},on:function(){var t=o.on.apply(o,arguments);return t===o?r:t}};if(t!=null){if(typeof t!=="function"){throw new Error("invalid callback: "+t)}return r.get(t)}return r};function Ly(n){return function(t,e){n(t==null?e:null)}}function jy(t){var e=t.responseType;return e&&e!=="text"?t.response:t.responseText}var Hy=function(i,r){return function(t,e){var n=Iy(t).mimeType(i).response(r);if(e!=null){if(typeof e!=="function"){throw new Error("invalid callback: "+e)}return n.get(e)}return n}};Hy("text/html",function(t){return document.createRange().createContextualFragment(t.responseText)});var Vy=Hy("application/json",function(t){return JSON.parse(t.responseText)});var Uy=Hy("text/plain",function(t){return t.responseText});Hy("application/xml",function(t){var e=t.responseXML;if(!e){throw new Error("parse error")}return e});var Wy={};var qy={};var Xy=34;var Gy=10;var Yy=13;function $y(t){return new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+"]"}).join(",")+"}")}function Qy(n,i){var r=$y(n);return function(t,e){return i(r(t),e,n)}}function Zy(t){var n=Object.create(null),i=[];t.forEach(function(t){for(var e in t){if(!(e in n)){i.push(n[e]=e)}}});return i}var Ky=function(i){var e=new RegExp('["'+i+"\n\r]"),f=i.charCodeAt(0);function t(t,n){var i,r,e=o(t,function(t,e){if(i){return i(t,e-1)}r=t,i=n?Qy(t,n):$y(t)});e.columns=r||[];return e}function o(i,t){var e=[],r=i.length,o=0,n=0,a,s=r<=0,u=false;if(i.charCodeAt(r-1)===Gy){--r}if(i.charCodeAt(r-1)===Yy){--r}function h(){if(s){return qy}if(u){return u=false,Wy}var t,e=o,n;if(i.charCodeAt(e)===Xy){while(o++=r){s=true}else if((n=i.charCodeAt(o++))===Gy){u=true}else if(n===Yy){u=true;if(i.charCodeAt(o)===Gy){++o}}return i.slice(e+1,t-1).replace(/""/g,'"')}while(oMath.abs(t[1]-k[1])){S=true}else{E=true}}k=t;w=true;gm();P()}function P(){var t;b=k[0]-A[0];x=k[1]-A[1];switch(i){case _m:case vm:{if(r){b=Math.max(u-h,Math.min(p-g,b)),l=h+b,v=g+b}if(o){x=Math.max(f-c,Math.min(_-y,x)),d=c+x,m=y+x}break}case ym:{if(r<0){b=Math.max(u-h,Math.min(p-h,b)),l=h+b,v=g}else if(r>0){b=Math.max(u-g,Math.min(p-g,b)),l=h,v=g+b}if(o<0){x=Math.max(f-c,Math.min(_-c,x)),d=c+x,m=y}else if(o>0){x=Math.max(f-y,Math.min(_-y,x)),d=c,m=y+x}break}case mm:{if(r){l=Math.max(u,Math.min(p,h-b*r)),v=Math.max(u,Math.min(p,g+b*r))}if(o){d=Math.max(f,Math.min(_,c-x*o)),m=Math.max(f,Math.min(_,y+x*o))}break}}if(v0){h=l-b}if(o<0){y=m-x}else if(o>0){c=d-x}i=_m;B.attr("cursor",Cm.selection);P()}break}default:return}gm()}function F(){switch(Ta.keyCode){case 16:{if(C){E=S=C=false;P()}break}case 18:{if(i===mm){if(r<0){g=v}else if(r>0){h=l}if(o<0){y=m}else if(o>0){c=d}i=ym;P()}break}case 32:{if(i===_m){if(Ta.altKey){if(r){g=v-b*r,h=l+b*r}if(o){y=m-x*o,c=d+x*o}i=mm}else{if(r<0){g=v}else if(r>0){h=l}if(o<0){y=m}else if(o>0){c=d}i=ym}B.attr("cursor",Cm[n]);P()}break}default:return}gm()}}function s(){var t=this.__brush||{selection:null};t.extent=e.apply(this,arguments);t.dim=R;return t}r.extent=function(t){return arguments.length?(e=typeof t==="function"?t:cm([[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]]),r):e};r.filter=function(t){return arguments.length?(I=typeof t==="function"?t:cm(!!t),r):I};r.handleSize=function(t){return arguments.length?(i=+t,r):i};r.on=function(){var t=n.on.apply(n,arguments);return t===n?r:t};return r}var Fm=[].slice;var Rm={};function Im(t){this._size=t;this._call=this._error=null;this._tasks=[];this._data=[];this._waiting=this._active=this._ended=this._start=0}Im.prototype=Wm.prototype={constructor:Im,defer:function(t){if(typeof t!=="function"){throw new Error("invalid callback")}if(this._call){throw new Error("defer after await")}if(this._error!=null){return this}var e=Fm.call(arguments,1);e.push(t);++this._waiting,this._tasks.push(e);Lm(this);return this},abort:function(){if(this._error==null){Vm(this,new Error("abort"))}return this},await:function(n){if(typeof n!=="function"){throw new Error("invalid callback")}if(this._call){throw new Error("multiple await")}this._call=function(t,e){n.apply(null,[t].concat(e))};Um(this);return this},awaitAll:function(t){if(typeof t!=="function"){throw new Error("invalid callback")}if(this._call){throw new Error("multiple await")}this._call=t;Um(this);return this}};function Lm(e){if(!e._start){try{jm(e)}catch(t){if(e._tasks[e._ended+e._active-1]){Vm(e,t)}else if(!e._data){throw t}}}}function jm(t){while(t._start=t._waiting&&t._active=0){if(i=t._tasks[n]){t._tasks[n]=null;if(i.abort){try{i.abort()}catch(e){}}}}t._active=NaN;Um(t)}function Um(t){if(!t._active&&t._call){var e=t._data;t._data=undefined;t._call(t._error,e)}}function Wm(t){if(t==null){t=Infinity}else if(!((t=+t)>=1)){throw new Error("invalid concurrency")}return new Im(t)}var qm=function(t){return function(){return t}};function Xm(t,e,n){this.target=t;this.type=e;this.transform=n}function Gm(t,e,n){this.k=t;this.x=e;this.y=n}Gm.prototype={constructor:Gm,scale:function(t){return t===1?this:new Gm(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new Gm(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Ym=new Gm(1,0,0);$m.prototype=Gm.prototype;function $m(t){return t.__zoom||Ym}function Qm(){Ta.stopImmediatePropagation()}var Zm=function(){Ta.preventDefault();Ta.stopImmediatePropagation()};function Km(){return!Ta.button}function Jm(){var t=this,e,n;if(t instanceof SVGElement){t=t.ownerSVGElement||t;e=t.width.baseVal.value;n=t.height.baseVal.value}else{e=t.clientWidth;n=t.clientHeight}return[[0,0],[e,n]]}function tb(){return this.__zoom||Ym}function eb(){return-Ta.deltaY*(Ta.deltaMode?120:1)/500}function nb(){return"ontouchstart"in this}function ib(t,e,n){var i=t.invertX(e[0][0])-n[0][0],r=t.invertX(e[1][0])-n[1][0],o=t.invertY(e[0][1])-n[0][1],a=t.invertY(e[1][1])-n[1][1];return t.translate(r>i?(i+r)/2:Math.min(0,i)||Math.max(0,r),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}var rb=function(){var u=Km,f=Jm,p=ib,o=eb,e=nb,a=[0,Infinity],g=[[-Infinity,-Infinity],[Infinity,Infinity]],s=250,c=Te,h=[],n=Ka("start","zoom","end"),v,l,d=500,_=150,y=0;function m(t){t.property("__zoom",tb).on("wheel.zoom",i).on("mousedown.zoom",r).on("dblclick.zoom",A).filter(e).on("touchstart.zoom",k).on("touchmove.zoom",M).on("touchend.zoom touchcancel.zoom",T).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}m.transform=function(t,e){var n=t.selection?t.selection():t;n.property("__zoom",tb);if(t!==n){C(t,e)}else{n.interrupt().each(function(){E(this,arguments).start().zoom(null,typeof e==="function"?e.apply(this,arguments):e).end()})}};m.scaleBy=function(t,n){m.scaleTo(t,function(){var t=this.__zoom.k,e=typeof n==="function"?n.apply(this,arguments):n;return t*e})};m.scaleTo=function(t,o){m.transform(t,function(){var t=f.apply(this,arguments),e=this.__zoom,n=w(t),i=e.invert(n),r=typeof o==="function"?o.apply(this,arguments):o;return p(x(b(e,r),n,i),t,g)})};m.translateBy=function(t,e,n){m.transform(t,function(){return p(this.__zoom.translate(typeof e==="function"?e.apply(this,arguments):e,typeof n==="function"?n.apply(this,arguments):n),f.apply(this,arguments),g)})};m.translateTo=function(t,i,r){m.transform(t,function(){var t=f.apply(this,arguments),e=this.__zoom,n=w(t);return p(Ym.translate(n[0],n[1]).scale(e.k).translate(typeof i==="function"?-i.apply(this,arguments):-i,typeof r==="function"?-r.apply(this,arguments):-r),t,g)})};function b(t,e){e=Math.max(a[0],Math.min(a[1],e));return e===t.k?t:new Gm(e,t.x,t.y)}function x(t,e,n){var i=e[0]-n[0]*t.k,r=e[1]-n[1]*t.k;return i===t.x&&r===t.y?t:new Gm(t.k,i,r)}function w(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function C(t,h,l){t.on("start.zoom",function(){E(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){E(this,arguments).end()}).tween("zoom",function(){var t=this,e=arguments,i=E(t,e),n=f.apply(t,e),r=l||w(n),o=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),a=t.__zoom,s=typeof h==="function"?h.apply(t,e):h,u=c(a.invert(r).concat(o/a.k),s.invert(r).concat(o/s.k));return function(t){if(t===1){t=s}else{var e=u(t),n=o/e[2];t=new Gm(n,r[0]-e[0]*n,r[1]-e[1]*n)}i.zoom(null,t)}})}function E(t,e){for(var n=0,i=h.length,r;ny}n.zoom("mouse",p(x(n.that.__zoom,n.mouse[0]=Ya(n.that),n.mouse[1]),n.extent,g))}function a(){t.on("mousemove.zoom mouseup.zoom",null);lm(Ta.view,n.moved);Zm();n.end()}}function A(){if(!u.apply(this,arguments)){return}var t=this.__zoom,e=Ya(this),n=t.invert(e),i=t.k*(Ta.shiftKey?.5:2),r=p(x(b(t,i),e,n),f.apply(this,arguments),g);Zm();if(s>0){qa(this).transition().duration(s).call(C,r,e)}else{qa(this).call(m.transform,r)}}function k(){var t=this;if(!u.apply(this,arguments)){return}var e=E(this,arguments),n=Ta.changedTouches,i,r=n.length,o,a,s;Qm();for(o=0;on.capacity){this.remove(n.linkedList.end.key)}return this};t.update=function(t,e){if(this.has(t)){this.set(t,e(this.get(t)))}return this};t.remove=function(t){var e=this._LRUCacheState;var n=e.hash[t];if(!n){return this}if(n===e.linkedList.head){e.linkedList.head=n.p}if(n===e.linkedList.end){e.linkedList.end=n.n}s(n.n,n.p);delete e.hash[t];delete e.data[t];e.linkedList.length-=1;return this};t.removeAll=function(){this._LRUCacheState=new n(this._LRUCacheState.capacity);return this};t.info=function(){var t=this._LRUCacheState;return{capacity:t.capacity,length:t.linkedList.length}};t.keys=function(){var t=[];var e=this._LRUCacheState.linkedList.head;while(e){t.push(e.key);e=e.p}return t};t.has=function(t){return!!this._LRUCacheState.hash[t]};t.staleKey=function(){return this._LRUCacheState.linkedList.end&&this._LRUCacheState.linkedList.end.key};t.popStale=function(){var t=this.staleKey();if(!t){return null}var e=[t,this._LRUCacheState.data[t]];this.remove(t);return e};function n(t){this.capacity=t>0?+t:Number.MAX_SAFE_INTEGER||Number.MAX_VALUE;this.data=Object.create?Object.create(null):{};this.hash=Object.create?Object.create(null):{};this.linkedList=new i}function i(){this.length=0;this.head=null;this.end=null}function o(t){this.key=t;this.p=null;this.n=null}function a(t,e){if(e===t.head){return}if(!t.end){t.end=e}else if(t.end===e){t.end=e.n}s(e.n,e.p);s(e,t.head);t.head=e;t.head.n=null}function s(t,e){if(t===e){return}if(t){t.p=e}if(e){e.n=t}}return e})});var hb=function(t){function e(){t.call(this);this._buttonStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px",margin:"0 5px"};this._data=[];this._text=ju("text");this._value=ju("value")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype.render=function t(){var n=this;if(this._container===void 0){this.container(qa("body").append("div").node())}var e=this._container.selectAll("div#d3plus-Form-"+this._uuid).data([0]);var i=this._container.node().tagName.toLowerCase()==="foreignobject";e=e.enter().append(i?"xhtml:div":"div").attr("id","d3plus-Form-"+this._uuid).attr("class","d3plus-Form d3plus-Form-Button").merge(e);var r=e.selectAll("button").data(this._data,function(t,e){return n._value(t,e)});r.exit().remove();r=r.enter().append("button").attr("class","d3plus-Button").attr("type","button").merge(r).call(nh,this._buttonStyle).html(function(t,e){return n._text(t,e)});for(var o in n._on){if({}.hasOwnProperty.call(n._on,o)){r.on(o,n._on[o])}}return this};e.prototype.buttonStyle=function t(e){return arguments.length?(this._buttonStyle=e,this):this._buttonStyle};e.prototype.container=function t(e){return arguments.length?(this._container=qa(e),this):this._container};e.prototype.data=function t(e){return arguments.length?(this._data=e,this):this._data};e.prototype.text=function t(e){return arguments.length?(this._text=typeof e==="function"?e:Zu(e),this):this._text};e.prototype.value=function t(e){return arguments.length?(this._value=e,this):this._value};return e}(Yu);var lb=function(t){function e(){t.call(this);this._labelStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px","padding-right":"5px"};this._legendStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px","padding-right":"5px"};this._options=[];this._radioStyle={"margin-right":"10px"};this._text=ju("text");this._value=ju("value")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype.render=function t(){var n=this;if(this._container===void 0){this.container(qa("body").append("div").node())}var o=this;var e=this._container.selectAll("div#d3plus-Form-"+this._uuid).data([0]);var i=this._container.node().tagName.toLowerCase()==="foreignobject";e=e.enter().append(i?"xhtml:div":"div").attr("id","d3plus-Form-"+this._uuid).attr("class","d3plus-Form d3plus-Form-Radio").merge(e);var a=e.selectAll("label").data(this._options,function(t,e){return n._value(t,e)});a.exit().each(function(){qa(this.nextSibling).remove()}).remove();a=a.enter().append("label").attr("class","d3plus-Label").attr("for",function(t,e){return n._uuid+"-"+n._value(t,e)}).each(function(t,e){var n=document.createElement("input");n.setAttribute("type","radio");n.setAttribute("name","d3plus-Radio-"+o._uuid);n.setAttribute("id",o._uuid+"-"+o._value(t,e));n.setAttribute("value",o._value(t,e));this.parentNode.insertBefore(n,this.nextSibling)}).merge(a).call(nh,this._labelStyle).html(function(t,e){return n._text(t,e)}).each(function(t,e){var n=o._checked===void 0?!e:""+o._value(t,e)===""+o._checked;qa(this).classed("active",n).style("cursor",n?"default":"pointer");var i=qa(this.nextSibling).property("checked",n).call(nh,o._radioStyle).style("cursor",n?"default":"pointer").on("change.d3plus",function(){o.checked(this.value);a.each(function(t,e){var n=""+o._value(t,e)===""+o._checked;qa(this).classed("active",n).style("cursor",n?"default":"pointer");qa(this.nextSibling).style("cursor",n?"default":"pointer")})});for(var r in o._on){if({}.hasOwnProperty.call(o._on,r)){i.on(r,o._on[r])}}});var r=e.selectAll("legend#d3plus-Legend-"+this._uuid).data(this._legend?[0]:[]);r.exit().remove();r.enter().insert("legend",".d3plus-Label").attr("id","d3plus-Legend-"+this._uuid).attr("class","d3plus-Legend").merge(r).call(nh,this._legendStyle).html(this._legend);return this};e.prototype.checked=function t(e){return arguments.length?(this._checked=e,this):this._checked};e.prototype.container=function t(e){return arguments.length?(this._container=qa(e),this):this._container};e.prototype.labelStyle=function t(e){return arguments.length?(this._labelStyle=e,this):this._labelStyle};e.prototype.legend=function t(e){return arguments.length?(this._legend=e,this):this._legend};e.prototype.legendStyle=function t(e){return arguments.length?(this._legendStyle=e,this):this._legendStyle};e.prototype.options=function t(e){return arguments.length?(this._options=e,this):this._options};e.prototype.radioStyle=function t(e){return arguments.length?(this._radioStyle=e,this):this._radioStyle};e.prototype.text=function t(e){return arguments.length?(this._text=typeof e==="function"?e:Zu(e),this):this._text};e.prototype.value=function t(e){return arguments.length?(this._value=e,this):this._value};return e}(Yu);var fb=function(t){function e(){t.call(this);this._labelStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px","margin-right":"5px"};this._options=[];this._optionStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px"};this._selectStyle={background:"#fafafa",border:"1px solid #ccc","border-radius":"0","font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px",outline:"0",padding:"3px 5px 4px"};this._text=ju("text");this._value=ju("value")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype.render=function t(){var n=this;if(this._container===void 0){this.container(o("body").append("div").node())}var e=this;var i=this._container.selectAll("div#d3plus-Form-"+this._uuid).data([0]);var r=this._container.node().tagName.toLowerCase()==="foreignobject";i=i.enter().append(r?"xhtml:div":"div").attr("id","d3plus-Form-"+this._uuid).attr("class","d3plus-Form d3plus-Form-Select").merge(i);var o=i.selectAll("select#d3plus-Select-"+this._uuid).data([0]);o=o.enter().append("select").attr("id","d3plus-Select-"+this._uuid).attr("class","d3plus-Select").merge(o).call(nh,this._selectStyle).on("change.d3plus",function(){e.selected(this.value)});for(var a in n._on){if({}.hasOwnProperty.call(n._on,a)){o.on(a,n._on[a])}}var s=o.selectAll("option").data(this._options,function(t,e){return n._value(t,e)});s.exit().remove();s.enter().append("option").attr("class","d3plus-Option").merge(s).call(nh,this._optionStyle).attr("value",function(t,e){return n._value(t,e)}).html(function(t,e){return n._text(t,e)}).property("selected",function(t,e){return n._selected===void 0?!e:""+n._value(t,e)===""+n._selected});var u=i.selectAll("label#d3plus-Label-"+this._uuid).data(this._label?[0]:[]);u.exit().remove();u.enter().insert("label","#d3plus-Select-"+this._uuid).attr("id","d3plus-Label-"+this._uuid).attr("class","d3plus-Label").attr("for","d3plus-Select-"+this._uuid).merge(u).call(nh,this._labelStyle).html(this._label);return this};e.prototype.container=function t(e){return arguments.length?(this._container=qa(e),this):this._container};e.prototype.label=function t(e){return arguments.length?(this._label=e,this):this._label};e.prototype.labelStyle=function t(e){return arguments.length?(this._labelStyle=e,this):this._labelStyle};e.prototype.options=function t(e){return arguments.length?(this._options=e,this):this._options};e.prototype.optionStyle=function t(e){return arguments.length?(this._optionStyle=e,this):this._optionStyle};e.prototype.selected=function t(e){return arguments.length?(this._selected=e,this):this._selected};e.prototype.selectStyle=function t(e){return arguments.length?(this._selectStyle=e,this):this._selectStyle};e.prototype.text=function t(e){return arguments.length?(this._text=typeof e==="function"?e:Zu(e),this):this._text};e.prototype.value=function t(e){return arguments.length?(this._value=e,this):this._value};return e}(Yu);function cb(t){return t.slice().sort(function(t,e){return t-e})}function db(t){var e,n=0;for(var i=0;i0){var o=(n[e]-n[t-1])/(e-t+1);r=i[e]-i[t-1]-(e-t+1)*o*o}else{r=i[e]-n[e]*n[e]/(e+1)}if(r<0){return 0}return r}function vb(t,e,n,i,r,o,a){if(t>e){return}var s=Math.floor((t+e)/2);i[n][s]=i[n-1][s-1];r[n][s]=s;var u=n;if(t>n){u=Math.max(u,r[n][t-1]||0)}u=Math.max(u,r[n-1][s]||0);var h=s-1;if(e=u;--l){var f=gb(l,s,o,a);if(f+i[n-1][u-1]>=i[n][s]){break}var c=gb(u,s,o,a);var d=c+i[n-1][u-1];if(dt.length){throw new Error("Cannot generate more classes than there are data values")}var n=cb(t);var i=db(n);if(i===1){return[n]}var r=pb(e,n.length),o=pb(e,n.length);_b(n,o,r);var a=r[0].length-1;var s=[];for(var u=r.length-1;u>=0;u--){var h=r[u][a];s[u]=n.slice(h,a+1);if(u>0){a=h-1}}return s};var mb=function(t){function e(){t.call(this);this._axisClass=new Cd;this._axisConfig={gridSize:0};this._axisTest=new Cd;this._align="middle";this._color="#0C8040";this._data=[];this._duration=600;this._height=200;this._orient="bottom";this._outerBounds={width:0,height:0,x:0,y:0};this._padding=5;this._rectClass=new bd;this._rectConfig={stroke:"#000",strokeWidth:1};this._scale="linear";this._size=10;this._value=ju("value");this._width=400}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype.render=function t(e){var n=this;var i;if(this._select===void 0){this.select(qa("body").append("svg").attr("width",this._width+"px").attr("height",this._height+"px").node())}var r=["bottom","top"].includes(this._orient);var o=r?"height":"width",a=r?"width":"height",s=r?"x":"y",u=r?"y":"x";this._group=Ku("g.d3plus-ColorScale",{parent:this._select});var h=Ht(this._data,this._value);var l=this._color,f,c;if(!(l instanceof Array)){l=[wh(l,.9),wh(l,.75),wh(l,.5),wh(l,.25),l]}if(this._scale==="jenks"){var d=this._data.map(this._value).filter(function(t){return t!==null&&typeof t==="number"});if(d.length<=l.length){var p=vn().domain(Vt(0,d.length-1)).interpolate(De).range(l);l=d.slice(0,d.length-1).map(function(t,e){return p(e)})}var g=yb(d,l.length);c=Wt(g.map(function(t,e){return e===g.length-1?[t[0],t[t.length-1]]:[t[0]]}));var v=new Set(c);if(c.length!==v.size){f=Array.from(v)}this._colorScale=Dn().domain(c).range(["black"].concat(l).concat(l[l.length-1]))}else{var _=(h[1]-h[0])/(l.length-1);var y=Vt(h[0],h[1]+_/2,_);if(this._scale==="buckets"){c=y}this._colorScale=vn().domain(y).range(l)}var m=Object.assign({domain:r?h:h.reverse(),duration:this._duration,height:this._height,labels:f||c,orient:this._orient,padding:this._padding,ticks:c,width:this._width},this._axisConfig);this._axisTest.select(Ku("g.d3plus-ColorScale-axisTest",{enter:{opacity:0},parent:this._group}).node()).config(m).render();var b=this._axisTest.outerBounds();this._outerBounds[a]=this["_"+a]-this._padding*2;this._outerBounds[o]=b[o]+this._size;this._outerBounds[s]=this._padding;this._outerBounds[u]=this._padding;if(this._align==="middle"){this._outerBounds[u]=(this["_"+o]-this._outerBounds[o])/2}else if(this._align==="end"){this._outerBounds[u]=this["_"+o]-this._padding-this._outerBounds[o]}var x=this._outerBounds[u]+(["bottom","right"].includes(this._orient)?this._size:0)-(m.padding||this._axisClass.padding());this._axisClass.select(Ku("g.d3plus-ColorScale-axis",{parent:this._group,update:{transform:"translate("+(r?0:x)+", "+(r?x:0)+")"}}).node()).config(m).align("start").render();var w=this._axisTest._getPosition.bind(this._axisTest);var C=this._axisTest._getRange();var E=this._group.selectAll("defs").data([0]);var S=E.enter().append("defs");S.append("linearGradient").attr("id","gradient-"+this._uuid);E=S.merge(E);E.select("linearGradient").attr(s+"1",r?"0%":"100%").attr(s+"2",r?"100%":"0%").attr(u+"1","0%").attr(u+"2","0%");var A=E.select("linearGradient").selectAll("stop").data(l);A.enter().append("stop").merge(A).attr("offset",function(t,e){return e/(l.length-1)*100+"%"}).attr("stop-color",String);function k(t,e){var n=Math.abs(w(c[e+1])-w(t));return n||2}this._rectClass.data(c?c.slice(0,c.length-1):[0]).id(function(t,e){return e}).select(Ku("g.d3plus-ColorScale-Rect",{parent:this._group}).node()).config((i={fill:c?function(t){return n._colorScale(t)}:"url(#gradient-"+this._uuid+")"},i[s]=c?function(t,e){return w(t)+k(t,e)/2-(["left","right"].includes(n._orient)?k(t,e):0)}:C[0]+(C[1]-C[0])/2,i[u]=this._outerBounds[u]+(["top","left"].includes(this._orient)?b[o]:0)+this._size/2,i[a]=c?k:C[1]-C[0],i[o]=this._size,i)).config(this._rectConfig).render();if(e){setTimeout(e,this._duration+100)}return this};e.prototype.axisConfig=function t(e){return arguments.length?(this._axisConfig=Object.assign(this._axisConfig,e),this):this._axisConfig};e.prototype.align=function t(e){return arguments.length?(this._align=e,this):this._align};e.prototype.color=function t(e){return arguments.length?(this._color=e,this):this._color};e.prototype.data=function t(e){return arguments.length?(this._data=e,this):this._data};e.prototype.duration=function t(e){return arguments.length?(this._duration=e,this):this._duration};e.prototype.height=function t(e){return arguments.length?(this._height=e,this):this._height};e.prototype.orient=function t(e){return arguments.length?(this._orient=e,this):this._orient};e.prototype.outerBounds=function t(){return this._outerBounds};e.prototype.padding=function t(e){return arguments.length?(this._padding=e,this):this._padding};e.prototype.rectConfig=function t(e){return arguments.length?(this._rectConfig=Object.assign(this._rectConfig,e),this):this._rectConfig};e.prototype.scale=function t(e){return arguments.length?(this._scale=e,this):this._scale};e.prototype.select=function t(e){return arguments.length?(this._select=qa(e),this):this._select};e.prototype.size=function t(e){return arguments.length?(this._size=e,this):this._size};e.prototype.value=function t(e){return arguments.length?(this._value=typeof e==="function"?e:Zu(e),this):this._value};e.prototype.width=function t(e){return arguments.length?(this._width=e,this):this._width};return e}(Yu);var bb=function(t){function e(){var a=this;t.call(this);this._align="center";this._data=[];this._direction="row";this._duration=600;this._height=200;this._id=ju("id");this._label=ju("id");this._lineData=[];this._outerBounds={width:0,height:0,x:0,y:0};this._padding=5;this._shape=Zu("Rect");this._shapes=[];this._shapeConfig={duration:this._duration,fill:ju("color"),height:Zu(10),hitArea:function(t,e){var n=a._lineData[e],i=Ut([n.height,n.shapeHeight]);return{width:n.width+n.shapeWidth,height:i,x:-n.shapeWidth/2,y:-i/2}},labelBounds:function(t,e,n){var i=a._lineData[e],r=n.r!==void 0?n.r:n.width/2;return{width:i.width,height:i.height,x:r+a._padding,y:-i.height/2+(i.lh-i.s)/2+1}},labelConfig:{fontColor:Zu("#444"),fontFamily:(new Ac).fontFamily(),fontResize:false,fontSize:Zu(10)},opacity:1,r:Zu(5),width:Zu(10),x:function(t,e){var n=a._lineData[e];var i=n.y;var r=a._align==="left"||a._align==="right"&&a._direction==="column"?0:a._align==="center"?(a._outerBounds.width-a._rowWidth(a._lineData.filter(function(t){return i===t.y})))/2:a._outerBounds.width-a._rowWidth(a._lineData.filter(function(t){return i===t.y}));var o=a._lineData.slice(0,e).filter(function(t){return i===t.y});return a._rowWidth(o)+a._padding*(o.length?n.sentence?2:1:0)+a._outerBounds.x+n.shapeWidth/2+r},y:function(t,e){var n=a._lineData[e];return n.y+a._titleHeight+a._outerBounds.y+Ut(a._lineData.filter(function(t){return n.y===t.y}).map(function(t){return t.height}).concat(a._data.map(function(t,e){return a._fetchConfig("height",t,e)})))/2}};this._titleClass=new Ac;this._titleConfig={};this._verticalAlign="middle";this._width=400}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype._fetchConfig=function t(e,n,i){var r=this._shapeConfig[e]||this._shapeConfig.labelConfig[e];if(!r&&e==="lineHeight"){return this._fetchConfig("fontSize",n,i)*1.4}return typeof r==="function"?r(n,i):r};e.prototype._rowHeight=function t(e){return Ut(e.map(function(t){return t.height}).concat(e.map(function(t){return t.shapeHeight})))+this._padding};e.prototype._rowWidth=function t(i){var r=this;return Xt(i.map(function(t,e){var n=r._padding*(e===i.length-1?0:t.width?2:1);return t.shapeWidth+t.width+n}))};e.prototype.render=function t(e){var h=this;if(this._select===void 0){this.select(qa("body").append("svg").attr("width",this._width+"px").attr("height",this._height+"px").node())}this._group=Ku("g.d3plus-Legend",{parent:this._select});var l=this._height;this._titleHeight=0;if(this._title){var n=this._titleConfig.fontFamily||this._titleClass.fontFamily()(),i=this._titleConfig.fontSize||this._titleClass.fontSize()();var r=r=this._titleConfig.lineHeight||this._titleClass.lineHeight();r=r?r():i*1.4;var o=Sc().fontFamily(n).fontSize(i).lineHeight(r).width(this._width).height(this._height)(this._title);this._titleHeight=r+o.lines.length+this._padding;l-=this._titleHeight}this._lineData=this._data.map(function(t,e){var n=h._label(t,e);var i={data:t,i:e,id:h._id(t,e),shapeWidth:h._fetchConfig("width",t,e),shapeHeight:h._fetchConfig("height",t,e),y:0};if(!n){i.sentence=false;i.words=[];i.height=0;i.width=0;return i}var r=h._fetchConfig("fontFamily",t,e),o=h._fetchConfig("lineHeight",t,e),a=h._fetchConfig("fontSize",t,e);var s=l-(h._data.length+1)*h._padding,u=h._width;i=Object.assign(i,Sc().fontFamily(r).fontSize(a).lineHeight(o).width(u).height(s)(n));i.width=Math.ceil(Ut(i.lines.map(function(t){return Gf(t,{"font-family":r,"font-size":a})})))+a*.75;i.height=Math.ceil(i.lines.length*(o+1));i.og={height:i.height,width:i.width};i.f=r;i.s=a;i.lh=o;return i});var a;var s=this._width-this._padding*2;a=this._rowWidth(this._lineData);if(this._direction==="column"||a>s){var u=1,f=[];var c=Ut(this._lineData.map(function(t){return t.words.length}));this._wrapLines=function(){var e=this;u++;if(u>c){return}var o=u===1?this._lineData.slice():this._lineData.filter(function(t){return t.width+t.shapeWidth+e._padding*(t.width?2:1)>s&&t.words.length>=u}).sort(function(t,e){return e.sentence.length-t.sentence.length});if(o.length&&l>o[0].height*u){var a=false;var t=function(t){var e=o[t];var n=e.og.height*u,i=e.og.width*(1.5*(1/u));var r=Sc().fontFamily(e.f).fontSize(e.s).lineHeight(e.lh).width(i).height(n)(e.sentence);if(!r.truncated){e.width=Math.ceil(Ut(r.lines.map(function(t){return Gf(t,{"font-family":e.f,"font-size":e.s})})))+e.s;e.height=r.lines.length*(e.lh+1)}else{a=true;return"break"}};for(var n=0;nl){f=[];break}if(o>s){f=[];t._wrapLines();break}else if(n+ol){a=Xt(this._lineData.map(function(t){return t.shapeWidth+h._padding}))-this._padding;for(var d=0;d=0){return 1}}return 0}();function SK(t){var e=false;return function(){if(e){return}e=true;window.Promise.resolve().then(function(){e=false;t()})}}function CK(t){var e=false;return function(){if(!e){e=true;setTimeout(function(){e=false;t()},kK)}}}var EK=xK&&window.Promise;var AK=EK?SK:CK;function RK(t){var e={};return t&&e.toString.call(t)==="[object Function]"}function MK(t,e){if(t.nodeType!==1){return[]}var n=t.ownerDocument.defaultView;var i=n.getComputedStyle(t,null);return e?i[e]:i}function TK(t){if(t.nodeName==="HTML"){return t}return t.parentNode||t.host}function PK(t){if(!t){return document.body}switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=MK(t),n=e.overflow,i=e.overflowX,r=e.overflowY;if(/(auto|scroll|overlay)/.test(n+r+i)){return t}return PK(TK(t))}function OK(t){return t&&t.referenceNode?t.referenceNode:t}var BK=xK&&!!(window.MSInputMethodContext&&document.documentMode);var DK=xK&&/MSIE 10/.test(navigator.userAgent);function NK(t){if(t===11){return BK}if(t===10){return DK}return BK||DK}function zK(t){if(!t){return document.documentElement}var e=NK(10)?document.body:null;var n=t.offsetParent||null;while(n===e&&t.nextElementSibling){n=(t=t.nextElementSibling).offsetParent}var i=n&&n.nodeName;if(!i||i==="BODY"||i==="HTML"){return t?t.ownerDocument.documentElement:document.documentElement}if(["TH","TD","TABLE"].indexOf(n.nodeName)!==-1&&MK(n,"position")==="static"){return zK(n)}return n}function jK(t){var e=t.nodeName;if(e==="BODY"){return false}return e==="HTML"||zK(t.firstElementChild)===t}function LK(t){if(t.parentNode!==null){return LK(t.parentNode)}return t}function FK(t,e){if(!t||!t.nodeType||!e||!e.nodeType){return document.documentElement}var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING;var i=n?t:e;var r=n?e:t;var a=document.createRange();a.setStart(i,0);a.setEnd(r,0);var o=a.commonAncestorContainer;if(t!==o&&e!==o||i.contains(r)){if(jK(o)){return o}return zK(o)}var s=LK(t);if(s.host){return FK(s.host,e)}else{return FK(t,LK(e).host)}}function IK(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"top";var n=e==="top"?"scrollTop":"scrollLeft";var i=t.nodeName;if(i==="BODY"||i==="HTML"){var r=t.ownerDocument.documentElement;var a=t.ownerDocument.scrollingElement||r;return a[n]}return t[n]}function HK(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var i=IK(e,"top");var r=IK(e,"left");var a=n?-1:1;t.top+=i*a;t.bottom+=i*a;t.left+=r*a;t.right+=r*a;return t}function GK(t,e){var n=e==="x"?"Left":"Top";var i=n==="Left"?"Right":"Bottom";return parseFloat(t["border"+n+"Width"])+parseFloat(t["border"+i+"Width"])}function VK(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],NK(10)?parseInt(n["offset"+t])+parseInt(i["margin"+(t==="Height"?"Top":"Left")])+parseInt(i["margin"+(t==="Height"?"Bottom":"Right")]):0)}function UK(t){var e=t.body;var n=t.documentElement;var i=NK(10)&&getComputedStyle(n);return{height:VK("Height",e,n,i),width:VK("Width",e,n,i)}}var WK=function t(e,n){if(!(e instanceof n)){throw new TypeError("Cannot call a class as a function")}};var qK=function(){function i(t,e){for(var n=0;n2&&arguments[2]!==undefined?arguments[2]:false;var i=NK(10);var r=e.nodeName==="HTML";var a=ZK(t);var o=ZK(e);var s=PK(t);var u=MK(e);var l=parseFloat(u.borderTopWidth);var c=parseFloat(u.borderLeftWidth);if(n&&r){o.top=Math.max(o.top,0);o.left=Math.max(o.left,0)}var f=XK({top:a.top-o.top-l,left:a.left-o.left-c,width:a.width,height:a.height});f.marginTop=0;f.marginLeft=0;if(!i&&r){var h=parseFloat(u.marginTop);var d=parseFloat(u.marginLeft);f.top-=l-h;f.bottom-=l-h;f.left-=c-d;f.right-=c-d;f.marginTop=h;f.marginLeft=d}if(i&&!n?e.contains(s):e===s&&s.nodeName!=="BODY"){f=HK(f,e)}return f}function JK(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=t.ownerDocument.documentElement;var i=$K(t,n);var r=Math.max(n.clientWidth,window.innerWidth||0);var a=Math.max(n.clientHeight,window.innerHeight||0);var o=!e?IK(n):0;var s=!e?IK(n,"left"):0;var u={top:o-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:r,height:a};return XK(u)}function QK(t){var e=t.nodeName;if(e==="BODY"||e==="HTML"){return false}if(MK(t,"position")==="fixed"){return true}var n=TK(t);if(!n){return false}return QK(n)}function tY(t){if(!t||!t.parentElement||NK()){return document.documentElement}var e=t.parentElement;while(e&&MK(e,"transform")==="none"){e=e.parentElement}return e||document.documentElement}function eY(t,e,n,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var a={top:0,left:0};var o=r?tY(t):FK(t,OK(e));if(i==="viewport"){a=JK(o,r)}else{var s=void 0;if(i==="scrollParent"){s=PK(TK(e));if(s.nodeName==="BODY"){s=t.ownerDocument.documentElement}}else if(i==="window"){s=t.ownerDocument.documentElement}else{s=i}var u=$K(s,o,r);if(s.nodeName==="HTML"&&!QK(o)){var l=UK(t.ownerDocument),c=l.height,f=l.width;a.top+=u.top-u.marginTop;a.bottom=c+u.top;a.left+=u.left-u.marginLeft;a.right=f+u.left}else{a=u}}n=n||0;var h=typeof n==="number";a.left+=h?n:n.left||0;a.top+=h?n:n.top||0;a.right-=h?n:n.right||0;a.bottom-=h?n:n.bottom||0;return a}function nY(t){var e=t.width,n=t.height;return e*n}function iY(t,e,i,n,r){var a=arguments.length>5&&arguments[5]!==undefined?arguments[5]:0;if(t.indexOf("auto")===-1){return t}var o=eY(i,n,a,r);var s={top:{width:o.width,height:e.top-o.top},right:{width:o.right-e.right,height:o.height},bottom:{width:o.width,height:o.bottom-e.bottom},left:{width:e.left-o.left,height:o.height}};var u=Object.keys(s).map(function(t){return YK({key:t},s[t],{area:nY(s[t])})}).sort(function(t,e){return e.area-t.area});var l=u.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight});var c=l.length>0?l[0].key:u[0].key;var f=t.split("-")[1];return c+(f?"-"+f:"")}function rY(t,e,n){var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var r=i?tY(e):FK(e,OK(n));return $K(n,r,i)}function aY(t){var e=t.ownerDocument.defaultView;var n=e.getComputedStyle(t);var i=parseFloat(n.marginTop||0)+parseFloat(n.marginBottom||0);var r=parseFloat(n.marginLeft||0)+parseFloat(n.marginRight||0);var a={width:t.offsetWidth+r,height:t.offsetHeight+i};return a}function oY(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function sY(t,e,n){n=n.split("-")[0];var i=aY(t);var r={width:i.width,height:i.height};var a=["right","left"].indexOf(n)!==-1;var o=a?"top":"left";var s=a?"left":"top";var u=a?"height":"width";var l=!a?"height":"width";r[o]=e[o]+e[u]/2-i[u]/2;if(n===s){r[s]=e[s]-i[l]}else{r[s]=e[oY(s)]}return r}function uY(t,e){if(Array.prototype.find){return t.find(e)}return t.filter(e)[0]}function lY(t,e,n){if(Array.prototype.findIndex){return t.findIndex(function(t){return t[e]===n})}var i=uY(t,function(t){return t[e]===n});return t.indexOf(i)}function cY(t,n,e){var i=e===undefined?t:t.slice(0,lY(t,"name",e));i.forEach(function(t){if(t["function"]){console.warn("`modifier.function` is deprecated, use `modifier.fn`!")}var e=t["function"]||t.fn;if(t.enabled&&RK(e)){n.offsets.popper=XK(n.offsets.popper);n.offsets.reference=XK(n.offsets.reference);n=e(n,t)}});return n}function fY(){if(this.state.isDestroyed){return}var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:false,offsets:{}};t.offsets.reference=rY(this.state,this.popper,this.reference,this.options.positionFixed);t.placement=iY(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding);t.originalPlacement=t.placement;t.positionFixed=this.options.positionFixed;t.offsets.popper=sY(this.popper,t.offsets.reference,t.placement);t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute";t=cY(this.modifiers,t);if(!this.state.isCreated){this.state.isCreated=true;this.options.onCreate(t)}else{this.options.onUpdate(t)}}function hY(t,i){return t.some(function(t){var e=t.name,n=t.enabled;return n&&e===i})}function dY(t){var e=[false,"ms","Webkit","Moz","O"];var n=t.charAt(0).toUpperCase()+t.slice(1);for(var i=0;io[d]){t.offsets.popper[f]+=s[f]+g-o[d]}t.offsets.popper=XK(t.offsets.popper);var p=s[f]+s[l]/2-g/2;var v=MK(t.instance.popper);var m=parseFloat(v["margin"+c]);var y=parseFloat(v["border"+c+"Width"]);var _=p-t.offsets.popper[f]-m-y;_=Math.max(Math.min(o[l]-g,_),0);t.arrowElement=i;t.offsets.arrow=(n={},KK(n,f,Math.round(_)),KK(n,h,""),n);return t}function PY(t){if(t==="end"){return"start"}else if(t==="start"){return"end"}return t}var OY=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"];var BY=OY.slice(3);function DY(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=BY.indexOf(t);var i=BY.slice(n+1).concat(BY.slice(0,n));return e?i.reverse():i}var NY={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function zY(p,v){if(hY(p.instance.modifiers,"inner")){return p}if(p.flipped&&p.placement===p.originalPlacement){return p}var m=eY(p.instance.popper,p.instance.reference,v.padding,v.boundariesElement,p.positionFixed);var y=p.placement.split("-")[0];var _=oY(y);var b=p.placement.split("-")[1]||"";var w=[];switch(v.behavior){case NY.FLIP:w=[y,_];break;case NY.CLOCKWISE:w=DY(y);break;case NY.COUNTERCLOCKWISE:w=DY(y,true);break;default:w=v.behavior}w.forEach(function(t,e){if(y!==t||w.length===e+1){return p}y=p.placement.split("-")[0];_=oY(y);var n=p.offsets.popper;var i=p.offsets.reference;var r=Math.floor;var a=y==="left"&&r(n.right)>r(i.left)||y==="right"&&r(n.left)r(i.top)||y==="bottom"&&r(n.top)r(m.right);var u=r(n.top)r(m.bottom);var c=y==="left"&&o||y==="right"&&s||y==="top"&&u||y==="bottom"&&l;var f=["top","bottom"].indexOf(y)!==-1;var h=!!v.flipVariations&&(f&&b==="start"&&o||f&&b==="end"&&s||!f&&b==="start"&&u||!f&&b==="end"&&l);var d=!!v.flipVariationsByContent&&(f&&b==="start"&&s||f&&b==="end"&&o||!f&&b==="start"&&l||!f&&b==="end"&&u);var g=h||d;if(a||c||g){p.flipped=true;if(a||c){y=w[e+1]}if(g){b=PY(b)}p.placement=y+(b?"-"+b:"");p.offsets.popper=YK({},p.offsets.popper,sY(p.instance.popper,p.offsets.reference,p.placement));p=cY(p.instance.modifiers,p,"flip")}});return p}function jY(t){var e=t.offsets,n=e.popper,i=e.reference;var r=t.placement.split("-")[0];var a=Math.floor;var o=["top","bottom"].indexOf(r)!==-1;var s=o?"right":"bottom";var u=o?"left":"top";var l=o?"width":"height";if(n[s]a(i[s])){t.offsets.popper[u]=a(i[s])}return t}function LY(t,e,n,i){var r=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);var a=+r[1];var o=r[2];if(!a){return t}if(o.indexOf("%")===0){var s=void 0;switch(o){case"%p":s=n;break;case"%":case"%r":default:s=i}var u=XK(s);return u[e]/100*a}else if(o==="vh"||o==="vw"){var l=void 0;if(o==="vh"){l=Math.max(document.documentElement.clientHeight,window.innerHeight||0)}else{l=Math.max(document.documentElement.clientWidth,window.innerWidth||0)}return l/100*a}else{return a}}function FY(t,r,a,e){var o=[0,0];var s=["right","left"].indexOf(e)!==-1;var n=t.split(/(\+|\-)/).map(function(t){return t.trim()});var i=n.indexOf(uY(n,function(t){return t.search(/,|\s/)!==-1}));if(n[i]&&n[i].indexOf(",")===-1){console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.")}var u=/\s*,\s*|\s+/;var l=i!==-1?[n.slice(0,i).concat([n[i].split(u)[0]]),[n[i].split(u)[1]].concat(n.slice(i+1))]:[n];l=l.map(function(t,e){var n=(e===1?!s:s)?"height":"width";var i=false;return t.reduce(function(t,e){if(t[t.length-1]===""&&["+","-"].indexOf(e)!==-1){t[t.length-1]=e;i=true;return t}else if(i){t[t.length-1]+=e;i=false;return t}else{return t.concat(e)}},[]).map(function(t){return LY(t,n,r,a)})});l.forEach(function(n,i){n.forEach(function(t,e){if(wY(t)){o[i]+=t*(n[e-1]==="-"?-1:1)}})});return o}function IY(t,e){var n=e.offset;var i=t.placement,r=t.offsets,a=r.popper,o=r.reference;var s=i.split("-")[0];var u=void 0;if(wY(+n)){u=[+n,0]}else{u=FY(n,a,o,s)}if(s==="left"){a.top+=u[0];a.left-=u[1]}else if(s==="right"){a.top+=u[0];a.left+=u[1]}else if(s==="top"){a.left+=u[0];a.top-=u[1]}else if(s==="bottom"){a.left+=u[0];a.top+=u[1]}t.popper=a;return t}function HY(t,r){var e=r.boundariesElement||zK(t.instance.popper);if(t.instance.reference===e){e=zK(e)}var n=dY("transform");var i=t.instance.popper.style;var a=i.top,o=i.left,s=i[n];i.top="";i.left="";i[n]="";var u=eY(t.instance.popper,t.instance.reference,r.padding,e,t.positionFixed);i.top=a;i.left=o;i[n]=s;r.boundaries=u;var l=r.priority;var c=t.offsets.popper;var f={primary:function t(e){var n=c[e];if(c[e]u[e]&&!r.escapeWithReference){i=Math.min(c[n],u[e]-(e==="right"?c.width:c.height))}return KK({},n,i)}};l.forEach(function(t){var e=["left","top"].indexOf(t)!==-1?"primary":"secondary";c=YK({},c,f[e](t))});t.offsets.popper=c;return t}function GY(t){var e=t.placement;var n=e.split("-")[0];var i=e.split("-")[1];if(i){var r=t.offsets,a=r.reference,o=r.popper;var s=["bottom","top"].indexOf(n)!==-1;var u=s?"left":"top";var l=s?"width":"height";var c={start:KK({},u,a[u]),end:KK({},u,a[u]+a[l]-o[l])};t.offsets.popper=YK({},o,c[i])}return t}function VY(t){if(!MY(t.instance.modifiers,"hide","preventOverflow")){return t}var e=t.offsets.reference;var n=uY(t.instance.modifiers,function(t){return t.name==="preventOverflow"}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&arguments[2]!==undefined?arguments[2]:{};WK(this,a);this.scheduleUpdate=function(){return requestAnimationFrame(n.update)};this.update=AK(this.update.bind(this));this.options=YK({},a.Defaults,i);this.state={isDestroyed:false,isCreated:false,scrollParents:[]};this.reference=t&&t.jquery?t[0]:t;this.popper=e&&e.jquery?e[0]:e;this.options.modifiers={};Object.keys(YK({},a.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=YK({},a.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})});this.modifiers=Object.keys(this.options.modifiers).map(function(t){return YK({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order});this.modifiers.forEach(function(t){if(t.enabled&&RK(t.onLoad)){t.onLoad(n.reference,n.popper,n.options,t,n.state)}});this.update();var r=this.options.eventsEnabled;if(r){this.enableEventListeners()}this.state.eventsEnabled=r}qK(a,[{key:"update",value:function t(){return fY.call(this)}},{key:"destroy",value:function t(){return gY.call(this)}},{key:"enableEventListeners",value:function t(){return yY.call(this)}},{key:"disableEventListeners",value:function t(){return bY.call(this)}}]);return a}();KY.Utils=(typeof window!=="undefined"?window:global).PopperUtils;KY.placements=OY;KY.Defaults=qY;function YY(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){YY=function t(e){return typeof e}}else{YY=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return YY(t)}function XY(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function ZY(t,e){for(var n=0;n0&&arguments[0]!==undefined?arguments[0]:{},n=e.duration,i=n===void 0?600:n,r=e.callback;this.mask.call(this.exit.bind(this),i);this.elem.call(this.exit.bind(this),i);if(r)setTimeout(r,i+100);this._isVisible=false;return this}},{key:"render",value:function t(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.callback,i=e.container,r=i===void 0?"body":i,a=e.duration,o=a===void 0?600:a,s=e.html,u=s===void 0?"Please Wait":s,l=e.mask,c=l===void 0?"rgba(0, 0, 0, 0.05)":l,f=e.style,h=f===void 0?{}:f;var d=Yo(r);this.mask=d.selectAll("div.d3plus-Mask").data(c?[c]:[]);this.mask=this.mask.enter().append("div").attr("class","d3plus-Mask").style("opacity",1).merge(this.mask);this.mask.exit().call(this.exit.bind(this),o);vw(this.mask,{"background-color":String,bottom:"0px",left:"0px",position:"absolute",right:"0px",top:"0px"});this.elem=d.selectAll("div.d3plus-Message").data([u]);this.elem=this.elem.enter().append("div").attr("class","d3plus-Message").style("opacity",1).merge(this.elem).html(String);vw(this.elem,h);if(n)setTimeout(n,100);this._isVisible=true;return this}}]);return t}();function cX(){var t=this._history.length;var e=fw("g.d3plus-viz-back",{parent:this._select,transition:this._transition,update:{transform:"translate(".concat(this._margin.left,", ").concat(this._margin.top,")")}}).node();this._backClass.data(t?[{text:"← ".concat(this._translate("Back")),x:0,y:0}]:[]).select(e).config(this._backConfig).render();this._margin.top+=t?this._backClass.fontSize()()+this._backClass.padding()()*2:0}function fX(){var i=this;var t=this._data;var e=this._colorScalePosition||"bottom";var n=["top","bottom"].includes(e);var r=this._colorScalePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var a=this._width-(this._margin.left+this._margin.right+r.left+r.right);var o=n?de([this._colorScaleMaxSize,a]):this._width-(this._margin.left+this._margin.right);var s=this._height-(this._margin.bottom+this._margin.top+r.bottom+r.top);var u=!n?de([this._colorScaleMaxSize,s]):this._height-(this._margin.bottom+this._margin.top);var l={opacity:this._colorScalePosition?1:0,transform:"translate(".concat(n?this._margin.left+r.left+(a-o)/2:this._margin.left,", ").concat(n?this._margin.top:this._margin.top+r.top+(s-u)/2,")")};var c=this._colorScale&&t&&t.length>1;var f=fw("g.d3plus-viz-colorScale",{condition:c&&!this._colorScaleConfig.select,enter:l,parent:this._select,transition:this._transition,update:l}).node();if(c){var h=t.filter(function(t,e){var n=i._colorScale(t,e);return n!==undefined&&n!==null});this._colorScaleClass.align({bottom:"end",left:"start",right:"end",top:"start"}[e]||"bottom").duration(this._duration).data(h).height(u).locale(this._locale).orient(e).select(f).value(this._colorScale).width(o).config(this._colorScaleConfig).render();var d=this._colorScaleClass.outerBounds();if(this._colorScalePosition&&!this._colorScaleConfig.select&&d.height){if(n)this._margin[e]+=d.height+this._legendClass.padding()*2;else this._margin[e]+=d.width+this._legendClass.padding()*2}}else{this._colorScaleClass.config(this._colorScaleConfig)}}var hX={Button:aq,Radio:mq,Select:Mq};function dX(){var f=this;var h=this;var d=this._controlPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var g=["left","right","top","bottom"];var t=function t(e){var u=g[e];var l=(f._controls||[]).filter(function(t){return!t.position&&u==="bottom"||t.position===u});if(f._downloadButton&&f._downloadPosition===u){l.push({data:[{text:f._translate("Download"),value:1}],label:"downloadButton",on:{click:function t(){var e=f._detectResize;if(e)f.detectResize(false).render();JP(f._select.node(),Object.assign({title:f._title||undefined},f._downloadConfig),{callback:function t(){setTimeout(function(){if(e)f.detectResize(e).render()},5e3)}})}},type:"Button"})}var n=u==="top"||u==="bottom";var i={height:n?f._height-(f._margin.top+f._margin.bottom):f._height-(f._margin.top+f._margin.bottom+d.top+d.bottom),width:n?f._width-(f._margin.left+f._margin.right+d.left+d.right):f._width-(f._margin.left+f._margin.right)};i.x=(n?f._margin.left+d.left:f._margin.left)+(u==="right"?f._width-f._margin.bottom:0);i.y=(n?f._margin.top:f._margin.top+d.top)+(u==="bottom"?f._height-f._margin.bottom:0);var r=fw("foreignObject.d3plus-viz-controls-".concat(u),{condition:l.length,enter:Object.assign({opacity:0},i),exit:Object.assign({opacity:0},i),parent:f._select,transition:f._transition,update:{height:i.height,opacity:1,width:i.width}});var c=r.selectAll("div.d3plus-viz-controls-container").data([null]);c=c.enter().append("xhtml:div").attr("class","d3plus-viz-controls-container").merge(c);if(l.length){var a=function t(e){var n=Object.assign({},l[e]);var i={};if(n.on){var r=function t(e){if({}.hasOwnProperty.call(n.on,e)){i[e]=function(){n.on[e].bind(h)(this.value)}}};for(var a in n.on){r(a)}}var o=n.label||"".concat(u,"-").concat(e);if(!f._controlCache[o]){var s=n.type&&hX[n.type]?n.type:"Select";f._controlCache[o]=(new hX[s]).container(c.node());if(n.checked)f._controlCache[o].checked(n.checked);if(n.selected)f._controlCache[o].selected(n.selected)}delete n.checked;delete n.selected;f._controlCache[o].config(n).config({on:i}).config(f._controlConfig).render()};for(var o=0;o0&&arguments[0]!==undefined?arguments[0]:[];var e=this._legendClass.outerBounds();var n=this._legendPosition;var i=["top","bottom"].includes(n);var r=this._legendPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var a={transform:"translate(".concat(i?this._margin.left+r.left:this._margin.left,", ").concat(i?this._margin.top:this._margin.top+r.top,")")};var s=fw("g.d3plus-viz-legend",{condition:this._legend&&!this._legendConfig.select,enter:a,parent:this._select,transition:this._transition,update:a}).node();var u=[];var l=function t(e,n){var i=o._shape(e,n);var r=i==="Line"?"stroke":"fill";var a=o._shapeConfig[i]&&o._shapeConfig[i][r]?o._shapeConfig[i][r]:o._shapeConfig[r];return typeof a==="function"?a.bind(o)(e,n):a};var c=function t(e,n){var i=o._shape(e,n);var r=o._shapeConfig[i]&&o._shapeConfig[i].opacity?o._shapeConfig[i].opacity:o._shapeConfig.opacity;return typeof r==="function"?r.bind(o)(e,n):r};var f=function t(e,n){return"".concat(l(e,n),"_").concat(c(e,n))};if(this._legend){Fe().key(f).rollup(function(t){return u.push(dw(t,o._aggs))}).entries(this._colorScale?t.filter(function(t,e){return o._colorScale(t,e)===undefined}):t)}u.sort(this._legendSort);var h=u.map(function(t,e){return o._ids(t,e).slice(0,o._drawDepth+1)});this._legendDepth=0;var d=function t(e){var n=h.map(function(t){return t[e]});if(!n.some(function(t){return t instanceof Array})&&Array.from(new Set(n)).length===u.length){o._legendDepth=e;return"break"}};for(var g=0;g<=this._drawDepth;g++){var p=d(g);if(p==="break")break}var v=function t(e,n){var i=o._id(e,n);if(i instanceof Array)i=i[0];return o._hidden.includes(i)||o._solo.length&&!o._solo.includes(i)};this._legendClass.id(f).align(i?"center":n).direction(i?"row":"column").duration(this._duration).data(u.length>this._legendCutoff||this._colorScale?u:[]).height(i?this._height-(this._margin.bottom+this._margin.top):this._height-(this._margin.bottom+this._margin.top+r.bottom+r.top)).locale(this._locale).parent(this).select(s).verticalAlign(!i?"middle":n).width(i?this._width-(this._margin.left+this._margin.right+r.left+r.right):this._width-(this._margin.left+this._margin.right)).shapeConfig(lw.bind(this)(this._shapeConfig,"legend")).shapeConfig({fill:function t(e,n){return v(e,n)?o._hiddenColor(e,n):l(e,n)},labelConfig:{fontOpacity:function t(e,n){return v(e,n)?o._hiddenOpacity(e,n):1}},opacity:c}).config(this._legendConfig).render();if(!this._legendConfig.select&&e.height){if(i)this._margin[n]+=e.height+this._legendClass.padding()*2;else this._margin[n]+=e.width+this._legendClass.padding()*2}}function vX(n){var i=this;if(!(n instanceof Array))n=[n,n];if(JSON.stringify(n)!==JSON.stringify(this._timelineSelection)){this._timelineSelection=n;n=n.map(Number);this.timeFilter(function(t){var e=xR(i._time(t)).getTime();return e>=n[0]&&e<=n[1]}).render()}}function mX(){var e=this;var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var n=this._time&&this._timeline;var i=n?hw(this._data.map(this._time)).map(xR):[];n=n&&i.length>1;var r=this._timelinePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var a={transform:"translate(".concat(this._margin.left+r.left,", 0)")};var o=fw("g.d3plus-viz-timeline",{condition:n,enter:a,parent:this._select,transition:this._transition,update:a}).node();if(n){var s=this._timelineClass.domain(ue(i)).duration(this._duration).height(this._height-this._margin.bottom).locale(this._locale).select(o).ticks(i.sort(function(t,e){return+t-+e})).width(this._width-(this._margin.left+this._margin.right+r.left+r.right));if(s.selection()===undefined){this._timelineSelection=ue(t,this._time).map(xR);s.selection(this._timelineSelection)}var u=this._timelineConfig;s.config(u).on("end",function(t){vX.bind(e)(t);if(u.on&&u.on.end)u.on.end(t)}).render();this._margin.bottom+=s.outerBounds().height+s.padding()*2}}function yX(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var e=this._title?this._title(t):false;var n=this._titlePadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var r=fw("g.d3plus-viz-title",{enter:i,parent:this._select,transition:this._transition,update:i}).node();this._titleClass.data(e?[{text:e}]:[]).locale(this._locale).select(r).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._titleConfig).render();this._margin.top+=e?r.getBBox().height:0}function _X(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var e=typeof this._total==="function"?ge(t.map(this._total)):this._total===true&&this._size?ge(t.map(this._size)):false;var n=this._totalPadding()?this._padding:{top:0,right:0,bottom:0,left:0};var i={transform:"translate(".concat(this._margin.left+n.left,", ").concat(this._margin.top,")")};var r=fw("g.d3plus-viz-total",{enter:i,parent:this._select,transition:this._transition,update:i}).node();this._totalClass.data(e?[{text:this._totalFormat(e)}]:[]).locale(this._locale).select(r).width(this._width-(this._margin.left+this._margin.right+n.left+n.right)).config(this._totalConfig).render();this._margin.top+=e?r.getBBox().height+this._totalConfig.padding*2:0}function bX(t,e){if(!t)return undefined;if(t.tagName===undefined||["BODY","HTML"].indexOf(t.tagName)>=0){var n=window["inner".concat(e.charAt(0).toUpperCase()+e.slice(1))];var i=Yo(t);if(e==="width"){n-=parseFloat(i.style("margin-left"),10);n-=parseFloat(i.style("margin-right"),10);n-=parseFloat(i.style("padding-left"),10);n-=parseFloat(i.style("padding-right"),10)}else{n-=parseFloat(i.style("margin-top"),10);n-=parseFloat(i.style("margin-bottom"),10);n-=parseFloat(i.style("padding-top"),10);n-=parseFloat(i.style("padding-bottom"),10)}return n}else{var r=parseFloat(Yo(t).style(e),10);if(typeof r==="number"&&r>0)return r;else return bX(t.parentNode,e)}}function wX(t){return[bX(t,"width"),bX(t,"height")]}function xX(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var n=window.pageXOffset!==undefined?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var i=window.pageYOffset!==undefined?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var r=t.getBoundingClientRect();var a=r.height,o=r.left+n,s=r.top+i,u=r.width;return i+window.innerHeight>s+e&&i+eo+e&&n+e=0){this._solo=[];this._hidden=[];this.render()}}else{if(a<0&&this._hidden.length").concat(s("Shift+Click to Hide"))).title(this._legendConfig.label?this._legendClass.label():gX.bind(this)).position(r).config(lw.bind(this)(this._tooltipConfig)).config(lw.bind(this)(this._legendTooltip)).render()}}function MX(t,e,n){if(t&&this._tooltip(t,e)){this._select.style("cursor","pointer");var i=Oo.touches?[Oo.touches[0].clientX,Oo.touches[0].clientY]:[Oo.clientX,Oo.clientY];this._tooltipClass.data([n||t]).footer(this._drawDeptht.length)e=t.length;for(var n=0,i=new Array(e);n0&&arguments[0]!==undefined?arguments[0]:false;jX=t;if(jX)this._brushGroup.style("display","inline");else this._brushGroup.style("display","none");if(!jX&&this._zoom){this._container.call(this._zoomBehavior);if(!this._zoomScroll){this._container.on("wheel.zoom",null)}if(!this._zoomPan){this._container.on("mousedown.zoom mousemove.zoom",null).on("touchstart.zoom touchmove.zoom touchend.zoom touchcancel.zoom",null)}}else{this._container.on(".zoom",null)}}function IX(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;if(this._zoomGroup){if(!e)this._zoomGroup.attr("transform",t||Oo.transform);else this._zoomGroup.transition().duration(e).attr("transform",t||Oo.transform)}if(this._renderTiles)this._renderTiles(oO(this._container.node()),e)}function HX(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;if(!this._container)return;var e=this._zoomBehavior.extent().bind(document)()[1].map(function(t){return t/2}),n=this._zoomBehavior.scaleExtent(),i=oO(this._container.node());if(!t){i.k=n[0];i.x=0;i.y=0}else{var r=[(e[0]-i.x)/i.k,(e[1]-i.y)/i.k];i.k=Math.min(n[1],i.k*t);if(i.k<=n[0]){i.k=n[0];i.x=0;i.y=0}else{i.x+=e[0]-(r[0]*i.k+i.x);i.y+=e[1]-(r[1]*i.k+i.y)}}IX.bind(this)(i,this._duration)}function GX(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this._duration;var n=this._zoomBehavior.scaleExtent(),i=oO(this._container.node());if(t){var r=PX(this._zoomBehavior.translateExtent()[1],2),a=r[0],o=r[1],s=t[1][0]-t[0][0],u=t[1][1]-t[0][1];var l=Math.min(n[1],1/Math.max(s/a,u/o));var c,f;if(s/u0)i.x=0;else if(i.x0)i.y=0;else if(i.yt.length)e=t.length;for(var n=0,i=new Array(e);n600:true}function vZ(i){return i.reduce(function(t,e,n){if(!n)t+=e;else if(n===i.length-1&&n===1)t+=" and ".concat(e);else if(n===i.length-1)t+=", and ".concat(e);else t+=", ".concat(e);return t},"")}var mZ=function(t){uZ(n,t);var e=cZ(n);function n(){var s;aZ(this,n);s=e.call(this);s._aggs={};s._ariaHidden=true;s._attribution=false;s._attributionStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.25)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"400 11px/11px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",margin:"5px",opacity:.75,padding:"4px 6px 3px"};s._backClass=(new ZS).on("click",function(){if(s._history.length)s.config(s._history.pop()).render();else s.depth(s._drawDepth-1).filter(false).render()}).on("mousemove",function(){return s._backClass.select().style("cursor","pointer")});s._backConfig={fontSize:10,padding:5,resize:false};s._cache=true;s._color=function(t,e){return s._groupBy[0](t,e)};s._colorScaleClass=new sK;s._colorScaleConfig={};s._colorScalePadding=pZ;s._colorScalePosition="bottom";s._colorScaleMaxSize=600;var t=new Mq;s._controlCache={};s._controlConfig={selectStyle:Object.assign({margin:"5px"},t.selectStyle())};s._controlPadding=pZ;s._data=[];s._dataCutoff=100;s._detectResize=true;s._detectResizeDelay=400;s._detectVisible=true;s._detectVisibleInterval=1e3;s._downloadButton=false;s._downloadConfig={type:"png"};s._downloadPosition="top";s._duration=600;s._hidden=[];s._hiddenColor=cw("#aaa");s._hiddenOpacity=cw(.5);s._history=[];s._groupBy=[$u("id")];s._legend=true;s._legendClass=new Yq;s._legendConfig={label:gX.bind(hZ(s)),shapeConfig:{ariaLabel:gX.bind(hZ(s)),labelConfig:{fontColor:undefined,fontResize:false,padding:0}}};s._legendCutoff=1;s._legendPadding=pZ;s._legendPosition="bottom";s._legendSort=function(t,e){return s._drawLabel(t).localeCompare(s._drawLabel(e))};s._legendTooltip={};s._loadingHTML=function(){return"\n ")};s._loadingMessage=true;s._lrucache=KW(10);s._messageClass=new lX;s._messageMask="rgba(0, 0, 0, 0.05)";s._messageStyle={bottom:"0",left:"0",position:"absolute",right:"0","text-align":"center",top:"0"};s._noDataHTML=function(){return"\n
        \n ".concat(s._translate("No Data Available"),"\n
        ")};s._noDataMessage=true;s._on={"click.shape":kX.bind(hZ(s)),"click.legend":SX.bind(hZ(s)),mouseenter:EX.bind(hZ(s)),mouseleave:AX.bind(hZ(s)),"mousemove.shape":MX.bind(hZ(s)),"mousemove.legend":RX.bind(hZ(s))};s._queue=[];s._scrollContainer=(typeof window==="undefined"?"undefined":rZ(window))===undefined?"":window;s._shape=cw("Rect");s._shapes=[];s._shapeConfig={ariaLabel:function t(e,n){return s._drawLabel(e,n)},fill:function t(e,n){while(e.__d3plus__&&e.data){e=e.data;n=e.i}if(s._colorScale){var i=s._colorScale(e,n);if(i!==undefined&&i!==null){var r=s._colorScaleClass._colorScale;var a=s._colorScaleClass.color();if(!r)return a instanceof Array?a[a.length-1]:a;else if(!r.domain().length)return r.range()[r.range().length-1];return r(i)}}var o=s._color(e,n);if(xn(o))return o;return Tw(o)},labelConfig:{fontColor:function t(e,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(e,n):s._shapeConfig.fill;return Pw(i)}},opacity:cw(1),stroke:function t(e,n){var i=typeof s._shapeConfig.fill==="function"?s._shapeConfig.fill(e,n):s._shapeConfig.fill;return xn(i).darker()},role:"presentation",strokeWidth:cw(0)};s._solo=[];s._svgDesc="";s._svgTitle="";s._timeline=true;s._timelineClass=(new wK).align("end");s._timelineConfig={brushing:false,padding:5};s._timelinePadding=pZ;s._threshold=cw(1e-4);s._thresholdKey=undefined;s._thresholdName=function(){return s._translate("Values")};s._titleClass=new ZS;s._titleConfig={ariaHidden:true,fontSize:12,padding:5,resize:false,textAnchor:"middle"};s._titlePadding=pZ;s._tooltip=cw(true);s._tooltipClass=new aX;s._tooltipConfig={pointerEvents:"none",titleStyle:{"max-width":"200px"}};s._totalClass=new ZS;s._totalConfig={fontSize:10,padding:5,resize:false,textAnchor:"middle"};s._totalFormat=function(t){return"".concat(s._translate("Total"),": ").concat(xw(t,s._locale))};s._totalPadding=pZ;s._zoom=false;s._zoomBehavior=pO();s._zoomBrush=zW();s._zoomBrushHandleSize=1;s._zoomBrushHandleStyle={fill:"#444"};s._zoomBrushSelectionStyle={fill:"#777","stroke-width":0};s._zoomControlStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.75)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"900 15px/21px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",height:"20px",margin:"5px",opacity:.75,padding:0,"text-align":"center",width:"20px"};s._zoomControlStyleActive={background:"rgba(0, 0, 0, 0.75)",color:"rgba(255, 255, 255, 0.75)",opacity:1};s._zoomControlStyleHover={cursor:"pointer",opacity:1};s._zoomFactor=2;s._zoomMax=16;s._zoomPadding=20;s._zoomPan=true;s._zoomScroll=true;return s}sZ(n,[{key:"_preDraw",value:function t(){var a=this;var o=this;this._drawDepth=this._depth!==void 0?this._depth:this._groupBy.length-1;this._id=this._groupBy[this._drawDepth];this._ids=function(e,n){return a._groupBy.map(function(t){return!e||e.__d3plus__&&!e.data?undefined:t(e.__d3plus__?e.data:e,e.__d3plus__?e.i:n)}).filter(function(t){return t!==undefined&&t!==null})};this._drawLabel=function(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:a._drawDepth;if(!t)return"";while(t.__d3plus__&&t.data){t=t.data;e=t.i}if(t._isAggregation){return"".concat(a._thresholdName(t,e)," < ").concat(xw(t._threshold*100,a._locale),"%")}if(a._label)return"".concat(a._label(t,e));var i=o._ids(t,e).slice(0,n+1);var r=i.reverse().find(function(t){return!(t instanceof Array)})||i[i.length-1];return r instanceof Array?vZ(r):"".concat(r)};if(this._time&&!this._timeFilter&&this._data.length){var e=this._data.map(this._time).map(xR);var n=this._data[0],i=0;if(this._discrete&&"_".concat(this._discrete)in this&&this["_".concat(this._discrete)](n,i)===this._time(n,i)){this._timeFilter=function(){return true}}else{var r=+ce(e);this._timeFilter=function(t,e){return+xR(a._time(t,e))===r}}}this._filteredData=[];this._legendData=[];var s=[];if(this._data.length){s=this._timeFilter?this._data.filter(this._timeFilter):this._data;if(this._filter)s=s.filter(this._filter);var u=Fe();for(var l=0;l<=this._drawDepth;l++){u.key(this._groupBy[l])}if(this._discrete&&"_".concat(this._discrete)in this)u.key(this["_".concat(this._discrete)]);if(this._discrete&&"_".concat(this._discrete,"2")in this)u.key(this["_".concat(this._discrete,"2")]);var c=u.rollup(function(t){var e=a._data.indexOf(t[0]);var n=a._shape(t[0],e);var i=a._id(t[0],e);var r=dw(t,a._aggs);if(!a._hidden.includes(i)&&(!a._solo.length||a._solo.includes(i))){if(!a._discrete&&n==="Line")a._filteredData=a._filteredData.concat(t);else a._filteredData.push(r)}a._legendData.push(r)}).entries(s);this._filteredData=this._thresholdFunction(this._filteredData,c)}var f=Fe().key(this._id).entries(this._filteredData).length;if(f>this._dataCutoff){if(this._userHover===undefined)this._userHover=this._shapeConfig.hoverOpacity||.5;if(this._userDuration===undefined)this._userDuration=this._shapeConfig.duration||600;this._shapeConfig.hoverOpacity=1;this._shapeConfig.duration=0}else if(this._userHover!==undefined){this._shapeConfig.hoverOpacity=this._userHover;this._shapeConfig.duration=this._userDuration}if(this._noDataMessage&&!this._filteredData.length){this._messageClass.render({container:this._select.node().parentNode,html:this._noDataHTML(this),mask:false,style:this._messageStyle})}}},{key:"_draw",value:function t(){if(this._legendPosition==="left"||this._legendPosition==="right")pX.bind(this)(this._filteredData);if(this._colorScalePosition==="left"||this._colorScalePosition==="right"||this._colorScalePosition===false)fX.bind(this)(this._filteredData);cX.bind(this)();yX.bind(this)(this._filteredData);_X.bind(this)(this._filteredData);mX.bind(this)(this._filteredData);dX.bind(this)(this._filteredData);if(this._legendPosition==="top"||this._legendPosition==="bottom")pX.bind(this)(this._legendData);if(this._colorScalePosition==="top"||this._colorScalePosition==="bottom")fX.bind(this)(this._filteredData);this._shapes=[]}},{key:"_thresholdFunction",value:function t(e){return e}},{key:"render",value:function t(a){var o=this;this._margin={bottom:0,left:0,right:0,top:0};this._padding={bottom:0,left:0,right:0,top:0};this._transition=Uu().duration(this._duration);if(this._select===void 0||this._select.node().tagName.toLowerCase()!=="svg"){var e=this._select===void 0?Yo("body").append("div"):this._select;var n=e.append("svg");this.select(n.node())}function s(){var t=this._select.style("display");this._select.style("display","none");var e=wX(this._select.node().parentNode),n=JX(e,2),i=n[0],r=n[1];i-=parseFloat(this._select.style("border-left-width"),10);i-=parseFloat(this._select.style("border-right-width"),10);r-=parseFloat(this._select.style("border-top-width"),10);r-=parseFloat(this._select.style("border-bottom-width"),10);this._select.style("display",t);if(this._autoWidth){this.width(i);this._select.style("width","".concat(this._width,"px")).attr("width","".concat(this._width,"px"))}if(this._autoHeight){this.height(r);this._select.style("height","".concat(this._height,"px")).attr("height","".concat(this._height,"px"))}}if((!this._width||!this._height)&&(!this._detectVisible||xX(this._select.node()))){this._autoWidth=this._width===undefined;this._autoHeight=this._height===undefined;s.bind(this)()}this._select.attr("class","d3plus-viz").attr("aria-hidden",this._ariaHidden).attr("aria-labelledby","".concat(this._uuid,"-title ").concat(this._uuid,"-desc")).attr("role","img").attr("xmlns","http://www.w3.org/2000/svg").attr("xmlns:xlink","http://www.w3.org/1999/xlink").transition(Uu).style("width",this._width!==undefined?"".concat(this._width,"px"):undefined).style("height",this._height!==undefined?"".concat(this._height,"px"):undefined).attr("width",this._width!==undefined?"".concat(this._width,"px"):undefined).attr("height",this._height!==undefined?"".concat(this._height,"px"):undefined);var i=Yo(this._select.node().parentNode);var r=i.style("position");if(r==="static")i.style("position","relative");var u=this._select.selectAll("title").data([0]);var l=u.enter().append("title").attr("id","".concat(this._uuid,"-title"));u.merge(l).text(this._svgTitle);var c=this._select.selectAll("desc").data([0]);var f=c.enter().append("desc").attr("id","".concat(this._uuid,"-desc"));c.merge(f).text(this._svgDesc);this._visiblePoll=clearInterval(this._visiblePoll);this._resizePoll=clearTimeout(this._resizePoll);this._scrollPoll=clearTimeout(this._scrollPoll);Yo(this._scrollContainer).on("scroll.".concat(this._uuid),null);Yo(this._scrollContainer).on("resize.".concat(this._uuid),null);if(this._detectVisible&&this._select.style("visibility")==="hidden"){this._visiblePoll=setInterval(function(){if(o._select.style("visibility")!=="hidden"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(a)}},this._detectVisibleInterval)}else if(this._detectVisible&&this._select.style("display")==="none"){this._visiblePoll=setInterval(function(){if(o._select.style("display")!=="none"){o._visiblePoll=clearInterval(o._visiblePoll);o.render(a)}},this._detectVisibleInterval)}else if(this._detectVisible&&!xX(this._select.node())){Yo(this._scrollContainer).on("scroll.".concat(this._uuid),function(){if(!o._scrollPoll){o._scrollPoll=setTimeout(function(){if(xX(o._select.node())){Yo(o._scrollContainer).on("scroll.".concat(o._uuid),null);o.render(a)}o._scrollPoll=clearTimeout(o._scrollPoll)},o._detectVisibleInterval)}})}else{var h=qW();this._queue.forEach(function(t){var e=o._cache?o._lrucache.get("".concat(t[3],"_").concat(t[1])):undefined;if(!e)h.defer.apply(h,YX(t));else o["_".concat(t[3])]=t[2]?t[2](e):e});this._queue=[];if(this._loadingMessage&&h._tasks.length){this._messageClass.render({container:this._select.node().parentNode,html:this._loadingHTML(this),mask:this._filteredData?this._messageMask:false,style:this._messageStyle})}h.awaitAll(function(){var n=o._data instanceof Array&&o._data.length>0?Object.keys(o._data[0]):[];var t=o._select.selectAll("g.data-table").data(!o._ariaHidden&&o._data instanceof Array&&o._data.length?[0]:[]);var e=t.enter().append("g").attr("class","data-table").attr("role","table");t.exit().remove();var i=t.merge(e).selectAll("text").data(o._data instanceof Array?le(0,o._data.length+1):[]);i.exit().remove();var r=i.merge(i.enter().append("text").attr("role","row")).selectAll("tspan").data(function(t,e){return n.map(function(t){return{role:e?"cell":"columnheader",text:e?o._data[e-1][t]:t}})});r.exit().remove();r.merge(r.enter().append("tspan")).attr("role",function(t){return t.role}).attr("dy","-1000px").html(function(t){return t.text});o._preDraw();o._draw(a);LX.bind(o)();KX.bind(o)();if(o._messageClass._isVisible&&(!o._noDataMessage||o._filteredData.length))o._messageClass.hide();if(o._detectResize&&(o._autoWidth||o._autoHeight)){Yo(o._scrollContainer).on("resize.".concat(o._uuid),function(){o._resizePoll=clearTimeout(o._resizePoll);o._resizePoll=setTimeout(function(){o._resizePoll=clearTimeout(o._resizePoll);s.bind(o)();o.render(a)},o._detectResizeDelay)})}if(a)setTimeout(a,o._duration+100)})}Yo("body").on("touchstart.".concat(this._uuid),TX.bind(this));return this}},{key:"active",value:function t(e){this._active=e;if(this._shapeConfig.activeOpacity!==1){this._shapes.forEach(function(t){return t.active(e)});if(this._legend)this._legendClass.active(e)}return this}},{key:"aggs",value:function t(e){return arguments.length?(this._aggs=el(this._aggs,e),this):this._aggs}},{key:"ariaHidden",value:function t(e){return arguments.length?(this._ariaHidden=e,this):this._ariaHidden}},{key:"attribution",value:function t(e){return arguments.length?(this._attribution=e,this):this._attribution}},{key:"attributionStyle",value:function t(e){return arguments.length?(this._attributionStyle=el(this._attributionStyle,e),this):this._attributionStyle}},{key:"backConfig",value:function t(e){return arguments.length?(this._backConfig=el(this._backConfig,e),this):this._backConfig}},{key:"cache",value:function t(e){return arguments.length?(this._cache=e,this):this._cache}},{key:"color",value:function t(e){return arguments.length?(this._color=!e||typeof e==="function"?e:$u(e),this):this._color}},{key:"colorScale",value:function t(e){return arguments.length?(this._colorScale=!e||typeof e==="function"?e:$u(e),this):this._colorScale}},{key:"colorScaleConfig",value:function t(e){return arguments.length?(this._colorScaleConfig=el(this._colorScaleConfig,e),this):this._colorScaleConfig}},{key:"colorScalePadding",value:function t(e){return arguments.length?(this._colorScalePadding=typeof e==="function"?e:cw(e),this):this._colorScalePadding}},{key:"colorScalePosition",value:function t(e){return arguments.length?(this._colorScalePosition=e,this):this._colorScalePosition}},{key:"colorScaleMaxSize",value:function t(e){return arguments.length?(this._colorScaleMaxSize=e,this):this._colorScaleMaxSize}},{key:"controls",value:function t(e){return arguments.length?(this._controls=e,this):this._controls}},{key:"controlConfig",value:function t(e){return arguments.length?(this._controlConfig=el(this._controlConfig,e),this):this._controlConfig}},{key:"controlPadding",value:function t(e){return arguments.length?(this._controlPadding=typeof e==="function"?e:cw(e),this):this._controlPadding}},{key:"data",value:function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="data"});var r=[lW.bind(this),e,n,"data"];if(i)this._queue[this._queue.indexOf(i)]=r;else this._queue.push(r);this._hidden=[];this._solo=[];return this}return this._data}},{key:"dataCutoff",value:function t(e){return arguments.length?(this._dataCutoff=e,this):this._dataCutoff}},{key:"depth",value:function t(e){return arguments.length?(this._depth=e,this):this._depth}},{key:"detectResize",value:function t(e){return arguments.length?(this._detectResize=e,this):this._detectResize}},{key:"detectResizeDelay",value:function t(e){return arguments.length?(this._detectResizeDelay=e,this):this._detectResizeDelay}},{key:"detectVisible",value:function t(e){return arguments.length?(this._detectVisible=e,this):this._detectVisible}},{key:"detectVisibleInterval",value:function t(e){return arguments.length?(this._detectVisibleInterval=e,this):this._detectVisibleInterval}},{key:"discrete",value:function t(e){return arguments.length?(this._discrete=e,this):this._discrete}},{key:"downloadButton",value:function t(e){return arguments.length?(this._downloadButton=e,this):this._downloadButton}},{key:"downloadConfig",value:function t(e){return arguments.length?(this._downloadConfig=el(this._downloadConfig,e),this):this._downloadConfig}},{key:"downloadPosition",value:function t(e){return arguments.length?(this._downloadPosition=e,this):this._downloadPosition}},{key:"duration",value:function t(e){return arguments.length?(this._duration=e,this):this._duration}},{key:"filter",value:function t(e){return arguments.length?(this._filter=e,this):this._filter}},{key:"groupBy",value:function t(e){var n=this;if(!arguments.length)return this._groupBy;if(!(e instanceof Array))e=[e];return this._groupBy=e.map(function(t){if(typeof t==="function")return t;else{if(!n._aggs[t]){n._aggs[t]=function(t,e){var n=hw(t.map(e));return n.length===1?n[0]:n}}return $u(t)}}),this}},{key:"height",value:function t(e){return arguments.length?(this._height=e,this):this._height}},{key:"hiddenColor",value:function t(e){return arguments.length?(this._hiddenColor=typeof e==="function"?e:cw(e),this):this._hiddenColor}},{key:"hiddenOpacity",value:function t(e){return arguments.length?(this._hiddenOpacity=typeof e==="function"?e:cw(e),this):this._hiddenOpacity}},{key:"hover",value:function t(e){var i=this;var n=this._hover=e;if(this._shapeConfig.hoverOpacity!==1){if(typeof e==="function"){var r=he(this._shapes.map(function(t){return t.data()}));r=r.concat(this._legendClass.data());var a=e?r.filter(e):[];var o=[];a.map(this._ids).forEach(function(t){for(var e=1;e<=t.length;e++){o.push(JSON.stringify(t.slice(0,e)))}});o=o.filter(function(t,e){return o.indexOf(t)===e});if(o.length)n=function t(e,n){return o.includes(JSON.stringify(i._ids(e,n)))}}this._shapes.forEach(function(t){return t.hover(n)});if(this._legend)this._legendClass.hover(n)}return this}},{key:"label",value:function t(e){return arguments.length?(this._label=typeof e==="function"?e:cw(e),this):this._label}},{key:"legend",value:function t(e){return arguments.length?(this._legend=e,this):this._legend}},{key:"legendConfig",value:function t(e){return arguments.length?(this._legendConfig=el(this._legendConfig,e),this):this._legendConfig}},{key:"legendCutoff",value:function t(e){return arguments.length?(this._legendCutoff=e,this):this._legendCutoff}},{key:"legendTooltip",value:function t(e){return arguments.length?(this._legendTooltip=el(this._legendTooltip,e),this):this._legendTooltip}},{key:"legendPadding",value:function t(e){return arguments.length?(this._legendPadding=typeof e==="function"?e:cw(e),this):this._legendPadding}},{key:"legendPosition",value:function t(e){return arguments.length?(this._legendPosition=e,this):this._legendPosition}},{key:"legendSort",value:function t(e){return arguments.length?(this._legendSort=e,this):this._legendSort}},{key:"loadingHTML",value:function t(e){return arguments.length?(this._loadingHTML=typeof e==="function"?e:cw(e),this):this._loadingHTML}},{key:"loadingMessage",value:function t(e){return arguments.length?(this._loadingMessage=e,this):this._loadingMessage}},{key:"messageMask",value:function t(e){return arguments.length?(this._messageMask=e,this):this._messageMask}},{key:"messageStyle",value:function t(e){return arguments.length?(this._messageStyle=el(this._messageStyle,e),this):this._messageStyle}},{key:"noDataHTML",value:function t(e){return arguments.length?(this._noDataHTML=typeof e==="function"?e:cw(e),this):this._noDataHTML}},{key:"noDataMessage",value:function t(e){return arguments.length?(this._noDataMessage=e,this):this._noDataMessage}},{key:"scrollContainer",value:function t(e){return arguments.length?(this._scrollContainer=e,this):this._scrollContainer}},{key:"select",value:function t(e){return arguments.length?(this._select=Yo(e),this):this._select}},{key:"shape",value:function t(e){return arguments.length?(this._shape=typeof e==="function"?e:cw(e),this):this._shape}},{key:"shapeConfig",value:function t(e){return arguments.length?(this._shapeConfig=el(this._shapeConfig,e),this):this._shapeConfig}},{key:"svgDesc",value:function t(e){return arguments.length?(this._svgDesc=e,this):this._svgDesc}},{key:"svgTitle",value:function t(e){return arguments.length?(this._svgTitle=e,this):this._svgTitle}},{key:"threshold",value:function t(e){if(arguments.length){if(typeof e==="function"){this._threshold=e}else if(isFinite(e)&&!isNaN(e)){this._threshold=cw(e*1)}return this}else return this._threshold}},{key:"thresholdKey",value:function t(e){if(arguments.length){if(typeof e==="function"){this._thresholdKey=e}else{this._thresholdKey=$u(e)}return this}else return this._thresholdKey}},{key:"thresholdName",value:function t(e){return arguments.length?(this._thresholdName=typeof e==="function"?e:cw(e),this):this._thresholdName}},{key:"time",value:function t(e){if(arguments.length){if(typeof e==="function"){this._time=e}else{this._time=$u(e);if(!this._aggs[e]){this._aggs[e]=function(t,e){var n=hw(t.map(e));return n.length===1?n[0]:n}}}this._timeFilter=false;return this}else return this._time}},{key:"timeFilter",value:function t(e){return arguments.length?(this._timeFilter=e,this):this._timeFilter}},{key:"timeline",value:function t(e){return arguments.length?(this._timeline=e,this):this._timeline}},{key:"timelineConfig",value:function t(e){return arguments.length?(this._timelineConfig=el(this._timelineConfig,e),this):this._timelineConfig}},{key:"timelinePadding",value:function t(e){return arguments.length?(this._timelinePadding=typeof e==="function"?e:cw(e),this):this._timelinePadding}},{key:"title",value:function t(e){return arguments.length?(this._title=typeof e==="function"?e:cw(e),this):this._title}},{key:"titleConfig",value:function t(e){return arguments.length?(this._titleConfig=el(this._titleConfig,e),this):this._titleConfig}},{key:"titlePadding",value:function t(e){return arguments.length?(this._titlePadding=typeof e==="function"?e:cw(e),this):this._titlePadding}},{key:"tooltip",value:function t(e){return arguments.length?(this._tooltip=typeof e==="function"?e:cw(e),this):this._tooltip}},{key:"tooltipConfig",value:function t(e){return arguments.length?(this._tooltipConfig=el(this._tooltipConfig,e),this):this._tooltipConfig}},{key:"total",value:function t(e){if(arguments.length){if(typeof e==="function")this._total=e;else if(e)this._total=$u(e);else this._total=false;return this}else return this._total}},{key:"totalConfig",value:function t(e){return arguments.length?(this._totalConfig=el(this._totalConfig,e),this):this._totalConfig}},{key:"totalFormat",value:function t(e){return arguments.length?(this._totalFormat=e,this):this._totalFormat}},{key:"totalPadding",value:function t(e){return arguments.length?(this._totalPadding=typeof e==="function"?e:cw(e),this):this._totalPadding}},{key:"width",value:function t(e){return arguments.length?(this._width=e,this):this._width}},{key:"zoom",value:function t(e){return arguments.length?(this._zoom=e,this):this._zoom}},{key:"zoomBrushHandleSize",value:function t(e){return arguments.length?(this._zoomBrushHandleSize=e,this):this._zoomBrushHandleSize}},{key:"zoomBrushHandleStyle",value:function t(e){return arguments.length?(this._zoomBrushHandleStyle=e,this):this._zoomBrushHandleStyle}},{key:"zoomBrushSelectionStyle",value:function t(e){return arguments.length?(this._zoomBrushSelectionStyle=e,this):this._zoomBrushSelectionStyle}},{key:"zoomControlStyle",value:function t(e){return arguments.length?(this._zoomControlStyle=e,this):this._zoomControlStyle}},{key:"zoomControlStyleActive",value:function t(e){return arguments.length?(this._zoomControlStyleActive=e,this):this._zoomControlStyleActive}},{key:"zoomControlStyleHover",value:function t(e){return arguments.length?(this._zoomControlStyleHover=e,this):this._zoomControlStyleHover}},{key:"zoomFactor",value:function t(e){return arguments.length?(this._zoomFactor=e,this):this._zoomFactor}},{key:"zoomMax",value:function t(e){return arguments.length?(this._zoomMax=e,this):this._zoomMax}},{key:"zoomPan",value:function t(e){return arguments.length?(this._zoomPan=e,this):this._zoomPan}},{key:"zoomPadding",value:function t(e){return arguments.length?(this._zoomPadding=e,this):this._zoomPadding}},{key:"zoomScroll",value:function t(e){return arguments.length?(this._zoomScroll=e,this):this._zoomScroll}}]);return n}(ow);var yZ=[{matches:["cartodb","cartocdn"],text:"© OpenStreetMap contributors, © CARTO"},{matches:["opentopomap.org"],text:"© OpenStreetMap contributors"},{matches:["arcgisonline.com"],text:"Powered by Esri"},{matches:["/watercolor/"],text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL."},{matches:["stamen-tiles","stamen.com"],text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA."}];function _Z(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_Z=function t(e){return typeof e}}else{_Z=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return _Z(t)}function bZ(t,e){return CZ(t)||SZ(t,e)||xZ(t,e)||wZ()}function wZ(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function xZ(t,e){if(!t)return;if(typeof t==="string")return kZ(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return kZ(t,e)}function kZ(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,i=new Array(e);n0&&arguments[0]!==undefined?arguments[0]:oO(this._container.node());var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var r=[];if(this._tiles){r=this._tileGen.extent(this._zoomBehavior.translateExtent()).scale(this._projection.scale()*(2*Math.PI)*i.k).translate(i.apply(this._projection.translate()))();this._tileGroup.transition().duration(e).attr("transform",i)}var n=this._tileGroup.selectAll("image.d3plus-geomap-tile").data(r,function(t){var e=bZ(t,3),n=e[0],i=e[1],r=e[2];return"".concat(n,"-").concat(i,"-").concat(r)});n.exit().transition().duration(e).attr("opacity",0).remove();var o=r.scale/i.k;var s=n.enter().append("image").attr("class","d3plus-geomap-tile");s.attr("opacity",0).transition().duration(e).attr("opacity",1);n.merge(s).attr("width",o).attr("height",o).attr("xlink:href",function(t){var e=bZ(t,3),n=e[0],i=e[1],r=e[2];return a._tileUrl.replace("{s}",["a","b","c"][Math.random()*3|0]).replace("{z}",r).replace("{x}",n).replace("{y}",i)}).attr("x",function(t){var e=bZ(t,1),n=e[0];return n*o+r.translate[0]*o-i.x/i.k}).attr("y",function(t){var e=bZ(t,2),n=e[1];return n*o+r.translate[1]*o-i.y/i.k})}},{key:"_draw",value:function t(e){var i=this;MZ(jZ(C.prototype),"_draw",this).call(this,e);var n=this._height-this._margin.top-this._margin.bottom,r=this._width-this._margin.left-this._margin.right;this._container=this._select.selectAll("svg.d3plus-geomap").data([0]);this._container=this._container.enter().append("svg").attr("class","d3plus-geomap").attr("opacity",0).attr("width",r).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top).style("background-color",this._ocean||"transparent").merge(this._container);this._container.transition(this._transition).attr("opacity",1).attr("width",r).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top);var a=this._container.selectAll("rect.d3plus-geomap-ocean").data([0]);a.enter().append("rect").attr("class","d3plus-geomap-ocean").merge(a).attr("width",r).attr("height",n).attr("fill",this._ocean||"transparent");this._tileGroup=this._container.selectAll("g.d3plus-geomap-tileGroup").data([0]);this._tileGroup=this._tileGroup.enter().append("g").attr("class","d3plus-geomap-tileGroup").merge(this._tileGroup);this._zoomGroup=this._container.selectAll("g.d3plus-geomap-zoomGroup").data([0]);this._zoomGroup=this._zoomGroup.enter().append("g").attr("class","d3plus-geomap-zoomGroup").merge(this._zoomGroup);var o=this._zoomGroup.selectAll("g.d3plus-geomap-paths").data([0]);o=o.enter().append("g").attr("class","d3plus-geomap-paths").merge(o);var s=this._coordData=this._topojson?IZ(this._topojson,this._topojsonKey):{type:"FeatureCollection",features:[]};if(this._topojsonFilter)s.features=s.features.filter(this._topojsonFilter);var u=this._path=LZ.geoPath().projection(this._projection);var l=this._filteredData.filter(function(t,e){return i._point(t,e)instanceof Array});var c=this._filteredData.filter(function(t,e){return!(i._point(t,e)instanceof Array)}).reduce(function(t,e){t[i._id(e)]=e;return t},{});var f=s.features.reduce(function(t,e){var n=i._topojsonId(e);t.push({__d3plus__:true,data:c[n],feature:e,id:n});return t},[]);var h=na["scale".concat(this._pointSizeScale.charAt(0).toUpperCase()).concat(this._pointSizeScale.slice(1))]().domain(ue(l,function(t,e){return i._pointSize(t,e)})).range([this._pointSizeMin,this._pointSizeMax]);if(!this._zoomSet){var d=this._fitObject?IZ(this._fitObject,this._fitKey):s;this._extentBounds={type:"FeatureCollection",features:this._fitFilter?d.features.filter(this._fitFilter):d.features.slice()};this._extentBounds.features=this._extentBounds.features.reduce(function(t,e){if(e.geometry){var n={type:e.type,id:e.id,geometry:{coordinates:e.geometry.coordinates,type:e.geometry.type}};if(e.geometry.type==="MultiPolygon"&&e.geometry.coordinates.length>1){var i=[],r=[];e.geometry.coordinates.forEach(function(t){n.geometry.coordinates=[t];i.push(u.area(n))});n.geometry.coordinates=[e.geometry.coordinates[i.indexOf(ce(i))]];var a=u.centroid(n);e.geometry.coordinates.forEach(function(t){n.geometry.coordinates=[t];r.push(eC(u.centroid(n),a))});var o=zt(i.reduce(function(t,e,n){if(e)t.push(i[n]/e);return t},[]),.9);n.geometry.coordinates=e.geometry.coordinates.filter(function(t,e){var n=r[e];return n===0||i[e]/n>=o})}t.push(n)}return t},[]);if(!this._extentBounds.features.length&&l.length){var g=[[undefined,undefined],[undefined,undefined]];l.forEach(function(t,e){var n=i._projection(i._point(t,e));if(g[0][0]===void 0||n[0]g[1][0])g[1][0]=n[0];if(g[0][1]===void 0||n[1]g[1][1])g[1][1]=n[1]});this._extentBounds={type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"MultiPoint",coordinates:g.map(function(t){return i._projection.invert(t)})}}]};var p=ce(l,function(t,e){return h(i._pointSize(t,e))});this._projectionPadding.top+=p;this._projectionPadding.right+=p;this._projectionPadding.bottom+=p;this._projectionPadding.left+=p}this._zoomBehavior.extent([[0,0],[r,n]]).scaleExtent([1,this._zoomMax]).translateExtent([[0,0],[r,n]]);this._zoomSet=true}this._projection=this._projection.fitExtent(this._extentBounds.features.length?[[this._projectionPadding.left,this._projectionPadding.top],[r-this._projectionPadding.right,n-this._projectionPadding.bottom]]:[[0,0],[r,n]],this._extentBounds.features.length?this._extentBounds:{type:"Sphere"});this._shapes.push((new bR).data(f).d(function(t){return u(t.feature)}).select(o.node()).x(0).y(0).config(lw.bind(this)(this._shapeConfig,"shape","Path")).render());var v=this._zoomGroup.selectAll("g.d3plus-geomap-pins").data([0]);v=v.enter().append("g").attr("class","d3plus-geomap-pins").merge(v);var m=(new nA).config(lw.bind(this)(this._shapeConfig,"shape","Circle")).data(l).r(function(t,e){return h(i._pointSize(t,e))}).select(v.node()).sort(function(t,e){return i._pointSize(e)-i._pointSize(t)}).x(function(t,e){return i._projection(i._point(t,e))[0]}).y(function(t,e){return i._projection(i._point(t,e))[1]});var y=Object.keys(this._on);var _=y.filter(function(t){return t.includes(".Circle")}),b=y.filter(function(t){return!t.includes(".")}),w=y.filter(function(t){return t.includes(".shape")});for(var x=0;x=0){e+=n[i].value}t.value=e}function d$(){return this.eachAfter(h$)}function g$(t){var e=this,n,i=[e],r,a,o;do{n=i.reverse(),i=[];while(e=n.pop()){t(e),r=e.children;if(r)for(a=0,o=r.length;a=0;--r){n.push(i[r])}}return this}function v$(t){var e=this,n=[e],i=[],r,a,o;while(e=n.pop()){i.push(e),r=e.children;if(r)for(a=0,o=r.length;a=0){e+=n[i].value}t.value=e})}function y$(e){return this.eachBefore(function(t){if(t.children){t.children.sort(e)}})}function _$(t){var e=this,n=b$(e,t),i=[e];while(e!==n){e=e.parent;i.push(e)}var r=i.length;while(t!==n){i.splice(r,0,t);t=t.parent}return i}function b$(t,e){if(t===e)return t;var n=t.ancestors(),i=e.ancestors(),r=null;t=n.pop();e=i.pop();while(t===e){r=t;t=n.pop();e=i.pop()}return r}function w$(){var t=this,e=[t];while(t=t.parent){e.push(t)}return e}function x$(){var e=[];this.each(function(t){e.push(t)});return e}function k$(){var e=[];this.eachBefore(function(t){if(!t.children){e.push(t)}});return e}function S$(){var e=this,n=[];e.each(function(t){if(t!==e){n.push({source:t.parent,target:t})}});return n}function C$(t,e){var n=new T$(t),i=+t.value&&(n.value=t.value),r,a=[n],o,s,u,l;if(e==null)e=A$;while(r=a.pop()){if(i)r.value=+r.data.value;if((s=e(r.data))&&(l=s.length)){r.children=new Array(l);for(u=l-1;u>=0;--u){a.push(o=r.children[u]=new T$(s[u]));o.parent=r;o.depth=r.depth+1}}}return n.eachBefore(M$)}function E$(){return C$(this).eachBefore(R$)}function A$(t){return t.children}function R$(t){t.data=t.data.data}function M$(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function T$(t){this.data=t;this.depth=this.height=0;this.parent=null}T$.prototype=C$.prototype={constructor:T$,count:d$,each:g$,eachAfter:v$,eachBefore:p$,sum:m$,sort:y$,path:_$,ancestors:w$,descendants:x$,leaves:k$,links:S$,copy:E$};var P$=Array.prototype.slice;function O$(t){var e=t.length,n,i;while(e){i=Math.random()*e--|0;n=t[e];t[e]=t[i];t[i]=n}return t}function B$(t){var e=0,n=(t=O$(P$.call(t))).length,i=[],r,a;while(e0&&n*n>i*i+r*r}function j$(t,e){for(var n=0;nu){r=(l+u-a)/(2*l);s=Math.sqrt(Math.max(0,u/l-r*r));n.x=t.x-r*i-s*o;n.y=t.y-r*o+s*i}else{r=(l+a-u)/(2*l);s=Math.sqrt(Math.max(0,a/l-r*r));n.x=e.x+r*i-s*o;n.y=e.y+r*o+s*i}}else{n.x=e.x+n.r;n.y=e.y}}function V$(t,e){var n=t.r+e.r-1e-6,i=e.x-t.x,r=e.y-t.y;return n>0&&n*n>i*i+r*r}function U$(t){var e=t._,n=t.next._,i=e.r+n.r,r=(e.x*n.r+n.x*e.r)/i,a=(e.y*n.r+n.y*e.r)/i;return r*r+a*a}function W$(t){this._=t;this.next=null;this.previous=null}function q$(t){if(!(r=t.length))return 0;var e,n,i,r,a,o,s,u,l,c,f;e=t[0],e.x=0,e.y=0;if(!(r>1))return e.r;n=t[1],e.x=-n.r,n.x=e.r,n.y=0;if(!(r>2))return e.r+n.r;G$(n,e,i=t[2]);e=new W$(e),n=new W$(n),i=new W$(i);e.next=i.previous=n;n.next=e.previous=i;i.next=n.previous=e;t:for(s=3;s=0){a=i[r];a.z+=e;a.m+=e;e+=a.s+(n+=a.c)}}function lJ(t,e,n){return t.a.parent===e.parent?t.a:n}function cJ(t,e){this._=t;this.parent=null;this.children=null;this.A=null;this.a=this;this.z=0;this.m=0;this.c=0;this.s=0;this.t=null;this.i=e}cJ.prototype=Object.create(T$.prototype);function fJ(t){var e=new cJ(t,0),n,i=[e],r,a,o,s;while(n=i.pop()){if(a=n._.children){n.children=new Array(s=a.length);for(o=s-1;o>=0;--o){i.push(r=n.children[o]=new cJ(a[o],o));r.parent=n}}}(e.parent=new cJ(null,0)).children=[e];return e}function hJ(){var h=rJ,l=1,c=1,f=null;function e(t){var e=fJ(t);e.eachAfter(d),e.parent.m=-e.z;e.eachBefore(g);if(f)t.eachBefore(p);else{var n=t,i=t,r=t;t.eachBefore(function(t){if(t.xi.x)i=t;if(t.depth>r.depth)r=t});var a=n===i?1:h(n,i)/2,o=a-n.x,s=l/(i.x+a+o),u=c/(r.depth||1);t.eachBefore(function(t){t.x=(t.x+o)*s;t.y=t.depth*u})}return t}function d(t){var e=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(e){uJ(t);var r=(e[0].z+e[e.length-1].z)/2;if(i){t.z=i.z+h(t._,i._);t.m=t.z-r}else{t.z=r}}else if(i){t.z=i.z+h(t._,i._)}t.parent.A=a(t,i,t.parent.A||n[0])}function g(t){t._.x=t.z+t.parent.m;t.m+=t.parent.m}function a(t,e,n){if(e){var i=t,r=t,a=e,o=i.parent.children[0],s=i.m,u=r.m,l=a.m,c=o.m,f;while(a=oJ(a),i=aJ(i),a&&i){o=aJ(o);r=oJ(r);r.a=t;f=a.z+l-i.z-s+h(a._,i._);if(f>0){sJ(lJ(a,t,n),t,f);s+=f;u+=f}l+=a.m;s+=i.m;c+=o.m;u+=r.m}if(a&&!oJ(r)){r.t=a;r.m+=l-u}if(i&&!aJ(o)){o.t=i;o.m+=s-c;n=t}}return n}function p(t){t.x*=l;t.y=t.depth*c}e.separation=function(t){return arguments.length?(h=t,e):h};e.size=function(t){return arguments.length?(f=false,l=+t[0],c=+t[1],e):f?null:[l,c]};e.nodeSize=function(t){return arguments.length?(f=true,l=+t[0],c=+t[1],e):f?[l,c]:null};return e}function dJ(t,e,n,i,r){var a=t.children,o,s=-1,u=a.length,l=t.value&&(r-n)/t.value;while(++sy)y=l;x=v*v*w;_=Math.max(y/x,x/m);if(_>b){v-=l;break}b=_}o.push(u={value:v,dice:d1?t:1)};return t}(gJ);function mJ(){var o=vJ,e=false,n=1,i=1,s=[0],u=X$,l=X$,c=X$,f=X$,h=X$;function r(t){t.x0=t.y0=0;t.x1=n;t.y1=i;t.eachBefore(a);s=[0];if(e)t.eachBefore(nJ);return t}function a(t){var e=s[t.depth],n=t.x0+e,i=t.y0+e,r=t.x1-e,a=t.y1-e;if(rt.length)e=t.length;for(var n=0,i=new Array(e);n1&&arguments[1]!==undefined?arguments[1]:[];if(t.values){t.values.forEach(function(t){n.push(t);e(t,n)})}else{n.push(t)}return n};var LJ=function(t){TJ(c,t);var i=OJ(c);function c(){var a;CJ(this,c);a=i.call(this);a._layoutPadding=1;a._on.mouseenter=function(){};var e=a._on["mousemove.legend"];a._on["mousemove.legend"]=function(n,t){e(n,t);var i=a._ids(n,t);var r=jJ(n);a.hover(function(e){var t=Object.keys(e).filter(function(t){return t!=="value"}).every(function(t){return n[t]&&n[t].includes(e[t])});if(t)r.push(e);else if(i.includes(e.key))r.push.apply(r,_J(jJ(e,[e])));return r.includes(e)})};var n=a._on["mousemove.shape"];a._on["mousemove.shape"]=function(e,t){if(e.__d3plusTooltip__)n(e,t);a.hover(function(t){return jJ(e,[e]).includes(t)})};a._pack=J$();a._packOpacity=cw(.25);a._shape=cw("Circle");a._shapeConfig=el(a._shapeConfig,{Circle:{label:function t(e){return e.parent&&!e.children?e.id:false},labelConfig:{fontResize:true},opacity:function t(e){return e.__d3plusOpacity__}}});a._sort=function(t,e){return e.value-t.value};a._sum=$u("value");return a}AJ(c,[{key:"_draw",value:function t(e){var n=this;RJ(zJ(c.prototype),"_draw",this).call(this,e);var i=this._height-this._margin.top-this._margin.bottom,r=this._width-this._margin.left-this._margin.right;var a=Math.min(i,r);var o="translate(".concat((r-a)/2,", ").concat((i-a)/2,")");var s=Fe();for(var u=0;u<=this._drawDepth;u++){s.key(this._groupBy[u])}s=s.entries(this._filteredData);var l=this._pack.padding(this._layoutPadding).size([a,a])(C$({key:s.key,values:s},function(t){return t.values}).sum(this._sum).sort(this._sort)).descendants();l.forEach(function(t,e){t.__d3plus__=true;t.i=e;t.id=t.parent?t.parent.data.key:null;t.data.__d3plusOpacity__=t.height?n._packOpacity(t.data,e):1;t.data.__d3plusTooltip__=!t.height?true:false});this._shapes.push((new nA).data(l).select(fw("g.d3plus-Pack",{parent:this._select,enter:{transform:o},update:{transform:o}}).node()).config(lw.bind(this)(this._shapeConfig,"shape","Circle")).render());return this}},{key:"hover",value:function t(e){this._hover=e;this._shapes.forEach(function(t){return t.hover(e)});if(this._legend)this._legendClass.hover(e);return this}},{key:"layoutPadding",value:function t(e){return arguments.length?(this._layoutPadding=e,this):this._layoutPadding}},{key:"packOpacity",value:function t(e){return arguments.length?(this._packOpacity=typeof e==="function"?e:cw(e),this):this._packOpacity}},{key:"sort",value:function t(e){return arguments.length?(this._sort=e,this):this._sort}},{key:"sum",value:function t(e){return arguments.length?(this._sum=typeof e==="function"?e:$u(e),this):this._sum}}]);return c}(mZ);function FJ(t,e){if(!(e instanceof Array))e=[e];var n=Fe();for(var i=0;i1})).select(fw("g.d3plus-Tree-Links",p).node()).config(lw.bind(this)(this._shapeConfig,"shape","Path")).config({d:function t(e){var n=f._shapeConfig.r;if(typeof n==="function")n=n(e.data,e.i);var i=e.parent.x-e.x+(f._orient==="vertical"?0:n),r=e.parent.y-e.y+(f._orient==="vertical"?n:0),a=f._orient==="vertical"?0:-n,o=f._orient==="vertical"?-n:0;return f._orient==="vertical"?"M".concat(a,",").concat(o,"C").concat(a,",").concat((o+r)/2," ").concat(i,",").concat((o+r)/2," ").concat(i,",").concat(r):"M".concat(a,",").concat(o,"C").concat((a+i)/2,",").concat(o," ").concat((a+i)/2,",").concat(r," ").concat(i,",").concat(r)},id:function t(e,n){return f._ids(e,n).join("-")}}).render());this._shapes.push((new nA).data(a).select(fw("g.d3plus-Tree-Shapes",p).node()).config(lw.bind(this)(this._shapeConfig,"shape","Circle")).config({id:function t(e,n){return f._ids(e,n).join("-")},label:function t(e,n){if(f._label)return f._label(e.data,n);var i=f._ids(e,n).slice(0,e.depth);return i[i.length-1]},labelConfig:{textAnchor:function t(e){return f._orient==="vertical"?"middle":e.data.children&&e.data.depth!==f._groupBy.length?"end":"start"},verticalAlign:function t(e){return f._orient==="vertical"?e.data.depth===1?"bottom":"top":"middle"}},hitArea:function t(e,n,i){var r=f._labelHeight,a=f._labelWidths[e.depth-1];return{width:f._orient==="vertical"?a:i.r*2+a,height:f._orient==="horizontal"?r:i.r*2+r,x:f._orient==="vertical"?-a/2:e.children&&e.depth!==f._groupBy.length?-(i.r+a):-i.r,y:f._orient==="horizontal"?-r/2:e.children&&e.depth!==f._groupBy.length?-(i.r+f._labelHeight):-i.r}},labelBounds:function t(e,n,i){var r;var a=f._labelHeight,o=f._orient==="vertical"?"height":"width",s=f._labelWidths[e.depth-1],u=f._orient==="vertical"?"width":"height",l=f._orient==="vertical"?"x":"y",c=f._orient==="vertical"?"y":"x";return r={},GJ(r,u,s),GJ(r,o,a),GJ(r,l,-s/2),GJ(r,c,e.children&&e.depth!==f._groupBy.length?-(i.r+a):i.r),r}}).render());return this}},{key:"orient",value:function t(e){return arguments.length?(this._orient=e,this):this._orient}},{key:"separation",value:function t(e){return arguments.length?(this._separation=e,this):this._separation}}]);return v}(mZ);function nQ(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){nQ=function t(e){return typeof e}}else{nQ=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return nQ(t)}function iQ(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function rQ(t,e){for(var n=0;n-1?i:undefined;n.data=dw(n.data.values,s._aggs);n.x=n.x0+(n.x1-n.x0)/2;n.y=n.y0+(n.y1-n.y0)/2;o.push(n)}}}if(a.children)u(a.children);this._rankData=o.sort(this._sort).map(function(t){return t.data});var l=a.value;o.forEach(function(t){t.share=n._sum(t.data,t.i)/l});var c="translate(".concat(this._margin.left,", ").concat(this._margin.top,")");var f=lw.bind(this)(this._shapeConfig,"shape","Rect");var h=f.labelConfig.fontMin;var d=f.labelConfig.padding;this._shapes.push((new vA).data(o).label(function(t){return[n._drawLabel(t.data,t.i),"".concat(xw(t.share*100,n._locale),"%")]}).select(fw("g.d3plus-Treemap",{parent:this._select,enter:{transform:c},update:{transform:c}}).node()).config({height:function t(e){return e.y1-e.y0},labelBounds:function t(e,n,i){var r=i.height;var a=Math.min(50,(r-d*2)*.5);if(a0){var l=dw(n,c);l._isAggregation=true;l._threshold=e;r.push(l)}return r}throw new Error("Depth is higher than the amount of grouping levels.")}return e}},{key:"layoutPadding",value:function t(e){return arguments.length?(this._layoutPadding=typeof e==="function"?e:cw(e),this):this._layoutPadding}},{key:"sort",value:function t(e){return arguments.length?(this._sort=e,this):this._sort}},{key:"sum",value:function t(e){if(arguments.length){this._sum=typeof e==="function"?e:$u(e);this._thresholdKey=this._sum;return this}else return this._sum}},{key:"tile",value:function t(e){return arguments.length?(this._tile=e,this):this._tile}}]);return g}(mZ);function vQ(t,e,n){return e[t]||this["_".concat(t)](e,n)}function mQ(t,e){return bQ(t)||_Q(t,e)||kQ(t,e)||yQ()}function yQ(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _Q(t,e){if(typeof Symbol==="undefined"||!(Symbol.iterator in Object(t)))return;var n=[];var i=true;var r=false;var a=undefined;try{for(var o=t[Symbol.iterator](),s;!(i=(s=o.next()).done);i=true){n.push(s.value);if(e&&n.length===e)break}}catch(t){r=true;a=t}finally{try{if(!i&&o["return"]!=null)o["return"]()}finally{if(r)throw a}}return n}function bQ(t){if(Array.isArray(t))return t}function wQ(t){return CQ(t)||SQ(t)||kQ(t)||xQ()}function xQ(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function kQ(t,e){if(!t)return;if(typeof t==="string")return EQ(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return EQ(t,e)}function SQ(t){if(typeof Symbol!=="undefined"&&Symbol.iterator in Object(t))return Array.from(t)}function CQ(t){if(Array.isArray(t))return EQ(t)}function EQ(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,i=new Array(e);n=0){r.i=a;r.data=s[a]}else{r.data={row:n,column:i}}return r});return{rowValues:t,columnValues:e,shapeData:n}}function MQ(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){MQ=function t(e){return typeof e}}else{MQ=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return MQ(t)}function TQ(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function PQ(t,e){for(var n=0;n1?_(i[1])-_(i[0]):this._rowAxis.height();var x=r.length>1?b(r[1])-b(r[0]):this._columnAxis.width();var k="translate(".concat(this._margin.left+d,", ").concat(this._margin.top+v,")");var S=lw.bind(this)(this._shapeConfig,"shape","Rect");this._shapes.push((new vA).data(a).select(fw("g.d3plus-Matrix-cells",{parent:this._select,enter:{transform:k},update:{transform:k}}).node()).config({height:w-this._cellPadding,width:x-this._cellPadding,x:function t(e){return b(e.column)+x/2},y:function t(e){return _(e.row)+w/2}}).config(S).render());return this}},{key:"cellPadding",value:function t(e){return arguments.length?(this._cellPadding=e,this):this._cellPadding}},{key:"column",value:function t(e){return arguments.length?(this._column=typeof e==="function"?e:$u(e),this):this._column}},{key:"columnConfig",value:function t(e){return arguments.length?(this._columnConfig=el(this._columnConfig,e),this):this._columnConfig}},{key:"columnSort",value:function t(e){return arguments.length?(this._columnSort=e,this):this._columnSort}},{key:"row",value:function t(e){return arguments.length?(this._row=typeof e==="function"?e:$u(e),this):this._row}},{key:"rowConfig",value:function t(e){return arguments.length?(this._rowConfig=el(this._rowConfig,e),this):this._rowConfig}},{key:"rowSort",value:function t(e){return arguments.length?(this._rowSort=e,this):this._rowSort}}]);return C}(mZ);function UQ(t,e){var n;if(e===undefined){var i=_createForOfIteratorHelper(t),r;try{for(i.s();!(r=i.n()).done;){var a=r.value;if(a!=null&&(n>a||n===undefined&&a>=a)){n=a}}}catch(t){i.e(t)}finally{i.f()}}else{var o=-1;var s=_createForOfIteratorHelper(t),u;try{for(s.s();!(u=s.n()).done;){var l=u.value;if((l=e(l,++o,t))!=null&&(n>l||n===undefined&&l>=l)){n=l}}}catch(t){s.e(t)}finally{s.f()}}return n}function WQ(e){return function t(){return e}}var qQ=Math.abs;var KQ=Math.atan2;var YQ=Math.cos;var XQ=Math.max;var ZQ=Math.min;var $Q=Math.sin;var JQ=Math.sqrt;var QQ=1e-12;var t0=Math.PI;var e0=t0/2;var n0=2*t0;function i0(t){return t>1?0:t<-1?t0:Math.acos(t)}function r0(t){return t>=1?e0:t<=-1?-e0:Math.asin(t)}function a0(t){return t.innerRadius}function o0(t){return t.outerRadius}function s0(t){return t.startAngle}function u0(t){return t.endAngle}function l0(t){return t&&t.padAngle}function c0(t,e,n,i,r,a,o,s){var u=n-t,l=i-e,c=o-r,f=s-a,h=f*u-c*l;if(h*hT*T+P*P)S=E,C=A;return{cx:S,cy:C,x01:-c,y01:-f,x11:S*(r/w-1),y11:C*(r/w-1)}}function h0(){var L=a0,F=o0,I=WQ(0),H=null,G=s0,V=u0,U=l0,W=null;function e(){var t,e,n=+L.apply(this,arguments),i=+F.apply(this,arguments),r=G.apply(this,arguments)-e0,a=V.apply(this,arguments)-e0,o=qQ(a-r),s=a>r;if(!W)W=t=Iw();if(iQQ))W.moveTo(0,0);else if(o>n0-QQ){W.moveTo(i*YQ(r),i*$Q(r));W.arc(0,0,i,r,a,!s);if(n>QQ){W.moveTo(n*YQ(a),n*$Q(a));W.arc(0,0,n,a,r,s)}}else{var u=r,l=a,c=r,f=a,h=o,d=o,g=U.apply(this,arguments)/2,p=g>QQ&&(H?+H.apply(this,arguments):JQ(n*n+i*i)),v=ZQ(qQ(i-n)/2,+I.apply(this,arguments)),m=v,y=v,_,b;if(p>QQ){var w=r0(p/n*$Q(g)),x=r0(p/i*$Q(g));if((h-=w*2)>QQ)w*=s?1:-1,c+=w,f-=w;else h=0,c=f=(r+a)/2;if((d-=x*2)>QQ)x*=s?1:-1,u+=x,l-=x;else d=0,u=l=(r+a)/2}var k=i*YQ(u),S=i*$Q(u),C=n*YQ(f),E=n*$Q(f);if(v>QQ){var A=i*YQ(l),R=i*$Q(l),M=n*YQ(c),T=n*$Q(c),P;if(oQQ))W.moveTo(k,S);else if(y>QQ){_=f0(M,T,k,S,i,y,s);b=f0(A,R,C,E,i,y,s);W.moveTo(_.cx+_.x01,_.cy+_.y01);if(yQQ)||!(h>QQ))W.lineTo(C,E);else if(m>QQ){_=f0(C,E,A,R,n,-m,s);b=f0(k,S,M,T,n,-m,s);W.lineTo(_.cx+_.x01,_.cy+_.y01);if(m1?m[1].radians-m[0].radians:E0;var w=r.slice().reverse();var x=h0().padAngle(this._cellPadding/d).innerRadius(function(t){return y+w.indexOf(t.row)*_+n._cellPadding/2}).outerRadius(function(t){return y+(w.indexOf(t.row)+1)*_-n._cellPadding/2}).startAngle(function(t){return m[a.indexOf(t.column)].radians-b/2}).endAngle(function(t){return m[a.indexOf(t.column)].radians+b/2});this._shapes.push((new bR).data(o).d(x).select(fw("g.d3plus-RadialMatrix-arcs",{parent:u,transition:l,enter:{transform:g},update:{transform:g}}).node()).config({id:function t(e){return n._ids(e).join("-")},x:0,y:0}).config(lw.bind(this)(this._shapeConfig,"shape","Path")).render());return this}},{key:"cellPadding",value:function t(e){return arguments.length?(this._cellPadding=e,this):this._cellPadding}},{key:"column",value:function t(e){return arguments.length?(this._column=typeof e==="function"?e:$u(e),this):this._column}},{key:"columnConfig",value:function t(e){return arguments.length?(this._columnConfig=el(this._columnConfig,e),this):this._columnConfig}},{key:"columnSort",value:function t(e){return arguments.length?(this._columnSort=e,this):this._columnSort}},{key:"innerRadius",value:function t(e){return arguments.length?(this._innerRadius=typeof e==="function"?e:cw(e),this):this._innerRadius}},{key:"row",value:function t(e){return arguments.length?(this._row=typeof e==="function"?e:$u(e),this):this._row}},{key:"rowSort",value:function t(e){return arguments.length?(this._rowSort=e,this):this._rowSort}}]);return k}(mZ);function R0(t){return function(){return t}}function M0(){return(Math.random()-.5)*1e-6}function T0(t){var e=+this._x.call(null,t),n=+this._y.call(null,t);return P0(this.cover(e,n),e,n,t)}function P0(t,e,n,i){if(isNaN(e)||isNaN(n))return t;var r,a=t._root,o={data:i},s=t._x0,u=t._y0,l=t._x1,c=t._y1,f,h,d,g,p,v,m,y;if(!a)return t._root=o,t;while(a.length){if(p=e>=(f=(s+l)/2))s=f;else l=f;if(v=n>=(h=(u+c)/2))u=h;else c=h;if(r=a,!(a=a[m=v<<1|p]))return r[m]=o,t}d=+t._x.call(null,a.data);g=+t._y.call(null,a.data);if(e===d&&n===g)return o.next=a,r?r[m]=o:t._root=o,t;do{r=r?r[m]=new Array(4):t._root=new Array(4);if(p=e>=(f=(s+l)/2))s=f;else l=f;if(v=n>=(h=(u+c)/2))u=h;else c=h}while((m=v<<1|p)===(y=(g>=h)<<1|d>=f));return r[y]=a,r[m]=o,t}function O0(t){var e,n,i=t.length,r,a,o=new Array(i),s=new Array(i),u=Infinity,l=Infinity,c=-Infinity,f=-Infinity;for(n=0;nc)c=r;if(af)f=a}if(u>c||l>f)return this;this.cover(u,l).cover(c,f);for(n=0;nt||t>=r||i>e||e>=a){l=(ec||(s=g.y0)>f||(u=g.x1)=m)<<1|t>=v){g=h[h.length-1];h[h.length-1]=h[h.length-1-p];h[h.length-1-p]=g}}else{var y=t-+this._x.call(null,d.data),_=e-+this._y.call(null,d.data),b=y*y+_*_;if(b=(h=(o+u)/2))o=h;else u=h;if(p=f>=(d=(s+l)/2))s=d;else l=d;if(!(e=n,n=n[v=p<<1|g]))return this;if(!n.length)break;if(e[v+1&3]||e[v+2&3]||e[v+3&3])i=e,m=v}while(n.data!==t){if(!(r=n,n=n.next))return this}if(a=n.next)delete n.next;if(r)return a?r.next=a:delete r.next,this;if(!e)return this._root=a,this;a?e[v]=a:delete e[v];if((n=e[0]||e[1]||e[2]||e[3])&&n===(e[3]||e[2]||e[1]||e[0])&&!n.length){if(i)i[m]=n;else this._root=n}return this}function F0(t){for(var e=0,n=t.length;e1?(n==null?c.remove(e):c.set(e,d(n)),a):c.get(e)},find:function t(e,n,i){var r=0,a=f.length,o,s,u,l,c;if(i==null)i=Infinity;else i*=i;for(r=0;r1?(i.on(e,n),a):i.on(e)}}}function o1(){var r,u,l,i=R0(-30),c,f=1,h=Infinity,d=.81;function e(t){var e,n=r.length,i=Y0(r,e1,n1).visitAfter(a);for(l=t,e=0;e=h)return;if(t.data!==u||t.next){if(r===0)r=M0(),s+=r*r;if(a===0)a=M0(),s+=a*a;if(s=l._groupBy.length-1){var n="".concat(l._nodeGroupBy&&l._nodeGroupBy[l._drawDepth](t,e)?l._nodeGroupBy[l._drawDepth](t,e):l._id(t,e));if(l._focus&&l._focus===n){l.active(false);l._on.mouseenter.bind(m1(l))(t,e);l._focus=undefined;l._zoomToBounds(null)}else{l.hover(false);var i=l._linkLookup[n],r=l._nodeLookup[n];var a=[n];var o=[r.x-r.r,r.x+r.r],s=[r.y-r.r,r.y+r.r];i.forEach(function(t){a.push(t.id);if(t.x-t.ro[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});l.active(function(t,e){if(t.source&&t.target)return t.source.id===n||t.target.id===n;else return a.includes("".concat(l._ids(t,e)[l._drawDepth]))});l._focus=n;var u=oO(l._container.node());o=o.map(function(t){return t*u.k+u.x});s=s.map(function(t){return t*u.k+u.y});l._zoomToBounds([[o[0],s[0]],[o[1],s[1]]])}}};l._on["click.legend"]=function(t,e){var n=l._id(t);var i=l._ids(t);i=i[i.length-1];if(l._hover&&l._drawDepth>=l._groupBy.length-1){if(l._focus&&l._focus===n){l.active(false);l._focus=undefined;l._zoomToBounds(null)}else{l.hover(false);var r=n.map(function(t){return l._nodeLookup[t]});var a=["".concat(i)];var o=[r[0].x-r[0].r,r[0].x+r[0].r],s=[r[0].y-r[0].r,r[0].y+r[0].r];r.forEach(function(t){a.push(t.id);if(t.x-t.ro[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});l.active(function(t,e){if(t.source&&t.target)return a.includes(t.source.id)&&a.includes(t.target.id);else{var n=l._ids(t,e);return a.includes("".concat(n[n.length-1]))}});l._focus=n;var u=oO(l._container.node());o=o.map(function(t){return t*u.k+u.x});s=s.map(function(t){return t*u.k+u.y});l._zoomToBounds([[o[0],s[0]],[o[1],s[1]]])}l._on.mouseenter.bind(m1(l))(t,e);l._on["mousemove.legend"].bind(m1(l))(t,e)}};l._on.mouseenter=function(){};l._on["mouseleave.shape"]=function(){l.hover(false)};var u=l._on["mousemove.shape"];l._on["mousemove.shape"]=function(t,e){u(t,e);var n="".concat(l._nodeGroupBy&&l._nodeGroupBy[l._drawDepth](t,e)?l._nodeGroupBy[l._drawDepth](t,e):l._id(t,e)),i=l._linkLookup[n],r=l._nodeLookup[n];var a=[n];var o=[r.x-r.r,r.x+r.r],s=[r.y-r.r,r.y+r.r];i.forEach(function(t){a.push(t.id);if(t.x-t.ro[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});l.hover(function(t,e){if(t.source&&t.target)return t.source.id===n||t.target.id===n;else return a.includes("".concat(l._ids(t,e)[l._drawDepth]))})};l._sizeMin=5;l._sizeScale="sqrt";l._shape=cw("Circle");l._shapeConfig=el(l._shapeConfig,{ariaLabel:function t(e,n){var i=l._size?", ".concat(l._size(e,n)):"";return"".concat(l._drawLabel(e,n)).concat(i,".")},labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee"}});l._x=$u("x");l._y=$u("y");l._zoom=true;return l}c1(q,[{key:"_draw",value:function t(e){var r=this;f1(_1(q.prototype),"_draw",this).call(this,e);var n=this._height-this._margin.top-this._margin.bottom,i="translate(".concat(this._margin.left,", ").concat(this._margin.top,")"),a=this._transition,o=this._width-this._margin.left-this._margin.right;var s=this._filteredData.reduce(function(t,e,n){t[r._id(e,n)]=e;return t},{});var u=this._nodes.reduce(function(t,e,n){t[r._nodeGroupBy?r._nodeGroupBy[r._drawDepth](e,n):e.id]=e;return t},{});u=Array.from(new Set(Object.keys(s).concat(Object.keys(u)))).map(function(t,e){var n=s[t],i=u[t];if(i===undefined)return false;return{__d3plus__:true,data:n||i,i:e,id:t,fx:n!==undefined&&r._x(n)!==undefined?r._x(n):r._x(i),fy:n!==undefined&&r._y(n)!==undefined?r._y(n):r._y(i),node:i,r:r._size?n!==undefined&&r._size(n)!==undefined?r._size(n):r._size(i):r._sizeMin,shape:n!==undefined&&r._shape(n)!==undefined?r._shape(n):r._shape(i)}}).filter(function(t){return t});var l=this._nodeLookup=u.reduce(function(t,e){t[e.id]=e;return t},{});var c=u.map(function(t){return t.node});var f=this._links.map(function(t){var e=s1(t.source);return{size:r._linkSize(t),source:e==="number"?u[c.indexOf(r._nodes[t.source])]:e==="string"?l[t.source]:l[t.source.id],target:e==="number"?u[c.indexOf(r._nodes[t.target])]:e==="string"?l[t.target]:l[t.target.id]}});this._linkLookup=f.reduce(function(t,e){if(!t[e.source.id])t[e.source.id]=[];t[e.source.id].push(e.target);if(!t[e.target.id])t[e.target.id]=[];t[e.target.id].push(e.source);return t},{});var h=u.some(function(t){return t.fx===undefined||t.fy===undefined});if(h){var d=rr().domain(ue(f,function(t){return t.size})).range([.1,.5]);var g=a1().force("link",t1(f).id(function(t){return t.id}).distance(1).strength(function(t){return d(t.size)}).iterations(4)).force("charge",o1().strength(-1)).stop();var p=300;var v=.001;var m=1-Math.pow(v,1/p);g.velocityDecay(0);g.alphaMin(v);g.alphaDecay(m);g.alphaDecay(0);g.nodes(u);g.tick(p).stop();var y=BC(u.map(function(t){return[t.vx,t.vy]}));var _=gE(y),b=_.angle,w=_.cx,x=_.cy;u.forEach(function(t){var e=JC([t.vx,t.vy],-1*(Math.PI/180*b),[w,x]);t.fx=e[0];t.fy=e[1]})}var k=ue(u.map(function(t){return t.fx})),S=ue(u.map(function(t){return t.fy}));var C=rr().domain(k).range([0,o]),E=rr().domain(S).range([0,n]);var A=(k[1]-k[0])/(S[1]-S[0]),R=o/n;if(A>R){var M=n*R/A;E.range([(n-M)/2,n-(n-M)/2])}else{var T=o*A/R;C.range([(o-T)/2,o-(o-T)/2])}u.forEach(function(t){t.x=C(t.fx);t.y=E(t.fy)});var P=ue(u.map(function(t){return t.r}));var O=this._sizeMax||ce([1,de(he(u.map(function(e){return u.map(function(t){return e===t?null:eC([e.x,e.y],[t.x,t.y])})})))/2]);var B=na["scale".concat(this._sizeScale.charAt(0).toUpperCase()).concat(this._sizeScale.slice(1))]().domain(P).range([P[0]===P[1]?O:de([O/2,this._sizeMin]),O]),D=C.domain(),N=E.domain();var z=D[1]-D[0],j=N[1]-N[0];u.forEach(function(t){var e=B(t.r);if(D[0]>C.invert(t.x-e))D[0]=C.invert(t.x-e);if(D[1]E.invert(t.y-e))N[0]=E.invert(t.y-e);if(N[1]o[1])o[1]=t.x+t.r;if(t.y-t.rs[1])s[1]=t.y+t.r});u.hover(function(t,e){if(t.source&&t.target)return t.source.id===r.id||t.target.id===r.id;else return a.includes(u._ids(t,e)[u._drawDepth])})}};u._on["click.shape"]=function(t){u._center=t.id;u._margin={bottom:0,left:0,right:0,top:0};u._padding={bottom:0,left:0,right:0,top:0};u._draw()};u._sizeMin=5;u._sizeScale="sqrt";u._shape=cw("Circle");u._shapeConfig=el(u._shapeConfig,{ariaLabel:function t(e,n){var i=u._size?", ".concat(u._size(e,n)):"";return"".concat(u._drawLabel(e,n)).concat(i,".")},labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee",strokeWidth:1}});return u}S1(L,[{key:"_draw",value:function t(e){var l=this;C1(B1(L.prototype),"_draw",this).call(this,e);var r=this._filteredData.reduce(function(t,e,n){t[l._id(e,n)]=e;return t},{});var c=this._nodes;if(!this._nodes.length&&this._links.length){var n=Array.from(new Set(this._links.reduce(function(t,e){return t.concat([e.source,e.target])},[])));c=n.map(function(t){return w1(t)==="object"?t:{id:t}})}c=c.reduce(function(t,e,n){t[l._nodeGroupBy?l._nodeGroupBy[l._drawDepth](e,n):l._id(e,n)]=e;return t},{});c=Array.from(new Set(Object.keys(r).concat(Object.keys(c)))).map(function(t,e){var n=r[t],i=c[t];if(i===undefined)return false;return{__d3plus__:true,data:n||i,i:e,id:t,node:i,shape:n!==undefined&&l._shape(n)!==undefined?l._shape(n):l._shape(i)}}).filter(function(t){return t});var i=this._nodeLookup=c.reduce(function(t,e){t[e.id]=e;return t},{});var a=this._links.map(function(n){var t=["source","target"];var e=t.reduce(function(t,e){t[e]=typeof n[e]==="number"?c[n[e]]:i[n[e].id||n[e]];return t},{});e.size=l._linkSize(n);return e});var o=a.reduce(function(t,e){if(!t[e.source.id]){t[e.source.id]=[]}t[e.source.id].push(e);if(!t[e.target.id]){t[e.target.id]=[]}t[e.target.id].push(e);return t},{});var f=this._height-this._margin.top-this._margin.bottom,s="translate(".concat(this._margin.left,", ").concat(this._margin.top,")"),u=this._transition,h=this._width-this._margin.left-this._margin.right;var d=[],g=de([f,h])/2,p=g/3;var v=p,m=p*2;var y=i[this._center];y.x=h/2;y.y=f/2;y.r=this._sizeMin?ce([this._sizeMin,v*.65]):this._sizeMax?de([this._sizeMax,v*.65]):v*.65;var _=[y],b=[];o[this._center].forEach(function(t){var e=t.source.id===l._center?t.target:t.source;e.edges=o[e.id].filter(function(t){return t.source.id!==l._center||t.target.id!==l._center});e.edge=t;_.push(e);b.push(e)});b.sort(function(t,e){return t.edges.length-e.edges.length});var w=[];var x=0;b.forEach(function(t){var r=t.id;t.edges=t.edges.filter(function(t){return!_.includes(t.source)&&t.target.id===r||!_.includes(t.target)&&t.source.id===r});x+=t.edges.length||1;t.edges.forEach(function(t){var e=t.source,n=t.target;var i=n.id===r?e:n;_.push(i)})});var k=Math.PI*2;var S=0;b.forEach(function(a,t){var o=a.edges.length||1;var e=k/x*o;if(t===0){S-=e/2}var s=S+e/2-k/4;a.radians=s;a.x=h/2+v*Math.cos(s);a.y=f/2+v*Math.sin(s);S+=e;a.edges.forEach(function(t,e){var n=t.source.id===a.id?t.target:t.source;var i=k/x;var r=s-i*o/2+i/2+i*e;n.radians=r;n.x=h/2+m*Math.cos(r);n.y=f/2+m*Math.sin(r);w.push(n)})});var C=p/2;var E=p/4;var A=C/2-4;if(C/2-4<8){A=de([C/2,8])}var R=E/2-4;if(E/2-4<4){R=de([E/2,4])}if(R>p/10){R=p/10}if(R>A&&R>10){R=A*.75}if(A>R*1.5){A=R*1.5}A=Math.floor(A);R=Math.floor(R);var M;if(this._size){var T=ue(r,function(t){return t.size});if(T[0]===T[1]){T[0]=0}M=rr().domain(T).rangeRound([3,de([A,R])]);var P=y.size;y.r=M(P)}else{M=rr().domain([1,2]).rangeRound([A,R])}w.forEach(function(t){t.ring=2;var e=l._size?t.size:2;t.r=l._sizeMin?ce([l._sizeMin,M(e)]):l._sizeMax?de([l._sizeMax,M(e)]):M(e)});b.forEach(function(t){t.ring=1;var e=l._size?t.size:1;t.r=l._sizeMin?ce([l._sizeMin,M(e)]):l._sizeMax?de([l._sizeMax,M(e)]):M(e)});c=[y].concat(b).concat(w);b.forEach(function(u){var t=["source","target"];var n=u.edge;t.forEach(function(e){n[e]=c.find(function(t){return t.id===n[e].id})});d.push(n);o[u.id].forEach(function(i){var e=i.source.id===u.id?i.target:i.source;if(e.id!==y.id){var r=w.find(function(t){return t.id===e.id});if(!r){r=b.find(function(t){return t.id===e.id})}if(r){i.spline=true;var a=h/2;var o=f/2;var s=v+(m-v)*.5;var t=["source","target"];t.forEach(function(e,t){i["".concat(e,"X")]=i[e].x+Math.cos(i[e].ring===2?i[e].radians+Math.PI:i[e].radians)*i[e].r;i["".concat(e,"Y")]=i[e].y+Math.sin(i[e].ring===2?i[e].radians+Math.PI:i[e].radians)*i[e].r;i["".concat(e,"BisectX")]=a+s*Math.cos(i[e].radians);i["".concat(e,"BisectY")]=o+s*Math.sin(i[e].radians);i[e]=c.find(function(t){return t.id===i[e].id});if(i[e].edges===undefined)i[e].edges={};var n=t===0?i.target.id:i.source.id;if(i[e].id===u.id){i[e].edges[n]={angle:u.radians+Math.PI,radius:p/2}}else{i[e].edges[n]={angle:r.radians,radius:p/2}}});d.push(i)}}})});c.forEach(function(t){if(t.id!==l._center){var e=l._shapeConfig.labelConfig.fontSize&&l._shapeConfig.labelConfig.fontSize(t)||11;var n=e*1.4;var i=n*2;var r=5;var a=p-t.r;var o=t.radians*(180/Math.PI);var s=t.r+r;var u="start";if(o<-90||o>90){s=-t.r-a-r;u="end";o+=180}t.labelBounds={x:s,y:-n/2,width:a,height:i};t.rotate=o;t.textAnchor=u}else{t.labelBounds={x:-v/2,y:-v/2,width:v,height:v}}});this._linkLookup=a.reduce(function(t,e){if(!t[e.source.id])t[e.source.id]=[];t[e.source.id].push(e.target);if(!t[e.target.id])t[e.target.id]=[];t[e.target.id].push(e.source);return t},{});var O=ue(a,function(t){return t.size});if(O[0]!==O[1]){var B=de(c,function(t){return t.r});var D=na["scale".concat(this._linkSizeScale.charAt(0).toUpperCase()).concat(this._linkSizeScale.slice(1))]().domain(O).range([this._linkSizeMin,B]);a.forEach(function(t){t.size=D(t.size)})}var N=lw.bind(this)(this._shapeConfig,"edge","Path");delete N.on;this._shapes.push((new bR).config(N).strokeWidth(function(t){return t.size}).id(function(t){return"".concat(t.source.id,"_").concat(t.target.id)}).d(function(t){return t.spline?"M".concat(t.sourceX,",").concat(t.sourceY,"C").concat(t.sourceBisectX,",").concat(t.sourceBisectY," ").concat(t.targetBisectX,",").concat(t.targetBisectY," ").concat(t.targetX,",").concat(t.targetY):"M".concat(t.source.x,",").concat(t.source.y," ").concat(t.target.x,",").concat(t.target.y)}).data(d).select(fw("g.d3plus-rings-links",{parent:this._select,transition:u,enter:{transform:s},update:{transform:s}}).node()).render());var z=this;var j={label:function t(e){return c.length<=l._dataCutoff||l._hover&&l._hover(e)||l._active&&l._active(e)?l._drawLabel(e.data||e.node,e.i):false},labelBounds:function t(e){return e.labelBounds},labelConfig:{fontColor:function t(e){return e.id===l._center?lw.bind(z)(z._shapeConfig,"shape",e.key).labelConfig.fontColor(e):Ow(lw.bind(z)(z._shapeConfig,"shape",e.key).fill(e))},fontResize:function t(e){return e.id===l._center},padding:0,textAnchor:function t(e){return i[e.id].textAnchor||lw.bind(z)(z._shapeConfig,"shape",e.key).labelConfig.textAnchor},verticalAlign:function t(e){return e.id===l._center?"middle":"top"}},rotate:function t(e){return i[e.id].rotate||0},select:fw("g.d3plus-rings-nodes",{parent:this._select,transition:u,enter:{transform:s},update:{transform:s}}).node()};Fe().key(function(t){return t.shape}).entries(c).forEach(function(t){l._shapes.push((new wR[t.key]).config(lw.bind(l)(l._shapeConfig,"shape",t.key)).config(j).data(t.values).render())});return this}},{key:"center",value:function t(e){return arguments.length?(this._center=e,this):this._center}},{key:"hover",value:function t(e){this._hover=e;this._shapes.forEach(function(t){return t.hover(e)});if(this._legend)this._legendClass.hover(e);return this}},{key:"links",value:function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="links"});var r=[lW.bind(this),e,n,"links"];if(i)this._queue[this._queue.indexOf(i)]=r;else this._queue.push(r);return this}return this._links}},{key:"linkSize",value:function t(e){return arguments.length?(this._linkSize=typeof e==="function"?e:cw(e),this):this._linkSize}},{key:"linkSizeMin",value:function t(e){return arguments.length?(this._linkSizeMin=e,this):this._linkSizeMin}},{key:"linkSizeScale",value:function t(e){return arguments.length?(this._linkSizeScale=e,this):this._linkSizeScale}},{key:"nodeGroupBy",value:function t(e){var n=this;if(!arguments.length)return this._nodeGroupBy;if(!(e instanceof Array))e=[e];return this._nodeGroupBy=e.map(function(t){if(typeof t==="function")return t;else{if(!n._aggs[t]){n._aggs[t]=function(t,e){var n=Array.from(new Set(t.map(e)));return n.length===1?n[0]:n}}return $u(t)}}),this}},{key:"nodes",value:function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="nodes"});var r=[lW.bind(this),e,n,"nodes"];if(i)this._queue[this._queue.indexOf(i)]=r;else this._queue.push(r);return this}return this._nodes}},{key:"size",value:function t(e){return arguments.length?(this._size=typeof e==="function"||!e?e:$u(e),this):this._size}},{key:"sizeMax",value:function t(e){return arguments.length?(this._sizeMax=e,this):this._sizeMax}},{key:"sizeMin",value:function t(e){return arguments.length?(this._sizeMin=e,this):this._sizeMin}},{key:"sizeScale",value:function t(e){return arguments.length?(this._sizeScale=e,this):this._sizeScale}}]);return L}(mZ);function N1(t){return t.target.depth}function z1(t){return t.depth}function j1(t,e){return e-1-t.height}function L1(t,e){return t.sourceLinks.length?t.depth:e-1}function F1(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?de(t.sourceLinks,N1)-1:0}function I1(t){return function(){return t}}function H1(t,e){return V1(t.source,e.source)||t.index-e.index}function G1(t,e){return V1(t.target,e.target)||t.index-e.index}function V1(t,e){return t.y0-e.y0}function U1(t){return t.value}function W1(t){return t.index}function q1(t){return t.nodes}function K1(t){return t.links}function Y1(t,e){var n=t.get(e);if(!n)throw new Error("missing: "+e);return n}function X1(){var o=0,f=0,s=1,h=1,u=24,d=8,e=W1,l=L1,g,p,n=q1,i=K1,v=6;function r(){var t={nodes:n.apply(null,arguments),links:i.apply(null,arguments)};a(t);c(t);m(t);y(t);b(t);return t}r.update=function(t){b(t);return t};r.nodeId=function(t){return arguments.length?(e=typeof t==="function"?t:I1(t),r):e};r.nodeAlign=function(t){return arguments.length?(l=typeof t==="function"?t:I1(t),r):l};r.nodeSort=function(t){return arguments.length?(g=t,r):g};r.nodeWidth=function(t){return arguments.length?(u=+t,r):u};r.nodePadding=function(t){return arguments.length?(d=+t,r):d};r.nodes=function(t){return arguments.length?(n=typeof t==="function"?t:I1(t),r):n};r.links=function(t){return arguments.length?(i=typeof t==="function"?t:I1(t),r):i};r.linkSort=function(t){return arguments.length?(p=t,r):p};r.size=function(t){return arguments.length?(o=f=0,s=+t[0],h=+t[1],r):[s-o,h-f]};r.extent=function(t){return arguments.length?(o=+t[0][0],s=+t[1][0],f=+t[0][1],h=+t[1][1],r):[[o,f],[s,h]]};r.iterations=function(t){return arguments.length?(v=+t,r):v};function a(t){t.nodes.forEach(function(t,e){t.index=e;t.sourceLinks=[];t.targetLinks=[]});var r=Le(t.nodes,e);t.links.forEach(function(t,e){t.index=e;var n=t.source,i=t.target;if(_typeof2(n)!=="object")n=t.source=Y1(r,n);if(_typeof2(i)!=="object")i=t.target=Y1(r,i);n.sourceLinks.push(t);i.targetLinks.push(t)})}function c(t){t.nodes.forEach(function(t){t.value=Math.max(ge(t.sourceLinks,U1),ge(t.targetLinks,U1))})}function m(t){var e,n,i,r=t.nodes.length;for(e=t.nodes,n=[],i=0;e.length;++i,e=n,n=[]){if(i>r)throw new Error("circular link");e.forEach(function(t){t.depth=i;t.sourceLinks.forEach(function(t){if(n.indexOf(t.target)<0){n.push(t.target)}})})}for(e=t.nodes,n=[],i=0;e.length;++i,e=n,n=[]){if(i>r)throw new Error("circular link");e.forEach(function(t){t.height=i;t.targetLinks.forEach(function(t){if(n.indexOf(t.source)<0){n.push(t.source)}})})}var a=(s-o-u)/(i-1);t.nodes.forEach(function(t){t.layer=Math.max(0,Math.min(i-1,Math.floor(l.call(null,t,i))));t.x1=(t.x0=o+t.layer*a)+u})}function y(t){var e=Fe().key(function(t){return t.x0}).sortKeys(k).entries(t.nodes).map(function(t){return t.values});o();for(var n=0,i=v;n0))return;var l=(e/n-t.y0)*c;t.y0+=l;t.y1+=l})})}function u(c){e.slice(0,-1).reverse().forEach(function(t){t.forEach(function(t){var e=0;var n=0;var i=_createForOfIteratorHelper(t.sourceLinks),r;try{for(i.s();!(r=i.n()).done;){var a=r.value,o=a.target,s=a.value;var u=s*(o.layer-t.layer);e+=x(t,o)*u;n+=u}}catch(t){i.e(t)}finally{i.f()}if(!(n>0))return;var l=(e/n-t.y0)*c;t.y0+=l;t.y1+=l})})}function l(o){e.forEach(function(t){var e,n,i=f,r=t.length,a;if(g===undefined)t.sort(V1);for(a=0;a1e-6)e.y0+=n,e.y1+=n;i=e.y1+d}})}function c(o){e.forEach(function(t){var e,n,i=h,r=t.length,a;if(g===undefined)t.sort(V1);for(a=r-1;a>=0;--a){e=t[a];n=(e.y1-i)*o;if(n>1e-6)e.y0-=n,e.y1-=n;i=e.y0-d}})}}function _(t){if(p===undefined)t.nodes.forEach(function(t){t.sourceLinks.sort(G1);t.targetLinks.sort(H1)})}function b(t){_(t);t.nodes.forEach(function(t){var e=t.y0,n=e;t.sourceLinks.forEach(function(t){t.y0=e+t.width/2,e+=t.width});t.targetLinks.forEach(function(t){t.y1=n+t.width/2,n+=t.width})})}function w(t,e){var n=t.y0-(t.sourceLinks.length-1)*d/2;var i=_createForOfIteratorHelper(t.sourceLinks),r;try{for(i.s();!(r=i.n()).done;){var a=r.value,o=a.target,s=a.width;if(o===e)break;n+=s+d}}catch(t){i.e(t)}finally{i.f()}var u=_createForOfIteratorHelper(e.targetLinks),l;try{for(u.s();!(l=u.n()).done;){var c=l.value,f=c.source,h=c.width;if(f===t)break;n-=h}}catch(t){u.e(t)}finally{u.f()}return n}function x(t,e){var n=e.y0-(e.targetLinks.length-1)*d/2;var i=_createForOfIteratorHelper(e.targetLinks),r;try{for(i.s();!(r=i.n()).done;){var a=r.value,o=a.source,s=a.width;if(o===t)break;n+=s+d}}catch(t){i.e(t)}finally{i.f()}var u=_createForOfIteratorHelper(t.sourceLinks),l;try{for(u.s();!(l=u.n()).done;){var c=l.value,f=c.target,h=c.width;if(f===e)break;n-=h}}catch(t){u.e(t)}finally{u.f()}return n}return r}function Z1(t){return[t.source.x1,t.y0]}function $1(t){return[t.target.x0,t.y1]}function J1(){return Ox().source(Z1).target($1)}function Q1(t){"@babel/helpers - typeof";if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){Q1=function t(e){return typeof e}}else{Q1=function t(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return Q1(t)}function t2(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}}function e2(t,e){for(var n=0;n0}))});g=v.map(function(t){return ge(t.filter(function(t){return t<0}))})}else{p=n.map(function(t){return t[d?c:l]});g=p}var m=f(ce(p));if(d?mf(0))m+=d?-u:u;m=f.invert(m);var y=f(de(g));if(d?y>f(0):yh[1])h[1]=m;if(y0}))});g=v.map(function(t){return ge(t.filter(function(t){return t<0}))})}else{p=n.map(function(t){return t[d?c:l]});g=p}var m=f(ce(p));m+=d?-u:u;m=f.invert(m);var y=f(de(g));y+=d?u:-u;y=f.invert(y);if(m>h[1])h[1]=m;if(yl[p];else if(p===1)u=c-gl[p]}return u};if(f.invert&&i()){if(h==="log"){var r=0;while(r<10&&i()){var a=(p===0?-1:1)*(e[p]<0?-1:1);e[p]+=e[p]*n*a;f.domain(v?e.slice().reverse():e);r++}}else if(p===0){var o=f.invert(f(d)+g*(v?1:-1));if(oe[p]){e[p]=s;f.domain(v?e.slice().reverse():e)}}}return v?e.reverse():e}function y2(t){var e=t.data,n=t.x,i=t.y,r=t.x2,a=t.y2,o=t.yScale,s=t.xScale,u=t.config,l=t.buffer;n=n.copy();i=i.copy();var c=r?"x2":"x";var f=a?"y2":"y";var h=n.domain().slice(),d=i.domain().slice();var g=n.range(),p=i.range();if(!n.invert&&n.padding)g2(n,e,this._discrete);if(!i.invert&&i.padding)g2(i,e,this._discrete);if(n.invert||i.invert){e.forEach(function(t){var e=l?l:u.r(t.data,t.i)*2;if(n.invert){h=m2(n,s,t[c],e,g,h,0,false);h=m2(n,s,t[c],e,g,h,1,false)}if(i.invert){d=m2(i,o,t[f],e,p,d,0,true);d=m2(i,o,t[f],e,p,d,1,true)}})}return[n,i]}function _2(t){var e=this;var n=t.data,i=t.x,r=t.y,a=t.x2,o=t.y2;var s=a?"x2":"x";var u=o?"y2":"y";var l=this._discrete==="x"?r:i;var c=l.domain().slice();if(this._discrete==="x")c.reverse();var f=n.map(function(t){return t[e._discrete==="x"?u:s]});var h=l.invert(l(ce(f))+(this._discrete==="x"?-10:10));if(h>c[1])c[1]=h;if(this._discrete==="x")c.reverse();l.domain(c);return[i,r]}function b2(t){var e=t.data,i=t.x,r=t.y,n=t.x2,a=t.y2,o=t.yScale,s=t.xScale,u=t.config;i=i.copy();r=r.copy();var l=n?"x2":"x";var c=a?"y2":"y";var f=i.domain().slice(),h=r.domain().slice();var d=i.range(),g=r.range();if(!i.invert&&i.padding)g2(i,e,this._discrete);if(!r.invert&&r.padding)g2(r,e,this._discrete);if(i.invert||r.invert){e.forEach(function(t){if(i.invert){var e=u.width(t.data,t.i);f=m2(i,s,t[l],e,d,f,0,false);f=m2(i,s,t[l],e,d,f,1,false)}if(r.invert){var n=u.height(t.data,t.i);h=m2(r,o,t[c],n,g,h,0,true);h=m2(r,o,t[c],n,g,h,1,true)}})}return[i,r]}function w2(t,e){return E2(t)||C2(t,e)||k2(t,e)||x2()}function x2(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function k2(t,e){if(!t)return;if(typeof t==="string")return S2(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor)n=t.constructor.name;if(n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return S2(t,e)}function S2(t,e){if(e==null||e>t.length)e=t.length;for(var n=0,i=new Array(e);n0))return;var i,r,a,o,s;var u=t[e[0]].length;for(var l=0;l=0){i[0]=s,i[1]=s+=r}else if(r<0){i[1]=o,i[0]=o+=r}else{i[0]=s}}}}var Y2=function(t){D2(oe,t);var e=z2(oe);function oe(){var r;M2(this,oe);r=e.call(this);r._annotations=[];r._backgroundConfig={duration:0,fill:"transparent"};r._barPadding=0;r._buffer={Bar:p2,Box:v2,Circle:y2,Line:_2,Rect:b2};r._confidenceConfig={fill:function t(e,n){var i=typeof r._shapeConfig.Line.stroke==="function"?r._shapeConfig.Line.stroke(e,n):r._shapeConfig.Line.stroke;return i},fillOpacity:cw(.5)};r._discreteCutoff=100;r._groupPadding=5;r._lineMarkerConfig={fill:function t(e,n){return Tw(r._id(e,n))},r:cw(3)};r._lineMarkers=false;r._previousShapes=[];r._shape=cw("Circle");r._shapeConfig=el(r._shapeConfig,{Area:{label:function t(e,n){return r._stacked?r._drawLabel(e,n):false},labelConfig:{fontResize:true}},ariaLabel:function t(e,n){var i="";if(e.nested)i="".concat(r._drawLabel(e.data,e.i));else{i="".concat(r._drawLabel(e,n));if(r._x(e,n)!==undefined)i+=", x: ".concat(r._x(e,n));if(r._y(e,n)!==undefined)i+=", y: ".concat(r._y(e,n));if(r._x2(e,n)!==undefined)i+=", x2: ".concat(r._x2(e,n));if(r._y2(e,n)!==undefined)i+=", y2: ".concat(r._y2(e,n))}return"".concat(i,".")},Bar:{labelConfig:{textAnchor:function t(){return r._discrete==="x"?"middle":"end"},verticalAlign:function t(){return r._discrete==="x"?"top":"middle"}}},Circle:{r:V2.bind(L2(r))},Line:{fill:cw("none"),labelConfig:{fontColor:function t(e,n){var i=typeof r._shapeConfig.Line.stroke==="function"?r._shapeConfig.Line.stroke(e,n):r._shapeConfig.Line.stroke;return Ow(i)},fontResize:false,padding:5,textAnchor:"start",verticalAlign:"middle"},stroke:function t(e,n){return Tw(r._id(e,n))},strokeWidth:cw(2)},Rect:{height:function t(e){return V2.bind(L2(r))(e)*2},width:function t(e){return V2.bind(L2(r))(e)*2}}});r._shapeOrder=["Area","Path","Bar","Box","Line","Rect","Circle"];r._shapeSort=function(t,e){return r._shapeOrder.indexOf(t)-r._shapeOrder.indexOf(e)};r._sizeMax=20;r._sizeMin=5;r._sizeScale="sqrt";r._stackOffset=K2;r._stackOrder=W2;r._timelineConfig=el(r._timelineConfig,{brushing:true});r._x=$u("x");r._xAxis=(new JR).align("end");r._xTest=(new JR).align("end").gridSize(0);r._xConfig={};r._xCutoff=150;r._x2=$u("x2");r._x2Axis=(new RM).align("start");r._x2Test=(new RM).align("start").gridSize(0);r._x2Config={padding:0};r._y=$u("y");r._yAxis=(new uM).align("start");r._yTest=(new uM).align("start").gridSize(0);r._yConfig={gridConfig:{stroke:function t(e){var n=r._yAxis.range();return n[n.length-1]===r._yAxis._getPosition.bind(r._yAxis)(e.id)?"transparent":"#ccc"}}};r._yCutoff=150;r._y2=$u("y2");r._y2Axis=(new yM).align("end");r._y2Test=(new uM).align("end").gridSize(0);r._y2Config={};return r}P2(oe,[{key:"_draw",value:function t(e){var z=this;if(!this._filteredData.length)return this;var s=function t(e,n){return z._stacked?"".concat(z._groupBy.length>1?z._ids(e,n).slice(0,-1).join("_"):"group"):"".concat(z._ids(e,n).join("_"))};var u=this._filteredData.map(function(t,e){return{__d3plus__:true,data:t,group:s(t,e),i:e,hci:z._confidence&&z._confidence[1]&&z._confidence[1](t,e),id:z._ids(t,e).slice(0,z._drawDepth+1).join("_"),lci:z._confidence&&z._confidence[0]&&z._confidence[0](t,e),shape:z._shape(t,e),x:z._x(t,e),x2:z._x2(t,e),y:z._y(t,e),y2:z._y2(t,e)}});this._formattedData=u;if(this._size){var n=ue(u,function(t){return z._size(t.data)});this._sizeScaleD3=function(){return z._sizeMin};this._sizeScaleD3=na["scale".concat(this._sizeScale.charAt(0).toUpperCase()).concat(this._sizeScale.slice(1))]().domain(n).range([n[0]===n[1]?this._sizeMax:de([this._sizeMax/2,this._sizeMin]),this._sizeMax])}else{this._sizeScaleD3=function(){return z._sizeMin}}var i=u.some(function(t){return t.x2!==undefined}),r=u.some(function(t){return t.y2!==undefined});var a=this._height-this._margin.top-this._margin.bottom,l=this._discrete?this._discrete==="x"?"y":"x":undefined,o=this._discrete?this._discrete==="x"?"y2":"x2":undefined,c=[l,o].filter(function(t){return t}),f=this._select,h=this._transition,j=this._width-this._margin.left-this._margin.right;var d=this._time&&u[0].x2===this._time(u[0].data,u[0].i),g=this._time&&u[0].x===this._time(u[0].data,u[0].i),p=this._time&&u[0].y2===this._time(u[0].data,u[0].i),v=this._time&&u[0].y===this._time(u[0].data,u[0].i);for(var m=0;m3?"log":"linear"}return i||n};var G=this._yConfigScale=N("y",H).toLowerCase();var V=this._y2ConfigScale=N("y2",D).toLowerCase();var U=this._xConfigScale=N("x",F).toLowerCase();var W=this._x2ConfigScale=N("x2",O).toLowerCase();b={x:L,x2:P||L,y:I,y2:B||I};Object.keys(b).forEach(function(e){if(z["_".concat(e,"ConfigScale")]==="log"&&b[e].includes(0)){if(de(b[e])<0)b[e][1]=ce(u.map(function(t){return t[e]}).filter(Boolean));else b[e][0]=de(u.map(function(t){return t[e]}).filter(Boolean))}});c.forEach(function(t){if(z["_".concat(t,"Config")].domain){var e=z["_".concat(t,"Config")].domain;if(z._discrete==="x")e.reverse();b[t]=e}else if(t&&z._baseline!==void 0){var n=z._baseline;if(b[t]&&b[t][0]>n)b[t][0]=n;else if(b[t]&&b[t][1]this._discreteCutoff||this._width>this._xCutoff;var nt=this._discrete==="y"&&this._height>this._discreteCutoff||this._height>this._yCutoff;var it={gridConfig:{stroke:!this._discrete||this._discrete==="x"?this._yTest.gridConfig().stroke:"transparent"},locale:this._locale,scalePadding:Y.padding?Y.padding():0};if(!et){it.barConfig={stroke:"transparent"};it.tickSize=0;it.shapeConfig={labelBounds:function t(e,n){var i=e.labelBounds,r=i.width,a=i.y;var o=z._height/2;var s=n?-o:0;return{x:s,y:a,width:r,height:o}},labelConfig:{padding:0,rotate:0,verticalAlign:function t(e){return e.id===ut[0]?"top":"bottom"}},labelRotation:false}}var rt=fw("g.d3plus-plot-test",{enter:{opacity:0},parent:this._select}),at=this._discrete==="x"&&!d?b.x2:undefined,ot=!nt?ue(b.x):this._discrete==="x"&&!g?b.x:undefined,st=this._discrete==="y"&&!p?b.y2:undefined,ut=!et?ue(b.y):this._discrete==="y"&&!v?b.y:undefined;if(nt){this._yTest.domain(I).height(a).maxSize(j/2).range([undefined,undefined]).select(rt.node()).ticks(ut).width(j).config(it).config(this._yConfig).scale(G).render()}var lt=this._yTest.outerBounds();var ct=lt.width?lt.width+this._yTest.padding():undefined;if(r){this._y2Test.domain(B).height(a).range([undefined,undefined]).select(rt.node()).ticks(st).width(j).config(it).config(tt).config(this._y2Config).scale(V).render()}var ft=this._y2Test.outerBounds();var ht=ft.width?ft.width+this._y2Test.padding():undefined;var dt={gridConfig:{stroke:!this._discrete||this._discrete==="y"?this._xTest.gridConfig().stroke:"transparent"},locale:this._locale,scalePadding:q.padding?q.padding():0};if(!nt){dt.barConfig={stroke:"transparent"};dt.tickSize=0;dt.shapeConfig={labelBounds:function t(e,n){var i=e.labelBounds,r=i.height,a=i.y;var o=z._width/2;var s=n?-o:0;return{x:s,y:a,width:o,height:r}},labelConfig:{padding:0,rotate:0,textAnchor:function t(e){return e.id===ot[0]?"start":"end"}},labelRotation:false}}var gt=undefined;if(et){this._xTest.domain(L).height(a).maxSize(a/2).range([undefined,gt]).select(rt.node()).ticks(ot).width(j).config(dt).config(this._xConfig).scale(U).render()}var pt;if(this._lineLabels){var vt=Fe().key(function(t){return t.id}).entries(u.filter(function(t){return t.shape==="Line"}));if(vt.length&&vt.lengthct?Bt-ct:0;var Yt="translate(".concat(this._margin.left+Kt,", ").concat(this._margin.top+Dt,")");var Xt=nt&&fw("g.d3plus-plot-y-axis",{parent:f,transition:h,enter:{transform:Yt},update:{transform:Yt}});var Zt="translate(-".concat(this._margin.right,", ").concat(this._margin.top+Dt,")");var $t=r&&fw("g.d3plus-plot-y2-axis",{parent:f,transition:h,enter:{transform:Zt},update:{transform:Zt}});this._xAxis.domain(L).height(a-(Ot+Dt+Ft)).maxSize(a/2).range(Ht).select(et?Wt.node():undefined).ticks(ot).width(j).config(dt).config(this._xConfig).scale(U).render();if(i){this._x2Axis.domain(P).height(a-(jt+Dt+Ft)).range(Ht).select(qt.node()).ticks(at).width(j).config(dt).config(Q).config(this._x2Config).scale(W).render()}q=function t(e,n){if(n==="x2"){if(W==="log"&&e===0)e=P[0]<0?z._x2Axis._d3Scale.domain()[1]:z._x2Axis._d3Scale.domain()[0];return z._x2Axis._getPosition.bind(z._x2Axis)(e)}else{if(U==="log"&&e===0)e=L[0]<0?z._xAxis._d3Scale.domain()[1]:z._xAxis._d3Scale.domain()[0];return z._xAxis._getPosition.bind(z._xAxis)(e)}};It=[this._xAxis.outerBounds().y+Ot,a-(jt+Dt+Ft)];this._yAxis.domain(I).height(a).maxSize(j/2).range(It).select(nt?Xt.node():undefined).ticks(ut).width(Ht[Ht.length-1]).config(it).config(this._yConfig).scale(G).render();if(r){this._y2Axis.config(it).domain(r?B:I).gridSize(0).height(a).range(It).select($t.node()).width(j-ce([0,Nt-ht])).title(false).config(this._y2Config).config(tt).scale(V).render()}Y=function t(e,n){if(n==="y2"){if(V==="log"&&e===0)e=B[1]<0?z._y2Axis._d3ScaleNegative.domain()[0]:z._y2Axis._d3Scale.domain()[1];return z._y2Axis._getPosition.bind(z._y2Axis)(e)-Ot}else{if(G==="log"&&e===0)e=I[1]<0?z._yAxis._d3ScaleNegative.domain()[0]:z._yAxis._d3Scale.domain()[1];return z._yAxis._getPosition.bind(z._yAxis)(e)-Ot}};(new vA).data([{}]).select(Gt.node()).x(Ht[0]+(Ht[1]-Ht[0])/2).width(Ht[1]-Ht[0]).y(this._margin.top+Dt+It[0]+(It[1]-It[0])/2).height(It[1]-It[0]).config(this._backgroundConfig).render();var Jt=fw("g.d3plus-plot-annotations",{parent:f,transition:h,enter:{transform:Vt},update:{transform:Vt}}).node();this._annotations.forEach(function(t){(new wR[t.shape]).config(t).config({x:function t(e){return e.x2?q(e.x2,"x2"):q(e.x)},x0:z._discrete==="x"?function(t){return t.x2?q(t.x2,"x2"):q(t.x)}:q(b.x[0]),x1:z._discrete==="x"?null:function(t){return t.x2?q(t.x2,"x2"):q(t.x)},y:function t(e){return e.y2?Y(e.y2,"y2"):Y(e.y)},y0:z._discrete==="y"?function(t){return t.y2?Y(t.y2,"y2"):Y(t.y)}:Y(b.y[1])-Qt,y1:z._discrete==="y"?null:function(t){return t.y2?Y(t.y2,"y2"):Y(t.y)-Qt}}).select(Jt).render()});var Qt=this._xAxis.barConfig()["stroke-width"];if(Qt)Qt/=2;var te=this._discrete||"x";var ee={discrete:this._discrete,duration:this._duration,label:function t(e){return z._drawLabel(e.data,e.i)},select:fw("g.d3plus-plot-shapes",{parent:f,transition:h,enter:{transform:Vt},update:{transform:Vt}}).node(),x:function t(e){return e.x2!==undefined?q(e.x2,"x2"):q(e.x)},x0:te==="x"?function(t){return t.x2?q(t.x2,"x2"):q(t.x)}:q(typeof this._baseline==="number"?this._baseline:b.x[0]),x1:te==="x"?null:function(t){return t.x2?q(t.x2,"x2"):q(t.x)},y:function t(e){return e.y2!==undefined?Y(e.y2,"y2"):Y(e.y)},y0:te==="y"?function(t){return t.y2?Y(t.y2,"y2"):Y(t.y)}:Y(typeof this._baseline==="number"?this._baseline:b.y[1])-Qt,y1:te==="y"?null:function(t){return t.y2?Y(t.y2,"y2"):Y(t.y)-Qt}};if(this._stacked){var ne=l==="x"?q:Y;ee["".concat(l)]=ee["".concat(l,"0")]=function(t){var e=x.indexOf(t.id),n=_.indexOf(t.discrete);return e>=0?ne(w[e][n][0]):ne(b[l][l==="x"?0:1])};ee["".concat(l,"1")]=function(t){var e=x.indexOf(t.id),n=_.indexOf(t.discrete);return e>=0?ne(w[e][n][1]):ne(b[l][l==="x"?0:1])}}var ie=Object.keys(this._on);Z.forEach(function(e){var n=(new wR[e.key]).config(ee).data(e.values);if(e.key==="Bar"){var t;var i=z._discrete==="x"?q:Y;var r=z._discrete==="x"?F:H;var a=z._discrete==="x"?L:I;var o=z._discrete==="x"?Ht:It;if(r!=="Point"&&a.length===2){t=(i(e.values[z._discrete==="x"?0:e.values.length-1][z._discrete])-i(a[0]))*2}else if(a.length>1)t=i(a[1])-i(a[0]);else t=o[o.length-1]-o[0];if(z._groupPadding0}).sort(function(t,e){return t.start-e.start});var r;if(this._groupBy.length>1&&this._drawDepth>0){var a=Fe();var o=function t(e){a.key(function(t){return n._groupBy[e](t.data,t.i)})};for(var s=0;s2?e-2:e}).x(function(t){return h(t.start)+(h(t.end)-h(t.start))/2}).y(function(t){return d(t.lane)+g/2}).config(lw.bind(this)(this._shapeConfig,"shape","Rect")).render());return this}},{key:"axisConfig",value:function t(e){return arguments.length?(this._axisConfig=el(this._axisConfig,e),this):this._axisConfig}},{key:"end",value:function t(e){if(arguments.length){if(typeof e==="function")this._end=e;else{this._end=$u(e);if(!this._aggs[e])this._aggs[e]=ce}return this}else return this._end}},{key:"paddingInner",value:function t(e){return arguments.length?(this._paddingInner=e,this):this._paddingInner}},{key:"paddingOuter",value:function t(e){return arguments.length?(this._paddingOuter=e,this):this._paddingOuter}},{key:"start",value:function t(e){if(arguments.length){if(typeof e==="function")this._start=e;else{this._start=$u(e);if(!this._aggs[e])this._aggs[e]=de}return this}else return this._start}}]);return p}(mZ);t.Area=RE;t.AreaPlot=r3;t.Axis=GR;t.AxisBottom=JR;t.AxisLeft=uM;t.AxisRight=yM;t.AxisTop=RM;t.Bar=GE;t.BarChart=g3;t.BaseClass=ow;t.Box=nR;t.BoxWhisker=S3;t.BumpChart=D3;t.Circle=nA;t.ColorScale=sK;t.Donut=f$;t.Geomap=HZ;t.Image=Ew;t.Legend=Yq;t.Line=TA;t.LinePlot=U3;t.Matrix=VQ;t.Network=b1;t.Pack=LJ;t.Path=bR;t.Pie=e$;t.Plot=Y2;t.Priestley=M6;t.RESET=Jb;t.Radar=a6;t.RadialMatrix=A0;t.Rect=vA;t.Rings=D1;t.Sankey=d2;t.Shape=dC;t.StackedArea=p6;t.TextBox=ZS;t.Timeline=wK;t.Tooltip=aX;t.Tree=eQ;t.Treemap=pQ;t.Viz=mZ;t.Whisker=VA;t.accessor=$u;t.assign=el;t.attrize=nl;t.ckmeans=zq;t.closest=sw;t.colorAdd=Aw;t.colorAssign=Tw;t.colorContrast=Pw;t.colorDefaults=Rw;t.colorLegible=Ow;t.colorLighter=Bw;t.colorSubtract=Dw;t.configPrep=lw;t.constant=cw;t.dataConcat=DU;t.dataFold=NU;t.dataLoad=lW;t.date=xR;t.dom2canvas=XP;t.elem=fw;t.findLocale=Xb;t.fontExists=mS;t.formatAbbreviate=xw;t.formatLocale=mw;t.isObject=Qu;t.largestRect=gE;t.lineIntersection=NC;t.merge=dw;t.parseSides=gw;t.path2polygon=oR;t.pointDistance=eC;t.pointDistanceSquared=tC;t.pointRotate=JC;t.polygonInside=UC;t.polygonRayCast=$C;t.polygonRotate=QC;t.prefix=pw;t.rtl=yS;t.saveElement=JP;t.segmentBoxContains=GC;t.segmentsIntersect=VC;t.shapeEdgePoint=rR;t.simplify=rE;t.stringify=_S;t.strip=wS;t.stylize=vw;t.textSplit=zS;t.textWidth=oS;t.textWrap=jS;t.titleCase=QS;t.trim=sS;t.trimLeft=uS;t.trimRight=lS;t.unique=hw;t.uuid=$b;t.version=e;Object.defineProperty(t,"__esModule",{value:true})}); \ No newline at end of file + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.14.3 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */var wb=typeof window!=="undefined"&&typeof document!=="undefined";var Cb=["Edge","Trident","Firefox"];var Eb=0;for(var Sb=0;Sb=0){Eb=1;break}}function Ab(t){var e=false;return function(){if(e){return}e=true;window.Promise.resolve().then(function(){e=false;t()})}}function kb(t){var e=false;return function(){if(!e){e=true;setTimeout(function(){e=false;t()},Eb)}}}var Mb=wb&&window.Promise;var Tb=Mb?Ab:kb;function Bb(t){var e={};return t&&e.toString.call(t)==="[object Function]"}function Db(t,e){if(t.nodeType!==1){return[]}var n=getComputedStyle(t,null);return e?n[e]:n}function Nb(t){if(t.nodeName==="HTML"){return t}return t.parentNode||t.host}function Pb(t){if(!t){return document.body}switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=Db(t),n=e.overflow,i=e.overflowX,r=e.overflowY;if(/(auto|scroll|overlay)/.test(n+r+i)){return t}return Pb(Nb(t))}var zb=wb&&!!(window.MSInputMethodContext&&document.documentMode);var Ob=wb&&/MSIE 10/.test(navigator.userAgent);function Fb(t){if(t===11){return zb}if(t===10){return Ob}return zb||Ob}function Rb(t){if(!t){return document.documentElement}var e=Fb(10)?document.body:null;var n=t.offsetParent;while(n===e&&t.nextElementSibling){n=(t=t.nextElementSibling).offsetParent}var i=n&&n.nodeName;if(!i||i==="BODY"||i==="HTML"){return t?t.ownerDocument.documentElement:document.documentElement}if(["TD","TABLE"].indexOf(n.nodeName)!==-1&&Db(n,"position")==="static"){return Rb(n)}return n}function Ib(t){var e=t.nodeName;if(e==="BODY"){return false}return e==="HTML"||Rb(t.firstElementChild)===t}function Lb(t){if(t.parentNode!==null){return Lb(t.parentNode)}return t}function jb(t,e){if(!t||!t.nodeType||!e||!e.nodeType){return document.documentElement}var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING;var i=n?t:e;var r=n?e:t;var o=document.createRange();o.setStart(i,0);o.setEnd(r,0);var a=o.commonAncestorContainer;if(t!==a&&e!==a||i.contains(r)){if(Ib(a)){return a}return Rb(a)}var s=Lb(t);if(s.host){return jb(s.host,e)}else{return jb(t,Lb(e).host)}}function Hb(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"top";var n=e==="top"?"scrollTop":"scrollLeft";var i=t.nodeName;if(i==="BODY"||i==="HTML"){var r=t.ownerDocument.documentElement;var o=t.ownerDocument.scrollingElement||r;return o[n]}return t[n]}function Vb(t,e){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var i=Hb(e,"top");var r=Hb(e,"left");var o=n?-1:1;t.top+=i*o;t.bottom+=i*o;t.left+=r*o;t.right+=r*o;return t}function Ub(t,e){var n=e==="x"?"Left":"Top";var i=n==="Left"?"Right":"Bottom";return parseFloat(t["border"+n+"Width"],10)+parseFloat(t["border"+i+"Width"],10)}function Wb(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],Fb(10)?n["offset"+t]+i["margin"+(t==="Height"?"Top":"Left")]+i["margin"+(t==="Height"?"Bottom":"Right")]:0)}function qb(){var t=document.body;var e=document.documentElement;var n=Fb(10)&&getComputedStyle(e);return{height:Wb("Height",t,e,n),width:Wb("Width",t,e,n)}}var Xb=function(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}};var Gb=function(){function i(t,e){for(var n=0;n2&&arguments[2]!==undefined?arguments[2]:false;var i=Fb(10);var r=e.nodeName==="HTML";var o=Zb(t);var a=Zb(e);var s=Pb(t);var u=Db(e);var h=parseFloat(u.borderTopWidth,10);var l=parseFloat(u.borderLeftWidth,10);if(n&&e.nodeName==="HTML"){a.top=Math.max(a.top,0);a.left=Math.max(a.left,0)}var f=Qb({top:o.top-a.top-h,left:o.left-a.left-l,width:o.width,height:o.height});f.marginTop=0;f.marginLeft=0;if(!i&&r){var c=parseFloat(u.marginTop,10);var d=parseFloat(u.marginLeft,10);f.top-=h-c;f.bottom-=h-c;f.left-=l-d;f.right-=l-d;f.marginTop=c;f.marginLeft=d}if(i&&!n?e.contains(s):e===s&&s.nodeName!=="BODY"){f=Vb(f,e)}return f}function Jb(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=t.ownerDocument.documentElement;var i=Kb(t,n);var r=Math.max(n.clientWidth,window.innerWidth||0);var o=Math.max(n.clientHeight,window.innerHeight||0);var a=!e?Hb(n):0;var s=!e?Hb(n,"left"):0;var u={top:a-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:r,height:o};return Qb(u)}function tx(t){var e=t.nodeName;if(e==="BODY"||e==="HTML"){return false}if(Db(t,"position")==="fixed"){return true}return tx(Nb(t))}function ex(t){if(!t||!t.parentElement||Fb()){return document.documentElement}var e=t.parentElement;while(e&&Db(e,"transform")==="none"){e=e.parentElement}return e||document.documentElement}function nx(t,e,n,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var o={top:0,left:0};var a=r?ex(t):jb(t,e);if(i==="viewport"){o=Jb(a,r)}else{var s=void 0;if(i==="scrollParent"){s=Pb(Nb(e));if(s.nodeName==="BODY"){s=t.ownerDocument.documentElement}}else if(i==="window"){s=t.ownerDocument.documentElement}else{s=i}var u=Kb(s,a,r);if(s.nodeName==="HTML"&&!tx(a)){var h=qb(),l=h.height,f=h.width;o.top+=u.top-u.marginTop;o.bottom=l+u.top;o.left+=u.left-u.marginLeft;o.right=f+u.left}else{o=u}}o.left+=n;o.top+=n;o.right-=n;o.bottom-=n;return o}function ix(t){var e=t.width,n=t.height;return e*n}function rx(t,e,i,n,r){var o=arguments.length>5&&arguments[5]!==undefined?arguments[5]:0;if(t.indexOf("auto")===-1){return t}var a=nx(i,n,o,r);var s={top:{width:a.width,height:e.top-a.top},right:{width:a.right-e.right,height:a.height},bottom:{width:a.width,height:a.bottom-e.bottom},left:{width:e.left-a.left,height:a.height}};var u=Object.keys(s).map(function(t){return $b({key:t},s[t],{area:ix(s[t])})}).sort(function(t,e){return e.area-t.area});var h=u.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight});var l=h.length>0?h[0].key:u[0].key;var f=t.split("-")[1];return l+(f?"-"+f:"")}function ox(t,e,n){var i=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var r=i?ex(e):jb(e,n);return Kb(n,r,i)}function ax(t){var e=getComputedStyle(t);var n=parseFloat(e.marginTop)+parseFloat(e.marginBottom);var i=parseFloat(e.marginLeft)+parseFloat(e.marginRight);var r={width:t.offsetWidth+i,height:t.offsetHeight+n};return r}function sx(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function ux(t,e,n){n=n.split("-")[0];var i=ax(t);var r={width:i.width,height:i.height};var o=["right","left"].indexOf(n)!==-1;var a=o?"top":"left";var s=o?"left":"top";var u=o?"height":"width";var h=!o?"height":"width";r[a]=e[a]+e[u]/2-i[u]/2;if(n===s){r[s]=e[s]-i[h]}else{r[s]=e[sx(s)]}return r}function hx(t,e){if(Array.prototype.find){return t.find(e)}return t.filter(e)[0]}function lx(t,e,n){if(Array.prototype.findIndex){return t.findIndex(function(t){return t[e]===n})}var i=hx(t,function(t){return t[e]===n});return t.indexOf(i)}function fx(t,n,e){var i=e===undefined?t:t.slice(0,lx(t,"name",e));i.forEach(function(t){if(t["function"]){console.warn("`modifier.function` is deprecated, use `modifier.fn`!")}var e=t["function"]||t.fn;if(t.enabled&&Bb(e)){n.offsets.popper=Qb(n.offsets.popper);n.offsets.reference=Qb(n.offsets.reference);n=e(n,t)}});return n}function cx(){if(this.state.isDestroyed){return}var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:false,offsets:{}};t.offsets.reference=ox(this.state,this.popper,this.reference,this.options.positionFixed);t.placement=rx(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding);t.originalPlacement=t.placement;t.positionFixed=this.options.positionFixed;t.offsets.popper=ux(this.popper,t.offsets.reference,t.placement);t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute";t=fx(this.modifiers,t);if(!this.state.isCreated){this.state.isCreated=true;this.options.onCreate(t)}else{this.options.onUpdate(t)}}function dx(t,i){return t.some(function(t){var e=t.name,n=t.enabled;return n&&e===i})}function px(t){var e=[false,"ms","Webkit","Moz","O"];var n=t.charAt(0).toUpperCase()+t.slice(1);for(var i=0;ia[d]){t.offsets.popper[f]+=s[f]+p-a[d]}t.offsets.popper=Qb(t.offsets.popper);var g=s[f]+s[h]/2-p/2;var v=Db(t.instance.popper);var _=parseFloat(v["margin"+l],10);var y=parseFloat(v["border"+l+"Width"],10);var m=g-t.offsets.popper[f]-_-y;m=Math.max(Math.min(a[h]-p,m),0);t.arrowElement=i;t.offsets.arrow=(n={},Yb(n,f,Math.round(m)),Yb(n,c,""),n);return t}function Bx(t){if(t==="end"){return"start"}else if(t==="start"){return"end"}return t}var Dx=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"];var Nx=Dx.slice(3);function Px(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var n=Nx.indexOf(t);var i=Nx.slice(n+1).concat(Nx.slice(0,n));return e?i.reverse():i}var zx={FLIP:"flip",CLOCKWISE:"clockwise",COUNTERCLOCKWISE:"counterclockwise"};function Ox(d,p){if(dx(d.instance.modifiers,"inner")){return d}if(d.flipped&&d.placement===d.originalPlacement){return d}var g=nx(d.instance.popper,d.instance.reference,p.padding,p.boundariesElement,d.positionFixed);var v=d.placement.split("-")[0];var _=sx(v);var y=d.placement.split("-")[1]||"";var m=[];switch(p.behavior){case zx.FLIP:m=[v,_];break;case zx.CLOCKWISE:m=Px(v);break;case zx.COUNTERCLOCKWISE:m=Px(v,true);break;default:m=p.behavior}m.forEach(function(t,e){if(v!==t||m.length===e+1){return d}v=d.placement.split("-")[0];_=sx(v);var n=d.offsets.popper;var i=d.offsets.reference;var r=Math.floor;var o=v==="left"&&r(n.right)>r(i.left)||v==="right"&&r(n.left)r(i.top)||v==="bottom"&&r(n.top)r(g.right);var u=r(n.top)r(g.bottom);var l=v==="left"&&a||v==="right"&&s||v==="top"&&u||v==="bottom"&&h;var f=["top","bottom"].indexOf(v)!==-1;var c=!!p.flipVariations&&(f&&y==="start"&&a||f&&y==="end"&&s||!f&&y==="start"&&u||!f&&y==="end"&&h);if(o||l||c){d.flipped=true;if(o||l){v=m[e+1]}if(c){y=Bx(y)}d.placement=v+(y?"-"+y:"");d.offsets.popper=$b({},d.offsets.popper,ux(d.instance.popper,d.offsets.reference,d.placement));d=fx(d.instance.modifiers,d,"flip")}});return d}function Fx(t){var e=t.offsets,n=e.popper,i=e.reference;var r=t.placement.split("-")[0];var o=Math.floor;var a=["top","bottom"].indexOf(r)!==-1;var s=a?"right":"bottom";var u=a?"left":"top";var h=a?"width":"height";if(n[s]o(i[s])){t.offsets.popper[u]=o(i[s])}return t}function Rx(t,e,n,i){var r=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);var o=+r[1];var a=r[2];if(!o){return t}if(a.indexOf("%")===0){var s=void 0;switch(a){case"%p":s=n;break;case"%":case"%r":default:s=i}var u=Qb(s);return u[e]/100*o}else if(a==="vh"||a==="vw"){var h=void 0;if(a==="vh"){h=Math.max(document.documentElement.clientHeight,window.innerHeight||0)}else{h=Math.max(document.documentElement.clientWidth,window.innerWidth||0)}return h/100*o}else{return o}}function Ix(t,r,o,e){var a=[0,0];var s=["right","left"].indexOf(e)!==-1;var n=t.split(/(\+|\-)/).map(function(t){return t.trim()});var i=n.indexOf(hx(n,function(t){return t.search(/,|\s/)!==-1}));if(n[i]&&n[i].indexOf(",")===-1){console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.")}var u=/\s*,\s*|\s+/;var h=i!==-1?[n.slice(0,i).concat([n[i].split(u)[0]]),[n[i].split(u)[1]].concat(n.slice(i+1))]:[n];h=h.map(function(t,e){var n=(e===1?!s:s)?"height":"width";var i=false;return t.reduce(function(t,e){if(t[t.length-1]===""&&["+","-"].indexOf(e)!==-1){t[t.length-1]=e;i=true;return t}else if(i){t[t.length-1]+=e;i=false;return t}else{return t.concat(e)}},[]).map(function(t){return Rx(t,n,r,o)})});h.forEach(function(n,i){n.forEach(function(t,e){if(wx(t)){a[i]+=t*(n[e-1]==="-"?-1:1)}})});return a}function Lx(t,e){var n=e.offset;var i=t.placement,r=t.offsets,o=r.popper,a=r.reference;var s=i.split("-")[0];var u=void 0;if(wx(+n)){u=[+n,0]}else{u=Ix(n,o,a,s)}if(s==="left"){o.top+=u[0];o.left-=u[1]}else if(s==="right"){o.top+=u[0];o.left+=u[1]}else if(s==="top"){o.left+=u[0];o.top-=u[1]}else if(s==="bottom"){o.left+=u[0];o.top+=u[1]}t.popper=o;return t}function jx(t,r){var e=r.boundariesElement||Rb(t.instance.popper);if(t.instance.reference===e){e=Rb(e)}var n=px("transform");var i=t.instance.popper.style;var o=i.top,a=i.left,s=i[n];i.top="";i.left="";i[n]="";var u=nx(t.instance.popper,t.instance.reference,r.padding,e,t.positionFixed);i.top=o;i.left=a;i[n]=s;r.boundaries=u;var h=r.priority;var l=t.offsets.popper;var f={primary:function t(e){var n=l[e];if(l[e]u[e]&&!r.escapeWithReference){i=Math.min(l[n],u[e]-(e==="right"?l.width:l.height))}return Yb({},n,i)}};h.forEach(function(t){var e=["left","top"].indexOf(t)!==-1?"primary":"secondary";l=$b({},l,f[e](t))});t.offsets.popper=l;return t}function Hx(t){var e=t.placement;var n=e.split("-")[0];var i=e.split("-")[1];if(i){var r=t.offsets,o=r.reference,a=r.popper;var s=["bottom","top"].indexOf(n)!==-1;var u=s?"left":"top";var h=s?"width":"height";var l={start:Yb({},u,o[u]),end:Yb({},u,o[u]+o[h]-a[h])};t.offsets.popper=$b({},a,l[i])}return t}function Vx(t){if(!Mx(t.instance.modifiers,"hide","preventOverflow")){return t}var e=t.offsets.reference;var n=hx(t.instance.modifiers,function(t){return t.name==="preventOverflow"}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&arguments[2]!==undefined?arguments[2]:{};Xb(this,o);this.scheduleUpdate=function(){return requestAnimationFrame(n.update)};this.update=Tb(this.update.bind(this));this.options=$b({},o.Defaults,i);this.state={isDestroyed:false,isCreated:false,scrollParents:[]};this.reference=t&&t.jquery?t[0]:t;this.popper=e&&e.jquery?e[0]:e;this.options.modifiers={};Object.keys($b({},o.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=$b({},o.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})});this.modifiers=Object.keys(this.options.modifiers).map(function(t){return $b({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order});this.modifiers.forEach(function(t){if(t.enabled&&Bb(t.onLoad)){t.onLoad(n.reference,n.popper,n.options,t,n.state)}});this.update();var r=this.options.eventsEnabled;if(r){this.enableEventListeners()}this.state.eventsEnabled=r}Gb(o,[{key:"update",value:function t(){return cx.call(this)}},{key:"destroy",value:function t(){return gx.call(this)}},{key:"enableEventListeners",value:function t(){return mx.call(this)}},{key:"disableEventListeners",value:function t(){return xx.call(this)}}]);return o}();Xx.Utils=(typeof window!=="undefined"?window:global).PopperUtils;Xx.placements=Dx;Xx.Defaults=qx;var Gx=function(t){function e(){t.call(this);this._arrow=ju("arrow","");this._arrowStyle={content:"",background:"inherit",border:"inherit","border-width":"0 1px 1px 0",height:"10px",position:"absolute",transform:"rotate(45deg)",width:"10px","z-index":"-1"};this._background=Zu("rgba(255, 255, 255, 1)");this._body=ju("body","");this._bodyStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"12px","font-weight":"400","z-index":"1"};this._border=Zu("1px solid rgba(0, 0, 0, 0.1)");this._borderRadius=Zu("2px");this._className="d3plus-tooltip";this._data=[];this._duration=Zu(200);this._footer=ju("footer","");this._footerStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"12px","font-weight":"400","z-index":"1"};this._height=Zu("auto");this._id=function(t,e){return t.id||""+e};this._offset=Zu(5);this._padding=Zu("5px");this._pointerEvents=Zu("auto");this._position=function(t){return[t.x,t.y]};this._prefix=eh();this._tableStyle={"border-spacing":"0",width:"100%"};this._tbody=[];this._tbodyStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"12px","text-align":"center"};this._thead=[];this._theadStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"12px","font-weight":"600","text-align":"center"};this._title=ju("title","");this._titleStyle={"font-family":"'Roboto', 'Helvetica Neue', 'HelveticaNeue', 'Helvetica', 'Arial', sans-serif","font-size":"14px","font-weight":"600"};this._width=Zu("auto")}if(t){e.__proto__=t}e.prototype=Object.create(t&&t.prototype);e.prototype.constructor=e;e.prototype.render=function t(e){var n=this;var i=this;var r=qa("body").selectAll("."+this._className).data(this._data,this._id);var o=r.enter().append("div").attr("class",this._className);var a=r.merge(o);function s(n){o.append("div").attr("class","d3plus-tooltip-"+n).attr("id",function(t,e){return"d3plus-tooltip-"+n+"-"+(t?i._id(t,e):"")});var t=a.select(".d3plus-tooltip-"+n).html(i["_"+n]);nh(t,i["_"+n+"Style"])}function u(t){if(typeof t==="function"){var e=qa(this.parentNode.parentNode).datum();return t(e,i._data.indexOf(e))}else{return t}}function h(t){t.style("background",i._background).style(i._prefix+"border-radius",i._borderRadius).style("pointer-events",i._pointerEvents).style("padding",i._padding).style("width",i._width).style("height",i._height).style("border",function(t,e){var n=qa(this).style("border");return n!=="0px none rgb(0, 0, 0)"?n:i._border(t,e)})}s("title");s("body");var l=o.append("table").attr("class","d3plus-tooltip-table");var f=a.select(".d3plus-tooltip-table");nh(f,this._tableStyle);l.append("thead").attr("class","d3plus-tooltip-thead");var c=a.select(".d3plus-tooltip-thead");nh(c,this._theadStyle);var d=c.selectAll("th").data(this._thead);d.enter().append("th").merge(d).html(u);d.exit().remove();l.append("tbody").attr("class","d3plus-tooltip-tbody");var p=a.select(".d3plus-tooltip-tbody");nh(p,this._tbodyStyle);var g=p.selectAll("tr").data(this._tbody);var v=g.enter().append("tr");g.exit().remove();var _=g.merge(v);var y=_.selectAll("td").data(function(t){return t});y.enter().append("td").merge(y).html(u);s("footer");s("arrow");o.call(h);var m=Pu().duration(this._duration);a.attr("id",function(t,e){return"d3plus-tooltip-"+(t?n._id(t,e):"")}).transition(m).style("opacity",1).call(h);r.exit().transition(m).style("opacity",0).remove();for(var b=0;b1;var a=Ku("g.d3plus-viz-colorScale",{condition:o&&!this._colorScaleConfig.select,enter:r,parent:this._select,transition:this._transition,update:r}).node();var s=t.filter(function(t,e){var n=i._colorScale(t,e);return n!==undefined&&n!==null});this._colorScaleClass.align({bottom:"end",left:"start",right:"end",top:"start"}[e]).duration(this._duration).data(s).height(n?this._height-(this._margin.bottom+this._margin.top):this._height-(this._margin.bottom+this._margin.top+this._padding.bottom+this._padding.top)).orient(e).select(a).value(this._colorScale).width(n?this._width-(this._margin.left+this._margin.right+this._padding.left+this._padding.right):this._width-(this._margin.left+this._margin.right)).config(this._colorScaleConfig).render();if(o){var u=this._colorScaleClass.outerBounds();if(this._colorScalePosition&&!this._colorScaleConfig.select&&u.height){if(n){this._margin[e]+=u.height+this._legendClass.padding()*2}else{this._margin[e]+=u.width+this._legendClass.padding()*2}}}}};var Zx=sb(function(e,t){(function(t){{e.exports=t()}})(function(){var R;return function o(a,s,u){function h(n,t){if(!s[n]){if(!a[n]){var e=typeof ab=="function"&&ab;if(!t&&e){return e(n,!0)}if(l){return l(n,!0)}var i=new Error("Cannot find module '"+n+"'");throw i.code="MODULE_NOT_FOUND",i}var r=s[n]={exports:{}};a[n][0].call(r.exports,function(t){var e=a[n][1][t];return h(e?e:t)},r,r.exports,o,a,s,u)}return s[n].exports}var l=typeof ab=="function"&&ab;for(var t=0;t= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=y-m,E=Math.floor,S=String.fromCharCode,c;function A(t){throw new RangeError(l[t])}function d(t,e){var n=t.length;var i=[];while(n--){i[n]=e(t[n])}return i}function p(t,e){var n=t.split("@");var i="";if(n.length>1){i=n[0]+"@";t=n[1]}t=t.replace(h,".");var r=t.split(".");var o=d(r,e).join(".");return i+o}function k(t){var e=[],n=0,i=t.length,r,o;while(n=55296&&r<=56319&&n65535){t-=65536;e+=S(t>>>10&1023|55296);t=56320|t&1023}e+=S(t);return e}).join("")}function M(t){if(t-48<10){return t-22}if(t-65<26){return t-65}if(t-97<26){return t-97}return y}function T(t,e){return t+22+75*(t<26)-((e!=0)<<5)}function B(t,e,n){var i=0;t=n?E(t/a):t>>1;t+=E(t/e);for(;t>f*b>>1;i+=y){t=E(t/f)}return E(i+(f+1)*t/(t+o))}function g(t){var e=[],n=t.length,i,r=0,o=w,a=x,s,u,h,l,f,c,d,p,g;s=t.lastIndexOf(C);if(s<0){s=0}for(u=0;u=128){A("not-basic")}e.push(t.charCodeAt(u))}for(h=s>0?s+1:0;h=n){A("invalid-input")}d=M(t.charCodeAt(h++));if(d>=y||d>E((_-r)/f)){A("overflow")}r+=d*f;p=c<=a?m:c>=a+b?b:c-a;if(dE(_/g)){A("overflow")}f*=g}i=e.length+1;a=B(r-l,i,l==0);if(E(r/i)>_-o){A("overflow")}o+=E(r/i);r%=i;e.splice(r++,0,o)}return v(e)}function D(t){var e,n,i,r,o,a,s,u,h,l,f,c=[],d,p,g,v;t=k(t);d=t.length;e=w;n=0;o=x;for(a=0;a=e&&fE((_-n)/p)){A("overflow")}n+=(s-e)*p;e=s;for(a=0;a_){A("overflow")}if(f==e){for(u=n,h=y;;h+=y){l=h<=o?m:h>=o+b?b:h-o;if(u0){f(n.documentElement);clearInterval(t);if(r.type==="view"){u.contentWindow.scrollTo(o,a);if(/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&(u.contentWindow.scrollY!==a||u.contentWindow.scrollX!==o)){n.documentElement.style.top=-a+"px";n.documentElement.style.left=-o+"px";n.documentElement.style.position="absolute"}}e(u)}},50)};n.open();n.write("");h(t,o,a);n.replaceChild(n.adoptNode(s),n.documentElement);n.close()})}},{"./log":13}],3:[function(t,e,n){function i(t){this.r=0;this.g=0;this.b=0;this.a=null;var e=this.fromArray(t)||this.namedColor(t)||this.rgb(t)||this.rgba(t)||this.hex6(t)||this.hex3(t)}i.prototype.darken=function(t){var e=1-t;return new i([Math.round(this.r*e),Math.round(this.g*e),Math.round(this.b*e),this.a])};i.prototype.isTransparent=function(){return this.a===0};i.prototype.isBlack=function(){return this.r===0&&this.g===0&&this.b===0};i.prototype.fromArray=function(t){if(Array.isArray(t)){this.r=Math.min(t[0],255);this.g=Math.min(t[1],255);this.b=Math.min(t[2],255);if(t.length>3){this.a=t[3]}}return Array.isArray(t)};var r=/^#([a-f0-9]{3})$/i;i.prototype.hex3=function(t){var e=null;if((e=t.match(r))!==null){this.r=parseInt(e[1][0]+e[1][0],16);this.g=parseInt(e[1][1]+e[1][1],16);this.b=parseInt(e[1][2]+e[1][2],16)}return e!==null};var o=/^#([a-f0-9]{6})$/i;i.prototype.hex6=function(t){var e=null;if((e=t.match(o))!==null){this.r=parseInt(e[1].substring(0,2),16);this.g=parseInt(e[1].substring(2,4),16);this.b=parseInt(e[1].substring(4,6),16)}return e!==null};var a=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;i.prototype.rgb=function(t){var e=null;if((e=t.match(a))!==null){this.r=Number(e[1]);this.g=Number(e[2]);this.b=Number(e[3])}return e!==null};var s=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;i.prototype.rgba=function(t){var e=null;if((e=t.match(s))!==null){this.r=Number(e[1]);this.g=Number(e[2]);this.b=Number(e[3]);this.a=Number(e[4])}return e!==null};i.prototype.toString=function(){return this.a!==null&&this.a!==1?"rgba("+[this.r,this.g,this.b,this.a].join(",")+")":"rgb("+[this.r,this.g,this.b].join(",")+")"};i.prototype.namedColor=function(t){t=t.toLowerCase();var e=u[t];if(e){this.r=e[0];this.g=e[1];this.b=e[2]}else if(t==="transparent"){this.r=this.g=this.b=this.a=0;return true}return!!e};i.prototype.isColor=true;var u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};e.exports=i},{}],4:[function(t,e,n){var d=t("./support");var a=t("./renderers/canvas");var p=t("./imageloader");var g=t("./nodeparser");var i=t("./nodecontainer");var v=t("./log");var r=t("./utils");var o=t("./clone");var s=t("./proxy").loadUrlDocument;var _=r.getBounds;var f="data-html2canvas-node";var u=0;function h(t,e){var n=u++;e=e||{};if(e.logging){v.options.logging=true;v.options.start=Date.now()}e.async=typeof e.async==="undefined"?true:e.async;e.allowTaint=typeof e.allowTaint==="undefined"?false:e.allowTaint;e.removeContainer=typeof e.removeContainer==="undefined"?true:e.removeContainer;e.javascriptEnabled=typeof e.javascriptEnabled==="undefined"?false:e.javascriptEnabled;e.imageTimeout=typeof e.imageTimeout==="undefined"?1e4:e.imageTimeout;e.renderer=typeof e.renderer==="function"?e.renderer:a;e.strict=!!e.strict;if(typeof t==="string"){if(typeof e.proxy!=="string"){return Promise.reject("Proxy must be used when rendering url")}var i=e.width!=null?e.width:window.innerWidth;var r=e.height!=null?e.height:window.innerHeight;return s(C(t),e.proxy,document,i,r,e).then(function(t){return y(t.contentWindow.document.documentElement,t,e,i,r)})}var o=(t===undefined?[document.documentElement]:t.length?t:[t])[0];o.setAttribute(f+n,n);return c(o.ownerDocument,e,o.ownerDocument.defaultView.innerWidth,o.ownerDocument.defaultView.innerHeight,n).then(function(t){if(typeof e.onrendered==="function"){v("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");e.onrendered(t)}return t})}h.CanvasRenderer=a;h.NodeContainer=i;h.log=v;h.utils=r;var l=typeof document==="undefined"||typeof Object.create!=="function"||typeof document.createElement("canvas").getContext!=="function"?function(){return Promise.reject("No canvas support")}:h;e.exports=l;function c(a,s,u,h,l){return o(a,a,u,h,s,a.defaultView.pageXOffset,a.defaultView.pageYOffset).then(function(t){v("Document cloned");var e=f+l;var n="["+e+"='"+l+"']";a.querySelector(n).removeAttribute(e);var i=t.contentWindow;var r=i.document.querySelector(n);var o=typeof s.onclone==="function"?Promise.resolve(s.onclone(i.document)):Promise.resolve(true);return o.then(function(){return y(r,t,s,u,h)})})}function y(e,n,i,t,r){var o=n.contentWindow;var a=new d(o.document);var s=new p(i,a);var u=_(e);var h=i.type==="view"?t:x(o.document);var l=i.type==="view"?r:w(o.document);var f=new i.renderer(h,l,s,i,document);var c=new g(e,f,a,s,i);return c.ready.then(function(){v("Finished rendering");var t;if(i.type==="view"){t=b(f.canvas,{width:f.canvas.width,height:f.canvas.height,top:0,left:0,x:0,y:0})}else if(e===o.document.body||e===o.document.documentElement||i.canvas!=null){t=f.canvas}else{t=b(f.canvas,{width:i.width!=null?i.width:u.width,height:i.height!=null?i.height:u.height,top:u.top,left:u.left,x:0,y:0})}m(n,i);return t})}function m(t,e){if(e.removeContainer){t.parentNode.removeChild(t);v("Cleaned up container")}}function b(t,e){var n=document.createElement("canvas");var i=Math.min(t.width-1,Math.max(0,e.left));var r=Math.min(t.width,Math.max(1,e.left+e.width));var o=Math.min(t.height-1,Math.max(0,e.top));var a=Math.min(t.height,Math.max(1,e.top+e.height));n.width=e.width;n.height=e.height;var s=r-i;var u=a-o;v("Cropping canvas at:","left:",e.left,"top:",e.top,"width:",s,"height:",u);v("Resulting crop with width",e.width,"and height",e.height,"with x",i,"and y",o);n.getContext("2d").drawImage(t,i,o,s,u,e.x,e.y,s,u);return n}function x(t){return Math.max(Math.max(t.body.scrollWidth,t.documentElement.scrollWidth),Math.max(t.body.offsetWidth,t.documentElement.offsetWidth),Math.max(t.body.clientWidth,t.documentElement.clientWidth))}function w(t){return Math.max(Math.max(t.body.scrollHeight,t.documentElement.scrollHeight),Math.max(t.body.offsetHeight,t.documentElement.offsetHeight),Math.max(t.body.clientHeight,t.documentElement.clientHeight))}function C(t){var e=document.createElement("a");e.href=t;e.href=e.href;return e}},{"./clone":2,"./imageloader":11,"./log":13,"./nodecontainer":14,"./nodeparser":15,"./proxy":16,"./renderers/canvas":20,"./support":22,"./utils":26}],5:[function(t,e,n){var i=t("./log");var r=t("./utils").smallImage;function o(t){this.src=t;i("DummyImageContainer for",t);if(!this.promise||!this.image){i("Initiating DummyImageContainer");o.prototype.image=new Image;var n=this.image;o.prototype.promise=new Promise(function(t,e){n.onload=t;n.onerror=e;n.src=r();if(n.complete===true){t(n)}})}}e.exports=o},{"./log":13,"./utils":26}],6:[function(t,e,n){var u=t("./utils").smallImage;function i(t,e){var n=document.createElement("div"),i=document.createElement("img"),r=document.createElement("span"),o="Hidden Text",a,s;n.style.visibility="hidden";n.style.fontFamily=t;n.style.fontSize=e;n.style.margin=0;n.style.padding=0;document.body.appendChild(n);i.src=u();i.width=1;i.height=1;i.style.margin=0;i.style.padding=0;i.style.verticalAlign="baseline";r.style.fontFamily=t;r.style.fontSize=e;r.style.margin=0;r.style.padding=0;r.appendChild(document.createTextNode(o));n.appendChild(r);n.appendChild(i);a=i.offsetTop-r.offsetTop+1;n.removeChild(r);n.appendChild(document.createTextNode(o));n.style.lineHeight="normal";i.style.verticalAlign="super";s=i.offsetTop-n.offsetTop+1;document.body.removeChild(n);this.baseline=a;this.lineWidth=1;this.middle=s}e.exports=i},{"./utils":26}],7:[function(t,e,n){var i=t("./font");function r(){this.data={}}r.prototype.getMetrics=function(t,e){if(this.data[t+"-"+e]===undefined){this.data[t+"-"+e]=new i(t,e)}return this.data[t+"-"+e]};e.exports=r},{"./font":6}],8:[function(o,t,e){var n=o("./utils");var a=n.getBounds;var r=o("./proxy").loadUrlDocument;function i(e,t,n){this.image=null;this.src=e;var i=this;var r=a(e);this.promise=(!t?this.proxyLoad(n.proxy,r,n):new Promise(function(t){if(e.contentWindow.document.URL==="about:blank"||e.contentWindow.document.documentElement==null){e.contentWindow.onload=e.onload=function(){t(e)}}else{t(e)}})).then(function(t){var e=o("./core");return e(t.contentWindow.document.documentElement,{type:"view",width:t.width,height:t.height,proxy:n.proxy,javascriptEnabled:n.javascriptEnabled,removeContainer:n.removeContainer,allowTaint:n.allowTaint,imageTimeout:n.imageTimeout/2})}).then(function(t){return i.image=t})}i.prototype.proxyLoad=function(t,e,n){var i=this.src;return r(i.src,t,i.ownerDocument,e.width,e.height,n)};t.exports=i},{"./core":4,"./proxy":16,"./utils":26}],9:[function(t,e,n){function i(t){this.src=t.value;this.colorStops=[];this.type=null;this.x0=.5;this.y0=.5;this.x1=.5;this.y1=.5;this.promise=Promise.resolve(true)}i.TYPES={LINEAR:1,RADIAL:2};i.REGEXP_COLORSTOP=/^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;e.exports=i},{}],10:[function(t,e,n){function i(n,i){this.src=n;this.image=new Image;var r=this;this.tainted=null;this.promise=new Promise(function(t,e){r.image.onload=t;r.image.onerror=e;if(i){r.image.crossOrigin="anonymous"}r.image.src=n;if(r.image.complete===true){t(r.image)}})}e.exports=i},{}],11:[function(t,e,n){var o=t("./log");var i=t("./imagecontainer");var r=t("./dummyimagecontainer");var a=t("./proxyimagecontainer");var s=t("./framecontainer");var u=t("./svgcontainer");var h=t("./svgnodecontainer");var l=t("./lineargradientcontainer");var f=t("./webkitgradientcontainer");var c=t("./utils").bind;function d(t,e){this.link=null;this.options=t;this.support=e;this.origin=this.getOrigin(window.location.href)}d.prototype.findImages=function(t){var e=[];t.reduce(function(t,e){switch(e.node.nodeName){case"IMG":return t.concat([{args:[e.node.src],method:"url"}]);case"svg":case"IFRAME":return t.concat([{args:[e.node],method:e.node.nodeName}])}return t},[]).forEach(this.addImage(e,this.loadImage),this);return e};d.prototype.findBackgroundImage=function(t,e){e.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(t,this.loadImage),this);return t};d.prototype.addImage=function(n,i){return function(e){e.args.forEach(function(t){if(!this.imageExists(n,t)){n.splice(0,0,i.call(this,e));o("Added image #"+n.length,typeof t==="string"?t.substring(0,100):t)}},this)}};d.prototype.hasImageBackground=function(t){return t.method!=="none"};d.prototype.loadImage=function(t){if(t.method==="url"){var e=t.args[0];if(this.isSVG(e)&&!this.support.svg&&!this.options.allowTaint){return new u(e)}else if(e.match(/data:image\/.*;base64,/i)){return new i(e.replace(/url\(['"]{0,}|['"]{0,}\)$/gi,""),false)}else if(this.isSameOrigin(e)||this.options.allowTaint===true||this.isSVG(e)){return new i(e,false)}else if(this.support.cors&&!this.options.allowTaint&&this.options.useCORS){return new i(e,true)}else if(this.options.proxy){return new a(e,this.options.proxy)}else{return new r(e)}}else if(t.method==="linear-gradient"){return new l(t)}else if(t.method==="gradient"){return new f(t)}else if(t.method==="svg"){return new h(t.args[0],this.support.svg)}else if(t.method==="IFRAME"){return new s(t.args[0],this.isSameOrigin(t.args[0].src),this.options)}else{return new r(t)}};d.prototype.isSVG=function(t){return t.substring(t.length-3).toLowerCase()==="svg"||u.prototype.isInline(t)};d.prototype.imageExists=function(t,e){return t.some(function(t){return t.src===e})};d.prototype.isSameOrigin=function(t){return this.getOrigin(t)===this.origin};d.prototype.getOrigin=function(t){var e=this.link||(this.link=document.createElement("a"));e.href=t;e.href=e.href;return e.protocol+e.hostname+e.port};d.prototype.getPromise=function(e){return this.timeout(e,this.options.imageTimeout)["catch"](function(){var t=new r(e.src);return t.promise.then(function(t){e.image=t})})};d.prototype.get=function(e){var n=null;return this.images.some(function(t){return(n=t).src===e})?n:null};d.prototype.fetch=function(t){this.images=t.reduce(c(this.findBackgroundImage,this),this.findImages(t));this.images.forEach(function(e,n){e.promise.then(function(){o("Succesfully loaded image #"+(n+1),e)},function(t){o("Failed loading image #"+(n+1),e,t)})});this.ready=Promise.all(this.images.map(this.getPromise,this));o("Finished searching images");return this};d.prototype.timeout=function(n,i){var r;var t=Promise.race([n.promise,new Promise(function(t,e){r=setTimeout(function(){o("Timed out loading image",n);e(n)},i)})]).then(function(t){clearTimeout(r);return t});t["catch"](function(){clearTimeout(r)});return t};e.exports=d},{"./dummyimagecontainer":5,"./framecontainer":8,"./imagecontainer":10,"./lineargradientcontainer":12,"./log":13,"./proxyimagecontainer":17,"./svgcontainer":23,"./svgnodecontainer":24,"./utils":26,"./webkitgradientcontainer":27}],12:[function(t,e,n){var r=t("./gradientcontainer");var o=t("./color");function i(t){r.apply(this,arguments);this.type=r.TYPES.LINEAR;var e=i.REGEXP_DIRECTION.test(t.args[0])||!r.REGEXP_COLORSTOP.test(t.args[0]);if(e){t.args[0].split(/\s+/).reverse().forEach(function(t,e){switch(t){case"left":this.x0=0;this.x1=1;break;case"top":this.y0=0;this.y1=1;break;case"right":this.x0=1;this.x1=0;break;case"bottom":this.y0=1;this.y1=0;break;case"to":var n=this.y0;var i=this.x0;this.y0=this.y1;this.x0=this.x1;this.x1=i;this.y1=n;break;case"center":break;default:var r=parseFloat(t,10)*.01;if(isNaN(r)){break}if(e===0){this.y0=r;this.y1=1-this.y0}else{this.x0=r;this.x1=1-this.x0}break}},this)}else{this.y0=0;this.y1=1}this.colorStops=t.args.slice(e?1:0).map(function(t){var e=t.match(r.REGEXP_COLORSTOP);var n=+e[2];var i=n===0?"%":e[3];return{color:new o(e[1]),stop:i==="%"?n/100:null}});if(this.colorStops[0].stop===null){this.colorStops[0].stop=0}if(this.colorStops[this.colorStops.length-1].stop===null){this.colorStops[this.colorStops.length-1].stop=1}this.colorStops.forEach(function(n,i){if(n.stop===null){this.colorStops.slice(i).some(function(t,e){if(t.stop!==null){n.stop=(t.stop-this.colorStops[i-1].stop)/(e+1)+this.colorStops[i-1].stop;return true}else{return false}},this)}},this)}i.prototype=Object.create(r.prototype);i.REGEXP_DIRECTION=/^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;e.exports=i},{"./color":3,"./gradientcontainer":9}],13:[function(t,e,n){var i=function(){if(i.options.logging&&window.console&&window.console.log){Function.prototype.bind.call(window.console.log,window.console).apply(window.console,[Date.now()-i.options.start+"ms","html2canvas:"].concat([].slice.call(arguments,0)))}};i.options={logging:false};e.exports=i},{}],14:[function(t,e,n){var a=t("./color");var i=t("./utils");var r=i.getBounds;var o=i.parseBackgrounds;var s=i.offsetBounds;function u(t,e){this.node=t;this.parent=e;this.stack=null;this.bounds=null;this.borders=null;this.clip=[];this.backgroundClip=[];this.offsetBounds=null;this.visible=null;this.computedStyles=null;this.colors={};this.styles={};this.backgroundImages=null;this.transformData=null;this.transformMatrix=null;this.isPseudoElement=false;this.opacity=null}u.prototype.cloneTo=function(t){t.visible=this.visible;t.borders=this.borders;t.bounds=this.bounds;t.clip=this.clip;t.backgroundClip=this.backgroundClip;t.computedStyles=this.computedStyles;t.styles=this.styles;t.backgroundImages=this.backgroundImages;t.opacity=this.opacity};u.prototype.getOpacity=function(){return this.opacity===null?this.opacity=this.cssFloat("opacity"):this.opacity};u.prototype.assignStack=function(t){this.stack=t;t.children.push(this)};u.prototype.isElementVisible=function(){return this.node.nodeType===Node.TEXT_NODE?this.parent.visible:this.css("display")!=="none"&&this.css("visibility")!=="hidden"&&!this.node.hasAttribute("data-html2canvas-ignore")&&(this.node.nodeName!=="INPUT"||this.node.getAttribute("type")!=="hidden")};u.prototype.css=function(t){if(!this.computedStyles){this.computedStyles=this.isPseudoElement?this.parent.computedStyle(this.before?":before":":after"):this.computedStyle(null)}return this.styles[t]||(this.styles[t]=this.computedStyles[t])};u.prototype.prefixedCss=function(e){var t=["webkit","moz","ms","o"];var n=this.css(e);if(n===undefined){t.some(function(t){n=this.css(t+e.substr(0,1).toUpperCase()+e.substr(1));return n!==undefined},this)}return n===undefined?null:n};u.prototype.computedStyle=function(t){return this.node.ownerDocument.defaultView.getComputedStyle(this.node,t)};u.prototype.cssInt=function(t){var e=parseInt(this.css(t),10);return isNaN(e)?0:e};u.prototype.color=function(t){return this.colors[t]||(this.colors[t]=new a(this.css(t)))};u.prototype.cssFloat=function(t){var e=parseFloat(this.css(t));return isNaN(e)?0:e};u.prototype.fontWeight=function(){var t=this.css("fontWeight");switch(parseInt(t,10)){case 401:t="bold";break;case 400:t="normal";break}return t};u.prototype.parseClip=function(){var t=this.css("clip").match(this.CLIP);if(t){return{top:parseInt(t[1],10),right:parseInt(t[2],10),bottom:parseInt(t[3],10),left:parseInt(t[4],10)}}return null};u.prototype.parseBackgroundImages=function(){return this.backgroundImages||(this.backgroundImages=o(this.css("backgroundImage")))};u.prototype.cssList=function(t,e){var n=(this.css(t)||"").split(",");n=n[e||0]||n[0]||"auto";n=n.trim().split(" ");if(n.length===1){n=[n[0],f(n[0])?"auto":n[0]]}return n};u.prototype.parseBackgroundSize=function(t,e,n){var i=this.cssList("backgroundSize",n);var r,o;if(f(i[0])){r=t.width*parseFloat(i[0])/100}else if(/contain|cover/.test(i[0])){var a=t.width/t.height,s=e.width/e.height;return a0){this.renderIndex=0;this.asyncRenderer(this.renderQueue,t)}else{t()}},this))},this))}r.prototype.calculateOverflowClips=function(){this.nodes.forEach(function(t){if(H(t)){if(V(t)){t.appendToDOM()}t.borders=this.parseBorders(t);var e=t.css("overflow")==="hidden"?[t.borders.clip]:[];var n=t.parseClip();if(n&&["absolute","fixed"].indexOf(t.css("position"))!==-1){e.push([["rect",t.bounds.left+n.left,t.bounds.top+n.top,n.right-n.left,n.bottom-n.top]])}t.clip=o(t)?t.parent.clip.concat(e):e;t.backgroundClip=t.css("overflow")!=="hidden"?t.clip.concat([t.borders.clip]):t.clip;if(V(t)){t.cleanDOM()}}else if(U(t)){t.clip=o(t)?t.parent.clip:[]}if(!V(t)){t.bounds=null}},this)};function o(t){return t.parent&&t.parent.clip.length}r.prototype.asyncRenderer=function(t,e,n){n=n||Date.now();this.paint(t[this.renderIndex++]);if(t.length===this.renderIndex){e()}else if(n+20>Date.now()){this.asyncRenderer(t,e,n)}else{setTimeout(g(function(){this.asyncRenderer(t,e)},this),0)}};r.prototype.createPseudoHideStyles=function(t){this.createStyles(t,"."+f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+':before { content: "" !important; display: none !important; }'+"."+f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER+':after { content: "" !important; display: none !important; }')};r.prototype.disableAnimations=function(t){this.createStyles(t,"* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; "+"-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}")};r.prototype.createStyles=function(t,e){var n=t.createElement("style");n.innerHTML=e;t.body.appendChild(n)};r.prototype.getPseudoElements=function(t){var e=[[t]];if(t.node.nodeType===Node.ELEMENT_NODE){var n=this.getPseudoElement(t,":before");var i=this.getPseudoElement(t,":after");if(n){e.push(n)}if(i){e.push(i)}}return $(e)};function y(t){return t.replace(/(\-[a-z])/g,function(t){return t.toUpperCase().replace("-","")})}r.prototype.getPseudoElement=function(t,e){var n=t.computedStyle(e);if(!n||!n.content||n.content==="none"||n.content==="-moz-alt-content"||n.display==="none"){return null}var i=Q(n.content);var r=i.substr(0,3)==="url";var o=document.createElement(r?"img":"html2canvaspseudoelement");var a=new f(o,t,e);for(var s=n.length-1;s>=0;s--){var u=y(n.item(s));o.style[u]=n[u]}o.className=f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE+" "+f.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;if(r){o.src=v(i)[0].args[0];return[a]}else{var h=document.createTextNode(i);o.appendChild(h);return[a,new l(h,a)]}};r.prototype.getChildren=function(n){return $([].filter.call(n.node.childNodes,O).map(function(t){var e=[t.nodeType===Node.TEXT_NODE?new l(t,n):new h(t,n)].filter(Y);return t.nodeType===Node.ELEMENT_NODE&&e.length&&t.tagName!=="TEXTAREA"?e[0].isElementVisible()?e.concat(this.getChildren(e[0])):[]:e},this))};r.prototype.newStackingContext=function(t,e){var n=new p(e,t.getOpacity(),t.node,t.parent);t.cloneTo(n);var i=e?n.getParentStack(this):n.parent.stack;i.contexts.push(n);t.stack=n};r.prototype.createStackingContexts=function(){this.nodes.forEach(function(t){if(H(t)&&(this.isRootElement(t)||q(t)||F(t)||this.isBodyWithTransparentRoot(t)||t.hasTransform())){this.newStackingContext(t,true)}else if(H(t)&&(R(t)&&T(t)||L(t)||I(t))){this.newStackingContext(t,false)}else{t.assignStack(t.parent.stack)}},this)};r.prototype.isBodyWithTransparentRoot=function(t){return t.node.nodeName==="BODY"&&t.parent.color("backgroundColor").isTransparent()};r.prototype.isRootElement=function(t){return t.parent===null};r.prototype.sortStackingContexts=function(t){t.contexts.sort(W(t.contexts.slice(0)));t.contexts.forEach(this.sortStackingContexts,this)};r.prototype.parseTextBounds=function(a){return function(t,e,n){if(a.parent.css("textDecoration").substr(0,4)!=="none"||t.trim().length!==0){if(this.support.rangeBounds&&!a.parent.hasTransform()){var i=n.slice(0,e).join("").length;return this.getRangeBounds(a.node,i,t.length)}else if(a.node&&typeof a.node.data==="string"){var r=a.node.splitText(t.length);var o=this.getWrapperBounds(a.node,a.parent.hasTransform());a.node=r;return o}}else if(!this.support.rangeBounds||a.parent.hasTransform()){a.node=a.node.splitText(t.length)}return{}}};r.prototype.getWrapperBounds=function(t,e){var n=t.ownerDocument.createElement("html2canvaswrapper");var i=t.parentNode,r=t.cloneNode(true);n.appendChild(t.cloneNode(true));i.replaceChild(n,t);var o=e?_(n):a(n);i.replaceChild(r,n);return o};r.prototype.getRangeBounds=function(t,e,n){var i=this.range||(this.range=t.ownerDocument.createRange());i.setStart(t,e);i.setEnd(t,e+n);return i.getBoundingClientRect()};function m(){}r.prototype.parse=function(t){var e=t.contexts.filter(k);var n=t.children.filter(H);var i=n.filter(j(I));var r=i.filter(j(R)).filter(j(B));var o=n.filter(j(R)).filter(I);var a=i.filter(j(R)).filter(B);var s=t.contexts.concat(i.filter(R)).filter(T);var u=t.children.filter(U).filter(N);var h=t.contexts.filter(M);e.concat(r).concat(o).concat(a).concat(s).concat(u).concat(h).forEach(function(t){this.renderQueue.push(t);if(D(t)){this.parse(t);this.renderQueue.push(new m)}},this)};r.prototype.paint=function(t){try{if(t instanceof m){this.renderer.ctx.restore()}else if(U(t)){if(V(t.parent)){t.parent.appendToDOM()}this.paintText(t);if(V(t.parent)){t.parent.cleanDOM()}}else{this.paintNode(t)}}catch(t){s(t);if(this.options.strict){throw t}}};r.prototype.paintNode=function(t){if(D(t)){this.renderer.setOpacity(t.opacity);this.renderer.ctx.save();if(t.hasTransform()){this.renderer.setTransform(t.parseTransform())}}if(t.node.nodeName==="INPUT"&&t.node.type==="checkbox"){this.paintCheckbox(t)}else if(t.node.nodeName==="INPUT"&&t.node.type==="radio"){this.paintRadio(t)}else{this.paintElement(t)}};r.prototype.paintElement=function(n){var i=n.parseBounds();this.renderer.clip(n.backgroundClip,function(){this.renderer.renderBackground(n,i,n.borders.borders.map(G))},this);this.renderer.clip(n.clip,function(){this.renderer.renderBorders(n.borders.borders)},this);this.renderer.clip(n.backgroundClip,function(){switch(n.node.nodeName){case"svg":case"IFRAME":var t=this.images.get(n.node);if(t){this.renderer.renderImage(n,i,n.borders,t)}else{s("Error loading <"+n.node.nodeName+">",n.node)}break;case"IMG":var e=this.images.get(n.node.src);if(e){this.renderer.renderImage(n,i,n.borders,e)}else{s("Error loading ",n.node.src)}break;case"CANVAS":this.renderer.renderImage(n,i,n.borders,{image:n.node});break;case"SELECT":case"INPUT":case"TEXTAREA":this.paintFormValue(n);break}},this)};r.prototype.paintCheckbox=function(t){var e=t.parseBounds();var n=Math.min(e.width,e.height);var i={width:n-1,height:n-1,top:e.top,left:e.left};var r=[3,3];var o=[r,r,r,r];var a=[1,1,1,1].map(function(t){return{color:new d("#A5A5A5"),width:t}});var s=C(i,o,a);this.renderer.clip(t.backgroundClip,function(){this.renderer.rectangle(i.left+1,i.top+1,i.width-2,i.height-2,new d("#DEDEDE"));this.renderer.renderBorders(x(a,i,s,o));if(t.node.checked){this.renderer.font(new d("#424242"),"normal","normal","bold",n-3+"px","arial");this.renderer.text("✔",i.left+n/6,i.top+n-1)}},this)};r.prototype.paintRadio=function(t){var e=t.parseBounds();var n=Math.min(e.width,e.height)-2;this.renderer.clip(t.backgroundClip,function(){this.renderer.circleStroke(e.left+1,e.top+1,n,new d("#DEDEDE"),1,new d("#A5A5A5"));if(t.node.checked){this.renderer.circle(Math.ceil(e.left+n/4)+1,Math.ceil(e.top+n/4)+1,Math.floor(n/2),new d("#424242"))}},this)};r.prototype.paintFormValue=function(e){var t=e.getValue();if(t.length>0){var n=e.node.ownerDocument;var i=n.createElement("html2canvaswrapper");var r=["lineHeight","textAlign","fontFamily","fontWeight","fontSize","color","paddingLeft","paddingTop","paddingRight","paddingBottom","width","height","borderLeftStyle","borderTopStyle","borderLeftWidth","borderTopWidth","boxSizing","whiteSpace","wordWrap"];r.forEach(function(t){try{i.style[t]=e.css(t)}catch(t){s("html2canvas: Parse: Exception caught in renderFormValue: "+t.message)}});var o=e.parseBounds();i.style.position="fixed";i.style.left=o.left+"px";i.style.top=o.top+"px";i.textContent=t;n.body.appendChild(i);this.paintText(new l(i.firstChild,e));n.body.removeChild(i)}};r.prototype.paintText=function(n){n.applyTextTransform();var t=u.ucs2.decode(n.node.data);var i=(!this.options.letterRendering||P(n))&&!J(n.node.data)?Z(t):t.map(function(t){return u.ucs2.encode([t])});var e=n.parent.fontWeight();var r=n.parent.css("fontSize");var o=n.parent.css("fontFamily");var a=n.parent.parseTextShadows();this.renderer.font(n.parent.color("color"),n.parent.css("fontStyle"),n.parent.css("fontVariant"),e,r,o);if(a.length){this.renderer.fontShadow(a[0].color,a[0].offsetX,a[0].offsetY,a[0].blur)}else{this.renderer.clearShadow()}this.renderer.clip(n.parent.clip,function(){i.map(this.parseTextBounds(n),this).forEach(function(t,e){if(t){this.renderer.text(i[e],t.left,t.bottom);this.renderTextDecoration(n.parent,t,this.fontMetrics.getMetrics(o,r))}},this)},this)};r.prototype.renderTextDecoration=function(t,e,n){switch(t.css("textDecoration").split(" ")[0]){case"underline":this.renderer.rectangle(e.left,Math.round(e.top+n.baseline+n.lineWidth),e.width,1,t.color("color"));break;case"overline":this.renderer.rectangle(e.left,Math.round(e.top),e.width,1,t.color("color"));break;case"line-through":this.renderer.rectangle(e.left,Math.ceil(e.top+n.middle+n.lineWidth),e.width,1,t.color("color"));break}};var b={inset:[["darken",.6],["darken",.1],["darken",.1],["darken",.6]]};r.prototype.parseBorders=function(o){var t=o.parseBounds();var e=z(o);var n=["Top","Right","Bottom","Left"].map(function(t,e){var n=o.css("border"+t+"Style");var i=o.color("border"+t+"Color");if(n==="inset"&&i.isBlack()){i=new d([255,255,255,i.a])}var r=b[n]?b[n][e]:null;return{width:o.cssInt("border"+t+"Width"),color:r?i[r[0]](r[1]):i,args:null}});var i=C(t,e,n);return{clip:this.parseBackgroundClip(o,i,n,e,t),borders:x(n,t,i,e)}};function x(a,s,u,h){return a.map(function(t,e){if(t.width>0){var n=s.left;var i=s.top;var r=s.width;var o=s.height-a[2].width;switch(e){case 0:o=a[0].width;t.args=S({c1:[n,i],c2:[n+r,i],c3:[n+r-a[1].width,i+o],c4:[n+a[3].width,i+o]},h[0],h[1],u.topLeftOuter,u.topLeftInner,u.topRightOuter,u.topRightInner);break;case 1:n=s.left+s.width-a[1].width;r=a[1].width;t.args=S({c1:[n+r,i],c2:[n+r,i+o+a[2].width],c3:[n,i+o],c4:[n,i+a[0].width]},h[1],h[2],u.topRightOuter,u.topRightInner,u.bottomRightOuter,u.bottomRightInner);break;case 2:i=i+s.height-a[2].width;o=a[2].width;t.args=S({c1:[n+r,i+o],c2:[n,i+o],c3:[n+a[3].width,i],c4:[n+r-a[3].width,i]},h[2],h[3],u.bottomRightOuter,u.bottomRightInner,u.bottomLeftOuter,u.bottomLeftInner);break;case 3:r=a[3].width;t.args=S({c1:[n,i+o+a[2].width],c2:[n,i],c3:[n+r,i+a[0].width],c4:[n+r,i+o]},h[3],h[0],u.bottomLeftOuter,u.bottomLeftInner,u.topLeftOuter,u.topLeftInner);break}}return t})}r.prototype.parseBackgroundClip=function(t,e,n,i,r){var o=t.css("backgroundClip"),a=[];switch(o){case"content-box":case"padding-box":A(a,i[0],i[1],e.topLeftInner,e.topRightInner,r.left+n[3].width,r.top+n[0].width);A(a,i[1],i[2],e.topRightInner,e.bottomRightInner,r.left+r.width-n[1].width,r.top+n[0].width);A(a,i[2],i[3],e.bottomRightInner,e.bottomLeftInner,r.left+r.width-n[1].width,r.top+r.height-n[2].width);A(a,i[3],i[0],e.bottomLeftInner,e.topLeftInner,r.left+n[3].width,r.top+r.height-n[2].width);break;default:A(a,i[0],i[1],e.topLeftOuter,e.topRightOuter,r.left,r.top);A(a,i[1],i[2],e.topRightOuter,e.bottomRightOuter,r.left+r.width,r.top);A(a,i[2],i[3],e.bottomRightOuter,e.bottomLeftOuter,r.left+r.width,r.top+r.height);A(a,i[3],i[0],e.bottomLeftOuter,e.topLeftOuter,r.left,r.top+r.height);break}return a};function w(t,e,n,i){var r=4*((Math.sqrt(2)-1)/3);var o=n*r,a=i*r,s=t+n,u=e+i;return{topLeft:E({x:t,y:u},{x:t,y:u-a},{x:s-o,y:e},{x:s,y:e}),topRight:E({x:t,y:e},{x:t+o,y:e},{x:s,y:u-a},{x:s,y:u}),bottomRight:E({x:s,y:e},{x:s,y:e+a},{x:t+o,y:u},{x:t,y:u}),bottomLeft:E({x:s,y:u},{x:s-o,y:u},{x:t,y:e+a},{x:t,y:e})}}function C(t,e,n){var i=t.left,r=t.top,o=t.width,a=t.height,s=e[0][0]o+n[3].width?0:h-n[3].width,l-n[0].width).topRight.subdivide(.5),bottomRightOuter:w(i+_,r+v,f,c).bottomRight.subdivide(.5),bottomRightInner:w(i+Math.min(_,o-n[3].width),r+Math.min(v,a+n[0].width),Math.max(0,f-n[1].width),c-n[2].width).bottomRight.subdivide(.5),bottomLeftOuter:w(i,r+y,d,p).bottomLeft.subdivide(.5),bottomLeftInner:w(i+n[3].width,r+y,Math.max(0,d-n[3].width),p-n[2].width).bottomLeft.subdivide(.5)}}function E(s,u,h,l){var f=function(t,e,n){return{x:t.x+(e.x-t.x)*n,y:t.y+(e.y-t.y)*n}};return{start:s,startControl:u,endControl:h,end:l,subdivide:function(t){var e=f(s,u,t),n=f(u,h,t),i=f(h,l,t),r=f(e,n,t),o=f(n,i,t),a=f(r,o,t);return[E(s,e,r,a),E(a,o,i,l)]},curveTo:function(t){t.push(["bezierCurve",u.x,u.y,h.x,h.y,l.x,l.y])},curveToReversed:function(t){t.push(["bezierCurve",h.x,h.y,u.x,u.y,s.x,s.y])}}}function S(t,e,n,i,r,o,a){var s=[];if(e[0]>0||e[1]>0){s.push(["line",i[1].start.x,i[1].start.y]);i[1].curveTo(s)}else{s.push(["line",t.c1[0],t.c1[1]])}if(n[0]>0||n[1]>0){s.push(["line",o[0].start.x,o[0].start.y]);o[0].curveTo(s);s.push(["line",a[0].end.x,a[0].end.y]);a[0].curveToReversed(s)}else{s.push(["line",t.c2[0],t.c2[1]]);s.push(["line",t.c3[0],t.c3[1]])}if(e[0]>0||e[1]>0){s.push(["line",r[1].end.x,r[1].end.y]);r[1].curveToReversed(s)}else{s.push(["line",t.c4[0],t.c4[1]])}return s}function A(t,e,n,i,r,o,a){if(e[0]>0||e[1]>0){t.push(["line",i[0].start.x,i[0].start.y]);i[0].curveTo(t);i[1].curveTo(t)}else{t.push(["line",o,a])}if(n[0]>0||n[1]>0){t.push(["line",r[0].start.x,r[0].start.y])}}function k(t){return t.cssInt("zIndex")<0}function M(t){return t.cssInt("zIndex")>0}function T(t){return t.cssInt("zIndex")===0}function B(t){return["inline","inline-block","inline-table"].indexOf(t.css("display"))!==-1}function D(t){return t instanceof p}function N(t){return t.node.data.trim().length>0}function P(t){return/^(normal|none|0px)$/.test(t.parent.css("letterSpacing"))}function z(i){return["TopLeft","TopRight","BottomRight","BottomLeft"].map(function(t){var e=i.css("border"+t+"Radius");var n=e.split(" ");if(n.length<=1){n[1]=n[0]}return n.map(X)})}function O(t){return t.nodeType===Node.TEXT_NODE||t.nodeType===Node.ELEMENT_NODE}function F(t){var e=t.css("position");var n=["absolute","relative","fixed"].indexOf(e)!==-1?t.css("zIndex"):"auto";return n!=="auto"}function R(t){return t.css("position")!=="static"}function I(t){return t.css("float")!=="none"}function L(t){return["inline-block","inline-table"].indexOf(t.css("display"))!==-1}function j(t){var e=this;return function(){return!t.apply(e,arguments)}}function H(t){return t.node.nodeType===Node.ELEMENT_NODE}function V(t){return t.isPseudoElement===true}function U(t){return t.node.nodeType===Node.TEXT_NODE}function W(n){return function(t,e){return t.cssInt("zIndex")+n.indexOf(t)/n.length-(e.cssInt("zIndex")+n.indexOf(e)/n.length)}}function q(t){return t.getOpacity()<1}function X(t){return parseInt(t,10)}function G(t){return t.width}function Y(t){return t.node.nodeType!==Node.ELEMENT_NODE||["SCRIPT","HEAD","TITLE","OBJECT","BR","OPTION"].indexOf(t.node.nodeName)===-1}function $(t){return[].concat.apply([],t)}function Q(t){var e=t.substr(0,1);return e===t.substr(t.length-1)&&e.match(/'|"/)?t.substr(1,t.length-2):t}function Z(t){var e=[],n=0,i=false,r;while(t.length){if(K(t[n])===i){r=t.splice(0,n);if(r.length){e.push(u.ucs2.encode(r))}i=!i;n=0}else{n++}if(n>=t.length){r=t.splice(0,n);if(r.length){e.push(u.ucs2.encode(r))}}}return e}function K(t){return[32,13,10,9,45].indexOf(t)!==-1}function J(t){return/[^\u0000-\u00ff]/.test(t)}e.exports=r},{"./color":3,"./fontmetrics":7,"./log":13,"./nodecontainer":14,"./pseudoelementcontainer":18,"./stackingcontext":21,"./textcontainer":25,"./utils":26,punycode:1}],16:[function(t,e,n){var a=t("./xhr");var i=t("./utils");var s=t("./log");var u=t("./clone");var h=i.decode64;function l(t,e,n){var i="withCredentials"in new XMLHttpRequest;if(!e){return Promise.reject("No proxy configured")}var r=c(i);var o=d(e,t,r);return i?a(o):f(n,o,r).then(function(t){return h(t.content)})}var r=0;function o(t,e,n){var i="crossOrigin"in new Image;var r=c(i);var o=d(e,t,r);return i?Promise.resolve(o):f(n,o,r).then(function(t){return"data:"+t.type+";base64,"+t.content})}function f(r,o,a){return new Promise(function(e,n){var t=r.createElement("script");var i=function(){delete window.html2canvas.proxy[a];r.body.removeChild(t)};window.html2canvas.proxy[a]=function(t){i();e(t)};t.src=o;t.onerror=function(t){i();n(t)};r.body.appendChild(t)})}function c(t){return!t?"html2canvas_"+Date.now()+"_"+ ++r+"_"+Math.round(Math.random()*1e5):""}function d(t,e,n){return t+"?url="+encodeURIComponent(e)+(n.length?"&callback=html2canvas.proxy."+n:"")}function p(o){return function(e){var t=new DOMParser,n;try{n=t.parseFromString(e,"text/html")}catch(t){s("DOMParser not supported, falling back to createHTMLDocument");n=document.implementation.createHTMLDocument("");try{n.open();n.write(e);n.close()}catch(t){s("createHTMLDocument write not supported, falling back to document.body.innerHTML");n.body.innerHTML=e}}var i=n.querySelector("base");if(!i||!i.href.host){var r=n.createElement("base");r.href=o;n.head.insertBefore(r,n.head.firstChild)}return n}}function g(t,e,n,i,r,o){return new l(t,e,window.document).then(p(t)).then(function(t){return u(t,n,i,r,o,0,0)})}n.Proxy=l;n.ProxyURL=o;n.loadUrlDocument=g},{"./clone":2,"./log":13,"./utils":26,"./xhr":28}],17:[function(t,e,n){var o=t("./proxy").ProxyURL;function i(n,i){var t=document.createElement("a");t.href=n;n=t.href;this.src=n;this.image=new Image;var r=this;this.promise=new Promise(function(t,e){r.image.crossOrigin="Anonymous";r.image.onload=t;r.image.onerror=e;new o(n,i,document).then(function(t){r.image.src=t})["catch"](e)})}e.exports=i},{"./proxy":16}],18:[function(t,e,n){var i=t("./nodecontainer");function r(t,e,n){i.call(this,t,e);this.isPseudoElement=true;this.before=n===":before"}r.prototype.cloneTo=function(t){r.prototype.cloneTo.call(this,t);t.isPseudoElement=true;t.before=this.before};r.prototype=Object.create(i.prototype);r.prototype.appendToDOM=function(){if(this.before){this.parent.node.insertBefore(this.node,this.parent.node.firstChild)}else{this.parent.node.appendChild(this.node)}this.parent.node.className+=" "+this.getHideClass()};r.prototype.cleanDOM=function(){this.node.parentNode.removeChild(this.node);this.parent.node.className=this.parent.node.className.replace(this.getHideClass(),"")};r.prototype.getHideClass=function(){return this["PSEUDO_HIDE_ELEMENT_CLASS_"+(this.before?"BEFORE":"AFTER")]};r.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE="___html2canvas___pseudoelement_before";r.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER="___html2canvas___pseudoelement_after";e.exports=r},{"./nodecontainer":14}],19:[function(t,e,n){var u=t("./log");function i(t,e,n,i,r){this.width=t;this.height=e;this.images=n;this.options=i;this.document=r}i.prototype.renderImage=function(t,e,n,i){var r=t.cssInt("paddingLeft"),o=t.cssInt("paddingTop"),a=t.cssInt("paddingRight"),s=t.cssInt("paddingBottom"),u=n.borders;var h=e.width-(u[1].width+u[3].width+r+a);var l=e.height-(u[0].width+u[2].width+o+s);this.drawImage(i,0,0,i.image.width||h,i.image.height||l,e.left+r+u[3].width,e.top+o+u[0].width,h,l)};i.prototype.renderBackground=function(t,e,n){if(e.height>0&&e.width>0){this.renderBackgroundColor(t,e);this.renderBackgroundImage(t,e,n)}};i.prototype.renderBackgroundColor=function(t,e){var n=t.color("backgroundColor");if(!n.isTransparent()){this.rectangle(e.left,e.top,e.width,e.height,n)}};i.prototype.renderBorders=function(t){t.forEach(this.renderBorder,this)};i.prototype.renderBorder=function(t){if(!t.color.isTransparent()&&t.args!==null){this.drawShape(t.args,t.color)}};i.prototype.renderBackgroundImage=function(o,a,s){var t=o.parseBackgroundImages();t.reverse().forEach(function(t,e,n){switch(t.method){case"url":var i=this.images.get(t.args[0]);if(i){this.renderBackgroundRepeating(o,a,i,n.length-(e+1),s)}else{u("Error loading background-image",t.args[0])}break;case"linear-gradient":case"gradient":var r=this.images.get(t.value);if(r){this.renderBackgroundGradient(r,a,s)}else{u("Error loading background-image",t.args[0])}break;case"none":break;default:u("Unknown background-image type",t.args[0])}},this)};i.prototype.renderBackgroundRepeating=function(t,e,n,i,r){var o=t.parseBackgroundSize(e,n.image,i);var a=t.parseBackgroundPosition(e,n.image,i,o);var s=t.parseBackgroundRepeat(i);switch(s){case"repeat-x":case"repeat no-repeat":this.backgroundRepeatShape(n,a,o,e,e.left+r[3],e.top+a.top+r[0],99999,o.height,r);break;case"repeat-y":case"no-repeat repeat":this.backgroundRepeatShape(n,a,o,e,e.left+a.left+r[3],e.top+r[0],o.width,99999,r);break;case"no-repeat":this.backgroundRepeatShape(n,a,o,e,e.left+a.left+r[3],e.top+a.top+r[0],o.width,o.height,r);break;default:this.renderBackgroundRepeat(n,a,o,{top:e.top,left:e.left},r[3],r[0]);break}};e.exports=i},{"./log":13}],20:[function(t,e,n){var i=t("../renderer");var r=t("../lineargradientcontainer");var o=t("../log");function a(t,e){i.apply(this,arguments);this.canvas=this.options.canvas||this.document.createElement("canvas");if(!this.options.canvas){this.canvas.width=t;this.canvas.height=e}this.ctx=this.canvas.getContext("2d");this.taintCtx=this.document.createElement("canvas").getContext("2d");this.ctx.textBaseline="bottom";this.variables={};o("Initialized CanvasRenderer with size",t,"x",e)}a.prototype=Object.create(i.prototype);a.prototype.setFillStyle=function(t){this.ctx.fillStyle=typeof t==="object"&&!!t.isColor?t.toString():t;return this.ctx};a.prototype.rectangle=function(t,e,n,i,r){this.setFillStyle(r).fillRect(t,e,n,i)};a.prototype.circle=function(t,e,n,i){this.setFillStyle(i);this.ctx.beginPath();this.ctx.arc(t+n/2,e+n/2,n/2,0,Math.PI*2,true);this.ctx.closePath();this.ctx.fill()};a.prototype.circleStroke=function(t,e,n,i,r,o){this.circle(t,e,n,i);this.ctx.strokeStyle=o.toString();this.ctx.stroke()};a.prototype.drawShape=function(t,e){this.shape(t);this.setFillStyle(e).fill()};a.prototype.taints=function(e){if(e.tainted===null){this.taintCtx.drawImage(e.image,0,0);try{this.taintCtx.getImageData(0,0,1,1);e.tainted=false}catch(t){this.taintCtx=document.createElement("canvas").getContext("2d");e.tainted=true}}return e.tainted};a.prototype.drawImage=function(t,e,n,i,r,o,a,s,u){if(!this.taints(t)||this.options.allowTaint){this.ctx.drawImage(t.image,e,n,i,r,o,a,s,u)}};a.prototype.clip=function(t,e,n){this.ctx.save();t.filter(s).forEach(function(t){this.shape(t).clip()},this);e.call(n);this.ctx.restore()};a.prototype.shape=function(t){this.ctx.beginPath();t.forEach(function(t,e){if(t[0]==="rect"){this.ctx.rect.apply(this.ctx,t.slice(1))}else{this.ctx[e===0?"moveTo":t[0]+"To"].apply(this.ctx,t.slice(1))}},this);this.ctx.closePath();return this.ctx};a.prototype.font=function(t,e,n,i,r,o){this.setFillStyle(t).font=[e,n,i,r,o].join(" ").split(",")[0]};a.prototype.fontShadow=function(t,e,n,i){this.setVariable("shadowColor",t.toString()).setVariable("shadowOffsetY",e).setVariable("shadowOffsetX",n).setVariable("shadowBlur",i)};a.prototype.clearShadow=function(){this.setVariable("shadowColor","rgba(0,0,0,0)")};a.prototype.setOpacity=function(t){this.ctx.globalAlpha=t};a.prototype.setTransform=function(t){this.ctx.translate(t.origin[0],t.origin[1]);this.ctx.transform.apply(this.ctx,t.matrix);this.ctx.translate(-t.origin[0],-t.origin[1])};a.prototype.setVariable=function(t,e){if(this.variables[t]!==e){this.variables[t]=this.ctx[t]=e}return this};a.prototype.text=function(t,e,n){this.ctx.fillText(t,e,n)};a.prototype.backgroundRepeatShape=function(t,e,n,i,r,o,a,s,u){var h=[["line",Math.round(r),Math.round(o)],["line",Math.round(r+a),Math.round(o)],["line",Math.round(r+a),Math.round(s+o)],["line",Math.round(r),Math.round(s+o)]];this.clip([h],function(){this.renderBackgroundRepeat(t,e,n,i,u[3],u[0])},this)};a.prototype.renderBackgroundRepeat=function(t,e,n,i,r,o){var a=Math.round(i.left+e.left+r),s=Math.round(i.top+e.top+o);this.setFillStyle(this.ctx.createPattern(this.resizeImage(t,n),"repeat"));this.ctx.translate(a,s);this.ctx.fill();this.ctx.translate(-a,-s)};a.prototype.renderBackgroundGradient=function(t,e){if(t instanceof r){var n=this.ctx.createLinearGradient(e.left+e.width*t.x0,e.top+e.height*t.y0,e.left+e.width*t.x1,e.top+e.height*t.y1);t.colorStops.forEach(function(t){n.addColorStop(t.stop,t.color.toString())});this.rectangle(e.left,e.top,e.width,e.height,n)}};a.prototype.resizeImage=function(t,e){var n=t.image;if(n.width===e.width&&n.height===e.height){return n}var i,r=document.createElement("canvas");r.width=e.width;r.height=e.height;i=r.getContext("2d");i.drawImage(n,0,0,n.width,n.height,0,0,e.width,e.height);return r};function s(t){return t.length>0}e.exports=a},{"../lineargradientcontainer":12,"../log":13,"../renderer":19}],21:[function(t,e,n){var r=t("./nodecontainer");function i(t,e,n,i){r.call(this,n,i);this.ownStacking=t;this.contexts=[];this.children=[];this.opacity=(this.parent?this.parent.stack.opacity:1)*e}i.prototype=Object.create(r.prototype);i.prototype.getParentStack=function(t){var e=this.parent?this.parent.stack:null;return e?e.ownStacking?e:e.getParentStack(t):t.stack};e.exports=i},{"./nodecontainer":14}],22:[function(t,e,n){function i(t){this.rangeBounds=this.testRangeBounds(t);this.cors=this.testCORS();this.svg=this.testSVG()}i.prototype.testRangeBounds=function(t){var e,n,i,r,o=false;if(t.createRange){e=t.createRange();if(e.getBoundingClientRect){n=t.createElement("boundtest");n.style.height="123px";n.style.display="block";t.body.appendChild(n);e.selectNode(n);i=e.getBoundingClientRect();r=i.height;if(r===123){o=true}t.body.removeChild(n)}}return o};i.prototype.testCORS=function(){return typeof(new Image).crossOrigin!=="undefined"};i.prototype.testSVG=function(){var t=new Image;var e=document.createElement("canvas");var n=e.getContext("2d");t.src="data:image/svg+xml,";try{n.drawImage(t,0,0);e.toDataURL()}catch(t){return false}return true};e.exports=i},{}],23:[function(t,e,n){var i=t("./xhr");var r=t("./utils").decode64;function o(t){this.src=t;this.image=null;var n=this;this.promise=this.hasFabric().then(function(){return n.isInline(t)?Promise.resolve(n.inlineFormatting(t)):i(t)}).then(function(e){return new Promise(function(t){window.html2canvas.svg.fabric.loadSVGFromString(e,n.createCanvas.call(n,t))})})}o.prototype.hasFabric=function(){return!window.html2canvas.svg||!window.html2canvas.svg.fabric?Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")):Promise.resolve()};o.prototype.inlineFormatting=function(t){return/^data:image\/svg\+xml;base64,/.test(t)?this.decode64(this.removeContentType(t)):this.removeContentType(t)};o.prototype.removeContentType=function(t){return t.replace(/^data:image\/svg\+xml(;base64)?,/,"")};o.prototype.isInline=function(t){return/^data:image\/svg\+xml/i.test(t)};o.prototype.createCanvas=function(i){var r=this;return function(t,e){var n=new window.html2canvas.svg.fabric.StaticCanvas("c");r.image=n.lowerCanvasEl;n.setWidth(e.width).setHeight(e.height).add(window.html2canvas.svg.fabric.util.groupSVGElements(t,e)).renderAll();i(n.lowerCanvasEl)}};o.prototype.decode64=function(t){return typeof window.atob==="function"?window.atob(t):r(t)};e.exports=o},{"./utils":26,"./xhr":28}],24:[function(t,e,n){var i=t("./svgcontainer");function r(n,t){this.src=n;this.image=null;var i=this;this.promise=t?new Promise(function(t,e){i.image=new Image;i.image.onload=t;i.image.onerror=e;i.image.src="data:image/svg+xml,"+(new XMLSerializer).serializeToString(n);if(i.image.complete===true){t(i.image)}}):this.hasFabric().then(function(){return new Promise(function(t){window.html2canvas.svg.fabric.parseSVGDocument(n,i.createCanvas.call(i,t))})})}r.prototype=Object.create(i.prototype);e.exports=r},{"./svgcontainer":23}],25:[function(t,e,n){var i=t("./nodecontainer");function r(t,e){i.call(this,t,e)}r.prototype=Object.create(i.prototype);r.prototype.applyTextTransform=function(){this.node.data=this.transform(this.parent.css("textTransform"))};r.prototype.transform=function(t){var e=this.node.data;switch(t){case"lowercase":return e.toLowerCase();case"capitalize":return e.replace(/(^|\s|:|-|\(|\))([a-z])/g,o);case"uppercase":return e.toUpperCase();default:return e}};function o(t,e,n){if(t.length>0){return e+n.toUpperCase()}}e.exports=r},{"./nodecontainer":14}],26:[function(t,e,n){n.smallImage=function t(){return"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"};n.bind=function(t,e){return function(){return t.apply(e,arguments)}};n.decode64=function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var n=t.length,i,r,o,a,s,u,h,l;var f="";for(i=0;i>4;h=(o&15)<<4|a>>2;l=(a&3)<<6|s;if(a===64){f+=String.fromCharCode(u)}else if(s===64||s===-1){f+=String.fromCharCode(u,h)}else{f+=String.fromCharCode(u,h,l)}}return f};n.getBounds=function(t){if(t.getBoundingClientRect){var e=t.getBoundingClientRect();var n=t.offsetWidth==null?e.width:t.offsetWidth;return{top:e.top,bottom:e.bottom||e.top+e.height,right:e.left+n,left:e.left,width:n,height:t.offsetHeight==null?e.height:t.offsetHeight}}return{}};n.offsetBounds=function(t){var e=t.offsetParent?n.offsetBounds(t.offsetParent):{top:0,left:0};return{top:t.offsetTop+e.top,bottom:t.offsetTop+t.offsetHeight+e.top,right:t.offsetLeft+e.left+t.offsetWidth,left:t.offsetLeft+e.left,width:t.offsetWidth,height:t.offsetHeight}};n.parseBackgrounds=function(t){var e=" \r\n\t",n,i,r,o,a,s=[],u=0,h=0,l,f;var c=function(){if(n){if(i.substr(0,1)==='"'){i=i.substr(1,i.length-2)}if(i){f.push(i)}if(n.substr(0,1)==="-"&&(o=n.indexOf("-",1)+1)>0){r=n.substr(0,o);n=n.substr(o)}s.push({prefix:r,method:n.toLowerCase(),value:a,args:f,image:null})}f=[];n=r=i=a=""};f=[];n=r=i=a="";t.split("").forEach(function(t){if(u===0&&e.indexOf(t)>-1){return}switch(t){case'"':if(!l){l=t}else if(l===t){l=null}break;case"(":if(l){break}else if(u===0){u=1;a+=t;return}else{h++}break;case")":if(l){break}else if(u===1){if(h===0){u=0;a+=t;c();return}else{h--}}break;case",":if(l){break}else if(u===0){c();return}else if(u===1){if(h===0&&!n.match(/^url$/i)){f.push(i);i="";a+=t;return}}break}a+=t;if(u===0){n+=t}else{i+=t}});c();return s}},{}],27:[function(t,e,n){var i=t("./gradientcontainer");function r(t){i.apply(this,arguments);this.type=t.args[0]==="linear"?i.TYPES.LINEAR:i.TYPES.RADIAL}r.prototype=Object.create(i.prototype);e.exports=r},{"./gradientcontainer":9}],28:[function(t,e,n){function i(i){return new Promise(function(t,e){var n=new XMLHttpRequest;n.open("GET",i);n.onload=function(){if(n.status===200){t(n.responseText)}else{e(new Error(n.statusText))}};n.onerror=function(){e(new Error("Network Error"))};n.send()})}e.exports=i},{}]},{},[4])(4)})});var Kx=function(t){var e=this;this.ok=false;this.alpha=1;if(t.charAt(0)=="#"){t=t.substr(1,6)}t=t.replace(/ /g,"");t=t.toLowerCase();var l={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};t=l[t]||t;var f=[{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*((?:\d?\.)?\d)\)$/,example:["rgba(123, 234, 45, 0.8)","rgba(255,234,245,1.0)"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3]),parseFloat(t[4])]}},{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}];for(var n=0;n3){e.alpha=a[3]}e.ok=true}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"};this.toHex=function(){var t=this.r.toString(16);var e=this.g.toString(16);var n=this.b.toString(16);if(t.length==1){t="0"+t}if(e.length==1){e="0"+e}if(n.length==1){n="0"+n}return"#"+t+e+n};this.getHelpXML=function(){var t=new Array;for(var e=0;e "+s.toRGB()+" -> "+s.toHex());a.appendChild(u);a.appendChild(h);o.appendChild(a)}catch(t){}}return o}};var Jx=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];var tw=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function ew(t,e,n,i){if(isNaN(i)||i<1){return}i|=0;var r,o,a,s,u,h,l,f,c,d,p,g,v,_,y,m,b,x,w,C,E,S,A,k;var M=i+i+1;var T=e-1;var B=n-1;var D=i+1;var N=D*(D+1)/2;var P=new nw;var z=P;for(a=1;a>L;if(A!=0){A=255/A;t[h]=(f*I>>L)*A;t[h+1]=(c*I>>L)*A;t[h+2]=(d*I>>L)*A}else{t[h]=t[h+1]=t[h+2]=0}f-=g;c-=v;d-=_;p-=y;g-=F.r;v-=F.g;_-=F.b;y-=F.a;s=l+((s=r+i+1)>L;if(A>0){A=255/A;t[s]=(f*I>>L)*A;t[s+1]=(c*I>>L)*A;t[s+2]=(d*I>>L)*A}else{t[s]=t[s+1]=t[s+2]=0}f-=g;c-=v;d-=_;p-=y;g-=F.r;v-=F.g;_-=F.b;y-=F.a;s=r+((s=o+D)65535){t-=65536;var e=55296+(t>>10),n=56320+(t&1023);return String.fromCharCode(e,n)}else{return String.fromCharCode(t)}}function s(t){var e=t.slice(1,-1);if(e in i){return i[e]}else if(e.charAt(0)==="#"){return a(parseInt(e.substr(1).replace("x","0x")))}else{o.error("entity not found:"+t);return t}}function e(t){if(t>g){var e=n.substring(g,t).replace(/&#?\w+;/g,s);c&&u(g);r.characters(e,0,t-g);g=t}}function u(t,e){while(t>=l&&(e=f.exec(n))){h=e.index;l=h+e[0].length;c.lineNumber++}c.columnNumber=t-h+1}var h=0;var l=0;var f=/.*(?:\r\n?|\n)|.*$/g;var c=r.locator;var d=[{currentNSMap:t}];var p={};var g=0;while(true){try{var v=n.indexOf("<",g);if(v<0){if(!n.substr(g).match(/^\s*$/)){var _=r.doc;var y=_.createTextNode(n.substr(g));_.appendChild(y);r.currentElement=y}return}if(v>g){e(v)}switch(n.charAt(v+1)){case"/":var m=n.indexOf(">",v+3);var b=n.substring(v+2,m);var x=d.pop();if(m<0){b=n.substring(v+2).replace(/[\s<].*/,"");o.error("end tag name: "+b+" is not complete:"+x.tagName);m=v+1+b.length}else if(b.match(/\sg){g=m}else{e(Math.max(v,g)+1)}}}function _w(t,e){e.lineNumber=t.lineNumber;e.columnNumber=t.columnNumber;return e}function yw(t,e,n,i,r,o){var a;var s;var u=++e;var h=sw;while(true){var l=t.charAt(u);switch(l){case"=":if(h===uw){a=t.slice(e,u);h=lw}else if(h===hw){h=lw}else{throw new Error("attribute equal must after attrName")}break;case"'":case'"':if(h===lw||h===uw){if(h===uw){o.warning('attribute value must after "="');a=t.slice(e,u)}e=u+1;u=t.indexOf(l,e);if(u>0){s=t.slice(e,u).replace(/&#?\w+;/g,r);n.add(a,s,e-1);h=cw}else{throw new Error("attribute value no end '"+l+"' match")}}else if(h==fw){s=t.slice(e,u).replace(/&#?\w+;/g,r);n.add(a,s,e);o.warning('attribute "'+a+'" missed start quot('+l+")!!");e=u+1;h=cw}else{throw new Error('attribute value must after "="')}break;case"/":switch(h){case sw:n.setTagName(t.slice(e,u));case cw:case dw:case pw:h=pw;n.closed=true;case fw:case uw:case hw:break;default:throw new Error("attribute invalid close char('/')")}break;case"":o.error("unexpected end of input");if(h==sw){n.setTagName(t.slice(e,u))}return u;case">":switch(h){case sw:n.setTagName(t.slice(e,u));case cw:case dw:case pw:break;case fw:case uw:s=t.slice(e,u);if(s.slice(-1)==="/"){n.closed=true;s=s.slice(0,-1)}case hw:if(h===hw){s=a}if(h==fw){o.warning('attribute "'+s+'" missed quot(")!!');n.add(a,s.replace(/&#?\w+;/g,r),e)}else{if(i[""]!=="http://www.w3.org/1999/xhtml"||!s.match(/^(?:disabled|checked|selected)$/i)){o.warning('attribute "'+s+'" missed value!! "'+s+'" instead!!')}n.add(s,s,e)}break;case lw:throw new Error("attribute value missed!!")}return u;case"€":l=" ";default:if(l<=" "){switch(h){case sw:n.setTagName(t.slice(e,u));h=dw;break;case uw:a=t.slice(e,u);h=hw;break;case fw:var s=t.slice(e,u).replace(/&#?\w+;/g,r);o.warning('attribute "'+s+'" missed quot(")!!');n.add(a,s,e);case cw:h=dw;break}}else{switch(h){case hw:if(i[""]!=="http://www.w3.org/1999/xhtml"||!a.match(/^(?:disabled|checked|selected)$/i)){o.warning('attribute "'+a+'" missed value!! "'+a+'" instead2!!')}n.add(a,a,e);e=u;h=uw;break;case cw:o.warning('attribute space is required"'+a+'"!!');case dw:h=uw;e=u;break;case lw:h=fw;e=u;break;case pw:throw new Error("elements closed character '/' and '>' must be connected to")}}}u++}}function mw(t,e,n){var i=t.tagName;var r=null;var o=t.length;while(o--){var a=t[o];var s=a.qName;var u=a.value;var h=s.indexOf(":");if(h>0){var l=a.prefix=s.slice(0,h);var f=s.slice(h+1);var c=l==="xmlns"&&f}else{f=s;l=null;c=s==="xmlns"&&""}a.localName=f;if(c!==false){if(r==null){r={};ww(n,n={})}n[c]=r[c]=u;a.uri="http://www.w3.org/2000/xmlns/";e.startPrefixMapping(c,u)}}var o=t.length;while(o--){a=t[o];var l=a.prefix;if(l){if(l==="xml"){a.uri="http://www.w3.org/XML/1998/namespace"}if(l!=="xmlns"){a.uri=n[l||""]}}}var h=i.indexOf(":");if(h>0){l=t.prefix=i.slice(0,h);f=t.localName=i.slice(h+1)}else{l=null;f=t.localName=i}var d=t.uri=n[l||""];e.startElement(d,f,i,t);if(t.closed){e.endElement(d,f,i);if(r){for(l in r){e.endPrefixMapping(l)}}}else{t.currentNSMap=n;t.localNSMap=r;return true}}function bw(t,e,n,i,r){if(/^(?:script|textarea)$/i.test(n)){var o=t.indexOf("",e);var a=t.substring(e+1,o);if(/[&<]/.test(a)){if(/^script$/i.test(n)){r.characters(a,0,a.length);return o}a=a.replace(/&#?\w+;/g,i);r.characters(a,0,a.length);return o}}return e+1}function xw(t,e,n,i){var r=i[n];if(r==null){r=t.lastIndexOf("");if(re){n.comment(t,e+4,o-e-4);return o+3}else{i.error("Unclosed comment");return-1}}else{return-1}default:if(t.substr(e+3,6)=="CDATA["){var o=t.indexOf("]]>",e+9);n.startCDATA();n.characters(t,e+9,o-e-9);n.endCDATA();return o+3}var a=kw(t,e);var s=a.length;if(s>1&&/!doctype/i.test(a[0][0])){var u=a[1][0];var h=s>3&&/^public$/i.test(a[2][0])&&a[3][0];var l=s>4&&a[4][0];var f=a[s-1];n.startDTD(u,h&&h.replace(/^(['"])(.*?)\1$/,"$2"),l&&l.replace(/^(['"])(.*?)\1$/,"$2"));n.endDTD();return f.index+f[0].length}}return-1}function Ew(t,e,n){var i=t.indexOf("?>",e);if(i){var r=t.substring(e,i).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(r){n.processingInstruction(r[1],r[2]);return i+2}else{return-1}}return-1}function Sw(t){}Sw.prototype={setTagName:function(t){if(!aw.test(t)){throw new Error("invalid tagName:"+t)}this.tagName=t},add:function(t,e,n){if(!aw.test(t)){throw new Error("invalid attribute:"+t)}this[this.length++]={qName:t,value:e,offset:n}},length:0,getLocalName:function(t){return this[t].localName},getLocator:function(t){return this[t].locator},getQName:function(t){return this[t].qName},getURI:function(t){return this[t].uri},getValue:function(t){return this[t].value}};function Aw(t,e){t.__proto__=e;return t}if(!(Aw({},Aw.prototype)instanceof Aw)){Aw=function(t,e){function n(){}n.prototype=e;n=new n;for(e in t){n[e]=t[e]}return n}}function kw(t,e){var n;var i=[];var r=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;r.lastIndex=e;r.exec(t);while(n=r.exec(t)){i.push(n);if(n[1]){return i}}}var Mw=gw;var Tw={XMLReader:Mw};function Bw(t,e){for(var n in t){e[n]=t[n]}}function Dw(t,e){var n=t.prototype;if(Object.create){var i=Object.create(e.prototype);n.__proto__=i}if(!(n instanceof e)){var r=function(){};r.prototype=e.prototype;r=new r;Bw(n,r);t.prototype=n=r}if(n.constructor!=t){if(typeof t!="function"){console.error("unknow Class:"+t)}n.constructor=t}}var Nw="http://www.w3.org/1999/xhtml";var Pw={};var zw=Pw.ELEMENT_NODE=1;var Ow=Pw.ATTRIBUTE_NODE=2;var Fw=Pw.TEXT_NODE=3;var Rw=Pw.CDATA_SECTION_NODE=4;var Iw=Pw.ENTITY_REFERENCE_NODE=5;var Lw=Pw.ENTITY_NODE=6;var jw=Pw.PROCESSING_INSTRUCTION_NODE=7;var Hw=Pw.COMMENT_NODE=8;var Vw=Pw.DOCUMENT_NODE=9;var Uw=Pw.DOCUMENT_TYPE_NODE=10;var Ww=Pw.DOCUMENT_FRAGMENT_NODE=11;var qw=Pw.NOTATION_NODE=12;var Xw={};var Gw={};var Yw=Xw.INDEX_SIZE_ERR=(Gw[1]="Index size error",1);var $w=Xw.DOMSTRING_SIZE_ERR=(Gw[2]="DOMString size error",2);var Qw=Xw.HIERARCHY_REQUEST_ERR=(Gw[3]="Hierarchy request error",3);var Zw=Xw.WRONG_DOCUMENT_ERR=(Gw[4]="Wrong document",4);var Kw=Xw.INVALID_CHARACTER_ERR=(Gw[5]="Invalid character",5);var Jw=Xw.NO_DATA_ALLOWED_ERR=(Gw[6]="No data allowed",6);var tC=Xw.NO_MODIFICATION_ALLOWED_ERR=(Gw[7]="No modification allowed",7);var eC=Xw.NOT_FOUND_ERR=(Gw[8]="Not found",8);var nC=Xw.NOT_SUPPORTED_ERR=(Gw[9]="Not supported",9);var iC=Xw.INUSE_ATTRIBUTE_ERR=(Gw[10]="Attribute in use",10);var rC=Xw.INVALID_STATE_ERR=(Gw[11]="Invalid state",11);var oC=Xw.SYNTAX_ERR=(Gw[12]="Syntax error",12);var aC=Xw.INVALID_MODIFICATION_ERR=(Gw[13]="Invalid modification",13);var sC=Xw.NAMESPACE_ERR=(Gw[14]="Invalid namespace",14);var uC=Xw.INVALID_ACCESS_ERR=(Gw[15]="Invalid access",15);function hC(t,e){if(e instanceof Error){var n=e}else{n=this;Error.call(this,Gw[t]);this.message=Gw[t];if(Error.captureStackTrace){Error.captureStackTrace(this,hC)}}n.code=t;if(e){this.message=this.message+": "+e}return n}hC.prototype=Error.prototype;Bw(Xw,hC);function lC(){}lC.prototype={length:0,item:function(t){return this[t]||null},toString:function(t,e){var n=this;for(var i=[],r=0;r=0){var r=e.length-1;while(i0},lookupPrefix:function(t){var e=this;while(e){var n=e._nsMap;if(n){for(var i in n){if(n[i]==t){return i}}}e=e.nodeType==Ow?e.ownerDocument:e.parentNode}return null},lookupNamespaceURI:function(t){var e=this;while(e){var n=e._nsMap;if(n){if(t in n){return n[t]}}e=e.nodeType==Ow?e.ownerDocument:e.parentNode}return null},isDefaultNamespace:function(t){var e=this.lookupPrefix(t);return e==null}};function mC(t){return t=="<"&&"<"||t==">"&&">"||t=="&"&&"&"||t=='"'&&"""||"&#"+t.charCodeAt()+";"}Bw(Pw,yC);Bw(Pw,yC.prototype);function bC(t,e){if(e(t)){return true}if(t=t.firstChild){do{if(bC(t,e)){return true}}while(t=t.nextSibling)}}function xC(){}function wC(t,e,n){t&&t._inc++;var i=n.namespaceURI;if(i=="http://www.w3.org/2000/xmlns/"){e._nsMap[n.prefix?n.localName:""]=n.value}}function CC(t,e,n,i){t&&t._inc++;var r=n.namespaceURI;if(r=="http://www.w3.org/2000/xmlns/"){delete e._nsMap[n.prefix?n.localName:""]}}function EC(t,e,n){if(t&&t._inc){t._inc++;var i=e.childNodes;if(n){i[i.length++]=n}else{var r=e.firstChild;var o=0;while(r){i[o++]=r;r=r.nextSibling}i.length=o}}}function SC(t,e){var n=e.previousSibling;var i=e.nextSibling;if(n){n.nextSibling=i}else{t.firstChild=i}if(i){i.previousSibling=n}else{t.lastChild=n}EC(t.ownerDocument,t);return e}function AC(t,e,n){var i=e.parentNode;if(i){i.removeChild(e)}if(e.nodeType===Ww){var r=e.firstChild;if(r==null){return e}var o=e.lastChild}else{r=o=e}var a=n?n.previousSibling:t.lastChild;r.previousSibling=a;o.nextSibling=n;if(a){a.nextSibling=r}else{t.firstChild=r}if(n==null){t.lastChild=o}else{n.previousSibling=o}do{r.parentNode=t}while(r!==o&&(r=r.nextSibling));EC(t.ownerDocument||t,t);if(e.nodeType==Ww){e.firstChild=e.lastChild=null}return e}function kC(t,e){var n=e.parentNode;if(n){var i=t.lastChild;n.removeChild(e);var i=t.lastChild}var i=t.lastChild;e.parentNode=t;e.previousSibling=i;e.nextSibling=null;if(i){i.nextSibling=e}else{t.firstChild=e}t.lastChild=e;EC(t.ownerDocument,t,e);return e}xC.prototype={nodeName:"#document",nodeType:Vw,doctype:null,documentElement:null,_inc:1,insertBefore:function(t,e){var n=this;if(t.nodeType==Ww){var i=t.firstChild;while(i){var r=i.nextSibling;n.insertBefore(i,e);i=r}return t}if(this.documentElement==null&&t.nodeType==zw){this.documentElement=t}return AC(this,t,e),t.ownerDocument=this,t},removeChild:function(t){if(this.documentElement==t){this.documentElement=null}return SC(this,t)},importNode:function(t,e){return WC(this,t,e)},getElementById:function(e){var n=null;bC(this.documentElement,function(t){if(t.nodeType==zw){if(t.getAttribute("id")==e){n=t;return true}}});return n},createElement:function(t){var e=new MC;e.ownerDocument=this;e.nodeName=t;e.tagName=t;e.childNodes=new lC;var n=e.attributes=new dC;n._ownerElement=e;return e},createDocumentFragment:function(){var t=new IC;t.ownerDocument=this;t.childNodes=new lC;return t},createTextNode:function(t){var e=new DC;e.ownerDocument=this;e.appendData(t);return e},createComment:function(t){var e=new NC;e.ownerDocument=this;e.appendData(t);return e},createCDATASection:function(t){var e=new PC;e.ownerDocument=this;e.appendData(t);return e},createProcessingInstruction:function(t,e){var n=new LC;n.ownerDocument=this;n.tagName=n.target=t;n.nodeValue=n.data=e;return n},createAttribute:function(t){var e=new TC;e.ownerDocument=this;e.name=t;e.nodeName=t;e.localName=t;e.specified=true;return e},createEntityReference:function(t){var e=new RC;e.ownerDocument=this;e.nodeName=t;return e},createElementNS:function(t,e){var n=new MC;var i=e.split(":");var r=n.attributes=new dC;n.childNodes=new lC;n.ownerDocument=this;n.nodeName=e;n.tagName=e;n.namespaceURI=t;if(i.length==2){n.prefix=i[0];n.localName=i[1]}else{n.localName=e}r._ownerElement=n;return n},createAttributeNS:function(t,e){var n=new TC;var i=e.split(":");n.ownerDocument=this;n.nodeName=e;n.name=e;n.namespaceURI=t;n.specified=true;if(i.length==2){n.prefix=i[0];n.localName=i[1]}else{n.localName=e}return n}};Dw(xC,yC);function MC(){this._nsMap={}}MC.prototype={nodeType:zw,hasAttribute:function(t){return this.getAttributeNode(t)!=null},getAttribute:function(t){var e=this.getAttributeNode(t);return e&&e.value||""},getAttributeNode:function(t){return this.attributes.getNamedItem(t)},setAttribute:function(t,e){var n=this.ownerDocument.createAttribute(t);n.value=n.nodeValue=""+e;this.setAttributeNode(n)},removeAttribute:function(t){var e=this.getAttributeNode(t);e&&this.removeAttributeNode(e)},appendChild:function(t){if(t.nodeType===Ww){return this.insertBefore(t,null)}else{return kC(this,t)}},setAttributeNode:function(t){return this.attributes.setNamedItem(t)},setAttributeNodeNS:function(t){return this.attributes.setNamedItemNS(t)},removeAttributeNode:function(t){return this.attributes.removeNamedItem(t.nodeName)},removeAttributeNS:function(t,e){var n=this.getAttributeNodeNS(t,e);n&&this.removeAttributeNode(n)},hasAttributeNS:function(t,e){return this.getAttributeNodeNS(t,e)!=null},getAttributeNS:function(t,e){var n=this.getAttributeNodeNS(t,e);return n&&n.value||""},setAttributeNS:function(t,e,n){var i=this.ownerDocument.createAttributeNS(t,e);i.value=i.nodeValue=""+n;this.setAttributeNode(i)},getAttributeNodeNS:function(t,e){return this.attributes.getNamedItemNS(t,e)},getElementsByTagName:function(i){return new fC(this,function(e){var n=[];bC(e,function(t){if(t!==e&&t.nodeType==zw&&(i==="*"||t.tagName==i)){n.push(t)}});return n})},getElementsByTagNameNS:function(i,r){return new fC(this,function(e){var n=[];bC(e,function(t){if(t!==e&&t.nodeType===zw&&(i==="*"||t.namespaceURI===i)&&(r==="*"||t.localName==r)){n.push(t)}});return n})}};xC.prototype.getElementsByTagName=MC.prototype.getElementsByTagName;xC.prototype.getElementsByTagNameNS=MC.prototype.getElementsByTagNameNS;Dw(MC,yC);function TC(){}TC.prototype.nodeType=Ow;Dw(TC,yC);function BC(){}BC.prototype={data:"",substringData:function(t,e){return this.data.substring(t,t+e)},appendData:function(t){t=this.data+t;this.nodeValue=this.data=t;this.length=t.length},insertData:function(t,e){this.replaceData(t,0,e)},appendChild:function(t){throw new Error(Gw[Qw])},deleteData:function(t,e){this.replaceData(t,e,"")},replaceData:function(t,e,n){var i=this.data.substring(0,t);var r=this.data.substring(t+e);n=i+n+r;this.nodeValue=this.data=n;this.length=n.length}};Dw(BC,yC);function DC(){}DC.prototype={nodeName:"#text",nodeType:Fw,splitText:function(t){var e=this.data;var n=e.substring(t);e=e.substring(0,t);this.data=this.nodeValue=e;this.length=e.length;var i=this.ownerDocument.createTextNode(n);if(this.parentNode){this.parentNode.insertBefore(i,this.nextSibling)}return i}};Dw(DC,BC);function NC(){}NC.prototype={nodeName:"#comment",nodeType:Hw};Dw(NC,BC);function PC(){}PC.prototype={nodeName:"#cdata-section",nodeType:Rw};Dw(PC,BC);function zC(){}zC.prototype.nodeType=Uw;Dw(zC,yC);function OC(){}OC.prototype.nodeType=qw;Dw(OC,yC);function FC(){}FC.prototype.nodeType=Lw;Dw(FC,yC);function RC(){}RC.prototype.nodeType=Iw;Dw(RC,yC);function IC(){}IC.prototype.nodeName="#document-fragment";IC.prototype.nodeType=Ww;Dw(IC,yC);function LC(){}LC.prototype.nodeType=jw;Dw(LC,yC);function jC(){}jC.prototype.serializeToString=function(t,e,n){return HC.call(t,e,n)};yC.prototype.toString=HC;function HC(t,e){var n=[];var i=this.nodeType==9?this.documentElement:this;var r=i.prefix;var o=i.namespaceURI;if(o&&r==null){var r=i.lookupPrefix(o);if(r==null){var a=[{namespace:o,prefix:null}]}}UC(this,n,t,e,a);return n.join("")}function VC(t,e,n){var i=t.prefix||"";var r=t.namespaceURI;if(!i&&!r){return false}if(i==="xml"&&r==="http://www.w3.org/XML/1998/namespace"||r=="http://www.w3.org/2000/xmlns/"){return false}var o=n.length;while(o--){var a=n[o];if(a.prefix==i){return a.namespace!=r}}return true}function UC(t,e,n,i,r){if(i){t=i(t);if(t){if(typeof t=="string"){e.push(t);return}}else{return}}switch(t.nodeType){case zw:if(!r){r=[]}var o=t.attributes;var a=o.length;var s=t.firstChild;var u=t.tagName;n=Nw===t.namespaceURI||n;e.push("<",u);for(var h=0;h");if(n&&/^script$/i.test(u)){while(s){if(s.data){e.push(s.data)}else{UC(s,e,n,i,r)}s=s.nextSibling}}else{while(s){UC(s,e,n,i,r);s=s.nextSibling}}e.push("")}else{e.push("/>")}return;case Vw:case Ww:var s=t.firstChild;while(s){UC(s,e,n,i,r);s=s.nextSibling}return;case Ow:return e.push(" ",t.name,'="',t.value.replace(/[<&"]/g,mC),'"');case Fw:return e.push(t.data.replace(/[<&]/g,mC));case Rw:return e.push("");case Hw:return e.push("\x3c!--",t.data,"--\x3e");case Uw:var p=t.publicId;var g=t.systemId;e.push("')}else if(g&&g!="."){e.push(' SYSTEM "',g,'">')}else{var v=t.internalSubset;if(v){e.push(" [",v,"]")}e.push(">")}return;case jw:return e.push("");case Iw:return e.push("&",t.nodeName,";");default:e.push("??",t.nodeName)}}function WC(t,e,n){var i;switch(e.nodeType){case zw:i=e.cloneNode(false);i.ownerDocument=t;case Ww:break;case Ow:n=true;break}if(!i){i=e.cloneNode(false)}i.ownerDocument=t;i.parentNode=null;if(n){var r=e.firstChild;while(r){i.appendChild(WC(t,r,n));r=r.nextSibling}}return i}function qC(t,e,n){var i=new e.constructor;for(var r in e){var o=e[r];if(typeof o!="object"){if(o!=i[r]){i[r]=o}}}if(e.childNodes){i.childNodes=new lC}i.ownerDocument=t;switch(i.nodeType){case zw:var a=e.attributes;var s=i.attributes=new dC;var u=a.length;s._ownerElement=i;for(var h=0;h",amp:"&",quot:'"',apos:"'"};if(a){r.setDocumentLocator(a)}i.errorHandler=h(o,r,a);i.domBuilder=n.domBuilder||r;if(/\/x?html?$/.test(e)){u.nbsp=" ";u.copy="©";s[""]="http://www.w3.org/1999/xhtml"}s.xml=s.xml||"http://www.w3.org/XML/1998/namespace";if(t){i.parse(t,s,u)}else{i.errorHandler.error("invalid doc source")}return r.doc};function h(i,t,r){if(!i){if(t instanceof l){return t}i=t}var o={};var a=i instanceof Function;r=r||{};function e(e){var n=i[e];if(!n&&a){n=i.length==2?function(t){i(e,t)}:i}o[e]=n&&function(t){n("[xmldom "+e+"]\t"+t+s(r))}||function(){}}e("warning");e("error");e("fatalError");return o}function l(){this.cdata=false}function f(t,e){e.lineNumber=t.lineNumber;e.columnNumber=t.columnNumber}l.prototype={startDocument:function(){this.doc=(new i).createDocument(null,null,null);if(this.locator){this.doc.documentURI=this.locator.systemId}},startElement:function(t,e,n,i){var r=this;var o=this.doc;var a=o.createElementNS(t,n||e);var s=i.length;c(this,a);this.currentElement=a;this.locator&&f(this.locator,a);for(var u=0;u=e+n||e){return new java.lang.String(t,e,n)+""}return t}}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(t){l.prototype[t]=function(){return null}});function c(t,e){if(!t.currentElement){t.doc.appendChild(e)}else{t.currentElement.appendChild(e)}}var d=Tw.XMLReader;var i=e.DOMImplementation=QC.DOMImplementation;e.XMLSerializer=QC.XMLSerializer;e.DOMParser=n});"use strict";function KC(t,e,n){if(t==null&&e==null&&n==null){var i=document.querySelectorAll("svg");for(var r=0;r~\.\[:]+)/g;var n=/(\.[^\s\+>~\.\[:]+)/g;var o=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi;var a=/(:[\w-]+\([^\)]*\))/gi;var s=/(:[^\s\+>~\.\[:]+)/g;var u=/([^\s\+>~\.\[:]+)/g;var h=function(t,e){var n=i.match(t);if(n==null){return}r[e]+=n.length;i=i.replace(t," ")};i=i.replace(/:not\(([^\)]*)\)/g," $1 ");i=i.replace(/{[^]*/gm," ");h(t,1);h(e,0);h(n,1);h(o,2);h(a,1);h(s,1);i=i.replace(/[\*\s\+>~]/g," ");i=i.replace(/[#\.]/g," ");h(u,2);return r.join("")}function eE(t){var N={opts:t};var l=JC();if(typeof CanvasRenderingContext2D!="undefined"){CanvasRenderingContext2D.prototype.drawSvg=function(t,e,n,i,r,o){var a={ignoreMouse:true,ignoreAnimation:true,ignoreDimensions:true,ignoreClear:true,offsetX:e,offsetY:n,scaleWidth:i,scaleHeight:r};for(var s in o){if(o.hasOwnProperty(s)){a[s]=o[s]}}KC(this.canvas,t,a)}}N.FRAMERATE=30;N.MAX_VIRTUAL_PIXELS=3e4;N.log=function(t){};if(N.opts.log==true&&typeof console!="undefined"){N.log=function(t){console.log(t)}}N.init=function(t){var e=0;N.UniqueId=function(){e++;return"canvg"+e};N.Definitions={};N.Styles={};N.StylesSpecificity={};N.Animations=[];N.Images=[];N.ctx=t;N.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(t,e){this.viewPorts.push({width:t,height:e})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};this.ComputeSize=function(t){if(t!=null&&typeof t=="number"){return t}if(t=="x"){return this.width()}if(t=="y"){return this.height()}return Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};N.init();N.ImagesLoaded=function(){for(var t=0;t]*>/,"");var e=new ActiveXObject("Microsoft.XMLDOM");e.async="false";e.loadXML(t);return e}};N.Property=function(t,e){this.name=t;this.value=e};N.Property.prototype.getValue=function(){return this.value};N.Property.prototype.hasValue=function(){return this.value!=null&&this.value!=""};N.Property.prototype.numValue=function(){if(!this.hasValue()){return 0}var t=parseFloat(this.value);if((this.value+"").match(/%$/)){t=t/100}return t};N.Property.prototype.valueOrDefault=function(t){if(this.hasValue()){return this.value}return t};N.Property.prototype.numValueOrDefault=function(t){if(this.hasValue()){return this.numValue()}return t};N.Property.prototype.addOpacity=function(t){var e=this.value;if(t.value!=null&&t.value!=""&&typeof this.value=="string"){var n=new Kx(this.value);if(n.ok){e="rgba("+n.r+", "+n.g+", "+n.b+", "+t.numValue()+")"}}return new N.Property(this.name,e)};N.Property.prototype.getDefinition=function(){var t=this.value.match(/#([^\)'"]+)/);if(t){t=t[1]}if(!t){t=this.value}return N.Definitions[t]};N.Property.prototype.isUrlDefinition=function(){return this.value.indexOf("url(")==0};N.Property.prototype.getFillStyleDefinition=function(t,e){var n=this.getDefinition();if(n!=null&&n.createGradient){return n.createGradient(N.ctx,t,e)}if(n!=null&&n.createPattern){if(n.getHrefAttribute().hasValue()){var i=n.attribute("patternTransform");n=n.getHrefAttribute().getDefinition();if(i.hasValue()){n.attribute("patternTransform",true).value=i.value}}return n.createPattern(N.ctx,t)}return null};N.Property.prototype.getDPI=function(t){return 96};N.Property.prototype.getEM=function(t){var e=12;var n=new N.Property("fontSize",N.Font.Parse(N.ctx.font).fontSize);if(n.hasValue()){e=n.toPixels(t)}return e};N.Property.prototype.getUnits=function(){var t=this.value+"";return t.replace(/[0-9\.\-]/g,"")};N.Property.prototype.toPixels=function(t,e){if(!this.hasValue()){return 0}var n=this.value+"";if(n.match(/em$/)){return this.numValue()*this.getEM(t)}if(n.match(/ex$/)){return this.numValue()*this.getEM(t)/2}if(n.match(/px$/)){return this.numValue()}if(n.match(/pt$/)){return this.numValue()*this.getDPI(t)*(1/72)}if(n.match(/pc$/)){return this.numValue()*15}if(n.match(/cm$/)){return this.numValue()*this.getDPI(t)/2.54}if(n.match(/mm$/)){return this.numValue()*this.getDPI(t)/25.4}if(n.match(/in$/)){return this.numValue()*this.getDPI(t)}if(n.match(/%$/)){return this.numValue()*N.ViewPort.ComputeSize(t)}var i=this.numValue();if(e&&i<1){return i*N.ViewPort.ComputeSize(t)}return i};N.Property.prototype.toMilliseconds=function(){if(!this.hasValue()){return 0}var t=this.value+"";if(t.match(/s$/)){return this.numValue()*1e3}if(t.match(/ms$/)){return this.numValue()}return this.numValue()};N.Property.prototype.toRadians=function(){if(!this.hasValue()){return 0}var t=this.value+"";if(t.match(/deg$/)){return this.numValue()*(Math.PI/180)}if(t.match(/grad$/)){return this.numValue()*(Math.PI/200)}if(t.match(/rad$/)){return this.numValue()}return this.numValue()*(Math.PI/180)};var e={baseline:"alphabetic","before-edge":"top","text-before-edge":"top",middle:"middle",central:"middle","after-edge":"bottom","text-after-edge":"bottom",ideographic:"ideographic",alphabetic:"alphabetic",hanging:"hanging",mathematical:"alphabetic"};N.Property.prototype.toTextBaseline=function(){if(!this.hasValue()){return null}return e[this.value]};N.Font=new function(){this.Styles="normal|italic|oblique|inherit";this.Variants="normal|small-caps|inherit";this.Weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";this.CreateFont=function(t,e,n,i,r,o){var a=o!=null?this.Parse(o):this.CreateFont("","","","","",N.ctx.font);return{fontFamily:r||a.fontFamily,fontSize:i||a.fontSize,fontStyle:t||a.fontStyle,fontWeight:n||a.fontWeight,fontVariant:e||a.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var a=this;this.Parse=function(t){var e={};var n=N.trim(N.compressSpaces(t||"")).split(" ");var i={fontSize:false,fontStyle:false,fontWeight:false,fontVariant:false};var r="";for(var o=0;othis.x2){this.x2=t}}if(e!=null){if(isNaN(this.y1)||isNaN(this.y2)){this.y1=e;this.y2=e}if(ethis.y2){this.y2=e}}};this.addX=function(t){this.addPoint(t,null)};this.addY=function(t){this.addPoint(null,t)};this.addBoundingBox=function(t){this.addPoint(t.x1,t.y1);this.addPoint(t.x2,t.y2)};this.addQuadraticCurve=function(t,e,n,i,r,o){var a=t+2/3*(n-t);var s=e+2/3*(i-e);var u=a+1/3*(r-t);var h=s+1/3*(o-e);this.addBezierCurve(t,e,a,u,s,h,r,o)};this.addBezierCurve=function(t,e,n,i,r,o,a,s){var u=this;var h=[t,e],l=[n,i],f=[r,o],c=[a,s];this.addPoint(h[0],h[1]);this.addPoint(c[0],c[1]);for(var d=0;d<=1;d++){var p=function(t){return Math.pow(1-t,3)*h[d]+3*Math.pow(1-t,2)*t*l[d]+3*(1-t)*Math.pow(t,2)*f[d]+Math.pow(t,3)*c[d]};var g=6*h[d]-12*l[d]+6*f[d];var v=-3*h[d]+9*l[d]-9*f[d]+3*c[d];var _=3*l[d]-3*h[d];if(v==0){if(g==0){continue}var y=-_/g;if(0=0;n--){e.transforms[n].unapply(t)}};this.applyToPoint=function(t){var e=this;for(var n=0;no){t.styles[r]=n[r];t.stylesSpecificity[r]=i}}}}}};if(a!=null&&a.nodeType==1){for(var e=0;e0){e.push([this.points[this.points.length-1],e[e.length-1][1]])}return e}};N.Element.polyline.prototype=new N.Element.PathElementBase;N.Element.polygon=function(t){this.base=N.Element.polyline;this.base(t);this.basePath=this.path;this.path=function(t){var e=this.basePath(t);if(t!=null){t.lineTo(this.points[0].x,this.points[0].y);t.closePath()}return e}};N.Element.polygon.prototype=new N.Element.polyline;N.Element.path=function(t){this.base=N.Element.PathElementBase;this.base(t);var e=this.attribute("d").value;e=e.replace(/,/gm," ");for(var n=0;n<2;n++){e=e.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2")}e=e.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");e=e.replace(/([0-9])([+\-])/gm,"$1 $2");for(var n=0;n<2;n++){e=e.replace(/(\.[0-9]*)(\.)/gm,"$1 $2")}e=e.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");e=N.compressSpaces(e);e=N.trim(e);this.PathParser=new function(t){this.tokens=t.split(" ");this.reset=function(){this.i=-1;this.command="";this.previousCommand="";this.start=new N.Point(0,0);this.control=new N.Point(0,0);this.current=new N.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){if(this.isEnd()){return true}return this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){switch(this.command){case"m":case"l":case"h":case"v":case"c":case"s":case"q":case"t":case"a":case"z":return true;break}return false};this.getToken=function(){this.i++;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){var t=new N.Point(this.getScalar(),this.getScalar());return this.makeAbsolute(t)};this.getAsControlPoint=function(){var t=this.getPoint();this.control=t;return t};this.getAsCurrentPoint=function(){var t=this.getPoint();this.current=t;return t};this.getReflectedControlPoint=function(){if(this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"&&this.previousCommand.toLowerCase()!="q"&&this.previousCommand.toLowerCase()!="t"){return this.current}var t=new N.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y);return t};this.makeAbsolute=function(t){if(this.isRelativeCommand()){t.x+=this.current.x;t.y+=this.current.y}return t};this.addMarker=function(t,e,n){if(n!=null&&this.angles.length>0&&this.angles[this.angles.length-1]==null){this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(n)}this.addMarkerAngle(t,e==null?null:e.angleTo(t))};this.addMarkerAngle=function(t,e){this.points.push(t);this.angles.push(e)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){var t=this;for(var e=0;e1){l*=Math.sqrt(v);f*=Math.sqrt(v)}var _=(d==p?-1:1)*Math.sqrt((Math.pow(l,2)*Math.pow(f,2)-Math.pow(l,2)*Math.pow(g.y,2)-Math.pow(f,2)*Math.pow(g.x,2))/(Math.pow(l,2)*Math.pow(g.y,2)+Math.pow(f,2)*Math.pow(g.x,2)));if(isNaN(_)){_=0}var y=new N.Point(_*l*g.y/f,_*-f*g.x/l);var m=new N.Point((a.x+h.x)/2+Math.cos(c)*y.x-Math.sin(c)*y.y,(a.y+h.y)/2+Math.sin(c)*y.x+Math.cos(c)*y.y);var b=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2))};var x=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(b(t)*b(e))};var w=function(t,e){return(t[0]*e[1]=1){A=0}var k=1-p?1:-1;var M=C+k*(A/2);var T=new N.Point(m.x+l*Math.cos(M),m.y+f*Math.sin(M));e.addMarkerAngle(T,M-k*Math.PI/2);e.addMarkerAngle(h,M-k*Math.PI);n.addPoint(h.x,h.y);if(t!=null){var x=l>f?l:f;var B=l>f?1:l/f;var D=l>f?f/l:1;t.translate(m.x,m.y);t.rotate(c);t.scale(B,D);t.arc(0,0,x,C,C+A,1-p);t.scale(1/B,1/D);t.rotate(-c);t.translate(-m.x,-m.y)}}break;case"Z":case"z":if(t!=null){t.closePath()}e.current=e.start}}return n};this.getMarkers=function(){var t=this.PathParser.getMarkerPoints();var e=this.PathParser.getMarkerAngles();var n=[];for(var i=0;i1){this.offset=1}var e=this.style("stop-color",true);if(e.value==""){e.value="#000"}if(this.style("stop-opacity").hasValue()){e=e.addOpacity(this.style("stop-opacity"))}this.color=e.value};N.Element.stop.prototype=new N.Element.ElementBase;N.Element.AnimateBase=function(t){this.base=N.Element.ElementBase;this.base(t);N.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").toMilliseconds();this.getProperty=function(){var t=this.attribute("attributeType").value;var e=this.attribute("attributeName").value;if(t=="CSS"){return this.parent.style(e,true)}return this.parent.attribute(e,true)};this.initialValue=null;this.initialUnits="";this.removed=false;this.calcValue=function(){return""};this.update=function(t){if(this.initialValue==null){this.initialValue=this.getProperty().value;this.initialUnits=this.getProperty().getUnits()}if(this.duration>this.maxDuration){if(this.attribute("repeatCount").value=="indefinite"||this.attribute("repeatDur").value=="indefinite"){this.duration=0}else if(this.attribute("fill").valueOrDefault("remove")=="freeze"&&!this.frozen){this.frozen=true;this.parent.animationFrozen=true;this.parent.animationFrozenValue=this.getProperty().value}else if(this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed){this.removed=true;this.getProperty().value=this.parent.animationFrozen?this.parent.animationFrozenValue:this.initialValue;return true}return false}this.duration=this.duration+t;var e=false;if(this.beginn&&a.attribute("x").hasValue()){break}r+=a.measureTextRecursive(t)}return-1*(i=="end"?r:r/2)}return 0};this.renderChild=function(t,e,n,i){var r=n.children[i];if(r.attribute("x").hasValue()){r.x=r.attribute("x").toPixels("x")+e.getAnchorDelta(t,n,i);if(r.attribute("dx").hasValue()){r.x+=r.attribute("dx").toPixels("x")}}else{if(r.attribute("dx").hasValue()){e.x+=r.attribute("dx").toPixels("x")}r.x=e.x}e.x=r.x+r.measureText(t);if(r.attribute("y").hasValue()){r.y=r.attribute("y").toPixels("y");if(r.attribute("dy").hasValue()){r.y+=r.attribute("dy").toPixels("y")}}else{if(r.attribute("dy").hasValue()){e.y+=r.attribute("dy").toPixels("y")}r.y=e.y}e.y=r.y;r.render(t);for(var i=0;i0&&e[n-1]!=" "&&n0&&e[n-1]!=" "&&(n==e.length-1||e[n+1]==" ")){o="initial"}if(typeof t.glyphs[i]!="undefined"){r=t.glyphs[i][o];if(r==null&&t.glyphs[i].type=="glyph"){r=t.glyphs[i]}}}else{r=t.glyphs[i]}if(r==null){r=t.missingGlyph}return r};this.renderChildren=function(t){var e=this;var n=this.parent.style("font-family").getDefinition();if(n!=null){var i=this.parent.style("font-size").numValueOrDefault(N.Font.Parse(N.ctx.font).fontSize);var r=this.parent.style("font-style").valueOrDefault(N.Font.Parse(N.ctx.font).fontStyle);var o=this.getText();if(n.isRTL){o=o.split("").reverse().join("")}var a=N.ToNumberArray(this.parent.attribute("dx").value);for(var s=0;s0){return""}return this.text}};N.Element.tspan.prototype=new N.Element.TextElementBase;N.Element.tref=function(t){this.base=N.Element.TextElementBase;this.base(t);this.getText=function(){var t=this.getHrefAttribute().getDefinition();if(t!=null){return t.children[0].getText()}}};N.Element.tref.prototype=new N.Element.TextElementBase;N.Element.a=function(t){var e=this;this.base=N.Element.TextElementBase;this.base(t);this.hasText=t.childNodes.length>0;for(var n=0;n0){var n=new N.Element.g;n.children=this.children;n.parent=this;n.render(t)}};this.onclick=function(){window.open(this.getHrefAttribute().value)};this.onmousemove=function(){N.ctx.canvas.style.cursor="pointer"}};N.Element.a.prototype=new N.Element.TextElementBase;N.Element.image=function(t){this.base=N.Element.RenderedElementBase;this.base(t);var e=this.getHrefAttribute().value;if(e==""){return}var o=e.match(/\.svg$/);N.Images.push(this);this.loaded=false;if(!o){this.img=document.createElement("img");if(N.opts["useCORS"]==true){this.img.crossOrigin="Anonymous"}var n=this;this.img.onload=function(){n.loaded=true};this.img.onerror=function(){N.log('ERROR: image "'+e+'" not found');n.loaded=true};this.img.src=e}else{this.img=N.ajax(e);this.loaded=true}this.renderChildren=function(t){var e=this.attribute("x").toPixels("x");var n=this.attribute("y").toPixels("y");var i=this.attribute("width").toPixels("x");var r=this.attribute("height").toPixels("y");if(i==0||r==0){return}t.save();if(o){t.drawSvg(this.img,e,n,i,r)}else{t.translate(e,n);N.AspectRatio(t,this.attribute("preserveAspectRatio").value,i,this.img.width,r,this.img.height,0,0);t.drawImage(this.img,0,0)}t.restore()};this.getBoundingBox=function(){var t=this.attribute("x").toPixels("x");var e=this.attribute("y").toPixels("y");var n=this.attribute("width").toPixels("x");var i=this.attribute("height").toPixels("y");return new N.BoundingBox(t,e,t+n,e+i)}};N.Element.image.prototype=new N.Element.RenderedElementBase;N.Element.g=function(t){this.base=N.Element.RenderedElementBase;this.base(t);this.getBoundingBox=function(){var t=this;var e=new N.BoundingBox;for(var n=0;n0){var _=g[v].indexOf("url");var y=g[v].indexOf(")",_);var m=g[v].substr(_+5,y-_-6);var b=N.parseXml(N.ajax(m));var x=b.getElementsByTagName("font");for(var w=0;w0&&!qa(this).selectAll("image, img, svg").size()){var k=this.cloneNode(true);qa(k).selectAll("*").each(function(){qa(this).call(iE);if(qa(this).attr("opacity")==="0"){this.parentNode.removeChild(this)}});$.push(Object.assign({},n,{type:"svg",value:k,tag:e}))}else if(this.childNodes.length>0){Q(this,n)}else{var M=this.cloneNode(true);qa(M).selectAll("*").each(function(){if(qa(this).attr("opacity")==="0"){this.parentNode.removeChild(this)}});if(e==="line"){qa(M).attr("x1",parseFloat(qa(M).attr("x1"))+n.x);qa(M).attr("x2",parseFloat(qa(M).attr("x2"))+n.x);qa(M).attr("y1",parseFloat(qa(M).attr("y1"))+n.y);qa(M).attr("y2",parseFloat(qa(M).attr("y2"))+n.y)}else if(e==="path"){var T=aE(M);var B=T[0];var D=T[1];var N=T[2];if(qa(M).attr("transform")){qa(M).attr("transform","scale("+B+")translate("+(D+n.x)+","+(N+n.y)+")")}}qa(M).call(iE);var P=qa(M).attr("fill");var z=P&&P.indexOf("url")===0;$.push(Object.assign({},n,{type:"svg",value:M,tag:e}));if(z){var O=qa(P.slice(4,-1)).node().cloneNode(true);var F=(O.tagName||"").toLowerCase();if(F==="pattern"){var R=aE(M);var I=R[0];var L=R[1];var j=R[2];n.scale*=I;n.x+=L;n.y+=j;Q(O,n)}}}}function Q(t,e){$a(t.childNodes).each(function(){i.bind(this)(e)})}for(var r=0;r"+r+"";c.save();c.translate(H.padding,H.padding);nE(f,u,Object.assign({},oE,{offsetX:e.x,offsetY:e.y}));c.restore();break;case"svg":var h=l?(new XMLSerializer).serializeToString(e.value):e.value.outerHTML;c.save();c.translate(H.padding+n.x,H.padding+n.y);c.rect(0,0,n.width,n.height);c.clip();nE(f,h,Object.assign({},oE,{offsetX:e.x+n.x,offsetY:e.y+n.y}));c.restore();break;default:console.warn("uncaught",e);break}}H.callback(f)}};(function(t){"use strict";var f=t.Uint8Array,e=t.HTMLCanvasElement,n=e&&e.prototype,u=/\s*;\s*base64\s*(?:;|$)/i,h="toDataURL",c,l=function(t){var e=t.length,n=new f(e/4*3|0),i=0,r=0,o=[0,0],a=0,s=0,u,h,l;while(e--){h=t.charCodeAt(i++);u=c[h-43];if(u!==255&&u!==l){o[1]=o[0];o[0]=h;s=s<<6|u;a++;if(a===4){n[r++]=s>>>16;if(o[1]!==61){n[r++]=s>>>8}if(o[0]!==61){n[r++]=s}a=0}}}return n};if(f){c=new f([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51])}if(e&&(!n.toBlob||!n.toBlobHD)){if(!n.toBlob){n.toBlob=function(t,e){if(!e){e="image/png"}if(this.mozGetAsFile){t(this.mozGetAsFile("canvas",e));return}if(this.msToBlob&&/^\s*image\/png\s*(?:$|;)/i.test(e)){t(this.msToBlob());return}var n=Array.prototype.slice.call(arguments,1),i=this[h].apply(this,n),r=i.indexOf(","),o=i.substring(r+1),a=u.test(i.substring(0,r)),s;if(Blob.fake){s=new Blob;if(a){s.encoding="base64"}else{s.encoding="URI"}s.data=o;s.size=o.length}else if(f){if(a){s=new Blob([l(o)],{type:e})}else{s=new Blob([decodeURIComponent(o)],{type:e})}}t(s)}}if(!n.toBlobHD&&n.toDataURLHD){n.toBlobHD=function(){h="toDataURLHD";var t=this.toBlob();h="toDataURL";return t}}else{n.toBlobHD=n.toBlob}}})(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||ob.content||ob);var uE=sb(function(t){var e=e||function(h){"use strict";if(typeof h==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=h.document,l=function(){return h.URL||h.webkitURL||h},f=t.createElementNS("http://www.w3.org/1999/xhtml","a"),c="download"in f,d=function(t){var e=new MouseEvent("click");t.dispatchEvent(e)},p=/constructor/i.test(h.HTMLElement)||h.safari,g=/CriOS\/[\d]+/.test(navigator.userAgent),o=function(t){(h.setImmediate||h.setTimeout)(function(){throw t},0)},v="application/octet-stream",n=1e3*40,_=function(t){var e=function(){if(typeof t==="string"){l().revokeObjectURL(t)}else{t.remove()}};setTimeout(e,n)},y=function(t,e,n){e=[].concat(e);var i=e.length;while(i--){var r=t["on"+e[i]];if(typeof r==="function"){try{r.call(t,n||t)}catch(t){o(t)}}}},m=function(t){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)){return new Blob([String.fromCharCode(65279),t],{type:t.type})}return t},i=function(e,t,n){if(!n){e=m(e)}var i=this,r=e.type,o=r===v,a,s=function(){y(i,"writestart progress write writeend".split(" "))},u=function(){if((g||o&&p)&&h.FileReader){var n=new FileReader;n.onloadend=function(){var t=g?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");var e=h.open(t,"_blank");if(!e){h.location.href=t}t=undefined;i.readyState=i.DONE;s()};n.readAsDataURL(e);i.readyState=i.INIT;return}if(!a){a=l().createObjectURL(e)}if(o){h.location.href=a}else{var t=h.open(a,"_blank");if(!t){h.location.href=a}}i.readyState=i.DONE;s();_(a)};i.readyState=i.INIT;if(c){a=l().createObjectURL(e);setTimeout(function(){f.href=a;f.download=t;d(f);s();_(a);i.readyState=i.DONE});return}u()},e=i.prototype,r=function(t,e,n){return new i(t,e||t.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(t,e,n){e=e||t.name||"download";if(!n){t=m(t)}return navigator.msSaveOrOpenBlob(t,e)}}e.abort=function(){};e.readyState=e.INIT=0;e.WRITING=1;e.DONE=2;e.error=e.onwritestart=e.onprogress=e.onwrite=e.onabort=e.onerror=e.onwriteend=null;return r}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||ob.content);if("object"!=="undefined"&&t.exports){t.exports.saveAs=e}else if(typeof undefined!=="undefined"&&undefined!==null&&undefined.amd!==null){undefined("FileSaver.js",function(){return e})}});var hE=uE.saveAs;var lE={filename:"download",type:"png"};var fE=function(t,e,n){if(e===void 0){e={}}if(n===void 0){n={}}if(!t){return}e=Object.assign({},lE,e);var i=new RegExp(/(MSIE|Trident\/|Edge\/)/i).test(navigator.userAgent);if(!(t instanceof Array)&&e.type==="svg"){var r=i?(new XMLSerializer).serializeToString(t):t.outerHTML;hE(new Blob([r],{type:"application/svg+xml"}),e.filename+".svg")}sE(t,Object.assign({},n,{callback:function(t){if(n.callback){n.callback(t)}if(["jpg","png"].includes(e.type)){t.toBlob(function(t){return hE(t,e.filename)})}}}))};var cE={Button:hb,Radio:lb,Select:fb};var dE=function(){var l=this;var f=this;var c=["left","right","top","bottom"];var t=function(t){var s=c[t];var u=(l._controls||[]).filter(function(t){return!t.position&&s==="bottom"||t.position===s});if(l._downloadButton&&l._downloadPosition===s){u.push({data:[{text:"Download",value:1}],label:"downloadButton",on:{click:function(){var t=l._detectResize;if(t){l.detectResize(false).render()}fE(l._select.node(),Object.assign({title:l._title||undefined},l._downloadConfig),{callback:function(){setTimeout(function(){if(t){l.detectResize(t).render()}},5e3)}})}},type:"Button"})}var e=s==="top"||s==="bottom";var n={height:e?l._height-(l._margin.top+l._margin.bottom):l._height-(l._margin.top+l._margin.bottom+l._padding.top+l._padding.bottom),width:e?l._width-(l._margin.left+l._margin.right+l._padding.left+l._padding.right):l._width-(l._margin.left+l._margin.right)};n.x=(e?l._margin.left+l._padding.left:l._margin.left)+(s==="right"?n.width:0);n.y=(e?l._margin.top:l._margin.top+l._padding.top)+(s==="bottom"?n.height:0);var i=Ku("foreignObject.d3plus-viz-controls-"+s,{condition:u.length,enter:Object.assign({opacity:0},n),exit:Object.assign({opacity:0},n),parent:l._select,transition:l._transition,update:{height:n.height,opacity:1,width:n.width}});var h=i.selectAll("div.d3plus-viz-controls-container").data([null]);h=h.enter().append("xhtml:div").attr("class","d3plus-viz-controls-container").merge(h);if(u.length){var r=function(t){var e=Object.assign({},u[t]);var n={};if(e.on){var i=function(t){if({}.hasOwnProperty.call(e.on,t)){n[t]=function(){e.on[t].bind(f)(this.value)}}};for(var r in e.on){i(r)}}var o=e.label||s+"-"+t;if(!l._controlCache[o]){var a=e.type&&cE[e.type]?e.type:"Select";l._controlCache[o]=(new cE[a]).container(h.node());if(e.checked){l._controlCache[o].checked(e.checked)}if(e.selected){l._controlCache[o].selected(e.selected)}}delete e.checked;delete e.selected;l._controlCache[o].config(e).config({on:n}).config(l._controlConfig).render()};for(var o=0;o1||this._colorScale?s:[]).height(i?this._height-(this._margin.bottom+this._margin.top):this._height-(this._margin.bottom+this._margin.top+this._padding.bottom+this._padding.top)).select(a).verticalAlign(!i?"middle":n).width(i?this._width-(this._margin.left+this._margin.right+this._padding.left+this._padding.right):this._width-(this._margin.left+this._margin.right)).shapeConfig(Qu.bind(this)(this._shapeConfig,"legend")).config(this._legendConfig).shapeConfig({fill:u,opacity:h}).render();if(!this._legendConfig.select&&e.height){if(i){this._margin[n]+=e.height+this._legendClass.padding()*2}else{this._margin[n]+=e.width+this._legendClass.padding()*2}}}};function vE(n){var i=this;if(JSON.stringify(n)!==JSON.stringify(this._timelineSelection)){this._timelineSelection=n;if(!(n instanceof Array)){n=[n,n]}n=n.map(Number);this.timeFilter(function(t){var e=wd(i._time(t)).getTime();return e>=n[0]&&e<=n[1]}).render()}}var _E=function(t){var e=this;if(t===void 0){t=[]}var n=this._time&&this._timeline;var i=n?Array.from(new Set(this._data.map(this._time))).map(wd):[];n=n&&i.length>1;var r={transform:"translate("+(this._margin.left+this._padding.left)+", 0)"};var o=Ku("g.d3plus-viz-timeline",{condition:n,enter:r,parent:this._select,transition:this._transition,update:r}).node();if(n){var a=this._timelineClass.domain(Ht(i)).duration(this._duration).height(this._height-this._margin.bottom).select(o).ticks(i.sort(function(t,e){return+t-+e})).width(this._width-(this._margin.left+this._margin.right+this._padding.left+this._padding.right));if(this._timelineSelection===void 0){var s=Ht(t.map(this._time).map(wd));this._timelineSelection=s[0]===s[1]?s[0]:s;a.selection(this._timelineSelection)}var u=this._timelineConfig;a.config(u).on("brush",function(t){vE.bind(e)(t);if(u.on&&u.on.brush){u.on.brush(t)}}).on("end",function(t){vE.bind(e)(t);if(u.on&&u.on.end){u.on.end(t)}}).render();this._margin.bottom+=a.outerBounds().height+a.padding()*2}};var yE=function(t){if(t===void 0){t=[]}var e=this._title?this._title(t):false;var n={transform:"translate("+(this._margin.left+this._padding.left)+", "+this._margin.top+")"};var i=Ku("g.d3plus-viz-title",{enter:n,parent:this._select,transition:this._transition,update:n}).node();this._titleClass.data(e?[{text:e}]:[]).select(i).width(this._width-(this._margin.left+this._margin.right+this._padding.left+this._padding.right)).config(this._titleConfig).render();this._margin.top+=e?i.getBBox().height:0};var mE=function(t){if(t===void 0){t=[]}var e=typeof this._total==="function"?Xt(t.map(this._total)):this._total===true&&this._size?Xt(t.map(this._size)):false;var n={transform:"translate("+(this._margin.left+this._padding.left)+", "+this._margin.top+")"};var i=Ku("g.d3plus-viz-total",{enter:n,parent:this._select,transition:this._transition,update:n}).node();var r=typeof e==="number";this._totalClass.data(r?[{text:"Total: "+e}]:[]).select(i).width(this._width-(this._margin.left+this._margin.right+this._padding.left+this._padding.right)).config(this._totalConfig).render();this._margin.top+=r?i.getBBox().height:0};function bE(t,e){if(!t){return undefined}if(t.tagName===undefined||["BODY","HTML"].indexOf(t.tagName)>=0){var n=window["inner"+(e.charAt(0).toUpperCase()+e.slice(1))];var i=qa(t);if(e==="width"){n-=parseFloat(i.style("margin-left"),10);n-=parseFloat(i.style("margin-right"),10);n-=parseFloat(i.style("padding-left"),10);n-=parseFloat(i.style("padding-right"),10)}else{n-=parseFloat(i.style("margin-top"),10);n-=parseFloat(i.style("margin-bottom"),10);n-=parseFloat(i.style("padding-top"),10);n-=parseFloat(i.style("padding-bottom"),10)}return n}else{var r=parseFloat(qa(t).style(e),10);if(typeof r==="number"&&r>0){return r}else{return bE(t.parentNode,e)}}}var xE=function(t){return[bE(t,"width"),bE(t,"height")]};var wE=function(t,e){if(e===void 0){e=0}var n=window.pageXOffset!==undefined?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var i=window.pageYOffset!==undefined?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var r=t.getBoundingClientRect();var o=r.height,a=r.left+n,s=r.top+i,u=r.width;return i+window.innerHeight>s+e&&i+ea+e&&n+e0){i.x=0}else if(i.x0){i.y=0}else if(i.y\n Loading Visualization\n Powered by D3plus\n ');this._loadingMessage=true;this._locale="en-US";this._lrucache=ub(10);this._messageClass=new Yx;this._messageMask="rgba(0, 0, 0, 0.1)";this._messageStyle={left:"0px",position:"absolute","text-align":"center",top:"45%",width:"100%"};this._noDataHTML=Zu("\n
        \n No Data Available\n
        ");this._noDataMessage=true;this._on={click:CE.bind(this),mouseenter:EE.bind(this),mouseleave:SE.bind(this),"mousemove.shape":kE.bind(this),"mousemove.legend":AE.bind(this)};this._queue=[];this._scrollContainer=typeof window===undefined?"":window;this._shape=Zu("Rect");this._shapes=[];this._shapeConfig={fill:function(t,e){while(t.__d3plus__&&t.data){t=t.data;e=t.i}if(o._colorScale){var n=o._colorScale(t,e);if(n!==undefined&&n!==null){var i=o._colorScaleClass._colorScale;if(!i.domain().length){return i.range()[i.range().length-1]}return i(n)}}var r=o._color(t,e);if(Q(r)){return r}return mh(r)},labelConfig:{fontColor:function(t,e){var n=typeof o._shapeConfig.fill==="function"?o._shapeConfig.fill(t,e):o._shapeConfig.fill;return bh(n)}},opacity:Zu(1),stroke:function(t,e){var n=typeof o._shapeConfig.fill==="function"?o._shapeConfig.fill(t,e):o._shapeConfig.fill;return Q(n).darker()},strokeWidth:Zu(0)};this._timeline=true;this._timelineClass=(new xb).align("end");this._timelineConfig={};this._titleClass=new Ac;this._titleConfig={fontSize:12,padding:5,resize:false,textAnchor:"middle"};this._tooltip=true;this._tooltipClass=new Gx;this._tooltipConfig={duration:50,pointerEvents:"none",titleStyle:{"max-width":"200px"}};this._totalClass=new Ac;this._totalConfig={fontSize:10,padding:5,resize:false,textAnchor:"middle"};this._zoom=false;this._zoomBehavior=rb();this._zoomBrush=zm();this._zoomBrushHandleSize=1;this._zoomBrushHandleStyle={fill:"#444"};this._zoomBrushSelectionStyle={fill:"#777","stroke-width":0};this._zoomControlStyle={background:"rgba(255, 255, 255, 0.75)",border:"1px solid rgba(0, 0, 0, 0.75)",color:"rgba(0, 0, 0, 0.75)",display:"block",font:"900 15px/21px 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",height:"20px",margin:"5px",opacity:.75,padding:0,"text-align":"center",width:"20px"};this._zoomControlStyleActive={background:"rgba(0, 0, 0, 0.75)",color:"rgba(255, 255, 255, 0.75)",opacity:1};this._zoomControlStyleHover={cursor:"pointer",opacity:1};this._zoomFactor=2;this._zoomMax=16;this._zoomPadding=20;this._zoomPan=true;this._zoomScroll=true}if(e){t.__proto__=e}t.prototype=Object.create(e&&e.prototype);t.prototype.constructor=t;t.prototype._preDraw=function t(){var i=this;var r=this;this._drawDepth=this._depth!==void 0?this._depth:this._groupBy.length-1;this._id=this._groupBy[this._drawDepth];this._ids=function(e,n){return i._groupBy.map(function(t){return!e||e.__d3plus__&&!e.data?undefined:t(e.__d3plus__?e.data:e,e.__d3plus__?e.i:n)}).filter(function(t){return t!==undefined&&t!==null&&t.constructor!==Array})};this._drawLabel=function(t,e){if(!t){return""}while(t.__d3plus__&&t.data){t=t.data;e=t.i}if(i._label){return i._label(t,e)}var n=r._ids(t,e).slice(0,i._drawDepth+1);return n[n.length-1]};if(this._time&&this._timeFilter===void 0&&this._data.length){var e=this._data.map(this._time).map(wd);var n=this._data[0],o=0;if(this._discrete&&"_"+this._discrete in this&&this["_"+this._discrete](n,o)===this._time(n,o)){this._timeFilter=function(){return true}}else{var a=+Ut(e);this._timeFilter=function(t,e){return+wd(i._time(t,e))===a}}}this._filteredData=[];var s=[];if(this._data.length){s=this._timeFilter?this._data.filter(this._timeFilter):this._data;if(this._filter){s=s.filter(this._filter)}var u=Gt();for(var h=0;h<=this._drawDepth;h++){u.key(i._groupBy[h])}if(this._discrete&&"_"+this._discrete in this){u.key(this["_"+this._discrete])}if(this._discrete&&"_"+this._discrete+"2"in this){u.key(this["_"+this._discrete+"2"])}u.rollup(function(t){return i._filteredData.push(Ju(t,i._aggs))}).entries(s)}if(this._noDataMessage&&!this._filteredData.length){this._messageClass.render({container:this._select.node().parentNode,html:this._noDataHTML(this),mask:this._messageMask,style:this._messageStyle})}};t.prototype._draw=function t(){if(this.legendPosition()==="left"||this.legendPosition()==="right"){gE.bind(this)(this._filteredData)}if(this.colorScalePosition()==="left"||this.colorScalePosition()==="right"){Qx.bind(this)(this._filteredData)}$x.bind(this)();yE.bind(this)(this._filteredData);mE.bind(this)(this._filteredData);_E.bind(this)(this._filteredData);dE.bind(this)(this._filteredData);if(this.legendPosition()==="top"||this.legendPosition()==="bottom"){gE.bind(this)(this._filteredData)}if(this.colorScalePosition()==="top"||this.colorScalePosition()==="bottom"){Qx.bind(this)(this._filteredData)}this._shapes=[]};t.prototype.render=function t(r){var o=this;this._margin={bottom:0,left:0,right:0,top:0};this._padding={bottom:0,left:0,right:0,top:0};this._transition=Pu().duration(this._duration);if(this._select===void 0||this._select.node().tagName.toLowerCase()!=="svg"){var e=this._select===void 0?qa("body").append("div"):this._select;var n=xE(e.node());var i=n[0];var a=n[1];var s=e.append("svg");i-=parseFloat(s.style("border-left-width"),10);i-=parseFloat(s.style("border-right-width"),10);a-=parseFloat(s.style("border-top-width"),10);a-=parseFloat(s.style("border-bottom-width"),10);if(!this._width){this._autoWidth=true;this.width(i)}if(!this._height){this._autoHeight=true;this.height(a)}s.style("width",this._width+"px").style("height",this._height+"px");this.select(s.node())}if(!this._width||!this._height){var u=xE(this._select.node());var h=u[0];var l=u[1];if(!this._width){this.width(h)}if(!this._height){this.height(l)}}this._select.transition(this._transition).style("width",this._width+"px").style("height",this._height+"px");clearInterval(this._visiblePoll);clearTimeout(this._resizePoll);qa(this._scrollContainer).on("scroll."+this._uuid,null);qa(this._scrollContainer).on("resize."+this._uuid,null);if(this._detectVisible&&this._select.style("visibility")==="hidden"){this._visiblePoll=setInterval(function(){if(o._select.style("visibility")!=="hidden"){clearInterval(o._visiblePoll);o.render(r)}},this._detectVisibleInterval)}else if(this._detectVisible&&this._select.style("display")==="none"){this._visiblePoll=setInterval(function(){if(o._select.style("display")!=="none"){clearInterval(o._visiblePoll);o.render(r)}},this._detectVisibleInterval)}else if(this._detectVisible&&!wE(this._select.node())){qa(this._scrollContainer).on("scroll."+this._uuid,function(){if(wE(o._select.node())){qa(o._scrollContainer).on("scroll."+o._uuid,null);o.render(r)}})}else{var f=Wm();if(this._loadingMessage){this._messageClass.render({container:this._select.node().parentNode,html:this._loadingHTML(this),mask:this._messageMask,style:this._messageStyle})}this._queue.forEach(function(t){var e=o._cache?o._lrucache.get(t[1]):undefined;if(!e){f.defer.apply(f,t)}else{o["_"+t[3]]=e}});this._queue=[];f.awaitAll(function(){o._preDraw();o._draw(r);BE.bind(o)();if(o._messageClass._isVisible&&(!o._noDataMessage||o._filteredData.length)){o._messageClass.hide()}if(o._detectResize&&(o._autoWidth||o._autoHeight)){qa(o._scrollContainer).on("resize."+o._uuid,function(){clearTimeout(o._resizePoll);o._resizePoll=setTimeout(function(){clearTimeout(o._resizePoll);var t=o._select.style("display");o._select.style("display","none");var e=xE(o._select.node().parentNode);var n=e[0];var i=e[1];n-=parseFloat(o._select.style("border-left-width"),10);n-=parseFloat(o._select.style("border-right-width"),10);i-=parseFloat(o._select.style("border-top-width"),10);i-=parseFloat(o._select.style("border-bottom-width"),10);o._select.style("display",t);if(o._autoWidth){o.width(n)}if(o._autoHeight){o.height(i)}o.render(r)},o._detectResizeDelay)})}if(r){setTimeout(r,o._duration+100)}})}qa("body").on("touchstart."+this._uuid,ME.bind(this));return this};t.prototype.active=function t(e){this._active=e;if(this._shapeConfig.activeOpacity!==1){this._shapes.forEach(function(t){return t.active(e)});if(this._legend){this._legendClass.active(e)}}return this};t.prototype.aggs=function t(e){return arguments.length?(this._aggs=Vu(this._aggs,e),this):this._aggs};t.prototype.backConfig=function t(e){return arguments.length?(this._backConfig=Vu(this._backConfig,e),this):this._backConfig};t.prototype.cache=function t(e){return arguments.length?(this._cache=e,this):this._cache};t.prototype.color=function t(e){return arguments.length?(this._color=!e||typeof e==="function"?e:ju(e),this):this._color};t.prototype.colorScale=function t(e){return arguments.length?(this._colorScale=!e||typeof e==="function"?e:ju(e),this):this._colorScale};t.prototype.colorScaleConfig=function t(e){return arguments.length?(this._colorScaleConfig=Vu(this._colorScaleConfig,e),this):this._colorScaleConfig};t.prototype.colorScalePosition=function t(e){return arguments.length?(this._colorScalePosition=e,this):this._colorScalePosition};t.prototype.controls=function t(e){return arguments.length?(this._controls=e,this):this._controls};t.prototype.controlConfig=function t(e){return arguments.length?(this._controlConfig=Vu(this._controlConfig,e),this):this._controlConfig};t.prototype.data=function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="data"});var r=[sm.bind(this),e,n,"data"];if(i){this._queue[this._queue.indexOf(i)]=r}else{this._queue.push(r)}return this}return this._data};t.prototype.depth=function t(e){return arguments.length?(this._depth=e,this):this._depth};t.prototype.detectResize=function t(e){return arguments.length?(this._detectResize=e,this):this._detectResize};t.prototype.detectResizeDelay=function t(e){return arguments.length?(this._detectResizeDelay=e,this):this._detectResizeDelay};t.prototype.detectVisible=function t(e){return arguments.length?(this._detectVisible=e,this):this._detectVisible};t.prototype.detectVisibleInterval=function t(e){return arguments.length?(this._detectVisibleInterval=e,this):this._detectVisibleInterval};t.prototype.discrete=function t(e){return arguments.length?(this._discrete=e,this):this._discrete};t.prototype.downloadButton=function t(e){return arguments.length?(this._downloadButton=e,this):this._downloadButton};t.prototype.downloadConfig=function t(e){return arguments.length?(this._downloadConfig=Vu(this._downloadConfig,e),this):this._downloadConfig};t.prototype.downloadPosition=function t(e){return arguments.length?(this._downloadPosition=e,this):this._downloadPosition};t.prototype.duration=function t(e){return arguments.length?(this._duration=e,this):this._duration};t.prototype.filter=function t(e){return arguments.length?(this._filter=e,this):this._filter};t.prototype.groupBy=function t(e){var n=this;if(!arguments.length){return this._groupBy}if(!(e instanceof Array)){e=[e]}return this._groupBy=e.map(function(t){if(typeof t==="function"){return t}else{if(!n._aggs[t]){n._aggs[t]=function(t){var e=Array.from(new Set(t));return e.length===1?e[0]:e}}return ju(t)}}),this};t.prototype.height=function t(e){return arguments.length?(this._height=e,this):this._height};t.prototype.hover=function t(e){var n=this;var i=this._hover=e;if(this._shapeConfig.hoverOpacity!==1){if(typeof e==="function"){var r=Wt(this._shapes.map(function(t){return t.data()}));r=r.concat(this._legendClass.data());var o=e?r.filter(e):[];var a=[];o.map(this._ids).forEach(function(t){for(var e=1;e<=t.length;e++){a.push(JSON.stringify(t.slice(0,e)))}});a=a.filter(function(t,e){return a.indexOf(t)===e});if(a.length){i=function(t,e){return a.includes(JSON.stringify(n._ids(t,e)))}}}this._shapes.forEach(function(t){return t.hover(i)});if(this._legend){this._legendClass.hover(i)}}return this};t.prototype.label=function t(e){return arguments.length?(this._label=typeof e==="function"?e:Zu(e),this):this._label};t.prototype.legend=function t(e){return arguments.length?(this._legend=e,this):this._legend};t.prototype.legendConfig=function t(e){return arguments.length?(this._legendConfig=Vu(this._legendConfig,e),this):this._legendConfig};t.prototype.legendTooltip=function t(e){return arguments.length?(this._legendTooltip=Vu(this._legendTooltip,e),this):this._legendTooltip};t.prototype.legendPosition=function t(e){return arguments.length?(this._legendPosition=e,this):this._legendPosition};t.prototype.loadingHTML=function t(e){return arguments.length?(this._loadingHTML=typeof e==="function"?e:Zu(e),this):this._loadingHTML};t.prototype.loadingMessage=function t(e){return arguments.length?(this._loadingMessage=e,this):this._loadingMessage};t.prototype.locale=function t(e){return arguments.length?(this._locale=e,this):this._locale};t.prototype.messageMask=function t(e){return arguments.length?(this._messageMask=e,this):this._messageMask};t.prototype.messageStyle=function t(e){return arguments.length?(this._messageStyle=Vu(this._messageStyle,e),this):this._messageStyle};t.prototype.noDataHTML=function t(e){return arguments.length?(this._noDataHTML=typeof e==="function"?e:Zu(e),this):this._noDataHTML};t.prototype.noDataMessage=function t(e){return arguments.length?(this._noDataMessage=e,this):this._noDataMessage};t.prototype.scrollContainer=function t(e){return arguments.length?(this._scrollContainer=e,this):this._scrollContainer};t.prototype.select=function t(e){return arguments.length?(this._select=qa(e),this):this._select};t.prototype.shape=function t(e){return arguments.length?(this._shape=typeof e==="function"?e:Zu(e),this):this._shape};t.prototype.shapeConfig=function t(e){return arguments.length?(this._shapeConfig=Vu(this._shapeConfig,e),this):this._shapeConfig};t.prototype.time=function t(e){if(arguments.length){if(typeof e==="function"){this._time=e}else{this._time=ju(e);if(!this._aggs[e]){this._aggs[e]=function(t){var e=Array.from(new Set(t));return e.length===1?e[0]:e}}}return this}else{return this._time}};t.prototype.timeFilter=function t(e){return arguments.length?(this._timeFilter=e,this):this._timeFilter};t.prototype.timeline=function t(e){return arguments.length?(this._timeline=e,this):this._timeline};t.prototype.timelineConfig=function t(e){return arguments.length?(this._timelineConfig=Vu(this._timelineConfig,e),this):this._timelineConfig};t.prototype.title=function t(e){return arguments.length?(this._title=typeof e==="function"?e:Zu(e),this):this._title};t.prototype.titleConfig=function t(e){return arguments.length?(this._titleConfig=Vu(this._titleConfig,e),this):this._titleConfig};t.prototype.tooltip=function t(e){return arguments.length?(this._tooltip=e,this):this._tooltip};t.prototype.tooltipConfig=function t(e){return arguments.length?(this._tooltipConfig=Vu(this._tooltipConfig,e),this):this._tooltipConfig};t.prototype.total=function t(e){return arguments.length?(this._total=typeof e==="function"?e:ju(e),this):this._total};t.prototype.totalConfig=function t(e){return arguments.length?(this._totalConfig=Vu(this._totalConfig,e),this):this._totalConfig};t.prototype.width=function t(e){return arguments.length?(this._width=e,this):this._width};t.prototype.zoom=function t(e){return arguments.length?(this._zoom=e,this):this._zoom};t.prototype.zoomBrushHandleSize=function t(e){return arguments.length?(this._zoomBrushHandleSize=e,this):this._zoomBrushHandleSize};t.prototype.zoomBrushHandleStyle=function t(e){return arguments.length?(this._zoomBrushHandleStyle=e,this):this._zoomBrushHandleStyle};t.prototype.zoomBrushSelectionStyle=function t(e){return arguments.length?(this._zoomBrushSelectionStyle=e,this):this._zoomBrushSelectionStyle};t.prototype.zoomControlStyle=function t(e){return arguments.length?(this._zoomControlStyle=e,this):this._zoomControlStyle};t.prototype.zoomControlStyleActive=function t(e){return arguments.length?(this._zoomControlStyleActive=e,this):this._zoomControlStyleActive};t.prototype.zoomControlStyleHover=function t(e){return arguments.length?(this._zoomControlStyleHover=e,this):this._zoomControlStyleHover};t.prototype.zoomFactor=function t(e){return arguments.length?(this._zoomFactor=e,this):this._zoomFactor};t.prototype.zoomMax=function t(e){return arguments.length?(this._zoomMax=e,this):this._zoomMax};t.prototype.zoomPan=function t(e){return arguments.length?(this._zoomPan=e,this):this._zoomPan};t.prototype.zoomPadding=function t(e){return arguments.length?(this._zoomPadding=e,this):this._zoomPadding};t.prototype.zoomScroll=function t(e){return arguments.length?(this._zoomScroll=e,this):this._zoomScroll};return t}(Yu);function jE(t,e){var n=e&&t.objects[e]?e:Object.keys(t.objects)[0];return zy(t,t.objects[n])}var HE=function(S){function t(){var i=this;S.call(this);this._fitObject=false;this._noDataMessage=false;this._ocean="#cdd1d3";this._point=ju("point");this._pointSize=Zu(1);this._pointSizeMax=10;this._pointSizeMin=5;this._pointSizeScale="linear";this._projection=uy();this._projectionPadding=th(20);this._rotate=[0,0];this._shape=Zu("Circle");this._shapeConfig=Vu(this._shapeConfig,{hoverOpacity:1,Path:{fill:function(t){if(i._colorScale&&!i._coordData.features.includes(t)){var e=i._colorScale(t);if(e!==undefined&&e!==null){return i._colorScaleClass._colorScale(e)}}return"#f5f5f3"},on:{mouseenter:function(t){return!i._coordData.features.includes(t)?i._on.mouseenter.bind(i)(t):null},"mousemove.shape":function(t){return!i._coordData.features.includes(t)?i._on["mousemove.shape"].bind(i)(t):null},mouseleave:function(t){return!i._coordData.features.includes(t)?i._on.mouseleave.bind(i)(t):null}},stroke:function(t,e){var n=typeof i._shapeConfig.Path.fill==="function"?i._shapeConfig.Path.fill(t,e):i._shapeConfig.Path.fill;return Q(n).darker()},strokeWidth:1}});this._tiles=true;this._tileGen=By().wrap(false);this._tileUrl="https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}@2x.png";this._topojson=false;this._topojsonFilter=function(t){return!["010"].includes(t.id)};this._topojsonId=ju("id");this._zoom=true;this._zoomSet=false}if(S){t.__proto__=S}t.prototype=Object.create(S&&S.prototype);t.prototype.constructor=t;t.prototype._renderTiles=function t(e,n){var i=this;if(n===void 0){n=0}var r=[];if(this._tiles){r=this._tileGen.extent(this._zoomBehavior.translateExtent()).scale(this._projection.scale()*(2*Math.PI)*e.k).translate(e.apply(this._projection.translate()))();this._tileGroup.transition().duration(n).attr("transform",e)}var o=this._tileGroup.selectAll("image.tile").data(r,function(t){return t.x+"-"+t.y+"-"+t.z});o.exit().transition().duration(n).attr("opacity",0).remove();var a=r.scale/e.k;o.enter().append("image").attr("class","tile").attr("opacity",0).attr("xlink:href",function(t){return i._tileUrl.replace("{s}",["a","b","c"][Math.random()*3|0]).replace("{z}",t.z).replace("{x}",t.x).replace("{y}",t.y)}).attr("width",a).attr("height",a).attr("x",function(t){return t.x*a+r.translate[0]*a-e.x/e.k}).attr("y",function(t){return t.y*a+r.translate[1]*a-e.y/e.k}).transition().duration(n).attr("opacity",1)};t.prototype._draw=function t(e){var i=this;S.prototype._draw.call(this,e);var n=this._height-this._margin.top-this._margin.bottom,r=this._width-this._margin.left-this._margin.right;this._container=this._select.selectAll("svg.d3plus-geomap").data([0]);this._container=this._container.enter().append("svg").attr("class","d3plus-geomap").attr("opacity",0).attr("width",r).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top).style("background-color",this._ocean||"transparent").merge(this._container);this._container.transition(this._transition).attr("opacity",1).attr("width",r).attr("height",n).attr("x",this._margin.left).attr("y",this._margin.top);var o=this._container.selectAll("rect.d3plus-geomap-ocean").data([0]);o.enter().append("rect").attr("class","d3plus-geomap-ocean").merge(o).attr("width",r).attr("height",n).attr("fill",this._ocean||"transparent");this._tileGroup=this._container.selectAll("g.d3plus-geomap-tileGroup").data([0]);this._tileGroup=this._tileGroup.enter().append("g").attr("class","d3plus-geomap-tileGroup").merge(this._tileGroup);this._zoomGroup=this._container.selectAll("g.d3plus-geomap-zoomGroup").data([0]);this._zoomGroup=this._zoomGroup.enter().append("g").attr("class","d3plus-geomap-zoomGroup").merge(this._zoomGroup);var a=this._zoomGroup.selectAll("g.d3plus-geomap-paths").data([0]);a=a.enter().append("g").attr("class","d3plus-geomap-paths").merge(a);var s=this._coordData=this._topojson?jE(this._topojson,this._topojsonKey):{type:"FeatureCollection",features:[]};if(this._topojsonFilter){s.features=s.features.filter(this._topojsonFilter)}var u=this._path=M_().projection(this._projection);var h=this._filteredData.filter(function(t,e){return i._point(t,e)instanceof Array});var l=this._filteredData.filter(function(t,e){return!(i._point(t,e)instanceof Array)}).reduce(function(t,e){t[i._id(e)]=e;return t},{});var f=s.features.reduce(function(t,e){var n=i._topojsonId(e);t.push({__d3plus__:true,data:l[n],feature:e,id:n});return t},[]);var c=Zr["scale"+this._pointSizeScale.charAt(0).toUpperCase()+this._pointSizeScale.slice(1)]().domain(Ht(h,function(t,e){return i._pointSize(t,e)})).range([this._pointSizeMin,this._pointSizeMax]);if(!this._zoomSet){var d=this._fitObject?jE(this._fitObject,this._fitKey):s;this._extentBounds={type:"FeatureCollection",features:this._fitFilter?d.features.filter(this._fitFilter):d.features.slice()};this._extentBounds.features=this._extentBounds.features.reduce(function(t,e){if(e.geometry){var n={type:e.type,id:e.id,geometry:{coordinates:e.geometry.coordinates,type:e.geometry.type}};if(e.geometry.coordinates.length>1){var i=[],r=[];e.geometry.coordinates.forEach(function(t){n.geometry.coordinates=[t];i.push(u.area(n))});n.geometry.coordinates=[e.geometry.coordinates[i.indexOf(Ut(i))]];var o=u.centroid(n);e.geometry.coordinates.forEach(function(t){n.geometry.coordinates=[t];r.push(Dc(u.centroid(n),o))});var a=A(i.reduce(function(t,e,n){if(e){t.push(i[n]/e)}return t},[]),.9);n.geometry.coordinates=e.geometry.coordinates.filter(function(t,e){var n=r[e];return n===0||i[e]/n>=a})}t.push(n)}return t},[]);if(!this._extentBounds.features.length&&h.length){var p=[[undefined,undefined],[undefined,undefined]];h.forEach(function(t,e){var n=i._projection(i._point(t,e));if(p[0][0]===void 0||n[0]p[1][0]){p[1][0]=n[0]}if(p[0][1]===void 0||n[1]p[1][1]){p[1][1]=n[1]}});this._extentBounds={type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"MultiPoint",coordinates:p.map(function(t){return i._projection.invert(t)})}}]};var g=Ut(h,function(t,e){return c(i._pointSize(t,e))});this._projectionPadding.top+=g;this._projectionPadding.right+=g;this._projectionPadding.bottom+=g;this._projectionPadding.left+=g}this._zoomBehavior.extent([[0,0],[r,n]]).scaleExtent([1,this._zoomMax]).translateExtent([[0,0],[r,n]]);this._zoomSet=true}this._projection=this._projection.fitExtent(this._extentBounds.features.length?[[this._projectionPadding.left,this._projectionPadding.top],[r-this._projectionPadding.right,n-this._projectionPadding.bottom]]:[[0,0],[r,n]],this._extentBounds.features.length?this._extentBounds:{type:"Sphere"});this._shapes.push((new md).data(f).d(function(t){return u(t.feature)}).select(a.node()).x(0).y(0).config(Qu.bind(this)(this._shapeConfig,"shape","Path")).render());var v=this._zoomGroup.selectAll("g.d3plus-geomap-pins").data([0]);v=v.enter().append("g").attr("class","d3plus-geomap-pins").merge(v);var _=(new dd).config(Qu.bind(this)(this._shapeConfig,"shape","Circle")).data(h).r(function(t,e){return c(i._pointSize(t,e))}).select(v.node()).sort(function(t,e){return i._pointSize(e)-i._pointSize(t)}).x(function(t,e){return i._projection(i._point(t,e))[0]}).y(function(t,e){return i._projection(i._point(t,e))[1]});var y=Object.keys(this._on);var m=y.filter(function(t){return t.includes(".Circle")}),b=y.filter(function(t){return!t.includes(".")}),x=y.filter(function(t){return t.includes(".shape")});for(var w=0;w=0){e+=n[i].value}}t.value=e}var qE=function(){return this.eachAfter(WE)};var XE=function(t){var e=this,n,i=[e],r,o,a;do{n=i.reverse(),i=[];while(e=n.pop()){t(e),r=e.children;if(r){for(o=0,a=r.length;o=0;--r){n.push(i[r])}}}return this};var YE=function(t){var e=this,n=[e],i=[],r,o,a;while(e=n.pop()){i.push(e),r=e.children;if(r){for(o=0,a=r.length;o=0){e+=n[i].value}t.value=e})};var QE=function(e){return this.eachBefore(function(t){if(t.children){t.children.sort(e)}})};var ZE=function(t){var e=this,n=KE(e,t),i=[e];while(e!==n){e=e.parent;i.push(e)}var r=i.length;while(t!==n){i.splice(r,0,t);t=t.parent}return i};function KE(t,e){if(t===e){return t}var n=t.ancestors(),i=e.ancestors(),r=null;t=n.pop();e=i.pop();while(t===e){r=t;t=n.pop();e=i.pop()}return r}var JE=function(){var t=this,e=[t];while(t=t.parent){e.push(t)}return e};var tS=function(){var e=[];this.each(function(t){e.push(t)});return e};var eS=function(){var e=[];this.eachBefore(function(t){if(!t.children){e.push(t)}});return e};var nS=function(){var e=this,n=[];e.each(function(t){if(t!==e){n.push({source:t.parent,target:t})}});return n};function iS(t,e){var n=new uS(t),i=+t.value&&(n.value=t.value),r,o=[n],a,s,u,h;if(e==null){e=oS}while(r=o.pop()){if(i){r.value=+r.data.value}if((s=e(r.data))&&(h=s.length)){r.children=new Array(h);for(u=h-1;u>=0;--u){o.push(a=r.children[u]=new uS(s[u]));a.parent=r;a.depth=r.depth+1}}}return n.eachBefore(sS)}function rS(){return iS(this).eachBefore(aS)}function oS(t){return t.children}function aS(t){t.data=t.data.data}function sS(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function uS(t){this.data=t;this.depth=this.height=0;this.parent=null}uS.prototype=iS.prototype={constructor:uS,count:qE,each:XE,eachAfter:YE,eachBefore:GE,sum:$E,sort:QE,path:ZE,ancestors:JE,descendants:tS,leaves:eS,links:nS,copy:rS};function hS(t){if(typeof t!=="function"){throw new Error}return t}function lS(){return 0}var fS=function(t){return function(){return t}};var cS=function(t){t.x0=Math.round(t.x0);t.y0=Math.round(t.y0);t.x1=Math.round(t.x1);t.y1=Math.round(t.y1)};var dS=function(t,e,n,i,r){var o=t.children,a,s=-1,u=o.length,h=t.value&&(i-e)/t.value;while(++s=0){o=i[r];o.z+=e;o.m+=e;e+=o.s+(n+=o.c)}}function mS(t,e,n){return t.a.parent===e.parent?t.a:n}function bS(t,e){this._=t;this.parent=null;this.children=null;this.A=null;this.a=this;this.z=0;this.m=0;this.c=0;this.s=0;this.t=null;this.i=e}bS.prototype=Object.create(uS.prototype);function xS(t){var e=new bS(t,0),n,i=[e],r,o,a,s;while(n=i.pop()){if(o=n._.children){n.children=new Array(s=o.length);for(a=s-1;a>=0;--a){i.push(r=n.children[a]=new bS(o[a],a));r.parent=n}}}(e.parent=new bS(null,0)).children=[e];return e}var wS=function(){var c=pS,h=1,l=1,f=null;function e(t){var e=xS(t);e.eachAfter(d),e.parent.m=-e.z;e.eachBefore(p);if(f){t.eachBefore(g)}else{var n=t,i=t,r=t;t.eachBefore(function(t){if(t.xi.x){i=t}if(t.depth>r.depth){r=t}});var o=n===i?1:c(n,i)/2,a=o-n.x,s=h/(i.x+o+a),u=l/(r.depth||1);t.eachBefore(function(t){t.x=(t.x+a)*s;t.y=t.depth*u})}return t}function d(t){var e=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(e){yS(t);var r=(e[0].z+e[e.length-1].z)/2;if(i){t.z=i.z+c(t._,i._);t.m=t.z-r}else{t.z=r}}else if(i){t.z=i.z+c(t._,i._)}t.parent.A=o(t,i,t.parent.A||n[0])}function p(t){t._.x=t.z+t.parent.m;t.m+=t.parent.m}function o(t,e,n){if(e){var i=t,r=t,o=e,a=i.parent.children[0],s=i.m,u=r.m,h=o.m,l=a.m,f;while(o=vS(o),i=gS(i),o&&i){a=gS(a);r=vS(r);r.a=t;f=o.z+h-i.z-s+c(o._,i._);if(f>0){_S(mS(o,t,n),t,f);s+=f;u+=f}h+=o.m;s+=i.m;l+=a.m;u+=r.m}if(o&&!vS(r)){r.t=o;r.m+=h-u}if(i&&!gS(a)){a.t=i;a.m+=s-l;n=t}}return n}function g(t){t.x*=h;t.y=t.depth*l}e.separation=function(t){return arguments.length?(c=t,e):c};e.size=function(t){return arguments.length?(f=false,h=+t[0],l=+t[1],e):f?null:[h,l]};e.nodeSize=function(t){return arguments.length?(f=true,h=+t[0],l=+t[1],e):f?[h,l]:null};return e};var CS=function(t,e,n,i,r){var o=t.children,a,s=-1,u=o.length,h=t.value&&(r-n)/t.value;while(++sy){y=h}w=v*v*x;m=Math.max(y/w,w/_);if(m>b){v-=h;break}b=m}a.push(u={value:v,dice:d1?t:1)};return t}(ES);var kS=function(){var a=AS,e=false,n=1,i=1,s=[0],u=lS,h=lS,l=lS,f=lS,c=lS;function r(t){t.x0=t.y0=0;t.x1=n;t.y1=i;t.eachBefore(o);s=[0];if(e){t.eachBefore(cS)}return t}function o(t){var e=s[t.depth],n=t.x0+e,i=t.y0+e,r=t.x1-e,o=t.y1-e;if(r1})).select(Ku("g.d3plus-Tree-Links",g).node()).config(Qu.bind(this)(this._shapeConfig,"shape","Path")).config({d:function(t){var e=l._shapeConfig.r;if(typeof e==="function"){e=e(t.data,t.i)}var n=t.parent.x-t.x+(l._orient==="vertical"?0:e),i=t.parent.y-t.y+(l._orient==="vertical"?e:0),r=l._orient==="vertical"?0:-e,o=l._orient==="vertical"?-e:0;return l._orient==="vertical"?"M"+r+","+o+"C"+r+","+(o+i)/2+" "+n+","+(o+i)/2+" "+n+","+i:"M"+r+","+o+"C"+(r+n)/2+","+o+" "+(r+n)/2+","+i+" "+n+","+i},id:function(t,e){return l._ids(t,e).join("-")}}).render());this._shapes.push((new dd).data(o).select(Ku("g.d3plus-Tree-Shapes",g).node()).config(Qu.bind(this)(this._shapeConfig,"shape","Circle")).config({id:function(t,e){return l._ids(t,e).join("-")},label:function(t,e){if(l._label){return l._label(t.data,e)}var n=l._ids(t,e).slice(0,t.depth);return n[n.length-1]},labelConfig:{textAnchor:function(t){return l._orient==="vertical"?"middle":t.data.children&&t.data.depth!==l._groupBy.length?"end":"start"},verticalAlign:function(t){return l._orient==="vertical"?t.data.depth===1?"bottom":"top":"middle"}},hitArea:function(t,e,n){var i=l._labelHeight,r=l._labelWidths[t.depth-1];return{width:l._orient==="vertical"?r:n.r*2+r,height:l._orient==="horizontal"?i:n.r*2+i,x:l._orient==="vertical"?-r/2:t.children&&t.depth!==l._groupBy.length?-(n.r+r):-n.r,y:l._orient==="horizontal"?-i/2:t.children&&t.depth!==l._groupBy.length?-(n.r+l._labelHeight):-n.r}},labelBounds:function(t,e,n){var i;var r=l._labelHeight,o=l._orient==="vertical"?"height":"width",a=l._labelWidths[t.depth-1],s=l._orient==="vertical"?"width":"height",u=l._orient==="vertical"?"x":"y",h=l._orient==="vertical"?"y":"x";return i={},i[s]=a,i[o]=r,i[u]=-a/2,i[h]=t.children&&t.depth!==l._groupBy.length?-(n.r+r):n.r,i}}).render());return this};t.prototype.orient=function t(e){return arguments.length?(this._orient=e,this):this._orient};t.prototype.separation=function t(e){return arguments.length?(this._separation=e,this):this._separation};return t}(LE);var DS=function(f){function t(){f.call(this);this._layoutPadding=1;this._shapeConfig=Vu({},this._shapeConfig,{labelConfig:{fontMax:20,fontResize:true,padding:15}});this._sort=function(t,e){return e.value-t.value};this._sum=ju("value");this._tile=AS;this._treemap=kS().round(true)}if(f){t.__proto__=f}t.prototype=Object.create(f&&f.prototype);t.prototype.constructor=t;t.prototype._draw=function t(e){var n=this;f.prototype._draw.call(this,e);var i=Gt();for(var r=0;r<=this._drawDepth;r++){i.key(n._groupBy[r])}i=i.entries(this._filteredData);var o=this._treemap.padding(this._layoutPadding).size([this._width-this._margin.left-this._margin.right,this._height-this._margin.top-this._margin.bottom]).tile(this._tile)(iS({values:i},function(t){return t.values}).sum(this._sum).sort(this._sort));var a=[],s=this;function u(t){for(var e=0;e=h._groupBy.length-1){if(h._focus&&h._focus===t.id){h.active(false);h._on.mouseenter.bind(h)(t,e);h._focus=undefined;h._zoomToBounds(null)}else{h.hover(false);var n=h._nodeGroupBy&&h._nodeGroupBy[h._drawDepth](t,e)?h._nodeGroupBy[h._drawDepth](t,e):h._id(t,e),i=h._linkLookup[n],r=h._nodeLookup[n];var o=[r.id];var a=[r.x-r.r,r.x+r.r],s=[r.y-r.r,r.y+r.r];i.forEach(function(t){o.push(t.id);if(t.x-t.ra[1]){a[1]=t.x+t.r}if(t.y-t.rs[1]){s[1]=t.y+t.r}});h.active(function(t,e){if(t.source&&t.target){return t.source.id===r.id||t.target.id===r.id}else{return o.includes(h._ids(t,e)[h._drawDepth])}});h._focus=t.id;var u=$m(h._container.node());a=a.map(function(t){return t*u.k+u.x});s=s.map(function(t){return t*u.k+u.y});h._zoomToBounds([[a[0],s[0]],[a[1],s[1]]])}}};this._on["click.legend"]=function(t,e){var n=h._id(t);var i=h._ids(t);i=i[i.length-1];if(h._hover&&h._drawDepth>=h._groupBy.length-1){if(h._focus&&h._focus===n){h.active(false);h._on.mouseenter.bind(h)(t,e);h._focus=undefined;h._zoomToBounds(null)}else{h.hover(false);var r=n.map(function(t){return h._nodeLookup[t]});var o=[i];var a=[r[0].x-r[0].r,r[0].x+r[0].r],s=[r[0].y-r[0].r,r[0].y+r[0].r];r.forEach(function(t){o.push(t.id);if(t.x-t.ra[1]){a[1]=t.x+t.r}if(t.y-t.rs[1]){s[1]=t.y+t.r}});h.active(function(t,e){if(t.source&&t.target){return o.includes(t.source.id)&&o.includes(t.target.id)}else{var n=h._ids(t,e);return o.includes(n[n.length-1])}});h._focus=n;var u=$m(h._container.node());a=a.map(function(t){return t*u.k+u.x});s=s.map(function(t){return t*u.k+u.y});h._zoomToBounds([[a[0],s[0]],[a[1],s[1]]])}h._on["mousemove.legend"].bind(h)(t,e)}};this._sizeMin=5;this._sizeScale="sqrt";this._shape=Zu("Circle");this._shapeConfig=Vu(this._shapeConfig,{labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee",strokeWidth:1}});this._x=ju("x");this._y=ju("y");this._zoom=true}if(N){t.__proto__=N}t.prototype=Object.create(N&&N.prototype);t.prototype.constructor=t;t.prototype._draw=function t(e){var r=this;N.prototype._draw.call(this,e);var n=this._height-this._margin.top-this._margin.bottom,i="translate("+this._margin.left+", "+this._margin.top+")",o=this._transition,a=this._width-this._margin.left-this._margin.right;var s=this._filteredData.reduce(function(t,e,n){t[r._id(e,n)]=e;return t},{});var u=this._nodes.reduce(function(t,e,n){t[r._nodeGroupBy?r._nodeGroupBy[r._drawDepth](e,n):r._id(e,n)]=e;return t},{});u=Array.from(new Set(Object.keys(s).concat(Object.keys(u)))).map(function(t,e){var n=s[t],i=u[t];if(i===undefined){return false}return{__d3plus__:true,data:n||i,i:e,id:t,fx:n!==undefined&&r._x(n)!==undefined?r._x(n):r._x(i),fy:n!==undefined&&r._y(n)!==undefined?r._y(n):r._y(i),node:i,r:r._size?n!==undefined&&r._size(n)!==undefined?r._size(n):r._size(i):r._sizeMin,shape:n!==undefined&&r._shape(n)!==undefined?r._shape(n):r._shape(i)}}).filter(function(t){return t});var h=Ht(u.map(function(t){return t.fx})),l=Ht(u.map(function(t){return t.fy}));var f=vn().domain(h).range([0,a]),c=vn().domain(l).range([0,n]);var d=(h[1]-h[0])/(l[1]-l[0]),p=a/n;if(d>p){var g=n*p/d;c.range([(n-g)/2,n-(n-g)/2])}else{var v=a*d/p;f.range([(a-v)/2,a-(a-v)/2])}u.forEach(function(t){t.x=f(t.fx);t.y=c(t.fy)});var _=Ht(u.map(function(t){return t.r}));var y=this._sizeMax||qt(Wt(u.map(function(e){return u.map(function(t){return e===t?null:Dc([e.x,e.y],[t.x,t.y])})})))/2;var m=Zr["scale"+this._sizeScale.charAt(0).toUpperCase()+this._sizeScale.slice(1)]().domain(_).range([_[0]===_[1]?y:qt([y/2,this._sizeMin]),y]),b=f.domain(),x=c.domain();var w=b[1]-b[0],C=x[1]-x[0];u.forEach(function(t){var e=m(t.r);if(b[0]>f.invert(t.x-e)){b[0]=f.invert(t.x-e)}if(b[1]c.invert(t.y-e)){x[0]=c.invert(t.y-e)}if(x[1]a[1]){a[1]=t.x+t.r}if(t.y-t.rs[1]){s[1]=t.y+t.r}});u.hover(function(t,e){if(t.source&&t.target){return t.source.id===r.id||t.target.id===r.id}else{return o.includes(u._ids(t,e)[u._drawDepth])}})}};this._on["click.shape"]=function(t){u._center=t.id;u._draw()};this._sizeMin=5;this._sizeScale="sqrt";this._shape=Zu("Circle");this._shapeConfig=Vu(this._shapeConfig,{labelConfig:{duration:0,fontMin:1,fontResize:true,labelPadding:0,textAnchor:"middle",verticalAlign:"middle"},Path:{fill:"none",label:false,stroke:"#eee",strokeWidth:1}})}if(z){t.__proto__=z}t.prototype=Object.create(z&&z.prototype);t.prototype.constructor=t;t.prototype._draw=function t(e){var h=this;z.prototype._draw.call(this,e);var r=this._filteredData.reduce(function(t,e,n){t[h._id(e,n)]=e;return t},{});var l=this._nodes;if(!this._nodes.length&&this._links.length){var n=Array.from(new Set(this._links.reduce(function(t,e){return t.concat([e.source,e.target])},[])));l=n.map(function(t){return typeof t==="object"?t:{id:t}})}l=l.reduce(function(t,e,n){t[h._nodeGroupBy?h._nodeGroupBy[h._drawDepth](e,n):h._id(e,n)]=e;return t},{});l=Array.from(new Set(Object.keys(r).concat(Object.keys(l)))).map(function(t,e){var n=r[t],i=l[t];if(i===undefined){return false}return{__d3plus__:true,data:n||i,i:e,id:t,node:i,shape:n!==undefined&&h._shape(n)!==undefined?h._shape(n):h._shape(i)}}).filter(function(t){return t});var i=this._nodeLookup=l.reduce(function(t,e){t[e.id]=e;return t},{});var o=this._links.map(function(n){var t=["source","target"];return t.reduce(function(t,e){t[e]=typeof n[e]==="number"?l[n[e]]:i[n[e].id||n[e]];return t},{})});var a=o.reduce(function(t,e){if(!t[e.source.id]){t[e.source.id]=[]}t[e.source.id].push(e);if(!t[e.target.id]){t[e.target.id]=[]}t[e.target.id].push(e);return t},{});var f=this._height-this._margin.top-this._margin.bottom,s="translate("+this._margin.left+", "+this._margin.top+")",u=this._transition,c=this._width-this._margin.left-this._margin.right;var d=[],p=qt([f,c])/2,g=p/3;var v=g,_=g*2;var y=i[this._center];y.x=c/2;y.y=f/2;y.r=this._sizeMin?Ut([this._sizeMin,v*.65]):this._sizeMax?qt([this._sizeMax,v*.65]):v*.65;var m=[y],b=[];a[this._center].forEach(function(t){var e=t.source.id===h._center?t.target:t.source;e.edges=a[e.id].filter(function(t){return t.source.id!==h._center||t.target.id!==h._center});e.edge=t;m.push(e);b.push(e)});b.sort(function(t,e){return t.edges.length-e.edges.length});var x=[];var w=0;b.forEach(function(t){var r=t.id;t.edges=t.edges.filter(function(t){return!m.includes(t.source)&&t.target.id===r||!m.includes(t.target)&&t.source.id===r});w+=t.edges.length||1;t.edges.forEach(function(t){var e=t.source;var n=t.target;var i=n.id===r?e:n;m.push(i)})});var C=Math.PI*2;var E=0;b.forEach(function(o,t){var a=o.edges.length||1;var e=C/w*a;if(t===0){E-=e/2}var s=E+e/2-C/4;o.radians=s;o.x=c/2+v*Math.cos(s);o.y=f/2+v*Math.sin(s);E+=e;o.edges.forEach(function(t,e){var n=t.source.id===o.id?t.target:t.source;var i=C/w;var r=s-i*a/2+i/2+i*e;n.radians=r;n.x=c/2+_*Math.cos(r);n.y=f/2+_*Math.sin(r);x.push(n)})});var S=g/2;var A=g/4;var k=S/2-4;if(S/2-4<8){k=qt([S/2,8])}var M=A/2-4;if(A/2-4<4){M=qt([A/2,4])}if(M>g/10){M=g/10}if(M>k&&M>10){M=k*.75}if(k>M*1.5){k=M*1.5}k=Math.floor(k);M=Math.floor(M);var T;if(this._size){var B=Ht(r,function(t){return t.size});if(B[0]===B[1]){B[0]=0}T=vn().domain(B).rangeRound([3,qt([k,M])]);var D=y.size;y.r=T(D)}else{T=vn().domain([1,2]).rangeRound([k,M])}x.forEach(function(t){t.ring=2;var e=h._size?t.size:2;t.r=h._sizeMin?Ut([h._sizeMin,T(e)]):h._sizeMax?qt([h._sizeMax,T(e)]):T(e)});b.forEach(function(t){t.ring=1;var e=h._size?t.size:1;t.r=h._sizeMin?Ut([h._sizeMin,T(e)]):h._sizeMax?qt([h._sizeMax,T(e)]):T(e)});l=[y].concat(b).concat(x);b.forEach(function(u){var t=["source","target"];var n=u.edge;t.forEach(function(e){n[e]=l.find(function(t){return t.id===n[e].id})});d.push(n);a[u.id].forEach(function(i){var e=i.source.id===u.id?i.target:i.source;if(e.id!==y.id){var r=x.find(function(t){return t.id===e.id});if(!r){r=b.find(function(t){return t.id===e.id})}if(r){i.spline=true;var o=c/2;var a=f/2;var s=v+(_-v)*.5;var t=["source","target"];t.forEach(function(e,t){i[e+"X"]=i[e].x+Math.cos(i[e].ring===2?i[e].radians+Math.PI:i[e].radians)*i[e].r;i[e+"Y"]=i[e].y+Math.sin(i[e].ring===2?i[e].radians+Math.PI:i[e].radians)*i[e].r;i[e+"BisectX"]=o+s*Math.cos(i[e].radians);i[e+"BisectY"]=a+s*Math.sin(i[e].radians);i[e]=l.find(function(t){return t.id===i[e].id});if(i[e].edges===undefined){i[e].edges={}}var n=t===0?i.target.id:i.source.id;if(i[e].id===u.id){i[e].edges[n]={angle:u.radians+Math.PI,radius:g/2}}else{i[e].edges[n]={angle:r.radians,radius:g/2}}});d.push(i)}}})});l.forEach(function(t){if(t.id!==h._center){var e=h._shapeConfig.labelConfig.fontSize&&h._shapeConfig.labelConfig.fontSize(t)||11;var n=e*1.4;var i=n*2;var r=5;var o=g-t.r;var a=t.radians*(180/Math.PI);var s=t.r+r;var u="start";if(a<-90||a>90){s=-t.r-o-r;u="end";a+=180}t.labelBounds={x:s,y:-n/2,width:o,height:i};t.rotate=a;t.textAnchor=u}else{t.labelBounds={x:-v/2,y:-v/2,width:v,height:v}}});this._linkLookup=o.reduce(function(t,e){if(!t[e.source.id]){t[e.source.id]=[]}t[e.source.id].push(e.target);if(!t[e.target.id]){t[e.target.id]=[]}t[e.target.id].push(e.source);return t},{});this._shapes.push((new md).config(Qu.bind(this)(this._shapeConfig,"edge","Path")).id(function(t){return t.source.id+"_"+t.target.id}).d(function(t){return t.spline?"M"+t.sourceX+","+t.sourceY+"C"+t.sourceBisectX+","+t.sourceBisectY+" "+t.targetBisectX+","+t.targetBisectY+" "+t.targetX+","+t.targetY:"M"+t.source.x+","+t.source.y+" "+t.target.x+","+t.target.y}).data(d).select(Ku("g.d3plus-rings-links",{parent:this._select,transition:u,enter:{transform:s},update:{transform:s}}).node()).render());var N=this;var P={label:function(t){return l.length<=h._labelCutoff||(h._hover&&h._hover(t)||h._active&&h._active(t))?h._drawLabel(t.data||t.node,t.i):false},labelBounds:function(t){return t.labelBounds},labelConfig:{fontColor:function(t){return t.data.data.id===h._center?Qu.bind(N)(N._shapeConfig,"shape",t.key).labelConfig.fontColor(t):xh(Qu.bind(N)(N._shapeConfig,"shape",t.key).fill(t))},fontResize:function(t){return t.data.data.id===h._center},padding:0,textAnchor:function(t){return i[t.data.data.id].textAnchor||Qu.bind(N)(N._shapeConfig,"shape",t.key).labelConfig.textAnchor},verticalAlign:function(t){return t.data.data.id===h._center?"middle":"top"}},rotate:function(t){return i[t.id].rotate||0},select:Ku("g.d3plus-rings-nodes",{parent:this._select,transition:u,enter:{transform:s},update:{transform:s}}).node()};Gt().key(function(t){return t.shape}).entries(l).forEach(function(t){h._shapes.push((new xd[t.key]).config(Qu.bind(h)(h._shapeConfig,"shape",t.key)).config(P).data(t.values).render())});return this};t.prototype.center=function t(e){return arguments.length?(this._center=e,this):this._center};t.prototype.hover=function t(e){this._hover=e;this._shapes.forEach(function(t){return t.hover(e)});if(this._legend){this._legendClass.hover(e)}return this};t.prototype.links=function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="links"});var r=[sm.bind(this),e,n,"links"];if(i){this._queue[this._queue.indexOf(i)]=r}else{this._queue.push(r)}return this}return this._links};t.prototype.nodeGroupBy=function t(e){var n=this;if(!arguments.length){return this._nodeGroupBy}if(!(e instanceof Array)){e=[e]}return this._nodeGroupBy=e.map(function(t){if(typeof t==="function"){return t}else{if(!n._aggs[t]){n._aggs[t]=function(t){var e=Array.from(new Set(t));return e.length===1?e[0]:e}}return ju(t)}}),this};t.prototype.nodes=function t(e,n){if(arguments.length){var i=this._queue.find(function(t){return t[3]==="nodes"});var r=[sm.bind(this),e,n,"nodes"];if(i){this._queue[this._queue.indexOf(i)]=r}else{this._queue.push(r)}return this}return this._nodes};t.prototype.size=function t(e){return arguments.length?(this._size=typeof e==="function"||!e?e:ju(e),this):this._size};t.prototype.sizeMax=function t(e){return arguments.length?(this._sizeMax=e,this):this._sizeMax};t.prototype.sizeMin=function t(e){return arguments.length?(this._sizeMin=e,this):this._sizeMin};t.prototype.sizeScale=function t(e){return arguments.length?(this._sizeScale=e,this):this._sizeScale};return t}(LE);var zS=function(t){if(t.includes("d3plus-buffer-start")){return t}var e=["d3plus-buffer-start"];t.forEach(function(t){e.push(t);e.push("d3plus-buffer-"+t)});return e};var OS=function(t){var e=this;var n=t.data;var i=t.x;var r=t.y;var o=t.x2;var a=t.y2;var s=t.buffer;if(s===void 0){s=10}var u=o?"x2":"x";var h=a?"y2":"y";var l=this._discrete==="x"?r:i;var f=l.domain().slice();var c=this._discrete==="x";if(c){f.reverse()}var d,p;if(this._stacked){var g=Gt().key(function(t){return t[e._discrete]}).entries(n).map(function(t){return t.values.map(function(t){return t[c?h:u]})});p=g.map(function(t){return Xt(t.filter(function(t){return t>0}))});d=g.map(function(t){return Xt(t.filter(function(t){return t<0}))})}else{p=n.map(function(t){return t[c?h:u]});d=p}var v=l(Ut(p));if(c?vl(0)){v+=c?-s:s}v=l.invert(v);var _=l(qt(d));if(c?_>l(0):_f[1]){f[1]=v}if(_c[1]){c[1]=i}}if(s.invert&&s(t[f])-g[0]d[0]){d[0]=r}}if(s.invert&&g[1]-s(t[f])c[1]){c[1]=r}}if(u.invert&&u(t[f])-g[0]d[0]){d[0]=o}}if(u.invert&&g[1]-u(t[f])l[1]){l[1]=c}if(this._discrete==="x"){l.reverse()}h.domain(l);return[i,r]};function LS(t){return this._sizeScaleD3(this._size?this._size(t):null)}var jS=function(jt){function t(){var n=this;jt.call(this);this._annotations=[];this._barPadding=0;this._buffer={Bar:OS,Circle:FS,Line:IS,Rect:RS};this._confidenceConfig={fillOpacity:Zu(.5)};this._groupPadding=5;this._shape=Zu("Circle");this._shapeConfig=Vu(this._shapeConfig,{Area:{label:function(t,e){return n._stacked?n._drawLabel(t,e):false},labelConfig:{fontResize:true}},Bar:{labelConfig:{textAnchor:function(){return n._discrete==="x"?"middle":"end"},verticalAlign:function(){return n._discrete==="x"?"top":"middle"}}},Circle:{r:LS.bind(this)},Line:{fill:Zu("none"),label:false,stroke:function(t,e){return mh(n._id(t,e))},strokeWidth:Zu(1)},Rect:{height:function(t){return LS.bind(n)(t)*2},width:function(t){return LS.bind(n)(t)*2}}});this._sizeMax=20;this._sizeMin=5;this._sizeScale="sqrt";this._stackOffset=If;this._stackOrder=zf;this._x=ju("x");this._x2=ju("x2");this._xAxis=(new Ed).align("end");this._x2Axis=(new kd).align("start");this._xTest=(new Ed).align("end").gridSize(0);this._x2Test=(new kd).align("start").gridSize(0);this._xConfig={};this._x2Config={padding:0};this._y=ju("y");this._y2=ju("y2");this._yAxis=(new Sd).align("start");this._yTest=(new Sd).align("start").gridSize(0);this._y2Axis=(new Ad).align("end");this._y2Test=(new Sd).align("end").gridSize(0);this._yConfig={gridConfig:{stroke:function(t){var e=n._yAxis.domain();return e[e.length-1]===t.id?"transparent":"#ccc"}}};this._y2Config={}}if(jt){t.__proto__=jt}t.prototype=Object.create(jt&&jt.prototype);t.prototype.constructor=t;t.prototype._draw=function t(e){var A=this;if(!this._filteredData.length){return this}var a=function(t,e){return A._stacked?""+(A._groupBy.length>1?A._ids(t,e).slice(0,-1).join("_"):"group"):""+A._ids(t,e).join("_")};var s=this._filteredData.map(function(t,e){return{__d3plus__:true,data:t,group:a(t,e),i:e,hci:A._confidence&&A._confidence[1]&&A._confidence[1](t,e),id:A._ids(t,e).slice(0,A._drawDepth+1).join("_"),lci:A._confidence&&A._confidence[0]&&A._confidence[0](t,e),shape:A._shape(t,e),x:A._x(t,e),x2:A._x2(t,e),y:A._y(t,e),y2:A._y2(t,e)}});this._formattedData=s;if(this._size){var n=Ht(s,function(t){return A._size(t.data)});this._sizeScaleD3=function(){return A._sizeMin};this._sizeScaleD3=Zr["scale"+this._sizeScale.charAt(0).toUpperCase()+this._sizeScale.slice(1)]().domain(n).range([n[0]===n[1]?this._sizeMax:qt([this._sizeMax/2,this._sizeMin]),this._sizeMax])}else{this._sizeScaleD3=function(){return A._sizeMin}}var i=s.some(function(t){return t.x2!==undefined}),r=s.some(function(t){return t.y2!==undefined});var o=this._height-this._margin.top-this._margin.bottom,u=this._discrete?this._discrete==="x"?"y":"x":undefined,h=this._discrete?this._discrete==="x"?"y2":"x2":undefined,l=[u,h],f=this._select,c=this._transition,d=this._width-this._margin.left-this._margin.right;var p=this._time&&s[0].x2===this._time(s[0].data,s[0].i),g=this._time&&s[0].x===this._time(s[0].data,s[0].i),v=this._time&&s[0].y2===this._time(s[0].data,s[0].i),_=this._time&&s[0].y===this._time(s[0].data,s[0].i);for(var y=0;ye){x[t][0]=e}else if(x[t]&&x[t][1]et?st-et:0;var Tt="translate("+(this._margin.left+Mt)+", "+(this._margin.top+ht)+")";var Bt=Ku("g.d3plus-plot-y-axis",{parent:f,transition:c,enter:{transform:Tt},update:{transform:Tt}});var Dt="translate(-"+this._margin.right+", "+(this._margin.top+ht)+")";var Nt=Ku("g.d3plus-plot-y2-axis",{parent:f,transition:c,enter:{transform:Dt},update:{transform:Dt}});this._xAxis.domain(D).height(o-(at+ht+Ct)).maxSize(o/2).range([st,d-(ct+wt)]).scale(N.toLowerCase()).select(At.node()).ticks(G).width(d).config(rt).config(this._xConfig).render();this._x2Axis.domain(i?P:D).height(o-(vt+ht+Ct)).range([st,d-(pt+wt)]).scale(z.toLowerCase()).select(kt.node()).ticks(i?X:G).width(d).config(rt).config(K).config(this._x2Config).render();L=function(t,e){if(e==="x2"){if(A._x2Config.scale==="log"&&t===0){t=P[0]<0?-1:1}return A._x2Axis._getPosition.bind(A._x2Axis)(t)}else{if(A._xConfig.scale==="log"&&t===0){t=D[0]<0?-1:1}return A._xAxis._getPosition.bind(A._xAxis)(t)}};var Pt=this._xAxis._getRange();this._yAxis.domain(O).height(o).maxSize(d/2).range([this._xAxis.outerBounds().y+at,o-(mt+ht+Ct)]).scale(F.toLowerCase()).select(Bt.node()).ticks($).width(Pt[Pt.length-1]).config(Q).config(this._yConfig).render();this._y2Axis.config(Q).domain(r?R:O).gridSize(0).height(o).range([this._xAxis.outerBounds().y+at,o-(xt+ht+Ct)]).scale(r?I.toLowerCase():F.toLowerCase()).select(Nt.node()).width(d-Ut([0,lt-it])).title(false).config(this._y2Config).config(J).render();H=function(t,e){if(e==="y2"){if(A._y2Config.scale==="log"&&t===0){t=R[0]<0?-1:1}return A._y2Axis._getPosition.bind(A._y2Axis)(t)-at}else{if(A._yConfig.scale==="log"&&t===0){t=O[0]<0?-1:1}return A._yAxis._getPosition.bind(A._yAxis)(t)-at}};var zt=this._yAxis._getRange();var Ot=Ku("g.d3plus-plot-annotations",{parent:f,transition:c,enter:{transform:Et},update:{transform:Et}}).node();this._annotations.forEach(function(t){(new xd[t.shape]).config(t).config({x:function(t){return t.x2?L(t.x2,"x2"):L(t.x)},x0:A._discrete==="x"?function(t){return t.x2?L(t.x2,"x2"):L(t.x)}:L(0),x1:A._discrete==="x"?null:function(t){return t.x2?L(t.x2,"x2"):L(t.x)},y:function(t){return t.y2?H(t.y2,"y2"):H(t.y)},y0:A._discrete==="y"?function(t){return t.y2?H(t.y2,"y2"):H(t.y)}:H(0)-Ft,y1:A._discrete==="y"?null:function(t){return t.y2?H(t.y2,"y2"):H(t.y)-Ft}}).select(Ot).render()});var Ft=this._xAxis.barConfig()["stroke-width"];if(Ft){Ft/=2}var Rt={duration:this._duration,label:function(t){return A._drawLabel(t.data,t.i)},select:Ku("g.d3plus-plot-shapes",{parent:f,transition:c,enter:{transform:Et},update:{transform:Et}}).node(),x:function(t){return t.x2?L(t.x2,"x2"):L(t.x)},x0:this._discrete==="x"?function(t){return t.x2?L(t.x2,"x2"):L(t.x)}:L(0),x1:this._discrete==="x"?null:function(t){return t.x2?L(t.x2,"x2"):L(t.x)},y:function(t){return t.y2?H(t.y2,"y2"):H(t.y)},y0:this._discrete==="y"?function(t){return t.y2?H(t.y2,"y2"):H(t.y)}:H(0)-Ft,y1:this._discrete==="y"?null:function(t){return t.y2?H(t.y2,"y2"):H(t.y)-Ft}};if(this._stacked){var It=u==="x"?L:H;Rt[""+u]=Rt[u+"0"]=function(t){var e=C.indexOf(t.id),n=b.indexOf(t.discrete);return e>=0?It(w[e][n][0]):It(0)};Rt[u+"1"]=function(t){var e=C.indexOf(t.id),n=b.indexOf(t.discrete);return e>=0?It(w[e][n][1]):It(0)}}var Lt=Object.keys(this._on);U.forEach(function(e){var t=(new xd[e.key]).config(Rt).data(e.values);if(e.key==="Bar"){var n;var i=A._discrete==="x"?L:H;var r=(A._discrete==="x"?D:O).filter(function(t){return typeof t!=="string"||t.indexOf("d3plus-buffer-")<0});var o=A._discrete==="x"?Pt:zt;if(r.length>1){n=i(r[1])-i(r[0])}else{n=o[o.length-1]-o[0]}n-=A._groupPadding;var a=n;var s=Gt().key(function(t){return t[A._discrete]}).key(function(t){return t.group}).entries(e.values);var u=Wt(s.map(function(t){return t.values.map(function(t){return t.key})}));var h=Array.from(new Set(u));if(Ut(s.map(function(t){return t.values.length}))===1){t[A._discrete](function(t,e){return Rt[A._discrete](t,e)})}else{a=(a-A._barPadding*h.length-1)/h.length;var l=n/2-a/2;var f=vn().domain([0,h.length-1]).range([-l,l]);t[A._discrete](function(t,e){return Rt[A._discrete](t,e)+f(h.indexOf(t.group))})}t.width(a);t.height(a)}else if(e.key==="Line"&&A._confidence){var c=Object.assign({},Rt);var d=A._discrete==="x"?"y":"x";var p=A._discrete==="x"?H:L;c[d+"0"]=function(t){return p(A._confidence[0]?t.lci:t[d])};c[d+"1"]=function(t){return p(A._confidence[1]?t.hci:t[d])};var g=(new fd).config(c).data(e.values);var v=Object.assign(A._shapeConfig,A._confidenceConfig);g.config(Qu.bind(A)(v,"shape","Area")).render();A._shapes.push(g)}var _=Lt.filter(function(t){return t.includes("."+e.key)}),y=Lt.filter(function(t){return!t.includes(".")}),m=Lt.filter(function(t){return t.includes(".shape")});var b=function(e){t.on(y[e],function(t){return A._on[y[e]](t.data,t.i)})};for(var x=0;x0}).sort(function(t,e){return t.start-e.start});var r;if(this._groupBy.length>1&&this._drawDepth>0){var o=Gt();var a=function(e){o.key(function(t){return n._groupBy[e](t.data,t.i)})};for(var s=0;s=this._padding*2?p-this._padding:p>2?p-2:p).label(function(t,e){return n._drawLabel(t.data,e)}).select(Ku("g.d3plus-priestley-shapes",{parent:this._select}).node()).width(function(t){var e=Math.abs(c(t.end)-c(t.start));return e>2?e-2:e}).x(function(t){return c(t.start)+(c(t.end)-c(t.start))/2}).y(function(t){return d(t.lane)}).config(Qu.bind(this)(this._shapeConfig,"shape","Rect")).render());return this};t.prototype.axisConfig=function t(e){return arguments.length?(this._axisConfig=Vu(this._axisConfig,e),this):this._axisConfig};t.prototype.end=function t(e){if(arguments.length){if(typeof e==="function"){this._end=e}else{this._end=ju(e);if(!this._aggs[e]){this._aggs[e]=function(t){return Ut(t)}}}return this}else{return this._end}};t.prototype.start=function t(e){if(arguments.length){if(typeof e==="function"){this._start=e}else{this._start=ju(e);if(!this._aggs[e]){this._aggs[e]=function(t){return qt(t)}}}return this}else{return this._start}};return t}(LE);t.version=e;t.Axis=Cd;t.AxisBottom=Ed;t.AxisLeft=Sd;t.AxisRight=Ad;t.AxisTop=kd;t.date=wd;t.colorAdd=rh;t.colorAssign=mh;t.colorContrast=bh;t.colorDefaults=_h;t.colorLegible=xh;t.colorLighter=wh;t.colorSubtract=Ch;t.accessor=ju;t.assign=Vu;t.attrize=Uu;t.BaseClass=Yu;t.closest=$u;t.configPrep=Qu;t.constant=Zu;t.elem=Ku;t.isObject=Hu;t.merge=Ju;t.parseSides=th;t.prefix=eh;t.stylize=nh;t.uuid=qu;t.Geomap=HE;t.Donut=UE;t.Pie=VE;t.Tree=BS;t.Treemap=DS;t.ckmeans=yb;t.ColorScale=mb;t.Legend=bb;t.Network=NS;t.Rings=PS;t.AreaPlot=HS;t.BarChart=VS;t.LinePlot=WS;t.Plot=jS;t.StackedArea=qS;t.Priestley=XS;t.Area=fd;t.Bar=cd;t.Circle=dd;t.Image=ih;t.Line=pd;t.Path=md;t.largestRect=ld;t.lineIntersection=$c;t.path2polygon=yd;t.pointDistance=Dc;t.pointDistanceSquared=Bc;t.pointRotate=td;t.polygonInside=Kc;t.polygonRayCast=Jc;t.polygonRotate=ed;t.segmentBoxContains=Qc;t.segmentsIntersect=Zc;t.shapeEdgePoint=vd;t.simplify=ad;t.Rect=bd;t.Shape=Nc;t.fontExists=rc;t.rtl=oc;t.stringify=ac;t.strip=uc;t.TextBox=Ac;t.textSplit=Ec;t.textWidth=Gf;t.textWrap=Sc;t.titleCase=Tc;t.trim=Yf;t.trimLeft=$f;t.trimRight=Qf;t.Timeline=xb;t.Tooltip=Gx;t.dataFold=Ry;t.dataLoad=sm;t.Viz=LE;Object.defineProperty(t,"__esModule",{value:true})}); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker-en-ca.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker-en-ca.min.js new file mode 100755 index 0000000..0aab38f --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker-en-ca.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-CA"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:0,format:"yyyy-mm-dd"},a.fn.datepicker.deprecated("This filename doesn't follow the convention, use bootstrap-datepicker.en-CA.js instead.")}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ar-tn.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ar-tn.min.js new file mode 100755 index 0000000..9d70dc2 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ar-tn.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["ar-tn"]={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ar.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ar.min.js new file mode 100755 index 0000000..ece41af --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ar.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ar={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.az.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.az.min.js new file mode 100755 index 0000000..56bedf8 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.az.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.az={days:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],daysShort:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],daysMin:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],months:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthsShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],today:"Bu gün",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bg.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bg.min.js new file mode 100755 index 0000000..28e8b22 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bg.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.bg={days:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],daysShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],daysMin:["Н","П","В","С","Ч","П","С"],months:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthsShort:["Ян","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Ное","Дек"],today:"днес"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bn.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bn.min.js new file mode 100755 index 0000000..f67b5e2 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bn.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.bn={days:["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],daysShort:["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],daysMin:["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],months:["জানুয়ারী","ফেব্রুয়ারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],monthsShort:["জানুয়ারী","ফেব্রুয়ারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],today:"আজ",monthsTitle:"মাস",clear:"পরিষ্কার",weekStart:0,format:"mm/dd/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.br.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.br.min.js new file mode 100755 index 0000000..af3e3bd --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.br.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.br={days:["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],daysShort:["Sul","Lun","Meu.","Mer.","Yao.","Gwe.","Sad."],daysMin:["Su","L","Meu","Mer","Y","G","Sa"],months:["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],monthsShort:["Genv.","C'hw.","Meur.","Ebre.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kerz."],today:"Hiziv",monthsTitle:"Miz",clear:"Dilemel",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bs.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bs.min.js new file mode 100755 index 0000000..cfb06fd --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.bs.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.bs={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ca.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ca.min.js new file mode 100755 index 0000000..ac10789 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ca.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ca={days:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"],daysShort:["Diu","Dil","Dmt","Dmc","Dij","Div","Dis"],daysMin:["dg","dl","dt","dc","dj","dv","ds"],months:["Gener","Febrer","Març","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],monthsShort:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"],today:"Avui",monthsTitle:"Mesos",clear:"Esborrar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.cs.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.cs.min.js new file mode 100755 index 0000000..42dfd1a --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.cs.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.cs={days:["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],daysShort:["Ned","Pon","Úte","Stř","Čtv","Pát","Sob"],daysMin:["Ne","Po","Út","St","Čt","Pá","So"],months:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],monthsShort:["Led","Úno","Bře","Dub","Kvě","Čer","Čnc","Srp","Zář","Říj","Lis","Pro"],today:"Dnes",clear:"Vymazat",monthsTitle:"Měsíc",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.cy.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.cy.min.js new file mode 100755 index 0000000..f85ea03 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.cy.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.cy={days:["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],daysShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],daysMin:["Su","Ll","Ma","Me","Ia","Gwe","Sa"],months:["Ionawr","Chewfror","Mawrth","Ebrill","Mai","Mehefin","Gorfennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthsShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"],today:"Heddiw"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.da.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.da.min.js new file mode 100755 index 0000000..53c8180 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.da.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.da={days:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],daysShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],daysMin:["Sø","Ma","Ti","On","To","Fr","Lø"],months:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"I Dag",weekStart:1,clear:"Nulstil",format:"dd/mm/yyyy",monthsTitle:"Måneder"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.de.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.de.min.js new file mode 100755 index 0000000..1b5d6a2 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.de.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.de={days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fre","Sam"],daysMin:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",monthsTitle:"Monate",clear:"Löschen",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.el.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.el.min.js new file mode 100755 index 0000000..046e9eb --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.el.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.el={days:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],daysShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],daysMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],months:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthsShort:["Ιαν","Φεβ","Μαρ","Απρ","Μάι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],today:"Σήμερα",clear:"Καθαρισμός",weekStart:1,format:"d/m/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-au.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-au.min.js new file mode 100755 index 0000000..b8d5f41 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-au.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-AU"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"d/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-ca.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-ca.min.js new file mode 100755 index 0000000..7b1070f --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-ca.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-CA"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:0,format:"yyyy-mm-dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-gb.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-gb.min.js new file mode 100755 index 0000000..2966f54 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-gb.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-GB"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-ie.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-ie.min.js new file mode 100755 index 0000000..dc8f71c --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-ie.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-IE"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-nz.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-nz.min.js new file mode 100755 index 0000000..c374a8d --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-nz.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-NZ"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"d/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-za.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-za.min.js new file mode 100755 index 0000000..885a928 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.en-za.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["en-ZA"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"yyyy/mm/d"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.eo.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.eo.min.js new file mode 100755 index 0000000..736db02 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.eo.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.eo={days:["dimanĉo","lundo","mardo","merkredo","ĵaŭdo","vendredo","sabato"],daysShort:["dim.","lun.","mar.","mer.","ĵaŭ.","ven.","sam."],daysMin:["d","l","ma","me","ĵ","v","s"],months:["januaro","februaro","marto","aprilo","majo","junio","julio","aŭgusto","septembro","oktobro","novembro","decembro"],monthsShort:["jan.","feb.","mar.","apr.","majo","jun.","jul.","aŭg.","sep.","okt.","nov.","dec."],today:"Hodiaŭ",clear:"Nuligi",weekStart:1,format:"yyyy-mm-dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.es.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.es.min.js new file mode 100755 index 0000000..f3cef5d --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.es.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.es={days:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],daysShort:["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],daysMin:["Do","Lu","Ma","Mi","Ju","Vi","Sa"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthsShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],today:"Hoy",monthsTitle:"Meses",clear:"Borrar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.et.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.et.min.js new file mode 100755 index 0000000..34cd9c6 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.et.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.et={days:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],daysShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],daysMin:["P","E","T","K","N","R","L"],months:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthsShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],today:"Täna",clear:"Tühjenda",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.eu.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.eu.min.js new file mode 100755 index 0000000..c5aa359 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.eu.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.eu={days:["Igandea","Astelehena","Asteartea","Asteazkena","Osteguna","Ostirala","Larunbata"],daysShort:["Ig","Al","Ar","Az","Og","Ol","Lr"],daysMin:["Ig","Al","Ar","Az","Og","Ol","Lr"],months:["Urtarrila","Otsaila","Martxoa","Apirila","Maiatza","Ekaina","Uztaila","Abuztua","Iraila","Urria","Azaroa","Abendua"],monthsShort:["Urt","Ots","Mar","Api","Mai","Eka","Uzt","Abu","Ira","Urr","Aza","Abe"],today:"Gaur",monthsTitle:"Hilabeteak",clear:"Ezabatu",weekStart:1,format:"yyyy/mm/dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fa.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fa.min.js new file mode 100755 index 0000000..8575237 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fa.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.fa={days:["یک‌شنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنج‌شنبه","جمعه","شنبه","یک‌شنبه"],daysShort:["یک","دو","سه","چهار","پنج","جمعه","شنبه","یک"],daysMin:["ی","د","س","چ","پ","ج","ش","ی"],months:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthsShort:["ژان","فور","مار","آور","مه","ژون","ژوی","اوت","سپت","اکت","نوا","دسا"],today:"امروز",clear:"پاک کن",weekStart:1,format:"yyyy/mm/dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fi.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fi.min.js new file mode 100755 index 0000000..239dfb7 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fi.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.fi={days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],daysShort:["sun","maa","tii","kes","tor","per","lau"],daysMin:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],monthsShort:["tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mar","jou"],today:"tänään",clear:"Tyhjennä",weekStart:1,format:"d.m.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fo.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fo.min.js new file mode 100755 index 0000000..fa24e3a --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fo.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.fo={days:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leygardagur"],daysShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],daysMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],months:["Januar","Februar","Marts","Apríl","Mei","Juni","Juli","August","Septembur","Oktobur","Novembur","Desembur"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],today:"Í Dag",clear:"Reinsa"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fr-ch.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fr-ch.min.js new file mode 100755 index 0000000..1c6bcdc --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fr-ch.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.fr={days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["D","L","Ma","Me","J","V","S"],months:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Jui","Jul","Aou","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fr.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fr.min.js new file mode 100755 index 0000000..244cfba --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.fr.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.fr={days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],daysShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],daysMin:["d","l","ma","me","j","v","s"],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthsShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.gl.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.gl.min.js new file mode 100755 index 0000000..3d92606 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.gl.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.gl={days:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],daysShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],daysMin:["Do","Lu","Ma","Me","Xo","Ve","Sa"],months:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthsShort:["Xan","Feb","Mar","Abr","Mai","Xun","Xul","Ago","Sep","Out","Nov","Dec"],today:"Hoxe",clear:"Limpar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.he.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.he.min.js new file mode 100755 index 0000000..191cb45 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.he.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.he={days:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת","ראשון"],daysShort:["א","ב","ג","ד","ה","ו","ש","א"],daysMin:["א","ב","ג","ד","ה","ו","ש","א"],months:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthsShort:["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"],today:"היום",rtl:!0}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hi.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hi.min.js new file mode 100755 index 0000000..635baff --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hi.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.hi={days:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],daysShort:["सूर्य","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],daysMin:["र","सो","मं","बु","गु","शु","श"],months:["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्टूबर","नवंबर","दिसम्बर"],monthsShort:["जन","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितं","अक्टूबर","नवं","दिसम्बर"],today:"आज",monthsTitle:"महीने",clear:"साफ",weekStart:1,format:"dd / mm / yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hr.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hr.min.js new file mode 100755 index 0000000..8b34bce --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hr.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.hr={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],months:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthsShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],today:"Danas"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hu.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hu.min.js new file mode 100755 index 0000000..f9decf9 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hu.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.hu={days:["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],daysShort:["vas","hét","ked","sze","csü","pén","szo"],daysMin:["V","H","K","Sze","Cs","P","Szo"],months:["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],monthsShort:["jan","feb","már","ápr","máj","jún","júl","aug","sze","okt","nov","dec"],today:"ma",weekStart:1,clear:"töröl",titleFormat:"yyyy. MM",format:"yyyy.mm.dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hy.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hy.min.js new file mode 100755 index 0000000..a1cf653 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.hy.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.hy={days:["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"],daysShort:["Կիր","Երկ","Երե","Չոր","Հին","Ուրբ","Շաբ"],daysMin:["Կի","Եկ","Եք","Չո","Հի","Ու","Շա"],months:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthsShort:["Հնվ","Փետ","Մար","Ապր","Մայ","Հուն","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],today:"Այսօր",clear:"Ջնջել",format:"dd.mm.yyyy",weekStart:1,monthsTitle:"Ամիսնէր"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.id.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.id.min.js new file mode 100755 index 0000000..7c3220a --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.id.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.id={days:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],daysShort:["Mgu","Sen","Sel","Rab","Kam","Jum","Sab"],daysMin:["Mg","Sn","Sl","Ra","Ka","Ju","Sa"],months:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ags","Sep","Okt","Nov","Des"],today:"Hari Ini",clear:"Kosongkan"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.is.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.is.min.js new file mode 100755 index 0000000..f49bd18 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.is.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.is={days:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],daysShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],daysMin:["Su","Má","Þr","Mi","Fi","Fö","La"],months:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthsShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],today:"Í Dag"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.it-ch.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.it-ch.min.js new file mode 100755 index 0000000..7e1adbb --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.it-ch.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.it={days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],daysShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],daysMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthsShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],today:"Oggi",clear:"Cancella",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.it.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.it.min.js new file mode 100755 index 0000000..cc30766 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.it.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.it={days:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],daysShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],daysMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthsShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],today:"Oggi",monthsTitle:"Mesi",clear:"Cancella",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ja.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ja.min.js new file mode 100755 index 0000000..e321f04 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ja.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ja={days:["日曜","月曜","火曜","水曜","木曜","金曜","土曜"],daysShort:["日","月","火","水","木","金","土"],daysMin:["日","月","火","水","木","金","土"],months:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今日",format:"yyyy/mm/dd",titleFormat:"yyyy年mm月",clear:"クリア"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ka.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ka.min.js new file mode 100755 index 0000000..84f14c0 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ka.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ka={days:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],daysShort:["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],daysMin:["კვ","ორ","სა","ოთ","ხუ","პა","შა"],months:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthsShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],today:"დღეს",clear:"გასუფთავება",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kh.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kh.min.js new file mode 100755 index 0000000..bf2abc5 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kh.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.kh={days:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],daysShort:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],daysMin:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],months:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthsShort:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],today:"ថ្ងៃនេះ",clear:"សំអាត"},a.fn.datepicker.deprecated('The language code "kh" is deprecated and will be removed in 2.0. For Khmer support use "km" instead.')}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kk.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kk.min.js new file mode 100755 index 0000000..f4e2f3f --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.kk={days:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],daysShort:["Жек","Дүй","Сей","Сәр","Бей","Жұм","Сен"],daysMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],months:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthsShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],today:"Бүгін",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.km.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.km.min.js new file mode 100755 index 0000000..648d83f --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.km.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.km={days:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],daysShort:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],daysMin:["អា.ទិ","ចន្ទ","អង្គារ","ពុធ","ព្រ.ហ","សុក្រ","សៅរ៍"],months:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthsShort:["មករា","កុម្ភះ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],today:"ថ្ងៃនេះ",clear:"សំអាត"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ko.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ko.min.js new file mode 100755 index 0000000..9751ee5 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ko.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ko={days:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],daysShort:["일","월","화","수","목","금","토"],daysMin:["일","월","화","수","목","금","토"],months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthsShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],today:"오늘",clear:"삭제",format:"yyyy-mm-dd",titleFormat:"yyyy년mm월",weekStart:0}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kr.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kr.min.js new file mode 100755 index 0000000..4339340 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.kr.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.kr={days:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],daysShort:["일","월","화","수","목","금","토"],daysMin:["일","월","화","수","목","금","토"],months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthsShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"]},a.fn.datepicker.deprecated('The language code "kr" is deprecated and will be removed in 2.0. For korean support use "ko" instead.')}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.lt.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.lt.min.js new file mode 100755 index 0000000..da78ea8 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.lt.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.lt={days:["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"],daysShort:["S","Pr","A","T","K","Pn","Š"],daysMin:["Sk","Pr","An","Tr","Ke","Pn","Št"],months:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthsShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],today:"Šiandien",monthsTitle:"Mėnesiai",clear:"Išvalyti",weekStart:1,format:"yyyy-mm-dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.lv.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.lv.min.js new file mode 100755 index 0000000..89cea00 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.lv.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.lv={days:["Svētdiena","Pirmdiena","Otrdiena","Trešdiena","Ceturtdiena","Piektdiena","Sestdiena"],daysShort:["Sv","P","O","T","C","Pk","S"],daysMin:["Sv","Pr","Ot","Tr","Ce","Pk","Se"],months:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthsShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],monthsTitle:"Mēneši",today:"Šodien",clear:"Nodzēst",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.me.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.me.min.js new file mode 100755 index 0000000..c65a891 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.me.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.me={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,clear:"Izbriši",format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.mk.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.mk.min.js new file mode 100755 index 0000000..46423f7 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.mk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.mk={days:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],daysShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],daysMin:["Не","По","Вт","Ср","Че","Пе","Са"],months:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthsShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],today:"Денес",format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.mn.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.mn.min.js new file mode 100755 index 0000000..6ebaec9 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.mn.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.mn={days:["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],daysShort:["Ням","Дав","Мяг","Лха","Пүр","Баа","Бям"],daysMin:["Ня","Да","Мя","Лх","Пү","Ба","Бя"],months:["Хулгана","Үхэр","Бар","Туулай","Луу","Могой","Морь","Хонь","Бич","Тахиа","Нохой","Гахай"],monthsShort:["Хул","Үхэ","Бар","Туу","Луу","Мог","Мор","Хон","Бич","Тах","Нох","Гах"],today:"Өнөөдөр",clear:"Тодорхой",format:"yyyy.mm.dd",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ms.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ms.min.js new file mode 100755 index 0000000..47efafd --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ms.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ms={days:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],daysShort:["Aha","Isn","Sel","Rab","Kha","Jum","Sab"],daysMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],months:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],today:"Hari Ini",clear:"Bersihkan"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.nl-be.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.nl-be.min.js new file mode 100755 index 0000000..85d3146 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.nl-be.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["nl-BE"]={days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],daysShort:["zo","ma","di","wo","do","vr","za"],daysMin:["zo","ma","di","wo","do","vr","za"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthsShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],today:"Vandaag",monthsTitle:"Maanden",clear:"Leegmaken",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.nl.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.nl.min.js new file mode 100755 index 0000000..af977b7 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.nl.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.nl={days:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],daysShort:["zo","ma","di","wo","do","vr","za"],daysMin:["zo","ma","di","wo","do","vr","za"],months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthsShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],today:"Vandaag",monthsTitle:"Maanden",clear:"Wissen",weekStart:1,format:"dd-mm-yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.no.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.no.min.js new file mode 100755 index 0000000..03970b4 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.no.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.no={days:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],daysShort:["søn","man","tir","ons","tor","fre","lør"],daysMin:["sø","ma","ti","on","to","fr","lø"],months:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","vovember","desember"],monthsShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],today:"i dag",monthsTitle:"Måneder",clear:"Nullstill",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.oc.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.oc.min.js new file mode 100755 index 0000000..630fa16 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.oc.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.oc={days:["Dimenge","Diluns","Dimars","Dimècres","Dijòus","Divendres","Dissabte"],daysShort:["Dim","Dil","Dmr","Dmc","Dij","Div","Dis"],daysMin:["dg","dl","dr","dc","dj","dv","ds"],months:["Genièr","Febrièr","Març","Abrial","Mai","Junh","Julhet","Agost","Setembre","Octobre","Novembre","Decembre"],monthsShort:["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Dec"],today:"Uèi",monthsTitle:"Meses",clear:"Escafar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pl.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pl.min.js new file mode 100755 index 0000000..ffb30ec --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pl.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.pl={days:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],daysShort:["Niedz.","Pon.","Wt.","Śr.","Czw.","Piąt.","Sob."],daysMin:["Ndz.","Pn.","Wt.","Śr.","Czw.","Pt.","Sob."],months:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthsShort:["Sty.","Lut.","Mar.","Kwi.","Maj","Cze.","Lip.","Sie.","Wrz.","Paź.","Lis.","Gru."],today:"Dzisiaj",weekStart:1,clear:"Wyczyść",format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pt-br.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pt-br.min.js new file mode 100755 index 0000000..2d3f8af --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pt-br.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["pt-BR"]={days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],daysShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],daysMin:["Do","Se","Te","Qu","Qu","Se","Sa"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthsShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],today:"Hoje",monthsTitle:"Meses",clear:"Limpar",format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pt.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pt.min.js new file mode 100755 index 0000000..e2b4e64 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.pt.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.pt={days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],daysShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],daysMin:["Do","Se","Te","Qu","Qu","Se","Sa"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthsShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],today:"Hoje",monthsTitle:"Meses",clear:"Limpar",format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ro.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ro.min.js new file mode 100755 index 0000000..5fff298 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ro.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ro={days:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],daysShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],daysMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],months:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthsShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],today:"Astăzi",clear:"Șterge",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.rs-latin.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.rs-latin.min.js new file mode 100755 index 0000000..e520c95 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.rs-latin.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["rs-latin"]={days:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"},a.fn.datepicker.deprecated('This language code "rs-latin" is deprecated (invalid serbian language code) and will be removed in 2.0. For Serbian latin support use "sr-latin" instead.')}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.rs.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.rs.min.js new file mode 100755 index 0000000..ba95ae2 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.rs.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.rs={days:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],daysShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],daysMin:["Н","По","У","Ср","Ч","Пе","Су"],months:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthsShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],today:"Данас",weekStart:1,format:"dd.mm.yyyy"},a.fn.datepicker.deprecated('This language code "rs" is deprecated (invalid serbian language code) and will be removed in 2.0. For Serbian support use "sr" instead.')}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ru.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ru.min.js new file mode 100755 index 0000000..52bc010 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ru.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ru={days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вск","Пнд","Втр","Срд","Чтв","Птн","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",format:"dd.mm.yyyy",weekStart:1,monthsTitle:"Месяцы"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.si.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.si.min.js new file mode 100755 index 0000000..b9746b8 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.si.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.si={days:["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],daysShort:["ඉරි","සඳු","අඟ","බදා","බ්‍රහ","සිකු","සෙන"],daysMin:["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],months:["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජුනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],monthsShort:["ජන","පෙබ","මාර්","අප්‍රේ","මැයි","ජුනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],today:"අද",monthsTitle:"මාස",clear:"මකන්න",weekStart:0,format:"yyyy-mm-dd"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sk.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sk.min.js new file mode 100755 index 0000000..79a9267 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sk={days:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],daysShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],daysMin:["Ne","Po","Ut","St","Št","Pia","So"],months:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],today:"Dnes",clear:"Vymazať",weekStart:1,format:"d.m.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sl.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sl.min.js new file mode 100755 index 0000000..831cf73 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sl.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sl={days:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],daysShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],daysMin:["Ne","Po","To","Sr","Če","Pe","So"],months:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danes",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sq.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sq.min.js new file mode 100755 index 0000000..40f3e1f --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sq.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sq={days:["E Diel","E Hënë","E Martē","E Mërkurë","E Enjte","E Premte","E Shtunë"],daysShort:["Die","Hën","Mar","Mër","Enj","Pre","Shtu"],daysMin:["Di","Hë","Ma","Më","En","Pr","Sht"],months:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthsShort:["Jan","Shk","Mar","Pri","Maj","Qer","Korr","Gu","Sht","Tet","Nën","Dhjet"],today:"Sot"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sr-latin.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sr-latin.min.js new file mode 100755 index 0000000..c6b7001 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sr-latin.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["sr-latin"]={days:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sr.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sr.min.js new file mode 100755 index 0000000..4e46dbf --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sr.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sr={days:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],daysShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],daysMin:["Н","По","У","Ср","Ч","Пе","Су"],months:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthsShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],today:"Данас",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sv.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sv.min.js new file mode 100755 index 0000000..7ab6bec --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sv.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sv={days:["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],daysShort:["sön","mån","tis","ons","tor","fre","lör"],daysMin:["sö","må","ti","on","to","fr","lö"],months:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],monthsShort:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],today:"Idag",format:"yyyy-mm-dd",weekStart:1,clear:"Rensa"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sw.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sw.min.js new file mode 100755 index 0000000..454d305 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.sw.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.sw={days:["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],daysShort:["J2","J3","J4","J5","Alh","Ij","J1"],daysMin:["2","3","4","5","A","I","1"],months:["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],monthsShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],today:"Leo"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ta.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ta.min.js new file mode 100755 index 0000000..e790949 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.ta.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.ta={days:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],daysShort:["ஞாயி","திங்","செவ்","புத","வியா","வெள்","சனி"],daysMin:["ஞா","தி","செ","பு","வி","வெ","ச"],months:["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்டு","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],monthsShort:["ஜன","பிப்","மார்","ஏப்","மே","ஜூன்","ஜூலை","ஆக","செப்","அக்","நவ","டிச"],today:"இன்று",monthsTitle:"மாதங்கள்",clear:"நீக்கு",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tg.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tg.min.js new file mode 100755 index 0000000..104b6dd --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tg.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.tg={days:["Якшанбе","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],daysShort:["Яшб","Дшб","Сшб","Чшб","Пшб","Ҷум","Шнб"],daysMin:["Яш","Дш","Сш","Чш","Пш","Ҷм","Шб"],months:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Имрӯз",monthsTitle:"Моҳҳо",clear:"Тоза намудан",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.th.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.th.min.js new file mode 100755 index 0000000..1e398ba --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.th.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.th={days:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัส","ศุกร์","เสาร์","อาทิตย์"],daysShort:["อา","จ","อ","พ","พฤ","ศ","ส","อา"],daysMin:["อา","จ","อ","พ","พฤ","ศ","ส","อา"],months:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthsShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],today:"วันนี้"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tk.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tk.min.js new file mode 100755 index 0000000..716edef --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.tk={days:["Ýekşenbe","Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe"],daysShort:["Ýek","Duş","Siş","Çar","Pen","Ann","Şen"],daysMin:["Ýe","Du","Si","Ça","Pe","An","Şe"],months:["Ýanwar","Fewral","Mart","Aprel","Maý","Iýun","Iýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr"],monthsShort:["Ýan","Few","Mar","Apr","Maý","Iýn","Iýl","Awg","Sen","Okt","Noý","Dek"],today:"Bu gün",monthsTitle:"Aýlar",clear:"Aýyr",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tr.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tr.min.js new file mode 100755 index 0000000..7889b11 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.tr.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.tr={days:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],daysShort:["Pz","Pzt","Sal","Çrş","Prş","Cu","Cts"],daysMin:["Pz","Pzt","Sa","Çr","Pr","Cu","Ct"],months:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthsShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],today:"Bugün",clear:"Temizle",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uk.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uk.min.js new file mode 100755 index 0000000..41b02e6 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uk.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.uk={days:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"],daysShort:["Нед","Пнд","Втр","Срд","Чтв","Птн","Суб"],daysMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Cічень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthsShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],today:"Сьогодні",clear:"Очистити",format:"dd.mm.yyyy",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uz-cyrl.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uz-cyrl.min.js new file mode 100755 index 0000000..a0a8f21 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uz-cyrl.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["uz-cyrl"]={days:["Якшанба","Душанба","Сешанба","Чоршанба","Пайшанба","Жума","Шанба"],daysShort:["Якш","Ду","Се","Чор","Пай","Жу","Ша"],daysMin:["Як","Ду","Се","Чо","Па","Жу","Ша"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Бугун",clear:"Ўчириш",format:"dd.mm.yyyy",weekStart:1,monthsTitle:"Ойлар"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uz-latn.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uz-latn.min.js new file mode 100755 index 0000000..2f58e34 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.uz-latn.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["uz-latn"]={days:["Yakshanba","Dushanba","Seshanba","Chorshanba","Payshanba","Juma","Shanba"],daysShort:["Yak","Du","Se","Chor","Pay","Ju","Sha"],daysMin:["Ya","Du","Se","Cho","Pa","Ju","Sha"],months:["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"],monthsShort:["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"],today:"Bugun",clear:"O'chirish",format:"dd.mm.yyyy",weekStart:1,monthsTitle:"Oylar"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.vi.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.vi.min.js new file mode 100755 index 0000000..3311d23 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.vi.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates.vi={days:["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"],daysShort:["CN","Thứ 2","Thứ 3","Thứ 4","Thứ 5","Thứ 6","Thứ 7"],daysMin:["CN","T2","T3","T4","T5","T6","T7"],months:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],monthsShort:["Th1","Th2","Th3","Th4","Th5","Th6","Th7","Th8","Th9","Th10","Th11","Th12"],today:"Hôm nay",clear:"Xóa",format:"dd/mm/yyyy"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.zh-cn.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.zh-cn.min.js new file mode 100755 index 0000000..1279176 --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.zh-cn.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["zh-CN"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["周日","周一","周二","周三","周四","周五","周六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今日",clear:"清除",format:"yyyy年mm月dd日",titleFormat:"yyyy年mm月",weekStart:1}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.zh-tw.min.js b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.zh-tw.min.js new file mode 100755 index 0000000..e309c1d --- /dev/null +++ b/plugins/additionals/assets/javascripts/locales/bootstrap-datepicker.zh-tw.min.js @@ -0,0 +1 @@ +!function(a){a.fn.datepicker.dates["zh-TW"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["週日","週一","週二","週三","週四","週五","週六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今天",format:"yyyy年mm月dd日",weekStart:1,clear:"清除"}}(jQuery); \ No newline at end of file diff --git a/plugins/additionals/assets/javascripts/mermaid.min.js b/plugins/additionals/assets/javascripts/mermaid.min.js index d4731cc..c8eee17 100755 --- a/plugins/additionals/assets/javascripts/mermaid.min.js +++ b/plugins/additionals/assets/javascripts/mermaid.min.js @@ -1,32 +1,19 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.mermaid=e():t.mermaid=e()}("undefined"!=typeof self?self:this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=383)}([function(t,e,n){"use strict";n.r(e);var r=function(t,e){return te?1:t>=e?0:NaN},i=function(t){var e;return 1===t.length&&(e=t,t=function(t,n){return r(e(t),n)}),{left:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)<0?r=a+1:i=a}return r},right:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)>0?i=a:r=a+1}return r}}};var a=i(r),o=a.right,s=a.left,c=o,u=function(t,e){null==e&&(e=l);for(var n=0,r=t.length-1,i=t[0],a=new Array(r<0?0:r);nt?1:e>=t?0:NaN},d=function(t){return null===t?NaN:+t},p=function(t,e){var n,r,i=t.length,a=0,o=-1,s=0,c=0;if(null==e)for(;++o1)return c/(a-1)},y=function(t,e){var n=p(t,e);return n?Math.sqrt(n):n},g=function(t,e){var n,r,i,a=t.length,o=-1;if(null==e){for(;++o=n)for(r=i=n;++on&&(r=n),i=n)for(r=i=n;++on&&(r=n),i0)return[t];if((r=e0)for(t=Math.ceil(t/o),e=Math.floor(e/o),a=new Array(i=Math.ceil(e-t+1));++s=0?(a>=w?10:a>=E?5:a>=T?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(a>=w?10:a>=E?5:a>=T?2:1)}function S(t,e,n){var r=Math.abs(e-t)/Math.max(0,n),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),a=r/i;return a>=w?i*=10:a>=E?i*=5:a>=T&&(i*=2),eh;)f.pop(),--d;var p,y=new Array(d+1);for(i=0;i<=d;++i)(p=y[i]=[]).x0=i>0?f[i-1]:l,p.x1=i=1)return+n(t[r-1],r-1,t);var r,i=(r-1)*e,a=Math.floor(i),o=+n(t[a],a,t);return o+(+n(t[a+1],a+1,t)-o)*(i-a)}},N=function(t,e,n){return t=b.call(t,d).sort(r),Math.ceil((n-e)/(2*(D(t,.75)-D(t,.25))*Math.pow(t.length,-1/3)))},B=function(t,e,n){return Math.ceil((n-e)/(3.5*y(t)*Math.pow(t.length,-1/3)))},L=function(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++ar&&(r=n)}else for(;++a=n)for(r=n;++ar&&(r=n);return r},P=function(t,e){var n,r=t.length,i=r,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(r=t[i]).length;--e>=0;)n[--o]=r[e];return n},j=function(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++an&&(r=n)}else for(;++a=n)for(r=n;++an&&(r=n);return r},R=function(t,e){for(var n=e.length,r=new Array(n);n--;)r[n]=t[e[n]];return r},Y=function(t,e){if(n=t.length){var n,i,a=0,o=0,s=t[o];for(null==e&&(e=r);++a=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function ct(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var _t="http://www.w3.org/1999/xhtml",kt={svg:"http://www.w3.org/2000/svg",xhtml:_t,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},wt=function(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),kt.hasOwnProperty(e)?{space:kt[e],local:t}:t};function Et(t){return function(){this.removeAttribute(t)}}function Tt(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Ct(t,e){return function(){this.setAttribute(t,e)}}function At(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function St(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function Mt(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}var Ot=function(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView};function Dt(t){return function(){this.style.removeProperty(t)}}function Nt(t,e,n){return function(){this.style.setProperty(t,e,n)}}function Bt(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function Lt(t,e){return t.style.getPropertyValue(e)||Ot(t).getComputedStyle(t,null).getPropertyValue(e)}function Pt(t){return function(){delete this[t]}}function It(t,e){return function(){this[t]=e}}function Ft(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function jt(t){return t.trim().split(/^|\s+/)}function Rt(t){return t.classList||new Yt(t)}function Yt(t){this._node=t,this._names=jt(t.getAttribute("class")||"")}function zt(t,e){for(var n=Rt(t),r=-1,i=e.length;++r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function Vt(){this.textContent=""}function Gt(t){return function(){this.textContent=t}}function qt(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function Xt(){this.innerHTML=""}function Zt(t){return function(){this.innerHTML=t}}function Jt(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function Kt(){this.nextSibling&&this.parentNode.appendChild(this)}function Qt(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function te(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===_t&&e.documentElement.namespaceURI===_t?e.createElement(t):e.createElementNS(n,t)}}function ee(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}var ne=function(t){var e=wt(t);return(e.local?ee:te)(e)};function re(){return null}function ie(){var t=this.parentNode;t&&t.removeChild(this)}function ae(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function oe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}var se={},ce=null;"undefined"!=typeof document&&("onmouseenter"in document.documentElement||(se={mouseenter:"mouseover",mouseleave:"mouseout"}));function ue(t,e,n){return t=le(t,e,n),function(e){var n=e.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||t.call(this,e)}}function le(t,e,n){return function(r){var i=ce;ce=r;try{t.call(this,this.__data__,e,n)}finally{ce=i}}}function he(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function fe(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=_&&(_=x+1);!(b=v[_])&&++_=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=xt);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?Dt:"function"==typeof e?Bt:Nt)(t,e,null==n?"":n)):Lt(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Pt:"function"==typeof e?Ft:It)(t,e)):this.node()[t]},classed:function(t,e){var n=jt(t+"");if(arguments.length<2){for(var r=Rt(this.node()),i=-1,a=n.length;++i>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?new qe(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?new qe(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Le.exec(t))?new qe(e[1],e[2],e[3],1):(e=Pe.exec(t))?new qe(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Ie.exec(t))?He(e[1],e[2],e[3],e[4]):(e=Fe.exec(t))?He(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=je.exec(t))?Ke(e[1],e[2]/100,e[3]/100,1):(e=Re.exec(t))?Ke(e[1],e[2]/100,e[3]/100,e[4]):Ye.hasOwnProperty(t)?We(Ye[t]):"transparent"===t?new qe(NaN,NaN,NaN,0):null}function We(t){return new qe(t>>16&255,t>>8&255,255&t,1)}function He(t,e,n,r){return r<=0&&(t=e=n=NaN),new qe(t,e,n,r)}function Ve(t){return t instanceof Me||(t=$e(t)),t?new qe((t=t.rgb()).r,t.g,t.b,t.opacity):new qe}function Ge(t,e,n,r){return 1===arguments.length?Ve(t):new qe(t,e,n,null==r?1:r)}function qe(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function Xe(){return"#"+Je(this.r)+Je(this.g)+Je(this.b)}function Ze(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Je(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function Ke(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new en(t,e,n,r)}function Qe(t){if(t instanceof en)return new en(t.h,t.s,t.l,t.opacity);if(t instanceof Me||(t=$e(t)),!t)return new en;if(t instanceof en)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new en(o,s,c,t.opacity)}function tn(t,e,n,r){return 1===arguments.length?Qe(t):new en(t,e,n,null==r?1:r)}function en(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function nn(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function rn(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}Ae(Me,$e,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:ze,formatHex:ze,formatHsl:function(){return Qe(this).formatHsl()},formatRgb:Ue,toString:Ue}),Ae(qe,Ge,Se(Me,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new qe(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new qe(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Xe,formatHex:Xe,formatRgb:Ze,toString:Ze})),Ae(en,tn,Se(Me,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new en(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new en(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new qe(nn(t>=240?t-240:t+120,i,r),nn(t,i,r),nn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));var an=function(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=r180||n<-180?n-360*Math.round(n/360):n):sn(isNaN(t)?e:t)}function ln(t){return 1==(t=+t)?hn:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):sn(isNaN(e)?n:e)}}function hn(t,e){var n=e-t;return n?cn(t,n):sn(isNaN(t)?e:t)}var fn=function t(e){var n=ln(e);function r(t,e){var r=n((t=Ge(t)).r,(e=Ge(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=hn(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function dn(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(n=0;na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:_n(n,r)})),a=En.lastIndex;return a=0&&e._call.call(null,t),e=e._next;--Bn}function Vn(){Fn=(In=Rn.now())+jn,Bn=Ln=0;try{Hn()}finally{Bn=0,function(){var t,e,n=Tn,r=1/0;for(;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Tn=e);Cn=t,qn(r)}(),Fn=0}}function Gn(){var t=Rn.now(),e=t-In;e>1e3&&(jn-=e,In=t)}function qn(t){Bn||(Ln&&(Ln=clearTimeout(Ln)),t-Fn>24?(t<1/0&&(Ln=setTimeout(Vn,t-Rn.now()-jn)),Pn&&(Pn=clearInterval(Pn))):(Pn||(In=Rn.now(),Pn=setInterval(Gn,1e3)),Bn=1,Yn(Vn)))}$n.prototype=Wn.prototype={constructor:$n,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?zn():+n)+(null==e?0:+e),this._next||Cn===this||(Cn?Cn._next=this:Tn=this,Cn=this),this._call=t,this._time=n,qn()},stop:function(){this._call&&(this._call=null,this._time=1/0,qn())}};var Xn=function(t,e,n){var r=new $n;return e=null==e?0:+e,r.restart((function(n){r.stop(),t(n+e)}),e,n),r},Zn=lt("start","end","cancel","interrupt"),Jn=[],Kn=function(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(c){var u,l,h,f;if(1!==n.state)return s();for(u in i)if((f=i[u]).name===n.name){if(3===f.state)return Xn(a);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[u]):+u0)throw new Error("too late; already scheduled");return n}function tr(t,e){var n=er(t,e);if(n.state>3)throw new Error("too late; already running");return n}function er(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}var nr,rr,ir,ar,or=function(t,e){var n,r,i,a=t.__transition,o=!0;if(a){for(i in e=null==e?null:e+"",a)(n=a[i]).name===e?(r=n.state>2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(r?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[i]):o=!1;o&&delete t.__transition}},sr=180/Math.PI,cr={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1},ur=function(t,e,n,r,i,a){var o,s,c;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(c=t*n+e*r)&&(n-=t*c,r-=e*c),(s=Math.sqrt(n*n+r*r))&&(n/=s,r/=s,c/=s),t*r180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:_n(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,s,c),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:_n(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,s,c),function(t,e,n,r,a,o){if(t!==n||e!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:_n(t,n)},{i:s-2,x:_n(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,c),a=o=null,function(t){for(var e,n=-1,r=c.length;++n=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Qn:tr;return function(){var o=a(this,t),s=o.on;s!==r&&(i=(r=s).copy()).on(e,n),o.on=i}}var Br=_e.prototype.constructor;function Lr(t){return function(){this.style.removeProperty(t)}}function Pr(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}function Ir(t,e,n){var r,i;function a(){var a=e.apply(this,arguments);return a!==i&&(r=(i=a)&&Pr(t,a,n)),r}return a._value=e,a}function Fr(t){return function(e){this.textContent=t.call(this,e)}}function jr(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&Fr(r)),e}return r._value=t,r}var Rr=0;function Yr(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function zr(t){return _e().transition(t)}function Ur(){return++Rr}var $r=_e.prototype;function Wr(t){return t*t*t}function Hr(t){return--t*t*t+1}function Vr(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}Yr.prototype=zr.prototype={constructor:Yr,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=ft(t));for(var r=this._groups,i=r.length,a=new Array(i),o=0;o1&&n.name===e)return new Yr([[t]],Xr,e,+r);return null},Jr=function(t){return function(){return t}},Kr=function(t,e,n){this.target=t,this.type=e,this.selection=n};function Qr(){ce.stopImmediatePropagation()}var ti=function(){ce.preventDefault(),ce.stopImmediatePropagation()},ei={name:"drag"},ni={name:"space"},ri={name:"handle"},ii={name:"center"};function ai(t){return[+t[0],+t[1]]}function oi(t){return[ai(t[0]),ai(t[1])]}function si(t){return function(e){return Dn(e,ce.touches,t)}}var ci={name:"x",handles:["w","e"].map(gi),input:function(t,e){return null==t?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},ui={name:"y",handles:["n","s"].map(gi),input:function(t,e){return null==t?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},li={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(gi),input:function(t){return null==t?null:oi(t)},output:function(t){return t}},hi={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},fi={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},di={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},pi={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},yi={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function gi(t){return{type:t}}function vi(){return!ce.ctrlKey&&!ce.button}function mi(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function bi(){return navigator.maxTouchPoints||"ontouchstart"in this}function xi(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function _i(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function ki(t){var e=t.__brush;return e?e.dim.output(e.selection):null}function wi(){return Ci(ci)}function Ei(){return Ci(ui)}var Ti=function(){return Ci(li)};function Ci(t){var e,n=mi,r=vi,i=bi,a=!0,o=lt("start","brush","end"),s=6;function c(e){var n=e.property("__brush",y).selectAll(".overlay").data([gi("overlay")]);n.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",hi.overlay).merge(n).each((function(){var t=xi(this).extent;ke(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),e.selectAll(".selection").data([gi("selection")]).enter().append("rect").attr("class","selection").attr("cursor",hi.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=e.selectAll(".handle").data(t.handles,(function(t){return t.type}));r.exit().remove(),r.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return hi[t.type]})),e.each(u).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",f).filter(i).on("touchstart.brush",f).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function u(){var t=ke(this),e=xi(this).selection;e?(t.selectAll(".selection").style("display",null).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?e[1][0]-s/2:e[0][0]-s/2})).attr("y",(function(t){return"s"===t.type[0]?e[1][1]-s/2:e[0][1]-s/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?e[1][0]-e[0][0]+s:s})).attr("height",(function(t){return"e"===t.type||"w"===t.type?e[1][1]-e[0][1]+s:s}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function l(t,e,n){return!n&&t.__brush.emitter||new h(t,e)}function h(t,e){this.that=t,this.args=e,this.state=t.__brush,this.active=0}function f(){if((!e||ce.touches)&&r.apply(this,arguments)){var n,i,o,s,c,h,f,d,p,y,g,v=this,m=ce.target.__data__.type,b="selection"===(a&&ce.metaKey?m="overlay":m)?ei:a&&ce.altKey?ii:ri,x=t===ui?null:pi[m],_=t===ci?null:yi[m],k=xi(v),w=k.extent,E=k.selection,T=w[0][0],C=w[0][1],A=w[1][0],S=w[1][1],M=0,O=0,D=x&&_&&a&&ce.shiftKey,N=ce.touches?si(ce.changedTouches[0].identifier):Nn,B=N(v),L=B,P=l(v,arguments,!0).beforestart();"overlay"===m?(E&&(p=!0),k.selection=E=[[n=t===ui?T:B[0],o=t===ci?C:B[1]],[c=t===ui?A:n,f=t===ci?S:o]]):(n=E[0][0],o=E[0][1],c=E[1][0],f=E[1][1]),i=n,s=o,h=c,d=f;var I=ke(v).attr("pointer-events","none"),F=I.selectAll(".overlay").attr("cursor",hi[m]);if(ce.touches)P.moved=R,P.ended=z;else{var j=ke(ce.view).on("mousemove.brush",R,!0).on("mouseup.brush",z,!0);a&&j.on("keydown.brush",U,!0).on("keyup.brush",$,!0),Te(ce.view)}Qr(),or(v),u.call(v),P.start()}function R(){var t=N(v);!D||y||g||(Math.abs(t[0]-L[0])>Math.abs(t[1]-L[1])?g=!0:y=!0),L=t,p=!0,ti(),Y()}function Y(){var t;switch(M=L[0]-B[0],O=L[1]-B[1],b){case ni:case ei:x&&(M=Math.max(T-n,Math.min(A-c,M)),i=n+M,h=c+M),_&&(O=Math.max(C-o,Math.min(S-f,O)),s=o+O,d=f+O);break;case ri:x<0?(M=Math.max(T-n,Math.min(A-n,M)),i=n+M,h=c):x>0&&(M=Math.max(T-c,Math.min(A-c,M)),i=n,h=c+M),_<0?(O=Math.max(C-o,Math.min(S-o,O)),s=o+O,d=f):_>0&&(O=Math.max(C-f,Math.min(S-f,O)),s=o,d=f+O);break;case ii:x&&(i=Math.max(T,Math.min(A,n-M*x)),h=Math.max(T,Math.min(A,c+M*x))),_&&(s=Math.max(C,Math.min(S,o-O*_)),d=Math.max(C,Math.min(S,f+O*_)))}h0&&(n=i-M),_<0?f=d-O:_>0&&(o=s-O),b=ni,F.attr("cursor",hi.selection),Y());break;default:return}ti()}function $(){switch(ce.keyCode){case 16:D&&(y=g=D=!1,Y());break;case 18:b===ii&&(x<0?c=h:x>0&&(n=i),_<0?f=d:_>0&&(o=s),b=ri,Y());break;case 32:b===ni&&(ce.altKey?(x&&(c=h-M*x,n=i+M*x),_&&(f=d-O*_,o=s+O*_),b=ii):(x<0?c=h:x>0&&(n=i),_<0?f=d:_>0&&(o=s),b=ri),F.attr("cursor",hi[m]),Y());break;default:return}ti()}}function d(){l(this,arguments).moved()}function p(){l(this,arguments).ended()}function y(){var e=this.__brush||{selection:null};return e.extent=oi(n.apply(this,arguments)),e.dim=t,e}return c.move=function(e,n){e.selection?e.on("start.brush",(function(){l(this,arguments).beforestart().start()})).on("interrupt.brush end.brush",(function(){l(this,arguments).end()})).tween("brush",(function(){var e=this,r=e.__brush,i=l(e,arguments),a=r.selection,o=t.input("function"==typeof n?n.apply(this,arguments):n,r.extent),s=Sn(a,o);function c(t){r.selection=1===t&&null===o?null:s(t),u.call(e),i.brush()}return null!==a&&null!==o?c:c(1)})):e.each((function(){var e=this,r=arguments,i=e.__brush,a=t.input("function"==typeof n?n.apply(e,r):n,i.extent),o=l(e,r).beforestart();or(e),i.selection=null===a?null:a,u.call(e),o.start().brush().end()}))},c.clear=function(t){c.move(t,null)},h.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(){return this.starting?(this.starting=!1,this.emit("start")):this.emit("brush"),this},brush:function(){return this.emit("brush"),this},end:function(){return 0==--this.active&&(delete this.state.emitter,this.emit("end")),this},emit:function(e){pe(new Kr(c,e,t.output(this.state.selection)),o.apply,o,[e,this.that,this.args])}},c.extent=function(t){return arguments.length?(n="function"==typeof t?t:Jr(oi(t)),c):n},c.filter=function(t){return arguments.length?(r="function"==typeof t?t:Jr(!!t),c):r},c.touchable=function(t){return arguments.length?(i="function"==typeof t?t:Jr(!!t),c):i},c.handleSize=function(t){return arguments.length?(s=+t,c):s},c.keyModifiers=function(t){return arguments.length?(a=!!t,c):a},c.on=function(){var t=o.on.apply(o,arguments);return t===o?c:t},c}var Ai=Math.cos,Si=Math.sin,Mi=Math.PI,Oi=Mi/2,Di=2*Mi,Ni=Math.max;function Bi(t){return function(e,n){return t(e.source.value+e.target.value,n.source.value+n.target.value)}}var Li=function(){var t=0,e=null,n=null,r=null;function i(i){var a,o,s,c,u,l,h=i.length,f=[],d=k(h),p=[],y=[],g=y.groups=new Array(h),v=new Array(h*h);for(a=0,u=-1;++u1e-6)if(Math.abs(l*s-c*u)>1e-6&&i){var f=n-a,d=r-o,p=s*s+c*c,y=f*f+d*d,g=Math.sqrt(p),v=Math.sqrt(h),m=i*Math.tan((Fi-Math.acos((p+h-y)/(2*g*v)))/2),b=m/v,x=m/g;Math.abs(b-1)>1e-6&&(this._+="L"+(t+b*u)+","+(e+b*l)),this._+="A"+i+","+i+",0,0,"+ +(l*f>u*d)+","+(this._x1=t+x*s)+","+(this._y1=e+x*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,r,i,a){t=+t,e=+e,a=!!a;var o=(n=+n)*Math.cos(r),s=n*Math.sin(r),c=t+o,u=e+s,l=1^a,h=a?r-i:i-r;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+u:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-u)>1e-6)&&(this._+="L"+c+","+u),n&&(h<0&&(h=h%ji+ji),h>Ri?this._+="A"+n+","+n+",0,1,"+l+","+(t-o)+","+(e-s)+"A"+n+","+n+",0,1,"+l+","+(this._x1=c)+","+(this._y1=u):h>1e-6&&(this._+="A"+n+","+n+",0,"+ +(h>=Fi)+","+l+","+(this._x1=t+n*Math.cos(i))+","+(this._y1=e+n*Math.sin(i))))},rect:function(t,e,n,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}};var Ui=zi;function $i(t){return t.source}function Wi(t){return t.target}function Hi(t){return t.radius}function Vi(t){return t.startAngle}function Gi(t){return t.endAngle}var qi=function(){var t=$i,e=Wi,n=Hi,r=Vi,i=Gi,a=null;function o(){var o,s=Pi.call(arguments),c=t.apply(this,s),u=e.apply(this,s),l=+n.apply(this,(s[0]=c,s)),h=r.apply(this,s)-Oi,f=i.apply(this,s)-Oi,d=l*Ai(h),p=l*Si(h),y=+n.apply(this,(s[0]=u,s)),g=r.apply(this,s)-Oi,v=i.apply(this,s)-Oi;if(a||(a=o=Ui()),a.moveTo(d,p),a.arc(0,0,l,h,f),h===g&&f===v||(a.quadraticCurveTo(0,0,y*Ai(g),y*Si(g)),a.arc(0,0,y,g,v)),a.quadraticCurveTo(0,0,d,p),a.closePath(),o)return a=null,o+""||null}return o.radius=function(t){return arguments.length?(n="function"==typeof t?t:Ii(+t),o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ii(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:Ii(+t),o):i},o.source=function(e){return arguments.length?(t=e,o):t},o.target=function(t){return arguments.length?(e=t,o):e},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o};function Xi(){}function Zi(t,e){var n=new Xi;if(t instanceof Xi)t.each((function(t,e){n.set(e,t)}));else if(Array.isArray(t)){var r,i=-1,a=t.length;if(null==e)for(;++i=r.length)return null!=t&&n.sort(t),null!=e?e(n):n;for(var c,u,l,h=-1,f=n.length,d=r[i++],p=Ji(),y=o();++hr.length)return n;var o,s=i[a-1];return null!=e&&a>=r.length?o=n.entries():(o=[],n.each((function(e,n){o.push({key:n,values:t(e,a)})}))),null!=s?o.sort((function(t,e){return s(t.key,e.key)})):o}(a(t,0,ea,na),0)},key:function(t){return r.push(t),n},sortKeys:function(t){return i[r.length-1]=t,n},sortValues:function(e){return t=e,n},rollup:function(t){return e=t,n}}};function Qi(){return{}}function ta(t,e,n){t[e]=n}function ea(){return Ji()}function na(t,e,n){t.set(e,n)}function ra(){}var ia=Ji.prototype;function aa(t,e){var n=new ra;if(t instanceof ra)t.each((function(t){n.add(t)}));else if(t){var r=-1,i=t.length;if(null==e)for(;++r6/29*(6/29)*(6/29)?Math.pow(t,1/3):t/(6/29*3*(6/29))+4/29}function va(t){return t>6/29?t*t*t:6/29*3*(6/29)*(t-4/29)}function ma(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function ba(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function xa(t){if(t instanceof wa)return new wa(t.h,t.c,t.l,t.opacity);if(t instanceof ya||(t=fa(t)),0===t.a&&0===t.b)return new wa(NaN,0r!=d>r&&n<(f-u)*(r-l)/(d-l)+u&&(i=-i)}return i}function Fa(t,e,n){var r,i,a,o;return function(t,e,n){return(e[0]-t[0])*(n[1]-t[1])==(n[0]-t[0])*(e[1]-t[1])}(t,e,n)&&(i=t[r=+(t[0]===e[0])],a=n[r],o=e[r],i<=a&&a<=o||o<=a&&a<=i)}var ja=function(){},Ra=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]],Ya=function(){var t=1,e=1,n=M,r=s;function i(t){var e=n(t);if(Array.isArray(e))e=e.slice().sort(Ba);else{var r=g(t),i=r[0],o=r[1];e=S(i,o,e),e=k(Math.floor(i/e)*e,Math.floor(o/e)*e,e)}return e.map((function(e){return a(t,e)}))}function a(n,i){var a=[],s=[];return function(n,r,i){var a,s,c,u,l,h,f=new Array,d=new Array;a=s=-1,u=n[0]>=r,Ra[u<<1].forEach(p);for(;++a=r,Ra[c|u<<1].forEach(p);Ra[u<<0].forEach(p);for(;++s=r,l=n[s*t]>=r,Ra[u<<1|l<<2].forEach(p);++a=r,h=l,l=n[s*t+a+1]>=r,Ra[c|u<<1|l<<2|h<<3].forEach(p);Ra[u|l<<3].forEach(p)}a=-1,l=n[s*t]>=r,Ra[l<<2].forEach(p);for(;++a=r,Ra[l<<2|h<<3].forEach(p);function p(t){var e,n,r=[t[0][0]+a,t[0][1]+s],c=[t[1][0]+a,t[1][1]+s],u=o(r),l=o(c);(e=d[u])?(n=f[l])?(delete d[e.end],delete f[n.start],e===n?(e.ring.push(c),i(e.ring)):f[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete d[e.end],e.ring.push(c),d[e.end=l]=e):(e=f[l])?(n=d[u])?(delete f[e.start],delete d[n.end],e===n?(e.ring.push(c),i(e.ring)):f[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete f[e.start],e.ring.unshift(r),f[e.start=u]=e):f[u]=d[l]={start:u,end:l,ring:[r,c]}}Ra[l<<3].forEach(p)}(n,i,(function(t){r(t,n,i),function(t){for(var e=0,n=t.length,r=t[n-1][1]*t[0][0]-t[n-1][0]*t[0][1];++e0?a.push([t]):s.push(t)})),s.forEach((function(t){for(var e,n=0,r=a.length;n0&&o0&&s0&&a>0))throw new Error("invalid size");return t=r,e=a,i},i.thresholds=function(t){return arguments.length?(n="function"==typeof t?t:Array.isArray(t)?La(Na.call(t)):La(t),i):n},i.smooth=function(t){return arguments.length?(r=t?s:ja,i):r===s},i};function za(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(s>=a&&(c-=t.data[s-a+o*r]),e.data[s-n+o*r]=c/Math.min(s+1,r-1+a-s,a))}function Ua(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(s>=a&&(c-=t.data[o+(s-a)*r]),e.data[o+(s-n)*r]=c/Math.min(s+1,i-1+a-s,a))}function $a(t){return t[0]}function Wa(t){return t[1]}function Ha(){return 1}var Va=function(){var t=$a,e=Wa,n=Ha,r=960,i=500,a=20,o=2,s=3*a,c=r+2*s>>o,u=i+2*s>>o,l=La(20);function h(r){var i=new Float32Array(c*u),h=new Float32Array(c*u);r.forEach((function(r,a,l){var h=+t(r,a,l)+s>>o,f=+e(r,a,l)+s>>o,d=+n(r,a,l);h>=0&&h=0&&f>o),Ua({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o),za({width:c,height:u,data:i},{width:c,height:u,data:h},a>>o),Ua({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o),za({width:c,height:u,data:i},{width:c,height:u,data:h},a>>o),Ua({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o);var d=l(i);if(!Array.isArray(d)){var p=L(i);d=S(0,p,d),(d=k(0,Math.floor(p/d)*d,d)).shift()}return Ya().thresholds(d).size([c,u])(i).map(f)}function f(t){return t.value*=Math.pow(2,-2*o),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(y)}function y(t){t[0]=t[0]*Math.pow(2,o)-s,t[1]=t[1]*Math.pow(2,o)-s}function g(){return c=r+2*(s=3*a)>>o,u=i+2*s>>o,h}return h.x=function(e){return arguments.length?(t="function"==typeof e?e:La(+e),h):t},h.y=function(t){return arguments.length?(e="function"==typeof t?t:La(+t),h):e},h.weight=function(t){return arguments.length?(n="function"==typeof t?t:La(+t),h):n},h.size=function(t){if(!arguments.length)return[r,i];var e=Math.ceil(t[0]),n=Math.ceil(t[1]);if(!(e>=0||e>=0))throw new Error("invalid size");return r=e,i=n,g()},h.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return o=Math.floor(Math.log(t)/Math.LN2),g()},h.thresholds=function(t){return arguments.length?(l="function"==typeof t?t:Array.isArray(t)?La(Na.call(t)):La(t),h):l},h.bandwidth=function(t){if(!arguments.length)return Math.sqrt(a*(a+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return a=Math.round((Math.sqrt(4*t*t+1)-1)/2),g()},h},Ga=function(t){return function(){return t}};function qa(t,e,n,r,i,a,o,s,c,u){this.target=t,this.type=e,this.subject=n,this.identifier=r,this.active=i,this.x=a,this.y=o,this.dx=s,this.dy=c,this._=u}function Xa(){return!ce.ctrlKey&&!ce.button}function Za(){return this.parentNode}function Ja(t){return null==t?{x:ce.x,y:ce.y}:t}function Ka(){return navigator.maxTouchPoints||"ontouchstart"in this}qa.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};var Qa=function(){var t,e,n,r,i=Xa,a=Za,o=Ja,s=Ka,c={},u=lt("start","drag","end"),l=0,h=0;function f(t){t.on("mousedown.drag",d).filter(s).on("touchstart.drag",g).on("touchmove.drag",v).on("touchend.drag touchcancel.drag",m).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(){if(!r&&i.apply(this,arguments)){var o=b("mouse",a.apply(this,arguments),Nn,this,arguments);o&&(ke(ce.view).on("mousemove.drag",p,!0).on("mouseup.drag",y,!0),Te(ce.view),we(),n=!1,t=ce.clientX,e=ce.clientY,o("start"))}}function p(){if(Ee(),!n){var r=ce.clientX-t,i=ce.clientY-e;n=r*r+i*i>h}c.mouse("drag")}function y(){ke(ce.view).on("mousemove.drag mouseup.drag",null),Ce(ce.view,n),Ee(),c.mouse("end")}function g(){if(i.apply(this,arguments)){var t,e,n=ce.changedTouches,r=a.apply(this,arguments),o=n.length;for(t=0;t9999?"+"+io(e,6):io(e,4))+"-"+io(t.getUTCMonth()+1,2)+"-"+io(t.getUTCDate(),2)+(a?"T"+io(n,2)+":"+io(r,2)+":"+io(i,2)+"."+io(a,3)+"Z":i?"T"+io(n,2)+":"+io(r,2)+":"+io(i,2)+"Z":r||n?"T"+io(n,2)+":"+io(r,2)+"Z":"")}var oo=function(t){var e=new RegExp('["'+t+"\n\r]"),n=t.charCodeAt(0);function r(t,e){var r,i=[],a=t.length,o=0,s=0,c=a<=0,u=!1;function l(){if(c)return eo;if(u)return u=!1,to;var e,r,i=o;if(34===t.charCodeAt(i)){for(;o++=a?c=!0:10===(r=t.charCodeAt(o++))?u=!0:13===r&&(u=!0,10===t.charCodeAt(o)&&++o),t.slice(i+1,e-1).replace(/""/g,'"')}for(;o=(a=(y+v)/2))?y=a:v=a,(l=n>=(o=(g+m)/2))?g=o:m=o,i=d,!(d=d[h=l<<1|u]))return i[h]=p,t;if(s=+t._x.call(null,d.data),c=+t._y.call(null,d.data),e===s&&n===c)return p.next=d,i?i[h]=p:t._root=p,t;do{i=i?i[h]=new Array(4):t._root=new Array(4),(u=e>=(a=(y+v)/2))?y=a:v=a,(l=n>=(o=(g+m)/2))?g=o:m=o}while((h=l<<1|u)==(f=(c>=o)<<1|s>=a));return i[f]=d,i[h]=p,t}var _s=function(t,e,n,r,i){this.node=t,this.x0=e,this.y0=n,this.x1=r,this.y1=i};function ks(t){return t[0]}function ws(t){return t[1]}function Es(t,e,n){var r=new Ts(null==e?ks:e,null==n?ws:n,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Ts(t,e,n,r,i,a){this._x=t,this._y=e,this._x0=n,this._y0=r,this._x1=i,this._y1=a,this._root=void 0}function Cs(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var As=Es.prototype=Ts.prototype;function Ss(t){return t.x+t.vx}function Ms(t){return t.y+t.vy}As.copy=function(){var t,e,n=new Ts(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return n;if(!r.length)return n._root=Cs(r),n;for(t=[{source:r,target:n._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(e=r.source[i])&&(e.length?t.push({source:e,target:r.target[i]=new Array(4)}):r.target[i]=Cs(e));return n},As.add=function(t){var e=+this._x.call(null,t),n=+this._y.call(null,t);return xs(this.cover(e,n),e,n,t)},As.addAll=function(t){var e,n,r,i,a=t.length,o=new Array(a),s=new Array(a),c=1/0,u=1/0,l=-1/0,h=-1/0;for(n=0;nl&&(l=r),ih&&(h=i));if(c>l||u>h)return this;for(this.cover(c,u).cover(l,h),n=0;nt||t>=i||r>e||e>=a;)switch(s=(ef||(a=c.y0)>d||(o=c.x1)=v)<<1|t>=g)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-u],p[p.length-1-u]=c)}else{var m=t-+this._x.call(null,y.data),b=e-+this._y.call(null,y.data),x=m*m+b*b;if(x=(s=(p+g)/2))?p=s:g=s,(l=o>=(c=(y+v)/2))?y=c:v=c,e=d,!(d=d[h=l<<1|u]))return this;if(!d.length)break;(e[h+1&3]||e[h+2&3]||e[h+3&3])&&(n=e,f=h)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):e?(i?e[h]=i:delete e[h],(d=e[0]||e[1]||e[2]||e[3])&&d===(e[3]||e[2]||e[1]||e[0])&&!d.length&&(n?n[f]=d:this._root=d),this):(this._root=i,this)},As.removeAll=function(t){for(var e=0,n=t.length;ec+d||iu+d||as.index){var p=c-o.x-o.vx,y=u-o.y-o.vy,g=p*p+y*y;gt.r&&(t.r=t[e].r)}function s(){if(e){var r,i,a=e.length;for(n=new Array(a),r=0;r1?(null==n?s.remove(t):s.set(t,d(n)),e):s.get(t)},find:function(e,n,r){var i,a,o,s,c,u=0,l=t.length;for(null==r?r=1/0:r*=r,u=0;u1?(u.on(t,n),e):u.on(t)}}},js=function(){var t,e,n,r,i=ms(-30),a=1,o=1/0,s=.81;function c(r){var i,a=t.length,o=Es(t,Ls,Ps).visitAfter(l);for(n=r,i=0;i=o)){(t.data!==e||t.next)&&(0===l&&(d+=(l=bs())*l),0===h&&(d+=(h=bs())*h),d1?r[0]+r.slice(2):r,+t.slice(n+1)]},$s=function(t){return(t=Us(Math.abs(t)))?t[1]:NaN},Ws=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Hs(t){if(!(e=Ws.exec(t)))throw new Error("invalid format: "+t);var e;return new Vs({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function Vs(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}Hs.prototype=Vs.prototype,Vs.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var Gs,qs,Xs,Zs,Js=function(t,e){var n=Us(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")},Ks={"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return Js(100*t,e)},r:Js,s:function(t,e){var n=Us(t,e);if(!n)return t+"";var r=n[0],i=n[1],a=i-(Gs=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,o=r.length;return a===o?r:a>o?r+new Array(a-o+1).join("0"):a>0?r.slice(0,a)+"."+r.slice(a):"0."+new Array(1-a).join("0")+Us(t,Math.max(0,e+a-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}},Qs=function(t){return t},tc=Array.prototype.map,ec=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"],nc=function(t){var e,n,r=void 0===t.grouping||void 0===t.thousands?Qs:(e=tc.call(t.grouping,Number),n=t.thousands+"",function(t,r){for(var i=t.length,a=[],o=0,s=e[0],c=0;i>0&&s>0&&(c+s+1>r&&(s=Math.max(1,r-c)),a.push(t.substring(i-=s,i+s)),!((c+=s+1)>r));)s=e[o=(o+1)%e.length];return a.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",o=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?Qs:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(tc.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",u=void 0===t.minus?"-":t.minus+"",l=void 0===t.nan?"NaN":t.nan+"";function h(t){var e=(t=Hs(t)).fill,n=t.align,h=t.sign,f=t.symbol,d=t.zero,p=t.width,y=t.comma,g=t.precision,v=t.trim,m=t.type;"n"===m?(y=!0,m="g"):Ks[m]||(void 0===g&&(g=12),v=!0,m="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=");var b="$"===f?i:"#"===f&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",x="$"===f?a:/[%p]/.test(m)?c:"",_=Ks[m],k=/[defgprs%]/.test(m);function w(t){var i,a,c,f=b,w=x;if("c"===m)w=_(t)+w,t="";else{var E=(t=+t)<0;if(t=isNaN(t)?l:_(Math.abs(t),g),v&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),E&&0==+t&&(E=!1),f=(E?"("===h?h:u:"-"===h||"("===h?"":h)+f,w=("s"===m?ec[8+Gs/3]:"")+w+(E&&"("===h?")":""),k)for(i=-1,a=t.length;++i(c=t.charCodeAt(i))||c>57){w=(46===c?o+t.slice(i+1):t.slice(i))+w,t=t.slice(0,i);break}}y&&!d&&(t=r(t,1/0));var T=f.length+t.length+w.length,C=T>1)+f+t+w+C.slice(T);break;default:t=C+f+t+w}return s(t)}return g=void 0===g?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,g)):Math.max(0,Math.min(20,g)),w.toString=function(){return t+""},w}return{format:h,formatPrefix:function(t,e){var n=h(((t=Hs(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor($s(e)/3))),i=Math.pow(10,-r),a=ec[8+r/3];return function(t){return n(i*t)+a}}}};function rc(t){return qs=nc(t),Xs=qs.format,Zs=qs.formatPrefix,qs}rc({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"});var ic=function(t){return Math.max(0,-$s(Math.abs(t)))},ac=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor($s(e)/3)))-$s(Math.abs(t)))},oc=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,$s(e)-$s(t))+1},sc=function(){return new cc};function cc(){this.reset()}cc.prototype={constructor:cc,reset:function(){this.s=this.t=0},add:function(t){lc(uc,t,this.t),lc(this,uc.s,this.s),this.s?this.t+=uc.t:this.s=uc.t},valueOf:function(){return this.s}};var uc=new cc;function lc(t,e,n){var r=t.s=e+n,i=r-e,a=r-i;t.t=e-a+(n-i)}var hc=Math.PI,fc=hc/2,dc=hc/4,pc=2*hc,yc=180/hc,gc=hc/180,vc=Math.abs,mc=Math.atan,bc=Math.atan2,xc=Math.cos,_c=Math.ceil,kc=Math.exp,wc=(Math.floor,Math.log),Ec=Math.pow,Tc=Math.sin,Cc=Math.sign||function(t){return t>0?1:t<0?-1:0},Ac=Math.sqrt,Sc=Math.tan;function Mc(t){return t>1?0:t<-1?hc:Math.acos(t)}function Oc(t){return t>1?fc:t<-1?-fc:Math.asin(t)}function Dc(t){return(t=Tc(t/2))*t}function Nc(){}function Bc(t,e){t&&Pc.hasOwnProperty(t.type)&&Pc[t.type](t,e)}var Lc={Feature:function(t,e){Bc(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r=0?1:-1,i=r*n,a=xc(e=(e*=gc)/2+dc),o=Tc(e),s=Uc*o,c=zc*a+s*xc(i),u=s*r*Tc(i);Wc.add(bc(u,c)),Yc=t,zc=a,Uc=o}var Jc=function(t){return Hc.reset(),$c(t,Vc),2*Hc};function Kc(t){return[bc(t[1],t[0]),Oc(t[2])]}function Qc(t){var e=t[0],n=t[1],r=xc(n);return[r*xc(e),r*Tc(e),Tc(n)]}function tu(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function eu(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function nu(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function ru(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function iu(t){var e=Ac(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var au,ou,su,cu,uu,lu,hu,fu,du,pu,yu=sc(),gu={point:vu,lineStart:bu,lineEnd:xu,polygonStart:function(){gu.point=_u,gu.lineStart=ku,gu.lineEnd=wu,yu.reset(),Vc.polygonStart()},polygonEnd:function(){Vc.polygonEnd(),gu.point=vu,gu.lineStart=bu,gu.lineEnd=xu,Wc<0?(au=-(su=180),ou=-(cu=90)):yu>1e-6?cu=90:yu<-1e-6&&(ou=-90),pu[0]=au,pu[1]=su},sphere:function(){au=-(su=180),ou=-(cu=90)}};function vu(t,e){du.push(pu=[au=t,su=t]),ecu&&(cu=e)}function mu(t,e){var n=Qc([t*gc,e*gc]);if(fu){var r=eu(fu,n),i=eu([r[1],-r[0],0],r);iu(i),i=Kc(i);var a,o=t-uu,s=o>0?1:-1,c=i[0]*yc*s,u=vc(o)>180;u^(s*uucu&&(cu=a):u^(s*uu<(c=(c+360)%360-180)&&ccu&&(cu=e)),u?tEu(au,su)&&(su=t):Eu(t,su)>Eu(au,su)&&(au=t):su>=au?(tsu&&(su=t)):t>uu?Eu(au,t)>Eu(au,su)&&(su=t):Eu(t,su)>Eu(au,su)&&(au=t)}else du.push(pu=[au=t,su=t]);ecu&&(cu=e),fu=n,uu=t}function bu(){gu.point=mu}function xu(){pu[0]=au,pu[1]=su,gu.point=vu,fu=null}function _u(t,e){if(fu){var n=t-uu;yu.add(vc(n)>180?n+(n>0?360:-360):n)}else lu=t,hu=e;Vc.point(t,e),mu(t,e)}function ku(){Vc.lineStart()}function wu(){_u(lu,hu),Vc.lineEnd(),vc(yu)>1e-6&&(au=-(su=180)),pu[0]=au,pu[1]=su,fu=null}function Eu(t,e){return(e-=t)<0?e+360:e}function Tu(t,e){return t[0]-e[0]}function Cu(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eEu(r[0],r[1])&&(r[1]=i[1]),Eu(i[0],r[1])>Eu(r[0],r[1])&&(r[0]=i[0])):a.push(r=i);for(o=-1/0,e=0,r=a[n=a.length-1];e<=n;r=i,++e)i=a[e],(s=Eu(r[1],i[0]))>o&&(o=s,au=i[0],su=r[1])}return du=pu=null,au===1/0||ou===1/0?[[NaN,NaN],[NaN,NaN]]:[[au,ou],[su,cu]]},Wu={sphere:Nc,point:Hu,lineStart:Gu,lineEnd:Zu,polygonStart:function(){Wu.lineStart=Ju,Wu.lineEnd=Ku},polygonEnd:function(){Wu.lineStart=Gu,Wu.lineEnd=Zu}};function Hu(t,e){t*=gc;var n=xc(e*=gc);Vu(n*xc(t),n*Tc(t),Tc(e))}function Vu(t,e,n){++Au,Mu+=(t-Mu)/Au,Ou+=(e-Ou)/Au,Du+=(n-Du)/Au}function Gu(){Wu.point=qu}function qu(t,e){t*=gc;var n=xc(e*=gc);Yu=n*xc(t),zu=n*Tc(t),Uu=Tc(e),Wu.point=Xu,Vu(Yu,zu,Uu)}function Xu(t,e){t*=gc;var n=xc(e*=gc),r=n*xc(t),i=n*Tc(t),a=Tc(e),o=bc(Ac((o=zu*a-Uu*i)*o+(o=Uu*r-Yu*a)*o+(o=Yu*i-zu*r)*o),Yu*r+zu*i+Uu*a);Su+=o,Nu+=o*(Yu+(Yu=r)),Bu+=o*(zu+(zu=i)),Lu+=o*(Uu+(Uu=a)),Vu(Yu,zu,Uu)}function Zu(){Wu.point=Hu}function Ju(){Wu.point=Qu}function Ku(){tl(ju,Ru),Wu.point=Hu}function Qu(t,e){ju=t,Ru=e,t*=gc,e*=gc,Wu.point=tl;var n=xc(e);Yu=n*xc(t),zu=n*Tc(t),Uu=Tc(e),Vu(Yu,zu,Uu)}function tl(t,e){t*=gc;var n=xc(e*=gc),r=n*xc(t),i=n*Tc(t),a=Tc(e),o=zu*a-Uu*i,s=Uu*r-Yu*a,c=Yu*i-zu*r,u=Ac(o*o+s*s+c*c),l=Oc(u),h=u&&-l/u;Pu+=h*o,Iu+=h*s,Fu+=h*c,Su+=l,Nu+=l*(Yu+(Yu=r)),Bu+=l*(zu+(zu=i)),Lu+=l*(Uu+(Uu=a)),Vu(Yu,zu,Uu)}var el=function(t){Au=Su=Mu=Ou=Du=Nu=Bu=Lu=Pu=Iu=Fu=0,$c(t,Wu);var e=Pu,n=Iu,r=Fu,i=e*e+n*n+r*r;return i<1e-12&&(e=Nu,n=Bu,r=Lu,Su<1e-6&&(e=Mu,n=Ou,r=Du),(i=e*e+n*n+r*r)<1e-12)?[NaN,NaN]:[bc(n,e)*yc,Oc(r/Ac(i))*yc]},nl=function(t){return function(){return t}},rl=function(t,e){function n(n,r){return n=t(n,r),e(n[0],n[1])}return t.invert&&e.invert&&(n.invert=function(n,r){return(n=e.invert(n,r))&&t.invert(n[0],n[1])}),n};function il(t,e){return[vc(t)>hc?t+Math.round(-t/pc)*pc:t,e]}function al(t,e,n){return(t%=pc)?e||n?rl(sl(t),cl(e,n)):sl(t):e||n?cl(e,n):il}function ol(t){return function(e,n){return[(e+=t)>hc?e-pc:e<-hc?e+pc:e,n]}}function sl(t){var e=ol(t);return e.invert=ol(-t),e}function cl(t,e){var n=xc(t),r=Tc(t),i=xc(e),a=Tc(e);function o(t,e){var o=xc(e),s=xc(t)*o,c=Tc(t)*o,u=Tc(e),l=u*n+s*r;return[bc(c*i-l*a,s*n-u*r),Oc(l*i+c*a)]}return o.invert=function(t,e){var o=xc(e),s=xc(t)*o,c=Tc(t)*o,u=Tc(e),l=u*i-c*a;return[bc(c*i+u*a,s*n+l*r),Oc(l*n-s*r)]},o}il.invert=il;var ul=function(t){function e(e){return(e=t(e[0]*gc,e[1]*gc))[0]*=yc,e[1]*=yc,e}return t=al(t[0]*gc,t[1]*gc,t.length>2?t[2]*gc:0),e.invert=function(e){return(e=t.invert(e[0]*gc,e[1]*gc))[0]*=yc,e[1]*=yc,e},e};function ll(t,e,n,r,i,a){if(n){var o=xc(e),s=Tc(e),c=r*n;null==i?(i=e+r*pc,a=e-c/2):(i=hl(o,i),a=hl(o,a),(r>0?ia)&&(i+=r*pc));for(var u,l=i;r>0?l>a:l1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}},pl=function(t,e){return vc(t[0]-e[0])<1e-6&&vc(t[1]-e[1])<1e-6};function yl(t,e,n,r){this.x=t,this.z=e,this.o=n,this.e=r,this.v=!1,this.n=this.p=null}var gl=function(t,e,n,r,i){var a,o,s=[],c=[];if(t.forEach((function(t){if(!((e=t.length-1)<=0)){var e,n,r=t[0],o=t[e];if(pl(r,o)){for(i.lineStart(),a=0;a=0;--a)i.point((l=u[a])[0],l[1]);else r(f.x,f.p.x,-1,i);f=f.p}u=(f=f.o).z,d=!d}while(!f.v);i.lineEnd()}}};function vl(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r=0?1:-1,T=E*w,C=T>hc,A=y*_;if(ml.add(bc(A*E*Tc(T),g*k+A*xc(T))),o+=C?w+E*pc:w,C^d>=n^b>=n){var S=eu(Qc(f),Qc(m));iu(S);var M=eu(a,S);iu(M);var O=(C^w>=0?-1:1)*Oc(M[2]);(r>O||r===O&&(S[0]||S[1]))&&(s+=C^w>=0?1:-1)}}return(o<-1e-6||o<1e-6&&ml<-1e-6)^1&s},_l=function(t,e,n,r){return function(i){var a,o,s,c=e(i),u=dl(),l=e(u),h=!1,f={point:d,lineStart:y,lineEnd:g,polygonStart:function(){f.point=v,f.lineStart=m,f.lineEnd=b,o=[],a=[]},polygonEnd:function(){f.point=d,f.lineStart=y,f.lineEnd=g,o=F(o);var t=xl(a,r);o.length?(h||(i.polygonStart(),h=!0),gl(o,wl,t,n,i)):t&&(h||(i.polygonStart(),h=!0),i.lineStart(),n(null,null,1,i),i.lineEnd()),h&&(i.polygonEnd(),h=!1),o=a=null},sphere:function(){i.polygonStart(),i.lineStart(),n(null,null,1,i),i.lineEnd(),i.polygonEnd()}};function d(e,n){t(e,n)&&i.point(e,n)}function p(t,e){c.point(t,e)}function y(){f.point=p,c.lineStart()}function g(){f.point=d,c.lineEnd()}function v(t,e){s.push([t,e]),l.point(t,e)}function m(){l.lineStart(),s=[]}function b(){v(s[0][0],s[0][1]),l.lineEnd();var t,e,n,r,c=l.clean(),f=u.result(),d=f.length;if(s.pop(),a.push(s),s=null,d)if(1&c){if((e=(n=f[0]).length-1)>0){for(h||(i.polygonStart(),h=!0),i.lineStart(),t=0;t1&&2&c&&f.push(f.pop().concat(f.shift())),o.push(f.filter(kl))}return f}};function kl(t){return t.length>1}function wl(t,e){return((t=t.x)[0]<0?t[1]-fc-1e-6:fc-t[1])-((e=e.x)[0]<0?e[1]-fc-1e-6:fc-e[1])}var El=_l((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var s=a>0?hc:-hc,c=vc(a-n);vc(c-hc)<1e-6?(t.point(n,r=(r+o)/2>0?fc:-fc),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),t.point(a,r),e=0):i!==s&&c>=hc&&(vc(n-i)<1e-6&&(n-=1e-6*i),vc(a-s)<1e-6&&(a-=1e-6*s),r=function(t,e,n,r){var i,a,o=Tc(t-n);return vc(o)>1e-6?mc((Tc(e)*(a=xc(r))*Tc(n)-Tc(r)*(i=xc(e))*Tc(t))/(i*a*o)):(e+r)/2}(n,r,a,o),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),e=0),t.point(n=a,r=o),i=s},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*fc,r.point(-hc,i),r.point(0,i),r.point(hc,i),r.point(hc,0),r.point(hc,-i),r.point(0,-i),r.point(-hc,-i),r.point(-hc,0),r.point(-hc,i);else if(vc(t[0]-e[0])>1e-6){var a=t[0]0,i=vc(e)>1e-6;function a(t,n){return xc(t)*xc(n)>e}function o(t,n,r){var i=[1,0,0],a=eu(Qc(t),Qc(n)),o=tu(a,a),s=a[0],c=o-s*s;if(!c)return!r&&t;var u=e*o/c,l=-e*s/c,h=eu(i,a),f=ru(i,u);nu(f,ru(a,l));var d=h,p=tu(f,d),y=tu(d,d),g=p*p-y*(tu(f,f)-1);if(!(g<0)){var v=Ac(g),m=ru(d,(-p-v)/y);if(nu(m,f),m=Kc(m),!r)return m;var b,x=t[0],_=n[0],k=t[1],w=n[1];_0^m[1]<(vc(m[0]-x)<1e-6?k:w):k<=m[1]&&m[1]<=w:E>hc^(x<=m[0]&&m[0]<=_)){var C=ru(d,(-p+v)/y);return nu(C,f),[m,Kc(C)]}}}function s(e,n){var i=r?t:hc-t,a=0;return e<-i?a|=1:e>i&&(a|=2),n<-i?a|=4:n>i&&(a|=8),a}return _l(a,(function(t){var e,n,c,u,l;return{lineStart:function(){u=c=!1,l=1},point:function(h,f){var d,p=[h,f],y=a(h,f),g=r?y?0:s(h,f):y?s(h+(h<0?hc:-hc),f):0;if(!e&&(u=c=y)&&t.lineStart(),y!==c&&(!(d=o(e,p))||pl(e,d)||pl(p,d))&&(p[0]+=1e-6,p[1]+=1e-6,y=a(p[0],p[1])),y!==c)l=0,y?(t.lineStart(),d=o(p,e),t.point(d[0],d[1])):(d=o(e,p),t.point(d[0],d[1]),t.lineEnd()),e=d;else if(i&&e&&r^y){var v;g&n||!(v=o(p,e,!0))||(l=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1])))}!y||e&&pl(e,p)||t.point(p[0],p[1]),e=p,c=y,n=g},lineEnd:function(){c&&t.lineEnd(),e=null},clean:function(){return l|(u&&c)<<1}}}),(function(e,r,i,a){ll(a,t,n,i,e,r)}),r?[0,-t]:[-hc,t-hc])};function Cl(t,e,n,r){function i(i,a){return t<=i&&i<=n&&e<=a&&a<=r}function a(i,a,s,u){var l=0,h=0;if(null==i||(l=o(i,s))!==(h=o(a,s))||c(i,a)<0^s>0)do{u.point(0===l||3===l?t:n,l>1?r:e)}while((l=(l+s+4)%4)!==h);else u.point(a[0],a[1])}function o(r,i){return vc(r[0]-t)<1e-6?i>0?0:3:vc(r[0]-n)<1e-6?i>0?2:1:vc(r[1]-e)<1e-6?i>0?1:0:i>0?3:2}function s(t,e){return c(t.x,e.x)}function c(t,e){var n=o(t,1),r=o(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(o){var c,u,l,h,f,d,p,y,g,v,m,b=o,x=dl(),_={point:k,lineStart:function(){_.point=w,u&&u.push(l=[]);v=!0,g=!1,p=y=NaN},lineEnd:function(){c&&(w(h,f),d&&g&&x.rejoin(),c.push(x.result()));_.point=k,g&&b.lineEnd()},polygonStart:function(){b=x,c=[],u=[],m=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=u.length;nr&&(f-a)*(r-o)>(d-o)*(t-a)&&++e:d<=r&&(f-a)*(r-o)<(d-o)*(t-a)&&--e;return e}(),n=m&&e,i=(c=F(c)).length;(n||i)&&(o.polygonStart(),n&&(o.lineStart(),a(null,null,1,o),o.lineEnd()),i&&gl(c,s,e,a,o),o.polygonEnd());b=o,c=u=l=null}};function k(t,e){i(t,e)&&b.point(t,e)}function w(a,o){var s=i(a,o);if(u&&l.push([a,o]),v)h=a,f=o,d=s,v=!1,s&&(b.lineStart(),b.point(a,o));else if(s&&g)b.point(a,o);else{var c=[p=Math.max(-1e9,Math.min(1e9,p)),y=Math.max(-1e9,Math.min(1e9,y))],x=[a=Math.max(-1e9,Math.min(1e9,a)),o=Math.max(-1e9,Math.min(1e9,o))];!function(t,e,n,r,i,a){var o,s=t[0],c=t[1],u=0,l=1,h=e[0]-s,f=e[1]-c;if(o=n-s,h||!(o>0)){if(o/=h,h<0){if(o0){if(o>l)return;o>u&&(u=o)}if(o=i-s,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>u&&(u=o)}else if(h>0){if(o0)){if(o/=f,f<0){if(o0){if(o>l)return;o>u&&(u=o)}if(o=a-c,f||!(o<0)){if(o/=f,f<0){if(o>l)return;o>u&&(u=o)}else if(f>0){if(o0&&(t[0]=s+u*h,t[1]=c+u*f),l<1&&(e[0]=s+l*h,e[1]=c+l*f),!0}}}}}(c,x,t,e,n,r)?s&&(b.lineStart(),b.point(a,o),m=!1):(g||(b.lineStart(),b.point(c[0],c[1])),b.point(x[0],x[1]),s||b.lineEnd(),m=!1)}p=a,y=o,g=s}return _}}var Al,Sl,Ml,Ol=function(){var t,e,n,r=0,i=0,a=960,o=500;return n={stream:function(n){return t&&e===n?t:t=Cl(r,i,a,o)(e=n)},extent:function(s){return arguments.length?(r=+s[0][0],i=+s[0][1],a=+s[1][0],o=+s[1][1],t=e=null,n):[[r,i],[a,o]]}}},Dl=sc(),Nl={sphere:Nc,point:Nc,lineStart:function(){Nl.point=Ll,Nl.lineEnd=Bl},lineEnd:Nc,polygonStart:Nc,polygonEnd:Nc};function Bl(){Nl.point=Nl.lineEnd=Nc}function Ll(t,e){Al=t*=gc,Sl=Tc(e*=gc),Ml=xc(e),Nl.point=Pl}function Pl(t,e){t*=gc;var n=Tc(e*=gc),r=xc(e),i=vc(t-Al),a=xc(i),o=r*Tc(i),s=Ml*n-Sl*r*a,c=Sl*n+Ml*r*a;Dl.add(bc(Ac(o*o+s*s),c)),Al=t,Sl=n,Ml=r}var Il=function(t){return Dl.reset(),$c(t,Nl),+Dl},Fl=[null,null],jl={type:"LineString",coordinates:Fl},Rl=function(t,e){return Fl[0]=t,Fl[1]=e,Il(jl)},Yl={Feature:function(t,e){return Ul(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r0&&(i=Rl(t[a],t[a-1]))>0&&n<=i&&r<=i&&(n+r-i)*(1-Math.pow((n-r)/i,2))<1e-12*i)return!0;n=r}return!1}function Hl(t,e){return!!xl(t.map(Vl),Gl(e))}function Vl(t){return(t=t.map(Gl)).pop(),t}function Gl(t){return[t[0]*gc,t[1]*gc]}var ql=function(t,e){return(t&&Yl.hasOwnProperty(t.type)?Yl[t.type]:Ul)(t,e)};function Xl(t,e,n){var r=k(t,e-1e-6,n).concat(e);return function(t){return r.map((function(e){return[t,e]}))}}function Zl(t,e,n){var r=k(t,e-1e-6,n).concat(e);return function(t){return r.map((function(e){return[e,t]}))}}function Jl(){var t,e,n,r,i,a,o,s,c,u,l,h,f=10,d=f,p=90,y=360,g=2.5;function v(){return{type:"MultiLineString",coordinates:m()}}function m(){return k(_c(r/p)*p,n,p).map(l).concat(k(_c(s/y)*y,o,y).map(h)).concat(k(_c(e/f)*f,t,f).filter((function(t){return vc(t%p)>1e-6})).map(c)).concat(k(_c(a/d)*d,i,d).filter((function(t){return vc(t%y)>1e-6})).map(u))}return v.lines=function(){return m().map((function(t){return{type:"LineString",coordinates:t}}))},v.outline=function(){return{type:"Polygon",coordinates:[l(r).concat(h(o).slice(1),l(n).reverse().slice(1),h(s).reverse().slice(1))]}},v.extent=function(t){return arguments.length?v.extentMajor(t).extentMinor(t):v.extentMinor()},v.extentMajor=function(t){return arguments.length?(r=+t[0][0],n=+t[1][0],s=+t[0][1],o=+t[1][1],r>n&&(t=r,r=n,n=t),s>o&&(t=s,s=o,o=t),v.precision(g)):[[r,s],[n,o]]},v.extentMinor=function(n){return arguments.length?(e=+n[0][0],t=+n[1][0],a=+n[0][1],i=+n[1][1],e>t&&(n=e,e=t,t=n),a>i&&(n=a,a=i,i=n),v.precision(g)):[[e,a],[t,i]]},v.step=function(t){return arguments.length?v.stepMajor(t).stepMinor(t):v.stepMinor()},v.stepMajor=function(t){return arguments.length?(p=+t[0],y=+t[1],v):[p,y]},v.stepMinor=function(t){return arguments.length?(f=+t[0],d=+t[1],v):[f,d]},v.precision=function(f){return arguments.length?(g=+f,c=Xl(a,i,90),u=Zl(e,t,g),l=Xl(s,o,90),h=Zl(r,n,g),v):g},v.extentMajor([[-180,1e-6-90],[180,90-1e-6]]).extentMinor([[-180,-80-1e-6],[180,80+1e-6]])}function Kl(){return Jl()()}var Ql,th,eh,nh,rh=function(t,e){var n=t[0]*gc,r=t[1]*gc,i=e[0]*gc,a=e[1]*gc,o=xc(r),s=Tc(r),c=xc(a),u=Tc(a),l=o*xc(n),h=o*Tc(n),f=c*xc(i),d=c*Tc(i),p=2*Oc(Ac(Dc(a-r)+o*c*Dc(i-n))),y=Tc(p),g=p?function(t){var e=Tc(t*=p)/y,n=Tc(p-t)/y,r=n*l+e*f,i=n*h+e*d,a=n*s+e*u;return[bc(i,r)*yc,bc(a,Ac(r*r+i*i))*yc]}:function(){return[n*yc,r*yc]};return g.distance=p,g},ih=function(t){return t},ah=sc(),oh=sc(),sh={point:Nc,lineStart:Nc,lineEnd:Nc,polygonStart:function(){sh.lineStart=ch,sh.lineEnd=hh},polygonEnd:function(){sh.lineStart=sh.lineEnd=sh.point=Nc,ah.add(vc(oh)),oh.reset()},result:function(){var t=ah/2;return ah.reset(),t}};function ch(){sh.point=uh}function uh(t,e){sh.point=lh,Ql=eh=t,th=nh=e}function lh(t,e){oh.add(nh*t-eh*e),eh=t,nh=e}function hh(){lh(Ql,th)}var fh=sh,dh=1/0,ph=dh,yh=-dh,gh=yh;var vh,mh,bh,xh,_h={point:function(t,e){tyh&&(yh=t);egh&&(gh=e)},lineStart:Nc,lineEnd:Nc,polygonStart:Nc,polygonEnd:Nc,result:function(){var t=[[dh,ph],[yh,gh]];return yh=gh=-(ph=dh=1/0),t}},kh=0,wh=0,Eh=0,Th=0,Ch=0,Ah=0,Sh=0,Mh=0,Oh=0,Dh={point:Nh,lineStart:Bh,lineEnd:Ih,polygonStart:function(){Dh.lineStart=Fh,Dh.lineEnd=jh},polygonEnd:function(){Dh.point=Nh,Dh.lineStart=Bh,Dh.lineEnd=Ih},result:function(){var t=Oh?[Sh/Oh,Mh/Oh]:Ah?[Th/Ah,Ch/Ah]:Eh?[kh/Eh,wh/Eh]:[NaN,NaN];return kh=wh=Eh=Th=Ch=Ah=Sh=Mh=Oh=0,t}};function Nh(t,e){kh+=t,wh+=e,++Eh}function Bh(){Dh.point=Lh}function Lh(t,e){Dh.point=Ph,Nh(bh=t,xh=e)}function Ph(t,e){var n=t-bh,r=e-xh,i=Ac(n*n+r*r);Th+=i*(bh+t)/2,Ch+=i*(xh+e)/2,Ah+=i,Nh(bh=t,xh=e)}function Ih(){Dh.point=Nh}function Fh(){Dh.point=Rh}function jh(){Yh(vh,mh)}function Rh(t,e){Dh.point=Yh,Nh(vh=bh=t,mh=xh=e)}function Yh(t,e){var n=t-bh,r=e-xh,i=Ac(n*n+r*r);Th+=i*(bh+t)/2,Ch+=i*(xh+e)/2,Ah+=i,Sh+=(i=xh*t-bh*e)*(bh+t),Mh+=i*(xh+e),Oh+=3*i,Nh(bh=t,xh=e)}var zh=Dh;function Uh(t){this._context=t}Uh.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,pc)}},result:Nc};var $h,Wh,Hh,Vh,Gh,qh=sc(),Xh={point:Nc,lineStart:function(){Xh.point=Zh},lineEnd:function(){$h&&Jh(Wh,Hh),Xh.point=Nc},polygonStart:function(){$h=!0},polygonEnd:function(){$h=null},result:function(){var t=+qh;return qh.reset(),t}};function Zh(t,e){Xh.point=Jh,Wh=Vh=t,Hh=Gh=e}function Jh(t,e){Vh-=t,Gh-=e,qh.add(Ac(Vh*Vh+Gh*Gh)),Vh=t,Gh=e}var Kh=Xh;function Qh(){this._string=[]}function tf(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}Qh.prototype={_radius:4.5,_circle:tf(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push("M",t,",",e),this._point=1;break;case 1:this._string.push("L",t,",",e);break;default:null==this._circle&&(this._circle=tf(this._radius)),this._string.push("M",t,",",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}};var ef=function(t,e){var n,r,i=4.5;function a(t){return t&&("function"==typeof i&&r.pointRadius(+i.apply(this,arguments)),$c(t,n(r))),r.result()}return a.area=function(t){return $c(t,n(fh)),fh.result()},a.measure=function(t){return $c(t,n(Kh)),Kh.result()},a.bounds=function(t){return $c(t,n(_h)),_h.result()},a.centroid=function(t){return $c(t,n(zh)),zh.result()},a.projection=function(e){return arguments.length?(n=null==e?(t=null,ih):(t=e).stream,a):t},a.context=function(t){return arguments.length?(r=null==t?(e=null,new Qh):new Uh(e=t),"function"!=typeof i&&r.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i="function"==typeof t?t:(r.pointRadius(+t),+t),a):i},a.projection(t).context(e)},nf=function(t){return{stream:rf(t)}};function rf(t){return function(e){var n=new af;for(var r in t)n[r]=t[r];return n.stream=e,n}}function af(){}function of(t,e,n){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),$c(n,t.stream(_h)),e(_h.result()),null!=r&&t.clipExtent(r),t}function sf(t,e,n){return of(t,(function(n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],a=Math.min(r/(n[1][0]-n[0][0]),i/(n[1][1]-n[0][1])),o=+e[0][0]+(r-a*(n[1][0]+n[0][0]))/2,s=+e[0][1]+(i-a*(n[1][1]+n[0][1]))/2;t.scale(150*a).translate([o,s])}),n)}function cf(t,e,n){return sf(t,[[0,0],e],n)}function uf(t,e,n){return of(t,(function(n){var r=+e,i=r/(n[1][0]-n[0][0]),a=(r-i*(n[1][0]+n[0][0]))/2,o=-i*n[0][1];t.scale(150*i).translate([a,o])}),n)}function lf(t,e,n){return of(t,(function(n){var r=+e,i=r/(n[1][1]-n[0][1]),a=-i*n[0][0],o=(r-i*(n[1][1]+n[0][1]))/2;t.scale(150*i).translate([a,o])}),n)}af.prototype={constructor:af,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var hf=xc(30*gc),ff=function(t,e){return+e?function(t,e){function n(r,i,a,o,s,c,u,l,h,f,d,p,y,g){var v=u-r,m=l-i,b=v*v+m*m;if(b>4*e&&y--){var x=o+f,_=s+d,k=c+p,w=Ac(x*x+_*_+k*k),E=Oc(k/=w),T=vc(vc(k)-1)<1e-6||vc(a-h)<1e-6?(a+h)/2:bc(_,x),C=t(T,E),A=C[0],S=C[1],M=A-r,O=S-i,D=m*M-v*O;(D*D/b>e||vc((v*M+m*O)/b-.5)>.3||o*f+s*d+c*p2?t[2]%360*gc:0,A()):[g*yc,v*yc,m*yc]},T.angle=function(t){return arguments.length?(b=t%360*gc,A()):b*yc},T.precision=function(t){return arguments.length?(o=ff(s,E=t*t),S()):Ac(E)},T.fitExtent=function(t,e){return sf(T,t,e)},T.fitSize=function(t,e){return cf(T,t,e)},T.fitWidth=function(t,e){return uf(T,t,e)},T.fitHeight=function(t,e){return lf(T,t,e)},function(){return e=t.apply(this,arguments),T.invert=e.invert&&C,A()}}function mf(t){var e=0,n=hc/3,r=vf(t),i=r(e,n);return i.parallels=function(t){return arguments.length?r(e=t[0]*gc,n=t[1]*gc):[e*yc,n*yc]},i}function bf(t,e){var n=Tc(t),r=(n+Tc(e))/2;if(vc(r)<1e-6)return function(t){var e=xc(t);function n(t,n){return[t*e,Tc(n)/e]}return n.invert=function(t,n){return[t/e,Oc(n*e)]},n}(t);var i=1+n*(2*r-n),a=Ac(i)/r;function o(t,e){var n=Ac(i-2*r*Tc(e))/r;return[n*Tc(t*=r),a-n*xc(t)]}return o.invert=function(t,e){var n=a-e;return[bc(t,vc(n))/r*Cc(n),Oc((i-(t*t+n*n)*r*r)/(2*r))]},o}var xf=function(){return mf(bf).scale(155.424).center([0,33.6442])},_f=function(){return xf().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])};var kf=function(){var t,e,n,r,i,a,o=_f(),s=xf().rotate([154,0]).center([-2,58.5]).parallels([55,65]),c=xf().rotate([157,0]).center([-3,19.9]).parallels([8,18]),u={point:function(t,e){a=[t,e]}};function l(t){var e=t[0],o=t[1];return a=null,n.point(e,o),a||(r.point(e,o),a)||(i.point(e,o),a)}function h(){return t=e=null,l}return l.invert=function(t){var e=o.scale(),n=o.translate(),r=(t[0]-n[0])/e,i=(t[1]-n[1])/e;return(i>=.12&&i<.234&&r>=-.425&&r<-.214?s:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:o).invert(t)},l.stream=function(n){return t&&e===n?t:(r=[o.stream(e=n),s.stream(n),c.stream(n)],i=r.length,t={point:function(t,e){for(var n=-1;++n0?e<1e-6-fc&&(e=1e-6-fc):e>fc-1e-6&&(e=fc-1e-6);var n=i/Ec(Nf(e),r);return[n*Tc(r*t),i-n*xc(r*t)]}return a.invert=function(t,e){var n=i-e,a=Cc(r)*Ac(t*t+n*n);return[bc(t,vc(n))/r*Cc(n),2*mc(Ec(i/a,1/r))-fc]},a}var Lf=function(){return mf(Bf).scale(109.5).parallels([30,30])};function Pf(t,e){return[t,e]}Pf.invert=Pf;var If=function(){return gf(Pf).scale(152.63)};function Ff(t,e){var n=xc(t),r=t===e?Tc(t):(n-xc(e))/(e-t),i=n/r+t;if(vc(r)<1e-6)return Pf;function a(t,e){var n=i-e,a=r*t;return[n*Tc(a),i-n*xc(a)]}return a.invert=function(t,e){var n=i-e;return[bc(t,vc(n))/r*Cc(n),i-Cc(r)*Ac(t*t+n*n)]},a}var jf=function(){return mf(Ff).scale(131.154).center([0,13.9389])},Rf=1.340264,Yf=-.081106,zf=893e-6,Uf=.003796,$f=Ac(3)/2;function Wf(t,e){var n=Oc($f*Tc(e)),r=n*n,i=r*r*r;return[t*xc(n)/($f*(Rf+3*Yf*r+i*(7*zf+9*Uf*r))),n*(Rf+Yf*r+i*(zf+Uf*r))]}Wf.invert=function(t,e){for(var n,r=e,i=r*r,a=i*i*i,o=0;o<12&&(a=(i=(r-=n=(r*(Rf+Yf*i+a*(zf+Uf*i))-e)/(Rf+3*Yf*i+a*(7*zf+9*Uf*i)))*r)*i*i,!(vc(n)<1e-12));++o);return[$f*t*(Rf+3*Yf*i+a*(7*zf+9*Uf*i))/xc(r),Oc(Tc(r)/$f)]};var Hf=function(){return gf(Wf).scale(177.158)};function Vf(t,e){var n=xc(e),r=xc(t)*n;return[n*Tc(t)/r,Tc(e)/r]}Vf.invert=Ef(mc);var Gf=function(){return gf(Vf).scale(144.049).clipAngle(60)};function qf(t,e,n,r){return 1===t&&1===e&&0===n&&0===r?ih:rf({point:function(i,a){this.stream.point(i*t+n,a*e+r)}})}var Xf=function(){var t,e,n,r,i,a,o=1,s=0,c=0,u=1,l=1,h=ih,f=null,d=ih;function p(){return r=i=null,a}return a={stream:function(t){return r&&i===t?r:r=h(d(i=t))},postclip:function(r){return arguments.length?(d=r,f=t=e=n=null,p()):d},clipExtent:function(r){return arguments.length?(d=null==r?(f=t=e=n=null,ih):Cl(f=+r[0][0],t=+r[0][1],e=+r[1][0],n=+r[1][1]),p()):null==f?null:[[f,t],[e,n]]},scale:function(t){return arguments.length?(h=qf((o=+t)*u,o*l,s,c),p()):o},translate:function(t){return arguments.length?(h=qf(o*u,o*l,s=+t[0],c=+t[1]),p()):[s,c]},reflectX:function(t){return arguments.length?(h=qf(o*(u=t?-1:1),o*l,s,c),p()):u<0},reflectY:function(t){return arguments.length?(h=qf(o*u,o*(l=t?-1:1),s,c),p()):l<0},fitExtent:function(t,e){return sf(a,t,e)},fitSize:function(t,e){return cf(a,t,e)},fitWidth:function(t,e){return uf(a,t,e)},fitHeight:function(t,e){return lf(a,t,e)}}};function Zf(t,e){var n=e*e,r=n*n;return[t*(.8707-.131979*n+r*(r*(.003971*n-.001529*r)-.013791)),e*(1.007226+n*(.015085+r*(.028874*n-.044475-.005916*r)))]}Zf.invert=function(t,e){var n,r=e,i=25;do{var a=r*r,o=a*a;r-=n=(r*(1.007226+a*(.015085+o*(.028874*a-.044475-.005916*o)))-e)/(1.007226+a*(.045255+o*(.259866*a-.311325-.005916*11*o)))}while(vc(n)>1e-6&&--i>0);return[t/(.8707+(a=r*r)*(a*(a*a*a*(.003971-.001529*a)-.013791)-.131979)),r]};var Jf=function(){return gf(Zf).scale(175.295)};function Kf(t,e){return[xc(e)*Tc(t),Tc(e)]}Kf.invert=Ef(Oc);var Qf=function(){return gf(Kf).scale(249.5).clipAngle(90+1e-6)};function td(t,e){var n=xc(e),r=1+xc(t)*n;return[n*Tc(t)/r,Tc(e)/r]}td.invert=Ef((function(t){return 2*mc(t)}));var ed=function(){return gf(td).scale(250).clipAngle(142)};function nd(t,e){return[wc(Sc((fc+e)/2)),-t]}nd.invert=function(t,e){return[-e,2*mc(kc(t))-fc]};var rd=function(){var t=Df(nd),e=t.center,n=t.rotate;return t.center=function(t){return arguments.length?e([-t[1],t[0]]):[(t=e())[1],-t[0]]},t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):[(t=n())[0],t[1],t[2]-90]},n([0,0,90]).scale(159.155)};function id(t,e){return t.parent===e.parent?1:2}function ad(t,e){return t+e.x}function od(t,e){return Math.max(t,e.y)}var sd=function(){var t=id,e=1,n=1,r=!1;function i(i){var a,o=0;i.eachAfter((function(e){var n=e.children;n?(e.x=function(t){return t.reduce(ad,0)/t.length}(n),e.y=function(t){return 1+t.reduce(od,0)}(n)):(e.x=a?o+=t(e,a):0,e.y=0,a=e)}));var s=function(t){for(var e;e=t.children;)t=e[0];return t}(i),c=function(t){for(var e;e=t.children;)t=e[e.length-1];return t}(i),u=s.x-t(s,c)/2,l=c.x+t(c,s)/2;return i.eachAfter(r?function(t){t.x=(t.x-i.x)*e,t.y=(i.y-t.y)*n}:function(t){t.x=(t.x-u)/(l-u)*e,t.y=(1-(i.y?t.y/i.y:1))*n})}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i};function cd(t){var e=0,n=t.children,r=n&&n.length;if(r)for(;--r>=0;)e+=n[r].value;else e=1;t.value=e}function ud(t,e){var n,r,i,a,o,s=new dd(t),c=+t.value&&(s.value=t.value),u=[s];for(null==e&&(e=ld);n=u.pop();)if(c&&(n.value=+n.data.value),(i=e(n.data))&&(o=i.length))for(n.children=new Array(o),a=o-1;a>=0;--a)u.push(r=n.children[a]=new dd(i[a])),r.parent=n,r.depth=n.depth+1;return s.eachBefore(fd)}function ld(t){return t.children}function hd(t){t.data=t.data.data}function fd(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function dd(t){this.data=t,this.depth=this.height=0,this.parent=null}dd.prototype=ud.prototype={constructor:dd,count:function(){return this.eachAfter(cd)},each:function(t){var e,n,r,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),n=a.children)for(r=0,i=n.length;r=0;--n)i.push(e[n]);return this},sum:function(t){return this.eachAfter((function(e){for(var n=+t(e.data)||0,r=e.children,i=r&&r.length;--i>=0;)n+=r[i].value;e.value=n}))},sort:function(t){return this.eachBefore((function(e){e.children&&e.children.sort(t)}))},path:function(t){for(var e=this,n=function(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;t=n.pop(),e=r.pop();for(;t===e;)i=t,t=n.pop(),e=r.pop();return i}(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each((function(e){t.push(e)})),t},leaves:function(){var t=[];return this.eachBefore((function(e){e.children||t.push(e)})),t},links:function(){var t=this,e=[];return t.each((function(n){n!==t&&e.push({source:n.parent,target:n})})),e},copy:function(){return ud(this).eachBefore(hd)}};var pd=Array.prototype.slice;var yd=function(t){for(var e,n,r=0,i=(t=function(t){for(var e,n,r=t.length;r;)n=Math.random()*r--|0,e=t[r],t[r]=t[n],t[n]=e;return t}(pd.call(t))).length,a=[];r0&&n*n>r*r+i*i}function bd(t,e){for(var n=0;n(o*=o)?(r=(u+o-i)/(2*u),a=Math.sqrt(Math.max(0,o/u-r*r)),n.x=t.x-r*s-a*c,n.y=t.y-r*c+a*s):(r=(u+i-o)/(2*u),a=Math.sqrt(Math.max(0,i/u-r*r)),n.x=e.x+r*s-a*c,n.y=e.y+r*c+a*s)):(n.x=e.x+n.r,n.y=e.y)}function Ed(t,e){var n=t.r+e.r-1e-6,r=e.x-t.x,i=e.y-t.y;return n>0&&n*n>r*r+i*i}function Td(t){var e=t._,n=t.next._,r=e.r+n.r,i=(e.x*n.r+n.x*e.r)/r,a=(e.y*n.r+n.y*e.r)/r;return i*i+a*a}function Cd(t){this._=t,this.next=null,this.previous=null}function Ad(t){if(!(i=t.length))return 0;var e,n,r,i,a,o,s,c,u,l,h;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(n=t[1],e.x=-n.r,n.x=e.r,n.y=0,!(i>2))return e.r+n.r;wd(n,e,r=t[2]),e=new Cd(e),n=new Cd(n),r=new Cd(r),e.next=r.previous=n,n.next=e.previous=r,r.next=n.previous=e;t:for(s=3;s0)throw new Error("cycle");return a}return n.id=function(e){return arguments.length?(t=Od(e),n):t},n.parentId=function(t){return arguments.length?(e=Od(t),n):e},n};function Vd(t,e){return t.parent===e.parent?1:2}function Gd(t){var e=t.children;return e?e[0]:t.t}function qd(t){var e=t.children;return e?e[e.length-1]:t.t}function Xd(t,e,n){var r=n/(e.i-t.i);e.c-=r,e.s+=n,t.c+=r,e.z+=n,e.m+=n}function Zd(t,e,n){return t.a.parent===e.parent?t.a:n}function Jd(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}Jd.prototype=Object.create(dd.prototype);var Kd=function(){var t=Vd,e=1,n=1,r=null;function i(i){var c=function(t){for(var e,n,r,i,a,o=new Jd(t,0),s=[o];e=s.pop();)if(r=e._.children)for(e.children=new Array(a=r.length),i=a-1;i>=0;--i)s.push(n=e.children[i]=new Jd(r[i],i)),n.parent=e;return(o.parent=new Jd(null,0)).children=[o],o}(i);if(c.eachAfter(a),c.parent.m=-c.z,c.eachBefore(o),r)i.eachBefore(s);else{var u=i,l=i,h=i;i.eachBefore((function(t){t.xl.x&&(l=t),t.depth>h.depth&&(h=t)}));var f=u===l?1:t(u,l)/2,d=f-u.x,p=e/(l.x+f+d),y=n/(h.depth||1);i.eachBefore((function(t){t.x=(t.x+d)*p,t.y=t.depth*y}))}return i}function a(e){var n=e.children,r=e.parent.children,i=e.i?r[e.i-1]:null;if(n){!function(t){for(var e,n=0,r=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=n,e.m+=n,n+=e.s+(r+=e.c)}(e);var a=(n[0].z+n[n.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,n,r){if(n){for(var i,a=e,o=e,s=n,c=a.parent.children[0],u=a.m,l=o.m,h=s.m,f=c.m;s=qd(s),a=Gd(a),s&&a;)c=Gd(c),(o=qd(o)).a=e,(i=s.z+h-a.z-u+t(s._,a._))>0&&(Xd(Zd(s,e,r),e,i),u+=i,l+=i),h+=s.m,u+=a.m,f+=c.m,l+=o.m;s&&!qd(o)&&(o.t=s,o.m+=h-l),a&&!Gd(c)&&(c.t=a,c.m+=u-f,r=e)}return r}(e,i,e.parent.A||r[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function s(t){t.x*=e,t.y=t.depth*n}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i},Qd=function(t,e,n,r,i){for(var a,o=t.children,s=-1,c=o.length,u=t.value&&(i-n)/t.value;++sf&&(f=s),g=l*l*y,(d=Math.max(f/g,g/h))>p){l-=s;break}p=d}v.push(o={value:l,dice:c1?e:1)},n}(tp),rp=function(){var t=np,e=!1,n=1,r=1,i=[0],a=Dd,o=Dd,s=Dd,c=Dd,u=Dd;function l(t){return t.x0=t.y0=0,t.x1=n,t.y1=r,t.eachBefore(h),i=[0],e&&t.eachBefore(jd),t}function h(e){var n=i[e.depth],r=e.x0+n,l=e.y0+n,h=e.x1-n,f=e.y1-n;h=n-1){var l=s[e];return l.x0=i,l.y0=a,l.x1=o,void(l.y1=c)}var h=u[e],f=r/2+h,d=e+1,p=n-1;for(;d>>1;u[y]c-a){var m=(i*v+o*g)/r;t(e,d,g,i,a,m,c),t(d,n,v,m,a,o,c)}else{var b=(a*v+c*g)/r;t(e,d,g,i,a,o,b),t(d,n,v,i,b,o,c)}}(0,c,t.value,e,n,r,i)},ap=function(t,e,n,r,i){(1&t.depth?Qd:Rd)(t,e,n,r,i)},op=function t(e){function n(t,n,r,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,s,c,u,l,h=-1,f=o.length,d=t.value;++h1?e:1)},n}(tp),sp=function(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}},cp=function(t,e){var n=un(+t,+e);return function(t){var e=n(t);return e-360*Math.floor(e/360)}},up=function(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}},lp=Math.SQRT2;function hp(t){return((t=Math.exp(t))+1/t)/2}var fp=function(t,e){var n,r,i=t[0],a=t[1],o=t[2],s=e[0],c=e[1],u=e[2],l=s-i,h=c-a,f=l*l+h*h;if(f<1e-12)r=Math.log(u/o)/lp,n=function(t){return[i+t*l,a+t*h,o*Math.exp(lp*t*r)]};else{var d=Math.sqrt(f),p=(u*u-o*o+4*f)/(2*o*2*d),y=(u*u-o*o-4*f)/(2*u*2*d),g=Math.log(Math.sqrt(p*p+1)-p),v=Math.log(Math.sqrt(y*y+1)-y);r=(v-g)/lp,n=function(t){var e,n=t*r,s=hp(g),c=o/(2*d)*(s*(e=lp*n+g,((e=Math.exp(2*e))-1)/(e+1))-function(t){return((t=Math.exp(t))-1/t)/2}(g));return[i+c*l,a+c*h,o*s/hp(lp*n+g)]}}return n.duration=1e3*r,n};function dp(t){return function(e,n){var r=t((e=tn(e)).h,(n=tn(n)).h),i=hn(e.s,n.s),a=hn(e.l,n.l),o=hn(e.opacity,n.opacity);return function(t){return e.h=r(t),e.s=i(t),e.l=a(t),e.opacity=o(t),e+""}}}var pp=dp(un),yp=dp(hn);function gp(t,e){var n=hn((t=pa(t)).l,(e=pa(e)).l),r=hn(t.a,e.a),i=hn(t.b,e.b),a=hn(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=r(e),t.b=i(e),t.opacity=a(e),t+""}}function vp(t){return function(e,n){var r=t((e=ka(e)).h,(n=ka(n)).h),i=hn(e.c,n.c),a=hn(e.l,n.l),o=hn(e.opacity,n.opacity);return function(t){return e.h=r(t),e.c=i(t),e.l=a(t),e.opacity=o(t),e+""}}}var mp=vp(un),bp=vp(hn);function xp(t){return function e(n){function r(e,r){var i=t((e=Oa(e)).h,(r=Oa(r)).h),a=hn(e.s,r.s),o=hn(e.l,r.l),s=hn(e.opacity,r.opacity);return function(t){return e.h=i(t),e.s=a(t),e.l=o(Math.pow(t,n)),e.opacity=s(t),e+""}}return n=+n,r.gamma=e,r}(1)}var _p=xp(un),kp=xp(hn);function wp(t,e){for(var n=0,r=e.length-1,i=e[0],a=new Array(r<0?0:r);n1&&(e=t[a[o-2]],n=t[a[o-1]],r=t[s],(n[0]-e[0])*(r[1]-e[1])-(n[1]-e[1])*(r[0]-e[0])<=0);)--o;a[o++]=s}return a.slice(0,o)}var Mp=function(t){if((n=t.length)<3)return null;var e,n,r=new Array(n),i=new Array(n);for(e=0;e=0;--e)u.push(t[r[a[e]][2]]);for(e=+s;es!=u>s&&o<(c-n)*(s-r)/(u-r)+n&&(l=!l),c=n,u=r;return l},Dp=function(t){for(var e,n,r=-1,i=t.length,a=t[i-1],o=a[0],s=a[1],c=0;++r1);return t+n*a*Math.sqrt(-2*Math.log(i)/i)}}return n.source=t,n}(Np),Pp=function t(e){function n(){var t=Lp.source(e).apply(this,arguments);return function(){return Math.exp(t())}}return n.source=t,n}(Np),Ip=function t(e){function n(t){return function(){for(var n=0,r=0;rr&&(e=n,n=r,r=e),function(t){return Math.max(n,Math.min(r,t))}}function ty(t,e,n){var r=t[0],i=t[1],a=e[0],o=e[1];return i2?ey:ty,i=a=null,h}function h(e){return isNaN(e=+e)?n:(i||(i=r(o.map(t),s,c)))(t(u(e)))}return h.invert=function(n){return u(e((a||(a=r(s,o.map(t),_n)))(n)))},h.domain=function(t){return arguments.length?(o=Up.call(t,Xp),u===Jp||(u=Qp(o)),l()):o.slice()},h.range=function(t){return arguments.length?(s=$p.call(t),l()):s.slice()},h.rangeRound=function(t){return s=$p.call(t),c=up,l()},h.clamp=function(t){return arguments.length?(u=t?Qp(o):Jp,h):u!==Jp},h.interpolate=function(t){return arguments.length?(c=t,l()):c},h.unknown=function(t){return arguments.length?(n=t,h):n},function(n,r){return t=n,e=r,l()}}function iy(t,e){return ry()(t,e)}var ay=function(t,e,n,r){var i,a=S(t,e,n);switch((r=Hs(null==r?",f":r)).type){case"s":var o=Math.max(Math.abs(t),Math.abs(e));return null!=r.precision||isNaN(i=ac(a,o))||(r.precision=i),Zs(r,o);case"":case"e":case"g":case"p":case"r":null!=r.precision||isNaN(i=oc(a,Math.max(Math.abs(t),Math.abs(e))))||(r.precision=i-("e"===r.type));break;case"f":case"%":null!=r.precision||isNaN(i=ic(a))||(r.precision=i-2*("%"===r.type))}return Xs(r)};function oy(t){var e=t.domain;return t.ticks=function(t){var n=e();return C(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var r=e();return ay(r[0],r[r.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var r,i=e(),a=0,o=i.length-1,s=i[a],c=i[o];return c0?r=A(s=Math.floor(s/r)*r,c=Math.ceil(c/r)*r,n):r<0&&(r=A(s=Math.ceil(s*r)/r,c=Math.floor(c*r)/r,n)),r>0?(i[a]=Math.floor(s/r)*r,i[o]=Math.ceil(c/r)*r,e(i)):r<0&&(i[a]=Math.ceil(s*r)/r,i[o]=Math.floor(c*r)/r,e(i)),t},t}function sy(){var t=iy(Jp,Jp);return t.copy=function(){return ny(t,sy())},Rp.apply(t,arguments),oy(t)}function cy(t){var e;function n(t){return isNaN(t=+t)?e:t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=Up.call(e,Xp),n):t.slice()},n.unknown=function(t){return arguments.length?(e=t,n):e},n.copy=function(){return cy(t).unknown(e)},t=arguments.length?Up.call(t,Xp):[0,1],oy(n)}var uy=function(t,e){var n,r=0,i=(t=t.slice()).length-1,a=t[r],o=t[i];return o0){for(;fc)break;y.push(h)}}else for(;f=1;--l)if(!((h=u*l)c)break;y.push(h)}}else y=C(f,d,Math.min(d-f,p)).map(n);return r?y.reverse():y},r.tickFormat=function(t,i){if(null==i&&(i=10===a?".0e":","),"function"!=typeof i&&(i=Xs(i)),t===1/0)return i;null==t&&(t=10);var o=Math.max(1,a*t/r.ticks().length);return function(t){var r=t/n(Math.round(e(t)));return r*a0?i[r-1]:e[0],r=r?[i[r-1],n]:[i[o-1],i[o]]},o.unknown=function(e){return arguments.length?(t=e,o):o},o.thresholds=function(){return i.slice()},o.copy=function(){return My().domain([e,n]).range(a).unknown(t)},Rp.apply(oy(o),arguments)}function Oy(){var t,e=[.5],n=[0,1],r=1;function i(i){return i<=i?n[c(e,i,0,r)]:t}return i.domain=function(t){return arguments.length?(e=$p.call(t),r=Math.min(e.length,n.length-1),i):e.slice()},i.range=function(t){return arguments.length?(n=$p.call(t),r=Math.min(e.length,n.length-1),i):n.slice()},i.invertExtent=function(t){var r=n.indexOf(t);return[e[r-1],e[r]]},i.unknown=function(e){return arguments.length?(t=e,i):t},i.copy=function(){return Oy().domain(e).range(n).unknown(t)},Rp.apply(i,arguments)}var Dy=new Date,Ny=new Date;function By(t,e,n,r){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=function(e){return t(e=new Date(+e)),e},i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t);return t-e0))return s;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o=e)for(;t(e),!n(e);)e.setTime(e-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););}))},n&&(i.count=function(e,r){return Dy.setTime(+e),Ny.setTime(+r),t(Dy),t(Ny),Math.floor(n(Dy,Ny))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}var Ly=By((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));Ly.every=function(t){return isFinite(t=Math.floor(t))&&t>0?By((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,n){e.setFullYear(e.getFullYear()+n*t)})):null};var Py=Ly,Iy=Ly.range,Fy=By((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})),jy=Fy,Ry=Fy.range;function Yy(t){return By((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-6e4*(e.getTimezoneOffset()-t.getTimezoneOffset()))/6048e5}))}var zy=Yy(0),Uy=Yy(1),$y=Yy(2),Wy=Yy(3),Hy=Yy(4),Vy=Yy(5),Gy=Yy(6),qy=zy.range,Xy=Uy.range,Zy=$y.range,Jy=Wy.range,Ky=Hy.range,Qy=Vy.range,tg=Gy.range,eg=By((function(t){t.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+e)}),(function(t,e){return(e-t-6e4*(e.getTimezoneOffset()-t.getTimezoneOffset()))/864e5}),(function(t){return t.getDate()-1})),ng=eg,rg=eg.range,ig=By((function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds()-6e4*t.getMinutes())}),(function(t,e){t.setTime(+t+36e5*e)}),(function(t,e){return(e-t)/36e5}),(function(t){return t.getHours()})),ag=ig,og=ig.range,sg=By((function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds())}),(function(t,e){t.setTime(+t+6e4*e)}),(function(t,e){return(e-t)/6e4}),(function(t){return t.getMinutes()})),cg=sg,ug=sg.range,lg=By((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+1e3*e)}),(function(t,e){return(e-t)/1e3}),(function(t){return t.getUTCSeconds()})),hg=lg,fg=lg.range,dg=By((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));dg.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?By((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,n){e.setTime(+e+n*t)}),(function(e,n){return(n-e)/t})):dg:null};var pg=dg,yg=dg.range;function gg(t){return By((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/6048e5}))}var vg=gg(0),mg=gg(1),bg=gg(2),xg=gg(3),_g=gg(4),kg=gg(5),wg=gg(6),Eg=vg.range,Tg=mg.range,Cg=bg.range,Ag=xg.range,Sg=_g.range,Mg=kg.range,Og=wg.range,Dg=By((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/864e5}),(function(t){return t.getUTCDate()-1})),Ng=Dg,Bg=Dg.range,Lg=By((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));Lg.every=function(t){return isFinite(t=Math.floor(t))&&t>0?By((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null};var Pg=Lg,Ig=Lg.range;function Fg(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function jg(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Rg(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}function Yg(t){var e=t.dateTime,n=t.date,r=t.time,i=t.periods,a=t.days,o=t.shortDays,s=t.months,c=t.shortMonths,u=Kg(i),l=Qg(i),h=Kg(a),f=Qg(a),d=Kg(o),p=Qg(o),y=Kg(s),g=Qg(s),v=Kg(c),m=Qg(c),b={a:function(t){return o[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return s[t.getMonth()]},c:null,d:xv,e:xv,f:Tv,H:_v,I:kv,j:wv,L:Ev,m:Cv,M:Av,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:em,s:nm,S:Sv,u:Mv,U:Ov,V:Dv,w:Nv,W:Bv,x:null,X:null,y:Lv,Y:Pv,Z:Iv,"%":tm},x={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return s[t.getUTCMonth()]},c:null,d:Fv,e:Fv,f:Uv,H:jv,I:Rv,j:Yv,L:zv,m:$v,M:Wv,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:em,s:nm,S:Hv,u:Vv,U:Gv,V:qv,w:Xv,W:Zv,x:null,X:null,y:Jv,Y:Kv,Z:Qv,"%":tm},_={a:function(t,e,n){var r=d.exec(e.slice(n));return r?(t.w=p[r[0].toLowerCase()],n+r[0].length):-1},A:function(t,e,n){var r=h.exec(e.slice(n));return r?(t.w=f[r[0].toLowerCase()],n+r[0].length):-1},b:function(t,e,n){var r=v.exec(e.slice(n));return r?(t.m=m[r[0].toLowerCase()],n+r[0].length):-1},B:function(t,e,n){var r=y.exec(e.slice(n));return r?(t.m=g[r[0].toLowerCase()],n+r[0].length):-1},c:function(t,n,r){return E(t,e,n,r)},d:lv,e:lv,f:gv,H:fv,I:fv,j:hv,L:yv,m:uv,M:dv,p:function(t,e,n){var r=u.exec(e.slice(n));return r?(t.p=l[r[0].toLowerCase()],n+r[0].length):-1},q:cv,Q:mv,s:bv,S:pv,u:ev,U:nv,V:rv,w:tv,W:iv,x:function(t,e,r){return E(t,n,e,r)},X:function(t,e,n){return E(t,r,e,n)},y:ov,Y:av,Z:sv,"%":vv};function k(t,e){return function(n){var r,i,a,o=[],s=-1,c=0,u=t.length;for(n instanceof Date||(n=new Date(+n));++s53)return null;"w"in a||(a.w=1),"Z"in a?(i=(r=jg(Rg(a.y,0,1))).getUTCDay(),r=i>4||0===i?mg.ceil(r):mg(r),r=Ng.offset(r,7*(a.V-1)),a.y=r.getUTCFullYear(),a.m=r.getUTCMonth(),a.d=r.getUTCDate()+(a.w+6)%7):(i=(r=Fg(Rg(a.y,0,1))).getDay(),r=i>4||0===i?Uy.ceil(r):Uy(r),r=ng.offset(r,7*(a.V-1)),a.y=r.getFullYear(),a.m=r.getMonth(),a.d=r.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?jg(Rg(a.y,0,1)).getUTCDay():Fg(Rg(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,jg(a)):Fg(a)}}function E(t,e,n,r){for(var i,a,o=0,s=e.length,c=n.length;o=c)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=_[i in Vg?e.charAt(o++):i])||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return(b.x=k(n,b),b.X=k(r,b),b.c=k(e,b),x.x=k(n,x),x.X=k(r,x),x.c=k(e,x),{format:function(t){var e=k(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=w(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=k(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=w(t+="",!0);return e.toString=function(){return t},e}})}var zg,Ug,$g,Wg,Hg,Vg={"-":"",_:" ",0:"0"},Gg=/^\s*\d+/,qg=/^%/,Xg=/[\\^$*+?|[\]().{}]/g;function Zg(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",a=i.length;return r+(a68?1900:2e3),n+r[0].length):-1}function sv(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function cv(t,e,n){var r=Gg.exec(e.slice(n,n+1));return r?(t.q=3*r[0]-3,n+r[0].length):-1}function uv(t,e,n){var r=Gg.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function lv(t,e,n){var r=Gg.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function hv(t,e,n){var r=Gg.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function fv(t,e,n){var r=Gg.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function dv(t,e,n){var r=Gg.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function pv(t,e,n){var r=Gg.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function yv(t,e,n){var r=Gg.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function gv(t,e,n){var r=Gg.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function vv(t,e,n){var r=qg.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function mv(t,e,n){var r=Gg.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function bv(t,e,n){var r=Gg.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function xv(t,e){return Zg(t.getDate(),e,2)}function _v(t,e){return Zg(t.getHours(),e,2)}function kv(t,e){return Zg(t.getHours()%12||12,e,2)}function wv(t,e){return Zg(1+ng.count(Py(t),t),e,3)}function Ev(t,e){return Zg(t.getMilliseconds(),e,3)}function Tv(t,e){return Ev(t,e)+"000"}function Cv(t,e){return Zg(t.getMonth()+1,e,2)}function Av(t,e){return Zg(t.getMinutes(),e,2)}function Sv(t,e){return Zg(t.getSeconds(),e,2)}function Mv(t){var e=t.getDay();return 0===e?7:e}function Ov(t,e){return Zg(zy.count(Py(t)-1,t),e,2)}function Dv(t,e){var n=t.getDay();return t=n>=4||0===n?Hy(t):Hy.ceil(t),Zg(Hy.count(Py(t),t)+(4===Py(t).getDay()),e,2)}function Nv(t){return t.getDay()}function Bv(t,e){return Zg(Uy.count(Py(t)-1,t),e,2)}function Lv(t,e){return Zg(t.getFullYear()%100,e,2)}function Pv(t,e){return Zg(t.getFullYear()%1e4,e,4)}function Iv(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Zg(e/60|0,"0",2)+Zg(e%60,"0",2)}function Fv(t,e){return Zg(t.getUTCDate(),e,2)}function jv(t,e){return Zg(t.getUTCHours(),e,2)}function Rv(t,e){return Zg(t.getUTCHours()%12||12,e,2)}function Yv(t,e){return Zg(1+Ng.count(Pg(t),t),e,3)}function zv(t,e){return Zg(t.getUTCMilliseconds(),e,3)}function Uv(t,e){return zv(t,e)+"000"}function $v(t,e){return Zg(t.getUTCMonth()+1,e,2)}function Wv(t,e){return Zg(t.getUTCMinutes(),e,2)}function Hv(t,e){return Zg(t.getUTCSeconds(),e,2)}function Vv(t){var e=t.getUTCDay();return 0===e?7:e}function Gv(t,e){return Zg(vg.count(Pg(t)-1,t),e,2)}function qv(t,e){var n=t.getUTCDay();return t=n>=4||0===n?_g(t):_g.ceil(t),Zg(_g.count(Pg(t),t)+(4===Pg(t).getUTCDay()),e,2)}function Xv(t){return t.getUTCDay()}function Zv(t,e){return Zg(mg.count(Pg(t)-1,t),e,2)}function Jv(t,e){return Zg(t.getUTCFullYear()%100,e,2)}function Kv(t,e){return Zg(t.getUTCFullYear()%1e4,e,4)}function Qv(){return"+0000"}function tm(){return"%"}function em(t){return+t}function nm(t){return Math.floor(+t/1e3)}function rm(t){return zg=Yg(t),Ug=zg.format,$g=zg.parse,Wg=zg.utcFormat,Hg=zg.utcParse,zg}rm({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function im(t){return new Date(t)}function am(t){return t instanceof Date?+t:+new Date(+t)}function om(t,e,n,r,a,o,s,c,u){var l=iy(Jp,Jp),h=l.invert,f=l.domain,d=u(".%L"),p=u(":%S"),y=u("%I:%M"),g=u("%I %p"),v=u("%a %d"),m=u("%b %d"),b=u("%B"),x=u("%Y"),_=[[s,1,1e3],[s,5,5e3],[s,15,15e3],[s,30,3e4],[o,1,6e4],[o,5,3e5],[o,15,9e5],[o,30,18e5],[a,1,36e5],[a,3,108e5],[a,6,216e5],[a,12,432e5],[r,1,864e5],[r,2,1728e5],[n,1,6048e5],[e,1,2592e6],[e,3,7776e6],[t,1,31536e6]];function k(i){return(s(i)1)&&(t-=Math.floor(t));var e=Math.abs(t-.5);return qb.h=360*t-100,qb.s=1.5-1.5*e,qb.l=.8-.9*e,qb+""},Zb=Ge(),Jb=Math.PI/3,Kb=2*Math.PI/3,Qb=function(t){var e;return t=(.5-t)*Math.PI,Zb.r=255*(e=Math.sin(t))*e,Zb.g=255*(e=Math.sin(t+Jb))*e,Zb.b=255*(e=Math.sin(t+Kb))*e,Zb+""},tx=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"};function ex(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}var nx=ex(Nm("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),rx=ex(Nm("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),ix=ex(Nm("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),ax=ex(Nm("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")),ox=function(t){return ke(ne(t).call(document.documentElement))},sx=0;function cx(){return new ux}function ux(){this._="@"+(++sx).toString(36)}ux.prototype=cx.prototype={constructor:ux,get:function(t){for(var e=this._;!(e in t);)if(!(t=t.parentNode))return;return t[e]},set:function(t,e){return t[this._]=e},remove:function(t){return this._ in t&&delete t[this._]},toString:function(){return this._}};var lx=function(t){return"string"==typeof t?new be([document.querySelectorAll(t)],[document.documentElement]):new be([null==t?[]:t],me)},hx=function(t,e){null==e&&(e=Mn().touches);for(var n=0,r=e?e.length:0,i=new Array(r);n1?0:t<-1?xx:Math.acos(t)}function Ex(t){return t>=1?_x:t<=-1?-_x:Math.asin(t)}function Tx(t){return t.innerRadius}function Cx(t){return t.outerRadius}function Ax(t){return t.startAngle}function Sx(t){return t.endAngle}function Mx(t){return t&&t.padAngle}function Ox(t,e,n,r,i,a,o,s){var c=n-t,u=r-e,l=o-i,h=s-a,f=h*c-l*u;if(!(f*f<1e-12))return[t+(f=(l*(e-a)-h*(t-i))/f)*c,e+f*u]}function Dx(t,e,n,r,i,a,o){var s=t-n,c=e-r,u=(o?a:-a)/bx(s*s+c*c),l=u*c,h=-u*s,f=t+l,d=e+h,p=n+l,y=r+h,g=(f+p)/2,v=(d+y)/2,m=p-f,b=y-d,x=m*m+b*b,_=i-a,k=f*y-p*d,w=(b<0?-1:1)*bx(gx(0,_*_*x-k*k)),E=(k*b-m*w)/x,T=(-k*m-b*w)/x,C=(k*b+m*w)/x,A=(-k*m+b*w)/x,S=E-g,M=T-v,O=C-g,D=A-v;return S*S+M*M>O*O+D*D&&(E=C,T=A),{cx:E,cy:T,x01:-l,y01:-h,x11:E*(i/_-1),y11:T*(i/_-1)}}var Nx=function(){var t=Tx,e=Cx,n=fx(0),r=null,i=Ax,a=Sx,o=Mx,s=null;function c(){var c,u,l=+t.apply(this,arguments),h=+e.apply(this,arguments),f=i.apply(this,arguments)-_x,d=a.apply(this,arguments)-_x,p=dx(d-f),y=d>f;if(s||(s=c=Ui()),h1e-12)if(p>kx-1e-12)s.moveTo(h*yx(f),h*mx(f)),s.arc(0,0,h,f,d,!y),l>1e-12&&(s.moveTo(l*yx(d),l*mx(d)),s.arc(0,0,l,d,f,y));else{var g,v,m=f,b=d,x=f,_=d,k=p,w=p,E=o.apply(this,arguments)/2,T=E>1e-12&&(r?+r.apply(this,arguments):bx(l*l+h*h)),C=vx(dx(h-l)/2,+n.apply(this,arguments)),A=C,S=C;if(T>1e-12){var M=Ex(T/l*mx(E)),O=Ex(T/h*mx(E));(k-=2*M)>1e-12?(x+=M*=y?1:-1,_-=M):(k=0,x=_=(f+d)/2),(w-=2*O)>1e-12?(m+=O*=y?1:-1,b-=O):(w=0,m=b=(f+d)/2)}var D=h*yx(m),N=h*mx(m),B=l*yx(_),L=l*mx(_);if(C>1e-12){var P,I=h*yx(b),F=h*mx(b),j=l*yx(x),R=l*mx(x);if(p1e-12?S>1e-12?(g=Dx(j,R,D,N,h,S,y),v=Dx(I,F,B,L,h,S,y),s.moveTo(g.cx+g.x01,g.cy+g.y01),S1e-12&&k>1e-12?A>1e-12?(g=Dx(B,L,I,F,l,-A,y),v=Dx(D,N,j,R,l,-A,y),s.lineTo(g.cx+g.x01,g.cy+g.y01),A=l;--h)s.point(g[h],v[h]);s.lineEnd(),s.areaEnd()}y&&(g[u]=+t(f,u,c),v[u]=+n(f,u,c),s.point(e?+e(f,u,c):g[u],r?+r(f,u,c):v[u]))}if(d)return s=null,d+""||null}function u(){return Fx().defined(i).curve(o).context(a)}return c.x=function(n){return arguments.length?(t="function"==typeof n?n:fx(+n),e=null,c):t},c.x0=function(e){return arguments.length?(t="function"==typeof e?e:fx(+e),c):t},c.x1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:fx(+t),c):e},c.y=function(t){return arguments.length?(n="function"==typeof t?t:fx(+t),r=null,c):n},c.y0=function(t){return arguments.length?(n="function"==typeof t?t:fx(+t),c):n},c.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:fx(+t),c):r},c.lineX0=c.lineY0=function(){return u().x(t).y(n)},c.lineY1=function(){return u().x(t).y(r)},c.lineX1=function(){return u().x(e).y(n)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:fx(!!t),c):i},c.curve=function(t){return arguments.length?(o=t,null!=a&&(s=o(a)),c):o},c.context=function(t){return arguments.length?(null==t?a=s=null:s=o(a=t),c):a},c},Rx=function(t,e){return et?1:e>=t?0:NaN},Yx=function(t){return t},zx=function(){var t=Yx,e=Rx,n=null,r=fx(0),i=fx(kx),a=fx(0);function o(o){var s,c,u,l,h,f=o.length,d=0,p=new Array(f),y=new Array(f),g=+r.apply(this,arguments),v=Math.min(kx,Math.max(-kx,i.apply(this,arguments)-g)),m=Math.min(Math.abs(v)/f,a.apply(this,arguments)),b=m*(v<0?-1:1);for(s=0;s0&&(d+=h);for(null!=e?p.sort((function(t,n){return e(y[t],y[n])})):null!=n&&p.sort((function(t,e){return n(o[t],o[e])})),s=0,u=d?(v-f*b)/d:0;s0?h*u:0)+b,y[c]={data:o[c],index:s,value:h,startAngle:g,endAngle:l,padAngle:m};return y}return o.value=function(e){return arguments.length?(t="function"==typeof e?e:fx(+e),o):t},o.sortValues=function(t){return arguments.length?(e=t,n=null,o):e},o.sort=function(t){return arguments.length?(n=t,e=null,o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:fx(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:fx(+t),o):i},o.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:fx(+t),o):a},o},Ux=Wx(Lx);function $x(t){this._curve=t}function Wx(t){function e(e){return new $x(t(e))}return e._curve=t,e}function Hx(t){var e=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?e(Wx(t)):e()._curve},t}$x.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}};var Vx=function(){return Hx(Fx().curve(Ux))},Gx=function(){var t=jx().curve(Ux),e=t.curve,n=t.lineX0,r=t.lineX1,i=t.lineY0,a=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Hx(n())},delete t.lineX0,t.lineEndAngle=function(){return Hx(r())},delete t.lineX1,t.lineInnerRadius=function(){return Hx(i())},delete t.lineY0,t.lineOuterRadius=function(){return Hx(a())},delete t.lineY1,t.curve=function(t){return arguments.length?e(Wx(t)):e()._curve},t},qx=function(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]},Xx=Array.prototype.slice;function Zx(t){return t.source}function Jx(t){return t.target}function Kx(t){var e=Zx,n=Jx,r=Px,i=Ix,a=null;function o(){var o,s=Xx.call(arguments),c=e.apply(this,s),u=n.apply(this,s);if(a||(a=o=Ui()),t(a,+r.apply(this,(s[0]=c,s)),+i.apply(this,s),+r.apply(this,(s[0]=u,s)),+i.apply(this,s)),o)return a=null,o+""||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(n=t,o):n},o.x=function(t){return arguments.length?(r="function"==typeof t?t:fx(+t),o):r},o.y=function(t){return arguments.length?(i="function"==typeof t?t:fx(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}function Qx(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e=(e+r)/2,n,e,i,r,i)}function t_(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e,n=(n+i)/2,r,n,r,i)}function e_(t,e,n,r,i){var a=qx(e,n),o=qx(e,n=(n+i)/2),s=qx(r,n),c=qx(r,i);t.moveTo(a[0],a[1]),t.bezierCurveTo(o[0],o[1],s[0],s[1],c[0],c[1])}function n_(){return Kx(Qx)}function r_(){return Kx(t_)}function i_(){var t=Kx(e_);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t}var a_={draw:function(t,e){var n=Math.sqrt(e/xx);t.moveTo(n,0),t.arc(0,0,n,0,kx)}},o_={draw:function(t,e){var n=Math.sqrt(e/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}},s_=Math.sqrt(1/3),c_=2*s_,u_={draw:function(t,e){var n=Math.sqrt(e/c_),r=n*s_;t.moveTo(0,-n),t.lineTo(r,0),t.lineTo(0,n),t.lineTo(-r,0),t.closePath()}},l_=Math.sin(xx/10)/Math.sin(7*xx/10),h_=Math.sin(kx/10)*l_,f_=-Math.cos(kx/10)*l_,d_={draw:function(t,e){var n=Math.sqrt(.8908130915292852*e),r=h_*n,i=f_*n;t.moveTo(0,-n),t.lineTo(r,i);for(var a=1;a<5;++a){var o=kx*a/5,s=Math.cos(o),c=Math.sin(o);t.lineTo(c*n,-s*n),t.lineTo(s*r-c*i,c*r+s*i)}t.closePath()}},p_={draw:function(t,e){var n=Math.sqrt(e),r=-n/2;t.rect(r,r,n,n)}},y_=Math.sqrt(3),g_={draw:function(t,e){var n=-Math.sqrt(e/(3*y_));t.moveTo(0,2*n),t.lineTo(-y_*n,-n),t.lineTo(y_*n,-n),t.closePath()}},v_=Math.sqrt(3)/2,m_=1/Math.sqrt(12),b_=3*(m_/2+1),x_={draw:function(t,e){var n=Math.sqrt(e/b_),r=n/2,i=n*m_,a=r,o=n*m_+n,s=-a,c=o;t.moveTo(r,i),t.lineTo(a,o),t.lineTo(s,c),t.lineTo(-.5*r-v_*i,v_*r+-.5*i),t.lineTo(-.5*a-v_*o,v_*a+-.5*o),t.lineTo(-.5*s-v_*c,v_*s+-.5*c),t.lineTo(-.5*r+v_*i,-.5*i-v_*r),t.lineTo(-.5*a+v_*o,-.5*o-v_*a),t.lineTo(-.5*s+v_*c,-.5*c-v_*s),t.closePath()}},__=[a_,o_,u_,p_,d_,g_,x_],k_=function(){var t=fx(a_),e=fx(64),n=null;function r(){var r;if(n||(n=r=Ui()),t.apply(this,arguments).draw(n,+e.apply(this,arguments)),r)return n=null,r+""||null}return r.type=function(e){return arguments.length?(t="function"==typeof e?e:fx(e),r):t},r.size=function(t){return arguments.length?(e="function"==typeof t?t:fx(+t),r):e},r.context=function(t){return arguments.length?(n=null==t?null:t,r):n},r},w_=function(){};function E_(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function T_(t){this._context=t}T_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:E_(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:E_(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var C_=function(t){return new T_(t)};function A_(t){this._context=t}A_.prototype={areaStart:w_,areaEnd:w_,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:E_(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var S_=function(t){return new A_(t)};function M_(t){this._context=t}M_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:E_(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var O_=function(t){return new M_(t)};function D_(t,e){this._basis=new T_(t),this._beta=e}D_.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var r,i=t[0],a=e[0],o=t[n]-i,s=e[n]-a,c=-1;++c<=n;)r=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*o),this._beta*e[c]+(1-this._beta)*(a+r*s));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};var N_=function t(e){function n(t){return 1===e?new T_(t):new D_(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function B_(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function L_(t,e){this._context=t,this._k=(1-e)/6}L_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:B_(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:B_(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var P_=function t(e){function n(t){return new L_(t,e)}return n.tension=function(e){return t(+e)},n}(0);function I_(t,e){this._context=t,this._k=(1-e)/6}I_.prototype={areaStart:w_,areaEnd:w_,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:B_(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var F_=function t(e){function n(t){return new I_(t,e)}return n.tension=function(e){return t(+e)},n}(0);function j_(t,e){this._context=t,this._k=(1-e)/6}j_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:B_(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var R_=function t(e){function n(t){return new j_(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Y_(t,e,n){var r=t._x1,i=t._y1,a=t._x2,o=t._y2;if(t._l01_a>1e-12){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>1e-12){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*u+t._x1*t._l23_2a-e*t._l12_2a)/l,o=(o*u+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(r,i,a,o,t._x2,t._y2)}function z_(t,e){this._context=t,this._alpha=e}z_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Y_(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var U_=function t(e){function n(t){return e?new z_(t,e):new L_(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function $_(t,e){this._context=t,this._alpha=e}$_.prototype={areaStart:w_,areaEnd:w_,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Y_(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var W_=function t(e){function n(t){return e?new $_(t,e):new I_(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function H_(t,e){this._context=t,this._alpha=e}H_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Y_(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var V_=function t(e){function n(t){return e?new H_(t,e):new j_(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function G_(t){this._context=t}G_.prototype={areaStart:w_,areaEnd:w_,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};var q_=function(t){return new G_(t)};function X_(t){return t<0?-1:1}function Z_(t,e,n){var r=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(r||i<0&&-0),o=(n-t._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(X_(a)+X_(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function J_(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function K_(t,e,n){var r=t._x0,i=t._y0,a=t._x1,o=t._y1,s=(a-r)/3;t._context.bezierCurveTo(r+s,i+s*e,a-s,o-s*n,a,o)}function Q_(t){this._context=t}function tk(t){this._context=new ek(t)}function ek(t){this._context=t}function nk(t){return new Q_(t)}function rk(t){return new tk(t)}function ik(t){this._context=t}function ak(t){var e,n,r=t.length-1,i=new Array(r),a=new Array(r),o=new Array(r);for(i[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(o[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var ck=function(t){return new sk(t,.5)};function uk(t){return new sk(t,0)}function lk(t){return new sk(t,1)}var hk=function(t,e){if((i=t.length)>1)for(var n,r,i,a=1,o=t[e[0]],s=o.length;a=0;)n[e]=e;return n};function dk(t,e){return t[e]}var pk=function(){var t=fx([]),e=fk,n=hk,r=dk;function i(i){var a,o,s=t.apply(this,arguments),c=i.length,u=s.length,l=new Array(u);for(a=0;a0){for(var n,r,i,a=0,o=t[0].length;a0)for(var n,r,i,a,o,s,c=0,u=t[e[0]].length;c0?(r[0]=a,r[1]=a+=i):i<0?(r[1]=o,r[0]=o+=i):(r[0]=0,r[1]=i)},vk=function(t,e){if((n=t.length)>0){for(var n,r=0,i=t[e[0]],a=i.length;r0&&(r=(n=t[e[0]]).length)>0){for(var n,r,i,a=0,o=1;oa&&(a=e,r=n);return r}var _k=function(t){var e=t.map(kk);return fk(t).sort((function(t,n){return e[t]-e[n]}))};function kk(t){for(var e,n=0,r=-1,i=t.length;++r0)){if(a/=f,f<0){if(a0){if(a>h)return;a>l&&(l=a)}if(a=r-c,f||!(a<0)){if(a/=f,f<0){if(a>h)return;a>l&&(l=a)}else if(f>0){if(a0)){if(a/=d,d<0){if(a0){if(a>h)return;a>l&&(l=a)}if(a=i-u,d||!(a<0)){if(a/=d,d<0){if(a>h)return;a>l&&(l=a)}else if(d>0){if(a0||h<1)||(l>0&&(t[0]=[c+l*f,u+l*d]),h<1&&(t[1]=[c+h*f,u+h*d]),!0)}}}}}function Uk(t,e,n,r,i){var a=t[1];if(a)return!0;var o,s,c=t[0],u=t.left,l=t.right,h=u[0],f=u[1],d=l[0],p=l[1],y=(h+d)/2,g=(f+p)/2;if(p===f){if(y=r)return;if(h>d){if(c){if(c[1]>=i)return}else c=[y,n];a=[y,i]}else{if(c){if(c[1]1)if(h>d){if(c){if(c[1]>=i)return}else c=[(n-s)/o,n];a=[(i-s)/o,i]}else{if(c){if(c[1]=r)return}else c=[e,o*e+s];a=[r,o*r+s]}else{if(c){if(c[0]=-lw)){var d=c*c+u*u,p=l*l+h*h,y=(h*d-u*p)/f,g=(c*p-l*d)/f,v=Gk.pop()||new qk;v.arc=t,v.site=i,v.x=y+o,v.y=(v.cy=g+s)+Math.sqrt(y*y+g*g),t.circle=v;for(var m=null,b=sw._;b;)if(v.yuw)s=s.L;else{if(!((i=a-iw(s,o))>uw)){r>-uw?(e=s.P,n=s):i>-uw?(e=s,n=s.N):e=n=s;break}if(!s.R){e=s;break}s=s.R}!function(t){ow[t.index]={site:t,halfedges:[]}}(t);var c=Qk(t);if(aw.insert(e,c),e||n){if(e===n)return Zk(e),n=Qk(e.site),aw.insert(c,n),c.edge=n.edge=jk(e.site,c.site),Xk(e),void Xk(n);if(n){Zk(e),Zk(n);var u=e.site,l=u[0],h=u[1],f=t[0]-l,d=t[1]-h,p=n.site,y=p[0]-l,g=p[1]-h,v=2*(f*g-d*y),m=f*f+d*d,b=y*y+g*g,x=[(g*m-d*b)/v+l,(f*b-y*m)/v+h];Yk(n.edge,u,p,x),c.edge=jk(u,t,null,x),n.edge=jk(t,p,null,x),Xk(e),Xk(n)}else c.edge=jk(e.site,c.site)}}function rw(t,e){var n=t.site,r=n[0],i=n[1],a=i-e;if(!a)return r;var o=t.P;if(!o)return-1/0;var s=(n=o.site)[0],c=n[1],u=c-e;if(!u)return s;var l=s-r,h=1/a-1/u,f=l/u;return h?(-f+Math.sqrt(f*f-2*h*(l*l/(-2*u)-c+u/2+i-a/2)))/h+r:(r+s)/2}function iw(t,e){var n=t.N;if(n)return rw(n,e);var r=t.site;return r[1]===e?r[0]:1/0}var aw,ow,sw,cw,uw=1e-6,lw=1e-12;function hw(t,e){return e[1]-t[1]||e[0]-t[0]}function fw(t,e){var n,r,i,a=t.sort(hw).pop();for(cw=[],ow=new Array(t.length),aw=new Fk,sw=new Fk;;)if(i=Vk,a&&(!i||a[1]uw||Math.abs(i[0][1]-i[1][1])>uw)||delete cw[a]}(o,s,c,u),function(t,e,n,r){var i,a,o,s,c,u,l,h,f,d,p,y,g=ow.length,v=!0;for(i=0;iuw||Math.abs(y-f)>uw)&&(c.splice(s,0,cw.push(Rk(o,d,Math.abs(p-t)uw?[t,Math.abs(h-t)uw?[Math.abs(f-r)uw?[n,Math.abs(h-n)uw?[Math.abs(f-e)=s)return null;var c=t-i.site[0],u=e-i.site[1],l=c*c+u*u;do{i=a.cells[r=o],o=null,i.halfedges.forEach((function(n){var r=a.edges[n],s=r.left;if(s!==i.site&&s||(s=r.right)){var c=t-s[0],u=e-s[1],h=c*c+u*u;hr?(r+i)/2:Math.min(0,r)||Math.max(0,i),o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o))}var Aw=function(){var t,e,n=_w,r=kw,i=Cw,a=Ew,o=Tw,s=[0,1/0],c=[[-1/0,-1/0],[1/0,1/0]],u=250,l=fp,h=lt("start","zoom","end"),f=0;function d(t){t.property("__zoom",ww).on("wheel.zoom",x).on("mousedown.zoom",_).on("dblclick.zoom",k).filter(o).on("touchstart.zoom",w).on("touchmove.zoom",E).on("touchend.zoom touchcancel.zoom",T).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(t,e){return(e=Math.max(s[0],Math.min(s[1],e)))===t.k?t:new gw(e,t.x,t.y)}function y(t,e,n){var r=e[0]-n[0]*t.k,i=e[1]-n[1]*t.k;return r===t.x&&i===t.y?t:new gw(t.k,r,i)}function g(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function v(t,e,n){t.on("start.zoom",(function(){m(this,arguments).start()})).on("interrupt.zoom end.zoom",(function(){m(this,arguments).end()})).tween("zoom",(function(){var t=this,i=arguments,a=m(t,i),o=r.apply(t,i),s=null==n?g(o):"function"==typeof n?n.apply(t,i):n,c=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),u=t.__zoom,h="function"==typeof e?e.apply(t,i):e,f=l(u.invert(s).concat(c/u.k),h.invert(s).concat(c/h.k));return function(t){if(1===t)t=h;else{var e=f(t),n=c/e[2];t=new gw(n,s[0]-e[0]*n,s[1]-e[1]*n)}a.zoom(null,t)}}))}function m(t,e,n){return!n&&t.__zooming||new b(t,e)}function b(t,e){this.that=t,this.args=e,this.active=0,this.extent=r.apply(t,e),this.taps=0}function x(){if(n.apply(this,arguments)){var t=m(this,arguments),e=this.__zoom,r=Math.max(s[0],Math.min(s[1],e.k*Math.pow(2,a.apply(this,arguments)))),o=Nn(this);if(t.wheel)t.mouse[0][0]===o[0]&&t.mouse[0][1]===o[1]||(t.mouse[1]=e.invert(t.mouse[0]=o)),clearTimeout(t.wheel);else{if(e.k===r)return;t.mouse=[o,e.invert(o)],or(this),t.start()}xw(),t.wheel=setTimeout(u,150),t.zoom("mouse",i(y(p(e,r),t.mouse[0],t.mouse[1]),t.extent,c))}function u(){t.wheel=null,t.end()}}function _(){if(!e&&n.apply(this,arguments)){var t=m(this,arguments,!0),r=ke(ce.view).on("mousemove.zoom",u,!0).on("mouseup.zoom",l,!0),a=Nn(this),o=ce.clientX,s=ce.clientY;Te(ce.view),bw(),t.mouse=[a,this.__zoom.invert(a)],or(this),t.start()}function u(){if(xw(),!t.moved){var e=ce.clientX-o,n=ce.clientY-s;t.moved=e*e+n*n>f}t.zoom("mouse",i(y(t.that.__zoom,t.mouse[0]=Nn(t.that),t.mouse[1]),t.extent,c))}function l(){r.on("mousemove.zoom mouseup.zoom",null),Ce(ce.view,t.moved),xw(),t.end()}}function k(){if(n.apply(this,arguments)){var t=this.__zoom,e=Nn(this),a=t.invert(e),o=t.k*(ce.shiftKey?.5:2),s=i(y(p(t,o),e,a),r.apply(this,arguments),c);xw(),u>0?ke(this).transition().duration(u).call(v,s,e):ke(this).call(d.transform,s)}}function w(){if(n.apply(this,arguments)){var e,r,i,a,o=ce.touches,s=o.length,c=m(this,arguments,ce.changedTouches.length===s);for(bw(),r=0;rh&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},M={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),58;case 1:return this.begin("type_directive"),59;case 2:return this.popState(),this.begin("arg_directive"),14;case 3:return this.popState(),this.popState(),61;case 4:return 60;case 5:return 5;case 6:case 7:case 8:case 9:case 10:break;case 11:return this.begin("ID"),16;case 12:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),48;case 13:return this.popState(),this.popState(),this.begin("LINE"),18;case 14:return this.popState(),this.popState(),5;case 15:return this.begin("LINE"),27;case 16:return this.begin("LINE"),29;case 17:return this.begin("LINE"),30;case 18:return this.begin("LINE"),31;case 19:return this.begin("LINE"),36;case 20:return this.begin("LINE"),33;case 21:return this.begin("LINE"),35;case 22:return this.popState(),19;case 23:return 28;case 24:return 43;case 25:return 44;case 26:return 39;case 27:return 37;case 28:return this.begin("ID"),22;case 29:return this.begin("ID"),23;case 30:return 25;case 31:return 7;case 32:return 21;case 33:return 42;case 34:return 5;case 35:return e.yytext=e.yytext.trim(),48;case 36:return 51;case 37:return 52;case 38:return 49;case 39:return 50;case 40:return 53;case 41:return 54;case 42:return 55;case 43:return 56;case 44:return 57;case 45:return 46;case 46:return 47;case 47:return 5;case 48:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:participant\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\b)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1,8],inclusive:!1},type_directive:{rules:[2,3,8],inclusive:!1},arg_directive:{rules:[3,4,8],inclusive:!1},ID:{rules:[7,8,12],inclusive:!1},ALIAS:{rules:[7,8,13,14],inclusive:!1},LINE:{rules:[7,8,22],inclusive:!1},INITIAL:{rules:[0,5,6,8,9,10,11,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],inclusive:!0}}};function O(){this.yy={}}return S.lexer=M,O.prototype=S,S.Parser=O,new O}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){var r=n(198);t.exports={Graph:r.Graph,json:n(301),alg:n(302),version:r.version}},function(t,e,n){var r;try{r={cloneDeep:n(313),constant:n(86),defaults:n(154),each:n(87),filter:n(128),find:n(314),flatten:n(156),forEach:n(126),forIn:n(319),has:n(93),isUndefined:n(139),last:n(320),map:n(140),mapValues:n(321),max:n(322),merge:n(324),min:n(329),minBy:n(330),now:n(331),pick:n(161),range:n(162),reduce:n(142),sortBy:n(338),uniqueId:n(163),values:n(147),zipObject:n(343)}}catch(t){}r||(r=window._),t.exports=r},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){ -/** - * @license - * Copyright (c) 2012-2013 Chris Pettitt +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.mermaid=e():t.mermaid=e()}(window,function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=177)}([function(t,e,n){(function(t){t.exports=function(){"use strict";var e,r;function i(){return e.apply(null,arguments)}function a(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function u(t){return void 0===t}function s(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function c(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function l(t,e){var n,r=[];for(n=0;n>>0,r=0;r0)for(n=0;n=0;return(a?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}var I=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,z={},q={};function W(t,e,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),t&&(q[t]=i),e&&(q[e[0]]=function(){return R(i.apply(this,arguments),e[1],e[2])}),n&&(q[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=V(e,t.localeData()),z[e]=z[e]||function(t){var e,n,r,i=t.match(I);for(e=0,n=i.length;e=0&&B.test(t);)t=t.replace(B,r),B.lastIndex=0,n-=1;return t}var $=/\d/,G=/\d\d/,J=/\d{3}/,Z=/\d{4}/,K=/[+-]?\d{6}/,X=/\d\d?/,Q=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,rt=/[+-]?\d{1,6}/,it=/\d+/,at=/[+-]?\d+/,ot=/Z|[+-]\d\d:?\d\d/gi,ut=/Z|[+-]\d\d(?::?\d\d)?/gi,st=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ct={};function lt(t,e,n){ct[t]=E(e)?e:function(t,r){return t&&n?n:e}}function ft(t,e){return f(ct,t)?ct[t](e._strict,e._locale):new RegExp(dt(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,r,i){return e||n||r||i})))}function dt(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ht={};function _t(t,e){var n,r=e;for("string"==typeof t&&(t=[t]),s(e)&&(r=function(t,n){n[e]=k(t)}),n=0;n68?1900:2e3)};var Yt,At=Et("FullYear",!0);function Et(t,e){return function(n){return null!=n?(jt(this,t,n),i.updateOffset(this,e),this):St(this,t)}}function St(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function jt(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&Tt(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),Ot(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function Ot(t,e){if(isNaN(t)||isNaN(e))return NaN;var n,r=(e%(n=12)+n)%n;return t+=(e-r)/12,1===r?Tt(t)?29:28:31-r%7%2}Yt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function qt(t,e,n){var r=7+e-n,i=(7+zt(t,0,r).getUTCDay()-e)%7;return-i+r-1}function Wt(t,e,n,r,i){var a,o,u=(7+n-r)%7,s=qt(t,r,i),c=1+7*(e-1)+u+s;return c<=0?o=Dt(a=t-1)+c:c>Dt(t)?(a=t+1,o=c-Dt(t)):(a=t,o=c),{year:a,dayOfYear:o}}function Ut(t,e,n){var r,i,a=qt(t.year(),e,n),o=Math.floor((t.dayOfYear()-a-1)/7)+1;return o<1?(i=t.year()-1,r=o+Vt(i,e,n)):o>Vt(t.year(),e,n)?(r=o-Vt(t.year(),e,n),i=t.year()+1):(i=t.year(),r=o),{week:r,year:i}}function Vt(t,e,n){var r=qt(t,e,n),i=qt(t+1,e,n);return(Dt(t)-r+i)/7}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),C("week","w"),C("isoWeek","W"),N("week",5),N("isoWeek",5),lt("w",X),lt("ww",X,G),lt("W",X),lt("WW",X,G),pt(["w","ww","W","WW"],function(t,e,n,r){e[r.substr(0,1)]=k(t)}),W("d",0,"do","day"),W("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),W("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),W("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),C("day","d"),C("weekday","e"),C("isoWeekday","E"),N("day",11),N("weekday",11),N("isoWeekday",11),lt("d",X),lt("e",X),lt("E",X),lt("dd",function(t,e){return e.weekdaysMinRegex(t)}),lt("ddd",function(t,e){return e.weekdaysShortRegex(t)}),lt("dddd",function(t,e){return e.weekdaysRegex(t)}),pt(["dd","ddd","dddd"],function(t,e,n,r){var i=n._locale.weekdaysParse(t,r,n._strict);null!=i?e.d=i:_(n).invalidWeekday=t}),pt(["d","e","E"],function(t,e,n,r){e[r]=k(t)});var $t="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Gt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Jt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Zt=st,Kt=st,Xt=st;function Qt(){function t(t,e){return e.length-t.length}var e,n,r,i,a,o=[],u=[],s=[],c=[];for(e=0;e<7;e++)n=h([2e3,1]).day(e),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),a=this.weekdays(n,""),o.push(r),u.push(i),s.push(a),c.push(r),c.push(i),c.push(a);for(o.sort(t),u.sort(t),s.sort(t),c.sort(t),e=0;e<7;e++)u[e]=dt(u[e]),s[e]=dt(s[e]),c[e]=dt(c[e]);this._weekdaysRegex=new RegExp("^("+c.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function te(){return this.hours()%12||12}function ee(t,e){W(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function ne(t,e){return e._meridiemParse}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,te),W("k",["kk",2],0,function(){return this.hours()||24}),W("hmm",0,0,function(){return""+te.apply(this)+R(this.minutes(),2)}),W("hmmss",0,0,function(){return""+te.apply(this)+R(this.minutes(),2)+R(this.seconds(),2)}),W("Hmm",0,0,function(){return""+this.hours()+R(this.minutes(),2)}),W("Hmmss",0,0,function(){return""+this.hours()+R(this.minutes(),2)+R(this.seconds(),2)}),ee("a",!0),ee("A",!1),C("hour","h"),N("hour",13),lt("a",ne),lt("A",ne),lt("H",X),lt("h",X),lt("k",X),lt("HH",X,G),lt("hh",X,G),lt("kk",X,G),lt("hmm",Q),lt("hmmss",tt),lt("Hmm",Q),lt("Hmmss",tt),_t(["H","HH"],bt),_t(["k","kk"],function(t,e,n){var r=k(t);e[bt]=24===r?0:r}),_t(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),_t(["h","hh"],function(t,e,n){e[bt]=k(t),_(n).bigHour=!0}),_t("hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[Mt]=k(t.substr(r)),_(n).bigHour=!0}),_t("hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[Mt]=k(t.substr(r,2)),e[wt]=k(t.substr(i)),_(n).bigHour=!0}),_t("Hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[Mt]=k(t.substr(r))}),_t("Hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[Mt]=k(t.substr(r,2)),e[wt]=k(t.substr(i))});var re,ie=Et("Hours",!0),ae={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ht,monthsShort:Pt,week:{dow:0,doy:6},weekdays:$t,weekdaysMin:Jt,weekdaysShort:Gt,meridiemParse:/[ap]\.?m?\.?/i},oe={},ue={};function se(t){return t?t.toLowerCase().replace("_","-"):t}function ce(e){var r=null;if(!oe[e]&&void 0!==t&&t&&t.exports)try{r=re._abbr,n(154)("./"+e),le(r)}catch(t){}return oe[e]}function le(t,e){var n;return t&&((n=u(e)?de(t):fe(t,e))?re=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),re._abbr}function fe(t,e){if(null!==e){var n,r=ae;if(e.abbr=t,null!=oe[t])A("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=oe[t]._config;else if(null!=e.parentLocale)if(null!=oe[e.parentLocale])r=oe[e.parentLocale]._config;else{if(null==(n=ce(e.parentLocale)))return ue[e.parentLocale]||(ue[e.parentLocale]=[]),ue[e.parentLocale].push({name:t,config:e}),null;r=n._config}return oe[t]=new j(S(r,e)),ue[t]&&ue[t].forEach(function(t){fe(t.name,t.config)}),le(t),oe[t]}return delete oe[t],null}function de(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return re;if(!a(t)){if(e=ce(t))return e;t=[t]}return function(t){for(var e,n,r,i,a=0;a0;){if(r=ce(i.slice(0,e).join("-")))return r;if(n&&n.length>=e&&L(i,n,!0)>=e-1)break;e--}a++}return re}(t)}function he(t){var e,n=t._a;return n&&-2===_(t).overflow&&(e=n[gt]<0||n[gt]>11?gt:n[vt]<1||n[vt]>Ot(n[yt],n[gt])?vt:n[bt]<0||n[bt]>24||24===n[bt]&&(0!==n[Mt]||0!==n[wt]||0!==n[kt])?bt:n[Mt]<0||n[Mt]>59?Mt:n[wt]<0||n[wt]>59?wt:n[kt]<0||n[kt]>999?kt:-1,_(t)._overflowDayOfYear&&(evt)&&(e=vt),_(t)._overflowWeeks&&-1===e&&(e=Lt),_(t)._overflowWeekday&&-1===e&&(e=xt),_(t).overflow=e),t}function _e(t,e,n){return null!=t?t:null!=e?e:n}function pe(t){var e,n,r,a,o,u=[];if(!t._d){for(r=function(t){var e=new Date(i.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[vt]&&null==t._a[gt]&&function(t){var e,n,r,i,a,o,u,s;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)a=1,o=4,n=_e(e.GG,t._a[yt],Ut(Ee(),1,4).year),r=_e(e.W,1),((i=_e(e.E,1))<1||i>7)&&(s=!0);else{a=t._locale._week.dow,o=t._locale._week.doy;var c=Ut(Ee(),a,o);n=_e(e.gg,t._a[yt],c.year),r=_e(e.w,c.week),null!=e.d?((i=e.d)<0||i>6)&&(s=!0):null!=e.e?(i=e.e+a,(e.e<0||e.e>6)&&(s=!0)):i=a}r<1||r>Vt(n,a,o)?_(t)._overflowWeeks=!0:null!=s?_(t)._overflowWeekday=!0:(u=Wt(n,r,i,a,o),t._a[yt]=u.year,t._dayOfYear=u.dayOfYear)}(t),null!=t._dayOfYear&&(o=_e(t._a[yt],r[yt]),(t._dayOfYear>Dt(o)||0===t._dayOfYear)&&(_(t)._overflowDayOfYear=!0),n=zt(o,0,t._dayOfYear),t._a[gt]=n.getUTCMonth(),t._a[vt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=u[e]=r[e];for(;e<7;e++)t._a[e]=u[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[bt]&&0===t._a[Mt]&&0===t._a[wt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[bt]=0),t._d=(t._useUTC?zt:function(t,e,n,r,i,a,o){var u=new Date(t,e,n,r,i,a,o);return t<100&&t>=0&&isFinite(u.getFullYear())&&u.setFullYear(t),u}).apply(null,u),a=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[bt]=24),t._w&&void 0!==t._w.d&&t._w.d!==a&&(_(t).weekdayMismatch=!0)}}var me=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ge=/Z|[+-]\d\d(?::?\d\d)?/,ve=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],be=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Me=/^\/?Date\((\-?\d+)/i;function we(t){var e,n,r,i,a,o,u=t._i,s=me.exec(u)||ye.exec(u);if(s){for(_(t).iso=!0,e=0,n=ve.length;e0&&_(t).unusedInput.push(o),u=u.slice(u.indexOf(n)+n.length),c+=n.length),q[a]?(n?_(t).empty=!1:_(t).unusedTokens.push(a),mt(a,n,t)):t._strict&&!n&&_(t).unusedTokens.push(a);_(t).charsLeftOver=s-c,u.length>0&&_(t).unusedInput.push(u),t._a[bt]<=12&&!0===_(t).bigHour&&t._a[bt]>0&&(_(t).bigHour=void 0),_(t).parsedDateParts=t._a.slice(0),_(t).meridiem=t._meridiem,t._a[bt]=(l=t._locale,f=t._a[bt],null==(d=t._meridiem)?f:null!=l.meridiemHour?l.meridiemHour(f,d):null!=l.isPM?((h=l.isPM(d))&&f<12&&(f+=12),h||12!==f||(f=0),f):f),pe(t),he(t)}else De(t);else we(t);var l,f,d,h}function Ye(t){var e=t._i,n=t._f;return t._locale=t._locale||de(t._l),null===e||void 0===n&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),M(e)?new b(he(e)):(c(e)?t._d=e:a(n)?function(t){var e,n,r,i,a;if(0===t._f.length)return _(t).invalidFormat=!0,void(t._d=new Date(NaN));for(i=0;ithis?this:t:m()});function Oe(t,e){var n,r;if(1===e.length&&a(e[0])&&(e=e[0]),!e.length)return Ee();for(n=e[0],r=1;ra&&(e=a),function(t,e,n,r,i){var a=Wt(t,e,n,r,i),o=zt(a.year,0,a.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}.call(this,t,e,n,r,i))}W(0,["gg",2],0,function(){return this.weekYear()%100}),W(0,["GG",2],0,function(){return this.isoWeekYear()%100}),rn("gggg","weekYear"),rn("ggggg","weekYear"),rn("GGGG","isoWeekYear"),rn("GGGGG","isoWeekYear"),C("weekYear","gg"),C("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),lt("G",at),lt("g",at),lt("GG",X,G),lt("gg",X,G),lt("GGGG",nt,Z),lt("gggg",nt,Z),lt("GGGGG",rt,K),lt("ggggg",rt,K),pt(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,r){e[r.substr(0,2)]=k(t)}),pt(["gg","GG"],function(t,e,n,r){e[r]=i.parseTwoDigitYear(t)}),W("Q",0,"Qo","quarter"),C("quarter","Q"),N("quarter",7),lt("Q",$),_t("Q",function(t,e){e[gt]=3*(k(t)-1)}),W("D",["DD",2],"Do","date"),C("date","D"),N("date",9),lt("D",X),lt("DD",X,G),lt("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),_t(["D","DD"],vt),_t("Do",function(t,e){e[vt]=k(t.match(X)[0])});var on=Et("Date",!0);W("DDD",["DDDD",3],"DDDo","dayOfYear"),C("dayOfYear","DDD"),N("dayOfYear",4),lt("DDD",et),lt("DDDD",J),_t(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),W("m",["mm",2],0,"minute"),C("minute","m"),N("minute",14),lt("m",X),lt("mm",X,G),_t(["m","mm"],Mt);var un=Et("Minutes",!1);W("s",["ss",2],0,"second"),C("second","s"),N("second",15),lt("s",X),lt("ss",X,G),_t(["s","ss"],wt);var sn,cn=Et("Seconds",!1);for(W("S",0,0,function(){return~~(this.millisecond()/100)}),W(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),W(0,["SSS",3],0,"millisecond"),W(0,["SSSS",4],0,function(){return 10*this.millisecond()}),W(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),W(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),W(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),W(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),W(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),C("millisecond","ms"),N("millisecond",16),lt("S",et,$),lt("SS",et,G),lt("SSS",et,J),sn="SSSS";sn.length<=9;sn+="S")lt(sn,it);function ln(t,e){e[kt]=k(1e3*("0."+t))}for(sn="S";sn.length<=9;sn+="S")_t(sn,ln);var fn=Et("Milliseconds",!1);W("z",0,0,"zoneAbbr"),W("zz",0,0,"zoneName");var dn=b.prototype;function hn(t){return t}dn.add=Ke,dn.calendar=function(t,e){var n=t||Ee(),r=Be(n,this).startOf("day"),a=i.calendarFormat(this,r)||"sameElse",o=e&&(E(e[a])?e[a].call(this,n):e[a]);return this.format(o||this.localeData().calendar(a,this,Ee(n)))},dn.clone=function(){return new b(this)},dn.diff=function(t,e,n){var r,i,a;if(!this.isValid())return NaN;if(!(r=Be(t,this)).isValid())return NaN;switch(i=6e4*(r.utcOffset()-this.utcOffset()),e=H(e)){case"year":a=Qe(this,r)/12;break;case"month":a=Qe(this,r);break;case"quarter":a=Qe(this,r)/3;break;case"second":a=(this-r)/1e3;break;case"minute":a=(this-r)/6e4;break;case"hour":a=(this-r)/36e5;break;case"day":a=(this-r-i)/864e5;break;case"week":a=(this-r-i)/6048e5;break;default:a=this-r}return n?a:w(a)},dn.endOf=function(t){return void 0===(t=H(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))},dn.format=function(t){t||(t=this.isUtc()?i.defaultFormatUtc:i.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},dn.from=function(t,e){return this.isValid()&&(M(t)&&t.isValid()||Ee(t).isValid())?Ve({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.fromNow=function(t){return this.from(Ee(),t)},dn.to=function(t,e){return this.isValid()&&(M(t)&&t.isValid()||Ee(t).isValid())?Ve({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.toNow=function(t){return this.to(Ee(),t)},dn.get=function(t){return E(this[t=H(t)])?this[t]():this},dn.invalidAt=function(){return _(this).overflow},dn.isAfter=function(t,e){var n=M(t)?t:Ee(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=H(e)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):E(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},dn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=e+'[")]';return this.format(n+r+"-MM-DD[T]HH:mm:ss.SSS"+i)},dn.toJSON=function(){return this.isValid()?this.toISOString():null},dn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},dn.unix=function(){return Math.floor(this.valueOf()/1e3)},dn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},dn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},dn.year=At,dn.isLeapYear=function(){return Tt(this.year())},dn.weekYear=function(t){return an.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},dn.isoWeekYear=function(t){return an.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},dn.quarter=dn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},dn.month=Nt,dn.daysInMonth=function(){return Ot(this.year(),this.month())},dn.week=dn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},dn.isoWeek=dn.isoWeeks=function(t){var e=Ut(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},dn.weeksInYear=function(){var t=this.localeData()._week;return Vt(this.year(),t.dow,t.doy)},dn.isoWeeksInYear=function(){return Vt(this.year(),1,4)},dn.date=on,dn.day=dn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},dn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},dn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},dn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},dn.hour=dn.hours=ie,dn.minute=dn.minutes=un,dn.second=dn.seconds=cn,dn.millisecond=dn.milliseconds=fn,dn.utcOffset=function(t,e,n){var r,a=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Ie(ut,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(r=ze(this)),this._offset=t,this._isUTC=!0,null!=r&&this.add(r,"m"),a!==t&&(!e||this._changeInProgress?Ze(this,Ve(t-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?a:ze(this)},dn.utc=function(t){return this.utcOffset(0,t)},dn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(ze(this),"m")),this},dn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Ie(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},dn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Ee(t).utcOffset():0,(this.utcOffset()-t)%60==0)},dn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},dn.isLocal=function(){return!!this.isValid()&&!this._isUTC},dn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},dn.isUtc=qe,dn.isUTC=qe,dn.zoneAbbr=function(){return this._isUTC?"UTC":""},dn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},dn.dates=D("dates accessor is deprecated. Use date instead.",on),dn.months=D("months accessor is deprecated. Use month instead",Nt),dn.years=D("years accessor is deprecated. Use year instead",At),dn.zone=D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),dn.isDSTShifted=D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!u(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),(t=Ye(t))._a){var e=t._isUTC?h(t._a):Ee(t._a);this._isDSTShifted=this.isValid()&&L(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var _n=j.prototype;function pn(t,e,n,r){var i=de(),a=h().set(r,e);return i[n](a,t)}function mn(t,e,n){if(s(t)&&(e=t,t=void 0),t=t||"",null!=e)return pn(t,e,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=pn(t,r,n,"month");return i}function yn(t,e,n,r){"boolean"==typeof t?(s(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,s(e)&&(n=e,e=void 0),e=e||"");var i,a=de(),o=t?a._week.dow:0;if(null!=n)return pn(e,(n+o)%7,r,"day");var u=[];for(i=0;i<7;i++)u[i]=pn(e,(i+o)%7,r,"day");return u}_n.calendar=function(t,e,n){var r=this._calendar[t]||this._calendar.sameElse;return E(r)?r.call(e,n):r},_n.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},_n.invalidDate=function(){return this._invalidDate},_n.ordinal=function(t){return this._ordinal.replace("%d",t)},_n.preparse=hn,_n.postformat=hn,_n.relativeTime=function(t,e,n,r){var i=this._relativeTime[n];return E(i)?i(t,e,n,r):i.replace(/%d/i,t)},_n.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return E(n)?n(e):n.replace(/%s/i,e)},_n.set=function(t){var e,n;for(n in t)E(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},_n.months=function(t,e){return t?a(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Ct).test(e)?"format":"standalone"][t.month()]:a(this._months)?this._months:this._months.standalone},_n.monthsShort=function(t,e){return t?a(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Ct.test(e)?"format":"standalone"][t.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},_n.monthsParse=function(t,e,n){var r,i,a;if(this._monthsParseExact)return function(t,e,n){var r,i,a,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)a=h([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(a,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(a,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(i=Yt.call(this._shortMonthsParse,o))?i:null:-1!==(i=Yt.call(this._longMonthsParse,o))?i:null:"MMM"===e?-1!==(i=Yt.call(this._shortMonthsParse,o))?i:-1!==(i=Yt.call(this._longMonthsParse,o))?i:null:-1!==(i=Yt.call(this._longMonthsParse,o))?i:-1!==(i=Yt.call(this._shortMonthsParse,o))?i:null}.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=h([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(a="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(a.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[r].test(t))return r;if(n&&"MMM"===e&&this._shortMonthsParse[r].test(t))return r;if(!n&&this._monthsParse[r].test(t))return r}},_n.monthsRegex=function(t){return this._monthsParseExact?(f(this,"_monthsRegex")||Bt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(f(this,"_monthsRegex")||(this._monthsRegex=It),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},_n.monthsShortRegex=function(t){return this._monthsParseExact?(f(this,"_monthsRegex")||Bt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(f(this,"_monthsShortRegex")||(this._monthsShortRegex=Rt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},_n.week=function(t){return Ut(t,this._week.dow,this._week.doy).week},_n.firstDayOfYear=function(){return this._week.doy},_n.firstDayOfWeek=function(){return this._week.dow},_n.weekdays=function(t,e){return t?a(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:a(this._weekdays)?this._weekdays:this._weekdays.standalone},_n.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},_n.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},_n.weekdaysParse=function(t,e,n){var r,i,a;if(this._weekdaysParseExact)return function(t,e,n){var r,i,a,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)a=h([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(i=Yt.call(this._weekdaysParse,o))?i:null:"ddd"===e?-1!==(i=Yt.call(this._shortWeekdaysParse,o))?i:null:-1!==(i=Yt.call(this._minWeekdaysParse,o))?i:null:"dddd"===e?-1!==(i=Yt.call(this._weekdaysParse,o))?i:-1!==(i=Yt.call(this._shortWeekdaysParse,o))?i:-1!==(i=Yt.call(this._minWeekdaysParse,o))?i:null:"ddd"===e?-1!==(i=Yt.call(this._shortWeekdaysParse,o))?i:-1!==(i=Yt.call(this._weekdaysParse,o))?i:-1!==(i=Yt.call(this._minWeekdaysParse,o))?i:null:-1!==(i=Yt.call(this._minWeekdaysParse,o))?i:-1!==(i=Yt.call(this._weekdaysParse,o))?i:-1!==(i=Yt.call(this._shortWeekdaysParse,o))?i:null}.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=h([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(a="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(a.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[r].test(t))return r;if(n&&"ddd"===e&&this._shortWeekdaysParse[r].test(t))return r;if(n&&"dd"===e&&this._minWeekdaysParse[r].test(t))return r;if(!n&&this._weekdaysParse[r].test(t))return r}},_n.weekdaysRegex=function(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Qt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(f(this,"_weekdaysRegex")||(this._weekdaysRegex=Zt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},_n.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Qt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(f(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Kt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},_n.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Qt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(f(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Xt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},_n.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},_n.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},le("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),i.lang=D("moment.lang is deprecated. Use moment.locale instead.",le),i.langData=D("moment.langData is deprecated. Use moment.localeData instead.",de);var gn=Math.abs;function vn(t,e,n,r){var i=Ve(e,n);return t._milliseconds+=r*i._milliseconds,t._days+=r*i._days,t._months+=r*i._months,t._bubble()}function bn(t){return t<0?Math.floor(t):Math.ceil(t)}function Mn(t){return 4800*t/146097}function wn(t){return 146097*t/4800}function kn(t){return function(){return this.as(t)}}var Ln=kn("ms"),xn=kn("s"),Dn=kn("m"),Tn=kn("h"),Yn=kn("d"),An=kn("w"),En=kn("M"),Sn=kn("y");function jn(t){return function(){return this.isValid()?this._data[t]:NaN}}var On=jn("milliseconds"),Cn=jn("seconds"),Hn=jn("minutes"),Pn=jn("hours"),Fn=jn("days"),Nn=jn("months"),Rn=jn("years"),In=Math.round,Bn={ss:44,s:45,m:45,h:22,d:26,M:11},zn=Math.abs;function qn(t){return(t>0)-(t<0)||+t}function Wn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=zn(this._milliseconds)/1e3,r=zn(this._days),i=zn(this._months);t=w(n/60),e=w(t/60),n%=60,t%=60;var a=w(i/12),o=i%=12,u=r,s=e,c=t,l=n?n.toFixed(3).replace(/\.?0+$/,""):"",f=this.asSeconds();if(!f)return"P0D";var d=f<0?"-":"",h=qn(this._months)!==qn(f)?"-":"",_=qn(this._days)!==qn(f)?"-":"",p=qn(this._milliseconds)!==qn(f)?"-":"";return d+"P"+(a?h+a+"Y":"")+(o?h+o+"M":"")+(u?_+u+"D":"")+(s||c||l?"T":"")+(s?p+s+"H":"")+(c?p+c+"M":"")+(l?p+l+"S":"")}var Un=He.prototype;return Un.isValid=function(){return this._isValid},Un.abs=function(){var t=this._data;return this._milliseconds=gn(this._milliseconds),this._days=gn(this._days),this._months=gn(this._months),t.milliseconds=gn(t.milliseconds),t.seconds=gn(t.seconds),t.minutes=gn(t.minutes),t.hours=gn(t.hours),t.months=gn(t.months),t.years=gn(t.years),this},Un.add=function(t,e){return vn(this,t,e,1)},Un.subtract=function(t,e){return vn(this,t,e,-1)},Un.as=function(t){if(!this.isValid())return NaN;var e,n,r=this._milliseconds;if("month"===(t=H(t))||"year"===t)return e=this._days+r/864e5,n=this._months+Mn(e),"month"===t?n:n/12;switch(e=this._days+Math.round(wn(this._months)),t){case"week":return e/7+r/6048e5;case"day":return e+r/864e5;case"hour":return 24*e+r/36e5;case"minute":return 1440*e+r/6e4;case"second":return 86400*e+r/1e3;case"millisecond":return Math.floor(864e5*e)+r;default:throw new Error("Unknown unit "+t)}},Un.asMilliseconds=Ln,Un.asSeconds=xn,Un.asMinutes=Dn,Un.asHours=Tn,Un.asDays=Yn,Un.asWeeks=An,Un.asMonths=En,Un.asYears=Sn,Un.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},Un._bubble=function(){var t,e,n,r,i,a=this._milliseconds,o=this._days,u=this._months,s=this._data;return a>=0&&o>=0&&u>=0||a<=0&&o<=0&&u<=0||(a+=864e5*bn(wn(u)+o),o=0,u=0),s.milliseconds=a%1e3,t=w(a/1e3),s.seconds=t%60,e=w(t/60),s.minutes=e%60,n=w(e/60),s.hours=n%24,o+=w(n/24),i=w(Mn(o)),u+=i,o-=bn(wn(i)),r=w(u/12),u%=12,s.days=o,s.months=u,s.years=r,this},Un.clone=function(){return Ve(this)},Un.get=function(t){return t=H(t),this.isValid()?this[t+"s"]():NaN},Un.milliseconds=On,Un.seconds=Cn,Un.minutes=Hn,Un.hours=Pn,Un.days=Fn,Un.weeks=function(){return w(this.days()/7)},Un.months=Nn,Un.years=Rn,Un.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var r=Ve(t).abs(),i=In(r.as("s")),a=In(r.as("m")),o=In(r.as("h")),u=In(r.as("d")),s=In(r.as("M")),c=In(r.as("y")),l=i<=Bn.ss&&["s",i]||i0,l[4]=n,function(t,e,n,r,i){return i.relativeTime(e||1,!!n,t,r)}.apply(null,l)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},Un.toISOString=Wn,Un.toString=Wn,Un.toJSON=Wn,Un.locale=tn,Un.localeData=nn,Un.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Wn),Un.lang=en,W("X",0,0,"unix"),W("x",0,0,"valueOf"),lt("x",at),lt("X",/[+-]?\d+(\.\d{1,3})?/),_t("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),_t("x",function(t,e,n){n._d=new Date(k(t))}),i.version="2.23.0",e=Ee,i.fn=dn,i.min=function(){return Oe("isBefore",[].slice.call(arguments,0))},i.max=function(){return Oe("isAfter",[].slice.call(arguments,0))},i.now=function(){return Date.now?Date.now():+new Date},i.utc=h,i.unix=function(t){return Ee(1e3*t)},i.months=function(t,e){return mn(t,e,"months")},i.isDate=c,i.locale=le,i.invalid=m,i.duration=Ve,i.isMoment=M,i.weekdays=function(t,e,n){return yn(t,e,n,"weekdays")},i.parseZone=function(){return Ee.apply(null,arguments).parseZone()},i.localeData=de,i.isDuration=Pe,i.monthsShort=function(t,e){return mn(t,e,"monthsShort")},i.weekdaysMin=function(t,e,n){return yn(t,e,n,"weekdaysMin")},i.defineLocale=fe,i.updateLocale=function(t,e){if(null!=e){var n,r,i=ae;null!=(r=ce(t))&&(i=r._config),e=S(i,e),(n=new j(e)).parentLocale=oe[t],oe[t]=n,le(t)}else null!=oe[t]&&(null!=oe[t].parentLocale?oe[t]=oe[t].parentLocale:null!=oe[t]&&delete oe[t]);return oe[t]},i.locales=function(){return T(oe)},i.weekdaysShort=function(t,e,n){return yn(t,e,n,"weekdaysShort")},i.normalizeUnits=H,i.relativeTimeRounding=function(t){return void 0===t?In:"function"==typeof t&&(In=t,!0)},i.relativeTimeThreshold=function(t,e){return void 0!==Bn[t]&&(void 0===e?Bn[t]:(Bn[t]=e,"s"===t&&(Bn.ss=e-1),!0))},i.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},i.prototype=dn,i.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},i}()}).call(this,n(5)(t))},function(t,e,n){"use strict";n.r(e);var r=function(t,e){return te?1:t>=e?0:NaN},i=function(t){var e;return 1===t.length&&(e=t,t=function(t,n){return r(e(t),n)}),{left:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)<0?r=a+1:i=a}return r},right:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)>0?i=a:r=a+1}return r}}};var a=i(r),o=a.right,u=a.left,s=o,c=function(t,e){null==e&&(e=l);for(var n=0,r=t.length-1,i=t[0],a=new Array(r<0?0:r);nt?1:e>=t?0:NaN},h=function(t){return null===t?NaN:+t},_=function(t,e){var n,r,i=t.length,a=0,o=-1,u=0,s=0;if(null==e)for(;++o1)return s/(a-1)},p=function(t,e){var n=_(t,e);return n?Math.sqrt(n):n},m=function(t,e){var n,r,i,a=t.length,o=-1;if(null==e){for(;++o=n)for(r=i=n;++on&&(r=n),i=n)for(r=i=n;++on&&(r=n),i0)return[t];if((r=e0)for(t=Math.ceil(t/o),e=Math.floor(e/o),a=new Array(i=Math.ceil(e-t+1));++u=0?(a>=k?10:a>=L?5:a>=x?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(a>=k?10:a>=L?5:a>=x?2:1)}function Y(t,e,n){var r=Math.abs(e-t)/Math.max(0,n),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),a=r/i;return a>=k?i*=10:a>=L?i*=5:a>=x&&(i*=2),ef;)d.pop(),--h;var _,p=new Array(h+1);for(i=0;i<=h;++i)(_=p[i]=[]).x0=i>0?d[i-1]:l,_.x1=i=1)return+n(t[r-1],r-1,t);var r,i=(r-1)*e,a=Math.floor(i),o=+n(t[a],a,t);return o+(+n(t[a+1],a+1,t)-o)*(i-a)}},j=function(t,e,n){return t=v.call(t,h).sort(r),Math.ceil((n-e)/(2*(S(t,.75)-S(t,.25))*Math.pow(t.length,-1/3)))},O=function(t,e,n){return Math.ceil((n-e)/(3.5*p(t)*Math.pow(t.length,-1/3)))},C=function(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++ar&&(r=n)}else for(;++a=n)for(r=n;++ar&&(r=n);return r},H=function(t,e){var n,r=t.length,i=r,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(r=t[i]).length;--e>=0;)n[--o]=r[e];return n},N=function(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++an&&(r=n)}else for(;++a=n)for(r=n;++an&&(r=n);return r},R=function(t,e){for(var n=e.length,r=new Array(n);n--;)r[n]=t[e[n]];return r},I=function(t,e){if(n=t.length){var n,i,a=0,o=0,u=t[o];for(null==e&&(e=r);++a=0&&(e=t.slice(n+1),t=t.slice(0,n)),t&&!r.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})),o=-1,u=a.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++o0)for(var n,r,i=new Array(n),a=0;a=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),_t.hasOwnProperty(e)?{space:_t[e],local:t}:t};var mt=function(t){var e=pt(t);return(e.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===ht&&e.documentElement.namespaceURI===ht?e.createElement(t):e.createElementNS(n,t)}})(e)};function yt(){}var gt=function(t){return null==t?yt:function(){return this.querySelector(t)}};function vt(){return[]}var bt=function(t){return null==t?vt:function(){return this.querySelectorAll(t)}},Mt=function(t){return function(){return this.matches(t)}};if("undefined"!=typeof document){var wt=document.documentElement;if(!wt.matches){var kt=wt.webkitMatchesSelector||wt.msMatchesSelector||wt.mozMatchesSelector||wt.oMatchesSelector;Mt=function(t){return function(){return kt.call(this,t)}}}}var Lt=Mt,xt=function(t){return new Array(t.length)};function Dt(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}Dt.prototype={constructor:Dt,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var Tt="$";function Yt(t,e,n,r,i,a){for(var o,u=0,s=e.length,c=a.length;ue?1:t>=e?0:NaN}var St=function(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView};function jt(t,e){return t.style.getPropertyValue(e)||St(t).getComputedStyle(t,null).getPropertyValue(e)}function Ot(t){return t.trim().split(/^|\s+/)}function Ct(t){return t.classList||new Ht(t)}function Ht(t){this._node=t,this._names=Ot(t.getAttribute("class")||"")}function Pt(t,e){for(var n=Ct(t),r=-1,i=e.length;++r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function Nt(){this.textContent=""}function Rt(){this.innerHTML=""}function It(){this.nextSibling&&this.parentNode.appendChild(this)}function Bt(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function zt(){return null}function qt(){var t=this.parentNode;t&&t.removeChild(this)}function Wt(){return this.parentNode.insertBefore(this.cloneNode(!1),this.nextSibling)}function Ut(){return this.parentNode.insertBefore(this.cloneNode(!0),this.nextSibling)}var Vt={},$t=null;"undefined"!=typeof document&&("onmouseenter"in document.documentElement||(Vt={mouseenter:"mouseover",mouseleave:"mouseout"}));function Gt(t,e,n){return t=Jt(t,e,n),function(e){var n=e.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||t.call(this,e)}}function Jt(t,e,n){return function(r){var i=$t;$t=r;try{t.call(this,this.__data__,e,n)}finally{$t=i}}}function Zt(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=M&&(M=b+1);!(v=y[M])&&++M=0;)(r=i[a])&&(o&&o!==r.nextSibling&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=Et);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof e?function(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}:function(t,e,n){return function(){this.style.setProperty(t,e,n)}})(t,e,null==n?"":n)):jt(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?function(t){return function(){delete this[t]}}:"function"==typeof e?function(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}:function(t,e){return function(){this[t]=e}})(t,e)):this.node()[t]},classed:function(t,e){var n=Ot(t+"");if(arguments.length<2){for(var r=Ct(this.node()),i=-1,a=n.length;++i=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}})}(t+""),o=a.length;if(!(arguments.length<2)){for(u=e?Kt:Zt,null==n&&(n=!1),r=0;rf}s.mouse("drag")}function p(){ie($t.view).on("mousemove.drag mouseup.drag",null),ge($t.view,n),me(),s.mouse("end")}function m(){if(i.apply(this,arguments)){var t,e,n=$t.changedTouches,r=a.apply(this,arguments),o=n.length;for(t=0;t>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):(e=Oe.exec(t))?ze(parseInt(e[1],16)):(e=Ce.exec(t))?new Ve(e[1],e[2],e[3],1):(e=He.exec(t))?new Ve(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Pe.exec(t))?qe(e[1],e[2],e[3],e[4]):(e=Fe.exec(t))?qe(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Ne.exec(t))?Ge(e[1],e[2]/100,e[3]/100,1):(e=Re.exec(t))?Ge(e[1],e[2]/100,e[3]/100,e[4]):Ie.hasOwnProperty(t)?ze(Ie[t]):"transparent"===t?new Ve(NaN,NaN,NaN,0):null}function ze(t){return new Ve(t>>16&255,t>>8&255,255&t,1)}function qe(t,e,n,r){return r<=0&&(t=e=n=NaN),new Ve(t,e,n,r)}function We(t){return t instanceof Ye||(t=Be(t)),t?new Ve((t=t.rgb()).r,t.g,t.b,t.opacity):new Ve}function Ue(t,e,n,r){return 1===arguments.length?We(t):new Ve(t,e,n,null==r?1:r)}function Ve(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function $e(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function Ge(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Ze(t,e,n,r)}function Je(t,e,n,r){return 1===arguments.length?function(t){if(t instanceof Ze)return new Ze(t.h,t.s,t.l,t.opacity);if(t instanceof Ye||(t=Be(t)),!t)return new Ze;if(t instanceof Ze)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,u=a-i,s=(a+i)/2;return u?(o=e===a?(n-r)/u+6*(n0&&s<1?0:o,new Ze(o,u,s,t.opacity)}(t):new Ze(t,e,n,null==r?1:r)}function Ze(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Ke(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}De(Ye,Be,{displayable:function(){return this.rgb().displayable()},hex:function(){return this.rgb().hex()},toString:function(){return this.rgb()+""}}),De(Ve,Ue,Te(Ye,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Ve(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Ve(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},hex:function(){return"#"+$e(this.r)+$e(this.g)+$e(this.b)},toString:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}})),De(Ze,Je,Te(Ye,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Ze(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Ze(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Ve(Ke(t>=240?t-240:t+120,i,r),Ke(t,i,r),Ke(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var Xe=Math.PI/180,Qe=180/Math.PI,tn=.96422,en=1,nn=.82521,rn=4/29,an=6/29,on=3*an*an,un=an*an*an;function sn(t){if(t instanceof fn)return new fn(t.l,t.a,t.b,t.opacity);if(t instanceof vn){if(isNaN(t.h))return new fn(t.l,0,0,t.opacity);var e=t.h*Xe;return new fn(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}t instanceof Ve||(t=We(t));var n,r,i=pn(t.r),a=pn(t.g),o=pn(t.b),u=dn((.2225045*i+.7168786*a+.0606169*o)/en);return i===a&&a===o?n=r=u:(n=dn((.4360747*i+.3850649*a+.1430804*o)/tn),r=dn((.0139322*i+.0971045*a+.7141733*o)/nn)),new fn(116*u-16,500*(n-u),200*(u-r),t.opacity)}function cn(t,e){return new fn(t,0,0,null==e?1:e)}function ln(t,e,n,r){return 1===arguments.length?sn(t):new fn(t,e,n,null==r?1:r)}function fn(t,e,n,r){this.l=+t,this.a=+e,this.b=+n,this.opacity=+r}function dn(t){return t>un?Math.pow(t,1/3):t/on+rn}function hn(t){return t>an?t*t*t:on*(t-rn)}function _n(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function pn(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function mn(t){if(t instanceof vn)return new vn(t.h,t.c,t.l,t.opacity);if(t instanceof fn||(t=sn(t)),0===t.a&&0===t.b)return new vn(NaN,0,t.l,t.opacity);var e=Math.atan2(t.b,t.a)*Qe;return new vn(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function yn(t,e,n,r){return 1===arguments.length?mn(t):new vn(n,e,t,null==r?1:r)}function gn(t,e,n,r){return 1===arguments.length?mn(t):new vn(t,e,n,null==r?1:r)}function vn(t,e,n,r){this.h=+t,this.c=+e,this.l=+n,this.opacity=+r}De(fn,ln,Te(Ye,{brighter:function(t){return new fn(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new fn(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return new Ve(_n(3.1338561*(e=tn*hn(e))-1.6168667*(t=en*hn(t))-.4906146*(n=nn*hn(n))),_n(-.9787684*e+1.9161415*t+.033454*n),_n(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}})),De(vn,gn,Te(Ye,{brighter:function(t){return new vn(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new vn(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return sn(this).rgb()}}));var bn=-.29227,Mn=-.90649,wn=1.97294,kn=wn*Mn,Ln=1.78277*wn,xn=1.78277*bn- -.14861*Mn;function Dn(t,e,n,r){return 1===arguments.length?function(t){if(t instanceof Tn)return new Tn(t.h,t.s,t.l,t.opacity);t instanceof Ve||(t=We(t));var e=t.r/255,n=t.g/255,r=t.b/255,i=(xn*r+kn*e-Ln*n)/(xn+kn-Ln),a=r-i,o=(wn*(n-i)-bn*a)/Mn,u=Math.sqrt(o*o+a*a)/(wn*i*(1-i)),s=u?Math.atan2(o,a)*Qe-120:NaN;return new Tn(s<0?s+360:s,u,i,t.opacity)}(t):new Tn(t,e,n,null==r?1:r)}function Tn(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Yn(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}De(Tn,Dn,Te(Ye,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Tn(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Tn(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*Xe,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),r=Math.cos(t),i=Math.sin(t);return new Ve(255*(e+n*(-.14861*r+1.78277*i)),255*(e+n*(bn*r+Mn*i)),255*(e+n*(wn*r)),this.opacity)}}));var An=function(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,u=r180||n<-180?n-360*Math.round(n/360):n):Sn(isNaN(t)?e:t)}function Cn(t){return 1==(t=+t)?Hn:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):Sn(isNaN(e)?n:e)}}function Hn(t,e){var n=e-t;return n?jn(t,n):Sn(isNaN(t)?e:t)}var Pn=function t(e){var n=Cn(e);function r(t,e){var r=n((t=Ue(t)).r,(e=Ue(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=Hn(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function Fn(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),u=new Array(i);for(n=0;na&&(i=e.slice(a,i),u[o]?u[o]+=i:u[++o]=i),(n=n[0])===(r=r[0])?u[o]?u[o]+=r:u[++o]=r:(u[++o]=null,s.push({i:o,x:zn(n,r)})),a=Un.lastIndex;return a180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:zn(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,u,s),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:zn(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,u,s),function(t,e,n,r,a,o){if(t!==n||e!==r){var u=a.push(i(a)+"scale(",null,",",null,")");o.push({i:u-4,x:zn(t,n)},{i:u-2,x:zn(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,u,s),a=o=null,function(t){for(var e,n=-1,r=s.length;++n=0&&e._call.call(null,t),e=e._next;--Lr}function Nr(){Ar=(Yr=Sr.now())+Er,Lr=xr=0;try{Fr()}finally{Lr=0,function(){var t,e,n=Mr,r=1/0;for(;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Mr=e);wr=t,Ir(r)}(),Ar=0}}function Rr(){var t=Sr.now(),e=t-Yr;e>Tr&&(Er-=e,Yr=t)}function Ir(t){Lr||(xr&&(xr=clearTimeout(xr)),t-Ar>24?(t<1/0&&(xr=setTimeout(Nr,t-Sr.now()-Er)),Dr&&(Dr=clearInterval(Dr))):(Dr||(Yr=Sr.now(),Dr=setInterval(Rr,Tr)),Lr=1,jr(Nr)))}Hr.prototype=Pr.prototype={constructor:Hr,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?Or():+n)+(null==e?0:+e),this._next||wr===this||(wr?wr._next=this:Mr=this,wr=this),this._call=t,this._time=n,Ir()},stop:function(){this._call&&(this._call=null,this._time=1/0,Ir())}};var Br=function(t,e,n){var r=new Hr;return e=null==e?0:+e,r.restart(function(n){r.stop(),t(n+e)},e,n),r},zr=function(t,e,n){var r=new Hr,i=e;return null==e?(r.restart(t,e,n),r):(e=+e,n=null==n?Or():+n,r.restart(function a(o){o+=i,r.restart(a,i+=e,n),t(o)},e,n),r)},qr=dt("start","end","interrupt"),Wr=[],Ur=0,Vr=1,$r=2,Gr=3,Jr=4,Zr=5,Kr=6,Xr=function(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(s){var c,l,f,d;if(n.state!==Vr)return u();for(c in i)if((d=i[c]).name===n.name){if(d.state===Gr)return Br(a);d.state===Jr?(d.state=Kr,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete i[c]):+cUr)throw new Error("too late; already scheduled");return n}function ti(t,e){var n=ei(t,e);if(n.state>$r)throw new Error("too late; already started");return n}function ei(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}var ni=function(t,e){var n,r,i,a=t.__transition,o=!0;if(a){for(i in e=null==e?null:e+"",a)(n=a[i]).name===e?(r=n.state>$r&&n.state=0&&(t=t.slice(0,e)),!t||"start"===t})}(e)?Qr:ti;return function(){var o=a(this,t),u=o.on;u!==r&&(i=(r=u).copy()).on(e,n),o.on=i}}(n,t,e))},attr:function(t,e){var n=pt(t),r="transform"===n?or:ii;return this.attrTween(t,"function"==typeof e?(n.local?function(t,e,n){var r,i,a;return function(){var o,u=n(this);if(null!=u)return(o=this.getAttributeNS(t.space,t.local))===u?null:o===r&&u===i?a:a=e(r=o,i=u);this.removeAttributeNS(t.space,t.local)}}:function(t,e,n){var r,i,a;return function(){var o,u=n(this);if(null!=u)return(o=this.getAttribute(t))===u?null:o===r&&u===i?a:a=e(r=o,i=u);this.removeAttribute(t)}})(n,r,ri(this,"attr."+t,e)):null==e?(n.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(n):(n.local?function(t,e,n){var r,i;return function(){var a=this.getAttributeNS(t.space,t.local);return a===n?null:a===r?i:i=e(r=a,n)}}:function(t,e,n){var r,i;return function(){var a=this.getAttribute(t);return a===n?null:a===r?i:i=e(r=a,n)}})(n,r,e+""))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var r=pt(t);return this.tween(n,(r.local?function(t,e){function n(){var n=this,r=e.apply(n,arguments);return r&&function(e){n.setAttributeNS(t.space,t.local,r(e))}}return n._value=e,n}:function(t,e){function n(){var n=this,r=e.apply(n,arguments);return r&&function(e){n.setAttribute(t,r(e))}}return n._value=e,n})(r,e))},style:function(t,e,n){var r="transform"==(t+="")?ar:ii;return null==e?this.styleTween(t,function(t,e){var n,r,i;return function(){var a=jt(this,t),o=(this.style.removeProperty(t),jt(this,t));return a===o?null:a===n&&o===r?i:i=e(n=a,r=o)}}(t,r)).on("end.style."+t,function(t){return function(){this.style.removeProperty(t)}}(t)):this.styleTween(t,"function"==typeof e?function(t,e,n){var r,i,a;return function(){var o=jt(this,t),u=n(this);return null==u&&(this.style.removeProperty(t),u=jt(this,t)),o===u?null:o===r&&u===i?a:a=e(r=o,i=u)}}(t,r,ri(this,"style."+t,e)):function(t,e,n){var r,i;return function(){var a=jt(this,t);return a===n?null:a===r?i:i=e(r=a,n)}}(t,r,e+""),n)},styleTween:function(t,e,n){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==e)return this.tween(r,null);if("function"!=typeof e)throw new Error;return this.tween(r,function(t,e,n){function r(){var r=this,i=e.apply(r,arguments);return i&&function(e){r.style.setProperty(t,i(e),n)}}return r._value=e,r}(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(ri(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},remove:function(){return this.on("end.remove",(t=this._id,function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}));var t},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var r,i=ei(this.node(),n).tween,a=0,o=i.length;aVr&&n.name===e)return new ui([[t]],ta,e,+r);return null},na=function(t){return function(){return t}},ra=function(t,e,n){this.target=t,this.type=e,this.selection=n};function ia(){$t.stopImmediatePropagation()}var aa=function(){$t.preventDefault(),$t.stopImmediatePropagation()},oa={name:"drag"},ua={name:"space"},sa={name:"handle"},ca={name:"center"},la={name:"x",handles:["e","w"].map(ga),input:function(t,e){return t&&[[t[0],e[0][1]],[t[1],e[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},fa={name:"y",handles:["n","s"].map(ga),input:function(t,e){return t&&[[e[0][0],t[0]],[e[1][0],t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},da={name:"xy",handles:["n","e","s","w","nw","ne","se","sw"].map(ga),input:function(t){return t},output:function(t){return t}},ha={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},_a={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},pa={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},ma={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},ya={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function ga(t){return{type:t}}function va(){return!$t.button}function ba(){var t=this.ownerSVGElement||this;return[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function Ma(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function wa(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function ka(t){var e=t.__brush;return e?e.dim.output(e.selection):null}function La(){return Ta(la)}function xa(){return Ta(fa)}var Da=function(){return Ta(da)};function Ta(t){var e,n=ba,r=va,i=dt(o,"start","brush","end"),a=6;function o(e){var n=e.property("__brush",f).selectAll(".overlay").data([ga("overlay")]);n.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",ha.overlay).merge(n).each(function(){var t=Ma(this).extent;ie(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])}),e.selectAll(".selection").data([ga("selection")]).enter().append("rect").attr("class","selection").attr("cursor",ha.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=e.selectAll(".handle").data(t.handles,function(t){return t.type});r.exit().remove(),r.enter().append("rect").attr("class",function(t){return"handle handle--"+t.type}).attr("cursor",function(t){return ha[t.type]}),e.each(u).attr("fill","none").attr("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush touchstart.brush",l)}function u(){var t=ie(this),e=Ma(this).selection;e?(t.selectAll(".selection").style("display",null).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1]),t.selectAll(".handle").style("display",null).attr("x",function(t){return"e"===t.type[t.type.length-1]?e[1][0]-a/2:e[0][0]-a/2}).attr("y",function(t){return"s"===t.type[0]?e[1][1]-a/2:e[0][1]-a/2}).attr("width",function(t){return"n"===t.type||"s"===t.type?e[1][0]-e[0][0]+a:a}).attr("height",function(t){return"e"===t.type||"w"===t.type?e[1][1]-e[0][1]+a:a})):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function s(t,e){return t.__brush.emitter||new c(t,e)}function c(t,e){this.that=t,this.args=e,this.state=t.__brush,this.active=0}function l(){if($t.touches){if($t.changedTouches.length<$t.touches.length)return aa()}else if(e)return;if(r.apply(this,arguments)){var n,i,a,o,c,l,f,d,h,_,p,m,y,g=this,v=$t.target.__data__.type,b="selection"===($t.metaKey?v="overlay":v)?oa:$t.altKey?ca:sa,M=t===fa?null:ma[v],w=t===la?null:ya[v],k=Ma(g),L=k.extent,x=k.selection,D=L[0][0],T=L[0][1],Y=L[1][0],A=L[1][1],E=M&&w&&$t.shiftKey,S=fe(g),j=S,O=s(g,arguments).beforestart();"overlay"===v?k.selection=x=[[n=t===fa?D:S[0],a=t===la?T:S[1]],[c=t===fa?Y:n,f=t===la?A:a]]:(n=x[0][0],a=x[0][1],c=x[1][0],f=x[1][1]),i=n,o=a,l=c,d=f;var C=ie(g).attr("pointer-events","none"),H=C.selectAll(".overlay").attr("cursor",ha[v]);if($t.touches)C.on("touchmove.brush",F,!0).on("touchend.brush touchcancel.brush",R,!0);else{var P=ie($t.view).on("keydown.brush",function(){switch($t.keyCode){case 16:E=M&&w;break;case 18:b===sa&&(M&&(c=l-h*M,n=i+h*M),w&&(f=d-_*w,a=o+_*w),b=ca,N());break;case 32:b!==sa&&b!==ca||(M<0?c=l-h:M>0&&(n=i-h),w<0?f=d-_:w>0&&(a=o-_),b=ua,H.attr("cursor",ha.selection),N());break;default:return}aa()},!0).on("keyup.brush",function(){switch($t.keyCode){case 16:E&&(m=y=E=!1,N());break;case 18:b===ca&&(M<0?c=l:M>0&&(n=i),w<0?f=d:w>0&&(a=o),b=sa,N());break;case 32:b===ua&&($t.altKey?(M&&(c=l-h*M,n=i+h*M),w&&(f=d-_*w,a=o+_*w),b=ca):(M<0?c=l:M>0&&(n=i),w<0?f=d:w>0&&(a=o),b=sa),H.attr("cursor",ha[v]),N());break;default:return}aa()},!0).on("mousemove.brush",F,!0).on("mouseup.brush",R,!0);ye($t.view)}ia(),ni(g),u.call(g),O.start()}function F(){var t=fe(g);!E||m||y||(Math.abs(t[0]-j[0])>Math.abs(t[1]-j[1])?y=!0:m=!0),j=t,p=!0,aa(),N()}function N(){var t;switch(h=j[0]-S[0],_=j[1]-S[1],b){case ua:case oa:M&&(h=Math.max(D-n,Math.min(Y-c,h)),i=n+h,l=c+h),w&&(_=Math.max(T-a,Math.min(A-f,_)),o=a+_,d=f+_);break;case sa:M<0?(h=Math.max(D-n,Math.min(Y-n,h)),i=n+h,l=c):M>0&&(h=Math.max(D-c,Math.min(Y-c,h)),i=n,l=c+h),w<0?(_=Math.max(T-a,Math.min(A-a,_)),o=a+_,d=f):w>0&&(_=Math.max(T-f,Math.min(A-f,_)),o=a,d=f+_);break;case ca:M&&(i=Math.max(D,Math.min(Y,n-h*M)),l=Math.max(D,Math.min(Y,c+h*M))),w&&(o=Math.max(T,Math.min(A,a-_*w)),d=Math.max(T,Math.min(A,f+_*w)))}l1e-6)if(Math.abs(l*u-s*c)>1e-6&&i){var d=n-a,h=r-o,_=u*u+s*s,p=d*d+h*h,m=Math.sqrt(_),y=Math.sqrt(f),g=i*Math.tan((Fa-Math.acos((_+f-p)/(2*m*y)))/2),v=g/y,b=g/m;Math.abs(v-1)>1e-6&&(this._+="L"+(t+v*c)+","+(e+v*l)),this._+="A"+i+","+i+",0,0,"+ +(l*d>c*h)+","+(this._x1=t+b*u)+","+(this._y1=e+b*s)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,r,i,a){t=+t,e=+e;var o=(n=+n)*Math.cos(r),u=n*Math.sin(r),s=t+o,c=e+u,l=1^a,f=a?r-i:i-r;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+s+","+c:(Math.abs(this._x1-s)>1e-6||Math.abs(this._y1-c)>1e-6)&&(this._+="L"+s+","+c),n&&(f<0&&(f=f%Na+Na),f>Ra?this._+="A"+n+","+n+",0,1,"+l+","+(t-o)+","+(e-u)+"A"+n+","+n+",0,1,"+l+","+(this._x1=s)+","+(this._y1=c):f>1e-6&&(this._+="A"+n+","+n+",0,"+ +(f>=Fa)+","+l+","+(this._x1=t+n*Math.cos(i))+","+(this._y1=e+n*Math.sin(i))))},rect:function(t,e,n,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}};var za=Ba;function qa(t){return t.source}function Wa(t){return t.target}function Ua(t){return t.radius}function Va(t){return t.startAngle}function $a(t){return t.endAngle}var Ga=function(){var t=qa,e=Wa,n=Ua,r=Va,i=$a,a=null;function o(){var o,u=Ha.call(arguments),s=t.apply(this,u),c=e.apply(this,u),l=+n.apply(this,(u[0]=s,u)),f=r.apply(this,u)-Sa,d=i.apply(this,u)-Sa,h=l*Ya(f),_=l*Aa(f),p=+n.apply(this,(u[0]=c,u)),m=r.apply(this,u)-Sa,y=i.apply(this,u)-Sa;if(a||(a=o=za()),a.moveTo(h,_),a.arc(0,0,l,f,d),f===m&&d===y||(a.quadraticCurveTo(0,0,p*Ya(m),p*Aa(m)),a.arc(0,0,p,m,y)),a.quadraticCurveTo(0,0,h,_),a.closePath(),o)return a=null,o+""||null}return o.radius=function(t){return arguments.length?(n="function"==typeof t?t:Pa(+t),o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Pa(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:Pa(+t),o):i},o.source=function(e){return arguments.length?(t=e,o):t},o.target=function(t){return arguments.length?(e=t,o):e},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o};function Ja(){}function Za(t,e){var n=new Ja;if(t instanceof Ja)t.each(function(t,e){n.set(e,t)});else if(Array.isArray(t)){var r,i=-1,a=t.length;if(null==e)for(;++i=r.length)return null!=t&&n.sort(t),null!=e?e(n):n;for(var s,c,l,f=-1,d=n.length,h=r[i++],_=Ka(),p=o();++fr.length)return n;var o,u=i[a-1];return null!=e&&a>=r.length?o=n.entries():(o=[],n.each(function(e,n){o.push({key:n,values:t(e,a)})})),null!=u?o.sort(function(t,e){return u(t.key,e.key)}):o}(a(t,0,eo,no),0)},key:function(t){return r.push(t),n},sortKeys:function(t){return i[r.length-1]=t,n},sortValues:function(e){return t=e,n},rollup:function(t){return e=t,n}}};function Qa(){return{}}function to(t,e,n){t[e]=n}function eo(){return Ka()}function no(t,e,n){t.set(e,n)}function ro(){}var io=Ka.prototype;function ao(t,e){var n=new ro;if(t instanceof ro)t.each(function(t){n.add(t)});else if(t){var r=-1,i=t.length;if(null==e)for(;++rr!=h>r&&n<(d-c)*(r-l)/(h-l)+c&&(i=-i)}return i}function yo(t,e,n){var r,i,a,o;return function(t,e,n){return(e[0]-t[0])*(n[1]-t[1])==(n[0]-t[0])*(e[1]-t[1])}(t,e,n)&&(i=t[r=+(t[0]===e[0])],a=n[r],o=e[r],i<=a&&a<=o||o<=a&&a<=i)}var go=function(){},vo=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]],bo=function(){var t=1,e=1,n=A,r=u;function i(t){var e=n(t);if(Array.isArray(e))e=e.slice().sort(fo);else{var r=m(t),i=r[0],o=r[1];e=Y(i,o,e),e=w(Math.floor(i/e)*e,Math.floor(o/e)*e,e)}return e.map(function(e){return a(t,e)})}function a(n,i){var a=[],u=[];return function(n,r,i){var a,u,s,c,l,f,d=new Array,h=new Array;a=u=-1,c=n[0]>=r,vo[c<<1].forEach(_);for(;++a=r,vo[s|c<<1].forEach(_);vo[c<<0].forEach(_);for(;++u=r,l=n[u*t]>=r,vo[c<<1|l<<2].forEach(_);++a=r,f=l,l=n[u*t+a+1]>=r,vo[s|c<<1|l<<2|f<<3].forEach(_);vo[c|l<<3].forEach(_)}a=-1,l=n[u*t]>=r,vo[l<<2].forEach(_);for(;++a=r,vo[l<<2|f<<3].forEach(_);function _(t){var e,n,r=[t[0][0]+a,t[0][1]+u],s=[t[1][0]+a,t[1][1]+u],c=o(r),l=o(s);(e=h[c])?(n=d[l])?(delete h[e.end],delete d[n.start],e===n?(e.ring.push(s),i(e.ring)):d[e.start]=h[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete h[e.end],e.ring.push(s),h[e.end=l]=e):(e=d[l])?(n=h[c])?(delete d[e.start],delete h[n.end],e===n?(e.ring.push(s),i(e.ring)):d[n.start]=h[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete d[e.start],e.ring.unshift(r),d[e.start=c]=e):d[c]=h[l]={start:c,end:l,ring:[r,s]}}vo[l<<3].forEach(_)}(n,i,function(t){r(t,n,i),ho(t)>0?a.push([t]):u.push(t)}),u.forEach(function(t){for(var e,n=0,r=a.length;n0&&o0&&u0&&a>0))throw new Error("invalid size");return t=r,e=a,i},i.thresholds=function(t){return arguments.length?(n="function"==typeof t?t:Array.isArray(t)?_o(lo.call(t)):_o(t),i):n},i.smooth=function(t){return arguments.length?(r=t?u:go,i):r===u},i};function Mo(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(u>=a&&(s-=t.data[u-a+o*r]),e.data[u-n+o*r]=s/Math.min(u+1,r-1+a-u,a))}function wo(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(u>=a&&(s-=t.data[o+(u-a)*r]),e.data[o+(u-n)*r]=s/Math.min(u+1,i-1+a-u,a))}function ko(t){return t[0]}function Lo(t){return t[1]}function xo(){return 1}var Do=function(){var t=ko,e=Lo,n=xo,r=960,i=500,a=20,o=2,u=3*a,s=r+2*u>>o,c=i+2*u>>o,l=_o(20);function f(r){var i=new Float32Array(s*c),f=new Float32Array(s*c);r.forEach(function(r,a,l){var f=+t(r,a,l)+u>>o,d=+e(r,a,l)+u>>o,h=+n(r,a,l);f>=0&&f=0&&d>o),wo({width:s,height:c,data:f},{width:s,height:c,data:i},a>>o),Mo({width:s,height:c,data:i},{width:s,height:c,data:f},a>>o),wo({width:s,height:c,data:f},{width:s,height:c,data:i},a>>o),Mo({width:s,height:c,data:i},{width:s,height:c,data:f},a>>o),wo({width:s,height:c,data:f},{width:s,height:c,data:i},a>>o);var h=l(i);if(!Array.isArray(h)){var _=C(i);h=Y(0,_,h),(h=w(0,Math.floor(_/h)*h,h)).shift()}return bo().thresholds(h).size([s,c])(i).map(d)}function d(t){return t.value*=Math.pow(2,-2*o),t.coordinates.forEach(h),t}function h(t){t.forEach(_)}function _(t){t.forEach(p)}function p(t){t[0]=t[0]*Math.pow(2,o)-u,t[1]=t[1]*Math.pow(2,o)-u}function m(){return s=r+2*(u=3*a)>>o,c=i+2*u>>o,f}return f.x=function(e){return arguments.length?(t="function"==typeof e?e:_o(+e),f):t},f.y=function(t){return arguments.length?(e="function"==typeof t?t:_o(+t),f):e},f.weight=function(t){return arguments.length?(n="function"==typeof t?t:_o(+t),f):n},f.size=function(t){if(!arguments.length)return[r,i];var e=Math.ceil(t[0]),n=Math.ceil(t[1]);if(!(e>=0||e>=0))throw new Error("invalid size");return r=e,i=n,m()},f.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return o=Math.floor(Math.log(t)/Math.LN2),m()},f.thresholds=function(t){return arguments.length?(l="function"==typeof t?t:Array.isArray(t)?_o(lo.call(t)):_o(t),f):l},f.bandwidth=function(t){if(!arguments.length)return Math.sqrt(a*(a+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return a=Math.round((Math.sqrt(4*t*t+1)-1)/2),m()},f},To={},Yo={},Ao=34,Eo=10,So=13;function jo(t){return new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+"]"}).join(",")+"}")}var Oo=function(t){var e=new RegExp('["'+t+"\n\r]"),n=t.charCodeAt(0);function r(t,e){var r,i=[],a=t.length,o=0,u=0,s=a<=0,c=!1;function l(){if(s)return Yo;if(c)return c=!1,To;var e,r,i=o;if(t.charCodeAt(i)===Ao){for(;o++=a?s=!0:(r=t.charCodeAt(o++))===Eo?c=!0:r===So&&(c=!0,t.charCodeAt(o)===Eo&&++o),t.slice(i+1,e-1).replace(/""/g,'"')}for(;o=(a=(p+y)/2))?p=a:y=a,(l=n>=(o=(m+g)/2))?m=o:g=o,i=h,!(h=h[f=l<<1|c]))return i[f]=_,t;if(u=+t._x.call(null,h.data),s=+t._y.call(null,h.data),e===u&&n===s)return _.next=h,i?i[f]=_:t._root=_,t;do{i=i?i[f]=new Array(4):t._root=new Array(4),(c=e>=(a=(p+y)/2))?p=a:y=a,(l=n>=(o=(m+g)/2))?m=o:g=o}while((f=l<<1|c)==(d=(s>=o)<<1|u>=a));return i[d]=h,i[f]=_,t}var fu=function(t,e,n,r,i){this.node=t,this.x0=e,this.y0=n,this.x1=r,this.y1=i};function du(t){return t[0]}function hu(t){return t[1]}function _u(t,e,n){var r=new pu(null==e?du:e,null==n?hu:n,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function pu(t,e,n,r,i,a){this._x=t,this._y=e,this._x0=n,this._y0=r,this._x1=i,this._y1=a,this._root=void 0}function mu(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var yu=_u.prototype=pu.prototype;function gu(t){return t.x+t.vx}function vu(t){return t.y+t.vy}yu.copy=function(){var t,e,n=new pu(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return n;if(!r.length)return n._root=mu(r),n;for(t=[{source:r,target:n._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(e=r.source[i])&&(e.length?t.push({source:e,target:r.target[i]=new Array(4)}):r.target[i]=mu(e));return n},yu.add=function(t){var e=+this._x.call(null,t),n=+this._y.call(null,t);return lu(this.cover(e,n),e,n,t)},yu.addAll=function(t){var e,n,r,i,a=t.length,o=new Array(a),u=new Array(a),s=1/0,c=1/0,l=-1/0,f=-1/0;for(n=0;nl&&(l=r),if&&(f=i));for(lt||t>i||r>e||e>a))return this;var o,u,s=i-n,c=this._root;switch(u=(e<(r+a)/2)<<1|t<(n+i)/2){case 0:do{(o=new Array(4))[u]=c,c=o}while(a=r+(s*=2),t>(i=n+s)||e>a);break;case 1:do{(o=new Array(4))[u]=c,c=o}while(a=r+(s*=2),(n=i-s)>t||e>a);break;case 2:do{(o=new Array(4))[u]=c,c=o}while(r=a-(s*=2),t>(i=n+s)||r>e);break;case 3:do{(o=new Array(4))[u]=c,c=o}while(r=a-(s*=2),(n=i-s)>t||r>e)}this._root&&this._root.length&&(this._root=c)}return this._x0=n,this._y0=r,this._x1=i,this._y1=a,this},yu.data=function(){var t=[];return this.visit(function(e){if(!e.length)do{t.push(e.data)}while(e=e.next)}),t},yu.extent=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},yu.find=function(t,e,n){var r,i,a,o,u,s,c,l=this._x0,f=this._y0,d=this._x1,h=this._y1,_=[],p=this._root;for(p&&_.push(new fu(p,l,f,d,h)),null==n?n=1/0:(l=t-n,f=e-n,d=t+n,h=e+n,n*=n);s=_.pop();)if(!(!(p=s.node)||(i=s.x0)>d||(a=s.y0)>h||(o=s.x1)=y)<<1|t>=m)&&(s=_[_.length-1],_[_.length-1]=_[_.length-1-c],_[_.length-1-c]=s)}else{var g=t-+this._x.call(null,p.data),v=e-+this._y.call(null,p.data),b=g*g+v*v;if(b=(u=(_+m)/2))?_=u:m=u,(l=o>=(s=(p+y)/2))?p=s:y=s,e=h,!(h=h[f=l<<1|c]))return this;if(!h.length)break;(e[f+1&3]||e[f+2&3]||e[f+3&3])&&(n=e,d=f)}for(;h.data!==t;)if(r=h,!(h=h.next))return this;return(i=h.next)&&delete h.next,r?(i?r.next=i:delete r.next,this):e?(i?e[f]=i:delete e[f],(h=e[0]||e[1]||e[2]||e[3])&&h===(e[3]||e[2]||e[1]||e[0])&&!h.length&&(n?n[d]=h:this._root=h),this):(this._root=i,this)},yu.removeAll=function(t){for(var e=0,n=t.length;es+h||ic+h||au.index){var _=s-o.x-o.vx,p=c-o.y-o.vy,m=_*_+p*p;mt.r&&(t.r=t[e].r)}function u(){if(e){var r,i,a=e.length;for(n=new Array(a),r=0;r1?(null==n?u.remove(t):u.set(t,h(n)),e):u.get(t)},find:function(e,n,r){var i,a,o,u,s,c=0,l=t.length;for(null==r?r=1/0:r*=r,c=0;c1?(c.on(t,n),e):c.on(t)}}},Au=function(){var t,e,n,r,i=su(-30),a=1,o=1/0,u=.81;function s(r){var i,a=t.length,o=_u(t,Lu,xu).visitAfter(l);for(n=r,i=0;i=o)){(t.data!==e||t.next)&&(0===l&&(h+=(l=cu())*l),0===f&&(h+=(f=cu())*f),h1?r[0]+r.slice(2):r,+t.slice(n+1)]},Cu=function(t){return(t=Ou(Math.abs(t)))?t[1]:NaN},Hu=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Pu(t){return new Fu(t)}function Fu(t){if(!(e=Hu.exec(t)))throw new Error("invalid format: "+t);var e;this.fill=e[1]||" ",this.align=e[2]||">",this.sign=e[3]||"-",this.symbol=e[4]||"",this.zero=!!e[5],this.width=e[6]&&+e[6],this.comma=!!e[7],this.precision=e[8]&&+e[8].slice(1),this.trim=!!e[9],this.type=e[10]||""}Pu.prototype=Fu.prototype,Fu.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var Nu,Ru,Iu,Bu,zu=function(t){t:for(var e,n=t.length,r=1,i=-1;r0){if(!+t[r])break t;i=0}}return i>0?t.slice(0,i)+t.slice(e+1):t},qu=function(t,e){var n=Ou(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")},Wu={"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return qu(100*t,e)},r:qu,s:function(t,e){var n=Ou(t,e);if(!n)return t+"";var r=n[0],i=n[1],a=i-(Nu=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,o=r.length;return a===o?r:a>o?r+new Array(a-o+1).join("0"):a>0?r.slice(0,a)+"."+r.slice(a):"0."+new Array(1-a).join("0")+Ou(t,Math.max(0,e+a-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}},Uu=function(t){return t},Vu=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"],$u=function(t){var e,n,r=t.grouping&&t.thousands?(e=t.grouping,n=t.thousands,function(t,r){for(var i=t.length,a=[],o=0,u=e[0],s=0;i>0&&u>0&&(s+u+1>r&&(u=Math.max(1,r-s)),a.push(t.substring(i-=u,i+u)),!((s+=u+1)>r));)u=e[o=(o+1)%e.length];return a.reverse().join(n)}):Uu,i=t.currency,a=t.decimal,o=t.numerals?function(t){return function(e){return e.replace(/[0-9]/g,function(e){return t[+e]})}}(t.numerals):Uu,u=t.percent||"%";function s(t){var e=(t=Pu(t)).fill,n=t.align,s=t.sign,c=t.symbol,l=t.zero,f=t.width,d=t.comma,h=t.precision,_=t.trim,p=t.type;"n"===p?(d=!0,p="g"):Wu[p]||(null==h&&(h=12),_=!0,p="g"),(l||"0"===e&&"="===n)&&(l=!0,e="0",n="=");var m="$"===c?i[0]:"#"===c&&/[boxX]/.test(p)?"0"+p.toLowerCase():"",y="$"===c?i[1]:/[%p]/.test(p)?u:"",g=Wu[p],v=/[defgprs%]/.test(p);function b(t){var i,u,c,b=m,M=y;if("c"===p)M=g(t)+M,t="";else{var w=(t=+t)<0;if(t=g(Math.abs(t),h),_&&(t=zu(t)),w&&0==+t&&(w=!1),b=(w?"("===s?s:"-":"-"===s||"("===s?"":s)+b,M=("s"===p?Vu[8+Nu/3]:"")+M+(w&&"("===s?")":""),v)for(i=-1,u=t.length;++i(c=t.charCodeAt(i))||c>57){M=(46===c?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}d&&!l&&(t=r(t,1/0));var k=b.length+t.length+M.length,L=k>1)+b+t+M+L.slice(k);break;default:t=L+b+t+M}return o(t)}return h=null==h?6:/[gprs]/.test(p)?Math.max(1,Math.min(21,h)):Math.max(0,Math.min(20,h)),b.toString=function(){return t+""},b}return{format:s,formatPrefix:function(t,e){var n=s(((t=Pu(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Cu(e)/3))),i=Math.pow(10,-r),a=Vu[8+r/3];return function(t){return n(i*t)+a}}}};function Gu(t){return Ru=$u(t),Iu=Ru.format,Bu=Ru.formatPrefix,Ru}Gu({decimal:".",thousands:",",grouping:[3],currency:["$",""]});var Ju=function(t){return Math.max(0,-Cu(Math.abs(t)))},Zu=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Cu(e)/3)))-Cu(Math.abs(t)))},Ku=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Cu(e)-Cu(t))+1},Xu=function(){return new Qu};function Qu(){this.reset()}Qu.prototype={constructor:Qu,reset:function(){this.s=this.t=0},add:function(t){es(ts,t,this.t),es(this,ts.s,this.s),this.s?this.t+=ts.t:this.s=ts.t},valueOf:function(){return this.s}};var ts=new Qu;function es(t,e,n){var r=t.s=e+n,i=r-e,a=r-i;t.t=e-a+(n-i)}var ns=1e-6,rs=Math.PI,is=rs/2,as=rs/4,os=2*rs,us=180/rs,ss=rs/180,cs=Math.abs,ls=Math.atan,fs=Math.atan2,ds=Math.cos,hs=Math.ceil,_s=Math.exp,ps=(Math.floor,Math.log),ms=Math.pow,ys=Math.sin,gs=Math.sign||function(t){return t>0?1:t<0?-1:0},vs=Math.sqrt,bs=Math.tan;function Ms(t){return t>1?0:t<-1?rs:Math.acos(t)}function ws(t){return t>1?is:t<-1?-is:Math.asin(t)}function ks(t){return(t=ys(t/2))*t}function Ls(){}function xs(t,e){t&&Ts.hasOwnProperty(t.type)&&Ts[t.type](t,e)}var Ds={Feature:function(t,e){xs(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r=0?1:-1,i=r*n,a=ds(e=(e*=ss)/2+as),o=ys(e),u=Cs*o,s=Os*a+u*ds(i),c=u*r*ys(i);Ps.add(fs(c,s)),js=t,Os=a,Cs=o}var qs=function(t){return Fs.reset(),Hs(t,Ns),2*Fs};function Ws(t){return[fs(t[1],t[0]),ws(t[2])]}function Us(t){var e=t[0],n=t[1],r=ds(n);return[r*ds(e),r*ys(e),ys(n)]}function Vs(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function $s(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function Gs(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function Js(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function Zs(t){var e=vs(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var Ks,Xs,Qs,tc,ec,nc,rc,ic,ac,oc,uc=Xu(),sc={point:cc,lineStart:fc,lineEnd:dc,polygonStart:function(){sc.point=hc,sc.lineStart=_c,sc.lineEnd=pc,uc.reset(),Ns.polygonStart()},polygonEnd:function(){Ns.polygonEnd(),sc.point=cc,sc.lineStart=fc,sc.lineEnd=dc,Ps<0?(Ks=-(Qs=180),Xs=-(tc=90)):uc>ns?tc=90:uc<-ns&&(Xs=-90),oc[0]=Ks,oc[1]=Qs}};function cc(t,e){ac.push(oc=[Ks=t,Qs=t]),etc&&(tc=e)}function lc(t,e){var n=Us([t*ss,e*ss]);if(ic){var r=$s(ic,n),i=$s([r[1],-r[0],0],r);Zs(i),i=Ws(i);var a,o=t-ec,u=o>0?1:-1,s=i[0]*us*u,c=cs(o)>180;c^(u*ectc&&(tc=a):c^(u*ec<(s=(s+360)%360-180)&&stc&&(tc=e)),c?tmc(Ks,Qs)&&(Qs=t):mc(t,Qs)>mc(Ks,Qs)&&(Ks=t):Qs>=Ks?(tQs&&(Qs=t)):t>ec?mc(Ks,t)>mc(Ks,Qs)&&(Qs=t):mc(t,Qs)>mc(Ks,Qs)&&(Ks=t)}else ac.push(oc=[Ks=t,Qs=t]);etc&&(tc=e),ic=n,ec=t}function fc(){sc.point=lc}function dc(){oc[0]=Ks,oc[1]=Qs,sc.point=cc,ic=null}function hc(t,e){if(ic){var n=t-ec;uc.add(cs(n)>180?n+(n>0?360:-360):n)}else nc=t,rc=e;Ns.point(t,e),lc(t,e)}function _c(){Ns.lineStart()}function pc(){hc(nc,rc),Ns.lineEnd(),cs(uc)>ns&&(Ks=-(Qs=180)),oc[0]=Ks,oc[1]=Qs,ic=null}function mc(t,e){return(e-=t)<0?e+360:e}function yc(t,e){return t[0]-e[0]}function gc(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:emc(r[0],r[1])&&(r[1]=i[1]),mc(i[0],r[1])>mc(r[0],r[1])&&(r[0]=i[0])):a.push(r=i);for(o=-1/0,e=0,r=a[n=a.length-1];e<=n;r=i,++e)i=a[e],(u=mc(r[1],i[0]))>o&&(o=u,Ks=i[0],Qs=r[1])}return ac=oc=null,Ks===1/0||Xs===1/0?[[NaN,NaN],[NaN,NaN]]:[[Ks,Xs],[Qs,tc]]},Pc={sphere:Ls,point:Fc,lineStart:Rc,lineEnd:zc,polygonStart:function(){Pc.lineStart=qc,Pc.lineEnd=Wc},polygonEnd:function(){Pc.lineStart=Rc,Pc.lineEnd=zc}};function Fc(t,e){t*=ss;var n=ds(e*=ss);Nc(n*ds(t),n*ys(t),ys(e))}function Nc(t,e,n){Mc+=(t-Mc)/++vc,wc+=(e-wc)/vc,kc+=(n-kc)/vc}function Rc(){Pc.point=Ic}function Ic(t,e){t*=ss;var n=ds(e*=ss);jc=n*ds(t),Oc=n*ys(t),Cc=ys(e),Pc.point=Bc,Nc(jc,Oc,Cc)}function Bc(t,e){t*=ss;var n=ds(e*=ss),r=n*ds(t),i=n*ys(t),a=ys(e),o=fs(vs((o=Oc*a-Cc*i)*o+(o=Cc*r-jc*a)*o+(o=jc*i-Oc*r)*o),jc*r+Oc*i+Cc*a);bc+=o,Lc+=o*(jc+(jc=r)),xc+=o*(Oc+(Oc=i)),Dc+=o*(Cc+(Cc=a)),Nc(jc,Oc,Cc)}function zc(){Pc.point=Fc}function qc(){Pc.point=Uc}function Wc(){Vc(Ec,Sc),Pc.point=Fc}function Uc(t,e){Ec=t,Sc=e,t*=ss,e*=ss,Pc.point=Vc;var n=ds(e);jc=n*ds(t),Oc=n*ys(t),Cc=ys(e),Nc(jc,Oc,Cc)}function Vc(t,e){t*=ss;var n=ds(e*=ss),r=n*ds(t),i=n*ys(t),a=ys(e),o=Oc*a-Cc*i,u=Cc*r-jc*a,s=jc*i-Oc*r,c=vs(o*o+u*u+s*s),l=ws(c),f=c&&-l/c;Tc+=f*o,Yc+=f*u,Ac+=f*s,bc+=l,Lc+=l*(jc+(jc=r)),xc+=l*(Oc+(Oc=i)),Dc+=l*(Cc+(Cc=a)),Nc(jc,Oc,Cc)}var $c=function(t){vc=bc=Mc=wc=kc=Lc=xc=Dc=Tc=Yc=Ac=0,Hs(t,Pc);var e=Tc,n=Yc,r=Ac,i=e*e+n*n+r*r;return i<1e-12&&(e=Lc,n=xc,r=Dc,bcrs?t+Math.round(-t/os)*os:t,e]}function Kc(t,e,n){return(t%=os)?e||n?Jc(Qc(t),tl(e,n)):Qc(t):e||n?tl(e,n):Zc}function Xc(t){return function(e,n){return[(e+=t)>rs?e-os:e<-rs?e+os:e,n]}}function Qc(t){var e=Xc(t);return e.invert=Xc(-t),e}function tl(t,e){var n=ds(t),r=ys(t),i=ds(e),a=ys(e);function o(t,e){var o=ds(e),u=ds(t)*o,s=ys(t)*o,c=ys(e),l=c*n+u*r;return[fs(s*i-l*a,u*n-c*r),ws(l*i+s*a)]}return o.invert=function(t,e){var o=ds(e),u=ds(t)*o,s=ys(t)*o,c=ys(e),l=c*i-s*a;return[fs(s*i+c*a,u*n+l*r),ws(l*n-u*r)]},o}Zc.invert=Zc;var el=function(t){function e(e){return(e=t(e[0]*ss,e[1]*ss))[0]*=us,e[1]*=us,e}return t=Kc(t[0]*ss,t[1]*ss,t.length>2?t[2]*ss:0),e.invert=function(e){return(e=t.invert(e[0]*ss,e[1]*ss))[0]*=us,e[1]*=us,e},e};function nl(t,e,n,r,i,a){if(n){var o=ds(e),u=ys(e),s=r*n;null==i?(i=e+r*os,a=e-s/2):(i=rl(o,i),a=rl(o,a),(r>0?ia)&&(i+=r*os));for(var c,l=i;r>0?l>a:l1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}},ol=function(t,e){return cs(t[0]-e[0])=0;--a)i.point((l=c[a])[0],l[1]);else r(d.x,d.p.x,-1,i);d=d.p}c=(d=d.o).z,h=!h}while(!d.v);i.lineEnd()}}};function cl(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r=0?1:-1,x=L*k,D=x>rs,T=p*M;if(ll.add(fs(T*L*ys(x),m*w+T*ds(x))),o+=D?k+L*os:k,D^h>=n^v>=n){var Y=$s(Us(d),Us(g));Zs(Y);var A=$s(a,Y);Zs(A);var E=(D^k>=0?-1:1)*ws(A[2]);(r>E||r===E&&(Y[0]||Y[1]))&&(u+=D^k>=0?1:-1)}}return(o<-ns||o0){for(f||(i.polygonStart(),f=!0),i.lineStart(),t=0;t1&&2&s&&d.push(d.pop().concat(d.shift())),o.push(d.filter(hl))}return d}};function hl(t){return t.length>1}function _l(t,e){return((t=t.x)[0]<0?t[1]-is-ns:is-t[1])-((e=e.x)[0]<0?e[1]-is-ns:is-e[1])}var pl=dl(function(){return!0},function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var u=a>0?rs:-rs,s=cs(a-n);cs(s-rs)0?is:-is),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(a,r),e=0):i!==u&&s>=rs&&(cs(n-i)ns?ls((ys(e)*(a=ds(r))*ys(n)-ys(r)*(i=ds(e))*ys(t))/(i*a*o)):(e+r)/2}(n,r,a,o),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),e=0),t.point(n=a,r=o),i=u},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}},function(t,e,n,r){var i;if(null==t)i=n*is,r.point(-rs,i),r.point(0,i),r.point(rs,i),r.point(rs,0),r.point(rs,-i),r.point(0,-i),r.point(-rs,-i),r.point(-rs,0),r.point(-rs,i);else if(cs(t[0]-e[0])>ns){var a=t[0]0,i=cs(e)>ns;function a(t,n){return ds(t)*ds(n)>e}function o(t,n,r){var i=[1,0,0],a=$s(Us(t),Us(n)),o=Vs(a,a),u=a[0],s=o-u*u;if(!s)return!r&&t;var c=e*o/s,l=-e*u/s,f=$s(i,a),d=Js(i,c);Gs(d,Js(a,l));var h=f,_=Vs(d,h),p=Vs(h,h),m=_*_-p*(Vs(d,d)-1);if(!(m<0)){var y=vs(m),g=Js(h,(-_-y)/p);if(Gs(g,d),g=Ws(g),!r)return g;var v,b=t[0],M=n[0],w=t[1],k=n[1];M0^g[1]<(cs(g[0]-b)rs^(b<=g[0]&&g[0]<=M)){var D=Js(h,(-_+y)/p);return Gs(D,d),[g,Ws(D)]}}}function u(e,n){var i=r?t:rs-t,a=0;return e<-i?a|=1:e>i&&(a|=2),n<-i?a|=4:n>i&&(a|=8),a}return dl(a,function(t){var e,n,s,c,l;return{lineStart:function(){c=s=!1,l=1},point:function(f,d){var h,_=[f,d],p=a(f,d),m=r?p?0:u(f,d):p?u(f+(f<0?rs:-rs),d):0;if(!e&&(c=s=p)&&t.lineStart(),p!==s&&(!(h=o(e,_))||ol(e,h)||ol(_,h))&&(_[0]+=ns,_[1]+=ns,p=a(_[0],_[1])),p!==s)l=0,p?(t.lineStart(),h=o(_,e),t.point(h[0],h[1])):(h=o(e,_),t.point(h[0],h[1]),t.lineEnd()),e=h;else if(i&&e&&r^p){var y;m&n||!(y=o(_,e,!0))||(l=0,r?(t.lineStart(),t.point(y[0][0],y[0][1]),t.point(y[1][0],y[1][1]),t.lineEnd()):(t.point(y[1][0],y[1][1]),t.lineEnd(),t.lineStart(),t.point(y[0][0],y[0][1])))}!p||e&&ol(e,_)||t.point(_[0],_[1]),e=_,s=p,n=m},lineEnd:function(){s&&t.lineEnd(),e=null},clean:function(){return l|(c&&s)<<1}}},function(e,r,i,a){nl(a,t,n,i,e,r)},r?[0,-t]:[-rs,t-rs])},yl=function(t,e,n,r,i,a){var o,u=t[0],s=t[1],c=0,l=1,f=e[0]-u,d=e[1]-s;if(o=n-u,f||!(o>0)){if(o/=f,f<0){if(o0){if(o>l)return;o>c&&(c=o)}if(o=i-u,f||!(o<0)){if(o/=f,f<0){if(o>l)return;o>c&&(c=o)}else if(f>0){if(o0)){if(o/=d,d<0){if(o0){if(o>l)return;o>c&&(c=o)}if(o=a-s,d||!(o<0)){if(o/=d,d<0){if(o>l)return;o>c&&(c=o)}else if(d>0){if(o0&&(t[0]=u+c*f,t[1]=s+c*d),l<1&&(e[0]=u+l*f,e[1]=s+l*d),!0}}}}},gl=1e9,vl=-gl;function bl(t,e,n,r){function i(i,a){return t<=i&&i<=n&&e<=a&&a<=r}function a(i,a,u,c){var l=0,f=0;if(null==i||(l=o(i,u))!==(f=o(a,u))||s(i,a)<0^u>0)do{c.point(0===l||3===l?t:n,l>1?r:e)}while((l=(l+u+4)%4)!==f);else c.point(a[0],a[1])}function o(r,i){return cs(r[0]-t)0?0:3:cs(r[0]-n)0?2:1:cs(r[1]-e)0?1:0:i>0?3:2}function u(t,e){return s(t.x,e.x)}function s(t,e){var n=o(t,1),r=o(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(o){var s,c,l,f,d,h,_,p,m,y,g,v=o,b=al(),M={point:w,lineStart:function(){M.point=k,c&&c.push(l=[]);y=!0,m=!1,_=p=NaN},lineEnd:function(){s&&(k(f,d),h&&m&&b.rejoin(),s.push(b.result()));M.point=w,m&&v.lineEnd()},polygonStart:function(){v=b,s=[],c=[],g=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=c.length;nr&&(d-a)*(r-o)>(h-o)*(t-a)&&++e:h<=r&&(d-a)*(r-o)<(h-o)*(t-a)&&--e;return e}(),n=g&&e,i=(s=F(s)).length;(n||i)&&(o.polygonStart(),n&&(o.lineStart(),a(null,null,1,o),o.lineEnd()),i&&sl(s,u,e,a,o),o.polygonEnd());v=o,s=c=l=null}};function w(t,e){i(t,e)&&v.point(t,e)}function k(a,o){var u=i(a,o);if(c&&l.push([a,o]),y)f=a,d=o,h=u,y=!1,u&&(v.lineStart(),v.point(a,o));else if(u&&m)v.point(a,o);else{var s=[_=Math.max(vl,Math.min(gl,_)),p=Math.max(vl,Math.min(gl,p))],b=[a=Math.max(vl,Math.min(gl,a)),o=Math.max(vl,Math.min(gl,o))];yl(s,b,t,e,n,r)?(m||(v.lineStart(),v.point(s[0],s[1])),v.point(b[0],b[1]),u||v.lineEnd(),g=!1):u&&(v.lineStart(),v.point(a,o),g=!1)}_=a,p=o,m=u}return M}}var Ml,wl,kl,Ll=function(){var t,e,n,r=0,i=0,a=960,o=500;return n={stream:function(n){return t&&e===n?t:t=bl(r,i,a,o)(e=n)},extent:function(u){return arguments.length?(r=+u[0][0],i=+u[0][1],a=+u[1][0],o=+u[1][1],t=e=null,n):[[r,i],[a,o]]}}},xl=Xu(),Dl={sphere:Ls,point:Ls,lineStart:function(){Dl.point=Yl,Dl.lineEnd=Tl},lineEnd:Ls,polygonStart:Ls,polygonEnd:Ls};function Tl(){Dl.point=Dl.lineEnd=Ls}function Yl(t,e){Ml=t*=ss,wl=ys(e*=ss),kl=ds(e),Dl.point=Al}function Al(t,e){t*=ss;var n=ys(e*=ss),r=ds(e),i=cs(t-Ml),a=ds(i),o=r*ys(i),u=kl*n-wl*r*a,s=wl*n+kl*r*a;xl.add(fs(vs(o*o+u*u),s)),Ml=t,wl=n,kl=r}var El=function(t){return xl.reset(),Hs(t,Dl),+xl},Sl=[null,null],jl={type:"LineString",coordinates:Sl},Ol=function(t,e){return Sl[0]=t,Sl[1]=e,El(jl)},Cl={Feature:function(t,e){return Pl(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++rns}).map(s)).concat(w(hs(a/h)*h,i,h).filter(function(t){return cs(t%p)>ns}).map(c))}return y.lines=function(){return g().map(function(t){return{type:"LineString",coordinates:t}})},y.outline=function(){return{type:"Polygon",coordinates:[l(r).concat(f(o).slice(1),l(n).reverse().slice(1),f(u).reverse().slice(1))]}},y.extent=function(t){return arguments.length?y.extentMajor(t).extentMinor(t):y.extentMinor()},y.extentMajor=function(t){return arguments.length?(r=+t[0][0],n=+t[1][0],u=+t[0][1],o=+t[1][1],r>n&&(t=r,r=n,n=t),u>o&&(t=u,u=o,o=t),y.precision(m)):[[r,u],[n,o]]},y.extentMinor=function(n){return arguments.length?(e=+n[0][0],t=+n[1][0],a=+n[0][1],i=+n[1][1],e>t&&(n=e,e=t,t=n),a>i&&(n=a,a=i,i=n),y.precision(m)):[[e,a],[t,i]]},y.step=function(t){return arguments.length?y.stepMajor(t).stepMinor(t):y.stepMinor()},y.stepMajor=function(t){return arguments.length?(_=+t[0],p=+t[1],y):[_,p]},y.stepMinor=function(t){return arguments.length?(d=+t[0],h=+t[1],y):[d,h]},y.precision=function(d){return arguments.length?(m=+d,s=ql(a,i,90),c=Wl(e,t,m),l=ql(u,o,90),f=Wl(r,n,m),y):m},y.extentMajor([[-180,-90+ns],[180,90-ns]]).extentMinor([[-180,-80-ns],[180,80+ns]])}function Vl(){return Ul()()}var $l,Gl,Jl,Zl,Kl=function(t,e){var n=t[0]*ss,r=t[1]*ss,i=e[0]*ss,a=e[1]*ss,o=ds(r),u=ys(r),s=ds(a),c=ys(a),l=o*ds(n),f=o*ys(n),d=s*ds(i),h=s*ys(i),_=2*ws(vs(ks(a-r)+o*s*ks(i-n))),p=ys(_),m=_?function(t){var e=ys(t*=_)/p,n=ys(_-t)/p,r=n*l+e*d,i=n*f+e*h,a=n*u+e*c;return[fs(i,r)*us,fs(a,vs(r*r+i*i))*us]}:function(){return[n*us,r*us]};return m.distance=_,m},Xl=function(t){return t},Ql=Xu(),tf=Xu(),ef={point:Ls,lineStart:Ls,lineEnd:Ls,polygonStart:function(){ef.lineStart=nf,ef.lineEnd=of},polygonEnd:function(){ef.lineStart=ef.lineEnd=ef.point=Ls,Ql.add(cs(tf)),tf.reset()},result:function(){var t=Ql/2;return Ql.reset(),t}};function nf(){ef.point=rf}function rf(t,e){ef.point=af,$l=Jl=t,Gl=Zl=e}function af(t,e){tf.add(Zl*t-Jl*e),Jl=t,Zl=e}function of(){af($l,Gl)}var uf=ef,sf=1/0,cf=sf,lf=-sf,ff=lf;var df,hf,_f,pf,mf={point:function(t,e){tlf&&(lf=t);eff&&(ff=e)},lineStart:Ls,lineEnd:Ls,polygonStart:Ls,polygonEnd:Ls,result:function(){var t=[[sf,cf],[lf,ff]];return lf=ff=-(cf=sf=1/0),t}},yf=0,gf=0,vf=0,bf=0,Mf=0,wf=0,kf=0,Lf=0,xf=0,Df={point:Tf,lineStart:Yf,lineEnd:Sf,polygonStart:function(){Df.lineStart=jf,Df.lineEnd=Of},polygonEnd:function(){Df.point=Tf,Df.lineStart=Yf,Df.lineEnd=Sf},result:function(){var t=xf?[kf/xf,Lf/xf]:wf?[bf/wf,Mf/wf]:vf?[yf/vf,gf/vf]:[NaN,NaN];return yf=gf=vf=bf=Mf=wf=kf=Lf=xf=0,t}};function Tf(t,e){yf+=t,gf+=e,++vf}function Yf(){Df.point=Af}function Af(t,e){Df.point=Ef,Tf(_f=t,pf=e)}function Ef(t,e){var n=t-_f,r=e-pf,i=vs(n*n+r*r);bf+=i*(_f+t)/2,Mf+=i*(pf+e)/2,wf+=i,Tf(_f=t,pf=e)}function Sf(){Df.point=Tf}function jf(){Df.point=Cf}function Of(){Hf(df,hf)}function Cf(t,e){Df.point=Hf,Tf(df=_f=t,hf=pf=e)}function Hf(t,e){var n=t-_f,r=e-pf,i=vs(n*n+r*r);bf+=i*(_f+t)/2,Mf+=i*(pf+e)/2,wf+=i,kf+=(i=pf*t-_f*e)*(_f+t),Lf+=i*(pf+e),xf+=3*i,Tf(_f=t,pf=e)}var Pf=Df;function Ff(t){this._context=t}Ff.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,os)}},result:Ls};var Nf,Rf,If,Bf,zf,qf=Xu(),Wf={point:Ls,lineStart:function(){Wf.point=Uf},lineEnd:function(){Nf&&Vf(Rf,If),Wf.point=Ls},polygonStart:function(){Nf=!0},polygonEnd:function(){Nf=null},result:function(){var t=+qf;return qf.reset(),t}};function Uf(t,e){Wf.point=Vf,Rf=Bf=t,If=zf=e}function Vf(t,e){Bf-=t,zf-=e,qf.add(vs(Bf*Bf+zf*zf)),Bf=t,zf=e}var $f=Wf;function Gf(){this._string=[]}function Jf(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}Gf.prototype={_radius:4.5,_circle:Jf(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push("M",t,",",e),this._point=1;break;case 1:this._string.push("L",t,",",e);break;default:null==this._circle&&(this._circle=Jf(this._radius)),this._string.push("M",t,",",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}};var Zf=function(t,e){var n,r,i=4.5;function a(t){return t&&("function"==typeof i&&r.pointRadius(+i.apply(this,arguments)),Hs(t,n(r))),r.result()}return a.area=function(t){return Hs(t,n(uf)),uf.result()},a.measure=function(t){return Hs(t,n($f)),$f.result()},a.bounds=function(t){return Hs(t,n(mf)),mf.result()},a.centroid=function(t){return Hs(t,n(Pf)),Pf.result()},a.projection=function(e){return arguments.length?(n=null==e?(t=null,Xl):(t=e).stream,a):t},a.context=function(t){return arguments.length?(r=null==t?(e=null,new Gf):new Ff(e=t),"function"!=typeof i&&r.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i="function"==typeof t?t:(r.pointRadius(+t),+t),a):i},a.projection(t).context(e)},Kf=function(t){return{stream:Xf(t)}};function Xf(t){return function(e){var n=new Qf;for(var r in t)n[r]=t[r];return n.stream=e,n}}function Qf(){}function td(t,e,n){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),Hs(n,t.stream(mf)),e(mf.result()),null!=r&&t.clipExtent(r),t}function ed(t,e,n){return td(t,function(n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],a=Math.min(r/(n[1][0]-n[0][0]),i/(n[1][1]-n[0][1])),o=+e[0][0]+(r-a*(n[1][0]+n[0][0]))/2,u=+e[0][1]+(i-a*(n[1][1]+n[0][1]))/2;t.scale(150*a).translate([o,u])},n)}function nd(t,e,n){return ed(t,[[0,0],e],n)}function rd(t,e,n){return td(t,function(n){var r=+e,i=r/(n[1][0]-n[0][0]),a=(r-i*(n[1][0]+n[0][0]))/2,o=-i*n[0][1];t.scale(150*i).translate([a,o])},n)}function id(t,e,n){return td(t,function(n){var r=+e,i=r/(n[1][1]-n[0][1]),a=-i*n[0][0],o=(r-i*(n[1][1]+n[0][1]))/2;t.scale(150*i).translate([a,o])},n)}Qf.prototype={constructor:Qf,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var ad=16,od=ds(30*ss),ud=function(t,e){return+e?function(t,e){function n(r,i,a,o,u,s,c,l,f,d,h,_,p,m){var y=c-r,g=l-i,v=y*y+g*g;if(v>4*e&&p--){var b=o+d,M=u+h,w=s+_,k=vs(b*b+M*M+w*w),L=ws(w/=k),x=cs(cs(w)-1)e||cs((y*A+g*E)/v-.5)>.3||o*d+u*h+s*_2?t[2]%360*ss:0,T()):[m*us,y*us,g*us]},x.angle=function(t){return arguments.length?(v=t%360*ss,T()):v*us},x.precision=function(t){return arguments.length?(o=ud(u,L=t*t),Y()):vs(L)},x.fitExtent=function(t,e){return ed(x,t,e)},x.fitSize=function(t,e){return nd(x,t,e)},x.fitWidth=function(t,e){return rd(x,t,e)},x.fitHeight=function(t,e){return id(x,t,e)},function(){return e=t.apply(this,arguments),x.invert=e.invert&&D,T()}}function dd(t){var e=0,n=rs/3,r=fd(t),i=r(e,n);return i.parallels=function(t){return arguments.length?r(e=t[0]*ss,n=t[1]*ss):[e*us,n*us]},i}function hd(t,e){var n=ys(t),r=(n+ys(e))/2;if(cs(r)=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?s:o).invert(t)},l.stream=function(n){return t&&e===n?t:(r=[o.stream(e=n),u.stream(n),s.stream(n)],i=r.length,t={point:function(t,e){for(var n=-1;++n0?e<-is+ns&&(e=-is+ns):e>is-ns&&(e=is-ns);var n=i/ms(Dd(e),r);return[n*ys(r*t),i-n*ds(r*t)]}return a.invert=function(t,e){var n=i-e,a=gs(r)*vs(t*t+n*n);return[fs(t,cs(n))/r*gs(n),2*ls(ms(i/a,1/r))-is]},a}var Yd=function(){return dd(Td).scale(109.5).parallels([30,30])};function Ad(t,e){return[t,e]}Ad.invert=Ad;var Ed=function(){return ld(Ad).scale(152.63)};function Sd(t,e){var n=ds(t),r=t===e?ys(t):(n-ds(e))/(e-t),i=n/r+t;if(cs(r)ns&&--i>0);return[t/(.8707+(a=r*r)*(a*(a*a*a*(.003971-.001529*a)-.013791)-.131979)),r]};var Ud=function(){return ld(Wd).scale(175.295)};function Vd(t,e){return[ds(e)*ys(t),ys(e)]}Vd.invert=gd(ws);var $d=function(){return ld(Vd).scale(249.5).clipAngle(90+ns)};function Gd(t,e){var n=ds(e),r=1+ds(t)*n;return[n*ys(t)/r,ys(e)/r]}Gd.invert=gd(function(t){return 2*ls(t)});var Jd=function(){return ld(Gd).scale(250).clipAngle(142)};function Zd(t,e){return[ps(bs((is+e)/2)),-t]}Zd.invert=function(t,e){return[-e,2*ls(_s(t))-is]};var Kd=function(){var t=xd(Zd),e=t.center,n=t.rotate;return t.center=function(t){return arguments.length?e([-t[1],t[0]]):[(t=e())[1],-t[0]]},t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):[(t=n())[0],t[1],t[2]-90]},n([0,0,90]).scale(159.155)};function Xd(t,e){return t.parent===e.parent?1:2}function Qd(t,e){return t+e.x}function th(t,e){return Math.max(t,e.y)}var eh=function(){var t=Xd,e=1,n=1,r=!1;function i(i){var a,o=0;i.eachAfter(function(e){var n=e.children;n?(e.x=function(t){return t.reduce(Qd,0)/t.length}(n),e.y=function(t){return 1+t.reduce(th,0)}(n)):(e.x=a?o+=t(e,a):0,e.y=0,a=e)});var u=function(t){for(var e;e=t.children;)t=e[0];return t}(i),s=function(t){for(var e;e=t.children;)t=e[e.length-1];return t}(i),c=u.x-t(u,s)/2,l=s.x+t(s,u)/2;return i.eachAfter(r?function(t){t.x=(t.x-i.x)*e,t.y=(i.y-t.y)*n}:function(t){t.x=(t.x-c)/(l-c)*e,t.y=(1-(i.y?t.y/i.y:1))*n})}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i};function nh(t){var e=0,n=t.children,r=n&&n.length;if(r)for(;--r>=0;)e+=n[r].value;else e=1;t.value=e}function rh(t,e){var n,r,i,a,o,u=new uh(t),s=+t.value&&(u.value=t.value),c=[u];for(null==e&&(e=ih);n=c.pop();)if(s&&(n.value=+n.data.value),(i=e(n.data))&&(o=i.length))for(n.children=new Array(o),a=o-1;a>=0;--a)c.push(r=n.children[a]=new uh(i[a])),r.parent=n,r.depth=n.depth+1;return u.eachBefore(oh)}function ih(t){return t.children}function ah(t){t.data=t.data.data}function oh(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function uh(t){this.data=t,this.depth=this.height=0,this.parent=null}uh.prototype=rh.prototype={constructor:uh,count:function(){return this.eachAfter(nh)},each:function(t){var e,n,r,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),n=a.children)for(r=0,i=n.length;r=0;--n)i.push(e[n]);return this},sum:function(t){return this.eachAfter(function(e){for(var n=+t(e.data)||0,r=e.children,i=r&&r.length;--i>=0;)n+=r[i].value;e.value=n})},sort:function(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})},path:function(t){for(var e=this,n=function(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;for(t=n.pop(),e=r.pop();t===e;)i=t,t=n.pop(),e=r.pop();return i}(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each(function(e){t.push(e)}),t},leaves:function(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t},links:function(){var t=this,e=[];return t.each(function(n){n!==t&&e.push({source:n.parent,target:n})}),e},copy:function(){return rh(this).eachBefore(ah)}};var sh=Array.prototype.slice;var ch=function(t){for(var e,n,r=0,i=(t=function(t){for(var e,n,r=t.length;r;)n=Math.random()*r--|0,e=t[r],t[r]=t[n],t[n]=e;return t}(sh.call(t))).length,a=[];r0&&n*n>r*r+i*i}function hh(t,e){for(var n=0;n(o*=o)?(r=(c+o-i)/(2*c),a=Math.sqrt(Math.max(0,o/c-r*r)),n.x=t.x-r*u-a*s,n.y=t.y-r*s+a*u):(r=(c+i-o)/(2*c),a=Math.sqrt(Math.max(0,i/c-r*r)),n.x=e.x+r*u-a*s,n.y=e.y+r*s+a*u)):(n.x=e.x+n.r,n.y=e.y)}function gh(t,e){var n=t.r+e.r-1e-6,r=e.x-t.x,i=e.y-t.y;return n>0&&n*n>r*r+i*i}function vh(t){var e=t._,n=t.next._,r=e.r+n.r,i=(e.x*n.r+n.x*e.r)/r,a=(e.y*n.r+n.y*e.r)/r;return i*i+a*a}function bh(t){this._=t,this.next=null,this.previous=null}function Mh(t){if(!(i=t.length))return 0;var e,n,r,i,a,o,u,s,c,l,f;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(n=t[1],e.x=-n.r,n.x=e.r,n.y=0,!(i>2))return e.r+n.r;yh(n,e,r=t[2]),e=new bh(e),n=new bh(n),r=new bh(r),e.next=r.previous=n,n.next=e.previous=r,r.next=n.previous=e;t:for(u=3;u0)throw new Error("cycle");return a}return n.id=function(e){return arguments.length?(t=kh(e),n):t},n.parentId=function(t){return arguments.length?(e=kh(t),n):e},n};function Ih(t,e){return t.parent===e.parent?1:2}function Bh(t){var e=t.children;return e?e[0]:t.t}function zh(t){var e=t.children;return e?e[e.length-1]:t.t}function qh(t,e,n){var r=n/(e.i-t.i);e.c-=r,e.s+=n,t.c+=r,e.z+=n,e.m+=n}function Wh(t,e,n){return t.a.parent===e.parent?t.a:n}function Uh(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}Uh.prototype=Object.create(uh.prototype);var Vh=function(){var t=Ih,e=1,n=1,r=null;function i(i){var s=function(t){for(var e,n,r,i,a,o=new Uh(t,0),u=[o];e=u.pop();)if(r=e._.children)for(e.children=new Array(a=r.length),i=a-1;i>=0;--i)u.push(n=e.children[i]=new Uh(r[i],i)),n.parent=e;return(o.parent=new Uh(null,0)).children=[o],o}(i);if(s.eachAfter(a),s.parent.m=-s.z,s.eachBefore(o),r)i.eachBefore(u);else{var c=i,l=i,f=i;i.eachBefore(function(t){t.xl.x&&(l=t),t.depth>f.depth&&(f=t)});var d=c===l?1:t(c,l)/2,h=d-c.x,_=e/(l.x+d+h),p=n/(f.depth||1);i.eachBefore(function(t){t.x=(t.x+h)*_,t.y=t.depth*p})}return i}function a(e){var n=e.children,r=e.parent.children,i=e.i?r[e.i-1]:null;if(n){!function(t){for(var e,n=0,r=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=n,e.m+=n,n+=e.s+(r+=e.c)}(e);var a=(n[0].z+n[n.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,n,r){if(n){for(var i,a=e,o=e,u=n,s=a.parent.children[0],c=a.m,l=o.m,f=u.m,d=s.m;u=zh(u),a=Bh(a),u&&a;)s=Bh(s),(o=zh(o)).a=e,(i=u.z+f-a.z-c+t(u._,a._))>0&&(qh(Wh(u,e,r),e,i),c+=i,l+=i),f+=u.m,c+=a.m,d+=s.m,l+=o.m;u&&!zh(o)&&(o.t=u,o.m+=f-l),a&&!Bh(s)&&(s.t=a,s.m+=c-d,r=e)}return r}(e,i,e.parent.A||r[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=e,t.y=t.depth*n}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i},$h=function(t,e,n,r,i){for(var a,o=t.children,u=-1,s=o.length,c=t.value&&(i-n)/t.value;++ud&&(d=u),m=l*l*p,(h=Math.max(d/m,m/f))>_){l-=u;break}_=h}y.push(o={value:l,dice:s1?e:1)},n}(Gh),Kh=function(){var t=Zh,e=!1,n=1,r=1,i=[0],a=Lh,o=Lh,u=Lh,s=Lh,c=Lh;function l(t){return t.x0=t.y0=0,t.x1=n,t.y1=r,t.eachBefore(f),i=[0],e&&t.eachBefore(Sh),t}function f(e){var n=i[e.depth],r=e.x0+n,l=e.y0+n,f=e.x1-n,d=e.y1-n;f=n-1){var l=u[e];return l.x0=i,l.y0=a,l.x1=o,void(l.y1=s)}var f=c[e],d=r/2+f,h=e+1,_=n-1;for(;h<_;){var p=h+_>>>1;c[p]s-a){var g=(i*y+o*m)/r;t(e,h,m,i,a,g,s),t(h,n,y,g,a,o,s)}else{var v=(a*y+s*m)/r;t(e,h,m,i,a,o,v),t(h,n,y,i,v,o,s)}}(0,s,t.value,e,n,r,i)},Qh=function(t,e,n,r,i){(1&t.depth?$h:jh)(t,e,n,r,i)},t_=function t(e){function n(t,n,r,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,u,s,c,l,f=-1,d=o.length,h=t.value;++f1?e:1)},n}(Gh),e_=function(t){for(var e,n=-1,r=t.length,i=t[r-1],a=0;++n1&&r_(t[n[r-2]],t[n[r-1]],t[i])<=0;)--r;n[r++]=i}return n.slice(0,r)}var o_=function(t){if((n=t.length)<3)return null;var e,n,r=new Array(n),i=new Array(n);for(e=0;e=0;--e)c.push(t[r[a[e]][2]]);for(e=+u;eu!=c>u&&o<(s-n)*(u-r)/(c-r)+n&&(l=!l),s=n,c=r;return l},s_=function(t){for(var e,n,r=-1,i=t.length,a=t[i-1],o=a[0],u=a[1],s=0;++r1);return t+n*a*Math.sqrt(-2*Math.log(i)/i)}}return n.source=t,n}(c_),d_=function t(e){function n(){var t=f_.source(e).apply(this,arguments);return function(){return Math.exp(t())}}return n.source=t,n}(c_),h_=function t(e){function n(t){return function(){for(var n=0,r=0;r2?Y_:T_,r=i=null,l}function l(e){return(r||(r=n(a,o,s?function(t){return function(e,n){var r=t(e=+e,n=+n);return function(t){return t<=e?0:t>=n?1:r(t)}}}(t):t,u)))(+e)}return l.invert=function(t){return(i||(i=n(o,a,D_,s?function(t){return function(e,n){var r=t(e=+e,n=+n);return function(t){return t<=0?e:t>=1?n:r(t)}}}(e):e)))(+t)},l.domain=function(t){return arguments.length?(a=y_.call(t,L_),c()):a.slice()},l.range=function(t){return arguments.length?(o=g_.call(t),c()):o.slice()},l.rangeRound=function(t){return o=g_.call(t),u=tr,c()},l.clamp=function(t){return arguments.length?(s=!!t,c()):s},l.interpolate=function(t){return arguments.length?(u=t,c()):u},c()}var S_=function(t,e,n){var r,i=t[0],a=t[t.length-1],o=Y(i,a,null==e?10:e);switch((n=Pu(null==n?",f":n)).type){case"s":var u=Math.max(Math.abs(i),Math.abs(a));return null!=n.precision||isNaN(r=Zu(o,u))||(n.precision=r),Bu(n,u);case"":case"e":case"g":case"p":case"r":null!=n.precision||isNaN(r=Ku(o,Math.max(Math.abs(i),Math.abs(a))))||(n.precision=r-("e"===n.type));break;case"f":case"%":null!=n.precision||isNaN(r=Ju(o))||(n.precision=r-2*("%"===n.type))}return Iu(n)};function j_(t){var e=t.domain;return t.ticks=function(t){var n=e();return D(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){return S_(e(),t,n)},t.nice=function(n){null==n&&(n=10);var r,i=e(),a=0,o=i.length-1,u=i[a],s=i[o];return s0?r=T(u=Math.floor(u/r)*r,s=Math.ceil(s/r)*r,n):r<0&&(r=T(u=Math.ceil(u*r)/r,s=Math.floor(s*r)/r,n)),r>0?(i[a]=Math.floor(u/r)*r,i[o]=Math.ceil(s/r)*r,e(i)):r<0&&(i[a]=Math.ceil(u*r)/r,i[o]=Math.floor(s*r)/r,e(i)),t},t}function O_(){var t=E_(D_,zn);return t.copy=function(){return A_(t,O_())},j_(t)}function C_(){var t=[0,1];function e(t){return+t}return e.invert=e,e.domain=e.range=function(n){return arguments.length?(t=y_.call(n,L_),e):t.slice()},e.copy=function(){return C_().domain(t)},j_(e)}var H_=function(t,e){var n,r=0,i=(t=t.slice()).length-1,a=t[r],o=t[i];return o0){for(;ds)break;p.push(f)}}else for(;d=1;--l)if(!((f=c*l)s)break;p.push(f)}}else p=D(d,h,Math.min(h-d,_)).map(i);return a?p.reverse():p},t.tickFormat=function(e,a){if(null==a&&(a=10===n?".0e":","),"function"!=typeof a&&(a=Iu(a)),e===1/0)return a;null==e&&(e=10);var o=Math.max(1,n*e/t.ticks().length);return function(t){var e=t/i(Math.round(r(t)));return e*n0?n[i-1]:t[0],i=n?[r[n-1],e]:[r[o-1],r[o]]},a.copy=function(){return $_().domain([t,e]).range(i)},j_(a)}function G_(){var t=[.5],e=[0,1],n=1;function r(r){if(r<=r)return e[s(t,r,0,n)]}return r.domain=function(i){return arguments.length?(t=g_.call(i),n=Math.min(t.length,e.length-1),r):t.slice()},r.range=function(i){return arguments.length?(e=g_.call(i),n=Math.min(t.length,e.length-1),r):e.slice()},r.invertExtent=function(n){var r=e.indexOf(n);return[t[r-1],t[r]]},r.copy=function(){return G_().domain(t).range(e)},r}var J_=new Date,Z_=new Date;function K_(t,e,n,r){function i(e){return t(e=new Date(+e)),e}return i.floor=i,i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t);return t-e0))return u;do{u.push(o=new Date(+n)),e(n,a),t(n)}while(o=e)for(;t(e),!n(e);)e.setTime(e-1)},function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););})},n&&(i.count=function(e,r){return J_.setTime(+e),Z_.setTime(+r),t(J_),t(Z_),Math.floor(n(J_,Z_))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}var X_=K_(function(){},function(t,e){t.setTime(+t+e)},function(t,e){return e-t});X_.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?K_(function(e){e.setTime(Math.floor(e/t)*t)},function(e,n){e.setTime(+e+n*t)},function(e,n){return(n-e)/t}):X_:null};var Q_=X_,tp=X_.range,ep=6e4,np=6048e5,rp=K_(function(t){t.setTime(1e3*Math.floor(t/1e3))},function(t,e){t.setTime(+t+1e3*e)},function(t,e){return(e-t)/1e3},function(t){return t.getUTCSeconds()}),ip=rp,ap=rp.range,op=K_(function(t){t.setTime(Math.floor(t/ep)*ep)},function(t,e){t.setTime(+t+e*ep)},function(t,e){return(e-t)/ep},function(t){return t.getMinutes()}),up=op,sp=op.range,cp=K_(function(t){var e=t.getTimezoneOffset()*ep%36e5;e<0&&(e+=36e5),t.setTime(36e5*Math.floor((+t-e)/36e5)+e)},function(t,e){t.setTime(+t+36e5*e)},function(t,e){return(e-t)/36e5},function(t){return t.getHours()}),lp=cp,fp=cp.range,dp=K_(function(t){t.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*ep)/864e5},function(t){return t.getDate()-1}),hp=dp,_p=dp.range;function pp(t){return K_(function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},function(t,e){t.setDate(t.getDate()+7*e)},function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*ep)/np})}var mp=pp(0),yp=pp(1),gp=pp(2),vp=pp(3),bp=pp(4),Mp=pp(5),wp=pp(6),kp=mp.range,Lp=yp.range,xp=gp.range,Dp=vp.range,Tp=bp.range,Yp=Mp.range,Ap=wp.range,Ep=K_(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,e){t.setMonth(t.getMonth()+e)},function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),Sp=Ep,jp=Ep.range,Op=K_(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t,e){return e.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});Op.every=function(t){return isFinite(t=Math.floor(t))&&t>0?K_(function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},function(e,n){e.setFullYear(e.getFullYear()+n*t)}):null};var Cp=Op,Hp=Op.range,Pp=K_(function(t){t.setUTCSeconds(0,0)},function(t,e){t.setTime(+t+e*ep)},function(t,e){return(e-t)/ep},function(t){return t.getUTCMinutes()}),Fp=Pp,Np=Pp.range,Rp=K_(function(t){t.setUTCMinutes(0,0,0)},function(t,e){t.setTime(+t+36e5*e)},function(t,e){return(e-t)/36e5},function(t){return t.getUTCHours()}),Ip=Rp,Bp=Rp.range,zp=K_(function(t){t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+e)},function(t,e){return(e-t)/864e5},function(t){return t.getUTCDate()-1}),qp=zp,Wp=zp.range;function Up(t){return K_(function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},function(t,e){t.setUTCDate(t.getUTCDate()+7*e)},function(t,e){return(e-t)/np})}var Vp=Up(0),$p=Up(1),Gp=Up(2),Jp=Up(3),Zp=Up(4),Kp=Up(5),Xp=Up(6),Qp=Vp.range,tm=$p.range,em=Gp.range,nm=Jp.range,rm=Zp.range,im=Kp.range,am=Xp.range,om=K_(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCMonth(t.getUTCMonth()+e)},function(t,e){return e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),um=om,sm=om.range,cm=K_(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)},function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});cm.every=function(t){return isFinite(t=Math.floor(t))&&t>0?K_(function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)}):null};var lm=cm,fm=cm.range;function dm(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function hm(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function _m(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function pm(t){var e=t.dateTime,n=t.date,r=t.time,i=t.periods,a=t.days,o=t.shortDays,u=t.months,s=t.shortMonths,c=Tm(i),l=Ym(i),f=Tm(a),d=Ym(a),h=Tm(o),_=Ym(o),p=Tm(u),m=Ym(u),y=Tm(s),g=Ym(s),v={a:function(t){return o[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return s[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Gm,e:Gm,f:Qm,H:Jm,I:Zm,j:Km,L:Xm,m:ty,M:ey,p:function(t){return i[+(t.getHours()>=12)]},Q:Ay,s:Ey,S:ny,u:ry,U:iy,V:ay,w:oy,W:uy,x:null,X:null,y:sy,Y:cy,Z:ly,"%":Yy},b={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return s[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:fy,e:fy,f:my,H:dy,I:hy,j:_y,L:py,m:yy,M:gy,p:function(t){return i[+(t.getUTCHours()>=12)]},Q:Ay,s:Ey,S:vy,u:by,U:My,V:wy,w:ky,W:Ly,x:null,X:null,y:xy,Y:Dy,Z:Ty,"%":Yy},M={a:function(t,e,n){var r=h.exec(e.slice(n));return r?(t.w=_[r[0].toLowerCase()],n+r[0].length):-1},A:function(t,e,n){var r=f.exec(e.slice(n));return r?(t.w=d[r[0].toLowerCase()],n+r[0].length):-1},b:function(t,e,n){var r=y.exec(e.slice(n));return r?(t.m=g[r[0].toLowerCase()],n+r[0].length):-1},B:function(t,e,n){var r=p.exec(e.slice(n));return r?(t.m=m[r[0].toLowerCase()],n+r[0].length):-1},c:function(t,n,r){return L(t,e,n,r)},d:Nm,e:Nm,f:Wm,H:Im,I:Im,j:Rm,L:qm,m:Fm,M:Bm,p:function(t,e,n){var r=c.exec(e.slice(n));return r?(t.p=l[r[0].toLowerCase()],n+r[0].length):-1},Q:Vm,s:$m,S:zm,u:Em,U:Sm,V:jm,w:Am,W:Om,x:function(t,e,r){return L(t,n,e,r)},X:function(t,e,n){return L(t,r,e,n)},y:Hm,Y:Cm,Z:Pm,"%":Um};function w(t,e){return function(n){var r,i,a,o=[],u=-1,s=0,c=t.length;for(n instanceof Date||(n=new Date(+n));++u53)return null;"w"in a||(a.w=1),"Z"in a?(i=(r=hm(_m(a.y))).getUTCDay(),r=i>4||0===i?$p.ceil(r):$p(r),r=qp.offset(r,7*(a.V-1)),a.y=r.getUTCFullYear(),a.m=r.getUTCMonth(),a.d=r.getUTCDate()+(a.w+6)%7):(i=(r=e(_m(a.y))).getDay(),r=i>4||0===i?yp.ceil(r):yp(r),r=hp.offset(r,7*(a.V-1)),a.y=r.getFullYear(),a.m=r.getMonth(),a.d=r.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?hm(_m(a.y)).getUTCDay():e(_m(a.y)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,hm(a)):e(a)}}function L(t,e,n,r){for(var i,a,o=0,u=e.length,s=n.length;o=s)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=M[i in Mm?e.charAt(o++):i])||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return v.x=w(n,v),v.X=w(r,v),v.c=w(e,v),b.x=w(n,b),b.X=w(r,b),b.c=w(e,b),{format:function(t){var e=w(t+="",v);return e.toString=function(){return t},e},parse:function(t){var e=k(t+="",dm);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},utcParse:function(t){var e=k(t,hm);return e.toString=function(){return t},e}}}var mm,ym,gm,vm,bm,Mm={"-":"",_:" ",0:"0"},wm=/^\s*\d+/,km=/^%/,Lm=/[\\^$*+?|[\]().{}]/g;function xm(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",a=i.length;return r+(a68?1900:2e3),n+r[0].length):-1}function Pm(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function Fm(t,e,n){var r=wm.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function Nm(t,e,n){var r=wm.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function Rm(t,e,n){var r=wm.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function Im(t,e,n){var r=wm.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function Bm(t,e,n){var r=wm.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function zm(t,e,n){var r=wm.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function qm(t,e,n){var r=wm.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function Wm(t,e,n){var r=wm.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function Um(t,e,n){var r=km.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function Vm(t,e,n){var r=wm.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function $m(t,e,n){var r=wm.exec(e.slice(n));return r?(t.Q=1e3*+r[0],n+r[0].length):-1}function Gm(t,e){return xm(t.getDate(),e,2)}function Jm(t,e){return xm(t.getHours(),e,2)}function Zm(t,e){return xm(t.getHours()%12||12,e,2)}function Km(t,e){return xm(1+hp.count(Cp(t),t),e,3)}function Xm(t,e){return xm(t.getMilliseconds(),e,3)}function Qm(t,e){return Xm(t,e)+"000"}function ty(t,e){return xm(t.getMonth()+1,e,2)}function ey(t,e){return xm(t.getMinutes(),e,2)}function ny(t,e){return xm(t.getSeconds(),e,2)}function ry(t){var e=t.getDay();return 0===e?7:e}function iy(t,e){return xm(mp.count(Cp(t),t),e,2)}function ay(t,e){var n=t.getDay();return t=n>=4||0===n?bp(t):bp.ceil(t),xm(bp.count(Cp(t),t)+(4===Cp(t).getDay()),e,2)}function oy(t){return t.getDay()}function uy(t,e){return xm(yp.count(Cp(t),t),e,2)}function sy(t,e){return xm(t.getFullYear()%100,e,2)}function cy(t,e){return xm(t.getFullYear()%1e4,e,4)}function ly(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+xm(e/60|0,"0",2)+xm(e%60,"0",2)}function fy(t,e){return xm(t.getUTCDate(),e,2)}function dy(t,e){return xm(t.getUTCHours(),e,2)}function hy(t,e){return xm(t.getUTCHours()%12||12,e,2)}function _y(t,e){return xm(1+qp.count(lm(t),t),e,3)}function py(t,e){return xm(t.getUTCMilliseconds(),e,3)}function my(t,e){return py(t,e)+"000"}function yy(t,e){return xm(t.getUTCMonth()+1,e,2)}function gy(t,e){return xm(t.getUTCMinutes(),e,2)}function vy(t,e){return xm(t.getUTCSeconds(),e,2)}function by(t){var e=t.getUTCDay();return 0===e?7:e}function My(t,e){return xm(Vp.count(lm(t),t),e,2)}function wy(t,e){var n=t.getUTCDay();return t=n>=4||0===n?Zp(t):Zp.ceil(t),xm(Zp.count(lm(t),t)+(4===lm(t).getUTCDay()),e,2)}function ky(t){return t.getUTCDay()}function Ly(t,e){return xm($p.count(lm(t),t),e,2)}function xy(t,e){return xm(t.getUTCFullYear()%100,e,2)}function Dy(t,e){return xm(t.getUTCFullYear()%1e4,e,4)}function Ty(){return"+0000"}function Yy(){return"%"}function Ay(t){return+t}function Ey(t){return Math.floor(+t/1e3)}function Sy(t){return mm=pm(t),ym=mm.format,gm=mm.parse,vm=mm.utcFormat,bm=mm.utcParse,mm}Sy({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var jy=Date.prototype.toISOString?function(t){return t.toISOString()}:vm("%Y-%m-%dT%H:%M:%S.%LZ");var Oy=+new Date("2000-01-01T00:00:00.000Z")?function(t){var e=new Date(t);return isNaN(e)?null:e}:bm("%Y-%m-%dT%H:%M:%S.%LZ"),Cy=1e3,Hy=60*Cy,Py=60*Hy,Fy=24*Py,Ny=7*Fy,Ry=30*Fy,Iy=365*Fy;function By(t){return new Date(t)}function zy(t){return t instanceof Date?+t:+new Date(+t)}function qy(t,e,n,r,a,o,u,s,c){var l=E_(D_,zn),f=l.invert,d=l.domain,h=c(".%L"),_=c(":%S"),p=c("%I:%M"),m=c("%I %p"),y=c("%a %d"),g=c("%b %d"),v=c("%B"),b=c("%Y"),M=[[u,1,Cy],[u,5,5*Cy],[u,15,15*Cy],[u,30,30*Cy],[o,1,Hy],[o,5,5*Hy],[o,15,15*Hy],[o,30,30*Hy],[a,1,Py],[a,3,3*Py],[a,6,6*Py],[a,12,12*Py],[r,1,Fy],[r,2,2*Fy],[n,1,Ny],[e,1,Ry],[e,3,3*Ry],[t,1,Iy]];function w(i){return(u(i)1)&&(t-=Math.floor(t));var e=Math.abs(t-.5);return sv.h=360*t-100,sv.s=1.5-1.5*e,sv.l=.8-.9*e,sv+""},lv=Ue(),fv=Math.PI/3,dv=2*Math.PI/3,hv=function(t){var e;return t=(.5-t)*Math.PI,lv.r=255*(e=Math.sin(t))*e,lv.g=255*(e=Math.sin(t+fv))*e,lv.b=255*(e=Math.sin(t+dv))*e,lv+""};function _v(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}var pv=_v(Gy("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),mv=_v(Gy("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),yv=_v(Gy("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),gv=_v(Gy("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")),vv=function(t){return function(){return t}},bv=Math.abs,Mv=Math.atan2,wv=Math.cos,kv=Math.max,Lv=Math.min,xv=Math.sin,Dv=Math.sqrt,Tv=1e-12,Yv=Math.PI,Av=Yv/2,Ev=2*Yv;function Sv(t){return t>=1?Av:t<=-1?-Av:Math.asin(t)}function jv(t){return t.innerRadius}function Ov(t){return t.outerRadius}function Cv(t){return t.startAngle}function Hv(t){return t.endAngle}function Pv(t){return t&&t.padAngle}function Fv(t,e,n,r,i,a,o){var u=t-n,s=e-r,c=(o?a:-a)/Dv(u*u+s*s),l=c*s,f=-c*u,d=t+l,h=e+f,_=n+l,p=r+f,m=(d+_)/2,y=(h+p)/2,g=_-d,v=p-h,b=g*g+v*v,M=i-a,w=d*p-_*h,k=(v<0?-1:1)*Dv(kv(0,M*M*b-w*w)),L=(w*v-g*k)/b,x=(-w*g-v*k)/b,D=(w*v+g*k)/b,T=(-w*g+v*k)/b,Y=L-m,A=x-y,E=D-m,S=T-y;return Y*Y+A*A>E*E+S*S&&(L=D,x=T),{cx:L,cy:x,x01:-l,y01:-f,x11:L*(i/M-1),y11:x*(i/M-1)}}var Nv=function(){var t=jv,e=Ov,n=vv(0),r=null,i=Cv,a=Hv,o=Pv,u=null;function s(){var s,c,l,f=+t.apply(this,arguments),d=+e.apply(this,arguments),h=i.apply(this,arguments)-Av,_=a.apply(this,arguments)-Av,p=bv(_-h),m=_>h;if(u||(u=s=za()),dTv)if(p>Ev-Tv)u.moveTo(d*wv(h),d*xv(h)),u.arc(0,0,d,h,_,!m),f>Tv&&(u.moveTo(f*wv(_),f*xv(_)),u.arc(0,0,f,_,h,m));else{var y,g,v=h,b=_,M=h,w=_,k=p,L=p,x=o.apply(this,arguments)/2,D=x>Tv&&(r?+r.apply(this,arguments):Dv(f*f+d*d)),T=Lv(bv(d-f)/2,+n.apply(this,arguments)),Y=T,A=T;if(D>Tv){var E=Sv(D/f*xv(x)),S=Sv(D/d*xv(x));(k-=2*E)>Tv?(M+=E*=m?1:-1,w-=E):(k=0,M=w=(h+_)/2),(L-=2*S)>Tv?(v+=S*=m?1:-1,b-=S):(L=0,v=b=(h+_)/2)}var j=d*wv(v),O=d*xv(v),C=f*wv(w),H=f*xv(w);if(T>Tv){var P=d*wv(b),F=d*xv(b),N=f*wv(M),R=f*xv(M);if(pTv?function(t,e,n,r,i,a,o,u){var s=n-t,c=r-e,l=o-i,f=u-a,d=(l*(e-a)-f*(t-i))/(f*s-l*c);return[t+d*s,e+d*c]}(j,O,N,R,P,F,C,H):[C,H],B=j-I[0],z=O-I[1],q=P-I[0],W=F-I[1],U=1/xv(((l=(B*q+z*W)/(Dv(B*B+z*z)*Dv(q*q+W*W)))>1?0:l<-1?Yv:Math.acos(l))/2),V=Dv(I[0]*I[0]+I[1]*I[1]);Y=Lv(T,(f-V)/(U-1)),A=Lv(T,(d-V)/(U+1))}}L>Tv?A>Tv?(y=Fv(N,R,j,O,d,A,m),g=Fv(P,F,C,H,d,A,m),u.moveTo(y.cx+y.x01,y.cy+y.y01),ATv&&k>Tv?Y>Tv?(y=Fv(C,H,P,F,f,-Y,m),g=Fv(j,O,N,R,f,-Y,m),u.lineTo(y.cx+y.x01,y.cy+y.y01),Y=l;--f)u.point(m[f],y[f]);u.lineEnd(),u.areaEnd()}p&&(m[c]=+t(d,c,s),y[c]=+n(d,c,s),u.point(e?+e(d,c,s):m[c],r?+r(d,c,s):y[c]))}if(h)return u=null,h+""||null}function c(){return qv().defined(i).curve(o).context(a)}return s.x=function(n){return arguments.length?(t="function"==typeof n?n:vv(+n),e=null,s):t},s.x0=function(e){return arguments.length?(t="function"==typeof e?e:vv(+e),s):t},s.x1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:vv(+t),s):e},s.y=function(t){return arguments.length?(n="function"==typeof t?t:vv(+t),r=null,s):n},s.y0=function(t){return arguments.length?(n="function"==typeof t?t:vv(+t),s):n},s.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:vv(+t),s):r},s.lineX0=s.lineY0=function(){return c().x(t).y(n)},s.lineY1=function(){return c().x(t).y(r)},s.lineX1=function(){return c().x(e).y(n)},s.defined=function(t){return arguments.length?(i="function"==typeof t?t:vv(!!t),s):i},s.curve=function(t){return arguments.length?(o=t,null!=a&&(u=o(a)),s):o},s.context=function(t){return arguments.length?(null==t?a=u=null:u=o(a=t),s):a},s},Uv=function(t,e){return et?1:e>=t?0:NaN},Vv=function(t){return t},$v=function(){var t=Vv,e=Uv,n=null,r=vv(0),i=vv(Ev),a=vv(0);function o(o){var u,s,c,l,f,d=o.length,h=0,_=new Array(d),p=new Array(d),m=+r.apply(this,arguments),y=Math.min(Ev,Math.max(-Ev,i.apply(this,arguments)-m)),g=Math.min(Math.abs(y)/d,a.apply(this,arguments)),v=g*(y<0?-1:1);for(u=0;u0&&(h+=f);for(null!=e?_.sort(function(t,n){return e(p[t],p[n])}):null!=n&&_.sort(function(t,e){return n(o[t],o[e])}),u=0,c=h?(y-d*v)/h:0;u0?f*c:0)+v,p[s]={data:o[s],index:u,value:f,startAngle:m,endAngle:l,padAngle:g};return p}return o.value=function(e){return arguments.length?(t="function"==typeof e?e:vv(+e),o):t},o.sortValues=function(t){return arguments.length?(e=t,n=null,o):e},o.sort=function(t){return arguments.length?(n=t,e=null,o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:vv(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:vv(+t),o):i},o.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:vv(+t),o):a},o},Gv=Zv(Iv);function Jv(t){this._curve=t}function Zv(t){function e(e){return new Jv(t(e))}return e._curve=t,e}function Kv(t){var e=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?e(Zv(t)):e()._curve},t}Jv.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}};var Xv=function(){return Kv(qv().curve(Gv))},Qv=function(){var t=Wv().curve(Gv),e=t.curve,n=t.lineX0,r=t.lineX1,i=t.lineY0,a=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Kv(n())},delete t.lineX0,t.lineEndAngle=function(){return Kv(r())},delete t.lineX1,t.lineInnerRadius=function(){return Kv(i())},delete t.lineY0,t.lineOuterRadius=function(){return Kv(a())},delete t.lineY1,t.curve=function(t){return arguments.length?e(Zv(t)):e()._curve},t},tb=function(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]},eb=Array.prototype.slice;function nb(t){return t.source}function rb(t){return t.target}function ib(t){var e=nb,n=rb,r=Bv,i=zv,a=null;function o(){var o,u=eb.call(arguments),s=e.apply(this,u),c=n.apply(this,u);if(a||(a=o=za()),t(a,+r.apply(this,(u[0]=s,u)),+i.apply(this,u),+r.apply(this,(u[0]=c,u)),+i.apply(this,u)),o)return a=null,o+""||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(n=t,o):n},o.x=function(t){return arguments.length?(r="function"==typeof t?t:vv(+t),o):r},o.y=function(t){return arguments.length?(i="function"==typeof t?t:vv(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}function ab(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e=(e+r)/2,n,e,i,r,i)}function ob(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e,n=(n+i)/2,r,n,r,i)}function ub(t,e,n,r,i){var a=tb(e,n),o=tb(e,n=(n+i)/2),u=tb(r,n),s=tb(r,i);t.moveTo(a[0],a[1]),t.bezierCurveTo(o[0],o[1],u[0],u[1],s[0],s[1])}function sb(){return ib(ab)}function cb(){return ib(ob)}function lb(){var t=ib(ub);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t}var fb={draw:function(t,e){var n=Math.sqrt(e/Yv);t.moveTo(n,0),t.arc(0,0,n,0,Ev)}},db={draw:function(t,e){var n=Math.sqrt(e/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}},hb=Math.sqrt(1/3),_b=2*hb,pb={draw:function(t,e){var n=Math.sqrt(e/_b),r=n*hb;t.moveTo(0,-n),t.lineTo(r,0),t.lineTo(0,n),t.lineTo(-r,0),t.closePath()}},mb=Math.sin(Yv/10)/Math.sin(7*Yv/10),yb=Math.sin(Ev/10)*mb,gb=-Math.cos(Ev/10)*mb,vb={draw:function(t,e){var n=Math.sqrt(.8908130915292852*e),r=yb*n,i=gb*n;t.moveTo(0,-n),t.lineTo(r,i);for(var a=1;a<5;++a){var o=Ev*a/5,u=Math.cos(o),s=Math.sin(o);t.lineTo(s*n,-u*n),t.lineTo(u*r-s*i,s*r+u*i)}t.closePath()}},bb={draw:function(t,e){var n=Math.sqrt(e),r=-n/2;t.rect(r,r,n,n)}},Mb=Math.sqrt(3),wb={draw:function(t,e){var n=-Math.sqrt(e/(3*Mb));t.moveTo(0,2*n),t.lineTo(-Mb*n,-n),t.lineTo(Mb*n,-n),t.closePath()}},kb=Math.sqrt(3)/2,Lb=1/Math.sqrt(12),xb=3*(Lb/2+1),Db={draw:function(t,e){var n=Math.sqrt(e/xb),r=n/2,i=n*Lb,a=r,o=n*Lb+n,u=-a,s=o;t.moveTo(r,i),t.lineTo(a,o),t.lineTo(u,s),t.lineTo(-.5*r-kb*i,kb*r+-.5*i),t.lineTo(-.5*a-kb*o,kb*a+-.5*o),t.lineTo(-.5*u-kb*s,kb*u+-.5*s),t.lineTo(-.5*r+kb*i,-.5*i-kb*r),t.lineTo(-.5*a+kb*o,-.5*o-kb*a),t.lineTo(-.5*u+kb*s,-.5*s-kb*u),t.closePath()}},Tb=[fb,db,pb,bb,vb,wb,Db],Yb=function(){var t=vv(fb),e=vv(64),n=null;function r(){var r;if(n||(n=r=za()),t.apply(this,arguments).draw(n,+e.apply(this,arguments)),r)return n=null,r+""||null}return r.type=function(e){return arguments.length?(t="function"==typeof e?e:vv(e),r):t},r.size=function(t){return arguments.length?(e="function"==typeof t?t:vv(+t),r):e},r.context=function(t){return arguments.length?(n=null==t?null:t,r):n},r},Ab=function(){};function Eb(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Sb(t){this._context=t}Sb.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Eb(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Eb(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var jb=function(t){return new Sb(t)};function Ob(t){this._context=t}Ob.prototype={areaStart:Ab,areaEnd:Ab,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Eb(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var Cb=function(t){return new Ob(t)};function Hb(t){this._context=t}Hb.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:Eb(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};var Pb=function(t){return new Hb(t)};function Fb(t,e){this._basis=new Sb(t),this._beta=e}Fb.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var r,i=t[0],a=e[0],o=t[n]-i,u=e[n]-a,s=-1;++s<=n;)r=s/n,this._basis.point(this._beta*t[s]+(1-this._beta)*(i+r*o),this._beta*e[s]+(1-this._beta)*(a+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};var Nb=function t(e){function n(t){return 1===e?new Sb(t):new Fb(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function Rb(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Ib(t,e){this._context=t,this._k=(1-e)/6}Ib.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Rb(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Rb(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Bb=function t(e){function n(t){return new Ib(t,e)}return n.tension=function(e){return t(+e)},n}(0);function zb(t,e){this._context=t,this._k=(1-e)/6}zb.prototype={areaStart:Ab,areaEnd:Ab,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Rb(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var qb=function t(e){function n(t){return new zb(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Wb(t,e){this._context=t,this._k=(1-e)/6}Wb.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Rb(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Ub=function t(e){function n(t){return new Wb(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Vb(t,e,n){var r=t._x1,i=t._y1,a=t._x2,o=t._y2;if(t._l01_a>Tv){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,s=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/s,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/s}if(t._l23_a>Tv){var c=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*c+t._x1*t._l23_2a-e*t._l12_2a)/l,o=(o*c+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(r,i,a,o,t._x2,t._y2)}function $b(t,e){this._context=t,this._alpha=e}$b.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Vb(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Gb=function t(e){function n(t){return e?new $b(t,e):new Ib(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Jb(t,e){this._context=t,this._alpha=e}Jb.prototype={areaStart:Ab,areaEnd:Ab,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Vb(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Zb=function t(e){function n(t){return e?new Jb(t,e):new zb(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Kb(t,e){this._context=t,this._alpha=e}Kb.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Vb(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var Xb=function t(e){function n(t){return e?new Kb(t,e):new Wb(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Qb(t){this._context=t}Qb.prototype={areaStart:Ab,areaEnd:Ab,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};var tM=function(t){return new Qb(t)};function eM(t){return t<0?-1:1}function nM(t,e,n){var r=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(r||i<0&&-0),o=(n-t._y1)/(i||r<0&&-0),u=(a*i+o*r)/(r+i);return(eM(a)+eM(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(u))||0}function rM(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function iM(t,e,n){var r=t._x0,i=t._y0,a=t._x1,o=t._y1,u=(a-r)/3;t._context.bezierCurveTo(r+u,i+u*e,a-u,o-u*n,a,o)}function aM(t){this._context=t}function oM(t){this._context=new uM(t)}function uM(t){this._context=t}function sM(t){return new aM(t)}function cM(t){return new oM(t)}function lM(t){this._context=t}function fM(t){var e,n,r=t.length-1,i=new Array(r),a=new Array(r),o=new Array(r);for(i[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(o[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var _M=function(t){return new hM(t,.5)};function pM(t){return new hM(t,0)}function mM(t){return new hM(t,1)}var yM=function(t,e){if((i=t.length)>1)for(var n,r,i,a=1,o=t[e[0]],u=o.length;a=0;)n[e]=e;return n};function vM(t,e){return t[e]}var bM=function(){var t=vv([]),e=gM,n=yM,r=vM;function i(i){var a,o,u=t.apply(this,arguments),s=i.length,c=u.length,l=new Array(c);for(a=0;a0){for(var n,r,i,a=0,o=t[0].length;a1)for(var n,r,i,a,o,u,s=0,c=t[e[0]].length;s=0?(r[0]=a,r[1]=a+=i):i<0?(r[1]=o,r[0]=o+=i):r[0]=a},kM=function(t,e){if((n=t.length)>0){for(var n,r=0,i=t[e[0]],a=i.length;r0&&(r=(n=t[e[0]]).length)>0){for(var n,r,i,a=0,o=1;o0)){if(a/=d,d<0){if(a0){if(a>f)return;a>l&&(l=a)}if(a=r-s,d||!(a<0)){if(a/=d,d<0){if(a>f)return;a>l&&(l=a)}else if(d>0){if(a0)){if(a/=h,h<0){if(a0){if(a>f)return;a>l&&(l=a)}if(a=i-c,h||!(a<0)){if(a/=h,h<0){if(a>f)return;a>l&&(l=a)}else if(h>0){if(a0||f<1)||(l>0&&(t[0]=[s+l*d,c+l*h]),f<1&&(t[1]=[s+f*d,c+f*h]),!0)}}}}}function qM(t,e,n,r,i){var a=t[1];if(a)return!0;var o,u,s=t[0],c=t.left,l=t.right,f=c[0],d=c[1],h=l[0],_=l[1],p=(f+h)/2,m=(d+_)/2;if(_===d){if(p=r)return;if(f>h){if(s){if(s[1]>=i)return}else s=[p,n];a=[p,i]}else{if(s){if(s[1]1)if(f>h){if(s){if(s[1]>=i)return}else s=[(n-u)/o,n];a=[(i-u)/o,i]}else{if(s){if(s[1]=r)return}else s=[e,o*e+u];a=[r,o*r+u]}else{if(s){if(s[0]=-fw)){var h=s*s+c*c,_=l*l+f*f,p=(f*h-c*_)/d,m=(s*_-l*h)/d,y=GM.pop()||new JM;y.arc=t,y.site=i,y.x=p+o,y.y=(y.cy=m+u)+Math.sqrt(p*p+m*m),t.circle=y;for(var g=null,v=sw._;v;)if(y.ylw)u=u.L;else{if(!((i=a-aw(u,o))>lw)){r>-lw?(e=u.P,n=u):i>-lw?(e=u,n=u.N):e=n=u;break}if(!u.R){e=u;break}u=u.R}!function(t){uw[t.index]={site:t,halfedges:[]}}(t);var s=tw(t);if(ow.insert(e,s),e||n){if(e===n)return KM(e),n=tw(e.site),ow.insert(s,n),s.edge=n.edge=RM(e.site,s.site),ZM(e),void ZM(n);if(n){KM(e),KM(n);var c=e.site,l=c[0],f=c[1],d=t[0]-l,h=t[1]-f,_=n.site,p=_[0]-l,m=_[1]-f,y=2*(d*m-h*p),g=d*d+h*h,v=p*p+m*m,b=[(m*g-h*v)/y+l,(d*v-p*g)/y+f];BM(n.edge,c,_,b),s.edge=RM(c,t,null,b),n.edge=RM(t,_,null,b),ZM(e),ZM(n)}else s.edge=RM(e.site,s.site)}}function iw(t,e){var n=t.site,r=n[0],i=n[1],a=i-e;if(!a)return r;var o=t.P;if(!o)return-1/0;var u=(n=o.site)[0],s=n[1],c=s-e;if(!c)return u;var l=u-r,f=1/a-1/c,d=l/c;return f?(-d+Math.sqrt(d*d-2*f*(l*l/(-2*c)-s+c/2+i-a/2)))/f+r:(r+u)/2}function aw(t,e){var n=t.N;if(n)return iw(n,e);var r=t.site;return r[1]===e?r[0]:1/0}var ow,uw,sw,cw,lw=1e-6,fw=1e-12;function dw(t,e){return e[1]-t[1]||e[0]-t[0]}function hw(t,e){var n,r,i,a=t.sort(dw).pop();for(cw=[],uw=new Array(t.length),ow=new NM,sw=new NM;;)if(i=$M,a&&(!i||a[1]lw||Math.abs(i[0][1]-i[1][1])>lw)||delete cw[a]}(o,u,s,c),function(t,e,n,r){var i,a,o,u,s,c,l,f,d,h,_,p,m=uw.length,y=!0;for(i=0;ilw||Math.abs(p-d)>lw)&&(s.splice(u,0,cw.push(IM(o,h,Math.abs(_-t)lw?[t,Math.abs(f-t)lw?[Math.abs(d-r)lw?[n,Math.abs(f-n)lw?[Math.abs(d-e)=u)return null;var s=t-i.site[0],c=e-i.site[1],l=s*s+c*c;do{i=a.cells[r=o],o=null,i.halfedges.forEach(function(n){var r=a.edges[n],u=r.left;if(u!==i.site&&u||(u=r.right)){var s=t-u[0],c=e-u[1],f=s*s+c*c;fr?(r+i)/2:Math.min(0,r)||Math.max(0,i),o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o))}var Yw=function(){var t,e,n=ww,r=kw,i=Tw,a=xw,o=Dw,u=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],c=250,l=cr,f=[],d=dt("start","zoom","end"),h=500,_=150,p=0;function m(t){t.property("__zoom",Lw).on("wheel.zoom",k).on("mousedown.zoom",L).on("dblclick.zoom",x).filter(o).on("touchstart.zoom",D).on("touchmove.zoom",T).on("touchend.zoom touchcancel.zoom",Y).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function y(t,e){return(e=Math.max(u[0],Math.min(u[1],e)))===t.k?t:new yw(e,t.x,t.y)}function g(t,e,n){var r=e[0]-n[0]*t.k,i=e[1]-n[1]*t.k;return r===t.x&&i===t.y?t:new yw(t.k,r,i)}function v(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function b(t,e,n){t.on("start.zoom",function(){M(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){M(this,arguments).end()}).tween("zoom",function(){var t=arguments,i=M(this,t),a=r.apply(this,t),o=n||v(a),u=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),s=this.__zoom,c="function"==typeof e?e.apply(this,t):e,f=l(s.invert(o).concat(u/s.k),c.invert(o).concat(u/c.k));return function(t){if(1===t)t=c;else{var e=f(t),n=u/e[2];t=new yw(n,o[0]-e[0]*n,o[1]-e[1]*n)}i.zoom(null,t)}})}function M(t,e){for(var n,r=0,i=f.length;rp}t.zoom("mouse",i(g(t.that.__zoom,t.mouse[0]=fe(t.that),t.mouse[1]),t.extent,s))},!0).on("mouseup.zoom",function(){r.on("mousemove.zoom mouseup.zoom",null),ge($t.view,t.moved),Mw(),t.end()},!0),a=fe(this),o=$t.clientX,u=$t.clientY;ye($t.view),bw(),t.mouse=[a,this.__zoom.invert(a)],ni(this),t.start()}}function x(){if(n.apply(this,arguments)){var t=this.__zoom,e=fe(this),a=t.invert(e),o=t.k*($t.shiftKey?.5:2),u=i(g(y(t,o),e,a),r.apply(this,arguments),s);Mw(),c>0?ie(this).transition().duration(c).call(b,u,e):ie(this).call(m.transform,u)}}function D(){if(n.apply(this,arguments)){var e,r,i,a,o=M(this,arguments),u=$t.changedTouches,s=u.length;for(bw(),r=0;r2&&D.push("'"+this.terminals_[k]+"'");A=h.showPosition?"Parse error on line "+(s+1)+":\n"+h.showPosition()+"\nExpecting "+D.join(", ")+", got '"+(this.terminals_[g]||g)+"'":"Parse error on line "+(s+1)+": Unexpected "+(g==f?"end of input":"'"+(this.terminals_[g]||g)+"'"),this.parseError(A,{text:h.match,token:this.terminals_[g]||g,line:h.yylineno,loc:m,expected:D})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+g);switch(M[0]){case 1:n.push(g),i.push(h.yytext),a.push(h.yylloc),n.push(M[1]),g=null,v?(g=v,v=null):(c=h.yyleng,u=h.yytext,s=h.yylineno,m=h.yylloc,l>0&&l--);break;case 2:if(L=this.productions_[M[1]][1],Y.$=i[i.length-L],Y._$={first_line:a[a.length-(L||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(L||1)].first_column,last_column:a[a.length-1].last_column},y&&(Y._$.range=[a[a.length-(L||1)].range[0],a[a.length-1].range[1]]),void 0!==(w=this.performAction.apply(Y,[u,c,s,_.yy,M[1],i,a].concat(d))))return w;L&&(n=n.slice(0,-1*L*2),i=i.slice(0,-1*L),a=a.slice(0,-1*L)),n.push(this.productions_[M[1]][0]),i.push(Y.$),a.push(Y._$),x=o[n[n.length-2]][n[n.length-1]],n.push(x);break;case 3:return!0}}return!0}},L={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return 5;case 1:case 2:case 3:case 4:break;case 5:return this.begin("ID"),10;case 6:return this.begin("ALIAS"),40;case 7:return this.popState(),this.popState(),this.begin("LINE"),12;case 8:return this.popState(),this.popState(),5;case 9:return this.begin("LINE"),20;case 10:return this.begin("LINE"),22;case 11:return this.begin("LINE"),23;case 12:return this.begin("LINE"),28;case 13:return this.begin("LINE"),25;case 14:return this.begin("LINE"),27;case 15:return this.popState(),13;case 16:return 21;case 17:return 35;case 18:return 36;case 19:return 31;case 20:return 29;case 21:return this.begin("ID"),15;case 22:return this.begin("ID"),16;case 23:return 18;case 24:return 6;case 25:return 34;case 26:return 5;case 27:return e.yytext=e.yytext.trim(),40;case 28:return 43;case 29:return 44;case 30:return 41;case 31:return 42;case 32:return 45;case 33:return 46;case 34:return 47;case 35:return 38;case 36:return 39;case 37:return 5;case 38:return"INVALID"}},rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:participant\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\b)/i,/^(?:sequenceDiagram\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?::[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[2,3,15],inclusive:!1},ALIAS:{rules:[2,3,7,8],inclusive:!1},ID:{rules:[2,3,6],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],inclusive:!0}}};function x(){this.yy={}}return k.lexer=L,x.prototype=k,k.Parser=x,new x}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(11).readFileSync(n(12).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(7),n(5)(t))},function(t,e,n){(function(t,n){(function(){var r,i=200,a="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",o="Expected a function",u="__lodash_hash_undefined__",s=500,c="__lodash_placeholder__",l=1,f=2,d=4,h=1,_=2,p=1,m=2,y=4,g=8,v=16,b=32,M=64,w=128,k=256,L=512,x=30,D="...",T=800,Y=16,A=1,E=2,S=1/0,j=9007199254740991,O=1.7976931348623157e308,C=NaN,H=4294967295,P=H-1,F=H>>>1,N=[["ary",w],["bind",p],["bindKey",m],["curry",g],["curryRight",v],["flip",L],["partial",b],["partialRight",M],["rearg",k]],R="[object Arguments]",I="[object Array]",B="[object AsyncFunction]",z="[object Boolean]",q="[object Date]",W="[object DOMException]",U="[object Error]",V="[object Function]",$="[object GeneratorFunction]",G="[object Map]",J="[object Number]",Z="[object Null]",K="[object Object]",X="[object Proxy]",Q="[object RegExp]",tt="[object Set]",et="[object String]",nt="[object Symbol]",rt="[object Undefined]",it="[object WeakMap]",at="[object WeakSet]",ot="[object ArrayBuffer]",ut="[object DataView]",st="[object Float32Array]",ct="[object Float64Array]",lt="[object Int8Array]",ft="[object Int16Array]",dt="[object Int32Array]",ht="[object Uint8Array]",_t="[object Uint8ClampedArray]",pt="[object Uint16Array]",mt="[object Uint32Array]",yt=/\b__p \+= '';/g,gt=/\b(__p \+=) '' \+/g,vt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,bt=/&(?:amp|lt|gt|quot|#39);/g,Mt=/[&<>"']/g,wt=RegExp(bt.source),kt=RegExp(Mt.source),Lt=/<%-([\s\S]+?)%>/g,xt=/<%([\s\S]+?)%>/g,Dt=/<%=([\s\S]+?)%>/g,Tt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Yt=/^\w*$/,At=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Et=/[\\^$.*+?()[\]{}|]/g,St=RegExp(Et.source),jt=/^\s+|\s+$/g,Ot=/^\s+/,Ct=/\s+$/,Ht=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Pt=/\{\n\/\* \[wrapped with (.+)\] \*/,Ft=/,? & /,Nt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Rt=/\\(\\)?/g,It=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Bt=/\w*$/,zt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Wt=/^\[object .+?Constructor\]$/,Ut=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\d*)$/,$t=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Gt=/($^)/,Jt=/['\n\r\u2028\u2029\\]/g,Zt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Kt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Xt="[\\ud800-\\udfff]",Qt="["+Kt+"]",te="["+Zt+"]",ee="\\d+",ne="[\\u2700-\\u27bf]",re="[a-z\\xdf-\\xf6\\xf8-\\xff]",ie="[^\\ud800-\\udfff"+Kt+ee+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ae="\\ud83c[\\udffb-\\udfff]",oe="[^\\ud800-\\udfff]",ue="(?:\\ud83c[\\udde6-\\uddff]){2}",se="[\\ud800-\\udbff][\\udc00-\\udfff]",ce="[A-Z\\xc0-\\xd6\\xd8-\\xde]",le="(?:"+re+"|"+ie+")",fe="(?:"+ce+"|"+ie+")",de="(?:"+te+"|"+ae+")"+"?",he="[\\ufe0e\\ufe0f]?"+de+("(?:\\u200d(?:"+[oe,ue,se].join("|")+")[\\ufe0e\\ufe0f]?"+de+")*"),_e="(?:"+[ne,ue,se].join("|")+")"+he,pe="(?:"+[oe+te+"?",te,ue,se,Xt].join("|")+")",me=RegExp("['’]","g"),ye=RegExp(te,"g"),ge=RegExp(ae+"(?="+ae+")|"+pe+he,"g"),ve=RegExp([ce+"?"+re+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[Qt,ce,"$"].join("|")+")",fe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[Qt,ce+le,"$"].join("|")+")",ce+"?"+le+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ce+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ee,_e].join("|"),"g"),be=RegExp("[\\u200d\\ud800-\\udfff"+Zt+"\\ufe0e\\ufe0f]"),Me=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,we=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ke=-1,Le={};Le[st]=Le[ct]=Le[lt]=Le[ft]=Le[dt]=Le[ht]=Le[_t]=Le[pt]=Le[mt]=!0,Le[R]=Le[I]=Le[ot]=Le[z]=Le[ut]=Le[q]=Le[U]=Le[V]=Le[G]=Le[J]=Le[K]=Le[Q]=Le[tt]=Le[et]=Le[it]=!1;var xe={};xe[R]=xe[I]=xe[ot]=xe[ut]=xe[z]=xe[q]=xe[st]=xe[ct]=xe[lt]=xe[ft]=xe[dt]=xe[G]=xe[J]=xe[K]=xe[Q]=xe[tt]=xe[et]=xe[nt]=xe[ht]=xe[_t]=xe[pt]=xe[mt]=!0,xe[U]=xe[V]=xe[it]=!1;var De={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Te=parseFloat,Ye=parseInt,Ae="object"==typeof t&&t&&t.Object===Object&&t,Ee="object"==typeof self&&self&&self.Object===Object&&self,Se=Ae||Ee||Function("return this")(),je=e&&!e.nodeType&&e,Oe=je&&"object"==typeof n&&n&&!n.nodeType&&n,Ce=Oe&&Oe.exports===je,He=Ce&&Ae.process,Pe=function(){try{var t=Oe&&Oe.require&&Oe.require("util").types;return t||He&&He.binding&&He.binding("util")}catch(t){}}(),Fe=Pe&&Pe.isArrayBuffer,Ne=Pe&&Pe.isDate,Re=Pe&&Pe.isMap,Ie=Pe&&Pe.isRegExp,Be=Pe&&Pe.isSet,ze=Pe&&Pe.isTypedArray;function qe(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function We(t,e,n,r){for(var i=-1,a=null==t?0:t.length;++i-1}function Ze(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function vn(t,e){for(var n=t.length;n--&&on(e,t[n],0)>-1;);return n}var bn=fn({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Mn=fn({"&":"&","<":"<",">":">",'"':""","'":"'"});function wn(t){return"\\"+De[t]}function kn(t){return be.test(t)}function Ln(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function xn(t,e){return function(n){return t(e(n))}}function Dn(t,e){for(var n=-1,r=t.length,i=0,a=[];++n",""":'"',"'":"'"});var jn=function t(e){var n,Zt=(e=null==e?Se:jn.defaults(Se.Object(),e,jn.pick(Se,we))).Array,Kt=e.Date,Xt=e.Error,Qt=e.Function,te=e.Math,ee=e.Object,ne=e.RegExp,re=e.String,ie=e.TypeError,ae=Zt.prototype,oe=Qt.prototype,ue=ee.prototype,se=e["__core-js_shared__"],ce=oe.toString,le=ue.hasOwnProperty,fe=0,de=(n=/[^.]+$/.exec(se&&se.keys&&se.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",he=ue.toString,_e=ce.call(ee),pe=Se._,ge=ne("^"+ce.call(le).replace(Et,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),be=Ce?e.Buffer:r,De=e.Symbol,Ae=e.Uint8Array,Ee=be?be.allocUnsafe:r,je=xn(ee.getPrototypeOf,ee),Oe=ee.create,He=ue.propertyIsEnumerable,Pe=ae.splice,nn=De?De.isConcatSpreadable:r,fn=De?De.iterator:r,On=De?De.toStringTag:r,Cn=function(){try{var t=Na(ee,"defineProperty");return t({},"",{}),t}catch(t){}}(),Hn=e.clearTimeout!==Se.clearTimeout&&e.clearTimeout,Pn=Kt&&Kt.now!==Se.Date.now&&Kt.now,Fn=e.setTimeout!==Se.setTimeout&&e.setTimeout,Nn=te.ceil,Rn=te.floor,In=ee.getOwnPropertySymbols,Bn=be?be.isBuffer:r,zn=e.isFinite,qn=ae.join,Wn=xn(ee.keys,ee),Un=te.max,Vn=te.min,$n=Kt.now,Gn=e.parseInt,Jn=te.random,Zn=ae.reverse,Kn=Na(e,"DataView"),Xn=Na(e,"Map"),Qn=Na(e,"Promise"),tr=Na(e,"Set"),er=Na(e,"WeakMap"),nr=Na(ee,"create"),rr=er&&new er,ir={},ar=lo(Kn),or=lo(Xn),ur=lo(Qn),sr=lo(tr),cr=lo(er),lr=De?De.prototype:r,fr=lr?lr.valueOf:r,dr=lr?lr.toString:r;function hr(t){if(Yu(t)&&!yu(t)&&!(t instanceof yr)){if(t instanceof mr)return t;if(le.call(t,"__wrapped__"))return fo(t)}return new mr(t)}var _r=function(){function t(){}return function(e){if(!Tu(e))return{};if(Oe)return Oe(e);t.prototype=e;var n=new t;return t.prototype=r,n}}();function pr(){}function mr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=r}function yr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=H,this.__views__=[]}function gr(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Hr(t,e,n,i,a,o){var u,s=e&l,c=e&f,h=e&d;if(n&&(u=a?n(t,i,a,o):n(t)),u!==r)return u;if(!Tu(t))return t;var _=yu(t);if(_){if(u=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&le.call(t,"index")&&(n.index=t.index,n.input=t.input),n}(t),!s)return na(t,u)}else{var p=Ba(t),m=p==V||p==$;if(Mu(t))return Zi(t,s);if(p==K||p==R||m&&!a){if(u=c||m?{}:qa(t),!s)return c?function(t,e){return ra(t,Ia(t),e)}(t,function(t,e){return t&&ra(e,as(e),t)}(u,t)):function(t,e){return ra(t,Ra(t),e)}(t,Sr(u,t))}else{if(!xe[p])return a?t:{};u=function(t,e,n){var r,i,a,o=t.constructor;switch(e){case ot:return Ki(t);case z:case q:return new o(+t);case ut:return function(t,e){var n=e?Ki(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case st:case ct:case lt:case ft:case dt:case ht:case _t:case pt:case mt:return Xi(t,n);case G:return new o;case J:case et:return new o(t);case Q:return(a=new(i=t).constructor(i.source,Bt.exec(i))).lastIndex=i.lastIndex,a;case tt:return new o;case nt:return r=t,fr?ee(fr.call(r)):{}}}(t,p,s)}}o||(o=new wr);var y=o.get(t);if(y)return y;if(o.set(t,u),Ou(t))return t.forEach(function(r){u.add(Hr(r,e,n,r,t,o))}),u;if(Au(t))return t.forEach(function(r,i){u.set(i,Hr(r,e,n,i,t,o))}),u;var g=_?r:(h?c?Sa:Ea:c?as:is)(t);return Ue(g||t,function(r,i){g&&(r=t[i=r]),Yr(u,i,Hr(r,e,n,i,t,o))}),u}function Pr(t,e,n){var i=n.length;if(null==t)return!i;for(t=ee(t);i--;){var a=n[i],o=e[a],u=t[a];if(u===r&&!(a in t)||!o(u))return!1}return!0}function Fr(t,e,n){if("function"!=typeof t)throw new ie(o);return ro(function(){t.apply(r,n)},e)}function Nr(t,e,n,r){var a=-1,o=Je,u=!0,s=t.length,c=[],l=e.length;if(!s)return c;n&&(e=Ke(e,pn(n))),r?(o=Ze,u=!1):e.length>=i&&(o=yn,u=!1,e=new Mr(e));t:for(;++a-1},vr.prototype.set=function(t,e){var n=this.__data__,r=Ar(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},br.prototype.clear=function(){this.size=0,this.__data__={hash:new gr,map:new(Xn||vr),string:new gr}},br.prototype.delete=function(t){var e=Pa(this,t).delete(t);return this.size-=e?1:0,e},br.prototype.get=function(t){return Pa(this,t).get(t)},br.prototype.has=function(t){return Pa(this,t).has(t)},br.prototype.set=function(t,e){var n=Pa(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Mr.prototype.add=Mr.prototype.push=function(t){return this.__data__.set(t,u),this},Mr.prototype.has=function(t){return this.__data__.has(t)},wr.prototype.clear=function(){this.__data__=new vr,this.size=0},wr.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},wr.prototype.get=function(t){return this.__data__.get(t)},wr.prototype.has=function(t){return this.__data__.has(t)},wr.prototype.set=function(t,e){var n=this.__data__;if(n instanceof vr){var r=n.__data__;if(!Xn||r.length0&&n(u)?e>1?Wr(u,e-1,n,r,i):Xe(i,u):r||(i[i.length]=u)}return i}var Ur=ua(),Vr=ua(!0);function $r(t,e){return t&&Ur(t,e,is)}function Gr(t,e){return t&&Vr(t,e,is)}function Jr(t,e){return Ge(e,function(e){return Lu(t[e])})}function Zr(t,e){for(var n=0,i=(e=Vi(e,t)).length;null!=t&&ne}function ti(t,e){return null!=t&&le.call(t,e)}function ei(t,e){return null!=t&&e in ee(t)}function ni(t,e,n){for(var i=n?Ze:Je,a=t[0].length,o=t.length,u=o,s=Zt(o),c=1/0,l=[];u--;){var f=t[u];u&&e&&(f=Ke(f,pn(e))),c=Vn(f.length,c),s[u]=!n&&(e||a>=120&&f.length>=120)?new Mr(u&&f):r}f=t[0];var d=-1,h=s[0];t:for(;++d=u)return s;var c=n[r];return s*("desc"==c?-1:1)}}return t.index-e.index}(t,e,n)})}function gi(t,e,n){for(var r=-1,i=e.length,a={};++r-1;)u!==t&&Pe.call(u,s,1),Pe.call(t,s,1);return t}function bi(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==a){var a=i;Ua(i)?Pe.call(t,i,1):Ni(t,i)}}return t}function Mi(t,e){return t+Rn(Jn()*(e-t+1))}function wi(t,e){var n="";if(!t||e<1||e>j)return n;do{e%2&&(n+=t),(e=Rn(e/2))&&(t+=t)}while(e);return n}function ki(t,e){return io(Qa(t,e,Es),t+"")}function Li(t){return Lr(hs(t))}function xi(t,e){var n=hs(t);return uo(n,Cr(e,0,n.length))}function Di(t,e,n,i){if(!Tu(t))return t;for(var a=-1,o=(e=Vi(e,t)).length,u=o-1,s=t;null!=s&&++ai?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=Zt(i);++r>>1,o=t[a];null!==o&&!Hu(o)&&(n?o<=e:o=i){var l=e?null:wa(t);if(l)return Tn(l);u=!1,a=yn,c=new Mr}else c=e?[]:s;t:for(;++r=i?t:Ei(t,e,n)}var Ji=Hn||function(t){return Se.clearTimeout(t)};function Zi(t,e){if(e)return t.slice();var n=t.length,r=Ee?Ee(n):new t.constructor(n);return t.copy(r),r}function Ki(t){var e=new t.constructor(t.byteLength);return new Ae(e).set(new Ae(t)),e}function Xi(t,e){var n=e?Ki(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function Qi(t,e){if(t!==e){var n=t!==r,i=null===t,a=t==t,o=Hu(t),u=e!==r,s=null===e,c=e==e,l=Hu(e);if(!s&&!l&&!o&&t>e||o&&u&&c&&!s&&!l||i&&u&&c||!n&&c||!a)return 1;if(!i&&!o&&!l&&t1?n[a-1]:r,u=a>2?n[2]:r;for(o=t.length>3&&"function"==typeof o?(a--,o):r,u&&Va(n[0],n[1],u)&&(o=a<3?r:o,a=1),e=ee(e);++i-1?a[o?e[u]:u]:r}}function da(t){return Aa(function(e){var n=e.length,i=n,a=mr.prototype.thru;for(t&&e.reverse();i--;){var u=e[i];if("function"!=typeof u)throw new ie(o);if(a&&!s&&"wrapper"==Oa(u))var s=new mr([],!0)}for(i=s?i:n;++i1&&g.reverse(),f&&cs))return!1;var l=o.get(t);if(l&&o.get(e))return l==e;var f=-1,d=!0,p=n&_?new Mr:r;for(o.set(t,e),o.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Ht,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return Ue(N,function(n){var r="_."+n[0];e&n[1]&&!Je(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(Pt);return e?e[1].split(Ft):[]}(r),n)))}function oo(t){var e=0,n=0;return function(){var i=$n(),a=Y-(i-n);if(n=i,a>0){if(++e>=T)return arguments[0]}else e=0;return t.apply(r,arguments)}}function uo(t,e){var n=-1,i=t.length,a=i-1;for(e=e===r?i:e;++n1?t[e-1]:r;return n="function"==typeof n?(t.pop(),n):r,jo(t,n)});function Ro(t){var e=hr(t);return e.__chain__=!0,e}function Io(t,e){return e(t)}var Bo=Aa(function(t){var e=t.length,n=e?t[0]:0,i=this.__wrapped__,a=function(e){return Or(e,t)};return!(e>1||this.__actions__.length)&&i instanceof yr&&Ua(n)?((i=i.slice(n,+n+(e?1:0))).__actions__.push({func:Io,args:[a],thisArg:r}),new mr(i,this.__chain__).thru(function(t){return e&&!t.length&&t.push(r),t})):this.thru(a)});var zo=ia(function(t,e,n){le.call(t,n)?++t[n]:jr(t,n,1)});var qo=fa(mo),Wo=fa(yo);function Uo(t,e){return(yu(t)?Ue:Rr)(t,Ha(e,3))}function Vo(t,e){return(yu(t)?Ve:Ir)(t,Ha(e,3))}var $o=ia(function(t,e,n){le.call(t,n)?t[n].push(e):jr(t,n,[e])});var Go=ki(function(t,e,n){var r=-1,i="function"==typeof e,a=vu(t)?Zt(t.length):[];return Rr(t,function(t){a[++r]=i?qe(e,t,n):ri(t,e,n)}),a}),Jo=ia(function(t,e,n){jr(t,n,e)});function Zo(t,e){return(yu(t)?Ke:di)(t,Ha(e,3))}var Ko=ia(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]});var Xo=ki(function(t,e){if(null==t)return[];var n=e.length;return n>1&&Va(t,e[0],e[1])?e=[]:n>2&&Va(e[0],e[1],e[2])&&(e=[e[0]]),yi(t,Wr(e,1),[])}),Qo=Pn||function(){return Se.Date.now()};function tu(t,e,n){return e=n?r:e,e=t&&null==e?t.length:e,La(t,w,r,r,r,r,e)}function eu(t,e){var n;if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=r),n}}var nu=ki(function(t,e,n){var r=p;if(n.length){var i=Dn(n,Ca(nu));r|=b}return La(t,r,e,n,i)}),ru=ki(function(t,e,n){var r=p|m;if(n.length){var i=Dn(n,Ca(ru));r|=b}return La(e,r,t,n,i)});function iu(t,e,n){var i,a,u,s,c,l,f=0,d=!1,h=!1,_=!0;if("function"!=typeof t)throw new ie(o);function p(e){var n=i,o=a;return i=a=r,f=e,s=t.apply(o,n)}function m(t){var n=t-l;return l===r||n>=e||n<0||h&&t-f>=u}function y(){var t=Qo();if(m(t))return g(t);c=ro(y,function(t){var n=e-(t-l);return h?Vn(n,u-(t-f)):n}(t))}function g(t){return c=r,_&&i?p(t):(i=a=r,s)}function v(){var t=Qo(),n=m(t);if(i=arguments,a=this,l=t,n){if(c===r)return function(t){return f=t,c=ro(y,e),d?p(t):s}(l);if(h)return c=ro(y,e),p(l)}return c===r&&(c=ro(y,e)),s}return e=qu(e)||0,Tu(n)&&(d=!!n.leading,u=(h="maxWait"in n)?Un(qu(n.maxWait)||0,e):u,_="trailing"in n?!!n.trailing:_),v.cancel=function(){c!==r&&Ji(c),f=0,i=l=a=c=r},v.flush=function(){return c===r?s:g(Qo())},v}var au=ki(function(t,e){return Fr(t,1,e)}),ou=ki(function(t,e,n){return Fr(t,qu(e)||0,n)});function uu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new ie(o);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],a=n.cache;if(a.has(i))return a.get(i);var o=t.apply(this,r);return n.cache=a.set(i,o)||a,o};return n.cache=new(uu.Cache||br),n}function su(t){if("function"!=typeof t)throw new ie(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}uu.Cache=br;var cu=$i(function(t,e){var n=(e=1==e.length&&yu(e[0])?Ke(e[0],pn(Ha())):Ke(Wr(e,1),pn(Ha()))).length;return ki(function(r){for(var i=-1,a=Vn(r.length,n);++i=e}),mu=ii(function(){return arguments}())?ii:function(t){return Yu(t)&&le.call(t,"callee")&&!He.call(t,"callee")},yu=Zt.isArray,gu=Fe?pn(Fe):function(t){return Yu(t)&&Xr(t)==ot};function vu(t){return null!=t&&Du(t.length)&&!Lu(t)}function bu(t){return Yu(t)&&vu(t)}var Mu=Bn||qs,wu=Ne?pn(Ne):function(t){return Yu(t)&&Xr(t)==q};function ku(t){if(!Yu(t))return!1;var e=Xr(t);return e==U||e==W||"string"==typeof t.message&&"string"==typeof t.name&&!Su(t)}function Lu(t){if(!Tu(t))return!1;var e=Xr(t);return e==V||e==$||e==B||e==X}function xu(t){return"number"==typeof t&&t==Bu(t)}function Du(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=j}function Tu(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Yu(t){return null!=t&&"object"==typeof t}var Au=Re?pn(Re):function(t){return Yu(t)&&Ba(t)==G};function Eu(t){return"number"==typeof t||Yu(t)&&Xr(t)==J}function Su(t){if(!Yu(t)||Xr(t)!=K)return!1;var e=je(t);if(null===e)return!0;var n=le.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ce.call(n)==_e}var ju=Ie?pn(Ie):function(t){return Yu(t)&&Xr(t)==Q};var Ou=Be?pn(Be):function(t){return Yu(t)&&Ba(t)==tt};function Cu(t){return"string"==typeof t||!yu(t)&&Yu(t)&&Xr(t)==et}function Hu(t){return"symbol"==typeof t||Yu(t)&&Xr(t)==nt}var Pu=ze?pn(ze):function(t){return Yu(t)&&Du(t.length)&&!!Le[Xr(t)]};var Fu=va(fi),Nu=va(function(t,e){return t<=e});function Ru(t){if(!t)return[];if(vu(t))return Cu(t)?En(t):na(t);if(fn&&t[fn])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[fn]());var e=Ba(t);return(e==G?Ln:e==tt?Tn:hs)(t)}function Iu(t){return t?(t=qu(t))===S||t===-S?(t<0?-1:1)*O:t==t?t:0:0===t?t:0}function Bu(t){var e=Iu(t),n=e%1;return e==e?n?e-n:e:0}function zu(t){return t?Cr(Bu(t),0,H):0}function qu(t){if("number"==typeof t)return t;if(Hu(t))return C;if(Tu(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Tu(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(jt,"");var n=qt.test(t);return n||Ut.test(t)?Ye(t.slice(2),n?2:8):zt.test(t)?C:+t}function Wu(t){return ra(t,as(t))}function Uu(t){return null==t?"":Pi(t)}var Vu=aa(function(t,e){if(Za(e)||vu(e))ra(e,is(e),t);else for(var n in e)le.call(e,n)&&Yr(t,n,e[n])}),$u=aa(function(t,e){ra(e,as(e),t)}),Gu=aa(function(t,e,n,r){ra(e,as(e),t,r)}),Ju=aa(function(t,e,n,r){ra(e,is(e),t,r)}),Zu=Aa(Or);var Ku=ki(function(t,e){t=ee(t);var n=-1,i=e.length,a=i>2?e[2]:r;for(a&&Va(e[0],e[1],a)&&(i=1);++n1),e}),ra(t,Sa(t),n),r&&(n=Hr(n,l|f|d,Ta));for(var i=e.length;i--;)Ni(n,e[i]);return n});var cs=Aa(function(t,e){return null==t?{}:function(t,e){return gi(t,e,function(e,n){return ts(t,n)})}(t,e)});function ls(t,e){if(null==t)return{};var n=Ke(Sa(t),function(t){return[t]});return e=Ha(e),gi(t,n,function(t,n){return e(t,n[0])})}var fs=ka(is),ds=ka(as);function hs(t){return null==t?[]:mn(t,is(t))}var _s=ca(function(t,e,n){return e=e.toLowerCase(),t+(n?ps(e):e)});function ps(t){return ks(Uu(t).toLowerCase())}function ms(t){return(t=Uu(t))&&t.replace($t,bn).replace(ye,"")}var ys=ca(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),gs=ca(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),vs=sa("toLowerCase");var bs=ca(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()});var Ms=ca(function(t,e,n){return t+(n?" ":"")+ks(e)});var ws=ca(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),ks=sa("toUpperCase");function Ls(t,e,n){return t=Uu(t),(e=n?r:e)===r?function(t){return Me.test(t)}(t)?function(t){return t.match(ve)||[]}(t):function(t){return t.match(Nt)||[]}(t):t.match(e)||[]}var xs=ki(function(t,e){try{return qe(t,r,e)}catch(t){return ku(t)?t:new Xt(t)}}),Ds=Aa(function(t,e){return Ue(e,function(e){e=co(e),jr(t,e,nu(t[e],t))}),t});function Ts(t){return function(){return t}}var Ys=da(),As=da(!0);function Es(t){return t}function Ss(t){return si("function"==typeof t?t:Hr(t,l))}var js=ki(function(t,e){return function(n){return ri(n,t,e)}}),Os=ki(function(t,e){return function(n){return ri(t,n,e)}});function Cs(t,e,n){var r=is(e),i=Jr(e,r);null!=n||Tu(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=Jr(e,is(e)));var a=!(Tu(n)&&"chain"in n&&!n.chain),o=Lu(t);return Ue(i,function(n){var r=e[n];t[n]=r,o&&(t.prototype[n]=function(){var e=this.__chain__;if(a||e){var n=t(this.__wrapped__);return(n.__actions__=na(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Xe([this.value()],arguments))})}),t}function Hs(){}var Ps=ma(Ke),Fs=ma($e),Ns=ma(en);function Rs(t){return $a(t)?ln(co(t)):function(t){return function(e){return Zr(e,t)}}(t)}var Is=ga(),Bs=ga(!0);function zs(){return[]}function qs(){return!1}var Ws=pa(function(t,e){return t+e},0),Us=Ma("ceil"),Vs=pa(function(t,e){return t/e},1),$s=Ma("floor");var Gs,Js=pa(function(t,e){return t*e},1),Zs=Ma("round"),Ks=pa(function(t,e){return t-e},0);return hr.after=function(t,e){if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){if(--t<1)return e.apply(this,arguments)}},hr.ary=tu,hr.assign=Vu,hr.assignIn=$u,hr.assignInWith=Gu,hr.assignWith=Ju,hr.at=Zu,hr.before=eu,hr.bind=nu,hr.bindAll=Ds,hr.bindKey=ru,hr.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return yu(t)?t:[t]},hr.chain=Ro,hr.chunk=function(t,e,n){e=(n?Va(t,e,n):e===r)?1:Un(Bu(e),0);var i=null==t?0:t.length;if(!i||e<1)return[];for(var a=0,o=0,u=Zt(Nn(i/e));aa?0:a+n),(i=i===r||i>a?a:Bu(i))<0&&(i+=a),i=n>i?0:zu(i);n>>0)?(t=Uu(t))&&("string"==typeof e||null!=e&&!ju(e))&&!(e=Pi(e))&&kn(t)?Gi(En(t),0,n):t.split(e,n):[]},hr.spread=function(t,e){if("function"!=typeof t)throw new ie(o);return e=null==e?0:Un(Bu(e),0),ki(function(n){var r=n[e],i=Gi(n,0,e);return r&&Xe(i,r),qe(t,this,i)})},hr.tail=function(t){var e=null==t?0:t.length;return e?Ei(t,1,e):[]},hr.take=function(t,e,n){return t&&t.length?Ei(t,0,(e=n||e===r?1:Bu(e))<0?0:e):[]},hr.takeRight=function(t,e,n){var i=null==t?0:t.length;return i?Ei(t,(e=i-(e=n||e===r?1:Bu(e)))<0?0:e,i):[]},hr.takeRightWhile=function(t,e){return t&&t.length?Ii(t,Ha(e,3),!1,!0):[]},hr.takeWhile=function(t,e){return t&&t.length?Ii(t,Ha(e,3)):[]},hr.tap=function(t,e){return e(t),t},hr.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new ie(o);return Tu(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),iu(t,e,{leading:r,maxWait:e,trailing:i})},hr.thru=Io,hr.toArray=Ru,hr.toPairs=fs,hr.toPairsIn=ds,hr.toPath=function(t){return yu(t)?Ke(t,co):Hu(t)?[t]:na(so(Uu(t)))},hr.toPlainObject=Wu,hr.transform=function(t,e,n){var r=yu(t),i=r||Mu(t)||Pu(t);if(e=Ha(e,4),null==n){var a=t&&t.constructor;n=i?r?new a:[]:Tu(t)&&Lu(a)?_r(je(t)):{}}return(i?Ue:$r)(t,function(t,r,i){return e(n,t,r,i)}),n},hr.unary=function(t){return tu(t,1)},hr.union=Yo,hr.unionBy=Ao,hr.unionWith=Eo,hr.uniq=function(t){return t&&t.length?Fi(t):[]},hr.uniqBy=function(t,e){return t&&t.length?Fi(t,Ha(e,2)):[]},hr.uniqWith=function(t,e){return e="function"==typeof e?e:r,t&&t.length?Fi(t,r,e):[]},hr.unset=function(t,e){return null==t||Ni(t,e)},hr.unzip=So,hr.unzipWith=jo,hr.update=function(t,e,n){return null==t?t:Ri(t,e,Ui(n))},hr.updateWith=function(t,e,n,i){return i="function"==typeof i?i:r,null==t?t:Ri(t,e,Ui(n),i)},hr.values=hs,hr.valuesIn=function(t){return null==t?[]:mn(t,as(t))},hr.without=Oo,hr.words=Ls,hr.wrap=function(t,e){return lu(Ui(e),t)},hr.xor=Co,hr.xorBy=Ho,hr.xorWith=Po,hr.zip=Fo,hr.zipObject=function(t,e){return qi(t||[],e||[],Yr)},hr.zipObjectDeep=function(t,e){return qi(t||[],e||[],Di)},hr.zipWith=No,hr.entries=fs,hr.entriesIn=ds,hr.extend=$u,hr.extendWith=Gu,Cs(hr,hr),hr.add=Ws,hr.attempt=xs,hr.camelCase=_s,hr.capitalize=ps,hr.ceil=Us,hr.clamp=function(t,e,n){return n===r&&(n=e,e=r),n!==r&&(n=(n=qu(n))==n?n:0),e!==r&&(e=(e=qu(e))==e?e:0),Cr(qu(t),e,n)},hr.clone=function(t){return Hr(t,d)},hr.cloneDeep=function(t){return Hr(t,l|d)},hr.cloneDeepWith=function(t,e){return Hr(t,l|d,e="function"==typeof e?e:r)},hr.cloneWith=function(t,e){return Hr(t,d,e="function"==typeof e?e:r)},hr.conformsTo=function(t,e){return null==e||Pr(t,e,is(e))},hr.deburr=ms,hr.defaultTo=function(t,e){return null==t||t!=t?e:t},hr.divide=Vs,hr.endsWith=function(t,e,n){t=Uu(t),e=Pi(e);var i=t.length,a=n=n===r?i:Cr(Bu(n),0,i);return(n-=e.length)>=0&&t.slice(n,a)==e},hr.eq=hu,hr.escape=function(t){return(t=Uu(t))&&kt.test(t)?t.replace(Mt,Mn):t},hr.escapeRegExp=function(t){return(t=Uu(t))&&St.test(t)?t.replace(Et,"\\$&"):t},hr.every=function(t,e,n){var i=yu(t)?$e:Br;return n&&Va(t,e,n)&&(e=r),i(t,Ha(e,3))},hr.find=qo,hr.findIndex=mo,hr.findKey=function(t,e){return rn(t,Ha(e,3),$r)},hr.findLast=Wo,hr.findLastIndex=yo,hr.findLastKey=function(t,e){return rn(t,Ha(e,3),Gr)},hr.floor=$s,hr.forEach=Uo,hr.forEachRight=Vo,hr.forIn=function(t,e){return null==t?t:Ur(t,Ha(e,3),as)},hr.forInRight=function(t,e){return null==t?t:Vr(t,Ha(e,3),as)},hr.forOwn=function(t,e){return t&&$r(t,Ha(e,3))},hr.forOwnRight=function(t,e){return t&&Gr(t,Ha(e,3))},hr.get=Qu,hr.gt=_u,hr.gte=pu,hr.has=function(t,e){return null!=t&&za(t,e,ti)},hr.hasIn=ts,hr.head=vo,hr.identity=Es,hr.includes=function(t,e,n,r){t=vu(t)?t:hs(t),n=n&&!r?Bu(n):0;var i=t.length;return n<0&&(n=Un(i+n,0)),Cu(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&on(t,e,n)>-1},hr.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Bu(n);return i<0&&(i=Un(r+i,0)),on(t,e,i)},hr.inRange=function(t,e,n){return e=Iu(e),n===r?(n=e,e=0):n=Iu(n),function(t,e,n){return t>=Vn(e,n)&&t=-j&&t<=j},hr.isSet=Ou,hr.isString=Cu,hr.isSymbol=Hu,hr.isTypedArray=Pu,hr.isUndefined=function(t){return t===r},hr.isWeakMap=function(t){return Yu(t)&&Ba(t)==it},hr.isWeakSet=function(t){return Yu(t)&&Xr(t)==at},hr.join=function(t,e){return null==t?"":qn.call(t,e)},hr.kebabCase=ys,hr.last=ko,hr.lastIndexOf=function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var a=i;return n!==r&&(a=(a=Bu(n))<0?Un(i+a,0):Vn(a,i-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,a):an(t,sn,a,!0)},hr.lowerCase=gs,hr.lowerFirst=vs,hr.lt=Fu,hr.lte=Nu,hr.max=function(t){return t&&t.length?zr(t,Es,Qr):r},hr.maxBy=function(t,e){return t&&t.length?zr(t,Ha(e,2),Qr):r},hr.mean=function(t){return cn(t,Es)},hr.meanBy=function(t,e){return cn(t,Ha(e,2))},hr.min=function(t){return t&&t.length?zr(t,Es,fi):r},hr.minBy=function(t,e){return t&&t.length?zr(t,Ha(e,2),fi):r},hr.stubArray=zs,hr.stubFalse=qs,hr.stubObject=function(){return{}},hr.stubString=function(){return""},hr.stubTrue=function(){return!0},hr.multiply=Js,hr.nth=function(t,e){return t&&t.length?mi(t,Bu(e)):r},hr.noConflict=function(){return Se._===this&&(Se._=pe),this},hr.noop=Hs,hr.now=Qo,hr.pad=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?An(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return ya(Rn(i),n)+t+ya(Nn(i),n)},hr.padEnd=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?An(t):0;return e&&re){var i=t;t=e,e=i}if(n||t%1||e%1){var a=Jn();return Vn(t+a*(e-t+Te("1e-"+((a+"").length-1))),e)}return Mi(t,e)},hr.reduce=function(t,e,n){var r=yu(t)?Qe:dn,i=arguments.length<3;return r(t,Ha(e,4),n,i,Rr)},hr.reduceRight=function(t,e,n){var r=yu(t)?tn:dn,i=arguments.length<3;return r(t,Ha(e,4),n,i,Ir)},hr.repeat=function(t,e,n){return e=(n?Va(t,e,n):e===r)?1:Bu(e),wi(Uu(t),e)},hr.replace=function(){var t=arguments,e=Uu(t[0]);return t.length<3?e:e.replace(t[1],t[2])},hr.result=function(t,e,n){var i=-1,a=(e=Vi(e,t)).length;for(a||(a=1,t=r);++ij)return[];var n=H,r=Vn(t,H);e=Ha(e),t-=H;for(var i=_n(r,e);++n=o)return t;var s=n-An(i);if(s<1)return i;var c=u?Gi(u,0,s).join(""):t.slice(0,s);if(a===r)return c+i;if(u&&(s+=c.length-s),ju(a)){if(t.slice(s).search(a)){var l,f=c;for(a.global||(a=ne(a.source,Uu(Bt.exec(a))+"g")),a.lastIndex=0;l=a.exec(f);)var d=l.index;c=c.slice(0,d===r?s:d)}}else if(t.indexOf(Pi(a),s)!=s){var h=c.lastIndexOf(a);h>-1&&(c=c.slice(0,h))}return c+i},hr.unescape=function(t){return(t=Uu(t))&&wt.test(t)?t.replace(bt,Sn):t},hr.uniqueId=function(t){var e=++fe;return Uu(t)+e},hr.upperCase=ws,hr.upperFirst=ks,hr.each=Uo,hr.eachRight=Vo,hr.first=vo,Cs(hr,(Gs={},$r(hr,function(t,e){le.call(hr.prototype,e)||(Gs[e]=t)}),Gs),{chain:!1}),hr.VERSION="4.17.11",Ue(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){hr[t].placeholder=hr}),Ue(["drop","take"],function(t,e){yr.prototype[t]=function(n){n=n===r?1:Un(Bu(n),0);var i=this.__filtered__&&!e?new yr(this):this.clone();return i.__filtered__?i.__takeCount__=Vn(n,i.__takeCount__):i.__views__.push({size:Vn(n,H),type:t+(i.__dir__<0?"Right":"")}),i},yr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),Ue(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==A||3==n;yr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Ha(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),Ue(["head","last"],function(t,e){var n="take"+(e?"Right":"");yr.prototype[t]=function(){return this[n](1).value()[0]}}),Ue(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");yr.prototype[t]=function(){return this.__filtered__?new yr(this):this[n](1)}}),yr.prototype.compact=function(){return this.filter(Es)},yr.prototype.find=function(t){return this.filter(t).head()},yr.prototype.findLast=function(t){return this.reverse().find(t)},yr.prototype.invokeMap=ki(function(t,e){return"function"==typeof t?new yr(this):this.map(function(n){return ri(n,t,e)})}),yr.prototype.reject=function(t){return this.filter(su(Ha(t)))},yr.prototype.slice=function(t,e){t=Bu(t);var n=this;return n.__filtered__&&(t>0||e<0)?new yr(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==r&&(n=(e=Bu(e))<0?n.dropRight(-e):n.take(e-t)),n)},yr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},yr.prototype.toArray=function(){return this.take(H)},$r(yr.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),i=/^(?:head|last)$/.test(e),a=hr[i?"take"+("last"==e?"Right":""):e],o=i||/^find/.test(e);a&&(hr.prototype[e]=function(){var e=this.__wrapped__,u=i?[1]:arguments,s=e instanceof yr,c=u[0],l=s||yu(e),f=function(t){var e=a.apply(hr,Xe([t],u));return i&&d?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(s=l=!1);var d=this.__chain__,h=!!this.__actions__.length,_=o&&!d,p=s&&!h;if(!o&&l){e=p?e:new yr(this);var m=t.apply(e,u);return m.__actions__.push({func:Io,args:[f],thisArg:r}),new mr(m,d)}return _&&p?t.apply(this,u):(m=this.thru(f),_?i?m.value()[0]:m.value():m)})}),Ue(["pop","push","shift","sort","splice","unshift"],function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);hr.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(yu(i)?i:[],t)}return this[n](function(n){return e.apply(yu(n)?n:[],t)})}}),$r(yr.prototype,function(t,e){var n=hr[e];if(n){var r=n.name+"";(ir[r]||(ir[r]=[])).push({name:e,func:n})}}),ir[ha(r,m).name]=[{name:"wrapper",func:r}],yr.prototype.clone=function(){var t=new yr(this.__wrapped__);return t.__actions__=na(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=na(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=na(this.__views__),t},yr.prototype.reverse=function(){if(this.__filtered__){var t=new yr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},yr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=yu(t),r=e<0,i=n?t.length:0,a=function(t,e,n){for(var r=-1,i=n.length;++r=this.__values__.length;return{done:t,value:t?r:this.__values__[this.__index__++]}},hr.prototype.plant=function(t){for(var e,n=this;n instanceof pr;){var i=fo(n);i.__index__=0,i.__values__=r,e?a.__wrapped__=i:e=i;var a=i;n=n.__wrapped__}return a.__wrapped__=t,e},hr.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof yr){var e=t;return this.__actions__.length&&(e=new yr(this)),(e=e.reverse()).__actions__.push({func:Io,args:[To],thisArg:r}),new mr(e,this.__chain__)}return this.thru(To)},hr.prototype.toJSON=hr.prototype.valueOf=hr.prototype.value=function(){return Bi(this.__wrapped__,this.__actions__)},hr.prototype.first=hr.prototype.head,fn&&(hr.prototype[fn]=function(){return this}),hr}();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Se._=jn,define(function(){return jn})):Oe?((Oe.exports=jn)._=jn,je._=jn):Se._=jn}).call(this)}).call(this,n(10),n(5)(t))},function(t,e,n){var r;try{r=n(155)}catch(t){}r||(r=window._),t.exports=r},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[6,8,10,11,12,13,14,15],n=[1,9],r=[1,10],i=[1,11],a=[1,12],o=[1,13],u={trace:function(){},yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,dateFormat:11,axisFormat:12,title:13,section:14,taskTxt:15,taskData:16,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",11:"dateFormat",12:"axisFormat",13:"title",14:"section",15:"taskTxt",16:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,2]],performAction:function(t,e,n,r,i,a,o){var u=a.length-1;switch(i){case 1:return a[u-1];case 2:this.$=[];break;case 3:a[u-1].push(a[u]),this.$=a[u-1];break;case 4:case 5:this.$=a[u];break;case 6:case 7:this.$=[];break;case 8:r.setDateFormat(a[u].substr(11)),this.$=a[u].substr(11);break;case 9:r.setAxisFormat(a[u].substr(11)),this.$=a[u].substr(11);break;case 10:r.setTitle(a[u].substr(6)),this.$=a[u].substr(6);break;case 11:r.addSection(a[u].substr(8)),this.$=a[u].substr(8);break;case 12:r.addTask(a[u-1],a[u]),this.$="task"}},table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:n,12:r,13:i,14:a,15:o},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:14,11:n,12:r,13:i,14:a,15:o},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),{16:[1,15]},t(e,[2,4]),t(e,[2,12])],defaultActions:{},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,u="",s=0,c=0,l=0,f=1,d=a.slice.call(arguments,1),h=Object.create(this.lexer),_={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(_.yy[p]=this.yy[p]);h.setInput(t,_.yy),_.yy.lexer=h,_.yy.parser=this,void 0===h.yylloc&&(h.yylloc={});var m=h.yylloc;a.push(m);var y=h.options&&h.options.ranges;"function"==typeof _.yy.parseError?this.parseError=_.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var g,v,b,M,w,k,L,x,D,T,Y={};;){if(b=n[n.length-1],this.defaultActions[b]?M=this.defaultActions[b]:(null==g&&(T=void 0,"number"!=typeof(T=r.pop()||h.lex()||f)&&(T instanceof Array&&(T=(r=T).pop()),T=e.symbols_[T]||T),g=T),M=o[b]&&o[b][g]),void 0===M||!M.length||!M[0]){var A="";for(k in D=[],o[b])this.terminals_[k]&&k>2&&D.push("'"+this.terminals_[k]+"'");A=h.showPosition?"Parse error on line "+(s+1)+":\n"+h.showPosition()+"\nExpecting "+D.join(", ")+", got '"+(this.terminals_[g]||g)+"'":"Parse error on line "+(s+1)+": Unexpected "+(g==f?"end of input":"'"+(this.terminals_[g]||g)+"'"),this.parseError(A,{text:h.match,token:this.terminals_[g]||g,line:h.yylineno,loc:m,expected:D})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+g);switch(M[0]){case 1:n.push(g),i.push(h.yytext),a.push(h.yylloc),n.push(M[1]),g=null,v?(g=v,v=null):(c=h.yyleng,u=h.yytext,s=h.yylineno,m=h.yylloc,l>0&&l--);break;case 2:if(L=this.productions_[M[1]][1],Y.$=i[i.length-L],Y._$={first_line:a[a.length-(L||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(L||1)].first_column,last_column:a[a.length-1].last_column},y&&(Y._$.range=[a[a.length-(L||1)].range[0],a[a.length-1].range[1]]),void 0!==(w=this.performAction.apply(Y,[u,c,s,_.yy,M[1],i,a].concat(d))))return w;L&&(n=n.slice(0,-1*L*2),i=i.slice(0,-1*L),a=a.slice(0,-1*L)),n.push(this.productions_[M[1]][0]),i.push(Y.$),a.push(Y._$),x=o[n[n.length-2]][n[n.length-1]],n.push(x);break;case 3:return!0}}return!0}},s={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return 10;case 1:case 2:case 3:break;case 4:return 4;case 5:return 11;case 6:return 12;case 7:return"date";case 8:return 13;case 9:return 14;case 10:return 15;case 11:return 16;case 12:return":";case 13:return 6;case 14:return"INVALID"}},rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],inclusive:!0}}};function c(){this.yy={}}return u.lexer=s,c.prototype=u,u.Parser=c,new c}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(11).readFileSync(n(12).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(7),n(5)(t))},function(t,e){var n,r,i=t.exports={};function a(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function u(t){if(n===setTimeout)return setTimeout(t,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:a}catch(t){n=a}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(t){r=o}}();var s,c=[],l=!1,f=-1;function d(){l&&s&&(l=!1,s.length?c=s.concat(c):f=-1,c.length&&h())}function h(){if(!l){var t=u(d);l=!0;for(var e=c.length;e;){for(s=c,c=[];++f1)for(var n=1;n2&&D.push("'"+this.terminals_[k]+"'");A=h.showPosition?"Parse error on line "+(s+1)+":\n"+h.showPosition()+"\nExpecting "+D.join(", ")+", got '"+(this.terminals_[g]||g)+"'":"Parse error on line "+(s+1)+": Unexpected "+(g==f?"end of input":"'"+(this.terminals_[g]||g)+"'"),this.parseError(A,{text:h.match,token:this.terminals_[g]||g,line:h.yylineno,loc:m,expected:D})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+g);switch(M[0]){case 1:n.push(g),i.push(h.yytext),a.push(h.yylloc),n.push(M[1]),g=null,v?(g=v,v=null):(c=h.yyleng,u=h.yytext,s=h.yylineno,m=h.yylloc,l>0&&l--);break;case 2:if(L=this.productions_[M[1]][1],Y.$=i[i.length-L],Y._$={first_line:a[a.length-(L||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(L||1)].first_column,last_column:a[a.length-1].last_column},y&&(Y._$.range=[a[a.length-(L||1)].range[0],a[a.length-1].range[1]]),void 0!==(w=this.performAction.apply(Y,[u,c,s,_.yy,M[1],i,a].concat(d))))return w;L&&(n=n.slice(0,-1*L*2),i=i.slice(0,-1*L),a=a.slice(0,-1*L)),n.push(this.productions_[M[1]][0]),i.push(Y.$),a.push(Y._$),x=o[n[n.length-2]][n[n.length-1]],n.push(x);break;case 3:return!0}}return!0}},w={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,r){switch(n){case 0:break;case 1:return 6;case 2:break;case 3:return 5;case 4:return this.begin("struct"),17;case 5:return this.popState(),19;case 6:break;case 7:return"MEMBER";case 8:return 16;case 9:this.begin("string");break;case 10:this.popState();break;case 11:return"STR";case 12:case 13:return 27;case 14:case 15:return 29;case 16:return 28;case 17:return 26;case 18:return 30;case 19:return 31;case 20:return 13;case 21:return 43;case 22:return"DOT";case 23:return"PLUS";case 24:return 40;case 25:case 26:return"EQUALS";case 27:return 47;case 28:return"PUNCTUATION";case 29:return 46;case 30:return 45;case 31:return 42;case 32:return 8}},rules:[/^(?:%%[^\n]*)/,/^(?:\n+)/,/^(?:\s+)/,/^(?:classDiagram\b)/,/^(?:[\{])/,/^(?:\})/,/^(?:[\n])/,/^(?:[^\{\}\n]*)/,/^(?:class\b)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::[^#\n;]+)/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:[A-Za-z]+)/,/^(?:[!"#$%&'*+,-.`?\\_\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{string:{rules:[10,11],inclusive:!1},struct:{rules:[5,6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,8,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],inclusive:!0}}};function k(){this.yy={}}return M.lexer=w,k.prototype=M,M.Parser=k,new k}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(11).readFileSync(n(12).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(7),n(5)(t))},function(t,e,n){t.exports=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n.w={},n(n.s=25)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(2))&&r.__esModule?r:{default:r},a=/:/g;function o(t){return t?String(t).replace(a,"\\:"):""}e.default={isSubgraph:function(t,e){return!!t.children(e).length},edgeToId:function(t){return o(t.v)+":"+o(t.w)+":"+o(t.name)},applyStyle:function(t,e){e&&t.attr("style",e)},applyClass:function(t,e,n){e&&t.attr("class",e).attr("class",n+" "+t.attr("class"))},applyTransition:function(t,e){var n=e.graph();if(i.default.isPlainObject(n)){var r=n.transition;if(i.default.isFunction(r))return r(t)}return t}}},function(t,e){t.exports=n(1)},function(t,e){t.exports=n(166)},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=o(n(16)),i=o(n(15)),a=o(n(14));function o(t){return t&&t.__esModule?t:{default:t}}e.default=function(t,e,n){var o=e.label,u=t.append("g");"svg"===e.labelType?(0,a.default)(u,e):"string"!=typeof o||"html"===e.labelType?(0,i.default)(u,e):(0,r.default)(u,e);var s=u.node().getBBox(),c=void 0;switch(n){case"top":c=-e.height/2;break;case"bottom":c=e.height/2-s.height;break;default:c=-s.height/2}return u.attr("transform","translate("+-s.width/2+","+c+")"),u}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e,n,r){var i=t.x,a=t.y,o=i-r.x,u=a-r.y,s=Math.sqrt(e*e*u*u+n*n*o*o),c=Math.abs(e*n*o/s);r.xMath.abs(i)*u?(a<0&&(u=-u),s=0===a?0:u*i/a,c=u):(i<0&&(o=-o),s=o,c=0===i?0:o*a/i),{x:n+s,y:r+c}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(23))&&r.__esModule?r:{default:r};e.default=function(t,e,n){var r=t.x,a=t.y,o=[],u=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY;e.forEach(function(t){u=Math.min(u,t.x),s=Math.min(s,t.y)});for(var c=r-t.width/2-u,l=a-t.height/2-s,f=0;f1&&o.sort(function(t,e){var r=t.x-n.x,i=t.y-n.y,a=Math.sqrt(r*r+i*i),o=e.x-n.x,u=e.y-n.y,s=Math.sqrt(o*o+u*u);return a0}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e,n,i){var a=e.y-t.y,o=t.x-e.x,u=e.x*t.y-t.x*e.y,s=a*n.x+o*n.y+u,c=a*i.x+o*i.y+u;if(0===s||0===c||!r(s,c)){var l=i.y-n.y,f=n.x-i.x,d=i.x*n.y-n.x*i.y,h=l*t.x+f*t.y+d,_=l*e.x+f*e.y+d;if(0===h||0===_||!r(h,_)){var p=a*f-l*o;if(0!==p){var m=Math.abs(p/2),y=o*d-f*u;return{x:y<0?(y-m)/p:(y+m)/p,y:(y=l*u-a*d)<0?(y-m)/p:(y+m)/p}}}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=s(n(8)),i=s(n(7)),a=s(n(4)),o=s(n(6)),u=s(n(5));function s(t){return t&&t.__esModule?t:{default:t}}e.default={node:r.default,circle:i.default,ellipse:a.default,polygon:o.default,rect:u.default}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=o(n(24)),i=o(n(22)),a=o(n(0));function o(t){return t&&t.__esModule?t:{default:t}}e.default={intersect:r.default,render:i.default,util:a.default}}])},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){},function(t,e,n){(function(t){function n(t,e){for(var n=0,r=t.length-1;r>=0;r--){var i=t[r];"."===i?t.splice(r,1):".."===i?(t.splice(r,1),n++):n&&(t.splice(r,1),n--)}if(e)for(;n--;n)t.unshift("..");return t}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(t){return r.exec(t).slice(1)};function a(t,e){if(t.filter)return t.filter(e);for(var n=[],r=0;r=-1&&!r;i--){var o=i>=0?arguments[i]:t.cwd();if("string"!=typeof o)throw new TypeError("Arguments to path.resolve must be strings");o&&(e=o+"/"+e,r="/"===o.charAt(0))}return(r?"/":"")+(e=n(a(e.split("/"),function(t){return!!t}),!r).join("/"))||"."},e.normalize=function(t){var r=e.isAbsolute(t),i="/"===o(t,-1);return(t=n(a(t.split("/"),function(t){return!!t}),!r).join("/"))||r||(t="."),t&&i&&(t+="/"),(r?"/":"")+t},e.isAbsolute=function(t){return"/"===t.charAt(0)},e.join=function(){var t=Array.prototype.slice.call(arguments,0);return e.normalize(a(t,function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))},e.relative=function(t,n){function r(t){for(var e=0;e=0&&""===t[n];n--);return e>n?[]:t.slice(e,n-e+1)}t=e.resolve(t).substr(1),n=e.resolve(n).substr(1);for(var i=r(t.split("/")),a=r(n.split("/")),o=Math.min(i.length,a.length),u=o,s=0;s2&&D.push("'"+this.terminals_[k]+"'");A=h.showPosition?"Parse error on line "+(s+1)+":\n"+h.showPosition()+"\nExpecting "+D.join(", ")+", got '"+(this.terminals_[g]||g)+"'":"Parse error on line "+(s+1)+": Unexpected "+(g==f?"end of input":"'"+(this.terminals_[g]||g)+"'"),this.parseError(A,{text:h.match,token:this.terminals_[g]||g,line:h.yylineno,loc:m,expected:D})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+g);switch(M[0]){case 1:n.push(g),i.push(h.yytext),a.push(h.yylloc),n.push(M[1]),g=null,v?(g=v,v=null):(c=h.yyleng,u=h.yytext,s=h.yylineno,m=h.yylloc,l>0&&l--);break;case 2:if(L=this.productions_[M[1]][1],Y.$=i[i.length-L],Y._$={first_line:a[a.length-(L||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(L||1)].first_column,last_column:a[a.length-1].last_column},y&&(Y._$.range=[a[a.length-(L||1)].range[0],a[a.length-1].range[1]]),void 0!==(w=this.performAction.apply(Y,[u,c,s,_.yy,M[1],i,a].concat(d))))return w;L&&(n=n.slice(0,-1*L*2),i=i.slice(0,-1*L),a=a.slice(0,-1*L)),n.push(this.productions_[M[1]][0]),i.push(Y.$),a.push(Y._$),x=o[n[n.length-2]][n[n.length-1]],n.push(x);break;case 3:return!0}}return!0}},Dt={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,r){switch(n){case 0:break;case 1:this.begin("string");break;case 2:this.popState();break;case 3:return"STR";case 4:return 71;case 5:return 78;case 6:return 72;case 7:return 82;case 8:return 73;case 9:return 74;case 10:return 75;case 11:return 12;case 12:return 30;case 13:return 32;case 14:case 15:case 16:case 17:case 18:case 19:return 13;case 20:return 81;case 21:return 91;case 22:return 89;case 23:return 8;case 24:return 86;case 25:return 98;case 26:return 16;case 27:return 15;case 28:return 17;case 29:return 18;case 30:return 53;case 31:return 51;case 32:return 52;case 33:return 54;case 34:return 58;case 35:return 56;case 36:return 57;case 37:return 59;case 38:return 58;case 39:return 56;case 40:return 57;case 41:return 59;case 42:return 63;case 43:return 61;case 44:return 62;case 45:return 64;case 46:return 50;case 47:return 55;case 48:return 60;case 49:return 40;case 50:return 41;case 51:return 46;case 52:return 92;case 53:return 96;case 54:return 84;case 55:case 56:return 97;case 57:return 88;case 58:return 94;case 59:return 95;case 60:return 65;case 61:return 38;case 62:return 39;case 63:return 36;case 64:return 37;case 65:return 42;case 66:return 43;case 67:return 101;case 68:return 9;case 69:return 10;case 70:return 11}},rules:[/^(?:%%[^\n]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:click\b)/,/^(?:graph\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:LR\b)/,/^(?:RL\b)/,/^(?:TB\b)/,/^(?:BT\b)/,/^(?:TD\b)/,/^(?:BR\b)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:v\b)/,/^(?:\s*--[x]\s*)/,/^(?:\s*-->\s*)/,/^(?:\s*--[o]\s*)/,/^(?:\s*---\s*)/,/^(?:\s*-\.-[x]\s*)/,/^(?:\s*-\.->\s*)/,/^(?:\s*-\.-[o]\s*)/,/^(?:\s*-\.-\s*)/,/^(?:\s*.-[x]\s*)/,/^(?:\s*\.->\s*)/,/^(?:\s*\.-[o]\s*)/,/^(?:\s*\.-\s*)/,/^(?:\s*==[x]\s*)/,/^(?:\s*==>\s*)/,/^(?:\s*==[o]\s*)/,/^(?:\s*==[\=]\s*)/,/^(?:\s*--\s*)/,/^(?:\s*-\.\s*)/,/^(?:\s*==\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:[A-Za-z]+)/,/^(?:[!"#$%&'*+,-.`?\\_\/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:\n+)/,/^(?:\s)/,/^(?:$)/],conditions:{string:{rules:[2,3],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70],inclusive:!0}}};function Tt(){this.yy={}}return xt.lexer=Dt,Tt.prototype=xt,xt.Parser=Tt,new Tt}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(11).readFileSync(n(12).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(7),n(5)(t))},function(t,e,n){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var n=function(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var i=(o=r,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */"),a=r.sources.map(function(t){return"/*# sourceURL="+r.sourceRoot+t+" */"});return[n].concat(a).concat([i]).join("\n")}var o;return[n].join("\n")}(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},i=0;i2&&D.push("'"+this.terminals_[k]+"'");A=h.showPosition?"Parse error on line "+(s+1)+":\n"+h.showPosition()+"\nExpecting "+D.join(", ")+", got '"+(this.terminals_[g]||g)+"'":"Parse error on line "+(s+1)+": Unexpected "+(g==f?"end of input":"'"+(this.terminals_[g]||g)+"'"),this.parseError(A,{text:h.match,token:this.terminals_[g]||g,line:h.yylineno,loc:m,expected:D})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+g);switch(M[0]){case 1:n.push(g),i.push(h.yytext),a.push(h.yylloc),n.push(M[1]),g=null,v?(g=v,v=null):(c=h.yyleng,u=h.yytext,s=h.yylineno,m=h.yylloc,l>0&&l--);break;case 2:if(L=this.productions_[M[1]][1],Y.$=i[i.length-L],Y._$={first_line:a[a.length-(L||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(L||1)].first_column,last_column:a[a.length-1].last_column},y&&(Y._$.range=[a[a.length-(L||1)].range[0],a[a.length-1].range[1]]),void 0!==(w=this.performAction.apply(Y,[u,c,s,_.yy,M[1],i,a].concat(d))))return w;L&&(n=n.slice(0,-1*L*2),i=i.slice(0,-1*L),a=a.slice(0,-1*L)),n.push(this.productions_[M[1]][0]),i.push(Y.$),a.push(Y._$),x=o[n[n.length-2]][n[n.length-1]],n.push(x);break;case 3:return!0}}return!0}},s={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return 12;case 1:case 2:case 3:break;case 4:return 4;case 5:return 15;case 6:return 17;case 7:return 20;case 8:return 21;case 9:return 19;case 10:case 11:return 8;case 12:return 5;case 13:return 26;case 14:this.begin("options");break;case 15:this.popState();break;case 16:return 11;case 17:this.begin("string");break;case 18:this.popState();break;case 19:return 23;case 20:return 18;case 21:return 7}},rules:[/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:branch\b)/i,/^(?:merge\b)/i,/^(?:reset\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:end\r?\n)/i,/^(?:[^\n]+\r?\n)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[a-zA-Z][a-zA-Z0-9_]+)/i,/^(?:$)/i],conditions:{options:{rules:[15,16],inclusive:!1},string:{rules:[18,19],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],inclusive:!0}}};function c(){this.yy={}}return u.lexer=s,c.prototype=u,u.Parser=c,new c}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(11).readFileSync(n(12).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(7),n(5)(t))},function(t,e,n){const r=n(4);t.exports=u;const i="\0",a="\0",o="";function u(t){this._isDirected=!r.has(t,"directed")||t.directed,this._isMultigraph=!!r.has(t,"multigraph")&&t.multigraph,this._isCompound=!!r.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=r.constant(void 0),this._defaultEdgeLabelFn=r.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[a]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function s(t,e){t[e]?t[e]++:t[e]=1}function c(t,e){--t[e]||delete t[e]}function l(t,e,n,a){var u=""+e,s=""+n;if(!t&&u>s){var c=u;u=s,s=c}return u+o+s+o+(r.isUndefined(a)?i:a)}function f(t,e){return l(t,e.v,e.w,e.name)}u.prototype._nodeCount=0,u.prototype._edgeCount=0,u.prototype.isDirected=function(){return this._isDirected},u.prototype.isMultigraph=function(){return this._isMultigraph},u.prototype.isCompound=function(){return this._isCompound},u.prototype.setGraph=function(t){return this._label=t,this},u.prototype.graph=function(){return this._label},u.prototype.setDefaultNodeLabel=function(t){return r.isFunction(t)||(t=r.constant(t)),this._defaultNodeLabelFn=t,this},u.prototype.nodeCount=function(){return this._nodeCount},u.prototype.nodes=function(){return r.keys(this._nodes)},u.prototype.sources=function(){var t=this;return r.filter(this.nodes(),function(e){return r.isEmpty(t._in[e])})},u.prototype.sinks=function(){var t=this;return r.filter(this.nodes(),function(e){return r.isEmpty(t._out[e])})},u.prototype.setNodes=function(t,e){var n=arguments,i=this;return r.each(t,function(t){n.length>1?i.setNode(t,e):i.setNode(t)}),this},u.prototype.setNode=function(t,e){return r.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]=a,this._children[t]={},this._children[a][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},u.prototype.node=function(t){return this._nodes[t]},u.prototype.hasNode=function(t){return r.has(this._nodes,t)},u.prototype.removeNode=function(t){var e=this;if(r.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],r.each(this.children(t),function(t){e.setParent(t)}),delete this._children[t]),r.each(r.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],r.each(r.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},u.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(r.isUndefined(e))e=a;else{for(var n=e+="";!r.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},u.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},u.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if(e!==a)return e}},u.prototype.children=function(t){if(r.isUndefined(t)&&(t=a),this._isCompound){var e=this._children[t];if(e)return r.keys(e)}else{if(t===a)return this.nodes();if(this.hasNode(t))return[]}},u.prototype.predecessors=function(t){var e=this._preds[t];if(e)return r.keys(e)},u.prototype.successors=function(t){var e=this._sucs[t];if(e)return r.keys(e)},u.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return r.union(e,this.successors(t))},u.prototype.isLeaf=function(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length},u.prototype.filterNodes=function(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;r.each(this._nodes,function(n,r){t(r)&&e.setNode(r,n)}),r.each(this._edgeObjs,function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))});var i={};return this._isCompound&&r.each(e.nodes(),function(t){e.setParent(t,function t(r){var a=n.parent(r);return void 0===a||e.hasNode(a)?(i[r]=a,a):a in i?i[a]:t(a)}(t))}),e},u.prototype.setDefaultEdgeLabel=function(t){return r.isFunction(t)||(t=r.constant(t)),this._defaultEdgeLabelFn=t,this},u.prototype.edgeCount=function(){return this._edgeCount},u.prototype.edges=function(){return r.values(this._edgeObjs)},u.prototype.setPath=function(t,e){const n=this,i=arguments;return r.reduce(t,function(t,r){return i.length>1?n.setEdge(t,r,e):n.setEdge(t,r),r}),this},u.prototype.setEdge=function(){let t,e,n,i,a=!1;const o=arguments[0];"object"==typeof o&&null!==o&&"v"in o?(t=o.v,e=o.w,n=o.name,2===arguments.length&&(i=arguments[1],a=!0)):(t=o,e=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),t=""+t,e=""+e,r.isUndefined(n)||(n=""+n);var u=l(this._isDirected,t,e,n);if(r.has(this._edgeLabels,u))return a&&(this._edgeLabels[u]=i),this;if(!r.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[u]=a?i:this._defaultEdgeLabelFn(t,e,n);var c=function(t,e,n,r){var i=""+e,a=""+n;if(!t&&i>a){var o=i;i=a,a=o}var u={v:i,w:a};r&&(u.name=r);return u}(this._isDirected,t,e,n);return t=c.v,e=c.w,Object.freeze(c),this._edgeObjs[u]=c,s(this._preds[e],t),s(this._sucs[t],e),this._in[e][u]=c,this._out[t][u]=c,this._edgeCount++,this},u.prototype.edge=function(t,e,n){var r=1===arguments.length?f(this._isDirected,arguments[0]):l(this._isDirected,t,e,n);return this._edgeLabels[r]},u.prototype.hasEdge=function(t,e,n){var i=1===arguments.length?f(this._isDirected,arguments[0]):l(this._isDirected,t,e,n);return r.has(this._edgeLabels,i)},u.prototype.removeEdge=function(t,e,n){const r=1===arguments.length?f(this._isDirected,arguments[0]):l(this._isDirected,t,e,n),i=this._edgeObjs[r];return i&&(t=i.v,e=i.w,delete this._edgeLabels[r],delete this._edgeObjs[r],c(this._preds[e],t),c(this._sucs[t],e),delete this._in[e][r],delete this._out[t][r],this._edgeCount--),this},u.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var i=r.values(n);return e?r.filter(i,function(t){return t.v===e}):i}},u.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var i=r.values(n);return e?r.filter(i,function(t){return t.w===e}):i}},u.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},function(t,e,n){t.exports=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n.w={},n(n.s=27)}([function(t,e){t.exports=n(167)},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.addDummyNode=o,e.simplify=u,e.asNonCompoundGraph=s,e.successorWeights=c,e.predecessorWeights=l,e.intersectRect=f,e.buildLayerMatrix=d,e.normalizeRanks=h,e.removeEmptyRanks=_,e.addBorderNode=p,e.maxRank=m,e.partition=y,e.time=g,e.notime=v;var r,i=(r=n(0))&&r.__esModule?r:{default:r},a=n(2);function o(t,e,n,r){var a=void 0;do{a=i.default.uniqueId(r)}while(t.hasNode(a));return n.dummy=e,t.setNode(a,n),a}function u(t){var e=(new a.Graph).setGraph(t.graph());return i.default.forEach(t.nodes(),function(n){e.setNode(n,t.node(n))}),i.default.forEach(t.edges(),function(n){var r=e.edge(n.v,n.w)||{weight:0,minlen:1},i=t.edge(n);e.setEdge(n.v,n.w,{weight:r.weight+i.weight,minlen:Math.max(r.minlen,i.minlen)})}),e}function s(t){var e=new a.Graph({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.default.forEach(t.nodes(),function(n){t.children(n).length||e.setNode(n,t.node(n))}),i.default.forEach(t.edges(),function(n){e.setEdge(n,t.edge(n))}),e}function c(t){var e=i.default.map(t.nodes(),function(e){var n={};return i.default.forEach(t.outEdges(e),function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight}),n});return i.default.zipObject(t.nodes(),e)}function l(t){var e=i.default.map(t.nodes(),function(e){var n={};return i.default.forEach(t.inEdges(e),function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight}),n});return i.default.zipObject(t.nodes(),e)}function f(t,e){var n=t.x,r=t.y,i=e.x-n,a=e.y-r,o=t.width/2,u=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var s=void 0,c=void 0;return Math.abs(a)*o>Math.abs(i)*u?(a<0&&(u=-u),s=u*i/a,c=u):(i<0&&(o=-o),s=o,c=o*a/i),{x:n+s,y:r+c}}function d(t){var e=i.default.map(i.default.range(m(t)+1),function(){return[]});return i.default.forEach(t.nodes(),function(n){var r=t.node(n),a=r.rank;i.default.isUndefined(a)||(e[a][r.order]=n)}),e}function h(t){var e=i.default.min(i.default.map(t.nodes(),function(e){return t.node(e).rank}));i.default.forEach(t.nodes(),function(n){var r=t.node(n);i.default.has(r,"rank")&&(r.rank-=e)})}function _(t){var e=i.default.min(i.default.map(t.nodes(),function(e){return t.node(e).rank})),n=[];i.default.forEach(t.nodes(),function(r){var i=t.node(r).rank-e;n[i]||(n[i]=[]),n[i].push(r)});var r=0,a=t.graph().nodeRankFactor;i.default.forEach(n,function(e,n){i.default.isUndefined(e)&&n%a!=0?--r:r&&i.default.forEach(e,function(e){t.node(e).rank+=r})})}function p(t,e,n,r){var i={width:0,height:0};return arguments.length>=4&&(i.rank=n,i.order=r),o(t,"border",i,e)}function m(t){return i.default.max(i.default.map(t.nodes(),function(e){var n=t.node(e).rank;if(!i.default.isUndefined(n))return n}))}function y(t,e){var n={lhs:[],rhs:[]};return i.default.forEach(t,function(t){e(t)?n.lhs.push(t):n.rhs.push(t)}),n}function g(t,e){var n=i.default.now();try{return e()}finally{console.log(t+" time: "+(i.default.now()-n)+"ms")}}function v(t,e){return e()}e.default={addDummyNode:o,simplify:u,asNonCompoundGraph:s,successorWeights:c,predecessorWeights:l,intersectRect:f,buildLayerMatrix:d,normalizeRanks:h,removeEmptyRanks:_,addBorderNode:p,maxRank:m,partition:y,time:g,notime:v}},function(t,e){t.exports=n(13)},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.longestPath=a,e.slack=o;var r,i=(r=n(0))&&r.__esModule?r:{default:r};function a(t){var e={};i.default.forEach(t.sources(),function n(r){var a=t.node(r);if(i.default.has(e,r))return a.rank;e[r]=!0;var o=i.default.min(i.default.map(t.outEdges(r),function(e){return n(e.w)-t.edge(e).minlen}))||0;return a.rank=o})}function o(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}e.default={longestPath:a,slack:o}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(0))&&r.__esModule?r:{default:r},a=n(2),o=n(3);function u(t,e){return i.default.forEach(t.nodes(),function n(r){i.default.forEach(e.nodeEdges(r),function(i){var a=i.v,u=r===a?i.w:a;t.hasNode(u)||(0,o.slack)(e,i)||(t.setNode(u,{}),t.setEdge(r,u,{}),n(u))})}),t.nodeCount()}function s(t,e){return i.default.minBy(e.edges(),function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return(0,o.slack)(e,n)})}function c(t,e,n){i.default.forEach(t.nodes(),function(t){e.node(t).rank+=n})}e.default=function(t){var e=new a.Graph({directed:!1}),n=t.nodes()[0],r=t.nodeCount();e.setNode(n,{});for(var i=void 0;u(e,t)u)&&c(n,e,s)})})}return r.default.reduce(e,function(e,n){var a=-1,o=void 0,u=0;return r.default.forEach(n,function(r,s){if("border"===t.node(r).dummy){var c=t.predecessors(r);c.length&&(o=t.node(c[0]).order,i(n,u,s,a,o),u=s,a=o)}i(n,u,n.length,o,e.length)}),n}),n}function c(t,e,n){if(e>n){var r=e;e=n,n=r}var i=t[e];i||(t[e]=i={}),i[n]=!0}function l(t,e,n){if(e>n){var i=e;e=n,n=i}return r.default.has(t[e],n)}function f(t,e,n,i){var a={},o={},u={};return r.default.forEach(e,function(t){r.default.forEach(t,function(t,e){a[t]=t,o[t]=t,u[t]=e})}),r.default.forEach(e,function(t){var e=-1;r.default.forEach(t,function(t){var s=i(t);if(s.length)for(var c=((s=r.default.sortBy(s,function(t){return u[t]})).length-1)/2,f=Math.floor(c),d=Math.ceil(c);f<=d;++f){var h=s[f];o[t]===t&&ee.barycenter?1:n?e.i-t.i:t.i-e.i})),d=o(c,s,d),r.default.forEach(u,function(t){d+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,f+=t.weight,d=o(c,s,d)});var h={vs:r.default.flatten(c,!0)};return f&&(h.barycenter=l/f,h.weight=f),h}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(0))&&r.__esModule?r:{default:r};e.default=function(t,e){var n={};return i.default.forEach(t,function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.default.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)}),i.default.forEach(e.edges(),function(t){var e=n[t.v],r=n[t.w];i.default.isUndefined(e)||i.default.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))}),function(t){var e=[];function n(t){return function(e){var n,r,a,o;e.merged||(i.default.isUndefined(e.barycenter)||i.default.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&(r=e,a=0,o=0,(n=t).weight&&(a+=n.barycenter*n.weight,o+=n.weight),r.weight&&(a+=r.barycenter*r.weight,o+=r.weight),n.vs=r.vs.concat(n.vs),n.barycenter=a/o,n.weight=o,n.i=Math.min(r.i,n.i),r.merged=!0)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var a=t.pop();e.push(a),i.default.forEach(a.in.reverse(),n(a)),i.default.forEach(a.out,r(a))}return i.default.chain(e).filter(function(t){return!t.merged}).map(function(t){return i.default.pick(t,["vs","i","barycenter","weight"])}).value()}(i.default.filter(n,function(t){return!t.indegree}))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(0))&&r.__esModule?r:{default:r};e.default=function(t,e){return i.default.map(e,function(e){var n=t.inEdges(e);if(n.length){var r=i.default.reduce(n,function(e,n){var r=t.edge(n),i=t.node(n.v);return{sum:e.sum+r.weight*i.order,weight:e.weight+r.weight}},{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=u(n(0)),i=u(n(11)),a=u(n(10)),o=u(n(9));function u(t){return t&&t.__esModule?t:{default:t}}e.default=function t(e,n,u,s){var c=e.children(n),l=e.node(n),f=l?l.borderLeft:void 0,d=l?l.borderRight:void 0,h={};f&&(c=r.default.filter(c,function(t){return t!==f&&t!==d}));var _=(0,i.default)(e,c);r.default.forEach(_,function(n){if(e.children(n.v).length){var i=t(e,n.v,u,s);h[n.v]=i,r.default.has(i,"barycenter")&&(a=n,o=i,r.default.isUndefined(a.barycenter)?(a.barycenter=o.barycenter,a.weight=o.weight):(a.barycenter=(a.barycenter*a.weight+o.barycenter*o.weight)/(a.weight+o.weight),a.weight+=o.weight))}var a,o});var p=(0,a.default)(_,u);!function(t,e){r.default.forEach(t,function(t){t.vs=r.default.flatten(t.vs.map(function(t){return e[t]?e[t].vs:t}),!0)})}(p,h);var m=(0,o.default)(p,s);if(f&&(m.vs=r.default.flatten([f,m.vs,d],!0),e.predecessors(f).length)){var y=e.node(e.predecessors(f)[0]),g=e.node(e.predecessors(d)[0]);r.default.has(m,"barycenter")||(m.barycenter=0,m.weight=0),m.barycenter=(m.barycenter*m.weight+y.order+g.order)/(m.weight+2),m.weight+=2}return m}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(0))&&r.__esModule?r:{default:r};function a(t,e,n){for(var r=i.default.zipObject(n,i.default.map(n,function(t,e){return e})),a=i.default.flatten(i.default.map(e,function(e){return i.default.chain(t.outEdges(e)).map(function(e){return{pos:r[e.w],weight:t.edge(e).weight}}).sortBy("pos").value()}),!0),o=1;o0;)e%2&&(n+=s[e+1]),s[e=e-1>>1]+=t.weight;c+=t.weight*n})),c}e.default=function(t,e){for(var n=0,r=1;r=2),u=l.default.buildLayerMatrix(t);var m=(0,o.default)(t,u);mu||s>e[c].lim));for(i=c,c=r;(c=t.parent(c))!==i;)o.push(c);return{path:a.concat(o.reverse()),lca:i}}(t,e,i.v,i.w),o=a.path,u=a.lca,s=0,c=o[s],l=!0;n!==i.w;){if(r=t.node(n),l){for(;(c=o[s])!==u&&t.node(c).maxRanks.lim&&(c=s,l=!0);var f=r.default.filter(e.edges(),function(e){return l===g(t,t.node(e.v),c)&&l!==g(t,t.node(e.w),c)});return r.default.minBy(f,function(t){return(0,o.slack)(e,t)})}function y(t,e,n,i){var a=n.v,o=n.w;t.removeEdge(a,o),t.setEdge(i.v,i.w,{}),_(t),d(t,e),function(t,e){var n=r.default.find(t.nodes(),function(t){return!e.node(t).parent}),i=c(t,n);i=i.slice(1),r.default.forEach(i,function(n){var r=t.node(n).parent,i=e.edge(n,r),a=!1;i||(i=e.edge(r,n),a=!0),e.node(n).rank=e.node(r).rank+(a?i.minlen:-i.minlen)})}(t,e)}function g(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}f.initLowLimValues=_,f.initCutValues=d,f.calcCutValue=h,f.leaveEdge=p,f.enterEdge=m,f.exchangeEdges=y,e.default=f},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),i=o(n(4)),a=o(n(20));function o(t){return t&&t.__esModule?t:{default:t}}var u=r.longestPath;function s(t){(0,a.default)(t)}e.default=function(t){switch(t.graph().ranker){case"network-simplex":s(t);break;case"tight-tree":!function(t){(0,r.longestPath)(t),(0,i.default)(t)}(t);break;case"longest-path":u(t);break;default:s(t)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=a(n(0)),i=a(n(1));function a(t){return t&&t.__esModule?t:{default:t}}e.default={run:function(t){t.graph().dummyChains=[],r.default.forEach(t.edges(),function(e){!function(t,e){var n=e.v,r=t.node(n).rank,a=e.w,o=t.node(a).rank,u=e.name,s=t.edge(e),c=s.labelRank;if(o!==r+1){t.removeEdge(e);var l=void 0,f=void 0,d=void 0;for(d=0,++r;r0;--u)if(o=e[u].dequeue()){r=r.concat(s(t,e,n,o,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return r.default.flatten(r.default.map(o,function(e){return t.outEdges(e.v,e.w)}),!0)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=a(n(0)),i=a(n(24));function a(t){return t&&t.__esModule?t:{default:t}}e.default={run:function(t){var e="greedy"===t.graph().acyclicer?(0,i.default)(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},i={};return r.default.forEach(t.nodes(),function a(o){r.default.has(i,o)||(i[o]=!0,n[o]=!0,r.default.forEach(t.outEdges(o),function(t){r.default.has(n,t.w)?e.push(t):a(t.w)}),delete n[o])}),e}(t);r.default.forEach(e,function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,r.default.uniqueId("rev"))})},undo:function(t){r.default.forEach(t.edges(),function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var r=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,r)}})}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=m(n(0)),i=n(2),a=m(n(25)),o=m(n(22)),u=m(n(21)),s=n(1),c=m(s),l=m(n(19)),f=m(n(18)),d=m(n(17)),h=m(n(16)),_=m(n(15)),p=m(n(6));function m(t){return t&&t.__esModule?t:{default:t}}var y=["nodesep","edgesep","ranksep","marginx","marginy"],g={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},v=["acyclicer","ranker","rankdir","align"],b=["width","height"],M={width:0,height:0},w=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},L=["labelpos"];function x(t,e){return r.default.mapValues(r.default.pick(t,e),Number)}function D(t){var e={};return r.default.forEach(t,function(t,n){e[n.toLowerCase()]=t}),e}e.default=function(t,e){var n=e&&e.debugTiming?c.default.time:c.default.notime;n("layout",function(){var e=n(" buildLayoutGraph",function(){return function(t){var e=new i.Graph({multigraph:!0,compound:!0}),n=D(t.graph());return e.setGraph(r.default.merge({},g,x(n,y),r.default.pick(n,v))),r.default.forEach(t.nodes(),function(n){var i=D(t.node(n));e.setNode(n,r.default.defaults(x(i,b),M)),e.setParent(n,t.parent(n))}),r.default.forEach(t.edges(),function(n){var i=D(t.edge(n));e.setEdge(n,r.default.merge({},k,x(i,w),r.default.pick(i,L)))}),e}(t)});n(" runLayout",function(){!function(t,e){e(" makeSpaceForEdgeLabels",function(){!function(t){var e=t.graph();e.ranksep/=2,r.default.forEach(t.edges(),function(n){var r=t.edge(n);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)})}(t)}),e(" removeSelfEdges",function(){!function(t){r.default.forEach(t.edges(),function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}})}(t)}),e(" acyclic",function(){a.default.run(t)}),e(" nestingGraph.run",function(){f.default.run(t)}),e(" rank",function(){(0,u.default)(c.default.asNonCompoundGraph(t))}),e(" injectEdgeLabelProxies",function(){!function(t){r.default.forEach(t.edges(),function(e){var n=t.edge(e);if(n.width&&n.height){var r=t.node(e.v),i={rank:(t.node(e.w).rank-r.rank)/2+r.rank,e:e};c.default.addDummyNode(t,"edge-proxy",i,"_ep")}})}(t)}),e(" removeEmptyRanks",function(){(0,s.removeEmptyRanks)(t)}),e(" nestingGraph.cleanup",function(){f.default.cleanup(t)}),e(" normalizeRanks",function(){(0,s.normalizeRanks)(t)}),e(" assignRankMinMax",function(){!function(t){var e=0;r.default.forEach(t.nodes(),function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=Math.max(e,r.maxRank))}),t.graph().maxRank=e}(t)}),e(" removeEdgeLabelProxies",function(){!function(t){r.default.forEach(t.nodes(),function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))})}(t)}),e(" normalize.run",function(){o.default.run(t)}),e(" parentDummyChains",function(){(0,l.default)(t)}),e(" addBorderSegments",function(){(0,d.default)(t)}),e(" order",function(){(0,_.default)(t)}),e(" insertSelfEdges",function(){!function(t){var e=c.default.buildLayerMatrix(t);r.default.forEach(e,function(e){var n=0;r.default.forEach(e,function(e,i){var a=t.node(e);a.order=i+n,r.default.forEach(a.selfEdges,function(e){c.default.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:a.rank,order:i+ ++n,e:e.e,label:e.label},"_se")}),delete a.selfEdges})})}(t)}),e(" adjustCoordinateSystem",function(){h.default.adjust(t)}),e(" position",function(){(0,p.default)(t)}),e(" positionSelfEdges",function(){!function(t){r.default.forEach(t.nodes(),function(e){var n=t.node(e);if("selfedge"===n.dummy){var r=t.node(n.e.v),i=r.x+r.width/2,a=r.y,o=n.x-i,u=r.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:i+2*o/3,y:a-u},{x:i+5*o/6,y:a-u},{x:i+o,y:a},{x:i+5*o/6,y:a+u},{x:i+2*o/3,y:a+u}],n.label.x=n.x,n.label.y=n.y}})}(t)}),e(" removeBorderNodes",function(){!function(t){r.default.forEach(t.nodes(),function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),a=t.node(n.borderBottom),o=t.node(r.default.last(n.borderLeft)),u=t.node(r.default.last(n.borderRight));n.width=Math.abs(u.x-o.x),n.height=Math.abs(a.y-i.y),n.x=o.x+n.width/2,n.y=i.y+n.height/2}}),r.default.forEach(t.nodes(),function(e){"border"===t.node(e).dummy&&t.removeNode(e)})}(t)}),e(" normalize.undo",function(){o.default.undo(t)}),e(" fixupEdgeLabelCoords",function(){!function(t){r.default.forEach(t.edges(),function(e){var n=t.edge(e);if(r.default.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}})}(t)}),e(" undoCoordinateSystem",function(){h.default.undo(t)}),e(" translateGraph",function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,a=0,o=t.graph(),u=o.marginx||0,s=o.marginy||0;function c(t){var r=t.x,o=t.y,u=t.width,s=t.height;e=Math.min(e,r-u/2),n=Math.max(n,r+u/2),i=Math.min(i,o-s/2),a=Math.max(a,o+s/2)}r.default.forEach(t.nodes(),function(e){c(t.node(e))}),r.default.forEach(t.edges(),function(e){var n=t.edge(e);r.default.has(n,"x")&&c(n)}),e-=u,i-=s,r.default.forEach(t.nodes(),function(n){var r=t.node(n);r.x-=e,r.y-=i}),r.default.forEach(t.edges(),function(n){var a=t.edge(n);r.default.forEach(a.points,function(t){t.x-=e,t.y-=i}),r.default.has(a,"x")&&(a.x-=e),r.default.has(a,"y")&&(a.y-=i)}),o.width=n-e+u,o.height=a-i+s}(t)}),e(" assignNodeIntersects",function(){!function(t){r.default.forEach(t.edges(),function(e){var n=t.edge(e),r=t.node(e.v),i=t.node(e.w),a=null,o=null;n.points?(a=n.points[0],o=n.points[n.points.length-1]):(n.points=[],a=i,o=r),n.points.unshift(c.default.intersectRect(r,a)),n.points.push(c.default.intersectRect(i,o))})}(t)}),e(" reversePoints",function(){!function(t){r.default.forEach(t.edges(),function(e){var n=t.edge(e);n.reversed&&n.points.reverse()})}(t)}),e(" acyclic.undo",function(){a.default.undo(t)})}(e,n)}),n(" updateInputGraph",function(){!function(t,e){r.default.forEach(t.nodes(),function(n){var r=t.node(n),i=e.node(n);r&&(r.x=i.x,r.y=i.y,e.children(n).length&&(r.width=i.width,r.height=i.height))}),r.default.forEach(t.edges(),function(n){var i=t.edge(n),a=e.edge(n);i.points=a.points,r.default.has(a,"x")&&(i.x=a.x,i.y=a.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)})})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=(r=n(26))&&r.__esModule?r:{default:r};e.default={layout:i.default}}])},function(t,e,n){!function(t){"use strict";t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(t){return/^nm$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},r=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},i={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},a=function(t){return function(e,n,a,o){var u=r(e),s=i[t][r(e)];return 2===u&&(s=s[n?0:1]),s.replace(/%d/i,e)}},o=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];t.defineLocale("ar",{months:o,monthsShort:o,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(t){return"م"===t},meridiem:function(t,e,n){return t<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:a("s"),ss:a("s"),m:a("m"),mm:a("m"),h:a("h"),hh:a("h"),d:a("d"),dd:a("d"),M:a("M"),MM:a("M"),y:a("y"),yy:a("y")},preparse:function(t){return t.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ar-dz",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},r={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},i=function(t){return function(e,i,a,o){var u=n(e),s=r[t][n(e)];return 2===u&&(s=s[i?0:1]),s.replace(/%d/i,e)}},a=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];t.defineLocale("ar-ly",{months:a,monthsShort:a,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(t){return"م"===t},meridiem:function(t,e,n){return t<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(t){return t.replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};t.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(t){return"م"===t},meridiem:function(t,e,n){return t<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};t.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyə",ss:"%d saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(t){return/^(gündüz|axşam)$/.test(t)},meridiem:function(t,e,n){return t<4?"gecə":t<12?"səhər":t<17?"gündüz":"axşam"},dayOfMonthOrdinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(t){if(0===t)return t+"-ıncı";var n=t%10,r=t%100-n,i=t>=100?100:null;return t+(e[n]||e[r]||e[i])},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i,a={ss:e?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:e?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:e?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"};return"m"===n?e?"хвіліна":"хвіліну":"h"===n?e?"гадзіна":"гадзіну":t+" "+(r=+t,i=a[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}t.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:e,mm:e,h:e,hh:e,d:"дзень",dd:e,M:"месяц",MM:e,y:"год",yy:e},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(t){return/^(дня|вечара)$/.test(t)},meridiem:function(t,e,n){return t<4?"ночы":t<12?"раніцы":t<17?"дня":"вечара"},dayOfMonthOrdinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!=2&&t%10!=3||t%100==12||t%100==13?t+"-ы":t+"-і";case"D":return t+"-га";default:return t}},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-ев":0===n?t+"-ен":n>10&&n<20?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des".split("_"),weekdays:"Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm"},calendar:{sameDay:"[Bi lɛrɛ] LT",nextDay:"[Sini lɛrɛ] LT",nextWeek:"dddd [don lɛrɛ] LT",lastDay:"[Kunu lɛrɛ] LT",lastWeek:"dddd [tɛmɛnen lɛrɛ] LT",sameElse:"L"},relativeTime:{future:"%s kɔnɔ",past:"a bɛ %s bɔ",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"lɛrɛ kelen",hh:"lɛrɛ %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},n={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};t.defineLocale("bn",{months:"জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(t){return t.replace(/[১২৩৪৫৬৭৮৯০]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(t,e){return 12===t&&(t=0),"রাত"===e&&t>=4||"দুপুর"===e&&t<5||"বিকাল"===e?t+12:t},meridiem:function(t,e,n){return t<4?"রাত":t<10?"সকাল":t<17?"দুপুর":t<20?"বিকাল":"রাত"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},n={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};t.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",ss:"%d སྐར་ཆ།",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(t){return t.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(t,e){return 12===t&&(t=0),"མཚན་མོ"===e&&t>=4||"ཉིན་གུང"===e&&t<5||"དགོང་དག"===e?t+12:t},meridiem:function(t,e,n){return t<4?"མཚན་མོ":t<10?"ཞོགས་ཀས":t<17?"ཉིན་གུང":t<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){return t+" "+function(t,e){return 2===e?function(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}(t):t}({mm:"munutenn",MM:"miz",dd:"devezh"}[n],t)}t.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",ss:"%d eilenn",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:function(t){switch(function t(e){return e>9?t(e%10):e}(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(añ|vet)/,ordinal:function(t){var e=1===t?"añ":"vet";return t+e},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+=1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi";case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return r+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return r+=1===t?"dan":"dana";case"MM":return r+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return r+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}t.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ca",{months:{standalone:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(t,e){var n=1===t?"r":2===t?"n":3===t?"r":4===t?"t":"è";return"w"!==e&&"W"!==e||(n="a"),t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),n="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");function r(t){return t>1&&t<5&&1!=~~(t/10)}function i(t,e,n,i){var a=t+" ";switch(n){case"s":return e||i?"pár sekund":"pár sekundami";case"ss":return e||i?a+(r(t)?"sekundy":"sekund"):a+"sekundami";case"m":return e?"minuta":i?"minutu":"minutou";case"mm":return e||i?a+(r(t)?"minuty":"minut"):a+"minutami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?a+(r(t)?"hodiny":"hodin"):a+"hodinami";case"d":return e||i?"den":"dnem";case"dd":return e||i?a+(r(t)?"dny":"dní"):a+"dny";case"M":return e||i?"měsíc":"měsícem";case"MM":return e||i?a+(r(t)?"měsíce":"měsíců"):a+"měsíci";case"y":return e||i?"rok":"rokem";case"yy":return e||i?a+(r(t)?"roky":"let"):a+"lety"}}t.defineLocale("cs",{months:e,monthsShort:n,monthsParse:function(t,e){var n,r=[];for(n=0;n<12;n++)r[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return r}(e,n),shortMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(n),longMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(e),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(t){var e=/сехет$/i.exec(t)?"рен":/ҫул$/i.exec(t)?"тан":"ран";return t+e},past:"%s каялла",s:"пӗр-ик ҫеккунт",ss:"%d ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},dayOfMonthOrdinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(t){var e=t,n="";return e>20?n=40===e||50===e||60===e||80===e||100===e?"fed":"ain":e>0&&(n=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][e]),t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],n=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];t.defineLocale("dv",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(t){return"މފ"===t},meridiem:function(t,e,n){return t<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",ss:"d% ސިކުންތު",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(t){return t.replace(/،/g,",")},postformat:function(t){return t.replace(/,/g,"،")},week:{dow:7,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(t,e){return t?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(t,e,n){return t>11?n?"μμ":"ΜΜ":n?"πμ":"ΠΜ"},isPM:function(t){return"μ"===(t+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n,r=this._calendarEl[t],i=e&&e.hours();return((n=r)instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(r=r.apply(e)),r.replace("{}",i%12==1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(t){return"p"===t.charAt(0).toLowerCase()},meridiem:function(t,e,n){return t>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");t.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[t+"sekundi",t+"sekundit"],m:["ühe minuti","üks minut"],mm:[t+" minuti",t+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[t+" tunni",t+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[t+" kuu",t+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[t+" aasta",t+" aastat"]};return e?i[n][2]?i[n][2]:i[n][1]:r?i[n][0]:i[n][1]}t.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:"%d päeva",M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};t.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(t){return/بعد از ظهر/.test(t)},meridiem:function(t,e,n){return t<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"ثانیه d%",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),n=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",e[7],e[8],e[9]];function r(t,r,i,a){var o="";switch(i){case"s":return a?"muutaman sekunnin":"muutama sekunti";case"ss":return a?"sekunnin":"sekuntia";case"m":return a?"minuutin":"minuutti";case"mm":o=a?"minuutin":"minuuttia";break;case"h":return a?"tunnin":"tunti";case"hh":o=a?"tunnin":"tuntia";break;case"d":return a?"päivän":"päivä";case"dd":o=a?"päivän":"päivää";break;case"M":return a?"kuukauden":"kuukausi";case"MM":o=a?"kuukauden":"kuukautta";break;case"y":return a?"vuoden":"vuosi";case"yy":o=a?"vuoden":"vuotta"}return o=function(t,r){return t<10?r?n[t]:e[t]:t}(t,a)+" "+o}t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),n="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");t.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],monthsShort:["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],monthsParseExact:!0,weekdays:["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["Dò","Lu","Mà","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){var e=1===t?"d":t%10==2?"na":"mh";return t+e},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return 0===t.indexOf("un")?"n"+t:"en "+t},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["thodde secondanim","thodde second"],ss:[t+" secondanim",t+" second"],m:["eka mintan","ek minute"],mm:[t+" mintanim",t+" mintam"],h:["eka horan","ek hor"],hh:[t+" horanim",t+" horam"],d:["eka disan","ek dis"],dd:[t+" disanim",t+" dis"],M:["eka mhoinean","ek mhoino"],MM:[t+" mhoineanim",t+" mhoine"],y:["eka vorsan","ek voros"],yy:[t+" vorsanim",t+" vorsam"]};return e?i[n][0]:i[n][1]}t.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(t,e){switch(e){case"D":return t+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return t}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(t,e){return 12===t&&(t=0),"rati"===e?t<4?t:t+12:"sokalli"===e?t:"donparam"===e?t>12?t:t+12:"sanje"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"rati":t<12?"sokalli":t<16?"donparam":t<20?"sanje":"rati"}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},n={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};t.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort:"રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ".split("_"),weekdaysMin:"ર_સો_મં_બુ_ગુ_શુ_શ".split("_"),longDateFormat:{LT:"A h:mm વાગ્યે",LTS:"A h:mm:ss વાગ્યે",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm વાગ્યે",LLLL:"dddd, D MMMM YYYY, A h:mm વાગ્યે"},calendar:{sameDay:"[આજ] LT",nextDay:"[કાલે] LT",nextWeek:"dddd, LT",lastDay:"[ગઇકાલે] LT",lastWeek:"[પાછલા] dddd, LT",sameElse:"L"},relativeTime:{future:"%s મા",past:"%s પેહલા",s:"અમુક પળો",ss:"%d સેકંડ",m:"એક મિનિટ",mm:"%d મિનિટ",h:"એક કલાક",hh:"%d કલાક",d:"એક દિવસ",dd:"%d દિવસ",M:"એક મહિનો",MM:"%d મહિનો",y:"એક વર્ષ",yy:"%d વર્ષ"},preparse:function(t){return t.replace(/[૧૨૩૪૫૬૭૮૯૦]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/રાત|બપોર|સવાર|સાંજ/,meridiemHour:function(t,e){return 12===t&&(t=0),"રાત"===e?t<4?t:t+12:"સવાર"===e?t:"બપોર"===e?t>=10?t:t+12:"સાંજ"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"રાત":t<10?"સવાર":t<17?"બપોર":t<20?"સાંજ":"રાત"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(t){return 2===t?"שעתיים":t+" שעות"},d:"יום",dd:function(t){return 2===t?"יומיים":t+" ימים"},M:"חודש",MM:function(t){return 2===t?"חודשיים":t+" חודשים"},y:"שנה",yy:function(t){return 2===t?"שנתיים":t%10==0&&10!==t?t+" שנה":t+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(t){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(t)},meridiem:function(t,e,n){return t<5?"לפנות בוקר":t<10?"בבוקר":t<12?n?'לפנה"צ':"לפני הצהריים":t<18?n?'אחה"צ':"אחרי הצהריים":"בערב"}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};t.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",ss:"%d सेकंड",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(t,e){return 12===t&&(t=0),"रात"===e?t<4?t:t+12:"सुबह"===e?t:"दोपहर"===e?t>=10?t:t+12:"शाम"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"रात":t<10?"सुबह":t<17?"दोपहर":t<20?"शाम":"रात"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+=1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi";case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return r+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return r+=1===t?"dan":"dana";case"MM":return r+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return r+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}t.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");function n(t,e,n,r){var i=t;switch(n){case"s":return r||e?"néhány másodperc":"néhány másodperce";case"ss":return i+(r||e)?" másodperc":" másodperce";case"m":return"egy"+(r||e?" perc":" perce");case"mm":return i+(r||e?" perc":" perce");case"h":return"egy"+(r||e?" óra":" órája");case"hh":return i+(r||e?" óra":" órája");case"d":return"egy"+(r||e?" nap":" napja");case"dd":return i+(r||e?" nap":" napja");case"M":return"egy"+(r||e?" hónap":" hónapja");case"MM":return i+(r||e?" hónap":" hónapja");case"y":return"egy"+(r||e?" év":" éve");case"yy":return i+(r||e?" év":" éve")}return""}function r(t){return(t?"":"[múlt] ")+"["+e[this.day()]+"] LT[-kor]"}t.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(t){return"u"===t.charAt(1).toLowerCase()},meridiem:function(t,e,n){return t<12?!0===n?"de":"DE":!0===n?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return r.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return r.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",ss:"%d վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(t){return/^(ցերեկվա|երեկոյան)$/.test(t)},meridiem:function(t){return t<4?"գիշերվա":t<12?"առավոտվա":t<17?"ցերեկվա":"երեկոյան"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-ին":t+"-րդ";default:return t}},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"siang"===e?t>=11?t:t+12:"sore"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"siang":t<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t){return t%100==11||t%10!=1}function n(t,n,r,i){var a=t+" ";switch(r){case"s":return n||i?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return e(t)?a+(n||i?"sekúndur":"sekúndum"):a+"sekúnda";case"m":return n?"mínúta":"mínútu";case"mm":return e(t)?a+(n||i?"mínútur":"mínútum"):n?a+"mínúta":a+"mínútu";case"hh":return e(t)?a+(n||i?"klukkustundir":"klukkustundum"):a+"klukkustund";case"d":return n?"dagur":i?"dag":"degi";case"dd":return e(t)?n?a+"dagar":a+(i?"daga":"dögum"):n?a+"dagur":a+(i?"dag":"degi");case"M":return n?"mánuður":i?"mánuð":"mánuði";case"MM":return e(t)?n?a+"mánuðir":a+(i?"mánuði":"mánuðum"):n?a+"mánuður":a+(i?"mánuð":"mánuði");case"y":return n||i?"ár":"ári";case"yy":return e(t)?a+(n||i?"ár":"árum"):a+(n||i?"ár":"ári")}}t.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(t){return"午後"===t},meridiem:function(t,e,n){return t<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(t){return t.week()=11?t:t+12:"sonten"===e||"ndalu"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"enjing":t<15?"siyang":t<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ka",{months:{standalone:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),format:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(t){return/(წამი|წუთი|საათი|წელი)/.test(t)?t.replace(/ი$/,"ში"):t+"ში"},past:function(t){return/(წამი|წუთი|საათი|დღე|თვე)/.test(t)?t.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(t)?t.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(t){return 0===t?t:1===t?t+"-ლი":t<20||t<=100&&t%20==0||t%100==0?"მე-"+t:t+"-ე"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};t.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(t){var n=t%10,r=t>=100?100:null;return t+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"១",2:"២",3:"៣",4:"៤",5:"៥",6:"៦",7:"៧",8:"៨",9:"៩",0:"០"},n={"១":"1","២":"2","៣":"3","៤":"4","៥":"5","៦":"6","៧":"7","៨":"8","៩":"9","០":"0"};t.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysMin:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ព្រឹក|ល្ងាច/,isPM:function(t){return"ល្ងាច"===t},meridiem:function(t,e,n){return t<12?"ព្រឹក":"ល្ងាច"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",ss:"%d វិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},dayOfMonthOrdinalParse:/ទី\d{1,2}/,ordinal:"ទី%d",preparse:function(t){return t.replace(/[១២៣៤៥៦៧៨៩០]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"೧",2:"೨",3:"೩",4:"೪",5:"೫",6:"೬",7:"೭",8:"೮",9:"೯",0:"೦"},n={"೧":"1","೨":"2","೩":"3","೪":"4","೫":"5","೬":"6","೭":"7","೮":"8","೯":"9","೦":"0"};t.defineLocale("kn",{months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),monthsParseExact:!0,weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[ಇಂದು] LT",nextDay:"[ನಾಳೆ] LT",nextWeek:"dddd, LT",lastDay:"[ನಿನ್ನೆ] LT",lastWeek:"[ಕೊನೆಯ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",ss:"%d ಸೆಕೆಂಡುಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"},preparse:function(t){return t.replace(/[೧೨೩೪೫೬೭೮೯೦]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,meridiemHour:function(t,e){return 12===t&&(t=0),"ರಾತ್ರಿ"===e?t<4?t:t+12:"ಬೆಳಿಗ್ಗೆ"===e?t:"ಮಧ್ಯಾಹ್ನ"===e?t>=10?t:t+12:"ಸಂಜೆ"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"ರಾತ್ರಿ":t<10?"ಬೆಳಿಗ್ಗೆ":t<17?"ಮಧ್ಯಾಹ್ನ":t<20?"ಸಂಜೆ":"ರಾತ್ರಿ"},dayOfMonthOrdinalParse:/\d{1,2}(ನೇ)/,ordinal:function(t){return t+"ನೇ"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"일";case"M":return t+"월";case"w":case"W":return t+"주";default:return t}},meridiemParse:/오전|오후/,isPM:function(t){return"오후"===t},meridiem:function(t,e,n){return t<12?"오전":"오후"}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},r=["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمموز","ئاب","ئەیلوول","تشرینی یەكەم","تشرینی دووەم","كانونی یەکەم"];t.defineLocale("ku",{months:r,monthsShort:r,weekdays:"یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌".split("_"),weekdaysShort:"یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌".split("_"),weekdaysMin:"ی_د_س_چ_پ_ه_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ئێواره‌|به‌یانی/,isPM:function(t){return/ئێواره‌/.test(t)},meridiem:function(t,e,n){return t<12?"به‌یانی":"ئێواره‌"},calendar:{sameDay:"[ئه‌مرۆ كاتژمێر] LT",nextDay:"[به‌یانی كاتژمێر] LT",nextWeek:"dddd [كاتژمێر] LT",lastDay:"[دوێنێ كاتژمێر] LT",lastWeek:"dddd [كاتژمێر] LT",sameElse:"L"},relativeTime:{future:"له‌ %s",past:"%s",s:"چه‌ند چركه‌یه‌ك",ss:"چركه‌ %d",m:"یه‌ك خوله‌ك",mm:"%d خوله‌ك",h:"یه‌ك كاتژمێر",hh:"%d كاتژمێر",d:"یه‌ك ڕۆژ",dd:"%d ڕۆژ",M:"یه‌ك مانگ",MM:"%d مانگ",y:"یه‌ك ساڵ",yy:"%d ساڵ"},preparse:function(t){return t.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};t.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кечээ саат] LT",lastWeek:"[Өткөн аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",ss:"%d секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(t){var n=t%10,r=t>=100?100:null;return t+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?i[n][0]:i[n][1]}function n(t){if(t=parseInt(t,10),isNaN(t))return!1;if(t<0)return!0;if(t<10)return 4<=t&&t<=7;if(t<100){var e=t%10,r=t/10;return n(0===e?r:e)}if(t<1e4){for(;t>=10;)t/=10;return n(t)}return n(t/=1e3)}t.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(t){return n(t.substr(0,t.indexOf(" ")))?"a "+t:"an "+t},past:function(t){return n(t.substr(0,t.indexOf(" ")))?"viru "+t:"virun "+t},s:"e puer Sekonnen",ss:"%d Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d Méint",y:e,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(t){return"ຕອນແລງ"===t},meridiem:function(t,e,n){return t<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",ss:"%d ວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},dayOfMonthOrdinalParse:/(ທີ່)\d{1,2}/,ordinal:function(t){return"ທີ່"+t}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};function n(t,e,n,r){return e?i(n)[0]:r?i(n)[1]:i(n)[2]}function r(t){return t%10==0||t>10&&t<20}function i(t){return e[t].split("_")}function a(t,e,a,o){var u=t+" ";return 1===t?u+n(0,e,a[0],o):e?u+(r(t)?i(a)[1]:i(a)[0]):o?u+i(a)[1]:u+(r(t)?i(a)[1]:i(a)[2])}t.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:function(t,e,n,r){return e?"kelios sekundės":r?"kelių sekundžių":"kelias sekundes"},ss:a,m:n,mm:a,h:n,hh:a,d:n,dd:a,M:n,MM:a,y:n,yy:a},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={ss:"sekundes_sekundēm_sekunde_sekundes".split("_"),m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(t,e,n){return n?e%10==1&&e%100!=11?t[2]:t[3]:e%10==1&&e%100!=11?t[0]:t[1]}function r(t,r,i){return t+" "+n(e[i],t,r)}function i(t,r,i){return n(e[i],t,r)}t.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:function(t,e){return e?"dažas sekundes":"dažām sekundēm"},ss:r,m:i,mm:r,h:i,hh:r,d:i,dd:r,M:i,MM:r,y:i,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mjesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",ss:"%d hēkona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-ев":0===n?t+"-ен":n>10&&n<20?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",ss:"%d സെക്കൻഡ്",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(t,e){return 12===t&&(t=0),"രാത്രി"===e&&t>=4||"ഉച്ച കഴിഞ്ഞ്"===e||"വൈകുന്നേരം"===e?t+12:t},meridiem:function(t,e,n){return t<4?"രാത്രി":t<12?"രാവിലെ":t<17?"ഉച്ച കഴിഞ്ഞ്":t<20?"വൈകുന്നേരം":"രാത്രി"}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){switch(n){case"s":return e?"хэдхэн секунд":"хэдхэн секундын";case"ss":return t+(e?" секунд":" секундын");case"m":case"mm":return t+(e?" минут":" минутын");case"h":case"hh":return t+(e?" цаг":" цагийн");case"d":case"dd":return t+(e?" өдөр":" өдрийн");case"M":case"MM":return t+(e?" сар":" сарын");case"y":case"yy":return t+(e?" жил":" жилийн");default:return t}}t.defineLocale("mn",{months:"Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар".split("_"),monthsShort:"1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар".split("_"),monthsParseExact:!0,weekdays:"Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба".split("_"),weekdaysShort:"Ням_Дав_Мяг_Лха_Пүр_Баа_Бям".split("_"),weekdaysMin:"Ня_Да_Мя_Лх_Пү_Ба_Бя".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY оны MMMMын D",LLL:"YYYY оны MMMMын D HH:mm",LLLL:"dddd, YYYY оны MMMMын D HH:mm"},meridiemParse:/ҮӨ|ҮХ/i,isPM:function(t){return"ҮХ"===t},meridiem:function(t,e,n){return t<12?"ҮӨ":"ҮХ"},calendar:{sameDay:"[Өнөөдөр] LT",nextDay:"[Маргааш] LT",nextWeek:"[Ирэх] dddd LT",lastDay:"[Өчигдөр] LT",lastWeek:"[Өнгөрсөн] dddd LT",sameElse:"L"},relativeTime:{future:"%s дараа",past:"%s өмнө",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2} өдөр/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+" өдөр";default:return t}}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};function r(t,e,n,r){var i="";if(e)switch(n){case"s":i="काही सेकंद";break;case"ss":i="%d सेकंद";break;case"m":i="एक मिनिट";break;case"mm":i="%d मिनिटे";break;case"h":i="एक तास";break;case"hh":i="%d तास";break;case"d":i="एक दिवस";break;case"dd":i="%d दिवस";break;case"M":i="एक महिना";break;case"MM":i="%d महिने";break;case"y":i="एक वर्ष";break;case"yy":i="%d वर्षे"}else switch(n){case"s":i="काही सेकंदां";break;case"ss":i="%d सेकंदां";break;case"m":i="एका मिनिटा";break;case"mm":i="%d मिनिटां";break;case"h":i="एका तासा";break;case"hh":i="%d तासां";break;case"d":i="एका दिवसा";break;case"dd":i="%d दिवसां";break;case"M":i="एका महिन्या";break;case"MM":i="%d महिन्यां";break;case"y":i="एका वर्षा";break;case"yy":i="%d वर्षां"}return i.replace(/%d/i,t)}t.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/रात्री|सकाळी|दुपारी|सायंकाळी/,meridiemHour:function(t,e){return 12===t&&(t=0),"रात्री"===e?t<4?t:t+12:"सकाळी"===e?t:"दुपारी"===e?t>=10?t:t+12:"सायंकाळी"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"रात्री":t<10?"सकाळी":t<17?"दुपारी":t<20?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[Għada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-bieraħ fil-]LT",lastWeek:"dddd [li għadda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},n={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};t.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",ss:"%d စက္ကန့်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(t){return t.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};t.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(t,e){return 12===t&&(t=0),"राति"===e?t<4?t:t+12:"बिहान"===e?t:"दिउँसो"===e?t>=10?t:t+12:"साँझ"===e?t+12:void 0},meridiem:function(t,e,n){return t<3?"राति":t<12?"बिहान":t<16?"दिउँसो":t<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",ss:"%d सेकेण्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},n={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};t.defineLocale("pa-in",{months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"[ਅਗਲਾ] dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",ss:"%d ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(t){return t.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(t,e){return 12===t&&(t=0),"ਰਾਤ"===e?t<4?t:t+12:"ਸਵੇਰ"===e?t:"ਦੁਪਹਿਰ"===e?t>=10?t:t+12:"ਸ਼ਾਮ"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"ਰਾਤ":t<10?"ਸਵੇਰ":t<17?"ਦੁਪਹਿਰ":t<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");function r(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function i(t,e,n){var i=t+" ";switch(n){case"ss":return i+(r(t)?"sekundy":"sekund");case"m":return e?"minuta":"minutę";case"mm":return i+(r(t)?"minuty":"minut");case"h":return e?"godzina":"godzinę";case"hh":return i+(r(t)?"godziny":"godzin");case"MM":return i+(r(t)?"miesiące":"miesięcy");case"yy":return i+(r(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,r){return t?""===r?"("+n[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(r)?n[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:i,m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº"})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=" ";return(t%100>=20||t>=100&&t%100==0)&&(r=" de "),t+r+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[n]}t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",ss:e,m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i,a={ss:e?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:e?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===n?e?"минута":"минуту":t+" "+(r=+t,i=a[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}var n=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];t.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня, в] LT",nextDay:"[Завтра, в] LT",lastDay:"[Вчера, в] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В следующее] dddd, [в] LT";case 1:case 2:case 4:return"[В следующий] dddd, [в] LT";case 3:case 5:case 6:return"[В следующую] dddd, [в] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd, [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd, [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd, [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:e,m:e,mm:e,h:"час",hh:e,d:"день",dd:e,M:"месяц",MM:e,y:"год",yy:e},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(t){return/^(дня|вечера)$/.test(t)},meridiem:function(t,e,n){return t<4?"ночи":t<12?"утра":t<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-й";case"D":return t+"-го";case"w":case"W":return t+"-я";default:return t}},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e=["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],n=["آچر","سومر","اڱارو","اربع","خميس","جمع","ڇنڇر"];t.defineLocale("sd",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(t){return"شام"===t},meridiem:function(t,e,n){return t<12?"صبح":"شام"},calendar:{sameDay:"[اڄ] LT",nextDay:"[سڀاڻي] LT",nextWeek:"dddd [اڳين هفتي تي] LT",lastDay:"[ڪالهه] LT",lastWeek:"[گزريل هفتي] dddd [تي] LT",sameElse:"L"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",ss:"%d سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"},preparse:function(t){return t.replace(/،/g,",")},postformat:function(t){return t.replace(/,/g,"،")},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",ss:"තත්පර %d",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},dayOfMonthOrdinalParse:/\d{1,2} වැනි/,ordinal:function(t){return t+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(t){return"ප.ව."===t||"පස් වරු"===t},meridiem:function(t,e,n){return t>11?n?"ප.ව.":"පස් වරු":n?"පෙ.ව.":"පෙර වරු"}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),n="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");function r(t){return t>1&&t<5}function i(t,e,n,i){var a=t+" ";switch(n){case"s":return e||i?"pár sekúnd":"pár sekundami";case"ss":return e||i?a+(r(t)?"sekundy":"sekúnd"):a+"sekundami";case"m":return e?"minúta":i?"minútu":"minútou";case"mm":return e||i?a+(r(t)?"minúty":"minút"):a+"minútami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?a+(r(t)?"hodiny":"hodín"):a+"hodinami";case"d":return e||i?"deň":"dňom";case"dd":return e||i?a+(r(t)?"dni":"dní"):a+"dňami";case"M":return e||i?"mesiac":"mesiacom";case"MM":return e||i?a+(r(t)?"mesiace":"mesiacov"):a+"mesiacmi";case"y":return e||i?"rok":"rokom";case"yy":return e||i?a+(r(t)?"roky":"rokov"):a+"rokmi"}}t.defineLocale("sk",{months:e,monthsShort:n,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i=t+" ";switch(n){case"s":return e||r?"nekaj sekund":"nekaj sekundami";case"ss":return i+=1===t?e?"sekundo":"sekundi":2===t?e||r?"sekundi":"sekundah":t<5?e||r?"sekunde":"sekundah":"sekund";case"m":return e?"ena minuta":"eno minuto";case"mm":return i+=1===t?e?"minuta":"minuto":2===t?e||r?"minuti":"minutama":t<5?e||r?"minute":"minutami":e||r?"minut":"minutami";case"h":return e?"ena ura":"eno uro";case"hh":return i+=1===t?e?"ura":"uro":2===t?e||r?"uri":"urama":t<5?e||r?"ure":"urami":e||r?"ur":"urami";case"d":return e||r?"en dan":"enim dnem";case"dd":return i+=1===t?e||r?"dan":"dnem":2===t?e||r?"dni":"dnevoma":e||r?"dni":"dnevi";case"M":return e||r?"en mesec":"enim mesecem";case"MM":return i+=1===t?e||r?"mesec":"mesecem":2===t?e||r?"meseca":"mesecema":t<5?e||r?"mesece":"meseci":e||r?"mesecev":"meseci";case"y":return e||r?"eno leto":"enim letom";case"yy":return i+=1===t?e||r?"leto":"letom":2===t?e||r?"leti":"letoma":t<5?e||r?"leta":"leti":e||r?"let":"leti"}}t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(t){return"M"===t.charAt(0)},meridiem:function(t,e,n){return t<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",ss:"%d sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){return["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"месец",MM:e.translate,y:"годину",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(t,e,n){return t<11?"ekuseni":t<15?"emini":t<19?"entsambama":"ebusuku"},meridiemHour:function(t,e){return 12===t&&(t=0),"ekuseni"===e?t:"emini"===e?t>=11?t:t+12:"entsambama"===e||"ebusuku"===e?0===t?0:t+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"e":1===e?"a":2===e?"a":"e";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},n={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};t.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",ss:"%d விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},dayOfMonthOrdinalParse:/\d{1,2}வது/,ordinal:function(t){return t+"வது"},preparse:function(t){return t.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(t,e,n){return t<2?" யாமம்":t<6?" வைகறை":t<10?" காலை":t<14?" நண்பகல்":t<18?" எற்பாடு":t<22?" மாலை":" யாமம்"},meridiemHour:function(t,e){return 12===t&&(t=0),"யாமம்"===e?t<2?t:t+12:"வைகறை"===e||"காலை"===e?t:"நண்பகல்"===e&&t>=10?t:t+12},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",ss:"%d సెకన్లు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},dayOfMonthOrdinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(t,e){return 12===t&&(t=0),"రాత్రి"===e?t<4?t:t+12:"ఉదయం"===e?t:"మధ్యాహ్నం"===e?t>=10?t:t+12:"సాయంత్రం"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"రాత్రి":t<10?"ఉదయం":t<17?"మధ్యాహ్నం":t<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,doy:6}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};t.defineLocale("tg",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Имрӯз соати] LT",nextDay:"[Пагоҳ соати] LT",lastDay:"[Дирӯз соати] LT",nextWeek:"dddd[и] [ҳафтаи оянда соати] LT",lastWeek:"dddd[и] [ҳафтаи гузашта соати] LT",sameElse:"L"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"},meridiemParse:/шаб|субҳ|рӯз|бегоҳ/,meridiemHour:function(t,e){return 12===t&&(t=0),"шаб"===e?t<4?t:t+12:"субҳ"===e?t:"рӯз"===e?t>=11?t:t+12:"бегоҳ"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"шаб":t<11?"субҳ":t<16?"рӯз":t<19?"бегоҳ":"шаб"},dayOfMonthOrdinalParse:/\d{1,2}-(ум|юм)/,ordinal:function(t){var n=t%10,r=t>=100?100:null;return t+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(t){return"หลังเที่ยง"===t},meridiem:function(t,e,n){return t<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(t,n,r,i){var a=function(t){var n=Math.floor(t%1e3/100),r=Math.floor(t%100/10),i=t%10,a="";return n>0&&(a+=e[n]+"vatlh"),r>0&&(a+=(""!==a?" ":"")+e[r]+"maH"),i>0&&(a+=(""!==a?" ":"")+e[i]),""===a?"pagh":a}(t);switch(r){case"ss":return a+" lup";case"mm":return a+" tup";case"hh":return a+" rep";case"dd":return a+" jaj";case"MM":return a+" jar";case"yy":return a+" DIS"}}t.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(t){var e=t;return e=-1!==t.indexOf("jaj")?e.slice(0,-3)+"leS":-1!==t.indexOf("jar")?e.slice(0,-3)+"waQ":-1!==t.indexOf("DIS")?e.slice(0,-3)+"nem":e+" pIq"},past:function(t){var e=t;return e=-1!==t.indexOf("jaj")?e.slice(0,-3)+"Hu’":-1!==t.indexOf("jar")?e.slice(0,-3)+"wen":-1!==t.indexOf("DIS")?e.slice(0,-3)+"ben":e+" ret"},s:"puS lup",ss:n,m:"wa’ tup",mm:n,h:"wa’ rep",hh:n,d:"wa’ jaj",dd:n,M:"wa’ jar",MM:n,y:"wa’ DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};t.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(t,n){switch(n){case"d":case"D":case"Do":case"DD":return t;default:if(0===t)return t+"'ıncı";var r=t%10,i=t%100-r,a=t>=100?100:null;return t+(e[r]||e[i]||e[a])}},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["viensas secunds","'iensas secunds"],ss:[t+" secunds",t+" secunds"],m:["'n míut","'iens míut"],mm:[t+" míuts",t+" míuts"],h:["'n þora","'iensa þora"],hh:[t+" þoras",t+" þoras"],d:["'n ziua","'iensa ziua"],dd:[t+" ziuas",t+" ziuas"],M:["'n mes","'iens mes"],MM:[t+" mesen",t+" mesen"],y:["'n ar","'iens ar"],yy:[t+" ars",t+" ars"]};return r?i[n][0]:e?i[n][0]:i[n][1]}t.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(t){return"d'o"===t.toLowerCase()},meridiem:function(t,e,n){return t>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",ss:"%d ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("ug-cn",{months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},meridiemParse:/يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,meridiemHour:function(t,e){return 12===t&&(t=0),"يېرىم كېچە"===e||"سەھەر"===e||"چۈشتىن بۇرۇن"===e?t:"چۈشتىن كېيىن"===e||"كەچ"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"يېرىم كېچە":r<900?"سەھەر":r<1130?"چۈشتىن بۇرۇن":r<1230?"چۈش":r<1800?"چۈشتىن كېيىن":"كەچ"},calendar:{sameDay:"[بۈگۈن سائەت] LT",nextDay:"[ئەتە سائەت] LT",nextWeek:"[كېلەركى] dddd [سائەت] LT",lastDay:"[تۆنۈگۈن] LT",lastWeek:"[ئالدىنقى] dddd [سائەت] LT",sameElse:"L"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",ss:"%d سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"},dayOfMonthOrdinalParse:/\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"-كۈنى";case"w":case"W":return t+"-ھەپتە";default:return t}},preparse:function(t){return t.replace(/،/g,",")},postformat:function(t){return t.replace(/,/g,"،")},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i,a={ss:e?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:e?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:e?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===n?e?"хвилина":"хвилину":"h"===n?e?"година":"годину":t+" "+(r=+t,i=a[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}function n(t){return function(){return t+"о"+(11===this.hours()?"б":"")+"] LT"}}t.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:function(t,e){var n={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};if(!t)return n.nominative;var r=/(\[[ВвУу]\]) ?dddd/.test(e)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(e)?"genitive":"nominative";return n[r][t.day()]},weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:n("[Сьогодні "),nextDay:n("[Завтра "),lastDay:n("[Вчора "),nextWeek:n("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[Минулої] dddd [").call(this);case 1:case 2:case 4:return n("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:e,m:e,mm:e,h:"годину",hh:e,d:"день",dd:e,M:"місяць",MM:e,y:"рік",yy:e},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(t){return/^(дня|вечора)$/.test(t)},meridiem:function(t,e,n){return t<4?"ночі":t<12?"ранку":t<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-й";case"D":return t+"-го";default:return t}},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";var e=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],n=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];t.defineLocale("ur",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(t){return"شام"===t},meridiem:function(t,e,n){return t<12?"صبح":"شام"},calendar:{sameDay:"[آج بوقت] LT",nextDay:"[کل بوقت] LT",nextWeek:"dddd [بوقت] LT",lastDay:"[گذشتہ روز بوقت] LT",lastWeek:"[گذشتہ] dddd [بوقت] LT",sameElse:"L"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",ss:"%d سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"},preparse:function(t){return t.replace(/،/g,",")},postformat:function(t){return t.replace(/,/g,"،")},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",ss:"%d фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(t){return/^ch$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",ss:"%d s~écóñ~ds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",ss:"aayá %d",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},dayOfMonthOrdinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(t,e){return 12===t&&(t=0),"凌晨"===e||"早上"===e||"上午"===e?t:"下午"===e||"晚上"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"日";case"M":return t+"月";case"w":case"W":return t+"周";default:return t}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(t,e){return 12===t&&(t=0),"凌晨"===e||"早上"===e||"上午"===e?t:"中午"===e?t>=11?t:t+12:"下午"===e||"晚上"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"日";case"M":return t+"月";case"w":case"W":return t+"週";default:return t}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(n(0))},function(t,e,n){!function(t){"use strict";t.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(t,e){return 12===t&&(t=0),"凌晨"===e||"早上"===e||"上午"===e?t:"中午"===e?t>=11?t:t+12:"下午"===e||"晚上"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"日";case"M":return t+"月";case"w":case"W":return t+"週";default:return t}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(n(0))},function(t,e,n){const r=n(4),i=n(144);t.exports=function(t,e,n,r){return function(t,e,n,r){const a={},o=new i;let u,s;var c=function(t){const e=t.v!==u?t.v:t.w,r=a[e],i=n(t),c=s.distance+i;if(i<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+i);c0&&(u=o.removeMin(),(s=a[u]).distance!==Number.POSITIVE_INFINITY);)r(u).forEach(c);return a}(t,String(e),n||a,r||function(e){return t.outEdges(e)})};var a=r.constant(1)},function(t,e,n){const r=n(4);function i(){this._arr=[],this._keyIndices={}}t.exports=i,i.prototype.size=function(){return this._arr.length},i.prototype.keys=function(){return this._arr.map(function(t){return t.key})},i.prototype.has=function(t){return r.has(this._keyIndices,t)},i.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},i.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},i.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!r.has(n,t)){var i=this._arr,a=i.length;return n[t]=a,i.push({key:t,priority:e}),this._decrease(a),!0}return!1},i.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},i.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},i.prototype._heapify=function(t){const e=this._arr,n=2*t,r=n+1;let i=t;n>1].priority\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g,f={"­":"shy","‌":"zwnj","‍":"zwj","‎":"lrm","⁣":"ic","⁢":"it","⁡":"af","‏":"rlm","​":"ZeroWidthSpace","⁠":"NoBreak","̑":"DownBreve","⃛":"tdot","⃜":"DotDot","\t":"Tab","\n":"NewLine"," ":"puncsp"," ":"MediumSpace"," ":"thinsp"," ":"hairsp"," ":"emsp13"," ":"ensp"," ":"emsp14"," ":"emsp"," ":"numsp"," ":"nbsp","  ":"ThickSpace","‾":"oline",_:"lowbar","‐":"dash","–":"ndash","—":"mdash","―":"horbar",",":"comma",";":"semi","⁏":"bsemi",":":"colon","⩴":"Colone","!":"excl","¡":"iexcl","?":"quest","¿":"iquest",".":"period","‥":"nldr","…":"mldr","·":"middot","'":"apos","‘":"lsquo","’":"rsquo","‚":"sbquo","‹":"lsaquo","›":"rsaquo",'"':"quot","“":"ldquo","”":"rdquo","„":"bdquo","«":"laquo","»":"raquo","(":"lpar",")":"rpar","[":"lsqb","]":"rsqb","{":"lcub","}":"rcub","⌈":"lceil","⌉":"rceil","⌊":"lfloor","⌋":"rfloor","⦅":"lopar","⦆":"ropar","⦋":"lbrke","⦌":"rbrke","⦍":"lbrkslu","⦎":"rbrksld","⦏":"lbrksld","⦐":"rbrkslu","⦑":"langd","⦒":"rangd","⦓":"lparlt","⦔":"rpargt","⦕":"gtlPar","⦖":"ltrPar","⟦":"lobrk","⟧":"robrk","⟨":"lang","⟩":"rang","⟪":"Lang","⟫":"Rang","⟬":"loang","⟭":"roang","❲":"lbbrk","❳":"rbbrk","‖":"Vert","§":"sect","¶":"para","@":"commat","*":"ast","/":"sol",undefined:null,"&":"amp","#":"num","%":"percnt","‰":"permil","‱":"pertenk","†":"dagger","‡":"Dagger","•":"bull","⁃":"hybull","′":"prime","″":"Prime","‴":"tprime","⁗":"qprime","‵":"bprime","⁁":"caret","`":"grave","´":"acute","˜":"tilde","^":"Hat","¯":"macr","˘":"breve","˙":"dot","¨":"die","˚":"ring","˝":"dblac","¸":"cedil","˛":"ogon","ˆ":"circ","ˇ":"caron","°":"deg","©":"copy","®":"reg","℗":"copysr","℘":"wp","℞":"rx","℧":"mho","℩":"iiota","←":"larr","↚":"nlarr","→":"rarr","↛":"nrarr","↑":"uarr","↓":"darr","↔":"harr","↮":"nharr","↕":"varr","↖":"nwarr","↗":"nearr","↘":"searr","↙":"swarr","↝":"rarrw","↝̸":"nrarrw","↞":"Larr","↟":"Uarr","↠":"Rarr","↡":"Darr","↢":"larrtl","↣":"rarrtl","↤":"mapstoleft","↥":"mapstoup","↦":"map","↧":"mapstodown","↩":"larrhk","↪":"rarrhk","↫":"larrlp","↬":"rarrlp","↭":"harrw","↰":"lsh","↱":"rsh","↲":"ldsh","↳":"rdsh","↵":"crarr","↶":"cularr","↷":"curarr","↺":"olarr","↻":"orarr","↼":"lharu","↽":"lhard","↾":"uharr","↿":"uharl","⇀":"rharu","⇁":"rhard","⇂":"dharr","⇃":"dharl","⇄":"rlarr","⇅":"udarr","⇆":"lrarr","⇇":"llarr","⇈":"uuarr","⇉":"rrarr","⇊":"ddarr","⇋":"lrhar","⇌":"rlhar","⇐":"lArr","⇍":"nlArr","⇑":"uArr","⇒":"rArr","⇏":"nrArr","⇓":"dArr","⇔":"iff","⇎":"nhArr","⇕":"vArr","⇖":"nwArr","⇗":"neArr","⇘":"seArr","⇙":"swArr","⇚":"lAarr","⇛":"rAarr","⇝":"zigrarr","⇤":"larrb","⇥":"rarrb","⇵":"duarr","⇽":"loarr","⇾":"roarr","⇿":"hoarr","∀":"forall","∁":"comp","∂":"part","∂̸":"npart","∃":"exist","∄":"nexist","∅":"empty","∇":"Del","∈":"in","∉":"notin","∋":"ni","∌":"notni","϶":"bepsi","∏":"prod","∐":"coprod","∑":"sum","+":"plus","±":"pm","÷":"div","×":"times","<":"lt","≮":"nlt","<⃒":"nvlt","=":"equals","≠":"ne","=⃥":"bne","⩵":"Equal",">":"gt","≯":"ngt",">⃒":"nvgt","¬":"not","|":"vert","¦":"brvbar","−":"minus","∓":"mp","∔":"plusdo","⁄":"frasl","∖":"setmn","∗":"lowast","∘":"compfn","√":"Sqrt","∝":"prop","∞":"infin","∟":"angrt","∠":"ang","∠⃒":"nang","∡":"angmsd","∢":"angsph","∣":"mid","∤":"nmid","∥":"par","∦":"npar","∧":"and","∨":"or","∩":"cap","∩︀":"caps","∪":"cup","∪︀":"cups","∫":"int","∬":"Int","∭":"tint","⨌":"qint","∮":"oint","∯":"Conint","∰":"Cconint","∱":"cwint","∲":"cwconint","∳":"awconint","∴":"there4","∵":"becaus","∶":"ratio","∷":"Colon","∸":"minusd","∺":"mDDot","∻":"homtht","∼":"sim","≁":"nsim","∼⃒":"nvsim","∽":"bsim","∽̱":"race","∾":"ac","∾̳":"acE","∿":"acd","≀":"wr","≂":"esim","≂̸":"nesim","≃":"sime","≄":"nsime","≅":"cong","≇":"ncong","≆":"simne","≈":"ap","≉":"nap","≊":"ape","≋":"apid","≋̸":"napid","≌":"bcong","≍":"CupCap","≭":"NotCupCap","≍⃒":"nvap","≎":"bump","≎̸":"nbump","≏":"bumpe","≏̸":"nbumpe","≐":"doteq","≐̸":"nedot","≑":"eDot","≒":"efDot","≓":"erDot","≔":"colone","≕":"ecolon","≖":"ecir","≗":"cire","≙":"wedgeq","≚":"veeeq","≜":"trie","≟":"equest","≡":"equiv","≢":"nequiv","≡⃥":"bnequiv","≤":"le","≰":"nle","≤⃒":"nvle","≥":"ge","≱":"nge","≥⃒":"nvge","≦":"lE","≦̸":"nlE","≧":"gE","≧̸":"ngE","≨︀":"lvnE","≨":"lnE","≩":"gnE","≩︀":"gvnE","≪":"ll","≪̸":"nLtv","≪⃒":"nLt","≫":"gg","≫̸":"nGtv","≫⃒":"nGt","≬":"twixt","≲":"lsim","≴":"nlsim","≳":"gsim","≵":"ngsim","≶":"lg","≸":"ntlg","≷":"gl","≹":"ntgl","≺":"pr","⊀":"npr","≻":"sc","⊁":"nsc","≼":"prcue","⋠":"nprcue","≽":"sccue","⋡":"nsccue","≾":"prsim","≿":"scsim","≿̸":"NotSucceedsTilde","⊂":"sub","⊄":"nsub","⊂⃒":"vnsub","⊃":"sup","⊅":"nsup","⊃⃒":"vnsup","⊆":"sube","⊈":"nsube","⊇":"supe","⊉":"nsupe","⊊︀":"vsubne","⊊":"subne","⊋︀":"vsupne","⊋":"supne","⊍":"cupdot","⊎":"uplus","⊏":"sqsub","⊏̸":"NotSquareSubset","⊐":"sqsup","⊐̸":"NotSquareSuperset","⊑":"sqsube","⋢":"nsqsube","⊒":"sqsupe","⋣":"nsqsupe","⊓":"sqcap","⊓︀":"sqcaps","⊔":"sqcup","⊔︀":"sqcups","⊕":"oplus","⊖":"ominus","⊗":"otimes","⊘":"osol","⊙":"odot","⊚":"ocir","⊛":"oast","⊝":"odash","⊞":"plusb","⊟":"minusb","⊠":"timesb","⊡":"sdotb","⊢":"vdash","⊬":"nvdash","⊣":"dashv","⊤":"top","⊥":"bot","⊧":"models","⊨":"vDash","⊭":"nvDash","⊩":"Vdash","⊮":"nVdash","⊪":"Vvdash","⊫":"VDash","⊯":"nVDash","⊰":"prurel","⊲":"vltri","⋪":"nltri","⊳":"vrtri","⋫":"nrtri","⊴":"ltrie","⋬":"nltrie","⊴⃒":"nvltrie","⊵":"rtrie","⋭":"nrtrie","⊵⃒":"nvrtrie","⊶":"origof","⊷":"imof","⊸":"mumap","⊹":"hercon","⊺":"intcal","⊻":"veebar","⊽":"barvee","⊾":"angrtvb","⊿":"lrtri","⋀":"Wedge","⋁":"Vee","⋂":"xcap","⋃":"xcup","⋄":"diam","⋅":"sdot","⋆":"Star","⋇":"divonx","⋈":"bowtie","⋉":"ltimes","⋊":"rtimes","⋋":"lthree","⋌":"rthree","⋍":"bsime","⋎":"cuvee","⋏":"cuwed","⋐":"Sub","⋑":"Sup","⋒":"Cap","⋓":"Cup","⋔":"fork","⋕":"epar","⋖":"ltdot","⋗":"gtdot","⋘":"Ll","⋘̸":"nLl","⋙":"Gg","⋙̸":"nGg","⋚︀":"lesg","⋚":"leg","⋛":"gel","⋛︀":"gesl","⋞":"cuepr","⋟":"cuesc","⋦":"lnsim","⋧":"gnsim","⋨":"prnsim","⋩":"scnsim","⋮":"vellip","⋯":"ctdot","⋰":"utdot","⋱":"dtdot","⋲":"disin","⋳":"isinsv","⋴":"isins","⋵":"isindot","⋵̸":"notindot","⋶":"notinvc","⋷":"notinvb","⋹":"isinE","⋹̸":"notinE","⋺":"nisd","⋻":"xnis","⋼":"nis","⋽":"notnivc","⋾":"notnivb","⌅":"barwed","⌆":"Barwed","⌌":"drcrop","⌍":"dlcrop","⌎":"urcrop","⌏":"ulcrop","⌐":"bnot","⌒":"profline","⌓":"profsurf","⌕":"telrec","⌖":"target","⌜":"ulcorn","⌝":"urcorn","⌞":"dlcorn","⌟":"drcorn","⌢":"frown","⌣":"smile","⌭":"cylcty","⌮":"profalar","⌶":"topbot","⌽":"ovbar","⌿":"solbar","⍼":"angzarr","⎰":"lmoust","⎱":"rmoust","⎴":"tbrk","⎵":"bbrk","⎶":"bbrktbrk","⏜":"OverParenthesis","⏝":"UnderParenthesis","⏞":"OverBrace","⏟":"UnderBrace","⏢":"trpezium","⏧":"elinters","␣":"blank","─":"boxh","│":"boxv","┌":"boxdr","┐":"boxdl","└":"boxur","┘":"boxul","├":"boxvr","┤":"boxvl","┬":"boxhd","┴":"boxhu","┼":"boxvh","═":"boxH","║":"boxV","╒":"boxdR","╓":"boxDr","╔":"boxDR","╕":"boxdL","╖":"boxDl","╗":"boxDL","╘":"boxuR","╙":"boxUr","╚":"boxUR","╛":"boxuL","╜":"boxUl","╝":"boxUL","╞":"boxvR","╟":"boxVr","╠":"boxVR","╡":"boxvL","╢":"boxVl","╣":"boxVL","╤":"boxHd","╥":"boxhD","╦":"boxHD","╧":"boxHu","╨":"boxhU","╩":"boxHU","╪":"boxvH","╫":"boxVh","╬":"boxVH","▀":"uhblk","▄":"lhblk","█":"block","░":"blk14","▒":"blk12","▓":"blk34","□":"squ","▪":"squf","▫":"EmptyVerySmallSquare","▭":"rect","▮":"marker","▱":"fltns","△":"xutri","▴":"utrif","▵":"utri","▸":"rtrif","▹":"rtri","▽":"xdtri","▾":"dtrif","▿":"dtri","◂":"ltrif","◃":"ltri","◊":"loz","○":"cir","◬":"tridot","◯":"xcirc","◸":"ultri","◹":"urtri","◺":"lltri","◻":"EmptySmallSquare","◼":"FilledSmallSquare","★":"starf","☆":"star","☎":"phone","♀":"female","♂":"male","♠":"spades","♣":"clubs","♥":"hearts","♦":"diams","♪":"sung","✓":"check","✗":"cross","✠":"malt","✶":"sext","❘":"VerticalSeparator","⟈":"bsolhsub","⟉":"suphsol","⟵":"xlarr","⟶":"xrarr","⟷":"xharr","⟸":"xlArr","⟹":"xrArr","⟺":"xhArr","⟼":"xmap","⟿":"dzigrarr","⤂":"nvlArr","⤃":"nvrArr","⤄":"nvHarr","⤅":"Map","⤌":"lbarr","⤍":"rbarr","⤎":"lBarr","⤏":"rBarr","⤐":"RBarr","⤑":"DDotrahd","⤒":"UpArrowBar","⤓":"DownArrowBar","⤖":"Rarrtl","⤙":"latail","⤚":"ratail","⤛":"lAtail","⤜":"rAtail","⤝":"larrfs","⤞":"rarrfs","⤟":"larrbfs","⤠":"rarrbfs","⤣":"nwarhk","⤤":"nearhk","⤥":"searhk","⤦":"swarhk","⤧":"nwnear","⤨":"toea","⤩":"tosa","⤪":"swnwar","⤳":"rarrc","⤳̸":"nrarrc","⤵":"cudarrr","⤶":"ldca","⤷":"rdca","⤸":"cudarrl","⤹":"larrpl","⤼":"curarrm","⤽":"cularrp","⥅":"rarrpl","⥈":"harrcir","⥉":"Uarrocir","⥊":"lurdshar","⥋":"ldrushar","⥎":"LeftRightVector","⥏":"RightUpDownVector","⥐":"DownLeftRightVector","⥑":"LeftUpDownVector","⥒":"LeftVectorBar","⥓":"RightVectorBar","⥔":"RightUpVectorBar","⥕":"RightDownVectorBar","⥖":"DownLeftVectorBar","⥗":"DownRightVectorBar","⥘":"LeftUpVectorBar","⥙":"LeftDownVectorBar","⥚":"LeftTeeVector","⥛":"RightTeeVector","⥜":"RightUpTeeVector","⥝":"RightDownTeeVector","⥞":"DownLeftTeeVector","⥟":"DownRightTeeVector","⥠":"LeftUpTeeVector","⥡":"LeftDownTeeVector","⥢":"lHar","⥣":"uHar","⥤":"rHar","⥥":"dHar","⥦":"luruhar","⥧":"ldrdhar","⥨":"ruluhar","⥩":"rdldhar","⥪":"lharul","⥫":"llhard","⥬":"rharul","⥭":"lrhard","⥮":"udhar","⥯":"duhar","⥰":"RoundImplies","⥱":"erarr","⥲":"simrarr","⥳":"larrsim","⥴":"rarrsim","⥵":"rarrap","⥶":"ltlarr","⥸":"gtrarr","⥹":"subrarr","⥻":"suplarr","⥼":"lfisht","⥽":"rfisht","⥾":"ufisht","⥿":"dfisht","⦚":"vzigzag","⦜":"vangrt","⦝":"angrtvbd","⦤":"ange","⦥":"range","⦦":"dwangle","⦧":"uwangle","⦨":"angmsdaa","⦩":"angmsdab","⦪":"angmsdac","⦫":"angmsdad","⦬":"angmsdae","⦭":"angmsdaf","⦮":"angmsdag","⦯":"angmsdah","⦰":"bemptyv","⦱":"demptyv","⦲":"cemptyv","⦳":"raemptyv","⦴":"laemptyv","⦵":"ohbar","⦶":"omid","⦷":"opar","⦹":"operp","⦻":"olcross","⦼":"odsold","⦾":"olcir","⦿":"ofcir","⧀":"olt","⧁":"ogt","⧂":"cirscir","⧃":"cirE","⧄":"solb","⧅":"bsolb","⧉":"boxbox","⧍":"trisb","⧎":"rtriltri","⧏":"LeftTriangleBar","⧏̸":"NotLeftTriangleBar","⧐":"RightTriangleBar","⧐̸":"NotRightTriangleBar","⧜":"iinfin","⧝":"infintie","⧞":"nvinfin","⧣":"eparsl","⧤":"smeparsl","⧥":"eqvparsl","⧫":"lozf","⧴":"RuleDelayed","⧶":"dsol","⨀":"xodot","⨁":"xoplus","⨂":"xotime","⨄":"xuplus","⨆":"xsqcup","⨍":"fpartint","⨐":"cirfnint","⨑":"awint","⨒":"rppolint","⨓":"scpolint","⨔":"npolint","⨕":"pointint","⨖":"quatint","⨗":"intlarhk","⨢":"pluscir","⨣":"plusacir","⨤":"simplus","⨥":"plusdu","⨦":"plussim","⨧":"plustwo","⨩":"mcomma","⨪":"minusdu","⨭":"loplus","⨮":"roplus","⨯":"Cross","⨰":"timesd","⨱":"timesbar","⨳":"smashp","⨴":"lotimes","⨵":"rotimes","⨶":"otimesas","⨷":"Otimes","⨸":"odiv","⨹":"triplus","⨺":"triminus","⨻":"tritime","⨼":"iprod","⨿":"amalg","⩀":"capdot","⩂":"ncup","⩃":"ncap","⩄":"capand","⩅":"cupor","⩆":"cupcap","⩇":"capcup","⩈":"cupbrcap","⩉":"capbrcup","⩊":"cupcup","⩋":"capcap","⩌":"ccups","⩍":"ccaps","⩐":"ccupssm","⩓":"And","⩔":"Or","⩕":"andand","⩖":"oror","⩗":"orslope","⩘":"andslope","⩚":"andv","⩛":"orv","⩜":"andd","⩝":"ord","⩟":"wedbar","⩦":"sdote","⩪":"simdot","⩭":"congdot","⩭̸":"ncongdot","⩮":"easter","⩯":"apacir","⩰":"apE","⩰̸":"napE","⩱":"eplus","⩲":"pluse","⩳":"Esim","⩷":"eDDot","⩸":"equivDD","⩹":"ltcir","⩺":"gtcir","⩻":"ltquest","⩼":"gtquest","⩽":"les","⩽̸":"nles","⩾":"ges","⩾̸":"nges","⩿":"lesdot","⪀":"gesdot","⪁":"lesdoto","⪂":"gesdoto","⪃":"lesdotor","⪄":"gesdotol","⪅":"lap","⪆":"gap","⪇":"lne","⪈":"gne","⪉":"lnap","⪊":"gnap","⪋":"lEg","⪌":"gEl","⪍":"lsime","⪎":"gsime","⪏":"lsimg","⪐":"gsiml","⪑":"lgE","⪒":"glE","⪓":"lesges","⪔":"gesles","⪕":"els","⪖":"egs","⪗":"elsdot","⪘":"egsdot","⪙":"el","⪚":"eg","⪝":"siml","⪞":"simg","⪟":"simlE","⪠":"simgE","⪡":"LessLess","⪡̸":"NotNestedLessLess","⪢":"GreaterGreater","⪢̸":"NotNestedGreaterGreater","⪤":"glj","⪥":"gla","⪦":"ltcc","⪧":"gtcc","⪨":"lescc","⪩":"gescc","⪪":"smt","⪫":"lat","⪬":"smte","⪬︀":"smtes","⪭":"late","⪭︀":"lates","⪮":"bumpE","⪯":"pre","⪯̸":"npre","⪰":"sce","⪰̸":"nsce","⪳":"prE","⪴":"scE","⪵":"prnE","⪶":"scnE","⪷":"prap","⪸":"scap","⪹":"prnap","⪺":"scnap","⪻":"Pr","⪼":"Sc","⪽":"subdot","⪾":"supdot","⪿":"subplus","⫀":"supplus","⫁":"submult","⫂":"supmult","⫃":"subedot","⫄":"supedot","⫅":"subE","⫅̸":"nsubE","⫆":"supE","⫆̸":"nsupE","⫇":"subsim","⫈":"supsim","⫋︀":"vsubnE","⫋":"subnE","⫌︀":"vsupnE","⫌":"supnE","⫏":"csub","⫐":"csup","⫑":"csube","⫒":"csupe","⫓":"subsup","⫔":"supsub","⫕":"subsub","⫖":"supsup","⫗":"suphsub","⫘":"supdsub","⫙":"forkv","⫚":"topfork","⫛":"mlcp","⫤":"Dashv","⫦":"Vdashl","⫧":"Barv","⫨":"vBar","⫩":"vBarv","⫫":"Vbar","⫬":"Not","⫭":"bNot","⫮":"rnmid","⫯":"cirmid","⫰":"midcir","⫱":"topcir","⫲":"nhpar","⫳":"parsim","⫽":"parsl","⫽⃥":"nparsl","♭":"flat","♮":"natur","♯":"sharp","¤":"curren","¢":"cent",$:"dollar","£":"pound","¥":"yen","€":"euro","¹":"sup1","½":"half","⅓":"frac13","¼":"frac14","⅕":"frac15","⅙":"frac16","⅛":"frac18","²":"sup2","⅔":"frac23","⅖":"frac25","³":"sup3","¾":"frac34","⅗":"frac35","⅜":"frac38","⅘":"frac45","⅚":"frac56","⅝":"frac58","⅞":"frac78","𝒶":"ascr","𝕒":"aopf","𝔞":"afr","𝔸":"Aopf","𝔄":"Afr","𝒜":"Ascr","ª":"ordf","á":"aacute","Á":"Aacute","à":"agrave","À":"Agrave","ă":"abreve","Ă":"Abreve","â":"acirc","Â":"Acirc","å":"aring","Å":"angst","ä":"auml","Ä":"Auml","ã":"atilde","Ã":"Atilde","ą":"aogon","Ą":"Aogon","ā":"amacr","Ā":"Amacr","æ":"aelig","Æ":"AElig","𝒷":"bscr","𝕓":"bopf","𝔟":"bfr","𝔹":"Bopf","ℬ":"Bscr","𝔅":"Bfr","𝔠":"cfr","𝒸":"cscr","𝕔":"copf","ℭ":"Cfr","𝒞":"Cscr","ℂ":"Copf","ć":"cacute","Ć":"Cacute","ĉ":"ccirc","Ĉ":"Ccirc","č":"ccaron","Č":"Ccaron","ċ":"cdot","Ċ":"Cdot","ç":"ccedil","Ç":"Ccedil","℅":"incare","𝔡":"dfr","ⅆ":"dd","𝕕":"dopf","𝒹":"dscr","𝒟":"Dscr","𝔇":"Dfr","ⅅ":"DD","𝔻":"Dopf","ď":"dcaron","Ď":"Dcaron","đ":"dstrok","Đ":"Dstrok","ð":"eth","Ð":"ETH","ⅇ":"ee","ℯ":"escr","𝔢":"efr","𝕖":"eopf","ℰ":"Escr","𝔈":"Efr","𝔼":"Eopf","é":"eacute","É":"Eacute","è":"egrave","È":"Egrave","ê":"ecirc","Ê":"Ecirc","ě":"ecaron","Ě":"Ecaron","ë":"euml","Ë":"Euml","ė":"edot","Ė":"Edot","ę":"eogon","Ę":"Eogon","ē":"emacr","Ē":"Emacr","𝔣":"ffr","𝕗":"fopf","𝒻":"fscr","𝔉":"Ffr","𝔽":"Fopf","ℱ":"Fscr","ff":"fflig","ffi":"ffilig","ffl":"ffllig","fi":"filig",fj:"fjlig","fl":"fllig","ƒ":"fnof","ℊ":"gscr","𝕘":"gopf","𝔤":"gfr","𝒢":"Gscr","𝔾":"Gopf","𝔊":"Gfr","ǵ":"gacute","ğ":"gbreve","Ğ":"Gbreve","ĝ":"gcirc","Ĝ":"Gcirc","ġ":"gdot","Ġ":"Gdot","Ģ":"Gcedil","𝔥":"hfr","ℎ":"planckh","𝒽":"hscr","𝕙":"hopf","ℋ":"Hscr","ℌ":"Hfr","ℍ":"Hopf","ĥ":"hcirc","Ĥ":"Hcirc","ℏ":"hbar","ħ":"hstrok","Ħ":"Hstrok","𝕚":"iopf","𝔦":"ifr","𝒾":"iscr","ⅈ":"ii","𝕀":"Iopf","ℐ":"Iscr","ℑ":"Im","í":"iacute","Í":"Iacute","ì":"igrave","Ì":"Igrave","î":"icirc","Î":"Icirc","ï":"iuml","Ï":"Iuml","ĩ":"itilde","Ĩ":"Itilde","İ":"Idot","į":"iogon","Į":"Iogon","ī":"imacr","Ī":"Imacr","ij":"ijlig","IJ":"IJlig","ı":"imath","𝒿":"jscr","𝕛":"jopf","𝔧":"jfr","𝒥":"Jscr","𝔍":"Jfr","𝕁":"Jopf","ĵ":"jcirc","Ĵ":"Jcirc","ȷ":"jmath","𝕜":"kopf","𝓀":"kscr","𝔨":"kfr","𝒦":"Kscr","𝕂":"Kopf","𝔎":"Kfr","ķ":"kcedil","Ķ":"Kcedil","𝔩":"lfr","𝓁":"lscr","ℓ":"ell","𝕝":"lopf","ℒ":"Lscr","𝔏":"Lfr","𝕃":"Lopf","ĺ":"lacute","Ĺ":"Lacute","ľ":"lcaron","Ľ":"Lcaron","ļ":"lcedil","Ļ":"Lcedil","ł":"lstrok","Ł":"Lstrok","ŀ":"lmidot","Ŀ":"Lmidot","𝔪":"mfr","𝕞":"mopf","𝓂":"mscr","𝔐":"Mfr","𝕄":"Mopf","ℳ":"Mscr","𝔫":"nfr","𝕟":"nopf","𝓃":"nscr","ℕ":"Nopf","𝒩":"Nscr","𝔑":"Nfr","ń":"nacute","Ń":"Nacute","ň":"ncaron","Ň":"Ncaron","ñ":"ntilde","Ñ":"Ntilde","ņ":"ncedil","Ņ":"Ncedil","№":"numero","ŋ":"eng","Ŋ":"ENG","𝕠":"oopf","𝔬":"ofr","ℴ":"oscr","𝒪":"Oscr","𝔒":"Ofr","𝕆":"Oopf","º":"ordm","ó":"oacute","Ó":"Oacute","ò":"ograve","Ò":"Ograve","ô":"ocirc","Ô":"Ocirc","ö":"ouml","Ö":"Ouml","ő":"odblac","Ő":"Odblac","õ":"otilde","Õ":"Otilde","ø":"oslash","Ø":"Oslash","ō":"omacr","Ō":"Omacr","œ":"oelig","Œ":"OElig","𝔭":"pfr","𝓅":"pscr","𝕡":"popf","ℙ":"Popf","𝔓":"Pfr","𝒫":"Pscr","𝕢":"qopf","𝔮":"qfr","𝓆":"qscr","𝒬":"Qscr","𝔔":"Qfr","ℚ":"Qopf","ĸ":"kgreen","𝔯":"rfr","𝕣":"ropf","𝓇":"rscr","ℛ":"Rscr","ℜ":"Re","ℝ":"Ropf","ŕ":"racute","Ŕ":"Racute","ř":"rcaron","Ř":"Rcaron","ŗ":"rcedil","Ŗ":"Rcedil","𝕤":"sopf","𝓈":"sscr","𝔰":"sfr","𝕊":"Sopf","𝔖":"Sfr","𝒮":"Sscr","Ⓢ":"oS","ś":"sacute","Ś":"Sacute","ŝ":"scirc","Ŝ":"Scirc","š":"scaron","Š":"Scaron","ş":"scedil","Ş":"Scedil","ß":"szlig","𝔱":"tfr","𝓉":"tscr","𝕥":"topf","𝒯":"Tscr","𝔗":"Tfr","𝕋":"Topf","ť":"tcaron","Ť":"Tcaron","ţ":"tcedil","Ţ":"Tcedil","™":"trade","ŧ":"tstrok","Ŧ":"Tstrok","𝓊":"uscr","𝕦":"uopf","𝔲":"ufr","𝕌":"Uopf","𝔘":"Ufr","𝒰":"Uscr","ú":"uacute","Ú":"Uacute","ù":"ugrave","Ù":"Ugrave","ŭ":"ubreve","Ŭ":"Ubreve","û":"ucirc","Û":"Ucirc","ů":"uring","Ů":"Uring","ü":"uuml","Ü":"Uuml","ű":"udblac","Ű":"Udblac","ũ":"utilde","Ũ":"Utilde","ų":"uogon","Ų":"Uogon","ū":"umacr","Ū":"Umacr","𝔳":"vfr","𝕧":"vopf","𝓋":"vscr","𝔙":"Vfr","𝕍":"Vopf","𝒱":"Vscr","𝕨":"wopf","𝓌":"wscr","𝔴":"wfr","𝒲":"Wscr","𝕎":"Wopf","𝔚":"Wfr","ŵ":"wcirc","Ŵ":"Wcirc","𝔵":"xfr","𝓍":"xscr","𝕩":"xopf","𝕏":"Xopf","𝔛":"Xfr","𝒳":"Xscr","𝔶":"yfr","𝓎":"yscr","𝕪":"yopf","𝒴":"Yscr","𝔜":"Yfr","𝕐":"Yopf","ý":"yacute","Ý":"Yacute","ŷ":"ycirc","Ŷ":"Ycirc","ÿ":"yuml","Ÿ":"Yuml","𝓏":"zscr","𝔷":"zfr","𝕫":"zopf","ℨ":"Zfr","ℤ":"Zopf","𝒵":"Zscr","ź":"zacute","Ź":"Zacute","ž":"zcaron","Ž":"Zcaron","ż":"zdot","Ż":"Zdot","Ƶ":"imped","þ":"thorn","Þ":"THORN","ʼn":"napos","α":"alpha","Α":"Alpha","β":"beta","Β":"Beta","γ":"gamma","Γ":"Gamma","δ":"delta","Δ":"Delta","ε":"epsi","ϵ":"epsiv","Ε":"Epsilon","ϝ":"gammad","Ϝ":"Gammad","ζ":"zeta","Ζ":"Zeta","η":"eta","Η":"Eta","θ":"theta","ϑ":"thetav","Θ":"Theta","ι":"iota","Ι":"Iota","κ":"kappa","ϰ":"kappav","Κ":"Kappa","λ":"lambda","Λ":"Lambda","μ":"mu","µ":"micro","Μ":"Mu","ν":"nu","Ν":"Nu","ξ":"xi","Ξ":"Xi","ο":"omicron","Ο":"Omicron","π":"pi","ϖ":"piv","Π":"Pi","ρ":"rho","ϱ":"rhov","Ρ":"Rho","σ":"sigma","Σ":"Sigma","ς":"sigmaf","τ":"tau","Τ":"Tau","υ":"upsi","Υ":"Upsilon","ϒ":"Upsi","φ":"phi","ϕ":"phiv","Φ":"Phi","χ":"chi","Χ":"Chi","ψ":"psi","Ψ":"Psi","ω":"omega","Ω":"ohm","а":"acy","А":"Acy","б":"bcy","Б":"Bcy","в":"vcy","В":"Vcy","г":"gcy","Г":"Gcy","ѓ":"gjcy","Ѓ":"GJcy","д":"dcy","Д":"Dcy","ђ":"djcy","Ђ":"DJcy","е":"iecy","Е":"IEcy","ё":"iocy","Ё":"IOcy","є":"jukcy","Є":"Jukcy","ж":"zhcy","Ж":"ZHcy","з":"zcy","З":"Zcy","ѕ":"dscy","Ѕ":"DScy","и":"icy","И":"Icy","і":"iukcy","І":"Iukcy","ї":"yicy","Ї":"YIcy","й":"jcy","Й":"Jcy","ј":"jsercy","Ј":"Jsercy","к":"kcy","К":"Kcy","ќ":"kjcy","Ќ":"KJcy","л":"lcy","Л":"Lcy","љ":"ljcy","Љ":"LJcy","м":"mcy","М":"Mcy","н":"ncy","Н":"Ncy","њ":"njcy","Њ":"NJcy","о":"ocy","О":"Ocy","п":"pcy","П":"Pcy","р":"rcy","Р":"Rcy","с":"scy","С":"Scy","т":"tcy","Т":"Tcy","ћ":"tshcy","Ћ":"TSHcy","у":"ucy","У":"Ucy","ў":"ubrcy","Ў":"Ubrcy","ф":"fcy","Ф":"Fcy","х":"khcy","Х":"KHcy","ц":"tscy","Ц":"TScy","ч":"chcy","Ч":"CHcy","џ":"dzcy","Џ":"DZcy","ш":"shcy","Ш":"SHcy","щ":"shchcy","Щ":"SHCHcy","ъ":"hardcy","Ъ":"HARDcy","ы":"ycy","Ы":"Ycy","ь":"softcy","Ь":"SOFTcy","э":"ecy","Э":"Ecy","ю":"yucy","Ю":"YUcy","я":"yacy","Я":"YAcy","ℵ":"aleph","ℶ":"beth","ℷ":"gimel","ℸ":"daleth"},d=/["&'<>`]/g,h={'"':""","&":"&","'":"'","<":"<",">":">","`":"`"},_=/&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/,p=/[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,m=/&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g,y={aacute:"á",Aacute:"Á",abreve:"ă",Abreve:"Ă",ac:"∾",acd:"∿",acE:"∾̳",acirc:"â",Acirc:"Â",acute:"´",acy:"а",Acy:"А",aelig:"æ",AElig:"Æ",af:"⁡",afr:"𝔞",Afr:"𝔄",agrave:"à",Agrave:"À",alefsym:"ℵ",aleph:"ℵ",alpha:"α",Alpha:"Α",amacr:"ā",Amacr:"Ā",amalg:"⨿",amp:"&",AMP:"&",and:"∧",And:"⩓",andand:"⩕",andd:"⩜",andslope:"⩘",andv:"⩚",ang:"∠",ange:"⦤",angle:"∠",angmsd:"∡",angmsdaa:"⦨",angmsdab:"⦩",angmsdac:"⦪",angmsdad:"⦫",angmsdae:"⦬",angmsdaf:"⦭",angmsdag:"⦮",angmsdah:"⦯",angrt:"∟",angrtvb:"⊾",angrtvbd:"⦝",angsph:"∢",angst:"Å",angzarr:"⍼",aogon:"ą",Aogon:"Ą",aopf:"𝕒",Aopf:"𝔸",ap:"≈",apacir:"⩯",ape:"≊",apE:"⩰",apid:"≋",apos:"'",ApplyFunction:"⁡",approx:"≈",approxeq:"≊",aring:"å",Aring:"Å",ascr:"𝒶",Ascr:"𝒜",Assign:"≔",ast:"*",asymp:"≈",asympeq:"≍",atilde:"ã",Atilde:"Ã",auml:"ä",Auml:"Ä",awconint:"∳",awint:"⨑",backcong:"≌",backepsilon:"϶",backprime:"‵",backsim:"∽",backsimeq:"⋍",Backslash:"∖",Barv:"⫧",barvee:"⊽",barwed:"⌅",Barwed:"⌆",barwedge:"⌅",bbrk:"⎵",bbrktbrk:"⎶",bcong:"≌",bcy:"б",Bcy:"Б",bdquo:"„",becaus:"∵",because:"∵",Because:"∵",bemptyv:"⦰",bepsi:"϶",bernou:"ℬ",Bernoullis:"ℬ",beta:"β",Beta:"Β",beth:"ℶ",between:"≬",bfr:"𝔟",Bfr:"𝔅",bigcap:"⋂",bigcirc:"◯",bigcup:"⋃",bigodot:"⨀",bigoplus:"⨁",bigotimes:"⨂",bigsqcup:"⨆",bigstar:"★",bigtriangledown:"▽",bigtriangleup:"△",biguplus:"⨄",bigvee:"⋁",bigwedge:"⋀",bkarow:"⤍",blacklozenge:"⧫",blacksquare:"▪",blacktriangle:"▴",blacktriangledown:"▾",blacktriangleleft:"◂",blacktriangleright:"▸",blank:"␣",blk12:"▒",blk14:"░",blk34:"▓",block:"█",bne:"=⃥",bnequiv:"≡⃥",bnot:"⌐",bNot:"⫭",bopf:"𝕓",Bopf:"𝔹",bot:"⊥",bottom:"⊥",bowtie:"⋈",boxbox:"⧉",boxdl:"┐",boxdL:"╕",boxDl:"╖",boxDL:"╗",boxdr:"┌",boxdR:"╒",boxDr:"╓",boxDR:"╔",boxh:"─",boxH:"═",boxhd:"┬",boxhD:"╥",boxHd:"╤",boxHD:"╦",boxhu:"┴",boxhU:"╨",boxHu:"╧",boxHU:"╩",boxminus:"⊟",boxplus:"⊞",boxtimes:"⊠",boxul:"┘",boxuL:"╛",boxUl:"╜",boxUL:"╝",boxur:"└",boxuR:"╘",boxUr:"╙",boxUR:"╚",boxv:"│",boxV:"║",boxvh:"┼",boxvH:"╪",boxVh:"╫",boxVH:"╬",boxvl:"┤",boxvL:"╡",boxVl:"╢",boxVL:"╣",boxvr:"├",boxvR:"╞",boxVr:"╟",boxVR:"╠",bprime:"‵",breve:"˘",Breve:"˘",brvbar:"¦",bscr:"𝒷",Bscr:"ℬ",bsemi:"⁏",bsim:"∽",bsime:"⋍",bsol:"\\",bsolb:"⧅",bsolhsub:"⟈",bull:"•",bullet:"•",bump:"≎",bumpe:"≏",bumpE:"⪮",bumpeq:"≏",Bumpeq:"≎",cacute:"ć",Cacute:"Ć",cap:"∩",Cap:"⋒",capand:"⩄",capbrcup:"⩉",capcap:"⩋",capcup:"⩇",capdot:"⩀",CapitalDifferentialD:"ⅅ",caps:"∩︀",caret:"⁁",caron:"ˇ",Cayleys:"ℭ",ccaps:"⩍",ccaron:"č",Ccaron:"Č",ccedil:"ç",Ccedil:"Ç",ccirc:"ĉ",Ccirc:"Ĉ",Cconint:"∰",ccups:"⩌",ccupssm:"⩐",cdot:"ċ",Cdot:"Ċ",cedil:"¸",Cedilla:"¸",cemptyv:"⦲",cent:"¢",centerdot:"·",CenterDot:"·",cfr:"𝔠",Cfr:"ℭ",chcy:"ч",CHcy:"Ч",check:"✓",checkmark:"✓",chi:"χ",Chi:"Χ",cir:"○",circ:"ˆ",circeq:"≗",circlearrowleft:"↺",circlearrowright:"↻",circledast:"⊛",circledcirc:"⊚",circleddash:"⊝",CircleDot:"⊙",circledR:"®",circledS:"Ⓢ",CircleMinus:"⊖",CirclePlus:"⊕",CircleTimes:"⊗",cire:"≗",cirE:"⧃",cirfnint:"⨐",cirmid:"⫯",cirscir:"⧂",ClockwiseContourIntegral:"∲",CloseCurlyDoubleQuote:"”",CloseCurlyQuote:"’",clubs:"♣",clubsuit:"♣",colon:":",Colon:"∷",colone:"≔",Colone:"⩴",coloneq:"≔",comma:",",commat:"@",comp:"∁",compfn:"∘",complement:"∁",complexes:"ℂ",cong:"≅",congdot:"⩭",Congruent:"≡",conint:"∮",Conint:"∯",ContourIntegral:"∮",copf:"𝕔",Copf:"ℂ",coprod:"∐",Coproduct:"∐",copy:"©",COPY:"©",copysr:"℗",CounterClockwiseContourIntegral:"∳",crarr:"↵",cross:"✗",Cross:"⨯",cscr:"𝒸",Cscr:"𝒞",csub:"⫏",csube:"⫑",csup:"⫐",csupe:"⫒",ctdot:"⋯",cudarrl:"⤸",cudarrr:"⤵",cuepr:"⋞",cuesc:"⋟",cularr:"↶",cularrp:"⤽",cup:"∪",Cup:"⋓",cupbrcap:"⩈",cupcap:"⩆",CupCap:"≍",cupcup:"⩊",cupdot:"⊍",cupor:"⩅",cups:"∪︀",curarr:"↷",curarrm:"⤼",curlyeqprec:"⋞",curlyeqsucc:"⋟",curlyvee:"⋎",curlywedge:"⋏",curren:"¤",curvearrowleft:"↶",curvearrowright:"↷",cuvee:"⋎",cuwed:"⋏",cwconint:"∲",cwint:"∱",cylcty:"⌭",dagger:"†",Dagger:"‡",daleth:"ℸ",darr:"↓",dArr:"⇓",Darr:"↡",dash:"‐",dashv:"⊣",Dashv:"⫤",dbkarow:"⤏",dblac:"˝",dcaron:"ď",Dcaron:"Ď",dcy:"д",Dcy:"Д",dd:"ⅆ",DD:"ⅅ",ddagger:"‡",ddarr:"⇊",DDotrahd:"⤑",ddotseq:"⩷",deg:"°",Del:"∇",delta:"δ",Delta:"Δ",demptyv:"⦱",dfisht:"⥿",dfr:"𝔡",Dfr:"𝔇",dHar:"⥥",dharl:"⇃",dharr:"⇂",DiacriticalAcute:"´",DiacriticalDot:"˙",DiacriticalDoubleAcute:"˝",DiacriticalGrave:"`",DiacriticalTilde:"˜",diam:"⋄",diamond:"⋄",Diamond:"⋄",diamondsuit:"♦",diams:"♦",die:"¨",DifferentialD:"ⅆ",digamma:"ϝ",disin:"⋲",div:"÷",divide:"÷",divideontimes:"⋇",divonx:"⋇",djcy:"ђ",DJcy:"Ђ",dlcorn:"⌞",dlcrop:"⌍",dollar:"$",dopf:"𝕕",Dopf:"𝔻",dot:"˙",Dot:"¨",DotDot:"⃜",doteq:"≐",doteqdot:"≑",DotEqual:"≐",dotminus:"∸",dotplus:"∔",dotsquare:"⊡",doublebarwedge:"⌆",DoubleContourIntegral:"∯",DoubleDot:"¨",DoubleDownArrow:"⇓",DoubleLeftArrow:"⇐",DoubleLeftRightArrow:"⇔",DoubleLeftTee:"⫤",DoubleLongLeftArrow:"⟸",DoubleLongLeftRightArrow:"⟺",DoubleLongRightArrow:"⟹",DoubleRightArrow:"⇒",DoubleRightTee:"⊨",DoubleUpArrow:"⇑",DoubleUpDownArrow:"⇕",DoubleVerticalBar:"∥",downarrow:"↓",Downarrow:"⇓",DownArrow:"↓",DownArrowBar:"⤓",DownArrowUpArrow:"⇵",DownBreve:"̑",downdownarrows:"⇊",downharpoonleft:"⇃",downharpoonright:"⇂",DownLeftRightVector:"⥐",DownLeftTeeVector:"⥞",DownLeftVector:"↽",DownLeftVectorBar:"⥖",DownRightTeeVector:"⥟",DownRightVector:"⇁",DownRightVectorBar:"⥗",DownTee:"⊤",DownTeeArrow:"↧",drbkarow:"⤐",drcorn:"⌟",drcrop:"⌌",dscr:"𝒹",Dscr:"𝒟",dscy:"ѕ",DScy:"Ѕ",dsol:"⧶",dstrok:"đ",Dstrok:"Đ",dtdot:"⋱",dtri:"▿",dtrif:"▾",duarr:"⇵",duhar:"⥯",dwangle:"⦦",dzcy:"џ",DZcy:"Џ",dzigrarr:"⟿",eacute:"é",Eacute:"É",easter:"⩮",ecaron:"ě",Ecaron:"Ě",ecir:"≖",ecirc:"ê",Ecirc:"Ê",ecolon:"≕",ecy:"э",Ecy:"Э",eDDot:"⩷",edot:"ė",eDot:"≑",Edot:"Ė",ee:"ⅇ",efDot:"≒",efr:"𝔢",Efr:"𝔈",eg:"⪚",egrave:"è",Egrave:"È",egs:"⪖",egsdot:"⪘",el:"⪙",Element:"∈",elinters:"⏧",ell:"ℓ",els:"⪕",elsdot:"⪗",emacr:"ē",Emacr:"Ē",empty:"∅",emptyset:"∅",EmptySmallSquare:"◻",emptyv:"∅",EmptyVerySmallSquare:"▫",emsp:" ",emsp13:" ",emsp14:" ",eng:"ŋ",ENG:"Ŋ",ensp:" ",eogon:"ę",Eogon:"Ę",eopf:"𝕖",Eopf:"𝔼",epar:"⋕",eparsl:"⧣",eplus:"⩱",epsi:"ε",epsilon:"ε",Epsilon:"Ε",epsiv:"ϵ",eqcirc:"≖",eqcolon:"≕",eqsim:"≂",eqslantgtr:"⪖",eqslantless:"⪕",Equal:"⩵",equals:"=",EqualTilde:"≂",equest:"≟",Equilibrium:"⇌",equiv:"≡",equivDD:"⩸",eqvparsl:"⧥",erarr:"⥱",erDot:"≓",escr:"ℯ",Escr:"ℰ",esdot:"≐",esim:"≂",Esim:"⩳",eta:"η",Eta:"Η",eth:"ð",ETH:"Ð",euml:"ë",Euml:"Ë",euro:"€",excl:"!",exist:"∃",Exists:"∃",expectation:"ℰ",exponentiale:"ⅇ",ExponentialE:"ⅇ",fallingdotseq:"≒",fcy:"ф",Fcy:"Ф",female:"♀",ffilig:"ffi",fflig:"ff",ffllig:"ffl",ffr:"𝔣",Ffr:"𝔉",filig:"fi",FilledSmallSquare:"◼",FilledVerySmallSquare:"▪",fjlig:"fj",flat:"♭",fllig:"fl",fltns:"▱",fnof:"ƒ",fopf:"𝕗",Fopf:"𝔽",forall:"∀",ForAll:"∀",fork:"⋔",forkv:"⫙",Fouriertrf:"ℱ",fpartint:"⨍",frac12:"½",frac13:"⅓",frac14:"¼",frac15:"⅕",frac16:"⅙",frac18:"⅛",frac23:"⅔",frac25:"⅖",frac34:"¾",frac35:"⅗",frac38:"⅜",frac45:"⅘",frac56:"⅚",frac58:"⅝",frac78:"⅞",frasl:"⁄",frown:"⌢",fscr:"𝒻",Fscr:"ℱ",gacute:"ǵ",gamma:"γ",Gamma:"Γ",gammad:"ϝ",Gammad:"Ϝ",gap:"⪆",gbreve:"ğ",Gbreve:"Ğ",Gcedil:"Ģ",gcirc:"ĝ",Gcirc:"Ĝ",gcy:"г",Gcy:"Г",gdot:"ġ",Gdot:"Ġ",ge:"≥",gE:"≧",gel:"⋛",gEl:"⪌",geq:"≥",geqq:"≧",geqslant:"⩾",ges:"⩾",gescc:"⪩",gesdot:"⪀",gesdoto:"⪂",gesdotol:"⪄",gesl:"⋛︀",gesles:"⪔",gfr:"𝔤",Gfr:"𝔊",gg:"≫",Gg:"⋙",ggg:"⋙",gimel:"ℷ",gjcy:"ѓ",GJcy:"Ѓ",gl:"≷",gla:"⪥",glE:"⪒",glj:"⪤",gnap:"⪊",gnapprox:"⪊",gne:"⪈",gnE:"≩",gneq:"⪈",gneqq:"≩",gnsim:"⋧",gopf:"𝕘",Gopf:"𝔾",grave:"`",GreaterEqual:"≥",GreaterEqualLess:"⋛",GreaterFullEqual:"≧",GreaterGreater:"⪢",GreaterLess:"≷",GreaterSlantEqual:"⩾",GreaterTilde:"≳",gscr:"ℊ",Gscr:"𝒢",gsim:"≳",gsime:"⪎",gsiml:"⪐",gt:">",Gt:"≫",GT:">",gtcc:"⪧",gtcir:"⩺",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",hardcy:"ъ",HARDcy:"Ъ",harr:"↔",hArr:"⇔",harrcir:"⥈",harrw:"↭",Hat:"^",hbar:"ℏ",hcirc:"ĥ",Hcirc:"Ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",hfr:"𝔥",Hfr:"ℌ",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",hopf:"𝕙",Hopf:"ℍ",horbar:"―",HorizontalLine:"─",hscr:"𝒽",Hscr:"ℋ",hslash:"ℏ",hstrok:"ħ",Hstrok:"Ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",iacute:"í",Iacute:"Í",ic:"⁣",icirc:"î",Icirc:"Î",icy:"и",Icy:"И",Idot:"İ",iecy:"е",IEcy:"Е",iexcl:"¡",iff:"⇔",ifr:"𝔦",Ifr:"ℑ",igrave:"ì",Igrave:"Ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",ijlig:"ij",IJlig:"IJ",Im:"ℑ",imacr:"ī",Imacr:"Ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",imof:"⊷",imped:"Ƶ",Implies:"⇒",in:"∈",incare:"℅",infin:"∞",infintie:"⧝",inodot:"ı",int:"∫",Int:"∬",intcal:"⊺",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"⁣",InvisibleTimes:"⁢",iocy:"ё",IOcy:"Ё",iogon:"į",Iogon:"Į",iopf:"𝕚",Iopf:"𝕀",iota:"ι",Iota:"Ι",iprod:"⨼",iquest:"¿",iscr:"𝒾",Iscr:"ℐ",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"⁢",itilde:"ĩ",Itilde:"Ĩ",iukcy:"і",Iukcy:"І",iuml:"ï",Iuml:"Ï",jcirc:"ĵ",Jcirc:"Ĵ",jcy:"й",Jcy:"Й",jfr:"𝔧",Jfr:"𝔍",jmath:"ȷ",jopf:"𝕛",Jopf:"𝕁",jscr:"𝒿",Jscr:"𝒥",jsercy:"ј",Jsercy:"Ј",jukcy:"є",Jukcy:"Є",kappa:"κ",Kappa:"Κ",kappav:"ϰ",kcedil:"ķ",Kcedil:"Ķ",kcy:"к",Kcy:"К",kfr:"𝔨",Kfr:"𝔎",kgreen:"ĸ",khcy:"х",KHcy:"Х",kjcy:"ќ",KJcy:"Ќ",kopf:"𝕜",Kopf:"𝕂",kscr:"𝓀",Kscr:"𝒦",lAarr:"⇚",lacute:"ĺ",Lacute:"Ĺ",laemptyv:"⦴",lagran:"ℒ",lambda:"λ",Lambda:"Λ",lang:"⟨",Lang:"⟪",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",larr:"←",lArr:"⇐",Larr:"↞",larrb:"⇤",larrbfs:"⤟",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",lat:"⪫",latail:"⤙",lAtail:"⤛",late:"⪭",lates:"⪭︀",lbarr:"⤌",lBarr:"⤎",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",lcaron:"ľ",Lcaron:"Ľ",lcedil:"ļ",Lcedil:"Ļ",lceil:"⌈",lcub:"{",lcy:"л",Lcy:"Л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",le:"≤",lE:"≦",LeftAngleBracket:"⟨",leftarrow:"←",Leftarrow:"⇐",LeftArrow:"←",LeftArrowBar:"⇤",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVector:"⇃",LeftDownVectorBar:"⥙",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",leftrightarrow:"↔",Leftrightarrow:"⇔",LeftRightArrow:"↔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTee:"⊣",LeftTeeArrow:"↤",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangle:"⊲",LeftTriangleBar:"⧏",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVector:"↿",LeftUpVectorBar:"⥘",LeftVector:"↼",LeftVectorBar:"⥒",leg:"⋚",lEg:"⪋",leq:"≤",leqq:"≦",leqslant:"⩽",les:"⩽",lescc:"⪨",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",lfr:"𝔩",Lfr:"𝔏",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",ljcy:"љ",LJcy:"Љ",ll:"≪",Ll:"⋘",llarr:"⇇",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",lmidot:"ŀ",Lmidot:"Ŀ",lmoust:"⎰",lmoustache:"⎰",lnap:"⪉",lnapprox:"⪉",lne:"⪇",lnE:"≨",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",longleftarrow:"⟵",Longleftarrow:"⟸",LongLeftArrow:"⟵",longleftrightarrow:"⟷",Longleftrightarrow:"⟺",LongLeftRightArrow:"⟷",longmapsto:"⟼",longrightarrow:"⟶",Longrightarrow:"⟹",LongRightArrow:"⟶",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",lopf:"𝕝",Lopf:"𝕃",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"‎",lrtri:"⊿",lsaquo:"‹",lscr:"𝓁",Lscr:"ℒ",lsh:"↰",Lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",lstrok:"ł",Lstrok:"Ł",lt:"<",Lt:"≪",LT:"<",ltcc:"⪦",ltcir:"⩹",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",map:"↦",Map:"⤅",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",mcy:"м",Mcy:"М",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",mfr:"𝔪",Mfr:"𝔐",mho:"℧",micro:"µ",mid:"∣",midast:"*",midcir:"⫰",middot:"·",minus:"−",minusb:"⊟",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",mopf:"𝕞",Mopf:"𝕄",mp:"∓",mscr:"𝓂",Mscr:"ℳ",mstpos:"∾",mu:"μ",Mu:"Μ",multimap:"⊸",mumap:"⊸",nabla:"∇",nacute:"ń",Nacute:"Ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natur:"♮",natural:"♮",naturals:"ℕ",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",ncaron:"ň",Ncaron:"Ň",ncedil:"ņ",Ncedil:"Ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",ncy:"н",Ncy:"Н",ndash:"–",ne:"≠",nearhk:"⤤",nearr:"↗",neArr:"⇗",nearrow:"↗",nedot:"≐̸",NegativeMediumSpace:"​",NegativeThickSpace:"​",NegativeThinSpace:"​",NegativeVeryThinSpace:"​",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:"\n",nexist:"∄",nexists:"∄",nfr:"𝔫",Nfr:"𝔑",nge:"≱",ngE:"≧̸",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",ngt:"≯",nGt:"≫⃒",ngtr:"≯",nGtv:"≫̸",nharr:"↮",nhArr:"⇎",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",njcy:"њ",NJcy:"Њ",nlarr:"↚",nlArr:"⇍",nldr:"‥",nle:"≰",nlE:"≦̸",nleftarrow:"↚",nLeftarrow:"⇍",nleftrightarrow:"↮",nLeftrightarrow:"⇎",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nlt:"≮",nLt:"≪⃒",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"⁠",NonBreakingSpace:" ",nopf:"𝕟",Nopf:"ℕ",not:"¬",Not:"⫬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangle:"⋪",NotLeftTriangleBar:"⧏̸",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangle:"⋫",NotRightTriangleBar:"⧐̸",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",npar:"∦",nparallel:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",npre:"⪯̸",nprec:"⊀",npreceq:"⪯̸",nrarr:"↛",nrArr:"⇏",nrarrc:"⤳̸",nrarrw:"↝̸",nrightarrow:"↛",nRightarrow:"⇏",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",nscr:"𝓃",Nscr:"𝒩",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsube:"⊈",nsubE:"⫅̸",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupe:"⊉",nsupE:"⫆̸",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",ntilde:"ñ",Ntilde:"Ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",nu:"ν",Nu:"Ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nvdash:"⊬",nvDash:"⊭",nVdash:"⊮",nVDash:"⊯",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwarr:"↖",nwArr:"⇖",nwarrow:"↖",nwnear:"⤧",oacute:"ó",Oacute:"Ó",oast:"⊛",ocir:"⊚",ocirc:"ô",Ocirc:"Ô",ocy:"о",Ocy:"О",odash:"⊝",odblac:"ő",Odblac:"Ő",odiv:"⨸",odot:"⊙",odsold:"⦼",oelig:"œ",OElig:"Œ",ofcir:"⦿",ofr:"𝔬",Ofr:"𝔒",ogon:"˛",ograve:"ò",Ograve:"Ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",omacr:"ō",Omacr:"Ō",omega:"ω",Omega:"Ω",omicron:"ο",Omicron:"Ο",omid:"⦶",ominus:"⊖",oopf:"𝕠",Oopf:"𝕆",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",or:"∨",Or:"⩔",orarr:"↻",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",oscr:"ℴ",Oscr:"𝒪",oslash:"ø",Oslash:"Ø",osol:"⊘",otilde:"õ",Otilde:"Õ",otimes:"⊗",Otimes:"⨷",otimesas:"⨶",ouml:"ö",Ouml:"Ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",par:"∥",para:"¶",parallel:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",pcy:"п",Pcy:"П",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",pfr:"𝔭",Pfr:"𝔓",phi:"φ",Phi:"Φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",pi:"π",Pi:"Π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plus:"+",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",popf:"𝕡",Popf:"ℙ",pound:"£",pr:"≺",Pr:"⪻",prap:"⪷",prcue:"≼",pre:"⪯",prE:"⪳",prec:"≺",precapprox:"⪷",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",precsim:"≾",prime:"′",Prime:"″",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportion:"∷",Proportional:"∝",propto:"∝",prsim:"≾",prurel:"⊰",pscr:"𝓅",Pscr:"𝒫",psi:"ψ",Psi:"Ψ",puncsp:" ",qfr:"𝔮",Qfr:"𝔔",qint:"⨌",qopf:"𝕢",Qopf:"ℚ",qprime:"⁗",qscr:"𝓆",Qscr:"𝒬",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",quot:'"',QUOT:'"',rAarr:"⇛",race:"∽̱",racute:"ŕ",Racute:"Ŕ",radic:"√",raemptyv:"⦳",rang:"⟩",Rang:"⟫",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",rarr:"→",rArr:"⇒",Rarr:"↠",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",rarrtl:"↣",Rarrtl:"⤖",rarrw:"↝",ratail:"⤚",rAtail:"⤜",ratio:"∶",rationals:"ℚ",rbarr:"⤍",rBarr:"⤏",RBarr:"⤐",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",rcaron:"ř",Rcaron:"Ř",rcedil:"ŗ",Rcedil:"Ŗ",rceil:"⌉",rcub:"}",rcy:"р",Rcy:"Р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",Re:"ℜ",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",rect:"▭",reg:"®",REG:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",rfr:"𝔯",Rfr:"ℜ",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",rho:"ρ",Rho:"Ρ",rhov:"ϱ",RightAngleBracket:"⟩",rightarrow:"→",Rightarrow:"⇒",RightArrow:"→",RightArrowBar:"⇥",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVector:"⇂",RightDownVectorBar:"⥕",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTee:"⊢",RightTeeArrow:"↦",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangle:"⊳",RightTriangleBar:"⧐",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVector:"↾",RightUpVectorBar:"⥔",RightVector:"⇀",RightVectorBar:"⥓",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"‏",rmoust:"⎱",rmoustache:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",ropf:"𝕣",Ropf:"ℝ",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",rscr:"𝓇",Rscr:"ℛ",rsh:"↱",Rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",sacute:"ś",Sacute:"Ś",sbquo:"‚",sc:"≻",Sc:"⪼",scap:"⪸",scaron:"š",Scaron:"Š",sccue:"≽",sce:"⪰",scE:"⪴",scedil:"ş",Scedil:"Ş",scirc:"ŝ",Scirc:"Ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",scy:"с",Scy:"С",sdot:"⋅",sdotb:"⊡",sdote:"⩦",searhk:"⤥",searr:"↘",seArr:"⇘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",sfr:"𝔰",Sfr:"𝔖",sfrown:"⌢",sharp:"♯",shchcy:"щ",SHCHcy:"Щ",shcy:"ш",SHcy:"Ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"­",sigma:"σ",Sigma:"Σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",softcy:"ь",SOFTcy:"Ь",sol:"/",solb:"⧄",solbar:"⌿",sopf:"𝕤",Sopf:"𝕊",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",squ:"□",square:"□",Square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squf:"▪",srarr:"→",sscr:"𝓈",Sscr:"𝒮",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",star:"☆",Star:"⋆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",sub:"⊂",Sub:"⋐",subdot:"⪽",sube:"⊆",subE:"⫅",subedot:"⫃",submult:"⫁",subne:"⊊",subnE:"⫋",subplus:"⪿",subrarr:"⥹",subset:"⊂",Subset:"⋐",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succ:"≻",succapprox:"⪸",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",sum:"∑",Sum:"∑",sung:"♪",sup:"⊃",Sup:"⋑",sup1:"¹",sup2:"²",sup3:"³",supdot:"⪾",supdsub:"⫘",supe:"⊇",supE:"⫆",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supne:"⊋",supnE:"⫌",supplus:"⫀",supset:"⊃",Supset:"⋑",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swarr:"↙",swArr:"⇙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:"\t",target:"⌖",tau:"τ",Tau:"Τ",tbrk:"⎴",tcaron:"ť",Tcaron:"Ť",tcedil:"ţ",Tcedil:"Ţ",tcy:"т",Tcy:"Т",tdot:"⃛",telrec:"⌕",tfr:"𝔱",Tfr:"𝔗",there4:"∴",therefore:"∴",Therefore:"∴",theta:"θ",Theta:"Θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼",ThickSpace:"  ",thinsp:" ",ThinSpace:" ",thkap:"≈",thksim:"∼",thorn:"þ",THORN:"Þ",tilde:"˜",Tilde:"∼",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",times:"×",timesb:"⊠",timesbar:"⨱",timesd:"⨰",tint:"∭",toea:"⤨",top:"⊤",topbot:"⌶",topcir:"⫱",topf:"𝕥",Topf:"𝕋",topfork:"⫚",tosa:"⤩",tprime:"‴",trade:"™",TRADE:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",tscr:"𝓉",Tscr:"𝒯",tscy:"ц",TScy:"Ц",tshcy:"ћ",TSHcy:"Ћ",tstrok:"ŧ",Tstrok:"Ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",uacute:"ú",Uacute:"Ú",uarr:"↑",uArr:"⇑",Uarr:"↟",Uarrocir:"⥉",ubrcy:"ў",Ubrcy:"Ў",ubreve:"ŭ",Ubreve:"Ŭ",ucirc:"û",Ucirc:"Û",ucy:"у",Ucy:"У",udarr:"⇅",udblac:"ű",Udblac:"Ű",udhar:"⥮",ufisht:"⥾",ufr:"𝔲",Ufr:"𝔘",ugrave:"ù",Ugrave:"Ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",umacr:"ū",Umacr:"Ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",uogon:"ų",Uogon:"Ų",uopf:"𝕦",Uopf:"𝕌",uparrow:"↑",Uparrow:"⇑",UpArrow:"↑",UpArrowBar:"⤒",UpArrowDownArrow:"⇅",updownarrow:"↕",Updownarrow:"⇕",UpDownArrow:"↕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",upsi:"υ",Upsi:"ϒ",upsih:"ϒ",upsilon:"υ",Upsilon:"Υ",UpTee:"⊥",UpTeeArrow:"↥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",uring:"ů",Uring:"Ů",urtri:"◹",uscr:"𝓊",Uscr:"𝒰",utdot:"⋰",utilde:"ũ",Utilde:"Ũ",utri:"▵",utrif:"▴",uuarr:"⇈",uuml:"ü",Uuml:"Ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",varr:"↕",vArr:"⇕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",vBar:"⫨",Vbar:"⫫",vBarv:"⫩",vcy:"в",Vcy:"В",vdash:"⊢",vDash:"⊨",Vdash:"⊩",VDash:"⊫",Vdashl:"⫦",vee:"∨",Vee:"⋁",veebar:"⊻",veeeq:"≚",vellip:"⋮",verbar:"|",Verbar:"‖",vert:"|",Vert:"‖",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",vfr:"𝔳",Vfr:"𝔙",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",vopf:"𝕧",Vopf:"𝕍",vprop:"∝",vrtri:"⊳",vscr:"𝓋",Vscr:"𝒱",vsubne:"⊊︀",vsubnE:"⫋︀",vsupne:"⊋︀",vsupnE:"⫌︀",Vvdash:"⊪",vzigzag:"⦚",wcirc:"ŵ",Wcirc:"Ŵ",wedbar:"⩟",wedge:"∧",Wedge:"⋀",wedgeq:"≙",weierp:"℘",wfr:"𝔴",Wfr:"𝔚",wopf:"𝕨",Wopf:"𝕎",wp:"℘",wr:"≀",wreath:"≀",wscr:"𝓌",Wscr:"𝒲",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",xfr:"𝔵",Xfr:"𝔛",xharr:"⟷",xhArr:"⟺",xi:"ξ",Xi:"Ξ",xlarr:"⟵",xlArr:"⟸",xmap:"⟼",xnis:"⋻",xodot:"⨀",xopf:"𝕩",Xopf:"𝕏",xoplus:"⨁",xotime:"⨂",xrarr:"⟶",xrArr:"⟹",xscr:"𝓍",Xscr:"𝒳",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",yacute:"ý",Yacute:"Ý",yacy:"я",YAcy:"Я",ycirc:"ŷ",Ycirc:"Ŷ",ycy:"ы",Ycy:"Ы",yen:"¥",yfr:"𝔶",Yfr:"𝔜",yicy:"ї",YIcy:"Ї",yopf:"𝕪",Yopf:"𝕐",yscr:"𝓎",Yscr:"𝒴",yucy:"ю",YUcy:"Ю",yuml:"ÿ",Yuml:"Ÿ",zacute:"ź",Zacute:"Ź",zcaron:"ž",Zcaron:"Ž",zcy:"з",Zcy:"З",zdot:"ż",Zdot:"Ż",zeetrf:"ℨ",ZeroWidthSpace:"​",zeta:"ζ",Zeta:"Ζ",zfr:"𝔷",Zfr:"ℨ",zhcy:"ж",ZHcy:"Ж",zigrarr:"⇝",zopf:"𝕫",Zopf:"ℤ",zscr:"𝓏",Zscr:"𝒵",zwj:"‍",zwnj:"‌"},g={aacute:"á",Aacute:"Á",acirc:"â",Acirc:"Â",acute:"´",aelig:"æ",AElig:"Æ",agrave:"à",Agrave:"À",amp:"&",AMP:"&",aring:"å",Aring:"Å",atilde:"ã",Atilde:"Ã",auml:"ä",Auml:"Ä",brvbar:"¦",ccedil:"ç",Ccedil:"Ç",cedil:"¸",cent:"¢",copy:"©",COPY:"©",curren:"¤",deg:"°",divide:"÷",eacute:"é",Eacute:"É",ecirc:"ê",Ecirc:"Ê",egrave:"è",Egrave:"È",eth:"ð",ETH:"Ð",euml:"ë",Euml:"Ë",frac12:"½",frac14:"¼",frac34:"¾",gt:">",GT:">",iacute:"í",Iacute:"Í",icirc:"î",Icirc:"Î",iexcl:"¡",igrave:"ì",Igrave:"Ì",iquest:"¿",iuml:"ï",Iuml:"Ï",laquo:"«",lt:"<",LT:"<",macr:"¯",micro:"µ",middot:"·",nbsp:" ",not:"¬",ntilde:"ñ",Ntilde:"Ñ",oacute:"ó",Oacute:"Ó",ocirc:"ô",Ocirc:"Ô",ograve:"ò",Ograve:"Ò",ordf:"ª",ordm:"º",oslash:"ø",Oslash:"Ø",otilde:"õ",Otilde:"Õ",ouml:"ö",Ouml:"Ö",para:"¶",plusmn:"±",pound:"£",quot:'"',QUOT:'"',raquo:"»",reg:"®",REG:"®",sect:"§",shy:"­",sup1:"¹",sup2:"²",sup3:"³",szlig:"ß",thorn:"þ",THORN:"Þ",times:"×",uacute:"ú",Uacute:"Ú",ucirc:"û",Ucirc:"Û",ugrave:"ù",Ugrave:"Ù",uml:"¨",uuml:"ü",Uuml:"Ü",yacute:"ý",Yacute:"Ý",yen:"¥",yuml:"ÿ"},v={0:"�",128:"€",130:"‚",131:"ƒ",132:"„",133:"…",134:"†",135:"‡",136:"ˆ",137:"‰",138:"Š",139:"‹",140:"Œ",142:"Ž",145:"‘",146:"’",147:"“",148:"”",149:"•",150:"–",151:"—",152:"˜",153:"™",154:"š",155:"›",156:"œ",158:"ž",159:"Ÿ"},b=[1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65e3,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111],M=String.fromCharCode,w={}.hasOwnProperty,k=function(t,e){return w.call(t,e)},L=function(t,e){if(!t)return e;var n,r={};for(n in e)r[n]=k(t,n)?t[n]:e[n];return r},x=function(t,e){var n="";return t>=55296&&t<=57343||t>1114111?(e&&Y("character reference outside the permissible Unicode range"),"�"):k(v,t)?(e&&Y("disallowed character reference"),v[t]):(e&&function(t,e){for(var n=-1,r=t.length;++n65535&&(n+=M((t-=65536)>>>10&1023|55296),t=56320|1023&t),n+=M(t))},D=function(t){return"&#x"+t.toString(16).toUpperCase()+";"},T=function(t){return"&#"+t+";"},Y=function(t){throw Error("Parse error: "+t)},A=function(t,e){(e=L(e,A.options)).strict&&p.test(t)&&Y("forbidden code point");var n=e.encodeEverything,r=e.useNamedReferences,i=e.allowUnsafeSymbols,a=e.decimal?T:D,o=function(t){return a(t.charCodeAt(0))};return n?(t=t.replace(s,function(t){return r&&k(f,t)?"&"+f[t]+";":o(t)}),r&&(t=t.replace(/>\u20D2/g,">⃒").replace(/<\u20D2/g,"<⃒").replace(/fj/g,"fj")),r&&(t=t.replace(l,function(t){return"&"+f[t]+";"}))):r?(i||(t=t.replace(d,function(t){return"&"+f[t]+";"})),t=(t=t.replace(/>\u20D2/g,">⃒").replace(/<\u20D2/g,"<⃒")).replace(l,function(t){return"&"+f[t]+";"})):i||(t=t.replace(d,o)),t.replace(u,function(t){var e=t.charCodeAt(0),n=t.charCodeAt(1);return a(1024*(e-55296)+n-56320+65536)}).replace(c,o)};A.options={allowUnsafeSymbols:!1,encodeEverything:!1,strict:!1,useNamedReferences:!1,decimal:!1};var E=function(t,e){var n=(e=L(e,E.options)).strict;return n&&_.test(t)&&Y("malformed character reference"),t.replace(m,function(t,r,i,a,o,u,s,c,l){var f,d,h,_,p,m;return r?y[p=r]:i?(p=i,(m=a)&&e.isAttributeValue?(n&&"="==m&&Y("`&` did not start a character reference"),t):(n&&Y("named character reference was not terminated by a semicolon"),g[p]+(m||""))):o?(h=o,d=u,n&&!d&&Y("character reference was not terminated by a semicolon"),f=parseInt(h,10),x(f,n)):s?(_=s,d=c,n&&!d&&Y("character reference was not terminated by a semicolon"),f=parseInt(_,16),x(f,n)):(n&&Y("named character reference was not terminated by a semicolon"),t)})};E.options={isAttributeValue:!1,strict:!1};var S={version:"1.2.0",encode:A,decode:E,escape:function(t){return t.replace(d,function(t){return h[t]})},unescape:E};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define(function(){return S});else if(i&&!i.nodeType)if(a)a.exports=S;else for(var j in S)k(S,j)&&(i[j]=S[j]);else r.he=S}(this)}).call(this,n(5)(t),n(10))},function(t,e,n){"use strict";var r=n(150),i=n(151),a=n(152);function o(t,e,n){if(!t)return t;if(!e)return t;"string"==typeof n&&(n={keyframes:n}),n||(n={keyframes:!1}),t=u(t,e+" $1$2");var i=e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");t=(t=(t=(t=t.replace(new RegExp("("+i+")\\s*\\1(?=[\\s\\r\\n,{])","g"),"$1")).replace(new RegExp("("+i+")\\s*:host","g"),"$1")).replace(new RegExp("("+i+")\\s*@","g"),"@")).replace(new RegExp("("+i+")\\s*:root","g"),":root");for(var a,o=[],s=/@keyframes\s+([a-zA-Z0-9_-]+)\s*{/g;null!==(a=s.exec(t));)o.indexOf(a[1])<0&&o.push(a[1]);var c=r(e);return o.forEach(function(e){var r=(!0===n.keyframes?c+"-":"string"==typeof n.keyframes?n.keyframes:"")+e;t=(t=t.replace(new RegExp("(@keyframes\\s+)"+e+"(\\s*{)","g"),"$1"+r+"$2")).replace(new RegExp("(animation(?:-name)?\\s*:[^;]*\\s*)"+e+"([\\s;}])","g"),"$1"+r+"$2")}),t=t.replace(new RegExp("("+i+" )(\\s*(?:to|from|[+-]?(?:(?:\\.\\d+)|(?:\\d+(?:\\.\\d*)?))%))(?=[\\s\\r\\n,{])","g"),"$2")}function u(t,e){var n=[];return t=a(t),t=(t=i.replace(t,!0,n)).replace(/([^\r\n,{}]+)(,(?=[^}]*{)|\s*{)/g,e),t=i.paste(t,n)}t.exports=o,o.replace=u},function(t,e,n){var r;r=function(){var t=JSON.parse('{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","џ":"dz","Ґ":"G","ґ":"g","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","‘":"\'","’":"\'","“":"\\"","”":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₹":"indian rupee","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial"}');function e(e,n){if("string"!=typeof e)throw new Error("slugify: string argument expected");n="string"==typeof n?{replacement:n}:n||{};var r=e.split("").reduce(function(e,r){return e+(t[r]||r).replace(n.remove||/[^\w\s$*_+~.()'"!\-:@]/g,"")},"").trim().replace(/[-\s]+/g,n.replacement||"-");return n.lower?r.toLowerCase():r}return e.extend=function(e){for(var n in e)t[n]=e[n]},e},t.exports=r(),t.exports.default=r()},function(t,e,n){ +/*! + * Escaper v2.5.3 + * https://github.com/kobezzza/Escaper * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Released under the MIT license + * https://github.com/kobezzza/Escaper/blob/master/LICENSE * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. + * Date: Tue, 23 Jan 2018 15:58:45 GMT */ -t.exports={graphlib:n(311),dagre:n(153),intersect:n(368),render:n(370),util:n(12),version:n(382)}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){"use strict";var r=n(4),i=n(17).Graph;function a(t,e,n,i){var a;do{a=r.uniqueId(i)}while(t.hasNode(a));return n.dummy=e,t.setNode(a,n),a}function o(t){return r.max(r.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!r.isUndefined(n))return n})))}t.exports={addDummyNode:a,simplify:function(t){var e=(new i).setGraph(t.graph());return r.forEach(t.nodes(),(function(n){e.setNode(n,t.node(n))})),r.forEach(t.edges(),(function(n){var r=e.edge(n.v,n.w)||{weight:0,minlen:1},i=t.edge(n);e.setEdge(n.v,n.w,{weight:r.weight+i.weight,minlen:Math.max(r.minlen,i.minlen)})})),e},asNonCompoundGraph:function(t){var e=new i({multigraph:t.isMultigraph()}).setGraph(t.graph());return r.forEach(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),r.forEach(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=r.map(t.nodes(),(function(e){var n={};return r.forEach(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return r.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=r.map(t.nodes(),(function(e){var n={};return r.forEach(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return r.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,r,i=t.x,a=t.y,o=e.x-i,s=e.y-a,c=t.width/2,u=t.height/2;if(!o&&!s)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(s)*c>Math.abs(o)*u?(s<0&&(u=-u),n=u*o/s,r=u):(o<0&&(c=-c),n=c,r=c*s/o);return{x:i+n,y:a+r}},buildLayerMatrix:function(t){var e=r.map(r.range(o(t)+1),(function(){return[]}));return r.forEach(t.nodes(),(function(n){var i=t.node(n),a=i.rank;r.isUndefined(a)||(e[a][i.order]=n)})),e},normalizeRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank})));r.forEach(t.nodes(),(function(n){var i=t.node(n);r.has(i,"rank")&&(i.rank-=e)}))},removeEmptyRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];r.forEach(t.nodes(),(function(r){var i=t.node(r).rank-e;n[i]||(n[i]=[]),n[i].push(r)}));var i=0,a=t.graph().nodeRankFactor;r.forEach(n,(function(e,n){r.isUndefined(e)&&n%a!=0?--i:i&&r.forEach(e,(function(e){t.node(e).rank+=i}))}))},addBorderNode:function(t,e,n,r){var i={width:0,height:0};arguments.length>=4&&(i.rank=n,i.order=r);return a(t,"border",i,e)},maxRank:o,partition:function(t,e){var n={lhs:[],rhs:[]};return r.forEach(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=r.now();try{return e()}finally{console.log(t+" time: "+(r.now()-n)+"ms")}},notime:function(t,e){return e()}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(173),i=n(174),a=n(175),o={channel:r.default,lang:i.default,unit:a.default};e.default=o},function(t,e,n){var r;try{r={clone:n(199),constant:n(86),each:n(87),filter:n(128),has:n(93),isArray:n(5),isEmpty:n(276),isFunction:n(37),isUndefined:n(139),keys:n(30),map:n(140),reduce:n(142),size:n(279),transform:n(285),union:n(286),values:n(147)}}catch(t){}r||(r=window._),t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(43);t.exports={isSubgraph:function(t,e){return!!t.children(e).length},edgeToId:function(t){return a(t.v)+":"+a(t.w)+":"+a(t.name)},applyStyle:function(t,e){e&&t.attr("style",e)},applyClass:function(t,e,n){e&&t.attr("class",e).attr("class",n+" "+t.attr("class"))},applyTransition:function(t,e){var n=e.graph();if(r.isPlainObject(n)){var i=n.transition;if(r.isFunction(i))return i(t)}return t}};var i=/:/g;function a(t){return t?String(t).replace(i,"\\:"):""}},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,7],n=[1,6],r=[1,14],i=[1,25],a=[1,28],o=[1,26],s=[1,27],c=[1,29],u=[1,30],l=[1,31],h=[1,32],f=[1,34],d=[1,35],p=[1,36],y=[10,19],g=[1,48],v=[1,49],m=[1,50],b=[1,51],x=[1,52],_=[1,53],k=[10,19,25,32,33,41,44,45,46,47,48,49,54,56],w=[10,19,23,25,32,33,37,41,44,45,46,47,48,49,54,56,71,72,73],E=[10,13,17,19],T=[41,71,72,73],C=[41,48,49,71,72,73],A=[41,44,45,46,47,71,72,73],S=[10,19,25],M=[1,85],O={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,directive:5,graphConfig:6,openDirective:7,typeDirective:8,closeDirective:9,NEWLINE:10,":":11,argDirective:12,open_directive:13,type_directive:14,arg_directive:15,close_directive:16,CLASS_DIAGRAM:17,statements:18,EOF:19,statement:20,className:21,alphaNumToken:22,GENERICTYPE:23,relationStatement:24,LABEL:25,classStatement:26,methodStatement:27,annotationStatement:28,clickStatement:29,cssClassStatement:30,CLASS:31,STYLE_SEPARATOR:32,STRUCT_START:33,members:34,STRUCT_STOP:35,ANNOTATION_START:36,ANNOTATION_END:37,MEMBER:38,SEPARATOR:39,relation:40,STR:41,relationType:42,lineType:43,AGGREGATION:44,EXTENSION:45,COMPOSITION:46,DEPENDENCY:47,LINE:48,DOTTED_LINE:49,CALLBACK:50,LINK:51,LINK_TARGET:52,CLICK:53,CALLBACK_NAME:54,CALLBACK_ARGS:55,HREF:56,CSSCLASS:57,commentToken:58,textToken:59,graphCodeTokens:60,textNoTagsToken:61,TAGSTART:62,TAGEND:63,"==":64,"--":65,PCT:66,DEFAULT:67,SPACE:68,MINUS:69,keywords:70,UNICODE_TEXT:71,NUM:72,ALPHA:73,$accept:0,$end:1},terminals_:{2:"error",10:"NEWLINE",11:":",13:"open_directive",14:"type_directive",15:"arg_directive",16:"close_directive",17:"CLASS_DIAGRAM",19:"EOF",23:"GENERICTYPE",25:"LABEL",31:"CLASS",32:"STYLE_SEPARATOR",33:"STRUCT_START",35:"STRUCT_STOP",36:"ANNOTATION_START",37:"ANNOTATION_END",38:"MEMBER",39:"SEPARATOR",41:"STR",44:"AGGREGATION",45:"EXTENSION",46:"COMPOSITION",47:"DEPENDENCY",48:"LINE",49:"DOTTED_LINE",50:"CALLBACK",51:"LINK",52:"LINK_TARGET",53:"CLICK",54:"CALLBACK_NAME",55:"CALLBACK_ARGS",56:"HREF",57:"CSSCLASS",60:"graphCodeTokens",62:"TAGSTART",63:"TAGEND",64:"==",65:"--",66:"PCT",67:"DEFAULT",68:"SPACE",69:"MINUS",70:"keywords",71:"UNICODE_TEXT",72:"NUM",73:"ALPHA"},productions_:[0,[3,1],[3,2],[4,1],[5,4],[5,6],[7,1],[8,1],[12,1],[9,1],[6,4],[18,1],[18,2],[18,3],[21,1],[21,2],[21,3],[21,2],[20,1],[20,2],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[26,2],[26,4],[26,5],[26,7],[28,4],[34,1],[34,2],[27,1],[27,2],[27,1],[27,1],[24,3],[24,4],[24,4],[24,5],[40,3],[40,2],[40,2],[40,1],[42,1],[42,1],[42,1],[42,1],[43,1],[43,1],[29,3],[29,4],[29,3],[29,4],[29,4],[29,5],[29,3],[29,4],[29,4],[29,5],[29,3],[29,4],[29,4],[29,5],[30,3],[58,1],[58,1],[59,1],[59,1],[59,1],[59,1],[59,1],[59,1],[59,1],[61,1],[61,1],[61,1],[61,1],[22,1],[22,1],[22,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 6:r.parseDirective("%%{","open_directive");break;case 7:r.parseDirective(a[s],"type_directive");break;case 8:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 9:r.parseDirective("}%%","close_directive","class");break;case 14:this.$=a[s];break;case 15:this.$=a[s-1]+a[s];break;case 16:this.$=a[s-2]+"~"+a[s-1]+a[s];break;case 17:this.$=a[s-1]+"~"+a[s];break;case 18:r.addRelation(a[s]);break;case 19:a[s-1].title=r.cleanupLabel(a[s]),r.addRelation(a[s-1]);break;case 26:r.addClass(a[s]);break;case 27:r.addClass(a[s-2]),r.setCssClass(a[s-2],a[s]);break;case 28:r.addClass(a[s-3]),r.addMembers(a[s-3],a[s-1]);break;case 29:r.addClass(a[s-5]),r.setCssClass(a[s-5],a[s-3]),r.addMembers(a[s-5],a[s-1]);break;case 30:r.addAnnotation(a[s],a[s-2]);break;case 31:this.$=[a[s]];break;case 32:a[s].push(a[s-1]),this.$=a[s];break;case 33:break;case 34:r.addMember(a[s-1],r.cleanupLabel(a[s]));break;case 35:case 36:break;case 37:this.$={id1:a[s-2],id2:a[s],relation:a[s-1],relationTitle1:"none",relationTitle2:"none"};break;case 38:this.$={id1:a[s-3],id2:a[s],relation:a[s-1],relationTitle1:a[s-2],relationTitle2:"none"};break;case 39:this.$={id1:a[s-3],id2:a[s],relation:a[s-2],relationTitle1:"none",relationTitle2:a[s-1]};break;case 40:this.$={id1:a[s-4],id2:a[s],relation:a[s-2],relationTitle1:a[s-3],relationTitle2:a[s-1]};break;case 41:this.$={type1:a[s-2],type2:a[s],lineType:a[s-1]};break;case 42:this.$={type1:"none",type2:a[s],lineType:a[s-1]};break;case 43:this.$={type1:a[s-1],type2:"none",lineType:a[s]};break;case 44:this.$={type1:"none",type2:"none",lineType:a[s]};break;case 45:this.$=r.relationType.AGGREGATION;break;case 46:this.$=r.relationType.EXTENSION;break;case 47:this.$=r.relationType.COMPOSITION;break;case 48:this.$=r.relationType.DEPENDENCY;break;case 49:this.$=r.lineType.LINE;break;case 50:this.$=r.lineType.DOTTED_LINE;break;case 51:case 57:this.$=a[s-2],r.setClickEvent(a[s-1],a[s]);break;case 52:case 58:this.$=a[s-3],r.setClickEvent(a[s-2],a[s-1]),r.setTooltip(a[s-2],a[s]);break;case 53:case 61:this.$=a[s-2],r.setLink(a[s-1],a[s]);break;case 54:this.$=a[s-3],r.setLink(a[s-2],a[s-1],a[s]);break;case 55:case 63:this.$=a[s-3],r.setLink(a[s-2],a[s-1]),r.setTooltip(a[s-2],a[s]);break;case 56:case 64:this.$=a[s-4],r.setLink(a[s-3],a[s-2],a[s]),r.setTooltip(a[s-3],a[s-1]);break;case 59:this.$=a[s-3],r.setClickEvent(a[s-2],a[s-1],a[s]);break;case 60:this.$=a[s-4],r.setClickEvent(a[s-3],a[s-2],a[s-1]),r.setTooltip(a[s-3],a[s]);break;case 62:this.$=a[s-3],r.setLink(a[s-2],a[s-1],a[s]);break;case 65:r.setCssClass(a[s-1],a[s])}},table:[{3:1,4:2,5:3,6:4,7:5,13:e,17:n},{1:[3]},{1:[2,1]},{3:8,4:2,5:3,6:4,7:5,13:e,17:n},{1:[2,3]},{8:9,14:[1,10]},{10:[1,11]},{14:[2,6]},{1:[2,2]},{9:12,11:[1,13],16:r},t([11,16],[2,7]),{5:23,7:5,13:e,18:15,20:16,21:24,22:33,24:17,26:18,27:19,28:20,29:21,30:22,31:i,36:a,38:o,39:s,50:c,51:u,53:l,57:h,71:f,72:d,73:p},{10:[1,37]},{12:38,15:[1,39]},{10:[2,9]},{19:[1,40]},{10:[1,41],19:[2,11]},t(y,[2,18],{25:[1,42]}),t(y,[2,20]),t(y,[2,21]),t(y,[2,22]),t(y,[2,23]),t(y,[2,24]),t(y,[2,25]),t(y,[2,33],{40:43,42:46,43:47,25:[1,45],41:[1,44],44:g,45:v,46:m,47:b,48:x,49:_}),{21:54,22:33,71:f,72:d,73:p},t(y,[2,35]),t(y,[2,36]),{22:55,71:f,72:d,73:p},{21:56,22:33,71:f,72:d,73:p},{21:57,22:33,71:f,72:d,73:p},{21:58,22:33,71:f,72:d,73:p},{41:[1,59]},t(k,[2,14],{22:33,21:60,23:[1,61],71:f,72:d,73:p}),t(w,[2,79]),t(w,[2,80]),t(w,[2,81]),t(E,[2,4]),{9:62,16:r},{16:[2,8]},{1:[2,10]},{5:23,7:5,13:e,18:63,19:[2,12],20:16,21:24,22:33,24:17,26:18,27:19,28:20,29:21,30:22,31:i,36:a,38:o,39:s,50:c,51:u,53:l,57:h,71:f,72:d,73:p},t(y,[2,19]),{21:64,22:33,41:[1,65],71:f,72:d,73:p},{40:66,42:46,43:47,44:g,45:v,46:m,47:b,48:x,49:_},t(y,[2,34]),{43:67,48:x,49:_},t(T,[2,44],{42:68,44:g,45:v,46:m,47:b}),t(C,[2,45]),t(C,[2,46]),t(C,[2,47]),t(C,[2,48]),t(A,[2,49]),t(A,[2,50]),t(y,[2,26],{32:[1,69],33:[1,70]}),{37:[1,71]},{41:[1,72]},{41:[1,73]},{54:[1,74],56:[1,75]},{22:76,71:f,72:d,73:p},t(k,[2,15]),t(k,[2,17],{22:33,21:77,71:f,72:d,73:p}),{10:[1,78]},{19:[2,13]},t(S,[2,37]),{21:79,22:33,71:f,72:d,73:p},{21:80,22:33,41:[1,81],71:f,72:d,73:p},t(T,[2,43],{42:82,44:g,45:v,46:m,47:b}),t(T,[2,42]),{22:83,71:f,72:d,73:p},{34:84,38:M},{21:86,22:33,71:f,72:d,73:p},t(y,[2,51],{41:[1,87]}),t(y,[2,53],{41:[1,89],52:[1,88]}),t(y,[2,57],{41:[1,90],55:[1,91]}),t(y,[2,61],{41:[1,93],52:[1,92]}),t(y,[2,65]),t(k,[2,16]),t(E,[2,5]),t(S,[2,39]),t(S,[2,38]),{21:94,22:33,71:f,72:d,73:p},t(T,[2,41]),t(y,[2,27],{33:[1,95]}),{35:[1,96]},{34:97,35:[2,31],38:M},t(y,[2,30]),t(y,[2,52]),t(y,[2,54]),t(y,[2,55],{52:[1,98]}),t(y,[2,58]),t(y,[2,59],{41:[1,99]}),t(y,[2,62]),t(y,[2,63],{52:[1,100]}),t(S,[2,40]),{34:101,38:M},t(y,[2,28]),{35:[2,32]},t(y,[2,56]),t(y,[2,60]),t(y,[2,64]),{35:[1,102]},t(y,[2,29])],defaultActions:{2:[2,1],4:[2,3],7:[2,6],8:[2,2],14:[2,9],39:[2,8],40:[2,10],63:[2,13],97:[2,32]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},D={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),13;case 1:return this.begin("type_directive"),14;case 2:return this.popState(),this.begin("arg_directive"),11;case 3:return this.popState(),this.popState(),16;case 4:return 15;case 5:case 6:break;case 7:return 10;case 8:break;case 9:case 10:return 17;case 11:return this.begin("struct"),33;case 12:return"EOF_IN_STRUCT";case 13:return"OPEN_IN_STRUCT";case 14:return this.popState(),35;case 15:break;case 16:return"MEMBER";case 17:return 31;case 18:return 57;case 19:return 50;case 20:return 51;case 21:return 53;case 22:return 36;case 23:return 37;case 24:this.begin("generic");break;case 25:this.popState();break;case 26:return"GENERICTYPE";case 27:this.begin("string");break;case 28:this.popState();break;case 29:return"STR";case 30:this.begin("href");break;case 31:this.popState();break;case 32:return 56;case 33:this.begin("callback_name");break;case 34:this.popState();break;case 35:this.popState(),this.begin("callback_args");break;case 36:return 54;case 37:this.popState();break;case 38:return 55;case 39:case 40:case 41:case 42:return 52;case 43:case 44:return 45;case 45:case 46:return 47;case 47:return 46;case 48:return 44;case 49:return 48;case 50:return 49;case 51:return 25;case 52:return 32;case 53:return 69;case 54:return"DOT";case 55:return"PLUS";case 56:return 66;case 57:case 58:return"EQUALS";case 59:return 73;case 60:return"PUNCTUATION";case 61:return 72;case 62:return 71;case 63:return 68;case 64:return 19}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callback_args:{rules:[37,38],inclusive:!1},callback_name:{rules:[34,35,36],inclusive:!1},href:{rules:[31,32],inclusive:!1},struct:{rules:[12,13,14,15,16],inclusive:!1},generic:{rules:[25,26],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,17,18,19,20,21,22,23,24,27,30,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],inclusive:!0}}};function N(){this.yy={}}return O.lexer=D,N.prototype=O,O.Parser=N,new N}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e){var n,r,i=t.exports={};function a(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function s(t){if(n===setTimeout)return setTimeout(t,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:a}catch(t){n=a}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(t){r=o}}();var c,u=[],l=!1,h=-1;function f(){l&&c&&(l=!1,c.length?u=c.concat(u):h=-1,u.length&&d())}function d(){if(!l){var t=s(f);l=!0;for(var e=u.length;e;){for(c=u,u=[];++h1)for(var n=1;n=0;r--){var i=t[r];"."===i?t.splice(r,1):".."===i?(t.splice(r,1),n++):n&&(t.splice(r,1),n--)}if(e)for(;n--;n)t.unshift("..");return t}function r(t,e){if(t.filter)return t.filter(e);for(var n=[],r=0;r=-1&&!i;a--){var o=a>=0?arguments[a]:t.cwd();if("string"!=typeof o)throw new TypeError("Arguments to path.resolve must be strings");o&&(e=o+"/"+e,i="/"===o.charAt(0))}return(i?"/":"")+(e=n(r(e.split("/"),(function(t){return!!t})),!i).join("/"))||"."},e.normalize=function(t){var a=e.isAbsolute(t),o="/"===i(t,-1);return(t=n(r(t.split("/"),(function(t){return!!t})),!a).join("/"))||a||(t="."),t&&o&&(t+="/"),(a?"/":"")+t},e.isAbsolute=function(t){return"/"===t.charAt(0)},e.join=function(){var t=Array.prototype.slice.call(arguments,0);return e.normalize(r(t,(function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t})).join("/"))},e.relative=function(t,n){function r(t){for(var e=0;e=0&&""===t[n];n--);return e>n?[]:t.slice(e,n-e+1)}t=e.resolve(t).substr(1),n=e.resolve(n).substr(1);for(var i=r(t.split("/")),a=r(n.split("/")),o=Math.min(i.length,a.length),s=o,c=0;c=1;--a)if(47===(e=t.charCodeAt(a))){if(!i){r=a;break}}else i=!1;return-1===r?n?"/":".":n&&1===r?"/":t.slice(0,r)},e.basename=function(t,e){var n=function(t){"string"!=typeof t&&(t+="");var e,n=0,r=-1,i=!0;for(e=t.length-1;e>=0;--e)if(47===t.charCodeAt(e)){if(!i){n=e+1;break}}else-1===r&&(i=!1,r=e+1);return-1===r?"":t.slice(n,r)}(t);return e&&n.substr(-1*e.length)===e&&(n=n.substr(0,n.length-e.length)),n},e.extname=function(t){"string"!=typeof t&&(t+="");for(var e=-1,n=0,r=-1,i=!0,a=0,o=t.length-1;o>=0;--o){var s=t.charCodeAt(o);if(47!==s)-1===r&&(i=!1,r=o+1),46===s?-1===e?e=o:1!==a&&(a=1):-1!==e&&(a=-1);else if(!i){n=o+1;break}}return-1===e||-1===r||0===a||1===a&&e===r-1&&e===n+1?"":t.slice(e,r)};var i="b"==="ab".substr(-1)?function(t,e,n){return t.substr(e,n)}:function(t,e,n){return e<0&&(e=t.length+e),t.substr(e,n)}}).call(this,n(14))},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,3],r=[1,5],i=[1,7],a=[2,5],o=[1,15],s=[1,17],c=[1,19],u=[1,20],l=[1,21],h=[1,22],f=[1,28],d=[1,23],p=[1,24],y=[1,25],g=[1,26],v=[1,29],m=[1,32],b=[1,4,5,14,15,17,19,20,22,23,24,25,26,36,39],x=[1,4,5,12,13,14,15,17,19,20,22,23,24,25,26,36,39],_=[1,4,5,7,14,15,17,19,20,22,23,24,25,26,36,39],k=[4,5,14,15,17,19,20,22,23,24,25,26,36,39],w={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,directive:6,SD:7,document:8,line:9,statement:10,idStatement:11,DESCR:12,"--\x3e":13,HIDE_EMPTY:14,scale:15,WIDTH:16,COMPOSIT_STATE:17,STRUCT_START:18,STRUCT_STOP:19,STATE_DESCR:20,AS:21,ID:22,FORK:23,JOIN:24,CONCURRENT:25,note:26,notePosition:27,NOTE_TEXT:28,openDirective:29,typeDirective:30,closeDirective:31,":":32,argDirective:33,eol:34,";":35,EDGE_STATE:36,left_of:37,right_of:38,open_directive:39,type_directive:40,arg_directive:41,close_directive:42,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",7:"SD",12:"DESCR",13:"--\x3e",14:"HIDE_EMPTY",15:"scale",16:"WIDTH",17:"COMPOSIT_STATE",18:"STRUCT_START",19:"STRUCT_STOP",20:"STATE_DESCR",21:"AS",22:"ID",23:"FORK",24:"JOIN",25:"CONCURRENT",26:"note",28:"NOTE_TEXT",32:":",35:";",36:"EDGE_STATE",37:"left_of",38:"right_of",39:"open_directive",40:"type_directive",41:"arg_directive",42:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[6,3],[6,5],[34,1],[34,1],[11,1],[11,1],[27,1],[27,1],[29,1],[30,1],[33,1],[31,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 4:return r.setRootDoc(a[s]),a[s];case 5:this.$=[];break;case 6:"nl"!=a[s]&&(a[s-1].push(a[s]),this.$=a[s-1]);break;case 7:case 8:this.$=a[s];break;case 9:this.$="nl";break;case 10:this.$={stmt:"state",id:a[s],type:"default",description:""};break;case 11:this.$={stmt:"state",id:a[s-1],type:"default",description:r.trimColon(a[s])};break;case 12:this.$={stmt:"relation",state1:{stmt:"state",id:a[s-2],type:"default",description:""},state2:{stmt:"state",id:a[s],type:"default",description:""}};break;case 13:this.$={stmt:"relation",state1:{stmt:"state",id:a[s-3],type:"default",description:""},state2:{stmt:"state",id:a[s-1],type:"default",description:""},description:a[s].substr(1).trim()};break;case 17:this.$={stmt:"state",id:a[s-3],type:"default",description:"",doc:a[s-1]};break;case 18:var c=a[s],u=a[s-2].trim();if(a[s].match(":")){var l=a[s].split(":");c=l[0],u=[u,l[1]]}this.$={stmt:"state",id:c,type:"default",description:u};break;case 19:this.$={stmt:"state",id:a[s-3],type:"default",description:a[s-5],doc:a[s-1]};break;case 20:this.$={stmt:"state",id:a[s],type:"fork"};break;case 21:this.$={stmt:"state",id:a[s],type:"join"};break;case 22:this.$={stmt:"state",id:r.getDividerId(),type:"divider"};break;case 23:this.$={stmt:"state",id:a[s-1].trim(),note:{position:a[s-2].trim(),text:a[s].trim()}};break;case 30:case 31:this.$=a[s];break;case 34:r.parseDirective("%%{","open_directive");break;case 35:r.parseDirective(a[s],"type_directive");break;case 36:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 37:r.parseDirective("}%%","close_directive","state")}},table:[{3:1,4:e,5:n,6:4,7:r,29:6,39:i},{1:[3]},{3:8,4:e,5:n,6:4,7:r,29:6,39:i},{3:9,4:e,5:n,6:4,7:r,29:6,39:i},{3:10,4:e,5:n,6:4,7:r,29:6,39:i},t([1,4,5,14,15,17,20,22,23,24,25,26,36,39],a,{8:11}),{30:12,40:[1,13]},{40:[2,34]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:s,6:27,9:14,10:16,11:18,14:c,15:u,17:l,20:h,22:f,23:d,24:p,25:y,26:g,29:6,36:v,39:i},{31:30,32:[1,31],42:m},t([32,42],[2,35]),t(b,[2,6]),{6:27,10:33,11:18,14:c,15:u,17:l,20:h,22:f,23:d,24:p,25:y,26:g,29:6,36:v,39:i},t(b,[2,8]),t(b,[2,9]),t(b,[2,10],{12:[1,34],13:[1,35]}),t(b,[2,14]),{16:[1,36]},t(b,[2,16],{18:[1,37]}),{21:[1,38]},t(b,[2,20]),t(b,[2,21]),t(b,[2,22]),{27:39,28:[1,40],37:[1,41],38:[1,42]},t(b,[2,25]),t(x,[2,30]),t(x,[2,31]),t(_,[2,26]),{33:43,41:[1,44]},t(_,[2,37]),t(b,[2,7]),t(b,[2,11]),{11:45,22:f,36:v},t(b,[2,15]),t(k,a,{8:46}),{22:[1,47]},{22:[1,48]},{21:[1,49]},{22:[2,32]},{22:[2,33]},{31:50,42:m},{42:[2,36]},t(b,[2,12],{12:[1,51]}),{4:o,5:s,6:27,9:14,10:16,11:18,14:c,15:u,17:l,19:[1,52],20:h,22:f,23:d,24:p,25:y,26:g,29:6,36:v,39:i},t(b,[2,18],{18:[1,53]}),{28:[1,54]},{22:[1,55]},t(_,[2,27]),t(b,[2,13]),t(b,[2,17]),t(k,a,{8:56}),t(b,[2,23]),t(b,[2,24]),{4:o,5:s,6:27,9:14,10:16,11:18,14:c,15:u,17:l,19:[1,57],20:h,22:f,23:d,24:p,25:y,26:g,29:6,36:v,39:i},t(b,[2,19])],defaultActions:{7:[2,34],8:[2,1],9:[2,2],10:[2,3],41:[2,32],42:[2,33],44:[2,36]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},E={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),39;case 1:return this.begin("type_directive"),40;case 2:return this.popState(),this.begin("arg_directive"),32;case 3:return this.popState(),this.popState(),42;case 4:return 41;case 5:break;case 6:console.log("Crap after close");break;case 7:return 5;case 8:case 9:case 10:case 11:break;case 12:return this.pushState("SCALE"),15;case 13:return 16;case 14:this.popState();break;case 15:this.pushState("STATE");break;case 16:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),23;case 17:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),24;case 18:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),23;case 19:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),24;case 20:this.begin("STATE_STRING");break;case 21:return this.popState(),this.pushState("STATE_ID"),"AS";case 22:return this.popState(),"ID";case 23:this.popState();break;case 24:return"STATE_DESCR";case 25:return 17;case 26:this.popState();break;case 27:return this.popState(),this.pushState("struct"),18;case 28:return this.popState(),19;case 29:break;case 30:return this.begin("NOTE"),26;case 31:return this.popState(),this.pushState("NOTE_ID"),37;case 32:return this.popState(),this.pushState("NOTE_ID"),38;case 33:this.popState(),this.pushState("FLOATING_NOTE");break;case 34:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 35:break;case 36:return"NOTE_TEXT";case 37:return this.popState(),"ID";case 38:return this.popState(),this.pushState("NOTE_TEXT"),22;case 39:return this.popState(),e.yytext=e.yytext.substr(2).trim(),28;case 40:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),28;case 41:case 42:return 7;case 43:return 14;case 44:return 36;case 45:return 22;case 46:return e.yytext=e.yytext.trim(),12;case 47:return 13;case 48:return 25;case 49:return 5;case 50:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[9,10],inclusive:!1},close_directive:{rules:[9,10],inclusive:!1},arg_directive:{rules:[3,4,9,10],inclusive:!1},type_directive:{rules:[2,3,9,10],inclusive:!1},open_directive:{rules:[1,9,10],inclusive:!1},struct:{rules:[9,10,15,28,29,30,44,45,46,47,48],inclusive:!1},FLOATING_NOTE_ID:{rules:[37],inclusive:!1},FLOATING_NOTE:{rules:[34,35,36],inclusive:!1},NOTE_TEXT:{rules:[39,40],inclusive:!1},NOTE_ID:{rules:[38],inclusive:!1},NOTE:{rules:[31,32,33],inclusive:!1},SCALE:{rules:[13,14],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[22],inclusive:!1},STATE_STRING:{rules:[23,24],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[9,10,16,17,18,19,20,21,25,26,27],inclusive:!1},ID:{rules:[9,10],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,10,11,12,15,27,30,41,42,43,44,45,46,47,49,50],inclusive:!0}}};function T(){this.yy={}}return w.lexer=E,T.prototype=w,w.Parser=T,new T}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){(function(t){t.exports=function(){"use strict";var e,r;function i(){return e.apply(null,arguments)}function a(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function c(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function u(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function l(t,e){var n,r=[];for(n=0;n>>0,r=0;rgt(t)?(a=t+1,s-gt(t)):(a=t,s),{year:a,dayOfYear:o}}function Pt(t,e,n){var r,i,a=Bt(t.year(),e,n),o=Math.floor((t.dayOfYear()-a-1)/7)+1;return o<1?r=o+It(i=t.year()-1,e,n):o>It(t.year(),e,n)?(r=o-It(t.year(),e,n),i=t.year()+1):(i=t.year(),r=o),{week:r,year:i}}function It(t,e,n){var r=Bt(t,e,n),i=Bt(t+1,e,n);return(gt(t)-r+i)/7}function Ft(t,e){return t.slice(e,7).concat(t.slice(0,e))}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),j("week",5),j("isoWeek",5),lt("w",K),lt("ww",K,q),lt("W",K),lt("WW",K,q),yt(["w","ww","W","WW"],(function(t,e,n,r){e[r.substr(0,1)]=w(t)})),W("d",0,"do","day"),W("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),W("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),W("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),j("day",11),j("weekday",11),j("isoWeekday",11),lt("d",K),lt("e",K),lt("E",K),lt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),lt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),lt("dddd",(function(t,e){return e.weekdaysRegex(t)})),yt(["dd","ddd","dddd"],(function(t,e,n,r){var i=n._locale.weekdaysParse(t,r,n._strict);null!=i?e.d=i:p(n).invalidWeekday=t})),yt(["d","e","E"],(function(t,e,n,r){e[r]=w(t)}));var jt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Rt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Yt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),zt=ct,Ut=ct,$t=ct;function Wt(){function t(t,e){return e.length-t.length}var e,n,r,i,a,o=[],s=[],c=[],u=[];for(e=0;e<7;e++)n=d([2e3,1]).day(e),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),a=this.weekdays(n,""),o.push(r),s.push(i),c.push(a),u.push(r),u.push(i),u.push(a);for(o.sort(t),s.sort(t),c.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ft(s[e]),c[e]=ft(c[e]),u[e]=ft(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+c.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function Ht(){return this.hours()%12||12}function Vt(t,e){W(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function Gt(t,e){return e._meridiemParse}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,Ht),W("k",["kk",2],0,(function(){return this.hours()||24})),W("hmm",0,0,(function(){return""+Ht.apply(this)+R(this.minutes(),2)})),W("hmmss",0,0,(function(){return""+Ht.apply(this)+R(this.minutes(),2)+R(this.seconds(),2)})),W("Hmm",0,0,(function(){return""+this.hours()+R(this.minutes(),2)})),W("Hmmss",0,0,(function(){return""+this.hours()+R(this.minutes(),2)+R(this.seconds(),2)})),Vt("a",!0),Vt("A",!1),L("hour","h"),j("hour",13),lt("a",Gt),lt("A",Gt),lt("H",K),lt("h",K),lt("k",K),lt("HH",K,q),lt("hh",K,q),lt("kk",K,q),lt("hmm",Q),lt("hmmss",tt),lt("Hmm",Q),lt("Hmmss",tt),pt(["H","HH"],3),pt(["k","kk"],(function(t,e,n){var r=w(t);e[3]=24===r?0:r})),pt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),pt(["h","hh"],(function(t,e,n){e[3]=w(t),p(n).bigHour=!0})),pt("hmm",(function(t,e,n){var r=t.length-2;e[3]=w(t.substr(0,r)),e[4]=w(t.substr(r)),p(n).bigHour=!0})),pt("hmmss",(function(t,e,n){var r=t.length-4,i=t.length-2;e[3]=w(t.substr(0,r)),e[4]=w(t.substr(r,2)),e[5]=w(t.substr(i)),p(n).bigHour=!0})),pt("Hmm",(function(t,e,n){var r=t.length-2;e[3]=w(t.substr(0,r)),e[4]=w(t.substr(r))})),pt("Hmmss",(function(t,e,n){var r=t.length-4,i=t.length-2;e[3]=w(t.substr(0,r)),e[4]=w(t.substr(r,2)),e[5]=w(t.substr(i))}));var qt,Xt=xt("Hours",!0),Zt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Tt,monthsShort:Ct,week:{dow:0,doy:6},weekdays:jt,weekdaysMin:Yt,weekdaysShort:Rt,meridiemParse:/[ap]\.?m?\.?/i},Jt={},Kt={};function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function te(e){var r=null;if(!Jt[e]&&void 0!==t&&t&&t.exports)try{r=qt._abbr,n(171)("./"+e),ee(r)}catch(e){}return Jt[e]}function ee(t,e){var n;return t&&((n=s(e)?re(t):ne(t,e))?qt=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),qt._abbr}function ne(t,e){if(null===e)return delete Jt[t],null;var n,r=Zt;if(e.abbr=t,null!=Jt[t])M("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=Jt[t]._config;else if(null!=e.parentLocale)if(null!=Jt[e.parentLocale])r=Jt[e.parentLocale]._config;else{if(null==(n=te(e.parentLocale)))return Kt[e.parentLocale]||(Kt[e.parentLocale]=[]),Kt[e.parentLocale].push({name:t,config:e}),null;r=n._config}return Jt[t]=new N(D(r,e)),Kt[t]&&Kt[t].forEach((function(t){ne(t.name,t.config)})),ee(t),Jt[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return qt;if(!a(t)){if(e=te(t))return e;t=[t]}return function(t){for(var e,n,r,i,a=0;a=e&&E(i,n,!0)>=e-1)break;e--}a++}return qt}(t)}function ie(t){var e,n=t._a;return n&&-2===p(t).overflow&&(e=n[1]<0||11wt(n[0],n[1])?2:n[3]<0||24It(n,a,o)?p(t)._overflowWeeks=!0:null!=c?p(t)._overflowWeekday=!0:(s=Lt(n,r,i,a,o),t._a[0]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=ae(t._a[0],r[0]),(t._dayOfYear>gt(o)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),n=Nt(o,0,t._dayOfYear),t._a[1]=n.getUTCMonth(),t._a[2]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=r[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[3]&&0===t._a[4]&&0===t._a[5]&&0===t._a[6]&&(t._nextDay=!0,t._a[3]=0),t._d=(t._useUTC?Nt:function(t,e,n,r,i,a,o){var s;return t<100&&0<=t?(s=new Date(t+400,e,n,r,i,a,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,n,r,i,a,o),s}).apply(null,s),a=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[3]=24),t._w&&void 0!==t._w.d&&t._w.d!==a&&(p(t).weekdayMismatch=!0)}}var se=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ce=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ue=/Z|[+-]\d\d(?::?\d\d)?/,le=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],he=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],fe=/^\/?Date\((\-?\d+)/i;function de(t){var e,n,r,i,a,o,s=t._i,c=se.exec(s)||ce.exec(s);if(c){for(p(t).iso=!0,e=0,n=le.length;en.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},on.isLocal=function(){return!!this.isValid()&&!this._isUTC},on.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},on.isUtc=Be,on.isUTC=Be,on.zoneAbbr=function(){return this._isUTC?"UTC":""},on.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},on.dates=C("dates accessor is deprecated. Use date instead.",Qe),on.months=C("months accessor is deprecated. Use month instead",St),on.years=C("years accessor is deprecated. Use year instead",bt),on.zone=C("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),on.isDSTShifted=C("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(m(t,this),(t=me(t))._a){var e=t._isUTC?d(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&0h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},qt={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),12;case 1:return this.begin("type_directive"),13;case 2:return this.popState(),this.begin("arg_directive"),10;case 3:return this.popState(),this.popState(),15;case 4:return 14;case 5:case 6:break;case 7:this.begin("string");break;case 8:this.popState();break;case 9:return"STR";case 10:return 75;case 11:return 84;case 12:return 76;case 13:return 93;case 14:return 77;case 15:return 78;case 16:this.begin("href");break;case 17:this.popState();break;case 18:return 89;case 19:this.begin("callbackname");break;case 20:this.popState();break;case 21:this.popState(),this.begin("callbackargs");break;case 22:return 87;case 23:this.popState();break;case 24:return 88;case 25:this.begin("click");break;case 26:this.popState();break;case 27:return 79;case 28:case 29:return t.lex.firstGraph()&&this.begin("dir"),24;case 30:return 38;case 31:return 42;case 32:case 33:case 34:case 35:return 90;case 36:return this.popState(),25;case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:return this.popState(),26;case 47:return 94;case 48:return 102;case 49:return 47;case 50:return 99;case 51:return 46;case 52:return 20;case 53:return 95;case 54:return 113;case 55:case 56:case 57:return 70;case 58:case 59:case 60:return 69;case 61:return 51;case 62:return 52;case 63:return 53;case 64:return 54;case 65:return 55;case 66:return 56;case 67:return 57;case 68:return 58;case 69:return 100;case 70:return 103;case 71:return 114;case 72:return 111;case 73:return 104;case 74:case 75:return 112;case 76:return 105;case 77:return 61;case 78:return 81;case 79:return"SEP";case 80:return 80;case 81:return 98;case 82:return 63;case 83:return 62;case 84:return 65;case 85:return 64;case 86:return 109;case 87:return 110;case 88:return 71;case 89:return 49;case 90:return 50;case 91:return 40;case 92:return 41;case 93:return 59;case 94:return 60;case 95:return 120;case 96:return 21;case 97:return 22;case 98:return 23}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\()/,/^(?:\)\])/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[23,24],inclusive:!1},callbackname:{rules:[20,21,22],inclusive:!1},href:{rules:[17,18],inclusive:!1},click:{rules:[26,27],inclusive:!1},vertex:{rules:[],inclusive:!1},dir:{rules:[36,37,38,39,40,41,42,43,44,45,46],inclusive:!1},string:{rules:[8,9],inclusive:!1},INITIAL:{rules:[0,5,6,7,10,11,12,13,14,15,16,19,25,28,29,30,31,32,33,34,35,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],inclusive:!0}}};function Xt(){this.yy={}}return Gt.lexer=qt,Xt.prototype=Gt,Gt.Parser=Xt,new Xt}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,3],n=[1,5],r=[7,9,11,12,13,14,15,16,17,18,20,27,32],i=[1,15],a=[1,16],o=[1,17],s=[1,18],c=[1,19],u=[1,20],l=[1,21],h=[1,23],f=[1,25],d=[1,28],p=[5,7,9,11,12,13,14,15,16,17,18,20,27,32],y={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,gantt:5,document:6,EOF:7,line:8,SPACE:9,statement:10,NL:11,dateFormat:12,inclusiveEndDates:13,axisFormat:14,excludes:15,todayMarker:16,title:17,section:18,clickStatement:19,taskTxt:20,taskData:21,openDirective:22,typeDirective:23,closeDirective:24,":":25,argDirective:26,click:27,callbackname:28,callbackargs:29,href:30,clickStatementDebug:31,open_directive:32,type_directive:33,arg_directive:34,close_directive:35,$accept:0,$end:1},terminals_:{2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"axisFormat",15:"excludes",16:"todayMarker",17:"title",18:"section",20:"taskTxt",21:"taskData",25:":",27:"click",28:"callbackname",29:"callbackargs",30:"href",32:"open_directive",33:"type_directive",34:"arg_directive",35:"close_directive"},productions_:[0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[19,2],[19,3],[19,3],[19,4],[19,3],[19,4],[19,2],[31,2],[31,3],[31,3],[31,4],[31,3],[31,4],[31,2],[22,1],[23,1],[26,1],[24,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 2:return a[s-1];case 3:this.$=[];break;case 4:a[s-1].push(a[s]),this.$=a[s-1];break;case 5:case 6:this.$=a[s];break;case 7:case 8:this.$=[];break;case 9:r.setDateFormat(a[s].substr(11)),this.$=a[s].substr(11);break;case 10:r.enableInclusiveEndDates(),this.$=a[s].substr(18);break;case 11:r.setAxisFormat(a[s].substr(11)),this.$=a[s].substr(11);break;case 12:r.setExcludes(a[s].substr(9)),this.$=a[s].substr(9);break;case 13:r.setTodayMarker(a[s].substr(12)),this.$=a[s].substr(12);break;case 14:r.setTitle(a[s].substr(6)),this.$=a[s].substr(6);break;case 15:r.addSection(a[s].substr(8)),this.$=a[s].substr(8);break;case 17:r.addTask(a[s-1],a[s]),this.$="task";break;case 21:this.$=a[s-1],r.setClickEvent(a[s-1],a[s],null);break;case 22:this.$=a[s-2],r.setClickEvent(a[s-2],a[s-1],a[s]);break;case 23:this.$=a[s-2],r.setClickEvent(a[s-2],a[s-1],null),r.setLink(a[s-2],a[s]);break;case 24:this.$=a[s-3],r.setClickEvent(a[s-3],a[s-2],a[s-1]),r.setLink(a[s-3],a[s]);break;case 25:this.$=a[s-2],r.setClickEvent(a[s-2],a[s],null),r.setLink(a[s-2],a[s-1]);break;case 26:this.$=a[s-3],r.setClickEvent(a[s-3],a[s-1],a[s]),r.setLink(a[s-3],a[s-2]);break;case 27:this.$=a[s-1],r.setLink(a[s-1],a[s]);break;case 28:case 34:this.$=a[s-1]+" "+a[s];break;case 29:case 30:case 32:this.$=a[s-2]+" "+a[s-1]+" "+a[s];break;case 31:case 33:this.$=a[s-3]+" "+a[s-2]+" "+a[s-1]+" "+a[s];break;case 35:r.parseDirective("%%{","open_directive");break;case 36:r.parseDirective(a[s],"type_directive");break;case 37:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 38:r.parseDirective("}%%","close_directive","gantt")}},table:[{3:1,4:2,5:e,22:4,32:n},{1:[3]},{3:6,4:2,5:e,22:4,32:n},t(r,[2,3],{6:7}),{23:8,33:[1,9]},{33:[2,35]},{1:[2,1]},{4:24,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:i,13:a,14:o,15:s,16:c,17:u,18:l,19:22,20:h,22:4,27:f,32:n},{24:26,25:[1,27],35:d},t([25,35],[2,36]),t(r,[2,8],{1:[2,2]}),t(r,[2,4]),{4:24,10:29,12:i,13:a,14:o,15:s,16:c,17:u,18:l,19:22,20:h,22:4,27:f,32:n},t(r,[2,6]),t(r,[2,7]),t(r,[2,9]),t(r,[2,10]),t(r,[2,11]),t(r,[2,12]),t(r,[2,13]),t(r,[2,14]),t(r,[2,15]),t(r,[2,16]),{21:[1,30]},t(r,[2,18]),{28:[1,31],30:[1,32]},{11:[1,33]},{26:34,34:[1,35]},{11:[2,38]},t(r,[2,5]),t(r,[2,17]),t(r,[2,21],{29:[1,36],30:[1,37]}),t(r,[2,27],{28:[1,38]}),t(p,[2,19]),{24:39,35:d},{35:[2,37]},t(r,[2,22],{30:[1,40]}),t(r,[2,23]),t(r,[2,25],{29:[1,41]}),{11:[1,42]},t(r,[2,24]),t(r,[2,26]),t(p,[2,20])],defaultActions:{5:[2,35],6:[2,1],28:[2,38],35:[2,37]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},g={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),32;case 1:return this.begin("type_directive"),33;case 2:return this.popState(),this.begin("arg_directive"),25;case 3:return this.popState(),this.popState(),35;case 4:return 34;case 5:case 6:case 7:break;case 8:return 11;case 9:case 10:case 11:break;case 12:this.begin("href");break;case 13:this.popState();break;case 14:return 30;case 15:this.begin("callbackname");break;case 16:this.popState();break;case 17:this.popState(),this.begin("callbackargs");break;case 18:return 28;case 19:this.popState();break;case 20:return 29;case 21:this.begin("click");break;case 22:this.popState();break;case 23:return 27;case 24:return 5;case 25:return 12;case 26:return 13;case 27:return 14;case 28:return 15;case 29:return 16;case 30:return"date";case 31:return 17;case 32:return 18;case 33:return 20;case 34:return 21;case 35:return 25;case 36:return 7;case 37:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[19,20],inclusive:!1},callbackname:{rules:[16,17,18],inclusive:!1},href:{rules:[13,14],inclusive:!1},click:{rules:[22,23],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,15,21,24,25,26,27,28,29,30,31,32,33,34,35,36,37],inclusive:!0}}};function v(){this.yy={}}return y.lexer=g,v.prototype=y,y.Parser=v,new v}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,5],r=[6,9,11,17,18,19,21],i=[1,15],a=[1,16],o=[1,17],s=[1,21],c=[4,6,9,11,17,18,19,21],u={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,section:18,taskName:19,taskData:20,open_directive:21,type_directive:22,arg_directive:23,close_directive:24,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"section",19:"taskName",20:"taskData",21:"open_directive",22:"type_directive",23:"arg_directive",24:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 1:return a[s-1];case 3:this.$=[];break;case 4:a[s-1].push(a[s]),this.$=a[s-1];break;case 5:case 6:this.$=a[s];break;case 7:case 8:this.$=[];break;case 11:r.setTitle(a[s].substr(6)),this.$=a[s].substr(6);break;case 12:r.addSection(a[s].substr(8)),this.$=a[s].substr(8);break;case 13:r.addTask(a[s-1],a[s]),this.$="task";break;case 15:r.parseDirective("%%{","open_directive");break;case 16:r.parseDirective(a[s],"type_directive");break;case 17:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 18:r.parseDirective("}%%","close_directive","journey")}},table:[{3:1,4:e,7:3,12:4,21:n},{1:[3]},t(r,[2,3],{5:6}),{3:7,4:e,7:3,12:4,21:n},{13:8,22:[1,9]},{22:[2,15]},{6:[1,10],7:18,8:11,9:[1,12],10:13,11:[1,14],12:4,17:i,18:a,19:o,21:n},{1:[2,2]},{14:19,15:[1,20],24:s},t([15,24],[2,16]),t(r,[2,8],{1:[2,1]}),t(r,[2,4]),{7:18,10:22,12:4,17:i,18:a,19:o,21:n},t(r,[2,6]),t(r,[2,7]),t(r,[2,11]),t(r,[2,12]),{20:[1,23]},t(r,[2,14]),{11:[1,24]},{16:25,23:[1,26]},{11:[2,18]},t(r,[2,5]),t(r,[2,13]),t(c,[2,9]),{14:27,24:s},{24:[2,17]},{11:[1,28]},t(c,[2,10])],defaultActions:{5:[2,15],7:[2,2],21:[2,18],26:[2,17]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},l={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),21;case 1:return this.begin("type_directive"),22;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),24;case 4:return 23;case 5:case 6:break;case 7:return 11;case 8:case 9:break;case 10:return 4;case 11:return 17;case 12:return 18;case 13:return 19;case 14:return 20;case 15:return 15;case 16:return 6;case 17:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,13,14,15,16,17],inclusive:!0}}};function h(){this.yy={}}return u.lexer=l,h.prototype=u,u.Parser=h,new h}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(15);e.default=function(t,e){return r.default.lang.round(i.default.parse(t)[e])}},function(t,e,n){var r=n(112),i=n(82),a=n(24);t.exports=function(t){return a(t)?r(t):i(t)}},function(t,e,n){var r;if(!r)try{r=n(0)}catch(t){}r||(r=window.d3),t.exports=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(15);e.default=function(t,e,n){var a=i.default.parse(t),o=a[e],s=r.default.channel.clamp[e](o+n);return o!==s&&(a[e]=s),i.default.stringify(a)}},function(t,e,n){var r=n(210),i=n(216);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},function(t,e,n){var r=n(38),i=n(212),a=n(213),o=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":o&&o in Object(t)?i(t):a(t)}},function(t,e){t.exports=function(t){return t}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(34),i=n(11);t.exports=function(t){if(!i(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},function(t,e,n){var r=n(16).Symbol;t.exports=r},function(t,e,n){(function(t){var r=n(16),i=n(232),a=e&&!e.nodeType&&e,o=a&&"object"==typeof t&&t&&!t.nodeType&&t,s=o&&o.exports===a?r.Buffer:void 0,c=(s?s.isBuffer:void 0)||i;t.exports=c}).call(this,n(7)(t))},function(t,e,n){var r=n(112),i=n(236),a=n(24);t.exports=function(t){return a(t)?r(t,!0):i(t)}},function(t,e,n){var r=n(241),i=n(77),a=n(242),o=n(121),s=n(243),c=n(34),u=n(110),l=u(r),h=u(i),f=u(a),d=u(o),p=u(s),y=c;(r&&"[object DataView]"!=y(new r(new ArrayBuffer(1)))||i&&"[object Map]"!=y(new i)||a&&"[object Promise]"!=y(a.resolve())||o&&"[object Set]"!=y(new o)||s&&"[object WeakMap]"!=y(new s))&&(y=function(t){var e=c(t),n="[object Object]"==e?t.constructor:void 0,r=n?u(n):"";if(r)switch(r){case l:return"[object DataView]";case h:return"[object Map]";case f:return"[object Promise]";case d:return"[object Set]";case p:return"[object WeakMap]"}return e}),t.exports=y},function(t,e,n){var r=n(34),i=n(21);t.exports=function(t){return"symbol"==typeof t||i(t)&&"[object Symbol]"==r(t)}},function(t,e,n){var r;try{r={defaults:n(154),each:n(87),isFunction:n(37),isPlainObject:n(158),pick:n(161),has:n(93),range:n(162),uniqueId:n(163)}}catch(t){}r||(r=window._),t.exports=r},function(t){t.exports=JSON.parse('{"name":"mermaid","version":"8.9.1","description":"Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.","main":"dist/mermaid.core.js","keywords":["diagram","markdown","flowchart","sequence diagram","gantt","class diagram","git graph"],"scripts":{"build:development":"webpack --progress --colors","build:production":"yarn build:development -p --config webpack.config.prod.babel.js","build":"yarn build:development && yarn build:production","postbuild":"documentation build src/mermaidAPI.js src/config.js src/defaultConfig.js --shallow -f md --markdown-toc false > docs/Setup.md","build:watch":"yarn build --watch","minify":"minify ./dist/mermaid.js > ./dist/mermaid.min.js","release":"yarn build","lint":"eslint src","e2e:depr":"yarn lint && jest e2e --config e2e/jest.config.js","cypress":"percy exec -- cypress run","e2e":"start-server-and-test dev http://localhost:9000/ cypress","e2e-upd":"yarn lint && jest e2e -u --config e2e/jest.config.js","dev":"webpack-dev-server --config webpack.config.e2e.js","test":"yarn lint && jest src/.*","test:watch":"jest --watch src","prepublishOnly":"yarn build && yarn test","prepare":"yarn build"},"repository":{"type":"git","url":"https://github.com/knsv/mermaid"},"author":"Knut Sveidqvist","license":"MIT","standard":{"ignore":["**/parser/*.js","dist/**/*.js","cypress/**/*.js"],"globals":["page"]},"dependencies":{"@braintree/sanitize-url":"^3.1.0","d3":"^5.7.0","dagre":"^0.8.4","dagre-d3":"^0.6.4","entity-decode":"^2.0.2","graphlib":"^2.1.7","he":"^1.2.0","khroma":"^1.1.0","minify":"^4.1.1","moment-mini":"^2.22.1","stylis":"^3.5.2"},"devDependencies":{"@babel/core":"^7.2.2","@babel/preset-env":"^7.8.4","@babel/register":"^7.0.0","@percy/cypress":"*","babel-core":"7.0.0-bridge.0","babel-eslint":"^10.1.0","babel-jest":"^24.9.0","babel-loader":"^8.0.4","coveralls":"^3.0.2","css-loader":"^2.0.1","css-to-string-loader":"^0.1.3","cypress":"4.0.1","documentation":"^12.0.1","eslint":"^6.3.0","eslint-config-prettier":"^6.3.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.2.1","identity-obj-proxy":"^3.0.0","jest":"^24.9.0","jison":"^0.4.18","moment":"^2.23.0","node-sass":"^5.0.0","prettier":"^1.18.2","puppeteer":"^1.17.0","sass-loader":"^7.1.0","start-server-and-test":"^1.10.6","terser-webpack-plugin":"^2.2.2","webpack":"^4.41.2","webpack-bundle-analyzer":"^3.7.0","webpack-cli":"^3.1.2","webpack-dev-server":"^3.4.1","webpack-node-externals":"^1.7.2","yarn-upgrade-all":"^0.5.0"},"files":["dist"],"yarn-upgrade-all":{"ignore":["babel-core"]},"sideEffects":["**/*.css","**/*.scss"],"husky":{"hooks":{"pre-push":"yarn test"}}}')},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=new(n(176).default)({r:0,g:0,b:0,a:0},"transparent");e.default=r},function(t,e,n){var r=n(58),i=n(59);t.exports=function(t,e,n,a){var o=!n;n||(n={});for(var s=-1,c=e.length;++s-1&&t%1==0&&t-1}(s)?s:(n=s.match(a))?(e=n[0],r.test(e)?"about:blank":s):"about:blank"}}},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[2,3],n=[1,7],r=[7,12,15,17,19,20,21],i=[7,11,12,15,17,19,20,21],a=[2,20],o=[1,32],s={trace:function(){},yy:{},symbols_:{error:2,start:3,GG:4,":":5,document:6,EOF:7,DIR:8,options:9,body:10,OPT:11,NL:12,line:13,statement:14,COMMIT:15,commit_arg:16,BRANCH:17,ID:18,CHECKOUT:19,MERGE:20,RESET:21,reset_arg:22,STR:23,HEAD:24,reset_parents:25,CARET:26,$accept:0,$end:1},terminals_:{2:"error",4:"GG",5:":",7:"EOF",8:"DIR",11:"OPT",12:"NL",15:"COMMIT",17:"BRANCH",18:"ID",19:"CHECKOUT",20:"MERGE",21:"RESET",23:"STR",24:"HEAD",26:"CARET"},productions_:[0,[3,4],[3,5],[6,0],[6,2],[9,2],[9,1],[10,0],[10,2],[13,2],[13,1],[14,2],[14,2],[14,2],[14,2],[14,2],[16,0],[16,1],[22,2],[22,2],[25,0],[25,2]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 1:return a[s-1];case 2:return r.setDirection(a[s-3]),a[s-1];case 4:r.setOptions(a[s-1]),this.$=a[s];break;case 5:a[s-1]+=a[s],this.$=a[s-1];break;case 7:this.$=[];break;case 8:a[s-1].push(a[s]),this.$=a[s-1];break;case 9:this.$=a[s-1];break;case 11:r.commit(a[s]);break;case 12:r.branch(a[s]);break;case 13:r.checkout(a[s]);break;case 14:r.merge(a[s]);break;case 15:r.reset(a[s]);break;case 16:this.$="";break;case 17:this.$=a[s];break;case 18:this.$=a[s-1]+":"+a[s];break;case 19:this.$=a[s-1]+":"+r.count,r.count=0;break;case 20:r.count=0;break;case 21:r.count+=1}},table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3],8:[1,4]},{6:5,7:e,9:6,12:n},{5:[1,8]},{7:[1,9]},t(r,[2,7],{10:10,11:[1,11]}),t(i,[2,6]),{6:12,7:e,9:6,12:n},{1:[2,1]},{7:[2,4],12:[1,15],13:13,14:14,15:[1,16],17:[1,17],19:[1,18],20:[1,19],21:[1,20]},t(i,[2,5]),{7:[1,21]},t(r,[2,8]),{12:[1,22]},t(r,[2,10]),{12:[2,16],16:23,23:[1,24]},{18:[1,25]},{18:[1,26]},{18:[1,27]},{18:[1,30],22:28,24:[1,29]},{1:[2,2]},t(r,[2,9]),{12:[2,11]},{12:[2,17]},{12:[2,12]},{12:[2,13]},{12:[2,14]},{12:[2,15]},{12:a,25:31,26:o},{12:a,25:33,26:o},{12:[2,18]},{12:a,25:34,26:o},{12:[2,19]},{12:[2,21]}],defaultActions:{9:[2,1],21:[2,2],23:[2,11],24:[2,17],25:[2,12],26:[2,13],27:[2,14],28:[2,15],31:[2,18],33:[2,19],34:[2,21]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},c={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return 12;case 1:case 2:case 3:break;case 4:return 4;case 5:return 15;case 6:return 17;case 7:return 20;case 8:return 21;case 9:return 19;case 10:case 11:return 8;case 12:return 5;case 13:return 26;case 14:this.begin("options");break;case 15:this.popState();break;case 16:return 11;case 17:this.begin("string");break;case 18:this.popState();break;case 19:return 23;case 20:return 18;case 21:return 7}},rules:[/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:branch\b)/i,/^(?:merge\b)/i,/^(?:reset\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:end\r?\n)/i,/^(?:[^\n]+\r?\n)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[a-zA-Z][-_\.a-zA-Z0-9]*[-_a-zA-Z0-9])/i,/^(?:$)/i],conditions:{options:{rules:[15,16],inclusive:!1},string:{rules:[18,19],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],inclusive:!0}}};function u(){this.yy={}}return s.lexer=c,u.prototype=s,s.Parser=u,new u}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[6,9,10],n={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(t,e,n,r,i,a,o){a.length;switch(i){case 1:return r;case 4:break;case 6:r.setInfo(!0)}},table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},t(e,[2,3]),t(e,[2,4]),t(e,[2,5]),t(e,[2,6])],defaultActions:{4:[2,1]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},r={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}};function i(){this.yy={}}return n.lexer=r,i.prototype=n,n.Parser=i,new i}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,4],n=[1,5],r=[1,6],i=[1,7],a=[1,9],o=[1,10,12,19,20,21,22],s=[1,6,10,12,19,20,21,22],c=[19,20,21],u=[1,22],l=[6,19,20,21,22],h={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,PIE:6,document:7,line:8,statement:9,txt:10,value:11,title:12,title_value:13,openDirective:14,typeDirective:15,closeDirective:16,":":17,argDirective:18,NEWLINE:19,";":20,EOF:21,open_directive:22,type_directive:23,arg_directive:24,close_directive:25,$accept:0,$end:1},terminals_:{2:"error",6:"PIE",10:"txt",11:"value",12:"title",13:"title_value",17:":",19:"NEWLINE",20:";",21:"EOF",22:"open_directive",23:"type_directive",24:"arg_directive",25:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[9,0],[9,2],[9,2],[9,1],[5,3],[5,5],[4,1],[4,1],[4,1],[14,1],[15,1],[18,1],[16,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 6:this.$=a[s-1];break;case 8:r.addSection(a[s-1],r.cleanupValue(a[s]));break;case 9:this.$=a[s].trim(),r.setTitle(this.$);break;case 16:r.parseDirective("%%{","open_directive");break;case 17:r.parseDirective(a[s],"type_directive");break;case 18:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 19:r.parseDirective("}%%","close_directive","pie")}},table:[{3:1,4:2,5:3,6:e,14:8,19:n,20:r,21:i,22:a},{1:[3]},{3:10,4:2,5:3,6:e,14:8,19:n,20:r,21:i,22:a},{3:11,4:2,5:3,6:e,14:8,19:n,20:r,21:i,22:a},t(o,[2,4],{7:12}),t(s,[2,13]),t(s,[2,14]),t(s,[2,15]),{15:13,23:[1,14]},{23:[2,16]},{1:[2,1]},{1:[2,2]},t(c,[2,7],{14:8,8:15,9:16,5:19,1:[2,3],10:[1,17],12:[1,18],22:a}),{16:20,17:[1,21],25:u},t([17,25],[2,17]),t(o,[2,5]),{4:23,19:n,20:r,21:i},{11:[1,24]},{13:[1,25]},t(c,[2,10]),t(l,[2,11]),{18:26,24:[1,27]},t(l,[2,19]),t(o,[2,6]),t(c,[2,8]),t(c,[2,9]),{16:28,25:u},{25:[2,18]},t(l,[2,12])],defaultActions:{9:[2,16],10:[2,1],11:[2,2],27:[2,18]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},f={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),22;case 1:return this.begin("type_directive"),23;case 2:return this.popState(),this.begin("arg_directive"),17;case 3:return this.popState(),this.popState(),25;case 4:return 24;case 5:case 6:break;case 7:return 19;case 8:case 9:break;case 10:return this.begin("title"),12;case 11:return this.popState(),"title_value";case 12:this.begin("string");break;case 13:this.popState();break;case 14:return"txt";case 15:return 6;case 16:return"value";case 17:return 21}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},title:{rules:[11],inclusive:!1},string:{rules:[13,14],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,12,15,16,17],inclusive:!0}}};function d(){this.yy={}}return h.lexer=f,d.prototype=h,h.Parser=d,new d}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){(function(t,r){var i=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,5],r=[6,9,11,23,37],i=[1,17],a=[1,20],o=[1,25],s=[1,26],c=[1,27],u=[1,28],l=[1,37],h=[23,34,35],f=[4,6,9,11,23,37],d=[30,31,32,33],p=[22,27],y={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,entityName:17,relSpec:18,role:19,BLOCK_START:20,attributes:21,BLOCK_STOP:22,ALPHANUM:23,attribute:24,attributeType:25,attributeName:26,ATTRIBUTE_WORD:27,cardinality:28,relType:29,ZERO_OR_ONE:30,ZERO_OR_MORE:31,ONE_OR_MORE:32,ONLY_ONE:33,NON_IDENTIFYING:34,IDENTIFYING:35,WORD:36,open_directive:37,type_directive:38,arg_directive:39,close_directive:40,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"BLOCK_START",22:"BLOCK_STOP",23:"ALPHANUM",27:"ATTRIBUTE_WORD",30:"ZERO_OR_ONE",31:"ZERO_OR_MORE",32:"ONE_OR_MORE",33:"ONLY_ONE",34:"NON_IDENTIFYING",35:"IDENTIFYING",36:"WORD",37:"open_directive",38:"type_directive",39:"arg_directive",40:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[17,1],[21,1],[21,2],[24,2],[25,1],[26,1],[18,3],[28,1],[28,1],[28,1],[28,1],[29,1],[29,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 1:break;case 3:this.$=[];break;case 4:a[s-1].push(a[s]),this.$=a[s-1];break;case 5:case 6:this.$=a[s];break;case 7:case 8:this.$=[];break;case 12:r.addEntity(a[s-4]),r.addEntity(a[s-2]),r.addRelationship(a[s-4],a[s],a[s-2],a[s-3]);break;case 13:r.addEntity(a[s-3]),r.addAttributes(a[s-3],a[s-1]);break;case 14:r.addEntity(a[s-2]);break;case 15:r.addEntity(a[s]);break;case 16:this.$=a[s];break;case 17:this.$=[a[s]];break;case 18:a[s].push(a[s-1]),this.$=a[s];break;case 19:this.$={attributeType:a[s-1],attributeName:a[s]};break;case 20:case 21:this.$=a[s];break;case 22:this.$={cardA:a[s],relType:a[s-1],cardB:a[s-2]};break;case 23:this.$=r.Cardinality.ZERO_OR_ONE;break;case 24:this.$=r.Cardinality.ZERO_OR_MORE;break;case 25:this.$=r.Cardinality.ONE_OR_MORE;break;case 26:this.$=r.Cardinality.ONLY_ONE;break;case 27:this.$=r.Identification.NON_IDENTIFYING;break;case 28:this.$=r.Identification.IDENTIFYING;break;case 29:this.$=a[s].replace(/"/g,"");break;case 30:this.$=a[s];break;case 31:r.parseDirective("%%{","open_directive");break;case 32:r.parseDirective(a[s],"type_directive");break;case 33:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 34:r.parseDirective("}%%","close_directive","er")}},table:[{3:1,4:e,7:3,12:4,37:n},{1:[3]},t(r,[2,3],{5:6}),{3:7,4:e,7:3,12:4,37:n},{13:8,38:[1,9]},{38:[2,31]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:i,37:n},{1:[2,2]},{14:18,15:[1,19],40:a},t([15,40],[2,32]),t(r,[2,8],{1:[2,1]}),t(r,[2,4]),{7:15,10:21,12:4,17:16,23:i,37:n},t(r,[2,6]),t(r,[2,7]),t(r,[2,11]),t(r,[2,15],{18:22,28:24,20:[1,23],30:o,31:s,32:c,33:u}),t([6,9,11,15,20,23,30,31,32,33,37],[2,16]),{11:[1,29]},{16:30,39:[1,31]},{11:[2,34]},t(r,[2,5]),{17:32,23:i},{21:33,22:[1,34],24:35,25:36,27:l},{29:38,34:[1,39],35:[1,40]},t(h,[2,23]),t(h,[2,24]),t(h,[2,25]),t(h,[2,26]),t(f,[2,9]),{14:41,40:a},{40:[2,33]},{15:[1,42]},{22:[1,43]},t(r,[2,14]),{21:44,22:[2,17],24:35,25:36,27:l},{26:45,27:[1,46]},{27:[2,20]},{28:47,30:o,31:s,32:c,33:u},t(d,[2,27]),t(d,[2,28]),{11:[1,48]},{19:49,23:[1,51],36:[1,50]},t(r,[2,13]),{22:[2,18]},t(p,[2,19]),t(p,[2,21]),{23:[2,22]},t(f,[2,10]),t(r,[2,12]),t(r,[2,29]),t(r,[2,30])],defaultActions:{5:[2,31],7:[2,2],20:[2,34],31:[2,33],37:[2,20],44:[2,18],47:[2,22]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var v=p.yylloc;a.push(v);var m=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var x,_,k,w,E,T,C,A,S,M={};;){if(k=n[n.length-1],this.defaultActions[k]?w=this.defaultActions[k]:(null==x&&(x=b()),w=o[k]&&o[k][x]),void 0===w||!w.length||!w[0]){var O="";for(T in S=[],o[k])this.terminals_[T]&&T>h&&S.push("'"+this.terminals_[T]+"'");O=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(c+1)+": Unexpected "+(x==f?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(O,{text:p.match,token:this.terminals_[x]||x,line:p.yylineno,loc:v,expected:S})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+x);switch(w[0]){case 1:n.push(x),i.push(p.yytext),a.push(p.yylloc),n.push(w[1]),x=null,_?(x=_,_=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,v=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[w[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},m&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(E=this.performAction.apply(M,[s,u,c,y.yy,w[1],i,a].concat(d))))return E;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[w[1]][0]),i.push(M.$),a.push(M._$),A=o[n[n.length-2]][n[n.length-1]],n.push(A);break;case 3:return!0}}return!0}},g={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),37;case 1:return this.begin("type_directive"),38;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),40;case 4:return 39;case 5:case 6:break;case 7:return 11;case 8:break;case 9:return 9;case 10:return 36;case 11:return 4;case 12:return this.begin("block"),20;case 13:break;case 14:return 27;case 15:break;case 16:return this.popState(),22;case 17:return e.yytext[0];case 18:return 30;case 19:return 31;case 20:return 32;case 21:return 33;case 22:return 30;case 23:return 31;case 24:return 32;case 25:return 34;case 26:return 35;case 27:case 28:return 34;case 29:return 23;case 30:return e.yytext[0];case 31:return 6}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:\s+)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\|o\b)/i,/^(?:\}o\b)/i,/^(?:\}\|)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},block:{rules:[13,14,15,16,17],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31],inclusive:!0}}};function v(){this.yy={}}return y.lexer=g,v.prototype=y,y.Parser=v,new v}();e.parser=i,e.Parser=i.Parser,e.parse=function(){return i.parse.apply(i,arguments)},e.main=function(r){r[1]||(console.log("Usage: "+r[0]+" FILE"),t.exit(1));var i=n(19).readFileSync(n(20).normalize(r[1]),"utf8");return e.parser.parse(i)},n.c[n.s]===r&&e.main(t.argv.slice(1))}).call(this,n(14),n(7)(t))},function(t,e,n){"use strict";var r;Object.defineProperty(e,"__esModule",{value:!0}),function(t){t[t.ALL=0]="ALL",t[t.RGB=1]="RGB",t[t.HSL=2]="HSL"}(r||(r={})),e.TYPE=r},function(t,e,n){"use strict";var r=n(10);t.exports=i;function i(t){this._isDirected=!r.has(t,"directed")||t.directed,this._isMultigraph=!!r.has(t,"multigraph")&&t.multigraph,this._isCompound=!!r.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=r.constant(void 0),this._defaultEdgeLabelFn=r.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function a(t,e){t[e]?t[e]++:t[e]=1}function o(t,e){--t[e]||delete t[e]}function s(t,e,n,i){var a=""+e,o=""+n;if(!t&&a>o){var s=a;a=o,o=s}return a+""+o+""+(r.isUndefined(i)?"\0":i)}function c(t,e,n,r){var i=""+e,a=""+n;if(!t&&i>a){var o=i;i=a,a=o}var s={v:i,w:a};return r&&(s.name=r),s}function u(t,e){return s(t,e.v,e.w,e.name)}i.prototype._nodeCount=0,i.prototype._edgeCount=0,i.prototype.isDirected=function(){return this._isDirected},i.prototype.isMultigraph=function(){return this._isMultigraph},i.prototype.isCompound=function(){return this._isCompound},i.prototype.setGraph=function(t){return this._label=t,this},i.prototype.graph=function(){return this._label},i.prototype.setDefaultNodeLabel=function(t){return r.isFunction(t)||(t=r.constant(t)),this._defaultNodeLabelFn=t,this},i.prototype.nodeCount=function(){return this._nodeCount},i.prototype.nodes=function(){return r.keys(this._nodes)},i.prototype.sources=function(){var t=this;return r.filter(this.nodes(),(function(e){return r.isEmpty(t._in[e])}))},i.prototype.sinks=function(){var t=this;return r.filter(this.nodes(),(function(e){return r.isEmpty(t._out[e])}))},i.prototype.setNodes=function(t,e){var n=arguments,i=this;return r.each(t,(function(t){n.length>1?i.setNode(t,e):i.setNode(t)})),this},i.prototype.setNode=function(t,e){return r.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},i.prototype.node=function(t){return this._nodes[t]},i.prototype.hasNode=function(t){return r.has(this._nodes,t)},i.prototype.removeNode=function(t){var e=this;if(r.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],r.each(this.children(t),(function(t){e.setParent(t)})),delete this._children[t]),r.each(r.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],r.each(r.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},i.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(r.isUndefined(e))e="\0";else{for(var n=e+="";!r.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},i.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},i.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},i.prototype.children=function(t){if(r.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return r.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},i.prototype.predecessors=function(t){var e=this._preds[t];if(e)return r.keys(e)},i.prototype.successors=function(t){var e=this._sucs[t];if(e)return r.keys(e)},i.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return r.union(e,this.successors(t))},i.prototype.isLeaf=function(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length},i.prototype.filterNodes=function(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;r.each(this._nodes,(function(n,r){t(r)&&e.setNode(r,n)})),r.each(this._edgeObjs,(function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))}));var i={};return this._isCompound&&r.each(e.nodes(),(function(t){e.setParent(t,function t(r){var a=n.parent(r);return void 0===a||e.hasNode(a)?(i[r]=a,a):a in i?i[a]:t(a)}(t))})),e},i.prototype.setDefaultEdgeLabel=function(t){return r.isFunction(t)||(t=r.constant(t)),this._defaultEdgeLabelFn=t,this},i.prototype.edgeCount=function(){return this._edgeCount},i.prototype.edges=function(){return r.values(this._edgeObjs)},i.prototype.setPath=function(t,e){var n=this,i=arguments;return r.reduce(t,(function(t,r){return i.length>1?n.setEdge(t,r,e):n.setEdge(t,r),r})),this},i.prototype.setEdge=function(){var t,e,n,i,o=!1,u=arguments[0];"object"==typeof u&&null!==u&&"v"in u?(t=u.v,e=u.w,n=u.name,2===arguments.length&&(i=arguments[1],o=!0)):(t=u,e=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],o=!0)),t=""+t,e=""+e,r.isUndefined(n)||(n=""+n);var l=s(this._isDirected,t,e,n);if(r.has(this._edgeLabels,l))return o&&(this._edgeLabels[l]=i),this;if(!r.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=o?i:this._defaultEdgeLabelFn(t,e,n);var h=c(this._isDirected,t,e,n);return t=h.v,e=h.w,Object.freeze(h),this._edgeObjs[l]=h,a(this._preds[e],t),a(this._sucs[t],e),this._in[e][l]=h,this._out[t][l]=h,this._edgeCount++,this},i.prototype.edge=function(t,e,n){var r=1===arguments.length?u(this._isDirected,arguments[0]):s(this._isDirected,t,e,n);return this._edgeLabels[r]},i.prototype.hasEdge=function(t,e,n){var i=1===arguments.length?u(this._isDirected,arguments[0]):s(this._isDirected,t,e,n);return r.has(this._edgeLabels,i)},i.prototype.removeEdge=function(t,e,n){var r=1===arguments.length?u(this._isDirected,arguments[0]):s(this._isDirected,t,e,n),i=this._edgeObjs[r];return i&&(t=i.v,e=i.w,delete this._edgeLabels[r],delete this._edgeObjs[r],o(this._preds[e],t),o(this._sucs[t],e),delete this._in[e][r],delete this._out[t][r],this._edgeCount--),this},i.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var i=r.values(n);return e?r.filter(i,(function(t){return t.v===e})):i}},i.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var i=r.values(n);return e?r.filter(i,(function(t){return t.w===e})):i}},i.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},function(t,e,n){var r=n(33)(n(16),"Map");t.exports=r},function(t,e,n){var r=n(217),i=n(224),a=n(226),o=n(227),s=n(228);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){(function(t){var r=n(109),i=e&&!e.nodeType&&e,a=i&&"object"==typeof t&&t&&!t.nodeType&&t,o=a&&a.exports===i&&r.process,s=function(){try{var t=a&&a.require&&a.require("util").types;return t||o&&o.binding&&o.binding("util")}catch(t){}}();t.exports=s}).call(this,n(7)(t))},function(t,e,n){var r=n(62),i=n(234),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=[];for(var n in Object(t))a.call(t,n)&&"constructor"!=n&&e.push(n);return e}},function(t,e,n){var r=n(116),i=n(117),a=Object.prototype.propertyIsEnumerable,o=Object.getOwnPropertySymbols,s=o?function(t){return null==t?[]:(t=Object(t),r(o(t),(function(e){return a.call(t,e)})))}:i;t.exports=s},function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,i=t.length;++n0&&a(l)?n>1?t(l,n-1,a,o,s):r(s,l):o||(s[s.length]=l)}return s}},function(t,e,n){var r=n(42);t.exports=function(t,e,n){for(var i=-1,a=t.length;++i4,u=c?1:17,l=c?8:4,h=s?0:-1,f=c?255:15;return i.default.set({r:(r>>l*(h+3)&f)*u,g:(r>>l*(h+2)&f)*u,b:(r>>l*(h+1)&f)*u,a:s?(r&f)*u/255:1},t)}}},stringify:function(t){return t.a<1?"#"+a.DEC2HEX[Math.round(t.r)]+a.DEC2HEX[Math.round(t.g)]+a.DEC2HEX[Math.round(t.b)]+r.default.unit.frac2hex(t.a):"#"+a.DEC2HEX[Math.round(t.r)]+a.DEC2HEX[Math.round(t.g)]+a.DEC2HEX[Math.round(t.b)]}};e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(45),a=n(15);e.default=function(t,e,n,o){void 0===o&&(o=1);var s=i.default.set({h:r.default.channel.clamp.h(t),s:r.default.channel.clamp.s(e),l:r.default.channel.clamp.l(n),a:r.default.channel.clamp.a(o)});return a.default.stringify(s)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"a")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(15);e.default=function(t){var e=i.default.parse(t),n=e.r,a=e.g,o=e.b,s=.2126*r.default.channel.toLinear(n)+.7152*r.default.channel.toLinear(a)+.0722*r.default.channel.toLinear(o);return r.default.lang.round(s)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(102);e.default=function(t){return r.default(t)>=.5}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t,e){return r.default(t,"a",e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t,e){return r.default(t,"a",-e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(15),i=n(52);e.default=function(t,e){var n=r.default.parse(t),a={};for(var o in e)e[o]&&(a[o]=n[o]+e[o]);return i.default(t,a)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(15),i=n(51);e.default=function(t,e,n){void 0===n&&(n=50);var a=r.default.parse(t),o=a.r,s=a.g,c=a.b,u=a.a,l=r.default.parse(e),h=l.r,f=l.g,d=l.b,p=l.a,y=n/100,g=2*y-1,v=u-p,m=((g*v==-1?g:(g+v)/(1+g*v))+1)/2,b=1-m,x=o*m+h*b,_=s*m+f*b,k=c*m+d*b,w=u*y+p*(1-y);return i.default(x,_,k,w)}},function(t,e,n){var r=n(53),i=n(79),a=n(58),o=n(229),s=n(235),c=n(114),u=n(115),l=n(238),h=n(239),f=n(119),d=n(240),p=n(41),y=n(244),g=n(245),v=n(124),m=n(5),b=n(39),x=n(249),_=n(11),k=n(251),w=n(30),E={};E["[object Arguments]"]=E["[object Array]"]=E["[object ArrayBuffer]"]=E["[object DataView]"]=E["[object Boolean]"]=E["[object Date]"]=E["[object Float32Array]"]=E["[object Float64Array]"]=E["[object Int8Array]"]=E["[object Int16Array]"]=E["[object Int32Array]"]=E["[object Map]"]=E["[object Number]"]=E["[object Object]"]=E["[object RegExp]"]=E["[object Set]"]=E["[object String]"]=E["[object Symbol]"]=E["[object Uint8Array]"]=E["[object Uint8ClampedArray]"]=E["[object Uint16Array]"]=E["[object Uint32Array]"]=!0,E["[object Error]"]=E["[object Function]"]=E["[object WeakMap]"]=!1,t.exports=function t(e,n,T,C,A,S){var M,O=1&n,D=2&n,N=4&n;if(T&&(M=A?T(e,C,A,S):T(e)),void 0!==M)return M;if(!_(e))return e;var B=m(e);if(B){if(M=y(e),!O)return u(e,M)}else{var L=p(e),P="[object Function]"==L||"[object GeneratorFunction]"==L;if(b(e))return c(e,O);if("[object Object]"==L||"[object Arguments]"==L||P&&!A){if(M=D||P?{}:v(e),!O)return D?h(e,s(M,e)):l(e,o(M,e))}else{if(!E[L])return A?e:{};M=g(e,L,O)}}S||(S=new r);var I=S.get(e);if(I)return I;S.set(e,M),k(e)?e.forEach((function(r){M.add(t(r,n,T,r,e,S))})):x(e)&&e.forEach((function(r,i){M.set(i,t(r,n,T,i,e,S))}));var F=N?D?d:f:D?keysIn:w,j=B?void 0:F(e);return i(j||e,(function(r,i){j&&(r=e[i=r]),a(M,i,t(r,n,T,i,e,S))})),M}},function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(this,n(211))},function(t,e){var n=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return n.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},function(t,e,n){var r=n(33),i=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=i},function(t,e,n){var r=n(230),i=n(47),a=n(5),o=n(39),s=n(60),c=n(48),u=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=a(t),l=!n&&i(t),h=!n&&!l&&o(t),f=!n&&!l&&!h&&c(t),d=n||l||h||f,p=d?r(t.length,String):[],y=p.length;for(var g in t)!e&&!u.call(t,g)||d&&("length"==g||h&&("offset"==g||"parent"==g)||f&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||s(g,y))||p.push(g);return p}},function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},function(t,e,n){(function(t){var r=n(16),i=e&&!e.nodeType&&e,a=i&&"object"==typeof t&&t&&!t.nodeType&&t,o=a&&a.exports===i?r.Buffer:void 0,s=o?o.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=s?s(n):new t.constructor(n);return t.copy(r),r}}).call(this,n(7)(t))},function(t,e){t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++nl))return!1;var f=c.get(t);if(f&&c.get(e))return f==e;var d=-1,p=!0,y=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++d0&&(a=c.removeMin(),(o=s[a]).distance!==Number.POSITIVE_INFINITY);)r(a).forEach(u);return s}(t,String(e),n||a,r||function(e){return t.outEdges(e)})};var a=r.constant(1)},function(t,e,n){var r=n(10);function i(){this._arr=[],this._keyIndices={}}t.exports=i,i.prototype.size=function(){return this._arr.length},i.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},i.prototype.has=function(t){return r.has(this._keyIndices,t)},i.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},i.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},i.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!r.has(n,t)){var i=this._arr,a=i.length;return n[t]=a,i.push({key:t,priority:e}),this._decrease(a),!0}return!1},i.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},i.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},i.prototype._heapify=function(t){var e=this._arr,n=2*t,r=n+1,i=t;n>1].priority2?e[2]:void 0;for(u&&a(e[0],e[1],u)&&(r=1);++n1&&o.sort((function(t,e){var r=t.x-n.x,i=t.y-n.y,a=Math.sqrt(r*r+i*i),o=e.x-n.x,s=e.y-n.y,c=Math.sqrt(o*o+s*s);return aMath.abs(o)*u?(s<0&&(u=-u),n=0===s?0:u*o/s,r=u):(o<0&&(c=-c),n=c,r=0===o?0:c*s/o);return{x:i+n,y:a+r}}},function(t,e,n){t.exports=function t(e){"use strict";var n=/^\0+/g,r=/[\0\r\f]/g,i=/: */g,a=/zoo|gra/,o=/([,: ])(transform)/g,s=/,+\s*(?![^(]*[)])/g,c=/ +\s*(?![^(]*[)])/g,u=/ *[\0] */g,l=/,\r+?/g,h=/([\t\r\n ])*\f?&/g,f=/:global\(((?:[^\(\)\[\]]*|\[.*\]|\([^\(\)]*\))*)\)/g,d=/\W+/g,p=/@(k\w+)\s*(\S*)\s*/,y=/::(place)/g,g=/:(read-only)/g,v=/\s+(?=[{\];=:>])/g,m=/([[}=:>])\s+/g,b=/(\{[^{]+?);(?=\})/g,x=/\s{2,}/g,_=/([^\(])(:+) */g,k=/[svh]\w+-[tblr]{2}/,w=/\(\s*(.*)\s*\)/g,E=/([\s\S]*?);/g,T=/-self|flex-/g,C=/[^]*?(:[rp][el]a[\w-]+)[^]*/,A=/stretch|:\s*\w+\-(?:conte|avail)/,S=/([^-])(image-set\()/,M="-webkit-",O="-moz-",D="-ms-",N=1,B=1,L=0,P=1,I=1,F=1,j=0,R=0,Y=0,z=[],U=[],$=0,W=null,H=0,V=1,G="",q="",X="";function Z(t,e,i,a,o){for(var s,c,l=0,h=0,f=0,d=0,v=0,m=0,b=0,x=0,k=0,E=0,T=0,C=0,A=0,S=0,O=0,D=0,j=0,U=0,W=0,K=i.length,it=K-1,at="",ot="",st="",ct="",ut="",lt="";O0&&(ot=ot.replace(r,"")),ot.trim().length>0)){switch(b){case 32:case 9:case 59:case 13:case 10:break;default:ot+=i.charAt(O)}b=59}if(1===j)switch(b){case 123:case 125:case 59:case 34:case 39:case 40:case 41:case 44:j=0;case 9:case 13:case 10:case 32:break;default:for(j=0,W=O,v=b,O--,b=59;W0&&(++O,b=v);case 123:W=K}}switch(b){case 123:for(v=(ot=ot.trim()).charCodeAt(0),T=1,W=++O;O0&&(ot=ot.replace(r,"")),m=ot.charCodeAt(1)){case 100:case 109:case 115:case 45:s=e;break;default:s=z}if(W=(st=Z(e,s,st,m,o+1)).length,Y>0&&0===W&&(W=ot.length),$>0&&(c=nt(3,st,s=J(z,ot,U),e,B,N,W,m,o,a),ot=s.join(""),void 0!==c&&0===(W=(st=c.trim()).length)&&(m=0,st="")),W>0)switch(m){case 115:ot=ot.replace(w,et);case 100:case 109:case 45:st=ot+"{"+st+"}";break;case 107:st=(ot=ot.replace(p,"$1 $2"+(V>0?G:"")))+"{"+st+"}",st=1===I||2===I&&tt("@"+st,3)?"@"+M+st+"@"+st:"@"+st;break;default:st=ot+st,112===a&&(ct+=st,st="")}else st="";break;default:st=Z(e,J(e,ot,U),st,a,o+1)}ut+=st,C=0,j=0,S=0,D=0,U=0,A=0,ot="",st="",b=i.charCodeAt(++O);break;case 125:case 59:if((W=(ot=(D>0?ot.replace(r,""):ot).trim()).length)>1)switch(0===S&&(45===(v=ot.charCodeAt(0))||v>96&&v<123)&&(W=(ot=ot.replace(" ",":")).length),$>0&&void 0!==(c=nt(1,ot,e,t,B,N,ct.length,a,o,a))&&0===(W=(ot=c.trim()).length)&&(ot="\0\0"),v=ot.charCodeAt(0),m=ot.charCodeAt(1),v){case 0:break;case 64:if(105===m||99===m){lt+=ot+i.charAt(O);break}default:if(58===ot.charCodeAt(W-1))break;ct+=Q(ot,v,m,ot.charCodeAt(2))}C=0,j=0,S=0,D=0,U=0,ot="",b=i.charCodeAt(++O)}}switch(b){case 13:case 10:if(h+d+f+l+R===0)switch(E){case 41:case 39:case 34:case 64:case 126:case 62:case 42:case 43:case 47:case 45:case 58:case 44:case 59:case 123:case 125:break;default:S>0&&(j=1)}47===h?h=0:P+C===0&&107!==a&&ot.length>0&&(D=1,ot+="\0"),$*H>0&&nt(0,ot,e,t,B,N,ct.length,a,o,a),N=1,B++;break;case 59:case 125:if(h+d+f+l===0){N++;break}default:switch(N++,at=i.charAt(O),b){case 9:case 32:if(d+l+h===0)switch(x){case 44:case 58:case 9:case 32:at="";break;default:32!==b&&(at=" ")}break;case 0:at="\\0";break;case 12:at="\\f";break;case 11:at="\\v";break;case 38:d+h+l===0&&P>0&&(U=1,D=1,at="\f"+at);break;case 108:if(d+h+l+L===0&&S>0)switch(O-S){case 2:112===x&&58===i.charCodeAt(O-3)&&(L=x);case 8:111===k&&(L=k)}break;case 58:d+h+l===0&&(S=O);break;case 44:h+f+d+l===0&&(D=1,at+="\r");break;case 34:case 39:0===h&&(d=d===b?0:0===d?b:d);break;case 91:d+h+f===0&&l++;break;case 93:d+h+f===0&&l--;break;case 41:d+h+l===0&&f--;break;case 40:if(d+h+l===0){if(0===C)switch(2*x+3*k){case 533:break;default:T=0,C=1}f++}break;case 64:h+f+d+l+S+A===0&&(A=1);break;case 42:case 47:if(d+l+f>0)break;switch(h){case 0:switch(2*b+3*i.charCodeAt(O+1)){case 235:h=47;break;case 220:W=O,h=42}break;case 42:47===b&&42===x&&W+2!==O&&(33===i.charCodeAt(W+2)&&(ct+=i.substring(W,O+1)),at="",h=0)}}if(0===h){if(P+d+l+A===0&&107!==a&&59!==b)switch(b){case 44:case 126:case 62:case 43:case 41:case 40:if(0===C){switch(x){case 9:case 32:case 10:case 13:at+="\0";break;default:at="\0"+at+(44===b?"":"\0")}D=1}else switch(b){case 40:S+7===O&&108===x&&(S=0),C=++T;break;case 41:0==(C=--T)&&(D=1,at+="\0")}break;case 9:case 32:switch(x){case 0:case 123:case 125:case 59:case 44:case 12:case 9:case 32:case 10:case 13:break;default:0===C&&(D=1,at+="\0")}}ot+=at,32!==b&&9!==b&&(E=b)}}k=x,x=b,O++}if(W=ct.length,Y>0&&0===W&&0===ut.length&&0===e[0].length==0&&(109!==a||1===e.length&&(P>0?q:X)===e[0])&&(W=e.join(",").length+2),W>0){if(s=0===P&&107!==a?function(t){for(var e,n,i=0,a=t.length,o=Array(a);i1)){if(f=c.charCodeAt(c.length-1),d=n.charCodeAt(0),e="",0!==l)switch(f){case 42:case 126:case 62:case 43:case 32:case 40:break;default:e=" "}switch(d){case 38:n=e+q;case 126:case 62:case 43:case 32:case 41:case 40:break;case 91:n=e+n+q;break;case 58:switch(2*n.charCodeAt(1)+3*n.charCodeAt(2)){case 530:if(F>0){n=e+n.substring(8,h-1);break}default:(l<1||s[l-1].length<1)&&(n=e+q+n)}break;case 44:e="";default:n=h>1&&n.indexOf(":")>0?e+n.replace(_,"$1"+q+"$2"):e+n+q}c+=n}o[i]=c.replace(r,"").trim()}return o}(e):e,$>0&&void 0!==(c=nt(2,ct,s,t,B,N,W,a,o,a))&&0===(ct=c).length)return lt+ct+ut;if(ct=s.join(",")+"{"+ct+"}",I*L!=0){switch(2!==I||tt(ct,2)||(L=0),L){case 111:ct=ct.replace(g,":-moz-$1")+ct;break;case 112:ct=ct.replace(y,"::-webkit-input-$1")+ct.replace(y,"::-moz-$1")+ct.replace(y,":-ms-input-$1")+ct}L=0}}return lt+ct+ut}function J(t,e,n){var r=e.trim().split(l),i=r,a=r.length,o=t.length;switch(o){case 0:case 1:for(var s=0,c=0===o?"":t[0]+" ";s0&&P>0)return i.replace(f,"$1").replace(h,"$1"+X);break;default:return t.trim()+i.replace(h,"$1"+t.trim())}default:if(n*P>0&&i.indexOf("\f")>0)return i.replace(h,(58===t.charCodeAt(0)?"":"$1")+t.trim())}return t+i}function Q(t,e,n,r){var u,l=0,h=t+";",f=2*e+3*n+4*r;if(944===f)return function(t){var e=t.length,n=t.indexOf(":",9)+1,r=t.substring(0,n).trim(),i=t.substring(n,e-1).trim();switch(t.charCodeAt(9)*V){case 0:break;case 45:if(110!==t.charCodeAt(10))break;default:var a=i.split((i="",s)),o=0;for(n=0,e=a.length;o64&&h<90||h>96&&h<123||95===h||45===h&&45!==u.charCodeAt(1)))switch(isNaN(parseFloat(u))+(-1!==u.indexOf("("))){case 1:switch(u){case"infinite":case"alternate":case"backwards":case"running":case"normal":case"forwards":case"both":case"none":case"linear":case"ease":case"ease-in":case"ease-out":case"ease-in-out":case"paused":case"reverse":case"alternate-reverse":case"inherit":case"initial":case"unset":case"step-start":case"step-end":break;default:u+=G}}l[n++]=u}i+=(0===o?"":",")+l.join(" ")}}return i=r+i+";",1===I||2===I&&tt(i,1)?M+i+i:i}(h);if(0===I||2===I&&!tt(h,1))return h;switch(f){case 1015:return 97===h.charCodeAt(10)?M+h+h:h;case 951:return 116===h.charCodeAt(3)?M+h+h:h;case 963:return 110===h.charCodeAt(5)?M+h+h:h;case 1009:if(100!==h.charCodeAt(4))break;case 969:case 942:return M+h+h;case 978:return M+h+O+h+h;case 1019:case 983:return M+h+O+h+D+h+h;case 883:return 45===h.charCodeAt(8)?M+h+h:h.indexOf("image-set(",11)>0?h.replace(S,"$1-webkit-$2")+h:h;case 932:if(45===h.charCodeAt(4))switch(h.charCodeAt(5)){case 103:return M+"box-"+h.replace("-grow","")+M+h+D+h.replace("grow","positive")+h;case 115:return M+h+D+h.replace("shrink","negative")+h;case 98:return M+h+D+h.replace("basis","preferred-size")+h}return M+h+D+h+h;case 964:return M+h+D+"flex-"+h+h;case 1023:if(99!==h.charCodeAt(8))break;return u=h.substring(h.indexOf(":",15)).replace("flex-","").replace("space-between","justify"),M+"box-pack"+u+M+h+D+"flex-pack"+u+h;case 1005:return a.test(h)?h.replace(i,":"+M)+h.replace(i,":"+O)+h:h;case 1e3:switch(l=(u=h.substring(13).trim()).indexOf("-")+1,u.charCodeAt(0)+u.charCodeAt(l)){case 226:u=h.replace(k,"tb");break;case 232:u=h.replace(k,"tb-rl");break;case 220:u=h.replace(k,"lr");break;default:return h}return M+h+D+u+h;case 1017:if(-1===h.indexOf("sticky",9))return h;case 975:switch(l=(h=t).length-10,f=(u=(33===h.charCodeAt(l)?h.substring(0,l):h).substring(t.indexOf(":",7)+1).trim()).charCodeAt(0)+(0|u.charCodeAt(7))){case 203:if(u.charCodeAt(8)<111)break;case 115:h=h.replace(u,M+u)+";"+h;break;case 207:case 102:h=h.replace(u,M+(f>102?"inline-":"")+"box")+";"+h.replace(u,M+u)+";"+h.replace(u,D+u+"box")+";"+h}return h+";";case 938:if(45===h.charCodeAt(5))switch(h.charCodeAt(6)){case 105:return u=h.replace("-items",""),M+h+M+"box-"+u+D+"flex-"+u+h;case 115:return M+h+D+"flex-item-"+h.replace(T,"")+h;default:return M+h+D+"flex-line-pack"+h.replace("align-content","").replace(T,"")+h}break;case 973:case 989:if(45!==h.charCodeAt(3)||122===h.charCodeAt(4))break;case 931:case 953:if(!0===A.test(t))return 115===(u=t.substring(t.indexOf(":")+1)).charCodeAt(0)?Q(t.replace("stretch","fill-available"),e,n,r).replace(":fill-available",":stretch"):h.replace(u,M+u)+h.replace(u,O+u.replace("fill-",""))+h;break;case 962:if(h=M+h+(102===h.charCodeAt(5)?D+h:"")+h,n+r===211&&105===h.charCodeAt(13)&&h.indexOf("transform",10)>0)return h.substring(0,h.indexOf(";",27)+1).replace(o,"$1-webkit-$2")+h}return h}function tt(t,e){var n=t.indexOf(1===e?":":"{"),r=t.substring(0,3!==e?n:10),i=t.substring(n+1,t.length-1);return W(2!==e?r:r.replace(C,"$1"),i,e)}function et(t,e){var n=Q(e,e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2));return n!==e+";"?n.replace(E," or ($1)").substring(4):"("+e+")"}function nt(t,e,n,r,i,a,o,s,c,u){for(var l,h=0,f=e;h<$;++h)switch(l=U[h].call(at,t,f,n,r,i,a,o,s,c,u)){case void 0:case!1:case!0:case null:break;default:f=l}if(f!==e)return f}function rt(t,e,n,r){for(var i=e+1;i0&&(G=i.replace(d,91===a?"":"-")),a=1,1===P?X=i:q=i;var o,s=[X];$>0&&void 0!==(o=nt(-1,n,s,s,B,N,0,0,0,0))&&"string"==typeof o&&(n=o);var c=Z(z,s,n,0,0);return $>0&&void 0!==(o=nt(-2,c,s,s,B,N,c.length,0,0,0))&&"string"!=typeof(c=o)&&(a=0),G="",X="",q="",L=0,B=1,N=1,j*a==0?c:function(t){return t.replace(r,"").replace(v,"").replace(m,"$1").replace(b,"$1").replace(x," ")}(c)}return at.use=function t(e){switch(e){case void 0:case null:$=U.length=0;break;default:if("function"==typeof e)U[$++]=e;else if("object"==typeof e)for(var n=0,r=e.length;n=255?255:t<0?0:t},g:function(t){return t>=255?255:t<0?0:t},b:function(t){return t>=255?255:t<0?0:t},h:function(t){return t%360},s:function(t){return t>=100?100:t<0?0:t},l:function(t){return t>=100?100:t<0?0:t},a:function(t){return t>=1?1:t<0?0:t}},toLinear:function(t){var e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:function(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t},hsl2rgb:function(t,e){var n=t.h,i=t.s,a=t.l;if(100===i)return 2.55*a;n/=360,i/=100;var o=(a/=100)<.5?a*(1+i):a+i-a*i,s=2*a-o;switch(e){case"r":return 255*r.hue2rgb(s,o,n+1/3);case"g":return 255*r.hue2rgb(s,o,n);case"b":return 255*r.hue2rgb(s,o,n-1/3)}},rgb2hsl:function(t,e){var n=t.r,r=t.g,i=t.b;n/=255,r/=255,i/=255;var a=Math.max(n,r,i),o=Math.min(n,r,i),s=(a+o)/2;if("l"===e)return 100*s;if(a===o)return 0;var c=a-o;if("s"===e)return 100*(s>.5?c/(2-a-o):c/(a+o));switch(a){case n:return 60*((r-i)/c+(r1?e:"0"+e},dec2hex:function(t){var e=Math.round(t).toString(16);return e.length>1?e:"0"+e}};e.default=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(75),a=n(177),o=function(){function t(t,e){this.color=e,this.changed=!1,this.data=t,this.type=new a.default}return t.prototype.set=function(t,e){return this.color=e,this.changed=!1,this.data=t,this.type.type=i.TYPE.ALL,this},t.prototype._ensureHSL=function(){void 0===this.data.h&&(this.data.h=r.default.channel.rgb2hsl(this.data,"h")),void 0===this.data.s&&(this.data.s=r.default.channel.rgb2hsl(this.data,"s")),void 0===this.data.l&&(this.data.l=r.default.channel.rgb2hsl(this.data,"l"))},t.prototype._ensureRGB=function(){void 0===this.data.r&&(this.data.r=r.default.channel.hsl2rgb(this.data,"r")),void 0===this.data.g&&(this.data.g=r.default.channel.hsl2rgb(this.data,"g")),void 0===this.data.b&&(this.data.b=r.default.channel.hsl2rgb(this.data,"b"))},Object.defineProperty(t.prototype,"r",{get:function(){return this.type.is(i.TYPE.HSL)||void 0===this.data.r?(this._ensureHSL(),r.default.channel.hsl2rgb(this.data,"r")):this.data.r},set:function(t){this.type.set(i.TYPE.RGB),this.changed=!0,this.data.r=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"g",{get:function(){return this.type.is(i.TYPE.HSL)||void 0===this.data.g?(this._ensureHSL(),r.default.channel.hsl2rgb(this.data,"g")):this.data.g},set:function(t){this.type.set(i.TYPE.RGB),this.changed=!0,this.data.g=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"b",{get:function(){return this.type.is(i.TYPE.HSL)||void 0===this.data.b?(this._ensureHSL(),r.default.channel.hsl2rgb(this.data,"b")):this.data.b},set:function(t){this.type.set(i.TYPE.RGB),this.changed=!0,this.data.b=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"h",{get:function(){return this.type.is(i.TYPE.RGB)||void 0===this.data.h?(this._ensureRGB(),r.default.channel.rgb2hsl(this.data,"h")):this.data.h},set:function(t){this.type.set(i.TYPE.HSL),this.changed=!0,this.data.h=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"s",{get:function(){return this.type.is(i.TYPE.RGB)||void 0===this.data.s?(this._ensureRGB(),r.default.channel.rgb2hsl(this.data,"s")):this.data.s},set:function(t){this.type.set(i.TYPE.HSL),this.changed=!0,this.data.s=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"l",{get:function(){return this.type.is(i.TYPE.RGB)||void 0===this.data.l?(this._ensureRGB(),r.default.channel.rgb2hsl(this.data,"l")):this.data.l},set:function(t){this.type.set(i.TYPE.HSL),this.changed=!0,this.data.l=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"a",{get:function(){return this.data.a},set:function(t){this.changed=!0,this.data.a=t},enumerable:!0,configurable:!0}),t}();e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(75),i=function(){function t(){this.type=r.TYPE.ALL}return t.prototype.get=function(){return this.type},t.prototype.set=function(t){if(this.type&&this.type!==t)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=t},t.prototype.reset=function(){this.type=r.TYPE.ALL},t.prototype.is=function(t){return this.type===t},t}();e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i={};e.DEC2HEX=i;for(var a=0;a<=255;a++)i[a]=r.default.unit.dec2hex(a)},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(99),i={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:function(t){t=t.toLowerCase();var e=i.colors[t];if(e)return r.default.parse(e)},stringify:function(t){var e=r.default.stringify(t);for(var n in i.colors)if(i.colors[n]===e)return n}};e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(45),a={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:function(t){var e=t.charCodeAt(0);if(114===e||82===e){var n=t.match(a.re);if(n){var o=n[1],s=n[2],c=n[3],u=n[4],l=n[5],h=n[6],f=n[7],d=n[8];return i.default.set({r:r.default.channel.clamp.r(s?2.55*parseFloat(o):parseFloat(o)),g:r.default.channel.clamp.g(u?2.55*parseFloat(c):parseFloat(c)),b:r.default.channel.clamp.b(h?2.55*parseFloat(l):parseFloat(l)),a:f?r.default.channel.clamp.a(d?parseFloat(f)/100:parseFloat(f)):1},t)}}},stringify:function(t){return t.a<1?"rgba("+r.default.lang.round(t.r)+", "+r.default.lang.round(t.g)+", "+r.default.lang.round(t.b)+", "+r.default.lang.round(t.a)+")":"rgb("+r.default.lang.round(t.r)+", "+r.default.lang.round(t.g)+", "+r.default.lang.round(t.b)+")"}};e.default=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(45),a={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:function(t){var e=t.match(a.hueRe);if(e){var n=e[1];switch(e[2]){case"grad":return r.default.channel.clamp.h(.9*parseFloat(n));case"rad":return r.default.channel.clamp.h(180*parseFloat(n)/Math.PI);case"turn":return r.default.channel.clamp.h(360*parseFloat(n))}}return r.default.channel.clamp.h(parseFloat(t))},parse:function(t){var e=t.charCodeAt(0);if(104===e||72===e){var n=t.match(a.re);if(n){var o=n[1],s=n[2],c=n[3],u=n[4],l=n[5];return i.default.set({h:a._hue2deg(o),s:r.default.channel.clamp.s(parseFloat(s)),l:r.default.channel.clamp.l(parseFloat(c)),a:u?r.default.channel.clamp.a(l?parseFloat(u)/100:parseFloat(u)):1},t)}}},stringify:function(t){return t.a<1?"hsla("+r.default.lang.round(t.h)+", "+r.default.lang.round(t.s)+"%, "+r.default.lang.round(t.l)+"%, "+t.a+")":"hsl("+r.default.lang.round(t.h)+", "+r.default.lang.round(t.s)+"%, "+r.default.lang.round(t.l)+"%)"}};e.default=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"r")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"g")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"b")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"h")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"s")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(29);e.default=function(t){return r.default(t,"l")}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(103);e.default=function(t){return!r.default(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(15);e.default=function(t){try{return r.default.parse(t),!0}catch(t){return!1}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t,e){return r.default(t,"s",e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t,e){return r.default(t,"s",-e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t,e){return r.default(t,"l",e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t,e){return r.default(t,"l",-e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(32);e.default=function(t){return r.default(t,"h",180)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(52);e.default=function(t){return r.default(t,{s:0})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(15),i=n(107);e.default=function(t,e){void 0===e&&(e=100);var n=r.default.parse(t);return n.r=255-n.r,n.g=255-n.g,n.b=255-n.b,i.default(n,t,e)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(9),i=n(15),a=n(106);e.default=function(t,e){var n,o,s,c=i.default.parse(t),u={};for(var l in e)u[l]=(n=c[l],o=e[l],s=r.default.channel.max[l],o>0?(s-n)*o/100:n*o/100);return a.default(t,u)}},function(t,e,n){t.exports={Graph:n(76),version:n(300)}},function(t,e,n){var r=n(108);t.exports=function(t){return r(t,4)}},function(t,e){t.exports=function(){this.__data__=[],this.size=0}},function(t,e,n){var r=n(55),i=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0)&&(n==e.length-1?e.pop():i.call(e,n,1),--this.size,!0)}},function(t,e,n){var r=n(55);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},function(t,e,n){var r=n(55);t.exports=function(t){return r(this.__data__,t)>-1}},function(t,e,n){var r=n(55);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},function(t,e,n){var r=n(54);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(54),i=n(77),a=n(78);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var o=n.__data__;if(!i||o.length<199)return o.push([t,e]),this.size=++n.size,this;n=this.__data__=new a(o)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(37),i=n(214),a=n(11),o=n(110),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,h=u.hasOwnProperty,f=RegExp("^"+l.call(h).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!a(t)||i(t))&&(r(t)?f:s).test(o(t))}},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){var r=n(38),i=Object.prototype,a=i.hasOwnProperty,o=i.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=a.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var i=o.call(t);return r&&(e?t[s]=n:delete t[s]),i}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r,i=n(215),a=(r=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!a&&a in t}},function(t,e,n){var r=n(16)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(218),i=n(54),a=n(77);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||i),string:new r}}},function(t,e,n){var r=n(219),i=n(220),a=n(221),o=n(222),s=n(223);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(131),i=n(292),a=n(296),o=n(132),s=n(297),c=n(90);t.exports=function(t,e,n){var u=-1,l=i,h=t.length,f=!0,d=[],p=d;if(n)f=!1,l=a;else if(h>=200){var y=e?null:s(t);if(y)return c(y);f=!1,l=o,p=new r}else p=e?[]:d;t:for(;++u-1}},function(t,e,n){var r=n(145),i=n(294),a=n(295);t.exports=function(t,e,n){return e==e?a(t,e,n):r(t,i,n)}},function(t,e){t.exports=function(t){return t!=t}},function(t,e){t.exports=function(t,e,n){for(var r=n-1,i=t.length;++r1||1===e.length&&t.hasEdge(e[0],e[0])}))}},function(t,e,n){var r=n(10);t.exports=function(t,e,n){return function(t,e,n){var r={},i=t.nodes();return i.forEach((function(t){r[t]={},r[t][t]={distance:0},i.forEach((function(e){t!==e&&(r[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var i=n.v===t?n.w:n.v,a=e(n);r[t][i]={distance:a,predecessor:t}}))})),i.forEach((function(t){var e=r[t];i.forEach((function(n){var a=r[n];i.forEach((function(n){var r=a[t],i=e[n],o=a[n],s=r.distance+i.distance;s0;){if(n=c.removeMin(),r.has(s,n))o.setEdge(n,s[n]);else{if(l)throw new Error("Input graph is not connected: "+t);l=!0}t.nodeEdges(n).forEach(u)}return o}},function(t,e,n){var r;try{r=n(3)}catch(t){}r||(r=window.graphlib),t.exports=r},function(t,e,n){"use strict";var r=n(4),i=n(345),a=n(348),o=n(349),s=n(8).normalizeRanks,c=n(351),u=n(8).removeEmptyRanks,l=n(352),h=n(353),f=n(354),d=n(355),p=n(364),y=n(8),g=n(17).Graph;t.exports=function(t,e){var n=e&&e.debugTiming?y.time:y.notime;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(r.merge({},m,T(n,v),r.pick(n,b))),r.forEach(t.nodes(),(function(n){var i=C(t.node(n));e.setNode(n,r.defaults(T(i,x),_)),e.setParent(n,t.parent(n))})),r.forEach(t.edges(),(function(n){var i=C(t.edge(n));e.setEdge(n,r.merge({},w,T(i,k),r.pick(i,E)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,r.forEach(t.edges(),(function(n){var r=t.edge(n);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){r.forEach(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){i.run(t)})),e(" nestingGraph.run",(function(){l.run(t)})),e(" rank",(function(){o(y.asNonCompoundGraph(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var r=t.node(e.v),i={rank:(t.node(e.w).rank-r.rank)/2+r.rank,e:e};y.addDummyNode(t,"edge-proxy",i,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){u(t)})),e(" nestingGraph.cleanup",(function(){l.cleanup(t)})),e(" normalizeRanks",(function(){s(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;r.forEach(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=r.max(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){a.run(t)})),e(" parentDummyChains",(function(){c(t)})),e(" addBorderSegments",(function(){h(t)})),e(" order",(function(){d(t)})),e(" insertSelfEdges",(function(){!function(t){var e=y.buildLayerMatrix(t);r.forEach(e,(function(e){var n=0;r.forEach(e,(function(e,i){var a=t.node(e);a.order=i+n,r.forEach(a.selfEdges,(function(e){y.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:a.rank,order:i+ ++n,e:e.e,label:e.label},"_se")})),delete a.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){f.adjust(t)})),e(" position",(function(){p(t)})),e(" positionSelfEdges",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var r=t.node(n.e.v),i=r.x+r.width/2,a=r.y,o=n.x-i,s=r.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:i+2*o/3,y:a-s},{x:i+5*o/6,y:a-s},{x:i+o,y:a},{x:i+5*o/6,y:a+s},{x:i+2*o/3,y:a+s}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){r.forEach(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),a=t.node(n.borderBottom),o=t.node(r.last(n.borderLeft)),s=t.node(r.last(n.borderRight));n.width=Math.abs(s.x-o.x),n.height=Math.abs(a.y-i.y),n.x=o.x+n.width/2,n.y=i.y+n.height/2}})),r.forEach(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){a.undo(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(r.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){f.undo(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,a=0,o=t.graph(),s=o.marginx||0,c=o.marginy||0;function u(t){var r=t.x,o=t.y,s=t.width,c=t.height;e=Math.min(e,r-s/2),n=Math.max(n,r+s/2),i=Math.min(i,o-c/2),a=Math.max(a,o+c/2)}r.forEach(t.nodes(),(function(e){u(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.has(n,"x")&&u(n)})),e-=s,i-=c,r.forEach(t.nodes(),(function(n){var r=t.node(n);r.x-=e,r.y-=i})),r.forEach(t.edges(),(function(n){var a=t.edge(n);r.forEach(a.points,(function(t){t.x-=e,t.y-=i})),r.has(a,"x")&&(a.x-=e),r.has(a,"y")&&(a.y-=i)})),o.width=n-e+s,o.height=a-i+c}(t)})),e(" assignNodeIntersects",(function(){!function(t){r.forEach(t.edges(),(function(e){var n,r,i=t.edge(e),a=t.node(e.v),o=t.node(e.w);i.points?(n=i.points[0],r=i.points[i.points.length-1]):(i.points=[],n=o,r=a),i.points.unshift(y.intersectRect(a,n)),i.points.push(y.intersectRect(o,r))}))}(t)})),e(" reversePoints",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){i.undo(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){r.forEach(t.nodes(),(function(n){var r=t.node(n),i=e.node(n);r&&(r.x=i.x,r.y=i.y,e.children(n).length&&(r.width=i.width,r.height=i.height))})),r.forEach(t.edges(),(function(n){var i=t.edge(n),a=e.edge(n);i.points=a.points,r.has(a,"x")&&(i.x=a.x,i.y=a.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],m={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},b=["acyclicer","ranker","rankdir","align"],x=["width","height"],_={width:0,height:0},k=["minlen","weight","width","height","labeloffset"],w={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},E=["labelpos"];function T(t,e){return r.mapValues(r.pick(t,e),Number)}function C(t){var e={};return r.forEach(t,(function(t,n){e[n.toLowerCase()]=t})),e}},function(t,e,n){var r=n(108);t.exports=function(t){return r(t,5)}},function(t,e,n){var r=n(315)(n(316));t.exports=r},function(t,e,n){var r=n(25),i=n(24),a=n(30);t.exports=function(t){return function(e,n,o){var s=Object(e);if(!i(e)){var c=r(n,3);e=a(e),n=function(t){return c(s[t],t,s)}}var u=t(e,n,o);return u>-1?s[c?e[u]:u]:void 0}}},function(t,e,n){var r=n(145),i=n(25),a=n(317),o=Math.max;t.exports=function(t,e,n){var s=null==t?0:t.length;if(!s)return-1;var c=null==n?0:a(n);return c<0&&(c=o(s+c,0)),r(t,i(e,3),c)}},function(t,e,n){var r=n(155);t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},function(t,e,n){var r=n(11),i=n(42),a=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(i(t))return NaN;if(r(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=r(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(a,"");var n=s.test(t);return n||c.test(t)?u(t.slice(2),n?2:8):o.test(t)?NaN:+t}},function(t,e,n){var r=n(89),i=n(127),a=n(40);t.exports=function(t,e){return null==t?t:r(t,i(e),a)}},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){var r=n(59),i=n(88),a=n(25);t.exports=function(t,e){var n={};return e=a(e,3),i(t,(function(t,i,a){r(n,i,e(t,i,a))})),n}},function(t,e,n){var r=n(95),i=n(323),a=n(35);t.exports=function(t){return t&&t.length?r(t,a,i):void 0}},function(t,e){t.exports=function(t,e){return t>e}},function(t,e,n){var r=n(325),i=n(328)((function(t,e,n){r(t,e,n)}));t.exports=i},function(t,e,n){var r=n(53),i=n(157),a=n(89),o=n(326),s=n(11),c=n(40),u=n(159);t.exports=function t(e,n,l,h,f){e!==n&&a(n,(function(a,c){if(f||(f=new r),s(a))o(e,n,c,l,t,h,f);else{var d=h?h(u(e,c),a,c+"",e,n,f):void 0;void 0===d&&(d=a),i(e,c,d)}}),c)}},function(t,e,n){var r=n(157),i=n(114),a=n(123),o=n(115),s=n(124),c=n(47),u=n(5),l=n(146),h=n(39),f=n(37),d=n(11),p=n(158),y=n(48),g=n(159),v=n(327);t.exports=function(t,e,n,m,b,x,_){var k=g(t,n),w=g(e,n),E=_.get(w);if(E)r(t,n,E);else{var T=x?x(k,w,n+"",t,e,_):void 0,C=void 0===T;if(C){var A=u(w),S=!A&&h(w),M=!A&&!S&&y(w);T=w,A||S||M?u(k)?T=k:l(k)?T=o(k):S?(C=!1,T=i(w,!0)):M?(C=!1,T=a(w,!0)):T=[]:p(w)||c(w)?(T=k,c(k)?T=v(k):d(k)&&!f(k)||(T=s(w))):C=!1}C&&(_.set(w,T),b(T,w,m,x,_),_.delete(w)),r(t,n,T)}}},function(t,e,n){var r=n(46),i=n(40);t.exports=function(t){return r(t,i(t))}},function(t,e,n){var r=n(67),i=n(68);t.exports=function(t){return r((function(e,n){var r=-1,a=n.length,o=a>1?n[a-1]:void 0,s=a>2?n[2]:void 0;for(o=t.length>3&&"function"==typeof o?(a--,o):void 0,s&&i(n[0],n[1],s)&&(o=a<3?void 0:o,a=1),e=Object(e);++r1&&o(t,e[0],e[1])?e=[]:n>2&&o(e[0],e[1],e[2])&&(e=[e[0]]),i(t,r(e,1),[])}));t.exports=s},function(t,e,n){var r=n(66),i=n(25),a=n(141),o=n(340),s=n(61),c=n(341),u=n(35);t.exports=function(t,e,n){var l=-1;e=r(e.length?e:[u],s(i));var h=a(t,(function(t,n,i){return{criteria:r(e,(function(e){return e(t)})),index:++l,value:t}}));return o(h,(function(t,e){return c(t,e,n)}))}},function(t,e){t.exports=function(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t}},function(t,e,n){var r=n(342);t.exports=function(t,e,n){for(var i=-1,a=t.criteria,o=e.criteria,s=a.length,c=n.length;++i=c?u:u*("desc"==n[i]?-1:1)}return t.index-e.index}},function(t,e,n){var r=n(42);t.exports=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,a=t==t,o=r(t),s=void 0!==e,c=null===e,u=e==e,l=r(e);if(!c&&!l&&!o&&t>e||o&&s&&u&&!c&&!l||i&&s&&u||!n&&u||!a)return 1;if(!i&&!o&&!l&&t0;--c)if(r=e[c].dequeue()){i=i.concat(s(t,e,n,r,!0));break}}return i}(n.graph,n.buckets,n.zeroIdx);return r.flatten(r.map(u,(function(e){return t.outEdges(e.v,e.w)})),!0)};var o=r.constant(1);function s(t,e,n,i,a){var o=a?[]:void 0;return r.forEach(t.inEdges(i.v),(function(r){var i=t.edge(r),s=t.node(r.v);a&&o.push({v:r.v,w:r.w}),s.out-=i,c(e,n,s)})),r.forEach(t.outEdges(i.v),(function(r){var i=t.edge(r),a=r.w,o=t.node(a);o.in-=i,c(e,n,o)})),t.removeNode(i.v),o}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},function(t,e){function n(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function i(t,e){if("_next"!==t&&"_prev"!==t)return e}t.exports=n,n.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},n.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},n.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,i)),n=n._prev;return"["+t.join(", ")+"]"}},function(t,e,n){"use strict";var r=n(4),i=n(8);t.exports={run:function(t){t.graph().dummyChains=[],r.forEach(t.edges(),(function(e){!function(t,e){var n,r,a,o=e.v,s=t.node(o).rank,c=e.w,u=t.node(c).rank,l=e.name,h=t.edge(e),f=h.labelRank;if(u===s+1)return;for(t.removeEdge(e),a=0,++s;sc.lim&&(u=c,l=!0);var h=r.filter(e.edges(),(function(e){return l===m(t,t.node(e.v),u)&&l!==m(t,t.node(e.w),u)}));return r.minBy(h,(function(t){return a(e,t)}))}function v(t,e,n,i){var a=n.v,o=n.w;t.removeEdge(a,o),t.setEdge(i.v,i.w,{}),d(t),h(t,e),function(t,e){var n=r.find(t.nodes(),(function(t){return!e.node(t).parent})),i=s(t,n);i=i.slice(1),r.forEach(i,(function(n){var r=t.node(n).parent,i=e.edge(n,r),a=!1;i||(i=e.edge(r,n),a=!0),e.node(n).rank=e.node(r).rank+(a?i.minlen:-i.minlen)}))}(t,e)}function m(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}t.exports=l,l.initLowLimValues=d,l.initCutValues=h,l.calcCutValue=f,l.leaveEdge=y,l.enterEdge=g,l.exchangeEdges=v},function(t,e,n){var r=n(4);t.exports=function(t){var e=function(t){var e={},n=0;function i(a){var o=n;r.forEach(t.children(a),i),e[a]={low:o,lim:n++}}return r.forEach(t.children(),i),e}(t);r.forEach(t.graph().dummyChains,(function(n){for(var r=t.node(n),i=r.edgeObj,a=function(t,e,n,r){var i,a,o=[],s=[],c=Math.min(e[n].low,e[r].low),u=Math.max(e[n].lim,e[r].lim);i=n;do{i=t.parent(i),o.push(i)}while(i&&(e[i].low>c||u>e[i].lim));a=i,i=r;for(;(i=t.parent(i))!==a;)s.push(i);return{path:o.concat(s.reverse()),lca:a}}(t,e,i.v,i.w),o=a.path,s=a.lca,c=0,u=o[c],l=!0;n!==i.w;){if(r=t.node(n),l){for(;(u=o[c])!==s&&t.node(u).maxRank=2),s=l.buildLayerMatrix(t);var g=a(t,s);g0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;u+=t.weight*n}))),u}t.exports=function(t,e){for(var n=0,r=1;r=t.barycenter)&&function(t,e){var n=0,r=0;t.weight&&(n+=t.barycenter*t.weight,r+=t.weight);e.weight&&(n+=e.barycenter*e.weight,r+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/r,t.weight=r,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function i(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var a=t.pop();e.push(a),r.forEach(a.in.reverse(),n(a)),r.forEach(a.out,i(a))}return r.map(r.filter(e,(function(t){return!t.merged})),(function(t){return r.pick(t,["vs","i","barycenter","weight"])}))}(r.filter(n,(function(t){return!t.indegree})))}},function(t,e,n){var r=n(4),i=n(8);function a(t,e,n){for(var i;e.length&&(i=r.last(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}t.exports=function(t,e){var n=i.partition(t,(function(t){return r.has(t,"barycenter")})),o=n.lhs,s=r.sortBy(n.rhs,(function(t){return-t.i})),c=[],u=0,l=0,h=0;o.sort((f=!!e,function(t,e){return t.barycentere.barycenter?1:f?e.i-t.i:t.i-e.i})),h=a(c,s,h),r.forEach(o,(function(t){h+=t.vs.length,c.push(t.vs),u+=t.barycenter*t.weight,l+=t.weight,h=a(c,s,h)}));var f;var d={vs:r.flatten(c,!0)};l&&(d.barycenter=u/l,d.weight=l);return d}},function(t,e,n){var r=n(4),i=n(17).Graph;t.exports=function(t,e,n){var a=function(t){var e;for(;t.hasNode(e=r.uniqueId("_root")););return e}(t),o=new i({compound:!0}).setGraph({root:a}).setDefaultNodeLabel((function(e){return t.node(e)}));return r.forEach(t.nodes(),(function(i){var s=t.node(i),c=t.parent(i);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(o.setNode(i),o.setParent(i,c||a),r.forEach(t[n](i),(function(e){var n=e.v===i?e.w:e.v,a=o.edge(n,i),s=r.isUndefined(a)?0:a.weight;o.setEdge(n,i,{weight:t.edge(e).weight+s})})),r.has(s,"minRank")&&o.setNode(i,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))})),o}},function(t,e,n){var r=n(4);t.exports=function(t,e,n){var i,a={};r.forEach(n,(function(n){for(var r,o,s=t.parent(n);s;){if((r=t.parent(s))?(o=a[r],a[r]=s):(o=i,i=s),o&&o!==s)return void e.setEdge(o,s);s=r}}))}},function(t,e,n){"use strict";var r=n(4),i=n(8),a=n(365).positionX;t.exports=function(t){(function(t){var e=i.buildLayerMatrix(t),n=t.graph().ranksep,a=0;r.forEach(e,(function(e){var i=r.max(r.map(e,(function(e){return t.node(e).height})));r.forEach(e,(function(e){t.node(e).y=a+i/2})),a+=i+n}))})(t=i.asNonCompoundGraph(t)),r.forEach(a(t),(function(e,n){t.node(n).x=e}))}},function(t,e,n){"use strict";var r=n(4),i=n(17).Graph,a=n(8);function o(t,e){var n={};return r.reduce(e,(function(e,i){var a=0,o=0,s=e.length,u=r.last(i);return r.forEach(i,(function(e,l){var h=function(t,e){if(t.node(e).dummy)return r.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),f=h?t.node(h).order:s;(h||e===u)&&(r.forEach(i.slice(o,l+1),(function(e){r.forEach(t.predecessors(e),(function(r){var i=t.node(r),o=i.order;!(os)&&c(n,e,u)}))}))}return r.reduce(e,(function(e,n){var a,o=-1,s=0;return r.forEach(n,(function(r,c){if("border"===t.node(r).dummy){var u=t.predecessors(r);u.length&&(a=t.node(u[0]).order,i(n,s,c,o,a),s=c,o=a)}i(n,s,n.length,a,e.length)})),n})),n}function c(t,e,n){if(e>n){var r=e;e=n,n=r}var i=t[e];i||(t[e]=i={}),i[n]=!0}function u(t,e,n){if(e>n){var i=e;e=n,n=i}return r.has(t[e],n)}function l(t,e,n,i){var a={},o={},s={};return r.forEach(e,(function(t){r.forEach(t,(function(t,e){a[t]=t,o[t]=t,s[t]=e}))})),r.forEach(e,(function(t){var e=-1;r.forEach(t,(function(t){var c=i(t);if(c.length)for(var l=((c=r.sortBy(c,(function(t){return s[t]}))).length-1)/2,h=Math.floor(l),f=Math.ceil(l);h<=f;++h){var d=c[h];o[t]===t&&e0}t.exports=function(t,e,r,i){var a,o,s,c,u,l,h,f,d,p,y,g,v;if(a=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,d=a*r.x+s*r.y+u,p=a*i.x+s*i.y+u,0!==d&&0!==p&&n(d,p))return;if(o=i.y-r.y,c=r.x-i.x,l=i.x*r.y-r.x*i.y,h=o*t.x+c*t.y+l,f=o*e.x+c*e.y+l,0!==h&&0!==f&&n(h,f))return;if(0===(y=a*c-o*s))return;return g=Math.abs(y/2),{x:(v=s*l-c*u)<0?(v-g)/y:(v+g)/y,y:(v=o*u-a*l)<0?(v-g)/y:(v+g)/y}}},function(t,e,n){var r=n(43),i=n(31),a=n(153).layout;t.exports=function(){var t=n(371),e=n(374),i=n(375),u=n(376),l=n(377),h=n(378),f=n(379),d=n(380),p=n(381),y=function(n,y){!function(t){t.nodes().forEach((function(e){var n=t.node(e);r.has(n,"label")||t.children(e).length||(n.label=e),r.has(n,"paddingX")&&r.defaults(n,{paddingLeft:n.paddingX,paddingRight:n.paddingX}),r.has(n,"paddingY")&&r.defaults(n,{paddingTop:n.paddingY,paddingBottom:n.paddingY}),r.has(n,"padding")&&r.defaults(n,{paddingLeft:n.padding,paddingRight:n.padding,paddingTop:n.padding,paddingBottom:n.padding}),r.defaults(n,o),r.each(["paddingLeft","paddingRight","paddingTop","paddingBottom"],(function(t){n[t]=Number(n[t])})),r.has(n,"width")&&(n._prevWidth=n.width),r.has(n,"height")&&(n._prevHeight=n.height)})),t.edges().forEach((function(e){var n=t.edge(e);r.has(n,"label")||(n.label=""),r.defaults(n,s)}))}(y);var g=c(n,"output"),v=c(g,"clusters"),m=c(g,"edgePaths"),b=i(c(g,"edgeLabels"),y),x=t(c(g,"nodes"),y,d);a(y),l(x,y),h(b,y),u(m,y,p);var _=e(v,y);f(_,y),function(t){r.each(t.nodes(),(function(e){var n=t.node(e);r.has(n,"_prevWidth")?n.width=n._prevWidth:delete n.width,r.has(n,"_prevHeight")?n.height=n._prevHeight:delete n.height,delete n._prevWidth,delete n._prevHeight}))}(y)};return y.createNodes=function(e){return arguments.length?(t=e,y):t},y.createClusters=function(t){return arguments.length?(e=t,y):e},y.createEdgeLabels=function(t){return arguments.length?(i=t,y):i},y.createEdgePaths=function(t){return arguments.length?(u=t,y):u},y.shapes=function(t){return arguments.length?(d=t,y):d},y.arrows=function(t){return arguments.length?(p=t,y):p},y};var o={paddingLeft:10,paddingRight:10,paddingTop:10,paddingBottom:10,rx:0,ry:0,shape:"rect"},s={arrowhead:"normal",curve:i.curveLinear};function c(t,e){var n=t.select("g."+e);return n.empty()&&(n=t.append("g").attr("class",e)),n}},function(t,e,n){"use strict";var r=n(43),i=n(97),a=n(12),o=n(31);t.exports=function(t,e,n){var s,c=e.nodes().filter((function(t){return!a.isSubgraph(e,t)})),u=t.selectAll("g.node").data(c,(function(t){return t})).classed("update",!0);u.exit().remove(),u.enter().append("g").attr("class","node").style("opacity",0),(u=t.selectAll("g.node")).each((function(t){var s=e.node(t),c=o.select(this);a.applyClass(c,s.class,(c.classed("update")?"update ":"")+"node"),c.select("g.label").remove();var u=c.append("g").attr("class","label"),l=i(u,s),h=n[s.shape],f=r.pick(l.node().getBBox(),"width","height");s.elem=this,s.id&&c.attr("id",s.id),s.labelId&&u.attr("id",s.labelId),r.has(s,"width")&&(f.width=s.width),r.has(s,"height")&&(f.height=s.height),f.width+=s.paddingLeft+s.paddingRight,f.height+=s.paddingTop+s.paddingBottom,u.attr("transform","translate("+(s.paddingLeft-s.paddingRight)/2+","+(s.paddingTop-s.paddingBottom)/2+")");var d=o.select(this);d.select(".label-container").remove();var p=h(d,f,s).classed("label-container",!0);a.applyStyle(p,s.style);var y=p.node().getBBox();s.width=y.width,s.height=y.height})),s=u.exit?u.exit():u.selectAll(null);return a.applyTransition(s,e).style("opacity",0).remove(),u}},function(t,e,n){var r=n(12);t.exports=function(t,e){for(var n=t.append("text"),i=function(t){for(var e,n="",r=!1,i=0;i0&&void 0!==arguments[0]?arguments[0]:"fatal";isNaN(t)&&(t=t.toLowerCase(),void 0!==s[t]&&(t=s[t])),c.trace=function(){},c.debug=function(){},c.info=function(){},c.warn=function(){},c.error=function(){},c.fatal=function(){},t<=s.fatal&&(c.fatal=console.error?console.error.bind(console,l("FATAL"),"color: orange"):console.log.bind(console,"",l("FATAL"))),t<=s.error&&(c.error=console.error?console.error.bind(console,l("ERROR"),"color: orange"):console.log.bind(console,"",l("ERROR"))),t<=s.warn&&(c.warn=console.warn?console.warn.bind(console,l("WARN"),"color: orange"):console.log.bind(console,"",l("WARN"))),t<=s.info&&(c.info=console.info?console.info.bind(console,l("INFO"),"color: lightblue"):console.log.bind(console,"",l("INFO"))),t<=s.debug&&(c.debug=console.debug?console.debug.bind(console,l("DEBUG"),"color: lightgreen"):console.log.bind(console,"",l("DEBUG")))},l=function(t){var e=o()().format("ss.SSS");return"%c".concat(e," : ").concat(t," : ")},h=n(169),f=n.n(h),d=n(0),p=n(44),y=n(70),g=function(t){for(var e="",n=0;n>=0;){if(!((n=t.indexOf("=0)){e+=t,n=-1;break}e+=t.substr(0,n),(n=(t=t.substr(n+1)).indexOf("<\/script>"))>=0&&(n+=9,t=t.substr(n))}return e},v=//gi,m=function(t){return t.replace(v,"#br#")},b=function(t){return t.replace(/#br#/g,"
        ")},x={getRows:function(t){if(!t)return 1;var e=m(t);return(e=e.replace(/\\n/g,"#br#")).split("#br#")},sanitizeText:function(t,e){var n=t,r=!0;if(!e.flowchart||!1!==e.flowchart.htmlLabels&&"false"!==e.flowchart.htmlLabels||(r=!1),r){var i=e.securityLevel;"antiscript"===i?n=g(n):"loose"!==i&&(n=(n=(n=m(n)).replace(//g,">")).replace(/=/g,"="),n=b(n))}return n},hasBreaks:function(t){return//gi.test(t)},splitBreaks:function(t){return t.split(//gi)},lineBreakRegex:v,removeScript:g};function _(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;try{var n=new RegExp("[%]{2}(?![{]".concat(C.source,")(?=[}][%]{2}).*\n"),"ig");t=t.trim().replace(n,"").replace(/'/gm,'"'),c.debug("Detecting diagram directive".concat(null!==e?" type:"+e:""," based on the text:").concat(t));for(var r,i=[];null!==(r=T.exec(t));)if(r.index===T.lastIndex&&T.lastIndex++,r&&!e||e&&r[1]&&r[1].match(e)||e&&r[2]&&r[2].match(e)){var a=r[1]?r[1]:r[2],o=r[3]?r[3].trim():r[4]?JSON.parse(r[4].trim()):null;i.push({type:a,args:o})}return 0===i.length&&i.push({type:t,args:null}),1===i.length?i[0]:i}catch(n){return c.error("ERROR: ".concat(n.message," - Unable to parse directive").concat(null!==e?" type:"+e:""," based on the text:").concat(t)),{type:null,args:null}}},M=function(t){return t=t.replace(T,"").replace(A,"\n"),c.debug("Detecting diagram type based on the text "+t),t.match(/^\s*sequenceDiagram/)?"sequence":t.match(/^\s*gantt/)?"gantt":t.match(/^\s*classDiagram-v2/)?"classDiagram":t.match(/^\s*classDiagram/)?"class":t.match(/^\s*stateDiagram-v2/)?"stateDiagram":t.match(/^\s*stateDiagram/)?"state":t.match(/^\s*gitGraph/)?"git":t.match(/^\s*flowchart/)?"flowchart-v2":t.match(/^\s*info/)?"info":t.match(/^\s*pie/)?"pie":t.match(/^\s*erDiagram/)?"er":t.match(/^\s*journey/)?"journey":"flowchart"},O=function(t,e){var n={};return function(){for(var r=arguments.length,i=new Array(r),a=0;a"},n),x.lineBreakRegex.test(t))return t;var r=t.split(" "),i=[],a="";return r.forEach((function(t,o){var s=z("".concat(t," "),n),c=z(a,n);if(s>e){var u=Y(t,e,"-",n),l=u.hyphenatedStrings,h=u.remainingWord;i.push.apply(i,[a].concat(w(l))),a=h}else c+s>=e?(i.push(a),a=t):a=[a,t].filter(Boolean).join(" ");o+1===r.length&&i.push(a)})),i.filter((function(t){return""!==t})).join(n.joinWith)}),(function(t,e,n){return"".concat(t,"-").concat(e,"-").concat(n.fontSize,"-").concat(n.fontWeight,"-").concat(n.fontFamily,"-").concat(n.joinWith)})),Y=O((function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"-",r=arguments.length>3?arguments[3]:void 0;r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},r);var i=t.split(""),a=[],o="";return i.forEach((function(t,s){var c="".concat(o).concat(t);if(z(c,r)>=e){var u=s+1,l=i.length===u,h="".concat(c).concat(n);a.push(l?c:h),o=""}else o=c})),{hyphenatedStrings:a,remainingWord:o}}),(function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"-",r=arguments.length>3?arguments[3]:void 0;return"".concat(t,"-").concat(e,"-").concat(n,"-").concat(r.fontSize,"-").concat(r.fontWeight,"-").concat(r.fontFamily)})),z=function(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e),U(t,e).width},U=O((function(t,e){var n=e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e),r=n.fontSize,i=n.fontFamily,a=n.fontWeight;if(!t)return{width:0,height:0};var o=["sans-serif",i],s=t.split(x.lineBreakRegex),c=[],u=Object(d.select)("body");if(!u.remove)return{width:0,height:0,lineHeight:0};for(var l=u.append("svg"),h=0,f=o;hc[1].height&&c[0].width>c[1].width&&c[0].lineHeight>c[1].lineHeight?0:1]}),(function(t,e){return"".concat(t,"-").concat(e.fontSize,"-").concat(e.fontWeight,"-").concat(e.fontFamily)})),$=function(t,e,n){var r=new Map;return r.set("height",t),n?(r.set("width","100%"),r.set("style","max-width: ".concat(e,"px;"))):r.set("width",e),r},W=function(t,e,n,r){!function(t,e){var n=!0,r=!1,i=void 0;try{for(var a,o=e[Symbol.iterator]();!(n=(a=o.next()).done);n=!0){var s=a.value;t.attr(s[0],s[1])}}catch(t){r=!0,i=t}finally{try{n||null==o.return||o.return()}finally{if(r)throw i}}}(t,$(e,n,r))},H={assignWithDepth:F,wrapLabel:R,calculateTextHeight:function(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:15},e),U(t,e).height},calculateTextWidth:z,calculateTextDimensions:U,calculateSvgSizeAttrs:$,configureSvgSize:W,detectInit:function(t){var e=S(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(e)){var r=e.map((function(t){return t.args}));n=F(n,w(r))}else n=e.args;if(n){var i=M(t);["config"].forEach((function(t){void 0!==n[t]&&("flowchart-v2"===i&&(i="flowchart"),n[i]=n[t],delete n[t])}))}return n},detectDirective:S,detectType:M,isSubstringInArray:function(t,e){for(var n=0;n=1&&(i={x:t.x,y:t.y}),a>0&&a<1&&(i={x:(1-a)*e.x+a*t.x,y:(1-a)*e.y+a*t.y})}}e=t})),i}(t)},calcCardinalityPosition:function(t,e,n){var r;c.info("our points",e),e[0]!==n&&(e=e.reverse()),e.forEach((function(t){N(t,r),r=t}));var i,a=25;r=void 0,e.forEach((function(t){if(r&&!i){var e=N(t,r);if(e=1&&(i={x:t.x,y:t.y}),n>0&&n<1&&(i={x:(1-n)*r.x+n*t.x,y:(1-n)*r.y+n*t.y})}}r=t}));var o=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),u={x:0,y:0};return u.x=Math.sin(s)*o+(e[0].x+i.x)/2,u.y=-Math.cos(s)*o+(e[0].y+i.y)/2,u},calcTerminalLabelPosition:function(t,e,n){var r,i=JSON.parse(JSON.stringify(n));c.info("our points",i),"start_left"!==e&&"start_right"!==e&&(i=i.reverse()),i.forEach((function(t){N(t,r),r=t}));var a,o=25;r=void 0,i.forEach((function(t){if(r&&!a){var e=N(t,r);if(e=1&&(a={x:t.x,y:t.y}),n>0&&n<1&&(a={x:(1-n)*r.x+n*t.x,y:(1-n)*r.y+n*t.y})}}r=t}));var s=10,u=Math.atan2(i[0].y-a.y,i[0].x-a.x),l={x:0,y:0};return l.x=Math.sin(u)*s+(i[0].x+a.x)/2,l.y=-Math.cos(u)*s+(i[0].y+a.y)/2,"start_left"===e&&(l.x=Math.sin(u+Math.PI)*s+(i[0].x+a.x)/2,l.y=-Math.cos(u+Math.PI)*s+(i[0].y+a.y)/2),"end_right"===e&&(l.x=Math.sin(u-Math.PI)*s+(i[0].x+a.x)/2-5,l.y=-Math.cos(u-Math.PI)*s+(i[0].y+a.y)/2-5),"end_left"===e&&(l.x=Math.sin(u)*s+(i[0].x+a.x)/2-5,l.y=-Math.cos(u)*s+(i[0].y+a.y)/2-5),l},formatUrl:function(t,e){var n=t.trim();if(n)return"loose"!==e.securityLevel?Object(y.sanitizeUrl)(n):n},getStylesFromArray:B,generateId:P,random:I,memoize:O,runFunc:function(t){for(var e,n=t.split("."),r=n.length-1,i=n[r],a=window,o=0;o1?s-1:0),u=1;u=0&&(n=!0)})),n},qt=function(t,e){var n=[];return t.nodes.forEach((function(r,i){Gt(e,r)||n.push(t.nodes[i])})),{nodes:n}},Xt={parseDirective:function(t,e,n){Go.parseDirective(this,t,e,n)},defaultConfig:function(){return yt.flowchart},addVertex:function(t,e,n,r,i){var a,o=t;void 0!==o&&0!==o.trim().length&&(void 0===Dt[o]&&(Dt[o]={id:o,domId:"flowchart-"+o+"-"+Mt,styles:[],classes:[]}),Mt++,void 0!==e?(Ot=_t(),'"'===(a=x.sanitizeText(e.trim(),Ot))[0]&&'"'===a[a.length-1]&&(a=a.substring(1,a.length-1)),Dt[o].text=a):void 0===Dt[o].text&&(Dt[o].text=t),void 0!==n&&(Dt[o].type=n),null!=r&&r.forEach((function(t){Dt[o].styles.push(t)})),null!=i&&i.forEach((function(t){Dt[o].classes.push(t)})))},lookUpDomId:Yt,addLink:function(t,e,n,r){var i,a;for(i=0;i/)&&(At="LR"),At.match(/.*v/)&&(At="TB")},setClass:Ut,setTooltip:function(t,e){t.split(",").forEach((function(t){void 0!==e&&(It["gen-1"===St?Yt(t):t]=x.sanitizeText(e,Ot))}))},getTooltip:function(t){return It[t]},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){var r=Yt(t);if("loose"===_t().securityLevel&&void 0!==e){var i=[];if("string"==typeof n){i=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(var a=0;a=0)&&s.push(t))})),"gen-1"===St){c.warn("LOOKING UP");for(var l=0;l0&&function t(e,n){var r=Lt[n].nodes;if(!((Ht+=1)>2e3)){if(Vt[Ht]=n,Lt[n].id===e)return{result:!0,count:0};for(var i=0,a=1;i=0){var s=t(e,o);if(s.result)return{result:!0,count:a+s.count};a+=s.count}i+=1}return{result:!1,count:a}}}("none",Lt.length-1)},getSubGraphs:function(){return Lt},destructLink:function(t,e){var n,r=function(t){var e=t.trim(),n=e.slice(0,-1),r="arrow_open";switch(e.slice(-1)){case"x":r="arrow_cross","x"===e[0]&&(r="double_"+r,n=n.slice(1));break;case">":r="arrow_point","<"===e[0]&&(r="double_"+r,n=n.slice(1));break;case"o":r="arrow_circle","o"===e[0]&&(r="double_"+r,n=n.slice(1))}var i="normal",a=n.length-1;"="===n[0]&&(i="thick");var o=function(t,e){for(var n=e.length,r=0,i=0;in.height/2-a)){var o=a*a*(1-r*r/(i*i));0!=o&&(o=Math.sqrt(o)),o=a-o,t.y-n.y>0&&(o=-o),e.y+=o}return e},c}function de(t,e,n,r){return t.insert("polygon",":first-child").attr("points",r.map((function(t){return t.x+","+t.y})).join(" ")).attr("transform","translate("+-e/2+","+n/2+")")}var pe={addToRender:function(t){t.shapes().question=ne,t.shapes().hexagon=re,t.shapes().stadium=le,t.shapes().subroutine=he,t.shapes().cylinder=fe,t.shapes().rect_left_inv_arrow=ie,t.shapes().lean_right=ae,t.shapes().lean_left=oe,t.shapes().trapezoid=se,t.shapes().inv_trapezoid=ce,t.shapes().rect_right_inv_arrow=ue},addToRenderV2:function(t){t({question:ne}),t({hexagon:re}),t({stadium:le}),t({subroutine:he}),t({cylinder:fe}),t({rect_left_inv_arrow:ie}),t({lean_right:ae}),t({lean_left:oe}),t({trapezoid:se}),t({inv_trapezoid:ce}),t({rect_right_inv_arrow:ue})}},ye={},ge=function(t,e,n){var r=Object(d.select)('[id="'.concat(n,'"]'));Object.keys(t).forEach((function(n){var i=t[n],a="default";i.classes.length>0&&(a=i.classes.join(" "));var o,s=B(i.styles),u=void 0!==i.text?i.text:i.id;if(_t().flowchart.htmlLabels){var l={label:u.replace(/fa[lrsb]?:fa-[\w-]+/g,(function(t){return"")}))};(o=ee()(r,l).node()).parentNode.removeChild(o)}else{var h=document.createElementNS("http://www.w3.org/2000/svg","text");h.setAttribute("style",s.labelStyle.replace("color:","fill:"));for(var f=u.split(x.lineBreakRegex),d=0;d').concat(a.text.replace(/fa[lrsb]?:fa-[\w-]+/g,(function(t){return"")})),"")):(u.labelType="text",u.label=a.text.replace(x.lineBreakRegex,"\n"),void 0===a.style&&(u.style=u.style||"stroke: #333; stroke-width: 1.5px;fill:none"),u.labelStyle=u.labelStyle.replace("color:","fill:"))),u.id=o,u.class=s+" "+c,u.minlen=a.length||1,e.setEdge(Xt.lookUpDomId(a.start),Xt.lookUpDomId(a.end),u,i)}))},me=function(t){for(var e=Object.keys(t),n=0;n=0;h--)i=l[h],Xt.addVertex(i.id,i.title,"group",void 0,i.classes);var f=Xt.getVertices();c.warn("Get vertices",f);var p=Xt.getEdges(),y=0;for(y=l.length-1;y>=0;y--){i=l[y],Object(d.selectAll)("cluster").append("text");for(var g=0;g"),c.info("vertexText"+i),function(t){var e,n,r=Object(d.select)(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),i=r.append("xhtml:div"),a=t.label,o=t.isNode?"nodeLabel":"edgeLabel";return i.html('"+a+""),e=i,(n=t.labelStyle)&&e.attr("style",n),i.style("display","inline-block"),i.style("white-space","nowrap"),i.attr("xmlns","http://www.w3.org/1999/xhtml"),r.node()}({isNode:r,label:i.replace(/fa[lrsb]?:fa-[\w-]+/g,(function(t){return"")})),labelStyle:e.replace("fill:","color:")});var a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));var o=[];o="string"==typeof i?i.split(/\\n|\n|/gi):Array.isArray(i)?i:[];for(var s=0;s0)t(a,n,r,i);else{var o=n.node(a);c.info("cp ",a," to ",i," with parent ",e),r.setNode(a,o),i!==n.parent(a)&&(c.warn("Setting parent",a,n.parent(a)),r.setParent(a,n.parent(a))),e!==i&&a!==e?(c.debug("Setting parent",a,e),r.setParent(a,e)):(c.info("In copy ",e,"root",i,"data",n.node(e),i),c.debug("Not Setting parent for node=",a,"cluster!==rootId",e!==i,"node!==clusterId",a!==e));var s=n.edges(a);c.debug("Copying Edges",s),s.forEach((function(t){c.info("Edge",t);var a=n.edge(t.v,t.w,t.name);c.info("Edge data",a,i);try{!function(t,e){return c.info("Decendants of ",e," is ",Oe[e]),c.info("Edge is ",t),t.v!==e&&(t.w!==e&&(Oe[e]?(c.info("Here "),Oe[e].indexOf(t.v)>=0||(!!Ne(t.v,e)||(!!Ne(t.w,e)||Oe[e].indexOf(t.w)>=0))):(c.debug("Tilt, ",e,",not in decendants"),!1)))}(t,i)?c.info("Skipping copy of edge ",t.v,"--\x3e",t.w," rootId: ",i," clusterId:",e):(c.info("Copying as ",t.v,t.w,a,t.name),r.setEdge(t.v,t.w,a,t.name),c.info("newGraph edges ",r.edges(),r.edge(r.edges()[0])))}catch(t){c.error(t)}}))}c.debug("Removing node",a),n.removeNode(a)}))},Le=function t(e,n){c.trace("Searching",e);var r=n.children(e);if(c.trace("Searching children of id ",e,r),r.length<1)return c.trace("This is a valid node",e),e;for(var i=0;i ",a),a}},Pe=function(t){return Me[t]&&Me[t].externalConnections&&Me[t]?Me[t].id:t},Ie=function(t,e){!t||e>10?c.debug("Opting out, no graph "):(c.debug("Opting in, graph "),t.nodes().forEach((function(e){t.children(e).length>0&&(c.warn("Cluster identified",e," Replacement id in edges: ",Le(e,t)),Oe[e]=function t(e,n){for(var r=n.children(e),i=[].concat(r),a=0;a0?(c.debug("Cluster identified",e,Oe),r.forEach((function(t){t.v!==e&&t.w!==e&&(Ne(t.v,e)^Ne(t.w,e)&&(c.warn("Edge: ",t," leaves cluster ",e),c.warn("Decendants of XXX ",e,": ",Oe[e]),Me[e].externalConnections=!0))}))):c.debug("Not a cluster ",e,Oe)})),t.edges().forEach((function(e){var n=t.edge(e);c.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),c.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(t.edge(e)));var r=e.v,i=e.w;c.warn("Fix XXX",Me,"ids:",e.v,e.w,"Translateing: ",Me[e.v]," --- ",Me[e.w]),(Me[e.v]||Me[e.w])&&(c.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),r=Pe(e.v),i=Pe(e.w),t.removeEdge(e.v,e.w,e.name),r!==e.v&&(n.fromCluster=e.v),i!==e.w&&(n.toCluster=e.w),c.warn("Fix Replacing with XXX",r,i,e.name),t.setEdge(r,i,n,e.name))})),c.warn("Adjusted Graph",G.a.json.write(t)),Fe(t,0),c.trace(Me))},Fe=function t(e,n){if(c.warn("extractor - ",n,G.a.json.write(e),e.children("D")),n>10)c.error("Bailing out");else{for(var r=e.nodes(),i=!1,a=0;a0}if(i){c.debug("Nodes = ",r,n);for(var u=0;u0){c.warn("Cluster without external connections, without a parent and with children",l,n);var h=e.graph(),f=new G.a.Graph({multigraph:!0,compound:!0}).setGraph({rankdir:"TB"===h.rankdir?"LR":"TB",nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));c.warn("Old graph before copy",G.a.json.write(e)),Be(l,e,f,l),e.setNode(l,{clusterNode:!0,id:l,clusterData:Me[l].clusterData,labelText:Me[l].labelText,graph:f}),c.warn("New graph after copy node: (",l,")",G.a.json.write(f)),c.debug("Old graph after copy",G.a.json.write(e))}else c.warn("Cluster ** ",l," **not meeting the criteria !externalConnections:",!Me[l].externalConnections," no parent: ",!e.parent(l)," children ",e.children(l)&&e.children(l).length>0,e.children("D"),n),c.debug(Me);else c.debug("Not a cluster",l,n)}r=e.nodes(),c.warn("New list of nodes",r);for(var d=0;d0}var $e=function(t,e,n,r){var i,a,o,s,c,u,l,h,f,d,p,y,g;if(i=e.y-t.y,o=t.x-e.x,c=e.x*t.y-t.x*e.y,f=i*n.x+o*n.y+c,d=i*r.x+o*r.y+c,!(0!==f&&0!==d&&Ue(f,d)||(a=r.y-n.y,s=n.x-r.x,u=r.x*n.y-n.x*r.y,l=a*t.x+s*t.y+u,h=a*e.x+s*e.y+u,0!==l&&0!==h&&Ue(l,h)||0==(p=i*s-a*o))))return y=Math.abs(p/2),{x:(g=o*u-s*c)<0?(g-y)/p:(g+y)/p,y:(g=a*c-i*u)<0?(g-y)/p:(g+y)/p}},We=function(t,e,n){var r=t.x,i=t.y,a=[],o=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach((function(t){o=Math.min(o,t.x),s=Math.min(s,t.y)})):(o=Math.min(o,e.x),s=Math.min(s,e.y));for(var c=r-t.width/2-o,u=i-t.height/2-s,l=0;l1&&a.sort((function(t,e){var r=t.x-n.x,i=t.y-n.y,a=Math.sqrt(r*r+i*i),o=e.x-n.x,s=e.y-n.y,c=Math.sqrt(o*o+s*s);return aMath.abs(o)*u?(s<0&&(u=-u),n=0===s?0:u*o/s,r=u):(o<0&&(c=-c),n=c,r=0===o?0:c*s/o),{x:i+n,y:a+r}},Ve={node:n.n(Re).a,circle:ze,ellipse:Ye,polygon:We,rect:He},Ge=function(t,e){var n=Ce(t,e,"node "+e.classes,!0),r=n.shapeSvg,i=n.bbox,a=n.halfPadding;c.info("Classes = ",e.classes);var o=r.insert("rect",":first-child");return o.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Ae(e,o),e.intersect=function(t){return Ve.rect(e,t)},r};function qe(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e0){var r=t.split("~");n=r[0],e=r[1]}return{className:n,type:e}},tn=function(t){var e=Qe(t);void 0===Ze[e.className]&&(Ze[e.className]={id:e.className,type:e.type,cssClasses:[],methods:[],members:[],annotations:[],domId:"classid-"+e.className+"-"+Je},Je++)},en=function(t){for(var e=Object.keys(Ze),n=0;n>")?r.annotations.push(i.substring(2,i.length-2)):i.indexOf(")")>0?r.methods.push(i):i&&r.members.push(i)}},rn=function(t,e){t.split(",").forEach((function(t){var n=t;t[0].match(/\d/)&&(n="classid-"+n),void 0!==Ze[n]&&Ze[n].cssClasses.push(e)}))},an=function(t,e,n){var r=_t(),i=t,a=en(i);if("loose"===r.securityLevel&&void 0!==e&&void 0!==Ze[i]){var o=[];if("string"==typeof n){o=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(var s=0;s1&&a>i&&a<=t.length){var o="",s="",c=t.substring(0,1);c.match(/\w/)?s=t.substring(0,i).trim():(c.match(/\+|-|~|#/)&&(o=c),s=t.substring(1,i).trim());var u=t.substring(i+1,a),l=t.substring(a+1,1);n=gn(l),e=o+s+"("+yn(u.trim())+")",a<"".length&&""!==(r=t.substring(a+2).trim())&&(r=" : "+yn(r))}else e=yn(t);return{displayText:e,cssStyle:n}},pn=function(t,e,n,r){var i=ln(e),a=t.append("tspan").attr("x",r.padding).text(i.displayText);""!==i.cssStyle&&a.attr("style",i.cssStyle),n||a.attr("dy",r.textHeight)},yn=function t(e){var n=e;return-1!=e.indexOf("~")?t(n=(n=n.replace("~","<")).replace("~",">")):n},gn=function(t){switch(t){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}},vn=function(t,e,n){c.info("Rendering class "+e);var r,i=e.id,a={id:i,label:e.id,width:0,height:0},o=t.append("g").attr("id",en(i)).attr("class","classGroup");r=e.link?o.append("svg:a").attr("xlink:href",e.link).attr("target",e.linkTarget).append("text").attr("y",n.textHeight+n.padding).attr("x",0):o.append("text").attr("y",n.textHeight+n.padding).attr("x",0);var s=!0;e.annotations.forEach((function(t){var e=r.append("tspan").text("«"+t+"»");s||e.attr("dy",n.textHeight),s=!1}));var u=e.id;void 0!==e.type&&""!==e.type&&(u+="<"+e.type+">");var l=r.append("tspan").text(u).attr("class","title");s||l.attr("dy",n.textHeight);var h=r.node().getBBox().height,f=o.append("line").attr("x1",0).attr("y1",n.padding+h+n.dividerMargin/2).attr("y2",n.padding+h+n.dividerMargin/2),d=o.append("text").attr("x",n.padding).attr("y",h+n.dividerMargin+n.textHeight).attr("fill","white").attr("class","classText");s=!0,e.members.forEach((function(t){pn(d,t,s,n),s=!1}));var p=d.node().getBBox(),y=o.append("line").attr("x1",0).attr("y1",n.padding+h+n.dividerMargin+p.height).attr("y2",n.padding+h+n.dividerMargin+p.height),g=o.append("text").attr("x",n.padding).attr("y",h+2*n.dividerMargin+p.height+n.textHeight).attr("fill","white").attr("class","classText");s=!0,e.methods.forEach((function(t){pn(g,t,s,n),s=!1}));var v=o.node().getBBox(),m=" ";e.cssClasses.length>0&&(m+=e.cssClasses.join(" "));var b=o.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",v.width+2*n.padding).attr("height",v.height+n.padding+.5*n.dividerMargin).attr("class",m).node().getBBox().width;return r.node().childNodes.forEach((function(t){t.setAttribute("x",(b-t.getBBox().width)/2)})),e.tooltip&&r.insert("title").text(e.tooltip),f.attr("x2",b),y.attr("x2",b),a.width=b,a.height=v.height+n.padding+.5*n.dividerMargin,a},mn=function(t,e,n,r){var i=function(t){switch(t){case on.AGGREGATION:return"aggregation";case on.EXTENSION:return"extension";case on.COMPOSITION:return"composition";case on.DEPENDENCY:return"dependency"}};e.points=e.points.filter((function(t){return!Number.isNaN(t.y)}));var a,o,s=e.points,u=Object(d.line)().x((function(t){return t.x})).y((function(t){return t.y})).curve(d.curveBasis),l=t.append("path").attr("d",u(s)).attr("id","edge"+un).attr("class","relation"),h="";r.arrowMarkerAbsolute&&(h=(h=(h=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search).replace(/\(/g,"\\(")).replace(/\)/g,"\\)")),1==n.relation.lineType&&l.attr("class","relation dashed-line"),"none"!==n.relation.type1&&l.attr("marker-start","url("+h+"#"+i(n.relation.type1)+"Start)"),"none"!==n.relation.type2&&l.attr("marker-end","url("+h+"#"+i(n.relation.type2)+"End)");var f,p,y,g,v=e.points.length,m=H.calcLabelPosition(e.points);if(a=m.x,o=m.y,v%2!=0&&v>1){var b=H.calcCardinalityPosition("none"!==n.relation.type1,e.points,e.points[0]),x=H.calcCardinalityPosition("none"!==n.relation.type2,e.points,e.points[v-1]);c.debug("cardinality_1_point "+JSON.stringify(b)),c.debug("cardinality_2_point "+JSON.stringify(x)),f=b.x,p=b.y,y=x.x,g=x.y}if(void 0!==n.title){var _=t.append("g").attr("class","classLabel"),k=_.append("text").attr("class","label").attr("x",a).attr("y",o).attr("fill","red").attr("text-anchor","middle").text(n.title);window.label=k;var w=k.node().getBBox();_.insert("rect",":first-child").attr("class","box").attr("x",w.x-r.padding/2).attr("y",w.y-r.padding/2).attr("width",w.width+r.padding).attr("height",w.height+r.padding)}(c.info("Rendering relation "+JSON.stringify(n)),void 0!==n.relationTitle1&&"none"!==n.relationTitle1)&&t.append("g").attr("class","cardinality").append("text").attr("class","type1").attr("x",f).attr("y",p).attr("fill","black").attr("font-size","6").text(n.relationTitle1);void 0!==n.relationTitle2&&"none"!==n.relationTitle2&&t.append("g").attr("class","cardinality").append("text").attr("class","type2").attr("x",y).attr("y",g).attr("fill","black").attr("font-size","6").text(n.relationTitle2);un++},bn=function(t,e,n){var r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;"LR"===n&&(i=10,a=70);var o=r.append("rect").style("stroke","black").style("fill","black").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return Ae(e,o),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(t){return Ve.rect(e,t)},r},xn={question:function(t,e){var n=Ce(t,e,void 0,!0),r=n.shapeSvg,i=n.bbox,a=i.width+e.padding+(i.height+e.padding),o=[{x:a/2,y:0},{x:a,y:-a/2},{x:a/2,y:-a},{x:0,y:-a/2}];c.info("Question main (Circle)");var s=Se(r,a,a,o);return s.attr("style",e.style),Ae(e,s),e.intersect=function(t){return c.warn("Intersect called"),Ve.polygon(e,o,t)},r},rect:function(t,e){var n=Ce(t,e,"node "+e.classes,!0),r=n.shapeSvg,i=n.bbox,a=n.halfPadding;c.trace("Classes = ",e.classes);var o=r.insert("rect",":first-child");return o.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Ae(e,o),e.intersect=function(t){return Ve.rect(e,t)},r},rectWithTitle:function(t,e){var n;n=e.classes?"node "+e.classes:"node default";var r=t.insert("g").attr("class",n).attr("id",e.domId||e.id),i=r.insert("rect",":first-child"),a=r.insert("line"),o=r.insert("g").attr("class","label"),s=e.labelText.flat();c.info("Label text",s[0]);var u,l=o.node().appendChild(Te(s[0],e.labelStyle,!0,!0));if(_t().flowchart.htmlLabels){var h=l.children[0],f=Object(d.select)(l);u=h.getBoundingClientRect(),f.attr("width",u.width),f.attr("height",u.height)}c.info("Text 2",s);var p=s.slice(1,s.length),y=l.getBBox(),g=o.node().appendChild(Te(p.join("
        "),e.labelStyle,!0,!0));if(_t().flowchart.htmlLabels){var v=g.children[0],m=Object(d.select)(g);u=v.getBoundingClientRect(),m.attr("width",u.width),m.attr("height",u.height)}var b=e.padding/2;return Object(d.select)(g).attr("transform","translate( "+(u.width>y.width?0:(y.width-u.width)/2)+", "+(y.height+b+5)+")"),Object(d.select)(l).attr("transform","translate( "+(u.widthe.height/2-s)){var i=s*s*(1-r*r/(o*o));0!=i&&(i=Math.sqrt(i)),i=s-i,t.y-e.y>0&&(i=-i),n.y+=i}return n},r},start:function(t,e){var n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),r=n.insert("circle",":first-child");return r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),Ae(e,r),e.intersect=function(t){return Ve.circle(e,7,t)},n},end:function(t,e){var n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),r=n.insert("circle",":first-child"),i=n.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),r.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),Ae(e,i),e.intersect=function(t){return Ve.circle(e,7,t)},n},note:Ge,subroutine:function(t,e){var n=Ce(t,e,void 0,!0),r=n.shapeSvg,i=n.bbox,a=i.width+e.padding,o=i.height+e.padding,s=[{x:0,y:0},{x:a,y:0},{x:a,y:-o},{x:0,y:-o},{x:0,y:0},{x:-8,y:0},{x:a+8,y:0},{x:a+8,y:-o},{x:-8,y:-o},{x:-8,y:0}],c=Se(r,a,o,s);return c.attr("style",e.style),Ae(e,c),e.intersect=function(t){return Ve.polygon(e,s,t)},r},fork:bn,join:bn,class_box:function(t,e){var n,r=e.padding/2;n=e.classes?"node "+e.classes:"node default";var i=t.insert("g").attr("class",n).attr("id",e.domId||e.id),a=i.insert("rect",":first-child"),o=i.insert("line"),s=i.insert("line"),c=0,u=4,l=i.insert("g").attr("class","label"),h=0,f=e.classData.annotations&&e.classData.annotations[0],p=e.classData.annotations[0]?"«"+e.classData.annotations[0]+"»":"",y=l.node().appendChild(Te(p,e.labelStyle,!0,!0)),g=y.getBBox();if(_t().flowchart.htmlLabels){var v=y.children[0],m=Object(d.select)(y);g=v.getBoundingClientRect(),m.attr("width",g.width),m.attr("height",g.height)}e.classData.annotations[0]&&(u+=g.height+4,c+=g.width);var b=e.classData.id;void 0!==e.classData.type&&""!==e.classData.type&&(b+="<"+e.classData.type+">");var x=l.node().appendChild(Te(b,e.labelStyle,!0,!0));Object(d.select)(x).attr("class","classTitle");var _=x.getBBox();if(_t().flowchart.htmlLabels){var k=x.children[0],w=Object(d.select)(x);_=k.getBoundingClientRect(),w.attr("width",_.width),w.attr("height",_.height)}u+=_.height+4,_.width>c&&(c=_.width);var E=[];e.classData.members.forEach((function(t){var n=ln(t).displayText,r=l.node().appendChild(Te(n,e.labelStyle,!0,!0)),i=r.getBBox();if(_t().flowchart.htmlLabels){var a=r.children[0],o=Object(d.select)(r);i=a.getBoundingClientRect(),o.attr("width",i.width),o.attr("height",i.height)}i.width>c&&(c=i.width),u+=i.height+4,E.push(r)})),u+=8;var T=[];if(e.classData.methods.forEach((function(t){var n=ln(t).displayText,r=l.node().appendChild(Te(n,e.labelStyle,!0,!0)),i=r.getBBox();if(_t().flowchart.htmlLabels){var a=r.children[0],o=Object(d.select)(r);i=a.getBoundingClientRect(),o.attr("width",i.width),o.attr("height",i.height)}i.width>c&&(c=i.width),u+=i.height+4,T.push(r)})),u+=8,f){var C=(c-g.width)/2;Object(d.select)(y).attr("transform","translate( "+(-1*c/2+C)+", "+-1*u/2+")"),h=g.height+4}var A=(c-_.width)/2;return Object(d.select)(x).attr("transform","translate( "+(-1*c/2+A)+", "+(-1*u/2+h)+")"),h+=_.height+4,o.attr("class","divider").attr("x1",-c/2-r).attr("x2",c/2+r).attr("y1",-u/2-r+8+h).attr("y2",-u/2-r+8+h),h+=8,E.forEach((function(t){Object(d.select)(t).attr("transform","translate( "+-c/2+", "+(-1*u/2+h+4)+")"),h+=_.height+4})),h+=8,s.attr("class","divider").attr("x1",-c/2-r).attr("x2",c/2+r).attr("y1",-u/2-r+8+h).attr("y2",-u/2-r+8+h),h+=8,T.forEach((function(t){Object(d.select)(t).attr("transform","translate( "+-c/2+", "+(-1*u/2+h)+")"),h+=_.height+4})),a.attr("class","outer title-state").attr("x",-c/2-r).attr("y",-u/2-r).attr("width",c+e.padding).attr("height",u+e.padding),Ae(e,a),e.intersect=function(t){return Ve.rect(e,t)},i}},_n={},kn=function(t){var e=_n[t.id];c.trace("Transforming node",t,"translate("+(t.x-t.width/2-5)+", "+(t.y-t.height/2-5)+")");t.clusterNode?e.attr("transform","translate("+(t.x-t.width/2-8)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")")},wn={rect:function(t,e){c.trace("Creating subgraph rect for ",e.id,e);var n=t.insert("g").attr("class","cluster"+(e.class?" "+e.class:"")).attr("id",e.id),r=n.insert("rect",":first-child"),i=n.insert("g").attr("class","cluster-label"),a=i.node().appendChild(Te(e.labelText,e.labelStyle,void 0,!0)),o=a.getBBox();if(_t().flowchart.htmlLabels){var s=a.children[0],u=Object(d.select)(a);o=s.getBoundingClientRect(),u.attr("width",o.width),u.attr("height",o.height)}var l=0*e.padding,h=l/2;c.trace("Data ",e,JSON.stringify(e)),r.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-h).attr("y",e.y-e.height/2-h).attr("width",e.width+l).attr("height",e.height+l),i.attr("transform","translate("+(e.x-o.width/2)+", "+(e.y-e.height/2+e.padding/3)+")");var f=r.node().getBBox();return e.width=f.width,e.height=f.height,e.intersect=function(t){return He(e,t)},n},roundedWithTitle:function(t,e){var n=t.insert("g").attr("class",e.classes).attr("id",e.id),r=n.insert("rect",":first-child"),i=n.insert("g").attr("class","cluster-label"),a=n.append("rect"),o=i.node().appendChild(Te(e.labelText,e.labelStyle,void 0,!0)),s=o.getBBox();if(_t().flowchart.htmlLabels){var c=o.children[0],u=Object(d.select)(o);s=c.getBoundingClientRect(),u.attr("width",s.width),u.attr("height",s.height)}s=o.getBBox();var l=0*e.padding,h=l/2;r.attr("class","outer").attr("x",e.x-e.width/2-h).attr("y",e.y-e.height/2-h).attr("width",e.width+l).attr("height",e.height+l),a.attr("class","inner").attr("x",e.x-e.width/2-h).attr("y",e.y-e.height/2-h+s.height-1).attr("width",e.width+l).attr("height",e.height+l-s.height-3),i.attr("transform","translate("+(e.x-s.width/2)+", "+(e.y-e.height/2-e.padding/3+(_t().flowchart.htmlLabels?5:3))+")");var f=r.node().getBBox();return e.width=f.width,e.height=f.height,e.intersect=function(t){return He(e,t)},n},noteGroup:function(t,e){var n=t.insert("g").attr("class","note-cluster").attr("id",e.id),r=n.insert("rect",":first-child"),i=0*e.padding,a=i/2;r.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");var o=r.node().getBBox();return e.width=o.width,e.height=o.height,e.intersect=function(t){return He(e,t)},n},divider:function(t,e){var n=t.insert("g").attr("class",e.classes).attr("id",e.id),r=n.insert("rect",":first-child"),i=0*e.padding,a=i/2;r.attr("class","divider").attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2).attr("width",e.width+i).attr("height",e.height+i);var o=r.node().getBBox();return e.width=o.width,e.height=o.height,e.intersect=function(t){return He(e,t)},n}},En={},Tn={},Cn={},An=function(t,e){var n=t.x,r=t.y,i=Math.abs(e.x-n),a=Math.abs(e.y-r),o=t.width/2,s=t.height/2;return i>=o||a>=s},Sn=function(t,e,n){c.warn("intersection calc o:",e," i:",n,t);var r=t.x,i=t.y,a=Math.abs(r-n.x),o=t.width/2,s=n.xMath.abs(r-e.x)*u){var g=n.y0&&c.info("Recursive edges",n.edge(n.edges()[0]));var s=o.insert("g").attr("class","clusters"),u=o.insert("g").attr("class","edgePaths"),l=o.insert("g").attr("class","edgeLabels"),h=o.insert("g").attr("class","nodes");return n.nodes().forEach((function(e){var o=n.node(e);if(void 0!==i){var s=JSON.parse(JSON.stringify(i.clusterData));c.info("Setting data for cluster XXX (",e,") ",s,i),n.setNode(i.id,s),n.parent(e)||(c.warn("Setting parent",e,i.id),n.setParent(e,i.id,s))}if(c.info("(Insert) Node XXX"+e+": "+JSON.stringify(n.node(e))),o&&o.clusterNode){c.info("Cluster identified",e,o,n.node(e));var u=t(h,o.graph,r,n.node(e));Ae(o,u),function(t,e){_n[e.id]=t}(u,o),c.warn("Recursive render complete",u,o)}else n.children(e).length>0?(c.info("Cluster - the non recursive path XXX",e,o.id,o,n),c.info(Le(o.id,n)),Me[o.id]={id:Le(o.id,n),node:o}):(c.info("Node - the non recursive path",e,o.id,o),function(t,e,n){var r,i;e.link?(r=t.insert("svg:a").attr("xlink:href",e.link).attr("target",e.linkTarget||"_blank"),i=xn[e.shape](r,e,n)):r=i=xn[e.shape](t,e,n),e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),_n[e.id]=r,e.haveCallback&&_n[e.id].attr("class",_n[e.id].attr("class")+" clickable")}(h,n.node(e),a))})),n.edges().forEach((function(t){var e=n.edge(t.v,t.w,t.name);c.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t)),c.info("Edge "+t.v+" -> "+t.w+": ",t," ",JSON.stringify(n.edge(t))),c.info("Fix",Me,"ids:",t.v,t.w,"Translateing: ",Me[t.v],Me[t.w]),function(t,e){var n=Te(e.label,e.labelStyle),r=t.insert("g").attr("class","edgeLabel"),i=r.insert("g").attr("class","label");i.node().appendChild(n);var a=n.getBBox();if(_t().flowchart.htmlLabels){var o=n.children[0],s=Object(d.select)(n);a=o.getBoundingClientRect(),s.attr("width",a.width),s.attr("height",a.height)}if(i.attr("transform","translate("+-a.width/2+", "+-a.height/2+")"),Tn[e.id]=r,e.width=a.width,e.height=a.height,e.startLabelLeft){var c=Te(e.startLabelLeft,e.labelStyle),u=t.insert("g").attr("class","edgeTerminals"),l=u.insert("g").attr("class","inner");l.node().appendChild(c);var h=c.getBBox();l.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),Cn[e.id]||(Cn[e.id]={}),Cn[e.id].startLeft=u}if(e.startLabelRight){var f=Te(e.startLabelRight,e.labelStyle),p=t.insert("g").attr("class","edgeTerminals"),y=p.insert("g").attr("class","inner");p.node().appendChild(f),y.node().appendChild(f);var g=f.getBBox();y.attr("transform","translate("+-g.width/2+", "+-g.height/2+")"),Cn[e.id]||(Cn[e.id]={}),Cn[e.id].startRight=p}if(e.endLabelLeft){var v=Te(e.endLabelLeft,e.labelStyle),m=t.insert("g").attr("class","edgeTerminals"),b=m.insert("g").attr("class","inner");b.node().appendChild(v);var x=v.getBBox();b.attr("transform","translate("+-x.width/2+", "+-x.height/2+")"),m.node().appendChild(v),Cn[e.id]||(Cn[e.id]={}),Cn[e.id].endLeft=m}if(e.endLabelRight){var _=Te(e.endLabelRight,e.labelStyle),k=t.insert("g").attr("class","edgeTerminals"),w=k.insert("g").attr("class","inner");w.node().appendChild(_);var E=_.getBBox();w.attr("transform","translate("+-E.width/2+", "+-E.height/2+")"),k.node().appendChild(_),Cn[e.id]||(Cn[e.id]={}),Cn[e.id].endRight=k}}(l,e)})),n.edges().forEach((function(t){c.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t))})),c.info("#############################################"),c.info("### Layout ###"),c.info("#############################################"),c.info(n),ke.a.layout(n),c.info("Graph after layout:",G.a.json.write(n)),je(n).forEach((function(t){var e=n.node(t);c.info("Position "+t+": "+JSON.stringify(n.node(t))),c.info("Position "+t+": ("+e.x,","+e.y,") width: ",e.width," height: ",e.height),e&&e.clusterNode?kn(e):n.children(t).length>0?(!function(t,e){c.trace("Inserting cluster");var n=e.shape||"rect";En[e.id]=wn[n](t,e)}(s,e),Me[e.id].node=e):kn(e)})),n.edges().forEach((function(t){var e=n.edge(t);c.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(e),e);var i=function(t,e,n,r,i,a){var o=n.points,s=!1,u=a.node(e.v),l=a.node(e.w);if(l.intersect&&u.intersect&&((o=o.slice(1,n.points.length-1)).unshift(u.intersect(o[0])),c.info("Last point",o[o.length-1],l,l.intersect(o[o.length-1])),o.push(l.intersect(o[o.length-1]))),n.toCluster){var h;c.trace("edge",n),c.trace("to cluster",r[n.toCluster]),o=[];var f=!1;n.points.forEach((function(t){var e=r[n.toCluster].node;if(An(e,t)||f)f||o.push(t);else{c.trace("inside",n.toCluster,t,h);var i=Sn(e,h,t),a=!1;o.forEach((function(t){a=a||t.x===i.x&&t.y===i.y})),o.find((function(t){return t.x===i.x&&t.y===i.y}))?c.warn("no intersect",i,o):o.push(i),f=!0}h=t})),s=!0}if(n.fromCluster){c.trace("edge",n),c.warn("from cluster",r[n.fromCluster]);for(var p,y=[],g=!1,v=o.length-1;v>=0;v--){var m=o[v],b=r[n.fromCluster].node;if(An(b,m)||g)c.trace("Outside point",m),g||y.unshift(m);else{c.warn("inside",n.fromCluster,m,b);var x=Sn(b,p,m);y.unshift(x),g=!0}p=m}o=y,s=!0}var _,k=o.filter((function(t){return!Number.isNaN(t.y)})),w=Object(d.line)().x((function(t){return t.x})).y((function(t){return t.y})).curve(d.curveBasis);switch(n.thickness){case"normal":_="edge-thickness-normal";break;case"thick":_="edge-thickness-thick";break;default:_=""}switch(n.pattern){case"solid":_+=" edge-pattern-solid";break;case"dotted":_+=" edge-pattern-dotted";break;case"dashed":_+=" edge-pattern-dashed"}var E=t.append("path").attr("d",w(k)).attr("id",n.id).attr("class"," "+_+(n.classes?" "+n.classes:"")).attr("style",n.style),T="";switch(_t().state.arrowMarkerAbsolute&&(T=(T=(T=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search).replace(/\(/g,"\\(")).replace(/\)/g,"\\)")),c.info("arrowTypeStart",n.arrowTypeStart),c.info("arrowTypeEnd",n.arrowTypeEnd),n.arrowTypeStart){case"arrow_cross":E.attr("marker-start","url("+T+"#"+i+"-crossStart)");break;case"arrow_point":E.attr("marker-start","url("+T+"#"+i+"-pointStart)");break;case"arrow_barb":E.attr("marker-start","url("+T+"#"+i+"-barbStart)");break;case"arrow_circle":E.attr("marker-start","url("+T+"#"+i+"-circleStart)");break;case"aggregation":E.attr("marker-start","url("+T+"#"+i+"-aggregationStart)");break;case"extension":E.attr("marker-start","url("+T+"#"+i+"-extensionStart)");break;case"composition":E.attr("marker-start","url("+T+"#"+i+"-compositionStart)");break;case"dependency":E.attr("marker-start","url("+T+"#"+i+"-dependencyStart)")}switch(n.arrowTypeEnd){case"arrow_cross":E.attr("marker-end","url("+T+"#"+i+"-crossEnd)");break;case"arrow_point":E.attr("marker-end","url("+T+"#"+i+"-pointEnd)");break;case"arrow_barb":E.attr("marker-end","url("+T+"#"+i+"-barbEnd)");break;case"arrow_circle":E.attr("marker-end","url("+T+"#"+i+"-circleEnd)");break;case"aggregation":E.attr("marker-end","url("+T+"#"+i+"-aggregationEnd)");break;case"extension":E.attr("marker-end","url("+T+"#"+i+"-extensionEnd)");break;case"composition":E.attr("marker-end","url("+T+"#"+i+"-compositionEnd)");break;case"dependency":E.attr("marker-end","url("+T+"#"+i+"-dependencyEnd)")}var C={};return s&&(C.updatedPath=o),C.originalPath=n.points,C}(u,t,e,Me,r,n);!function(t,e){c.info("Moving label",t.id,t.label,Tn[t.id]);var n=e.updatedPath?e.updatedPath:e.originalPath;if(t.label){var r=Tn[t.id],i=t.x,a=t.y;if(n){var o=H.calcLabelPosition(n);c.info("Moving label from (",i,",",a,") to (",o.x,",",o.y,")")}r.attr("transform","translate("+i+", "+a+")")}if(t.startLabelLeft){var s=Cn[t.id].startLeft,u=t.x,l=t.y;if(n){var h=H.calcTerminalLabelPosition(0,"start_left",n);u=h.x,l=h.y}s.attr("transform","translate("+u+", "+l+")")}if(t.startLabelRight){var f=Cn[t.id].startRight,d=t.x,p=t.y;if(n){var y=H.calcTerminalLabelPosition(0,"start_right",n);d=y.x,p=y.y}f.attr("transform","translate("+d+", "+p+")")}if(t.endLabelLeft){var g=Cn[t.id].endLeft,v=t.x,m=t.y;if(n){var b=H.calcTerminalLabelPosition(0,"end_left",n);v=b.x,m=b.y}g.attr("transform","translate("+v+", "+m+")")}if(t.endLabelRight){var x=Cn[t.id].endRight,_=t.x,k=t.y;if(n){var w=H.calcTerminalLabelPosition(0,"end_right",n);_=w.x,k=w.y}x.attr("transform","translate("+_+", "+k+")")}}(e,i)})),o},On=function(t,e,n,r,i){Ee(t,n,r,i),_n={},Tn={},Cn={},En={},Oe={},De={},Me={},c.warn("Graph at first:",G.a.json.write(e)),Ie(e),c.warn("Graph after:",G.a.json.write(e)),Mn(t,e,r)},Dn={},Nn=function(t,e,n){var r=Object(d.select)('[id="'.concat(n,'"]'));Object.keys(t).forEach((function(n){var i=t[n],a="default";i.classes.length>0&&(a=i.classes.join(" "));var o,s=B(i.styles),u=void 0!==i.text?i.text:i.id;if(_t().flowchart.htmlLabels){var l={label:u.replace(/fa[lrsb]?:fa-[\w-]+/g,(function(t){return"")}))};(o=ee()(r,l).node()).parentNode.removeChild(o)}else{var h=document.createElementNS("http://www.w3.org/2000/svg","text");h.setAttribute("style",s.labelStyle.replace("color:","fill:"));for(var f=u.split(x.lineBreakRegex),d=0;d=0;h--)i=l[h],c.info("Subgraph - ",i),Xt.addVertex(i.id,i.title,"group",void 0,i.classes);var f=Xt.getVertices(),p=Xt.getEdges();c.info(p);var y=0;for(y=l.length-1;y>=0;y--){i=l[y],Object(d.selectAll)("cluster").append("text");for(var g=0;g0)switch(e.valign){case"top":case"start":s=function(){return Math.round(e.y+e.textMargin)};break;case"middle":case"center":s=function(){return Math.round(e.y+(n+r+e.textMargin)/2)};break;case"bottom":case"end":s=function(){return Math.round(e.y+(n+r+2*e.textMargin)-e.textMargin)}}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="text-after-edge",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="text-before-edge",e.alignmentBaseline="middle"}for(var c=0;c0&&(r+=(l._groups||l)[0][0].getBBox().height,n=r),a.push(l)}return a},jn=function(t,e){var n,r,i,a,o,s=t.append("polygon");return s.attr("points",(n=e.x,r=e.y,i=e.width,a=e.height,n+","+r+" "+(n+i)+","+r+" "+(n+i)+","+(r+a-(o=7))+" "+(n+i-1.2*o)+","+(r+a)+" "+n+","+(r+a))),s.attr("class","labelBox"),e.y=e.y+e.height/2,Fn(t,e),s},Rn=-1,Yn=function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},zn=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},Un=function(){function t(t,e,n,i,a,o,s){r(e.append("text").attr("x",n+a/2).attr("y",i+o/2+5).style("text-anchor","middle").text(t),s)}function e(t,e,n,i,a,o,s,c){for(var u=c.actorFontSize,l=c.actorFontFamily,h=c.actorFontWeight,f=t.split(x.lineBreakRegex),d=0;d2&&void 0!==arguments[2]?arguments[2]:{text:void 0,wrap:void 0},r=arguments.length>3?arguments[3]:void 0;if(r===ir.ACTIVE_END){var i=er(t.actor);if(i<1){var a=new Error("Trying to inactivate an inactive participant ("+t.actor+")");throw a.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},a}}return qn.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&rr()||!!n.wrap,type:r}),!0},rr=function(){return Qn},ir={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ar=function(t,e,n){var r={actor:t,placement:e,message:n.text,wrap:void 0===n.wrap&&rr()||!!n.wrap},i=[].concat(t,t);Xn.push(r),qn.push({from:i[0],to:i[1],message:n.text,wrap:void 0===n.wrap&&rr()||!!n.wrap,type:ir.NOTE,placement:e})},or=function(t){Zn=t.text,Jn=void 0===t.wrap&&rr()||!!t.wrap},sr={addActor:tr,addMessage:function(t,e,n,r){qn.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&rr()||!!n.wrap,answer:r})},addSignal:nr,autoWrap:rr,setWrap:function(t){Qn=t},enableSequenceNumbers:function(){Kn=!0},showSequenceNumbers:function(){return Kn},getMessages:function(){return qn},getActors:function(){return Gn},getActor:function(t){return Gn[t]},getActorKeys:function(){return Object.keys(Gn)},getTitle:function(){return Zn},parseDirective:function(t,e,n){Go.parseDirective(this,t,e,n)},getConfig:function(){return _t().sequence},getTitleWrapped:function(){return Jn},clear:function(){Gn={},qn=[]},parseMessage:function(t){var e=t.trim(),n={text:e.replace(/^[:]?(?:no)?wrap:/,"").trim(),wrap:null!==e.match(/^[:]?wrap:/)||null===e.match(/^[:]?nowrap:/)&&void 0};return c.debug("parseMessage:",n),n},LINETYPE:ir,ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},addNote:ar,setTitle:or,apply:function t(e){if(e instanceof Array)e.forEach((function(e){t(e)}));else switch(e.type){case"addActor":tr(e.actor,e.actor,e.description);break;case"activeStart":case"activeEnd":nr(e.actor,void 0,void 0,e.signalType);break;case"addNote":ar(e.actor,e.placement,e.text);break;case"addMessage":nr(e.from,e.to,e.msg,e.signalType);break;case"loopStart":nr(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":nr(void 0,void 0,void 0,e.signalType);break;case"rectStart":nr(void 0,void 0,e.color,e.signalType);break;case"rectEnd":nr(void 0,void 0,void 0,e.signalType);break;case"optStart":nr(void 0,void 0,e.optText,e.signalType);break;case"optEnd":nr(void 0,void 0,void 0,e.signalType);break;case"altStart":case"else":nr(void 0,void 0,e.altText,e.signalType);break;case"altEnd":nr(void 0,void 0,void 0,e.signalType);break;case"setTitle":or(e.text);break;case"parStart":case"and":nr(void 0,void 0,e.parText,e.signalType);break;case"parEnd":nr(void 0,void 0,void 0,e.signalType)}}};Wn.parser.yy=sr;var cr={},ur={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:function(){return Math.max.apply(null,0===this.actors.length?[0]:this.actors.map((function(t){return t.height||0})))+(0===this.loops.length?0:this.loops.map((function(t){return t.height||0})).reduce((function(t,e){return t+e})))+(0===this.messages.length?0:this.messages.map((function(t){return t.height||0})).reduce((function(t,e){return t+e})))+(0===this.notes.length?0:this.notes.map((function(t){return t.height||0})).reduce((function(t,e){return t+e})))},clear:function(){this.actors=[],this.loops=[],this.messages=[],this.notes=[]},addActor:function(t){this.actors.push(t)},addLoop:function(t){this.loops.push(t)},addMessage:function(t){this.messages.push(t)},addNote:function(t){this.notes.push(t)},lastActor:function(){return this.actors[this.actors.length-1]},lastLoop:function(){return this.loops[this.loops.length-1]},lastMessage:function(){return this.messages[this.messages.length-1]},lastNote:function(){return this.notes[this.notes.length-1]},actors:[],loops:[],messages:[],notes:[]},init:function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,pr(Wn.parser.yy.getConfig())},updateVal:function(t,e,n,r){void 0===t[e]?t[e]=n:t[e]=r(n,t[e])},updateBounds:function(t,e,n,r){var i=this,a=0;function o(o){return function(s){a++;var c=i.sequenceItems.length-a+1;i.updateVal(s,"starty",e-c*cr.boxMargin,Math.min),i.updateVal(s,"stopy",r+c*cr.boxMargin,Math.max),i.updateVal(ur.data,"startx",t-c*cr.boxMargin,Math.min),i.updateVal(ur.data,"stopx",n+c*cr.boxMargin,Math.max),"activation"!==o&&(i.updateVal(s,"startx",t-c*cr.boxMargin,Math.min),i.updateVal(s,"stopx",n+c*cr.boxMargin,Math.max),i.updateVal(ur.data,"starty",e-c*cr.boxMargin,Math.min),i.updateVal(ur.data,"stopy",r+c*cr.boxMargin,Math.max))}}this.sequenceItems.forEach(o()),this.activations.forEach(o("activation"))},insert:function(t,e,n,r){var i=Math.min(t,n),a=Math.max(t,n),o=Math.min(e,r),s=Math.max(e,r);this.updateVal(ur.data,"startx",i,Math.min),this.updateVal(ur.data,"starty",o,Math.min),this.updateVal(ur.data,"stopx",a,Math.max),this.updateVal(ur.data,"stopy",s,Math.max),this.updateBounds(i,o,a,s)},newActivation:function(t,e,n){var r=n[t.from.actor],i=yr(t.from.actor).length||0,a=r.x+r.width/2+(i-1)*cr.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+cr.activationWidth,stopy:void 0,actor:t.from.actor,anchored:$n.anchorElement(e)})},endActivation:function(t){var e=this.activations.map((function(t){return t.actor})).lastIndexOf(t.from.actor);return this.activations.splice(e,1)[0]},createLoop:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{message:void 0,wrap:!1,width:void 0},e=arguments.length>1?arguments[1]:void 0;return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},newLoop:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{message:void 0,wrap:!1,width:void 0},e=arguments.length>1?arguments[1]:void 0;this.sequenceItems.push(this.createLoop(t,e))},endLoop:function(){return this.sequenceItems.pop()},addSectionToLoop:function(t){var e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:ur.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return{bounds:this.data,models:this.models}}},lr=function(t){return{fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}},hr=function(t){return{fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}},fr=function(t){return{fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}},dr=function(t,e,n,r){for(var i=0,a=0,o=0;o0&&o.forEach((function(r){if(n=r,i.startx===i.stopx){var a=e[t.from],o=e[t.to];n.from=Math.min(a.x-i.width/2,a.x-a.width/2,n.from),n.to=Math.max(o.x+i.width/2,o.x+a.width/2,n.to),n.width=Math.max(n.width,Math.abs(n.to-n.from))-cr.labelBoxWidth}else n.from=Math.min(i.startx,n.from),n.to=Math.max(i.stopx,n.to),n.width=Math.max(n.width,i.width)-cr.labelBoxWidth})))})),ur.activations=[],c.debug("Loop type widths:",a),a},_r={bounds:ur,drawActors:dr,setConf:pr,draw:function(t,e){cr=_t().sequence,Wn.parser.yy.clear(),Wn.parser.yy.setWrap(cr.wrap),Wn.parser.parse(t+"\n"),ur.init(),c.debug("C:".concat(JSON.stringify(cr,null,2)));var n=Object(d.select)('[id="'.concat(e,'"]')),r=Wn.parser.yy.getActors(),i=Wn.parser.yy.getActorKeys(),a=Wn.parser.yy.getMessages(),o=Wn.parser.yy.getTitle(),s=mr(r,a);cr.height=br(r,s),dr(n,r,i,0);var u=xr(a,r,s);$n.insertArrowHead(n),$n.insertArrowCrossHead(n),$n.insertArrowFilledHead(n),$n.insertSequenceNumber(n);var l=1;a.forEach((function(t){var e,i,a;switch(t.type){case Wn.parser.yy.LINETYPE.NOTE:i=t.noteModel,function(t,e){ur.bumpVerticalPos(cr.boxMargin),e.height=cr.boxMargin,e.starty=ur.getVerticalPos();var n=$n.getNoteRect();n.x=e.startx,n.y=e.starty,n.width=e.width||cr.width,n.class="note";var r=t.append("g"),i=$n.drawRect(r,n),a=$n.getTextObj();a.x=e.startx,a.y=e.starty,a.width=n.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=cr.noteFontFamily,a.fontSize=cr.noteFontSize,a.fontWeight=cr.noteFontWeight,a.anchor=cr.noteAlign,a.textMargin=cr.noteMargin,a.valign=cr.noteAlign;var o=Fn(r,a),s=Math.round(o.map((function(t){return(t._groups||t)[0][0].getBBox().height})).reduce((function(t,e){return t+e})));i.attr("height",s+2*cr.noteMargin),e.height+=s+2*cr.noteMargin,ur.bumpVerticalPos(s+2*cr.noteMargin),e.stopy=e.starty+s+2*cr.noteMargin,e.stopx=e.startx+n.width,ur.insert(e.startx,e.starty,e.stopx,e.stopy),ur.models.addNote(e)}(n,i);break;case Wn.parser.yy.LINETYPE.ACTIVE_START:ur.newActivation(t,n,r);break;case Wn.parser.yy.LINETYPE.ACTIVE_END:!function(t,e){var r=ur.endActivation(t);r.starty+18>e&&(r.starty=e-6,e+=12),$n.drawActivation(n,r,e,cr,yr(t.from.actor).length),ur.insert(r.startx,e-10,r.stopx,e)}(t,ur.getVerticalPos());break;case Wn.parser.yy.LINETYPE.LOOP_START:vr(u,t,cr.boxMargin,cr.boxMargin+cr.boxTextMargin,(function(t){return ur.newLoop(t)}));break;case Wn.parser.yy.LINETYPE.LOOP_END:e=ur.endLoop(),$n.drawLoop(n,e,"loop",cr),ur.bumpVerticalPos(e.stopy-ur.getVerticalPos()),ur.models.addLoop(e);break;case Wn.parser.yy.LINETYPE.RECT_START:vr(u,t,cr.boxMargin,cr.boxMargin,(function(t){return ur.newLoop(void 0,t.message)}));break;case Wn.parser.yy.LINETYPE.RECT_END:e=ur.endLoop(),$n.drawBackgroundRect(n,e),ur.models.addLoop(e),ur.bumpVerticalPos(e.stopy-ur.getVerticalPos());break;case Wn.parser.yy.LINETYPE.OPT_START:vr(u,t,cr.boxMargin,cr.boxMargin+cr.boxTextMargin,(function(t){return ur.newLoop(t)}));break;case Wn.parser.yy.LINETYPE.OPT_END:e=ur.endLoop(),$n.drawLoop(n,e,"opt",cr),ur.bumpVerticalPos(e.stopy-ur.getVerticalPos()),ur.models.addLoop(e);break;case Wn.parser.yy.LINETYPE.ALT_START:vr(u,t,cr.boxMargin,cr.boxMargin+cr.boxTextMargin,(function(t){return ur.newLoop(t)}));break;case Wn.parser.yy.LINETYPE.ALT_ELSE:vr(u,t,cr.boxMargin+cr.boxTextMargin,cr.boxMargin,(function(t){return ur.addSectionToLoop(t)}));break;case Wn.parser.yy.LINETYPE.ALT_END:e=ur.endLoop(),$n.drawLoop(n,e,"alt",cr),ur.bumpVerticalPos(e.stopy-ur.getVerticalPos()),ur.models.addLoop(e);break;case Wn.parser.yy.LINETYPE.PAR_START:vr(u,t,cr.boxMargin,cr.boxMargin+cr.boxTextMargin,(function(t){return ur.newLoop(t)}));break;case Wn.parser.yy.LINETYPE.PAR_AND:vr(u,t,cr.boxMargin+cr.boxTextMargin,cr.boxMargin,(function(t){return ur.addSectionToLoop(t)}));break;case Wn.parser.yy.LINETYPE.PAR_END:e=ur.endLoop(),$n.drawLoop(n,e,"par",cr),ur.bumpVerticalPos(e.stopy-ur.getVerticalPos()),ur.models.addLoop(e);break;default:try{(a=t.msgModel).starty=ur.getVerticalPos(),a.sequenceIndex=l,function(t,e){ur.bumpVerticalPos(10);var n=e.startx,r=e.stopx,i=e.starty,a=e.message,o=e.type,s=e.sequenceIndex,c=x.splitBreaks(a).length,u=H.calculateTextDimensions(a,lr(cr)),l=u.height/c;e.height+=l,ur.bumpVerticalPos(l);var h=$n.getTextObj();h.x=n,h.y=i+10,h.width=r-n,h.class="messageText",h.dy="1em",h.text=a,h.fontFamily=cr.messageFontFamily,h.fontSize=cr.messageFontSize,h.fontWeight=cr.messageFontWeight,h.anchor=cr.messageAlign,h.valign=cr.messageAlign,h.textMargin=cr.wrapPadding,h.tspan=!1,Fn(t,h);var f,d,p=u.height-10,y=u.width;if(n===r){d=ur.getVerticalPos()+p,cr.rightAngles?f=t.append("path").attr("d","M ".concat(n,",").concat(d," H ").concat(n+Math.max(cr.width/2,y/2)," V ").concat(d+25," H ").concat(n)):(p+=cr.boxMargin,d=ur.getVerticalPos()+p,f=t.append("path").attr("d","M "+n+","+d+" C "+(n+60)+","+(d-10)+" "+(n+60)+","+(d+30)+" "+n+","+(d+20))),p+=30;var g=Math.max(y/2,cr.width/2);ur.insert(n-g,ur.getVerticalPos()-10+p,r+g,ur.getVerticalPos()+30+p)}else p+=cr.boxMargin,d=ur.getVerticalPos()+p,(f=t.append("line")).attr("x1",n),f.attr("y1",d),f.attr("x2",r),f.attr("y2",d),ur.insert(n,d-10,r,d);o===Wn.parser.yy.LINETYPE.DOTTED||o===Wn.parser.yy.LINETYPE.DOTTED_CROSS||o===Wn.parser.yy.LINETYPE.DOTTED_POINT||o===Wn.parser.yy.LINETYPE.DOTTED_OPEN?(f.style("stroke-dasharray","3, 3"),f.attr("class","messageLine1")):f.attr("class","messageLine0");var v="";cr.arrowMarkerAbsolute&&(v=(v=(v=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search).replace(/\(/g,"\\(")).replace(/\)/g,"\\)")),f.attr("stroke-width",2),f.attr("stroke","none"),f.style("fill","none"),o!==Wn.parser.yy.LINETYPE.SOLID&&o!==Wn.parser.yy.LINETYPE.DOTTED||f.attr("marker-end","url("+v+"#arrowhead)"),o!==Wn.parser.yy.LINETYPE.SOLID_POINT&&o!==Wn.parser.yy.LINETYPE.DOTTED_POINT||f.attr("marker-end","url("+v+"#filled-head)"),o!==Wn.parser.yy.LINETYPE.SOLID_CROSS&&o!==Wn.parser.yy.LINETYPE.DOTTED_CROSS||f.attr("marker-end","url("+v+"#crosshead)"),(sr.showSequenceNumbers()||cr.showSequenceNumbers)&&(f.attr("marker-start","url("+v+"#sequencenumber)"),t.append("text").attr("x",n).attr("y",d+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("textLength","16px").attr("class","sequenceNumber").text(s)),ur.bumpVerticalPos(p),e.height+=p,e.stopy=e.starty+e.height,ur.insert(e.fromBounds,e.starty,e.toBounds,e.stopy)}(n,a),ur.models.addMessage(a)}catch(t){c.error("error while drawing message",t)}}[Wn.parser.yy.LINETYPE.SOLID_OPEN,Wn.parser.yy.LINETYPE.DOTTED_OPEN,Wn.parser.yy.LINETYPE.SOLID,Wn.parser.yy.LINETYPE.DOTTED,Wn.parser.yy.LINETYPE.SOLID_CROSS,Wn.parser.yy.LINETYPE.DOTTED_CROSS,Wn.parser.yy.LINETYPE.SOLID_POINT,Wn.parser.yy.LINETYPE.DOTTED_POINT].includes(t.type)&&l++})),cr.mirrorActors&&(ur.bumpVerticalPos(2*cr.boxMargin),dr(n,r,i,ur.getVerticalPos()));var h=ur.getBounds().bounds;c.debug("For line height fix Querying: #"+e+" .actor-line"),Object(d.selectAll)("#"+e+" .actor-line").attr("y2",h.stopy);var f=h.stopy-h.starty+2*cr.diagramMarginY;cr.mirrorActors&&(f=f-cr.boxMargin+cr.bottomMarginAdj);var p=h.stopx-h.startx+2*cr.diagramMarginX;o&&n.append("text").text(o).attr("x",(h.stopx-h.startx)/2-2*cr.diagramMarginX).attr("y",-25),W(n,f,p,cr.useMaxWidth);var y=o?40:0;n.attr("viewBox",h.startx-cr.diagramMarginX+" -"+(cr.diagramMarginY+y)+" "+p+" "+(f+y)),c.debug("models:",ur.models)}},kr=n(27),wr=n.n(kr);function Er(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e=6&&n.indexOf("weekends")>=0||(n.indexOf(t.format("dddd").toLowerCase())>=0||n.indexOf(t.format(e.trim()))>=0)},Yr=function(t,e,n){if(n.length&&!t.manualEndTime){var r=o()(t.startTime,e,!0);r.add(1,"d");var i=o()(t.endTime,e,!0),a=zr(r,i,e,n);t.endTime=i.toDate(),t.renderEndTime=a}},zr=function(t,e,n,r){for(var i=!1,a=null;t<=e;)i||(a=e.toDate()),(i=Rr(t,n,r))&&e.add(1,"d"),t.add(1,"d");return a},Ur=function(t,e,n){n=n.trim();var r=/^after\s+([\d\w- ]+)/.exec(n.trim());if(null!==r){var i=null;if(r[1].split(" ").forEach((function(t){var e=Xr(t);void 0!==e&&(i?e.endTime>i.endTime&&(i=e):i=e)})),i)return i.endTime;var a=new Date;return a.setHours(0,0,0,0),a}var s=o()(n,e.trim(),!0);return s.isValid()?s.toDate():(c.debug("Invalid date:"+n),c.debug("With date format:"+e.trim()),new Date)},$r=function(t,e){if(null!==t)switch(t[2]){case"s":e.add(t[1],"seconds");break;case"m":e.add(t[1],"minutes");break;case"h":e.add(t[1],"hours");break;case"d":e.add(t[1],"days");break;case"w":e.add(t[1],"weeks")}return e.toDate()},Wr=function(t,e,n,r){r=r||!1,n=n.trim();var i=o()(n,e.trim(),!0);return i.isValid()?(r&&i.add(1,"d"),i.toDate()):$r(/^([\d]+)([wdhms])/.exec(n.trim()),o()(t))},Hr=0,Vr=function(t){return void 0===t?"task"+(Hr+=1):t},Gr=[],qr={},Xr=function(t){var e=qr[t];return Gr[e]},Zr=function(){for(var t=function(t){var e=Gr[t],n="";switch(Gr[t].raw.startTime.type){case"prevTaskEnd":var r=Xr(e.prevTaskId);e.startTime=r.endTime;break;case"getStartDate":(n=Ur(0,Ar,Gr[t].raw.startTime.startData))&&(Gr[t].startTime=n)}return Gr[t].startTime&&(Gr[t].endTime=Wr(Gr[t].startTime,Ar,Gr[t].raw.endTime.data,Fr),Gr[t].endTime&&(Gr[t].processed=!0,Gr[t].manualEndTime=o()(Gr[t].raw.endTime.data,"YYYY-MM-DD",!0).isValid(),Yr(Gr[t],Ar,Or))),Gr[t].processed},e=!0,n=0;nr?i=1:n0&&(e=t.classes.join(" "));for(var n=0,r=0;rn-e?n+a+1.5*ni.leftPadding>u?e+r-5:n+r+5:(n-e)/2+e+r})).attr("y",(function(t,r){return t.order*e+ni.barHeight/2+(ni.fontSize/2-2)+n})).attr("text-height",i).attr("class",(function(t){var e=o(t.startTime),n=o(t.endTime);t.milestone&&(n=e+i);var r=this.getBBox().width,a="";t.classes.length>0&&(a=t.classes.join(" "));for(var c=0,l=0;ln-e?n+r+1.5*ni.leftPadding>u?a+" taskTextOutsideLeft taskTextOutside"+c+" "+h:a+" taskTextOutsideRight taskTextOutside"+c+" "+h+" width-"+r:a+" taskText taskText"+c+" "+h+" width-"+r}))}(t,i,c,h,r,0,e),function(t,e){for(var n=[],r=0,i=0;i0&&a.setAttribute("dy","1em"),a.textContent=e[i],r.appendChild(a)}return r})).attr("x",10).attr("y",(function(i,a){if(!(a>0))return i[1]*t/2+e;for(var o=0;o "+t.w+": "+JSON.stringify(i.edge(t))),mn(r,i.edge(t),i.edge(t).relation,ci))}));var h=r.node().getBBox(),f=h.width+40,p=h.height+40;W(r,p,f,ci.useMaxWidth);var y="".concat(h.x-20," ").concat(h.y-20," ").concat(f," ").concat(p);c.debug("viewBox ".concat(y)),r.attr("viewBox",y)};ai.parser.yy=cn;var fi={dividerMargin:10,padding:5,textHeight:10},di=function(t){Object.keys(t).forEach((function(e){fi[e]=t[e]}))},pi=function(t,e){c.info("Drawing class"),cn.clear(),ai.parser.parse(t);var n=_t().flowchart;c.info("config:",n);var r=n.nodeSpacing||50,i=n.rankSpacing||50,a=new G.a.Graph({multigraph:!0,compound:!0}).setGraph({rankdir:"TD",nodesep:r,ranksep:i,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}})),o=cn.getClasses(),s=cn.getRelations();c.info(s),function(t,e){var n=Object.keys(t);c.info("keys:",n),c.info(t),n.forEach((function(n){var r=t[n],i="";r.cssClasses.length>0&&(i=i+" "+r.cssClasses.join(" "));var a={labelStyle:""},o=void 0!==r.text?r.text:r.id,s="";switch(r.type){case"class":s="class_box";break;default:s="class_box"}e.setNode(r.id,{labelStyle:a.labelStyle,shape:s,labelText:o,classData:r,rx:0,ry:0,class:i,style:a.style,id:r.id,domId:r.domId,haveCallback:r.haveCallback,link:r.link,width:"group"===r.type?500:void 0,type:r.type,padding:_t().flowchart.padding}),c.info("setNode",{labelStyle:a.labelStyle,shape:s,labelText:o,rx:0,ry:0,class:i,style:a.style,id:r.id,width:"group"===r.type?500:void 0,type:r.type,padding:_t().flowchart.padding})}))}(o,a),function(t,e){var n=0;t.forEach((function(r){n++;var i={classes:"relation"};i.pattern=1==r.relation.lineType?"dashed":"solid",i.id="id"+n,"arrow_open"===r.type?i.arrowhead="none":i.arrowhead="normal",c.info(i,r),i.startLabelRight="none"===r.relationTitle1?"":r.relationTitle1,i.endLabelLeft="none"===r.relationTitle2?"":r.relationTitle2,i.arrowTypeStart=yi(r.relation.type1),i.arrowTypeEnd=yi(r.relation.type2);var a="",o="";if(void 0!==r.style){var s=B(r.style);a=s.style,o=s.labelStyle}else a="fill:none";i.style=a,i.labelStyle=o,void 0!==r.interpolate?i.curve=D(r.interpolate,d.curveLinear):void 0!==t.defaultInterpolate?i.curve=D(t.defaultInterpolate,d.curveLinear):i.curve=D(fi.curve,d.curveLinear),r.text=r.title,void 0===r.text?void 0!==r.style&&(i.arrowheadStyle="fill: #333"):(i.arrowheadStyle="fill: #333",i.labelpos="c",_t().flowchart.htmlLabels,i.labelType="text",i.label=r.text.replace(x.lineBreakRegex,"\n"),void 0===r.style&&(i.style=i.style||"stroke: #333; stroke-width: 1.5px;fill:none"),i.labelStyle=i.labelStyle.replace("color:","fill:")),e.setEdge(r.id1,r.id2,i,n)}))}(s,a);var u=Object(d.select)('[id="'.concat(e,'"]'));u.attr("xmlns:xlink","http://www.w3.org/1999/xlink");var l=Object(d.select)("#"+e+" g");On(l,a,["aggregation","extension","composition","dependency"],"classDiagram",e);var h=u.node().getBBox(),f=h.width+16,p=h.height+16;if(c.debug("new ViewBox 0 0 ".concat(f," ").concat(p),"translate(".concat(8-a._label.marginx,", ").concat(8-a._label.marginy,")")),W(u,p,f,n.useMaxWidth),u.attr("viewBox","0 0 ".concat(f," ").concat(p)),u.select("g").attr("transform","translate(".concat(8-a._label.marginx,", ").concat(8-h.y,")")),!n.htmlLabels)for(var y=document.querySelectorAll('[id="'+e+'"] .edgeLabel .label'),g=0;g0&&o.length>0){var c={stmt:"state",id:P(),type:"divider",doc:mi(o)};i.push(mi(c)),n.doc=i}n.doc.forEach((function(e){return t(n,e,!0)}))}}({id:"root"},{id:"root",doc:bi},!0),{id:"root",doc:bi}},extract:function(t){var e;e=t.doc?t.doc:t,c.info(e),Ei(),c.info("Extract",e),e.forEach((function(t){"state"===t.stmt&&wi(t.id,t.type,t.doc,t.description,t.note),"relation"===t.stmt&&Ti(t.state1.id,t.state2.id,t.description)}))},trimColon:function(t){return t&&":"===t[0]?t.substr(1).trim():t.trim()}},Oi=n(22),Di=n.n(Oi),Ni={},Bi=function(t,e){Ni[t]=e},Li=function(t,e){var n=t.append("text").attr("x",2*_t().state.padding).attr("y",_t().state.textHeight+1.3*_t().state.padding).attr("font-size",_t().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),r=n.height,i=t.append("text").attr("x",_t().state.padding).attr("y",r+.4*_t().state.padding+_t().state.dividerMargin+_t().state.textHeight).attr("class","state-description"),a=!0,o=!0;e.descriptions.forEach((function(t){a||(!function(t,e,n){var r=t.append("tspan").attr("x",2*_t().state.padding).text(e);n||r.attr("dy",_t().state.textHeight)}(i,t,o),o=!1),a=!1}));var s=t.append("line").attr("x1",_t().state.padding).attr("y1",_t().state.padding+r+_t().state.dividerMargin/2).attr("y2",_t().state.padding+r+_t().state.dividerMargin/2).attr("class","descr-divider"),c=i.node().getBBox(),u=Math.max(c.width,n.width);return s.attr("x2",u+3*_t().state.padding),t.insert("rect",":first-child").attr("x",_t().state.padding).attr("y",_t().state.padding).attr("width",u+2*_t().state.padding).attr("height",c.height+r+2*_t().state.padding).attr("rx",_t().state.radius),t},Pi=function(t,e,n){var r,i=_t().state.padding,a=2*_t().state.padding,o=t.node().getBBox(),s=o.width,c=o.x,u=t.append("text").attr("x",0).attr("y",_t().state.titleShift).attr("font-size",_t().state.fontSize).attr("class","state-title").text(e.id),l=u.node().getBBox().width+a,h=Math.max(l,s);h===s&&(h+=a);var f=t.node().getBBox();e.doc,r=c-i,l>s&&(r=(s-h)/2+i),Math.abs(c-f.x)s&&(r=c-(l-s)/2);var d=1-_t().state.textHeight;return t.insert("rect",":first-child").attr("x",r).attr("y",d).attr("class",n?"alt-composit":"composit").attr("width",h).attr("height",f.height+_t().state.textHeight+_t().state.titleShift+1).attr("rx","0"),u.attr("x",r+i),l<=s&&u.attr("x",c+(h-a)/2-l/2+i),t.insert("rect",":first-child").attr("x",r).attr("y",_t().state.titleShift-_t().state.textHeight-_t().state.padding).attr("width",h).attr("height",3*_t().state.textHeight).attr("rx",_t().state.radius),t.insert("rect",":first-child").attr("x",r).attr("y",_t().state.titleShift-_t().state.textHeight-_t().state.padding).attr("width",h).attr("height",f.height+3+2*_t().state.textHeight).attr("rx",_t().state.radius),t},Ii=function(t,e){e.attr("class","state-note");var n=e.append("rect").attr("x",0).attr("y",_t().state.padding),r=function(t,e,n,r){var i=0,a=r.append("text");a.style("text-anchor","start"),a.attr("class","noteText");var o=t.replace(/\r\n/g,"
        "),s=(o=o.replace(/\n/g,"
        ")).split(x.lineBreakRegex),c=1.25*_t().state.noteMargin,u=!0,l=!1,h=void 0;try{for(var f,d=s[Symbol.iterator]();!(u=(f=d.next()).done);u=!0){var p=f.value.trim();if(p.length>0){var y=a.append("tspan");if(y.text(p),0===c)c+=y.node().getBBox().height;i+=c,y.attr("x",e+_t().state.noteMargin),y.attr("y",n+i+1.25*_t().state.noteMargin)}}}catch(t){l=!0,h=t}finally{try{u||null==d.return||d.return()}finally{if(l)throw h}}return{textWidth:a.node().getBBox().width,textHeight:i}}(t,0,0,e.append("g")),i=r.textWidth,a=r.textHeight;return n.attr("height",a+2*_t().state.noteMargin),n.attr("width",i+2*_t().state.noteMargin),n},Fi=function(t,e){var n=e.id,r={id:n,label:e.id,width:0,height:0},i=t.append("g").attr("id",n).attr("class","stateGroup");"start"===e.type&&function(t){t.append("circle").attr("class","start-state").attr("r",_t().state.sizeUnit).attr("cx",_t().state.padding+_t().state.sizeUnit).attr("cy",_t().state.padding+_t().state.sizeUnit)}(i),"end"===e.type&&function(t){t.append("circle").attr("class","end-state-outer").attr("r",_t().state.sizeUnit+_t().state.miniPadding).attr("cx",_t().state.padding+_t().state.sizeUnit+_t().state.miniPadding).attr("cy",_t().state.padding+_t().state.sizeUnit+_t().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",_t().state.sizeUnit).attr("cx",_t().state.padding+_t().state.sizeUnit+2).attr("cy",_t().state.padding+_t().state.sizeUnit+2)}(i),"fork"!==e.type&&"join"!==e.type||function(t,e){var n=_t().state.forkWidth,r=_t().state.forkHeight;if(e.parentId){var i=n;n=r,r=i}t.append("rect").style("stroke","black").style("fill","black").attr("width",n).attr("height",r).attr("x",_t().state.padding).attr("y",_t().state.padding)}(i,e),"note"===e.type&&Ii(e.note.text,i),"divider"===e.type&&function(t){t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",_t().state.textHeight).attr("class","divider").attr("x2",2*_t().state.textHeight).attr("y1",0).attr("y2",0)}(i),"default"===e.type&&0===e.descriptions.length&&function(t,e){var n=t.append("text").attr("x",2*_t().state.padding).attr("y",_t().state.textHeight+2*_t().state.padding).attr("font-size",_t().state.fontSize).attr("class","state-title").text(e.id),r=n.node().getBBox();t.insert("rect",":first-child").attr("x",_t().state.padding).attr("y",_t().state.padding).attr("width",r.width+2*_t().state.padding).attr("height",r.height+2*_t().state.padding).attr("rx",_t().state.radius)}(i,e),"default"===e.type&&e.descriptions.length>0&&Li(i,e);var a=i.node().getBBox();return r.width=a.width+2*_t().state.padding,r.height=a.height+2*_t().state.padding,Bi(n,r),r},ji=0;Oi.parser.yy=Mi;var Ri={},Yi=function t(e,n,r,i){var a,o=new G.a.Graph({compound:!0,multigraph:!0}),s=!0;for(a=0;a "+t.w+": "+JSON.stringify(o.edge(t))),function(t,e,n){e.points=e.points.filter((function(t){return!Number.isNaN(t.y)}));var r=e.points,i=Object(d.line)().x((function(t){return t.x})).y((function(t){return t.y})).curve(d.curveBasis),a=t.append("path").attr("d",i(r)).attr("id","edge"+ji).attr("class","transition"),o="";if(_t().state.arrowMarkerAbsolute&&(o=(o=(o=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search).replace(/\(/g,"\\(")).replace(/\)/g,"\\)")),a.attr("marker-end","url("+o+"#"+function(t){switch(t){case Mi.relationType.AGGREGATION:return"aggregation";case Mi.relationType.EXTENSION:return"extension";case Mi.relationType.COMPOSITION:return"composition";case Mi.relationType.DEPENDENCY:return"dependency"}}(Mi.relationType.DEPENDENCY)+"End)"),void 0!==n.title){for(var s=t.append("g").attr("class","stateLabel"),u=H.calcLabelPosition(e.points),l=u.x,h=u.y,f=x.getRows(n.title),p=0,y=[],g=0,v=0,m=0;m<=f.length;m++){var b=s.append("text").attr("text-anchor","middle").text(f[m]).attr("x",l).attr("y",h+p),_=b.node().getBBox();if(g=Math.max(g,_.width),v=Math.min(v,_.x),c.info(_.x,l,h+p),0===p){var k=b.node().getBBox();p=k.height,c.info("Title height",p,h)}y.push(b)}var w=p*f.length;if(f.length>1){var E=(f.length-1)*p*.5;y.forEach((function(t,e){return t.attr("y",h+e*p-E)})),w=p*f.length}var T=s.node().getBBox();s.insert("rect",":first-child").attr("class","box").attr("x",l-g/2-_t().state.padding/2).attr("y",h-w/2-_t().state.padding/2-3.5).attr("width",g+_t().state.padding).attr("height",w+_t().state.padding),c.info(T)}ji++}(n,o.edge(t),o.edge(t).relation))})),w=k.getBBox();var E={id:r||"root",label:r||"root",width:0,height:0};return E.width=w.width+2*vi.padding,E.height=w.height+2*vi.padding,c.debug("Doc rendered",E,o),E},zi=function(){},Ui=function(t,e){vi=_t().state,Oi.parser.yy.clear(),Oi.parser.parse(t),c.debug("Rendering diagram "+t);var n=Object(d.select)("[id='".concat(e,"']"));n.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z"),new G.a.Graph({multigraph:!0,compound:!0,rankdir:"RL"}).setDefaultEdgeLabel((function(){return{}}));var r=Mi.getRootDoc();Yi(r,n,void 0,!1);var i=vi.padding,a=n.node().getBBox(),o=a.width+2*i,s=a.height+2*i;W(n,s,1.75*o,vi.useMaxWidth),n.attr("viewBox","".concat(a.x-vi.padding," ").concat(a.y-vi.padding," ")+o+" "+s)},$i={},Wi={},Hi=function(t,e,n,r){if("root"!==n.id){var i="rect";!0===n.start&&(i="start"),!1===n.start&&(i="end"),"default"!==n.type&&(i=n.type),Wi[n.id]||(Wi[n.id]={id:n.id,shape:i,description:n.id,classes:"statediagram-state"}),n.description&&(Array.isArray(Wi[n.id].description)?(Wi[n.id].shape="rectWithTitle",Wi[n.id].description.push(n.description)):Wi[n.id].description.length>0?(Wi[n.id].shape="rectWithTitle",Wi[n.id].description===n.id?Wi[n.id].description=[n.description]:Wi[n.id].description=[Wi[n.id].description,n.description]):(Wi[n.id].shape="rect",Wi[n.id].description=n.description)),!Wi[n.id].type&&n.doc&&(c.info("Setting cluser for ",n.id),Wi[n.id].type="group",Wi[n.id].shape="divider"===n.type?"divider":"roundedWithTitle",Wi[n.id].classes=Wi[n.id].classes+" "+(r?"statediagram-cluster statediagram-cluster-alt":"statediagram-cluster"));var a={labelStyle:"",shape:Wi[n.id].shape,labelText:Wi[n.id].description,classes:Wi[n.id].classes,style:"",id:n.id,domId:"state-"+n.id+"-"+Vi,type:Wi[n.id].type,padding:15};if(n.note){var o={labelStyle:"",shape:"note",labelText:n.note.text,classes:"statediagram-note",style:"",id:n.id+"----note",domId:"state-"+n.id+"----note-"+Vi,type:Wi[n.id].type,padding:15},s={labelStyle:"",shape:"noteGroup",labelText:n.note.text,classes:Wi[n.id].classes,style:"",id:n.id+"----parent",domId:"state-"+n.id+"----parent-"+Vi,type:"group",padding:0};Vi++,t.setNode(n.id+"----parent",s),t.setNode(o.id,o),t.setNode(n.id,a),t.setParent(n.id,n.id+"----parent"),t.setParent(o.id,n.id+"----parent");var u=n.id,l=o.id;"left of"===n.note.position&&(u=o.id,l=n.id),t.setEdge(u,l,{arrowhead:"none",arrowType:"",style:"fill:none",labelStyle:"",classes:"transition note-edge",arrowheadStyle:"fill: #333",labelpos:"c",labelType:"text",thickness:"normal"})}else t.setNode(n.id,a)}e&&"root"!==e.id&&(c.info("Setting node ",n.id," to be child of its parent ",e.id),t.setParent(n.id,e.id)),n.doc&&(c.info("Adding nodes children "),Gi(t,n,n.doc,!r))},Vi=0,Gi=function(t,e,n,r){Vi=0,c.trace("items",n),n.forEach((function(n){if("state"===n.stmt||"default"===n.stmt)Hi(t,e,n,r);else if("relation"===n.stmt){Hi(t,e,n.state1,r),Hi(t,e,n.state2,r);var i={id:"edge"+Vi,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:"fill:none",labelStyle:"",label:n.description,arrowheadStyle:"fill: #333",labelpos:"c",labelType:"text",thickness:"normal",classes:"transition"},a=n.state1.id,o=n.state2.id;t.setEdge(a,o,i,Vi),Vi++}}))},qi=function(t){for(var e=Object.keys(t),n=0;ne.seq?t:e}),t[0]),n="";t.forEach((function(t){n+=t===e?"\t*":"\t|"}));var r,i,a,o=[n,e.id,e.seq];for(var s in Ki)Ki[s]===e.id&&o.push(s);if(c.debug(o.join(" ")),Array.isArray(e.parent)){var u=Zi[e.parent[0]];aa(t,e,u),t.push(Zi[e.parent[1]])}else{if(null==e.parent)return;var l=Zi[e.parent];aa(t,e,l)}r=t,i=function(t){return t.id},a=Object.create(null),oa(t=r.reduce((function(t,e){var n=i(e);return a[n]||(a[n]=!0,t.push(e)),t}),[]))}var sa,ca=function(){var t=Object.keys(Zi).map((function(t){return Zi[t]}));return t.forEach((function(t){c.debug(t.id)})),t.sort((function(t,e){return e.seq-t.seq})),t},ua={setDirection:function(t){ta=t},setOptions:function(t){c.debug("options str",t),t=(t=t&&t.trim())||"{}";try{ia=JSON.parse(t)}catch(t){c.error("error while parsing gitGraph options",t.message)}},getOptions:function(){return ia},commit:function(t){var e={id:na(),message:t,seq:ea++,parent:null==Ji?null:Ji.id};Ji=e,Zi[e.id]=e,Ki[Qi]=e.id,c.debug("in pushCommit "+e.id)},branch:function(t){Ki[t]=null!=Ji?Ji.id:null,c.debug("in createBranch")},merge:function(t){var e=Zi[Ki[Qi]],n=Zi[Ki[t]];if(function(t,e){return t.seq>e.seq&&ra(e,t)}(e,n))c.debug("Already merged");else{if(ra(e,n))Ki[Qi]=Ki[t],Ji=Zi[Ki[Qi]];else{var r={id:na(),message:"merged branch "+t+" into "+Qi,seq:ea++,parent:[null==Ji?null:Ji.id,Ki[t]]};Ji=r,Zi[r.id]=r,Ki[Qi]=r.id}c.debug(Ki),c.debug("in mergeBranch")}},checkout:function(t){c.debug("in checkout");var e=Ki[Qi=t];Ji=Zi[e]},reset:function(t){c.debug("in reset",t);var e=t.split(":")[0],n=parseInt(t.split(":")[1]),r="HEAD"===e?Ji:Zi[Ki[e]];for(c.debug(r,n);n>0;)if(n--,!(r=Zi[r.parent])){var i="Critical error - unique parent commit not found during reset";throw c.error(i),i}Ji=r,Ki[Qi]=r.id},prettyPrint:function(){c.debug(Zi),oa([ca()[0]])},clear:function(){Zi={},Ki={master:Ji=null},Qi="master",ea=0},getBranchesAsObjArray:function(){var t=[];for(var e in Ki)t.push({name:e,commit:Zi[Ki[e]]});return t},getBranches:function(){return Ki},getCommits:function(){return Zi},getCommitsArray:ca,getCurrentBranch:function(){return Qi},getDirection:function(){return ta},getHead:function(){return Ji}},la=n(71),ha=n.n(la),fa={},da={nodeSpacing:150,nodeFillColor:"yellow",nodeStrokeWidth:2,nodeStrokeColor:"grey",lineStrokeWidth:4,branchOffset:50,lineColor:"grey",leftMargin:50,branchColors:["#442f74","#983351","#609732","#AA9A39"],nodeRadius:10,nodeLabel:{width:75,height:100,x:-25,y:0}},pa={};function ya(t,e,n,r){var i=D(r,d.curveBasis),a=da.branchColors[n%da.branchColors.length],o=Object(d.line)().x((function(t){return Math.round(t.x)})).y((function(t){return Math.round(t.y)})).curve(i);t.append("svg:path").attr("d",o(e)).style("stroke",a).style("stroke-width",da.lineStrokeWidth).style("fill","none")}function ga(t,e){e=e||t.node().getBBox();var n=t.node().getCTM();return{left:n.e+e.x*n.a,top:n.f+e.y*n.d,width:e.width,height:e.height}}function va(t,e,n,r,i){c.debug("svgDrawLineForCommits: ",e,n);var a=ga(t.select("#node-"+e+" circle")),o=ga(t.select("#node-"+n+" circle"));switch(r){case"LR":if(a.left-o.left>da.nodeSpacing){var s={x:a.left-da.nodeSpacing,y:o.top+o.height/2};ya(t,[s,{x:o.left+o.width,y:o.top+o.height/2}],i,"linear"),ya(t,[{x:a.left,y:a.top+a.height/2},{x:a.left-da.nodeSpacing/2,y:a.top+a.height/2},{x:a.left-da.nodeSpacing/2,y:s.y},s],i)}else ya(t,[{x:a.left,y:a.top+a.height/2},{x:a.left-da.nodeSpacing/2,y:a.top+a.height/2},{x:a.left-da.nodeSpacing/2,y:o.top+o.height/2},{x:o.left+o.width,y:o.top+o.height/2}],i);break;case"BT":if(o.top-a.top>da.nodeSpacing){var u={x:o.left+o.width/2,y:a.top+a.height+da.nodeSpacing};ya(t,[u,{x:o.left+o.width/2,y:o.top}],i,"linear"),ya(t,[{x:a.left+a.width/2,y:a.top+a.height},{x:a.left+a.width/2,y:a.top+a.height+da.nodeSpacing/2},{x:o.left+o.width/2,y:u.y-da.nodeSpacing/2},u],i)}else ya(t,[{x:a.left+a.width/2,y:a.top+a.height},{x:a.left+a.width/2,y:a.top+da.nodeSpacing/2},{x:o.left+o.width/2,y:o.top-da.nodeSpacing/2},{x:o.left+o.width/2,y:o.top}],i)}}function ma(t,e){return t.select(e).node().cloneNode(!0)}function ba(t,e,n,r){var i,a=Object.keys(fa).length;if("string"==typeof e)do{if(i=fa[e],c.debug("in renderCommitHistory",i.id,i.seq),t.select("#node-"+e).size()>0)return;t.append((function(){return ma(t,"#def-commit")})).attr("class","commit").attr("id",(function(){return"node-"+i.id})).attr("transform",(function(){switch(r){case"LR":return"translate("+(i.seq*da.nodeSpacing+da.leftMargin)+", "+sa*da.branchOffset+")";case"BT":return"translate("+(sa*da.branchOffset+da.leftMargin)+", "+(a-i.seq)*da.nodeSpacing+")"}})).attr("fill",da.nodeFillColor).attr("stroke",da.nodeStrokeColor).attr("stroke-width",da.nodeStrokeWidth);var o=void 0;for(var s in n)if(n[s].commit===i){o=n[s];break}o&&(c.debug("found branch ",o.name),t.select("#node-"+i.id+" p").append("xhtml:span").attr("class","branch-label").text(o.name+", ")),t.select("#node-"+i.id+" p").append("xhtml:span").attr("class","commit-id").text(i.id),""!==i.message&&"BT"===r&&t.select("#node-"+i.id+" p").append("xhtml:span").attr("class","commit-msg").text(", "+i.message),e=i.parent}while(e&&fa[e]);Array.isArray(e)&&(c.debug("found merge commmit",e),ba(t,e[0],n,r),sa++,ba(t,e[1],n,r),sa--)}function xa(t,e,n,r){for(r=r||0;e.seq>0&&!e.lineDrawn;)"string"==typeof e.parent?(va(t,e.id,e.parent,n,r),e.lineDrawn=!0,e=fa[e.parent]):Array.isArray(e.parent)&&(va(t,e.id,e.parent[0],n,r),va(t,e.id,e.parent[1],n,r+1),xa(t,fa[e.parent[1]],n,r+1),e.lineDrawn=!0,e=fa[e.parent[0]])}var _a,ka=function(t){pa=t},wa=function(t,e,n){try{var r=ha.a.parser;r.yy=ua,r.yy.clear(),c.debug("in gitgraph renderer",t+"\n","id:",e,n),r.parse(t+"\n"),da=Object.assign(da,pa,ua.getOptions()),c.debug("effective options",da);var i=ua.getDirection();fa=ua.getCommits();var a=ua.getBranchesAsObjArray();"BT"===i&&(da.nodeLabel.x=a.length*da.branchOffset,da.nodeLabel.width="100%",da.nodeLabel.y=-2*da.nodeRadius);var o=Object(d.select)('[id="'.concat(e,'"]'));for(var s in function(t){t.append("defs").append("g").attr("id","def-commit").append("circle").attr("r",da.nodeRadius).attr("cx",0).attr("cy",0),t.select("#def-commit").append("foreignObject").attr("width",da.nodeLabel.width).attr("height",da.nodeLabel.height).attr("x",da.nodeLabel.x).attr("y",da.nodeLabel.y).attr("class","node-label").attr("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility").append("p").html("")}(o),sa=1,a){var u=a[s];ba(o,u.commit.id,a,i),xa(o,u.commit,i),sa++}o.attr("height",(function(){return"BT"===i?Object.keys(fa).length*da.nodeSpacing:(a.length+1)*da.branchOffset}))}catch(t){c.error("Error while rendering gitgraph"),c.error(t.message)}},Ea="",Ta=!1,Ca={setMessage:function(t){c.debug("Setting message to: "+t),Ea=t},getMessage:function(){return Ea},setInfo:function(t){Ta=t},getInfo:function(){return Ta}},Aa=n(72),Sa=n.n(Aa),Ma={},Oa=function(t){Object.keys(t).forEach((function(e){Ma[e]=t[e]}))},Da=function(t,e,n){try{var r=Sa.a.parser;r.yy=Ca,c.debug("Renering info diagram\n"+t),r.parse(t),c.debug("Parsed info diagram");var i=Object(d.select)("#"+e);i.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size","32px").style("text-anchor","middle").text("v "+n),i.attr("height",100),i.attr("width",400)}catch(t){c.error("Error while rendering info diagram"),c.error(t.message)}},Na={},Ba=function(t){Object.keys(t).forEach((function(e){Na[e]=t[e]}))},La=function(t,e){try{c.debug("Renering svg for syntax error\n");var n=Object(d.select)("#"+t),r=n.append("g");r.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),r.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),r.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),r.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),r.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),r.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),r.append("text").attr("class","error-text").attr("x",1240).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in graph"),r.append("text").attr("class","error-text").attr("x",1050).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text("mermaid version "+e),n.attr("height",100),n.attr("width",400),n.attr("viewBox","768 0 512 512")}catch(t){c.error("Error while rendering info diagram"),c.error(t.message)}},Pa={},Ia="",Fa={parseDirective:function(t,e,n){Go.parseDirective(this,t,e,n)},getConfig:function(){return _t().pie},addSection:function(t,e){void 0===Pa[t]&&(Pa[t]=e,c.debug("Added new section :",t))},getSections:function(){return Pa},cleanupValue:function(t){return":"===t.substring(0,1)?(t=t.substring(1).trim(),Number(t.trim())):Number(t.trim())},clear:function(){Pa={},Ia=""},setTitle:function(t){Ia=t},getTitle:function(){return Ia}},ja=n(73),Ra=n.n(ja),Ya={},za=function(t){Object.keys(t).forEach((function(e){Ya[e]=t[e]}))},Ua=function(t,e){try{var n=Ra.a.parser;n.yy=Fa,c.debug("Rendering info diagram\n"+t),n.yy.clear(),n.parse(t),c.debug("Parsed info diagram");var r=document.getElementById(e);void 0===(_a=r.parentElement.offsetWidth)&&(_a=1200),void 0!==Ya.useWidth&&(_a=Ya.useWidth);var i=Object(d.select)("#"+e);W(i,450,_a,Ya.useMaxWidth),r.setAttribute("viewBox","0 0 "+_a+" 450");var a=Math.min(_a,450)/2-40,o=i.append("g").attr("transform","translate("+_a/2+",225)"),s=Fa.getSections(),u=0;Object.keys(s).forEach((function(t){u+=s[t]}));var l=Object(d.scaleOrdinal)().domain(s).range(d.schemeSet2),h=Object(d.pie)().value((function(t){return t.value}))(Object(d.entries)(s)),f=Object(d.arc)().innerRadius(0).outerRadius(a);o.selectAll("mySlices").data(h).enter().append("path").attr("d",f).attr("fill",(function(t){return l(t.data.key)})).attr("stroke","black").style("stroke-width","2px").style("opacity",.7),o.selectAll("mySlices").data(h.filter((function(t){return 0!==t.data.value}))).enter().append("text").text((function(t){return(t.data.value/u*100).toFixed(0)+"%"})).attr("transform",(function(t){return"translate("+f.centroid(t)+")"})).style("text-anchor","middle").attr("class","slice").style("font-size",17),o.append("text").text(n.yy.getTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");var p=o.selectAll(".legend").data(l.domain()).enter().append("g").attr("class","legend").attr("transform",(function(t,e){return"translate(216,"+(22*e-22*l.domain().length/2)+")"}));p.append("rect").attr("width",18).attr("height",18).style("fill",l).style("stroke",l),p.append("text").attr("x",22).attr("y",14).text((function(t){return t}))}catch(t){c.error("Error while rendering info diagram"),c.error(t)}},$a={},Wa=[],Ha="",Va=function(t){return void 0===$a[t]&&($a[t]={attributes:[]},c.info("Added new entity :",t)),$a[t]},Ga={Cardinality:{ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE"},Identification:{NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},parseDirective:function(t,e,n){Go.parseDirective(this,t,e,n)},getConfig:function(){return _t().er},addEntity:Va,addAttributes:function(t,e){var n,r=Va(t);for(n=e.length-1;n>=0;n--)r.attributes.push(e[n]),c.debug("Added attribute ",e[n].attributeName)},getEntities:function(){return $a},addRelationship:function(t,e,n,r){var i={entityA:t,roleA:e,entityB:n,relSpec:r};Wa.push(i),c.debug("Added new relationship :",i)},getRelationships:function(){return Wa},clear:function(){$a={},Wa=[],Ha=""},setTitle:function(t){Ha=t},getTitle:function(){return Ha}},qa=n(74),Xa=n.n(qa),Za={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END"},Ja=Za,Ka=function(t,e){var n;t.append("defs").append("marker").attr("id",Za.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",Za.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),(n=t.append("defs").append("marker").attr("id",Za.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto")).append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),(n=t.append("defs").append("marker").attr("id",Za.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto")).append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",Za.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",Za.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),(n=t.append("defs").append("marker").attr("id",Za.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto")).append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),(n=t.append("defs").append("marker").attr("id",Za.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto")).append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},Qa={},to=function(t,e,n){var r;return Object.keys(e).forEach((function(i){var a=t.append("g").attr("id",i);r=void 0===r?i:r;var o="entity-"+i,s=a.append("text").attr("class","er entityLabel").attr("id",o).attr("x",0).attr("y",0).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("style","font-family: "+_t().fontFamily+"; font-size: "+Qa.fontSize+"px").text(i),c=function(t,e,n){var r=Qa.entityPadding/3,i=Qa.entityPadding/3,a=.85*Qa.fontSize,o=e.node().getBBox(),s=[],c=0,u=0,l=o.height+2*r,h=1;n.forEach((function(n){var i="".concat(e.node().id,"-attr-").concat(h),o=t.append("text").attr("class","er entityLabel").attr("id","".concat(i,"-type")).attr("x",0).attr("y",0).attr("dominant-baseline","middle").attr("text-anchor","left").attr("style","font-family: "+_t().fontFamily+"; font-size: "+a+"px").text(n.attributeType),f=t.append("text").attr("class","er entityLabel").attr("id","".concat(i,"-name")).attr("x",0).attr("y",0).attr("dominant-baseline","middle").attr("text-anchor","left").attr("style","font-family: "+_t().fontFamily+"; font-size: "+a+"px").text(n.attributeName);s.push({tn:o,nn:f});var d=o.node().getBBox(),p=f.node().getBBox();c=Math.max(c,d.width),u=Math.max(u,p.width),l+=Math.max(d.height,p.height)+2*r,h+=1}));var f={width:Math.max(Qa.minEntityWidth,Math.max(o.width+2*Qa.entityPadding,c+u+4*i)),height:n.length>0?l:Math.max(Qa.minEntityHeight,o.height+2*Qa.entityPadding)},d=Math.max(0,f.width-(c+u)-4*i);if(n.length>0){e.attr("transform","translate("+f.width/2+","+(r+o.height/2)+")");var p=o.height+2*r,y="attributeBoxOdd";s.forEach((function(e){var n=p+r+Math.max(e.tn.node().getBBox().height,e.nn.node().getBBox().height)/2;e.tn.attr("transform","translate("+i+","+n+")");var a=t.insert("rect","#"+e.tn.node().id).attr("class","er ".concat(y)).attr("fill",Qa.fill).attr("fill-opacity","100%").attr("stroke",Qa.stroke).attr("x",0).attr("y",p).attr("width",c+2*i+d/2).attr("height",e.tn.node().getBBox().height+2*r);e.nn.attr("transform","translate("+(parseFloat(a.attr("width"))+i)+","+n+")"),t.insert("rect","#"+e.nn.node().id).attr("class","er ".concat(y)).attr("fill",Qa.fill).attr("fill-opacity","100%").attr("stroke",Qa.stroke).attr("x","".concat(a.attr("x")+a.attr("width"))).attr("y",p).attr("width",u+2*i+d/2).attr("height",e.nn.node().getBBox().height+2*r),p+=Math.max(e.tn.node().getBBox().height,e.nn.node().getBBox().height)+2*r,y="attributeBoxOdd"==y?"attributeBoxEven":"attributeBoxOdd"}))}else f.height=Math.max(Qa.minEntityHeight,l),e.attr("transform","translate("+f.width/2+","+f.height/2+")");return f}(a,s,e[i].attributes),u=c.width,l=c.height,h=a.insert("rect","#"+o).attr("class","er entityBox").attr("fill",Qa.fill).attr("fill-opacity","100%").attr("stroke",Qa.stroke).attr("x",0).attr("y",0).attr("width",u).attr("height",l).node().getBBox();n.setNode(i,{width:h.width,height:h.height,shape:"rect",id:i})})),r},eo=function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")},no=0,ro=function(t){for(var e=Object.keys(t),n=0;n/gi," "),r=t.append("text");r.attr("x",e.x),r.attr("y",e.y),r.attr("class","legend"),r.style("text-anchor",e.anchor),void 0!==e.class&&r.attr("class",e.class);var i=r.append("tspan");return i.attr("x",e.x+2*e.textMargin),i.text(n),r},bo=-1,xo=function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},_o=function(){function t(t,e,n,i,a,o,s,c){r(e.append("text").attr("x",n+a/2).attr("y",i+o/2+5).style("font-color",c).style("text-anchor","middle").text(t),s)}function e(t,e,n,i,a,o,s,c,u){for(var l=c.taskFontSize,h=c.taskFontFamily,f=t.split(//gi),d=0;d3?function(t){var e=Object(d.arc)().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(15/2.2);t.append("path").attr("class","mouth").attr("d",e).attr("transform","translate("+o.cx+","+(o.cy+2)+")")}(s):o.score<3?function(t){var e=Object(d.arc)().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(15/2.2);t.append("path").attr("class","mouth").attr("d",e).attr("transform","translate("+o.cx+","+(o.cy+7)+")")}(s):function(t){t.append("line").attr("class","mouth").attr("stroke",2).attr("x1",o.cx-5).attr("y1",o.cy+7).attr("x2",o.cx+5).attr("y2",o.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}(s);var c=xo();c.x=e.x,c.y=e.y,c.fill=e.fill,c.width=n.width,c.height=n.height,c.class="task task-type-"+e.num,c.rx=3,c.ry=3,go(i,c);var u=e.x+14;e.people.forEach((function(t){var n=e.actors[t],r={cx:u,cy:e.y,r:7,fill:n,stroke:"#000",title:t};vo(i,r),u+=10})),_o(n)(e.task,i,c.x,c.y,c.width,c.height,{class:"task"},n,e.colour)},Co=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")};ao.parser.yy=yo;var Ao={leftMargin:150,diagramMarginX:50,diagramMarginY:20,taskMargin:50,width:150,height:50,taskFontSize:14,taskFontFamily:'"Open-Sans", "sans-serif"',boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},So={};var Mo=Ao.leftMargin,Oo={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},updateVal:function(t,e,n,r){void 0===t[e]?t[e]=n:t[e]=r(n,t[e])},updateBounds:function(t,e,n,r){var i,a=this,o=0;this.sequenceItems.forEach((function(s){o++;var c=a.sequenceItems.length-o+1;a.updateVal(s,"starty",e-c*Ao.boxMargin,Math.min),a.updateVal(s,"stopy",r+c*Ao.boxMargin,Math.max),a.updateVal(Oo.data,"startx",t-c*Ao.boxMargin,Math.min),a.updateVal(Oo.data,"stopx",n+c*Ao.boxMargin,Math.max),"activation"!==i&&(a.updateVal(s,"startx",t-c*Ao.boxMargin,Math.min),a.updateVal(s,"stopx",n+c*Ao.boxMargin,Math.max),a.updateVal(Oo.data,"starty",e-c*Ao.boxMargin,Math.min),a.updateVal(Oo.data,"stopy",r+c*Ao.boxMargin,Math.max))}))},insert:function(t,e,n,r){var i=Math.min(t,n),a=Math.max(t,n),o=Math.min(e,r),s=Math.max(e,r);this.updateVal(Oo.data,"startx",i,Math.min),this.updateVal(Oo.data,"starty",o,Math.min),this.updateVal(Oo.data,"stopx",a,Math.max),this.updateVal(Oo.data,"stopy",s,Math.max),this.updateBounds(i,o,a,s)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return this.data}},Do=Ao.sectionFills,No=Ao.sectionColours,Bo=function(t,e,n){for(var r="",i=n+(2*Ao.height+Ao.diagramMarginY),a=0,o="#CCC",s="black",c=0,u=0;u tspan {\n fill: ").concat(t.actorTextColor,";\n stroke: none;\n }\n\n .actor-line {\n stroke: ").concat(t.actorLineColor,";\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ").concat(t.signalColor,";\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ").concat(t.signalColor,";\n }\n\n #arrowhead path {\n fill: ").concat(t.signalColor,";\n stroke: ").concat(t.signalColor,";\n }\n\n .sequenceNumber {\n fill: ").concat(t.sequenceNumberColor,";\n }\n\n #sequencenumber {\n fill: ").concat(t.signalColor,";\n }\n\n #crosshead path {\n fill: ").concat(t.signalColor,";\n stroke: ").concat(t.signalColor,";\n }\n\n .messageText {\n fill: ").concat(t.signalTextColor,";\n stroke: ").concat(t.signalTextColor,";\n }\n\n .labelBox {\n stroke: ").concat(t.labelBoxBorderColor,";\n fill: ").concat(t.labelBoxBkgColor,";\n }\n\n .labelText, .labelText > tspan {\n fill: ").concat(t.labelTextColor,";\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ").concat(t.loopTextColor,";\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ").concat(t.labelBoxBorderColor,";\n fill: ").concat(t.labelBoxBorderColor,";\n }\n\n .note {\n //stroke: #decc93;\n stroke: ").concat(t.noteBorderColor,";\n fill: ").concat(t.noteBkgColor,";\n }\n\n .noteText, .noteText > tspan {\n fill: ").concat(t.noteTextColor,";\n stroke: none;\n }\n\n .activation0 {\n fill: ").concat(t.activationBkgColor,";\n stroke: ").concat(t.activationBorderColor,";\n }\n\n .activation1 {\n fill: ").concat(t.activationBkgColor,";\n stroke: ").concat(t.activationBorderColor,";\n }\n\n .activation2 {\n fill: ").concat(t.activationBkgColor,";\n stroke: ").concat(t.activationBorderColor,";\n }\n")},gantt:function(t){return'\n .mermaid-main-font {\n font-family: "trebuchet ms", verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: '.concat(t.sectionBkgColor,";\n }\n\n .section2 {\n fill: ").concat(t.sectionBkgColor2,";\n }\n\n .section1,\n .section3 {\n fill: ").concat(t.altSectionBkgColor,";\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ").concat(t.titleColor,";\n }\n\n .sectionTitle1 {\n fill: ").concat(t.titleColor,";\n }\n\n .sectionTitle2 {\n fill: ").concat(t.titleColor,";\n }\n\n .sectionTitle3 {\n fill: ").concat(t.titleColor,";\n }\n\n .sectionTitle {\n text-anchor: start;\n font-size: 11px;\n text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ").concat(t.gridColor,";\n opacity: 0.8;\n shape-rendering: crispEdges;\n text {\n font-family: ").concat(t.fontFamily,";\n fill: ").concat(t.textColor,";\n }\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ").concat(t.todayLineColor,";\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n .taskText:not([font-size]) {\n font-size: 11px;\n }\n\n .taskTextOutsideRight {\n fill: ").concat(t.taskTextDarkColor,";\n text-anchor: start;\n font-size: 11px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n .taskTextOutsideLeft {\n fill: ").concat(t.taskTextDarkColor,";\n text-anchor: end;\n font-size: 11px;\n }\n\n /* Special case clickable */\n .task.clickable {\n cursor: pointer;\n }\n .taskText.clickable {\n cursor: pointer;\n fill: ").concat(t.taskTextClickableColor," !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ").concat(t.taskTextClickableColor," !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ").concat(t.taskTextClickableColor," !important;\n font-weight: bold;\n }\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ").concat(t.taskTextColor,";\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ").concat(t.taskBkgColor,";\n stroke: ").concat(t.taskBorderColor,";\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ").concat(t.taskTextOutsideColor,";\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ").concat(t.taskTextOutsideColor,";\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ").concat(t.activeTaskBkgColor,";\n stroke: ").concat(t.activeTaskBorderColor,";\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ").concat(t.taskTextDarkColor," !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ").concat(t.doneTaskBorderColor,";\n fill: ").concat(t.doneTaskBkgColor,";\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ").concat(t.taskTextDarkColor," !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ").concat(t.critBorderColor,";\n fill: ").concat(t.critBkgColor,";\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ").concat(t.critBorderColor,";\n fill: ").concat(t.activeTaskBkgColor,";\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ").concat(t.critBorderColor,";\n fill: ").concat(t.doneTaskBkgColor,";\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ").concat(t.taskTextDarkColor," !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ").concat(t.taskTextDarkColor," !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ").concat(t.textColor," ;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n")},classDiagram:Io,"classDiagram-v2":Io,class:Io,stateDiagram:jo,state:jo,git:function(){return"\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n"},info:function(){return""},pie:function(t){return".pieTitleText {\n text-anchor: middle;\n font-size: 25px;\n fill: ".concat(t.taskTextDarkColor,";\n font-family: ").concat(t.fontFamily,";\n }\n .slice {\n font-family: ").concat(t.fontFamily,";\n fill: ").concat(t.textColor,";\n // fill: white;\n }\n .legend text {\n fill: ").concat(t.taskTextDarkColor,";\n font-family: ").concat(t.fontFamily,";\n font-size: 17px;\n }\n")},er:function(t){return"\n .entityBox {\n fill: ".concat(t.mainBkg,";\n stroke: ").concat(t.nodeBorder,";\n }\n\n .attributeBoxOdd {\n fill: #ffffff;\n stroke: ").concat(t.nodeBorder,";\n }\n\n .attributeBoxEven {\n fill: #f2f2f2;\n stroke: ").concat(t.nodeBorder,";\n }\n\n .relationshipLabelBox {\n fill: ").concat(t.tertiaryColor,";\n opacity: 0.7;\n background-color: ").concat(t.tertiaryColor,";\n rect {\n opacity: 0.5;\n }\n }\n\n .relationshipLine {\n stroke: ").concat(t.lineColor,";\n }\n")},journey:function(t){return".label {\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n color: ".concat(t.textColor,";\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ").concat(t.textColor,"\n }\n\n .legend {\n fill: ").concat(t.textColor,";\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ").concat(t.textColor,"\n }\n\n .face {\n fill: #FFF8DC;\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ").concat(t.mainBkg,";\n stroke: ").concat(t.nodeBorder,";\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ").concat(t.arrowheadColor,";\n }\n\n .edgePath .path {\n stroke: ").concat(t.lineColor,";\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ").concat(t.lineColor,";\n fill: none;\n }\n\n .edgeLabel {\n background-color: ").concat(t.edgeLabelBackground,";\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ").concat(t.titleColor,";\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: ").concat(t.tertiaryColor,";\n border: 1px solid ").concat(t.border2,";\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType0):"",";\n }\n .task-type-1, .section-type-1 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType1):"",";\n }\n .task-type-2, .section-type-2 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType2):"",";\n }\n .task-type-3, .section-type-3 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType3):"",";\n }\n .task-type-4, .section-type-4 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType4):"",";\n }\n .task-type-5, .section-type-5 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType5):"",";\n }\n .task-type-6, .section-type-6 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType6):"",";\n }\n .task-type-7, .section-type-7 {\n ").concat(t.fillType0?"fill: ".concat(t.fillType7):"",";\n }\n")}},Yo=function(t,e,n){return" {\n font-family: ".concat(n.fontFamily,";\n font-size: ").concat(n.fontSize,";\n fill: ").concat(n.textColor,"\n }\n\n /* Classes common for multiple diagrams */\n\n .error-icon {\n fill: ").concat(n.errorBkgColor,";\n }\n .error-text {\n fill: ").concat(n.errorTextColor,";\n stroke: ").concat(n.errorTextColor,";\n }\n\n .edge-thickness-normal {\n stroke-width: 2px;\n }\n .edge-thickness-thick {\n stroke-width: 3.5px\n }\n .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n\n .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n .marker {\n fill: ").concat(n.lineColor,";\n stroke: ").concat(n.lineColor,";\n }\n .marker.cross {\n stroke: ").concat(n.lineColor,";\n }\n\n svg {\n font-family: ").concat(n.fontFamily,";\n font-size: ").concat(n.fontSize,";\n }\n\n ").concat(Ro[t](n),"\n\n ").concat(e,"\n\n ").concat(t," { fill: apa;}\n")};function zo(t){return(zo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var Uo={},$o=function(t,e,n){switch(c.debug("Directive type=".concat(e.type," with args:"),e.args),e.type){case"init":case"initialize":["config"].forEach((function(t){void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),e.args,wt(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;default:c.warn("Unhandled directive: source: '%%{".concat(e.type,": ").concat(JSON.stringify(e.args?e.args:{}),"}%%"),e)}};function Wo(t){ka(t.git),me(t.flowchart),Ln(t.flowchart),void 0!==t.sequenceDiagram&&_r.setConf(F(t.sequence,t.sequenceDiagram)),_r.setConf(t.sequence),ri(t.gantt),li(t.class),zi(t.state),qi(t.state),Oa(t.class),za(t.class),ro(t.er),Lo(t.journey),Ba(t.class)}function Ho(){}var Vo=Object.freeze({render:function(t,e,n,r){Et();var i=e,a=H.detectInit(i);a&&wt(a);var o=_t();if(e.length>o.maxTextSize&&(i="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa"),void 0!==r)r.innerHTML="",Object(d.select)(r).append("div").attr("id","d"+t).attr("style","font-family: "+o.fontFamily).append("svg").attr("id",t).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg").append("g");else{var s=document.getElementById(t);s&&s.remove();var u=document.querySelector("#d"+t);u&&u.remove(),Object(d.select)("body").append("div").attr("id","d"+t).append("svg").attr("id",t).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg").append("g")}window.txt=i,i=function(t){var e=t;return e=(e=(e=e.replace(/style.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)}))).replace(/classDef.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)}))).replace(/#\w+;/g,(function(t){var e=t.substring(1,t.length-1);return/^\+?\d+$/.test(e)?"fl°°"+e+"¶ß":"fl°"+e+"¶ß"}))}(i);var l=Object(d.select)("#d"+t).node(),h=H.detectType(i),y=l.firstChild,g=y.firstChild,v="";if(void 0!==o.themeCSS&&(v+="\n".concat(o.themeCSS)),void 0!==o.fontFamily&&(v+="\n:root { --mermaid-font-family: ".concat(o.fontFamily,"}")),void 0!==o.altFontFamily&&(v+="\n:root { --mermaid-alt-font-family: ".concat(o.altFontFamily,"}")),"flowchart"===h||"flowchart-v2"===h||"graph"===h){var m=be(i);for(var b in m)v+="\n.".concat(b," > * { ").concat(m[b].styles.join(" !important; ")," !important; }"),m[b].textStyles&&(v+="\n.".concat(b," tspan { ").concat(m[b].textStyles.join(" !important; ")," !important; }"))}var x=(new f.a)("#".concat(t),Yo(h,v,o.themeVariables)),_=document.createElement("style");_.innerHTML=x,y.insertBefore(_,g);try{switch(h){case"git":o.flowchart.arrowMarkerAbsolute=o.arrowMarkerAbsolute,ka(o.git),wa(i,t,!1);break;case"flowchart":o.flowchart.arrowMarkerAbsolute=o.arrowMarkerAbsolute,me(o.flowchart),xe(i,t,!1);break;case"flowchart-v2":o.flowchart.arrowMarkerAbsolute=o.arrowMarkerAbsolute,Ln(o.flowchart),Pn(i,t,!1);break;case"sequence":o.sequence.arrowMarkerAbsolute=o.arrowMarkerAbsolute,o.sequenceDiagram?(_r.setConf(Object.assign(o.sequence,o.sequenceDiagram)),console.error("`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.")):_r.setConf(o.sequence),_r.draw(i,t);break;case"gantt":o.gantt.arrowMarkerAbsolute=o.arrowMarkerAbsolute,ri(o.gantt),ii(i,t);break;case"class":o.class.arrowMarkerAbsolute=o.arrowMarkerAbsolute,li(o.class),hi(i,t);break;case"classDiagram":o.class.arrowMarkerAbsolute=o.arrowMarkerAbsolute,di(o.class),pi(i,t);break;case"state":o.class.arrowMarkerAbsolute=o.arrowMarkerAbsolute,zi(o.state),Ui(i,t);break;case"stateDiagram":o.class.arrowMarkerAbsolute=o.arrowMarkerAbsolute,qi(o.state),Xi(i,t);break;case"info":o.class.arrowMarkerAbsolute=o.arrowMarkerAbsolute,Oa(o.class),Da(i,t,p.version);break;case"pie":o.class.arrowMarkerAbsolute=o.arrowMarkerAbsolute,za(o.pie),Ua(i,t,p.version);break;case"er":ro(o.er),io(i,t,p.version);break;case"journey":Lo(o.journey),Po(i,t,p.version)}}catch(e){throw La(t,p.version),e}Object(d.select)('[id="'.concat(t,'"]')).selectAll("foreignobject > *").attr("xmlns","http://www.w3.org/1999/xhtml");var k=Object(d.select)("#d"+t).node().innerHTML;if(c.debug("cnf.arrowMarkerAbsolute",o.arrowMarkerAbsolute),o.arrowMarkerAbsolute&&"false"!==o.arrowMarkerAbsolute||(k=k.replace(/marker-end="url\(.*?#/g,'marker-end="url(#',"g")),k=(k=function(t){var e=t;return e=(e=(e=e.replace(/fl°°/g,(function(){return"&#"}))).replace(/fl°/g,(function(){return"&"}))).replace(/¶ß/g,(function(){return";"}))}(k)).replace(/
        /g,"
        "),void 0!==n)switch(h){case"flowchart":case"flowchart-v2":n(k,Xt.bindFunctions);break;case"gantt":n(k,Qr.bindFunctions);break;case"class":case"classDiagram":n(k,cn.bindFunctions);break;default:n(k)}else c.debug("CB = undefined!");var w=Object(d.select)("#d"+t).node();return null!==w&&"function"==typeof w.remove&&Object(d.select)("#d"+t).node().remove(),k},parse:function(t){var e=H.detectInit(t);e&&c.debug("reinit ",e);var n,r=H.detectType(t);switch(c.debug("Type "+r),r){case"git":(n=ha.a).parser.yy=ua;break;case"flowchart":case"flowchart-v2":Xt.clear(),(n=Jt.a).parser.yy=Xt;break;case"sequence":(n=Hn.a).parser.yy=sr;break;case"gantt":(n=wr.a).parser.yy=Qr;break;case"class":case"classDiagram":(n=oi.a).parser.yy=cn;break;case"state":case"stateDiagram":(n=Di.a).parser.yy=Mi;break;case"info":c.debug("info info info"),(n=Sa.a).parser.yy=Ca;break;case"pie":c.debug("pie"),(n=Ra.a).parser.yy=Fa;break;case"er":c.debug("er"),(n=Xa.a).parser.yy=Ga;break;case"journey":c.debug("Journey"),(n=oo.a).parser.yy=yo}return n.parser.yy.graphType=r,n.parser.yy.parseError=function(t,e){throw{str:t,hash:e}},n.parse(t),n},parseDirective:function(t,e,n,r){try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":Uo={};break;case"type_directive":Uo.type=e.toLowerCase();break;case"arg_directive":Uo.args=JSON.parse(e);break;case"close_directive":$o(t,Uo,r),Uo=null}}catch(t){c.error("Error while rendering sequenceDiagram directive: ".concat(e," jison context: ").concat(n)),c.error(t.message)}},initialize:function(t){t&&t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),dt=F({},t),t&&t.theme&&ht[t.theme]?t.themeVariables=ht[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=ht.default.getThemeVariables(t.themeVariables));var e="object"===zo(t)?function(t){return gt=F({},yt),gt=F(gt,t),t.theme&&(gt.themeVariables=ht[t.theme].getThemeVariables(t.themeVariables)),mt=bt(gt,vt),gt}(t):xt();Wo(e),u(e.logLevel)},reinitialize:Ho,getConfig:_t,setConfig:function(t){return F(mt,t),_t()},getSiteConfig:xt,updateSiteConfig:function(t){return gt=F(gt,t),bt(gt,vt),gt},reset:function(){Et()},globalReset:function(){Et(),Wo(_t())},defaultConfig:yt});u(_t().logLevel),Et(_t());var Go=Vo,qo=function(){Xo.startOnLoad?Go.getConfig().startOnLoad&&Xo.init():void 0===Xo.startOnLoad&&(c.debug("In start, no config"),Go.getConfig().startOnLoad&&Xo.init())};"undefined"!=typeof document&& +!function(t){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n=void 0,r=n={VERSION:[2,5,3],content:[],cache:{},snakeskinRgxp:null,symbols:null,replace:Y,paste:E},i={'"':!0,"'":!0,"`":!0},a={"/":!0};for(var o in i){if(!i.hasOwnProperty(o))break;a[o]=!0}var u={"//":!0,"//*":!0,"//!":!0,"//#":!0,"//@":!0,"//$":!0},s={"/*":!0,"/**":!0,"/*!":!0,"/*#":!0,"/*@":!0,"/*$":!0},c=[],l={};for(var f in a){if(!a.hasOwnProperty(f))break;c.push(f),l[f]=!0}for(var d in u){if(!u.hasOwnProperty(d))break;c.push(d),l[d]=!0}for(var h in s){if(!s.hasOwnProperty(h))break;c.push(h),l[h]=!0}var _=[],p={g:!0,m:!0,i:!0,y:!0,u:!0};for(var m in p){if(!p.hasOwnProperty(m))break;_.push(m)}var y={"-":!0,"+":!0,"*":!0,"%":!0,"~":!0,">":!0,"<":!0,"^":!0,",":!0,";":!0,"=":!0,"|":!0,"&":!0,"!":!0,"?":!0,":":!0,"(":!0,"{":!0,"[":!0},g={return:!0,yield:!0,await:!0,typeof:!0,void:!0,instanceof:!0,delete:!0,in:!0,new:!0,of:!0};function v(t,e,n){for(var r in t){if(!t.hasOwnProperty(r))break;r in e==0&&(e[r]=n)}}var b=void 0,M=void 0,w=/[^\s\/]/,k=/[a-z]/,L=/\s/,x=/[\r\n]/,D=/\${pos}/g,T={object:!0,function:!0};function Y(t,r,o,f){b=b||n.symbols||"a-z",M=M||n.snakeskinRgxp||new RegExp("[!$"+b+"_]","i");var d=n,h=d.cache,m=d.content,Y=Boolean(r&&T[void 0===r?"undefined":e(r)]),A=Y?Object(r):{};function E(t){return A["@label"]?A["@label"].replace(D,t):"__ESCAPER_QUOT__"+t+"_"}var S=!1;"boolean"==typeof r&&(S=Boolean(r)),"@comments"in A&&(v(s,A,A["@comments"]),v(u,A,A["@comments"]),delete A["@comments"]),"@strings"in A&&(v(i,A,A["@strings"]),delete A["@strings"]),"@literals"in A&&(v(a,A,A["@literals"]),delete A["@literals"]),"@all"in A&&(v(l,A,A["@all"]),delete A["@all"]);for(var j="",O=-1;++O2&&s[I])&&(A[I]&&(U=t.substring(B,J+1),-1===A[I]?V="":(V=E(P.length),P.push(U)),t=t.substring(0,B)+V+t.substring(J+1),J+=V.length-U.length),I=!1);else{if(!F){if("/"===Z&&((u[X]||s[X])&&(I=u[Q]||s[Q]?Q:X),I)){B=J;continue}y[Z]||g[G]?(N=!0,G=""):w.test(Z)&&(N=!1),k.test(Z)?$+=Z:(G=$,$="");var tt=!1;f&&("|"===Z&&M.test(K)?(W=!0,N=!1,tt=!0):W&&L.test(Z)&&(W=!1,N=!0,tt=!0)),tt||(y[Z]?N=!0:w.test(Z)&&(N=!1))}if("/"!==F||R||("["===Z?z=!0:"]"===Z&&(z=!1)),!F&&q&&("}"===Z?q--:"{"===Z&&q++,q||(Z="`")),"`"!==F||R||"${"!==X||(Z="`",J++,q++),!l[Z]||"/"===Z&&!N||F){if(F&&("\\"===Z||R))R=!R;else if(l[Z]&&F===Z&&!R&&("/"!==F||!z)){if("/"===Z)for(var et=-1;++et<_.length;)p[t.charAt(J+1)]&&J++;F=!1,N=!1,A[Z]&&(U=t.substring(B,J+1),-1===A[Z]?V="":(V=E(P.length),P.push(U)),t=t.substring(0,B)+V+t.substring(J+1),J+=V.length-U.length)}}else F=Z,B=J}}return P===m&&(h[j]=h[j]||{},h[j][H]=t),t}var A=/__ESCAPER_QUOT__(\d+)_/g;function E(t,e,r){return t.replace(r||A,function(t,r){return(e||n.content)[r]})}t.default=r,t.replace=Y,t.paste=E,Object.defineProperty(t,"__esModule",{value:!0})}(e)},function(t,e,n){"use strict";var r=n(153);t.exports=function(t,e){var n;t=t.toString();var i="",a="",o=!1,u=!(!1===(e=e||{}).preserve||!0===e.all),s="";"function"==typeof e.preserve?(u=!1,n=e.preserve):r(e.preserve)&&(u=!1,n=function(t){return e.preserve.test(t)});for(var c=0;c>>1,N=[["ary",w],["bind",p],["bindKey",m],["curry",g],["curryRight",v],["flip",L],["partial",b],["partialRight",M],["rearg",k]],R="[object Arguments]",I="[object Array]",B="[object AsyncFunction]",z="[object Boolean]",q="[object Date]",W="[object DOMException]",U="[object Error]",V="[object Function]",$="[object GeneratorFunction]",G="[object Map]",J="[object Number]",Z="[object Null]",K="[object Object]",X="[object Proxy]",Q="[object RegExp]",tt="[object Set]",et="[object String]",nt="[object Symbol]",rt="[object Undefined]",it="[object WeakMap]",at="[object WeakSet]",ot="[object ArrayBuffer]",ut="[object DataView]",st="[object Float32Array]",ct="[object Float64Array]",lt="[object Int8Array]",ft="[object Int16Array]",dt="[object Int32Array]",ht="[object Uint8Array]",_t="[object Uint8ClampedArray]",pt="[object Uint16Array]",mt="[object Uint32Array]",yt=/\b__p \+= '';/g,gt=/\b(__p \+=) '' \+/g,vt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,bt=/&(?:amp|lt|gt|quot|#39);/g,Mt=/[&<>"']/g,wt=RegExp(bt.source),kt=RegExp(Mt.source),Lt=/<%-([\s\S]+?)%>/g,xt=/<%([\s\S]+?)%>/g,Dt=/<%=([\s\S]+?)%>/g,Tt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Yt=/^\w*$/,At=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Et=/[\\^$.*+?()[\]{}|]/g,St=RegExp(Et.source),jt=/^\s+|\s+$/g,Ot=/^\s+/,Ct=/\s+$/,Ht=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Pt=/\{\n\/\* \[wrapped with (.+)\] \*/,Ft=/,? & /,Nt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Rt=/\\(\\)?/g,It=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Bt=/\w*$/,zt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Wt=/^\[object .+?Constructor\]$/,Ut=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\d*)$/,$t=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Gt=/($^)/,Jt=/['\n\r\u2028\u2029\\]/g,Zt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Kt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Xt="[\\ud800-\\udfff]",Qt="["+Kt+"]",te="["+Zt+"]",ee="\\d+",ne="[\\u2700-\\u27bf]",re="[a-z\\xdf-\\xf6\\xf8-\\xff]",ie="[^\\ud800-\\udfff"+Kt+ee+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ae="\\ud83c[\\udffb-\\udfff]",oe="[^\\ud800-\\udfff]",ue="(?:\\ud83c[\\udde6-\\uddff]){2}",se="[\\ud800-\\udbff][\\udc00-\\udfff]",ce="[A-Z\\xc0-\\xd6\\xd8-\\xde]",le="(?:"+re+"|"+ie+")",fe="(?:"+ce+"|"+ie+")",de="(?:"+te+"|"+ae+")"+"?",he="[\\ufe0e\\ufe0f]?"+de+("(?:\\u200d(?:"+[oe,ue,se].join("|")+")[\\ufe0e\\ufe0f]?"+de+")*"),_e="(?:"+[ne,ue,se].join("|")+")"+he,pe="(?:"+[oe+te+"?",te,ue,se,Xt].join("|")+")",me=RegExp("['’]","g"),ye=RegExp(te,"g"),ge=RegExp(ae+"(?="+ae+")|"+pe+he,"g"),ve=RegExp([ce+"?"+re+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[Qt,ce,"$"].join("|")+")",fe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[Qt,ce+le,"$"].join("|")+")",ce+"?"+le+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ce+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ee,_e].join("|"),"g"),be=RegExp("[\\u200d\\ud800-\\udfff"+Zt+"\\ufe0e\\ufe0f]"),Me=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,we=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ke=-1,Le={};Le[st]=Le[ct]=Le[lt]=Le[ft]=Le[dt]=Le[ht]=Le[_t]=Le[pt]=Le[mt]=!0,Le[R]=Le[I]=Le[ot]=Le[z]=Le[ut]=Le[q]=Le[U]=Le[V]=Le[G]=Le[J]=Le[K]=Le[Q]=Le[tt]=Le[et]=Le[it]=!1;var xe={};xe[R]=xe[I]=xe[ot]=xe[ut]=xe[z]=xe[q]=xe[st]=xe[ct]=xe[lt]=xe[ft]=xe[dt]=xe[G]=xe[J]=xe[K]=xe[Q]=xe[tt]=xe[et]=xe[nt]=xe[ht]=xe[_t]=xe[pt]=xe[mt]=!0,xe[U]=xe[V]=xe[it]=!1;var De={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Te=parseFloat,Ye=parseInt,Ae="object"==typeof t&&t&&t.Object===Object&&t,Ee="object"==typeof self&&self&&self.Object===Object&&self,Se=Ae||Ee||Function("return this")(),je=e&&!e.nodeType&&e,Oe=je&&"object"==typeof n&&n&&!n.nodeType&&n,Ce=Oe&&Oe.exports===je,He=Ce&&Ae.process,Pe=function(){try{return He&&He.binding&&He.binding("util")}catch(t){}}(),Fe=Pe&&Pe.isArrayBuffer,Ne=Pe&&Pe.isDate,Re=Pe&&Pe.isMap,Ie=Pe&&Pe.isRegExp,Be=Pe&&Pe.isSet,ze=Pe&&Pe.isTypedArray;function qe(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function We(t,e,n,r){for(var i=-1,a=null==t?0:t.length;++i-1}function Ze(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function vn(t,e){for(var n=t.length;n--&&on(e,t[n],0)>-1;);return n}var bn=fn({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Mn=fn({"&":"&","<":"<",">":">",'"':""","'":"'"});function wn(t){return"\\"+De[t]}function kn(t){return be.test(t)}function Ln(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function xn(t,e){return function(n){return t(e(n))}}function Dn(t,e){for(var n=-1,r=t.length,i=0,a=[];++n",""":'"',"'":"'"});var On=function t(e){var n,Zt=(e=null==e?Se:On.defaults(Se.Object(),e,On.pick(Se,we))).Array,Kt=e.Date,Xt=e.Error,Qt=e.Function,te=e.Math,ee=e.Object,ne=e.RegExp,re=e.String,ie=e.TypeError,ae=Zt.prototype,oe=Qt.prototype,ue=ee.prototype,se=e["__core-js_shared__"],ce=oe.toString,le=ue.hasOwnProperty,fe=0,de=(n=/[^.]+$/.exec(se&&se.keys&&se.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",he=ue.toString,_e=ce.call(ee),pe=Se._,ge=ne("^"+ce.call(le).replace(Et,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),be=Ce?e.Buffer:r,De=e.Symbol,Ae=e.Uint8Array,Ee=be?be.allocUnsafe:r,je=xn(ee.getPrototypeOf,ee),Oe=ee.create,He=ue.propertyIsEnumerable,Pe=ae.splice,nn=De?De.isConcatSpreadable:r,fn=De?De.iterator:r,Cn=De?De.toStringTag:r,Hn=function(){try{var t=Ra(ee,"defineProperty");return t({},"",{}),t}catch(t){}}(),Pn=e.clearTimeout!==Se.clearTimeout&&e.clearTimeout,Fn=Kt&&Kt.now!==Se.Date.now&&Kt.now,Nn=e.setTimeout!==Se.setTimeout&&e.setTimeout,Rn=te.ceil,In=te.floor,Bn=ee.getOwnPropertySymbols,zn=be?be.isBuffer:r,qn=e.isFinite,Wn=ae.join,Un=xn(ee.keys,ee),Vn=te.max,$n=te.min,Gn=Kt.now,Jn=e.parseInt,Zn=te.random,Kn=ae.reverse,Xn=Ra(e,"DataView"),Qn=Ra(e,"Map"),tr=Ra(e,"Promise"),er=Ra(e,"Set"),nr=Ra(e,"WeakMap"),rr=Ra(ee,"create"),ir=nr&&new nr,ar={},or=lo(Xn),ur=lo(Qn),sr=lo(tr),cr=lo(er),lr=lo(nr),fr=De?De.prototype:r,dr=fr?fr.valueOf:r,hr=fr?fr.toString:r;function _r(t){if(Yu(t)&&!yu(t)&&!(t instanceof gr)){if(t instanceof yr)return t;if(le.call(t,"__wrapped__"))return fo(t)}return new yr(t)}var pr=function(){function t(){}return function(e){if(!Tu(e))return{};if(Oe)return Oe(e);t.prototype=e;var n=new t;return t.prototype=r,n}}();function mr(){}function yr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=r}function gr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=H,this.__views__=[]}function vr(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Pr(t,e,n,i,a,o){var u,s=e&l,c=e&f,h=e&d;if(n&&(u=a?n(t,i,a,o):n(t)),u!==r)return u;if(!Tu(t))return t;var _=yu(t);if(_){if(u=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&le.call(t,"index")&&(n.index=t.index,n.input=t.input),n}(t),!s)return ra(t,u)}else{var p=za(t),m=p==V||p==$;if(Mu(t))return Ki(t,s);if(p==K||p==R||m&&!a){if(u=c||m?{}:Wa(t),!s)return c?function(t,e){return ia(t,Ba(t),e)}(t,function(t,e){return t&&ia(e,as(e),t)}(u,t)):function(t,e){return ia(t,Ia(t),e)}(t,jr(u,t))}else{if(!xe[p])return a?t:{};u=function(t,e,n){var r,i,a,o=t.constructor;switch(e){case ot:return Xi(t);case z:case q:return new o(+t);case ut:return function(t,e){var n=e?Xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case st:case ct:case lt:case ft:case dt:case ht:case _t:case pt:case mt:return Qi(t,n);case G:return new o;case J:case et:return new o(t);case Q:return(a=new(i=t).constructor(i.source,Bt.exec(i))).lastIndex=i.lastIndex,a;case tt:return new o;case nt:return r=t,dr?ee(dr.call(r)):{}}}(t,p,s)}}o||(o=new kr);var y=o.get(t);if(y)return y;if(o.set(t,u),Ou(t))return t.forEach(function(r){u.add(Pr(r,e,n,r,t,o))}),u;if(Au(t))return t.forEach(function(r,i){u.set(i,Pr(r,e,n,i,t,o))}),u;var g=_?r:(h?c?ja:Sa:c?as:is)(t);return Ue(g||t,function(r,i){g&&(r=t[i=r]),Ar(u,i,Pr(r,e,n,i,t,o))}),u}function Fr(t,e,n){var i=n.length;if(null==t)return!i;for(t=ee(t);i--;){var a=n[i],o=e[a],u=t[a];if(u===r&&!(a in t)||!o(u))return!1}return!0}function Nr(t,e,n){if("function"!=typeof t)throw new ie(o);return ro(function(){t.apply(r,n)},e)}function Rr(t,e,n,r){var a=-1,o=Je,u=!0,s=t.length,c=[],l=e.length;if(!s)return c;n&&(e=Ke(e,pn(n))),r?(o=Ze,u=!1):e.length>=i&&(o=yn,u=!1,e=new wr(e));t:for(;++a-1},br.prototype.set=function(t,e){var n=this.__data__,r=Er(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Mr.prototype.clear=function(){this.size=0,this.__data__={hash:new vr,map:new(Qn||br),string:new vr}},Mr.prototype.delete=function(t){var e=Fa(this,t).delete(t);return this.size-=e?1:0,e},Mr.prototype.get=function(t){return Fa(this,t).get(t)},Mr.prototype.has=function(t){return Fa(this,t).has(t)},Mr.prototype.set=function(t,e){var n=Fa(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},wr.prototype.add=wr.prototype.push=function(t){return this.__data__.set(t,u),this},wr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.clear=function(){this.__data__=new br,this.size=0},kr.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},kr.prototype.get=function(t){return this.__data__.get(t)},kr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.set=function(t,e){var n=this.__data__;if(n instanceof br){var r=n.__data__;if(!Qn||r.length0&&n(u)?e>1?Ur(u,e-1,n,r,i):Xe(i,u):r||(i[i.length]=u)}return i}var Vr=sa(),$r=sa(!0);function Gr(t,e){return t&&Vr(t,e,is)}function Jr(t,e){return t&&$r(t,e,is)}function Zr(t,e){return Ge(e,function(e){return Lu(t[e])})}function Kr(t,e){for(var n=0,i=(e=$i(e,t)).length;null!=t&&ne}function ei(t,e){return null!=t&&le.call(t,e)}function ni(t,e){return null!=t&&e in ee(t)}function ri(t,e,n){for(var i=n?Ze:Je,a=t[0].length,o=t.length,u=o,s=Zt(o),c=1/0,l=[];u--;){var f=t[u];u&&e&&(f=Ke(f,pn(e))),c=$n(f.length,c),s[u]=!n&&(e||a>=120&&f.length>=120)?new wr(u&&f):r}f=t[0];var d=-1,h=s[0];t:for(;++d=u)return s;var c=n[r];return s*("desc"==c?-1:1)}}return t.index-e.index}(t,e,n)})}function vi(t,e,n){for(var r=-1,i=e.length,a={};++r-1;)u!==t&&Pe.call(u,s,1),Pe.call(t,s,1);return t}function Mi(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==a){var a=i;Va(i)?Pe.call(t,i,1):Ri(t,i)}}return t}function wi(t,e){return t+In(Zn()*(e-t+1))}function ki(t,e){var n="";if(!t||e<1||e>j)return n;do{e%2&&(n+=t),(e=In(e/2))&&(t+=t)}while(e);return n}function Li(t,e){return io(to(t,e,Es),t+"")}function xi(t){return xr(hs(t))}function Di(t,e){var n=hs(t);return uo(n,Hr(e,0,n.length))}function Ti(t,e,n,i){if(!Tu(t))return t;for(var a=-1,o=(e=$i(e,t)).length,u=o-1,s=t;null!=s&&++ai?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=Zt(i);++r>>1,o=t[a];null!==o&&!Hu(o)&&(n?o<=e:o=i){var l=e?null:ka(t);if(l)return Yn(l);u=!1,a=yn,c=new wr}else c=e?[]:s;t:for(;++r=i?t:Si(t,e,n)}var Zi=Pn||function(t){return Se.clearTimeout(t)};function Ki(t,e){if(e)return t.slice();var n=t.length,r=Ee?Ee(n):new t.constructor(n);return t.copy(r),r}function Xi(t){var e=new t.constructor(t.byteLength);return new Ae(e).set(new Ae(t)),e}function Qi(t,e){var n=e?Xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function ta(t,e){if(t!==e){var n=t!==r,i=null===t,a=t==t,o=Hu(t),u=e!==r,s=null===e,c=e==e,l=Hu(e);if(!s&&!l&&!o&&t>e||o&&u&&c&&!s&&!l||i&&u&&c||!n&&c||!a)return 1;if(!i&&!o&&!l&&t1?n[a-1]:r,u=a>2?n[2]:r;for(o=t.length>3&&"function"==typeof o?(a--,o):r,u&&$a(n[0],n[1],u)&&(o=a<3?r:o,a=1),e=ee(e);++i-1?a[o?e[u]:u]:r}}function ha(t){return Ea(function(e){var n=e.length,i=n,a=yr.prototype.thru;for(t&&e.reverse();i--;){var u=e[i];if("function"!=typeof u)throw new ie(o);if(a&&!s&&"wrapper"==Ca(u))var s=new yr([],!0)}for(i=s?i:n;++i1&&g.reverse(),f&&cs))return!1;var l=o.get(t);if(l&&o.get(e))return l==e;var f=-1,d=!0,p=n&_?new wr:r;for(o.set(t,e),o.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Ht,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return Ue(N,function(n){var r="_."+n[0];e&n[1]&&!Je(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(Pt);return e?e[1].split(Ft):[]}(r),n)))}function oo(t){var e=0,n=0;return function(){var i=Gn(),a=Y-(i-n);if(n=i,a>0){if(++e>=T)return arguments[0]}else e=0;return t.apply(r,arguments)}}function uo(t,e){var n=-1,i=t.length,a=i-1;for(e=e===r?i:e;++n1?t[e-1]:r;return n="function"==typeof n?(t.pop(),n):r,jo(t,n)});function Ro(t){var e=_r(t);return e.__chain__=!0,e}function Io(t,e){return e(t)}var Bo=Ea(function(t){var e=t.length,n=e?t[0]:0,i=this.__wrapped__,a=function(e){return Cr(e,t)};return!(e>1||this.__actions__.length)&&i instanceof gr&&Va(n)?((i=i.slice(n,+n+(e?1:0))).__actions__.push({func:Io,args:[a],thisArg:r}),new yr(i,this.__chain__).thru(function(t){return e&&!t.length&&t.push(r),t})):this.thru(a)});var zo=aa(function(t,e,n){le.call(t,n)?++t[n]:Or(t,n,1)});var qo=da(mo),Wo=da(yo);function Uo(t,e){return(yu(t)?Ue:Ir)(t,Pa(e,3))}function Vo(t,e){return(yu(t)?Ve:Br)(t,Pa(e,3))}var $o=aa(function(t,e,n){le.call(t,n)?t[n].push(e):Or(t,n,[e])});var Go=Li(function(t,e,n){var r=-1,i="function"==typeof e,a=vu(t)?Zt(t.length):[];return Ir(t,function(t){a[++r]=i?qe(e,t,n):ii(t,e,n)}),a}),Jo=aa(function(t,e,n){Or(t,n,e)});function Zo(t,e){return(yu(t)?Ke:hi)(t,Pa(e,3))}var Ko=aa(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]});var Xo=Li(function(t,e){if(null==t)return[];var n=e.length;return n>1&&$a(t,e[0],e[1])?e=[]:n>2&&$a(e[0],e[1],e[2])&&(e=[e[0]]),gi(t,Ur(e,1),[])}),Qo=Fn||function(){return Se.Date.now()};function tu(t,e,n){return e=n?r:e,e=t&&null==e?t.length:e,xa(t,w,r,r,r,r,e)}function eu(t,e){var n;if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=r),n}}var nu=Li(function(t,e,n){var r=p;if(n.length){var i=Dn(n,Ha(nu));r|=b}return xa(t,r,e,n,i)}),ru=Li(function(t,e,n){var r=p|m;if(n.length){var i=Dn(n,Ha(ru));r|=b}return xa(e,r,t,n,i)});function iu(t,e,n){var i,a,u,s,c,l,f=0,d=!1,h=!1,_=!0;if("function"!=typeof t)throw new ie(o);function p(e){var n=i,o=a;return i=a=r,f=e,s=t.apply(o,n)}function m(t){var n=t-l;return l===r||n>=e||n<0||h&&t-f>=u}function y(){var t=Qo();if(m(t))return g(t);c=ro(y,function(t){var n=e-(t-l);return h?$n(n,u-(t-f)):n}(t))}function g(t){return c=r,_&&i?p(t):(i=a=r,s)}function v(){var t=Qo(),n=m(t);if(i=arguments,a=this,l=t,n){if(c===r)return function(t){return f=t,c=ro(y,e),d?p(t):s}(l);if(h)return c=ro(y,e),p(l)}return c===r&&(c=ro(y,e)),s}return e=qu(e)||0,Tu(n)&&(d=!!n.leading,u=(h="maxWait"in n)?Vn(qu(n.maxWait)||0,e):u,_="trailing"in n?!!n.trailing:_),v.cancel=function(){c!==r&&Zi(c),f=0,i=l=a=c=r},v.flush=function(){return c===r?s:g(Qo())},v}var au=Li(function(t,e){return Nr(t,1,e)}),ou=Li(function(t,e,n){return Nr(t,qu(e)||0,n)});function uu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new ie(o);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],a=n.cache;if(a.has(i))return a.get(i);var o=t.apply(this,r);return n.cache=a.set(i,o)||a,o};return n.cache=new(uu.Cache||Mr),n}function su(t){if("function"!=typeof t)throw new ie(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}uu.Cache=Mr;var cu=Gi(function(t,e){var n=(e=1==e.length&&yu(e[0])?Ke(e[0],pn(Pa())):Ke(Ur(e,1),pn(Pa()))).length;return Li(function(r){for(var i=-1,a=$n(r.length,n);++i=e}),mu=ai(function(){return arguments}())?ai:function(t){return Yu(t)&&le.call(t,"callee")&&!He.call(t,"callee")},yu=Zt.isArray,gu=Fe?pn(Fe):function(t){return Yu(t)&&Qr(t)==ot};function vu(t){return null!=t&&Du(t.length)&&!Lu(t)}function bu(t){return Yu(t)&&vu(t)}var Mu=zn||qs,wu=Ne?pn(Ne):function(t){return Yu(t)&&Qr(t)==q};function ku(t){if(!Yu(t))return!1;var e=Qr(t);return e==U||e==W||"string"==typeof t.message&&"string"==typeof t.name&&!Su(t)}function Lu(t){if(!Tu(t))return!1;var e=Qr(t);return e==V||e==$||e==B||e==X}function xu(t){return"number"==typeof t&&t==Bu(t)}function Du(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=j}function Tu(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Yu(t){return null!=t&&"object"==typeof t}var Au=Re?pn(Re):function(t){return Yu(t)&&za(t)==G};function Eu(t){return"number"==typeof t||Yu(t)&&Qr(t)==J}function Su(t){if(!Yu(t)||Qr(t)!=K)return!1;var e=je(t);if(null===e)return!0;var n=le.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ce.call(n)==_e}var ju=Ie?pn(Ie):function(t){return Yu(t)&&Qr(t)==Q};var Ou=Be?pn(Be):function(t){return Yu(t)&&za(t)==tt};function Cu(t){return"string"==typeof t||!yu(t)&&Yu(t)&&Qr(t)==et}function Hu(t){return"symbol"==typeof t||Yu(t)&&Qr(t)==nt}var Pu=ze?pn(ze):function(t){return Yu(t)&&Du(t.length)&&!!Le[Qr(t)]};var Fu=ba(di),Nu=ba(function(t,e){return t<=e});function Ru(t){if(!t)return[];if(vu(t))return Cu(t)?Sn(t):ra(t);if(fn&&t[fn])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[fn]());var e=za(t);return(e==G?Ln:e==tt?Yn:hs)(t)}function Iu(t){return t?(t=qu(t))===S||t===-S?(t<0?-1:1)*O:t==t?t:0:0===t?t:0}function Bu(t){var e=Iu(t),n=e%1;return e==e?n?e-n:e:0}function zu(t){return t?Hr(Bu(t),0,H):0}function qu(t){if("number"==typeof t)return t;if(Hu(t))return C;if(Tu(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Tu(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(jt,"");var n=qt.test(t);return n||Ut.test(t)?Ye(t.slice(2),n?2:8):zt.test(t)?C:+t}function Wu(t){return ia(t,as(t))}function Uu(t){return null==t?"":Fi(t)}var Vu=oa(function(t,e){if(Ka(e)||vu(e))ia(e,is(e),t);else for(var n in e)le.call(e,n)&&Ar(t,n,e[n])}),$u=oa(function(t,e){ia(e,as(e),t)}),Gu=oa(function(t,e,n,r){ia(e,as(e),t,r)}),Ju=oa(function(t,e,n,r){ia(e,is(e),t,r)}),Zu=Ea(Cr);var Ku=Li(function(t,e){t=ee(t);var n=-1,i=e.length,a=i>2?e[2]:r;for(a&&$a(e[0],e[1],a)&&(i=1);++n1),e}),ia(t,ja(t),n),r&&(n=Pr(n,l|f|d,Ya));for(var i=e.length;i--;)Ri(n,e[i]);return n});var cs=Ea(function(t,e){return null==t?{}:function(t,e){return vi(t,e,function(e,n){return ts(t,n)})}(t,e)});function ls(t,e){if(null==t)return{};var n=Ke(ja(t),function(t){return[t]});return e=Pa(e),vi(t,n,function(t,n){return e(t,n[0])})}var fs=La(is),ds=La(as);function hs(t){return null==t?[]:mn(t,is(t))}var _s=la(function(t,e,n){return e=e.toLowerCase(),t+(n?ps(e):e)});function ps(t){return ks(Uu(t).toLowerCase())}function ms(t){return(t=Uu(t))&&t.replace($t,bn).replace(ye,"")}var ys=la(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),gs=la(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),vs=ca("toLowerCase");var bs=la(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()});var Ms=la(function(t,e,n){return t+(n?" ":"")+ks(e)});var ws=la(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),ks=ca("toUpperCase");function Ls(t,e,n){return t=Uu(t),(e=n?r:e)===r?function(t){return Me.test(t)}(t)?function(t){return t.match(ve)||[]}(t):function(t){return t.match(Nt)||[]}(t):t.match(e)||[]}var xs=Li(function(t,e){try{return qe(t,r,e)}catch(t){return ku(t)?t:new Xt(t)}}),Ds=Ea(function(t,e){return Ue(e,function(e){e=co(e),Or(t,e,nu(t[e],t))}),t});function Ts(t){return function(){return t}}var Ys=ha(),As=ha(!0);function Es(t){return t}function Ss(t){return ci("function"==typeof t?t:Pr(t,l))}var js=Li(function(t,e){return function(n){return ii(n,t,e)}}),Os=Li(function(t,e){return function(n){return ii(t,n,e)}});function Cs(t,e,n){var r=is(e),i=Zr(e,r);null!=n||Tu(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=Zr(e,is(e)));var a=!(Tu(n)&&"chain"in n&&!n.chain),o=Lu(t);return Ue(i,function(n){var r=e[n];t[n]=r,o&&(t.prototype[n]=function(){var e=this.__chain__;if(a||e){var n=t(this.__wrapped__);return(n.__actions__=ra(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Xe([this.value()],arguments))})}),t}function Hs(){}var Ps=ya(Ke),Fs=ya($e),Ns=ya(en);function Rs(t){return Ga(t)?ln(co(t)):function(t){return function(e){return Kr(e,t)}}(t)}var Is=va(),Bs=va(!0);function zs(){return[]}function qs(){return!1}var Ws=ma(function(t,e){return t+e},0),Us=wa("ceil"),Vs=ma(function(t,e){return t/e},1),$s=wa("floor");var Gs,Js=ma(function(t,e){return t*e},1),Zs=wa("round"),Ks=ma(function(t,e){return t-e},0);return _r.after=function(t,e){if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){if(--t<1)return e.apply(this,arguments)}},_r.ary=tu,_r.assign=Vu,_r.assignIn=$u,_r.assignInWith=Gu,_r.assignWith=Ju,_r.at=Zu,_r.before=eu,_r.bind=nu,_r.bindAll=Ds,_r.bindKey=ru,_r.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return yu(t)?t:[t]},_r.chain=Ro,_r.chunk=function(t,e,n){e=(n?$a(t,e,n):e===r)?1:Vn(Bu(e),0);var i=null==t?0:t.length;if(!i||e<1)return[];for(var a=0,o=0,u=Zt(Rn(i/e));aa?0:a+n),(i=i===r||i>a?a:Bu(i))<0&&(i+=a),i=n>i?0:zu(i);n>>0)?(t=Uu(t))&&("string"==typeof e||null!=e&&!ju(e))&&!(e=Fi(e))&&kn(t)?Ji(Sn(t),0,n):t.split(e,n):[]},_r.spread=function(t,e){if("function"!=typeof t)throw new ie(o);return e=null==e?0:Vn(Bu(e),0),Li(function(n){var r=n[e],i=Ji(n,0,e);return r&&Xe(i,r),qe(t,this,i)})},_r.tail=function(t){var e=null==t?0:t.length;return e?Si(t,1,e):[]},_r.take=function(t,e,n){return t&&t.length?Si(t,0,(e=n||e===r?1:Bu(e))<0?0:e):[]},_r.takeRight=function(t,e,n){var i=null==t?0:t.length;return i?Si(t,(e=i-(e=n||e===r?1:Bu(e)))<0?0:e,i):[]},_r.takeRightWhile=function(t,e){return t&&t.length?Bi(t,Pa(e,3),!1,!0):[]},_r.takeWhile=function(t,e){return t&&t.length?Bi(t,Pa(e,3)):[]},_r.tap=function(t,e){return e(t),t},_r.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new ie(o);return Tu(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),iu(t,e,{leading:r,maxWait:e,trailing:i})},_r.thru=Io,_r.toArray=Ru,_r.toPairs=fs,_r.toPairsIn=ds,_r.toPath=function(t){return yu(t)?Ke(t,co):Hu(t)?[t]:ra(so(Uu(t)))},_r.toPlainObject=Wu,_r.transform=function(t,e,n){var r=yu(t),i=r||Mu(t)||Pu(t);if(e=Pa(e,4),null==n){var a=t&&t.constructor;n=i?r?new a:[]:Tu(t)&&Lu(a)?pr(je(t)):{}}return(i?Ue:Gr)(t,function(t,r,i){return e(n,t,r,i)}),n},_r.unary=function(t){return tu(t,1)},_r.union=Yo,_r.unionBy=Ao,_r.unionWith=Eo,_r.uniq=function(t){return t&&t.length?Ni(t):[]},_r.uniqBy=function(t,e){return t&&t.length?Ni(t,Pa(e,2)):[]},_r.uniqWith=function(t,e){return e="function"==typeof e?e:r,t&&t.length?Ni(t,r,e):[]},_r.unset=function(t,e){return null==t||Ri(t,e)},_r.unzip=So,_r.unzipWith=jo,_r.update=function(t,e,n){return null==t?t:Ii(t,e,Vi(n))},_r.updateWith=function(t,e,n,i){return i="function"==typeof i?i:r,null==t?t:Ii(t,e,Vi(n),i)},_r.values=hs,_r.valuesIn=function(t){return null==t?[]:mn(t,as(t))},_r.without=Oo,_r.words=Ls,_r.wrap=function(t,e){return lu(Vi(e),t)},_r.xor=Co,_r.xorBy=Ho,_r.xorWith=Po,_r.zip=Fo,_r.zipObject=function(t,e){return Wi(t||[],e||[],Ar)},_r.zipObjectDeep=function(t,e){return Wi(t||[],e||[],Ti)},_r.zipWith=No,_r.entries=fs,_r.entriesIn=ds,_r.extend=$u,_r.extendWith=Gu,Cs(_r,_r),_r.add=Ws,_r.attempt=xs,_r.camelCase=_s,_r.capitalize=ps,_r.ceil=Us,_r.clamp=function(t,e,n){return n===r&&(n=e,e=r),n!==r&&(n=(n=qu(n))==n?n:0),e!==r&&(e=(e=qu(e))==e?e:0),Hr(qu(t),e,n)},_r.clone=function(t){return Pr(t,d)},_r.cloneDeep=function(t){return Pr(t,l|d)},_r.cloneDeepWith=function(t,e){return Pr(t,l|d,e="function"==typeof e?e:r)},_r.cloneWith=function(t,e){return Pr(t,d,e="function"==typeof e?e:r)},_r.conformsTo=function(t,e){return null==e||Fr(t,e,is(e))},_r.deburr=ms,_r.defaultTo=function(t,e){return null==t||t!=t?e:t},_r.divide=Vs,_r.endsWith=function(t,e,n){t=Uu(t),e=Fi(e);var i=t.length,a=n=n===r?i:Hr(Bu(n),0,i);return(n-=e.length)>=0&&t.slice(n,a)==e},_r.eq=hu,_r.escape=function(t){return(t=Uu(t))&&kt.test(t)?t.replace(Mt,Mn):t},_r.escapeRegExp=function(t){return(t=Uu(t))&&St.test(t)?t.replace(Et,"\\$&"):t},_r.every=function(t,e,n){var i=yu(t)?$e:zr;return n&&$a(t,e,n)&&(e=r),i(t,Pa(e,3))},_r.find=qo,_r.findIndex=mo,_r.findKey=function(t,e){return rn(t,Pa(e,3),Gr)},_r.findLast=Wo,_r.findLastIndex=yo,_r.findLastKey=function(t,e){return rn(t,Pa(e,3),Jr)},_r.floor=$s,_r.forEach=Uo,_r.forEachRight=Vo,_r.forIn=function(t,e){return null==t?t:Vr(t,Pa(e,3),as)},_r.forInRight=function(t,e){return null==t?t:$r(t,Pa(e,3),as)},_r.forOwn=function(t,e){return t&&Gr(t,Pa(e,3))},_r.forOwnRight=function(t,e){return t&&Jr(t,Pa(e,3))},_r.get=Qu,_r.gt=_u,_r.gte=pu,_r.has=function(t,e){return null!=t&&qa(t,e,ei)},_r.hasIn=ts,_r.head=vo,_r.identity=Es,_r.includes=function(t,e,n,r){t=vu(t)?t:hs(t),n=n&&!r?Bu(n):0;var i=t.length;return n<0&&(n=Vn(i+n,0)),Cu(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&on(t,e,n)>-1},_r.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Bu(n);return i<0&&(i=Vn(r+i,0)),on(t,e,i)},_r.inRange=function(t,e,n){return e=Iu(e),n===r?(n=e,e=0):n=Iu(n),function(t,e,n){return t>=$n(e,n)&&t=-j&&t<=j},_r.isSet=Ou,_r.isString=Cu,_r.isSymbol=Hu,_r.isTypedArray=Pu,_r.isUndefined=function(t){return t===r},_r.isWeakMap=function(t){return Yu(t)&&za(t)==it},_r.isWeakSet=function(t){return Yu(t)&&Qr(t)==at},_r.join=function(t,e){return null==t?"":Wn.call(t,e)},_r.kebabCase=ys,_r.last=ko,_r.lastIndexOf=function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var a=i;return n!==r&&(a=(a=Bu(n))<0?Vn(i+a,0):$n(a,i-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,a):an(t,sn,a,!0)},_r.lowerCase=gs,_r.lowerFirst=vs,_r.lt=Fu,_r.lte=Nu,_r.max=function(t){return t&&t.length?qr(t,Es,ti):r},_r.maxBy=function(t,e){return t&&t.length?qr(t,Pa(e,2),ti):r},_r.mean=function(t){return cn(t,Es)},_r.meanBy=function(t,e){return cn(t,Pa(e,2))},_r.min=function(t){return t&&t.length?qr(t,Es,di):r},_r.minBy=function(t,e){return t&&t.length?qr(t,Pa(e,2),di):r},_r.stubArray=zs,_r.stubFalse=qs,_r.stubObject=function(){return{}},_r.stubString=function(){return""},_r.stubTrue=function(){return!0},_r.multiply=Js,_r.nth=function(t,e){return t&&t.length?yi(t,Bu(e)):r},_r.noConflict=function(){return Se._===this&&(Se._=pe),this},_r.noop=Hs,_r.now=Qo,_r.pad=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?En(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return ga(In(i),n)+t+ga(Rn(i),n)},_r.padEnd=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?En(t):0;return e&&re){var i=t;t=e,e=i}if(n||t%1||e%1){var a=Zn();return $n(t+a*(e-t+Te("1e-"+((a+"").length-1))),e)}return wi(t,e)},_r.reduce=function(t,e,n){var r=yu(t)?Qe:dn,i=arguments.length<3;return r(t,Pa(e,4),n,i,Ir)},_r.reduceRight=function(t,e,n){var r=yu(t)?tn:dn,i=arguments.length<3;return r(t,Pa(e,4),n,i,Br)},_r.repeat=function(t,e,n){return e=(n?$a(t,e,n):e===r)?1:Bu(e),ki(Uu(t),e)},_r.replace=function(){var t=arguments,e=Uu(t[0]);return t.length<3?e:e.replace(t[1],t[2])},_r.result=function(t,e,n){var i=-1,a=(e=$i(e,t)).length;for(a||(a=1,t=r);++ij)return[];var n=H,r=$n(t,H);e=Pa(e),t-=H;for(var i=_n(r,e);++n=o)return t;var s=n-En(i);if(s<1)return i;var c=u?Ji(u,0,s).join(""):t.slice(0,s);if(a===r)return c+i;if(u&&(s+=c.length-s),ju(a)){if(t.slice(s).search(a)){var l,f=c;for(a.global||(a=ne(a.source,Uu(Bt.exec(a))+"g")),a.lastIndex=0;l=a.exec(f);)var d=l.index;c=c.slice(0,d===r?s:d)}}else if(t.indexOf(Fi(a),s)!=s){var h=c.lastIndexOf(a);h>-1&&(c=c.slice(0,h))}return c+i},_r.unescape=function(t){return(t=Uu(t))&&wt.test(t)?t.replace(bt,jn):t},_r.uniqueId=function(t){var e=++fe;return Uu(t)+e},_r.upperCase=ws,_r.upperFirst=ks,_r.each=Uo,_r.eachRight=Vo,_r.first=vo,Cs(_r,(Gs={},Gr(_r,function(t,e){le.call(_r.prototype,e)||(Gs[e]=t)}),Gs),{chain:!1}),_r.VERSION="4.17.5",Ue(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){_r[t].placeholder=_r}),Ue(["drop","take"],function(t,e){gr.prototype[t]=function(n){n=n===r?1:Vn(Bu(n),0);var i=this.__filtered__&&!e?new gr(this):this.clone();return i.__filtered__?i.__takeCount__=$n(n,i.__takeCount__):i.__views__.push({size:$n(n,H),type:t+(i.__dir__<0?"Right":"")}),i},gr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),Ue(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==A||3==n;gr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Pa(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),Ue(["head","last"],function(t,e){var n="take"+(e?"Right":"");gr.prototype[t]=function(){return this[n](1).value()[0]}}),Ue(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");gr.prototype[t]=function(){return this.__filtered__?new gr(this):this[n](1)}}),gr.prototype.compact=function(){return this.filter(Es)},gr.prototype.find=function(t){return this.filter(t).head()},gr.prototype.findLast=function(t){return this.reverse().find(t)},gr.prototype.invokeMap=Li(function(t,e){return"function"==typeof t?new gr(this):this.map(function(n){return ii(n,t,e)})}),gr.prototype.reject=function(t){return this.filter(su(Pa(t)))},gr.prototype.slice=function(t,e){t=Bu(t);var n=this;return n.__filtered__&&(t>0||e<0)?new gr(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==r&&(n=(e=Bu(e))<0?n.dropRight(-e):n.take(e-t)),n)},gr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},gr.prototype.toArray=function(){return this.take(H)},Gr(gr.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),i=/^(?:head|last)$/.test(e),a=_r[i?"take"+("last"==e?"Right":""):e],o=i||/^find/.test(e);a&&(_r.prototype[e]=function(){var e=this.__wrapped__,u=i?[1]:arguments,s=e instanceof gr,c=u[0],l=s||yu(e),f=function(t){var e=a.apply(_r,Xe([t],u));return i&&d?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(s=l=!1);var d=this.__chain__,h=!!this.__actions__.length,_=o&&!d,p=s&&!h;if(!o&&l){e=p?e:new gr(this);var m=t.apply(e,u);return m.__actions__.push({func:Io,args:[f],thisArg:r}),new yr(m,d)}return _&&p?t.apply(this,u):(m=this.thru(f),_?i?m.value()[0]:m.value():m)})}),Ue(["pop","push","shift","sort","splice","unshift"],function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);_r.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(yu(i)?i:[],t)}return this[n](function(n){return e.apply(yu(n)?n:[],t)})}}),Gr(gr.prototype,function(t,e){var n=_r[e];if(n){var r=n.name+"";(ar[r]||(ar[r]=[])).push({name:e,func:n})}}),ar[_a(r,m).name]=[{name:"wrapper",func:r}],gr.prototype.clone=function(){var t=new gr(this.__wrapped__);return t.__actions__=ra(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=ra(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=ra(this.__views__),t},gr.prototype.reverse=function(){if(this.__filtered__){var t=new gr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},gr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=yu(t),r=e<0,i=n?t.length:0,a=function(t,e,n){for(var r=-1,i=n.length;++r=this.__values__.length;return{done:t,value:t?r:this.__values__[this.__index__++]}},_r.prototype.plant=function(t){for(var e,n=this;n instanceof mr;){var i=fo(n);i.__index__=0,i.__values__=r,e?a.__wrapped__=i:e=i;var a=i;n=n.__wrapped__}return a.__wrapped__=t,e},_r.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof gr){var e=t;return this.__actions__.length&&(e=new gr(this)),(e=e.reverse()).__actions__.push({func:Io,args:[To],thisArg:r}),new yr(e,this.__chain__)}return this.thru(To)},_r.prototype.toJSON=_r.prototype.valueOf=_r.prototype.value=function(){return zi(this.__wrapped__,this.__actions__)},_r.prototype.first=_r.prototype.head,fn&&(_r.prototype[fn]=function(){return this}),_r}();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Se._=On,define(function(){return On})):Oe?((Oe.exports=On)._=On,je._=On):Se._=On}).call(this)}).call(this,n(10),n(5)(t))},function(t,e,n){const r=n(4),i=n(17);function a(t){return r.map(t.nodes(),function(e){const n=t.node(e),i=t.parent(e),a={v:e};return r.isUndefined(n)||(a.value=n),r.isUndefined(i)||(a.parent=i),a})}function o(t){return r.map(t.edges(),function(e){const n=t.edge(e),i={v:e.v,w:e.w};return r.isUndefined(e.name)||(i.name=e.name),r.isUndefined(n)||(i.value=n),i})}t.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:a(t),edges:o(t)};r.isUndefined(t.graph())||(e.value=r.clone(t.graph()));return e},read:function(t){var e=new i(t.options).setGraph(t.value);return r.each(t.nodes,function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)}),r.each(t.edges,function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)}),e}}},function(t,e,n){t.exports={components:n(158),dijkstra:n(143),dijkstraAll:n(159),findCycles:n(160),floydWarshall:n(161),isAcyclic:n(162),postorder:n(163),preorder:n(164),prim:n(165),tarjan:n(145),topsort:n(146)}},function(t,e,n){var r=n(4);t.exports=function(t){const e={},n=[];let i;function a(n){r.has(e,n)||(e[n]=!0,i.push(n),r.each(t.successors(n),a),r.each(t.predecessors(n),a))}return r.each(t.nodes(),function(t){i=[],a(t),i.length&&n.push(i)}),n}},function(t,e,n){const r=n(143),i=n(4);t.exports=function(t,e,n){return i.transform(t.nodes(),function(i,a){i[a]=r(t,a,e,n)},{})}},function(t,e,n){const r=n(4),i=n(145);t.exports=function(t){return r.filter(i(t),function(e){return e.length>1||1===e.length&&t.hasEdge(e[0],e[0])})}},function(t,e,n){var r=n(4);t.exports=function(t,e,n){return function(t,e,n){const r={},i=t.nodes();return i.forEach(function(t){r[t]={},r[t][t]={distance:0},i.forEach(function(e){t!==e&&(r[t][e]={distance:Number.POSITIVE_INFINITY})}),n(t).forEach(function(n){const i=n.v===t?n.w:n.v,a=e(n);r[t][i]={distance:a,predecessor:t}})}),i.forEach(function(t){var e=r[t];i.forEach(function(n){var a=r[n];i.forEach(function(n){var r=a[t],i=e[n],o=a[n],u=r.distance+i.distance;u0;){if(s=u.removeMin(),r.has(o,s))n.setEdge(s,o[s]);else{if(l)throw new Error("Input graph is not connected: "+t);l=!0}t.nodeEdges(s).forEach(c)}return n}},function(t,e,n){(function(t,n){(function(){var r,i=200,a="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",o="Expected a function",u="__lodash_hash_undefined__",s=500,c="__lodash_placeholder__",l=1,f=2,d=4,h=1,_=2,p=1,m=2,y=4,g=8,v=16,b=32,M=64,w=128,k=256,L=512,x=30,D="...",T=800,Y=16,A=1,E=2,S=1/0,j=9007199254740991,O=1.7976931348623157e308,C=NaN,H=4294967295,P=H-1,F=H>>>1,N=[["ary",w],["bind",p],["bindKey",m],["curry",g],["curryRight",v],["flip",L],["partial",b],["partialRight",M],["rearg",k]],R="[object Arguments]",I="[object Array]",B="[object AsyncFunction]",z="[object Boolean]",q="[object Date]",W="[object DOMException]",U="[object Error]",V="[object Function]",$="[object GeneratorFunction]",G="[object Map]",J="[object Number]",Z="[object Null]",K="[object Object]",X="[object Proxy]",Q="[object RegExp]",tt="[object Set]",et="[object String]",nt="[object Symbol]",rt="[object Undefined]",it="[object WeakMap]",at="[object WeakSet]",ot="[object ArrayBuffer]",ut="[object DataView]",st="[object Float32Array]",ct="[object Float64Array]",lt="[object Int8Array]",ft="[object Int16Array]",dt="[object Int32Array]",ht="[object Uint8Array]",_t="[object Uint8ClampedArray]",pt="[object Uint16Array]",mt="[object Uint32Array]",yt=/\b__p \+= '';/g,gt=/\b(__p \+=) '' \+/g,vt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,bt=/&(?:amp|lt|gt|quot|#39);/g,Mt=/[&<>"']/g,wt=RegExp(bt.source),kt=RegExp(Mt.source),Lt=/<%-([\s\S]+?)%>/g,xt=/<%([\s\S]+?)%>/g,Dt=/<%=([\s\S]+?)%>/g,Tt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Yt=/^\w*$/,At=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Et=/[\\^$.*+?()[\]{}|]/g,St=RegExp(Et.source),jt=/^\s+|\s+$/g,Ot=/^\s+/,Ct=/\s+$/,Ht=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Pt=/\{\n\/\* \[wrapped with (.+)\] \*/,Ft=/,? & /,Nt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Rt=/\\(\\)?/g,It=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Bt=/\w*$/,zt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Wt=/^\[object .+?Constructor\]$/,Ut=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\d*)$/,$t=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Gt=/($^)/,Jt=/['\n\r\u2028\u2029\\]/g,Zt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Kt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Xt="[\\ud800-\\udfff]",Qt="["+Kt+"]",te="["+Zt+"]",ee="\\d+",ne="[\\u2700-\\u27bf]",re="[a-z\\xdf-\\xf6\\xf8-\\xff]",ie="[^\\ud800-\\udfff"+Kt+ee+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ae="\\ud83c[\\udffb-\\udfff]",oe="[^\\ud800-\\udfff]",ue="(?:\\ud83c[\\udde6-\\uddff]){2}",se="[\\ud800-\\udbff][\\udc00-\\udfff]",ce="[A-Z\\xc0-\\xd6\\xd8-\\xde]",le="(?:"+re+"|"+ie+")",fe="(?:"+ce+"|"+ie+")",de="(?:"+te+"|"+ae+")"+"?",he="[\\ufe0e\\ufe0f]?"+de+("(?:\\u200d(?:"+[oe,ue,se].join("|")+")[\\ufe0e\\ufe0f]?"+de+")*"),_e="(?:"+[ne,ue,se].join("|")+")"+he,pe="(?:"+[oe+te+"?",te,ue,se,Xt].join("|")+")",me=RegExp("['’]","g"),ye=RegExp(te,"g"),ge=RegExp(ae+"(?="+ae+")|"+pe+he,"g"),ve=RegExp([ce+"?"+re+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[Qt,ce,"$"].join("|")+")",fe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[Qt,ce+le,"$"].join("|")+")",ce+"?"+le+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ce+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ee,_e].join("|"),"g"),be=RegExp("[\\u200d\\ud800-\\udfff"+Zt+"\\ufe0e\\ufe0f]"),Me=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,we=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ke=-1,Le={};Le[st]=Le[ct]=Le[lt]=Le[ft]=Le[dt]=Le[ht]=Le[_t]=Le[pt]=Le[mt]=!0,Le[R]=Le[I]=Le[ot]=Le[z]=Le[ut]=Le[q]=Le[U]=Le[V]=Le[G]=Le[J]=Le[K]=Le[Q]=Le[tt]=Le[et]=Le[it]=!1;var xe={};xe[R]=xe[I]=xe[ot]=xe[ut]=xe[z]=xe[q]=xe[st]=xe[ct]=xe[lt]=xe[ft]=xe[dt]=xe[G]=xe[J]=xe[K]=xe[Q]=xe[tt]=xe[et]=xe[nt]=xe[ht]=xe[_t]=xe[pt]=xe[mt]=!0,xe[U]=xe[V]=xe[it]=!1;var De={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Te=parseFloat,Ye=parseInt,Ae="object"==typeof t&&t&&t.Object===Object&&t,Ee="object"==typeof self&&self&&self.Object===Object&&self,Se=Ae||Ee||Function("return this")(),je=e&&!e.nodeType&&e,Oe=je&&"object"==typeof n&&n&&!n.nodeType&&n,Ce=Oe&&Oe.exports===je,He=Ce&&Ae.process,Pe=function(){try{return He&&He.binding&&He.binding("util")}catch(t){}}(),Fe=Pe&&Pe.isArrayBuffer,Ne=Pe&&Pe.isDate,Re=Pe&&Pe.isMap,Ie=Pe&&Pe.isRegExp,Be=Pe&&Pe.isSet,ze=Pe&&Pe.isTypedArray;function qe(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function We(t,e,n,r){for(var i=-1,a=null==t?0:t.length;++i-1}function Ze(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function vn(t,e){for(var n=t.length;n--&&on(e,t[n],0)>-1;);return n}var bn=fn({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Mn=fn({"&":"&","<":"<",">":">",'"':""","'":"'"});function wn(t){return"\\"+De[t]}function kn(t){return be.test(t)}function Ln(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function xn(t,e){return function(n){return t(e(n))}}function Dn(t,e){for(var n=-1,r=t.length,i=0,a=[];++n",""":'"',"'":"'"});var On=function t(e){var n,Zt=(e=null==e?Se:On.defaults(Se.Object(),e,On.pick(Se,we))).Array,Kt=e.Date,Xt=e.Error,Qt=e.Function,te=e.Math,ee=e.Object,ne=e.RegExp,re=e.String,ie=e.TypeError,ae=Zt.prototype,oe=Qt.prototype,ue=ee.prototype,se=e["__core-js_shared__"],ce=oe.toString,le=ue.hasOwnProperty,fe=0,de=(n=/[^.]+$/.exec(se&&se.keys&&se.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",he=ue.toString,_e=ce.call(ee),pe=Se._,ge=ne("^"+ce.call(le).replace(Et,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),be=Ce?e.Buffer:r,De=e.Symbol,Ae=e.Uint8Array,Ee=be?be.allocUnsafe:r,je=xn(ee.getPrototypeOf,ee),Oe=ee.create,He=ue.propertyIsEnumerable,Pe=ae.splice,nn=De?De.isConcatSpreadable:r,fn=De?De.iterator:r,Cn=De?De.toStringTag:r,Hn=function(){try{var t=Ra(ee,"defineProperty");return t({},"",{}),t}catch(t){}}(),Pn=e.clearTimeout!==Se.clearTimeout&&e.clearTimeout,Fn=Kt&&Kt.now!==Se.Date.now&&Kt.now,Nn=e.setTimeout!==Se.setTimeout&&e.setTimeout,Rn=te.ceil,In=te.floor,Bn=ee.getOwnPropertySymbols,zn=be?be.isBuffer:r,qn=e.isFinite,Wn=ae.join,Un=xn(ee.keys,ee),Vn=te.max,$n=te.min,Gn=Kt.now,Jn=e.parseInt,Zn=te.random,Kn=ae.reverse,Xn=Ra(e,"DataView"),Qn=Ra(e,"Map"),tr=Ra(e,"Promise"),er=Ra(e,"Set"),nr=Ra(e,"WeakMap"),rr=Ra(ee,"create"),ir=nr&&new nr,ar={},or=lo(Xn),ur=lo(Qn),sr=lo(tr),cr=lo(er),lr=lo(nr),fr=De?De.prototype:r,dr=fr?fr.valueOf:r,hr=fr?fr.toString:r;function _r(t){if(Yu(t)&&!yu(t)&&!(t instanceof gr)){if(t instanceof yr)return t;if(le.call(t,"__wrapped__"))return fo(t)}return new yr(t)}var pr=function(){function t(){}return function(e){if(!Tu(e))return{};if(Oe)return Oe(e);t.prototype=e;var n=new t;return t.prototype=r,n}}();function mr(){}function yr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=r}function gr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=H,this.__views__=[]}function vr(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Pr(t,e,n,i,a,o){var u,s=e&l,c=e&f,h=e&d;if(n&&(u=a?n(t,i,a,o):n(t)),u!==r)return u;if(!Tu(t))return t;var _=yu(t);if(_){if(u=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&le.call(t,"index")&&(n.index=t.index,n.input=t.input),n}(t),!s)return ra(t,u)}else{var p=za(t),m=p==V||p==$;if(Mu(t))return Ki(t,s);if(p==K||p==R||m&&!a){if(u=c||m?{}:Wa(t),!s)return c?function(t,e){return ia(t,Ba(t),e)}(t,function(t,e){return t&&ia(e,as(e),t)}(u,t)):function(t,e){return ia(t,Ia(t),e)}(t,jr(u,t))}else{if(!xe[p])return a?t:{};u=function(t,e,n){var r,i,a,o=t.constructor;switch(e){case ot:return Xi(t);case z:case q:return new o(+t);case ut:return function(t,e){var n=e?Xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case st:case ct:case lt:case ft:case dt:case ht:case _t:case pt:case mt:return Qi(t,n);case G:return new o;case J:case et:return new o(t);case Q:return(a=new(i=t).constructor(i.source,Bt.exec(i))).lastIndex=i.lastIndex,a;case tt:return new o;case nt:return r=t,dr?ee(dr.call(r)):{}}}(t,p,s)}}o||(o=new kr);var y=o.get(t);if(y)return y;if(o.set(t,u),Ou(t))return t.forEach(function(r){u.add(Pr(r,e,n,r,t,o))}),u;if(Au(t))return t.forEach(function(r,i){u.set(i,Pr(r,e,n,i,t,o))}),u;var g=_?r:(h?c?ja:Sa:c?as:is)(t);return Ue(g||t,function(r,i){g&&(r=t[i=r]),Ar(u,i,Pr(r,e,n,i,t,o))}),u}function Fr(t,e,n){var i=n.length;if(null==t)return!i;for(t=ee(t);i--;){var a=n[i],o=e[a],u=t[a];if(u===r&&!(a in t)||!o(u))return!1}return!0}function Nr(t,e,n){if("function"!=typeof t)throw new ie(o);return ro(function(){t.apply(r,n)},e)}function Rr(t,e,n,r){var a=-1,o=Je,u=!0,s=t.length,c=[],l=e.length;if(!s)return c;n&&(e=Ke(e,pn(n))),r?(o=Ze,u=!1):e.length>=i&&(o=yn,u=!1,e=new wr(e));t:for(;++a-1},br.prototype.set=function(t,e){var n=this.__data__,r=Er(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Mr.prototype.clear=function(){this.size=0,this.__data__={hash:new vr,map:new(Qn||br),string:new vr}},Mr.prototype.delete=function(t){var e=Fa(this,t).delete(t);return this.size-=e?1:0,e},Mr.prototype.get=function(t){return Fa(this,t).get(t)},Mr.prototype.has=function(t){return Fa(this,t).has(t)},Mr.prototype.set=function(t,e){var n=Fa(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},wr.prototype.add=wr.prototype.push=function(t){return this.__data__.set(t,u),this},wr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.clear=function(){this.__data__=new br,this.size=0},kr.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},kr.prototype.get=function(t){return this.__data__.get(t)},kr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.set=function(t,e){var n=this.__data__;if(n instanceof br){var r=n.__data__;if(!Qn||r.length0&&n(u)?e>1?Ur(u,e-1,n,r,i):Xe(i,u):r||(i[i.length]=u)}return i}var Vr=sa(),$r=sa(!0);function Gr(t,e){return t&&Vr(t,e,is)}function Jr(t,e){return t&&$r(t,e,is)}function Zr(t,e){return Ge(e,function(e){return Lu(t[e])})}function Kr(t,e){for(var n=0,i=(e=$i(e,t)).length;null!=t&&ne}function ei(t,e){return null!=t&&le.call(t,e)}function ni(t,e){return null!=t&&e in ee(t)}function ri(t,e,n){for(var i=n?Ze:Je,a=t[0].length,o=t.length,u=o,s=Zt(o),c=1/0,l=[];u--;){var f=t[u];u&&e&&(f=Ke(f,pn(e))),c=$n(f.length,c),s[u]=!n&&(e||a>=120&&f.length>=120)?new wr(u&&f):r}f=t[0];var d=-1,h=s[0];t:for(;++d=u)return s;var c=n[r];return s*("desc"==c?-1:1)}}return t.index-e.index}(t,e,n)})}function vi(t,e,n){for(var r=-1,i=e.length,a={};++r-1;)u!==t&&Pe.call(u,s,1),Pe.call(t,s,1);return t}function Mi(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==a){var a=i;Va(i)?Pe.call(t,i,1):Ri(t,i)}}return t}function wi(t,e){return t+In(Zn()*(e-t+1))}function ki(t,e){var n="";if(!t||e<1||e>j)return n;do{e%2&&(n+=t),(e=In(e/2))&&(t+=t)}while(e);return n}function Li(t,e){return io(to(t,e,Es),t+"")}function xi(t){return xr(hs(t))}function Di(t,e){var n=hs(t);return uo(n,Hr(e,0,n.length))}function Ti(t,e,n,i){if(!Tu(t))return t;for(var a=-1,o=(e=$i(e,t)).length,u=o-1,s=t;null!=s&&++ai?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=Zt(i);++r>>1,o=t[a];null!==o&&!Hu(o)&&(n?o<=e:o=i){var l=e?null:ka(t);if(l)return Yn(l);u=!1,a=yn,c=new wr}else c=e?[]:s;t:for(;++r=i?t:Si(t,e,n)}var Zi=Pn||function(t){return Se.clearTimeout(t)};function Ki(t,e){if(e)return t.slice();var n=t.length,r=Ee?Ee(n):new t.constructor(n);return t.copy(r),r}function Xi(t){var e=new t.constructor(t.byteLength);return new Ae(e).set(new Ae(t)),e}function Qi(t,e){var n=e?Xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function ta(t,e){if(t!==e){var n=t!==r,i=null===t,a=t==t,o=Hu(t),u=e!==r,s=null===e,c=e==e,l=Hu(e);if(!s&&!l&&!o&&t>e||o&&u&&c&&!s&&!l||i&&u&&c||!n&&c||!a)return 1;if(!i&&!o&&!l&&t1?n[a-1]:r,u=a>2?n[2]:r;for(o=t.length>3&&"function"==typeof o?(a--,o):r,u&&$a(n[0],n[1],u)&&(o=a<3?r:o,a=1),e=ee(e);++i-1?a[o?e[u]:u]:r}}function ha(t){return Ea(function(e){var n=e.length,i=n,a=yr.prototype.thru;for(t&&e.reverse();i--;){var u=e[i];if("function"!=typeof u)throw new ie(o);if(a&&!s&&"wrapper"==Ca(u))var s=new yr([],!0)}for(i=s?i:n;++i1&&g.reverse(),f&&cs))return!1;var l=o.get(t);if(l&&o.get(e))return l==e;var f=-1,d=!0,p=n&_?new wr:r;for(o.set(t,e),o.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Ht,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return Ue(N,function(n){var r="_."+n[0];e&n[1]&&!Je(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(Pt);return e?e[1].split(Ft):[]}(r),n)))}function oo(t){var e=0,n=0;return function(){var i=Gn(),a=Y-(i-n);if(n=i,a>0){if(++e>=T)return arguments[0]}else e=0;return t.apply(r,arguments)}}function uo(t,e){var n=-1,i=t.length,a=i-1;for(e=e===r?i:e;++n1?t[e-1]:r;return n="function"==typeof n?(t.pop(),n):r,jo(t,n)});function Ro(t){var e=_r(t);return e.__chain__=!0,e}function Io(t,e){return e(t)}var Bo=Ea(function(t){var e=t.length,n=e?t[0]:0,i=this.__wrapped__,a=function(e){return Cr(e,t)};return!(e>1||this.__actions__.length)&&i instanceof gr&&Va(n)?((i=i.slice(n,+n+(e?1:0))).__actions__.push({func:Io,args:[a],thisArg:r}),new yr(i,this.__chain__).thru(function(t){return e&&!t.length&&t.push(r),t})):this.thru(a)});var zo=aa(function(t,e,n){le.call(t,n)?++t[n]:Or(t,n,1)});var qo=da(mo),Wo=da(yo);function Uo(t,e){return(yu(t)?Ue:Ir)(t,Pa(e,3))}function Vo(t,e){return(yu(t)?Ve:Br)(t,Pa(e,3))}var $o=aa(function(t,e,n){le.call(t,n)?t[n].push(e):Or(t,n,[e])});var Go=Li(function(t,e,n){var r=-1,i="function"==typeof e,a=vu(t)?Zt(t.length):[];return Ir(t,function(t){a[++r]=i?qe(e,t,n):ii(t,e,n)}),a}),Jo=aa(function(t,e,n){Or(t,n,e)});function Zo(t,e){return(yu(t)?Ke:hi)(t,Pa(e,3))}var Ko=aa(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]});var Xo=Li(function(t,e){if(null==t)return[];var n=e.length;return n>1&&$a(t,e[0],e[1])?e=[]:n>2&&$a(e[0],e[1],e[2])&&(e=[e[0]]),gi(t,Ur(e,1),[])}),Qo=Fn||function(){return Se.Date.now()};function tu(t,e,n){return e=n?r:e,e=t&&null==e?t.length:e,xa(t,w,r,r,r,r,e)}function eu(t,e){var n;if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=r),n}}var nu=Li(function(t,e,n){var r=p;if(n.length){var i=Dn(n,Ha(nu));r|=b}return xa(t,r,e,n,i)}),ru=Li(function(t,e,n){var r=p|m;if(n.length){var i=Dn(n,Ha(ru));r|=b}return xa(e,r,t,n,i)});function iu(t,e,n){var i,a,u,s,c,l,f=0,d=!1,h=!1,_=!0;if("function"!=typeof t)throw new ie(o);function p(e){var n=i,o=a;return i=a=r,f=e,s=t.apply(o,n)}function m(t){var n=t-l;return l===r||n>=e||n<0||h&&t-f>=u}function y(){var t=Qo();if(m(t))return g(t);c=ro(y,function(t){var n=e-(t-l);return h?$n(n,u-(t-f)):n}(t))}function g(t){return c=r,_&&i?p(t):(i=a=r,s)}function v(){var t=Qo(),n=m(t);if(i=arguments,a=this,l=t,n){if(c===r)return function(t){return f=t,c=ro(y,e),d?p(t):s}(l);if(h)return c=ro(y,e),p(l)}return c===r&&(c=ro(y,e)),s}return e=qu(e)||0,Tu(n)&&(d=!!n.leading,u=(h="maxWait"in n)?Vn(qu(n.maxWait)||0,e):u,_="trailing"in n?!!n.trailing:_),v.cancel=function(){c!==r&&Zi(c),f=0,i=l=a=c=r},v.flush=function(){return c===r?s:g(Qo())},v}var au=Li(function(t,e){return Nr(t,1,e)}),ou=Li(function(t,e,n){return Nr(t,qu(e)||0,n)});function uu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new ie(o);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],a=n.cache;if(a.has(i))return a.get(i);var o=t.apply(this,r);return n.cache=a.set(i,o)||a,o};return n.cache=new(uu.Cache||Mr),n}function su(t){if("function"!=typeof t)throw new ie(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}uu.Cache=Mr;var cu=Gi(function(t,e){var n=(e=1==e.length&&yu(e[0])?Ke(e[0],pn(Pa())):Ke(Ur(e,1),pn(Pa()))).length;return Li(function(r){for(var i=-1,a=$n(r.length,n);++i=e}),mu=ai(function(){return arguments}())?ai:function(t){return Yu(t)&&le.call(t,"callee")&&!He.call(t,"callee")},yu=Zt.isArray,gu=Fe?pn(Fe):function(t){return Yu(t)&&Qr(t)==ot};function vu(t){return null!=t&&Du(t.length)&&!Lu(t)}function bu(t){return Yu(t)&&vu(t)}var Mu=zn||qs,wu=Ne?pn(Ne):function(t){return Yu(t)&&Qr(t)==q};function ku(t){if(!Yu(t))return!1;var e=Qr(t);return e==U||e==W||"string"==typeof t.message&&"string"==typeof t.name&&!Su(t)}function Lu(t){if(!Tu(t))return!1;var e=Qr(t);return e==V||e==$||e==B||e==X}function xu(t){return"number"==typeof t&&t==Bu(t)}function Du(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=j}function Tu(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Yu(t){return null!=t&&"object"==typeof t}var Au=Re?pn(Re):function(t){return Yu(t)&&za(t)==G};function Eu(t){return"number"==typeof t||Yu(t)&&Qr(t)==J}function Su(t){if(!Yu(t)||Qr(t)!=K)return!1;var e=je(t);if(null===e)return!0;var n=le.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ce.call(n)==_e}var ju=Ie?pn(Ie):function(t){return Yu(t)&&Qr(t)==Q};var Ou=Be?pn(Be):function(t){return Yu(t)&&za(t)==tt};function Cu(t){return"string"==typeof t||!yu(t)&&Yu(t)&&Qr(t)==et}function Hu(t){return"symbol"==typeof t||Yu(t)&&Qr(t)==nt}var Pu=ze?pn(ze):function(t){return Yu(t)&&Du(t.length)&&!!Le[Qr(t)]};var Fu=ba(di),Nu=ba(function(t,e){return t<=e});function Ru(t){if(!t)return[];if(vu(t))return Cu(t)?Sn(t):ra(t);if(fn&&t[fn])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[fn]());var e=za(t);return(e==G?Ln:e==tt?Yn:hs)(t)}function Iu(t){return t?(t=qu(t))===S||t===-S?(t<0?-1:1)*O:t==t?t:0:0===t?t:0}function Bu(t){var e=Iu(t),n=e%1;return e==e?n?e-n:e:0}function zu(t){return t?Hr(Bu(t),0,H):0}function qu(t){if("number"==typeof t)return t;if(Hu(t))return C;if(Tu(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Tu(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(jt,"");var n=qt.test(t);return n||Ut.test(t)?Ye(t.slice(2),n?2:8):zt.test(t)?C:+t}function Wu(t){return ia(t,as(t))}function Uu(t){return null==t?"":Fi(t)}var Vu=oa(function(t,e){if(Ka(e)||vu(e))ia(e,is(e),t);else for(var n in e)le.call(e,n)&&Ar(t,n,e[n])}),$u=oa(function(t,e){ia(e,as(e),t)}),Gu=oa(function(t,e,n,r){ia(e,as(e),t,r)}),Ju=oa(function(t,e,n,r){ia(e,is(e),t,r)}),Zu=Ea(Cr);var Ku=Li(function(t,e){t=ee(t);var n=-1,i=e.length,a=i>2?e[2]:r;for(a&&$a(e[0],e[1],a)&&(i=1);++n1),e}),ia(t,ja(t),n),r&&(n=Pr(n,l|f|d,Ya));for(var i=e.length;i--;)Ri(n,e[i]);return n});var cs=Ea(function(t,e){return null==t?{}:function(t,e){return vi(t,e,function(e,n){return ts(t,n)})}(t,e)});function ls(t,e){if(null==t)return{};var n=Ke(ja(t),function(t){return[t]});return e=Pa(e),vi(t,n,function(t,n){return e(t,n[0])})}var fs=La(is),ds=La(as);function hs(t){return null==t?[]:mn(t,is(t))}var _s=la(function(t,e,n){return e=e.toLowerCase(),t+(n?ps(e):e)});function ps(t){return ks(Uu(t).toLowerCase())}function ms(t){return(t=Uu(t))&&t.replace($t,bn).replace(ye,"")}var ys=la(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),gs=la(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),vs=ca("toLowerCase");var bs=la(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()});var Ms=la(function(t,e,n){return t+(n?" ":"")+ks(e)});var ws=la(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),ks=ca("toUpperCase");function Ls(t,e,n){return t=Uu(t),(e=n?r:e)===r?function(t){return Me.test(t)}(t)?function(t){return t.match(ve)||[]}(t):function(t){return t.match(Nt)||[]}(t):t.match(e)||[]}var xs=Li(function(t,e){try{return qe(t,r,e)}catch(t){return ku(t)?t:new Xt(t)}}),Ds=Ea(function(t,e){return Ue(e,function(e){e=co(e),Or(t,e,nu(t[e],t))}),t});function Ts(t){return function(){return t}}var Ys=ha(),As=ha(!0);function Es(t){return t}function Ss(t){return ci("function"==typeof t?t:Pr(t,l))}var js=Li(function(t,e){return function(n){return ii(n,t,e)}}),Os=Li(function(t,e){return function(n){return ii(t,n,e)}});function Cs(t,e,n){var r=is(e),i=Zr(e,r);null!=n||Tu(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=Zr(e,is(e)));var a=!(Tu(n)&&"chain"in n&&!n.chain),o=Lu(t);return Ue(i,function(n){var r=e[n];t[n]=r,o&&(t.prototype[n]=function(){var e=this.__chain__;if(a||e){var n=t(this.__wrapped__);return(n.__actions__=ra(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Xe([this.value()],arguments))})}),t}function Hs(){}var Ps=ya(Ke),Fs=ya($e),Ns=ya(en);function Rs(t){return Ga(t)?ln(co(t)):function(t){return function(e){return Kr(e,t)}}(t)}var Is=va(),Bs=va(!0);function zs(){return[]}function qs(){return!1}var Ws=ma(function(t,e){return t+e},0),Us=wa("ceil"),Vs=ma(function(t,e){return t/e},1),$s=wa("floor");var Gs,Js=ma(function(t,e){return t*e},1),Zs=wa("round"),Ks=ma(function(t,e){return t-e},0);return _r.after=function(t,e){if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){if(--t<1)return e.apply(this,arguments)}},_r.ary=tu,_r.assign=Vu,_r.assignIn=$u,_r.assignInWith=Gu,_r.assignWith=Ju,_r.at=Zu,_r.before=eu,_r.bind=nu,_r.bindAll=Ds,_r.bindKey=ru,_r.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return yu(t)?t:[t]},_r.chain=Ro,_r.chunk=function(t,e,n){e=(n?$a(t,e,n):e===r)?1:Vn(Bu(e),0);var i=null==t?0:t.length;if(!i||e<1)return[];for(var a=0,o=0,u=Zt(Rn(i/e));aa?0:a+n),(i=i===r||i>a?a:Bu(i))<0&&(i+=a),i=n>i?0:zu(i);n>>0)?(t=Uu(t))&&("string"==typeof e||null!=e&&!ju(e))&&!(e=Fi(e))&&kn(t)?Ji(Sn(t),0,n):t.split(e,n):[]},_r.spread=function(t,e){if("function"!=typeof t)throw new ie(o);return e=null==e?0:Vn(Bu(e),0),Li(function(n){var r=n[e],i=Ji(n,0,e);return r&&Xe(i,r),qe(t,this,i)})},_r.tail=function(t){var e=null==t?0:t.length;return e?Si(t,1,e):[]},_r.take=function(t,e,n){return t&&t.length?Si(t,0,(e=n||e===r?1:Bu(e))<0?0:e):[]},_r.takeRight=function(t,e,n){var i=null==t?0:t.length;return i?Si(t,(e=i-(e=n||e===r?1:Bu(e)))<0?0:e,i):[]},_r.takeRightWhile=function(t,e){return t&&t.length?Bi(t,Pa(e,3),!1,!0):[]},_r.takeWhile=function(t,e){return t&&t.length?Bi(t,Pa(e,3)):[]},_r.tap=function(t,e){return e(t),t},_r.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new ie(o);return Tu(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),iu(t,e,{leading:r,maxWait:e,trailing:i})},_r.thru=Io,_r.toArray=Ru,_r.toPairs=fs,_r.toPairsIn=ds,_r.toPath=function(t){return yu(t)?Ke(t,co):Hu(t)?[t]:ra(so(Uu(t)))},_r.toPlainObject=Wu,_r.transform=function(t,e,n){var r=yu(t),i=r||Mu(t)||Pu(t);if(e=Pa(e,4),null==n){var a=t&&t.constructor;n=i?r?new a:[]:Tu(t)&&Lu(a)?pr(je(t)):{}}return(i?Ue:Gr)(t,function(t,r,i){return e(n,t,r,i)}),n},_r.unary=function(t){return tu(t,1)},_r.union=Yo,_r.unionBy=Ao,_r.unionWith=Eo,_r.uniq=function(t){return t&&t.length?Ni(t):[]},_r.uniqBy=function(t,e){return t&&t.length?Ni(t,Pa(e,2)):[]},_r.uniqWith=function(t,e){return e="function"==typeof e?e:r,t&&t.length?Ni(t,r,e):[]},_r.unset=function(t,e){return null==t||Ri(t,e)},_r.unzip=So,_r.unzipWith=jo,_r.update=function(t,e,n){return null==t?t:Ii(t,e,Vi(n))},_r.updateWith=function(t,e,n,i){return i="function"==typeof i?i:r,null==t?t:Ii(t,e,Vi(n),i)},_r.values=hs,_r.valuesIn=function(t){return null==t?[]:mn(t,as(t))},_r.without=Oo,_r.words=Ls,_r.wrap=function(t,e){return lu(Vi(e),t)},_r.xor=Co,_r.xorBy=Ho,_r.xorWith=Po,_r.zip=Fo,_r.zipObject=function(t,e){return Wi(t||[],e||[],Ar)},_r.zipObjectDeep=function(t,e){return Wi(t||[],e||[],Ti)},_r.zipWith=No,_r.entries=fs,_r.entriesIn=ds,_r.extend=$u,_r.extendWith=Gu,Cs(_r,_r),_r.add=Ws,_r.attempt=xs,_r.camelCase=_s,_r.capitalize=ps,_r.ceil=Us,_r.clamp=function(t,e,n){return n===r&&(n=e,e=r),n!==r&&(n=(n=qu(n))==n?n:0),e!==r&&(e=(e=qu(e))==e?e:0),Hr(qu(t),e,n)},_r.clone=function(t){return Pr(t,d)},_r.cloneDeep=function(t){return Pr(t,l|d)},_r.cloneDeepWith=function(t,e){return Pr(t,l|d,e="function"==typeof e?e:r)},_r.cloneWith=function(t,e){return Pr(t,d,e="function"==typeof e?e:r)},_r.conformsTo=function(t,e){return null==e||Fr(t,e,is(e))},_r.deburr=ms,_r.defaultTo=function(t,e){return null==t||t!=t?e:t},_r.divide=Vs,_r.endsWith=function(t,e,n){t=Uu(t),e=Fi(e);var i=t.length,a=n=n===r?i:Hr(Bu(n),0,i);return(n-=e.length)>=0&&t.slice(n,a)==e},_r.eq=hu,_r.escape=function(t){return(t=Uu(t))&&kt.test(t)?t.replace(Mt,Mn):t},_r.escapeRegExp=function(t){return(t=Uu(t))&&St.test(t)?t.replace(Et,"\\$&"):t},_r.every=function(t,e,n){var i=yu(t)?$e:zr;return n&&$a(t,e,n)&&(e=r),i(t,Pa(e,3))},_r.find=qo,_r.findIndex=mo,_r.findKey=function(t,e){return rn(t,Pa(e,3),Gr)},_r.findLast=Wo,_r.findLastIndex=yo,_r.findLastKey=function(t,e){return rn(t,Pa(e,3),Jr)},_r.floor=$s,_r.forEach=Uo,_r.forEachRight=Vo,_r.forIn=function(t,e){return null==t?t:Vr(t,Pa(e,3),as)},_r.forInRight=function(t,e){return null==t?t:$r(t,Pa(e,3),as)},_r.forOwn=function(t,e){return t&&Gr(t,Pa(e,3))},_r.forOwnRight=function(t,e){return t&&Jr(t,Pa(e,3))},_r.get=Qu,_r.gt=_u,_r.gte=pu,_r.has=function(t,e){return null!=t&&qa(t,e,ei)},_r.hasIn=ts,_r.head=vo,_r.identity=Es,_r.includes=function(t,e,n,r){t=vu(t)?t:hs(t),n=n&&!r?Bu(n):0;var i=t.length;return n<0&&(n=Vn(i+n,0)),Cu(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&on(t,e,n)>-1},_r.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Bu(n);return i<0&&(i=Vn(r+i,0)),on(t,e,i)},_r.inRange=function(t,e,n){return e=Iu(e),n===r?(n=e,e=0):n=Iu(n),function(t,e,n){return t>=$n(e,n)&&t=-j&&t<=j},_r.isSet=Ou,_r.isString=Cu,_r.isSymbol=Hu,_r.isTypedArray=Pu,_r.isUndefined=function(t){return t===r},_r.isWeakMap=function(t){return Yu(t)&&za(t)==it},_r.isWeakSet=function(t){return Yu(t)&&Qr(t)==at},_r.join=function(t,e){return null==t?"":Wn.call(t,e)},_r.kebabCase=ys,_r.last=ko,_r.lastIndexOf=function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var a=i;return n!==r&&(a=(a=Bu(n))<0?Vn(i+a,0):$n(a,i-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,a):an(t,sn,a,!0)},_r.lowerCase=gs,_r.lowerFirst=vs,_r.lt=Fu,_r.lte=Nu,_r.max=function(t){return t&&t.length?qr(t,Es,ti):r},_r.maxBy=function(t,e){return t&&t.length?qr(t,Pa(e,2),ti):r},_r.mean=function(t){return cn(t,Es)},_r.meanBy=function(t,e){return cn(t,Pa(e,2))},_r.min=function(t){return t&&t.length?qr(t,Es,di):r},_r.minBy=function(t,e){return t&&t.length?qr(t,Pa(e,2),di):r},_r.stubArray=zs,_r.stubFalse=qs,_r.stubObject=function(){return{}},_r.stubString=function(){return""},_r.stubTrue=function(){return!0},_r.multiply=Js,_r.nth=function(t,e){return t&&t.length?yi(t,Bu(e)):r},_r.noConflict=function(){return Se._===this&&(Se._=pe),this},_r.noop=Hs,_r.now=Qo,_r.pad=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?En(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return ga(In(i),n)+t+ga(Rn(i),n)},_r.padEnd=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?En(t):0;return e&&re){var i=t;t=e,e=i}if(n||t%1||e%1){var a=Zn();return $n(t+a*(e-t+Te("1e-"+((a+"").length-1))),e)}return wi(t,e)},_r.reduce=function(t,e,n){var r=yu(t)?Qe:dn,i=arguments.length<3;return r(t,Pa(e,4),n,i,Ir)},_r.reduceRight=function(t,e,n){var r=yu(t)?tn:dn,i=arguments.length<3;return r(t,Pa(e,4),n,i,Br)},_r.repeat=function(t,e,n){return e=(n?$a(t,e,n):e===r)?1:Bu(e),ki(Uu(t),e)},_r.replace=function(){var t=arguments,e=Uu(t[0]);return t.length<3?e:e.replace(t[1],t[2])},_r.result=function(t,e,n){var i=-1,a=(e=$i(e,t)).length;for(a||(a=1,t=r);++ij)return[];var n=H,r=$n(t,H);e=Pa(e),t-=H;for(var i=_n(r,e);++n=o)return t;var s=n-En(i);if(s<1)return i;var c=u?Ji(u,0,s).join(""):t.slice(0,s);if(a===r)return c+i;if(u&&(s+=c.length-s),ju(a)){if(t.slice(s).search(a)){var l,f=c;for(a.global||(a=ne(a.source,Uu(Bt.exec(a))+"g")),a.lastIndex=0;l=a.exec(f);)var d=l.index;c=c.slice(0,d===r?s:d)}}else if(t.indexOf(Fi(a),s)!=s){var h=c.lastIndexOf(a);h>-1&&(c=c.slice(0,h))}return c+i},_r.unescape=function(t){return(t=Uu(t))&&wt.test(t)?t.replace(bt,jn):t},_r.uniqueId=function(t){var e=++fe;return Uu(t)+e},_r.upperCase=ws,_r.upperFirst=ks,_r.each=Uo,_r.eachRight=Vo,_r.first=vo,Cs(_r,(Gs={},Gr(_r,function(t,e){le.call(_r.prototype,e)||(Gs[e]=t)}),Gs),{chain:!1}),_r.VERSION="4.17.5",Ue(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){_r[t].placeholder=_r}),Ue(["drop","take"],function(t,e){gr.prototype[t]=function(n){n=n===r?1:Vn(Bu(n),0);var i=this.__filtered__&&!e?new gr(this):this.clone();return i.__filtered__?i.__takeCount__=$n(n,i.__takeCount__):i.__views__.push({size:$n(n,H),type:t+(i.__dir__<0?"Right":"")}),i},gr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),Ue(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==A||3==n;gr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Pa(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),Ue(["head","last"],function(t,e){var n="take"+(e?"Right":"");gr.prototype[t]=function(){return this[n](1).value()[0]}}),Ue(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");gr.prototype[t]=function(){return this.__filtered__?new gr(this):this[n](1)}}),gr.prototype.compact=function(){return this.filter(Es)},gr.prototype.find=function(t){return this.filter(t).head()},gr.prototype.findLast=function(t){return this.reverse().find(t)},gr.prototype.invokeMap=Li(function(t,e){return"function"==typeof t?new gr(this):this.map(function(n){return ii(n,t,e)})}),gr.prototype.reject=function(t){return this.filter(su(Pa(t)))},gr.prototype.slice=function(t,e){t=Bu(t);var n=this;return n.__filtered__&&(t>0||e<0)?new gr(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==r&&(n=(e=Bu(e))<0?n.dropRight(-e):n.take(e-t)),n)},gr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},gr.prototype.toArray=function(){return this.take(H)},Gr(gr.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),i=/^(?:head|last)$/.test(e),a=_r[i?"take"+("last"==e?"Right":""):e],o=i||/^find/.test(e);a&&(_r.prototype[e]=function(){var e=this.__wrapped__,u=i?[1]:arguments,s=e instanceof gr,c=u[0],l=s||yu(e),f=function(t){var e=a.apply(_r,Xe([t],u));return i&&d?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(s=l=!1);var d=this.__chain__,h=!!this.__actions__.length,_=o&&!d,p=s&&!h;if(!o&&l){e=p?e:new gr(this);var m=t.apply(e,u);return m.__actions__.push({func:Io,args:[f],thisArg:r}),new yr(m,d)}return _&&p?t.apply(this,u):(m=this.thru(f),_?i?m.value()[0]:m.value():m)})}),Ue(["pop","push","shift","sort","splice","unshift"],function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);_r.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(yu(i)?i:[],t)}return this[n](function(n){return e.apply(yu(n)?n:[],t)})}}),Gr(gr.prototype,function(t,e){var n=_r[e];if(n){var r=n.name+"";(ar[r]||(ar[r]=[])).push({name:e,func:n})}}),ar[_a(r,m).name]=[{name:"wrapper",func:r}],gr.prototype.clone=function(){var t=new gr(this.__wrapped__);return t.__actions__=ra(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=ra(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=ra(this.__views__),t},gr.prototype.reverse=function(){if(this.__filtered__){var t=new gr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},gr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=yu(t),r=e<0,i=n?t.length:0,a=function(t,e,n){for(var r=-1,i=n.length;++r=this.__values__.length;return{done:t,value:t?r:this.__values__[this.__index__++]}},_r.prototype.plant=function(t){for(var e,n=this;n instanceof mr;){var i=fo(n);i.__index__=0,i.__values__=r,e?a.__wrapped__=i:e=i;var a=i;n=n.__wrapped__}return a.__wrapped__=t,e},_r.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof gr){var e=t;return this.__actions__.length&&(e=new gr(this)),(e=e.reverse()).__actions__.push({func:Io,args:[To],thisArg:r}),new yr(e,this.__chain__)}return this.thru(To)},_r.prototype.toJSON=_r.prototype.valueOf=_r.prototype.value=function(){return zi(this.__wrapped__,this.__actions__)},_r.prototype.first=_r.prototype.head,fn&&(_r.prototype[fn]=function(){return this}),_r}();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Se._=On,define(function(){return On})):Oe?((Oe.exports=On)._=On,je._=On):Se._=On}).call(this)}).call(this,n(10),n(5)(t))},function(t,e,n){(function(t,n){(function(){var r,i=200,a="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",o="Expected a function",u="__lodash_hash_undefined__",s=500,c="__lodash_placeholder__",l=1,f=2,d=4,h=1,_=2,p=1,m=2,y=4,g=8,v=16,b=32,M=64,w=128,k=256,L=512,x=30,D="...",T=800,Y=16,A=1,E=2,S=1/0,j=9007199254740991,O=1.7976931348623157e308,C=NaN,H=4294967295,P=H-1,F=H>>>1,N=[["ary",w],["bind",p],["bindKey",m],["curry",g],["curryRight",v],["flip",L],["partial",b],["partialRight",M],["rearg",k]],R="[object Arguments]",I="[object Array]",B="[object AsyncFunction]",z="[object Boolean]",q="[object Date]",W="[object DOMException]",U="[object Error]",V="[object Function]",$="[object GeneratorFunction]",G="[object Map]",J="[object Number]",Z="[object Null]",K="[object Object]",X="[object Proxy]",Q="[object RegExp]",tt="[object Set]",et="[object String]",nt="[object Symbol]",rt="[object Undefined]",it="[object WeakMap]",at="[object WeakSet]",ot="[object ArrayBuffer]",ut="[object DataView]",st="[object Float32Array]",ct="[object Float64Array]",lt="[object Int8Array]",ft="[object Int16Array]",dt="[object Int32Array]",ht="[object Uint8Array]",_t="[object Uint8ClampedArray]",pt="[object Uint16Array]",mt="[object Uint32Array]",yt=/\b__p \+= '';/g,gt=/\b(__p \+=) '' \+/g,vt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,bt=/&(?:amp|lt|gt|quot|#39);/g,Mt=/[&<>"']/g,wt=RegExp(bt.source),kt=RegExp(Mt.source),Lt=/<%-([\s\S]+?)%>/g,xt=/<%([\s\S]+?)%>/g,Dt=/<%=([\s\S]+?)%>/g,Tt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Yt=/^\w*$/,At=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Et=/[\\^$.*+?()[\]{}|]/g,St=RegExp(Et.source),jt=/^\s+|\s+$/g,Ot=/^\s+/,Ct=/\s+$/,Ht=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Pt=/\{\n\/\* \[wrapped with (.+)\] \*/,Ft=/,? & /,Nt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Rt=/\\(\\)?/g,It=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Bt=/\w*$/,zt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Wt=/^\[object .+?Constructor\]$/,Ut=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\d*)$/,$t=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Gt=/($^)/,Jt=/['\n\r\u2028\u2029\\]/g,Zt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Kt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Xt="[\\ud800-\\udfff]",Qt="["+Kt+"]",te="["+Zt+"]",ee="\\d+",ne="[\\u2700-\\u27bf]",re="[a-z\\xdf-\\xf6\\xf8-\\xff]",ie="[^\\ud800-\\udfff"+Kt+ee+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",ae="\\ud83c[\\udffb-\\udfff]",oe="[^\\ud800-\\udfff]",ue="(?:\\ud83c[\\udde6-\\uddff]){2}",se="[\\ud800-\\udbff][\\udc00-\\udfff]",ce="[A-Z\\xc0-\\xd6\\xd8-\\xde]",le="(?:"+re+"|"+ie+")",fe="(?:"+ce+"|"+ie+")",de="(?:"+te+"|"+ae+")"+"?",he="[\\ufe0e\\ufe0f]?"+de+("(?:\\u200d(?:"+[oe,ue,se].join("|")+")[\\ufe0e\\ufe0f]?"+de+")*"),_e="(?:"+[ne,ue,se].join("|")+")"+he,pe="(?:"+[oe+te+"?",te,ue,se,Xt].join("|")+")",me=RegExp("['’]","g"),ye=RegExp(te,"g"),ge=RegExp(ae+"(?="+ae+")|"+pe+he,"g"),ve=RegExp([ce+"?"+re+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[Qt,ce,"$"].join("|")+")",fe+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[Qt,ce+le,"$"].join("|")+")",ce+"?"+le+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ce+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ee,_e].join("|"),"g"),be=RegExp("[\\u200d\\ud800-\\udfff"+Zt+"\\ufe0e\\ufe0f]"),Me=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,we=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ke=-1,Le={};Le[st]=Le[ct]=Le[lt]=Le[ft]=Le[dt]=Le[ht]=Le[_t]=Le[pt]=Le[mt]=!0,Le[R]=Le[I]=Le[ot]=Le[z]=Le[ut]=Le[q]=Le[U]=Le[V]=Le[G]=Le[J]=Le[K]=Le[Q]=Le[tt]=Le[et]=Le[it]=!1;var xe={};xe[R]=xe[I]=xe[ot]=xe[ut]=xe[z]=xe[q]=xe[st]=xe[ct]=xe[lt]=xe[ft]=xe[dt]=xe[G]=xe[J]=xe[K]=xe[Q]=xe[tt]=xe[et]=xe[nt]=xe[ht]=xe[_t]=xe[pt]=xe[mt]=!0,xe[U]=xe[V]=xe[it]=!1;var De={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Te=parseFloat,Ye=parseInt,Ae="object"==typeof t&&t&&t.Object===Object&&t,Ee="object"==typeof self&&self&&self.Object===Object&&self,Se=Ae||Ee||Function("return this")(),je=e&&!e.nodeType&&e,Oe=je&&"object"==typeof n&&n&&!n.nodeType&&n,Ce=Oe&&Oe.exports===je,He=Ce&&Ae.process,Pe=function(){try{return He&&He.binding&&He.binding("util")}catch(t){}}(),Fe=Pe&&Pe.isArrayBuffer,Ne=Pe&&Pe.isDate,Re=Pe&&Pe.isMap,Ie=Pe&&Pe.isRegExp,Be=Pe&&Pe.isSet,ze=Pe&&Pe.isTypedArray;function qe(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function We(t,e,n,r){for(var i=-1,a=null==t?0:t.length;++i-1}function Ze(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function vn(t,e){for(var n=t.length;n--&&on(e,t[n],0)>-1;);return n}var bn=fn({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Mn=fn({"&":"&","<":"<",">":">",'"':""","'":"'"});function wn(t){return"\\"+De[t]}function kn(t){return be.test(t)}function Ln(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function xn(t,e){return function(n){return t(e(n))}}function Dn(t,e){for(var n=-1,r=t.length,i=0,a=[];++n",""":'"',"'":"'"});var On=function t(e){var n,Zt=(e=null==e?Se:On.defaults(Se.Object(),e,On.pick(Se,we))).Array,Kt=e.Date,Xt=e.Error,Qt=e.Function,te=e.Math,ee=e.Object,ne=e.RegExp,re=e.String,ie=e.TypeError,ae=Zt.prototype,oe=Qt.prototype,ue=ee.prototype,se=e["__core-js_shared__"],ce=oe.toString,le=ue.hasOwnProperty,fe=0,de=(n=/[^.]+$/.exec(se&&se.keys&&se.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",he=ue.toString,_e=ce.call(ee),pe=Se._,ge=ne("^"+ce.call(le).replace(Et,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),be=Ce?e.Buffer:r,De=e.Symbol,Ae=e.Uint8Array,Ee=be?be.allocUnsafe:r,je=xn(ee.getPrototypeOf,ee),Oe=ee.create,He=ue.propertyIsEnumerable,Pe=ae.splice,nn=De?De.isConcatSpreadable:r,fn=De?De.iterator:r,Cn=De?De.toStringTag:r,Hn=function(){try{var t=Ra(ee,"defineProperty");return t({},"",{}),t}catch(t){}}(),Pn=e.clearTimeout!==Se.clearTimeout&&e.clearTimeout,Fn=Kt&&Kt.now!==Se.Date.now&&Kt.now,Nn=e.setTimeout!==Se.setTimeout&&e.setTimeout,Rn=te.ceil,In=te.floor,Bn=ee.getOwnPropertySymbols,zn=be?be.isBuffer:r,qn=e.isFinite,Wn=ae.join,Un=xn(ee.keys,ee),Vn=te.max,$n=te.min,Gn=Kt.now,Jn=e.parseInt,Zn=te.random,Kn=ae.reverse,Xn=Ra(e,"DataView"),Qn=Ra(e,"Map"),tr=Ra(e,"Promise"),er=Ra(e,"Set"),nr=Ra(e,"WeakMap"),rr=Ra(ee,"create"),ir=nr&&new nr,ar={},or=lo(Xn),ur=lo(Qn),sr=lo(tr),cr=lo(er),lr=lo(nr),fr=De?De.prototype:r,dr=fr?fr.valueOf:r,hr=fr?fr.toString:r;function _r(t){if(Yu(t)&&!yu(t)&&!(t instanceof gr)){if(t instanceof yr)return t;if(le.call(t,"__wrapped__"))return fo(t)}return new yr(t)}var pr=function(){function t(){}return function(e){if(!Tu(e))return{};if(Oe)return Oe(e);t.prototype=e;var n=new t;return t.prototype=r,n}}();function mr(){}function yr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=r}function gr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=H,this.__views__=[]}function vr(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Pr(t,e,n,i,a,o){var u,s=e&l,c=e&f,h=e&d;if(n&&(u=a?n(t,i,a,o):n(t)),u!==r)return u;if(!Tu(t))return t;var _=yu(t);if(_){if(u=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&le.call(t,"index")&&(n.index=t.index,n.input=t.input),n}(t),!s)return ra(t,u)}else{var p=za(t),m=p==V||p==$;if(Mu(t))return Ki(t,s);if(p==K||p==R||m&&!a){if(u=c||m?{}:Wa(t),!s)return c?function(t,e){return ia(t,Ba(t),e)}(t,function(t,e){return t&&ia(e,as(e),t)}(u,t)):function(t,e){return ia(t,Ia(t),e)}(t,jr(u,t))}else{if(!xe[p])return a?t:{};u=function(t,e,n){var r,i,a,o=t.constructor;switch(e){case ot:return Xi(t);case z:case q:return new o(+t);case ut:return function(t,e){var n=e?Xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case st:case ct:case lt:case ft:case dt:case ht:case _t:case pt:case mt:return Qi(t,n);case G:return new o;case J:case et:return new o(t);case Q:return(a=new(i=t).constructor(i.source,Bt.exec(i))).lastIndex=i.lastIndex,a;case tt:return new o;case nt:return r=t,dr?ee(dr.call(r)):{}}}(t,p,s)}}o||(o=new kr);var y=o.get(t);if(y)return y;if(o.set(t,u),Ou(t))return t.forEach(function(r){u.add(Pr(r,e,n,r,t,o))}),u;if(Au(t))return t.forEach(function(r,i){u.set(i,Pr(r,e,n,i,t,o))}),u;var g=_?r:(h?c?ja:Sa:c?as:is)(t);return Ue(g||t,function(r,i){g&&(r=t[i=r]),Ar(u,i,Pr(r,e,n,i,t,o))}),u}function Fr(t,e,n){var i=n.length;if(null==t)return!i;for(t=ee(t);i--;){var a=n[i],o=e[a],u=t[a];if(u===r&&!(a in t)||!o(u))return!1}return!0}function Nr(t,e,n){if("function"!=typeof t)throw new ie(o);return ro(function(){t.apply(r,n)},e)}function Rr(t,e,n,r){var a=-1,o=Je,u=!0,s=t.length,c=[],l=e.length;if(!s)return c;n&&(e=Ke(e,pn(n))),r?(o=Ze,u=!1):e.length>=i&&(o=yn,u=!1,e=new wr(e));t:for(;++a-1},br.prototype.set=function(t,e){var n=this.__data__,r=Er(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Mr.prototype.clear=function(){this.size=0,this.__data__={hash:new vr,map:new(Qn||br),string:new vr}},Mr.prototype.delete=function(t){var e=Fa(this,t).delete(t);return this.size-=e?1:0,e},Mr.prototype.get=function(t){return Fa(this,t).get(t)},Mr.prototype.has=function(t){return Fa(this,t).has(t)},Mr.prototype.set=function(t,e){var n=Fa(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},wr.prototype.add=wr.prototype.push=function(t){return this.__data__.set(t,u),this},wr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.clear=function(){this.__data__=new br,this.size=0},kr.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},kr.prototype.get=function(t){return this.__data__.get(t)},kr.prototype.has=function(t){return this.__data__.has(t)},kr.prototype.set=function(t,e){var n=this.__data__;if(n instanceof br){var r=n.__data__;if(!Qn||r.length0&&n(u)?e>1?Ur(u,e-1,n,r,i):Xe(i,u):r||(i[i.length]=u)}return i}var Vr=sa(),$r=sa(!0);function Gr(t,e){return t&&Vr(t,e,is)}function Jr(t,e){return t&&$r(t,e,is)}function Zr(t,e){return Ge(e,function(e){return Lu(t[e])})}function Kr(t,e){for(var n=0,i=(e=$i(e,t)).length;null!=t&&ne}function ei(t,e){return null!=t&&le.call(t,e)}function ni(t,e){return null!=t&&e in ee(t)}function ri(t,e,n){for(var i=n?Ze:Je,a=t[0].length,o=t.length,u=o,s=Zt(o),c=1/0,l=[];u--;){var f=t[u];u&&e&&(f=Ke(f,pn(e))),c=$n(f.length,c),s[u]=!n&&(e||a>=120&&f.length>=120)?new wr(u&&f):r}f=t[0];var d=-1,h=s[0];t:for(;++d=u)return s;var c=n[r];return s*("desc"==c?-1:1)}}return t.index-e.index}(t,e,n)})}function vi(t,e,n){for(var r=-1,i=e.length,a={};++r-1;)u!==t&&Pe.call(u,s,1),Pe.call(t,s,1);return t}function Mi(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==a){var a=i;Va(i)?Pe.call(t,i,1):Ri(t,i)}}return t}function wi(t,e){return t+In(Zn()*(e-t+1))}function ki(t,e){var n="";if(!t||e<1||e>j)return n;do{e%2&&(n+=t),(e=In(e/2))&&(t+=t)}while(e);return n}function Li(t,e){return io(to(t,e,Es),t+"")}function xi(t){return xr(hs(t))}function Di(t,e){var n=hs(t);return uo(n,Hr(e,0,n.length))}function Ti(t,e,n,i){if(!Tu(t))return t;for(var a=-1,o=(e=$i(e,t)).length,u=o-1,s=t;null!=s&&++ai?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=Zt(i);++r>>1,o=t[a];null!==o&&!Hu(o)&&(n?o<=e:o=i){var l=e?null:ka(t);if(l)return Yn(l);u=!1,a=yn,c=new wr}else c=e?[]:s;t:for(;++r=i?t:Si(t,e,n)}var Zi=Pn||function(t){return Se.clearTimeout(t)};function Ki(t,e){if(e)return t.slice();var n=t.length,r=Ee?Ee(n):new t.constructor(n);return t.copy(r),r}function Xi(t){var e=new t.constructor(t.byteLength);return new Ae(e).set(new Ae(t)),e}function Qi(t,e){var n=e?Xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function ta(t,e){if(t!==e){var n=t!==r,i=null===t,a=t==t,o=Hu(t),u=e!==r,s=null===e,c=e==e,l=Hu(e);if(!s&&!l&&!o&&t>e||o&&u&&c&&!s&&!l||i&&u&&c||!n&&c||!a)return 1;if(!i&&!o&&!l&&t1?n[a-1]:r,u=a>2?n[2]:r;for(o=t.length>3&&"function"==typeof o?(a--,o):r,u&&$a(n[0],n[1],u)&&(o=a<3?r:o,a=1),e=ee(e);++i-1?a[o?e[u]:u]:r}}function ha(t){return Ea(function(e){var n=e.length,i=n,a=yr.prototype.thru;for(t&&e.reverse();i--;){var u=e[i];if("function"!=typeof u)throw new ie(o);if(a&&!s&&"wrapper"==Ca(u))var s=new yr([],!0)}for(i=s?i:n;++i1&&g.reverse(),f&&cs))return!1;var l=o.get(t);if(l&&o.get(e))return l==e;var f=-1,d=!0,p=n&_?new wr:r;for(o.set(t,e),o.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Ht,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return Ue(N,function(n){var r="_."+n[0];e&n[1]&&!Je(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(Pt);return e?e[1].split(Ft):[]}(r),n)))}function oo(t){var e=0,n=0;return function(){var i=Gn(),a=Y-(i-n);if(n=i,a>0){if(++e>=T)return arguments[0]}else e=0;return t.apply(r,arguments)}}function uo(t,e){var n=-1,i=t.length,a=i-1;for(e=e===r?i:e;++n1?t[e-1]:r;return n="function"==typeof n?(t.pop(),n):r,jo(t,n)});function Ro(t){var e=_r(t);return e.__chain__=!0,e}function Io(t,e){return e(t)}var Bo=Ea(function(t){var e=t.length,n=e?t[0]:0,i=this.__wrapped__,a=function(e){return Cr(e,t)};return!(e>1||this.__actions__.length)&&i instanceof gr&&Va(n)?((i=i.slice(n,+n+(e?1:0))).__actions__.push({func:Io,args:[a],thisArg:r}),new yr(i,this.__chain__).thru(function(t){return e&&!t.length&&t.push(r),t})):this.thru(a)});var zo=aa(function(t,e,n){le.call(t,n)?++t[n]:Or(t,n,1)});var qo=da(mo),Wo=da(yo);function Uo(t,e){return(yu(t)?Ue:Ir)(t,Pa(e,3))}function Vo(t,e){return(yu(t)?Ve:Br)(t,Pa(e,3))}var $o=aa(function(t,e,n){le.call(t,n)?t[n].push(e):Or(t,n,[e])});var Go=Li(function(t,e,n){var r=-1,i="function"==typeof e,a=vu(t)?Zt(t.length):[];return Ir(t,function(t){a[++r]=i?qe(e,t,n):ii(t,e,n)}),a}),Jo=aa(function(t,e,n){Or(t,n,e)});function Zo(t,e){return(yu(t)?Ke:hi)(t,Pa(e,3))}var Ko=aa(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]});var Xo=Li(function(t,e){if(null==t)return[];var n=e.length;return n>1&&$a(t,e[0],e[1])?e=[]:n>2&&$a(e[0],e[1],e[2])&&(e=[e[0]]),gi(t,Ur(e,1),[])}),Qo=Fn||function(){return Se.Date.now()};function tu(t,e,n){return e=n?r:e,e=t&&null==e?t.length:e,xa(t,w,r,r,r,r,e)}function eu(t,e){var n;if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=r),n}}var nu=Li(function(t,e,n){var r=p;if(n.length){var i=Dn(n,Ha(nu));r|=b}return xa(t,r,e,n,i)}),ru=Li(function(t,e,n){var r=p|m;if(n.length){var i=Dn(n,Ha(ru));r|=b}return xa(e,r,t,n,i)});function iu(t,e,n){var i,a,u,s,c,l,f=0,d=!1,h=!1,_=!0;if("function"!=typeof t)throw new ie(o);function p(e){var n=i,o=a;return i=a=r,f=e,s=t.apply(o,n)}function m(t){var n=t-l;return l===r||n>=e||n<0||h&&t-f>=u}function y(){var t=Qo();if(m(t))return g(t);c=ro(y,function(t){var n=e-(t-l);return h?$n(n,u-(t-f)):n}(t))}function g(t){return c=r,_&&i?p(t):(i=a=r,s)}function v(){var t=Qo(),n=m(t);if(i=arguments,a=this,l=t,n){if(c===r)return function(t){return f=t,c=ro(y,e),d?p(t):s}(l);if(h)return c=ro(y,e),p(l)}return c===r&&(c=ro(y,e)),s}return e=qu(e)||0,Tu(n)&&(d=!!n.leading,u=(h="maxWait"in n)?Vn(qu(n.maxWait)||0,e):u,_="trailing"in n?!!n.trailing:_),v.cancel=function(){c!==r&&Zi(c),f=0,i=l=a=c=r},v.flush=function(){return c===r?s:g(Qo())},v}var au=Li(function(t,e){return Nr(t,1,e)}),ou=Li(function(t,e,n){return Nr(t,qu(e)||0,n)});function uu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new ie(o);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],a=n.cache;if(a.has(i))return a.get(i);var o=t.apply(this,r);return n.cache=a.set(i,o)||a,o};return n.cache=new(uu.Cache||Mr),n}function su(t){if("function"!=typeof t)throw new ie(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}uu.Cache=Mr;var cu=Gi(function(t,e){var n=(e=1==e.length&&yu(e[0])?Ke(e[0],pn(Pa())):Ke(Ur(e,1),pn(Pa()))).length;return Li(function(r){for(var i=-1,a=$n(r.length,n);++i=e}),mu=ai(function(){return arguments}())?ai:function(t){return Yu(t)&&le.call(t,"callee")&&!He.call(t,"callee")},yu=Zt.isArray,gu=Fe?pn(Fe):function(t){return Yu(t)&&Qr(t)==ot};function vu(t){return null!=t&&Du(t.length)&&!Lu(t)}function bu(t){return Yu(t)&&vu(t)}var Mu=zn||qs,wu=Ne?pn(Ne):function(t){return Yu(t)&&Qr(t)==q};function ku(t){if(!Yu(t))return!1;var e=Qr(t);return e==U||e==W||"string"==typeof t.message&&"string"==typeof t.name&&!Su(t)}function Lu(t){if(!Tu(t))return!1;var e=Qr(t);return e==V||e==$||e==B||e==X}function xu(t){return"number"==typeof t&&t==Bu(t)}function Du(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=j}function Tu(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Yu(t){return null!=t&&"object"==typeof t}var Au=Re?pn(Re):function(t){return Yu(t)&&za(t)==G};function Eu(t){return"number"==typeof t||Yu(t)&&Qr(t)==J}function Su(t){if(!Yu(t)||Qr(t)!=K)return!1;var e=je(t);if(null===e)return!0;var n=le.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ce.call(n)==_e}var ju=Ie?pn(Ie):function(t){return Yu(t)&&Qr(t)==Q};var Ou=Be?pn(Be):function(t){return Yu(t)&&za(t)==tt};function Cu(t){return"string"==typeof t||!yu(t)&&Yu(t)&&Qr(t)==et}function Hu(t){return"symbol"==typeof t||Yu(t)&&Qr(t)==nt}var Pu=ze?pn(ze):function(t){return Yu(t)&&Du(t.length)&&!!Le[Qr(t)]};var Fu=ba(di),Nu=ba(function(t,e){return t<=e});function Ru(t){if(!t)return[];if(vu(t))return Cu(t)?Sn(t):ra(t);if(fn&&t[fn])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[fn]());var e=za(t);return(e==G?Ln:e==tt?Yn:hs)(t)}function Iu(t){return t?(t=qu(t))===S||t===-S?(t<0?-1:1)*O:t==t?t:0:0===t?t:0}function Bu(t){var e=Iu(t),n=e%1;return e==e?n?e-n:e:0}function zu(t){return t?Hr(Bu(t),0,H):0}function qu(t){if("number"==typeof t)return t;if(Hu(t))return C;if(Tu(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Tu(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(jt,"");var n=qt.test(t);return n||Ut.test(t)?Ye(t.slice(2),n?2:8):zt.test(t)?C:+t}function Wu(t){return ia(t,as(t))}function Uu(t){return null==t?"":Fi(t)}var Vu=oa(function(t,e){if(Ka(e)||vu(e))ia(e,is(e),t);else for(var n in e)le.call(e,n)&&Ar(t,n,e[n])}),$u=oa(function(t,e){ia(e,as(e),t)}),Gu=oa(function(t,e,n,r){ia(e,as(e),t,r)}),Ju=oa(function(t,e,n,r){ia(e,is(e),t,r)}),Zu=Ea(Cr);var Ku=Li(function(t,e){t=ee(t);var n=-1,i=e.length,a=i>2?e[2]:r;for(a&&$a(e[0],e[1],a)&&(i=1);++n1),e}),ia(t,ja(t),n),r&&(n=Pr(n,l|f|d,Ya));for(var i=e.length;i--;)Ri(n,e[i]);return n});var cs=Ea(function(t,e){return null==t?{}:function(t,e){return vi(t,e,function(e,n){return ts(t,n)})}(t,e)});function ls(t,e){if(null==t)return{};var n=Ke(ja(t),function(t){return[t]});return e=Pa(e),vi(t,n,function(t,n){return e(t,n[0])})}var fs=La(is),ds=La(as);function hs(t){return null==t?[]:mn(t,is(t))}var _s=la(function(t,e,n){return e=e.toLowerCase(),t+(n?ps(e):e)});function ps(t){return ks(Uu(t).toLowerCase())}function ms(t){return(t=Uu(t))&&t.replace($t,bn).replace(ye,"")}var ys=la(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),gs=la(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),vs=ca("toLowerCase");var bs=la(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()});var Ms=la(function(t,e,n){return t+(n?" ":"")+ks(e)});var ws=la(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),ks=ca("toUpperCase");function Ls(t,e,n){return t=Uu(t),(e=n?r:e)===r?function(t){return Me.test(t)}(t)?function(t){return t.match(ve)||[]}(t):function(t){return t.match(Nt)||[]}(t):t.match(e)||[]}var xs=Li(function(t,e){try{return qe(t,r,e)}catch(t){return ku(t)?t:new Xt(t)}}),Ds=Ea(function(t,e){return Ue(e,function(e){e=co(e),Or(t,e,nu(t[e],t))}),t});function Ts(t){return function(){return t}}var Ys=ha(),As=ha(!0);function Es(t){return t}function Ss(t){return ci("function"==typeof t?t:Pr(t,l))}var js=Li(function(t,e){return function(n){return ii(n,t,e)}}),Os=Li(function(t,e){return function(n){return ii(t,n,e)}});function Cs(t,e,n){var r=is(e),i=Zr(e,r);null!=n||Tu(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=Zr(e,is(e)));var a=!(Tu(n)&&"chain"in n&&!n.chain),o=Lu(t);return Ue(i,function(n){var r=e[n];t[n]=r,o&&(t.prototype[n]=function(){var e=this.__chain__;if(a||e){var n=t(this.__wrapped__);return(n.__actions__=ra(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Xe([this.value()],arguments))})}),t}function Hs(){}var Ps=ya(Ke),Fs=ya($e),Ns=ya(en);function Rs(t){return Ga(t)?ln(co(t)):function(t){return function(e){return Kr(e,t)}}(t)}var Is=va(),Bs=va(!0);function zs(){return[]}function qs(){return!1}var Ws=ma(function(t,e){return t+e},0),Us=wa("ceil"),Vs=ma(function(t,e){return t/e},1),$s=wa("floor");var Gs,Js=ma(function(t,e){return t*e},1),Zs=wa("round"),Ks=ma(function(t,e){return t-e},0);return _r.after=function(t,e){if("function"!=typeof e)throw new ie(o);return t=Bu(t),function(){if(--t<1)return e.apply(this,arguments)}},_r.ary=tu,_r.assign=Vu,_r.assignIn=$u,_r.assignInWith=Gu,_r.assignWith=Ju,_r.at=Zu,_r.before=eu,_r.bind=nu,_r.bindAll=Ds,_r.bindKey=ru,_r.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return yu(t)?t:[t]},_r.chain=Ro,_r.chunk=function(t,e,n){e=(n?$a(t,e,n):e===r)?1:Vn(Bu(e),0);var i=null==t?0:t.length;if(!i||e<1)return[];for(var a=0,o=0,u=Zt(Rn(i/e));aa?0:a+n),(i=i===r||i>a?a:Bu(i))<0&&(i+=a),i=n>i?0:zu(i);n>>0)?(t=Uu(t))&&("string"==typeof e||null!=e&&!ju(e))&&!(e=Fi(e))&&kn(t)?Ji(Sn(t),0,n):t.split(e,n):[]},_r.spread=function(t,e){if("function"!=typeof t)throw new ie(o);return e=null==e?0:Vn(Bu(e),0),Li(function(n){var r=n[e],i=Ji(n,0,e);return r&&Xe(i,r),qe(t,this,i)})},_r.tail=function(t){var e=null==t?0:t.length;return e?Si(t,1,e):[]},_r.take=function(t,e,n){return t&&t.length?Si(t,0,(e=n||e===r?1:Bu(e))<0?0:e):[]},_r.takeRight=function(t,e,n){var i=null==t?0:t.length;return i?Si(t,(e=i-(e=n||e===r?1:Bu(e)))<0?0:e,i):[]},_r.takeRightWhile=function(t,e){return t&&t.length?Bi(t,Pa(e,3),!1,!0):[]},_r.takeWhile=function(t,e){return t&&t.length?Bi(t,Pa(e,3)):[]},_r.tap=function(t,e){return e(t),t},_r.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new ie(o);return Tu(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),iu(t,e,{leading:r,maxWait:e,trailing:i})},_r.thru=Io,_r.toArray=Ru,_r.toPairs=fs,_r.toPairsIn=ds,_r.toPath=function(t){return yu(t)?Ke(t,co):Hu(t)?[t]:ra(so(Uu(t)))},_r.toPlainObject=Wu,_r.transform=function(t,e,n){var r=yu(t),i=r||Mu(t)||Pu(t);if(e=Pa(e,4),null==n){var a=t&&t.constructor;n=i?r?new a:[]:Tu(t)&&Lu(a)?pr(je(t)):{}}return(i?Ue:Gr)(t,function(t,r,i){return e(n,t,r,i)}),n},_r.unary=function(t){return tu(t,1)},_r.union=Yo,_r.unionBy=Ao,_r.unionWith=Eo,_r.uniq=function(t){return t&&t.length?Ni(t):[]},_r.uniqBy=function(t,e){return t&&t.length?Ni(t,Pa(e,2)):[]},_r.uniqWith=function(t,e){return e="function"==typeof e?e:r,t&&t.length?Ni(t,r,e):[]},_r.unset=function(t,e){return null==t||Ri(t,e)},_r.unzip=So,_r.unzipWith=jo,_r.update=function(t,e,n){return null==t?t:Ii(t,e,Vi(n))},_r.updateWith=function(t,e,n,i){return i="function"==typeof i?i:r,null==t?t:Ii(t,e,Vi(n),i)},_r.values=hs,_r.valuesIn=function(t){return null==t?[]:mn(t,as(t))},_r.without=Oo,_r.words=Ls,_r.wrap=function(t,e){return lu(Vi(e),t)},_r.xor=Co,_r.xorBy=Ho,_r.xorWith=Po,_r.zip=Fo,_r.zipObject=function(t,e){return Wi(t||[],e||[],Ar)},_r.zipObjectDeep=function(t,e){return Wi(t||[],e||[],Ti)},_r.zipWith=No,_r.entries=fs,_r.entriesIn=ds,_r.extend=$u,_r.extendWith=Gu,Cs(_r,_r),_r.add=Ws,_r.attempt=xs,_r.camelCase=_s,_r.capitalize=ps,_r.ceil=Us,_r.clamp=function(t,e,n){return n===r&&(n=e,e=r),n!==r&&(n=(n=qu(n))==n?n:0),e!==r&&(e=(e=qu(e))==e?e:0),Hr(qu(t),e,n)},_r.clone=function(t){return Pr(t,d)},_r.cloneDeep=function(t){return Pr(t,l|d)},_r.cloneDeepWith=function(t,e){return Pr(t,l|d,e="function"==typeof e?e:r)},_r.cloneWith=function(t,e){return Pr(t,d,e="function"==typeof e?e:r)},_r.conformsTo=function(t,e){return null==e||Fr(t,e,is(e))},_r.deburr=ms,_r.defaultTo=function(t,e){return null==t||t!=t?e:t},_r.divide=Vs,_r.endsWith=function(t,e,n){t=Uu(t),e=Fi(e);var i=t.length,a=n=n===r?i:Hr(Bu(n),0,i);return(n-=e.length)>=0&&t.slice(n,a)==e},_r.eq=hu,_r.escape=function(t){return(t=Uu(t))&&kt.test(t)?t.replace(Mt,Mn):t},_r.escapeRegExp=function(t){return(t=Uu(t))&&St.test(t)?t.replace(Et,"\\$&"):t},_r.every=function(t,e,n){var i=yu(t)?$e:zr;return n&&$a(t,e,n)&&(e=r),i(t,Pa(e,3))},_r.find=qo,_r.findIndex=mo,_r.findKey=function(t,e){return rn(t,Pa(e,3),Gr)},_r.findLast=Wo,_r.findLastIndex=yo,_r.findLastKey=function(t,e){return rn(t,Pa(e,3),Jr)},_r.floor=$s,_r.forEach=Uo,_r.forEachRight=Vo,_r.forIn=function(t,e){return null==t?t:Vr(t,Pa(e,3),as)},_r.forInRight=function(t,e){return null==t?t:$r(t,Pa(e,3),as)},_r.forOwn=function(t,e){return t&&Gr(t,Pa(e,3))},_r.forOwnRight=function(t,e){return t&&Jr(t,Pa(e,3))},_r.get=Qu,_r.gt=_u,_r.gte=pu,_r.has=function(t,e){return null!=t&&qa(t,e,ei)},_r.hasIn=ts,_r.head=vo,_r.identity=Es,_r.includes=function(t,e,n,r){t=vu(t)?t:hs(t),n=n&&!r?Bu(n):0;var i=t.length;return n<0&&(n=Vn(i+n,0)),Cu(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&on(t,e,n)>-1},_r.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:Bu(n);return i<0&&(i=Vn(r+i,0)),on(t,e,i)},_r.inRange=function(t,e,n){return e=Iu(e),n===r?(n=e,e=0):n=Iu(n),function(t,e,n){return t>=$n(e,n)&&t=-j&&t<=j},_r.isSet=Ou,_r.isString=Cu,_r.isSymbol=Hu,_r.isTypedArray=Pu,_r.isUndefined=function(t){return t===r},_r.isWeakMap=function(t){return Yu(t)&&za(t)==it},_r.isWeakSet=function(t){return Yu(t)&&Qr(t)==at},_r.join=function(t,e){return null==t?"":Wn.call(t,e)},_r.kebabCase=ys,_r.last=ko,_r.lastIndexOf=function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var a=i;return n!==r&&(a=(a=Bu(n))<0?Vn(i+a,0):$n(a,i-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,a):an(t,sn,a,!0)},_r.lowerCase=gs,_r.lowerFirst=vs,_r.lt=Fu,_r.lte=Nu,_r.max=function(t){return t&&t.length?qr(t,Es,ti):r},_r.maxBy=function(t,e){return t&&t.length?qr(t,Pa(e,2),ti):r},_r.mean=function(t){return cn(t,Es)},_r.meanBy=function(t,e){return cn(t,Pa(e,2))},_r.min=function(t){return t&&t.length?qr(t,Es,di):r},_r.minBy=function(t,e){return t&&t.length?qr(t,Pa(e,2),di):r},_r.stubArray=zs,_r.stubFalse=qs,_r.stubObject=function(){return{}},_r.stubString=function(){return""},_r.stubTrue=function(){return!0},_r.multiply=Js,_r.nth=function(t,e){return t&&t.length?yi(t,Bu(e)):r},_r.noConflict=function(){return Se._===this&&(Se._=pe),this},_r.noop=Hs,_r.now=Qo,_r.pad=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?En(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return ga(In(i),n)+t+ga(Rn(i),n)},_r.padEnd=function(t,e,n){t=Uu(t);var r=(e=Bu(e))?En(t):0;return e&&re){var i=t;t=e,e=i}if(n||t%1||e%1){var a=Zn();return $n(t+a*(e-t+Te("1e-"+((a+"").length-1))),e)}return wi(t,e)},_r.reduce=function(t,e,n){var r=yu(t)?Qe:dn,i=arguments.length<3;return r(t,Pa(e,4),n,i,Ir)},_r.reduceRight=function(t,e,n){var r=yu(t)?tn:dn,i=arguments.length<3;return r(t,Pa(e,4),n,i,Br)},_r.repeat=function(t,e,n){return e=(n?$a(t,e,n):e===r)?1:Bu(e),ki(Uu(t),e)},_r.replace=function(){var t=arguments,e=Uu(t[0]);return t.length<3?e:e.replace(t[1],t[2])},_r.result=function(t,e,n){var i=-1,a=(e=$i(e,t)).length;for(a||(a=1,t=r);++ij)return[];var n=H,r=$n(t,H);e=Pa(e),t-=H;for(var i=_n(r,e);++n=o)return t;var s=n-En(i);if(s<1)return i;var c=u?Ji(u,0,s).join(""):t.slice(0,s);if(a===r)return c+i;if(u&&(s+=c.length-s),ju(a)){if(t.slice(s).search(a)){var l,f=c;for(a.global||(a=ne(a.source,Uu(Bt.exec(a))+"g")),a.lastIndex=0;l=a.exec(f);)var d=l.index;c=c.slice(0,d===r?s:d)}}else if(t.indexOf(Fi(a),s)!=s){var h=c.lastIndexOf(a);h>-1&&(c=c.slice(0,h))}return c+i},_r.unescape=function(t){return(t=Uu(t))&&wt.test(t)?t.replace(bt,jn):t},_r.uniqueId=function(t){var e=++fe;return Uu(t)+e},_r.upperCase=ws,_r.upperFirst=ks,_r.each=Uo,_r.eachRight=Vo,_r.first=vo,Cs(_r,(Gs={},Gr(_r,function(t,e){le.call(_r.prototype,e)||(Gs[e]=t)}),Gs),{chain:!1}),_r.VERSION="4.17.5",Ue(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){_r[t].placeholder=_r}),Ue(["drop","take"],function(t,e){gr.prototype[t]=function(n){n=n===r?1:Vn(Bu(n),0);var i=this.__filtered__&&!e?new gr(this):this.clone();return i.__filtered__?i.__takeCount__=$n(n,i.__takeCount__):i.__views__.push({size:$n(n,H),type:t+(i.__dir__<0?"Right":"")}),i},gr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),Ue(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==A||3==n;gr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Pa(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),Ue(["head","last"],function(t,e){var n="take"+(e?"Right":"");gr.prototype[t]=function(){return this[n](1).value()[0]}}),Ue(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");gr.prototype[t]=function(){return this.__filtered__?new gr(this):this[n](1)}}),gr.prototype.compact=function(){return this.filter(Es)},gr.prototype.find=function(t){return this.filter(t).head()},gr.prototype.findLast=function(t){return this.reverse().find(t)},gr.prototype.invokeMap=Li(function(t,e){return"function"==typeof t?new gr(this):this.map(function(n){return ii(n,t,e)})}),gr.prototype.reject=function(t){return this.filter(su(Pa(t)))},gr.prototype.slice=function(t,e){t=Bu(t);var n=this;return n.__filtered__&&(t>0||e<0)?new gr(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==r&&(n=(e=Bu(e))<0?n.dropRight(-e):n.take(e-t)),n)},gr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},gr.prototype.toArray=function(){return this.take(H)},Gr(gr.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),i=/^(?:head|last)$/.test(e),a=_r[i?"take"+("last"==e?"Right":""):e],o=i||/^find/.test(e);a&&(_r.prototype[e]=function(){var e=this.__wrapped__,u=i?[1]:arguments,s=e instanceof gr,c=u[0],l=s||yu(e),f=function(t){var e=a.apply(_r,Xe([t],u));return i&&d?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(s=l=!1);var d=this.__chain__,h=!!this.__actions__.length,_=o&&!d,p=s&&!h;if(!o&&l){e=p?e:new gr(this);var m=t.apply(e,u);return m.__actions__.push({func:Io,args:[f],thisArg:r}),new yr(m,d)}return _&&p?t.apply(this,u):(m=this.thru(f),_?i?m.value()[0]:m.value():m)})}),Ue(["pop","push","shift","sort","splice","unshift"],function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);_r.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(yu(i)?i:[],t)}return this[n](function(n){return e.apply(yu(n)?n:[],t)})}}),Gr(gr.prototype,function(t,e){var n=_r[e];if(n){var r=n.name+"";(ar[r]||(ar[r]=[])).push({name:e,func:n})}}),ar[_a(r,m).name]=[{name:"wrapper",func:r}],gr.prototype.clone=function(){var t=new gr(this.__wrapped__);return t.__actions__=ra(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=ra(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=ra(this.__views__),t},gr.prototype.reverse=function(){if(this.__filtered__){var t=new gr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},gr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=yu(t),r=e<0,i=n?t.length:0,a=function(t,e,n){for(var r=-1,i=n.length;++r=this.__values__.length;return{done:t,value:t?r:this.__values__[this.__index__++]}},_r.prototype.plant=function(t){for(var e,n=this;n instanceof mr;){var i=fo(n);i.__index__=0,i.__values__=r,e?a.__wrapped__=i:e=i;var a=i;n=n.__wrapped__}return a.__wrapped__=t,e},_r.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof gr){var e=t;return this.__actions__.length&&(e=new gr(this)),(e=e.reverse()).__actions__.push({func:Io,args:[To],thisArg:r}),new yr(e,this.__chain__)}return this.thru(To)},_r.prototype.toJSON=_r.prototype.valueOf=_r.prototype.value=function(){return zi(this.__wrapped__,this.__actions__)},_r.prototype.first=_r.prototype.head,fn&&(_r.prototype[fn]=function(){return this}),_r}();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(Se._=On,define(function(){return On})):Oe?((Oe.exports=On)._=On,je._=On):Se._=On}).call(this)}).call(this,n(10),n(5)(t))},function(t,e,n){var r={"./dark/index.scss":169,"./default/index.scss":171,"./forest/index.scss":173,"./neutral/index.scss":175};function i(t){var e=a(t);return n(e)}function a(t){var e=r[t];if(!(e+1)){var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}return e}i.keys=function(){return Object.keys(r)},i.resolve=a,t.exports=i,i.id=168},function(t,e,n){var r=n(170);t.exports="string"==typeof r?r:r.toString()},function(t,e,n){(t.exports=n(15)(!1)).push([t.i,".label{font-family:'trebuchet ms', verdana, arial;color:#333}.node rect,.node circle,.node ellipse,.node polygon{fill:#BDD5EA;stroke:purple;stroke-width:1px}.node.clickable{cursor:pointer}.arrowheadPath{fill:#d3d3d3}.edgePath .path{stroke:#d3d3d3;stroke-width:1.5px}.edgeLabel{background-color:#e8e8e8}.cluster rect{fill:#6D6D65 !important;stroke:rgba(255,255,255,0.25) !important;stroke-width:1px !important}.cluster text{fill:#F9FFFE}div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-size:12px;background:#6D6D65;border:1px solid rgba(255,255,255,0.25);border-radius:2px;pointer-events:none;z-index:100}.actor{stroke:#81B1DB;fill:#BDD5EA}text.actor{fill:#000;stroke:none}.actor-line{stroke:#d3d3d3}.messageLine0{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#d3d3d3}.messageLine1{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#d3d3d3}#arrowhead{fill:#d3d3d3}#crosshead path{fill:#d3d3d3 !important;stroke:#d3d3d3 !important}.messageText{fill:#d3d3d3;stroke:none}.labelBox{stroke:#81B1DB;fill:#BDD5EA}.labelText{fill:#d3d3d3;stroke:none}.loopText{fill:#d3d3d3;stroke:none}.loopLine{stroke-width:2;stroke-dasharray:'2 2';stroke:#81B1DB}.note{stroke:rgba(255,255,255,0.25);fill:#fff5ad}.noteText{fill:black;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:14px}.activation0{fill:#f4f4f4;stroke:#666}.activation1{fill:#f4f4f4;stroke:#666}.activation2{fill:#f4f4f4;stroke:#666}.section{stroke:none;opacity:0.2}.section0{fill:rgba(255,255,255,0.3)}.section2{fill:#EAE8B9}.section1,.section3{fill:#fff;opacity:0.2}.sectionTitle0{fill:#F9FFFE}.sectionTitle1{fill:#F9FFFE}.sectionTitle2{fill:#F9FFFE}.sectionTitle3{fill:#F9FFFE}.sectionTitle{text-anchor:start;font-size:11px;text-height:14px}.grid .tick{stroke:#d3d3d3;opacity:0.3;shape-rendering:crispEdges}.grid path{stroke-width:0}.today{fill:none;stroke:#DB5757;stroke-width:2px}.task{stroke-width:2}.taskText{text-anchor:middle;font-size:11px}.taskTextOutsideRight{fill:#323D47;text-anchor:start;font-size:11px}.taskTextOutsideLeft{fill:#323D47;text-anchor:end;font-size:11px}.taskText0,.taskText1,.taskText2,.taskText3{fill:#323D47}.task0,.task1,.task2,.task3{fill:#BDD5EA;stroke:rgba(255,255,255,0.5)}.taskTextOutside0,.taskTextOutside2{fill:#d3d3d3}.taskTextOutside1,.taskTextOutside3{fill:#d3d3d3}.active0,.active1,.active2,.active3{fill:#81B1DB;stroke:rgba(255,255,255,0.5)}.activeText0,.activeText1,.activeText2,.activeText3{fill:#323D47 !important}.done0,.done1,.done2,.done3{stroke:grey;fill:#d3d3d3;stroke-width:2}.doneText0,.doneText1,.doneText2,.doneText3{fill:#323D47 !important}.crit0,.crit1,.crit2,.crit3{stroke:#E83737;fill:#E83737;stroke-width:2}.activeCrit0,.activeCrit1,.activeCrit2,.activeCrit3{stroke:#E83737;fill:#81B1DB;stroke-width:2}.doneCrit0,.doneCrit1,.doneCrit2,.doneCrit3{stroke:#E83737;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.doneCritText0,.doneCritText1,.doneCritText2,.doneCritText3{fill:#323D47 !important}.activeCritText0,.activeCritText1,.activeCritText2,.activeCritText3{fill:#323D47 !important}.titleText{text-anchor:middle;font-size:18px;fill:#323D47}g.classGroup text{fill:purple;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:10px}g.classGroup rect{fill:#BDD5EA;stroke:purple}g.classGroup line{stroke:purple;stroke-width:1}.classLabel .box{stroke:none;stroke-width:0;fill:#BDD5EA;opacity:0.5}.classLabel .label{fill:purple;font-size:10px}.relation{stroke:purple;stroke-width:1;fill:none}#compositionStart{fill:purple;stroke:purple;stroke-width:1}#compositionEnd{fill:purple;stroke:purple;stroke-width:1}#aggregationStart{fill:#BDD5EA;stroke:purple;stroke-width:1}#aggregationEnd{fill:#BDD5EA;stroke:purple;stroke-width:1}#dependencyStart{fill:purple;stroke:purple;stroke-width:1}#dependencyEnd{fill:purple;stroke:purple;stroke-width:1}#extensionStart{fill:purple;stroke:purple;stroke-width:1}#extensionEnd{fill:purple;stroke:purple;stroke-width:1}.commit-id,.commit-msg,.branch-label{fill:lightgrey;color:lightgrey}\n",""])},function(t,e,n){var r=n(172);t.exports="string"==typeof r?r:r.toString()},function(t,e,n){(t.exports=n(15)(!1)).push([t.i,".label{font-family:'trebuchet ms', verdana, arial;color:#333}.node rect,.node circle,.node ellipse,.node polygon{fill:#ECECFF;stroke:#9370db;stroke-width:1px}.node.clickable{cursor:pointer}.arrowheadPath{fill:#333}.edgePath .path{stroke:#333;stroke-width:1.5px}.edgeLabel{background-color:#e8e8e8}.cluster rect{fill:#ffffde !important;stroke:#aa3 !important;stroke-width:1px !important}.cluster text{fill:#333}div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}.actor{stroke:#ccf;fill:#ECECFF}text.actor{fill:#000;stroke:none}.actor-line{stroke:grey}.messageLine0{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#333}.messageLine1{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#333}#arrowhead{fill:#333}#crosshead path{fill:#333 !important;stroke:#333 !important}.messageText{fill:#333;stroke:none}.labelBox{stroke:#ccf;fill:#ECECFF}.labelText{fill:#000;stroke:none}.loopText{fill:#000;stroke:none}.loopLine{stroke-width:2;stroke-dasharray:'2 2';stroke:#ccf}.note{stroke:#aa3;fill:#fff5ad}.noteText{fill:black;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:14px}.activation0{fill:#f4f4f4;stroke:#666}.activation1{fill:#f4f4f4;stroke:#666}.activation2{fill:#f4f4f4;stroke:#666}.section{stroke:none;opacity:0.2}.section0{fill:rgba(102,102,255,0.49)}.section2{fill:#fff400}.section1,.section3{fill:#fff;opacity:0.2}.sectionTitle0{fill:#333}.sectionTitle1{fill:#333}.sectionTitle2{fill:#333}.sectionTitle3{fill:#333}.sectionTitle{text-anchor:start;font-size:11px;text-height:14px}.grid .tick{stroke:#d3d3d3;opacity:0.3;shape-rendering:crispEdges}.grid path{stroke-width:0}.today{fill:none;stroke:red;stroke-width:2px}.task{stroke-width:2}.taskText{text-anchor:middle;font-size:11px}.taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px}.taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}.taskText0,.taskText1,.taskText2,.taskText3{fill:#fff}.task0,.task1,.task2,.task3{fill:#8a90dd;stroke:#534fbc}.taskTextOutside0,.taskTextOutside2{fill:#000}.taskTextOutside1,.taskTextOutside3{fill:#000}.active0,.active1,.active2,.active3{fill:#bfc7ff;stroke:#534fbc}.activeText0,.activeText1,.activeText2,.activeText3{fill:#000 !important}.done0,.done1,.done2,.done3{stroke:grey;fill:#d3d3d3;stroke-width:2}.doneText0,.doneText1,.doneText2,.doneText3{fill:#000 !important}.crit0,.crit1,.crit2,.crit3{stroke:#f88;fill:red;stroke-width:2}.activeCrit0,.activeCrit1,.activeCrit2,.activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}.doneCrit0,.doneCrit1,.doneCrit2,.doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.doneCritText0,.doneCritText1,.doneCritText2,.doneCritText3{fill:#000 !important}.activeCritText0,.activeCritText1,.activeCritText2,.activeCritText3{fill:#000 !important}.titleText{text-anchor:middle;font-size:18px;fill:#000}g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:10px}g.classGroup rect{fill:#ECECFF;stroke:#9370db}g.classGroup line{stroke:#9370db;stroke-width:1}.classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}.classLabel .label{fill:#9370db;font-size:10px}.relation{stroke:#9370db;stroke-width:1;fill:none}#compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}.commit-id,.commit-msg,.branch-label{fill:lightgrey;color:lightgrey}\n",""])},function(t,e,n){var r=n(174);t.exports="string"==typeof r?r:r.toString()},function(t,e,n){(t.exports=n(15)(!1)).push([t.i,".label{font-family:'trebuchet ms', verdana, arial;color:#333}.node rect,.node circle,.node ellipse,.node polygon{fill:#cde498;stroke:#13540c;stroke-width:1px}.node.clickable{cursor:pointer}.arrowheadPath{fill:green}.edgePath .path{stroke:green;stroke-width:1.5px}.edgeLabel{background-color:#e8e8e8}.cluster rect{fill:#cdffb2 !important;stroke:#6eaa49 !important;stroke-width:1px !important}.cluster text{fill:#333}div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-size:12px;background:#cdffb2;border:1px solid #6eaa49;border-radius:2px;pointer-events:none;z-index:100}.actor{stroke:#13540c;fill:#cde498}text.actor{fill:#000;stroke:none}.actor-line{stroke:grey}.messageLine0{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#333}.messageLine1{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#333}#arrowhead{fill:#333}#crosshead path{fill:#333 !important;stroke:#333 !important}.messageText{fill:#333;stroke:none}.labelBox{stroke:#326932;fill:#cde498}.labelText{fill:#000;stroke:none}.loopText{fill:#000;stroke:none}.loopLine{stroke-width:2;stroke-dasharray:'2 2';stroke:#326932}.note{stroke:#6eaa49;fill:#fff5ad}.noteText{fill:black;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:14px}.activation0{fill:#f4f4f4;stroke:#666}.activation1{fill:#f4f4f4;stroke:#666}.activation2{fill:#f4f4f4;stroke:#666}.section{stroke:none;opacity:0.2}.section0{fill:#6eaa49}.section2{fill:#6eaa49}.section1,.section3{fill:#fff;opacity:0.2}.sectionTitle0{fill:#333}.sectionTitle1{fill:#333}.sectionTitle2{fill:#333}.sectionTitle3{fill:#333}.sectionTitle{text-anchor:start;font-size:11px;text-height:14px}.grid .tick{stroke:#d3d3d3;opacity:0.3;shape-rendering:crispEdges}.grid path{stroke-width:0}.today{fill:none;stroke:red;stroke-width:2px}.task{stroke-width:2}.taskText{text-anchor:middle;font-size:11px}.taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px}.taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}.taskText0,.taskText1,.taskText2,.taskText3{fill:#fff}.task0,.task1,.task2,.task3{fill:#487e3a;stroke:#13540c}.taskTextOutside0,.taskTextOutside2{fill:#000}.taskTextOutside1,.taskTextOutside3{fill:#000}.active0,.active1,.active2,.active3{fill:#cde498;stroke:#13540c}.activeText0,.activeText1,.activeText2,.activeText3{fill:#000 !important}.done0,.done1,.done2,.done3{stroke:grey;fill:#d3d3d3;stroke-width:2}.doneText0,.doneText1,.doneText2,.doneText3{fill:#000 !important}.crit0,.crit1,.crit2,.crit3{stroke:#f88;fill:red;stroke-width:2}.activeCrit0,.activeCrit1,.activeCrit2,.activeCrit3{stroke:#f88;fill:#cde498;stroke-width:2}.doneCrit0,.doneCrit1,.doneCrit2,.doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.doneCritText0,.doneCritText1,.doneCritText2,.doneCritText3{fill:#000 !important}.activeCritText0,.activeCritText1,.activeCritText2,.activeCritText3{fill:#000 !important}.titleText{text-anchor:middle;font-size:18px;fill:#000}g.classGroup text{fill:#13540c;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:10px}g.classGroup rect{fill:#cde498;stroke:#13540c}g.classGroup line{stroke:#13540c;stroke-width:1}.classLabel .box{stroke:none;stroke-width:0;fill:#cde498;opacity:0.5}.classLabel .label{fill:#13540c;font-size:10px}.relation{stroke:#13540c;stroke-width:1;fill:none}#compositionStart{fill:#13540c;stroke:#13540c;stroke-width:1}#compositionEnd{fill:#13540c;stroke:#13540c;stroke-width:1}#aggregationStart{fill:#cde498;stroke:#13540c;stroke-width:1}#aggregationEnd{fill:#cde498;stroke:#13540c;stroke-width:1}#dependencyStart{fill:#13540c;stroke:#13540c;stroke-width:1}#dependencyEnd{fill:#13540c;stroke:#13540c;stroke-width:1}#extensionStart{fill:#13540c;stroke:#13540c;stroke-width:1}#extensionEnd{fill:#13540c;stroke:#13540c;stroke-width:1}.commit-id,.commit-msg,.branch-label{fill:lightgrey;color:lightgrey}\n",""])},function(t,e,n){var r=n(176);t.exports="string"==typeof r?r:r.toString()},function(t,e,n){(t.exports=n(15)(!1)).push([t.i,".label{font-family:'trebuchet ms', verdana, arial;color:#333}.node rect,.node circle,.node ellipse,.node polygon{fill:#eee;stroke:#999;stroke-width:1px}.node.clickable{cursor:pointer}.arrowheadPath{fill:#333}.edgePath .path{stroke:#666;stroke-width:1.5px}.edgeLabel{background-color:#fff}.cluster rect{fill:#eaf2fb !important;stroke:#26a !important;stroke-width:1px !important}.cluster text{fill:#333}div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-size:12px;background:#eaf2fb;border:1px solid #26a;border-radius:2px;pointer-events:none;z-index:100}.actor{stroke:#999;fill:#eee}text.actor{fill:#333;stroke:none}.actor-line{stroke:#666}.messageLine0{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#333}.messageLine1{stroke-width:1.5;stroke-dasharray:'2 2';stroke:#333}#arrowhead{fill:#333}#crosshead path{fill:#333 !important;stroke:#333 !important}.messageText{fill:#333;stroke:none}.labelBox{stroke:#999;fill:#eee}.labelText{fill:#fff;stroke:none}.loopText{fill:#fff;stroke:none}.loopLine{stroke-width:2;stroke-dasharray:'2 2';stroke:#999}.note{stroke:#770;fill:#ffa}.noteText{fill:black;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:14px}.activation0{fill:#f4f4f4;stroke:#666}.activation1{fill:#f4f4f4;stroke:#666}.activation2{fill:#f4f4f4;stroke:#666}.section{stroke:none;opacity:0.2}.section0{fill:#80b3e6}.section2{fill:#80b3e6}.section1,.section3{fill:#fff;opacity:0.2}.sectionTitle0{fill:#333}.sectionTitle1{fill:#333}.sectionTitle2{fill:#333}.sectionTitle3{fill:#333}.sectionTitle{text-anchor:start;font-size:11px;text-height:14px}.grid .tick{stroke:#e6e6e6;opacity:0.3;shape-rendering:crispEdges}.grid path{stroke-width:0}.today{fill:none;stroke:#d42;stroke-width:2px}.task{stroke-width:2}.taskText{text-anchor:middle;font-size:11px}.taskTextOutsideRight{fill:#333;text-anchor:start;font-size:11px}.taskTextOutsideLeft{fill:#333;text-anchor:end;font-size:11px}.taskText0,.taskText1,.taskText2,.taskText3{fill:#fff}.task0,.task1,.task2,.task3{fill:#26a;stroke:#1a4d80}.taskTextOutside0,.taskTextOutside2{fill:#333}.taskTextOutside1,.taskTextOutside3{fill:#333}.active0,.active1,.active2,.active3{fill:#eee;stroke:#1a4d80}.activeText0,.activeText1,.activeText2,.activeText3{fill:#333 !important}.done0,.done1,.done2,.done3{stroke:#666;fill:#bbb;stroke-width:2}.doneText0,.doneText1,.doneText2,.doneText3{fill:#333 !important}.crit0,.crit1,.crit2,.crit3{stroke:#b1361b;fill:#d42;stroke-width:2}.activeCrit0,.activeCrit1,.activeCrit2,.activeCrit3{stroke:#b1361b;fill:#eee;stroke-width:2}.doneCrit0,.doneCrit1,.doneCrit2,.doneCrit3{stroke:#b1361b;fill:#bbb;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}.doneCritText0,.doneCritText1,.doneCritText2,.doneCritText3{fill:#333 !important}.activeCritText0,.activeCritText1,.activeCritText2,.activeCritText3{fill:#333 !important}.titleText{text-anchor:middle;font-size:18px;fill:#333}g.classGroup text{fill:#999;stroke:none;font-family:'trebuchet ms', verdana, arial;font-size:10px}g.classGroup rect{fill:#eee;stroke:#999}g.classGroup line{stroke:#999;stroke-width:1}.classLabel .box{stroke:none;stroke-width:0;fill:#eee;opacity:0.5}.classLabel .label{fill:#999;font-size:10px}.relation{stroke:#999;stroke-width:1;fill:none}#compositionStart{fill:#999;stroke:#999;stroke-width:1}#compositionEnd{fill:#999;stroke:#999;stroke-width:1}#aggregationStart{fill:#eee;stroke:#999;stroke-width:1}#aggregationEnd{fill:#eee;stroke:#999;stroke-width:1}#dependencyStart{fill:#999;stroke:#999;stroke-width:1}#dependencyEnd{fill:#999;stroke:#999;stroke-width:1}#extensionStart{fill:#999;stroke:#999;stroke-width:1}#extensionEnd{fill:#999;stroke:#999;stroke-width:1}.commit-id,.commit-msg,.branch-label{fill:lightgrey;color:lightgrey}\n",""])},function(t,e,n){"use strict";n.r(e);var r=n(148),i=n.n(r),a=n(1),o=n(149),u=n.n(o),s=n(0),c=n.n(s),l=1,f=2,d=3,h=4,_=5,p={debug:function(){},info:function(){},warn:function(){},error:function(){},fatal:function(){}},m=function(t){p.debug=function(){},p.info=function(){},p.warn=function(){},p.error=function(){},p.fatal=function(){},t<=_&&(p.fatal=console.log.bind(console,"",y("FATAL"))),t<=h&&(p.error=console.log.bind(console,"",y("ERROR"))),t<=d&&(p.warn=console.log.bind(console,"",y("WARN"))),t<=f&&(p.info=console.log.bind(console,"",y("INFO"))),t<=l&&(p.debug=console.log.bind(console,"",y("DEBUG")))},y=function(t){var e=c()().format("HH:mm:ss.SSS");return"".concat(e," : ").concat(t," : ")},g=function(t,e){if(!t)return e;var n="curve".concat(t.charAt(0).toUpperCase()+t.slice(1));return a[n]||e},v={detectType:function(t){return(t=t.replace(/^\s*%%.*\n/g,"\n")).match(/^\s*sequenceDiagram/)?"sequence":t.match(/^\s*gantt/)?"gantt":t.match(/^\s*classDiagram/)?"class":t.match(/^\s*gitGraph/)?"git":"flowchart"},isSubstringInArray:function(t,e){for(var n=0;n=0)&&i.push(t))});var o={id:"subGraph"+A,nodes:a,title:e.trim()};return T.push(o),A+=1,o.id},getDepthFirstPos:function(t){return P[t]},indexNodes:function(){H=-1,T.length>0&&function t(e,n){var r=T[n].nodes;if(!((H+=1)>2e3)){if(P[H]=n,T[n].id===e)return{result:!0,count:0};for(var i=0,a=1;i=0){var u=t(e,o);if(u.result)return{result:!0,count:a+u.count};a+=u.count}i+=1}return{result:!1,count:a}}}("none",T.length-1)},getSubGraphs:function(){return T}},N=n(14),R=n.n(N),I=n(9),B=n.n(I),z={},q=function(t,e){var n=Object.keys(t);n.forEach(function(n){var r,i=t[n],a="";i.classes.length>0&&(a=i.classes.join(" "));var o="";o=function(t,e){for(var n=0;n")}),i.link&&(r=''+r+"");else{for(var s=document.createElementNS("http://www.w3.org/2000/svg","text"),c=r.split(/
        /),l=0;l'+i.text+""):(o.labelType="text",o.style="stroke: #333; stroke-width: 1.5px;fill:none",o.label=i.text.replace(/
        /g,"\n"))):o.label=i.text.replace(/
        /g,"\n")),e.setEdge(i.start,i.end,o,r)})},U=function(t){for(var e=Object.keys(t),n=0;n=0;s--)i=u[s],F.addVertex(i.id,i.title,"group",void 0);var c=F.getVertices(),l=F.getEdges(),f=0;for(f=u.length-1;f>=0;f--){i=u[f],a.selectAll("cluster").append("text");for(var d=0;d/gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.attr("fill",e.fill),void 0!==e.class&&i.attr("class",e.class);var a=i.append("tspan");return a.attr("x",e.x+2*e.textMargin),a.attr("fill",e.fill),a.text(r),i},Z=function(t,e){var n,r,i,a,o,u=t.append("polygon");u.attr("points",(n=e.x,r=e.y,n+","+r+" "+(n+(i=50))+","+r+" "+(n+i)+","+(r+(a=20)-(o=7))+" "+(n+i-1.2*o)+","+(r+a)+" "+n+","+(r+a))),u.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,J(t,e)},K=-1,X=function(){return{x:0,y:0,fill:"black","text-anchor":"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0}},Q=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},tt=function(){function t(t,e,n,i,a,o,u){r(e.append("text").attr("x",n+a/2).attr("y",i+o/2+5).style("text-anchor","middle").text(t),u)}function e(t,e,n,i,a,o,u,s){for(var c=s.actorFontSize,l=s.actorFontFamily,f=t.split(//gi),d=0;d/gi),u=!0,s=!1,c=void 0;try{for(var l,f=o[Symbol.iterator]();!(u=(l=f.next()).done);u=!0){var d=l.value,h=et.getTextObj();h.x=e,h.y=n+a,h.textMargin=mt.noteMargin,h.dy="1em",h.text=d,h.class="noteText";var _=et.drawText(r,h,i);a+=(_._groups||_)[0][0].getBBox().height}}catch(t){s=!0,c=t}finally{try{u||null==f.return||f.return()}finally{if(s)throw c}}return a}(r.message,e-4,n+24,o,a.width-mt.noteMargin);yt.insert(e,n,e+a.width,n+2*mt.noteMargin+s),u.attr("height",s+2*mt.noteMargin),yt.bumpVerticalPos(s+2*mt.noteMargin)},vt=function(t,e,n,r){for(var i=0;ie&&(n.starty=e-6,e+=12),et.drawActivation(o,n,e,mt,bt(t.from.actor).length),yt.insert(n.startx,e-10,n.stopx,e)}(t,yt.getVerticalPos());break;case nt.parser.yy.LINETYPE.LOOP_START:yt.bumpVerticalPos(mt.boxMargin),yt.newLoop(t.message),yt.bumpVerticalPos(mt.boxMargin+mt.boxTextMargin);break;case nt.parser.yy.LINETYPE.LOOP_END:e=yt.endLoop(),et.drawLoop(o,e,"loop",mt),yt.bumpVerticalPos(mt.boxMargin);break;case nt.parser.yy.LINETYPE.OPT_START:yt.bumpVerticalPos(mt.boxMargin),yt.newLoop(t.message),yt.bumpVerticalPos(mt.boxMargin+mt.boxTextMargin);break;case nt.parser.yy.LINETYPE.OPT_END:e=yt.endLoop(),et.drawLoop(o,e,"opt",mt),yt.bumpVerticalPos(mt.boxMargin);break;case nt.parser.yy.LINETYPE.ALT_START:yt.bumpVerticalPos(mt.boxMargin),yt.newLoop(t.message),yt.bumpVerticalPos(mt.boxMargin+mt.boxTextMargin);break;case nt.parser.yy.LINETYPE.ALT_ELSE:yt.bumpVerticalPos(mt.boxMargin),e=yt.addSectionToLoop(t.message),yt.bumpVerticalPos(mt.boxMargin);break;case nt.parser.yy.LINETYPE.ALT_END:e=yt.endLoop(),et.drawLoop(o,e,"alt",mt),yt.bumpVerticalPos(mt.boxMargin);break;case nt.parser.yy.LINETYPE.PAR_START:yt.bumpVerticalPos(mt.boxMargin),yt.newLoop(t.message),yt.bumpVerticalPos(mt.boxMargin+mt.boxTextMargin);break;case nt.parser.yy.LINETYPE.PAR_AND:yt.bumpVerticalPos(mt.boxMargin),e=yt.addSectionToLoop(t.message),yt.bumpVerticalPos(mt.boxMargin);break;case nt.parser.yy.LINETYPE.PAR_END:e=yt.endLoop(),et.drawLoop(o,e,"par",mt),yt.bumpVerticalPos(mt.boxMargin);break;default:try{yt.bumpVerticalPos(mt.messageMargin);var a=Mt(t.from),s=Mt(t.to),c=a[0]<=s[0]?1:0,l=a[0]n-e?n+i+1.5*zt.leftPadding>c?e+r-5:n+r+5:(n-e)/2+e+r}).attr("y",function(t,r){return r*e+zt.barHeight/2+(zt.fontSize/2-2)+n}).attr("text-height",i).attr("class",function(t){for(var e=u(t.startTime),n=u(t.endTime),r=this.getBBox().width,i=0,a=0;an-e?n+r+1.5*zt.leftPadding>c?"taskTextOutsideLeft taskTextOutside"+i+" "+o:"taskTextOutsideRight taskTextOutside"+i+" "+o:"taskText taskText"+i+" "+o})}(t,_,p,m,h,0,e),function(t,e){for(var n=[],r=0,i=0;i0))return i[1]*t/2+e;for(var o=0;o "+t.w+": "+JSON.stringify(i.edge(t))),function(t,e,n){var r,i,o=function(t){switch(t){case Zt.relationType.AGGREGATION:return"aggregation";case Zt.relationType.EXTENSION:return"extension";case Zt.relationType.COMPOSITION:return"composition";case Zt.relationType.DEPENDENCY:return"dependency"}},u=e.points,s=a.line().x(function(t){return t.x}).y(function(t){return t.y}).curve(a.curveBasis),c=t.append("path").attr("d",s(u)).attr("id","edge"+re).attr("class","relation"),l="";ee.arrowMarkerAbsolute&&(l=(l=(l=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search).replace(/\(/g,"\\(")).replace(/\)/g,"\\)")),"none"!==n.relation.type1&&c.attr("marker-start","url("+l+"#"+o(n.relation.type1)+"Start)"),"none"!==n.relation.type2&&c.attr("marker-end","url("+l+"#"+o(n.relation.type2)+"End)");var f=e.points.length;if(f%2!=0){var d=e.points[Math.floor(f/2)],h=e.points[Math.ceil(f/2)];r=(d.x+h.x)/2,i=(d.y+h.y)/2}else{var _=e.points[Math.floor(f/2)];r=_.x,i=_.y}if(void 0!==n.title){var p=t.append("g").attr("class","classLabel"),m=p.append("text").attr("class","label").attr("x",r).attr("y",i).attr("fill","red").attr("text-anchor","middle").text(n.title);window.label=m;var y=m.node().getBBox();p.insert("rect",":first-child").attr("class","box").attr("x",y.x-ee.padding/2).attr("y",y.y-ee.padding/2).attr("width",y.width+ee.padding).attr("height",y.height+ee.padding)}re++}(r,i.edge(t),i.edge(t).relation)}),r.attr("height","100%"),r.attr("width","100%"),r.attr("viewBox","0 0 "+(i.graph().width+20)+" "+(i.graph().height+20))},ue=n(3),se=n.n(ue),ce={},le=null,fe={master:le},de="master",he="LR",_e=0;function pe(){for(var t,e,n="",r=0;r<7;r++)n+="0123456789abcdef"[(t=0,e=16,Math.floor(Math.random()*(e-t))+t)];return n}function me(t,e){for(p.debug("Entering isfastforwardable:",t.id,e.id);t.seq<=e.seq&&t!==e&&null!=e.parent;){if(Array.isArray(e.parent))return p.debug("In merge commit:",e.parent),me(t,ce[e.parent[0]])||me(t,ce[e.parent[1]]);e=ce[e.parent]}return p.debug(t.id,e.id),t.id===e.id}var ye={};function ge(t,e,n){var r=t.indexOf(e);-1===r?t.push(n):t.splice(r,1,n)}var ve,be=function(){var t=Object.keys(ce).map(function(t){return ce[t]});return t.forEach(function(t){p.debug(t.id)}),se.a.orderBy(t,["seq"],["desc"])},Me={setDirection:function(t){he=t},setOptions:function(t){p.debug("options str",t),t=(t=t&&t.trim())||"{}";try{ye=JSON.parse(t)}catch(t){p.error("error while parsing gitGraph options",t.message)}},getOptions:function(){return ye},commit:function(t){var e={id:pe(),message:t,seq:_e++,parent:null==le?null:le.id};le=e,ce[e.id]=e,fe[de]=e.id,p.debug("in pushCommit "+e.id)},branch:function(t){fe[t]=null!=le?le.id:null,p.debug("in createBranch")},merge:function(t){var e=ce[fe[de]],n=ce[fe[t]];if(function(t,e){return t.seq>e.seq&&me(e,t)}(e,n))p.debug("Already merged");else{if(me(e,n))fe[de]=fe[t],le=ce[fe[de]];else{var r={id:pe(),message:"merged branch "+t+" into "+de,seq:_e++,parent:[null==le?null:le.id,fe[t]]};le=r,ce[r.id]=r,fe[de]=r.id}p.debug(fe),p.debug("in mergeBranch")}},checkout:function(t){p.debug("in checkout");var e=fe[de=t];le=ce[e]},reset:function(t){p.debug("in reset",t);var e=t.split(":")[0],n=parseInt(t.split(":")[1]),r="HEAD"===e?le:ce[fe[e]];for(p.debug(r,n);n>0;)if(n--,!(r=ce[r.parent])){var i="Critical error - unique parent commit not found during reset";throw p.error(i),i}le=r,fe[de]=r.id},prettyPrint:function(){p.debug(ce),function t(e){var n=se.a.maxBy(e,"seq"),r="";e.forEach(function(t){r+=t===n?"\t*":"\t|"});var i=[r,n.id,n.seq];if(se.a.each(fe,function(t,e){t===n.id&&i.push(e)}),p.debug(i.join(" ")),Array.isArray(n.parent)){var a=ce[n.parent[0]];ge(e,n,a),e.push(ce[n.parent[1]])}else{if(null==n.parent)return;var o=ce[n.parent];ge(e,n,o)}t(e=se.a.uniqBy(e,"id"))}([be()[0]])},clear:function(){ce={},fe={master:le=null},de="master",_e=0},getBranchesAsObjArray:function(){return se.a.map(fe,function(t,e){return{name:e,commit:ce[t]}})},getBranches:function(){return fe},getCommits:function(){return ce},getCommitsArray:be,getCurrentBranch:function(){return de},getDirection:function(){return he},getHead:function(){return le}},we=n(16),ke=n.n(we),Le={},xe={nodeSpacing:150,nodeFillColor:"yellow",nodeStrokeWidth:2,nodeStrokeColor:"grey",lineStrokeWidth:4,branchOffset:50,lineColor:"grey",leftMargin:50,branchColors:["#442f74","#983351","#609732","#AA9A39"],nodeRadius:10,nodeLabel:{width:75,height:100,x:-25,y:0}},De={};function Te(t,e,n,r){var i=g(r,a.curveBasis),o=xe.branchColors[n%xe.branchColors.length],u=a.line().x(function(t){return Math.round(t.x)}).y(function(t){return Math.round(t.y)}).curve(i);t.append("svg:path").attr("d",u(e)).style("stroke",o).style("stroke-width",xe.lineStrokeWidth).style("fill","none")}function Ye(t,e){e=e||t.node().getBBox();var n=t.node().getCTM();return{left:n.e+e.x*n.a,top:n.f+e.y*n.d,width:e.width,height:e.height}}function Ae(t,e,n,r,i){p.debug("svgDrawLineForCommits: ",e,n);var a=Ye(t.select("#node-"+e+" circle")),o=Ye(t.select("#node-"+n+" circle"));switch(r){case"LR":if(a.left-o.left>xe.nodeSpacing){var u={x:a.left-xe.nodeSpacing,y:o.top+o.height/2};Te(t,[u,{x:o.left+o.width,y:o.top+o.height/2}],i,"linear"),Te(t,[{x:a.left,y:a.top+a.height/2},{x:a.left-xe.nodeSpacing/2,y:a.top+a.height/2},{x:a.left-xe.nodeSpacing/2,y:u.y},u],i)}else Te(t,[{x:a.left,y:a.top+a.height/2},{x:a.left-xe.nodeSpacing/2,y:a.top+a.height/2},{x:a.left-xe.nodeSpacing/2,y:o.top+o.height/2},{x:o.left+o.width,y:o.top+o.height/2}],i);break;case"BT":if(o.top-a.top>xe.nodeSpacing){var s={x:o.left+o.width/2,y:a.top+a.height+xe.nodeSpacing};Te(t,[s,{x:o.left+o.width/2,y:o.top}],i,"linear"),Te(t,[{x:a.left+a.width/2,y:a.top+a.height},{x:a.left+a.width/2,y:a.top+a.height+xe.nodeSpacing/2},{x:o.left+o.width/2,y:s.y-xe.nodeSpacing/2},s],i)}else Te(t,[{x:a.left+a.width/2,y:a.top+a.height},{x:a.left+a.width/2,y:a.top+xe.nodeSpacing/2},{x:o.left+o.width/2,y:o.top-xe.nodeSpacing/2},{x:o.left+o.width/2,y:o.top}],i)}}function Ee(t,e){return t.select(e).node().cloneNode(!0)}var Se=function(t){De=t},je=function(t,e,n){try{var r=ke.a.parser;r.yy=Me,p.debug("in gitgraph renderer",t,e,n),r.parse(t+"\n"),xe=se.a.extend(xe,De,Me.getOptions()),p.debug("effective options",xe);var i=Me.getDirection();Le=Me.getCommits();var o=Me.getBranchesAsObjArray();"BT"===i&&(xe.nodeLabel.x=o.length*xe.branchOffset,xe.nodeLabel.width="100%",xe.nodeLabel.y=-2*xe.nodeRadius);var u=a.select('[id="'.concat(e,'"]'));!function(t){t.append("defs").append("g").attr("id","def-commit").append("circle").attr("r",xe.nodeRadius).attr("cx",0).attr("cy",0),t.select("#def-commit").append("foreignObject").attr("width",xe.nodeLabel.width).attr("height",xe.nodeLabel.height).attr("x",xe.nodeLabel.x).attr("y",xe.nodeLabel.y).attr("class","node-label").attr("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility").append("p").html("")}(u),ve=1,se.a.each(o,function(t){!function t(e,n,r,i){var a,o=Object.keys(Le).length;if(se.a.isString(n))do{if(a=Le[n],p.debug("in renderCommitHistory",a.id,a.seq),e.select("#node-"+n).size()>0)return;e.append(function(){return Ee(e,"#def-commit")}).attr("class","commit").attr("id",function(){return"node-"+a.id}).attr("transform",function(){switch(i){case"LR":return"translate("+(a.seq*xe.nodeSpacing+xe.leftMargin)+", "+ve*xe.branchOffset+")";case"BT":return"translate("+(ve*xe.branchOffset+xe.leftMargin)+", "+(o-a.seq)*xe.nodeSpacing+")"}}).attr("fill",xe.nodeFillColor).attr("stroke",xe.nodeStrokeColor).attr("stroke-width",xe.nodeStrokeWidth);var u=se.a.find(r,["commit",a]);u&&(p.debug("found branch ",u.name),e.select("#node-"+a.id+" p").append("xhtml:span").attr("class","branch-label").text(u.name+", ")),e.select("#node-"+a.id+" p").append("xhtml:span").attr("class","commit-id").text(a.id),""!==a.message&&"BT"===i&&e.select("#node-"+a.id+" p").append("xhtml:span").attr("class","commit-msg").text(", "+a.message),n=a.parent}while(n&&Le[n]);se.a.isArray(n)&&(p.debug("found merge commmit",n),t(e,n[0],r,i),ve++,t(e,n[1],r,i),ve--)}(u,t.commit.id,o,i),function t(e,n,r,i){for(i=i||0;n.seq>0&&!n.lineDrawn;)se.a.isString(n.parent)?(Ae(e,n.id,n.parent,r,i),n.lineDrawn=!0,n=Le[n.parent]):se.a.isArray(n.parent)&&(Ae(e,n.id,n.parent[0],r,i),Ae(e,n.id,n.parent[1],r,i+1),t(e,Le[n.parent[1]],r,i+1),n.lineDrawn=!0,n=Le[n.parent[0]])}(u,t.commit,i),ve++}),u.attr("height",function(){return"BT"===i?Object.keys(Le).length*xe.nodeSpacing:(o.length+1)*xe.branchOffset})}catch(t){p.error("Error while rendering gitgraph"),p.error(t.message)}};function Oe(t){return(Oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}for(var Ce={},He=["default","forest","dark","neutral"],Pe=0;Pe * { ").concat(d[h].styles.join(" !important; ")," !important; }")}var _=document.createElement("style");_.innerHTML=u()(f,"#".concat(t)),c.insertBefore(_,l);var m=document.createElement("style"),y=window.getComputedStyle(c);switch(m.innerHTML="#".concat(t," {\n color: ").concat(y.color,";\n font: ").concat(y.font,";\n }"),c.insertBefore(m,l),s){case"git":Ne.flowchart.arrowMarkerAbsolute=Ne.arrowMarkerAbsolute,Se(Ne.git),je(e,t,!1);break;case"flowchart":Ne.flowchart.arrowMarkerAbsolute=Ne.arrowMarkerAbsolute,U(Ne.flowchart),$(e,t,!1);break;case"sequence":Ne.sequence.arrowMarkerAbsolute=Ne.arrowMarkerAbsolute,Ne.sequenceDiagram?(wt(Object.assign(Ne.sequence,Ne.sequenceDiagram)),console.error("`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.")):wt(Ne.sequence),kt(e,t);break;case"gantt":Ne.gantt.arrowMarkerAbsolute=Ne.arrowMarkerAbsolute,qt(Ne.gantt),Wt(e,t);break;case"class":Ne.class.arrowMarkerAbsolute=Ne.arrowMarkerAbsolute,ae(Ne.class),oe(e,t)}a.select('[id="'.concat(t,'"]')).selectAll("foreignobject > *").attr("xmlns","http://www.w3.org/1999/xhtml");var g="";Ne.arrowMarkerAbsolute&&(g=(g=(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search).replace(/\(/g,"\\(")).replace(/\)/g,"\\)"));var b=a.select("#d"+t).node().innerHTML.replace(/url\(#arrowhead/g,"url("+g+"#arrowhead","g");b=function(t){var e=t;return e=(e=(e=e.replace(/fl°°/g,function(){return"&#"})).replace(/fl°/g,function(){return"&"})).replace(/¶ß/g,function(){return";"})}(b),void 0!==n?n(b,F.bindFunctions):p.warn("CB = undefined!");var M=a.select("#d"+t).node();return null!==M&&"function"==typeof M.remove&&a.select("#d"+t).node().remove(),b},parse:function(t){var e;switch(v.detectType(t)){case"git":(e=ke.a).parser.yy=Me;break;case"flowchart":(e=R.a).parser.yy=F;break;case"sequence":(e=rt.a).parser.yy=ht;break;case"gantt":(e=xt.a).parser.yy=It;break;case"class":(e=Xt.a).parser.yy=Zt}e.parser.yy.parseError=function(t,e){throw{str:t,hash:e}},e.parse(t)},initialize:function(t){p.debug("Initializing mermaidAPI"),"object"===Oe(t)&&Re(t),m(Ne.logLevel)},getConfig:function(){return Ne}},Be=function(){ze.startOnLoad?Ie.getConfig().startOnLoad&&ze.init():void 0===ze.startOnLoad&&(p.debug("In start, no config"),Ie.getConfig().startOnLoad&&ze.init())};"undefined"!=typeof document&& /*! * Wait for document loaded before starting the execution */ -window.addEventListener("load",(function(){qo()}),!1);var Xo={startOnLoad:!0,htmlLabels:!0,mermaidAPI:Go,parse:Go.parse,render:Go.render,init:function(){var t,e,n=this,r=Go.getConfig();arguments.length>=2?( +window.addEventListener("load",function(){Be()},!1);var ze={startOnLoad:!0,htmlLabels:!0,mermaidAPI:Ie,parse:Ie.parse,render:Ie.render,init:function(){var t,e,n,r=Ie.getConfig();p.debug("Starting rendering diagrams"),arguments.length>=2?( /*! sequence config was passed as #1 */ -void 0!==arguments[0]&&(Xo.sequenceConfig=arguments[0]),t=arguments[1]):t=arguments[0],"function"==typeof arguments[arguments.length-1]?(e=arguments[arguments.length-1],c.debug("Callback function found")):void 0!==r.mermaid&&("function"==typeof r.mermaid.callback?(e=r.mermaid.callback,c.debug("Callback function found")):c.debug("No Callback function found")),t=void 0===t?document.querySelectorAll(".mermaid"):"string"==typeof t?document.querySelectorAll(t):t instanceof window.Node?[t]:t,c.debug("Start On Load before: "+Xo.startOnLoad),void 0!==Xo.startOnLoad&&(c.debug("Start On Load inner: "+Xo.startOnLoad),Go.updateSiteConfig({startOnLoad:Xo.startOnLoad})),void 0!==Xo.ganttConfig&&Go.updateSiteConfig({gantt:Xo.ganttConfig});for(var a,o=H.initIdGeneratior(r.deterministicIds,r.deterministicIDSeed).next,s=function(r){var s=t[r]; -/*! Check if previously processed */if(s.getAttribute("data-processed"))return"continue";s.setAttribute("data-processed",!0);var u="mermaid-".concat(o());a=i(a=s.innerHTML).trim().replace(//gi,"
        ");var l=H.detectInit(a);l&&c.debug("Detected early reinit: ",l);try{Go.render(u,a,(function(t,n){s.innerHTML=t,void 0!==e&&e(u),n&&n(s)}),s)}catch(t){c.warn("Syntax Error rendering"),c.warn(t),n.parseError&&n.parseError(t)}},u=0;u/gi,"
        "),Ie.render(o,n,function(t,n){a.innerHTML=t,void 0!==e&&e(o),n(a)},a)},o=0;o dist/package.js && rollup -c\",\"test\":\"tape 'test/**/*-test.js'\",\"prepublishOnly\":\"yarn test\",\"postpublish\":\"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \\\"d3 ${npm_package_version}\\\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \\\"${npm_package_version}\\\" && git tag -am \\\"${npm_package_version}\\\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js\"};\nexport var devDependencies = {\"json2module\":\"0.0\",\"rimraf\":\"2\",\"rollup\":\"1\",\"rollup-plugin-ascii\":\"0.0\",\"rollup-plugin-node-resolve\":\"3\",\"rollup-plugin-terser\":\"5\",\"tape\":\"4\"};\nexport var dependencies = {\"d3-array\":\"1\",\"d3-axis\":\"1\",\"d3-brush\":\"1\",\"d3-chord\":\"1\",\"d3-collection\":\"1\",\"d3-color\":\"1\",\"d3-contour\":\"1\",\"d3-dispatch\":\"1\",\"d3-drag\":\"1\",\"d3-dsv\":\"1\",\"d3-ease\":\"1\",\"d3-fetch\":\"1\",\"d3-force\":\"1\",\"d3-format\":\"1\",\"d3-geo\":\"1\",\"d3-hierarchy\":\"1\",\"d3-interpolate\":\"1\",\"d3-path\":\"1\",\"d3-polygon\":\"1\",\"d3-quadtree\":\"1\",\"d3-random\":\"1\",\"d3-scale\":\"2\",\"d3-scale-chromatic\":\"1\",\"d3-selection\":\"1\",\"d3-shape\":\"1\",\"d3-time\":\"1\",\"d3-time-format\":\"2\",\"d3-timer\":\"1\",\"d3-transition\":\"1\",\"d3-voronoi\":\"1\",\"d3-zoom\":\"1\"};\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","export default function(array, f) {\n if (f == null) f = pair;\n var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = f(p, p = array[++i]);\n return pairs;\n}\n\nexport function pair(a, b) {\n return [a, b];\n}\n","import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(x) {\n return x === null ? NaN : +x;\n}\n","import number from \"./number\";\n\nexport default function(values, valueof) {\n var n = values.length,\n m = 0,\n i = -1,\n mean = 0,\n value,\n delta,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) {\n delta = value - mean;\n mean += delta / ++m;\n sum += delta * (value - mean);\n }\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\n delta = value - mean;\n mean += delta / ++m;\n sum += delta * (value - mean);\n }\n }\n }\n\n if (m > 1) return sum / (m - 1);\n}\n","import variance from \"./variance\";\n\nexport default function(array, f) {\n var v = variance(array, f);\n return v ? Math.sqrt(v) : v;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n return [min, max];\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return x;\n}\n","export default function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n","import {slice} from \"./array\";\nimport bisect from \"./bisect\";\nimport constant from \"./constant\";\nimport extent from \"./extent\";\nimport identity from \"./identity\";\nimport range from \"./range\";\nimport {tickStep} from \"./ticks\";\nimport sturges from \"./threshold/sturges\";\n\nexport default function() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n var i,\n n = data.length,\n x,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n tz = tickStep(x0, x1, tz);\n tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n }\n\n // Remove any thresholds outside the domain.\n var m = tz.length;\n while (tz[0] <= x0) tz.shift(), --m;\n while (tz[m - 1] > x1) tz.pop(), --m;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n for (i = 0; i < n; ++i) {\n x = values[i];\n if (x0 <= x && x <= x1) {\n bins[bisect(tz, x, 0, m)].push(data[i]);\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n };\n\n return histogram;\n}\n","import number from \"./number\";\n\nexport default function(values, p, valueof) {\n if (valueof == null) valueof = number;\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n","import {map} from \"../array\";\nimport ascending from \"../ascending\";\nimport number from \"../number\";\nimport quantile from \"../quantile\";\n\nexport default function(values, min, max) {\n values = map.call(values, number).sort(ascending);\n return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n}\n","import deviation from \"../deviation\";\n\nexport default function(values, min, max) {\n return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n return max;\n}\n","import number from \"./number\";\n\nexport default function(values, valueof) {\n var n = values.length,\n m = n,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) sum += value;\n else --m;\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;\n else --m;\n }\n }\n\n if (m) return sum / m;\n}\n","import ascending from \"./ascending\";\nimport number from \"./number\";\nimport quantile from \"./quantile\";\n\nexport default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n numbers = [];\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) {\n numbers.push(value);\n }\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\n numbers.push(value);\n }\n }\n }\n\n return quantile(numbers.sort(ascending), 0.5);\n}\n","export default function(arrays) {\n var n = arrays.length,\n m,\n i = -1,\n j = 0,\n merged,\n array;\n\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n\n return merged;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n return min;\n}\n","export default function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n}\n","import ascending from \"./ascending\";\n\nexport default function(values, compare) {\n if (!(n = values.length)) return;\n var n,\n i = 0,\n j = 0,\n xi,\n xj = values[j];\n\n if (compare == null) compare = ascending;\n\n while (++i < n) {\n if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {\n xj = xi, j = i;\n }\n }\n\n if (compare(xj, xj) === 0) return j;\n}\n","export default function(array, i0, i1) {\n var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0];\n array[m + i0] = array[i + i0];\n array[i + i0] = t;\n }\n\n return array;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n }\n }\n\n else {\n while (++i < n) {\n if (value = +valueof(values[i], i, values)) sum += value;\n }\n }\n\n return sum;\n}\n","import min from \"./min\";\n\nexport default function(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n}\n\nfunction length(d) {\n return d.length;\n}\n","import transpose from \"./transpose\";\n\nexport default function() {\n return transpose(arguments);\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return x;\n}\n","import {slice} from \"./array\";\nimport identity from \"./identity\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + (x + 0.5) + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + (y + 0.5) + \")\";\n}\n\nfunction number(scale) {\n return function(d) {\n return +scale(d);\n };\n}\n\nfunction center(scale) {\n var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n if (scale.round()) offset = Math.round(offset);\n return function(d) {\n return +scale(d) + offset;\n };\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + 0.5,\n range1 = +range[range.length - 1] + 0.5,\n position = (scale.bandwidth ? center : number)(scale.copy()),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient == right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d)); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = slice.call(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","var noop = {value: function() {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","import {Selection} from \"./index\";\nimport {EnterNode} from \"./enter\";\nimport constant from \"../constant\";\n\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = {},\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n if (keyValue in nodeByKeyValue) {\n exit[i] = node;\n } else {\n nodeByKeyValue[keyValue] = node;\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = keyPrefix + key.call(parent, data[i], i, data);\n if (node = nodeByKeyValue[keyValue]) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue[keyValue] = null;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n exit[i] = node;\n }\n }\n}\n\nexport default function(value, key) {\n if (!value) {\n data = new Array(this.size()), j = -1;\n this.each(function(d) { data[++j] = d; });\n return data;\n }\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = value.call(parent, parent && parent.__data__, j, parents),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n}\n","import namespace from \"../namespace\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import namespace from \"./namespace\";\nimport {xhtml} from \"./namespaces\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","import creator from \"../creator\";\nimport selector from \"../selector\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","var filterEvents = {};\n\nexport var event = null;\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!(\"onmouseenter\" in element)) {\n filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n }\n}\n\nfunction filterContextListener(listener, index, group) {\n listener = contextListener(listener, index, group);\n return function(event) {\n var related = event.relatedTarget;\n if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n listener.call(this, event);\n }\n };\n}\n\nfunction contextListener(listener, index, group) {\n return function(event1) {\n var event0 = event; // Events can be reentrant (e.g., focus).\n event = event1;\n try {\n listener.call(this, this.__data__, index, group);\n } finally {\n event = event0;\n }\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, capture) {\n var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n return function(d, i, group) {\n var on = this.__on, o, listener = wrap(value, i, group);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, capture);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, capture) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n if (capture == null) capture = false;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n return this;\n}\n\nexport function customEvent(event1, listener, that, args) {\n var event0 = event;\n event1.sourceEvent = event;\n event = event1;\n try {\n return listener.apply(that, args);\n } finally {\n event = event0;\n }\n}\n","import defaultView from \"../window\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select\";\nimport selection_selectAll from \"./selectAll\";\nimport selection_filter from \"./filter\";\nimport selection_data from \"./data\";\nimport selection_enter from \"./enter\";\nimport selection_exit from \"./exit\";\nimport selection_join from \"./join\";\nimport selection_merge from \"./merge\";\nimport selection_order from \"./order\";\nimport selection_sort from \"./sort\";\nimport selection_call from \"./call\";\nimport selection_nodes from \"./nodes\";\nimport selection_node from \"./node\";\nimport selection_size from \"./size\";\nimport selection_empty from \"./empty\";\nimport selection_each from \"./each\";\nimport selection_attr from \"./attr\";\nimport selection_style from \"./style\";\nimport selection_property from \"./property\";\nimport selection_classed from \"./classed\";\nimport selection_text from \"./text\";\nimport selection_html from \"./html\";\nimport selection_raise from \"./raise\";\nimport selection_lower from \"./lower\";\nimport selection_append from \"./append\";\nimport selection_insert from \"./insert\";\nimport selection_remove from \"./remove\";\nimport selection_clone from \"./clone\";\nimport selection_datum from \"./datum\";\nimport selection_on from \"./on\";\nimport selection_dispatch from \"./dispatch\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch\n};\n\nexport default selection;\n","import {Selection} from \"./index\";\nimport selector from \"../selector\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index\";\nimport selectorAll from \"../selectorAll\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index\";\nimport matcher from \"../matcher\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\n if (onupdate != null) update = onupdate(update);\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(selection) {\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var nodes = new Array(this.size()), i = -1;\n this.each(function() { nodes[++i] = this; });\n return nodes;\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n var size = 0;\n this.each(function() { ++size; });\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import creator from \"../creator\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","import {event} from \"d3-selection\";\n\nexport function nopropagation() {\n event.stopImmediatePropagation();\n}\n\nexport default function() {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, true);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, true);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, true);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"hsl(\" : \"hsla(\")\n + (this.h || 0) + \", \"\n + (this.s || 0) * 100 + \"%, \"\n + (this.l || 0) * 100 + \"%\"\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","import {event} from \"./selection/on\";\n\nexport default function() {\n var current = event, source;\n while (source = current.sourceEvent) current = source;\n return current;\n}\n","export default function(node, event) {\n var svg = node.ownerSVGElement || node;\n\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\n\n for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return point(node, touch);\n }\n }\n\n return null;\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node) {\n var event = sourceEvent();\n if (event.changedTouches) event = event.changedTouches[0];\n return point(node, event);\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(function(elapsed) {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar cssNode,\n cssRoot,\n cssView,\n svgNode;\n\nexport function parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n end: transition_end\n};\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n return defaultTiming.time = now(), defaultTiming;\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {Transition} from \"./transition/index.js\";\nimport {SCHEDULED} from \"./transition/schedule.js\";\n\nvar root = [null];\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n i;\n\n if (schedules) {\n name = name == null ? null : name + \"\";\n for (i in schedules) {\n if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {\n return new Transition([[node]], root, name, +i);\n }\n }\n }\n\n return null;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(target, type, selection) {\n this.target = target;\n this.type = type;\n this.selection = selection;\n}\n","import {event} from \"d3-selection\";\n\nexport function nopropagation() {\n event.stopImmediatePropagation();\n}\n\nexport default function() {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {customEvent, event, touch, mouse, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nfunction toucher(identifier) {\n return function(target) {\n return touch(target, event.touches, identifier);\n };\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection) {\n if (group.selection) {\n group\n .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n brush.clear = function(group) {\n brush.move(group, null);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n return (!clean && that.__brush.emitter) || new Emitter(that, args);\n }\n\n function Emitter(that, args) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function() {\n if (this.starting) this.starting = false, this.emit(\"start\");\n else this.emit(\"brush\");\n return this;\n },\n brush: function() {\n this.emit(\"brush\");\n return this;\n },\n end: function() {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n return this;\n },\n emit: function(type) {\n customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function started() {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n pointer = event.touches ? toucher(event.changedTouches[0].identifier) : mouse,\n point0 = pointer(that),\n point = point0,\n emit = emitter(that, arguments, true).beforestart();\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n state.selection = selection = [\n [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n ];\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n nopropagation();\n interrupt(that);\n redraw.call(that);\n emit.start();\n\n function moved() {\n var point1 = pointer(that);\n if (shifting && !lockX && !lockY) {\n if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n else lockX = true;\n }\n point = point1;\n moving = true;\n noevent();\n move();\n }\n\n function move() {\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush();\n }\n }\n\n function ended() {\n nopropagation();\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end();\n }\n\n function keydowned() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n\n function keyupped() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n }\n\n function touchmoved() {\n emitter(this, arguments).moved();\n }\n\n function touchended() {\n emitter(this, arguments).ended();\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export var cos = Math.cos;\nexport var sin = Math.sin;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = pi * 2;\nexport var max = Math.max;\n","import {range} from \"d3-array\";\nimport {max, tau} from \"./math\";\n\nfunction compareValue(compare) {\n return function(a, b) {\n return compare(\n a.source.value + a.target.value,\n b.source.value + b.target.value\n );\n };\n}\n\nexport default function() {\n var padAngle = 0,\n sortGroups = null,\n sortSubgroups = null,\n sortChords = null;\n\n function chord(matrix) {\n var n = matrix.length,\n groupSums = [],\n groupIndex = range(n),\n subgroupIndex = [],\n chords = [],\n groups = chords.groups = new Array(n),\n subgroups = new Array(n * n),\n k,\n x,\n x0,\n dx,\n i,\n j;\n\n // Compute the sum.\n k = 0, i = -1; while (++i < n) {\n x = 0, j = -1; while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(range(n));\n k += x;\n }\n\n // Sort groups…\n if (sortGroups) groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n\n // Sort subgroups…\n if (sortSubgroups) subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n\n // Convert the sum to scaling factor for [0, 2pi].\n // TODO Allow start and end angle to be specified?\n // TODO Allow padding to be specified as percentage?\n k = max(0, tau - padAngle * n) / k;\n dx = k ? padAngle : tau / n;\n\n // Compute the start and end angle for each group and subgroup.\n // Note: Opera has a bug reordering object literal properties!\n x = 0, i = -1; while (++i < n) {\n x0 = x, j = -1; while (++j < n) {\n var di = groupIndex[i],\n dj = subgroupIndex[di][j],\n v = matrix[di][dj],\n a0 = x,\n a1 = x += v * k;\n subgroups[dj * n + di] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += dx;\n }\n\n // Generate chords for each (non-empty) subgroup-subgroup link.\n i = -1; while (++i < n) {\n j = i - 1; while (++j < n) {\n var source = subgroups[j * n + i],\n target = subgroups[i * n + j];\n if (source.value || target.value) {\n chords.push(source.value < target.value\n ? {source: target, target: source}\n : {source: source, target: target});\n }\n }\n }\n\n return sortChords ? chords.sort(sortChords) : chords;\n }\n\n chord.padAngle = function(_) {\n return arguments.length ? (padAngle = max(0, _), chord) : padAngle;\n };\n\n chord.sortGroups = function(_) {\n return arguments.length ? (sortGroups = _, chord) : sortGroups;\n };\n\n chord.sortSubgroups = function(_) {\n return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;\n };\n\n chord.sortChords = function(_) {\n return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;\n };\n\n return chord;\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport {cos, halfPi, sin} from \"./math\";\nimport {path} from \"d3-path\";\n\nfunction defaultSource(d) {\n return d.source;\n}\n\nfunction defaultTarget(d) {\n return d.target;\n}\n\nfunction defaultRadius(d) {\n return d.radius;\n}\n\nfunction defaultStartAngle(d) {\n return d.startAngle;\n}\n\nfunction defaultEndAngle(d) {\n return d.endAngle;\n}\n\nexport default function() {\n var source = defaultSource,\n target = defaultTarget,\n radius = defaultRadius,\n startAngle = defaultStartAngle,\n endAngle = defaultEndAngle,\n context = null;\n\n function ribbon() {\n var buffer,\n argv = slice.call(arguments),\n s = source.apply(this, argv),\n t = target.apply(this, argv),\n sr = +radius.apply(this, (argv[0] = s, argv)),\n sa0 = startAngle.apply(this, argv) - halfPi,\n sa1 = endAngle.apply(this, argv) - halfPi,\n sx0 = sr * cos(sa0),\n sy0 = sr * sin(sa0),\n tr = +radius.apply(this, (argv[0] = t, argv)),\n ta0 = startAngle.apply(this, argv) - halfPi,\n ta1 = endAngle.apply(this, argv) - halfPi;\n\n if (!context) context = buffer = path();\n\n context.moveTo(sx0, sy0);\n context.arc(0, 0, sr, sa0, sa1);\n if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?\n context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));\n context.arc(0, 0, tr, ta0, ta1);\n }\n context.quadraticCurveTo(0, 0, sx0, sy0);\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n ribbon.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), ribbon) : radius;\n };\n\n ribbon.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : startAngle;\n };\n\n ribbon.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : endAngle;\n };\n\n ribbon.source = function(_) {\n return arguments.length ? (source = _, ribbon) : source;\n };\n\n ribbon.target = function(_) {\n return arguments.length ? (target = _, ribbon) : target;\n };\n\n ribbon.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;\n };\n\n return ribbon;\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n","import map from \"./map\";\n\nexport default function() {\n var keys = [],\n sortKeys = [],\n sortValues,\n rollup,\n nest;\n\n function apply(array, depth, createResult, setResult) {\n if (depth >= keys.length) {\n if (sortValues != null) array.sort(sortValues);\n return rollup != null ? rollup(array) : array;\n }\n\n var i = -1,\n n = array.length,\n key = keys[depth++],\n keyValue,\n value,\n valuesByKey = map(),\n values,\n result = createResult();\n\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n values.push(value);\n } else {\n valuesByKey.set(keyValue, [value]);\n }\n }\n\n valuesByKey.each(function(values, key) {\n setResult(result, key, apply(values, depth, createResult, setResult));\n });\n\n return result;\n }\n\n function entries(map, depth) {\n if (++depth > keys.length) return map;\n var array, sortKey = sortKeys[depth - 1];\n if (rollup != null && depth >= keys.length) array = map.entries();\n else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n }\n\n return nest = {\n object: function(array) { return apply(array, 0, createObject, setObject); },\n map: function(array) { return apply(array, 0, createMap, setMap); },\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n key: function(d) { keys.push(d); return nest; },\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n sortValues: function(order) { sortValues = order; return nest; },\n rollup: function(f) { rollup = f; return nest; }\n };\n}\n\nfunction createObject() {\n return {};\n}\n\nfunction setObject(object, key, value) {\n object[key] = value;\n}\n\nfunction createMap() {\n return map();\n}\n\nfunction setMap(map, key, value) {\n map.set(key, value);\n}\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n","export default function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n}\n","export default function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n}\n","export default function(map) {\n var entries = [];\n for (var key in map) entries.push({key: key, value: map[key]});\n return entries;\n}\n","export var deg2rad = Math.PI / 180;\nexport var rad2deg = 180 / Math.PI;\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb} from \"./color.js\";\nimport {deg2rad, rad2deg} from \"./math.js\";\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) return hcl2lab(o);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return hcl2lab(this).rgb();\n }\n}));\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color.js\";\nimport {deg2rad, rad2deg} from \"./math.js\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","var array = Array.prototype;\n\nexport var slice = array.slice;\n","export default function(a, b) {\n return a - b;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(ring, hole) {\n var i = -1, n = hole.length, c;\n while (++i < n) if (c = ringContains(ring, hole[i])) return c;\n return 0;\n}\n\nfunction ringContains(ring, point) {\n var x = point[0], y = point[1], contains = -1;\n for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];\n if (segmentContains(pi, pj, point)) return 0;\n if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;\n }\n return contains;\n}\n\nfunction segmentContains(a, b, c) {\n var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\n}\n\nfunction collinear(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nfunction within(p, q, r) {\n return p <= q && q <= r || r <= q && q <= p;\n}\n","export default function() {}\n","import {extent, thresholdSturges, tickStep, range} from \"d3-array\";\nimport {slice} from \"./array\";\nimport ascending from \"./ascending\";\nimport area from \"./area\";\nimport constant from \"./constant\";\nimport contains from \"./contains\";\nimport noop from \"./noop\";\n\nvar cases = [\n [],\n [[[1.0, 1.5], [0.5, 1.0]]],\n [[[1.5, 1.0], [1.0, 1.5]]],\n [[[1.5, 1.0], [0.5, 1.0]]],\n [[[1.0, 0.5], [1.5, 1.0]]],\n [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],\n [[[1.0, 0.5], [1.0, 1.5]]],\n [[[1.0, 0.5], [0.5, 1.0]]],\n [[[0.5, 1.0], [1.0, 0.5]]],\n [[[1.0, 1.5], [1.0, 0.5]]],\n [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],\n [[[1.5, 1.0], [1.0, 0.5]]],\n [[[0.5, 1.0], [1.5, 1.0]]],\n [[[1.0, 1.5], [1.5, 1.0]]],\n [[[0.5, 1.0], [1.0, 1.5]]],\n []\n];\n\nexport default function() {\n var dx = 1,\n dy = 1,\n threshold = thresholdSturges,\n smooth = smoothLinear;\n\n function contours(values) {\n var tz = threshold(values);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var domain = extent(values), start = domain[0], stop = domain[1];\n tz = tickStep(start, stop, tz);\n tz = range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);\n } else {\n tz = tz.slice().sort(ascending);\n }\n\n return tz.map(function(value) {\n return contour(values, value);\n });\n }\n\n // Accumulate, smooth contour rings, assign holes to exterior rings.\n // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\n function contour(values, value) {\n var polygons = [],\n holes = [];\n\n isorings(values, value, function(ring) {\n smooth(ring, values, value);\n if (area(ring) > 0) polygons.push([ring]);\n else holes.push(ring);\n });\n\n holes.forEach(function(hole) {\n for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n if (contains((polygon = polygons[i])[0], hole) !== -1) {\n polygon.push(hole);\n return;\n }\n }\n });\n\n return {\n type: \"MultiPolygon\",\n value: value,\n coordinates: polygons\n };\n }\n\n // Marching squares with isolines stitched into rings.\n // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\n function isorings(values, value, callback) {\n var fragmentByStart = new Array,\n fragmentByEnd = new Array,\n x, y, t0, t1, t2, t3;\n\n // Special case for the first row (y = -1, t2 = t3 = 0).\n x = y = -1;\n t1 = values[0] >= value;\n cases[t1 << 1].forEach(stitch);\n while (++x < dx - 1) {\n t0 = t1, t1 = values[x + 1] >= value;\n cases[t0 | t1 << 1].forEach(stitch);\n }\n cases[t1 << 0].forEach(stitch);\n\n // General case for the intermediate rows.\n while (++y < dy - 1) {\n x = -1;\n t1 = values[y * dx + dx] >= value;\n t2 = values[y * dx] >= value;\n cases[t1 << 1 | t2 << 2].forEach(stitch);\n while (++x < dx - 1) {\n t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\n cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\n }\n cases[t1 | t2 << 3].forEach(stitch);\n }\n\n // Special case for the last row (y = dy - 1, t0 = t1 = 0).\n x = -1;\n t2 = values[y * dx] >= value;\n cases[t2 << 2].forEach(stitch);\n while (++x < dx - 1) {\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\n cases[t2 << 2 | t3 << 3].forEach(stitch);\n }\n cases[t2 << 3].forEach(stitch);\n\n function stitch(line) {\n var start = [line[0][0] + x, line[0][1] + y],\n end = [line[1][0] + x, line[1][1] + y],\n startIndex = index(start),\n endIndex = index(end),\n f, g;\n if (f = fragmentByEnd[startIndex]) {\n if (g = fragmentByStart[endIndex]) {\n delete fragmentByEnd[f.end];\n delete fragmentByStart[g.start];\n if (f === g) {\n f.ring.push(end);\n callback(f.ring);\n } else {\n fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};\n }\n } else {\n delete fragmentByEnd[f.end];\n f.ring.push(end);\n fragmentByEnd[f.end = endIndex] = f;\n }\n } else if (f = fragmentByStart[endIndex]) {\n if (g = fragmentByEnd[startIndex]) {\n delete fragmentByStart[f.start];\n delete fragmentByEnd[g.end];\n if (f === g) {\n f.ring.push(end);\n callback(f.ring);\n } else {\n fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};\n }\n } else {\n delete fragmentByStart[f.start];\n f.ring.unshift(start);\n fragmentByStart[f.start = startIndex] = f;\n }\n } else {\n fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};\n }\n }\n }\n\n function index(point) {\n return point[0] * 2 + point[1] * (dx + 1) * 4;\n }\n\n function smoothLinear(ring, values, value) {\n ring.forEach(function(point) {\n var x = point[0],\n y = point[1],\n xt = x | 0,\n yt = y | 0,\n v0,\n v1 = values[yt * dx + xt];\n if (x > 0 && x < dx && xt === x) {\n v0 = values[yt * dx + xt - 1];\n point[0] = x + (value - v0) / (v1 - v0) - 0.5;\n }\n if (y > 0 && y < dy && yt === y) {\n v0 = values[(yt - 1) * dx + xt];\n point[1] = y + (value - v0) / (v1 - v0) - 0.5;\n }\n });\n }\n\n contours.contour = contour;\n\n contours.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 > 0) || !(_1 > 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, contours;\n };\n\n contours.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold;\n };\n\n contours.smooth = function(_) {\n return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear;\n };\n\n return contours;\n}\n","export default function(ring) {\n var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n return area;\n}\n","// TODO Optimize edge cases.\n// TODO Optimize index calculation.\n// TODO Optimize arguments.\nexport function blurX(source, target, r) {\n var n = source.width,\n m = source.height,\n w = (r << 1) + 1;\n for (var j = 0; j < m; ++j) {\n for (var i = 0, sr = 0; i < n + r; ++i) {\n if (i < n) {\n sr += source.data[i + j * n];\n }\n if (i >= r) {\n if (i >= w) {\n sr -= source.data[i - w + j * n];\n }\n target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);\n }\n }\n }\n}\n\n// TODO Optimize edge cases.\n// TODO Optimize index calculation.\n// TODO Optimize arguments.\nexport function blurY(source, target, r) {\n var n = source.width,\n m = source.height,\n w = (r << 1) + 1;\n for (var i = 0; i < n; ++i) {\n for (var j = 0, sr = 0; j < m + r; ++j) {\n if (j < m) {\n sr += source.data[i + j * n];\n }\n if (j >= r) {\n if (j >= w) {\n sr -= source.data[i + (j - w) * n];\n }\n target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);\n }\n }\n }\n}\n","import {max, range, tickStep} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {blurX, blurY} from \"./blur\";\nimport constant from \"./constant\";\nimport contours from \"./contours\";\n\nfunction defaultX(d) {\n return d[0];\n}\n\nfunction defaultY(d) {\n return d[1];\n}\n\nfunction defaultWeight() {\n return 1;\n}\n\nexport default function() {\n var x = defaultX,\n y = defaultY,\n weight = defaultWeight,\n dx = 960,\n dy = 500,\n r = 20, // blur radius\n k = 2, // log2(grid cell size)\n o = r * 3, // grid offset, to pad for blur\n n = (dx + o * 2) >> k, // grid width\n m = (dy + o * 2) >> k, // grid height\n threshold = constant(20);\n\n function density(data) {\n var values0 = new Float32Array(n * m),\n values1 = new Float32Array(n * m);\n\n data.forEach(function(d, i, data) {\n var xi = (+x(d, i, data) + o) >> k,\n yi = (+y(d, i, data) + o) >> k,\n wi = +weight(d, i, data);\n if (xi >= 0 && xi < n && yi >= 0 && yi < m) {\n values0[xi + yi * n] += wi;\n }\n });\n\n // TODO Optimize.\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n\n var tz = threshold(values0);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var stop = max(values0);\n tz = tickStep(0, stop, tz);\n tz = range(0, Math.floor(stop / tz) * tz, tz);\n tz.shift();\n }\n\n return contours()\n .thresholds(tz)\n .size([n, m])\n (values0)\n .map(transform);\n }\n\n function transform(geometry) {\n geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.\n geometry.coordinates.forEach(transformPolygon);\n return geometry;\n }\n\n function transformPolygon(coordinates) {\n coordinates.forEach(transformRing);\n }\n\n function transformRing(coordinates) {\n coordinates.forEach(transformPoint);\n }\n\n // TODO Optimize.\n function transformPoint(coordinates) {\n coordinates[0] = coordinates[0] * Math.pow(2, k) - o;\n coordinates[1] = coordinates[1] * Math.pow(2, k) - o;\n }\n\n function resize() {\n o = r * 3;\n n = (dx + o * 2) >> k;\n m = (dy + o * 2) >> k;\n return density;\n }\n\n density.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), density) : x;\n };\n\n density.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), density) : y;\n };\n\n density.weight = function(_) {\n return arguments.length ? (weight = typeof _ === \"function\" ? _ : constant(+_), density) : weight;\n };\n\n density.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 >= 0) && !(_0 >= 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, resize();\n };\n\n density.cellSize = function(_) {\n if (!arguments.length) return 1 << k;\n if (!((_ = +_) >= 1)) throw new Error(\"invalid cell size\");\n return k = Math.floor(Math.log(_) / Math.LN2), resize();\n };\n\n density.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold;\n };\n\n density.bandwidth = function(_) {\n if (!arguments.length) return Math.sqrt(r * (r + 1));\n if (!((_ = +_) >= 0)) throw new Error(\"invalid bandwidth\");\n return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();\n };\n\n return density;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {\n this.target = target;\n this.type = type;\n this.subject = subject;\n this.identifier = id;\n this.active = active;\n this.x = x;\n this.y = y;\n this.dx = dx;\n this.dy = dy;\n this._ = dispatch;\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n","import {dispatch} from \"d3-dispatch\";\nimport {event, customEvent, select, mouse, touch} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var gesture = beforestart(\"mouse\", container.apply(this, arguments), mouse, this, arguments);\n if (!gesture) return;\n select(event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\n nodrag(event.view);\n nopropagation();\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\");\n }\n\n function mousemoved() {\n noevent();\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\");\n }\n\n function mouseupped() {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent();\n gestures.mouse(\"end\");\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var touches = event.changedTouches,\n c = container.apply(this, arguments),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {\n nopropagation();\n gesture(\"start\");\n }\n }\n }\n\n function touchmoved() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent();\n gesture(\"drag\");\n }\n }\n }\n\n function touchended() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation();\n gesture(\"end\");\n }\n }\n }\n\n function beforestart(id, container, point, that, args) {\n var p = point(container, id), s, dx, dy,\n sublisteners = listeners.copy();\n\n if (!customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\n if ((event.subject = s = subject.apply(that, args)) == null) return false;\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n return true;\n })) return;\n\n return function gesture(type) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[id] = gesture, n = active++; break;\n case \"end\": delete gestures[id], --active; // nobreak\n case \"drag\": p = point(container, id), n = active; break;\n }\n customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","import dsv from \"./dsv.js\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatBody = tsv.formatBody;\nexport var tsvFormatRows = tsv.formatRows;\nexport var tsvFormatRow = tsv.formatRow;\nexport var tsvFormatValue = tsv.formatValue;\n","export default function autoType(object) {\n for (var key in object) {\n var value = object[key].trim(), number, m;\n if (!value) value = null;\n else if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value === \"NaN\") value = NaN;\n else if (!isNaN(number = +value)) value = number;\n else if (m = value.match(/^([-+]\\d{2})?\\d{4}(-\\d{2}(-\\d{2})?)?(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?(Z|[-+]\\d{2}:\\d{2})?)?$/)) {\n if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, \"/\").replace(/T/, \" \");\n value = new Date(value);\n }\n else continue;\n object[key] = value;\n }\n return object;\n}\n\n// https://github.com/d3/d3-dsv/issues/45\nvar fixtz = new Date(\"2019-01-01T00:00\").getHours() || new Date(\"2019-07-01T00:00\").getHours();","export function linear(t) {\n return +t;\n}\n","export function quadIn(t) {\n return t * t;\n}\n\nexport function quadOut(t) {\n return t * (2 - t);\n}\n\nexport function quadInOut(t) {\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n","var exponent = 3;\n\nexport var polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nexport var polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nexport var polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n","var pi = Math.PI,\n halfPi = pi / 2;\n\nexport function sinIn(t) {\n return 1 - Math.cos(t * halfPi);\n}\n\nexport function sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nexport function sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n","export function expIn(t) {\n return Math.pow(2, 10 * t - 10);\n}\n\nexport function expOut(t) {\n return 1 - Math.pow(2, -10 * t);\n}\n\nexport function expInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n}\n","export function circleIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n}\n\nexport function circleOut(t) {\n return Math.sqrt(1 - --t * t);\n}\n\nexport function circleInOut(t) {\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n","var b1 = 4 / 11,\n b2 = 6 / 11,\n b3 = 8 / 11,\n b4 = 3 / 4,\n b5 = 9 / 11,\n b6 = 10 / 11,\n b7 = 15 / 16,\n b8 = 21 / 22,\n b9 = 63 / 64,\n b0 = 1 / b1 / b1;\n\nexport function bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nexport function bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nexport function bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n","var overshoot = 1.70158;\n\nexport var backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return t * t * ((s + 1) * t - s);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nexport var backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((s + 1) * t + s) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nexport var backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n","var tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n","function responseBlob(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.blob();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseBlob);\n}\n","function responseArrayBuffer(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseArrayBuffer);\n}\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","export default function(input, init) {\n return new Promise(function(resolve, reject) {\n var image = new Image;\n for (var key in init) image[key] = init[key];\n image.onerror = reject;\n image.onload = function() { resolve(image); };\n image.src = input;\n });\n}\n","function responseJson(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.json();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseJson);\n}\n","import text from \"./text\";\n\nfunction parser(type) {\n return function(input, init) {\n return text(input, init).then(function(text) {\n return (new DOMParser).parseFromString(text, type);\n });\n };\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","export default function(x, y) {\n var nodes;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x, sy += node.y;\n }\n\n for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {\n node = nodes[i], node.x -= sx, node.y -= sy;\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n return force;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function() {\n return (Math.random() - 0.5) * 1e-6;\n}\n","export default function(d) {\n var x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","import constant from \"./constant\";\nimport jiggle from \"./jiggle\";\nimport {quadtree} from \"d3-quadtree\";\n\nfunction x(d) {\n return d.x + d.vx;\n}\n\nfunction y(d) {\n return d.y + d.vy;\n}\n\nexport default function(radius) {\n var nodes,\n radii,\n strength = 1,\n iterations = 1;\n\n if (typeof radius !== \"function\") radius = constant(radius == null ? 1 : +radius);\n\n function force() {\n var i, n = nodes.length,\n tree,\n node,\n xi,\n yi,\n ri,\n ri2;\n\n for (var k = 0; k < iterations; ++k) {\n tree = quadtree(nodes, x, y).visitAfter(prepare);\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n ri = radii[node.index], ri2 = ri * ri;\n xi = node.x + node.vx;\n yi = node.y + node.vy;\n tree.visit(apply);\n }\n }\n\n function apply(quad, x0, y0, x1, y1) {\n var data = quad.data, rj = quad.r, r = ri + rj;\n if (data) {\n if (data.index > node.index) {\n var x = xi - data.x - data.vx,\n y = yi - data.y - data.vy,\n l = x * x + y * y;\n if (l < r * r) {\n if (x === 0) x = jiggle(), l += x * x;\n if (y === 0) y = jiggle(), l += y * y;\n l = (r - (l = Math.sqrt(l))) / l * strength;\n node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));\n node.vy += (y *= l) * r;\n data.vx -= x * (r = 1 - r);\n data.vy -= y * r;\n }\n }\n return;\n }\n return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\n }\n }\n\n function prepare(quad) {\n if (quad.data) return quad.r = radii[quad.data.index];\n for (var i = quad.r = 0; i < 4; ++i) {\n if (quad[i] && quad[i].r > quad.r) {\n quad.r = quad[i].r;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n radii = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : radius;\n };\n\n return force;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","import constant from \"./constant\";\nimport jiggle from \"./jiggle\";\nimport {map} from \"d3-collection\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"missing: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n count,\n bias,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle();\n y = target.y + target.vy - source.y - source.vy || jiggle();\n l = Math.sqrt(x * x + y * y);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l;\n target.vx -= x * (b = bias[i]);\n target.vy -= y * b;\n source.vx += x * (b = 1 - b);\n source.vy += y * b;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = map(nodes, id),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {map} from \"d3-collection\";\nimport {timer} from \"d3-timer\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\");\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.each(function (force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","import constant from \"./constant\";\nimport jiggle from \"./jiggle\";\nimport {quadtree} from \"d3-quadtree\";\nimport {x, y} from \"./simulation\";\n\nexport default function() {\n var nodes,\n node,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate);\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(quad) {\n var strength = 0, q, c, weight = 0, x, y, i;\n\n // For internal nodes, accumulate forces from child quadrants.\n if (quad.length) {\n for (x = y = i = 0; i < 4; ++i) {\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n }\n }\n quad.x = x / weight;\n quad.y = y / weight;\n }\n\n // For leaf nodes, accumulate forces from coincident quadrants.\n else {\n q = quad;\n q.x = q.data.x;\n q.y = q.data.y;\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n quad.value = strength;\n }\n\n function apply(quad, x1, _, x2) {\n if (!quad.value) return true;\n\n var x = quad.x - node.x,\n y = quad.y - node.y,\n w = x2 - x1,\n l = x * x + y * y;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(), l += x * x;\n if (y === 0) y = jiggle(), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * quad.value * alpha / l;\n node.vy += y * quad.value * alpha / l;\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (quad.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (quad.data !== node || quad.next) {\n if (x === 0) x = jiggle(), l += x * x;\n if (y === 0) y = jiggle(), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (quad.data !== node) {\n w = strengths[quad.data.index] * alpha / l;\n node.vx += x * w;\n node.vy += y * w;\n } while (quad = quad.next);\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n","import constant from \"./constant\";\n\nexport default function(radius, x, y) {\n var nodes,\n strength = constant(0.1),\n strengths,\n radiuses;\n\n if (typeof radius !== \"function\") radius = constant(+radius);\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force(alpha) {\n for (var i = 0, n = nodes.length; i < n; ++i) {\n var node = nodes[i],\n dx = node.x - x || 1e-6,\n dy = node.y - y || 1e-6,\n r = Math.sqrt(dx * dx + dy * dy),\n k = (radiuses[i] - r) * strengths[i] * alpha / r;\n node.vx += dx * k;\n node.vy += dy * k;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n radiuses = new Array(n);\n for (i = 0; i < n; ++i) {\n radiuses[i] = +radius(nodes[i], i, nodes);\n strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _, initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : radius;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n return force;\n}\n","import constant from \"./constant\";\n\nexport default function(x) {\n var strength = constant(0.1),\n nodes,\n strengths,\n xz;\n\n if (typeof x !== \"function\") x = constant(x == null ? 0 : +x);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n xz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : x;\n };\n\n return force;\n}\n","import constant from \"./constant\";\n\nexport default function(y) {\n var strength = constant(0.1),\n nodes,\n strengths,\n yz;\n\n if (typeof y !== \"function\") y = constant(y == null ? 0 : +y);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n yz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : y;\n };\n\n return force;\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"],\n minus: \"-\"\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\n\nexport default function() {\n return new Adder;\n}\n\nfunction Adder() {\n this.reset();\n}\n\nAdder.prototype = {\n constructor: Adder,\n reset: function() {\n this.s = // rounded value\n this.t = 0; // exact error\n },\n add: function(y) {\n add(temp, y, this.t);\n add(this, temp.s, this.s);\n if (this.s) this.t += temp.t;\n else this.s = temp.t;\n },\n valueOf: function() {\n return this.s;\n }\n};\n\nvar temp = new Adder;\n\nfunction add(adder, a, b) {\n var x = adder.s = a + b,\n bv = x - a,\n av = x - bv;\n adder.t = (a - av) + (b - bv);\n}\n","export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n","export default function noop() {}\n","function streamGeometry(geometry, stream) {\n if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n streamGeometryType[geometry.type](geometry, stream);\n }\n}\n\nvar streamObjectType = {\n Feature: function(object, stream) {\n streamGeometry(object.geometry, stream);\n },\n FeatureCollection: function(object, stream) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) streamGeometry(features[i].geometry, stream);\n }\n};\n\nvar streamGeometryType = {\n Sphere: function(object, stream) {\n stream.sphere();\n },\n Point: function(object, stream) {\n object = object.coordinates;\n stream.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n },\n LineString: function(object, stream) {\n streamLine(object.coordinates, stream, 0);\n },\n MultiLineString: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamLine(coordinates[i], stream, 0);\n },\n Polygon: function(object, stream) {\n streamPolygon(object.coordinates, stream);\n },\n MultiPolygon: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamPolygon(coordinates[i], stream);\n },\n GeometryCollection: function(object, stream) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) streamGeometry(geometries[i], stream);\n }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n stream.lineStart();\n while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n var i = -1, n = coordinates.length;\n stream.polygonStart();\n while (++i < n) streamLine(coordinates[i], stream, 1);\n stream.polygonEnd();\n}\n\nexport default function(object, stream) {\n if (object && streamObjectType.hasOwnProperty(object.type)) {\n streamObjectType[object.type](object, stream);\n } else {\n streamGeometry(object, stream);\n }\n}\n","import adder from \"./adder.js\";\nimport {atan2, cos, quarterPi, radians, sin, tau} from \"./math.js\";\nimport noop from \"./noop.js\";\nimport stream from \"./stream.js\";\n\nexport var areaRingSum = adder();\n\nvar areaSum = adder(),\n lambda00,\n phi00,\n lambda0,\n cosPhi0,\n sinPhi0;\n\nexport var areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaRingSum.reset();\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n var areaRing = +areaRingSum;\n areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);\n this.lineStart = this.lineEnd = this.point = noop;\n },\n sphere: function() {\n areaSum.add(tau);\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n areaStream.point = areaPoint;\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\n\n // Spherical excess E for a spherical triangle with vertices: south pole,\n // previous point, current point. Uses a formula derived from Cagnoli’s\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n var dLambda = lambda - lambda0,\n sdLambda = dLambda >= 0 ? 1 : -1,\n adLambda = sdLambda * dLambda,\n cosPhi = cos(phi),\n sinPhi = sin(phi),\n k = sinPhi0 * sinPhi,\n u = cosPhi0 * cosPhi + k * cos(adLambda),\n v = k * sdLambda * sin(adLambda);\n areaRingSum.add(atan2(v, u));\n\n // Advance the previous points.\n lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nexport default function(object) {\n areaSum.reset();\n stream(object, areaStream);\n return areaSum * 2;\n}\n","import {asin, atan2, cos, sin, sqrt} from \"./math.js\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n","import adder from \"./adder.js\";\nimport {areaStream, areaRingSum} from \"./area.js\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport {abs, degrees, epsilon, radians} from \"./math.js\";\nimport stream from \"./stream.js\";\n\nvar lambda0, phi0, lambda1, phi1, // bounds\n lambda2, // previous lambda-coordinate\n lambda00, phi00, // first point\n p0, // previous 3D point\n deltaSum = adder(),\n ranges,\n range;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: boundsLineStart,\n lineEnd: boundsLineEnd,\n polygonStart: function() {\n boundsStream.point = boundsRingPoint;\n boundsStream.lineStart = boundsRingStart;\n boundsStream.lineEnd = boundsRingEnd;\n deltaSum.reset();\n areaStream.polygonStart();\n },\n polygonEnd: function() {\n areaStream.polygonEnd();\n boundsStream.point = boundsPoint;\n boundsStream.lineStart = boundsLineStart;\n boundsStream.lineEnd = boundsLineEnd;\n if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n else if (deltaSum > epsilon) phi1 = 90;\n else if (deltaSum < -epsilon) phi0 = -90;\n range[0] = lambda0, range[1] = lambda1;\n },\n sphere: function() {\n lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n }\n};\n\nfunction boundsPoint(lambda, phi) {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n var p = cartesian([lambda * radians, phi * radians]);\n if (p0) {\n var normal = cartesianCross(p0, p),\n equatorial = [normal[1], -normal[0], 0],\n inflection = cartesianCross(equatorial, normal);\n cartesianNormalizeInPlace(inflection);\n inflection = spherical(inflection);\n var delta = lambda - lambda2,\n sign = delta > 0 ? 1 : -1,\n lambdai = inflection[0] * degrees * sign,\n phii,\n antimeridian = abs(delta) > 180;\n if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = inflection[1] * degrees;\n if (phii > phi1) phi1 = phii;\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = -inflection[1] * degrees;\n if (phii < phi0) phi0 = phii;\n } else {\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n }\n if (antimeridian) {\n if (lambda < lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n } else {\n if (lambda1 >= lambda0) {\n if (lambda < lambda0) lambda0 = lambda;\n if (lambda > lambda1) lambda1 = lambda;\n } else {\n if (lambda > lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n }\n }\n } else {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n }\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n range[0] = lambda0, range[1] = lambda1;\n boundsStream.point = boundsPoint;\n p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n if (p0) {\n var delta = lambda - lambda2;\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n } else {\n lambda00 = lambda, phi00 = phi;\n }\n areaStream.point(lambda, phi);\n linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n boundsRingPoint(lambda00, phi00);\n areaStream.lineEnd();\n if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180);\n range[0] = lambda0, range[1] = lambda1;\n p0 = null;\n}\n\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\nfunction angle(lambda0, lambda1) {\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nexport default function(feature) {\n var i, n, a, b, merged, deltaMax, delta;\n\n phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n ranges = [];\n stream(feature, boundsStream);\n\n // First, sort ranges by their minimum longitudes.\n if (n = ranges.length) {\n ranges.sort(rangeCompare);\n\n // Then, merge any ranges that overlap.\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n b = ranges[i];\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n\n // Finally, find the largest gap between the merged ranges.\n // The final bounding box will be the inverse of this gap.\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n b = merged[i];\n if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n }\n }\n\n ranges = range = null;\n\n return lambda0 === Infinity || phi0 === Infinity\n ? [[NaN, NaN], [NaN, NaN]]\n : [[lambda0, phi0], [lambda1, phi1]];\n}\n","import {asin, atan2, cos, degrees, epsilon, epsilon2, radians, sin, sqrt} from \"./math.js\";\nimport noop from \"./noop.js\";\nimport stream from \"./stream.js\";\n\nvar W0, W1,\n X0, Y0, Z0,\n X1, Y1, Z1,\n X2, Y2, Z2,\n lambda00, phi00, // first point\n x0, y0, z0; // previous point\n\nvar centroidStream = {\n sphere: noop,\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n }\n};\n\n// Arithmetic mean of Cartesian vectors.\nfunction centroidPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi);\n centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi));\n}\n\nfunction centroidPointCartesian(x, y, z) {\n ++W0;\n X0 += (x - X0) / W0;\n Y0 += (y - Y0) / W0;\n Z0 += (z - Z0) / W0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidLinePointFirst;\n}\n\nfunction centroidLinePointFirst(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi);\n x0 = cosPhi * cos(lambda);\n y0 = cosPhi * sin(lambda);\n z0 = sin(phi);\n centroidStream.point = centroidLinePoint;\n centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidLinePoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi),\n x = cosPhi * cos(lambda),\n y = cosPhi * sin(lambda),\n z = sin(phi),\n w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n W1 += w;\n X1 += w * (x0 + (x0 = x));\n Y1 += w * (y0 + (y0 = y));\n Z1 += w * (z0 + (z0 = z));\n centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\n// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,\n// J. Applied Mechanics 42, 239 (1975).\nfunction centroidRingStart() {\n centroidStream.point = centroidRingPointFirst;\n}\n\nfunction centroidRingEnd() {\n centroidRingPoint(lambda00, phi00);\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingPointFirst(lambda, phi) {\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n centroidStream.point = centroidRingPoint;\n var cosPhi = cos(phi);\n x0 = cosPhi * cos(lambda);\n y0 = cosPhi * sin(lambda);\n z0 = sin(phi);\n centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidRingPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi),\n x = cosPhi * cos(lambda),\n y = cosPhi * sin(lambda),\n z = sin(phi),\n cx = y0 * z - z0 * y,\n cy = z0 * x - x0 * z,\n cz = x0 * y - y0 * x,\n m = sqrt(cx * cx + cy * cy + cz * cz),\n w = asin(m), // line weight = angle\n v = m && -w / m; // area weight multiplier\n X2 += v * cx;\n Y2 += v * cy;\n Z2 += v * cz;\n W1 += w;\n X1 += w * (x0 + (x0 = x));\n Y1 += w * (y0 + (y0 = y));\n Z1 += w * (z0 + (z0 = z));\n centroidPointCartesian(x0, y0, z0);\n}\n\nexport default function(object) {\n W0 = W1 =\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n stream(object, centroidStream);\n\n var x = X2,\n y = Y2,\n z = Z2,\n m = x * x + y * y + z * z;\n\n // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.\n if (m < epsilon2) {\n x = X1, y = Y1, z = Z1;\n // If the feature has zero length, fall back to arithmetic mean of point vectors.\n if (W1 < epsilon) x = X0, y = Y0, z = Z0;\n m = x * x + y * y + z * z;\n // If the feature still has an undefined ccentroid, then return.\n if (m < epsilon2) return [NaN, NaN];\n }\n\n return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees];\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(a, b) {\n\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n\n return compose;\n}\n","import compose from \"./compose.js\";\nimport {abs, asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math.js\";\n\nfunction rotationIdentity(lambda, phi) {\n return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n","import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport constant from \"./constant.js\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math.js\";\nimport {rotateRadians} from \"./rotation.js\";\n\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(6),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n","import noop from \"../noop.js\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y) {\n line.push([x, y]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n","import {abs, epsilon} from \"./math.js\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n","import pointEqual from \"../pointEqual.js\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n // If the first and last points of a segment are coincident, then treat as a\n // closed ring. TODO if all rings are closed, then the winding order of the\n // exterior ring should be checked.\n if (pointEqual(p0, p1)) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n","import adder from \"./adder.js\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, halfPi, pi, quarterPi, sign, sin, tau} from \"./math.js\";\n\nvar sum = adder();\n\nfunction longitude(point) {\n if (abs(point[0]) <= pi)\n return point[0];\n else\n return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi);\n}\n\nexport default function(polygon, point) {\n var lambda = longitude(point),\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n sum.reset();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = longitude(point0),\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = longitude(point1),\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point’s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1);\n}\n","import clipBuffer from \"./buffer.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {epsilon, halfPi} from \"../math.js\";\nimport polygonContains from \"../polygonContains.js\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n","import clip from \"./index.js\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math.js\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n","import {cartesian, cartesianAddInPlace, cartesianCross, cartesianDot, cartesianScale, spherical} from \"../cartesian.js\";\nimport {circleStream} from \"../circle.js\";\nimport {abs, cos, epsilon, pi, radians, sqrt} from \"../math.js\";\nimport pointEqual from \"../pointEqual.js\";\nimport clip from \"./index.js\";\n\nexport default function(radius) {\n var cr = cos(radius),\n delta = 6 * radians,\n smallRadius = cr > 0,\n notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case\n\n function interpolate(from, to, direction, stream) {\n circleStream(stream, radius, delta, direction, from, to);\n }\n\n function visible(lambda, phi) {\n return cos(lambda) * cos(phi) > cr;\n }\n\n // Takes a line and cuts into visible segments. Return values used for polygon\n // clipping: 0 - there were intersections or the line was empty; 1 - no\n // intersections 2 - there were intersections, and the first and last segments\n // should be rejoined.\n function clipLine(stream) {\n var point0, // previous point\n c0, // code for previous point\n v0, // visibility of previous point\n v00, // visibility of first point\n clean; // no intersections\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(lambda, phi) {\n var point1 = [lambda, phi],\n point2,\n v = visible(lambda, phi),\n c = smallRadius\n ? v ? 0 : code(lambda, phi)\n : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;\n if (!point0 && (v00 = v0 = v)) stream.lineStart();\n // Handle degeneracies.\n // TODO ignore if not clipping polygons.\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {\n point1[0] += epsilon;\n point1[1] += epsilon;\n v = visible(point1[0], point1[1]);\n }\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n // outside going in\n stream.lineStart();\n point2 = intersect(point1, point0);\n stream.point(point2[0], point2[1]);\n } else {\n // inside going out\n point2 = intersect(point0, point1);\n stream.point(point2[0], point2[1]);\n stream.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n // If the codes for two points are different, or are both zero,\n // and there this segment intersects with the small circle.\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n } else {\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n }\n }\n }\n if (v && (!point0 || !pointEqual(point0, point1))) {\n stream.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) stream.lineEnd();\n point0 = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return clean | ((v00 && v0) << 1);\n }\n };\n }\n\n // Intersects the great circle between a and b with the clip circle.\n function intersect(a, b, two) {\n var pa = cartesian(a),\n pb = cartesian(b);\n\n // We have two planes, n1.p = d1 and n2.p = d2.\n // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).\n var n1 = [1, 0, 0], // normal\n n2 = cartesianCross(pa, pb),\n n2n2 = cartesianDot(n2, n2),\n n1n2 = n2[0], // cartesianDot(n1, n2),\n determinant = n2n2 - n1n2 * n1n2;\n\n // Two polar points.\n if (!determinant) return !two && a;\n\n var c1 = cr * n2n2 / determinant,\n c2 = -cr * n1n2 / determinant,\n n1xn2 = cartesianCross(n1, n2),\n A = cartesianScale(n1, c1),\n B = cartesianScale(n2, c2);\n cartesianAddInPlace(A, B);\n\n // Solve |p(t)|^2 = 1.\n var u = n1xn2,\n w = cartesianDot(A, u),\n uu = cartesianDot(u, u),\n t2 = w * w - uu * (cartesianDot(A, A) - 1);\n\n if (t2 < 0) return;\n\n var t = sqrt(t2),\n q = cartesianScale(u, (-w - t) / uu);\n cartesianAddInPlace(q, A);\n q = spherical(q);\n\n if (!two) return q;\n\n // Two intersection points.\n var lambda0 = a[0],\n lambda1 = b[0],\n phi0 = a[1],\n phi1 = b[1],\n z;\n\n if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n\n var delta = lambda1 - lambda0,\n polar = abs(delta - pi) < epsilon,\n meridian = polar || delta < epsilon;\n\n if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n\n // Check that the first point is between a and b.\n if (meridian\n ? polar\n ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1)\n : phi0 <= q[1] && q[1] <= phi1\n : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n var q1 = cartesianScale(u, (-w + t) / uu);\n cartesianAddInPlace(q1, A);\n return [q, spherical(q1)];\n }\n }\n\n // Generates a 4-bit vector representing the location of a point relative to\n // the small circle's bounding box.\n function code(lambda, phi) {\n var r = smallRadius ? radius : pi - radius,\n code = 0;\n if (lambda < -r) code |= 1; // left\n else if (lambda > r) code |= 2; // right\n if (phi < -r) code |= 4; // below\n else if (phi > r) code |= 8; // above\n return code;\n }\n\n return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);\n}\n","import {abs, epsilon} from \"../math.js\";\nimport clipBuffer from \"./buffer.js\";\nimport clipLine from \"./line.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {merge} from \"d3-array\";\n\nvar clipMax = 1e9, clipMin = -clipMax;\n\n// TODO Use d3-polygon’s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nexport default function clipRectangle(x0, y0, x1, y1) {\n\n function visible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n\n function interpolate(from, to, direction, stream) {\n var a = 0, a1 = 0;\n if (from == null\n || (a = corner(from, direction)) !== (a1 = corner(to, direction))\n || comparePoint(from, to) < 0 ^ direction > 0) {\n do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n stream.point(to[0], to[1]);\n }\n }\n\n function corner(p, direction) {\n return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3\n : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1\n : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0\n : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n }\n\n function compareIntersection(a, b) {\n return comparePoint(a.x, b.x);\n }\n\n function comparePoint(a, b) {\n var ca = corner(a, 1),\n cb = corner(b, 1);\n return ca !== cb ? ca - cb\n : ca === 0 ? b[1] - a[1]\n : ca === 1 ? a[0] - b[0]\n : ca === 2 ? a[1] - b[1]\n : b[0] - a[0];\n }\n\n return function(stream) {\n var activeStream = stream,\n bufferStream = clipBuffer(),\n segments,\n polygon,\n ring,\n x__, y__, v__, // first point\n x_, y_, v_, // previous point\n first,\n clean;\n\n var clipStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: polygonStart,\n polygonEnd: polygonEnd\n };\n\n function point(x, y) {\n if (visible(x, y)) activeStream.point(x, y);\n }\n\n function polygonInside() {\n var winding = 0;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\n else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\n }\n }\n\n return winding;\n }\n\n // Buffer geometry within a polygon and then clip it en masse.\n function polygonStart() {\n activeStream = bufferStream, segments = [], polygon = [], clean = true;\n }\n\n function polygonEnd() {\n var startInside = polygonInside(),\n cleanInside = clean && startInside,\n visible = (segments = merge(segments)).length;\n if (cleanInside || visible) {\n stream.polygonStart();\n if (cleanInside) {\n stream.lineStart();\n interpolate(null, null, 1, stream);\n stream.lineEnd();\n }\n if (visible) {\n clipRejoin(segments, compareIntersection, startInside, interpolate, stream);\n }\n stream.polygonEnd();\n }\n activeStream = stream, segments = polygon = ring = null;\n }\n\n function lineStart() {\n clipStream.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n\n // TODO rather than special-case polygons, simply handle them separately.\n // Ideally, coincident intersection points should be jittered to avoid\n // clipping issues.\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferStream.rejoin();\n segments.push(bufferStream.result());\n }\n clipStream.point = point;\n if (v_) activeStream.lineEnd();\n }\n\n function linePoint(x, y) {\n var v = visible(x, y);\n if (polygon) ring.push([x, y]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n }\n } else {\n if (v && v_) activeStream.point(x, y);\n else {\n var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n if (clipLine(a, b, x0, y0, x1, y1)) {\n if (!v_) {\n activeStream.lineStart();\n activeStream.point(a[0], a[1]);\n }\n activeStream.point(b[0], b[1]);\n if (!v) activeStream.lineEnd();\n clean = false;\n } else if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n\n return clipStream;\n };\n}\n","export default function(a, b, x0, y0, x1, y1) {\n var ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n return true;\n}\n","import clipRectangle from \"./rectangle.js\";\n\nexport default function() {\n var x0 = 0,\n y0 = 0,\n x1 = 960,\n y1 = 500,\n cache,\n cacheStream,\n clip;\n\n return clip = {\n stream: function(stream) {\n return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);\n },\n extent: function(_) {\n return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];\n }\n };\n}\n","import adder from \"./adder.js\";\nimport {abs, atan2, cos, radians, sin, sqrt} from \"./math.js\";\nimport noop from \"./noop.js\";\nimport stream from \"./stream.js\";\n\nvar lengthSum = adder(),\n lambda0,\n sinPhi0,\n cosPhi0;\n\nvar lengthStream = {\n sphere: noop,\n point: noop,\n lineStart: lengthLineStart,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop\n};\n\nfunction lengthLineStart() {\n lengthStream.point = lengthPointFirst;\n lengthStream.lineEnd = lengthLineEnd;\n}\n\nfunction lengthLineEnd() {\n lengthStream.point = lengthStream.lineEnd = noop;\n}\n\nfunction lengthPointFirst(lambda, phi) {\n lambda *= radians, phi *= radians;\n lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);\n lengthStream.point = lengthPoint;\n}\n\nfunction lengthPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var sinPhi = sin(phi),\n cosPhi = cos(phi),\n delta = abs(lambda - lambda0),\n cosDelta = cos(delta),\n sinDelta = sin(delta),\n x = cosPhi * sinDelta,\n y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,\n z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;\n lengthSum.add(atan2(sqrt(x * x + y * y), z));\n lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;\n}\n\nexport default function(object) {\n lengthSum.reset();\n stream(object, lengthStream);\n return +lengthSum;\n}\n","import length from \"./length.js\";\n\nvar coordinates = [null, null],\n object = {type: \"LineString\", coordinates: coordinates};\n\nexport default function(a, b) {\n coordinates[0] = a;\n coordinates[1] = b;\n return length(object);\n}\n","import {default as polygonContains} from \"./polygonContains.js\";\nimport {default as distance} from \"./distance.js\";\nimport {epsilon2, radians} from \"./math.js\";\n\nvar containsObjectType = {\n Feature: function(object, point) {\n return containsGeometry(object.geometry, point);\n },\n FeatureCollection: function(object, point) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;\n return false;\n }\n};\n\nvar containsGeometryType = {\n Sphere: function() {\n return true;\n },\n Point: function(object, point) {\n return containsPoint(object.coordinates, point);\n },\n MultiPoint: function(object, point) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) if (containsPoint(coordinates[i], point)) return true;\n return false;\n },\n LineString: function(object, point) {\n return containsLine(object.coordinates, point);\n },\n MultiLineString: function(object, point) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) if (containsLine(coordinates[i], point)) return true;\n return false;\n },\n Polygon: function(object, point) {\n return containsPolygon(object.coordinates, point);\n },\n MultiPolygon: function(object, point) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) if (containsPolygon(coordinates[i], point)) return true;\n return false;\n },\n GeometryCollection: function(object, point) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) if (containsGeometry(geometries[i], point)) return true;\n return false;\n }\n};\n\nfunction containsGeometry(geometry, point) {\n return geometry && containsGeometryType.hasOwnProperty(geometry.type)\n ? containsGeometryType[geometry.type](geometry, point)\n : false;\n}\n\nfunction containsPoint(coordinates, point) {\n return distance(coordinates, point) === 0;\n}\n\nfunction containsLine(coordinates, point) {\n var ao, bo, ab;\n for (var i = 0, n = coordinates.length; i < n; i++) {\n bo = distance(coordinates[i], point);\n if (bo === 0) return true;\n if (i > 0) {\n ab = distance(coordinates[i], coordinates[i - 1]);\n if (\n ab > 0 &&\n ao <= ab &&\n bo <= ab &&\n (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab\n )\n return true;\n }\n ao = bo;\n }\n return false;\n}\n\nfunction containsPolygon(coordinates, point) {\n return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));\n}\n\nfunction ringRadians(ring) {\n return ring = ring.map(pointRadians), ring.pop(), ring;\n}\n\nfunction pointRadians(point) {\n return [point[0] * radians, point[1] * radians];\n}\n\nexport default function(object, point) {\n return (object && containsObjectType.hasOwnProperty(object.type)\n ? containsObjectType[object.type]\n : containsGeometry)(object, point);\n}\n","import {range} from \"d3-array\";\nimport {abs, ceil, epsilon} from \"./math.js\";\n\nfunction graticuleX(y0, y1, dy) {\n var y = range(y0, y1 - epsilon, dy).concat(y1);\n return function(x) { return y.map(function(y) { return [x, y]; }); };\n}\n\nfunction graticuleY(x0, x1, dx) {\n var x = range(x0, x1 - epsilon, dx).concat(x1);\n return function(y) { return x.map(function(x) { return [x, y]; }); };\n}\n\nexport default function graticule() {\n var x1, x0, X1, X0,\n y1, y0, Y1, Y0,\n dx = 10, dy = dx, DX = 90, DY = 360,\n x, y, X, Y,\n precision = 2.5;\n\n function graticule() {\n return {type: \"MultiLineString\", coordinates: lines()};\n }\n\n function lines() {\n return range(ceil(X0 / DX) * DX, X1, DX).map(X)\n .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))\n .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x))\n .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y));\n }\n\n graticule.lines = function() {\n return lines().map(function(coordinates) { return {type: \"LineString\", coordinates: coordinates}; });\n };\n\n graticule.outline = function() {\n return {\n type: \"Polygon\",\n coordinates: [\n X(X0).concat(\n Y(Y1).slice(1),\n X(X1).reverse().slice(1),\n Y(Y0).reverse().slice(1))\n ]\n };\n };\n\n graticule.extent = function(_) {\n if (!arguments.length) return graticule.extentMinor();\n return graticule.extentMajor(_).extentMinor(_);\n };\n\n graticule.extentMajor = function(_) {\n if (!arguments.length) return [[X0, Y0], [X1, Y1]];\n X0 = +_[0][0], X1 = +_[1][0];\n Y0 = +_[0][1], Y1 = +_[1][1];\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n return graticule.precision(precision);\n };\n\n graticule.extentMinor = function(_) {\n if (!arguments.length) return [[x0, y0], [x1, y1]];\n x0 = +_[0][0], x1 = +_[1][0];\n y0 = +_[0][1], y1 = +_[1][1];\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n return graticule.precision(precision);\n };\n\n graticule.step = function(_) {\n if (!arguments.length) return graticule.stepMinor();\n return graticule.stepMajor(_).stepMinor(_);\n };\n\n graticule.stepMajor = function(_) {\n if (!arguments.length) return [DX, DY];\n DX = +_[0], DY = +_[1];\n return graticule;\n };\n\n graticule.stepMinor = function(_) {\n if (!arguments.length) return [dx, dy];\n dx = +_[0], dy = +_[1];\n return graticule;\n };\n\n graticule.precision = function(_) {\n if (!arguments.length) return precision;\n precision = +_;\n x = graticuleX(y0, y1, 90);\n y = graticuleY(x0, x1, precision);\n X = graticuleX(Y0, Y1, 90);\n Y = graticuleY(X0, X1, precision);\n return graticule;\n };\n\n return graticule\n .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]])\n .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]);\n}\n\nexport function graticule10() {\n return graticule()();\n}\n","import {asin, atan2, cos, degrees, haversin, radians, sin, sqrt} from \"./math.js\";\n\nexport default function(a, b) {\n var x0 = a[0] * radians,\n y0 = a[1] * radians,\n x1 = b[0] * radians,\n y1 = b[1] * radians,\n cy0 = cos(y0),\n sy0 = sin(y0),\n cy1 = cos(y1),\n sy1 = sin(y1),\n kx0 = cy0 * cos(x0),\n ky0 = cy0 * sin(x0),\n kx1 = cy1 * cos(x1),\n ky1 = cy1 * sin(x1),\n d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),\n k = sin(d);\n\n var interpolate = d ? function(t) {\n var B = sin(t *= d) / k,\n A = sin(d - t) / k,\n x = A * kx0 + B * kx1,\n y = A * ky0 + B * ky1,\n z = A * sy0 + B * sy1;\n return [\n atan2(y, x) * degrees,\n atan2(z, sqrt(x * x + y * y)) * degrees\n ];\n } : function() {\n return [x0 * degrees, y0 * degrees];\n };\n\n interpolate.distance = d;\n\n return interpolate;\n}\n","import adder from \"../adder.js\";\nimport {abs} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar areaSum = adder(),\n areaRingSum = adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum.reset();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum.reset();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","export default function(x) {\n return x;\n}\n","import noop from \"../noop.js\";\n\nvar x0 = Infinity,\n y0 = x0,\n x1 = -x0,\n y1 = x1;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop,\n result: function() {\n var bounds = [[x0, y0], [x1, y1]];\n x1 = y1 = -(y0 = x0 = Infinity);\n return bounds;\n }\n};\n\nfunction boundsPoint(x, y) {\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n}\n\nexport default boundsStream;\n","import {sqrt} from \"../math.js\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n Y0 = 0,\n Z0 = 0,\n X1 = 0,\n Y1 = 0,\n Z1 = 0,\n X2 = 0,\n Y2 = 0,\n Z2 = 0,\n x00,\n y00,\n x0,\n y0;\n\nvar centroidStream = {\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.point = centroidPoint;\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n },\n result: function() {\n var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n : Z1 ? [X1 / Z1, Y1 / Z1]\n : Z0 ? [X0 / Z0, Y0 / Z0]\n : [NaN, NaN];\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n return centroid;\n }\n};\n\nfunction centroidPoint(x, y) {\n X0 += x;\n Y0 += y;\n ++Z0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n centroidStream.point = centroidPointLine;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n centroidStream.point = centroidPointRing;\n centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n var dx = x - x0,\n dy = y - y0,\n z = sqrt(dx * dx + dy * dy);\n\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n\n z = y0 * x - x0 * y;\n X2 += z * (x0 + x);\n Y2 += z * (y0 + y);\n Z2 += z * 3;\n centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n","import {tau} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nexport default function PathContext(context) {\n this._context = context;\n}\n\nPathContext.prototype = {\n _radius: 4.5,\n pointRadius: function(_) {\n return this._radius = _, this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._context.closePath();\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._context.moveTo(x, y);\n this._point = 1;\n break;\n }\n case 1: {\n this._context.lineTo(x, y);\n break;\n }\n default: {\n this._context.moveTo(x + this._radius, y);\n this._context.arc(x, y, this._radius, 0, tau);\n break;\n }\n }\n },\n result: noop\n};\n","import adder from \"../adder.js\";\nimport {sqrt} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar lengthSum = adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum.reset();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","export default function PathString() {\n this._string = [];\n}\n\nPathString.prototype = {\n _radius: 4.5,\n _circle: circle(4.5),\n pointRadius: function(_) {\n if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n return this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._string.push(\"Z\");\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._string.push(\"M\", x, \",\", y);\n this._point = 1;\n break;\n }\n case 1: {\n this._string.push(\"L\", x, \",\", y);\n break;\n }\n default: {\n if (this._circle == null) this._circle = circle(this._radius);\n this._string.push(\"M\", x, \",\", y, this._circle);\n break;\n }\n }\n },\n result: function() {\n if (this._string.length) {\n var result = this._string.join(\"\");\n this._string = [];\n return result;\n } else {\n return null;\n }\n }\n};\n\nfunction circle(radius) {\n return \"m0,\" + radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\n + \"z\";\n}\n","import identity from \"../identity.js\";\nimport stream from \"../stream.js\";\nimport pathArea from \"./area.js\";\nimport pathBounds from \"./bounds.js\";\nimport pathCentroid from \"./centroid.js\";\nimport PathContext from \"./context.js\";\nimport pathMeasure from \"./measure.js\";\nimport PathString from \"./string.js\";\n\nexport default function(projection, context) {\n var pointRadius = 4.5,\n projectionStream,\n contextStream;\n\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n stream(object, projectionStream(contextStream));\n }\n return contextStream.result();\n }\n\n path.area = function(object) {\n stream(object, projectionStream(pathArea));\n return pathArea.result();\n };\n\n path.measure = function(object) {\n stream(object, projectionStream(pathMeasure));\n return pathMeasure.result();\n };\n\n path.bounds = function(object) {\n stream(object, projectionStream(pathBounds));\n return pathBounds.result();\n };\n\n path.centroid = function(object) {\n stream(object, projectionStream(pathCentroid));\n return pathCentroid.result();\n };\n\n path.projection = function(_) {\n return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection;\n };\n\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return path;\n };\n\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n\n return path.projection(projection).context(context);\n}\n","export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n","import {default as geoStream} from \"../stream.js\";\nimport boundsStream from \"../path/bounds.js\";\n\nfunction fit(projection, fitBounds, object) {\n var clip = projection.clipExtent && projection.clipExtent();\n projection.scale(150).translate([0, 0]);\n if (clip != null) projection.clipExtent(null);\n geoStream(object, projection.stream(boundsStream));\n fitBounds(boundsStream.result());\n if (clip != null) projection.clipExtent(clip);\n return projection;\n}\n\nexport function fitExtent(projection, extent, object) {\n return fit(projection, function(b) {\n var w = extent[1][0] - extent[0][0],\n h = extent[1][1] - extent[0][1],\n k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitSize(projection, size, object) {\n return fitExtent(projection, [[0, 0], size], object);\n}\n\nexport function fitWidth(projection, width, object) {\n return fit(projection, function(b) {\n var w = +width,\n k = w / (b[1][0] - b[0][0]),\n x = (w - k * (b[1][0] + b[0][0])) / 2,\n y = -k * b[0][1];\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitHeight(projection, height, object) {\n return fit(projection, function(b) {\n var h = +height,\n k = h / (b[1][1] - b[0][1]),\n x = -k * b[0][0],\n y = (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n","import {cartesian} from \"../cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math.js\";\nimport {transformer} from \"../transform.js\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n","import clipAntimeridian from \"../clip/antimeridian.js\";\nimport clipCircle from \"../clip/circle.js\";\nimport clipRectangle from \"../clip/rectangle.js\";\nimport compose from \"../compose.js\";\nimport identity from \"../identity.js\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math.js\";\nimport {rotateRadians} from \"../rotation.js\";\nimport {transformer} from \"../transform.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\nimport resample from \"./resample.js\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy) {\n function transform(x, y) {\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k, (dy - y) / k];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, alpha) {\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [ai * x - bi * y + ci, fi - bi * x - ai * y];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),\n transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n","import {degrees, pi, radians} from \"../math.js\";\nimport {projectionMutator} from \"./index.js\";\n\nexport function conicProjection(projectAt) {\n var phi0 = 0,\n phi1 = pi / 3,\n m = projectionMutator(projectAt),\n p = m(phi0, phi1);\n\n p.parallels = function(_) {\n return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees];\n };\n\n return p;\n}\n","import {abs, asin, atan2, cos, epsilon, sign, sin, sqrt} from \"../math.js\";\nimport {conicProjection} from \"./conic.js\";\nimport {cylindricalEqualAreaRaw} from \"./cylindricalEqualArea.js\";\n\nexport function conicEqualAreaRaw(y0, y1) {\n var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2;\n\n // Are the parallels symmetrical around the Equator?\n if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0);\n\n var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;\n\n function project(x, y) {\n var r = sqrt(c - 2 * n * sin(y)) / n;\n return [r * sin(x *= n), r0 - r * cos(x)];\n }\n\n project.invert = function(x, y) {\n var r0y = r0 - y;\n return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEqualAreaRaw)\n .scale(155.424)\n .center([0, 33.6442]);\n}\n","import {asin, cos, sin} from \"../math.js\";\n\nexport function cylindricalEqualAreaRaw(phi0) {\n var cosPhi0 = cos(phi0);\n\n function forward(lambda, phi) {\n return [lambda * cosPhi0, sin(phi) / cosPhi0];\n }\n\n forward.invert = function(x, y) {\n return [x / cosPhi0, asin(y * cosPhi0)];\n };\n\n return forward;\n}\n","import conicEqualArea from \"./conicEqualArea.js\";\n\nexport default function() {\n return conicEqualArea()\n .parallels([29.5, 45.5])\n .scale(1070)\n .translate([480, 250])\n .rotate([96, 0])\n .center([-0.6, 38.7]);\n}\n","import {epsilon} from \"../math.js\";\nimport albers from \"./albers.js\";\nimport conicEqualArea from \"./conicEqualArea.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\n\n// The projections must have mutually exclusive clip regions on the sphere,\n// as this will avoid emitting interleaving lines and polygons.\nfunction multiplex(streams) {\n var n = streams.length;\n return {\n point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },\n sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },\n lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },\n lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },\n polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },\n polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }\n };\n}\n\n// A composite projection for the United States, configured by default for\n// 960×500. The projection also works quite well at 960×600 if you change the\n// scale to 1285 and adjust the translate accordingly. The set of standard\n// parallels for each region comes from USGS, which is published here:\n// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers\nexport default function() {\n var cache,\n cacheStream,\n lower48 = albers(), lower48Point,\n alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338\n hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007\n point, pointStream = {point: function(x, y) { point = [x, y]; }};\n\n function albersUsa(coordinates) {\n var x = coordinates[0], y = coordinates[1];\n return point = null,\n (lower48Point.point(x, y), point)\n || (alaskaPoint.point(x, y), point)\n || (hawaiiPoint.point(x, y), point);\n }\n\n albersUsa.invert = function(coordinates) {\n var k = lower48.scale(),\n t = lower48.translate(),\n x = (coordinates[0] - t[0]) / k,\n y = (coordinates[1] - t[1]) / k;\n return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska\n : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii\n : lower48).invert(coordinates);\n };\n\n albersUsa.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);\n };\n\n albersUsa.precision = function(_) {\n if (!arguments.length) return lower48.precision();\n lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n return reset();\n };\n\n albersUsa.scale = function(_) {\n if (!arguments.length) return lower48.scale();\n lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n return albersUsa.translate(lower48.translate());\n };\n\n albersUsa.translate = function(_) {\n if (!arguments.length) return lower48.translate();\n var k = lower48.scale(), x = +_[0], y = +_[1];\n\n lower48Point = lower48\n .translate(_)\n .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])\n .stream(pointStream);\n\n alaskaPoint = alaska\n .translate([x - 0.307 * k, y + 0.201 * k])\n .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]])\n .stream(pointStream);\n\n hawaiiPoint = hawaii\n .translate([x - 0.205 * k, y + 0.212 * k])\n .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]])\n .stream(pointStream);\n\n return reset();\n };\n\n albersUsa.fitExtent = function(extent, object) {\n return fitExtent(albersUsa, extent, object);\n };\n\n albersUsa.fitSize = function(size, object) {\n return fitSize(albersUsa, size, object);\n };\n\n albersUsa.fitWidth = function(width, object) {\n return fitWidth(albersUsa, width, object);\n };\n\n albersUsa.fitHeight = function(height, object) {\n return fitHeight(albersUsa, height, object);\n };\n\n function reset() {\n cache = cacheStream = null;\n return albersUsa;\n }\n\n return albersUsa.scale(1070);\n}\n","import {asin, atan2, cos, sin, sqrt} from \"../math.js\";\n\nexport function azimuthalRaw(scale) {\n return function(x, y) {\n var cx = cos(x),\n cy = cos(y),\n k = scale(cx * cy);\n return [\n k * cy * sin(x),\n k * sin(y)\n ];\n }\n}\n\nexport function azimuthalInvert(angle) {\n return function(x, y) {\n var z = sqrt(x * x + y * y),\n c = angle(z),\n sc = sin(c),\n cc = cos(c);\n return [\n atan2(x * sc, z * cc),\n asin(z && y * sc / z)\n ];\n }\n}\n","import {asin, sqrt} from \"../math.js\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n return sqrt(2 / (1 + cxcy));\n});\n\nazimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\n return 2 * asin(z / 2);\n});\n\nexport default function() {\n return projection(azimuthalEqualAreaRaw)\n .scale(124.75)\n .clipAngle(180 - 1e-3);\n}\n","import {acos, sin} from \"../math.js\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport var azimuthalEquidistantRaw = azimuthalRaw(function(c) {\n return (c = acos(c)) && c / sin(c);\n});\n\nazimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\n return z;\n});\n\nexport default function() {\n return projection(azimuthalEquidistantRaw)\n .scale(79.4188)\n .clipAngle(180 - 1e-3);\n}\n","import {atan, exp, halfPi, log, pi, tan, tau} from \"../math.js\";\nimport rotation from \"../rotation.js\";\nimport projection from \"./index.js\";\n\nexport function mercatorRaw(lambda, phi) {\n return [lambda, log(tan((halfPi + phi) / 2))];\n}\n\nmercatorRaw.invert = function(x, y) {\n return [x, 2 * atan(exp(y)) - halfPi];\n};\n\nexport default function() {\n return mercatorProjection(mercatorRaw)\n .scale(961 / tau);\n}\n\nexport function mercatorProjection(project) {\n var m = projection(project),\n center = m.center,\n scale = m.scale,\n translate = m.translate,\n clipExtent = m.clipExtent,\n x0 = null, y0, x1, y1; // clip extent\n\n m.scale = function(_) {\n return arguments.length ? (scale(_), reclip()) : scale();\n };\n\n m.translate = function(_) {\n return arguments.length ? (translate(_), reclip()) : translate();\n };\n\n m.center = function(_) {\n return arguments.length ? (center(_), reclip()) : center();\n };\n\n m.clipExtent = function(_) {\n return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n function reclip() {\n var k = pi * scale(),\n t = m(rotation(m.rotate()).invert([0, 0]));\n return clipExtent(x0 == null\n ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw\n ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]\n : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\n }\n\n return reclip();\n}\n","import {abs, atan, atan2, cos, epsilon, halfPi, log, pow, sign, sin, sqrt, tan} from \"../math.js\";\nimport {conicProjection} from \"./conic.js\";\nimport {mercatorRaw} from \"./mercator.js\";\n\nfunction tany(y) {\n return tan((halfPi + y) / 2);\n}\n\nexport function conicConformalRaw(y0, y1) {\n var cy0 = cos(y0),\n n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)),\n f = cy0 * pow(tany(y0), n) / n;\n\n if (!n) return mercatorRaw;\n\n function project(x, y) {\n if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; }\n else { if (y > halfPi - epsilon) y = halfPi - epsilon; }\n var r = f / pow(tany(y), n);\n return [r * sin(n * x), f - r * cos(n * x)];\n }\n\n project.invert = function(x, y) {\n var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);\n return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicConformalRaw)\n .scale(109.5)\n .parallels([30, 30]);\n}\n","import projection from \"./index.js\";\n\nexport function equirectangularRaw(lambda, phi) {\n return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nexport default function() {\n return projection(equirectangularRaw)\n .scale(152.63);\n}\n","import {abs, atan2, cos, epsilon, sign, sin, sqrt} from \"../math.js\";\nimport {conicProjection} from \"./conic.js\";\nimport {equirectangularRaw} from \"./equirectangular.js\";\n\nexport function conicEquidistantRaw(y0, y1) {\n var cy0 = cos(y0),\n n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0),\n g = cy0 / n + y0;\n\n if (abs(n) < epsilon) return equirectangularRaw;\n\n function project(x, y) {\n var gy = g - y, nx = n * x;\n return [gy * sin(nx), g - gy * cos(nx)];\n }\n\n project.invert = function(x, y) {\n var gy = g - y;\n return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEquidistantRaw)\n .scale(131.154)\n .center([0, 13.9389]);\n}\n","import projection from \"./index.js\";\nimport {abs, asin, cos, epsilon2, sin, sqrt} from \"../math.js\";\n\nvar A1 = 1.340264,\n A2 = -0.081106,\n A3 = 0.000893,\n A4 = 0.003796,\n M = sqrt(3) / 2,\n iterations = 12;\n\nexport function equalEarthRaw(lambda, phi) {\n var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2;\n return [\n lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n ];\n}\n\nequalEarthRaw.invert = function(x, y) {\n var l = y, l2 = l * l, l6 = l2 * l2 * l2;\n for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n if (abs(delta) < epsilon2) break;\n }\n return [\n M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l),\n asin(sin(l) / M)\n ];\n};\n\nexport default function() {\n return projection(equalEarthRaw)\n .scale(177.158);\n}\n","import {atan, cos, sin} from \"../math.js\";\nimport {azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport function gnomonicRaw(x, y) {\n var cy = cos(y), k = cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\ngnomonicRaw.invert = azimuthalInvert(atan);\n\nexport default function() {\n return projection(gnomonicRaw)\n .scale(144.049)\n .clipAngle(60);\n}\n","import clipRectangle from \"../clip/rectangle.js\";\nimport identity from \"../identity.js\";\nimport {transformer} from \"../transform.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\n\nfunction scaleTranslate(kx, ky, tx, ty) {\n return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({\n point: function(x, y) {\n this.stream.point(x * kx + tx, y * ky + ty);\n }\n });\n}\n\nexport default function() {\n var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect\n x0 = null, y0, x1, y1, // clip extent\n postclip = identity,\n cache,\n cacheStream,\n projection;\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return projection = {\n stream: function(stream) {\n return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\n },\n postclip: function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n },\n clipExtent: function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n },\n scale: function(_) {\n return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;\n },\n translate: function(_) {\n return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];\n },\n reflectX: function(_) {\n return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;\n },\n reflectY: function(_) {\n return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;\n },\n fitExtent: function(extent, object) {\n return fitExtent(projection, extent, object);\n },\n fitSize: function(size, object) {\n return fitSize(projection, size, object);\n },\n fitWidth: function(width, object) {\n return fitWidth(projection, width, object);\n },\n fitHeight: function(height, object) {\n return fitHeight(projection, height, object);\n }\n };\n}\n","import projection from \"./index.js\";\nimport {abs, epsilon} from \"../math.js\";\n\nexport function naturalEarth1Raw(lambda, phi) {\n var phi2 = phi * phi, phi4 = phi2 * phi2;\n return [\n lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),\n phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))\n ];\n}\n\nnaturalEarth1Raw.invert = function(x, y) {\n var phi = y, i = 25, delta;\n do {\n var phi2 = phi * phi, phi4 = phi2 * phi2;\n phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /\n (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));\n } while (abs(delta) > epsilon && --i > 0);\n return [\n x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),\n phi\n ];\n};\n\nexport default function() {\n return projection(naturalEarth1Raw)\n .scale(175.295);\n}\n","import {asin, cos, epsilon, sin} from \"../math.js\";\nimport {azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport function orthographicRaw(x, y) {\n return [cos(y) * sin(x), sin(y)];\n}\n\northographicRaw.invert = azimuthalInvert(asin);\n\nexport default function() {\n return projection(orthographicRaw)\n .scale(249.5)\n .clipAngle(90 + epsilon);\n}\n","import {atan, cos, sin} from \"../math.js\";\nimport {azimuthalInvert} from \"./azimuthal.js\";\nimport projection from \"./index.js\";\n\nexport function stereographicRaw(x, y) {\n var cy = cos(y), k = 1 + cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\nstereographicRaw.invert = azimuthalInvert(function(z) {\n return 2 * atan(z);\n});\n\nexport default function() {\n return projection(stereographicRaw)\n .scale(250)\n .clipAngle(142);\n}\n","import {atan, exp, halfPi, log, tan} from \"../math.js\";\nimport {mercatorProjection} from \"./mercator.js\";\n\nexport function transverseMercatorRaw(lambda, phi) {\n return [log(tan((halfPi + phi) / 2)), -lambda];\n}\n\ntransverseMercatorRaw.invert = function(x, y) {\n return [-y, 2 * atan(exp(x)) - halfPi];\n};\n\nexport default function() {\n var m = mercatorProjection(transverseMercatorRaw),\n center = m.center,\n rotate = m.rotate;\n\n m.center = function(_) {\n return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n };\n\n m.rotate = function(_) {\n return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);\n };\n\n return rotate([0, 0, 90])\n .scale(159.155);\n}\n","function defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\nfunction meanX(children) {\n return children.reduce(meanXReduce, 0) / children.length;\n}\n\nfunction meanXReduce(x, c) {\n return x + c.x;\n}\n\nfunction maxY(children) {\n return 1 + children.reduce(maxYReduce, 0);\n}\n\nfunction maxYReduce(y, c) {\n return Math.max(y, c.y);\n}\n\nfunction leafLeft(node) {\n var children;\n while (children = node.children) node = children[0];\n return node;\n}\n\nfunction leafRight(node) {\n var children;\n while (children = node.children) node = children[children.length - 1];\n return node;\n}\n\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = false;\n\n function cluster(root) {\n var previousNode,\n x = 0;\n\n // First walk, computing the initial x & y values.\n root.eachAfter(function(node) {\n var children = node.children;\n if (children) {\n node.x = meanX(children);\n node.y = maxY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n\n var left = leafLeft(root),\n right = leafRight(root),\n x0 = left.x - separation(left, right) / 2,\n x1 = right.x + separation(right, left) / 2;\n\n // Second walk, normalizing x & y to the desired size.\n return root.eachAfter(nodeSize ? function(node) {\n node.x = (node.x - root.x) * dx;\n node.y = (root.y - node.y) * dy;\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * dx;\n node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n });\n }\n\n cluster.separation = function(x) {\n return arguments.length ? (separation = x, cluster) : separation;\n };\n\n cluster.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);\n };\n\n cluster.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);\n };\n\n return cluster;\n}\n","function count(node) {\n var sum = 0,\n children = node.children,\n i = children && children.length;\n if (!i) sum = 1;\n else while (--i >= 0) sum += children[i].value;\n node.value = sum;\n}\n\nexport default function() {\n return this.eachAfter(count);\n}\n","import node_count from \"./count.js\";\nimport node_each from \"./each.js\";\nimport node_eachBefore from \"./eachBefore.js\";\nimport node_eachAfter from \"./eachAfter.js\";\nimport node_sum from \"./sum.js\";\nimport node_sort from \"./sort.js\";\nimport node_path from \"./path.js\";\nimport node_ancestors from \"./ancestors.js\";\nimport node_descendants from \"./descendants.js\";\nimport node_leaves from \"./leaves.js\";\nimport node_links from \"./links.js\";\n\nexport default function hierarchy(data, children) {\n var root = new Node(data),\n valued = +data.value && (root.value = data.value),\n node,\n nodes = [root],\n child,\n childs,\n i,\n n;\n\n if (children == null) children = defaultChildren;\n\n while (node = nodes.pop()) {\n if (valued) node.value = +node.data.value;\n if ((childs = children(node.data)) && (n = childs.length)) {\n node.children = new Array(n);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new Node(childs[i]));\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n\n return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n return hierarchy(this).eachBefore(copyData);\n}\n\nfunction defaultChildren(d) {\n return d.children;\n}\n\nfunction copyData(node) {\n node.data = node.data.data;\n}\n\nexport function computeHeight(node) {\n var height = 0;\n do node.height = height;\n while ((node = node.parent) && (node.height < ++height));\n}\n\nexport function Node(data) {\n this.data = data;\n this.depth =\n this.height = 0;\n this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n constructor: Node,\n count: node_count,\n each: node_each,\n eachAfter: node_eachAfter,\n eachBefore: node_eachBefore,\n sum: node_sum,\n sort: node_sort,\n path: node_path,\n ancestors: node_ancestors,\n descendants: node_descendants,\n leaves: node_leaves,\n links: node_links,\n copy: node_copy\n};\n","export default function(callback) {\n var node = this, current, next = [node], children, i, n;\n do {\n current = next.reverse(), next = [];\n while (node = current.pop()) {\n callback(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n next.push(children[i]);\n }\n }\n } while (next.length);\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], next = [], children, i, n;\n while (node = nodes.pop()) {\n next.push(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n nodes.push(children[i]);\n }\n }\n while (node = next.pop()) {\n callback(node);\n }\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], children, i;\n while (node = nodes.pop()) {\n callback(node), children = node.children;\n if (children) for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n return this;\n}\n","export default function(value) {\n return this.eachAfter(function(node) {\n var sum = +value(node.data) || 0,\n children = node.children,\n i = children && children.length;\n while (--i >= 0) sum += children[i].value;\n node.value = sum;\n });\n}\n","export default function(compare) {\n return this.eachBefore(function(node) {\n if (node.children) {\n node.children.sort(compare);\n }\n });\n}\n","export default function(end) {\n var start = this,\n ancestor = leastCommonAncestor(start, end),\n nodes = [start];\n while (start !== ancestor) {\n start = start.parent;\n nodes.push(start);\n }\n var k = nodes.length;\n while (end !== ancestor) {\n nodes.splice(k, 0, end);\n end = end.parent;\n }\n return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = a.ancestors(),\n bNodes = b.ancestors(),\n c = null;\n a = aNodes.pop();\n b = bNodes.pop();\n while (a === b) {\n c = a;\n a = aNodes.pop();\n b = bNodes.pop();\n }\n return c;\n}\n","export default function() {\n var node = this, nodes = [node];\n while (node = node.parent) {\n nodes.push(node);\n }\n return nodes;\n}\n","export default function() {\n var nodes = [];\n this.each(function(node) {\n nodes.push(node);\n });\n return nodes;\n}\n","export default function() {\n var leaves = [];\n this.eachBefore(function(node) {\n if (!node.children) {\n leaves.push(node);\n }\n });\n return leaves;\n}\n","export default function() {\n var root = this, links = [];\n root.each(function(node) {\n if (node !== root) { // Don’t include the root’s parent, if any.\n links.push({source: node.parent, target: node});\n }\n });\n return links;\n}\n","export var slice = Array.prototype.slice;\n\nexport function shuffle(array) {\n var m = array.length,\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m];\n array[m] = array[i];\n array[i] = t;\n }\n\n return array;\n}\n","import {shuffle, slice} from \"../array.js\";\n\nexport default function(circles) {\n var i = 0, n = (circles = shuffle(slice.call(circles))).length, B = [], p, e;\n\n while (i < n) {\n p = circles[i];\n if (e && enclosesWeak(e, p)) ++i;\n else e = encloseBasis(B = extendBasis(B, p)), i = 0;\n }\n\n return e;\n}\n\nfunction extendBasis(B, p) {\n var i, j;\n\n if (enclosesWeakAll(p, B)) return [p];\n\n // If we get here then B must have at least one element.\n for (i = 0; i < B.length; ++i) {\n if (enclosesNot(p, B[i])\n && enclosesWeakAll(encloseBasis2(B[i], p), B)) {\n return [B[i], p];\n }\n }\n\n // If we get here then B must have at least two elements.\n for (i = 0; i < B.length - 1; ++i) {\n for (j = i + 1; j < B.length; ++j) {\n if (enclosesNot(encloseBasis2(B[i], B[j]), p)\n && enclosesNot(encloseBasis2(B[i], p), B[j])\n && enclosesNot(encloseBasis2(B[j], p), B[i])\n && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {\n return [B[i], B[j], p];\n }\n }\n }\n\n // If we get here then something is very wrong.\n throw new Error;\n}\n\nfunction enclosesNot(a, b) {\n var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;\n return dr < 0 || dr * dr < dx * dx + dy * dy;\n}\n\nfunction enclosesWeak(a, b) {\n var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;\n return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\n\nfunction enclosesWeakAll(a, B) {\n for (var i = 0; i < B.length; ++i) {\n if (!enclosesWeak(a, B[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction encloseBasis(B) {\n switch (B.length) {\n case 1: return encloseBasis1(B[0]);\n case 2: return encloseBasis2(B[0], B[1]);\n case 3: return encloseBasis3(B[0], B[1], B[2]);\n }\n}\n\nfunction encloseBasis1(a) {\n return {\n x: a.x,\n y: a.y,\n r: a.r\n };\n}\n\nfunction encloseBasis2(a, b) {\n var x1 = a.x, y1 = a.y, r1 = a.r,\n x2 = b.x, y2 = b.y, r2 = b.r,\n x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,\n l = Math.sqrt(x21 * x21 + y21 * y21);\n return {\n x: (x1 + x2 + x21 / l * r21) / 2,\n y: (y1 + y2 + y21 / l * r21) / 2,\n r: (l + r1 + r2) / 2\n };\n}\n\nfunction encloseBasis3(a, b, c) {\n var x1 = a.x, y1 = a.y, r1 = a.r,\n x2 = b.x, y2 = b.y, r2 = b.r,\n x3 = c.x, y3 = c.y, r3 = c.r,\n a2 = x1 - x2,\n a3 = x1 - x3,\n b2 = y1 - y2,\n b3 = y1 - y3,\n c2 = r2 - r1,\n c3 = r3 - r1,\n d1 = x1 * x1 + y1 * y1 - r1 * r1,\n d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,\n d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,\n ab = a3 * b2 - a2 * b3,\n xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,\n xb = (b3 * c2 - b2 * c3) / ab,\n ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,\n yb = (a2 * c3 - a3 * c2) / ab,\n A = xb * xb + yb * yb - 1,\n B = 2 * (r1 + xa * xb + ya * yb),\n C = xa * xa + ya * ya - r1 * r1,\n r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);\n return {\n x: x1 + xa + xb * r,\n y: y1 + ya + yb * r,\n r: r\n };\n}\n","import enclose from \"./enclose.js\";\n\nfunction place(b, a, c) {\n var dx = b.x - a.x, x, a2,\n dy = b.y - a.y, y, b2,\n d2 = dx * dx + dy * dy;\n if (d2) {\n a2 = a.r + c.r, a2 *= a2;\n b2 = b.r + c.r, b2 *= b2;\n if (a2 > b2) {\n x = (d2 + b2 - a2) / (2 * d2);\n y = Math.sqrt(Math.max(0, b2 / d2 - x * x));\n c.x = b.x - x * dx - y * dy;\n c.y = b.y - x * dy + y * dx;\n } else {\n x = (d2 + a2 - b2) / (2 * d2);\n y = Math.sqrt(Math.max(0, a2 / d2 - x * x));\n c.x = a.x + x * dx - y * dy;\n c.y = a.y + x * dy + y * dx;\n }\n } else {\n c.x = a.x + c.r;\n c.y = a.y;\n }\n}\n\nfunction intersects(a, b) {\n var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;\n return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\n\nfunction score(node) {\n var a = node._,\n b = node.next._,\n ab = a.r + b.r,\n dx = (a.x * b.r + b.x * a.r) / ab,\n dy = (a.y * b.r + b.y * a.r) / ab;\n return dx * dx + dy * dy;\n}\n\nfunction Node(circle) {\n this._ = circle;\n this.next = null;\n this.previous = null;\n}\n\nexport function packEnclose(circles) {\n if (!(n = circles.length)) return 0;\n\n var a, b, c, n, aa, ca, i, j, k, sj, sk;\n\n // Place the first circle.\n a = circles[0], a.x = 0, a.y = 0;\n if (!(n > 1)) return a.r;\n\n // Place the second circle.\n b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;\n if (!(n > 2)) return a.r + b.r;\n\n // Place the third circle.\n place(b, a, c = circles[2]);\n\n // Initialize the front-chain using the first three circles a, b and c.\n a = new Node(a), b = new Node(b), c = new Node(c);\n a.next = c.previous = b;\n b.next = a.previous = c;\n c.next = b.previous = a;\n\n // Attempt to place each remaining circle…\n pack: for (i = 3; i < n; ++i) {\n place(a._, b._, c = circles[i]), c = new Node(c);\n\n // Find the closest intersecting circle on the front-chain, if any.\n // “Closeness” is determined by linear distance along the front-chain.\n // “Ahead” or “behind” is likewise determined by linear distance.\n j = b.next, k = a.previous, sj = b._.r, sk = a._.r;\n do {\n if (sj <= sk) {\n if (intersects(j._, c._)) {\n b = j, a.next = b, b.previous = a, --i;\n continue pack;\n }\n sj += j._.r, j = j.next;\n } else {\n if (intersects(k._, c._)) {\n a = k, a.next = b, b.previous = a, --i;\n continue pack;\n }\n sk += k._.r, k = k.previous;\n }\n } while (j !== k.next);\n\n // Success! Insert the new circle c between a and b.\n c.previous = a, c.next = b, a.next = b.previous = b = c;\n\n // Compute the new closest circle pair to the centroid.\n aa = score(a);\n while ((c = c.next) !== b) {\n if ((ca = score(c)) < aa) {\n a = c, aa = ca;\n }\n }\n b = a.next;\n }\n\n // Compute the enclosing circle of the front chain.\n a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);\n\n // Translate the circles to put the enclosing circle around the origin.\n for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;\n\n return c.r;\n}\n\nexport default function(circles) {\n packEnclose(circles);\n return circles;\n}\n","export function optional(f) {\n return f == null ? null : required(f);\n}\n\nexport function required(f) {\n if (typeof f !== \"function\") throw new Error;\n return f;\n}\n","export function constantZero() {\n return 0;\n}\n\nexport default function(x) {\n return function() {\n return x;\n };\n}\n","import {packEnclose} from \"./siblings.js\";\nimport {optional} from \"../accessors.js\";\nimport constant, {constantZero} from \"../constant.js\";\n\nfunction defaultRadius(d) {\n return Math.sqrt(d.value);\n}\n\nexport default function() {\n var radius = null,\n dx = 1,\n dy = 1,\n padding = constantZero;\n\n function pack(root) {\n root.x = dx / 2, root.y = dy / 2;\n if (radius) {\n root.eachBefore(radiusLeaf(radius))\n .eachAfter(packChildren(padding, 0.5))\n .eachBefore(translateChild(1));\n } else {\n root.eachBefore(radiusLeaf(defaultRadius))\n .eachAfter(packChildren(constantZero, 1))\n .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))\n .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n }\n return root;\n }\n\n pack.radius = function(x) {\n return arguments.length ? (radius = optional(x), pack) : radius;\n };\n\n pack.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];\n };\n\n pack.padding = function(x) {\n return arguments.length ? (padding = typeof x === \"function\" ? x : constant(+x), pack) : padding;\n };\n\n return pack;\n}\n\nfunction radiusLeaf(radius) {\n return function(node) {\n if (!node.children) {\n node.r = Math.max(0, +radius(node) || 0);\n }\n };\n}\n\nfunction packChildren(padding, k) {\n return function(node) {\n if (children = node.children) {\n var children,\n i,\n n = children.length,\n r = padding(node) * k || 0,\n e;\n\n if (r) for (i = 0; i < n; ++i) children[i].r += r;\n e = packEnclose(children);\n if (r) for (i = 0; i < n; ++i) children[i].r -= r;\n node.r = e + r;\n }\n };\n}\n\nfunction translateChild(k) {\n return function(node) {\n var parent = node.parent;\n node.r *= k;\n if (parent) {\n node.x = parent.x + k * node.x;\n node.y = parent.y + k * node.y;\n }\n };\n}\n","export default function(node) {\n node.x0 = Math.round(node.x0);\n node.y0 = Math.round(node.y0);\n node.x1 = Math.round(node.x1);\n node.y1 = Math.round(node.y1);\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (x1 - x0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.y0 = y0, node.y1 = y1;\n node.x0 = x0, node.x1 = x0 += node.value * k;\n }\n}\n","import roundNode from \"./treemap/round.js\";\nimport treemapDice from \"./treemap/dice.js\";\n\nexport default function() {\n var dx = 1,\n dy = 1,\n padding = 0,\n round = false;\n\n function partition(root) {\n var n = root.height + 1;\n root.x0 =\n root.y0 = padding;\n root.x1 = dx;\n root.y1 = dy / n;\n root.eachBefore(positionNode(dy, n));\n if (round) root.eachBefore(roundNode);\n return root;\n }\n\n function positionNode(dy, n) {\n return function(node) {\n if (node.children) {\n treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);\n }\n var x0 = node.x0,\n y0 = node.y0,\n x1 = node.x1 - padding,\n y1 = node.y1 - padding;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n node.x0 = x0;\n node.y0 = y0;\n node.x1 = x1;\n node.y1 = y1;\n };\n }\n\n partition.round = function(x) {\n return arguments.length ? (round = !!x, partition) : round;\n };\n\n partition.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];\n };\n\n partition.padding = function(x) {\n return arguments.length ? (padding = +x, partition) : padding;\n };\n\n return partition;\n}\n","import {required} from \"./accessors.js\";\nimport {Node, computeHeight} from \"./hierarchy/index.js\";\n\nvar keyPrefix = \"$\", // Protect against keys like “__proto__”.\n preroot = {depth: -1},\n ambiguous = {};\n\nfunction defaultId(d) {\n return d.id;\n}\n\nfunction defaultParentId(d) {\n return d.parentId;\n}\n\nexport default function() {\n var id = defaultId,\n parentId = defaultParentId;\n\n function stratify(data) {\n var d,\n i,\n n = data.length,\n root,\n parent,\n node,\n nodes = new Array(n),\n nodeId,\n nodeKey,\n nodeByKey = {};\n\n for (i = 0; i < n; ++i) {\n d = data[i], node = nodes[i] = new Node(d);\n if ((nodeId = id(d, i, data)) != null && (nodeId += \"\")) {\n nodeKey = keyPrefix + (node.id = nodeId);\n nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;\n }\n }\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], nodeId = parentId(data[i], i, data);\n if (nodeId == null || !(nodeId += \"\")) {\n if (root) throw new Error(\"multiple roots\");\n root = node;\n } else {\n parent = nodeByKey[keyPrefix + nodeId];\n if (!parent) throw new Error(\"missing: \" + nodeId);\n if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n if (parent.children) parent.children.push(node);\n else parent.children = [node];\n node.parent = parent;\n }\n }\n\n if (!root) throw new Error(\"no root\");\n root.parent = preroot;\n root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);\n root.parent = null;\n if (n > 0) throw new Error(\"cycle\");\n\n return root;\n }\n\n stratify.id = function(x) {\n return arguments.length ? (id = required(x), stratify) : id;\n };\n\n stratify.parentId = function(x) {\n return arguments.length ? (parentId = required(x), stratify) : parentId;\n };\n\n return stratify;\n}\n","import {Node} from \"./hierarchy/index.js\";\n\nfunction defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\n// function radialSeparation(a, b) {\n// return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\nfunction nextLeft(v) {\n var children = v.children;\n return children ? children[0] : v.t;\n}\n\n// This function works analogously to nextLeft.\nfunction nextRight(v) {\n var children = v.children;\n return children ? children[children.length - 1] : v.t;\n}\n\n// Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\nfunction moveSubtree(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n}\n\n// All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\nfunction executeShifts(v) {\n var shift = 0,\n change = 0,\n children = v.children,\n i = children.length,\n w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n}\n\n// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\nfunction nextAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n}\n\nfunction TreeNode(node, i) {\n this._ = node;\n this.parent = null;\n this.children = null;\n this.A = null; // default ancestor\n this.a = this; // ancestor\n this.z = 0; // prelim\n this.m = 0; // mod\n this.c = 0; // change\n this.s = 0; // shift\n this.t = null; // thread\n this.i = i; // number\n}\n\nTreeNode.prototype = Object.create(Node.prototype);\n\nfunction treeRoot(root) {\n var tree = new TreeNode(root, 0),\n node,\n nodes = [tree],\n child,\n children,\n i,\n n;\n\n while (node = nodes.pop()) {\n if (children = node._.children) {\n node.children = new Array(n = children.length);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n child.parent = node;\n }\n }\n }\n\n (tree.parent = new TreeNode(null, 0)).children = [tree];\n return tree;\n}\n\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = null;\n\n function tree(root) {\n var t = treeRoot(root);\n\n // Compute the layout using Buchheim et al.’s algorithm.\n t.eachAfter(firstWalk), t.parent.m = -t.z;\n t.eachBefore(secondWalk);\n\n // If a fixed node size is specified, scale x and y.\n if (nodeSize) root.eachBefore(sizeNode);\n\n // If a fixed tree size is specified, scale x and y based on the extent.\n // Compute the left-most, right-most, and depth-most nodes for extents.\n else {\n var left = root,\n right = root,\n bottom = root;\n root.eachBefore(function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var s = left === right ? 1 : separation(left, right) / 2,\n tx = s - left.x,\n kx = dx / (right.x + s + tx),\n ky = dy / (bottom.depth || 1);\n root.eachBefore(function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n\n return root;\n }\n\n // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n // applied recursively to the children of v, as well as the function\n // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n // node v is placed to the midpoint of its outermost children.\n function firstWalk(v) {\n var children = v.children,\n siblings = v.parent.children,\n w = v.i ? siblings[v.i - 1] : null;\n if (children) {\n executeShifts(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n\n // Computes all real x-coordinates by summing up the modifiers recursively.\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n\n // The core of the algorithm. Here, a new subtree is combined with the\n // previous subtrees. Threads are used to traverse the inside and outside\n // contours of the left and right subtree up to the highest common level. The\n // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n // superscript o means outside and i means inside, the subscript - means left\n // subtree and + means right subtree. For summing up the modifiers along the\n // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n // nodes of the inside contours conflict, we compute the left one of the\n // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n // Finally, we add a new thread (if necessary).\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v,\n vop = v,\n vim = w,\n vom = vip.parent.children[0],\n sip = vip.m,\n sop = vop.m,\n sim = vim.m,\n som = vom.m,\n shift;\n while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n vom = nextLeft(vom);\n vop = nextRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !nextRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !nextLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n\n function sizeNode(node) {\n node.x *= dx;\n node.y = node.depth * dy;\n }\n\n tree.separation = function(x) {\n return arguments.length ? (separation = x, tree) : separation;\n };\n\n tree.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);\n };\n\n tree.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);\n };\n\n return tree;\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (y1 - y0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.x0 = x0, node.x1 = x1;\n node.y0 = y0, node.y1 = y0 += node.value * k;\n }\n}\n","import treemapDice from \"./dice.js\";\nimport treemapSlice from \"./slice.js\";\n\nexport var phi = (1 + Math.sqrt(5)) / 2;\n\nexport function squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n var rows = [],\n nodes = parent.children,\n row,\n nodeValue,\n i0 = 0,\n i1 = 0,\n n = nodes.length,\n dx, dy,\n value = parent.value,\n sumValue,\n minValue,\n maxValue,\n newRatio,\n minRatio,\n alpha,\n beta;\n\n while (i0 < n) {\n dx = x1 - x0, dy = y1 - y0;\n\n // Find the next non-empty node.\n do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\n minValue = maxValue = sumValue;\n alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n beta = sumValue * sumValue * alpha;\n minRatio = Math.max(maxValue / beta, beta / minValue);\n\n // Keep adding nodes while the aspect ratio maintains or improves.\n for (; i1 < n; ++i1) {\n sumValue += nodeValue = nodes[i1].value;\n if (nodeValue < minValue) minValue = nodeValue;\n if (nodeValue > maxValue) maxValue = nodeValue;\n beta = sumValue * sumValue * alpha;\n newRatio = Math.max(maxValue / beta, beta / minValue);\n if (newRatio > minRatio) { sumValue -= nodeValue; break; }\n minRatio = newRatio;\n }\n\n // Position and record the row orientation.\n rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});\n if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n value -= sumValue, i0 = i1;\n }\n\n return rows;\n}\n\nexport default (function custom(ratio) {\n\n function squarify(parent, x0, y0, x1, y1) {\n squarifyRatio(ratio, parent, x0, y0, x1, y1);\n }\n\n squarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return squarify;\n})(phi);\n","import roundNode from \"./round.js\";\nimport squarify from \"./squarify.js\";\nimport {required} from \"../accessors.js\";\nimport constant, {constantZero} from \"../constant.js\";\n\nexport default function() {\n var tile = squarify,\n round = false,\n dx = 1,\n dy = 1,\n paddingStack = [0],\n paddingInner = constantZero,\n paddingTop = constantZero,\n paddingRight = constantZero,\n paddingBottom = constantZero,\n paddingLeft = constantZero;\n\n function treemap(root) {\n root.x0 =\n root.y0 = 0;\n root.x1 = dx;\n root.y1 = dy;\n root.eachBefore(positionNode);\n paddingStack = [0];\n if (round) root.eachBefore(roundNode);\n return root;\n }\n\n function positionNode(node) {\n var p = paddingStack[node.depth],\n x0 = node.x0 + p,\n y0 = node.y0 + p,\n x1 = node.x1 - p,\n y1 = node.y1 - p;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n node.x0 = x0;\n node.y0 = y0;\n node.x1 = x1;\n node.y1 = y1;\n if (node.children) {\n p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n x0 += paddingLeft(node) - p;\n y0 += paddingTop(node) - p;\n x1 -= paddingRight(node) - p;\n y1 -= paddingBottom(node) - p;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n tile(node, x0, y0, x1, y1);\n }\n }\n\n treemap.round = function(x) {\n return arguments.length ? (round = !!x, treemap) : round;\n };\n\n treemap.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];\n };\n\n treemap.tile = function(x) {\n return arguments.length ? (tile = required(x), treemap) : tile;\n };\n\n treemap.padding = function(x) {\n return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\n };\n\n treemap.paddingInner = function(x) {\n return arguments.length ? (paddingInner = typeof x === \"function\" ? x : constant(+x), treemap) : paddingInner;\n };\n\n treemap.paddingOuter = function(x) {\n return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\n };\n\n treemap.paddingTop = function(x) {\n return arguments.length ? (paddingTop = typeof x === \"function\" ? x : constant(+x), treemap) : paddingTop;\n };\n\n treemap.paddingRight = function(x) {\n return arguments.length ? (paddingRight = typeof x === \"function\" ? x : constant(+x), treemap) : paddingRight;\n };\n\n treemap.paddingBottom = function(x) {\n return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : constant(+x), treemap) : paddingBottom;\n };\n\n treemap.paddingLeft = function(x) {\n return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : constant(+x), treemap) : paddingLeft;\n };\n\n return treemap;\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n i, n = nodes.length,\n sum, sums = new Array(n + 1);\n\n for (sums[0] = sum = i = 0; i < n; ++i) {\n sums[i + 1] = sum += nodes[i].value;\n }\n\n partition(0, n, parent.value, x0, y0, x1, y1);\n\n function partition(i, j, value, x0, y0, x1, y1) {\n if (i >= j - 1) {\n var node = nodes[i];\n node.x0 = x0, node.y0 = y0;\n node.x1 = x1, node.y1 = y1;\n return;\n }\n\n var valueOffset = sums[i],\n valueTarget = (value / 2) + valueOffset,\n k = i + 1,\n hi = j - 1;\n\n while (k < hi) {\n var mid = k + hi >>> 1;\n if (sums[mid] < valueTarget) k = mid + 1;\n else hi = mid;\n }\n\n if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;\n\n var valueLeft = sums[k] - valueOffset,\n valueRight = value - valueLeft;\n\n if ((x1 - x0) > (y1 - y0)) {\n var xk = (x0 * valueRight + x1 * valueLeft) / value;\n partition(i, k, valueLeft, x0, y0, xk, y1);\n partition(k, j, valueRight, xk, y0, x1, y1);\n } else {\n var yk = (y0 * valueRight + y1 * valueLeft) / value;\n partition(i, k, valueLeft, x0, y0, x1, yk);\n partition(k, j, valueRight, x0, yk, x1, y1);\n }\n }\n}\n","import dice from \"./dice.js\";\nimport slice from \"./slice.js\";\n\nexport default function(parent, x0, y0, x1, y1) {\n (parent.depth & 1 ? slice : dice)(parent, x0, y0, x1, y1);\n}\n","import treemapDice from \"./dice.js\";\nimport treemapSlice from \"./slice.js\";\nimport {phi, squarifyRatio} from \"./squarify.js\";\n\nexport default (function custom(ratio) {\n\n function resquarify(parent, x0, y0, x1, y1) {\n if ((rows = parent._squarify) && (rows.ratio === ratio)) {\n var rows,\n row,\n nodes,\n i,\n j = -1,\n n,\n m = rows.length,\n value = parent.value;\n\n while (++j < m) {\n row = rows[j], nodes = row.children;\n for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);\n else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);\n value -= row.value;\n }\n } else {\n parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);\n rows.ratio = ratio;\n }\n }\n\n resquarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return resquarify;\n})(phi);\n","export default function(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n","import {hue} from \"./color.js\";\n\nexport default function(a, b) {\n var i = hue(+a, +b);\n return function(t) {\n var x = i(t);\n return x - 360 * Math.floor(x / 360);\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","var rho = Math.SQRT2,\n rho2 = 2,\n rho4 = 4,\n epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000;\n\n return i;\n}\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {lab as colorLab} from \"d3-color\";\nimport color from \"./color.js\";\n\nexport default function lab(start, end) {\n var l = color((start = colorLab(start)).l, (end = colorLab(end)).l),\n a = color(start.a, end.a),\n b = color(start.b, end.b),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.l = l(t);\n start.a = a(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n}\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function piecewise(interpolate, values) {\n var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);\n while (i < n) I[i] = interpolate(v, v = values[++i]);\n return function(t) {\n var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n return I[i](t - i);\n };\n}\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n","export default function(polygon) {\n var i = -1,\n n = polygon.length,\n a,\n b = polygon[n - 1],\n area = 0;\n\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n}\n","export default function(polygon) {\n var i = -1,\n n = polygon.length,\n x = 0,\n y = 0,\n a,\n b = polygon[n - 1],\n c,\n k = 0;\n\n while (++i < n) {\n a = b;\n b = polygon[i];\n k += c = a[0] * b[1] - b[0] * a[1];\n x += (a[0] + b[0]) * c;\n y += (a[1] + b[1]) * c;\n }\n\n return k *= 3, [x / k, y / k];\n}\n","import cross from \"./cross.js\";\n\nfunction lexicographicOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n}\n\n// Computes the upper convex hull per the monotone chain algorithm.\n// Assumes points.length >= 3, is sorted by x, unique in y.\n// Returns an array of indices into points in left-to-right order.\nfunction computeUpperHullIndexes(points) {\n var n = points.length,\n indexes = [0, 1],\n size = 2;\n\n for (var i = 2; i < n; ++i) {\n while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;\n indexes[size++] = i;\n }\n\n return indexes.slice(0, size); // remove popped points\n}\n\nexport default function(points) {\n if ((n = points.length) < 3) return null;\n\n var i,\n n,\n sortedPoints = new Array(n),\n flippedPoints = new Array(n);\n\n for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];\n sortedPoints.sort(lexicographicOrder);\n for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];\n\n var upperIndexes = computeUpperHullIndexes(sortedPoints),\n lowerIndexes = computeUpperHullIndexes(flippedPoints);\n\n // Construct the hull polygon, removing possible duplicate endpoints.\n var skipLeft = lowerIndexes[0] === upperIndexes[0],\n skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],\n hull = [];\n\n // Add upper hull in right-to-l order.\n // Then add lower hull in left-to-right order.\n for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);\n for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);\n\n return hull;\n}\n","// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of\n// the 3D cross product in a quadrant I Cartesian coordinate system (+x is\n// right, +y is up). Returns a positive value if ABC is counter-clockwise,\n// negative if clockwise, and zero if the points are collinear.\nexport default function(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n","export default function(polygon, point) {\n var n = polygon.length,\n p = polygon[n - 1],\n x = point[0], y = point[1],\n x0 = p[0], y0 = p[1],\n x1, y1,\n inside = false;\n\n for (var i = 0; i < n; ++i) {\n p = polygon[i], x1 = p[0], y1 = p[1];\n if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;\n x0 = x1, y0 = y1;\n }\n\n return inside;\n}\n","export default function(polygon) {\n var i = -1,\n n = polygon.length,\n b = polygon[n - 1],\n xa,\n ya,\n xb = b[0],\n yb = b[1],\n perimeter = 0;\n\n while (++i < n) {\n xa = xb;\n ya = yb;\n b = polygon[i];\n xb = b[0];\n yb = b[1];\n xa -= xb;\n ya -= yb;\n perimeter += Math.sqrt(xa * xa + ya * ya);\n }\n\n return perimeter;\n}\n","export default function() {\n return Math.random();\n}\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomUniform(source) {\n function randomUniform(min, max) {\n min = min == null ? 0 : +min;\n max = max == null ? 1 : +max;\n if (arguments.length === 1) max = min, min = 0;\n else max -= min;\n return function() {\n return source() * max + min;\n };\n }\n\n randomUniform.source = sourceRandomUniform;\n\n return randomUniform;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomNormal(source) {\n function randomNormal(mu, sigma) {\n var x, r;\n mu = mu == null ? 0 : +mu;\n sigma = sigma == null ? 1 : +sigma;\n return function() {\n var y;\n\n // If available, use the second previously-generated uniform random.\n if (x != null) y = x, x = null;\n\n // Otherwise, generate a new x and y.\n else do {\n x = source() * 2 - 1;\n y = source() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n\n return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\n };\n }\n\n randomNormal.source = sourceRandomNormal;\n\n return randomNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport normal from \"./normal\";\n\nexport default (function sourceRandomLogNormal(source) {\n function randomLogNormal() {\n var randomNormal = normal.source(source).apply(this, arguments);\n return function() {\n return Math.exp(randomNormal());\n };\n }\n\n randomLogNormal.source = sourceRandomLogNormal;\n\n return randomLogNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomIrwinHall(source) {\n function randomIrwinHall(n) {\n return function() {\n for (var sum = 0, i = 0; i < n; ++i) sum += source();\n return sum;\n };\n }\n\n randomIrwinHall.source = sourceRandomIrwinHall;\n\n return randomIrwinHall;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport irwinHall from \"./irwinHall\";\n\nexport default (function sourceRandomBates(source) {\n function randomBates(n) {\n var randomIrwinHall = irwinHall.source(source)(n);\n return function() {\n return randomIrwinHall() / n;\n };\n }\n\n randomBates.source = sourceRandomBates;\n\n return randomBates;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomExponential(source) {\n function randomExponential(lambda) {\n return function() {\n return -Math.log(1 - source()) / lambda;\n };\n }\n\n randomExponential.source = sourceRandomExponential;\n\n return randomExponential;\n})(defaultSource);\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.interpolator(domain); break;\n default: this.interpolator(interpolator).domain(domain); break;\n }\n return this;\n}\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\nimport {initRange} from \"./init\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal() {\n var index = map(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init\";\nimport ordinal from \"./ordinal\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n range = [0, 1],\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = range[1] < range[0],\n start = range[reverse - 0],\n stop = range[1 - reverse];\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = [+_[0], +_[1]], round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), range)\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(domain) {\n var a = domain[0], b = domain[domain.length - 1], t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous(transform, untransform) {\n return transformer()(transform, untransform);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous(identity, identity);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","import {map} from \"./array\";\nimport {linearish} from \"./linear\";\nimport number from \"./number\";\n\nexport default function identity(domain) {\n var unknown;\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = function(_) {\n return arguments.length ? (domain = map.call(_, number), scale) : domain.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return identity(domain).unknown(unknown);\n };\n\n domain = arguments.length ? map.call(domain, number) : [0, 1];\n\n return linearish(scale);\n}\n","export default function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","import {ticks} from \"d3-array\";\nimport {format} from \"d3-format\";\nimport nice from \"./nice\";\nimport {copy, transformer} from \"./continuous\";\nimport {initRange} from \"./init\";\n\nfunction transformLog(x) {\n return Math.log(x);\n}\n\nfunction transformExp(x) {\n return Math.exp(x);\n}\n\nfunction transformLogn(x) {\n return -Math.log(-x);\n}\n\nfunction transformExpn(x) {\n return -Math.exp(-x);\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : function(x) { return Math.pow(base, x); };\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n}\n\nfunction reflect(f) {\n return function(x) {\n return -f(-x);\n };\n}\n\nexport function loggish(transform) {\n var scale = transform(transformLog, transformExp),\n domain = scale.domain,\n base = 10,\n logs,\n pows;\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) {\n logs = reflect(logs), pows = reflect(pows);\n transform(transformLogn, transformExpn);\n } else {\n transform(transformLog, transformExp);\n }\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = function(count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n\n if (r = v < u) i = u, u = v, v = i;\n\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.round(i) - 1, j = Math.round(j) + 1;\n if (u > 0) for (; i < j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i < j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = function(count, specifier) {\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n if (typeof specifier !== \"function\") specifier = format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function(d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = function() {\n return domain(nice(domain(), {\n floor: function(x) { return pows(Math.floor(logs(x))); },\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\n }));\n };\n\n return scale;\n}\n\nexport default function log() {\n var scale = loggish(transformer()).domain([1, 10]);\n\n scale.copy = function() {\n return copy(scale, log()).base(scale.base());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {linearish} from \"./linear\";\nimport {copy, transformer} from \"./continuous\";\nimport {initRange} from \"./init\";\n\nfunction transformSymlog(c) {\n return function(x) {\n return Math.sign(x) * Math.log1p(Math.abs(x / c));\n };\n}\n\nfunction transformSymexp(c) {\n return function(x) {\n return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n };\n}\n\nexport function symlogish(transform) {\n var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));\n\n scale.constant = function(_) {\n return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\n };\n\n return linearish(scale);\n}\n\nexport default function symlog() {\n var scale = symlogish(transformer());\n\n scale.copy = function() {\n return copy(scale, symlog()).constant(scale.constant());\n };\n\n return initRange.apply(scale, arguments);\n}\n","import {linearish} from \"./linear\";\nimport {copy, identity, transformer} from \"./continuous\";\nimport {initRange} from \"./init\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","import {ascending, bisect, quantile as threshold} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {initRange} from \"./init\";\n\nexport default function quantile() {\n var domain = [],\n range = [],\n thresholds = [],\n unknown;\n\n function rescale() {\n var i = 0, n = Math.max(1, range.length);\n thresholds = new Array(n - 1);\n while (++i < n) thresholds[i - 1] = threshold(domain, i / n);\n return scale;\n }\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : range[bisect(thresholds, x)];\n }\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN] : [\n i > 0 ? thresholds[i - 1] : domain[0],\n i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n ];\n };\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n domain.sort(ascending);\n return rescale();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.quantiles = function() {\n return thresholds.slice();\n };\n\n scale.copy = function() {\n return quantile()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return initRange.apply(scale, arguments);\n}\n","import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {linearish} from \"./linear\";\nimport {initRange} from \"./init\";\n\nexport default function quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range = [0, 1],\n unknown;\n\n function scale(x) {\n return x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n }\n\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n return scale;\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n };\n\n scale.range = function(_) {\n return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN]\n : i < 1 ? [x0, domain[0]]\n : i >= n ? [domain[n - 1], x1]\n : [domain[i - 1], domain[i]];\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : scale;\n };\n\n scale.thresholds = function() {\n return domain.slice();\n };\n\n scale.copy = function() {\n return quantize()\n .domain([x0, x1])\n .range(range)\n .unknown(unknown);\n };\n\n return initRange.apply(linearish(scale), arguments);\n}\n","import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {initRange} from \"./init\";\n\nexport default function threshold() {\n var domain = [0.5],\n range = [0, 1],\n unknown,\n n = 1;\n\n function scale(x) {\n return x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return [domain[i - 1], domain[i]];\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return threshold()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return initRange.apply(scale, arguments);\n}\n","var t0 = new Date,\n t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = function(date) {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n","import interval from \"./interval.js\";\n\nvar year = interval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval.js\";\n\nvar month = interval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction weekday(i) {\n return interval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nvar day = interval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nvar hour = interval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nvar minute = interval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","import interval from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nvar second = interval(function(date) {\n date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","import interval from \"./interval.js\";\n\nvar millisecond = interval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","import interval from \"./interval.js\";\nimport {durationWeek} from \"./duration.js\";\n\nfunction utcWeekday(i) {\n return interval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval.js\";\nimport {durationDay} from \"./duration.js\";\n\nvar utcDay = interval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval.js\";\n\nvar utcYear = interval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {bisector, tickStep} from \"d3-array\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n durationMinute = durationSecond * 60,\n durationHour = durationMinute * 60,\n durationDay = durationHour * 24,\n durationWeek = durationDay * 7,\n durationMonth = durationDay * 30,\n durationYear = durationDay * 365;\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n var scale = continuous(identity, identity),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n var tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === \"number\") {\n var target = Math.abs(stop - start) / interval,\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = Math.max(tickStep(start, stop, interval), 1);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n };\n\n return scale;\n}\n\nexport default function() {\n return initRange.apply(calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n","import interval from \"./interval.js\";\n\nvar utcMonth = interval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import interval from \"./interval.js\";\nimport {durationHour} from \"./duration.js\";\n\nvar utcHour = interval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import interval from \"./interval.js\";\nimport {durationMinute} from \"./duration.js\";\n\nvar utcMinute = interval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","import {calendar} from \"./time\";\nimport {utcFormat} from \"d3-time-format\";\nimport {utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond} from \"d3-time\";\nimport {initRange} from \"./init\";\n\nexport default function() {\n return initRange.apply(calendar(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);\n}\n","import {identity} from \"./continuous\";\nimport {initInterpolator} from \"./init\";\nimport {linearish} from \"./linear\";\nimport {loggish} from \"./log\";\nimport {symlogish} from \"./symlog\";\nimport {powish} from \"./pow\";\n\nfunction transformer() {\n var x0 = 0,\n x1 = 1,\n t0,\n t1,\n k10,\n transform,\n interpolator = identity,\n clamp = false,\n unknown;\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n\n scale.domain = function(_) {\n return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t) {\n transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n return scale;\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .interpolator(source.interpolator())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport default function sequential() {\n var scale = linearish(transformer()(identity));\n\n scale.copy = function() {\n return copy(scale, sequential());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialLog() {\n var scale = loggish(transformer()).domain([1, 10]);\n\n scale.copy = function() {\n return copy(scale, sequentialLog()).base(scale.base());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialSymlog() {\n var scale = symlogish(transformer());\n\n scale.copy = function() {\n return copy(scale, sequentialSymlog()).constant(scale.constant());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialPow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, sequentialPow()).exponent(scale.exponent());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function sequentialSqrt() {\n return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n","import {ascending, bisect} from \"d3-array\";\nimport {identity} from \"./continuous\";\nimport {initInterpolator} from \"./init\";\n\nexport default function sequentialQuantile() {\n var domain = [],\n interpolator = identity;\n\n function scale(x) {\n if (!isNaN(x = +x)) return interpolator((bisect(domain, x) - 1) / (domain.length - 1));\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n domain.sort(ascending);\n return scale;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return sequentialQuantile(interpolator).domain(domain);\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n","import {identity} from \"./continuous\";\nimport {initInterpolator} from \"./init\";\nimport {linearish} from \"./linear\";\nimport {loggish} from \"./log\";\nimport {copy} from \"./sequential\";\nimport {symlogish} from \"./symlog\";\nimport {powish} from \"./pow\";\n\nfunction transformer() {\n var x0 = 0,\n x1 = 0.5,\n x2 = 1,\n t0,\n t1,\n t2,\n k10,\n k21,\n interpolator = identity,\n transform,\n clamp = false,\n unknown;\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n\n scale.domain = function(_) {\n return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t) {\n transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);\n return scale;\n };\n}\n\nexport default function diverging() {\n var scale = linearish(transformer()(identity));\n\n scale.copy = function() {\n return copy(scale, diverging());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function divergingLog() {\n var scale = loggish(transformer()).domain([0.1, 1, 10]);\n\n scale.copy = function() {\n return copy(scale, divergingLog()).base(scale.base());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function divergingSymlog() {\n var scale = symlogish(transformer());\n\n scale.copy = function() {\n return copy(scale, divergingSymlog()).constant(scale.constant());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function divergingPow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, divergingPow()).exponent(scale.exponent());\n };\n\n return initInterpolator.apply(scale, arguments);\n}\n\nexport function divergingSqrt() {\n return divergingPow.apply(null, arguments).exponent(0.5);\n}\n","export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n","import colors from \"../colors.js\";\n\nexport default colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n","import colors from \"../colors.js\";\n\nexport default colors(\"4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab\");\n","import {interpolateRgbBasis} from \"d3-interpolate\";\n\nexport default function(scheme) {\n return interpolateRgbBasis(scheme[scheme.length - 1]);\n}\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"d8b365f5f5f55ab4ac\",\n \"a6611adfc27d80cdc1018571\",\n \"a6611adfc27df5f5f580cdc1018571\",\n \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\n \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\n \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\n \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\n \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\n \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"af8dc3f7f7f77fbf7b\",\n \"7b3294c2a5cfa6dba0008837\",\n \"7b3294c2a5cff7f7f7a6dba0008837\",\n \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\n \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\n \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\n \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\n \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\n \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"e9a3c9f7f7f7a1d76a\",\n \"d01c8bf1b6dab8e1864dac26\",\n \"d01c8bf1b6daf7f7f7b8e1864dac26\",\n \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\n \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\n \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\n \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\n \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\n \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"998ec3f7f7f7f1a340\",\n \"5e3c99b2abd2fdb863e66101\",\n \"5e3c99b2abd2f7f7f7fdb863e66101\",\n \"542788998ec3d8daebfee0b6f1a340b35806\",\n \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\n \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\n \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\n \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\n \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62f7f7f767a9cf\",\n \"ca0020f4a58292c5de0571b0\",\n \"ca0020f4a582f7f7f792c5de0571b0\",\n \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\n \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\n \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\n \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\n \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62ffffff999999\",\n \"ca0020f4a582bababa404040\",\n \"ca0020f4a582ffffffbababa404040\",\n \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\n \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\n \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\n \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\n \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\n \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91bfdb\",\n \"d7191cfdae61abd9e92c7bb6\",\n \"d7191cfdae61ffffbfabd9e92c7bb6\",\n \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\n \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\n \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\n \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\n \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\n \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91cf60\",\n \"d7191cfdae61a6d96a1a9641\",\n \"d7191cfdae61ffffbfa6d96a1a9641\",\n \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\n \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\n \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\n \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\n \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\n \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf99d594\",\n \"d7191cfdae61abdda42b83ba\",\n \"d7191cfdae61ffffbfabdda42b83ba\",\n \"d53e4ffc8d59fee08be6f59899d5943288bd\",\n \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\n \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\n \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\n \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\n \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5f999d8c92ca25f\",\n \"edf8fbb2e2e266c2a4238b45\",\n \"edf8fbb2e2e266c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"e0ecf49ebcda8856a7\",\n \"edf8fbb3cde38c96c688419d\",\n \"edf8fbb3cde38c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"e0f3dba8ddb543a2ca\",\n \"f0f9e8bae4bc7bccc42b8cbe\",\n \"f0f9e8bae4bc7bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fee8c8fdbb84e34a33\",\n \"fef0d9fdcc8afc8d59d7301f\",\n \"fef0d9fdcc8afc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"ece2f0a6bddb1c9099\",\n \"f6eff7bdc9e167a9cf02818a\",\n \"f6eff7bdc9e167a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"ece7f2a6bddb2b8cbe\",\n \"f1eef6bdc9e174a9cf0570b0\",\n \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"e7e1efc994c7dd1c77\",\n \"f1eef6d7b5d8df65b0ce1256\",\n \"f1eef6d7b5d8df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fde0ddfa9fb5c51b8a\",\n \"feebe2fbb4b9f768a1ae017e\",\n \"feebe2fbb4b9f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"edf8b17fcdbb2c7fb8\",\n \"ffffcca1dab441b6c4225ea8\",\n \"ffffcca1dab441b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"f7fcb9addd8e31a354\",\n \"ffffccc2e69978c679238443\",\n \"ffffccc2e69978c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fff7bcfec44fd95f0e\",\n \"ffffd4fed98efe9929cc4c02\",\n \"ffffd4fed98efe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"ffeda0feb24cf03b20\",\n \"ffffb2fecc5cfd8d3ce31a1c\",\n \"ffffb2fecc5cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"deebf79ecae13182bd\",\n \"eff3ffbdd7e76baed62171b5\",\n \"eff3ffbdd7e76baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5e0a1d99b31a354\",\n \"edf8e9bae4b374c476238b45\",\n \"edf8e9bae4b374c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"f0f0f0bdbdbd636363\",\n \"f7f7f7cccccc969696525252\",\n \"f7f7f7cccccc969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"efedf5bcbddc756bb1\",\n \"f2f0f7cbc9e29e9ac86a51a3\",\n \"f2f0f7cbc9e29e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fee0d2fc9272de2d26\",\n \"fee5d9fcae91fb6a4acb181d\",\n \"fee5d9fcae91fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors.js\";\nimport ramp from \"../ramp.js\";\n\nexport var scheme = new Array(3).concat(\n \"fee6cefdae6be6550d\",\n \"feeddefdbe85fd8d3cd94701\",\n \"feeddefdbe85fd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\n).map(colors);\n\nexport default ramp(scheme);\n","export default function(t) {\n t = Math.max(0, Math.min(1, t));\n return \"rgb(\"\n + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + \", \"\n + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + \", \"\n + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67)))))))\n + \")\";\n}\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nexport var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nvar c = cubehelix();\n\nexport default function(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n c.h = 360 * t - 100;\n c.s = 1.5 - 1.5 * ts;\n c.l = 0.8 - 0.9 * ts;\n return c + \"\";\n}\n","import {rgb} from \"d3-color\";\n\nvar c = rgb(),\n pi_1_3 = Math.PI / 3,\n pi_2_3 = Math.PI * 2 / 3;\n\nexport default function(t) {\n var x;\n t = (0.5 - t) * Math.PI;\n c.r = 255 * (x = Math.sin(t)) * x;\n c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\n c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\n return c + \"\";\n}\n","export default function(t) {\n t = Math.max(0, Math.min(1, t));\n return \"rgb(\"\n + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + \", \"\n + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + \", \"\n + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66)))))))\n + \")\";\n}\n","import colors from \"../colors.js\";\n\nfunction ramp(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\nexport default ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nexport var magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nexport var inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nexport var plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n","import creator from \"./creator\";\nimport select from \"./select\";\n\nexport default function(name) {\n return select(creator(name).call(document.documentElement));\n}\n","var nextId = 0;\n\nexport default function local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([selector == null ? [] : selector], root);\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node, touches) {\n if (touches == null) touches = sourceEvent().touches;\n\n for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {\n points[i] = point(node, touches[i]);\n }\n\n return points;\n}\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function() {\n var x = pointX,\n y = pointY,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function line(data) {\n var i,\n n = data.length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport line from \"./line.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function() {\n var x0 = pointX,\n x1 = null,\n y0 = constant(0),\n y1 = pointY,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function area(data) {\n var i,\n j,\n k,\n n = data.length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n return d;\n}\n","import constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = data.length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n","import curveLinear from \"./linear.js\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","import curveRadial, {curveRadialLinear} from \"./curve/radial.js\";\nimport line from \"./line.js\";\n\nexport function lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\nexport default function() {\n return lineRadial(line().curve(curveRadialLinear));\n}\n","import curveRadial, {curveRadialLinear} from \"./curve/radial.js\";\nimport area from \"./area.js\";\nimport {lineRadial} from \"./lineRadial.js\";\n\nexport default function() {\n var a = area().curve(curveRadialLinear),\n c = a.curve,\n x0 = a.lineX0,\n x1 = a.lineX1,\n y0 = a.lineY0,\n y1 = a.lineY1;\n\n a.angle = a.x, delete a.x;\n a.startAngle = a.x0, delete a.x0;\n a.endAngle = a.x1, delete a.x1;\n a.radius = a.y, delete a.y;\n a.innerRadius = a.y0, delete a.y0;\n a.outerRadius = a.y1, delete a.y1;\n a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\n a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\n a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\n a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\n\n a.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return a;\n}\n","export default function(x, y) {\n return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n}\n","export var slice = Array.prototype.slice;\n","import {path} from \"d3-path\";\nimport {slice} from \"../array.js\";\nimport constant from \"../constant.js\";\nimport {x as pointX, y as pointY} from \"../point.js\";\nimport pointRadial from \"../pointRadial.js\";\n\nfunction linkSource(d) {\n return d.source;\n}\n\nfunction linkTarget(d) {\n return d.target;\n}\n\nfunction link(curve) {\n var source = linkSource,\n target = linkTarget,\n x = pointX,\n y = pointY,\n context = null;\n\n function link() {\n var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n if (!context) context = buffer = path();\n curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n link.source = function(_) {\n return arguments.length ? (source = _, link) : source;\n };\n\n link.target = function(_) {\n return arguments.length ? (target = _, link) : target;\n };\n\n link.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), link) : x;\n };\n\n link.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), link) : y;\n };\n\n link.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), link) : context;\n };\n\n return link;\n}\n\nfunction curveHorizontal(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n}\n\nfunction curveVertical(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n}\n\nfunction curveRadial(context, x0, y0, x1, y1) {\n var p0 = pointRadial(x0, y0),\n p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n p2 = pointRadial(x1, y0),\n p3 = pointRadial(x1, y1);\n context.moveTo(p0[0], p0[1]);\n context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n}\n\nexport function linkHorizontal() {\n return link(curveHorizontal);\n}\n\nexport function linkVertical() {\n return link(curveVertical);\n}\n\nexport function linkRadial() {\n var l = link(curveRadial);\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n return l;\n}\n","import {pi, tau} from \"../math.js\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","export default {\n draw: function(context, size) {\n var r = Math.sqrt(size / 5) / 2;\n context.moveTo(-3 * r, -r);\n context.lineTo(-r, -r);\n context.lineTo(-r, -3 * r);\n context.lineTo(r, -3 * r);\n context.lineTo(r, -r);\n context.lineTo(3 * r, -r);\n context.lineTo(3 * r, r);\n context.lineTo(r, r);\n context.lineTo(r, 3 * r);\n context.lineTo(-r, 3 * r);\n context.lineTo(-r, r);\n context.lineTo(-3 * r, r);\n context.closePath();\n }\n};\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math.js\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default {\n draw: function(context, size) {\n var w = Math.sqrt(size),\n x = -w / 2;\n context.rect(x, x, w, w);\n }\n};\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","import {path} from \"d3-path\";\nimport circle from \"./symbol/circle.js\";\nimport cross from \"./symbol/cross.js\";\nimport diamond from \"./symbol/diamond.js\";\nimport star from \"./symbol/star.js\";\nimport square from \"./symbol/square.js\";\nimport triangle from \"./symbol/triangle.js\";\nimport wye from \"./symbol/wye.js\";\nimport constant from \"./constant.js\";\n\nexport var symbols = [\n circle,\n cross,\n diamond,\n square,\n star,\n triangle,\n wye\n];\n\nexport default function() {\n var type = constant(circle),\n size = constant(64),\n context = null;\n\n function symbol() {\n var buffer;\n if (!context) context = buffer = path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n symbol.type = function(_) {\n return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n };\n\n symbol.size = function(_) {\n return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n };\n\n symbol.context = function(_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n\n return symbol;\n}\n","export default function() {}\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop.js\";\nimport {point} from \"./basis.js\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis.js\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis.js\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop.js\";\nimport {point} from \"./cardinal.js\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal.js\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math.js\";\nimport {Cardinal} from \"./cardinal.js\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed.js\";\nimport noop from \"../noop.js\";\nimport {point} from \"./catmullRom.js\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen.js\";\nimport {point} from \"./catmullRom.js\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop.js\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import {slice} from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","import none from \"./none.js\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n }\n none(series, order);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n for (yp = yn = 0, i = 0; i < n; ++i) {\n if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\n d[0] = yp, d[1] = yp += dy;\n } else if (dy < 0) {\n d[1] = yn, d[0] = yn += dy;\n } else {\n d[0] = 0, d[1] = dy;\n }\n }\n }\n}\n","import none from \"./none.js\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n}\n","import none from \"./none.js\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n}\n","import none from \"./none.js\";\n\nexport default function(series) {\n var peaks = series.map(peak);\n return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; });\n}\n\nfunction peak(series) {\n var i = -1, j = 0, n = series.length, vi, vj = -Infinity;\n while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;\n return j;\n}\n","import none from \"./none.js\";\n\nexport default function(series) {\n var sums = series.map(sum);\n return none(series).sort(function(a, b) { return sums[a] - sums[b]; });\n}\n\nexport function sum(series) {\n var s = 0, i = -1, n = series.length, v;\n while (++i < n) if (v = +series[i][1]) s += v;\n return s;\n}\n","import ascending from \"./ascending.js\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import appearance from \"./appearance.js\";\nimport {sum} from \"./ascending.js\";\n\nexport default function(series) {\n var n = series.length,\n i,\n j,\n sums = series.map(sum),\n order = appearance(series),\n top = 0,\n bottom = 0,\n tops = [],\n bottoms = [];\n\n for (i = 0; i < n; ++i) {\n j = order[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n\n return bottoms.reverse().concat(tops);\n}\n","import none from \"./none.js\";\n\nexport default function(series) {\n return none(series).reverse();\n}\n","import {utcFormat} from \"./defaultLocale.js\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat.js\";\nimport {utcParse} from \"./defaultLocale.js\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import {Timer, now} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer, total = delay;\n if (delay == null) return t.restart(callback, delay, time), t;\n delay = +delay, time = time == null ? now() : +time;\n t.restart(function tick(elapsed) {\n elapsed += total;\n t.restart(tick, total += delay, time);\n callback(elapsed);\n }, delay, time);\n return t;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export function x(d) {\n return d[0];\n}\n\nexport function y(d) {\n return d[1];\n}\n","function RedBlackTree() {\n this._ = null; // root node\n}\n\nexport function RedBlackNode(node) {\n node.U = // parent node\n node.C = // color - true for red, false for black\n node.L = // left node\n node.R = // right node\n node.P = // previous node\n node.N = null; // next node\n}\n\nRedBlackTree.prototype = {\n constructor: RedBlackTree,\n\n insert: function(after, node) {\n var parent, grandpa, uncle;\n\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = RedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n RedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n RedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n\n var parent = node.U,\n sibling,\n left = node.L,\n right = node.R,\n next,\n red;\n\n if (!left) next = right;\n else if (!right) next = left;\n else next = RedBlackFirst(right);\n\n if (parent) {\n if (parent.L === node) parent.L = next;\n else parent.R = next;\n } else {\n this._ = next;\n }\n\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) { node.C = false; return; }\n\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n RedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n RedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n RedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n RedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n\n if (node) node.C = false;\n }\n};\n\nfunction RedBlackRotateLeft(tree, node) {\n var p = node,\n q = node.R,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n}\n\nfunction RedBlackRotateRight(tree, node) {\n var p = node,\n q = node.L,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n}\n\nfunction RedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n}\n\nexport default RedBlackTree;\n","import {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createEdge(left, right, v0, v1) {\n var edge = [null, null],\n index = edges.push(edge) - 1;\n edge.left = left;\n edge.right = right;\n if (v0) setEdgeEnd(edge, left, right, v0);\n if (v1) setEdgeEnd(edge, right, left, v1);\n cells[left.index].halfedges.push(index);\n cells[right.index].halfedges.push(index);\n return edge;\n}\n\nexport function createBorderEdge(left, v0, v1) {\n var edge = [v0, v1];\n edge.left = left;\n return edge;\n}\n\nexport function setEdgeEnd(edge, left, right, vertex) {\n if (!edge[0] && !edge[1]) {\n edge[0] = vertex;\n edge.left = left;\n edge.right = right;\n } else if (edge.left === right) {\n edge[1] = vertex;\n } else {\n edge[0] = vertex;\n }\n}\n\n// Liang–Barsky line clipping.\nfunction clipEdge(edge, x0, y0, x1, y1) {\n var a = edge[0],\n b = edge[1],\n ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?\n\n if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];\n if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];\n return true;\n}\n\nfunction connectEdge(edge, x0, y0, x1, y1) {\n var v1 = edge[1];\n if (v1) return true;\n\n var v0 = edge[0],\n left = edge.left,\n right = edge.right,\n lx = left[0],\n ly = left[1],\n rx = right[0],\n ry = right[1],\n fx = (lx + rx) / 2,\n fy = (ly + ry) / 2,\n fm,\n fb;\n\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!v0) v0 = [fx, y0];\n else if (v0[1] >= y1) return;\n v1 = [fx, y1];\n } else {\n if (!v0) v0 = [fx, y1];\n else if (v0[1] < y0) return;\n v1 = [fx, y0];\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!v0) v0 = [(y0 - fb) / fm, y0];\n else if (v0[1] >= y1) return;\n v1 = [(y1 - fb) / fm, y1];\n } else {\n if (!v0) v0 = [(y1 - fb) / fm, y1];\n else if (v0[1] < y0) return;\n v1 = [(y0 - fb) / fm, y0];\n }\n } else {\n if (ly < ry) {\n if (!v0) v0 = [x0, fm * x0 + fb];\n else if (v0[0] >= x1) return;\n v1 = [x1, fm * x1 + fb];\n } else {\n if (!v0) v0 = [x1, fm * x1 + fb];\n else if (v0[0] < x0) return;\n v1 = [x0, fm * x0 + fb];\n }\n }\n }\n\n edge[0] = v0;\n edge[1] = v1;\n return true;\n}\n\nexport function clipEdges(x0, y0, x1, y1) {\n var i = edges.length,\n edge;\n\n while (i--) {\n if (!connectEdge(edge = edges[i], x0, y0, x1, y1)\n || !clipEdge(edge, x0, y0, x1, y1)\n || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon\n || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) {\n delete edges[i];\n }\n }\n}\n","import {createBorderEdge} from \"./Edge\";\nimport {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createCell(site) {\n return cells[site.index] = {\n site: site,\n halfedges: []\n };\n}\n\nfunction cellHalfedgeAngle(cell, edge) {\n var site = cell.site,\n va = edge.left,\n vb = edge.right;\n if (site === vb) vb = va, va = site;\n if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);\n if (site === va) va = edge[1], vb = edge[0];\n else va = edge[0], vb = edge[1];\n return Math.atan2(va[0] - vb[0], vb[1] - va[1]);\n}\n\nexport function cellHalfedgeStart(cell, edge) {\n return edge[+(edge.left !== cell.site)];\n}\n\nexport function cellHalfedgeEnd(cell, edge) {\n return edge[+(edge.left === cell.site)];\n}\n\nexport function sortCellHalfedges() {\n for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {\n if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {\n var index = new Array(m),\n array = new Array(m);\n for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);\n index.sort(function(i, j) { return array[j] - array[i]; });\n for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];\n for (j = 0; j < m; ++j) halfedges[j] = array[j];\n }\n }\n}\n\nexport function clipCells(x0, y0, x1, y1) {\n var nCells = cells.length,\n iCell,\n cell,\n site,\n iHalfedge,\n halfedges,\n nHalfedges,\n start,\n startX,\n startY,\n end,\n endX,\n endY,\n cover = true;\n\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n halfedges = cell.halfedges;\n iHalfedge = halfedges.length;\n\n // Remove any dangling clipped edges.\n while (iHalfedge--) {\n if (!edges[halfedges[iHalfedge]]) {\n halfedges.splice(iHalfedge, 1);\n }\n }\n\n // Insert any border edges as necessary.\n iHalfedge = 0, nHalfedges = halfedges.length;\n while (iHalfedge < nHalfedges) {\n end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];\n start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];\n if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) {\n halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,\n Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1]\n : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1]\n : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0]\n : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0]\n : null)) - 1);\n ++nHalfedges;\n }\n }\n\n if (nHalfedges) cover = false;\n }\n }\n\n // If there weren’t any edges, have the closest site cover the extent.\n // It doesn’t matter which corner of the extent we measure!\n if (cover) {\n var dx, dy, d2, dc = Infinity;\n\n for (iCell = 0, cover = null; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n dx = site[0] - x0;\n dy = site[1] - y0;\n d2 = dx * dx + dy * dy;\n if (d2 < dc) dc = d2, cover = cell;\n }\n }\n\n if (cover) {\n var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];\n cover.halfedges.push(\n edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,\n edges.push(createBorderEdge(site, v01, v11)) - 1,\n edges.push(createBorderEdge(site, v11, v10)) - 1,\n edges.push(createBorderEdge(site, v10, v00)) - 1\n );\n }\n }\n\n // Lastly delete any cells with no edges; these were entirely clipped.\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n if (!cell.halfedges.length) {\n delete cells[iCell];\n }\n }\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {circles, epsilon2} from \"./Diagram\";\n\nvar circlePool = [];\n\nexport var firstCircle;\n\nfunction Circle() {\n RedBlackNode(this);\n this.x =\n this.y =\n this.arc =\n this.site =\n this.cy = null;\n}\n\nexport function attachCircle(arc) {\n var lArc = arc.P,\n rArc = arc.N;\n\n if (!lArc || !rArc) return;\n\n var lSite = lArc.site,\n cSite = arc.site,\n rSite = rArc.site;\n\n if (lSite === rSite) return;\n\n var bx = cSite[0],\n by = cSite[1],\n ax = lSite[0] - bx,\n ay = lSite[1] - by,\n cx = rSite[0] - bx,\n cy = rSite[1] - by;\n\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -epsilon2) return;\n\n var ha = ax * ax + ay * ay,\n hc = cx * cx + cy * cy,\n x = (cy * ha - ay * hc) / d,\n y = (ax * hc - cx * ha) / d;\n\n var circle = circlePool.pop() || new Circle;\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom\n\n arc.circle = circle;\n\n var before = null,\n node = circles._;\n\n while (node) {\n if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {\n if (node.L) node = node.L;\n else { before = node.P; break; }\n } else {\n if (node.R) node = node.R;\n else { before = node; break; }\n }\n }\n\n circles.insert(before, circle);\n if (!before) firstCircle = circle;\n}\n\nexport function detachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) firstCircle = circle.N;\n circles.remove(circle);\n circlePool.push(circle);\n RedBlackNode(circle);\n arc.circle = null;\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {createCell} from \"./Cell\";\nimport {attachCircle, detachCircle} from \"./Circle\";\nimport {createEdge, setEdgeEnd} from \"./Edge\";\nimport {beaches, epsilon} from \"./Diagram\";\n\nvar beachPool = [];\n\nfunction Beach() {\n RedBlackNode(this);\n this.edge =\n this.site =\n this.circle = null;\n}\n\nfunction createBeach(site) {\n var beach = beachPool.pop() || new Beach;\n beach.site = site;\n return beach;\n}\n\nfunction detachBeach(beach) {\n detachCircle(beach);\n beaches.remove(beach);\n beachPool.push(beach);\n RedBlackNode(beach);\n}\n\nexport function removeBeach(beach) {\n var circle = beach.circle,\n x = circle.x,\n y = circle.cy,\n vertex = [x, y],\n previous = beach.P,\n next = beach.N,\n disappearing = [beach];\n\n detachBeach(beach);\n\n var lArc = previous;\n while (lArc.circle\n && Math.abs(x - lArc.circle.x) < epsilon\n && Math.abs(y - lArc.circle.cy) < epsilon) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n detachBeach(lArc);\n lArc = previous;\n }\n\n disappearing.unshift(lArc);\n detachCircle(lArc);\n\n var rArc = next;\n while (rArc.circle\n && Math.abs(x - rArc.circle.x) < epsilon\n && Math.abs(y - rArc.circle.cy) < epsilon) {\n next = rArc.N;\n disappearing.push(rArc);\n detachBeach(rArc);\n rArc = next;\n }\n\n disappearing.push(rArc);\n detachCircle(rArc);\n\n var nArcs = disappearing.length,\n iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);\n\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nexport function addBeach(site) {\n var x = site[0],\n directrix = site[1],\n lArc,\n rArc,\n dxl,\n dxr,\n node = beaches._;\n\n while (node) {\n dxl = leftBreakPoint(node, directrix) - x;\n if (dxl > epsilon) node = node.L; else {\n dxr = x - rightBreakPoint(node, directrix);\n if (dxr > epsilon) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -epsilon) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -epsilon) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n\n createCell(site);\n var newArc = createBeach(site);\n beaches.insert(lArc, newArc);\n\n if (!lArc && !rArc) return;\n\n if (lArc === rArc) {\n detachCircle(lArc);\n rArc = createBeach(lArc.site);\n beaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);\n attachCircle(lArc);\n attachCircle(rArc);\n return;\n }\n\n if (!rArc) { // && lArc\n newArc.edge = createEdge(lArc.site, newArc.site);\n return;\n }\n\n // else lArc !== rArc\n detachCircle(lArc);\n detachCircle(rArc);\n\n var lSite = lArc.site,\n ax = lSite[0],\n ay = lSite[1],\n bx = site[0] - ax,\n by = site[1] - ay,\n rSite = rArc.site,\n cx = rSite[0] - ax,\n cy = rSite[1] - ay,\n d = 2 * (bx * cy - by * cx),\n hb = bx * bx + by * by,\n hc = cx * cx + cy * cy,\n vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];\n\n setEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = createEdge(lSite, site, null, vertex);\n rArc.edge = createEdge(site, rSite, null, vertex);\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nfunction leftBreakPoint(arc, directrix) {\n var site = arc.site,\n rfocx = site[0],\n rfocy = site[1],\n pby2 = rfocy - directrix;\n\n if (!pby2) return rfocx;\n\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n\n site = lArc.site;\n var lfocx = site[0],\n lfocy = site[1],\n plby2 = lfocy - directrix;\n\n if (!plby2) return lfocx;\n\n var hl = lfocx - rfocx,\n aby2 = 1 / pby2 - 1 / plby2,\n b = hl / plby2;\n\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n\n return (rfocx + lfocx) / 2;\n}\n\nfunction rightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return leftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site[1] === directrix ? site[0] : Infinity;\n}\n","import {addBeach, removeBeach} from \"./Beach\";\nimport {sortCellHalfedges, cellHalfedgeStart, clipCells} from \"./Cell\";\nimport {firstCircle} from \"./Circle\";\nimport {clipEdges} from \"./Edge\";\nimport RedBlackTree from \"./RedBlackTree\";\n\nexport var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var beaches;\nexport var cells;\nexport var circles;\nexport var edges;\n\nfunction triangleArea(a, b, c) {\n return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);\n}\n\nfunction lexicographic(a, b) {\n return b[1] - a[1]\n || b[0] - a[0];\n}\n\nexport default function Diagram(sites, extent) {\n var site = sites.sort(lexicographic).pop(),\n x,\n y,\n circle;\n\n edges = [];\n cells = new Array(sites.length);\n beaches = new RedBlackTree;\n circles = new RedBlackTree;\n\n while (true) {\n circle = firstCircle;\n if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {\n if (site[0] !== x || site[1] !== y) {\n addBeach(site);\n x = site[0], y = site[1];\n }\n site = sites.pop();\n } else if (circle) {\n removeBeach(circle.arc);\n } else {\n break;\n }\n }\n\n sortCellHalfedges();\n\n if (extent) {\n var x0 = +extent[0][0],\n y0 = +extent[0][1],\n x1 = +extent[1][0],\n y1 = +extent[1][1];\n clipEdges(x0, y0, x1, y1);\n clipCells(x0, y0, x1, y1);\n }\n\n this.edges = edges;\n this.cells = cells;\n\n beaches =\n circles =\n edges =\n cells = null;\n}\n\nDiagram.prototype = {\n constructor: Diagram,\n\n polygons: function() {\n var edges = this.edges;\n\n return this.cells.map(function(cell) {\n var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });\n polygon.data = cell.site.data;\n return polygon;\n });\n },\n\n triangles: function() {\n var triangles = [],\n edges = this.edges;\n\n this.cells.forEach(function(cell, i) {\n if (!(m = (halfedges = cell.halfedges).length)) return;\n var site = cell.site,\n halfedges,\n j = -1,\n m,\n s0,\n e1 = edges[halfedges[m - 1]],\n s1 = e1.left === site ? e1.right : e1.left;\n\n while (++j < m) {\n s0 = s1;\n e1 = edges[halfedges[j]];\n s1 = e1.left === site ? e1.right : e1.left;\n if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {\n triangles.push([site.data, s0.data, s1.data]);\n }\n }\n });\n\n return triangles;\n },\n\n links: function() {\n return this.edges.filter(function(edge) {\n return edge.right;\n }).map(function(edge) {\n return {\n source: edge.left.data,\n target: edge.right.data\n };\n });\n },\n\n find: function(x, y, radius) {\n var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;\n\n // Use the previously-found cell, or start with an arbitrary one.\n while (!(cell = that.cells[i1])) if (++i1 >= n) return null;\n var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;\n\n // Traverse the half-edges to find a closer cell, if any.\n do {\n cell = that.cells[i0 = i1], i1 = null;\n cell.halfedges.forEach(function(e) {\n var edge = that.edges[e], v = edge.left;\n if ((v === cell.site || !v) && !(v = edge.right)) return;\n var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;\n if (v2 < d2) d2 = v2, i1 = v.index;\n });\n } while (i1 !== null);\n\n that._found = i0;\n\n return radius == null || d2 <= radius * radius ? cell.site : null;\n }\n}\n","import constant from \"./constant\";\nimport {x as pointX, y as pointY} from \"./point\";\nimport Diagram, {epsilon} from \"./Diagram\";\n\nexport default function() {\n var x = pointX,\n y = pointY,\n extent = null;\n\n function voronoi(data) {\n return new Diagram(data.map(function(d, i) {\n var s = [Math.round(x(d, i, data) / epsilon) * epsilon, Math.round(y(d, i, data) / epsilon) * epsilon];\n s.index = i;\n s.data = d;\n return s;\n }), extent);\n }\n\n voronoi.polygons = function(data) {\n return voronoi(data).polygons();\n };\n\n voronoi.links = function(data) {\n return voronoi(data).links();\n };\n\n voronoi.triangles = function(data) {\n return voronoi(data).triangles();\n };\n\n voronoi.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), voronoi) : x;\n };\n\n voronoi.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), voronoi) : y;\n };\n\n voronoi.extent = function(_) {\n return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];\n };\n\n voronoi.size = function(_) {\n return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];\n };\n\n return voronoi;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function ZoomEvent(target, type, transform) {\n this.target = target;\n this.type = type;\n this.transform = transform;\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n","import {event} from \"d3-selection\";\n\nexport function nopropagation() {\n event.stopImmediatePropagation();\n}\n\nexport default function() {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {event, customEvent, select, mouse, touch} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta() {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled)\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p);\n };\n\n zoom.scaleTo = function(selection, k, p) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p);\n };\n\n zoom.translateBy = function(selection, x, y) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n });\n };\n\n zoom.translateTo = function(selection, x, y, p) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function wheeled() {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, arguments),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = mouse(this);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent();\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var g = gesture(this, arguments, true),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = mouse(this),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation();\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved() {\n noevent();\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped() {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent();\n g.end();\n }\n }\n\n function dblclicked() {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = mouse(this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);\n\n noevent();\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);\n else select(this).call(zoom.transform, t1);\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, arguments, event.changedTouches.length === n),\n started, i, t, p;\n\n nopropagation();\n for (i = 0; i < n; ++i) {\n t = touches[i], p = touch(this, touches, t.identifier);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved() {\n if (!this.__zooming) return;\n var g = gesture(this, arguments),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent();\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n g.taps = 0;\n for (i = 0; i < n; ++i) {\n t = touches[i], p = touch(this, touches, t.identifier);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended() {\n if (!this.__zooming) return;\n var g = gesture(this, arguments),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation();\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n return zoom;\n}\n","export {version} from \"./dist/package.js\";\nexport * from \"d3-array\";\nexport * from \"d3-axis\";\nexport * from \"d3-brush\";\nexport * from \"d3-chord\";\nexport * from \"d3-collection\";\nexport * from \"d3-color\";\nexport * from \"d3-contour\";\nexport * from \"d3-dispatch\";\nexport * from \"d3-drag\";\nexport * from \"d3-dsv\";\nexport * from \"d3-ease\";\nexport * from \"d3-fetch\";\nexport * from \"d3-force\";\nexport * from \"d3-format\";\nexport * from \"d3-geo\";\nexport * from \"d3-hierarchy\";\nexport * from \"d3-interpolate\";\nexport * from \"d3-path\";\nexport * from \"d3-polygon\";\nexport * from \"d3-quadtree\";\nexport * from \"d3-random\";\nexport * from \"d3-scale\";\nexport * from \"d3-scale-chromatic\";\nexport * from \"d3-selection\";\nexport * from \"d3-shape\";\nexport * from \"d3-time\";\nexport * from \"d3-time-format\";\nexport * from \"d3-timer\";\nexport * from \"d3-transition\";\nexport * from \"d3-voronoi\";\nexport * from \"d3-zoom\";\n","\"use strict\";\n/* EXPORT */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./methods\"));\n","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,5],$V3=[1,7],$V4=[2,5],$V5=[1,15],$V6=[1,17],$V7=[1,18],$V8=[1,20],$V9=[1,21],$Va=[1,22],$Vb=[1,24],$Vc=[1,25],$Vd=[1,26],$Ve=[1,27],$Vf=[1,28],$Vg=[1,29],$Vh=[1,32],$Vi=[1,33],$Vj=[1,36],$Vk=[1,4,5,16,21,22,23,25,27,28,29,30,31,33,35,36,37,48,58],$Vl=[1,44],$Vm=[4,5,16,21,22,23,25,27,28,29,30,31,33,37,48,58],$Vn=[4,5,16,21,22,23,25,27,28,29,30,31,33,36,37,48,58],$Vo=[4,5,16,21,22,23,25,27,28,29,30,31,33,35,37,48,58],$Vp=[46,47,48],$Vq=[1,4,5,7,16,21,22,23,25,27,28,29,30,31,33,35,36,37,48,58];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"SPACE\":4,\"NEWLINE\":5,\"directive\":6,\"SD\":7,\"document\":8,\"line\":9,\"statement\":10,\"openDirective\":11,\"typeDirective\":12,\"closeDirective\":13,\":\":14,\"argDirective\":15,\"participant\":16,\"actor\":17,\"AS\":18,\"restOfLine\":19,\"signal\":20,\"autonumber\":21,\"activate\":22,\"deactivate\":23,\"note_statement\":24,\"title\":25,\"text2\":26,\"loop\":27,\"end\":28,\"rect\":29,\"opt\":30,\"alt\":31,\"else_sections\":32,\"par\":33,\"par_sections\":34,\"and\":35,\"else\":36,\"note\":37,\"placement\":38,\"over\":39,\"actor_pair\":40,\"spaceList\":41,\",\":42,\"left_of\":43,\"right_of\":44,\"signaltype\":45,\"+\":46,\"-\":47,\"ACTOR\":48,\"SOLID_OPEN_ARROW\":49,\"DOTTED_OPEN_ARROW\":50,\"SOLID_ARROW\":51,\"DOTTED_ARROW\":52,\"SOLID_CROSS\":53,\"DOTTED_CROSS\":54,\"SOLID_POINT\":55,\"DOTTED_POINT\":56,\"TXT\":57,\"open_directive\":58,\"type_directive\":59,\"arg_directive\":60,\"close_directive\":61,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACE\",5:\"NEWLINE\",7:\"SD\",14:\":\",16:\"participant\",18:\"AS\",19:\"restOfLine\",21:\"autonumber\",22:\"activate\",23:\"deactivate\",25:\"title\",27:\"loop\",28:\"end\",29:\"rect\",30:\"opt\",31:\"alt\",33:\"par\",35:\"and\",36:\"else\",37:\"note\",39:\"over\",42:\",\",43:\"left_of\",44:\"right_of\",46:\"+\",47:\"-\",48:\"ACTOR\",49:\"SOLID_OPEN_ARROW\",50:\"DOTTED_OPEN_ARROW\",51:\"SOLID_ARROW\",52:\"DOTTED_ARROW\",53:\"SOLID_CROSS\",54:\"DOTTED_CROSS\",55:\"SOLID_POINT\",56:\"DOTTED_POINT\",57:\"TXT\",58:\"open_directive\",59:\"type_directive\",60:\"arg_directive\",61:\"close_directive\"},\nproductions_: [0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[6,4],[6,6],[10,5],[10,3],[10,2],[10,1],[10,3],[10,3],[10,2],[10,3],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[34,1],[34,4],[32,1],[32,4],[24,4],[24,4],[41,2],[41,1],[40,3],[40,1],[38,1],[38,1],[20,5],[20,5],[20,4],[17,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[26,1],[11,1],[12,1],[15,1],[13,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 4:\n yy.apply($$[$0]);return $$[$0]; \nbreak;\ncase 5:\n this.$ = [] \nbreak;\ncase 6:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 7: case 8:\n this.$ = $$[$0] \nbreak;\ncase 9:\n this.$=[]; \nbreak;\ncase 12:\n$$[$0-3].description=yy.parseMessage($$[$0-1]); this.$=$$[$0-3];\nbreak;\ncase 13:\nthis.$=$$[$0-1];\nbreak;\ncase 15:\nyy.enableSequenceNumbers()\nbreak;\ncase 16:\nthis.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]};\nbreak;\ncase 17:\nthis.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1]};\nbreak;\ncase 19:\nthis.$=[{type:'setTitle', text:$$[$0-1]}]\nbreak;\ncase 20:\n\n\t\t$$[$0-1].unshift({type: 'loopStart', loopText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.LOOP_START});\n\t\t$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 21:\n\n\t\t$$[$0-1].unshift({type: 'rectStart', color:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.RECT_START });\n\t\t$$[$0-1].push({type: 'rectEnd', color:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.RECT_END });\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 22:\n\n\t\t$$[$0-1].unshift({type: 'optStart', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.OPT_START});\n\t\t$$[$0-1].push({type: 'optEnd', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.OPT_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 23:\n\n\t\t// Alt start\n\t\t$$[$0-1].unshift({type: 'altStart', altText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.ALT_START});\n\t\t// Content in alt is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 24:\n\n\t\t// Parallel start\n\t\t$$[$0-1].unshift({type: 'parStart', parText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.PAR_START});\n\t\t// Content in par is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 27:\n this.$ = $$[$0-3].concat([{type: 'and', parText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.PAR_AND}, $$[$0]]); \nbreak;\ncase 29:\n this.$ = $$[$0-3].concat([{type: 'else', altText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]); \nbreak;\ncase 30:\n\n\t\tthis.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];\nbreak;\ncase 31:\n\n\t\t// Coerce actor_pair into a [to, from, ...] array\n\t\t$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);\n\t\t$$[$0-2][0] = $$[$0-2][0].actor;\n\t\t$$[$0-2][1] = $$[$0-2][1].actor;\n\t\tthis.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];\nbreak;\ncase 34:\n this.$ = [$$[$0-2], $$[$0]]; \nbreak;\ncase 35:\n this.$ = $$[$0]; \nbreak;\ncase 36:\n this.$ = yy.PLACEMENT.LEFTOF; \nbreak;\ncase 37:\n this.$ = yy.PLACEMENT.RIGHTOF; \nbreak;\ncase 38:\n this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},\n\t {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]}\n\t ]\nbreak;\ncase 39:\n this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},\n\t {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4]}\n\t ]\nbreak;\ncase 40:\n this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]\nbreak;\ncase 41:\nthis.$={type: 'addActor', actor:$$[$0]}\nbreak;\ncase 42:\n this.$ = yy.LINETYPE.SOLID_OPEN; \nbreak;\ncase 43:\n this.$ = yy.LINETYPE.DOTTED_OPEN; \nbreak;\ncase 44:\n this.$ = yy.LINETYPE.SOLID; \nbreak;\ncase 45:\n this.$ = yy.LINETYPE.DOTTED; \nbreak;\ncase 46:\n this.$ = yy.LINETYPE.SOLID_CROSS; \nbreak;\ncase 47:\n this.$ = yy.LINETYPE.DOTTED_CROSS; \nbreak;\ncase 48:\n this.$ = yy.LINETYPE.SOLID_POINT; \nbreak;\ncase 49:\n this.$ = yy.LINETYPE.DOTTED_POINT; \nbreak;\ncase 50:\nthis.$ = yy.parseMessage($$[$0].trim().substring(1)) \nbreak;\ncase 51:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 52:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 53:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 54:\n yy.parseDirective('}%%', 'close_directive', 'sequence'); \nbreak;\n}\n},\ntable: [{3:1,4:$V0,5:$V1,6:4,7:$V2,11:6,58:$V3},{1:[3]},{3:8,4:$V0,5:$V1,6:4,7:$V2,11:6,58:$V3},{3:9,4:$V0,5:$V1,6:4,7:$V2,11:6,58:$V3},{3:10,4:$V0,5:$V1,6:4,7:$V2,11:6,58:$V3},o([1,4,5,16,21,22,23,25,27,29,30,31,33,37,48,58],$V4,{8:11}),{12:12,59:[1,13]},{59:[2,51]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,58:$V3},{13:34,14:[1,35],61:$Vj},o([14,61],[2,52]),o($Vk,[2,6]),{6:30,10:37,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,58:$V3},o($Vk,[2,8]),o($Vk,[2,9]),{17:38,48:$Vi},{5:[1,39]},o($Vk,[2,15]),{17:40,48:$Vi},{17:41,48:$Vi},{5:[1,42]},{26:43,57:$Vl},{19:[1,45]},{19:[1,46]},{19:[1,47]},{19:[1,48]},{19:[1,49]},o($Vk,[2,25]),{45:50,49:[1,51],50:[1,52],51:[1,53],52:[1,54],53:[1,55],54:[1,56],55:[1,57],56:[1,58]},{38:59,39:[1,60],43:[1,61],44:[1,62]},o([5,18,42,49,50,51,52,53,54,55,56,57],[2,41]),{5:[1,63]},{15:64,60:[1,65]},{5:[2,54]},o($Vk,[2,7]),{5:[1,67],18:[1,66]},o($Vk,[2,14]),{5:[1,68]},{5:[1,69]},o($Vk,[2,18]),{5:[1,70]},{5:[2,50]},o($Vm,$V4,{8:71}),o($Vm,$V4,{8:72}),o($Vm,$V4,{8:73}),o($Vn,$V4,{32:74,8:75}),o($Vo,$V4,{34:76,8:77}),{17:80,46:[1,78],47:[1,79],48:$Vi},o($Vp,[2,42]),o($Vp,[2,43]),o($Vp,[2,44]),o($Vp,[2,45]),o($Vp,[2,46]),o($Vp,[2,47]),o($Vp,[2,48]),o($Vp,[2,49]),{17:81,48:$Vi},{17:83,40:82,48:$Vi},{48:[2,36]},{48:[2,37]},o($Vq,[2,10]),{13:84,61:$Vj},{61:[2,53]},{19:[1,85]},o($Vk,[2,13]),o($Vk,[2,16]),o($Vk,[2,17]),o($Vk,[2,19]),{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[1,86],29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,58:$V3},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[1,87],29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,58:$V3},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[1,88],29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,58:$V3},{28:[1,89]},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[2,28],29:$Vd,30:$Ve,31:$Vf,33:$Vg,36:[1,90],37:$Vh,48:$Vi,58:$V3},{28:[1,91]},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[2,26],29:$Vd,30:$Ve,31:$Vf,33:$Vg,35:[1,92],37:$Vh,48:$Vi,58:$V3},{17:93,48:$Vi},{17:94,48:$Vi},{26:95,57:$Vl},{26:96,57:$Vl},{26:97,57:$Vl},{42:[1,98],57:[2,35]},{5:[1,99]},{5:[1,100]},o($Vk,[2,20]),o($Vk,[2,21]),o($Vk,[2,22]),o($Vk,[2,23]),{19:[1,101]},o($Vk,[2,24]),{19:[1,102]},{26:103,57:$Vl},{26:104,57:$Vl},{5:[2,40]},{5:[2,30]},{5:[2,31]},{17:105,48:$Vi},o($Vq,[2,11]),o($Vk,[2,12]),o($Vn,$V4,{8:75,32:106}),o($Vo,$V4,{8:77,34:107}),{5:[2,38]},{5:[2,39]},{57:[2,34]},{28:[2,29]},{28:[2,27]}],\ndefaultActions: {7:[2,51],8:[2,1],9:[2,2],10:[2,3],36:[2,54],44:[2,50],61:[2,36],62:[2,37],65:[2,53],95:[2,40],96:[2,30],97:[2,31],103:[2,38],104:[2,39],105:[2,34],106:[2,29],107:[2,27]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 58; \nbreak;\ncase 1: this.begin('type_directive'); return 59; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 14; \nbreak;\ncase 3: this.popState(); this.popState(); return 61; \nbreak;\ncase 4:return 60;\nbreak;\ncase 5:return 5;\nbreak;\ncase 6:/* skip all whitespace */\nbreak;\ncase 7:/* skip same-line whitespace */\nbreak;\ncase 8:/* skip comments */\nbreak;\ncase 9:/* skip comments */\nbreak;\ncase 10:/* skip comments */\nbreak;\ncase 11: this.begin('ID'); return 16; \nbreak;\ncase 12: yy_.yytext = yy_.yytext.trim(); this.begin('ALIAS'); return 48; \nbreak;\ncase 13: this.popState(); this.popState(); this.begin('LINE'); return 18; \nbreak;\ncase 14: this.popState(); this.popState(); return 5; \nbreak;\ncase 15: this.begin('LINE'); return 27; \nbreak;\ncase 16: this.begin('LINE'); return 29; \nbreak;\ncase 17: this.begin('LINE'); return 30; \nbreak;\ncase 18: this.begin('LINE'); return 31; \nbreak;\ncase 19: this.begin('LINE'); return 36; \nbreak;\ncase 20: this.begin('LINE'); return 33; \nbreak;\ncase 21: this.begin('LINE'); return 35; \nbreak;\ncase 22: this.popState(); return 19; \nbreak;\ncase 23:return 28;\nbreak;\ncase 24:return 43;\nbreak;\ncase 25:return 44;\nbreak;\ncase 26:return 39;\nbreak;\ncase 27:return 37;\nbreak;\ncase 28: this.begin('ID'); return 22; \nbreak;\ncase 29: this.begin('ID'); return 23; \nbreak;\ncase 30:return 25;\nbreak;\ncase 31:return 7;\nbreak;\ncase 32:return 21;\nbreak;\ncase 33:return 42;\nbreak;\ncase 34:return 5;\nbreak;\ncase 35: yy_.yytext = yy_.yytext.trim(); return 48; \nbreak;\ncase 36:return 51;\nbreak;\ncase 37:return 52;\nbreak;\ncase 38:return 49;\nbreak;\ncase 39:return 50;\nbreak;\ncase 40:return 53;\nbreak;\ncase 41:return 54;\nbreak;\ncase 42:return 55;\nbreak;\ncase 43:return 56;\nbreak;\ncase 44:return 57;\nbreak;\ncase 45:return 46;\nbreak;\ncase 46:return 47;\nbreak;\ncase 47:return 5;\nbreak;\ncase 48:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:((?:(?!\\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\\}%%)/i,/^(?:((?:(?!\\}%%).|\\n)*))/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:((?!\\n)\\s)+)/i,/^(?:#[^\\n]*)/i,/^(?:%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:participant\\b)/i,/^(?:[^\\->:\\n,;]+?(?=((?!\\n)\\s)+as(?!\\n)\\s|[#\\n;]|$))/i,/^(?:as\\b)/i,/^(?:(?:))/i,/^(?:loop\\b)/i,/^(?:rect\\b)/i,/^(?:opt\\b)/i,/^(?:alt\\b)/i,/^(?:else\\b)/i,/^(?:par\\b)/i,/^(?:and\\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\\n;]*)/i,/^(?:end\\b)/i,/^(?:left of\\b)/i,/^(?:right of\\b)/i,/^(?:over\\b)/i,/^(?:note\\b)/i,/^(?:activate\\b)/i,/^(?:deactivate\\b)/i,/^(?:title\\b)/i,/^(?:sequenceDiagram\\b)/i,/^(?:autonumber\\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\\+\\->:\\n,;]+((?!(-x|--x|-\\)|--\\)))[\\-]*[^\\+\\->:\\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\\)])/i,/^(?:--[\\)])/i,/^(?::(?:(?:no)?wrap)?[^#\\n;]+)/i,/^(?:\\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"open_directive\":{\"rules\":[1,8],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3,8],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4,8],\"inclusive\":false},\"ID\":{\"rules\":[7,8,12],\"inclusive\":false},\"ALIAS\":{\"rules\":[7,8,13,14],\"inclusive\":false},\"LINE\":{\"rules\":[7,8,22],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,8,9,10,11,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/**\n * Copyright (c) 2014, Chris Pettitt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar lib = require(\"./lib\");\n\nmodule.exports = {\n Graph: lib.Graph,\n json: require(\"./lib/json\"),\n alg: require(\"./lib/alg\"),\n version: lib.version\n};\n","/* global window */\n\nvar lodash;\n\nif (typeof require === \"function\") {\n try {\n lodash = {\n cloneDeep: require(\"lodash/cloneDeep\"),\n constant: require(\"lodash/constant\"),\n defaults: require(\"lodash/defaults\"),\n each: require(\"lodash/each\"),\n filter: require(\"lodash/filter\"),\n find: require(\"lodash/find\"),\n flatten: require(\"lodash/flatten\"),\n forEach: require(\"lodash/forEach\"),\n forIn: require(\"lodash/forIn\"),\n has: require(\"lodash/has\"),\n isUndefined: require(\"lodash/isUndefined\"),\n last: require(\"lodash/last\"),\n map: require(\"lodash/map\"),\n mapValues: require(\"lodash/mapValues\"),\n max: require(\"lodash/max\"),\n merge: require(\"lodash/merge\"),\n min: require(\"lodash/min\"),\n minBy: require(\"lodash/minBy\"),\n now: require(\"lodash/now\"),\n pick: require(\"lodash/pick\"),\n range: require(\"lodash/range\"),\n reduce: require(\"lodash/reduce\"),\n sortBy: require(\"lodash/sortBy\"),\n uniqueId: require(\"lodash/uniqueId\"),\n values: require(\"lodash/values\"),\n zipObject: require(\"lodash/zipObject\"),\n };\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!lodash) {\n lodash = window._;\n}\n\nmodule.exports = lodash;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * @license\n * Copyright (c) 2012-2013 Chris Pettitt\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nmodule.exports = {\n graphlib: require(\"./lib/graphlib\"),\n dagre: require(\"./lib/dagre\"),\n intersect: require(\"./lib/intersect\"),\n render: require(\"./lib/render\"),\n util: require(\"./lib/util\"),\n version: require(\"./lib/version\")\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/* eslint \"no-console\": off */\n\n\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar Graph = require(\"./graphlib\").Graph;\n\nmodule.exports = {\n addDummyNode: addDummyNode,\n simplify: simplify,\n asNonCompoundGraph: asNonCompoundGraph,\n successorWeights: successorWeights,\n predecessorWeights: predecessorWeights,\n intersectRect: intersectRect,\n buildLayerMatrix: buildLayerMatrix,\n normalizeRanks: normalizeRanks,\n removeEmptyRanks: removeEmptyRanks,\n addBorderNode: addBorderNode,\n maxRank: maxRank,\n partition: partition,\n time: time,\n notime: notime\n};\n\n/*\n * Adds a dummy node to the graph and return v.\n */\nfunction addDummyNode(g, type, attrs, name) {\n var v;\n do {\n v = _.uniqueId(name);\n } while (g.hasNode(v));\n\n attrs.dummy = type;\n g.setNode(v, attrs);\n return v;\n}\n\n/*\n * Returns a new graph with only simple edges. Handles aggregation of data\n * associated with multi-edges.\n */\nfunction simplify(g) {\n var simplified = new Graph().setGraph(g.graph());\n _.forEach(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\n _.forEach(g.edges(), function(e) {\n var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };\n var label = g.edge(e);\n simplified.setEdge(e.v, e.w, {\n weight: simpleLabel.weight + label.weight,\n minlen: Math.max(simpleLabel.minlen, label.minlen)\n });\n });\n return simplified;\n}\n\nfunction asNonCompoundGraph(g) {\n var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\n _.forEach(g.nodes(), function(v) {\n if (!g.children(v).length) {\n simplified.setNode(v, g.node(v));\n }\n });\n _.forEach(g.edges(), function(e) {\n simplified.setEdge(e, g.edge(e));\n });\n return simplified;\n}\n\nfunction successorWeights(g) {\n var weightMap = _.map(g.nodes(), function(v) {\n var sucs = {};\n _.forEach(g.outEdges(v), function(e) {\n sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\n });\n return sucs;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\nfunction predecessorWeights(g) {\n var weightMap = _.map(g.nodes(), function(v) {\n var preds = {};\n _.forEach(g.inEdges(v), function(e) {\n preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\n });\n return preds;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\n/*\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\n */\nfunction intersectRect(rect, point) {\n var x = rect.x;\n var y = rect.y;\n\n // Rectangle intersection algorithm from:\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = rect.width / 2;\n var h = rect.height / 2;\n\n if (!dx && !dy) {\n throw new Error(\"Not possible to find intersection inside of the rectangle\");\n }\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = h * dx / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = w * dy / dx;\n }\n\n return { x: x + sx, y: y + sy };\n}\n\n/*\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\n * function will produce a matrix with the ids of each node.\n */\nfunction buildLayerMatrix(g) {\n var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n var rank = node.rank;\n if (!_.isUndefined(rank)) {\n layering[rank][node.order] = v;\n }\n });\n return layering;\n}\n\n/*\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\n */\nfunction normalizeRanks(g) {\n var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (_.has(node, \"rank\")) {\n node.rank -= min;\n }\n });\n}\n\nfunction removeEmptyRanks(g) {\n // Ranks may not start at 0, so we need to offset them\n var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\n\n var layers = [];\n _.forEach(g.nodes(), function(v) {\n var rank = g.node(v).rank - offset;\n if (!layers[rank]) {\n layers[rank] = [];\n }\n layers[rank].push(v);\n });\n\n var delta = 0;\n var nodeRankFactor = g.graph().nodeRankFactor;\n _.forEach(layers, function(vs, i) {\n if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\n --delta;\n } else if (delta) {\n _.forEach(vs, function(v) { g.node(v).rank += delta; });\n }\n });\n}\n\nfunction addBorderNode(g, prefix, rank, order) {\n var node = {\n width: 0,\n height: 0\n };\n if (arguments.length >= 4) {\n node.rank = rank;\n node.order = order;\n }\n return addDummyNode(g, \"border\", node, prefix);\n}\n\nfunction maxRank(g) {\n return _.max(_.map(g.nodes(), function(v) {\n var rank = g.node(v).rank;\n if (!_.isUndefined(rank)) {\n return rank;\n }\n }));\n}\n\n/*\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\n * into `rhs.\n */\nfunction partition(collection, fn) {\n var result = { lhs: [], rhs: [] };\n _.forEach(collection, function(value) {\n if (fn(value)) {\n result.lhs.push(value);\n } else {\n result.rhs.push(value);\n }\n });\n return result;\n}\n\n/*\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\n * time it takes to execute the function.\n */\nfunction time(name, fn) {\n var start = _.now();\n try {\n return fn();\n } finally {\n console.log(name + \" time: \" + (_.now() - start) + \"ms\");\n }\n}\n\nfunction notime(name, fn) {\n return fn();\n}\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\nvar lang_1 = require(\"./lang\");\nvar unit_1 = require(\"./unit\");\n/* UTILS */\nvar Utils = {\n channel: channel_1.default,\n lang: lang_1.default,\n unit: unit_1.default\n};\n/* EXPORT */\nexports.default = Utils;\n","/* global window */\n\nvar lodash;\n\nif (typeof require === \"function\") {\n try {\n lodash = {\n clone: require(\"lodash/clone\"),\n constant: require(\"lodash/constant\"),\n each: require(\"lodash/each\"),\n filter: require(\"lodash/filter\"),\n has: require(\"lodash/has\"),\n isArray: require(\"lodash/isArray\"),\n isEmpty: require(\"lodash/isEmpty\"),\n isFunction: require(\"lodash/isFunction\"),\n isUndefined: require(\"lodash/isUndefined\"),\n keys: require(\"lodash/keys\"),\n map: require(\"lodash/map\"),\n reduce: require(\"lodash/reduce\"),\n size: require(\"lodash/size\"),\n transform: require(\"lodash/transform\"),\n union: require(\"lodash/union\"),\n values: require(\"lodash/values\")\n };\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!lodash) {\n lodash = window._;\n}\n\nmodule.exports = lodash;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var _ = require(\"./lodash\");\n\n// Public utility functions\nmodule.exports = {\n isSubgraph: isSubgraph,\n edgeToId: edgeToId,\n applyStyle: applyStyle,\n applyClass: applyClass,\n applyTransition: applyTransition\n};\n\n/*\n * Returns true if the specified node in the graph is a subgraph node. A\n * subgraph node is one that contains other nodes.\n */\nfunction isSubgraph(g, v) {\n return !!g.children(v).length;\n}\n\nfunction edgeToId(e) {\n return escapeId(e.v) + \":\" + escapeId(e.w) + \":\" + escapeId(e.name);\n}\n\nvar ID_DELIM = /:/g;\nfunction escapeId(str) {\n return str ? String(str).replace(ID_DELIM, \"\\\\:\") : \"\";\n}\n\nfunction applyStyle(dom, styleFn) {\n if (styleFn) {\n dom.attr(\"style\", styleFn);\n }\n}\n\nfunction applyClass(dom, classFn, otherClasses) {\n if (classFn) {\n dom\n .attr(\"class\", classFn)\n .attr(\"class\", otherClasses + \" \" + dom.attr(\"class\"));\n }\n}\n\nfunction applyTransition(selection, g) {\n var graph = g.graph();\n\n if (_.isPlainObject(graph)) {\n var transition = graph.transition;\n if (_.isFunction(transition)) {\n return transition(selection);\n }\n }\n\n return selection;\n}\n","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,7],$V1=[1,6],$V2=[1,14],$V3=[1,25],$V4=[1,28],$V5=[1,26],$V6=[1,27],$V7=[1,29],$V8=[1,30],$V9=[1,31],$Va=[1,32],$Vb=[1,34],$Vc=[1,35],$Vd=[1,36],$Ve=[10,19],$Vf=[1,48],$Vg=[1,49],$Vh=[1,50],$Vi=[1,51],$Vj=[1,52],$Vk=[1,53],$Vl=[10,19,25,32,33,41,44,45,46,47,48,49,54,56],$Vm=[10,19,23,25,32,33,37,41,44,45,46,47,48,49,54,56,71,72,73],$Vn=[10,13,17,19],$Vo=[41,71,72,73],$Vp=[41,48,49,71,72,73],$Vq=[41,44,45,46,47,71,72,73],$Vr=[10,19,25],$Vs=[1,85];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mermaidDoc\":4,\"directive\":5,\"graphConfig\":6,\"openDirective\":7,\"typeDirective\":8,\"closeDirective\":9,\"NEWLINE\":10,\":\":11,\"argDirective\":12,\"open_directive\":13,\"type_directive\":14,\"arg_directive\":15,\"close_directive\":16,\"CLASS_DIAGRAM\":17,\"statements\":18,\"EOF\":19,\"statement\":20,\"className\":21,\"alphaNumToken\":22,\"GENERICTYPE\":23,\"relationStatement\":24,\"LABEL\":25,\"classStatement\":26,\"methodStatement\":27,\"annotationStatement\":28,\"clickStatement\":29,\"cssClassStatement\":30,\"CLASS\":31,\"STYLE_SEPARATOR\":32,\"STRUCT_START\":33,\"members\":34,\"STRUCT_STOP\":35,\"ANNOTATION_START\":36,\"ANNOTATION_END\":37,\"MEMBER\":38,\"SEPARATOR\":39,\"relation\":40,\"STR\":41,\"relationType\":42,\"lineType\":43,\"AGGREGATION\":44,\"EXTENSION\":45,\"COMPOSITION\":46,\"DEPENDENCY\":47,\"LINE\":48,\"DOTTED_LINE\":49,\"CALLBACK\":50,\"LINK\":51,\"LINK_TARGET\":52,\"CLICK\":53,\"CALLBACK_NAME\":54,\"CALLBACK_ARGS\":55,\"HREF\":56,\"CSSCLASS\":57,\"commentToken\":58,\"textToken\":59,\"graphCodeTokens\":60,\"textNoTagsToken\":61,\"TAGSTART\":62,\"TAGEND\":63,\"==\":64,\"--\":65,\"PCT\":66,\"DEFAULT\":67,\"SPACE\":68,\"MINUS\":69,\"keywords\":70,\"UNICODE_TEXT\":71,\"NUM\":72,\"ALPHA\":73,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",10:\"NEWLINE\",11:\":\",13:\"open_directive\",14:\"type_directive\",15:\"arg_directive\",16:\"close_directive\",17:\"CLASS_DIAGRAM\",19:\"EOF\",23:\"GENERICTYPE\",25:\"LABEL\",31:\"CLASS\",32:\"STYLE_SEPARATOR\",33:\"STRUCT_START\",35:\"STRUCT_STOP\",36:\"ANNOTATION_START\",37:\"ANNOTATION_END\",38:\"MEMBER\",39:\"SEPARATOR\",41:\"STR\",44:\"AGGREGATION\",45:\"EXTENSION\",46:\"COMPOSITION\",47:\"DEPENDENCY\",48:\"LINE\",49:\"DOTTED_LINE\",50:\"CALLBACK\",51:\"LINK\",52:\"LINK_TARGET\",53:\"CLICK\",54:\"CALLBACK_NAME\",55:\"CALLBACK_ARGS\",56:\"HREF\",57:\"CSSCLASS\",60:\"graphCodeTokens\",62:\"TAGSTART\",63:\"TAGEND\",64:\"==\",65:\"--\",66:\"PCT\",67:\"DEFAULT\",68:\"SPACE\",69:\"MINUS\",70:\"keywords\",71:\"UNICODE_TEXT\",72:\"NUM\",73:\"ALPHA\"},\nproductions_: [0,[3,1],[3,2],[4,1],[5,4],[5,6],[7,1],[8,1],[12,1],[9,1],[6,4],[18,1],[18,2],[18,3],[21,1],[21,2],[21,3],[21,2],[20,1],[20,2],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[26,2],[26,4],[26,5],[26,7],[28,4],[34,1],[34,2],[27,1],[27,2],[27,1],[27,1],[24,3],[24,4],[24,4],[24,5],[40,3],[40,2],[40,2],[40,1],[42,1],[42,1],[42,1],[42,1],[43,1],[43,1],[29,3],[29,4],[29,3],[29,4],[29,4],[29,5],[29,3],[29,4],[29,4],[29,5],[29,3],[29,4],[29,4],[29,5],[30,3],[58,1],[58,1],[59,1],[59,1],[59,1],[59,1],[59,1],[59,1],[59,1],[61,1],[61,1],[61,1],[61,1],[22,1],[22,1],[22,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 6:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 7:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 8:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 9:\n yy.parseDirective('}%%', 'close_directive', 'class'); \nbreak;\ncase 14:\n this.$=$$[$0]; \nbreak;\ncase 15:\n this.$=$$[$0-1]+$$[$0]; \nbreak;\ncase 16:\n this.$=$$[$0-2]+'~'+$$[$0-1]+$$[$0]; \nbreak;\ncase 17:\n this.$=$$[$0-1]+'~'+$$[$0]; \nbreak;\ncase 18:\n yy.addRelation($$[$0]); \nbreak;\ncase 19:\n $$[$0-1].title = yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]); \nbreak;\ncase 26:\nyy.addClass($$[$0]);\nbreak;\ncase 27:\nyy.addClass($$[$0-2]);yy.setCssClass($$[$0-2], $$[$0]);\nbreak;\ncase 28:\n/*console.log($$[$0-3],JSON.stringify($$[$0-1]));*/yy.addClass($$[$0-3]);yy.addMembers($$[$0-3],$$[$0-1]);\nbreak;\ncase 29:\nyy.addClass($$[$0-5]);yy.setCssClass($$[$0-5], $$[$0-3]);yy.addMembers($$[$0-5],$$[$0-1]);\nbreak;\ncase 30:\n yy.addAnnotation($$[$0],$$[$0-2]); \nbreak;\ncase 31:\n this.$ = [$$[$0]]; \nbreak;\ncase 32:\n $$[$0].push($$[$0-1]);this.$=$$[$0];\nbreak;\ncase 33:\n/*console.log('Rel found',$$[$0]);*/\nbreak;\ncase 34:\nyy.addMember($$[$0-1],yy.cleanupLabel($$[$0]));\nbreak;\ncase 35:\n/*console.warn('Member',$$[$0]);*/\nbreak;\ncase 36:\n/*console.log('sep found',$$[$0]);*/\nbreak;\ncase 37:\n this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'}; \nbreak;\ncase 38:\n this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'}\nbreak;\ncase 39:\n this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]}; \nbreak;\ncase 40:\n this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]} \nbreak;\ncase 41:\n this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]}; \nbreak;\ncase 42:\n this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]}; \nbreak;\ncase 43:\n this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]}; \nbreak;\ncase 44:\n this.$={type1:'none',type2:'none',lineType:$$[$0]}; \nbreak;\ncase 45:\n this.$=yy.relationType.AGGREGATION;\nbreak;\ncase 46:\n this.$=yy.relationType.EXTENSION;\nbreak;\ncase 47:\n this.$=yy.relationType.COMPOSITION;\nbreak;\ncase 48:\n this.$=yy.relationType.DEPENDENCY;\nbreak;\ncase 49:\nthis.$=yy.lineType.LINE;\nbreak;\ncase 50:\nthis.$=yy.lineType.DOTTED_LINE;\nbreak;\ncase 51: case 57:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-1], $$[$0]);\nbreak;\ncase 52: case 58:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-2], $$[$0]);\nbreak;\ncase 53: case 61:\nthis.$ = $$[$0-2];yy.setLink($$[$0-1], $$[$0]);\nbreak;\ncase 54:\nthis.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1],$$[$0]);\nbreak;\ncase 55: case 63:\nthis.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-2], $$[$0]);\nbreak;\ncase 56: case 64:\nthis.$ = $$[$0-4];yy.setLink($$[$0-3], $$[$0-2], $$[$0]);yy.setTooltip($$[$0-3], $$[$0-1]);\nbreak;\ncase 59:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 60:\nthis.$ = $$[$0-4];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 62:\nthis.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 65:\nyy.setCssClass($$[$0-1], $$[$0]);\nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:4,7:5,13:$V0,17:$V1},{1:[3]},{1:[2,1]},{3:8,4:2,5:3,6:4,7:5,13:$V0,17:$V1},{1:[2,3]},{8:9,14:[1,10]},{10:[1,11]},{14:[2,6]},{1:[2,2]},{9:12,11:[1,13],16:$V2},o([11,16],[2,7]),{5:23,7:5,13:$V0,18:15,20:16,21:24,22:33,24:17,26:18,27:19,28:20,29:21,30:22,31:$V3,36:$V4,38:$V5,39:$V6,50:$V7,51:$V8,53:$V9,57:$Va,71:$Vb,72:$Vc,73:$Vd},{10:[1,37]},{12:38,15:[1,39]},{10:[2,9]},{19:[1,40]},{10:[1,41],19:[2,11]},o($Ve,[2,18],{25:[1,42]}),o($Ve,[2,20]),o($Ve,[2,21]),o($Ve,[2,22]),o($Ve,[2,23]),o($Ve,[2,24]),o($Ve,[2,25]),o($Ve,[2,33],{40:43,42:46,43:47,25:[1,45],41:[1,44],44:$Vf,45:$Vg,46:$Vh,47:$Vi,48:$Vj,49:$Vk}),{21:54,22:33,71:$Vb,72:$Vc,73:$Vd},o($Ve,[2,35]),o($Ve,[2,36]),{22:55,71:$Vb,72:$Vc,73:$Vd},{21:56,22:33,71:$Vb,72:$Vc,73:$Vd},{21:57,22:33,71:$Vb,72:$Vc,73:$Vd},{21:58,22:33,71:$Vb,72:$Vc,73:$Vd},{41:[1,59]},o($Vl,[2,14],{22:33,21:60,23:[1,61],71:$Vb,72:$Vc,73:$Vd}),o($Vm,[2,79]),o($Vm,[2,80]),o($Vm,[2,81]),o($Vn,[2,4]),{9:62,16:$V2},{16:[2,8]},{1:[2,10]},{5:23,7:5,13:$V0,18:63,19:[2,12],20:16,21:24,22:33,24:17,26:18,27:19,28:20,29:21,30:22,31:$V3,36:$V4,38:$V5,39:$V6,50:$V7,51:$V8,53:$V9,57:$Va,71:$Vb,72:$Vc,73:$Vd},o($Ve,[2,19]),{21:64,22:33,41:[1,65],71:$Vb,72:$Vc,73:$Vd},{40:66,42:46,43:47,44:$Vf,45:$Vg,46:$Vh,47:$Vi,48:$Vj,49:$Vk},o($Ve,[2,34]),{43:67,48:$Vj,49:$Vk},o($Vo,[2,44],{42:68,44:$Vf,45:$Vg,46:$Vh,47:$Vi}),o($Vp,[2,45]),o($Vp,[2,46]),o($Vp,[2,47]),o($Vp,[2,48]),o($Vq,[2,49]),o($Vq,[2,50]),o($Ve,[2,26],{32:[1,69],33:[1,70]}),{37:[1,71]},{41:[1,72]},{41:[1,73]},{54:[1,74],56:[1,75]},{22:76,71:$Vb,72:$Vc,73:$Vd},o($Vl,[2,15]),o($Vl,[2,17],{22:33,21:77,71:$Vb,72:$Vc,73:$Vd}),{10:[1,78]},{19:[2,13]},o($Vr,[2,37]),{21:79,22:33,71:$Vb,72:$Vc,73:$Vd},{21:80,22:33,41:[1,81],71:$Vb,72:$Vc,73:$Vd},o($Vo,[2,43],{42:82,44:$Vf,45:$Vg,46:$Vh,47:$Vi}),o($Vo,[2,42]),{22:83,71:$Vb,72:$Vc,73:$Vd},{34:84,38:$Vs},{21:86,22:33,71:$Vb,72:$Vc,73:$Vd},o($Ve,[2,51],{41:[1,87]}),o($Ve,[2,53],{41:[1,89],52:[1,88]}),o($Ve,[2,57],{41:[1,90],55:[1,91]}),o($Ve,[2,61],{41:[1,93],52:[1,92]}),o($Ve,[2,65]),o($Vl,[2,16]),o($Vn,[2,5]),o($Vr,[2,39]),o($Vr,[2,38]),{21:94,22:33,71:$Vb,72:$Vc,73:$Vd},o($Vo,[2,41]),o($Ve,[2,27],{33:[1,95]}),{35:[1,96]},{34:97,35:[2,31],38:$Vs},o($Ve,[2,30]),o($Ve,[2,52]),o($Ve,[2,54]),o($Ve,[2,55],{52:[1,98]}),o($Ve,[2,58]),o($Ve,[2,59],{41:[1,99]}),o($Ve,[2,62]),o($Ve,[2,63],{52:[1,100]}),o($Vr,[2,40]),{34:101,38:$Vs},o($Ve,[2,28]),{35:[2,32]},o($Ve,[2,56]),o($Ve,[2,60]),o($Ve,[2,64]),{35:[1,102]},o($Ve,[2,29])],\ndefaultActions: {2:[2,1],4:[2,3],7:[2,6],8:[2,2],14:[2,9],39:[2,8],40:[2,10],63:[2,13],97:[2,32]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 13; \nbreak;\ncase 1: this.begin('type_directive'); return 14; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 11; \nbreak;\ncase 3: this.popState(); this.popState(); return 16; \nbreak;\ncase 4:return 15;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */\nbreak;\ncase 7:return 10;\nbreak;\ncase 8:/* skip whitespace */\nbreak;\ncase 9:return 17;\nbreak;\ncase 10:return 17;\nbreak;\ncase 11: this.begin(\"struct\"); /*console.log('Starting struct');*/ return 33;\nbreak;\ncase 12:return \"EOF_IN_STRUCT\";\nbreak;\ncase 13:return \"OPEN_IN_STRUCT\";\nbreak;\ncase 14: /*console.log('Ending struct');*/this.popState(); return 35;\nbreak;\ncase 15:/* nothing */\nbreak;\ncase 16: /*console.log('lex-member: ' + yy_.yytext);*/ return \"MEMBER\";\nbreak;\ncase 17:return 31;\nbreak;\ncase 18:return 57;\nbreak;\ncase 19:return 50;\nbreak;\ncase 20:return 51;\nbreak;\ncase 21:return 53;\nbreak;\ncase 22:return 36;\nbreak;\ncase 23:return 37;\nbreak;\ncase 24:this.begin(\"generic\");\nbreak;\ncase 25:this.popState();\nbreak;\ncase 26:return \"GENERICTYPE\";\nbreak;\ncase 27:this.begin(\"string\");\nbreak;\ncase 28:this.popState();\nbreak;\ncase 29:return \"STR\";\nbreak;\ncase 30:this.begin(\"href\");\nbreak;\ncase 31:this.popState();\nbreak;\ncase 32:return 56;\nbreak;\ncase 33:this.begin(\"callback_name\");\nbreak;\ncase 34:this.popState();\nbreak;\ncase 35:this.popState(); this.begin(\"callback_args\");\nbreak;\ncase 36:return 54;\nbreak;\ncase 37:this.popState();\nbreak;\ncase 38:return 55;\nbreak;\ncase 39:return 52;\nbreak;\ncase 40:return 52;\nbreak;\ncase 41:return 52;\nbreak;\ncase 42:return 52;\nbreak;\ncase 43:return 45;\nbreak;\ncase 44:return 45;\nbreak;\ncase 45:return 47;\nbreak;\ncase 46:return 47;\nbreak;\ncase 47:return 46;\nbreak;\ncase 48:return 44;\nbreak;\ncase 49:return 48;\nbreak;\ncase 50:return 49;\nbreak;\ncase 51:return 25;\nbreak;\ncase 52:return 32;\nbreak;\ncase 53:return 69;\nbreak;\ncase 54:return 'DOT';\nbreak;\ncase 55:return 'PLUS';\nbreak;\ncase 56:return 66;\nbreak;\ncase 57:return 'EQUALS';\nbreak;\ncase 58:return 'EQUALS';\nbreak;\ncase 59:return 73;\nbreak;\ncase 60:return 'PUNCTUATION';\nbreak;\ncase 61:return 72;\nbreak;\ncase 62:return 71;\nbreak;\ncase 63:return 68;\nbreak;\ncase 64:return 19;\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/,/^(?:((?:(?!\\}%%)[^:.])*))/,/^(?::)/,/^(?:\\}%%)/,/^(?:((?:(?!\\}%%).|\\n)*))/,/^(?:%%(?!\\{)*[^\\n]*(\\r?\\n?)+)/,/^(?:%%[^\\n]*(\\r?\\n)*)/,/^(?:(\\r?\\n)+)/,/^(?:\\s+)/,/^(?:classDiagram-v2\\b)/,/^(?:classDiagram\\b)/,/^(?:[{])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\\n])/,/^(?:[^{}\\n]*)/,/^(?:class\\b)/,/^(?:cssClass\\b)/,/^(?:callback\\b)/,/^(?:link\\b)/,/^(?:click\\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:href[\\s]+[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:call[\\s]+)/,/^(?:\\([\\s]*\\))/,/^(?:\\()/,/^(?:[^(]*)/,/^(?:\\))/,/^(?:[^)]*)/,/^(?:_self\\b)/,/^(?:_blank\\b)/,/^(?:_parent\\b)/,/^(?:_top\\b)/,/^(?:\\s*<\\|)/,/^(?:\\s*\\|>)/,/^(?:\\s*>)/,/^(?:\\s*<)/,/^(?:\\s*\\*)/,/^(?:\\s*o\\b)/,/^(?:--)/,/^(?:\\.\\.)/,/^(?::{1}[^:\\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\\.)/,/^(?:\\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\\w+)/,/^(?:[!\"#$%&'*+,-.`?\\\\/])/,/^(?:[0-9]+)/,/^(?:[\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6]|[\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377]|[\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5]|[\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA]|[\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE]|[\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA]|[\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0]|[\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977]|[\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2]|[\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A]|[\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39]|[\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8]|[\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C]|[\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C]|[\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99]|[\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0]|[\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D]|[\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3]|[\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10]|[\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1]|[\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81]|[\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3]|[\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6]|[\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A]|[\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081]|[\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D]|[\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0]|[\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310]|[\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C]|[\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711]|[\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7]|[\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C]|[\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16]|[\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF]|[\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC]|[\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D]|[\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D]|[\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3]|[\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F]|[\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128]|[\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184]|[\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3]|[\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6]|[\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE]|[\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C]|[\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D]|[\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC]|[\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B]|[\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788]|[\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805]|[\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB]|[\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28]|[\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5]|[\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4]|[\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E]|[\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D]|[\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36]|[\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D]|[\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC]|[\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF]|[\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC])/,/^(?:\\s)/,/^(?:$)/],\nconditions: {\"arg_directive\":{\"rules\":[3,4],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3],\"inclusive\":false},\"open_directive\":{\"rules\":[1],\"inclusive\":false},\"callback_args\":{\"rules\":[37,38],\"inclusive\":false},\"callback_name\":{\"rules\":[34,35,36],\"inclusive\":false},\"href\":{\"rules\":[31,32],\"inclusive\":false},\"struct\":{\"rules\":[12,13,14,15,16],\"inclusive\":false},\"generic\":{\"rules\":[25,26],\"inclusive\":false},\"string\":{\"rules\":[28,29],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,8,9,10,11,17,18,19,20,21,22,23,24,27,30,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar types_1 = require(\"../types\");\nvar hex_1 = require(\"./hex\");\nvar keyword_1 = require(\"./keyword\");\nvar rgb_1 = require(\"./rgb\");\nvar hsl_1 = require(\"./hsl\");\n/* COLOR */\nvar Color = {\n /* VARIABLES */\n format: {\n keyword: keyword_1.default,\n hex: hex_1.default,\n rgb: rgb_1.default,\n rgba: rgb_1.default,\n hsl: hsl_1.default,\n hsla: hsl_1.default\n },\n /* API */\n parse: function (color) {\n if (typeof color !== 'string')\n return color;\n var channels = hex_1.default.parse(color) || rgb_1.default.parse(color) || hsl_1.default.parse(color) || keyword_1.default.parse(color); // Color providers ordered with performance in mind\n if (channels)\n return channels;\n throw new Error(\"Unsupported color format: \\\"\" + color + \"\\\"\");\n },\n stringify: function (channels) {\n // SASS returns a keyword if possible, but we avoid doing that as it's slower and doesn't really add any value\n if (!channels.changed && channels.color)\n return channels.color;\n if (channels.type.is(types_1.TYPE.HSL) || channels.data.r === undefined) {\n return hsl_1.default.stringify(channels);\n }\n else if (channels.a < 1 || !Number.isInteger(channels.r) || !Number.isInteger(channels.g) || !Number.isInteger(channels.b)) {\n return rgb_1.default.stringify(channels);\n }\n else {\n return hex_1.default.stringify(channels);\n }\n }\n};\n/* EXPORT */\nexports.default = Color;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/* global window */\n\nvar graphlib;\n\nif (typeof require === \"function\") {\n try {\n graphlib = require(\"graphlib\");\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!graphlib) {\n graphlib = window.graphlib;\n}\n\nmodule.exports = graphlib;\n","/*\nCopyright (c) 2012-2014 Chris Pettitt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nmodule.exports = {\n graphlib: require(\"./lib/graphlib\"),\n\n layout: require(\"./lib/layout\"),\n debug: require(\"./lib/debug\"),\n util: {\n time: require(\"./lib/util\").time,\n notime: require(\"./lib/util\").notime\n },\n version: require(\"./lib/version\")\n};\n","// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n if (typeof path !== 'string') path = path + '';\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) {\n // return '//';\n // Backwards-compat fix:\n return '/';\n }\n return path.slice(0, end);\n};\n\nfunction basename(path) {\n if (typeof path !== 'string') path = path + '';\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n var f = basename(path);\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\nexports.extname = function (path) {\n if (typeof path !== 'string') path = path + '';\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,5],$V3=[1,7],$V4=[2,5],$V5=[1,15],$V6=[1,17],$V7=[1,19],$V8=[1,20],$V9=[1,21],$Va=[1,22],$Vb=[1,28],$Vc=[1,23],$Vd=[1,24],$Ve=[1,25],$Vf=[1,26],$Vg=[1,29],$Vh=[1,32],$Vi=[1,4,5,14,15,17,19,20,22,23,24,25,26,36,39],$Vj=[1,4,5,12,13,14,15,17,19,20,22,23,24,25,26,36,39],$Vk=[1,4,5,7,14,15,17,19,20,22,23,24,25,26,36,39],$Vl=[4,5,14,15,17,19,20,22,23,24,25,26,36,39];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"SPACE\":4,\"NL\":5,\"directive\":6,\"SD\":7,\"document\":8,\"line\":9,\"statement\":10,\"idStatement\":11,\"DESCR\":12,\"-->\":13,\"HIDE_EMPTY\":14,\"scale\":15,\"WIDTH\":16,\"COMPOSIT_STATE\":17,\"STRUCT_START\":18,\"STRUCT_STOP\":19,\"STATE_DESCR\":20,\"AS\":21,\"ID\":22,\"FORK\":23,\"JOIN\":24,\"CONCURRENT\":25,\"note\":26,\"notePosition\":27,\"NOTE_TEXT\":28,\"openDirective\":29,\"typeDirective\":30,\"closeDirective\":31,\":\":32,\"argDirective\":33,\"eol\":34,\";\":35,\"EDGE_STATE\":36,\"left_of\":37,\"right_of\":38,\"open_directive\":39,\"type_directive\":40,\"arg_directive\":41,\"close_directive\":42,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACE\",5:\"NL\",7:\"SD\",12:\"DESCR\",13:\"-->\",14:\"HIDE_EMPTY\",15:\"scale\",16:\"WIDTH\",17:\"COMPOSIT_STATE\",18:\"STRUCT_START\",19:\"STRUCT_STOP\",20:\"STATE_DESCR\",21:\"AS\",22:\"ID\",23:\"FORK\",24:\"JOIN\",25:\"CONCURRENT\",26:\"note\",28:\"NOTE_TEXT\",32:\":\",35:\";\",36:\"EDGE_STATE\",37:\"left_of\",38:\"right_of\",39:\"open_directive\",40:\"type_directive\",41:\"arg_directive\",42:\"close_directive\"},\nproductions_: [0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[6,3],[6,5],[34,1],[34,1],[11,1],[11,1],[27,1],[27,1],[29,1],[30,1],[33,1],[31,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 4:\n /*console.warn('Root document', $$[$0]);*/ yy.setRootDoc($$[$0]);return $$[$0]; \nbreak;\ncase 5:\n this.$ = [] \nbreak;\ncase 6:\n\n if($$[$0]!='nl'){\n $$[$0-1].push($$[$0]);this.$ = $$[$0-1]\n }\n // console.warn('Got document',$$[$0-1], $$[$0]);\n \nbreak;\ncase 7: case 8:\n this.$ = $$[$0] \nbreak;\ncase 9:\n this.$='nl';\nbreak;\ncase 10:\n /*console.warn('got id and descr', $$[$0]);*/this.$={ stmt: 'state', id: $$[$0], type: 'default', description: ''};\nbreak;\ncase 11:\n /*console.warn('got id and descr', $$[$0-1], $$[$0].trim());*/this.$={ stmt: 'state', id: $$[$0-1], type: 'default', description: yy.trimColon($$[$0])};\nbreak;\ncase 12:\n\n /*console.warn('got id', $$[$0-2]);yy.addRelation($$[$0-2], $$[$0]);*/\n this.$={ stmt: 'relation', state1: { stmt: 'state', id: $$[$0-2], type: 'default', description: '' }, state2:{ stmt: 'state', id: $$[$0] ,type: 'default', description: ''}};\n \nbreak;\ncase 13:\n\n /*yy.addRelation($$[$0-3], $$[$0-1], $$[$0].substr(1).trim());*/\n this.$={ stmt: 'relation', state1: { stmt: 'state', id: $$[$0-3], type: 'default', description: '' }, state2:{ stmt: 'state', id: $$[$0-1] ,type: 'default', description: ''}, description: $$[$0].substr(1).trim()};\n \nbreak;\ncase 17:\n\n\n /* console.warn('Adding document for state without id ', $$[$0-3]);*/\n this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: '', doc: $$[$0-1] }\n \nbreak;\ncase 18:\n\n var id=$$[$0];\n var description = $$[$0-2].trim();\n if($$[$0].match(':')){\n var parts = $$[$0].split(':');\n id=parts[0];\n description = [description, parts[1]];\n }\n this.$={stmt: 'state', id: id, type: 'default', description: description};\n\n \nbreak;\ncase 19:\n\n //console.warn('Adding document for state with id ', $$[$0-3], $$[$0-2]); yy.addDocument($$[$0-3]);\n this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: $$[$0-5], doc: $$[$0-1] }\n \nbreak;\ncase 20:\n\n this.$={ stmt: 'state', id: $$[$0], type: 'fork' }\n \nbreak;\ncase 21:\n\n this.$={ stmt: 'state', id: $$[$0], type: 'join' }\n \nbreak;\ncase 22:\n\n this.$={ stmt: 'state', id: yy.getDividerId(), type: 'divider' }\n \nbreak;\ncase 23:\n\n /*console.warn('got NOTE, position: ', $$[$0-2].trim(), 'id = ', $$[$0-1].trim(), 'note: ', $$[$0]);*/\n this.$={ stmt: 'state', id: $$[$0-1].trim(), note:{position: $$[$0-2].trim(), text: $$[$0].trim()}};\n \nbreak;\ncase 30: case 31:\nthis.$=$$[$0];\nbreak;\ncase 34:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 35:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 36:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 37:\n yy.parseDirective('}%%', 'close_directive', 'state'); \nbreak;\n}\n},\ntable: [{3:1,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},{1:[3]},{3:8,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},{3:9,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},{3:10,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},o([1,4,5,14,15,17,20,22,23,24,25,26,36,39],$V4,{8:11}),{30:12,40:[1,13]},{40:[2,34]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:$V5,5:$V6,6:27,9:14,10:16,11:18,14:$V7,15:$V8,17:$V9,20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},{31:30,32:[1,31],42:$Vh},o([32,42],[2,35]),o($Vi,[2,6]),{6:27,10:33,11:18,14:$V7,15:$V8,17:$V9,20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},o($Vi,[2,8]),o($Vi,[2,9]),o($Vi,[2,10],{12:[1,34],13:[1,35]}),o($Vi,[2,14]),{16:[1,36]},o($Vi,[2,16],{18:[1,37]}),{21:[1,38]},o($Vi,[2,20]),o($Vi,[2,21]),o($Vi,[2,22]),{27:39,28:[1,40],37:[1,41],38:[1,42]},o($Vi,[2,25]),o($Vj,[2,30]),o($Vj,[2,31]),o($Vk,[2,26]),{33:43,41:[1,44]},o($Vk,[2,37]),o($Vi,[2,7]),o($Vi,[2,11]),{11:45,22:$Vb,36:$Vg},o($Vi,[2,15]),o($Vl,$V4,{8:46}),{22:[1,47]},{22:[1,48]},{21:[1,49]},{22:[2,32]},{22:[2,33]},{31:50,42:$Vh},{42:[2,36]},o($Vi,[2,12],{12:[1,51]}),{4:$V5,5:$V6,6:27,9:14,10:16,11:18,14:$V7,15:$V8,17:$V9,19:[1,52],20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},o($Vi,[2,18],{18:[1,53]}),{28:[1,54]},{22:[1,55]},o($Vk,[2,27]),o($Vi,[2,13]),o($Vi,[2,17]),o($Vl,$V4,{8:56}),o($Vi,[2,23]),o($Vi,[2,24]),{4:$V5,5:$V6,6:27,9:14,10:16,11:18,14:$V7,15:$V8,17:$V9,19:[1,57],20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},o($Vi,[2,19])],\ndefaultActions: {7:[2,34],8:[2,1],9:[2,2],10:[2,3],41:[2,32],42:[2,33],44:[2,36]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 39; \nbreak;\ncase 1: this.begin('type_directive'); return 40; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 32; \nbreak;\ncase 3: this.popState(); this.popState(); return 42; \nbreak;\ncase 4:return 41;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */{ console.log('Crap after close'); }\nbreak;\ncase 7:return 5;\nbreak;\ncase 8:/* skip all whitespace */\nbreak;\ncase 9:/* skip same-line whitespace */\nbreak;\ncase 10:/* skip comments */\nbreak;\ncase 11:/* skip comments */\nbreak;\ncase 12: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 15; \nbreak;\ncase 13:return 16;\nbreak;\ncase 14:this.popState();\nbreak;\ncase 15: this.pushState('STATE'); \nbreak;\ncase 16:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim(); /*console.warn('Fork Fork: ',yy_.yytext);*/return 23;\nbreak;\ncase 17:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 24;\nbreak;\ncase 18:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Fork: ',yy_.yytext);*/return 23;\nbreak;\ncase 19:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 24;\nbreak;\ncase 20:this.begin(\"STATE_STRING\");\nbreak;\ncase 21:this.popState();this.pushState('STATE_ID');return \"AS\";\nbreak;\ncase 22:this.popState();/* console.log('STATE_ID', yy_.yytext);*/return \"ID\";\nbreak;\ncase 23:this.popState();\nbreak;\ncase 24: /*console.log('Long description:', yy_.yytext);*/return \"STATE_DESCR\";\nbreak;\ncase 25:/*console.log('COMPOSIT_STATE', yy_.yytext);*/return 17;\nbreak;\ncase 26:this.popState();\nbreak;\ncase 27:this.popState();this.pushState('struct'); /*console.log('begin struct', yy_.yytext);*/return 18;\nbreak;\ncase 28: /*console.log('Ending struct');*/ this.popState(); return 19;\nbreak;\ncase 29:/* nothing */\nbreak;\ncase 30: this.begin('NOTE'); return 26; \nbreak;\ncase 31: this.popState();this.pushState('NOTE_ID');return 37;\nbreak;\ncase 32: this.popState();this.pushState('NOTE_ID');return 38;\nbreak;\ncase 33: this.popState();this.pushState('FLOATING_NOTE');\nbreak;\ncase 34:this.popState();this.pushState('FLOATING_NOTE_ID');return \"AS\";\nbreak;\ncase 35:/**/\nbreak;\ncase 36: /*console.log('Floating note text: ', yy_.yytext);*/return \"NOTE_TEXT\";\nbreak;\ncase 37:this.popState();/*console.log('Floating note ID', yy_.yytext);*/return \"ID\";\nbreak;\ncase 38: this.popState();this.pushState('NOTE_TEXT');/*console.log('Got ID for note', yy_.yytext);*/return 22;\nbreak;\ncase 39: this.popState();/*console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.substr(2).trim();return 28;\nbreak;\ncase 40: this.popState();/*console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.slice(0,-8).trim();return 28;\nbreak;\ncase 41: /*console.log('Got state diagram', yy_.yytext,'#');*/return 7; \nbreak;\ncase 42: /*console.log('Got state diagram', yy_.yytext,'#');*/return 7; \nbreak;\ncase 43: /*console.log('HIDE_EMPTY', yy_.yytext,'#');*/return 14; \nbreak;\ncase 44: /*console.log('EDGE_STATE=',yy_.yytext);*/ return 36;\nbreak;\ncase 45: /*console.log('=>ID=',yy_.yytext);*/ return 22;\nbreak;\ncase 46: yy_.yytext = yy_.yytext.trim(); /*console.log('Descr = ', yy_.yytext);*/ return 12; \nbreak;\ncase 47:return 13;\nbreak;\ncase 48:return 25;\nbreak;\ncase 49:return 5;\nbreak;\ncase 50:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:((?:(?!\\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\\}%%)/i,/^(?:((?:(?!\\}%%).|\\n)*))/i,/^(?:%%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:[\\s]+)/i,/^(?:((?!\\n)\\s)+)/i,/^(?:#[^\\n]*)/i,/^(?:%[^\\n]*)/i,/^(?:scale\\s+)/i,/^(?:\\d+)/i,/^(?:\\s+width\\b)/i,/^(?:state\\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\\[\\[fork\\]\\])/i,/^(?:.*\\[\\[join\\]\\])/i,/^(?:[\"])/i,/^(?:\\s*as\\s+)/i,/^(?:[^\\n\\{]*)/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:[^\\n\\s\\{]+)/i,/^(?:\\n)/i,/^(?:\\{)/i,/^(?:\\})/i,/^(?:[\\n])/i,/^(?:note\\s+)/i,/^(?:left of\\b)/i,/^(?:right of\\b)/i,/^(?:\")/i,/^(?:\\s*as\\s*)/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:[^\\n]*)/i,/^(?:\\s*[^:\\n\\s\\-]+)/i,/^(?:\\s*:[^:\\n;]+)/i,/^(?:[\\s\\S]*?end note\\b)/i,/^(?:stateDiagram\\s+)/i,/^(?:stateDiagram-v2\\s+)/i,/^(?:hide empty description\\b)/i,/^(?:\\[\\*\\])/i,/^(?:[^:\\n\\s\\-\\{]+)/i,/^(?:\\s*:[^:\\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"LINE\":{\"rules\":[9,10],\"inclusive\":false},\"close_directive\":{\"rules\":[9,10],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4,9,10],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3,9,10],\"inclusive\":false},\"open_directive\":{\"rules\":[1,9,10],\"inclusive\":false},\"struct\":{\"rules\":[9,10,15,28,29,30,44,45,46,47,48],\"inclusive\":false},\"FLOATING_NOTE_ID\":{\"rules\":[37],\"inclusive\":false},\"FLOATING_NOTE\":{\"rules\":[34,35,36],\"inclusive\":false},\"NOTE_TEXT\":{\"rules\":[39,40],\"inclusive\":false},\"NOTE_ID\":{\"rules\":[38],\"inclusive\":false},\"NOTE\":{\"rules\":[31,32,33],\"inclusive\":false},\"SCALE\":{\"rules\":[13,14],\"inclusive\":false},\"ALIAS\":{\"rules\":[],\"inclusive\":false},\"STATE_ID\":{\"rules\":[22],\"inclusive\":false},\"STATE_STRING\":{\"rules\":[23,24],\"inclusive\":false},\"FORK_STATE\":{\"rules\":[],\"inclusive\":false},\"STATE\":{\"rules\":[9,10,16,17,18,19,20,21,25,26,27],\"inclusive\":false},\"ID\":{\"rules\":[9,10],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,8,10,11,12,15,27,30,41,42,43,44,45,46,47,49,50],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){\"use strict\";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||\"[object Array]\"===Object.prototype.toString.call(e)}function u(e){return null!=e&&\"[object Object]\"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function h(e){return\"number\"==typeof e||\"[object Number]\"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||\"[object Date]\"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n>>0,s=0;sSe(e)?(r=e+1,o-Se(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(Se(e)-s+i)/7}I(\"w\",[\"ww\",2],\"wo\",\"week\"),I(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\"),C(\"week\",\"w\"),C(\"isoWeek\",\"W\"),F(\"week\",5),F(\"isoWeek\",5),ue(\"w\",B),ue(\"ww\",B,z),ue(\"W\",B),ue(\"WW\",B,z),fe([\"w\",\"ww\",\"W\",\"WW\"],function(e,t,n,s){t[s.substr(0,1)]=D(e)});function je(e,t){return e.slice(t,7).concat(e.slice(0,t))}I(\"d\",0,\"do\",\"day\"),I(\"dd\",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I(\"ddd\",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I(\"dddd\",0,0,function(e){return this.localeData().weekdays(this,e)}),I(\"e\",0,0,\"weekday\"),I(\"E\",0,0,\"isoWeekday\"),C(\"day\",\"d\"),C(\"weekday\",\"e\"),C(\"isoWeekday\",\"E\"),F(\"day\",11),F(\"weekday\",11),F(\"isoWeekday\",11),ue(\"d\",B),ue(\"e\",B),ue(\"E\",B),ue(\"dd\",function(e,t){return t.weekdaysMinRegex(e)}),ue(\"ddd\",function(e,t){return t.weekdaysShortRegex(e)}),ue(\"dddd\",function(e,t){return t.weekdaysRegex(e)}),fe([\"dd\",\"ddd\",\"dddd\"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe([\"d\",\"e\",\"E\"],function(e,t,n,s){t[s]=D(e)});var Ze=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\");var ze=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\");var $e=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\");var qe=ae;var Je=ae;var Be=ae;function Qe(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,\"\"),i=this.weekdaysShort(n,\"\"),r=this.weekdays(n,\"\"),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=he(o[t]),u[t]=he(u[t]),l[t]=he(l[t]);this._weekdaysRegex=new RegExp(\"^(\"+l.join(\"|\")+\")\",\"i\"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp(\"^(\"+u.join(\"|\")+\")\",\"i\"),this._weekdaysShortStrictRegex=new RegExp(\"^(\"+o.join(\"|\")+\")\",\"i\"),this._weekdaysMinStrictRegex=new RegExp(\"^(\"+a.join(\"|\")+\")\",\"i\")}function Xe(){return this.hours()%12||12}function Ke(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function et(e,t){return t._meridiemParse}I(\"H\",[\"HH\",2],0,\"hour\"),I(\"h\",[\"hh\",2],0,Xe),I(\"k\",[\"kk\",2],0,function(){return this.hours()||24}),I(\"hmm\",0,0,function(){return\"\"+Xe.apply(this)+L(this.minutes(),2)}),I(\"hmmss\",0,0,function(){return\"\"+Xe.apply(this)+L(this.minutes(),2)+L(this.seconds(),2)}),I(\"Hmm\",0,0,function(){return\"\"+this.hours()+L(this.minutes(),2)}),I(\"Hmmss\",0,0,function(){return\"\"+this.hours()+L(this.minutes(),2)+L(this.seconds(),2)}),Ke(\"a\",!0),Ke(\"A\",!1),C(\"hour\",\"h\"),F(\"hour\",13),ue(\"a\",et),ue(\"A\",et),ue(\"H\",B),ue(\"h\",B),ue(\"k\",B),ue(\"HH\",B,z),ue(\"hh\",B,z),ue(\"kk\",B,z),ue(\"hmm\",Q),ue(\"hmmss\",X),ue(\"Hmm\",Q),ue(\"Hmmss\",X),ce([\"H\",\"HH\"],ge),ce([\"k\",\"kk\"],function(e,t,n){var s=D(e);t[ge]=24===s?0:s}),ce([\"a\",\"A\"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce([\"h\",\"hh\"],function(e,t,n){t[ge]=D(e),g(n).bigHour=!0}),ce(\"hmm\",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s)),g(n).bigHour=!0}),ce(\"hmmss\",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i)),g(n).bigHour=!0}),ce(\"Hmm\",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s))}),ce(\"Hmmss\",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i))});var tt,nt=Te(\"Hours\",!0),st={calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},longDateFormat:{LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},invalidDate:\"Invalid date\",ordinal:\"%d\",dayOfMonthOrdinalParse:/\\d{1,2}/,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},months:Ce,monthsShort:He,week:{dow:0,doy:6},weekdays:Ze,weekdaysMin:$e,weekdaysShort:ze,meridiemParse:/[ap]\\.?m?\\.?/i},it={},rt={};function at(e){return e?e.toLowerCase().replace(\"_\",\"-\"):e}function ot(e){var t=null;if(!it[e]&&\"undefined\"!=typeof module&&module&&module.exports)try{t=tt._abbr,require(\"./locale/\"+e),ut(t)}catch(e){}return it[e]}function ut(e,t){var n;return e&&((n=l(t)?ht(e):lt(e,t))?tt=n:\"undefined\"!=typeof console&&console.warn&&console.warn(\"Locale \"+e+\" not found. Did you forget to load it?\")),tt._abbr}function lt(e,t){if(null===t)return delete it[e],null;var n,s=st;if(t.abbr=e,null!=it[e])T(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\"),s=it[e]._config;else if(null!=t.parentLocale)if(null!=it[t.parentLocale])s=it[t.parentLocale]._config;else{if(null==(n=ot(t.parentLocale)))return rt[t.parentLocale]||(rt[t.parentLocale]=[]),rt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return it[e]=new P(x(s,t)),rt[e]&&rt[e].forEach(function(e){lt(e.name,e.config)}),ut(e),it[e]}function ht(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return tt;if(!o(e)){if(t=ot(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return tt}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ct(e._a[me],s[me]),(e._dayOfYear>Se(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[ve]&&0===e._a[pe]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var mt=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,_t=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,yt=/Z|[+-]\\d\\d(?::?\\d\\d)?/,gt=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,!1],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,!1],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,!1],[\"YYYYDDD\",/\\d{7}/]],vt=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]],pt=/^\\/?Date\\((\\-?\\d+)/i;function wt(e){var t,n,s,i,r,a,o=e._i,u=mt.exec(o)||_t.exec(o);if(u){for(g(e).iso=!0,t=0,n=gt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},mn.isUtc=Et,mn.isUTC=Et,mn.zoneAbbr=function(){return this._isUTC?\"UTC\":\"\"},mn.zoneName=function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},mn.dates=n(\"dates accessor is deprecated. Use date instead.\",un),mn.months=n(\"months accessor is deprecated. Use month instead\",Ue),mn.years=n(\"years accessor is deprecated. Use year instead\",Oe),mn.zone=n(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",function(e,t){return null!=e?(\"string\"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),mn.isDSTShifted=n(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Ot(e))._a){var t=e._isUTC?y(e._a):bt(e._a);this._isDSTShifted=this.isValid()&&0 true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,9],$V1=[1,7],$V2=[1,6],$V3=[1,8],$V4=[1,20,21,22,23,38,46,75,76,77,78,79,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$V5=[2,10],$V6=[1,20],$V7=[1,21],$V8=[1,22],$V9=[1,23],$Va=[1,30],$Vb=[1,54],$Vc=[1,32],$Vd=[1,33],$Ve=[1,34],$Vf=[1,35],$Vg=[1,36],$Vh=[1,48],$Vi=[1,43],$Vj=[1,45],$Vk=[1,40],$Vl=[1,44],$Vm=[1,47],$Vn=[1,51],$Vo=[1,52],$Vp=[1,53],$Vq=[1,42],$Vr=[1,46],$Vs=[1,49],$Vt=[1,50],$Vu=[1,41],$Vv=[1,57],$Vw=[1,62],$Vx=[1,20,21,22,23,38,42,46,75,76,77,78,79,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$Vy=[1,66],$Vz=[1,65],$VA=[1,67],$VB=[20,21,23,69,70],$VC=[1,88],$VD=[1,93],$VE=[1,90],$VF=[1,95],$VG=[1,98],$VH=[1,96],$VI=[1,97],$VJ=[1,91],$VK=[1,103],$VL=[1,102],$VM=[1,92],$VN=[1,94],$VO=[1,99],$VP=[1,100],$VQ=[1,101],$VR=[1,104],$VS=[20,21,22,23,69,70],$VT=[20,21,22,23,47,69,70],$VU=[20,21,22,23,40,46,47,49,51,53,55,57,59,61,62,64,69,70,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$VV=[20,21,23],$VW=[20,21,23,46,69,70,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$VX=[1,12,20,21,22,23,24,38,42,46,75,76,77,78,79,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$VY=[46,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$VZ=[1,136],$V_=[1,144],$V$=[1,145],$V01=[1,146],$V11=[1,147],$V21=[1,131],$V31=[1,132],$V41=[1,128],$V51=[1,139],$V61=[1,140],$V71=[1,141],$V81=[1,142],$V91=[1,143],$Va1=[1,148],$Vb1=[1,149],$Vc1=[1,134],$Vd1=[1,137],$Ve1=[1,133],$Vf1=[1,130],$Vg1=[20,21,22,23,38,42,46,75,76,77,78,79,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$Vh1=[1,152],$Vi1=[20,21,22,23,26,46,80,94,95,98,99,100,102,103,109,110,111,112,113,114],$Vj1=[20,21,22,23,24,26,38,40,41,42,46,50,52,54,56,58,60,61,63,65,69,70,71,75,76,77,78,79,80,81,84,94,95,98,99,100,102,103,104,105,109,110,111,112,113,114],$Vk1=[12,21,22,24],$Vl1=[22,95],$Vm1=[1,233],$Vn1=[1,237],$Vo1=[1,234],$Vp1=[1,231],$Vq1=[1,228],$Vr1=[1,229],$Vs1=[1,230],$Vt1=[1,232],$Vu1=[1,235],$Vv1=[1,236],$Vw1=[1,238],$Vx1=[1,255],$Vy1=[20,21,23,95],$Vz1=[20,21,22,23,75,91,94,95,98,99,100,101,102,103,104];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"mermaidDoc\":4,\"directive\":5,\"openDirective\":6,\"typeDirective\":7,\"closeDirective\":8,\"separator\":9,\":\":10,\"argDirective\":11,\"open_directive\":12,\"type_directive\":13,\"arg_directive\":14,\"close_directive\":15,\"graphConfig\":16,\"document\":17,\"line\":18,\"statement\":19,\"SEMI\":20,\"NEWLINE\":21,\"SPACE\":22,\"EOF\":23,\"GRAPH\":24,\"NODIR\":25,\"DIR\":26,\"FirstStmtSeperator\":27,\"ending\":28,\"endToken\":29,\"spaceList\":30,\"spaceListNewline\":31,\"verticeStatement\":32,\"styleStatement\":33,\"linkStyleStatement\":34,\"classDefStatement\":35,\"classStatement\":36,\"clickStatement\":37,\"subgraph\":38,\"text\":39,\"SQS\":40,\"SQE\":41,\"end\":42,\"link\":43,\"node\":44,\"vertex\":45,\"AMP\":46,\"STYLE_SEPARATOR\":47,\"idString\":48,\"PS\":49,\"PE\":50,\"(-\":51,\"-)\":52,\"STADIUMSTART\":53,\"STADIUMEND\":54,\"SUBROUTINESTART\":55,\"SUBROUTINEEND\":56,\"CYLINDERSTART\":57,\"CYLINDEREND\":58,\"DIAMOND_START\":59,\"DIAMOND_STOP\":60,\"TAGEND\":61,\"TRAPSTART\":62,\"TRAPEND\":63,\"INVTRAPSTART\":64,\"INVTRAPEND\":65,\"linkStatement\":66,\"arrowText\":67,\"TESTSTR\":68,\"START_LINK\":69,\"LINK\":70,\"PIPE\":71,\"textToken\":72,\"STR\":73,\"keywords\":74,\"STYLE\":75,\"LINKSTYLE\":76,\"CLASSDEF\":77,\"CLASS\":78,\"CLICK\":79,\"DOWN\":80,\"UP\":81,\"textNoTags\":82,\"textNoTagsToken\":83,\"DEFAULT\":84,\"stylesOpt\":85,\"alphaNum\":86,\"CALLBACKNAME\":87,\"CALLBACKARGS\":88,\"HREF\":89,\"LINK_TARGET\":90,\"HEX\":91,\"numList\":92,\"INTERPOLATE\":93,\"NUM\":94,\"COMMA\":95,\"style\":96,\"styleComponent\":97,\"ALPHA\":98,\"COLON\":99,\"MINUS\":100,\"UNIT\":101,\"BRKT\":102,\"DOT\":103,\"PCT\":104,\"TAGSTART\":105,\"alphaNumToken\":106,\"idStringToken\":107,\"alphaNumStatement\":108,\"PUNCTUATION\":109,\"UNICODE_TEXT\":110,\"PLUS\":111,\"EQUALS\":112,\"MULT\":113,\"UNDERSCORE\":114,\"graphCodeTokens\":115,\"ARROW_CROSS\":116,\"ARROW_POINT\":117,\"ARROW_CIRCLE\":118,\"ARROW_OPEN\":119,\"QUOTE\":120,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",10:\":\",12:\"open_directive\",13:\"type_directive\",14:\"arg_directive\",15:\"close_directive\",20:\"SEMI\",21:\"NEWLINE\",22:\"SPACE\",23:\"EOF\",24:\"GRAPH\",25:\"NODIR\",26:\"DIR\",38:\"subgraph\",40:\"SQS\",41:\"SQE\",42:\"end\",46:\"AMP\",47:\"STYLE_SEPARATOR\",49:\"PS\",50:\"PE\",51:\"(-\",52:\"-)\",53:\"STADIUMSTART\",54:\"STADIUMEND\",55:\"SUBROUTINESTART\",56:\"SUBROUTINEEND\",57:\"CYLINDERSTART\",58:\"CYLINDEREND\",59:\"DIAMOND_START\",60:\"DIAMOND_STOP\",61:\"TAGEND\",62:\"TRAPSTART\",63:\"TRAPEND\",64:\"INVTRAPSTART\",65:\"INVTRAPEND\",68:\"TESTSTR\",69:\"START_LINK\",70:\"LINK\",71:\"PIPE\",73:\"STR\",75:\"STYLE\",76:\"LINKSTYLE\",77:\"CLASSDEF\",78:\"CLASS\",79:\"CLICK\",80:\"DOWN\",81:\"UP\",84:\"DEFAULT\",87:\"CALLBACKNAME\",88:\"CALLBACKARGS\",89:\"HREF\",90:\"LINK_TARGET\",91:\"HEX\",93:\"INTERPOLATE\",94:\"NUM\",95:\"COMMA\",98:\"ALPHA\",99:\"COLON\",100:\"MINUS\",101:\"UNIT\",102:\"BRKT\",103:\"DOT\",104:\"PCT\",105:\"TAGSTART\",109:\"PUNCTUATION\",110:\"UNICODE_TEXT\",111:\"PLUS\",112:\"EQUALS\",113:\"MULT\",114:\"UNDERSCORE\",116:\"ARROW_CROSS\",117:\"ARROW_POINT\",118:\"ARROW_CIRCLE\",119:\"ARROW_OPEN\",120:\"QUOTE\"},\nproductions_: [0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[44,1],[44,5],[44,3],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[43,2],[43,3],[43,3],[43,1],[43,3],[66,1],[67,3],[39,1],[39,2],[39,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[82,1],[82,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[92,1],[92,3],[85,1],[85,3],[96,1],[96,2],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[72,1],[72,1],[72,1],[72,1],[72,1],[72,1],[83,1],[83,1],[83,1],[83,1],[48,1],[48,2],[86,1],[86,2],[108,1],[108,1],[108,1],[108,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[106,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[107,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 5:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 6:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 7:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 8:\n yy.parseDirective('}%%', 'close_directive', 'flowchart'); \nbreak;\ncase 10:\n this.$ = [];\nbreak;\ncase 11:\n\n\t if($$[$0] !== []){\n\t $$[$0-1].push($$[$0]);\n\t }\n\t this.$=$$[$0-1];\nbreak;\ncase 12: case 76: case 78: case 90: case 146: case 148: case 149:\nthis.$=$$[$0];\nbreak;\ncase 19:\n yy.setDirection('TB');this.$ = 'TB';\nbreak;\ncase 20:\n yy.setDirection($$[$0-1]);this.$ = $$[$0-1];\nbreak;\ncase 35:\n /* console.warn('finat vs', $$[$0-1].nodes); */ this.$=$$[$0-1].nodes\nbreak;\ncase 36: case 37: case 38: case 39: case 40:\nthis.$=[];\nbreak;\ncase 41:\nthis.$=yy.addSubGraph($$[$0-6],$$[$0-1],$$[$0-4]);\nbreak;\ncase 42:\nthis.$=yy.addSubGraph($$[$0-3],$$[$0-1],$$[$0-3]);\nbreak;\ncase 43:\nthis.$=yy.addSubGraph(undefined,$$[$0-1],undefined);\nbreak;\ncase 47:\n /* console.warn('vs',$$[$0-2].stmt,$$[$0]); */ yy.addLink($$[$0-2].stmt,$$[$0],$$[$0-1]); this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0-2].nodes) } \nbreak;\ncase 48:\n /* console.warn('vs',$$[$0-3].stmt,$$[$0-1]); */ yy.addLink($$[$0-3].stmt,$$[$0-1],$$[$0-2]); this.$ = { stmt: $$[$0-1], nodes: $$[$0-1].concat($$[$0-3].nodes) } \nbreak;\ncase 49:\n/*console.warn('noda', $$[$0-1]);*/ this.$ = {stmt: $$[$0-1], nodes:$$[$0-1] }\nbreak;\ncase 50:\n /*console.warn('noda', $$[$0]);*/ this.$ = {stmt: $$[$0], nodes:$$[$0] }\nbreak;\ncase 51:\n /* console.warn('nod', $$[$0]); */ this.$ = [$$[$0]];\nbreak;\ncase 52:\n this.$ = $$[$0-4].concat($$[$0]); /* console.warn('pip', $$[$0-4][0], $$[$0], this.$); */ \nbreak;\ncase 53:\nthis.$ = [$$[$0-2]];yy.setClass($$[$0-2],$$[$0])\nbreak;\ncase 54:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'square');\nbreak;\ncase 55:\nthis.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'circle');\nbreak;\ncase 56:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'ellipse');\nbreak;\ncase 57:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'stadium');\nbreak;\ncase 58:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'subroutine');\nbreak;\ncase 59:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'cylinder');\nbreak;\ncase 60:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'round');\nbreak;\ncase 61:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'diamond');\nbreak;\ncase 62:\nthis.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'hexagon');\nbreak;\ncase 63:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'odd');\nbreak;\ncase 64:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'trapezoid');\nbreak;\ncase 65:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'inv_trapezoid');\nbreak;\ncase 66:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_right');\nbreak;\ncase 67:\nthis.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_left');\nbreak;\ncase 68:\n /*console.warn('h: ', $$[$0]);*/this.$ = $$[$0];yy.addVertex($$[$0]);\nbreak;\ncase 69:\n$$[$0-1].text = $$[$0];this.$ = $$[$0-1];\nbreak;\ncase 70: case 71:\n$$[$0-2].text = $$[$0-1];this.$ = $$[$0-2];\nbreak;\ncase 72:\nthis.$ = $$[$0];\nbreak;\ncase 73:\nvar inf = yy.destructLink($$[$0], $$[$0-2]); this.$ = {\"type\":inf.type,\"stroke\":inf.stroke,\"length\":inf.length,\"text\":$$[$0-1]};\nbreak;\ncase 74:\nvar inf = yy.destructLink($$[$0]);this.$ = {\"type\":inf.type,\"stroke\":inf.stroke,\"length\":inf.length};\nbreak;\ncase 75:\nthis.$ = $$[$0-1];\nbreak;\ncase 77: case 91: case 147:\nthis.$=$$[$0-1]+''+$$[$0];\nbreak;\ncase 92: case 93:\nthis.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]);\nbreak;\ncase 94:\nthis.$ = $$[$0-4];yy.setClass($$[$0-2], $$[$0]);\nbreak;\ncase 95: case 103:\nthis.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0]);\nbreak;\ncase 96: case 104:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 97:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 98:\nthis.$ = $$[$0-4];yy.setClickEvent($$[$0-4], $$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-4], $$[$0]);\nbreak;\ncase 99: case 105:\nthis.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);\nbreak;\ncase 100: case 106:\nthis.$ = $$[$0-3];yy.setLink($$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-3], $$[$0]);\nbreak;\ncase 101: case 107:\nthis.$ = $$[$0-3];yy.setLink($$[$0-3], $$[$0-2], $$[$0]);\nbreak;\ncase 102: case 108:\nthis.$ = $$[$0-5];yy.setLink($$[$0-5], $$[$0-4], $$[$0]);yy.setTooltip($$[$0-5], $$[$0-2]);\nbreak;\ncase 109:\nthis.$ = $$[$0-4];yy.addVertex($$[$0-2],undefined,undefined,$$[$0]);\nbreak;\ncase 110: case 112:\nthis.$ = $$[$0-4];yy.updateLink($$[$0-2],$$[$0]);\nbreak;\ncase 111:\nthis.$ = $$[$0-4];yy.updateLink([$$[$0-2]],$$[$0]);\nbreak;\ncase 113:\nthis.$ = $$[$0-8];yy.updateLinkInterpolate([$$[$0-6]],$$[$0-2]);yy.updateLink([$$[$0-6]],$$[$0]);\nbreak;\ncase 114:\nthis.$ = $$[$0-8];yy.updateLinkInterpolate($$[$0-6],$$[$0-2]);yy.updateLink($$[$0-6],$$[$0]);\nbreak;\ncase 115:\nthis.$ = $$[$0-6];yy.updateLinkInterpolate([$$[$0-4]],$$[$0]);\nbreak;\ncase 116:\nthis.$ = $$[$0-6];yy.updateLinkInterpolate($$[$0-4],$$[$0]);\nbreak;\ncase 117: case 119:\nthis.$ = [$$[$0]]\nbreak;\ncase 118: case 120:\n$$[$0-2].push($$[$0]);this.$ = $$[$0-2];\nbreak;\ncase 122:\nthis.$ = $$[$0-1] + $$[$0];\nbreak;\ncase 144:\nthis.$=$$[$0]\nbreak;\ncase 145:\nthis.$=$$[$0-1]+''+$$[$0]\nbreak;\ncase 150:\nthis.$='v';\nbreak;\ncase 151:\nthis.$='-';\nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:5,12:$V0,16:4,21:$V1,22:$V2,24:$V3},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:$V0,16:4,21:$V1,22:$V2,24:$V3},o($V4,$V5,{17:11}),{7:12,13:[1,13]},{16:14,21:$V1,22:$V2,24:$V3},{16:15,21:$V1,22:$V2,24:$V3},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},{8:55,10:[1,56],15:$Vv},o([10,15],[2,6]),o($V4,[2,17]),o($V4,[2,18]),o($V4,[2,19]),{20:[1,59],21:[1,60],22:$Vw,27:58,30:61},o($Vx,[2,11]),o($Vx,[2,12]),o($Vx,[2,13]),o($Vx,[2,14]),o($Vx,[2,15]),o($Vx,[2,16]),{9:63,20:$Vy,21:$Vz,23:$VA,43:64,66:68,69:[1,69],70:[1,70]},{9:71,20:$Vy,21:$Vz,23:$VA},{9:72,20:$Vy,21:$Vz,23:$VA},{9:73,20:$Vy,21:$Vz,23:$VA},{9:74,20:$Vy,21:$Vz,23:$VA},{9:75,20:$Vy,21:$Vz,23:$VA},{9:77,20:$Vy,21:$Vz,22:[1,76],23:$VA},o($VB,[2,50],{30:78,22:$Vw}),{22:[1,79]},{22:[1,80]},{22:[1,81]},{22:[1,82]},{26:$VC,46:$VD,73:[1,86],80:$VE,86:85,87:[1,83],89:[1,84],94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VS,[2,51],{47:[1,105]}),o($VT,[2,68],{107:116,40:[1,106],46:$Vb,49:[1,107],51:[1,108],53:[1,109],55:[1,110],57:[1,111],59:[1,112],61:[1,113],62:[1,114],64:[1,115],80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu}),o($VU,[2,144]),o($VU,[2,165]),o($VU,[2,166]),o($VU,[2,167]),o($VU,[2,168]),o($VU,[2,169]),o($VU,[2,170]),o($VU,[2,171]),o($VU,[2,172]),o($VU,[2,173]),o($VU,[2,174]),o($VU,[2,175]),o($VU,[2,176]),o($VU,[2,177]),o($VU,[2,178]),o($VU,[2,179]),{9:117,20:$Vy,21:$Vz,23:$VA},{11:118,14:[1,119]},o($VV,[2,8]),o($V4,[2,20]),o($V4,[2,26]),o($V4,[2,27]),{21:[1,120]},o($VW,[2,34],{30:121,22:$Vw}),o($Vx,[2,35]),{44:122,45:37,46:$Vb,48:38,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},o($VX,[2,44]),o($VX,[2,45]),o($VX,[2,46]),o($VY,[2,72],{67:123,68:[1,124],71:[1,125]}),{22:$VZ,24:$V_,26:$V$,38:$V01,39:126,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o([46,68,71,80,94,95,98,99,100,102,103,109,110,111,112,113,114],[2,74]),o($Vx,[2,36]),o($Vx,[2,37]),o($Vx,[2,38]),o($Vx,[2,39]),o($Vx,[2,40]),{22:$VZ,24:$V_,26:$V$,38:$V01,39:150,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($Vg1,$V5,{17:151}),o($VB,[2,49],{46:$Vh1}),{26:$VC,46:$VD,80:$VE,86:153,91:[1,154],94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{84:[1,155],92:156,94:[1,157]},{26:$VC,46:$VD,80:$VE,84:[1,158],86:159,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{26:$VC,46:$VD,80:$VE,86:160,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VV,[2,95],{22:[1,161],88:[1,162]}),o($VV,[2,99],{22:[1,163]}),o($VV,[2,103],{106:89,108:165,22:[1,164],26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR}),o($VV,[2,105],{22:[1,166]}),o($Vi1,[2,146]),o($Vi1,[2,148]),o($Vi1,[2,149]),o($Vi1,[2,150]),o($Vi1,[2,151]),o($Vj1,[2,152]),o($Vj1,[2,153]),o($Vj1,[2,154]),o($Vj1,[2,155]),o($Vj1,[2,156]),o($Vj1,[2,157]),o($Vj1,[2,158]),o($Vj1,[2,159]),o($Vj1,[2,160]),o($Vj1,[2,161]),o($Vj1,[2,162]),o($Vj1,[2,163]),o($Vj1,[2,164]),{46:$Vb,48:167,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},{22:$VZ,24:$V_,26:$V$,38:$V01,39:168,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:170,42:$V11,46:$VD,49:[1,169],61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:171,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:172,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:173,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:174,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:175,42:$V11,46:$VD,59:[1,176],61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:177,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:178,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:179,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VU,[2,145]),o($Vk1,[2,3]),{8:180,15:$Vv},{15:[2,7]},o($V4,[2,28]),o($VW,[2,33]),o($VB,[2,47],{30:181,22:$Vw}),o($VY,[2,69],{22:[1,182]}),{22:[1,183]},{22:$VZ,24:$V_,26:$V$,38:$V01,39:184,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,61:$V21,69:$V31,70:[1,185],72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($Vj1,[2,76]),o($Vj1,[2,78]),o($Vj1,[2,134]),o($Vj1,[2,135]),o($Vj1,[2,136]),o($Vj1,[2,137]),o($Vj1,[2,138]),o($Vj1,[2,139]),o($Vj1,[2,140]),o($Vj1,[2,141]),o($Vj1,[2,142]),o($Vj1,[2,143]),o($Vj1,[2,79]),o($Vj1,[2,80]),o($Vj1,[2,81]),o($Vj1,[2,82]),o($Vj1,[2,83]),o($Vj1,[2,84]),o($Vj1,[2,85]),o($Vj1,[2,86]),o($Vj1,[2,87]),o($Vj1,[2,88]),o($Vj1,[2,89]),{9:188,20:$Vy,21:$Vz,22:$VZ,23:$VA,24:$V_,26:$V$,38:$V01,40:[1,187],42:$V11,46:$VD,61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,189],44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},{22:$Vw,30:190},{22:[1,191],26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:165,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:[1,192]},{22:[1,193]},{22:[1,194],95:[1,195]},o($Vl1,[2,117]),{22:[1,196]},{22:[1,197],26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:165,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:[1,198],26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:165,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{73:[1,199]},o($VV,[2,97],{22:[1,200]}),{73:[1,201],90:[1,202]},{73:[1,203]},o($Vi1,[2,147]),{73:[1,204],90:[1,205]},o($VS,[2,53],{107:116,46:$Vb,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu}),{22:$VZ,24:$V_,26:$V$,38:$V01,41:[1,206],42:$V11,46:$VD,61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:207,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,50:[1,208],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,52:[1,209],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,54:[1,210],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,56:[1,211],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,58:[1,212],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,60:[1,213],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,39:214,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,41:[1,215],42:$V11,46:$VD,61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,61:$V21,63:[1,216],65:[1,217],69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,61:$V21,63:[1,219],65:[1,218],69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{9:220,20:$Vy,21:$Vz,23:$VA},o($VB,[2,48],{46:$Vh1}),o($VY,[2,71]),o($VY,[2,70]),{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,61:$V21,69:$V31,71:[1,221],72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VY,[2,73]),o($Vj1,[2,77]),{22:$VZ,24:$V_,26:$V$,38:$V01,39:222,42:$V11,46:$VD,61:$V21,69:$V31,72:127,73:$V41,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($Vg1,$V5,{17:223}),o($Vx,[2,43]),{45:224,46:$Vb,48:38,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},{22:$Vm1,75:$Vn1,85:225,91:$Vo1,94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{22:$Vm1,75:$Vn1,85:239,91:$Vo1,94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{22:$Vm1,75:$Vn1,85:240,91:$Vo1,93:[1,241],94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{22:$Vm1,75:$Vn1,85:242,91:$Vo1,93:[1,243],94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{94:[1,244]},{22:$Vm1,75:$Vn1,85:245,91:$Vo1,94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{22:$Vm1,75:$Vn1,85:246,91:$Vo1,94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{26:$VC,46:$VD,80:$VE,86:247,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VV,[2,96]),{73:[1,248]},o($VV,[2,100],{22:[1,249]}),o($VV,[2,101]),o($VV,[2,104]),o($VV,[2,106],{22:[1,250]}),o($VV,[2,107]),o($VT,[2,54]),{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,50:[1,251],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VT,[2,60]),o($VT,[2,56]),o($VT,[2,57]),o($VT,[2,58]),o($VT,[2,59]),o($VT,[2,61]),{22:$VZ,24:$V_,26:$V$,38:$V01,42:$V11,46:$VD,60:[1,252],61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VT,[2,63]),o($VT,[2,64]),o($VT,[2,66]),o($VT,[2,65]),o($VT,[2,67]),o($Vk1,[2,4]),o([22,46,80,94,95,98,99,100,102,103,109,110,111,112,113,114],[2,75]),{22:$VZ,24:$V_,26:$V$,38:$V01,41:[1,253],42:$V11,46:$VD,61:$V21,69:$V31,72:186,74:138,75:$V51,76:$V61,77:$V71,78:$V81,79:$V91,80:$Va1,81:$Vb1,83:129,84:$Vc1,94:$VF,95:$VG,98:$VH,99:$VI,100:$Vd1,102:$VK,103:$VL,104:$Ve1,105:$Vf1,106:135,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,254],44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},o($VS,[2,52]),o($VV,[2,109],{95:$Vx1}),o($Vy1,[2,119],{97:256,22:$Vm1,75:$Vn1,91:$Vo1,94:$Vp1,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1}),o($Vz1,[2,121]),o($Vz1,[2,123]),o($Vz1,[2,124]),o($Vz1,[2,125]),o($Vz1,[2,126]),o($Vz1,[2,127]),o($Vz1,[2,128]),o($Vz1,[2,129]),o($Vz1,[2,130]),o($Vz1,[2,131]),o($Vz1,[2,132]),o($Vz1,[2,133]),o($VV,[2,110],{95:$Vx1}),o($VV,[2,111],{95:$Vx1}),{22:[1,257]},o($VV,[2,112],{95:$Vx1}),{22:[1,258]},o($Vl1,[2,118]),o($VV,[2,92],{95:$Vx1}),o($VV,[2,93],{95:$Vx1}),o($VV,[2,94],{106:89,108:165,26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR}),o($VV,[2,98]),{90:[1,259]},{90:[1,260]},{50:[1,261]},{60:[1,262]},{9:263,20:$Vy,21:$Vz,23:$VA},o($Vx,[2,42]),{22:$Vm1,75:$Vn1,91:$Vo1,94:$Vp1,96:264,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},o($Vz1,[2,122]),{26:$VC,46:$VD,80:$VE,86:265,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},{26:$VC,46:$VD,80:$VE,86:266,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,106:89,108:87,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR},o($VV,[2,102]),o($VV,[2,108]),o($VT,[2,55]),o($VT,[2,62]),o($Vg1,$V5,{17:267}),o($Vy1,[2,120],{97:256,22:$Vm1,75:$Vn1,91:$Vo1,94:$Vp1,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1}),o($VV,[2,115],{106:89,108:165,22:[1,268],26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR}),o($VV,[2,116],{106:89,108:165,22:[1,269],26:$VC,46:$VD,80:$VE,94:$VF,95:$VG,98:$VH,99:$VI,100:$VJ,102:$VK,103:$VL,109:$VM,110:$VN,111:$VO,112:$VP,113:$VQ,114:$VR}),{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,270],44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,94:$Vi,95:$Vj,98:$Vk,99:$Vl,100:$Vm,102:$Vn,103:$Vo,107:39,109:$Vp,110:$Vq,111:$Vr,112:$Vs,113:$Vt,114:$Vu},{22:$Vm1,75:$Vn1,85:271,91:$Vo1,94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},{22:$Vm1,75:$Vn1,85:272,91:$Vo1,94:$Vp1,96:226,97:227,98:$Vq1,99:$Vr1,100:$Vs1,101:$Vt1,102:$Vu1,103:$Vv1,104:$Vw1},o($Vx,[2,41]),o($VV,[2,113],{95:$Vx1}),o($VV,[2,114],{95:$Vx1})],\ndefaultActions: {2:[2,1],9:[2,5],10:[2,2],119:[2,7]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 12; \nbreak;\ncase 1: this.begin('type_directive'); return 13; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 10; \nbreak;\ncase 3: this.popState(); this.popState(); return 15; \nbreak;\ncase 4:return 14;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */\nbreak;\ncase 7:this.begin(\"string\");\nbreak;\ncase 8:this.popState();\nbreak;\ncase 9:return \"STR\";\nbreak;\ncase 10:return 75;\nbreak;\ncase 11:return 84;\nbreak;\ncase 12:return 76;\nbreak;\ncase 13:return 93;\nbreak;\ncase 14:return 77;\nbreak;\ncase 15:return 78;\nbreak;\ncase 16:this.begin(\"href\");\nbreak;\ncase 17:this.popState();\nbreak;\ncase 18:return 89;\nbreak;\ncase 19:this.begin(\"callbackname\");\nbreak;\ncase 20:this.popState();\nbreak;\ncase 21:this.popState(); this.begin(\"callbackargs\");\nbreak;\ncase 22:return 87;\nbreak;\ncase 23:this.popState();\nbreak;\ncase 24:return 88;\nbreak;\ncase 25:this.begin(\"click\");\nbreak;\ncase 26:this.popState();\nbreak;\ncase 27:return 79;\nbreak;\ncase 28:if(yy.lex.firstGraph()){this.begin(\"dir\");} return 24;\nbreak;\ncase 29:if(yy.lex.firstGraph()){this.begin(\"dir\");} return 24;\nbreak;\ncase 30:return 38;\nbreak;\ncase 31:return 42;\nbreak;\ncase 32:return 90;\nbreak;\ncase 33:return 90;\nbreak;\ncase 34:return 90;\nbreak;\ncase 35:return 90;\nbreak;\ncase 36: this.popState(); return 25; \nbreak;\ncase 37: this.popState(); return 26; \nbreak;\ncase 38: this.popState(); return 26; \nbreak;\ncase 39: this.popState(); return 26; \nbreak;\ncase 40: this.popState(); return 26; \nbreak;\ncase 41: this.popState(); return 26; \nbreak;\ncase 42: this.popState(); return 26; \nbreak;\ncase 43: this.popState(); return 26; \nbreak;\ncase 44: this.popState(); return 26; \nbreak;\ncase 45: this.popState(); return 26; \nbreak;\ncase 46: this.popState(); return 26; \nbreak;\ncase 47: return 94;\nbreak;\ncase 48:return 102;\nbreak;\ncase 49:return 47;\nbreak;\ncase 50:return 99;\nbreak;\ncase 51:return 46;\nbreak;\ncase 52:return 20;\nbreak;\ncase 53:return 95;\nbreak;\ncase 54:return 113;\nbreak;\ncase 55:return 70;\nbreak;\ncase 56:return 70;\nbreak;\ncase 57:return 70;\nbreak;\ncase 58:return 69;\nbreak;\ncase 59:return 69;\nbreak;\ncase 60:return 69;\nbreak;\ncase 61:return 51;\nbreak;\ncase 62:return 52;\nbreak;\ncase 63:return 53;\nbreak;\ncase 64:return 54;\nbreak;\ncase 65:return 55;\nbreak;\ncase 66:return 56;\nbreak;\ncase 67:return 57;\nbreak;\ncase 68:return 58;\nbreak;\ncase 69:return 100;\nbreak;\ncase 70:return 103;\nbreak;\ncase 71:return 114;\nbreak;\ncase 72:return 111;\nbreak;\ncase 73:return 104;\nbreak;\ncase 74:return 112;\nbreak;\ncase 75:return 112;\nbreak;\ncase 76:return 105;\nbreak;\ncase 77:return 61;\nbreak;\ncase 78:return 81;\nbreak;\ncase 79:return 'SEP';\nbreak;\ncase 80:return 80;\nbreak;\ncase 81:return 98;\nbreak;\ncase 82:return 63;\nbreak;\ncase 83:return 62;\nbreak;\ncase 84:return 65;\nbreak;\ncase 85:return 64;\nbreak;\ncase 86:return 109;\nbreak;\ncase 87:return 110;\nbreak;\ncase 88:return 71;\nbreak;\ncase 89:return 49;\nbreak;\ncase 90:return 50;\nbreak;\ncase 91:return 40;\nbreak;\ncase 92:return 41;\nbreak;\ncase 93:return 59\nbreak;\ncase 94:return 60\nbreak;\ncase 95:return 120;\nbreak;\ncase 96:return 21;\nbreak;\ncase 97:return 22;\nbreak;\ncase 98:return 23;\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/,/^(?:((?:(?!\\}%%)[^:.])*))/,/^(?::)/,/^(?:\\}%%)/,/^(?:((?:(?!\\}%%).|\\n)*))/,/^(?:%%(?!\\{)[^\\n]*)/,/^(?:[^\\}]%%[^\\n]*)/,/^(?:[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:style\\b)/,/^(?:default\\b)/,/^(?:linkStyle\\b)/,/^(?:interpolate\\b)/,/^(?:classDef\\b)/,/^(?:class\\b)/,/^(?:href[\\s]+[\"])/,/^(?:[\"])/,/^(?:[^\"]*)/,/^(?:call[\\s]+)/,/^(?:\\([\\s]*\\))/,/^(?:\\()/,/^(?:[^(]*)/,/^(?:\\))/,/^(?:[^)]*)/,/^(?:click[\\s]+)/,/^(?:[\\s\\n])/,/^(?:[^\\s\\n]*)/,/^(?:graph\\b)/,/^(?:flowchart\\b)/,/^(?:subgraph\\b)/,/^(?:end\\b\\s*)/,/^(?:_self\\b)/,/^(?:_blank\\b)/,/^(?:_parent\\b)/,/^(?:_top\\b)/,/^(?:(\\r?\\n)*\\s*\\n)/,/^(?:\\s*LR\\b)/,/^(?:\\s*RL\\b)/,/^(?:\\s*TB\\b)/,/^(?:\\s*BT\\b)/,/^(?:\\s*TD\\b)/,/^(?:\\s*BR\\b)/,/^(?:\\s*<)/,/^(?:\\s*>)/,/^(?:\\s*\\^)/,/^(?:\\s*v\\b)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\\*)/,/^(?:\\s*[xo<]?--+[-xo>]\\s*)/,/^(?:\\s*[xo<]?==+[=xo>]\\s*)/,/^(?:\\s*[xo<]?-?\\.+-[xo>]?\\s*)/,/^(?:\\s*[xo<]?--\\s*)/,/^(?:\\s*[xo<]?==\\s*)/,/^(?:\\s*[xo<]?-\\.\\s*)/,/^(?:\\(-)/,/^(?:-\\))/,/^(?:\\(\\[)/,/^(?:\\]\\))/,/^(?:\\[\\[)/,/^(?:\\]\\])/,/^(?:\\[\\()/,/^(?:\\)\\])/,/^(?:-)/,/^(?:\\.)/,/^(?:[\\_])/,/^(?:\\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\\^)/,/^(?:\\\\\\|)/,/^(?:v\\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\\\\])/,/^(?:\\[\\/)/,/^(?:\\/\\])/,/^(?:\\[\\\\)/,/^(?:[!\"#$%&'*+,-.`?\\\\_/])/,/^(?:[\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6]|[\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377]|[\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5]|[\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA]|[\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE]|[\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA]|[\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0]|[\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977]|[\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2]|[\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A]|[\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39]|[\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8]|[\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C]|[\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C]|[\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99]|[\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0]|[\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D]|[\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3]|[\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10]|[\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1]|[\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81]|[\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3]|[\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6]|[\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A]|[\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081]|[\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D]|[\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0]|[\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310]|[\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C]|[\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711]|[\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7]|[\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C]|[\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16]|[\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF]|[\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC]|[\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D]|[\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D]|[\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3]|[\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F]|[\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128]|[\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184]|[\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3]|[\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6]|[\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE]|[\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C]|[\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D]|[\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC]|[\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B]|[\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788]|[\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805]|[\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB]|[\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28]|[\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5]|[\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4]|[\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E]|[\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D]|[\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36]|[\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D]|[\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC]|[\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF]|[\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC])/,/^(?:\\|)/,/^(?:\\()/,/^(?:\\))/,/^(?:\\[)/,/^(?:\\])/,/^(?:\\{)/,/^(?:\\})/,/^(?:\")/,/^(?:(\\r?\\n)+)/,/^(?:\\s)/,/^(?:$)/],\nconditions: {\"close_directive\":{\"rules\":[],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3],\"inclusive\":false},\"open_directive\":{\"rules\":[1],\"inclusive\":false},\"callbackargs\":{\"rules\":[23,24],\"inclusive\":false},\"callbackname\":{\"rules\":[20,21,22],\"inclusive\":false},\"href\":{\"rules\":[17,18],\"inclusive\":false},\"click\":{\"rules\":[26,27],\"inclusive\":false},\"vertex\":{\"rules\":[],\"inclusive\":false},\"dir\":{\"rules\":[36,37,38,39,40,41,42,43,44,45,46],\"inclusive\":false},\"string\":{\"rules\":[8,9],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,10,11,12,13,14,15,16,19,25,28,29,30,31,32,33,34,35,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,3],$V1=[1,5],$V2=[7,9,11,12,13,14,15,16,17,18,20,27,32],$V3=[1,15],$V4=[1,16],$V5=[1,17],$V6=[1,18],$V7=[1,19],$V8=[1,20],$V9=[1,21],$Va=[1,23],$Vb=[1,25],$Vc=[1,28],$Vd=[5,7,9,11,12,13,14,15,16,17,18,20,27,32];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"directive\":4,\"gantt\":5,\"document\":6,\"EOF\":7,\"line\":8,\"SPACE\":9,\"statement\":10,\"NL\":11,\"dateFormat\":12,\"inclusiveEndDates\":13,\"axisFormat\":14,\"excludes\":15,\"todayMarker\":16,\"title\":17,\"section\":18,\"clickStatement\":19,\"taskTxt\":20,\"taskData\":21,\"openDirective\":22,\"typeDirective\":23,\"closeDirective\":24,\":\":25,\"argDirective\":26,\"click\":27,\"callbackname\":28,\"callbackargs\":29,\"href\":30,\"clickStatementDebug\":31,\"open_directive\":32,\"type_directive\":33,\"arg_directive\":34,\"close_directive\":35,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",5:\"gantt\",7:\"EOF\",9:\"SPACE\",11:\"NL\",12:\"dateFormat\",13:\"inclusiveEndDates\",14:\"axisFormat\",15:\"excludes\",16:\"todayMarker\",17:\"title\",18:\"section\",20:\"taskTxt\",21:\"taskData\",25:\":\",27:\"click\",28:\"callbackname\",29:\"callbackargs\",30:\"href\",32:\"open_directive\",33:\"type_directive\",34:\"arg_directive\",35:\"close_directive\"},\nproductions_: [0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[19,2],[19,3],[19,3],[19,4],[19,3],[19,4],[19,2],[31,2],[31,3],[31,3],[31,4],[31,3],[31,4],[31,2],[22,1],[23,1],[26,1],[24,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 2:\n return $$[$0-1]; \nbreak;\ncase 3:\n this.$ = [] \nbreak;\ncase 4:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 5: case 6:\n this.$ = $$[$0] \nbreak;\ncase 7: case 8:\n this.$=[];\nbreak;\ncase 9:\nyy.setDateFormat($$[$0].substr(11));this.$=$$[$0].substr(11);\nbreak;\ncase 10:\nyy.enableInclusiveEndDates();this.$=$$[$0].substr(18);\nbreak;\ncase 11:\nyy.setAxisFormat($$[$0].substr(11));this.$=$$[$0].substr(11);\nbreak;\ncase 12:\nyy.setExcludes($$[$0].substr(9));this.$=$$[$0].substr(9);\nbreak;\ncase 13:\nyy.setTodayMarker($$[$0].substr(12));this.$=$$[$0].substr(12);\nbreak;\ncase 14:\nyy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);\nbreak;\ncase 15:\nyy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);\nbreak;\ncase 17:\nyy.addTask($$[$0-1],$$[$0]);this.$='task';\nbreak;\ncase 21:\nthis.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0], null);\nbreak;\ncase 22:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);\nbreak;\ncase 23:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], null);yy.setLink($$[$0-2],$$[$0]);\nbreak;\ncase 24:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setLink($$[$0-3],$$[$0]);\nbreak;\ncase 25:\nthis.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0], null);yy.setLink($$[$0-2],$$[$0-1]);\nbreak;\ncase 26:\nthis.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-1], $$[$0]);yy.setLink($$[$0-3],$$[$0-2]);\nbreak;\ncase 27:\nthis.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);\nbreak;\ncase 28: case 34:\nthis.$=$$[$0-1] + ' ' + $$[$0];\nbreak;\ncase 29: case 30: case 32:\nthis.$=$$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];\nbreak;\ncase 31: case 33:\nthis.$=$$[$0-3] + ' ' + $$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];\nbreak;\ncase 35:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 36:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 37:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 38:\n yy.parseDirective('}%%', 'close_directive', 'gantt'); \nbreak;\n}\n},\ntable: [{3:1,4:2,5:$V0,22:4,32:$V1},{1:[3]},{3:6,4:2,5:$V0,22:4,32:$V1},o($V2,[2,3],{6:7}),{23:8,33:[1,9]},{33:[2,35]},{1:[2,1]},{4:24,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:$V3,13:$V4,14:$V5,15:$V6,16:$V7,17:$V8,18:$V9,19:22,20:$Va,22:4,27:$Vb,32:$V1},{24:26,25:[1,27],35:$Vc},o([25,35],[2,36]),o($V2,[2,8],{1:[2,2]}),o($V2,[2,4]),{4:24,10:29,12:$V3,13:$V4,14:$V5,15:$V6,16:$V7,17:$V8,18:$V9,19:22,20:$Va,22:4,27:$Vb,32:$V1},o($V2,[2,6]),o($V2,[2,7]),o($V2,[2,9]),o($V2,[2,10]),o($V2,[2,11]),o($V2,[2,12]),o($V2,[2,13]),o($V2,[2,14]),o($V2,[2,15]),o($V2,[2,16]),{21:[1,30]},o($V2,[2,18]),{28:[1,31],30:[1,32]},{11:[1,33]},{26:34,34:[1,35]},{11:[2,38]},o($V2,[2,5]),o($V2,[2,17]),o($V2,[2,21],{29:[1,36],30:[1,37]}),o($V2,[2,27],{28:[1,38]}),o($Vd,[2,19]),{24:39,35:$Vc},{35:[2,37]},o($V2,[2,22],{30:[1,40]}),o($V2,[2,23]),o($V2,[2,25],{29:[1,41]}),{11:[1,42]},o($V2,[2,24]),o($V2,[2,26]),o($Vd,[2,20])],\ndefaultActions: {5:[2,35],6:[2,1],28:[2,38],35:[2,37]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 32; \nbreak;\ncase 1: this.begin('type_directive'); return 33; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 25; \nbreak;\ncase 3: this.popState(); this.popState(); return 35; \nbreak;\ncase 4:return 34;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */\nbreak;\ncase 7:/* do nothing */\nbreak;\ncase 8:return 11;\nbreak;\ncase 9:/* skip whitespace */\nbreak;\ncase 10:/* skip comments */\nbreak;\ncase 11:/* skip comments */\nbreak;\ncase 12:this.begin(\"href\");\nbreak;\ncase 13:this.popState();\nbreak;\ncase 14:return 30;\nbreak;\ncase 15:this.begin(\"callbackname\");\nbreak;\ncase 16:this.popState();\nbreak;\ncase 17:this.popState(); this.begin(\"callbackargs\");\nbreak;\ncase 18:return 28;\nbreak;\ncase 19:this.popState();\nbreak;\ncase 20:return 29;\nbreak;\ncase 21:this.begin(\"click\");\nbreak;\ncase 22:this.popState();\nbreak;\ncase 23:return 27;\nbreak;\ncase 24:return 5;\nbreak;\ncase 25:return 12;\nbreak;\ncase 26:return 13;\nbreak;\ncase 27:return 14;\nbreak;\ncase 28:return 15;\nbreak;\ncase 29:return 16;\nbreak;\ncase 30:return 'date';\nbreak;\ncase 31:return 17;\nbreak;\ncase 32:return 18;\nbreak;\ncase 33:return 20;\nbreak;\ncase 34:return 21;\nbreak;\ncase 35:return 25;\nbreak;\ncase 36:return 7;\nbreak;\ncase 37:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:((?:(?!\\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\\}%%)/i,/^(?:((?:(?!\\}%%).|\\n)*))/i,/^(?:%%(?!\\{)*[^\\n]*)/i,/^(?:[^\\}]%%*[^\\n]*)/i,/^(?:%%*[^\\n]*[\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:#[^\\n]*)/i,/^(?:%[^\\n]*)/i,/^(?:href[\\s]+[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:call[\\s]+)/i,/^(?:\\([\\s]*\\))/i,/^(?:\\()/i,/^(?:[^(]*)/i,/^(?:\\))/i,/^(?:[^)]*)/i,/^(?:click[\\s]+)/i,/^(?:[\\s\\n])/i,/^(?:[^\\s\\n]*)/i,/^(?:gantt\\b)/i,/^(?:dateFormat\\s[^#\\n;]+)/i,/^(?:inclusiveEndDates\\b)/i,/^(?:axisFormat\\s[^#\\n;]+)/i,/^(?:excludes\\s[^#\\n;]+)/i,/^(?:todayMarker\\s[^\\n;]+)/i,/^(?:\\d\\d\\d\\d-\\d\\d-\\d\\d\\b)/i,/^(?:title\\s[^#\\n;]+)/i,/^(?:section\\s[^#:\\n;]+)/i,/^(?:[^#:\\n;]+)/i,/^(?::[^#\\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"close_directive\":{\"rules\":[],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3],\"inclusive\":false},\"open_directive\":{\"rules\":[1],\"inclusive\":false},\"callbackargs\":{\"rules\":[19,20],\"inclusive\":false},\"callbackname\":{\"rules\":[16,17,18],\"inclusive\":false},\"href\":{\"rules\":[13,14],\"inclusive\":false},\"click\":{\"rules\":[22,23],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,8,9,10,11,12,15,21,24,25,26,27,28,29,30,31,32,33,34,35,36,37],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,5],$V2=[6,9,11,17,18,19,21],$V3=[1,15],$V4=[1,16],$V5=[1,17],$V6=[1,21],$V7=[4,6,9,11,17,18,19,21];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"journey\":4,\"document\":5,\"EOF\":6,\"directive\":7,\"line\":8,\"SPACE\":9,\"statement\":10,\"NEWLINE\":11,\"openDirective\":12,\"typeDirective\":13,\"closeDirective\":14,\":\":15,\"argDirective\":16,\"title\":17,\"section\":18,\"taskName\":19,\"taskData\":20,\"open_directive\":21,\"type_directive\":22,\"arg_directive\":23,\"close_directive\":24,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"journey\",6:\"EOF\",9:\"SPACE\",11:\"NEWLINE\",15:\":\",17:\"title\",18:\"section\",19:\"taskName\",20:\"taskData\",21:\"open_directive\",22:\"type_directive\",23:\"arg_directive\",24:\"close_directive\"},\nproductions_: [0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n return $$[$0-1]; \nbreak;\ncase 3:\n this.$ = [] \nbreak;\ncase 4:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 5: case 6:\n this.$ = $$[$0] \nbreak;\ncase 7: case 8:\n this.$=[];\nbreak;\ncase 11:\nyy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);\nbreak;\ncase 12:\nyy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);\nbreak;\ncase 13:\nyy.addTask($$[$0-1], $$[$0]);this.$='task';\nbreak;\ncase 15:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 16:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 17:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 18:\n yy.parseDirective('}%%', 'close_directive', 'journey'); \nbreak;\n}\n},\ntable: [{3:1,4:$V0,7:3,12:4,21:$V1},{1:[3]},o($V2,[2,3],{5:6}),{3:7,4:$V0,7:3,12:4,21:$V1},{13:8,22:[1,9]},{22:[2,15]},{6:[1,10],7:18,8:11,9:[1,12],10:13,11:[1,14],12:4,17:$V3,18:$V4,19:$V5,21:$V1},{1:[2,2]},{14:19,15:[1,20],24:$V6},o([15,24],[2,16]),o($V2,[2,8],{1:[2,1]}),o($V2,[2,4]),{7:18,10:22,12:4,17:$V3,18:$V4,19:$V5,21:$V1},o($V2,[2,6]),o($V2,[2,7]),o($V2,[2,11]),o($V2,[2,12]),{20:[1,23]},o($V2,[2,14]),{11:[1,24]},{16:25,23:[1,26]},{11:[2,18]},o($V2,[2,5]),o($V2,[2,13]),o($V7,[2,9]),{14:27,24:$V6},{24:[2,17]},{11:[1,28]},o($V7,[2,10])],\ndefaultActions: {5:[2,15],7:[2,2],21:[2,18],26:[2,17]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 21; \nbreak;\ncase 1: this.begin('type_directive'); return 22; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 15; \nbreak;\ncase 3: this.popState(); this.popState(); return 24; \nbreak;\ncase 4:return 23;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */\nbreak;\ncase 7:return 11;\nbreak;\ncase 8:/* skip whitespace */\nbreak;\ncase 9:/* skip comments */\nbreak;\ncase 10:return 4;\nbreak;\ncase 11:return 17;\nbreak;\ncase 12:return 18;\nbreak;\ncase 13:return 19;\nbreak;\ncase 14:return 20;\nbreak;\ncase 15:return 15;\nbreak;\ncase 16:return 6;\nbreak;\ncase 17:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:((?:(?!\\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\\}%%)/i,/^(?:((?:(?!\\}%%).|\\n)*))/i,/^(?:%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:#[^\\n]*)/i,/^(?:journey\\b)/i,/^(?:title\\s[^#\\n;]+)/i,/^(?:section\\s[^#:\\n;]+)/i,/^(?:[^#:\\n;]+)/i,/^(?::[^#\\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"open_directive\":{\"rules\":[1],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,8,9,10,11,12,13,14,15,16,17],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar color_1 = require(\"../color\");\n/* CHANNEL */\nfunction channel(color, channel) {\n return utils_1.default.lang.round(color_1.default.parse(color)[channel]);\n}\n/* EXPORT */\nexports.default = channel;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","// Stub to get D3 either via NPM or from the global object\nvar d3;\n\nif (!d3) {\n if (typeof require === \"function\") {\n try {\n d3 = require(\"d3\");\n }\n catch (e) {\n // continue regardless of error\n }\n }\n}\n\nif (!d3) {\n d3 = window.d3;\n}\n\nmodule.exports = d3;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar color_1 = require(\"../color\");\n/* ADJUST CHANNEL */\nfunction adjustChannel(color, channel, amount) {\n var channels = color_1.default.parse(color), amountCurrent = channels[channel], amountNext = utils_1.default.channel.clamp[channel](amountCurrent + amount);\n if (amountCurrent !== amountNext)\n channels[channel] = amountNext;\n return color_1.default.stringify(channels);\n}\n/* EXPORT */\nexports.default = adjustChannel;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","/* global window */\n\nvar lodash;\n\nif (typeof require === \"function\") {\n try {\n lodash = {\n defaults: require(\"lodash/defaults\"),\n each: require(\"lodash/each\"),\n isFunction: require(\"lodash/isFunction\"),\n isPlainObject: require(\"lodash/isPlainObject\"),\n pick: require(\"lodash/pick\"),\n has: require(\"lodash/has\"),\n range: require(\"lodash/range\"),\n uniqueId: require(\"lodash/uniqueId\")\n };\n }\n catch (e) {\n // continue regardless of error\n }\n}\n\nif (!lodash) {\n lodash = window._;\n}\n\nmodule.exports = lodash;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _1 = require(\".\");\n/* REUSABLE */\nvar channels = new _1.default({ r: 0, g: 0, b: 0, a: 0 }, 'transparent');\n/* EXPORT */\nexports.default = channels;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var util = require(\"../util\");\n\nmodule.exports = addHtmlLabel;\n\nfunction addHtmlLabel(root, node) {\n var fo = root\n .append(\"foreignObject\")\n .attr(\"width\", \"100000\");\n\n var div = fo\n .append(\"xhtml:div\");\n div.attr(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n\n var label = node.label;\n switch(typeof label) {\n case \"function\":\n div.insert(label);\n break;\n case \"object\":\n // Currently we assume this is a DOM object.\n div.insert(function() { return label; });\n break;\n default: div.html(label);\n }\n\n util.applyStyle(div, node.labelStyle);\n div.style(\"display\", \"inline-block\");\n // Fix for firefox\n div.style(\"white-space\", \"nowrap\");\n\n var client = div.node().getBoundingClientRect();\n fo\n .attr(\"width\", client.width)\n .attr(\"height\", client.height);\n\n return fo;\n}\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar reusable_1 = require(\"../channels/reusable\");\nvar color_1 = require(\"../color\");\nvar change_1 = require(\"./change\");\nfunction rgba(r, g, b, a) {\n if (b === void 0) { b = 0; }\n if (a === void 0) { a = 1; }\n if (typeof r !== 'number')\n return change_1.default(r, { a: g });\n var channels = reusable_1.default.set({\n r: utils_1.default.channel.clamp.r(r),\n g: utils_1.default.channel.clamp.g(g),\n b: utils_1.default.channel.clamp.b(b),\n a: utils_1.default.channel.clamp.a(a)\n });\n return color_1.default.stringify(channels);\n}\n/* EXPORT */\nexports.default = rgba;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar color_1 = require(\"../color\");\n/* CHANGE */\nfunction change(color, channels) {\n var ch = color_1.default.parse(color);\n for (var c in channels) {\n ch[c] = utils_1.default.channel.clamp[c](channels[c]);\n }\n return color_1.default.stringify(ch);\n}\n/* EXPORT */\nexports.default = change;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\n\nmodule.exports = {\n longestPath: longestPath,\n slack: slack\n};\n\n/*\n * Initializes ranks for the input graph using the longest path algorithm. This\n * algorithm scales well and is fast in practice, it yields rather poor\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\n * ranks wide and leaving edges longer than necessary. However, due to its\n * speed, this algorithm is good for getting an initial ranking that can be fed\n * into other algorithms.\n *\n * This algorithm does not normalize layers because it will be used by other\n * algorithms in most cases. If using this algorithm directly, be sure to\n * run normalize at the end.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG.\n * 2. Input graph node labels can be assigned properties.\n *\n * Post-conditions:\n *\n * 1. Each node will be assign an (unnormalized) \"rank\" property.\n */\nfunction longestPath(g) {\n var visited = {};\n\n function dfs(v) {\n var label = g.node(v);\n if (_.has(visited, v)) {\n return label.rank;\n }\n visited[v] = true;\n\n var rank = _.min(_.map(g.outEdges(v), function(e) {\n return dfs(e.w) - g.edge(e).minlen;\n }));\n\n if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3\n rank === undefined || // return value of _.map([]) for Lodash 4\n rank === null) { // return value of _.map([null])\n rank = 0;\n }\n\n return (label.rank = rank);\n }\n\n _.forEach(g.sources(), dfs);\n}\n\n/*\n * Returns the amount of slack for the given edge. The slack is defined as the\n * difference between the length of the edge and its minimum length.\n */\nfunction slack(g, e) {\n return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\n}\n","'use strict';\n\nvar invalidPrototcolRegex = /^(%20|\\s)*(javascript|data)/im;\nvar ctrlCharactersRegex = /[^\\x20-\\x7E]/gmi;\nvar urlSchemeRegex = /^([^:]+):/gm;\nvar relativeFirstCharacters = ['.', '/']\n\nfunction isRelativeUrl(url) {\n return relativeFirstCharacters.indexOf(url[0]) > -1;\n}\n\nfunction sanitizeUrl(url) {\n if (!url) {\n return 'about:blank';\n }\n\n var urlScheme, urlSchemeParseResults;\n var sanitizedUrl = url.replace(ctrlCharactersRegex, '').trim();\n\n if (isRelativeUrl(sanitizedUrl)) {\n return sanitizedUrl;\n }\n\n urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);\n\n if (!urlSchemeParseResults) {\n return 'about:blank';\n }\n\n urlScheme = urlSchemeParseResults[0];\n\n if (invalidPrototcolRegex.test(urlScheme)) {\n return 'about:blank';\n }\n\n return sanitizedUrl;\n}\n\nmodule.exports = {\n sanitizeUrl: sanitizeUrl\n};\n","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,3],$V1=[1,7],$V2=[7,12,15,17,19,20,21],$V3=[7,11,12,15,17,19,20,21],$V4=[2,20],$V5=[1,32];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"GG\":4,\":\":5,\"document\":6,\"EOF\":7,\"DIR\":8,\"options\":9,\"body\":10,\"OPT\":11,\"NL\":12,\"line\":13,\"statement\":14,\"COMMIT\":15,\"commit_arg\":16,\"BRANCH\":17,\"ID\":18,\"CHECKOUT\":19,\"MERGE\":20,\"RESET\":21,\"reset_arg\":22,\"STR\":23,\"HEAD\":24,\"reset_parents\":25,\"CARET\":26,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"GG\",5:\":\",7:\"EOF\",8:\"DIR\",11:\"OPT\",12:\"NL\",15:\"COMMIT\",17:\"BRANCH\",18:\"ID\",19:\"CHECKOUT\",20:\"MERGE\",21:\"RESET\",23:\"STR\",24:\"HEAD\",26:\"CARET\"},\nproductions_: [0,[3,4],[3,5],[6,0],[6,2],[9,2],[9,1],[10,0],[10,2],[13,2],[13,1],[14,2],[14,2],[14,2],[14,2],[14,2],[16,0],[16,1],[22,2],[22,2],[25,0],[25,2]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n return $$[$0-1]; \nbreak;\ncase 2:\nyy.setDirection($$[$0-3]); return $$[$0-1];\nbreak;\ncase 4:\n yy.setOptions($$[$0-1]); this.$ = $$[$0]\nbreak;\ncase 5:\n$$[$0-1] +=$$[$0]; this.$=$$[$0-1]\nbreak;\ncase 7:\nthis.$ = []\nbreak;\ncase 8:\n$$[$0-1].push($$[$0]); this.$=$$[$0-1];\nbreak;\ncase 9:\nthis.$ =$$[$0-1]\nbreak;\ncase 11:\nyy.commit($$[$0])\nbreak;\ncase 12:\nyy.branch($$[$0])\nbreak;\ncase 13:\nyy.checkout($$[$0])\nbreak;\ncase 14:\nyy.merge($$[$0])\nbreak;\ncase 15:\nyy.reset($$[$0])\nbreak;\ncase 16:\nthis.$ = \"\"\nbreak;\ncase 17:\nthis.$=$$[$0]\nbreak;\ncase 18:\nthis.$ = $$[$0-1]+ \":\" + $$[$0] \nbreak;\ncase 19:\nthis.$ = $$[$0-1]+ \":\" + yy.count; yy.count = 0\nbreak;\ncase 20:\nyy.count = 0\nbreak;\ncase 21:\n yy.count += 1 \nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},{5:[1,3],8:[1,4]},{6:5,7:$V0,9:6,12:$V1},{5:[1,8]},{7:[1,9]},o($V2,[2,7],{10:10,11:[1,11]}),o($V3,[2,6]),{6:12,7:$V0,9:6,12:$V1},{1:[2,1]},{7:[2,4],12:[1,15],13:13,14:14,15:[1,16],17:[1,17],19:[1,18],20:[1,19],21:[1,20]},o($V3,[2,5]),{7:[1,21]},o($V2,[2,8]),{12:[1,22]},o($V2,[2,10]),{12:[2,16],16:23,23:[1,24]},{18:[1,25]},{18:[1,26]},{18:[1,27]},{18:[1,30],22:28,24:[1,29]},{1:[2,2]},o($V2,[2,9]),{12:[2,11]},{12:[2,17]},{12:[2,12]},{12:[2,13]},{12:[2,14]},{12:[2,15]},{12:$V4,25:31,26:$V5},{12:$V4,25:33,26:$V5},{12:[2,18]},{12:$V4,25:34,26:$V5},{12:[2,19]},{12:[2,21]}],\ndefaultActions: {9:[2,1],21:[2,2],23:[2,11],24:[2,17],25:[2,12],26:[2,13],27:[2,14],28:[2,15],31:[2,18],33:[2,19],34:[2,21]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 12;\nbreak;\ncase 1:/* skip all whitespace */\nbreak;\ncase 2:/* skip comments */\nbreak;\ncase 3:/* skip comments */\nbreak;\ncase 4:return 4;\nbreak;\ncase 5:return 15;\nbreak;\ncase 6:return 17;\nbreak;\ncase 7:return 20;\nbreak;\ncase 8:return 21;\nbreak;\ncase 9:return 19;\nbreak;\ncase 10:return 8;\nbreak;\ncase 11:return 8;\nbreak;\ncase 12:return 5;\nbreak;\ncase 13:return 26\nbreak;\ncase 14:this.begin(\"options\");\nbreak;\ncase 15:this.popState();\nbreak;\ncase 16:return 11;\nbreak;\ncase 17:this.begin(\"string\");\nbreak;\ncase 18:this.popState();\nbreak;\ncase 19:return 23;\nbreak;\ncase 20:return 18;\nbreak;\ncase 21:return 7;\nbreak;\n}\n},\nrules: [/^(?:(\\r?\\n)+)/i,/^(?:\\s+)/i,/^(?:#[^\\n]*)/i,/^(?:%[^\\n]*)/i,/^(?:gitGraph\\b)/i,/^(?:commit\\b)/i,/^(?:branch\\b)/i,/^(?:merge\\b)/i,/^(?:reset\\b)/i,/^(?:checkout\\b)/i,/^(?:LR\\b)/i,/^(?:BT\\b)/i,/^(?::)/i,/^(?:\\^)/i,/^(?:options\\r?\\n)/i,/^(?:end\\r?\\n)/i,/^(?:[^\\n]+\\r?\\n)/i,/^(?:[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:[a-zA-Z][-_\\.a-zA-Z0-9]*[-_a-zA-Z0-9])/i,/^(?:$)/i],\nconditions: {\"options\":{\"rules\":[15,16],\"inclusive\":false},\"string\":{\"rules\":[18,19],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,9,10];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"info\":4,\"document\":5,\"EOF\":6,\"line\":7,\"statement\":8,\"NL\":9,\"showInfo\":10,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"info\",6:\"EOF\",9:\"NL\",10:\"showInfo\"},\nproductions_: [0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n return yy; \nbreak;\ncase 4:\n \nbreak;\ncase 6:\n yy.setInfo(true); \nbreak;\n}\n},\ntable: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},o($V0,[2,3]),o($V0,[2,4]),o($V0,[2,5]),o($V0,[2,6])],\ndefaultActions: {4:[2,1]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\n\t// Pre-lexer code can go here\n\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 4 ;\nbreak;\ncase 1:return 9 ;\nbreak;\ncase 2:return 'space';\nbreak;\ncase 3:return 10;\nbreak;\ncase 4:return 6 ;\nbreak;\ncase 5:return 'TXT' ;\nbreak;\n}\n},\nrules: [/^(?:info\\b)/i,/^(?:[\\s\\n\\r]+)/i,/^(?:[\\s]+)/i,/^(?:showInfo\\b)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"INITIAL\":{\"rules\":[0,1,2,3,4,5],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,5],$V2=[1,6],$V3=[1,7],$V4=[1,9],$V5=[1,10,12,19,20,21,22],$V6=[1,6,10,12,19,20,21,22],$V7=[19,20,21],$V8=[1,22],$V9=[6,19,20,21,22];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"eol\":4,\"directive\":5,\"PIE\":6,\"document\":7,\"line\":8,\"statement\":9,\"txt\":10,\"value\":11,\"title\":12,\"title_value\":13,\"openDirective\":14,\"typeDirective\":15,\"closeDirective\":16,\":\":17,\"argDirective\":18,\"NEWLINE\":19,\";\":20,\"EOF\":21,\"open_directive\":22,\"type_directive\":23,\"arg_directive\":24,\"close_directive\":25,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"PIE\",10:\"txt\",11:\"value\",12:\"title\",13:\"title_value\",17:\":\",19:\"NEWLINE\",20:\";\",21:\"EOF\",22:\"open_directive\",23:\"type_directive\",24:\"arg_directive\",25:\"close_directive\"},\nproductions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[9,0],[9,2],[9,2],[9,1],[5,3],[5,5],[4,1],[4,1],[4,1],[14,1],[15,1],[18,1],[16,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 6:\n this.$ = $$[$0-1] \nbreak;\ncase 8:\n yy.addSection($$[$0-1],yy.cleanupValue($$[$0])); \nbreak;\ncase 9:\n this.$=$$[$0].trim();yy.setTitle(this.$); \nbreak;\ncase 16:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 17:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 18:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 19:\n yy.parseDirective('}%%', 'close_directive', 'pie'); \nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,6:$V0,14:8,19:$V1,20:$V2,21:$V3,22:$V4},{1:[3]},{3:10,4:2,5:3,6:$V0,14:8,19:$V1,20:$V2,21:$V3,22:$V4},{3:11,4:2,5:3,6:$V0,14:8,19:$V1,20:$V2,21:$V3,22:$V4},o($V5,[2,4],{7:12}),o($V6,[2,13]),o($V6,[2,14]),o($V6,[2,15]),{15:13,23:[1,14]},{23:[2,16]},{1:[2,1]},{1:[2,2]},o($V7,[2,7],{14:8,8:15,9:16,5:19,1:[2,3],10:[1,17],12:[1,18],22:$V4}),{16:20,17:[1,21],25:$V8},o([17,25],[2,17]),o($V5,[2,5]),{4:23,19:$V1,20:$V2,21:$V3},{11:[1,24]},{13:[1,25]},o($V7,[2,10]),o($V9,[2,11]),{18:26,24:[1,27]},o($V9,[2,19]),o($V5,[2,6]),o($V7,[2,8]),o($V7,[2,9]),{16:28,25:$V8},{25:[2,18]},o($V9,[2,12])],\ndefaultActions: {9:[2,16],10:[2,1],11:[2,2],27:[2,18]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 22; \nbreak;\ncase 1: this.begin('type_directive'); return 23; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 17; \nbreak;\ncase 3: this.popState(); this.popState(); return 25; \nbreak;\ncase 4:return 24;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */{ /*console.log('');*/ }\nbreak;\ncase 7:return 19;\nbreak;\ncase 8:/* do nothing */\nbreak;\ncase 9:/* ignore */\nbreak;\ncase 10: this.begin(\"title\");return 12; \nbreak;\ncase 11: this.popState(); return \"title_value\"; \nbreak;\ncase 12: this.begin(\"string\"); \nbreak;\ncase 13: this.popState(); \nbreak;\ncase 14: return \"txt\"; \nbreak;\ncase 15:return 6;\nbreak;\ncase 16:return \"value\";\nbreak;\ncase 17:return 21;\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:((?:(?!\\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\\}%%)/i,/^(?:((?:(?!\\}%%).|\\n)*))/i,/^(?:%%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n\\r]+)/i,/^(?:%%[^\\n]*)/i,/^(?:[\\s]+)/i,/^(?:title\\b)/i,/^(?:(?!\\n||)*[^\\n]*)/i,/^(?:[\"])/i,/^(?:[\"])/i,/^(?:[^\"]*)/i,/^(?:pie\\b)/i,/^(?::[\\s]*[\\d]+(?:\\.[\\d]+)?)/i,/^(?:$)/i],\nconditions: {\"close_directive\":{\"rules\":[],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3],\"inclusive\":false},\"open_directive\":{\"rules\":[1],\"inclusive\":false},\"title\":{\"rules\":[11],\"inclusive\":false},\"string\":{\"rules\":[13,14],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,8,9,10,12,15,16,17],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,5],$V2=[6,9,11,23,37],$V3=[1,17],$V4=[1,20],$V5=[1,25],$V6=[1,26],$V7=[1,27],$V8=[1,28],$V9=[1,37],$Va=[23,34,35],$Vb=[4,6,9,11,23,37],$Vc=[30,31,32,33],$Vd=[22,27];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"ER_DIAGRAM\":4,\"document\":5,\"EOF\":6,\"directive\":7,\"line\":8,\"SPACE\":9,\"statement\":10,\"NEWLINE\":11,\"openDirective\":12,\"typeDirective\":13,\"closeDirective\":14,\":\":15,\"argDirective\":16,\"entityName\":17,\"relSpec\":18,\"role\":19,\"BLOCK_START\":20,\"attributes\":21,\"BLOCK_STOP\":22,\"ALPHANUM\":23,\"attribute\":24,\"attributeType\":25,\"attributeName\":26,\"ATTRIBUTE_WORD\":27,\"cardinality\":28,\"relType\":29,\"ZERO_OR_ONE\":30,\"ZERO_OR_MORE\":31,\"ONE_OR_MORE\":32,\"ONLY_ONE\":33,\"NON_IDENTIFYING\":34,\"IDENTIFYING\":35,\"WORD\":36,\"open_directive\":37,\"type_directive\":38,\"arg_directive\":39,\"close_directive\":40,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"ER_DIAGRAM\",6:\"EOF\",9:\"SPACE\",11:\"NEWLINE\",15:\":\",20:\"BLOCK_START\",22:\"BLOCK_STOP\",23:\"ALPHANUM\",27:\"ATTRIBUTE_WORD\",30:\"ZERO_OR_ONE\",31:\"ZERO_OR_MORE\",32:\"ONE_OR_MORE\",33:\"ONLY_ONE\",34:\"NON_IDENTIFYING\",35:\"IDENTIFYING\",36:\"WORD\",37:\"open_directive\",38:\"type_directive\",39:\"arg_directive\",40:\"close_directive\"},\nproductions_: [0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[17,1],[21,1],[21,2],[24,2],[25,1],[26,1],[18,3],[28,1],[28,1],[28,1],[28,1],[29,1],[29,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n /*console.log('finished parsing');*/ \nbreak;\ncase 3:\n this.$ = [] \nbreak;\ncase 4:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 5: case 6:\n this.$ = $$[$0] \nbreak;\ncase 7: case 8:\n this.$=[];\nbreak;\ncase 12:\n\n yy.addEntity($$[$0-4]);\n yy.addEntity($$[$0-2]);\n yy.addRelationship($$[$0-4], $$[$0], $$[$0-2], $$[$0-3]);\n /*console.log($$[$0-4] + $$[$0-3] + $$[$0-2] + ':' + $$[$0]);*/\n \nbreak;\ncase 13:\n\n /* console.log('detected block'); */\n yy.addEntity($$[$0-3]);\n yy.addAttributes($$[$0-3], $$[$0-1]);\n /* console.log('handled block'); */\n \nbreak;\ncase 14:\n yy.addEntity($$[$0-2]); \nbreak;\ncase 15:\n yy.addEntity($$[$0]); \nbreak;\ncase 16:\n this.$ = $$[$0]; /*console.log('Entity: ' + $$[$0]);*/ \nbreak;\ncase 17:\n this.$ = [$$[$0]]; \nbreak;\ncase 18:\n $$[$0].push($$[$0-1]); this.$=$$[$0]; \nbreak;\ncase 19:\n this.$ = { attributeType: $$[$0-1], attributeName: $$[$0] }; \nbreak;\ncase 20: case 21:\n this.$=$$[$0]; \nbreak;\ncase 22:\n\n this.$ = { cardA: $$[$0], relType: $$[$0-1], cardB: $$[$0-2] };\n /*console.log('relSpec: ' + $$[$0] + $$[$0-1] + $$[$0-2]);*/\n \nbreak;\ncase 23:\n this.$ = yy.Cardinality.ZERO_OR_ONE; \nbreak;\ncase 24:\n this.$ = yy.Cardinality.ZERO_OR_MORE; \nbreak;\ncase 25:\n this.$ = yy.Cardinality.ONE_OR_MORE; \nbreak;\ncase 26:\n this.$ = yy.Cardinality.ONLY_ONE; \nbreak;\ncase 27:\n this.$ = yy.Identification.NON_IDENTIFYING; \nbreak;\ncase 28:\n this.$ = yy.Identification.IDENTIFYING; \nbreak;\ncase 29:\n this.$ = $$[$0].replace(/\"/g, ''); \nbreak;\ncase 30:\n this.$ = $$[$0]; \nbreak;\ncase 31:\n yy.parseDirective('%%{', 'open_directive'); \nbreak;\ncase 32:\n yy.parseDirective($$[$0], 'type_directive'); \nbreak;\ncase 33:\n $$[$0] = $$[$0].trim().replace(/'/g, '\"'); yy.parseDirective($$[$0], 'arg_directive'); \nbreak;\ncase 34:\n yy.parseDirective('}%%', 'close_directive', 'er'); \nbreak;\n}\n},\ntable: [{3:1,4:$V0,7:3,12:4,37:$V1},{1:[3]},o($V2,[2,3],{5:6}),{3:7,4:$V0,7:3,12:4,37:$V1},{13:8,38:[1,9]},{38:[2,31]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:$V3,37:$V1},{1:[2,2]},{14:18,15:[1,19],40:$V4},o([15,40],[2,32]),o($V2,[2,8],{1:[2,1]}),o($V2,[2,4]),{7:15,10:21,12:4,17:16,23:$V3,37:$V1},o($V2,[2,6]),o($V2,[2,7]),o($V2,[2,11]),o($V2,[2,15],{18:22,28:24,20:[1,23],30:$V5,31:$V6,32:$V7,33:$V8}),o([6,9,11,15,20,23,30,31,32,33,37],[2,16]),{11:[1,29]},{16:30,39:[1,31]},{11:[2,34]},o($V2,[2,5]),{17:32,23:$V3},{21:33,22:[1,34],24:35,25:36,27:$V9},{29:38,34:[1,39],35:[1,40]},o($Va,[2,23]),o($Va,[2,24]),o($Va,[2,25]),o($Va,[2,26]),o($Vb,[2,9]),{14:41,40:$V4},{40:[2,33]},{15:[1,42]},{22:[1,43]},o($V2,[2,14]),{21:44,22:[2,17],24:35,25:36,27:$V9},{26:45,27:[1,46]},{27:[2,20]},{28:47,30:$V5,31:$V6,32:$V7,33:$V8},o($Vc,[2,27]),o($Vc,[2,28]),{11:[1,48]},{19:49,23:[1,51],36:[1,50]},o($V2,[2,13]),{22:[2,18]},o($Vd,[2,19]),o($Vd,[2,21]),{23:[2,22]},o($Vb,[2,10]),o($V2,[2,12]),o($V2,[2,29]),o($V2,[2,30])],\ndefaultActions: {5:[2,31],7:[2,2],20:[2,34],31:[2,33],37:[2,20],44:[2,18],47:[2,22]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('open_directive'); return 37; \nbreak;\ncase 1: this.begin('type_directive'); return 38; \nbreak;\ncase 2: this.popState(); this.begin('arg_directive'); return 15; \nbreak;\ncase 3: this.popState(); this.popState(); return 40; \nbreak;\ncase 4:return 39;\nbreak;\ncase 5:/* skip comments */\nbreak;\ncase 6:/* skip comments */\nbreak;\ncase 7:return 11;\nbreak;\ncase 8:/* skip whitespace */\nbreak;\ncase 9:return 9;\nbreak;\ncase 10:return 36;\nbreak;\ncase 11:return 4;\nbreak;\ncase 12: this.begin(\"block\"); return 20; \nbreak;\ncase 13:/* skip whitespace in block */\nbreak;\ncase 14: return 27; \nbreak;\ncase 15:/* nothing */\nbreak;\ncase 16: this.popState(); return 22; \nbreak;\ncase 17:return yy_.yytext[0];\nbreak;\ncase 18:return 30;\nbreak;\ncase 19:return 31;\nbreak;\ncase 20:return 32;\nbreak;\ncase 21:return 33;\nbreak;\ncase 22:return 30;\nbreak;\ncase 23:return 31;\nbreak;\ncase 24:return 32;\nbreak;\ncase 25:return 34;\nbreak;\ncase 26:return 35;\nbreak;\ncase 27:return 34;\nbreak;\ncase 28:return 34;\nbreak;\ncase 29:return 23;\nbreak;\ncase 30:return yy_.yytext[0];\nbreak;\ncase 31:return 6;\nbreak;\n}\n},\nrules: [/^(?:%%\\{)/i,/^(?:((?:(?!\\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\\}%%)/i,/^(?:((?:(?!\\}%%).|\\n)*))/i,/^(?:%(?!\\{)[^\\n]*)/i,/^(?:[^\\}]%%[^\\n]*)/i,/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:[\\s]+)/i,/^(?:\"[^\"]*\")/i,/^(?:erDiagram\\b)/i,/^(?:\\{)/i,/^(?:\\s+)/i,/^(?:[A-Za-z][A-Za-z0-9\\-_]*)/i,/^(?:[\\n]+)/i,/^(?:\\})/i,/^(?:.)/i,/^(?:\\|o\\b)/i,/^(?:\\}o\\b)/i,/^(?:\\}\\|)/i,/^(?:\\|\\|)/i,/^(?:o\\|)/i,/^(?:o\\{)/i,/^(?:\\|\\{)/i,/^(?:\\.\\.)/i,/^(?:--)/i,/^(?:\\.-)/i,/^(?:-\\.)/i,/^(?:[A-Za-z][A-Za-z0-9\\-_]*)/i,/^(?:.)/i,/^(?:$)/i],\nconditions: {\"open_directive\":{\"rules\":[1],\"inclusive\":false},\"type_directive\":{\"rules\":[2,3],\"inclusive\":false},\"arg_directive\":{\"rules\":[3,4],\"inclusive\":false},\"block\":{\"rules\":[13,14,15,16,17],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,5,6,7,8,9,10,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","\"use strict\";\n/* ENUMS */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar TYPE;\n(function (TYPE) {\n TYPE[TYPE[\"ALL\"] = 0] = \"ALL\";\n TYPE[TYPE[\"RGB\"] = 1] = \"RGB\";\n TYPE[TYPE[\"HSL\"] = 2] = \"HSL\";\n})(TYPE || (TYPE = {}));\nexports.TYPE = TYPE;\n;\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\n\nmodule.exports = Graph;\n\nvar DEFAULT_EDGE_NAME = \"\\x00\";\nvar GRAPH_NODE = \"\\x00\";\nvar EDGE_KEY_DELIM = \"\\x01\";\n\n// Implementation notes:\n//\n// * Node id query functions should return string ids for the nodes\n// * Edge id query functions should return an \"edgeObj\", edge object, that is\n// composed of enough information to uniquely identify an edge: {v, w, name}.\n// * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\n// reference edges. This is because we need a performant way to look these\n// edges up and, object properties, which have string keys, are the closest\n// we're going to get to a performant hashtable in JavaScript.\n\nfunction Graph(opts) {\n this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\n this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\n this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\n\n // Label for the graph itself\n this._label = undefined;\n\n // Defaults to be set when creating a new node\n this._defaultNodeLabelFn = _.constant(undefined);\n\n // Defaults to be set when creating a new edge\n this._defaultEdgeLabelFn = _.constant(undefined);\n\n // v -> label\n this._nodes = {};\n\n if (this._isCompound) {\n // v -> parent\n this._parent = {};\n\n // v -> children\n this._children = {};\n this._children[GRAPH_NODE] = {};\n }\n\n // v -> edgeObj\n this._in = {};\n\n // u -> v -> Number\n this._preds = {};\n\n // v -> edgeObj\n this._out = {};\n\n // v -> w -> Number\n this._sucs = {};\n\n // e -> edgeObj\n this._edgeObjs = {};\n\n // e -> label\n this._edgeLabels = {};\n}\n\n/* Number of nodes in the graph. Should only be changed by the implementation. */\nGraph.prototype._nodeCount = 0;\n\n/* Number of edges in the graph. Should only be changed by the implementation. */\nGraph.prototype._edgeCount = 0;\n\n\n/* === Graph functions ========= */\n\nGraph.prototype.isDirected = function() {\n return this._isDirected;\n};\n\nGraph.prototype.isMultigraph = function() {\n return this._isMultigraph;\n};\n\nGraph.prototype.isCompound = function() {\n return this._isCompound;\n};\n\nGraph.prototype.setGraph = function(label) {\n this._label = label;\n return this;\n};\n\nGraph.prototype.graph = function() {\n return this._label;\n};\n\n\n/* === Node functions ========== */\n\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\n if (!_.isFunction(newDefault)) {\n newDefault = _.constant(newDefault);\n }\n this._defaultNodeLabelFn = newDefault;\n return this;\n};\n\nGraph.prototype.nodeCount = function() {\n return this._nodeCount;\n};\n\nGraph.prototype.nodes = function() {\n return _.keys(this._nodes);\n};\n\nGraph.prototype.sources = function() {\n var self = this;\n return _.filter(this.nodes(), function(v) {\n return _.isEmpty(self._in[v]);\n });\n};\n\nGraph.prototype.sinks = function() {\n var self = this;\n return _.filter(this.nodes(), function(v) {\n return _.isEmpty(self._out[v]);\n });\n};\n\nGraph.prototype.setNodes = function(vs, value) {\n var args = arguments;\n var self = this;\n _.each(vs, function(v) {\n if (args.length > 1) {\n self.setNode(v, value);\n } else {\n self.setNode(v);\n }\n });\n return this;\n};\n\nGraph.prototype.setNode = function(v, value) {\n if (_.has(this._nodes, v)) {\n if (arguments.length > 1) {\n this._nodes[v] = value;\n }\n return this;\n }\n\n this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\n if (this._isCompound) {\n this._parent[v] = GRAPH_NODE;\n this._children[v] = {};\n this._children[GRAPH_NODE][v] = true;\n }\n this._in[v] = {};\n this._preds[v] = {};\n this._out[v] = {};\n this._sucs[v] = {};\n ++this._nodeCount;\n return this;\n};\n\nGraph.prototype.node = function(v) {\n return this._nodes[v];\n};\n\nGraph.prototype.hasNode = function(v) {\n return _.has(this._nodes, v);\n};\n\nGraph.prototype.removeNode = function(v) {\n var self = this;\n if (_.has(this._nodes, v)) {\n var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\n delete this._nodes[v];\n if (this._isCompound) {\n this._removeFromParentsChildList(v);\n delete this._parent[v];\n _.each(this.children(v), function(child) {\n self.setParent(child);\n });\n delete this._children[v];\n }\n _.each(_.keys(this._in[v]), removeEdge);\n delete this._in[v];\n delete this._preds[v];\n _.each(_.keys(this._out[v]), removeEdge);\n delete this._out[v];\n delete this._sucs[v];\n --this._nodeCount;\n }\n return this;\n};\n\nGraph.prototype.setParent = function(v, parent) {\n if (!this._isCompound) {\n throw new Error(\"Cannot set parent in a non-compound graph\");\n }\n\n if (_.isUndefined(parent)) {\n parent = GRAPH_NODE;\n } else {\n // Coerce parent to string\n parent += \"\";\n for (var ancestor = parent;\n !_.isUndefined(ancestor);\n ancestor = this.parent(ancestor)) {\n if (ancestor === v) {\n throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\n \" would create a cycle\");\n }\n }\n\n this.setNode(parent);\n }\n\n this.setNode(v);\n this._removeFromParentsChildList(v);\n this._parent[v] = parent;\n this._children[parent][v] = true;\n return this;\n};\n\nGraph.prototype._removeFromParentsChildList = function(v) {\n delete this._children[this._parent[v]][v];\n};\n\nGraph.prototype.parent = function(v) {\n if (this._isCompound) {\n var parent = this._parent[v];\n if (parent !== GRAPH_NODE) {\n return parent;\n }\n }\n};\n\nGraph.prototype.children = function(v) {\n if (_.isUndefined(v)) {\n v = GRAPH_NODE;\n }\n\n if (this._isCompound) {\n var children = this._children[v];\n if (children) {\n return _.keys(children);\n }\n } else if (v === GRAPH_NODE) {\n return this.nodes();\n } else if (this.hasNode(v)) {\n return [];\n }\n};\n\nGraph.prototype.predecessors = function(v) {\n var predsV = this._preds[v];\n if (predsV) {\n return _.keys(predsV);\n }\n};\n\nGraph.prototype.successors = function(v) {\n var sucsV = this._sucs[v];\n if (sucsV) {\n return _.keys(sucsV);\n }\n};\n\nGraph.prototype.neighbors = function(v) {\n var preds = this.predecessors(v);\n if (preds) {\n return _.union(preds, this.successors(v));\n }\n};\n\nGraph.prototype.isLeaf = function (v) {\n var neighbors;\n if (this.isDirected()) {\n neighbors = this.successors(v);\n } else {\n neighbors = this.neighbors(v);\n }\n return neighbors.length === 0;\n};\n\nGraph.prototype.filterNodes = function(filter) {\n var copy = new this.constructor({\n directed: this._isDirected,\n multigraph: this._isMultigraph,\n compound: this._isCompound\n });\n\n copy.setGraph(this.graph());\n\n var self = this;\n _.each(this._nodes, function(value, v) {\n if (filter(v)) {\n copy.setNode(v, value);\n }\n });\n\n _.each(this._edgeObjs, function(e) {\n if (copy.hasNode(e.v) && copy.hasNode(e.w)) {\n copy.setEdge(e, self.edge(e));\n }\n });\n\n var parents = {};\n function findParent(v) {\n var parent = self.parent(v);\n if (parent === undefined || copy.hasNode(parent)) {\n parents[v] = parent;\n return parent;\n } else if (parent in parents) {\n return parents[parent];\n } else {\n return findParent(parent);\n }\n }\n\n if (this._isCompound) {\n _.each(copy.nodes(), function(v) {\n copy.setParent(v, findParent(v));\n });\n }\n\n return copy;\n};\n\n/* === Edge functions ========== */\n\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\n if (!_.isFunction(newDefault)) {\n newDefault = _.constant(newDefault);\n }\n this._defaultEdgeLabelFn = newDefault;\n return this;\n};\n\nGraph.prototype.edgeCount = function() {\n return this._edgeCount;\n};\n\nGraph.prototype.edges = function() {\n return _.values(this._edgeObjs);\n};\n\nGraph.prototype.setPath = function(vs, value) {\n var self = this;\n var args = arguments;\n _.reduce(vs, function(v, w) {\n if (args.length > 1) {\n self.setEdge(v, w, value);\n } else {\n self.setEdge(v, w);\n }\n return w;\n });\n return this;\n};\n\n/*\n * setEdge(v, w, [value, [name]])\n * setEdge({ v, w, [name] }, [value])\n */\nGraph.prototype.setEdge = function() {\n var v, w, name, value;\n var valueSpecified = false;\n var arg0 = arguments[0];\n\n if (typeof arg0 === \"object\" && arg0 !== null && \"v\" in arg0) {\n v = arg0.v;\n w = arg0.w;\n name = arg0.name;\n if (arguments.length === 2) {\n value = arguments[1];\n valueSpecified = true;\n }\n } else {\n v = arg0;\n w = arguments[1];\n name = arguments[3];\n if (arguments.length > 2) {\n value = arguments[2];\n valueSpecified = true;\n }\n }\n\n v = \"\" + v;\n w = \"\" + w;\n if (!_.isUndefined(name)) {\n name = \"\" + name;\n }\n\n var e = edgeArgsToId(this._isDirected, v, w, name);\n if (_.has(this._edgeLabels, e)) {\n if (valueSpecified) {\n this._edgeLabels[e] = value;\n }\n return this;\n }\n\n if (!_.isUndefined(name) && !this._isMultigraph) {\n throw new Error(\"Cannot set a named edge when isMultigraph = false\");\n }\n\n // It didn't exist, so we need to create it.\n // First ensure the nodes exist.\n this.setNode(v);\n this.setNode(w);\n\n this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\n\n var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\n // Ensure we add undirected edges in a consistent way.\n v = edgeObj.v;\n w = edgeObj.w;\n\n Object.freeze(edgeObj);\n this._edgeObjs[e] = edgeObj;\n incrementOrInitEntry(this._preds[w], v);\n incrementOrInitEntry(this._sucs[v], w);\n this._in[w][e] = edgeObj;\n this._out[v][e] = edgeObj;\n this._edgeCount++;\n return this;\n};\n\nGraph.prototype.edge = function(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n return this._edgeLabels[e];\n};\n\nGraph.prototype.hasEdge = function(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n return _.has(this._edgeLabels, e);\n};\n\nGraph.prototype.removeEdge = function(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n var edge = this._edgeObjs[e];\n if (edge) {\n v = edge.v;\n w = edge.w;\n delete this._edgeLabels[e];\n delete this._edgeObjs[e];\n decrementOrRemoveEntry(this._preds[w], v);\n decrementOrRemoveEntry(this._sucs[v], w);\n delete this._in[w][e];\n delete this._out[v][e];\n this._edgeCount--;\n }\n return this;\n};\n\nGraph.prototype.inEdges = function(v, u) {\n var inV = this._in[v];\n if (inV) {\n var edges = _.values(inV);\n if (!u) {\n return edges;\n }\n return _.filter(edges, function(edge) { return edge.v === u; });\n }\n};\n\nGraph.prototype.outEdges = function(v, w) {\n var outV = this._out[v];\n if (outV) {\n var edges = _.values(outV);\n if (!w) {\n return edges;\n }\n return _.filter(edges, function(edge) { return edge.w === w; });\n }\n};\n\nGraph.prototype.nodeEdges = function(v, w) {\n var inEdges = this.inEdges(v, w);\n if (inEdges) {\n return inEdges.concat(this.outEdges(v, w));\n }\n};\n\nfunction incrementOrInitEntry(map, k) {\n if (map[k]) {\n map[k]++;\n } else {\n map[k] = 1;\n }\n}\n\nfunction decrementOrRemoveEntry(map, k) {\n if (!--map[k]) { delete map[k]; }\n}\n\nfunction edgeArgsToId(isDirected, v_, w_, name) {\n var v = \"\" + v_;\n var w = \"\" + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\n (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\n}\n\nfunction edgeArgsToObj(isDirected, v_, w_, name) {\n var v = \"\" + v_;\n var w = \"\" + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n var edgeObj = { v: v, w: w };\n if (name) {\n edgeObj.name = name;\n }\n return edgeObj;\n}\n\nfunction edgeObjToId(isDirected, edgeObj) {\n return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\n}\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","module.exports = require('./forEach');\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var baseHas = require('./_baseHas'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n","module.exports = intersectEllipse;\n\nfunction intersectEllipse(node, rx, ry, point) {\n // Formulae from: http://mathworld.wolfram.com/Ellipse-LineIntersection.html\n\n var cx = node.x;\n var cy = node.y;\n\n var px = cx - point.x;\n var py = cy - point.y;\n\n var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);\n\n var dx = Math.abs(rx * ry * px / det);\n if (point.x < cx) {\n dx = -dx;\n }\n var dy = Math.abs(rx * ry * py / det);\n if (point.y < cy) {\n dy = -dy;\n }\n\n return {x: cx + dx, y: cy + dy};\n}\n\n","var addTextLabel = require(\"./add-text-label\");\nvar addHtmlLabel = require(\"./add-html-label\");\nvar addSVGLabel = require(\"./add-svg-label\");\n\nmodule.exports = addLabel;\n\nfunction addLabel(root, node, location) {\n var label = node.label;\n var labelSvg = root.append(\"g\");\n\n // Allow the label to be a string, a function that returns a DOM element, or\n // a DOM element itself.\n if (node.labelType === \"svg\") {\n addSVGLabel(labelSvg, node);\n } else if (typeof label !== \"string\" || node.labelType === \"html\") {\n addHtmlLabel(labelSvg, node);\n } else {\n addTextLabel(labelSvg, node);\n }\n\n var labelBBox = labelSvg.node().getBBox();\n var y;\n switch(location) {\n case \"top\":\n y = (-node.height / 2);\n break;\n case \"bottom\":\n y = (node.height / 2) - labelBBox.height;\n break;\n default:\n y = (-labelBBox.height / 2);\n }\n labelSvg.attr(\n \"transform\",\n \"translate(\" + (-labelBBox.width / 2) + \",\" + y + \")\");\n\n return labelSvg;\n}\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar reusable_1 = require(\"../channels/reusable\");\nvar consts_1 = require(\"../consts\");\n/* HEX */\nvar Hex = {\n /* VARIABLES */\n re: /^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,\n /* API */\n parse: function (color) {\n if (color.charCodeAt(0) !== 35)\n return; // '#'\n var match = color.match(Hex.re);\n if (!match)\n return;\n var hex = match[1], dec = parseInt(hex, 16), length = hex.length, hasAlpha = length % 4 === 0, isFullLength = length > 4, multiplier = isFullLength ? 1 : 17, bits = isFullLength ? 8 : 4, bitsOffset = hasAlpha ? 0 : -1, mask = isFullLength ? 255 : 15;\n return reusable_1.default.set({\n r: ((dec >> (bits * (bitsOffset + 3))) & mask) * multiplier,\n g: ((dec >> (bits * (bitsOffset + 2))) & mask) * multiplier,\n b: ((dec >> (bits * (bitsOffset + 1))) & mask) * multiplier,\n a: hasAlpha ? (dec & mask) * multiplier / 255 : 1\n }, color);\n },\n stringify: function (channels) {\n if (channels.a < 1) { // #RRGGBBAA\n return \"#\" + consts_1.DEC2HEX[Math.round(channels.r)] + consts_1.DEC2HEX[Math.round(channels.g)] + consts_1.DEC2HEX[Math.round(channels.b)] + utils_1.default.unit.frac2hex(channels.a);\n }\n else { // #RRGGBB\n return \"#\" + consts_1.DEC2HEX[Math.round(channels.r)] + consts_1.DEC2HEX[Math.round(channels.g)] + consts_1.DEC2HEX[Math.round(channels.b)];\n }\n }\n};\n/* EXPORT */\nexports.default = Hex;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar reusable_1 = require(\"../channels/reusable\");\nvar color_1 = require(\"../color\");\n/* HSLA */\nfunction hsla(h, s, l, a) {\n if (a === void 0) { a = 1; }\n var channels = reusable_1.default.set({\n h: utils_1.default.channel.clamp.h(h),\n s: utils_1.default.channel.clamp.s(s),\n l: utils_1.default.channel.clamp.l(l),\n a: utils_1.default.channel.clamp.a(a)\n });\n return color_1.default.stringify(channels);\n}\n/* EXPORT */\nexports.default = hsla;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* ALPHA */\nfunction alpha(color) {\n return channel_1.default(color, 'a');\n}\n/* EXPORT */\nexports.default = alpha;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar color_1 = require(\"../color\");\n/* LUMINANCE */\n//SOURCE: https://planetcalc.com/7779\nfunction luminance(color) {\n var _a = color_1.default.parse(color), r = _a.r, g = _a.g, b = _a.b, luminance = .2126 * utils_1.default.channel.toLinear(r) + .7152 * utils_1.default.channel.toLinear(g) + .0722 * utils_1.default.channel.toLinear(b);\n return utils_1.default.lang.round(luminance);\n}\n/* EXPORT */\nexports.default = luminance;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar luminance_1 = require(\"./luminance\");\n/* IS LIGHT */\nfunction isLight(color) {\n return luminance_1.default(color) >= .5;\n}\n/* EXPORT */\nexports.default = isLight;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* OPACIFY */\nfunction opacify(color, amount) {\n return adjust_channel_1.default(color, 'a', amount);\n}\n/* EXPORT */\nexports.default = opacify;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* TRANSPARENTIZE */\nfunction transparentize(color, amount) {\n return adjust_channel_1.default(color, 'a', -amount);\n}\n/* EXPORT */\nexports.default = transparentize;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../color\");\nvar change_1 = require(\"./change\");\n/* ADJUST */\nfunction adjust(color, channels) {\n var ch = color_1.default.parse(color), changes = {};\n for (var c in channels) {\n if (!channels[c])\n continue;\n changes[c] = ch[c] + channels[c];\n }\n return change_1.default(color, changes);\n}\n/* EXPORT */\nexports.default = adjust;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../color\");\nvar rgba_1 = require(\"./rgba\");\n/* MIX */\n//SOURCE: https://github.com/sass/dart-sass/blob/7457d2e9e7e623d9844ffd037a070cf32d39c348/lib/src/functions/color.dart#L718-L756\nfunction mix(color1, color2, weight) {\n if (weight === void 0) { weight = 50; }\n var _a = color_1.default.parse(color1), r1 = _a.r, g1 = _a.g, b1 = _a.b, a1 = _a.a, _b = color_1.default.parse(color2), r2 = _b.r, g2 = _b.g, b2 = _b.b, a2 = _b.a, weightScale = weight / 100, weightNormalized = (weightScale * 2) - 1, alphaDelta = a1 - a2, weight1combined = ((weightNormalized * alphaDelta) === -1) ? weightNormalized : (weightNormalized + alphaDelta) / (1 + weightNormalized * alphaDelta), weight1 = (weight1combined + 1) / 2, weight2 = 1 - weight1, r = (r1 * weight1) + (r2 * weight2), g = (g1 * weight1) + (g2 * weight2), b = (b1 * weight1) + (b2 * weight2), a = (a1 * weightScale) + (a2 * (1 - weightScale));\n return rgba_1.default(r, g, b, a);\n}\n/* EXPORT */\nexports.default = mix;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n","var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","var baseValues = require('./_baseValues'),\n keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n","var _ = require(\"../lodash\");\nvar PriorityQueue = require(\"../data/priority-queue\");\n\nmodule.exports = dijkstra;\n\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\n\nfunction dijkstra(g, source, weightFn, edgeFn) {\n return runDijkstra(g, String(source),\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn || function(v) { return g.outEdges(v); });\n}\n\nfunction runDijkstra(g, source, weightFn, edgeFn) {\n var results = {};\n var pq = new PriorityQueue();\n var v, vEntry;\n\n var updateNeighbors = function(edge) {\n var w = edge.v !== v ? edge.v : edge.w;\n var wEntry = results[w];\n var weight = weightFn(edge);\n var distance = vEntry.distance + weight;\n\n if (weight < 0) {\n throw new Error(\"dijkstra does not allow negative edge weights. \" +\n \"Bad edge: \" + edge + \" Weight: \" + weight);\n }\n\n if (distance < wEntry.distance) {\n wEntry.distance = distance;\n wEntry.predecessor = v;\n pq.decrease(w, distance);\n }\n };\n\n g.nodes().forEach(function(v) {\n var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\n results[v] = { distance: distance };\n pq.add(v, distance);\n });\n\n while (pq.size() > 0) {\n v = pq.removeMin();\n vEntry = results[v];\n if (vEntry.distance === Number.POSITIVE_INFINITY) {\n break;\n }\n\n edgeFn(v).forEach(updateNeighbors);\n }\n\n return results;\n}\n","var _ = require(\"../lodash\");\n\nmodule.exports = PriorityQueue;\n\n/**\n * A min-priority queue data structure. This algorithm is derived from Cormen,\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\n * queue is that you can efficiently (in O(1) time) get the smallest key in\n * the queue. Adding and removing elements takes O(log n) time. A key can\n * have its priority decreased in O(log n) time.\n */\nfunction PriorityQueue() {\n this._arr = [];\n this._keyIndices = {};\n}\n\n/**\n * Returns the number of elements in the queue. Takes `O(1)` time.\n */\nPriorityQueue.prototype.size = function() {\n return this._arr.length;\n};\n\n/**\n * Returns the keys that are in the queue. Takes `O(n)` time.\n */\nPriorityQueue.prototype.keys = function() {\n return this._arr.map(function(x) { return x.key; });\n};\n\n/**\n * Returns `true` if **key** is in the queue and `false` if not.\n */\nPriorityQueue.prototype.has = function(key) {\n return _.has(this._keyIndices, key);\n};\n\n/**\n * Returns the priority for **key**. If **key** is not present in the queue\n * then this function returns `undefined`. Takes `O(1)` time.\n *\n * @param {Object} key\n */\nPriorityQueue.prototype.priority = function(key) {\n var index = this._keyIndices[key];\n if (index !== undefined) {\n return this._arr[index].priority;\n }\n};\n\n/**\n * Returns the key for the minimum element in this queue. If the queue is\n * empty this function throws an Error. Takes `O(1)` time.\n */\nPriorityQueue.prototype.min = function() {\n if (this.size() === 0) {\n throw new Error(\"Queue underflow\");\n }\n return this._arr[0].key;\n};\n\n/**\n * Inserts a new key into the priority queue. If the key already exists in\n * the queue this function returns `false`; otherwise it will return `true`.\n * Takes `O(n)` time.\n *\n * @param {Object} key the key to add\n * @param {Number} priority the initial priority for the key\n */\nPriorityQueue.prototype.add = function(key, priority) {\n var keyIndices = this._keyIndices;\n key = String(key);\n if (!_.has(keyIndices, key)) {\n var arr = this._arr;\n var index = arr.length;\n keyIndices[key] = index;\n arr.push({key: key, priority: priority});\n this._decrease(index);\n return true;\n }\n return false;\n};\n\n/**\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\n */\nPriorityQueue.prototype.removeMin = function() {\n this._swap(0, this._arr.length - 1);\n var min = this._arr.pop();\n delete this._keyIndices[min.key];\n this._heapify(0);\n return min.key;\n};\n\n/**\n * Decreases the priority for **key** to **priority**. If the new priority is\n * greater than the previous priority, this function will throw an Error.\n *\n * @param {Object} key the key for which to raise priority\n * @param {Number} priority the new priority for the key\n */\nPriorityQueue.prototype.decrease = function(key, priority) {\n var index = this._keyIndices[key];\n if (priority > this._arr[index].priority) {\n throw new Error(\"New priority is greater than current priority. \" +\n \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\n }\n this._arr[index].priority = priority;\n this._decrease(index);\n};\n\nPriorityQueue.prototype._heapify = function(i) {\n var arr = this._arr;\n var l = 2 * i;\n var r = l + 1;\n var largest = i;\n if (l < arr.length) {\n largest = arr[l].priority < arr[largest].priority ? l : largest;\n if (r < arr.length) {\n largest = arr[r].priority < arr[largest].priority ? r : largest;\n }\n if (largest !== i) {\n this._swap(i, largest);\n this._heapify(largest);\n }\n }\n};\n\nPriorityQueue.prototype._decrease = function(index) {\n var arr = this._arr;\n var priority = arr[index].priority;\n var parent;\n while (index !== 0) {\n parent = index >> 1;\n if (arr[parent].priority < priority) {\n break;\n }\n this._swap(index, parent);\n index = parent;\n }\n};\n\nPriorityQueue.prototype._swap = function(i, j) {\n var arr = this._arr;\n var keyIndices = this._keyIndices;\n var origArrI = arr[i];\n var origArrJ = arr[j];\n arr[i] = origArrJ;\n arr[j] = origArrI;\n keyIndices[origArrJ.key] = i;\n keyIndices[origArrI.key] = j;\n};\n","var _ = require(\"../lodash\");\n\nmodule.exports = tarjan;\n\nfunction tarjan(g) {\n var index = 0;\n var stack = [];\n var visited = {}; // node id -> { onStack, lowlink, index }\n var results = [];\n\n function dfs(v) {\n var entry = visited[v] = {\n onStack: true,\n lowlink: index,\n index: index++\n };\n stack.push(v);\n\n g.successors(v).forEach(function(w) {\n if (!_.has(visited, w)) {\n dfs(w);\n entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\n } else if (visited[w].onStack) {\n entry.lowlink = Math.min(entry.lowlink, visited[w].index);\n }\n });\n\n if (entry.lowlink === entry.index) {\n var cmpt = [];\n var w;\n do {\n w = stack.pop();\n visited[w].onStack = false;\n cmpt.push(w);\n } while (v !== w);\n results.push(cmpt);\n }\n }\n\n g.nodes().forEach(function(v) {\n if (!_.has(visited, v)) {\n dfs(v);\n }\n });\n\n return results;\n}\n","var _ = require(\"../lodash\");\n\nmodule.exports = topsort;\ntopsort.CycleException = CycleException;\n\nfunction topsort(g) {\n var visited = {};\n var stack = {};\n var results = [];\n\n function visit(node) {\n if (_.has(stack, node)) {\n throw new CycleException();\n }\n\n if (!_.has(visited, node)) {\n stack[node] = true;\n visited[node] = true;\n _.each(g.predecessors(node), visit);\n delete stack[node];\n results.push(node);\n }\n }\n\n _.each(g.sinks(), visit);\n\n if (_.size(visited) !== g.nodeCount()) {\n throw new CycleException();\n }\n\n return results;\n}\n\nfunction CycleException() {}\nCycleException.prototype = new Error(); // must be an instance of Error to pass testing","var _ = require(\"../lodash\");\n\nmodule.exports = dfs;\n\n/*\n * A helper that preforms a pre- or post-order traversal on the input graph\n * and returns the nodes in the order they were visited. If the graph is\n * undirected then this algorithm will navigate using neighbors. If the graph\n * is directed then this algorithm will navigate using successors.\n *\n * Order must be one of \"pre\" or \"post\".\n */\nfunction dfs(g, vs, order) {\n if (!_.isArray(vs)) {\n vs = [vs];\n }\n\n var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);\n\n var acc = [];\n var visited = {};\n _.each(vs, function(v) {\n if (!g.hasNode(v)) {\n throw new Error(\"Graph does not have node: \" + v);\n }\n\n doDfs(g, v, order === \"post\", visited, navigation, acc);\n });\n return acc;\n}\n\nfunction doDfs(g, v, postorder, visited, navigation, acc) {\n if (!_.has(visited, v)) {\n visited[v] = true;\n\n if (!postorder) { acc.push(v); }\n _.each(navigation(v), function(w) {\n doDfs(g, w, postorder, visited, navigation, acc);\n });\n if (postorder) { acc.push(v); }\n }\n}\n","/* global window */\n\nvar dagre;\n\nif (typeof require === \"function\") {\n try {\n dagre = require(\"dagre\");\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!dagre) {\n dagre = window.dagre;\n}\n\nmodule.exports = dagre;\n","var baseRest = require('./_baseRest'),\n eq = require('./eq'),\n isIterateeCall = require('./_isIterateeCall'),\n keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignMergeValue;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nmodule.exports = safeGet;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n","var basePick = require('./_basePick'),\n flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n","var toString = require('./toString');\n\n/** Used to generate unique IDs. */\nvar idCounter = 0;\n\n/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\nfunction uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n}\n\nmodule.exports = uniqueId;\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\nvar Graph = require(\"../graphlib\").Graph;\nvar slack = require(\"./util\").slack;\n\nmodule.exports = feasibleTree;\n\n/*\n * Constructs a spanning tree with tight edges and adjusted the input node's\n * ranks to achieve this. A tight edge is one that is has a length that matches\n * its \"minlen\" attribute.\n *\n * The basic structure for this function is derived from Gansner, et al., \"A\n * Technique for Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a DAG.\n * 2. Graph must be connected.\n * 3. Graph must have at least one node.\n * 5. Graph nodes must have been previously assigned a \"rank\" property that\n * respects the \"minlen\" property of incident edges.\n * 6. Graph edges must have a \"minlen\" property.\n *\n * Post-conditions:\n *\n * - Graph nodes will have their rank adjusted to ensure that all edges are\n * tight.\n *\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\n * edges.\n */\nfunction feasibleTree(g) {\n var t = new Graph({ directed: false });\n\n // Choose arbitrary node from which to start our tree\n var start = g.nodes()[0];\n var size = g.nodeCount();\n t.setNode(start, {});\n\n var edge, delta;\n while (tightTree(t, g) < size) {\n edge = findMinSlackEdge(t, g);\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\n shiftRanks(t, g, delta);\n }\n\n return t;\n}\n\n/*\n * Finds a maximal tree of tight edges and returns the number of nodes in the\n * tree.\n */\nfunction tightTree(t, g) {\n function dfs(v) {\n _.forEach(g.nodeEdges(v), function(e) {\n var edgeV = e.v,\n w = (v === edgeV) ? e.w : edgeV;\n if (!t.hasNode(w) && !slack(g, e)) {\n t.setNode(w, {});\n t.setEdge(v, w, {});\n dfs(w);\n }\n });\n }\n\n _.forEach(t.nodes(), dfs);\n return t.nodeCount();\n}\n\n/*\n * Finds the edge with the smallest slack that is incident on tree and returns\n * it.\n */\nfunction findMinSlackEdge(t, g) {\n return _.minBy(g.edges(), function(e) {\n if (t.hasNode(e.v) !== t.hasNode(e.w)) {\n return slack(g, e);\n }\n });\n}\n\nfunction shiftRanks(t, g, delta) {\n _.forEach(t.nodes(), function(v) {\n g.node(v).rank += delta;\n });\n}\n","module.exports = intersectNode;\n\nfunction intersectNode(node, point) {\n return node.intersect(point);\n}\n","var intersectEllipse = require(\"./intersect-ellipse\");\n\nmodule.exports = intersectCircle;\n\nfunction intersectCircle(node, rx, point) {\n return intersectEllipse(node, rx, rx, point);\n}\n","/* eslint \"no-console\": off */\n\nvar intersectLine = require(\"./intersect-line\");\n\nmodule.exports = intersectPolygon;\n\n/*\n * Returns the point ({x, y}) at which the point argument intersects with the\n * node argument assuming that it has the shape specified by polygon.\n */\nfunction intersectPolygon(node, polyPoints, point) {\n var x1 = node.x;\n var y1 = node.y;\n\n var intersections = [];\n\n var minX = Number.POSITIVE_INFINITY;\n var minY = Number.POSITIVE_INFINITY;\n polyPoints.forEach(function(entry) {\n minX = Math.min(minX, entry.x);\n minY = Math.min(minY, entry.y);\n });\n\n var left = x1 - node.width / 2 - minX;\n var top = y1 - node.height / 2 - minY;\n\n for (var i = 0; i < polyPoints.length; i++) {\n var p1 = polyPoints[i];\n var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];\n var intersect = intersectLine(node, point,\n {x: left + p1.x, y: top + p1.y}, {x: left + p2.x, y: top + p2.y});\n if (intersect) {\n intersections.push(intersect);\n }\n }\n\n if (!intersections.length) {\n console.log(\"NO INTERSECTION FOUND, RETURN NODE CENTER\", node);\n return node;\n }\n\n if (intersections.length > 1) {\n // More intersections, find the one nearest to edge end point\n intersections.sort(function(p, q) {\n var pdx = p.x - point.x;\n var pdy = p.y - point.y;\n var distp = Math.sqrt(pdx * pdx + pdy * pdy);\n\n var qdx = q.x - point.x;\n var qdy = q.y - point.y;\n var distq = Math.sqrt(qdx * qdx + qdy * qdy);\n\n return (distp < distq) ? -1 : (distp === distq ? 0 : 1);\n });\n }\n return intersections[0];\n}\n","module.exports = intersectRect;\n\nfunction intersectRect(node, point) {\n var x = node.x;\n var y = node.y;\n\n // Rectangle intersection algorithm from:\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = node.width / 2;\n var h = node.height / 2;\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = dy === 0 ? 0 : h * dx / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = dx === 0 ? 0 : w * dy / dx;\n }\n\n return {x: x + sx, y: y + sy};\n}\n","/*\n * __ ___\n * _____/ /___ __/ (_)____\n * / ___/ __/ / / / / / ___/\n * (__ ) /_/ /_/ / / (__ )\n * /____/\\__/\\__, /_/_/____/\n * /____/\n *\n * light - weight css preprocessor @licence MIT\n */\n(function (factory) {/* eslint-disable */\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? (module['exports'] = factory(null)) :\n\t\ttypeof define === 'function' && define['amd'] ? define(factory(null)) :\n\t\t\t(window['stylis'] = factory(null))\n}(/** @param {*=} options */function factory (options) {/* eslint-disable */\n\n\t'use strict'\n\n\t/**\n\t * Notes\n\t *\n\t * The [''] pattern is used to support closure compiler\n\t * the jsdoc signatures are also used to the same effect\n\t *\n\t * ----\n\t *\n\t * int + int + int === n4 [faster]\n\t *\n\t * vs\n\t *\n\t * int === n1 && int === n2 && int === n3\n\t *\n\t * ----\n\t *\n\t * switch (int) { case ints...} [faster]\n\t *\n\t * vs\n\t *\n\t * if (int == 1 && int === 2 ...)\n\t *\n\t * ----\n\t *\n\t * The (first*n1 + second*n2 + third*n3) format used in the property parser\n\t * is a simple way to hash the sequence of characters\n\t * taking into account the index they occur in\n\t * since any number of 3 character sequences could produce duplicates.\n\t *\n\t * On the other hand sequences that are directly tied to the index of the character\n\t * resolve a far more accurate measure, it's also faster\n\t * to evaluate one condition in a switch statement\n\t * than three in an if statement regardless of the added math.\n\t *\n\t * This allows the vendor prefixer to be both small and fast.\n\t */\n\n\tvar nullptn = /^\\0+/g /* matches leading null characters */\n\tvar formatptn = /[\\0\\r\\f]/g /* matches new line, null and formfeed characters */\n\tvar colonptn = /: */g /* splits animation rules */\n\tvar cursorptn = /zoo|gra/ /* assert cursor varient */\n\tvar transformptn = /([,: ])(transform)/g /* vendor prefix transform, older webkit */\n\tvar animationptn = /,+\\s*(?![^(]*[)])/g /* splits multiple shorthand notation animations */\n\tvar propertiesptn = / +\\s*(?![^(]*[)])/g /* animation properties */\n\tvar elementptn = / *[\\0] */g /* selector elements */\n\tvar selectorptn = /,\\r+?/g /* splits selectors */\n\tvar andptn = /([\\t\\r\\n ])*\\f?&/g /* match & */\n\tvar escapeptn = /:global\\(((?:[^\\(\\)\\[\\]]*|\\[.*\\]|\\([^\\(\\)]*\\))*)\\)/g /* matches :global(.*) */\n\tvar invalidptn = /\\W+/g /* removes invalid characters from keyframes */\n\tvar keyframeptn = /@(k\\w+)\\s*(\\S*)\\s*/ /* matches @keyframes $1 */\n\tvar plcholdrptn = /::(place)/g /* match ::placeholder varient */\n\tvar readonlyptn = /:(read-only)/g /* match :read-only varient */\n\tvar beforeptn = /\\s+(?=[{\\];=:>])/g /* matches \\s before ] ; = : */\n\tvar afterptn = /([[}=:>])\\s+/g /* matches \\s after characters [ } = : */\n\tvar tailptn = /(\\{[^{]+?);(?=\\})/g /* matches tail semi-colons ;} */\n\tvar whiteptn = /\\s{2,}/g /* matches repeating whitespace */\n\tvar pseudoptn = /([^\\(])(:+) */g /* pseudo element */\n\tvar writingptn = /[svh]\\w+-[tblr]{2}/ /* match writing mode property values */\n\tvar gradientptn = /([\\w-]+t\\()/g /* match *gradient property */\n\tvar supportsptn = /\\(\\s*(.*)\\s*\\)/g /* match supports (groups) */\n\tvar propertyptn = /([\\s\\S]*?);/g /* match properties leading semicolon */\n\tvar selfptn = /-self|flex-/g /* match flex- and -self in align-self: flex-*; */\n\tvar pseudofmt = /[^]*?(:[rp][el]a[\\w-]+)[^]*/ /* extrats :readonly or :placholder from selector */\n\tvar trimptn = /[ \\t]+$/ /* match tail whitspace */\n\tvar dimensionptn = /stretch|:\\s*\\w+\\-(?:conte|avail)/ /* match max/min/fit-content, fill-available */\n\tvar imgsrcptn = /([^-])(image-set\\()/\n\n\t/* vendors */\n\tvar webkit = '-webkit-'\n\tvar moz = '-moz-'\n\tvar ms = '-ms-'\n\n\t/* character codes */\n\tvar SEMICOLON = 59 /* ; */\n\tvar CLOSEBRACES = 125 /* } */\n\tvar OPENBRACES = 123 /* { */\n\tvar OPENPARENTHESES = 40 /* ( */\n\tvar CLOSEPARENTHESES = 41 /* ) */\n\tvar OPENBRACKET = 91 /* [ */\n\tvar CLOSEBRACKET = 93 /* ] */\n\tvar NEWLINE = 10 /* \\n */\n\tvar CARRIAGE = 13 /* \\r */\n\tvar TAB = 9 /* \\t */\n\tvar AT = 64 /* @ */\n\tvar SPACE = 32 /* */\n\tvar AND = 38 /* & */\n\tvar DASH = 45 /* - */\n\tvar UNDERSCORE = 95 /* _ */\n\tvar STAR = 42 /* * */\n\tvar COMMA = 44 /* , */\n\tvar COLON = 58 /* : */\n\tvar SINGLEQUOTE = 39 /* ' */\n\tvar DOUBLEQUOTE = 34 /* \" */\n\tvar FOWARDSLASH = 47 /* / */\n\tvar GREATERTHAN = 62 /* > */\n\tvar PLUS = 43 /* + */\n\tvar TILDE = 126 /* ~ */\n\tvar NULL = 0 /* \\0 */\n\tvar FORMFEED = 12 /* \\f */\n\tvar VERTICALTAB = 11 /* \\v */\n\n\t/* special identifiers */\n\tvar KEYFRAME = 107 /* k */\n\tvar MEDIA = 109 /* m */\n\tvar SUPPORTS = 115 /* s */\n\tvar PLACEHOLDER = 112 /* p */\n\tvar READONLY = 111 /* o */\n\tvar IMPORT = 105 /* i */\n\tvar CHARSET = 99 /* c */\n\tvar DOCUMENT = 100 /* d */\n\tvar PAGE = 112 /* p */\n\n\tvar column = 1 /* current column */\n\tvar line = 1 /* current line numebr */\n\tvar pattern = 0 /* :pattern */\n\n\tvar cascade = 1 /* #id h1 h2 vs h1#id h2#id */\n\tvar prefix = 1 /* vendor prefix */\n\tvar escape = 1 /* escape :global() pattern */\n\tvar compress = 0 /* compress output */\n\tvar semicolon = 0 /* no/semicolon option */\n\tvar preserve = 0 /* preserve empty selectors */\n\n\t/* empty reference */\n\tvar array = []\n\n\t/* plugins */\n\tvar plugins = []\n\tvar plugged = 0\n\tvar should = null\n\n\t/* plugin context */\n\tvar POSTS = -2\n\tvar PREPS = -1\n\tvar UNKWN = 0\n\tvar PROPS = 1\n\tvar BLCKS = 2\n\tvar ATRUL = 3\n\n\t/* plugin newline context */\n\tvar unkwn = 0\n\n\t/* keyframe animation */\n\tvar keyed = 1\n\tvar key = ''\n\n\t/* selector namespace */\n\tvar nscopealt = ''\n\tvar nscope = ''\n\n\t/**\n\t * Compile\n\t *\n\t * @param {Array} parent\n\t * @param {Array} current\n\t * @param {string} body\n\t * @param {number} id\n\t * @param {number} depth\n\t * @return {string}\n\t */\n\tfunction compile (parent, current, body, id, depth) {\n\t\tvar bracket = 0 /* brackets [] */\n\t\tvar comment = 0 /* comments /* // or /* */\n\t\tvar parentheses = 0 /* functions () */\n\t\tvar quote = 0 /* quotes '', \"\" */\n\n\t\tvar first = 0 /* first character code */\n\t\tvar second = 0 /* second character code */\n\t\tvar code = 0 /* current character code */\n\t\tvar tail = 0 /* previous character code */\n\t\tvar trail = 0 /* character before previous code */\n\t\tvar peak = 0 /* previous non-whitespace code */\n\n\t\tvar counter = 0 /* count sequence termination */\n\t\tvar context = 0 /* track current context */\n\t\tvar atrule = 0 /* track @at-rule context */\n\t\tvar pseudo = 0 /* track pseudo token index */\n\t\tvar caret = 0 /* current character index */\n\t\tvar format = 0 /* control character formating context */\n\t\tvar insert = 0 /* auto semicolon insertion */\n\t\tvar invert = 0 /* inverted selector pattern */\n\t\tvar length = 0 /* generic length address */\n\t\tvar eof = body.length /* end of file(length) */\n\t\tvar eol = eof - 1 /* end of file(characters) */\n\n\t\tvar char = '' /* current character */\n\t\tvar chars = '' /* current buffer of characters */\n\t\tvar child = '' /* next buffer of characters */\n\t\tvar out = '' /* compiled body */\n\t\tvar children = '' /* compiled children */\n\t\tvar flat = '' /* compiled leafs */\n\t\tvar selector /* generic selector address */\n\t\tvar result /* generic address */\n\n\t\t// ...build body\n\t\twhile (caret < eof) {\n\t\t\tcode = body.charCodeAt(caret)\n\n\t\t\t// eof varient\n\t\t\tif (caret === eol) {\n\t\t\t\t// last character + noop context, add synthetic padding for noop context to terminate\n\t\t\t\tif (comment + quote + parentheses + bracket !== 0) {\n\t\t\t\t\tif (comment !== 0) {\n\t\t\t\t\t\tcode = comment === FOWARDSLASH ? NEWLINE : FOWARDSLASH\n\t\t\t\t\t}\n\n\t\t\t\t\tquote = parentheses = bracket = 0\n\t\t\t\t\teof++\n\t\t\t\t\teol++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (comment + quote + parentheses + bracket === 0) {\n\t\t\t\t// eof varient\n\t\t\t\tif (caret === eol) {\n\t\t\t\t\tif (format > 0) {\n\t\t\t\t\t\tchars = chars.replace(formatptn, '')\n\t\t\t\t\t}\n\n\t\t\t\t\tif (chars.trim().length > 0) {\n\t\t\t\t\t\tswitch (code) {\n\t\t\t\t\t\t\tcase SPACE:\n\t\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\t\tcase SEMICOLON:\n\t\t\t\t\t\t\tcase CARRIAGE:\n\t\t\t\t\t\t\tcase NEWLINE: {\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\tchars += body.charAt(caret)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcode = SEMICOLON\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// auto semicolon insertion\n\t\t\t\tif (insert === 1) {\n\t\t\t\t\tswitch (code) {\n\t\t\t\t\t\t// false flags\n\t\t\t\t\t\tcase OPENBRACES:\n\t\t\t\t\t\tcase CLOSEBRACES:\n\t\t\t\t\t\tcase SEMICOLON:\n\t\t\t\t\t\tcase DOUBLEQUOTE:\n\t\t\t\t\t\tcase SINGLEQUOTE:\n\t\t\t\t\t\tcase OPENPARENTHESES:\n\t\t\t\t\t\tcase CLOSEPARENTHESES:\n\t\t\t\t\t\tcase COMMA: {\n\t\t\t\t\t\t\tinsert = 0\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\tcase CARRIAGE:\n\t\t\t\t\t\tcase NEWLINE:\n\t\t\t\t\t\tcase SPACE: {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// valid\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tinsert = 0\n\t\t\t\t\t\t\tlength = caret\n\t\t\t\t\t\t\tfirst = code\n\t\t\t\t\t\t\tcaret--\n\t\t\t\t\t\t\tcode = SEMICOLON\n\n\t\t\t\t\t\t\twhile (length < eof) {\n\t\t\t\t\t\t\t\tswitch (body.charCodeAt(length++)) {\n\t\t\t\t\t\t\t\t\tcase NEWLINE:\n\t\t\t\t\t\t\t\t\tcase CARRIAGE:\n\t\t\t\t\t\t\t\t\tcase SEMICOLON: {\n\t\t\t\t\t\t\t\t\t\t++caret\n\t\t\t\t\t\t\t\t\t\tcode = first\n\t\t\t\t\t\t\t\t\t\tlength = eof\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcase COLON: {\n\t\t\t\t\t\t\t\t\t\tif (format > 0) {\n\t\t\t\t\t\t\t\t\t\t\t++caret\n\t\t\t\t\t\t\t\t\t\t\tcode = first\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcase OPENBRACES: {\n\t\t\t\t\t\t\t\t\t\tlength = eof\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// token varient\n\t\t\t\tswitch (code) {\n\t\t\t\t\tcase OPENBRACES: {\n\t\t\t\t\t\tchars = chars.trim()\n\t\t\t\t\t\tfirst = chars.charCodeAt(0)\n\t\t\t\t\t\tcounter = 1\n\t\t\t\t\t\tlength = ++caret\n\n\t\t\t\t\t\twhile (caret < eof) {\n\t\t\t\t\t\t\tswitch (code = body.charCodeAt(caret)) {\n\t\t\t\t\t\t\t\tcase OPENBRACES: {\n\t\t\t\t\t\t\t\t\tcounter++\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase CLOSEBRACES: {\n\t\t\t\t\t\t\t\t\tcounter--\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase FOWARDSLASH: {\n\t\t\t\t\t\t\t\t\tswitch (second = body.charCodeAt(caret + 1)) {\n\t\t\t\t\t\t\t\t\t\t// /*, //\n\t\t\t\t\t\t\t\t\t\tcase STAR:\n\t\t\t\t\t\t\t\t\t\tcase FOWARDSLASH: {\n\t\t\t\t\t\t\t\t\t\t\tcaret = delimited(second, caret, eol, body)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// given \"[\" === 91 & \"]\" === 93 hence forth 91 + 1 + 1 === 93\n\t\t\t\t\t\t\t\tcase OPENBRACKET: {\n\t\t\t\t\t\t\t\t\tcode++\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// given \"(\" === 40 & \")\" === 41 hence forth 40 + 1 === 41\n\t\t\t\t\t\t\t\tcase OPENPARENTHESES: {\n\t\t\t\t\t\t\t\t\tcode++\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// quote tail delimiter is identical to the head delimiter hence noop,\n\t\t\t\t\t\t\t\t// fallthrough clauses have been shifted to the correct tail delimiter\n\t\t\t\t\t\t\t\tcase DOUBLEQUOTE:\n\t\t\t\t\t\t\t\tcase SINGLEQUOTE: {\n\t\t\t\t\t\t\t\t\twhile (caret++ < eol) {\n\t\t\t\t\t\t\t\t\t\tif (body.charCodeAt(caret) === code) {\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (counter === 0) {\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcaret++\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchild = body.substring(length, caret)\n\n\t\t\t\t\t\tif (first === NULL) {\n\t\t\t\t\t\t\tfirst = (chars = chars.replace(nullptn, '').trim()).charCodeAt(0)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch (first) {\n\t\t\t\t\t\t\t// @at-rule\n\t\t\t\t\t\t\tcase AT: {\n\t\t\t\t\t\t\t\tif (format > 0) {\n\t\t\t\t\t\t\t\t\tchars = chars.replace(formatptn, '')\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tsecond = chars.charCodeAt(1)\n\n\t\t\t\t\t\t\t\tswitch (second) {\n\t\t\t\t\t\t\t\t\tcase DOCUMENT:\n\t\t\t\t\t\t\t\t\tcase MEDIA:\n\t\t\t\t\t\t\t\t\tcase SUPPORTS:\n\t\t\t\t\t\t\t\t\tcase DASH: {\n\t\t\t\t\t\t\t\t\t\tselector = current\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\tselector = array\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tchild = compile(current, selector, child, second, depth+1)\n\t\t\t\t\t\t\t\tlength = child.length\n\n\t\t\t\t\t\t\t\t// preserve empty @at-rule\n\t\t\t\t\t\t\t\tif (preserve > 0 && length === 0) {\n\t\t\t\t\t\t\t\t\tlength = chars.length\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// execute plugins, @at-rule context\n\t\t\t\t\t\t\t\tif (plugged > 0) {\n\t\t\t\t\t\t\t\t\tselector = select(array, chars, invert)\n\t\t\t\t\t\t\t\t\tresult = proxy(ATRUL, child, selector, current, line, column, length, second, depth, id)\n\t\t\t\t\t\t\t\t\tchars = selector.join('')\n\n\t\t\t\t\t\t\t\t\tif (result !== void 0) {\n\t\t\t\t\t\t\t\t\t\tif ((length = (child = result.trim()).length) === 0) {\n\t\t\t\t\t\t\t\t\t\t\tsecond = 0\n\t\t\t\t\t\t\t\t\t\t\tchild = ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (length > 0) {\n\t\t\t\t\t\t\t\t\tswitch (second) {\n\t\t\t\t\t\t\t\t\t\tcase SUPPORTS: {\n\t\t\t\t\t\t\t\t\t\t\tchars = chars.replace(supportsptn, supports)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcase DOCUMENT:\n\t\t\t\t\t\t\t\t\t\tcase MEDIA:\n\t\t\t\t\t\t\t\t\t\tcase DASH: {\n\t\t\t\t\t\t\t\t\t\t\tchild = chars + '{' + child + '}'\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcase KEYFRAME: {\n\t\t\t\t\t\t\t\t\t\t\tchars = chars.replace(keyframeptn, '$1 $2' + (keyed > 0 ? key : ''))\n\t\t\t\t\t\t\t\t\t\t\tchild = chars + '{' + child + '}'\n\n\t\t\t\t\t\t\t\t\t\t\tif (prefix === 1 || (prefix === 2 && vendor('@'+child, 3))) {\n\t\t\t\t\t\t\t\t\t\t\t\tchild = '@' + webkit + child + '@' + child\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tchild = '@' + child\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\t\tchild = chars + child\n\n\t\t\t\t\t\t\t\t\t\t\tif (id === PAGE) {\n\t\t\t\t\t\t\t\t\t\t\t\tchild = (out += child, '')\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tchild = ''\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// selector\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\tchild = compile(current, select(current, chars, invert), child, id, depth+1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchildren += child\n\n\t\t\t\t\t\t// reset\n\t\t\t\t\t\tcontext = 0\n\t\t\t\t\t\tinsert = 0\n\t\t\t\t\t\tpseudo = 0\n\t\t\t\t\t\tformat = 0\n\t\t\t\t\t\tinvert = 0\n\t\t\t\t\t\tatrule = 0\n\t\t\t\t\t\tchars = ''\n\t\t\t\t\t\tchild = ''\n\t\t\t\t\t\tcode = body.charCodeAt(++caret)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase CLOSEBRACES:\n\t\t\t\t\tcase SEMICOLON: {\n\t\t\t\t\t\tchars = (format > 0 ? chars.replace(formatptn, '') : chars).trim()\n\n\t\t\t\t\t\tif ((length = chars.length) > 1) {\n\t\t\t\t\t\t\t// monkey-patch missing colon\n\t\t\t\t\t\t\tif (pseudo === 0) {\n\t\t\t\t\t\t\t\tfirst = chars.charCodeAt(0)\n\n\t\t\t\t\t\t\t\t// first character is a letter or dash, buffer has a space character\n\t\t\t\t\t\t\t\tif ((first === DASH || first > 96 && first < 123)) {\n\t\t\t\t\t\t\t\t\tlength = (chars = chars.replace(' ', ':')).length\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// execute plugins, property context\n\t\t\t\t\t\t\tif (plugged > 0) {\n\t\t\t\t\t\t\t\tif ((result = proxy(PROPS, chars, current, parent, line, column, out.length, id, depth, id)) !== void 0) {\n\t\t\t\t\t\t\t\t\tif ((length = (chars = result.trim()).length) === 0) {\n\t\t\t\t\t\t\t\t\t\tchars = '\\0\\0'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfirst = chars.charCodeAt(0)\n\t\t\t\t\t\t\tsecond = chars.charCodeAt(1)\n\n\t\t\t\t\t\t\tswitch (first) {\n\t\t\t\t\t\t\t\tcase NULL: {\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase AT: {\n\t\t\t\t\t\t\t\t\tif (second === IMPORT || second === CHARSET) {\n\t\t\t\t\t\t\t\t\t\tflat += chars + body.charAt(caret)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\tif (chars.charCodeAt(length-1) === COLON) {\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tout += property(chars, first, second, chars.charCodeAt(2))\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// reset\n\t\t\t\t\t\tcontext = 0\n\t\t\t\t\t\tinsert = 0\n\t\t\t\t\t\tpseudo = 0\n\t\t\t\t\t\tformat = 0\n\t\t\t\t\t\tinvert = 0\n\t\t\t\t\t\tchars = ''\n\t\t\t\t\t\tcode = body.charCodeAt(++caret)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// parse characters\n\t\t\tswitch (code) {\n\t\t\t\tcase CARRIAGE:\n\t\t\t\tcase NEWLINE: {\n\t\t\t\t\t// auto insert semicolon\n\t\t\t\t\tif (comment + quote + parentheses + bracket + semicolon === 0) {\n\t\t\t\t\t\t// valid non-whitespace characters that\n\t\t\t\t\t\t// may precede a newline\n\t\t\t\t\t\tswitch (peak) {\n\t\t\t\t\t\t\tcase CLOSEPARENTHESES:\n\t\t\t\t\t\t\tcase SINGLEQUOTE:\n\t\t\t\t\t\t\tcase DOUBLEQUOTE:\n\t\t\t\t\t\t\tcase AT:\n\t\t\t\t\t\t\tcase TILDE:\n\t\t\t\t\t\t\tcase GREATERTHAN:\n\t\t\t\t\t\t\tcase STAR:\n\t\t\t\t\t\t\tcase PLUS:\n\t\t\t\t\t\t\tcase FOWARDSLASH:\n\t\t\t\t\t\t\tcase DASH:\n\t\t\t\t\t\t\tcase COLON:\n\t\t\t\t\t\t\tcase COMMA:\n\t\t\t\t\t\t\tcase SEMICOLON:\n\t\t\t\t\t\t\tcase OPENBRACES:\n\t\t\t\t\t\t\tcase CLOSEBRACES: {\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t// current buffer has a colon\n\t\t\t\t\t\t\t\tif (pseudo > 0) {\n\t\t\t\t\t\t\t\t\tinsert = 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// terminate line comment\n\t\t\t\t\tif (comment === FOWARDSLASH) {\n\t\t\t\t\t\tcomment = 0\n\t\t\t\t\t} else if (cascade + context === 0 && id !== KEYFRAME && chars.length > 0) {\n\t\t\t\t\t\tformat = 1\n\t\t\t\t\t\tchars += '\\0'\n\t\t\t\t\t}\n\n\t\t\t\t\t// execute plugins, newline context\n\t\t\t\t\tif (plugged * unkwn > 0) {\n\t\t\t\t\t\tproxy(UNKWN, chars, current, parent, line, column, out.length, id, depth, id)\n\t\t\t\t\t}\n\n\t\t\t\t\t// next line, reset column position\n\t\t\t\t\tcolumn = 1\n\t\t\t\t\tline++\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase SEMICOLON:\n\t\t\t\tcase CLOSEBRACES: {\n\t\t\t\t\tif (comment + quote + parentheses + bracket === 0) {\n\t\t\t\t\t\tcolumn++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\t// increment column position\n\t\t\t\t\tcolumn++\n\n\t\t\t\t\t// current character\n\t\t\t\t\tchar = body.charAt(caret)\n\n\t\t\t\t\t// remove comments, escape functions, strings, attributes and prepare selectors\n\t\t\t\t\tswitch (code) {\n\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\tcase SPACE: {\n\t\t\t\t\t\t\tif (quote + bracket + comment === 0) {\n\t\t\t\t\t\t\t\tswitch (tail) {\n\t\t\t\t\t\t\t\t\tcase COMMA:\n\t\t\t\t\t\t\t\t\tcase COLON:\n\t\t\t\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\t\t\t\tcase SPACE: {\n\t\t\t\t\t\t\t\t\t\tchar = ''\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\tif (code !== SPACE) {\n\t\t\t\t\t\t\t\t\t\t\tchar = ' '\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// escape breaking control characters\n\t\t\t\t\t\tcase NULL: {\n\t\t\t\t\t\t\tchar = '\\\\0'\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase FORMFEED: {\n\t\t\t\t\t\t\tchar = '\\\\f'\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase VERTICALTAB: {\n\t\t\t\t\t\t\tchar = '\\\\v'\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// &\n\t\t\t\t\t\tcase AND: {\n\t\t\t\t\t\t\t// inverted selector pattern i.e html &\n\t\t\t\t\t\t\tif (quote + comment + bracket === 0 && cascade > 0) {\n\t\t\t\t\t\t\t\tinvert = 1\n\t\t\t\t\t\t\t\tformat = 1\n\t\t\t\t\t\t\t\tchar = '\\f' + char\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// ::paceholder, l\n\t\t\t\t\t\t// :read-ony, l\n\t\t\t\t\t\tcase 108: {\n\t\t\t\t\t\t\tif (quote + comment + bracket + pattern === 0 && pseudo > 0) {\n\t\t\t\t\t\t\t\tswitch (caret - pseudo) {\n\t\t\t\t\t\t\t\t\t// ::placeholder\n\t\t\t\t\t\t\t\t\tcase 2: {\n\t\t\t\t\t\t\t\t\t\tif (tail === PLACEHOLDER && body.charCodeAt(caret-3) === COLON) {\n\t\t\t\t\t\t\t\t\t\t\tpattern = tail\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t// :read-only\n\t\t\t\t\t\t\t\t\tcase 8: {\n\t\t\t\t\t\t\t\t\t\tif (trail === READONLY) {\n\t\t\t\t\t\t\t\t\t\t\tpattern = trail\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase COLON: {\n\t\t\t\t\t\t\tif (quote + comment + bracket === 0) {\n\t\t\t\t\t\t\t\tpseudo = caret\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// selectors\n\t\t\t\t\t\tcase COMMA: {\n\t\t\t\t\t\t\tif (comment + parentheses + quote + bracket === 0) {\n\t\t\t\t\t\t\t\tformat = 1\n\t\t\t\t\t\t\t\tchar += '\\r'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// quotes\n\t\t\t\t\t\tcase DOUBLEQUOTE:\n\t\t\t\t\t\tcase SINGLEQUOTE: {\n\t\t\t\t\t\t\tif (comment === 0) {\n\t\t\t\t\t\t\t\tquote = quote === code ? 0 : (quote === 0 ? code : quote)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// attributes\n\t\t\t\t\t\tcase OPENBRACKET: {\n\t\t\t\t\t\t\tif (quote + comment + parentheses === 0) {\n\t\t\t\t\t\t\t\tbracket++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase CLOSEBRACKET: {\n\t\t\t\t\t\t\tif (quote + comment + parentheses === 0) {\n\t\t\t\t\t\t\t\tbracket--\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// functions\n\t\t\t\t\t\tcase CLOSEPARENTHESES: {\n\t\t\t\t\t\t\tif (quote + comment + bracket === 0) {\n\t\t\t\t\t\t\t\tparentheses--\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase OPENPARENTHESES: {\n\t\t\t\t\t\t\tif (quote + comment + bracket === 0) {\n\t\t\t\t\t\t\t\tif (context === 0) {\n\t\t\t\t\t\t\t\t\tswitch (tail*2 + trail*3) {\n\t\t\t\t\t\t\t\t\t\t// :matches\n\t\t\t\t\t\t\t\t\t\tcase 533: {\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t// :global, :not, :nth-child etc...\n\t\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\t\tcounter = 0\n\t\t\t\t\t\t\t\t\t\t\tcontext = 1\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tparentheses++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase AT: {\n\t\t\t\t\t\t\tif (comment + parentheses + quote + bracket + pseudo + atrule === 0) {\n\t\t\t\t\t\t\t\tatrule = 1\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// block/line comments\n\t\t\t\t\t\tcase STAR:\n\t\t\t\t\t\tcase FOWARDSLASH: {\n\t\t\t\t\t\t\tif (quote + bracket + parentheses > 0) {\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tswitch (comment) {\n\t\t\t\t\t\t\t\t// initialize line/block comment context\n\t\t\t\t\t\t\t\tcase 0: {\n\t\t\t\t\t\t\t\t\tswitch (code*2 + body.charCodeAt(caret+1)*3) {\n\t\t\t\t\t\t\t\t\t\t// //\n\t\t\t\t\t\t\t\t\t\tcase 235: {\n\t\t\t\t\t\t\t\t\t\t\tcomment = FOWARDSLASH\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t// /*\n\t\t\t\t\t\t\t\t\t\tcase 220: {\n\t\t\t\t\t\t\t\t\t\t\tlength = caret\n\t\t\t\t\t\t\t\t\t\t\tcomment = STAR\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// end block comment context\n\t\t\t\t\t\t\t\tcase STAR: {\n\t\t\t\t\t\t\t\t\tif (code === FOWARDSLASH && tail === STAR && length + 2 !== caret) {\n\t\t\t\t\t\t\t\t\t\t// /* ... */, !\n\t\t\t\t\t\t\t\t\t\tif (body.charCodeAt(length+2) === 33) {\n\t\t\t\t\t\t\t\t\t\t\tout += body.substring(length, caret+1)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tchar = ''\n\t\t\t\t\t\t\t\t\t\tcomment = 0\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// ignore comment blocks\n\t\t\t\t\tif (comment === 0) {\n\t\t\t\t\t\t// aggressive isolation mode, divide each individual selector\n\t\t\t\t\t\t// including selectors in :not function but excluding selectors in :global function\n\t\t\t\t\t\tif (cascade + quote + bracket + atrule === 0 && id !== KEYFRAME && code !== SEMICOLON) {\n\t\t\t\t\t\t\tswitch (code) {\n\t\t\t\t\t\t\t\tcase COMMA:\n\t\t\t\t\t\t\t\tcase TILDE:\n\t\t\t\t\t\t\t\tcase GREATERTHAN:\n\t\t\t\t\t\t\t\tcase PLUS:\n\t\t\t\t\t\t\t\tcase CLOSEPARENTHESES:\n\t\t\t\t\t\t\t\tcase OPENPARENTHESES: {\n\t\t\t\t\t\t\t\t\tif (context === 0) {\n\t\t\t\t\t\t\t\t\t\t// outside of an isolated context i.e nth-child(<...>)\n\t\t\t\t\t\t\t\t\t\tswitch (tail) {\n\t\t\t\t\t\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\t\t\t\t\t\tcase SPACE:\n\t\t\t\t\t\t\t\t\t\t\tcase NEWLINE:\n\t\t\t\t\t\t\t\t\t\t\tcase CARRIAGE: {\n\t\t\t\t\t\t\t\t\t\t\t\tchar = char + '\\0'\n\t\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\t\t\tchar = '\\0' + char + (code === COMMA ? '' : '\\0')\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tformat = 1\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// within an isolated context, sleep untill it's terminated\n\t\t\t\t\t\t\t\t\t\tswitch (code) {\n\t\t\t\t\t\t\t\t\t\t\tcase OPENPARENTHESES: {\n\t\t\t\t\t\t\t\t\t\t\t\t// :globa(\n\t\t\t\t\t\t\t\t\t\t\t\tif (pseudo + 7 === caret && tail === 108) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tpseudo = 0\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tcontext = ++counter\n\t\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tcase CLOSEPARENTHESES: {\n\t\t\t\t\t\t\t\t\t\t\t\tif ((context = --counter) === 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tformat = 1\n\t\t\t\t\t\t\t\t\t\t\t\t\tchar += '\\0'\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\t\t\tcase SPACE: {\n\t\t\t\t\t\t\t\t\tswitch (tail) {\n\t\t\t\t\t\t\t\t\t\tcase NULL:\n\t\t\t\t\t\t\t\t\t\tcase OPENBRACES:\n\t\t\t\t\t\t\t\t\t\tcase CLOSEBRACES:\n\t\t\t\t\t\t\t\t\t\tcase SEMICOLON:\n\t\t\t\t\t\t\t\t\t\tcase COMMA:\n\t\t\t\t\t\t\t\t\t\tcase FORMFEED:\n\t\t\t\t\t\t\t\t\t\tcase TAB:\n\t\t\t\t\t\t\t\t\t\tcase SPACE:\n\t\t\t\t\t\t\t\t\t\tcase NEWLINE:\n\t\t\t\t\t\t\t\t\t\tcase CARRIAGE: {\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\t\t// ignore in isolated contexts\n\t\t\t\t\t\t\t\t\t\t\tif (context === 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tformat = 1\n\t\t\t\t\t\t\t\t\t\t\t\tchar += '\\0'\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// concat buffer of characters\n\t\t\t\t\t\tchars += char\n\n\t\t\t\t\t\t// previous non-whitespace character code\n\t\t\t\t\t\tif (code !== SPACE && code !== TAB) {\n\t\t\t\t\t\t\tpeak = code\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// tail character codes\n\t\t\ttrail = tail\n\t\t\ttail = code\n\n\t\t\t// visit every character\n\t\t\tcaret++\n\t\t}\n\n\t\tlength = out.length\n\n\t\t// preserve empty selector\n \t\tif (preserve > 0) {\n \t\t\tif (length === 0 && children.length === 0 && (current[0].length === 0) === false) {\n \t\t\t\tif (id !== MEDIA || (current.length === 1 && (cascade > 0 ? nscopealt : nscope) === current[0])) {\n\t\t\t\t\tlength = current.join(',').length + 2\n \t\t\t\t}\n \t\t\t}\n\t\t}\n\n\t\tif (length > 0) {\n\t\t\t// cascade isolation mode?\n\t\t\tselector = cascade === 0 && id !== KEYFRAME ? isolate(current) : current\n\n\t\t\t// execute plugins, block context\n\t\t\tif (plugged > 0) {\n\t\t\t\tresult = proxy(BLCKS, out, selector, parent, line, column, length, id, depth, id)\n\n\t\t\t\tif (result !== void 0 && (out = result).length === 0) {\n\t\t\t\t\treturn flat + out + children\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tout = selector.join(',') + '{' + out + '}'\n\n\t\t\tif (prefix*pattern !== 0) {\n\t\t\t\tif (prefix === 2 && !vendor(out, 2))\n\t\t\t\t\tpattern = 0\n\n\t\t\t\tswitch (pattern) {\n\t\t\t\t\t// ::read-only\n\t\t\t\t\tcase READONLY: {\n\t\t\t\t\t\tout = out.replace(readonlyptn, ':'+moz+'$1')+out\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// ::placeholder\n\t\t\t\t\tcase PLACEHOLDER: {\n\t\t\t\t\t\tout = (\n\t\t\t\t\t\t\tout.replace(plcholdrptn, '::' + webkit + 'input-$1') +\n\t\t\t\t\t\t\tout.replace(plcholdrptn, '::' + moz + '$1') +\n\t\t\t\t\t\t\tout.replace(plcholdrptn, ':' + ms + 'input-$1') + out\n\t\t\t\t\t\t)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpattern = 0\n\t\t\t}\n\t\t}\n\n\t\treturn flat + out + children\n\t}\n\n\t/**\n\t * Select\n\t *\n\t * @param {Array} parent\n\t * @param {string} current\n\t * @param {number} invert\n\t * @return {Array}\n\t */\n\tfunction select (parent, current, invert) {\n\t\tvar selectors = current.trim().split(selectorptn)\n\t\tvar out = selectors\n\n\t\tvar length = selectors.length\n\t\tvar l = parent.length\n\n\t\tswitch (l) {\n\t\t\t// 0-1 parent selectors\n\t\t\tcase 0:\n\t\t\tcase 1: {\n\t\t\t\tfor (var i = 0, selector = l === 0 ? '' : parent[0] + ' '; i < length; ++i) {\n\t\t\t\t\tout[i] = scope(selector, out[i], invert, l).trim()\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// >2 parent selectors, nested\n\t\t\tdefault: {\n\t\t\t\tfor (var i = 0, j = 0, out = []; i < length; ++i) {\n\t\t\t\t\tfor (var k = 0; k < l; ++k) {\n\t\t\t\t\t\tout[j++] = scope(parent[k] + ' ', selectors[i], invert, l).trim()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn out\n\t}\n\n\t/**\n\t * Scope\n\t *\n\t * @param {string} parent\n\t * @param {string} current\n\t * @param {number} invert\n\t * @param {number} level\n\t * @return {string}\n\t */\n\tfunction scope (parent, current, invert, level) {\n\t\tvar selector = current\n\t\tvar code = selector.charCodeAt(0)\n\n\t\t// trim leading whitespace\n\t\tif (code < 33) {\n\t\t\tcode = (selector = selector.trim()).charCodeAt(0)\n\t\t}\n\n\t\tswitch (code) {\n\t\t\t// &\n\t\t\tcase AND: {\n\t\t\t\tswitch (cascade + level) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 1: {\n\t\t\t\t\t\tif (parent.trim().length === 0) {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\treturn selector.replace(andptn, '$1'+parent.trim())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// :\n\t\t\tcase COLON: {\n\t\t\t\tswitch (selector.charCodeAt(1)) {\n\t\t\t\t\t// g in :global\n\t\t\t\t\tcase 103: {\n\t\t\t\t\t\tif (escape > 0 && cascade > 0) {\n\t\t\t\t\t\t\treturn selector.replace(escapeptn, '$1').replace(andptn, '$1'+nscope)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\t// :hover\n\t\t\t\t\t\treturn parent.trim() + selector.replace(andptn, '$1'+parent.trim())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// html &\n\t\t\t\tif (invert*cascade > 0 && selector.indexOf('\\f') > 0) {\n\t\t\t\t\treturn selector.replace(andptn, (parent.charCodeAt(0) === COLON ? '' : '$1')+parent.trim())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn parent + selector\n\t}\n\n\t/**\n\t * Property\n\t *\n\t * @param {string} input\n\t * @param {number} first\n\t * @param {number} second\n\t * @param {number} third\n\t * @return {string}\n\t */\n\tfunction property (input, first, second, third) {\n\t\tvar index = 0\n\t\tvar out = input + ';'\n\t\tvar hash = (first*2) + (second*3) + (third*4)\n\t\tvar cache\n\n\t\t// animation: a, n, i characters\n\t\tif (hash === 944) {\n\t\t\treturn animation(out)\n\t\t} else if (prefix === 0 || (prefix === 2 && !vendor(out, 1))) {\n\t\t\treturn out\n\t\t}\n\n\t\t// vendor prefix\n\t\tswitch (hash) {\n\t\t\t// text-decoration/text-size-adjust/text-shadow/text-align/text-transform: t, e, x\n\t\t\tcase 1015: {\n\t\t\t\t// text-shadow/text-align/text-transform, a\n\t\t\t\treturn out.charCodeAt(10) === 97 ? webkit + out + out : out\n\t\t\t}\n\t\t\t// filter/fill f, i, l\n\t\t\tcase 951: {\n\t\t\t\t// filter, t\n\t\t\t\treturn out.charCodeAt(3) === 116 ? webkit + out + out : out\n\t\t\t}\n\t\t\t// color/column, c, o, l\n\t\t\tcase 963: {\n\t\t\t\t// column, n\n\t\t\t\treturn out.charCodeAt(5) === 110 ? webkit + out + out : out\n\t\t\t}\n\t\t\t// box-decoration-break, b, o, x\n\t\t\tcase 1009: {\n\t\t\t\tif (out.charCodeAt(4) !== 100) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\t// mask, m, a, s\n\t\t\t// clip-path, c, l, i\n\t\t\tcase 969:\n\t\t\tcase 942: {\n\t\t\t\treturn webkit + out + out\n\t\t\t}\n\t\t\t// appearance: a, p, p\n\t\t\tcase 978: {\n\t\t\t\treturn webkit + out + moz + out + out\n\t\t\t}\n\t\t\t// hyphens: h, y, p\n\t\t\t// user-select: u, s, e\n\t\t\tcase 1019:\n\t\t\tcase 983: {\n\t\t\t\treturn webkit + out + moz + out + ms + out + out\n\t\t\t}\n\t\t\t// background/backface-visibility, b, a, c\n\t\t\tcase 883: {\n\t\t\t\t// backface-visibility, -\n\t\t\t\tif (out.charCodeAt(8) === DASH) {\n\t\t\t\t\treturn webkit + out + out\n\t\t\t\t}\n\n\t\t\t\t// image-set(...)\n\t\t\t\tif (out.indexOf('image-set(', 11) > 0) {\n\t\t\t\t\treturn out.replace(imgsrcptn, '$1'+webkit+'$2') + out\n\t\t\t\t}\n\n\t\t\t\treturn out\n\t\t\t}\n\t\t\t// flex: f, l, e\n\t\t\tcase 932: {\n\t\t\t\tif (out.charCodeAt(4) === DASH) {\n\t\t\t\t\tswitch (out.charCodeAt(5)) {\n\t\t\t\t\t\t// flex-grow, g\n\t\t\t\t\t\tcase 103: {\n\t\t\t\t\t\t\treturn webkit + 'box-' + out.replace('-grow', '') + webkit + out + ms + out.replace('grow', 'positive') + out\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// flex-shrink, s\n\t\t\t\t\t\tcase 115: {\n\t\t\t\t\t\t\treturn webkit + out + ms + out.replace('shrink', 'negative') + out\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// flex-basis, b\n\t\t\t\t\t\tcase 98: {\n\t\t\t\t\t\t\treturn webkit + out + ms + out.replace('basis', 'preferred-size') + out\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn webkit + out + ms + out + out\n\t\t\t}\n\t\t\t// order: o, r, d\n\t\t\tcase 964: {\n\t\t\t\treturn webkit + out + ms + 'flex' + '-' + out + out\n\t\t\t}\n\t\t\t// justify-items/justify-content, j, u, s\n\t\t\tcase 1023: {\n\t\t\t\t// justify-content, c\n\t\t\t\tif (out.charCodeAt(8) !== 99) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tcache = out.substring(out.indexOf(':', 15)).replace('flex-', '').replace('space-between', 'justify')\n\t\t\t\treturn webkit + 'box-pack' + cache + webkit + out + ms + 'flex-pack' + cache + out\n\t\t\t}\n\t\t\t// cursor, c, u, r\n\t\t\tcase 1005: {\n\t\t\t\treturn cursorptn.test(out) ? out.replace(colonptn, ':' + webkit) + out.replace(colonptn, ':' + moz) + out : out\n\t\t\t}\n\t\t\t// writing-mode, w, r, i\n\t\t\tcase 1000: {\n\t\t\t\tcache = out.substring(13).trim()\n\t\t\t\tindex = cache.indexOf('-') + 1\n\n\t\t\t\tswitch (cache.charCodeAt(0)+cache.charCodeAt(index)) {\n\t\t\t\t\t// vertical-lr\n\t\t\t\t\tcase 226: {\n\t\t\t\t\t\tcache = out.replace(writingptn, 'tb')\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// vertical-rl\n\t\t\t\t\tcase 232: {\n\t\t\t\t\t\tcache = out.replace(writingptn, 'tb-rl')\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// horizontal-tb\n\t\t\t\t\tcase 220: {\n\t\t\t\t\t\tcache = out.replace(writingptn, 'lr')\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\treturn out\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn webkit + out + ms + cache + out\n\t\t\t}\n\t\t\t// position: sticky\n\t\t\tcase 1017: {\n\t\t\t\tif (out.indexOf('sticky', 9) === -1) {\n\t\t\t\t\treturn out\n\t\t\t\t}\n\t\t\t}\n\t\t\t// display(flex/inline-flex/inline-box): d, i, s\n\t\t\tcase 975: {\n\t\t\t\tindex = (out = input).length - 10\n\t\t\t\tcache = (out.charCodeAt(index) === 33 ? out.substring(0, index) : out).substring(input.indexOf(':', 7) + 1).trim()\n\n\t\t\t\tswitch (hash = cache.charCodeAt(0) + (cache.charCodeAt(7)|0)) {\n\t\t\t\t\t// inline-\n\t\t\t\t\tcase 203: {\n\t\t\t\t\t\t// inline-box\n\t\t\t\t\t\tif (cache.charCodeAt(8) < 111) {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// inline-box/sticky\n\t\t\t\t\tcase 115: {\n\t\t\t\t\t\tout = out.replace(cache, webkit+cache)+';'+out\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// inline-flex\n\t\t\t\t\t// flex\n\t\t\t\t\tcase 207:\n\t\t\t\t\tcase 102: {\n\t\t\t\t\t\tout = (\n\t\t\t\t\t\t\tout.replace(cache, webkit+(hash > 102 ? 'inline-' : '')+'box')+';'+\n\t\t\t\t\t\t\tout.replace(cache, webkit+cache)+';'+\n\t\t\t\t\t\t\tout.replace(cache, ms+cache+'box')+';'+\n\t\t\t\t\t\t\tout\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn out + ';'\n\t\t\t}\n\t\t\t// align-items, align-center, align-self: a, l, i, -\n\t\t\tcase 938: {\n\t\t\t\tif (out.charCodeAt(5) === DASH) {\n\t\t\t\t\tswitch (out.charCodeAt(6)) {\n\t\t\t\t\t\t// align-items, i\n\t\t\t\t\t\tcase 105: {\n\t\t\t\t\t\t\tcache = out.replace('-items', '')\n\t\t\t\t\t\t\treturn webkit + out + webkit + 'box-' + cache + ms + 'flex-' + cache + out\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// align-self, s\n\t\t\t\t\t\tcase 115: {\n\t\t\t\t\t\t\treturn webkit + out + ms + 'flex-item-' + out.replace(selfptn, '') + out\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// align-content\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\treturn webkit + out + ms + 'flex-line-pack' + out.replace('align-content', '').replace(selfptn, '') + out\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// min/max\n\t\t\tcase 973:\n\t\t\tcase 989: {\n\t\t\t\t// min-/max- height/width/block-size/inline-size\n\t\t\t\tif (out.charCodeAt(3) !== DASH || out.charCodeAt(4) === 122) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\t// height/width: min-content / width: max-content\n\t\t\tcase 931:\n\t\t\tcase 953: {\n\t\t\t\tif (dimensionptn.test(input) === true) {\n\t\t\t\t\t// stretch\n\t\t\t\t\tif ((cache = input.substring(input.indexOf(':') + 1)).charCodeAt(0) === 115)\n\t\t\t\t\t\treturn property(input.replace('stretch', 'fill-available'), first, second, third).replace(':fill-available', ':stretch')\n\t\t\t\t\telse\n\t\t\t\t\t\treturn out.replace(cache, webkit + cache) + out.replace(cache, moz + cache.replace('fill-', '')) + out\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// transform, transition: t, r, a\n\t\t\tcase 962: {\n\t\t\t\tout = webkit + out + (out.charCodeAt(5) === 102 ? ms + out : '') + out\n\n\t\t\t\t// transitions\n\t\t\t\tif (second + third === 211 && out.charCodeAt(13) === 105 && out.indexOf('transform', 10) > 0) {\n\t\t\t\t\treturn out.substring(0, out.indexOf(';', 27) + 1).replace(transformptn, '$1' + webkit + '$2') + out\n\t\t\t\t}\n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\treturn out\n\t}\n\n\t/**\n\t * Vendor\n\t *\n\t * @param {string} content\n\t * @param {number} context\n\t * @return {boolean}\n\t */\n\tfunction vendor (content, context) {\n\t\tvar index = content.indexOf(context === 1 ? ':' : '{')\n\t\tvar key = content.substring(0, context !== 3 ? index : 10)\n\t\tvar value = content.substring(index + 1, content.length - 1)\n\n\t\treturn should(context !== 2 ? key : key.replace(pseudofmt, '$1'), value, context)\n\t}\n\n\t/**\n\t * Supports\n\t *\n\t * @param {string} match\n\t * @param {string} group\n\t * @return {string}\n\t */\n\tfunction supports (match, group) {\n\t\tvar out = property(group, group.charCodeAt(0), group.charCodeAt(1), group.charCodeAt(2))\n\n\t\treturn out !== group+';' ? out.replace(propertyptn, ' or ($1)').substring(4) : '('+group+')'\n\t}\n\n\t/**\n\t * Animation\n\t *\n\t * @param {string} input\n\t * @return {string}\n\t */\n\tfunction animation (input) {\n\t\tvar length = input.length\n\t\tvar index = input.indexOf(':', 9) + 1\n\t\tvar declare = input.substring(0, index).trim()\n\t\tvar out = input.substring(index, length-1).trim()\n\n\t\tswitch (input.charCodeAt(9)*keyed) {\n\t\t\tcase 0: {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// animation-*, -\n\t\t\tcase DASH: {\n\t\t\t\t// animation-name, n\n\t\t\t\tif (input.charCodeAt(10) !== 110) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\t// animation/animation-name\n\t\t\tdefault: {\n\t\t\t\t// split in case of multiple animations\n\t\t\t\tvar list = out.split((out = '', animationptn))\n\n\t\t\t\tfor (var i = 0, index = 0, length = list.length; i < length; index = 0, ++i) {\n\t\t\t\t\tvar value = list[i]\n\t\t\t\t\tvar items = value.split(propertiesptn)\n\n\t\t\t\t\twhile (value = items[index]) {\n\t\t\t\t\t\tvar peak = value.charCodeAt(0)\n\n\t\t\t\t\t\tif (keyed === 1 && (\n\t\t\t\t\t\t\t// letters\n\t\t\t\t\t\t\t(peak > AT && peak < 90) || (peak > 96 && peak < 123) || peak === UNDERSCORE ||\n\t\t\t\t\t\t\t// dash but not in sequence i.e --\n\t\t\t\t\t\t\t(peak === DASH && value.charCodeAt(1) !== DASH)\n\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t// not a number/function\n\t\t\t\t\t\t\tswitch (isNaN(parseFloat(value)) + (value.indexOf('(') !== -1)) {\n\t\t\t\t\t\t\t\tcase 1: {\n\t\t\t\t\t\t\t\t\tswitch (value) {\n\t\t\t\t\t\t\t\t\t\t// not a valid reserved keyword\n\t\t\t\t\t\t\t\t\t\tcase 'infinite': case 'alternate': case 'backwards': case 'running':\n\t\t\t\t\t\t\t\t\t\tcase 'normal': case 'forwards': case 'both': case 'none': case 'linear':\n\t\t\t\t\t\t\t\t\t\tcase 'ease': case 'ease-in': case 'ease-out': case 'ease-in-out':\n\t\t\t\t\t\t\t\t\t\tcase 'paused': case 'reverse': case 'alternate-reverse': case 'inherit':\n\t\t\t\t\t\t\t\t\t\tcase 'initial': case 'unset': case 'step-start': case 'step-end': {\n\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\t\tvalue += key\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titems[index++] = value\n\t\t\t\t\t}\n\n\t\t\t\t\tout += (i === 0 ? '' : ',') + items.join(' ')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tout = declare + out + ';'\n\n\t\tif (prefix === 1 || (prefix === 2 && vendor(out, 1)))\n\t\t\treturn webkit + out + out\n\n\t\treturn out\n\t}\n\n\t/**\n\t * Isolate\n\t *\n\t * @param {Array} current\n\t */\n\tfunction isolate (current) {\n\t\tfor (var i = 0, length = current.length, selector = Array(length), padding, element; i < length; ++i) {\n\t\t\t// split individual elements in a selector i.e h1 h2 === [h1, h2]\n\t\t\tvar elements = current[i].split(elementptn)\n\t\t\tvar out = ''\n\n\t\t\tfor (var j = 0, size = 0, tail = 0, code = 0, l = elements.length; j < l; ++j) {\n\t\t\t\t// empty element\n\t\t\t\tif ((size = (element = elements[j]).length) === 0 && l > 1) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\ttail = out.charCodeAt(out.length-1)\n\t\t\t\tcode = element.charCodeAt(0)\n\t\t\t\tpadding = ''\n\n\t\t\t\tif (j !== 0) {\n\t\t\t\t\t// determine if we need padding\n\t\t\t\t\tswitch (tail) {\n\t\t\t\t\t\tcase STAR:\n\t\t\t\t\t\tcase TILDE:\n\t\t\t\t\t\tcase GREATERTHAN:\n\t\t\t\t\t\tcase PLUS:\n\t\t\t\t\t\tcase SPACE:\n\t\t\t\t\t\tcase OPENPARENTHESES: {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\tpadding = ' '\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch (code) {\n\t\t\t\t\tcase AND: {\n\t\t\t\t\t\telement = padding + nscopealt\n\t\t\t\t\t}\n\t\t\t\t\tcase TILDE:\n\t\t\t\t\tcase GREATERTHAN:\n\t\t\t\t\tcase PLUS:\n\t\t\t\t\tcase SPACE:\n\t\t\t\t\tcase CLOSEPARENTHESES:\n\t\t\t\t\tcase OPENPARENTHESES: {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase OPENBRACKET: {\n\t\t\t\t\t\telement = padding + element + nscopealt\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase COLON: {\n\t\t\t\t\t\tswitch (element.charCodeAt(1)*2 + element.charCodeAt(2)*3) {\n\t\t\t\t\t\t\t// :global\n\t\t\t\t\t\t\tcase 530: {\n\t\t\t\t\t\t\t\tif (escape > 0) {\n\t\t\t\t\t\t\t\t\telement = padding + element.substring(8, size - 1)\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// :hover, :nth-child(), ...\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\tif (j < 1 || elements[j-1].length < 1) {\n\t\t\t\t\t\t\t\t\telement = padding + nscopealt + element\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase COMMA: {\n\t\t\t\t\t\tpadding = ''\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tif (size > 1 && element.indexOf(':') > 0) {\n\t\t\t\t\t\t\telement = padding + element.replace(pseudoptn, '$1' + nscopealt + '$2')\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telement = padding + element + nscopealt\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tout += element\n\t\t\t}\n\n\t\t\tselector[i] = out.replace(formatptn, '').trim()\n\t\t}\n\n\t\treturn selector\n\t}\n\n\t/**\n\t * Proxy\n\t *\n\t * @param {number} context\n\t * @param {string} content\n\t * @param {Array} selectors\n\t * @param {Array} parents\n\t * @param {number} line\n\t * @param {number} column\n\t * @param {number} length\n\t * @param {number} id\n\t * @param {number} depth\n\t * @param {number} at\n\t * @return {(string|void|*)}\n\t */\n\tfunction proxy (context, content, selectors, parents, line, column, length, id, depth, at) {\n\t\tfor (var i = 0, out = content, next; i < plugged; ++i) {\n\t\t\tswitch (next = plugins[i].call(stylis, context, out, selectors, parents, line, column, length, id, depth, at)) {\n\t\t\t\tcase void 0:\n\t\t\t\tcase false:\n\t\t\t\tcase true:\n\t\t\t\tcase null: {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tout = next\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (out !== content) {\n\t\t return out\n\t\t}\n\t}\n\n\t/**\n\t * @param {number} code\n\t * @param {number} index\n\t * @param {number} length\n\t * @param {string} body\n\t * @return {number}\n\t */\n\tfunction delimited (code, index, length, body) {\n\t\tfor (var i = index + 1; i < length; ++i) {\n\t\t\tswitch (body.charCodeAt(i)) {\n\t\t\t\t// /*\n\t\t\t\tcase FOWARDSLASH: {\n\t\t\t\t\tif (code === STAR) {\n\t\t\t\t\t\tif (body.charCodeAt(i - 1) === STAR && index + 2 !== i) {\n\t\t\t\t\t\t\treturn i + 1\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t// //\n\t\t\t\tcase NEWLINE: {\n\t\t\t\t\tif (code === FOWARDSLASH) {\n\t\t\t\t\t\treturn i + 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn i\n\t}\n\n\t/**\n\t * @param {number} type\n\t * @param {number} index\n\t * @param {number} length\n\t * @param {number} find\n\t * @param {string} body\n\t * @return {number}\n\t */\n\tfunction match (type, index, length, body) {\n\t\tfor (var i = index + 1; i < length; ++i) {\n\t\t\tswitch (body.charCodeAt(i)) {\n\t\t\t\tcase type: {\n\t\t\t\t\treturn i\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn i\n\t}\n\n\t/**\n\t * Minify\n\t *\n\t * @param {(string|*)} output\n\t * @return {string}\n\t */\n\tfunction minify (output) {\n\t\treturn output\n\t\t\t.replace(formatptn, '')\n\t\t\t.replace(beforeptn, '')\n\t\t\t.replace(afterptn, '$1')\n\t\t\t.replace(tailptn, '$1')\n\t\t\t.replace(whiteptn, ' ')\n\t}\n\n\t/**\n\t * Use\n\t *\n\t * @param {(Array|function(...?)|number|void)?} plugin\n\t */\n\tfunction use (plugin) {\n\t\tswitch (plugin) {\n\t\t\tcase void 0:\n\t\t\tcase null: {\n\t\t\t\tplugged = plugins.length = 0\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (typeof plugin === 'function') {\n\t\t\t\t\tplugins[plugged++] = plugin\n\t\t\t\t}\telse if (typeof plugin === 'object') {\n\t\t\t\t\tfor (var i = 0, length = plugin.length; i < length; ++i) {\n\t\t\t\t\t\tuse(plugin[i])\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tunkwn = !!plugin|0\n\t\t\t\t}\n\t\t\t}\n \t\t}\n\n \t\treturn use\n\t}\n\n\t/**\n\t * Set\n\t *\n\t * @param {*} options\n\t */\n\tfunction set (options) {\n\t\tfor (var name in options) {\n\t\t\tvar value = options[name]\n\t\t\tswitch (name) {\n\t\t\t\tcase 'keyframe': keyed = value|0; break\n\t\t\t\tcase 'global': escape = value|0; break\n\t\t\t\tcase 'cascade': cascade = value|0; break\n\t\t\t\tcase 'compress': compress = value|0; break\n\t\t\t\tcase 'semicolon': semicolon = value|0; break\n\t\t\t\tcase 'preserve': preserve = value|0; break\n\t\t\t\tcase 'prefix':\n\t\t\t\t\tshould = null\n\n\t\t\t\t\tif (!value) {\n\t\t\t\t\t\tprefix = 0\n\t\t\t\t\t} else if (typeof value !== 'function') {\n\t\t\t\t\t\tprefix = 1\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprefix = 2\n\t\t\t\t\t\tshould = value\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn set\n\t}\n\n\t/**\n\t * Stylis\n\t *\n\t * @param {string} selector\n\t * @param {string} input\n\t * @return {*}\n\t */\n\tfunction stylis (selector, input) {\n\t\tif (this !== void 0 && this.constructor === stylis) {\n\t\t\treturn factory(selector)\n\t\t}\n\n\t\t// setup\n\t\tvar ns = selector\n\t\tvar code = ns.charCodeAt(0)\n\n\t\t// trim leading whitespace\n\t\tif (code < 33) {\n\t\t\tcode = (ns = ns.trim()).charCodeAt(0)\n\t\t}\n\n\t\t// keyframe/animation namespace\n\t\tif (keyed > 0) {\n\t\t\tkey = ns.replace(invalidptn, code === OPENBRACKET ? '' : '-')\n\t\t}\n\n\t\t// reset, used to assert if a plugin is moneky-patching the return value\n\t\tcode = 1\n\n\t\t// cascade/isolate\n\t\tif (cascade === 1) {\n\t\t\tnscope = ns\n\t\t} else {\n\t\t\tnscopealt = ns\n\t\t}\n\n\t\tvar selectors = [nscope]\n\t\tvar result\n\n\t\t// execute plugins, pre-process context\n\t\tif (plugged > 0) {\n\t\t\tresult = proxy(PREPS, input, selectors, selectors, line, column, 0, 0, 0, 0)\n\n\t\t\tif (result !== void 0 && typeof result === 'string') {\n\t\t\t\tinput = result\n\t\t\t}\n\t\t}\n\n\t\t// build\n\t\tvar output = compile(array, selectors, input, 0, 0)\n\n\t\t// execute plugins, post-process context\n\t\tif (plugged > 0) {\n\t\t\tresult = proxy(POSTS, output, selectors, selectors, line, column, output.length, 0, 0, 0)\n\n\t\t\t// bypass minification\n\t\t\tif (result !== void 0 && typeof(output = result) !== 'string') {\n\t\t\t\tcode = 0\n\t\t\t}\n\t\t}\n\n\t\t// reset\n\t\tkey = ''\n\t\tnscope = ''\n\t\tnscopealt = ''\n\t\tpattern = 0\n\t\tline = 1\n\t\tcolumn = 1\n\n\t\treturn compress*code === 0 ? output : minify(output)\n\t}\n\n\tstylis['use'] = use\n\tstylis['set'] = set\n\n\tif (options !== void 0) {\n\t\tset(options)\n\t}\n\n\treturn stylis\n}));\n","module.exports = intersectNode;\n\nfunction intersectNode(node, point) {\n // console.info('Intersect Node');\n return node.intersect(point);\n}\n","var map = {\n\t\"./locale\": 98,\n\t\"./locale.js\": 98\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 171;","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar rgba_1 = require(\"./rgba\"); // Alias\nexports.hex = rgba_1.default;\nvar rgba_2 = require(\"./rgba\"); // Alias\nexports.rgb = rgba_2.default;\nvar rgba_3 = require(\"./rgba\");\nexports.rgba = rgba_3.default;\nvar hsla_1 = require(\"./hsla\"); // Alias\nexports.hsl = hsla_1.default;\nvar hsla_2 = require(\"./hsla\");\nexports.hsla = hsla_2.default;\nvar channel_1 = require(\"./channel\");\nexports.channel = channel_1.default;\nvar red_1 = require(\"./red\");\nexports.red = red_1.default;\nvar green_1 = require(\"./green\");\nexports.green = green_1.default;\nvar blue_1 = require(\"./blue\");\nexports.blue = blue_1.default;\nvar hue_1 = require(\"./hue\");\nexports.hue = hue_1.default;\nvar saturation_1 = require(\"./saturation\");\nexports.saturation = saturation_1.default;\nvar lightness_1 = require(\"./lightness\");\nexports.lightness = lightness_1.default;\nvar alpha_1 = require(\"./alpha\");\nexports.alpha = alpha_1.default;\nvar alpha_2 = require(\"./alpha\"); // Alias\nexports.opacity = alpha_2.default;\nvar luminance_1 = require(\"./luminance\");\nexports.luminance = luminance_1.default;\nvar is_dark_1 = require(\"./is_dark\");\nexports.isDark = is_dark_1.default;\nvar is_light_1 = require(\"./is_light\");\nexports.isLight = is_light_1.default;\nvar is_valid_1 = require(\"./is_valid\");\nexports.isValid = is_valid_1.default;\nvar saturate_1 = require(\"./saturate\");\nexports.saturate = saturate_1.default;\nvar desaturate_1 = require(\"./desaturate\");\nexports.desaturate = desaturate_1.default;\nvar lighten_1 = require(\"./lighten\");\nexports.lighten = lighten_1.default;\nvar darken_1 = require(\"./darken\");\nexports.darken = darken_1.default;\nvar opacify_1 = require(\"./opacify\");\nexports.opacify = opacify_1.default;\nvar opacify_2 = require(\"./opacify\"); // Alias\nexports.fadeIn = opacify_2.default;\nvar transparentize_1 = require(\"./transparentize\");\nexports.transparentize = transparentize_1.default;\nvar transparentize_2 = require(\"./transparentize\"); // Alias\nexports.fadeOut = transparentize_2.default;\nvar complement_1 = require(\"./complement\");\nexports.complement = complement_1.default;\nvar grayscale_1 = require(\"./grayscale\");\nexports.grayscale = grayscale_1.default;\nvar adjust_1 = require(\"./adjust\");\nexports.adjust = adjust_1.default;\nvar change_1 = require(\"./change\");\nexports.change = change_1.default;\nvar invert_1 = require(\"./invert\");\nexports.invert = invert_1.default;\nvar mix_1 = require(\"./mix\");\nexports.mix = mix_1.default;\nvar scale_1 = require(\"./scale\");\nexports.scale = scale_1.default;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* CHANNEL */\nvar Channel = {\n /* CLAMP */\n min: {\n r: 0,\n g: 0,\n b: 0,\n s: 0,\n l: 0,\n a: 0\n },\n max: {\n r: 255,\n g: 255,\n b: 255,\n h: 360,\n s: 100,\n l: 100,\n a: 1\n },\n clamp: {\n r: function (r) { return r >= 255 ? 255 : (r < 0 ? 0 : r); },\n g: function (g) { return g >= 255 ? 255 : (g < 0 ? 0 : g); },\n b: function (b) { return b >= 255 ? 255 : (b < 0 ? 0 : b); },\n h: function (h) { return h % 360; },\n s: function (s) { return s >= 100 ? 100 : (s < 0 ? 0 : s); },\n l: function (l) { return l >= 100 ? 100 : (l < 0 ? 0 : l); },\n a: function (a) { return a >= 1 ? 1 : (a < 0 ? 0 : a); }\n },\n /* CONVERSION */\n //SOURCE: https://planetcalc.com/7779\n toLinear: function (c) {\n var n = c / 255;\n return c > .03928 ? Math.pow(((n + .055) / 1.055), 2.4) : n / 12.92;\n },\n //SOURCE: https://gist.github.com/mjackson/5311256\n hue2rgb: function (p, q, t) {\n if (t < 0)\n t += 1;\n if (t > 1)\n t -= 1;\n if (t < 1 / 6)\n return p + (q - p) * 6 * t;\n if (t < 1 / 2)\n return q;\n if (t < 2 / 3)\n return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n },\n hsl2rgb: function (_a, channel) {\n var h = _a.h, s = _a.s, l = _a.l;\n if (s === 100)\n return l * 2.55; // Achromatic\n h /= 360;\n s /= 100;\n l /= 100;\n var q = (l < .5) ? l * (1 + s) : (l + s) - (l * s), p = 2 * l - q;\n switch (channel) {\n case 'r': return Channel.hue2rgb(p, q, h + 1 / 3) * 255;\n case 'g': return Channel.hue2rgb(p, q, h) * 255;\n case 'b': return Channel.hue2rgb(p, q, h - 1 / 3) * 255;\n }\n },\n rgb2hsl: function (_a, channel) {\n var r = _a.r, g = _a.g, b = _a.b;\n r /= 255;\n g /= 255;\n b /= 255;\n var max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2;\n if (channel === 'l')\n return l * 100;\n if (max === min)\n return 0; // Achromatic\n var d = max - min, s = (l > .5) ? d / (2 - max - min) : d / (max + min);\n if (channel === 's')\n return s * 100;\n switch (max) {\n case r: return ((g - b) / d + (g < b ? 6 : 0)) * 60;\n case g: return ((b - r) / d + 2) * 60;\n case b: return ((r - g) / d + 4) * 60;\n default: return -1; //TSC: TypeScript is stupid and complains if there isn't this useless default statement\n }\n }\n};\n/* EXPORT */\nexports.default = Channel;\n","\"use strict\";\n/* LANG */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Lang = {\n round: function (number) {\n return Math.round(number * 10000000000) / 10000000000;\n }\n};\n/* EXPORT */\nexports.default = Lang;\n","\"use strict\";\n/* UNIT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Unit = {\n frac2hex: function (frac) {\n var hex = Math.round(frac * 255).toString(16);\n return hex.length > 1 ? hex : \"0\" + hex;\n },\n dec2hex: function (dec) {\n var hex = Math.round(dec).toString(16);\n return hex.length > 1 ? hex : \"0\" + hex;\n }\n};\n/* EXPORT */\nexports.default = Unit;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar types_1 = require(\"../types\");\nvar type_1 = require(\"./type\");\n/* CHANNELS */\nvar Channels = /** @class */ (function () {\n /* CONSTRUCTOR */\n function Channels(data, color) {\n this.color = color;\n this.changed = false;\n this.data = data; //TSC\n this.type = new type_1.default();\n }\n /* API */\n Channels.prototype.set = function (data, color) {\n this.color = color;\n this.changed = false;\n this.data = data; //TSC\n this.type.type = types_1.TYPE.ALL;\n return this;\n };\n /* HELPERS */\n Channels.prototype._ensureHSL = function () {\n if (this.data.h === undefined)\n this.data.h = utils_1.default.channel.rgb2hsl(this.data, 'h');\n if (this.data.s === undefined)\n this.data.s = utils_1.default.channel.rgb2hsl(this.data, 's');\n if (this.data.l === undefined)\n this.data.l = utils_1.default.channel.rgb2hsl(this.data, 'l');\n };\n Channels.prototype._ensureRGB = function () {\n if (this.data.r === undefined)\n this.data.r = utils_1.default.channel.hsl2rgb(this.data, 'r');\n if (this.data.g === undefined)\n this.data.g = utils_1.default.channel.hsl2rgb(this.data, 'g');\n if (this.data.b === undefined)\n this.data.b = utils_1.default.channel.hsl2rgb(this.data, 'b');\n };\n Object.defineProperty(Channels.prototype, \"r\", {\n /* GETTERS */\n get: function () {\n if (!this.type.is(types_1.TYPE.HSL) && this.data.r !== undefined)\n return this.data.r;\n this._ensureHSL();\n return utils_1.default.channel.hsl2rgb(this.data, 'r');\n },\n /* SETTERS */\n set: function (r) {\n this.type.set(types_1.TYPE.RGB);\n this.changed = true;\n this.data.r = r;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Channels.prototype, \"g\", {\n get: function () {\n if (!this.type.is(types_1.TYPE.HSL) && this.data.g !== undefined)\n return this.data.g;\n this._ensureHSL();\n return utils_1.default.channel.hsl2rgb(this.data, 'g');\n },\n set: function (g) {\n this.type.set(types_1.TYPE.RGB);\n this.changed = true;\n this.data.g = g;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Channels.prototype, \"b\", {\n get: function () {\n if (!this.type.is(types_1.TYPE.HSL) && this.data.b !== undefined)\n return this.data.b;\n this._ensureHSL();\n return utils_1.default.channel.hsl2rgb(this.data, 'b');\n },\n set: function (b) {\n this.type.set(types_1.TYPE.RGB);\n this.changed = true;\n this.data.b = b;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Channels.prototype, \"h\", {\n get: function () {\n if (!this.type.is(types_1.TYPE.RGB) && this.data.h !== undefined)\n return this.data.h;\n this._ensureRGB();\n return utils_1.default.channel.rgb2hsl(this.data, 'h');\n },\n set: function (h) {\n this.type.set(types_1.TYPE.HSL);\n this.changed = true;\n this.data.h = h;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Channels.prototype, \"s\", {\n get: function () {\n if (!this.type.is(types_1.TYPE.RGB) && this.data.s !== undefined)\n return this.data.s;\n this._ensureRGB();\n return utils_1.default.channel.rgb2hsl(this.data, 's');\n },\n set: function (s) {\n this.type.set(types_1.TYPE.HSL);\n this.changed = true;\n this.data.s = s;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Channels.prototype, \"l\", {\n get: function () {\n if (!this.type.is(types_1.TYPE.RGB) && this.data.l !== undefined)\n return this.data.l;\n this._ensureRGB();\n return utils_1.default.channel.rgb2hsl(this.data, 'l');\n },\n set: function (l) {\n this.type.set(types_1.TYPE.HSL);\n this.changed = true;\n this.data.l = l;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Channels.prototype, \"a\", {\n get: function () {\n return this.data.a;\n },\n set: function (a) {\n this.changed = true;\n this.data.a = a;\n },\n enumerable: true,\n configurable: true\n });\n return Channels;\n}());\n/* EXPORT */\nexports.default = Channels;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar types_1 = require(\"../types\");\n/* TYPE */\nvar Type = /** @class */ (function () {\n function Type() {\n this.type = types_1.TYPE.ALL;\n }\n Type.prototype.get = function () {\n return this.type;\n };\n Type.prototype.set = function (type) {\n if (this.type && this.type !== type)\n throw new Error('Cannot change both RGB and HSL channels at the same time');\n this.type = type;\n };\n Type.prototype.reset = function () {\n this.type = types_1.TYPE.ALL;\n };\n Type.prototype.is = function (type) {\n return this.type === type;\n };\n return Type;\n}());\n/* EXPORT */\nexports.default = Type;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"./utils\");\n/* CONSTS */\nvar DEC2HEX = {};\nexports.DEC2HEX = DEC2HEX;\nfor (var i = 0; i <= 255; i++)\n DEC2HEX[i] = utils_1.default.unit.dec2hex(i); // Populating dynamically, striking a balance between code size and performance\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar hex_1 = require(\"./hex\");\n/* KEYWORD */\nvar Keyword = {\n /* VARIABLES */\n colors: {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyanaqua: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n transparent: '#00000000',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n },\n /* API */\n parse: function (color) {\n color = color.toLowerCase();\n var hex = Keyword.colors[color];\n if (!hex)\n return;\n return hex_1.default.parse(hex);\n },\n stringify: function (channels) {\n var hex = hex_1.default.stringify(channels);\n for (var name_1 in Keyword.colors) {\n if (Keyword.colors[name_1] === hex)\n return name_1;\n }\n }\n};\n/* EXPORT */\nexports.default = Keyword;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar reusable_1 = require(\"../channels/reusable\");\n/* RGB */\nvar RGB = {\n /* VARIABLES */\n re: /^rgba?\\(\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?))\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?))\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?))(?:\\s*?(?:,|\\/)\\s*?\\+?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e\\d+)?(%?)))?\\s*?\\)$/i,\n /* API */\n parse: function (color) {\n var charCode = color.charCodeAt(0);\n if (charCode !== 114 && charCode !== 82)\n return; // 'r'/'R'\n var match = color.match(RGB.re);\n if (!match)\n return;\n var r = match[1], isRedPercentage = match[2], g = match[3], isGreenPercentage = match[4], b = match[5], isBluePercentage = match[6], a = match[7], isAlphaPercentage = match[8];\n return reusable_1.default.set({\n r: utils_1.default.channel.clamp.r(isRedPercentage ? parseFloat(r) * 2.55 : parseFloat(r)),\n g: utils_1.default.channel.clamp.g(isGreenPercentage ? parseFloat(g) * 2.55 : parseFloat(g)),\n b: utils_1.default.channel.clamp.b(isBluePercentage ? parseFloat(b) * 2.55 : parseFloat(b)),\n a: a ? utils_1.default.channel.clamp.a(isAlphaPercentage ? parseFloat(a) / 100 : parseFloat(a)) : 1\n }, color);\n },\n stringify: function (channels) {\n if (channels.a < 1) { // RGBA\n return \"rgba(\" + utils_1.default.lang.round(channels.r) + \", \" + utils_1.default.lang.round(channels.g) + \", \" + utils_1.default.lang.round(channels.b) + \", \" + utils_1.default.lang.round(channels.a) + \")\";\n }\n else { // RGB\n return \"rgb(\" + utils_1.default.lang.round(channels.r) + \", \" + utils_1.default.lang.round(channels.g) + \", \" + utils_1.default.lang.round(channels.b) + \")\";\n }\n }\n};\n/* EXPORT */\nexports.default = RGB;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar reusable_1 = require(\"../channels/reusable\");\n/* HSL */\nvar HSL = {\n /* VARIABLES */\n re: /^hsla?\\(\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?(?:deg|grad|rad|turn)?)\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?%)\\s*?(?:,|\\s)\\s*?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?%)(?:\\s*?(?:,|\\/)\\s*?\\+?(-?(?:\\d+(?:\\.\\d+)?|(?:\\.\\d+))(?:e-?\\d+)?(%)?))?\\s*?\\)$/i,\n hueRe: /^(.+?)(deg|grad|rad|turn)$/i,\n /* HELPERS */\n _hue2deg: function (hue) {\n var match = hue.match(HSL.hueRe);\n if (match) {\n var number = match[1], unit = match[2];\n switch (unit) {\n case 'grad': return utils_1.default.channel.clamp.h(parseFloat(number) * .9);\n case 'rad': return utils_1.default.channel.clamp.h(parseFloat(number) * 180 / Math.PI);\n case 'turn': return utils_1.default.channel.clamp.h(parseFloat(number) * 360);\n }\n }\n return utils_1.default.channel.clamp.h(parseFloat(hue));\n },\n /* API */\n parse: function (color) {\n var charCode = color.charCodeAt(0);\n if (charCode !== 104 && charCode !== 72)\n return; // 'h'/'H'\n var match = color.match(HSL.re);\n if (!match)\n return;\n var h = match[1], s = match[2], l = match[3], a = match[4], isAlphaPercentage = match[5];\n return reusable_1.default.set({\n h: HSL._hue2deg(h),\n s: utils_1.default.channel.clamp.s(parseFloat(s)),\n l: utils_1.default.channel.clamp.l(parseFloat(l)),\n a: a ? utils_1.default.channel.clamp.a(isAlphaPercentage ? parseFloat(a) / 100 : parseFloat(a)) : 1\n }, color);\n },\n stringify: function (channels) {\n if (channels.a < 1) { // HSLA\n return \"hsla(\" + utils_1.default.lang.round(channels.h) + \", \" + utils_1.default.lang.round(channels.s) + \"%, \" + utils_1.default.lang.round(channels.l) + \"%, \" + channels.a + \")\";\n }\n else { // HSL\n return \"hsl(\" + utils_1.default.lang.round(channels.h) + \", \" + utils_1.default.lang.round(channels.s) + \"%, \" + utils_1.default.lang.round(channels.l) + \"%)\";\n }\n }\n};\n/* EXPORT */\nexports.default = HSL;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* RED */\nfunction red(color) {\n return channel_1.default(color, 'r');\n}\n/* EXPORT */\nexports.default = red;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* GREEN */\nfunction green(color) {\n return channel_1.default(color, 'g');\n}\n/* EXPORT */\nexports.default = green;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* BLUE */\nfunction blue(color) {\n return channel_1.default(color, 'b');\n}\n/* EXPORT */\nexports.default = blue;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* HUE */\nfunction hue(color) {\n return channel_1.default(color, 'h');\n}\n/* EXPORT */\nexports.default = hue;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* SATURATION */\nfunction saturation(color) {\n return channel_1.default(color, 's');\n}\n/* EXPORT */\nexports.default = saturation;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = require(\"./channel\");\n/* LIGHTNESS */\nfunction lightness(color) {\n return channel_1.default(color, 'l');\n}\n/* EXPORT */\nexports.default = lightness;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar is_light_1 = require(\"./is_light\");\n/* IS DARK */\nfunction isDark(color) {\n return !is_light_1.default(color);\n}\n/* EXPORT */\nexports.default = isDark;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../color\");\n/* IS VALID */\nfunction isValid(color) {\n try {\n color_1.default.parse(color);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\n/* EXPORT */\nexports.default = isValid;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* SATURATE */\nfunction saturate(color, amount) {\n return adjust_channel_1.default(color, 's', amount);\n}\n/* EXPORT */\nexports.default = saturate;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* DESATURATE */\nfunction desaturate(color, amount) {\n return adjust_channel_1.default(color, 's', -amount);\n}\n/* EXPORT */\nexports.default = desaturate;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* LIGHTEN */\nfunction lighten(color, amount) {\n return adjust_channel_1.default(color, 'l', amount);\n}\n/* EXPORT */\nexports.default = lighten;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* DARKEN */\nfunction darken(color, amount) {\n return adjust_channel_1.default(color, 'l', -amount);\n}\n/* EXPORT */\nexports.default = darken;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar adjust_channel_1 = require(\"./adjust_channel\");\n/* COMPLEMENT */\nfunction complement(color) {\n return adjust_channel_1.default(color, 'h', 180);\n}\n/* EXPORT */\nexports.default = complement;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar change_1 = require(\"./change\");\n/* GRAYSCALE */\nfunction grayscale(color) {\n return change_1.default(color, { s: 0 });\n}\n/* EXPORT */\nexports.default = grayscale;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../color\");\nvar mix_1 = require(\"./mix\");\n/* INVERT */\nfunction invert(color, weight) {\n if (weight === void 0) { weight = 100; }\n var inverse = color_1.default.parse(color);\n inverse.r = 255 - inverse.r;\n inverse.g = 255 - inverse.g;\n inverse.b = 255 - inverse.b;\n return mix_1.default(inverse, color, weight);\n}\n/* EXPORT */\nexports.default = invert;\n","\"use strict\";\n/* IMPORT */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../utils\");\nvar color_1 = require(\"../color\");\nvar adjust_1 = require(\"./adjust\");\n/* SCALE */\nfunction scale(color, channels) {\n var ch = color_1.default.parse(color), adjustments = {}, delta = function (amount, weight, max) { return weight > 0 ? (max - amount) * weight / 100 : amount * weight / 100; };\n for (var c in channels) {\n adjustments[c] = delta(ch[c], channels[c], utils_1.default.channel.max[c]);\n }\n return adjust_1.default(color, adjustments);\n}\n/* EXPORT */\nexports.default = scale;\n","// Includes only the \"core\" of graphlib\nmodule.exports = {\n Graph: require(\"./graph\"),\n version: require(\"./version\")\n};\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = clone;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nmodule.exports = baseFilter;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLike = require('./isArrayLike'),\n isBuffer = require('./isBuffer'),\n isPrototype = require('./_isPrototype'),\n isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArrayLike = require('./isArrayLike'),\n isString = require('./isString'),\n stringSize = require('./_stringSize');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\nfunction size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n}\n\nmodule.exports = size;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var asciiSize = require('./_asciiSize'),\n hasUnicode = require('./_hasUnicode'),\n unicodeSize = require('./_unicodeSize');\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n}\n\nmodule.exports = stringSize;\n","var baseProperty = require('./_baseProperty');\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\nmodule.exports = asciiSize;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n}\n\nmodule.exports = unicodeSize;\n","var arrayEach = require('./_arrayEach'),\n baseCreate = require('./_baseCreate'),\n baseForOwn = require('./_baseForOwn'),\n baseIteratee = require('./_baseIteratee'),\n getPrototype = require('./_getPrototype'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isFunction = require('./isFunction'),\n isObject = require('./isObject'),\n isTypedArray = require('./isTypedArray');\n\n/**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\nfunction transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = baseIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n}\n\nmodule.exports = transform;\n","var baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n baseUniq = require('./_baseUniq'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n}\n\nmodule.exports = baseValues;\n","module.exports = '2.1.8';\n","var _ = require(\"./lodash\");\nvar Graph = require(\"./graph\");\n\nmodule.exports = {\n write: write,\n read: read\n};\n\nfunction write(g) {\n var json = {\n options: {\n directed: g.isDirected(),\n multigraph: g.isMultigraph(),\n compound: g.isCompound()\n },\n nodes: writeNodes(g),\n edges: writeEdges(g)\n };\n if (!_.isUndefined(g.graph())) {\n json.value = _.clone(g.graph());\n }\n return json;\n}\n\nfunction writeNodes(g) {\n return _.map(g.nodes(), function(v) {\n var nodeValue = g.node(v);\n var parent = g.parent(v);\n var node = { v: v };\n if (!_.isUndefined(nodeValue)) {\n node.value = nodeValue;\n }\n if (!_.isUndefined(parent)) {\n node.parent = parent;\n }\n return node;\n });\n}\n\nfunction writeEdges(g) {\n return _.map(g.edges(), function(e) {\n var edgeValue = g.edge(e);\n var edge = { v: e.v, w: e.w };\n if (!_.isUndefined(e.name)) {\n edge.name = e.name;\n }\n if (!_.isUndefined(edgeValue)) {\n edge.value = edgeValue;\n }\n return edge;\n });\n}\n\nfunction read(json) {\n var g = new Graph(json.options).setGraph(json.value);\n _.each(json.nodes, function(entry) {\n g.setNode(entry.v, entry.value);\n if (entry.parent) {\n g.setParent(entry.v, entry.parent);\n }\n });\n _.each(json.edges, function(entry) {\n g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\n });\n return g;\n}\n","module.exports = {\n components: require(\"./components\"),\n dijkstra: require(\"./dijkstra\"),\n dijkstraAll: require(\"./dijkstra-all\"),\n findCycles: require(\"./find-cycles\"),\n floydWarshall: require(\"./floyd-warshall\"),\n isAcyclic: require(\"./is-acyclic\"),\n postorder: require(\"./postorder\"),\n preorder: require(\"./preorder\"),\n prim: require(\"./prim\"),\n tarjan: require(\"./tarjan\"),\n topsort: require(\"./topsort\")\n};\n","var _ = require(\"../lodash\");\n\nmodule.exports = components;\n\nfunction components(g) {\n var visited = {};\n var cmpts = [];\n var cmpt;\n\n function dfs(v) {\n if (_.has(visited, v)) return;\n visited[v] = true;\n cmpt.push(v);\n _.each(g.successors(v), dfs);\n _.each(g.predecessors(v), dfs);\n }\n\n _.each(g.nodes(), function(v) {\n cmpt = [];\n dfs(v);\n if (cmpt.length) {\n cmpts.push(cmpt);\n }\n });\n\n return cmpts;\n}\n","var dijkstra = require(\"./dijkstra\");\nvar _ = require(\"../lodash\");\n\nmodule.exports = dijkstraAll;\n\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\n return _.transform(g.nodes(), function(acc, v) {\n acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\n }, {});\n}\n","var _ = require(\"../lodash\");\nvar tarjan = require(\"./tarjan\");\n\nmodule.exports = findCycles;\n\nfunction findCycles(g) {\n return _.filter(tarjan(g), function(cmpt) {\n return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]));\n });\n}\n","var _ = require(\"../lodash\");\n\nmodule.exports = floydWarshall;\n\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\n\nfunction floydWarshall(g, weightFn, edgeFn) {\n return runFloydWarshall(g,\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn || function(v) { return g.outEdges(v); });\n}\n\nfunction runFloydWarshall(g, weightFn, edgeFn) {\n var results = {};\n var nodes = g.nodes();\n\n nodes.forEach(function(v) {\n results[v] = {};\n results[v][v] = { distance: 0 };\n nodes.forEach(function(w) {\n if (v !== w) {\n results[v][w] = { distance: Number.POSITIVE_INFINITY };\n }\n });\n edgeFn(v).forEach(function(edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var d = weightFn(edge);\n results[v][w] = { distance: d, predecessor: v };\n });\n });\n\n nodes.forEach(function(k) {\n var rowK = results[k];\n nodes.forEach(function(i) {\n var rowI = results[i];\n nodes.forEach(function(j) {\n var ik = rowI[k];\n var kj = rowK[j];\n var ij = rowI[j];\n var altDistance = ik.distance + kj.distance;\n if (altDistance < ij.distance) {\n ij.distance = altDistance;\n ij.predecessor = kj.predecessor;\n }\n });\n });\n });\n\n return results;\n}\n","var topsort = require(\"./topsort\");\n\nmodule.exports = isAcyclic;\n\nfunction isAcyclic(g) {\n try {\n topsort(g);\n } catch (e) {\n if (e instanceof topsort.CycleException) {\n return false;\n }\n throw e;\n }\n return true;\n}\n","var dfs = require(\"./dfs\");\n\nmodule.exports = postorder;\n\nfunction postorder(g, vs) {\n return dfs(g, vs, \"post\");\n}\n","var dfs = require(\"./dfs\");\n\nmodule.exports = preorder;\n\nfunction preorder(g, vs) {\n return dfs(g, vs, \"pre\");\n}\n","var _ = require(\"../lodash\");\nvar Graph = require(\"../graph\");\nvar PriorityQueue = require(\"../data/priority-queue\");\n\nmodule.exports = prim;\n\nfunction prim(g, weightFunc) {\n var result = new Graph();\n var parents = {};\n var pq = new PriorityQueue();\n var v;\n\n function updateNeighbors(edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var pri = pq.priority(w);\n if (pri !== undefined) {\n var edgeWeight = weightFunc(edge);\n if (edgeWeight < pri) {\n parents[w] = v;\n pq.decrease(w, edgeWeight);\n }\n }\n }\n\n if (g.nodeCount() === 0) {\n return result;\n }\n\n _.each(g.nodes(), function(v) {\n pq.add(v, Number.POSITIVE_INFINITY);\n result.setNode(v);\n });\n\n // Start from an arbitrary node\n pq.decrease(g.nodes()[0], 0);\n\n var init = false;\n while (pq.size() > 0) {\n v = pq.removeMin();\n if (_.has(parents, v)) {\n result.setEdge(v, parents[v]);\n } else if (init) {\n throw new Error(\"Input graph is not connected: \" + g);\n } else {\n init = true;\n }\n\n g.nodeEdges(v).forEach(updateNeighbors);\n }\n\n return result;\n}\n","/* global window */\n\nvar graphlib;\n\nif (typeof require === \"function\") {\n try {\n graphlib = require(\"graphlib\");\n }\n catch (e) {\n // continue regardless of error\n }\n}\n\nif (!graphlib) {\n graphlib = window.graphlib;\n}\n\nmodule.exports = graphlib;\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar acyclic = require(\"./acyclic\");\nvar normalize = require(\"./normalize\");\nvar rank = require(\"./rank\");\nvar normalizeRanks = require(\"./util\").normalizeRanks;\nvar parentDummyChains = require(\"./parent-dummy-chains\");\nvar removeEmptyRanks = require(\"./util\").removeEmptyRanks;\nvar nestingGraph = require(\"./nesting-graph\");\nvar addBorderSegments = require(\"./add-border-segments\");\nvar coordinateSystem = require(\"./coordinate-system\");\nvar order = require(\"./order\");\nvar position = require(\"./position\");\nvar util = require(\"./util\");\nvar Graph = require(\"./graphlib\").Graph;\n\nmodule.exports = layout;\n\nfunction layout(g, opts) {\n var time = opts && opts.debugTiming ? util.time : util.notime;\n time(\"layout\", function() {\n var layoutGraph = \n time(\" buildLayoutGraph\", function() { return buildLayoutGraph(g); });\n time(\" runLayout\", function() { runLayout(layoutGraph, time); });\n time(\" updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\n });\n}\n\nfunction runLayout(g, time) {\n time(\" makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\n time(\" removeSelfEdges\", function() { removeSelfEdges(g); });\n time(\" acyclic\", function() { acyclic.run(g); });\n time(\" nestingGraph.run\", function() { nestingGraph.run(g); });\n time(\" rank\", function() { rank(util.asNonCompoundGraph(g)); });\n time(\" injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\n time(\" removeEmptyRanks\", function() { removeEmptyRanks(g); });\n time(\" nestingGraph.cleanup\", function() { nestingGraph.cleanup(g); });\n time(\" normalizeRanks\", function() { normalizeRanks(g); });\n time(\" assignRankMinMax\", function() { assignRankMinMax(g); });\n time(\" removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\n time(\" normalize.run\", function() { normalize.run(g); });\n time(\" parentDummyChains\", function() { parentDummyChains(g); });\n time(\" addBorderSegments\", function() { addBorderSegments(g); });\n time(\" order\", function() { order(g); });\n time(\" insertSelfEdges\", function() { insertSelfEdges(g); });\n time(\" adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\n time(\" position\", function() { position(g); });\n time(\" positionSelfEdges\", function() { positionSelfEdges(g); });\n time(\" removeBorderNodes\", function() { removeBorderNodes(g); });\n time(\" normalize.undo\", function() { normalize.undo(g); });\n time(\" fixupEdgeLabelCoords\", function() { fixupEdgeLabelCoords(g); });\n time(\" undoCoordinateSystem\", function() { coordinateSystem.undo(g); });\n time(\" translateGraph\", function() { translateGraph(g); });\n time(\" assignNodeIntersects\", function() { assignNodeIntersects(g); });\n time(\" reversePoints\", function() { reversePointsForReversedEdges(g); });\n time(\" acyclic.undo\", function() { acyclic.undo(g); });\n}\n\n/*\n * Copies final layout information from the layout graph back to the input\n * graph. This process only copies whitelisted attributes from the layout graph\n * to the input graph, so it serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction updateInputGraph(inputGraph, layoutGraph) {\n _.forEach(inputGraph.nodes(), function(v) {\n var inputLabel = inputGraph.node(v);\n var layoutLabel = layoutGraph.node(v);\n\n if (inputLabel) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n\n if (layoutGraph.children(v).length) {\n inputLabel.width = layoutLabel.width;\n inputLabel.height = layoutLabel.height;\n }\n }\n });\n\n _.forEach(inputGraph.edges(), function(e) {\n var inputLabel = inputGraph.edge(e);\n var layoutLabel = layoutGraph.edge(e);\n\n inputLabel.points = layoutLabel.points;\n if (_.has(layoutLabel, \"x\")) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n }\n });\n\n inputGraph.graph().width = layoutGraph.graph().width;\n inputGraph.graph().height = layoutGraph.graph().height;\n}\n\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"];\nvar graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" };\nvar graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"];\nvar nodeNumAttrs = [\"width\", \"height\"];\nvar nodeDefaults = { width: 0, height: 0 };\nvar edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"];\nvar edgeDefaults = {\n minlen: 1, weight: 1, width: 0, height: 0,\n labeloffset: 10, labelpos: \"r\"\n};\nvar edgeAttrs = [\"labelpos\"];\n\n/*\n * Constructs a new graph from the input graph, which can be used for layout.\n * This process copies only whitelisted attributes from the input graph to the\n * layout graph. Thus this function serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction buildLayoutGraph(inputGraph) {\n var g = new Graph({ multigraph: true, compound: true });\n var graph = canonicalize(inputGraph.graph());\n\n g.setGraph(_.merge({},\n graphDefaults,\n selectNumberAttrs(graph, graphNumAttrs),\n _.pick(graph, graphAttrs)));\n\n _.forEach(inputGraph.nodes(), function(v) {\n var node = canonicalize(inputGraph.node(v));\n g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\n g.setParent(v, inputGraph.parent(v));\n });\n\n _.forEach(inputGraph.edges(), function(e) {\n var edge = canonicalize(inputGraph.edge(e));\n g.setEdge(e, _.merge({},\n edgeDefaults,\n selectNumberAttrs(edge, edgeNumAttrs),\n _.pick(edge, edgeAttrs)));\n });\n\n return g;\n}\n\n/*\n * This idea comes from the Gansner paper: to account for edge labels in our\n * layout we split each rank in half by doubling minlen and halving ranksep.\n * Then we can place labels at these mid-points between nodes.\n *\n * We also add some minimal padding to the width to push the label for the edge\n * away from the edge itself a bit.\n */\nfunction makeSpaceForEdgeLabels(g) {\n var graph = g.graph();\n graph.ranksep /= 2;\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n edge.minlen *= 2;\n if (edge.labelpos.toLowerCase() !== \"c\") {\n if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\n edge.width += edge.labeloffset;\n } else {\n edge.height += edge.labeloffset;\n }\n }\n });\n}\n\n/*\n * Creates temporary dummy nodes that capture the rank in which each edge's\n * label is going to, if it has one of non-zero width and height. We do this\n * so that we can safely remove empty ranks while preserving balance for the\n * label's position.\n */\nfunction injectEdgeLabelProxies(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (edge.width && edge.height) {\n var v = g.node(e.v);\n var w = g.node(e.w);\n var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\n util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\n }\n });\n}\n\nfunction assignRankMinMax(g) {\n var maxRank = 0;\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (node.borderTop) {\n node.minRank = g.node(node.borderTop).rank;\n node.maxRank = g.node(node.borderBottom).rank;\n maxRank = _.max(maxRank, node.maxRank);\n }\n });\n g.graph().maxRank = maxRank;\n}\n\nfunction removeEdgeLabelProxies(g) {\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (node.dummy === \"edge-proxy\") {\n g.edge(node.e).labelRank = node.rank;\n g.removeNode(v);\n }\n });\n}\n\nfunction translateGraph(g) {\n var minX = Number.POSITIVE_INFINITY;\n var maxX = 0;\n var minY = Number.POSITIVE_INFINITY;\n var maxY = 0;\n var graphLabel = g.graph();\n var marginX = graphLabel.marginx || 0;\n var marginY = graphLabel.marginy || 0;\n\n function getExtremes(attrs) {\n var x = attrs.x;\n var y = attrs.y;\n var w = attrs.width;\n var h = attrs.height;\n minX = Math.min(minX, x - w / 2);\n maxX = Math.max(maxX, x + w / 2);\n minY = Math.min(minY, y - h / 2);\n maxY = Math.max(maxY, y + h / 2);\n }\n\n _.forEach(g.nodes(), function(v) { getExtremes(g.node(v)); });\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (_.has(edge, \"x\")) {\n getExtremes(edge);\n }\n });\n\n minX -= marginX;\n minY -= marginY;\n\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n node.x -= minX;\n node.y -= minY;\n });\n\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n _.forEach(edge.points, function(p) {\n p.x -= minX;\n p.y -= minY;\n });\n if (_.has(edge, \"x\")) { edge.x -= minX; }\n if (_.has(edge, \"y\")) { edge.y -= minY; }\n });\n\n graphLabel.width = maxX - minX + marginX;\n graphLabel.height = maxY - minY + marginY;\n}\n\nfunction assignNodeIntersects(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n var nodeV = g.node(e.v);\n var nodeW = g.node(e.w);\n var p1, p2;\n if (!edge.points) {\n edge.points = [];\n p1 = nodeW;\n p2 = nodeV;\n } else {\n p1 = edge.points[0];\n p2 = edge.points[edge.points.length - 1];\n }\n edge.points.unshift(util.intersectRect(nodeV, p1));\n edge.points.push(util.intersectRect(nodeW, p2));\n });\n}\n\nfunction fixupEdgeLabelCoords(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (_.has(edge, \"x\")) {\n if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\n edge.width -= edge.labeloffset;\n }\n switch (edge.labelpos) {\n case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\n case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\n }\n }\n });\n}\n\nfunction reversePointsForReversedEdges(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (edge.reversed) {\n edge.points.reverse();\n }\n });\n}\n\nfunction removeBorderNodes(g) {\n _.forEach(g.nodes(), function(v) {\n if (g.children(v).length) {\n var node = g.node(v);\n var t = g.node(node.borderTop);\n var b = g.node(node.borderBottom);\n var l = g.node(_.last(node.borderLeft));\n var r = g.node(_.last(node.borderRight));\n\n node.width = Math.abs(r.x - l.x);\n node.height = Math.abs(b.y - t.y);\n node.x = l.x + node.width / 2;\n node.y = t.y + node.height / 2;\n }\n });\n\n _.forEach(g.nodes(), function(v) {\n if (g.node(v).dummy === \"border\") {\n g.removeNode(v);\n }\n });\n}\n\nfunction removeSelfEdges(g) {\n _.forEach(g.edges(), function(e) {\n if (e.v === e.w) {\n var node = g.node(e.v);\n if (!node.selfEdges) {\n node.selfEdges = [];\n }\n node.selfEdges.push({ e: e, label: g.edge(e) });\n g.removeEdge(e);\n }\n });\n}\n\nfunction insertSelfEdges(g) {\n var layers = util.buildLayerMatrix(g);\n _.forEach(layers, function(layer) {\n var orderShift = 0;\n _.forEach(layer, function(v, i) {\n var node = g.node(v);\n node.order = i + orderShift;\n _.forEach(node.selfEdges, function(selfEdge) {\n util.addDummyNode(g, \"selfedge\", {\n width: selfEdge.label.width,\n height: selfEdge.label.height,\n rank: node.rank,\n order: i + (++orderShift),\n e: selfEdge.e,\n label: selfEdge.label\n }, \"_se\");\n });\n delete node.selfEdges;\n });\n });\n}\n\nfunction positionSelfEdges(g) {\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (node.dummy === \"selfedge\") {\n var selfNode = g.node(node.e.v);\n var x = selfNode.x + selfNode.width / 2;\n var y = selfNode.y;\n var dx = node.x - x;\n var dy = selfNode.height / 2;\n g.setEdge(node.e, node.label);\n g.removeNode(v);\n node.label.points = [\n { x: x + 2 * dx / 3, y: y - dy },\n { x: x + 5 * dx / 6, y: y - dy },\n { x: x + dx , y: y },\n { x: x + 5 * dx / 6, y: y + dy },\n { x: x + 2 * dx / 3, y: y + dy }\n ];\n node.label.x = node.x;\n node.label.y = node.y;\n }\n });\n}\n\nfunction selectNumberAttrs(obj, attrs) {\n return _.mapValues(_.pick(obj, attrs), Number);\n}\n\nfunction canonicalize(attrs) {\n var newAttrs = {};\n _.forEach(attrs, function(v, k) {\n newAttrs[k.toLowerCase()] = v;\n });\n return newAttrs;\n}\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var baseFor = require('./_baseFor'),\n castFunction = require('./_castFunction'),\n keysIn = require('./keysIn');\n\n/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\nfunction forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, castFunction(iteratee), keysIn);\n}\n\nmodule.exports = forIn;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","var baseAssignValue = require('./_baseAssignValue'),\n baseForOwn = require('./_baseForOwn'),\n baseIteratee = require('./_baseIteratee');\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n}\n\nmodule.exports = mapValues;\n","var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n","/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n","var baseMerge = require('./_baseMerge'),\n createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n","var Stack = require('./_Stack'),\n assignMergeValue = require('./_assignMergeValue'),\n baseFor = require('./_baseFor'),\n baseMergeDeep = require('./_baseMergeDeep'),\n isObject = require('./isObject'),\n keysIn = require('./keysIn'),\n safeGet = require('./_safeGet');\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nmodule.exports = baseMerge;\n","var assignMergeValue = require('./_assignMergeValue'),\n cloneBuffer = require('./_cloneBuffer'),\n cloneTypedArray = require('./_cloneTypedArray'),\n copyArray = require('./_copyArray'),\n initCloneObject = require('./_initCloneObject'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLikeObject = require('./isArrayLikeObject'),\n isBuffer = require('./isBuffer'),\n isFunction = require('./isFunction'),\n isObject = require('./isObject'),\n isPlainObject = require('./isPlainObject'),\n isTypedArray = require('./isTypedArray'),\n safeGet = require('./_safeGet'),\n toPlainObject = require('./toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nmodule.exports = createAssigner;\n","var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n","var baseExtremum = require('./_baseExtremum'),\n baseIteratee = require('./_baseIteratee'),\n baseLt = require('./_baseLt');\n\n/**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\nfunction minBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)\n : undefined;\n}\n\nmodule.exports = minBy;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var basePickBy = require('./_basePickBy'),\n hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nmodule.exports = basePick;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var flatten = require('./flatten'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var baseRange = require('./_baseRange'),\n isIterateeCall = require('./_isIterateeCall'),\n toFinite = require('./toFinite');\n\n/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nmodule.exports = createRange;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nmodule.exports = baseRange;\n","var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n","var assignValue = require('./_assignValue'),\n baseZipObject = require('./_baseZipObject');\n\n/**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\nfunction zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n}\n\nmodule.exports = zipObject;\n","/**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\nfunction baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n}\n\nmodule.exports = baseZipObject;\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar greedyFAS = require(\"./greedy-fas\");\n\nmodule.exports = {\n run: run,\n undo: undo\n};\n\nfunction run(g) {\n var fas = (g.graph().acyclicer === \"greedy\"\n ? greedyFAS(g, weightFn(g))\n : dfsFAS(g));\n _.forEach(fas, function(e) {\n var label = g.edge(e);\n g.removeEdge(e);\n label.forwardName = e.name;\n label.reversed = true;\n g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\n });\n\n function weightFn(g) {\n return function(e) {\n return g.edge(e).weight;\n };\n }\n}\n\nfunction dfsFAS(g) {\n var fas = [];\n var stack = {};\n var visited = {};\n\n function dfs(v) {\n if (_.has(visited, v)) {\n return;\n }\n visited[v] = true;\n stack[v] = true;\n _.forEach(g.outEdges(v), function(e) {\n if (_.has(stack, e.w)) {\n fas.push(e);\n } else {\n dfs(e.w);\n }\n });\n delete stack[v];\n }\n\n _.forEach(g.nodes(), dfs);\n return fas;\n}\n\nfunction undo(g) {\n _.forEach(g.edges(), function(e) {\n var label = g.edge(e);\n if (label.reversed) {\n g.removeEdge(e);\n\n var forwardName = label.forwardName;\n delete label.reversed;\n delete label.forwardName;\n g.setEdge(e.w, e.v, label, forwardName);\n }\n });\n}\n","var _ = require(\"./lodash\");\nvar Graph = require(\"./graphlib\").Graph;\nvar List = require(\"./data/list\");\n\n/*\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\n * arc set is a set of edges that can be removed to make a graph acyclic.\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\n * effective heuristic for the feedback arc set problem.\" This implementation\n * adjusts that from the paper to allow for weighted edges.\n */\nmodule.exports = greedyFAS;\n\nvar DEFAULT_WEIGHT_FN = _.constant(1);\n\nfunction greedyFAS(g, weightFn) {\n if (g.nodeCount() <= 1) {\n return [];\n }\n var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\n var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\n\n // Expand multi-edges\n return _.flatten(_.map(results, function(e) {\n return g.outEdges(e.v, e.w);\n }), true);\n}\n\nfunction doGreedyFAS(g, buckets, zeroIdx) {\n var results = [];\n var sources = buckets[buckets.length - 1];\n var sinks = buckets[0];\n\n var entry;\n while (g.nodeCount()) {\n while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\n while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\n if (g.nodeCount()) {\n for (var i = buckets.length - 2; i > 0; --i) {\n entry = buckets[i].dequeue();\n if (entry) {\n results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\n break;\n }\n }\n }\n }\n\n return results;\n}\n\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\n var results = collectPredecessors ? [] : undefined;\n\n _.forEach(g.inEdges(entry.v), function(edge) {\n var weight = g.edge(edge);\n var uEntry = g.node(edge.v);\n\n if (collectPredecessors) {\n results.push({ v: edge.v, w: edge.w });\n }\n\n uEntry.out -= weight;\n assignBucket(buckets, zeroIdx, uEntry);\n });\n\n _.forEach(g.outEdges(entry.v), function(edge) {\n var weight = g.edge(edge);\n var w = edge.w;\n var wEntry = g.node(w);\n wEntry[\"in\"] -= weight;\n assignBucket(buckets, zeroIdx, wEntry);\n });\n\n g.removeNode(entry.v);\n\n return results;\n}\n\nfunction buildState(g, weightFn) {\n var fasGraph = new Graph();\n var maxIn = 0;\n var maxOut = 0;\n\n _.forEach(g.nodes(), function(v) {\n fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\n });\n\n // Aggregate weights on nodes, but also sum the weights across multi-edges\n // into a single edge for the fasGraph.\n _.forEach(g.edges(), function(e) {\n var prevWeight = fasGraph.edge(e.v, e.w) || 0;\n var weight = weightFn(e);\n var edgeWeight = prevWeight + weight;\n fasGraph.setEdge(e.v, e.w, edgeWeight);\n maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\n maxIn = Math.max(maxIn, fasGraph.node(e.w)[\"in\"] += weight);\n });\n\n var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\n var zeroIdx = maxIn + 1;\n\n _.forEach(fasGraph.nodes(), function(v) {\n assignBucket(buckets, zeroIdx, fasGraph.node(v));\n });\n\n return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\n}\n\nfunction assignBucket(buckets, zeroIdx, entry) {\n if (!entry.out) {\n buckets[0].enqueue(entry);\n } else if (!entry[\"in\"]) {\n buckets[buckets.length - 1].enqueue(entry);\n } else {\n buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\n }\n}\n","/*\n * Simple doubly linked list implementation derived from Cormen, et al.,\n * \"Introduction to Algorithms\".\n */\n\nmodule.exports = List;\n\nfunction List() {\n var sentinel = {};\n sentinel._next = sentinel._prev = sentinel;\n this._sentinel = sentinel;\n}\n\nList.prototype.dequeue = function() {\n var sentinel = this._sentinel;\n var entry = sentinel._prev;\n if (entry !== sentinel) {\n unlink(entry);\n return entry;\n }\n};\n\nList.prototype.enqueue = function(entry) {\n var sentinel = this._sentinel;\n if (entry._prev && entry._next) {\n unlink(entry);\n }\n entry._next = sentinel._next;\n sentinel._next._prev = entry;\n sentinel._next = entry;\n entry._prev = sentinel;\n};\n\nList.prototype.toString = function() {\n var strs = [];\n var sentinel = this._sentinel;\n var curr = sentinel._prev;\n while (curr !== sentinel) {\n strs.push(JSON.stringify(curr, filterOutLinks));\n curr = curr._prev;\n }\n return \"[\" + strs.join(\", \") + \"]\";\n};\n\nfunction unlink(entry) {\n entry._prev._next = entry._next;\n entry._next._prev = entry._prev;\n delete entry._next;\n delete entry._prev;\n}\n\nfunction filterOutLinks(k, v) {\n if (k !== \"_next\" && k !== \"_prev\") {\n return v;\n }\n}\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar util = require(\"./util\");\n\nmodule.exports = {\n run: run,\n undo: undo\n};\n\n/*\n * Breaks any long edges in the graph into short segments that span 1 layer\n * each. This operation is undoable with the denormalize function.\n *\n * Pre-conditions:\n *\n * 1. The input graph is a DAG.\n * 2. Each node in the graph has a \"rank\" property.\n *\n * Post-condition:\n *\n * 1. All edges in the graph have a length of 1.\n * 2. Dummy nodes are added where edges have been split into segments.\n * 3. The graph is augmented with a \"dummyChains\" attribute which contains\n * the first dummy in each chain of dummy nodes produced.\n */\nfunction run(g) {\n g.graph().dummyChains = [];\n _.forEach(g.edges(), function(edge) { normalizeEdge(g, edge); });\n}\n\nfunction normalizeEdge(g, e) {\n var v = e.v;\n var vRank = g.node(v).rank;\n var w = e.w;\n var wRank = g.node(w).rank;\n var name = e.name;\n var edgeLabel = g.edge(e);\n var labelRank = edgeLabel.labelRank;\n\n if (wRank === vRank + 1) return;\n\n g.removeEdge(e);\n\n var dummy, attrs, i;\n for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\n edgeLabel.points = [];\n attrs = {\n width: 0, height: 0,\n edgeLabel: edgeLabel, edgeObj: e,\n rank: vRank\n };\n dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\n if (vRank === labelRank) {\n attrs.width = edgeLabel.width;\n attrs.height = edgeLabel.height;\n attrs.dummy = \"edge-label\";\n attrs.labelpos = edgeLabel.labelpos;\n }\n g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\n if (i === 0) {\n g.graph().dummyChains.push(dummy);\n }\n v = dummy;\n }\n\n g.setEdge(v, w, { weight: edgeLabel.weight }, name);\n}\n\nfunction undo(g) {\n _.forEach(g.graph().dummyChains, function(v) {\n var node = g.node(v);\n var origLabel = node.edgeLabel;\n var w;\n g.setEdge(node.edgeObj, origLabel);\n while (node.dummy) {\n w = g.successors(v)[0];\n g.removeNode(v);\n origLabel.points.push({ x: node.x, y: node.y });\n if (node.dummy === \"edge-label\") {\n origLabel.x = node.x;\n origLabel.y = node.y;\n origLabel.width = node.width;\n origLabel.height = node.height;\n }\n v = w;\n node = g.node(v);\n }\n });\n}\n","\"use strict\";\n\nvar rankUtil = require(\"./util\");\nvar longestPath = rankUtil.longestPath;\nvar feasibleTree = require(\"./feasible-tree\");\nvar networkSimplex = require(\"./network-simplex\");\n\nmodule.exports = rank;\n\n/*\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\n * constraint specified on edges between nodes.\n *\n * This basic structure is derived from Gansner, et al., \"A Technique for\n * Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a connected DAG\n * 2. Graph nodes must be objects\n * 3. Graph edges must have \"weight\" and \"minlen\" attributes\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have a \"rank\" attribute based on the results of the\n * algorithm. Ranks can start at any index (including negative), we'll\n * fix them up later.\n */\nfunction rank(g) {\n switch(g.graph().ranker) {\n case \"network-simplex\": networkSimplexRanker(g); break;\n case \"tight-tree\": tightTreeRanker(g); break;\n case \"longest-path\": longestPathRanker(g); break;\n default: networkSimplexRanker(g);\n }\n}\n\n// A fast and simple ranker, but results are far from optimal.\nvar longestPathRanker = longestPath;\n\nfunction tightTreeRanker(g) {\n longestPath(g);\n feasibleTree(g);\n}\n\nfunction networkSimplexRanker(g) {\n networkSimplex(g);\n}\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\nvar feasibleTree = require(\"./feasible-tree\");\nvar slack = require(\"./util\").slack;\nvar initRank = require(\"./util\").longestPath;\nvar preorder = require(\"../graphlib\").alg.preorder;\nvar postorder = require(\"../graphlib\").alg.postorder;\nvar simplify = require(\"../util\").simplify;\n\nmodule.exports = networkSimplex;\n\n// Expose some internals for testing purposes\nnetworkSimplex.initLowLimValues = initLowLimValues;\nnetworkSimplex.initCutValues = initCutValues;\nnetworkSimplex.calcCutValue = calcCutValue;\nnetworkSimplex.leaveEdge = leaveEdge;\nnetworkSimplex.enterEdge = enterEdge;\nnetworkSimplex.exchangeEdges = exchangeEdges;\n\n/*\n * The network simplex algorithm assigns ranks to each node in the input graph\n * and iteratively improves the ranking to reduce the length of edges.\n *\n * Preconditions:\n *\n * 1. The input graph must be a DAG.\n * 2. All nodes in the graph must have an object value.\n * 3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\n *\n * Postconditions:\n *\n * 1. All nodes in the graph will have an assigned \"rank\" attribute that has\n * been optimized by the network simplex algorithm. Ranks start at 0.\n *\n *\n * A rough sketch of the algorithm is as follows:\n *\n * 1. Assign initial ranks to each node. We use the longest path algorithm,\n * which assigns ranks to the lowest position possible. In general this\n * leads to very wide bottom ranks and unnecessarily long edges.\n * 2. Construct a feasible tight tree. A tight tree is one such that all\n * edges in the tree have no slack (difference between length of edge\n * and minlen for the edge). This by itself greatly improves the assigned\n * rankings by shorting edges.\n * 3. Iteratively find edges that have negative cut values. Generally a\n * negative cut value indicates that the edge could be removed and a new\n * tree edge could be added to produce a more compact graph.\n *\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\n * structure of the overall algorithm.\n */\nfunction networkSimplex(g) {\n g = simplify(g);\n initRank(g);\n var t = feasibleTree(g);\n initLowLimValues(t);\n initCutValues(t, g);\n\n var e, f;\n while ((e = leaveEdge(t))) {\n f = enterEdge(t, g, e);\n exchangeEdges(t, g, e, f);\n }\n}\n\n/*\n * Initializes cut values for all edges in the tree.\n */\nfunction initCutValues(t, g) {\n var vs = postorder(t, t.nodes());\n vs = vs.slice(0, vs.length - 1);\n _.forEach(vs, function(v) {\n assignCutValue(t, g, v);\n });\n}\n\nfunction assignCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\n}\n\n/*\n * Given the tight tree, its graph, and a child in the graph calculate and\n * return the cut value for the edge between the child and its parent.\n */\nfunction calcCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n // True if the child is on the tail end of the edge in the directed graph\n var childIsTail = true;\n // The graph's view of the tree edge we're inspecting\n var graphEdge = g.edge(child, parent);\n // The accumulated cut value for the edge between this node and its parent\n var cutValue = 0;\n\n if (!graphEdge) {\n childIsTail = false;\n graphEdge = g.edge(parent, child);\n }\n\n cutValue = graphEdge.weight;\n\n _.forEach(g.nodeEdges(child), function(e) {\n var isOutEdge = e.v === child,\n other = isOutEdge ? e.w : e.v;\n\n if (other !== parent) {\n var pointsToHead = isOutEdge === childIsTail,\n otherWeight = g.edge(e).weight;\n\n cutValue += pointsToHead ? otherWeight : -otherWeight;\n if (isTreeEdge(t, child, other)) {\n var otherCutValue = t.edge(child, other).cutvalue;\n cutValue += pointsToHead ? -otherCutValue : otherCutValue;\n }\n }\n });\n\n return cutValue;\n}\n\nfunction initLowLimValues(tree, root) {\n if (arguments.length < 2) {\n root = tree.nodes()[0];\n }\n dfsAssignLowLim(tree, {}, 1, root);\n}\n\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\n var low = nextLim;\n var label = tree.node(v);\n\n visited[v] = true;\n _.forEach(tree.neighbors(v), function(w) {\n if (!_.has(visited, w)) {\n nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\n }\n });\n\n label.low = low;\n label.lim = nextLim++;\n if (parent) {\n label.parent = parent;\n } else {\n // TODO should be able to remove this when we incrementally update low lim\n delete label.parent;\n }\n\n return nextLim;\n}\n\nfunction leaveEdge(tree) {\n return _.find(tree.edges(), function(e) {\n return tree.edge(e).cutvalue < 0;\n });\n}\n\nfunction enterEdge(t, g, edge) {\n var v = edge.v;\n var w = edge.w;\n\n // For the rest of this function we assume that v is the tail and w is the\n // head, so if we don't have this edge in the graph we should flip it to\n // match the correct orientation.\n if (!g.hasEdge(v, w)) {\n v = edge.w;\n w = edge.v;\n }\n\n var vLabel = t.node(v);\n var wLabel = t.node(w);\n var tailLabel = vLabel;\n var flip = false;\n\n // If the root is in the tail of the edge then we need to flip the logic that\n // checks for the head and tail nodes in the candidates function below.\n if (vLabel.lim > wLabel.lim) {\n tailLabel = wLabel;\n flip = true;\n }\n\n var candidates = _.filter(g.edges(), function(edge) {\n return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\n flip !== isDescendant(t, t.node(edge.w), tailLabel);\n });\n\n return _.minBy(candidates, function(edge) { return slack(g, edge); });\n}\n\nfunction exchangeEdges(t, g, e, f) {\n var v = e.v;\n var w = e.w;\n t.removeEdge(v, w);\n t.setEdge(f.v, f.w, {});\n initLowLimValues(t);\n initCutValues(t, g);\n updateRanks(t, g);\n}\n\nfunction updateRanks(t, g) {\n var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; });\n var vs = preorder(t, root);\n vs = vs.slice(1);\n _.forEach(vs, function(v) {\n var parent = t.node(v).parent,\n edge = g.edge(v, parent),\n flipped = false;\n\n if (!edge) {\n edge = g.edge(parent, v);\n flipped = true;\n }\n\n g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\n });\n}\n\n/*\n * Returns true if the edge is in the tree.\n */\nfunction isTreeEdge(tree, u, v) {\n return tree.hasEdge(u, v);\n}\n\n/*\n * Returns true if the specified node is descendant of the root node per the\n * assigned low and lim attributes in the tree.\n */\nfunction isDescendant(tree, vLabel, rootLabel) {\n return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\n}\n","var _ = require(\"./lodash\");\n\nmodule.exports = parentDummyChains;\n\nfunction parentDummyChains(g) {\n var postorderNums = postorder(g);\n\n _.forEach(g.graph().dummyChains, function(v) {\n var node = g.node(v);\n var edgeObj = node.edgeObj;\n var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);\n var path = pathData.path;\n var lca = pathData.lca;\n var pathIdx = 0;\n var pathV = path[pathIdx];\n var ascending = true;\n\n while (v !== edgeObj.w) {\n node = g.node(v);\n\n if (ascending) {\n while ((pathV = path[pathIdx]) !== lca &&\n g.node(pathV).maxRank < node.rank) {\n pathIdx++;\n }\n\n if (pathV === lca) {\n ascending = false;\n }\n }\n\n if (!ascending) {\n while (pathIdx < path.length - 1 &&\n g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\n pathIdx++;\n }\n pathV = path[pathIdx];\n }\n\n g.setParent(v, pathV);\n v = g.successors(v)[0];\n }\n });\n}\n\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\n// full path and the LCA.\nfunction findPath(g, postorderNums, v, w) {\n var vPath = [];\n var wPath = [];\n var low = Math.min(postorderNums[v].low, postorderNums[w].low);\n var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);\n var parent;\n var lca;\n\n // Traverse up from v to find the LCA\n parent = v;\n do {\n parent = g.parent(parent);\n vPath.push(parent);\n } while (parent &&\n (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\n lca = parent;\n\n // Traverse from w to LCA\n parent = w;\n while ((parent = g.parent(parent)) !== lca) {\n wPath.push(parent);\n }\n\n return { path: vPath.concat(wPath.reverse()), lca: lca };\n}\n\nfunction postorder(g) {\n var result = {};\n var lim = 0;\n\n function dfs(v) {\n var low = lim;\n _.forEach(g.children(v), dfs);\n result[v] = { low: low, lim: lim++ };\n }\n _.forEach(g.children(), dfs);\n\n return result;\n}\n","var _ = require(\"./lodash\");\nvar util = require(\"./util\");\n\nmodule.exports = {\n run: run,\n cleanup: cleanup\n};\n\n/*\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\n * adds appropriate edges to ensure that all cluster nodes are placed between\n * these boundries, and ensures that the graph is connected.\n *\n * In addition we ensure, through the use of the minlen property, that nodes\n * and subgraph border nodes to not end up on the same rank.\n *\n * Preconditions:\n *\n * 1. Input graph is a DAG\n * 2. Nodes in the input graph has a minlen attribute\n *\n * Postconditions:\n *\n * 1. Input graph is connected.\n * 2. Dummy nodes are added for the tops and bottoms of subgraphs.\n * 3. The minlen attribute for nodes is adjusted to ensure nodes do not\n * get placed on the same rank as subgraph border nodes.\n *\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\n * Graphs.\"\n */\nfunction run(g) {\n var root = util.addDummyNode(g, \"root\", {}, \"_root\");\n var depths = treeDepths(g);\n var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array\n var nodeSep = 2 * height + 1;\n\n g.graph().nestingRoot = root;\n\n // Multiply minlen by nodeSep to align nodes on non-border ranks.\n _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\n\n // Calculate a weight that is sufficient to keep subgraphs vertically compact\n var weight = sumWeights(g) + 1;\n\n // Create border nodes and link them up\n _.forEach(g.children(), function(child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n });\n\n // Save the multiplier for node layers for later removal of empty border\n // layers.\n g.graph().nodeRankFactor = nodeSep;\n}\n\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\n var children = g.children(v);\n if (!children.length) {\n if (v !== root) {\n g.setEdge(root, v, { weight: 0, minlen: nodeSep });\n }\n return;\n }\n\n var top = util.addBorderNode(g, \"_bt\");\n var bottom = util.addBorderNode(g, \"_bb\");\n var label = g.node(v);\n\n g.setParent(top, v);\n label.borderTop = top;\n g.setParent(bottom, v);\n label.borderBottom = bottom;\n\n _.forEach(children, function(child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n\n var childNode = g.node(child);\n var childTop = childNode.borderTop ? childNode.borderTop : child;\n var childBottom = childNode.borderBottom ? childNode.borderBottom : child;\n var thisWeight = childNode.borderTop ? weight : 2 * weight;\n var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\n\n g.setEdge(top, childTop, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true\n });\n\n g.setEdge(childBottom, bottom, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true\n });\n });\n\n if (!g.parent(v)) {\n g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\n }\n}\n\nfunction treeDepths(g) {\n var depths = {};\n function dfs(v, depth) {\n var children = g.children(v);\n if (children && children.length) {\n _.forEach(children, function(child) {\n dfs(child, depth + 1);\n });\n }\n depths[v] = depth;\n }\n _.forEach(g.children(), function(v) { dfs(v, 1); });\n return depths;\n}\n\nfunction sumWeights(g) {\n return _.reduce(g.edges(), function(acc, e) {\n return acc + g.edge(e).weight;\n }, 0);\n}\n\nfunction cleanup(g) {\n var graphLabel = g.graph();\n g.removeNode(graphLabel.nestingRoot);\n delete graphLabel.nestingRoot;\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (edge.nestingEdge) {\n g.removeEdge(e);\n }\n });\n}\n","var _ = require(\"./lodash\");\nvar util = require(\"./util\");\n\nmodule.exports = addBorderSegments;\n\nfunction addBorderSegments(g) {\n function dfs(v) {\n var children = g.children(v);\n var node = g.node(v);\n if (children.length) {\n _.forEach(children, dfs);\n }\n\n if (_.has(node, \"minRank\")) {\n node.borderLeft = [];\n node.borderRight = [];\n for (var rank = node.minRank, maxRank = node.maxRank + 1;\n rank < maxRank;\n ++rank) {\n addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\n addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\n }\n }\n }\n\n _.forEach(g.children(), dfs);\n}\n\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\n var label = { width: 0, height: 0, rank: rank, borderType: prop };\n var prev = sgNode[prop][rank - 1];\n var curr = util.addDummyNode(g, \"border\", label, prefix);\n sgNode[prop][rank] = curr;\n g.setParent(curr, sg);\n if (prev) {\n g.setEdge(prev, curr, { weight: 1 });\n }\n}\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\n\nmodule.exports = {\n adjust: adjust,\n undo: undo\n};\n\nfunction adjust(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === \"lr\" || rankDir === \"rl\") {\n swapWidthHeight(g);\n }\n}\n\nfunction undo(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === \"bt\" || rankDir === \"rl\") {\n reverseY(g);\n }\n\n if (rankDir === \"lr\" || rankDir === \"rl\") {\n swapXY(g);\n swapWidthHeight(g);\n }\n}\n\nfunction swapWidthHeight(g) {\n _.forEach(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\n _.forEach(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\n}\n\nfunction swapWidthHeightOne(attrs) {\n var w = attrs.width;\n attrs.width = attrs.height;\n attrs.height = w;\n}\n\nfunction reverseY(g) {\n _.forEach(g.nodes(), function(v) { reverseYOne(g.node(v)); });\n\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n _.forEach(edge.points, reverseYOne);\n if (_.has(edge, \"y\")) {\n reverseYOne(edge);\n }\n });\n}\n\nfunction reverseYOne(attrs) {\n attrs.y = -attrs.y;\n}\n\nfunction swapXY(g) {\n _.forEach(g.nodes(), function(v) { swapXYOne(g.node(v)); });\n\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n _.forEach(edge.points, swapXYOne);\n if (_.has(edge, \"x\")) {\n swapXYOne(edge);\n }\n });\n}\n\nfunction swapXYOne(attrs) {\n var x = attrs.x;\n attrs.x = attrs.y;\n attrs.y = x;\n}\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\nvar initOrder = require(\"./init-order\");\nvar crossCount = require(\"./cross-count\");\nvar sortSubgraph = require(\"./sort-subgraph\");\nvar buildLayerGraph = require(\"./build-layer-graph\");\nvar addSubgraphConstraints = require(\"./add-subgraph-constraints\");\nvar Graph = require(\"../graphlib\").Graph;\nvar util = require(\"../util\");\n\nmodule.exports = order;\n\n/*\n * Applies heuristics to minimize edge crossings in the graph and sets the best\n * order solution as an order attribute on each node.\n *\n * Pre-conditions:\n *\n * 1. Graph must be DAG\n * 2. Graph nodes must be objects with a \"rank\" attribute\n * 3. Graph edges must have the \"weight\" attribute\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have an \"order\" attribute based on the results of the\n * algorithm.\n */\nfunction order(g) {\n var maxRank = util.maxRank(g),\n downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\n upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\n\n var layering = initOrder(g);\n assignOrder(g, layering);\n\n var bestCC = Number.POSITIVE_INFINITY,\n best;\n\n for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\n\n layering = util.buildLayerMatrix(g);\n var cc = crossCount(g, layering);\n if (cc < bestCC) {\n lastBest = 0;\n best = _.cloneDeep(layering);\n bestCC = cc;\n }\n }\n\n assignOrder(g, best);\n}\n\nfunction buildLayerGraphs(g, ranks, relationship) {\n return _.map(ranks, function(rank) {\n return buildLayerGraph(g, rank, relationship);\n });\n}\n\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\n var cg = new Graph();\n _.forEach(layerGraphs, function(lg) {\n var root = lg.graph().root;\n var sorted = sortSubgraph(lg, root, cg, biasRight);\n _.forEach(sorted.vs, function(v, i) {\n lg.node(v).order = i;\n });\n addSubgraphConstraints(lg, cg, sorted.vs);\n });\n}\n\nfunction assignOrder(g, layering) {\n _.forEach(layering, function(layer) {\n _.forEach(layer, function(v, i) {\n g.node(v).order = i;\n });\n });\n}\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\n\nmodule.exports = initOrder;\n\n/*\n * Assigns an initial order value for each node by performing a DFS search\n * starting from nodes in the first rank. Nodes are assigned an order in their\n * rank as they are first visited.\n *\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\n * Graphs.\"\n *\n * Returns a layering matrix with an array per layer and each layer sorted by\n * the order of its nodes.\n */\nfunction initOrder(g) {\n var visited = {};\n var simpleNodes = _.filter(g.nodes(), function(v) {\n return !g.children(v).length;\n });\n var maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; }));\n var layers = _.map(_.range(maxRank + 1), function() { return []; });\n\n function dfs(v) {\n if (_.has(visited, v)) return;\n visited[v] = true;\n var node = g.node(v);\n layers[node.rank].push(v);\n _.forEach(g.successors(v), dfs);\n }\n\n var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\n _.forEach(orderedVs, dfs);\n\n return layers;\n}\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\n\nmodule.exports = crossCount;\n\n/*\n * A function that takes a layering (an array of layers, each with an array of\n * ordererd nodes) and a graph and returns a weighted crossing count.\n *\n * Pre-conditions:\n *\n * 1. Input graph must be simple (not a multigraph), directed, and include\n * only simple edges.\n * 2. Edges in the input graph must have assigned weights.\n *\n * Post-conditions:\n *\n * 1. The graph and layering matrix are left unchanged.\n *\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\n */\nfunction crossCount(g, layering) {\n var cc = 0;\n for (var i = 1; i < layering.length; ++i) {\n cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\n }\n return cc;\n}\n\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\n // Sort all of the edges between the north and south layers by their position\n // in the north layer and then the south. Map these edges to the position of\n // their head in the south layer.\n var southPos = _.zipObject(southLayer,\n _.map(southLayer, function (v, i) { return i; }));\n var southEntries = _.flatten(_.map(northLayer, function(v) {\n return _.sortBy(_.map(g.outEdges(v), function(e) {\n return { pos: southPos[e.w], weight: g.edge(e).weight };\n }), \"pos\");\n }), true);\n\n // Build the accumulator tree\n var firstIndex = 1;\n while (firstIndex < southLayer.length) firstIndex <<= 1;\n var treeSize = 2 * firstIndex - 1;\n firstIndex -= 1;\n var tree = _.map(new Array(treeSize), function() { return 0; });\n\n // Calculate the weighted crossings\n var cc = 0;\n _.forEach(southEntries.forEach(function(entry) {\n var index = entry.pos + firstIndex;\n tree[index] += entry.weight;\n var weightSum = 0;\n while (index > 0) {\n if (index % 2) {\n weightSum += tree[index + 1];\n }\n index = (index - 1) >> 1;\n tree[index] += entry.weight;\n }\n cc += entry.weight * weightSum;\n }));\n\n return cc;\n}\n","var _ = require(\"../lodash\");\nvar barycenter = require(\"./barycenter\");\nvar resolveConflicts = require(\"./resolve-conflicts\");\nvar sort = require(\"./sort\");\n\nmodule.exports = sortSubgraph;\n\nfunction sortSubgraph(g, v, cg, biasRight) {\n var movable = g.children(v);\n var node = g.node(v);\n var bl = node ? node.borderLeft : undefined;\n var br = node ? node.borderRight: undefined;\n var subgraphs = {};\n\n if (bl) {\n movable = _.filter(movable, function(w) {\n return w !== bl && w !== br;\n });\n }\n\n var barycenters = barycenter(g, movable);\n _.forEach(barycenters, function(entry) {\n if (g.children(entry.v).length) {\n var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\n subgraphs[entry.v] = subgraphResult;\n if (_.has(subgraphResult, \"barycenter\")) {\n mergeBarycenters(entry, subgraphResult);\n }\n }\n });\n\n var entries = resolveConflicts(barycenters, cg);\n expandSubgraphs(entries, subgraphs);\n\n var result = sort(entries, biasRight);\n\n if (bl) {\n result.vs = _.flatten([bl, result.vs, br], true);\n if (g.predecessors(bl).length) {\n var blPred = g.node(g.predecessors(bl)[0]),\n brPred = g.node(g.predecessors(br)[0]);\n if (!_.has(result, \"barycenter\")) {\n result.barycenter = 0;\n result.weight = 0;\n }\n result.barycenter = (result.barycenter * result.weight +\n blPred.order + brPred.order) / (result.weight + 2);\n result.weight += 2;\n }\n }\n\n return result;\n}\n\nfunction expandSubgraphs(entries, subgraphs) {\n _.forEach(entries, function(entry) {\n entry.vs = _.flatten(entry.vs.map(function(v) {\n if (subgraphs[v]) {\n return subgraphs[v].vs;\n }\n return v;\n }), true);\n });\n}\n\nfunction mergeBarycenters(target, other) {\n if (!_.isUndefined(target.barycenter)) {\n target.barycenter = (target.barycenter * target.weight +\n other.barycenter * other.weight) /\n (target.weight + other.weight);\n target.weight += other.weight;\n } else {\n target.barycenter = other.barycenter;\n target.weight = other.weight;\n }\n}\n","var _ = require(\"../lodash\");\n\nmodule.exports = barycenter;\n\nfunction barycenter(g, movable) {\n return _.map(movable, function(v) {\n var inV = g.inEdges(v);\n if (!inV.length) {\n return { v: v };\n } else {\n var result = _.reduce(inV, function(acc, e) {\n var edge = g.edge(e),\n nodeU = g.node(e.v);\n return {\n sum: acc.sum + (edge.weight * nodeU.order),\n weight: acc.weight + edge.weight\n };\n }, { sum: 0, weight: 0 });\n\n return {\n v: v,\n barycenter: result.sum / result.weight,\n weight: result.weight\n };\n }\n });\n}\n\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\n\nmodule.exports = resolveConflicts;\n\n/*\n * Given a list of entries of the form {v, barycenter, weight} and a\n * constraint graph this function will resolve any conflicts between the\n * constraint graph and the barycenters for the entries. If the barycenters for\n * an entry would violate a constraint in the constraint graph then we coalesce\n * the nodes in the conflict into a new node that respects the contraint and\n * aggregates barycenter and weight information.\n *\n * This implementation is based on the description in Forster, \"A Fast and\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\n * differs in some specific details.\n *\n * Pre-conditions:\n *\n * 1. Each entry has the form {v, barycenter, weight}, or if the node has\n * no barycenter, then {v}.\n *\n * Returns:\n *\n * A new list of entries of the form {vs, i, barycenter, weight}. The list\n * `vs` may either be a singleton or it may be an aggregation of nodes\n * ordered such that they do not violate constraints from the constraint\n * graph. The property `i` is the lowest original index of any of the\n * elements in `vs`.\n */\nfunction resolveConflicts(entries, cg) {\n var mappedEntries = {};\n _.forEach(entries, function(entry, i) {\n var tmp = mappedEntries[entry.v] = {\n indegree: 0,\n \"in\": [],\n out: [],\n vs: [entry.v],\n i: i\n };\n if (!_.isUndefined(entry.barycenter)) {\n tmp.barycenter = entry.barycenter;\n tmp.weight = entry.weight;\n }\n });\n\n _.forEach(cg.edges(), function(e) {\n var entryV = mappedEntries[e.v];\n var entryW = mappedEntries[e.w];\n if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\n entryW.indegree++;\n entryV.out.push(mappedEntries[e.w]);\n }\n });\n\n var sourceSet = _.filter(mappedEntries, function(entry) {\n return !entry.indegree;\n });\n\n return doResolveConflicts(sourceSet);\n}\n\nfunction doResolveConflicts(sourceSet) {\n var entries = [];\n\n function handleIn(vEntry) {\n return function(uEntry) {\n if (uEntry.merged) {\n return;\n }\n if (_.isUndefined(uEntry.barycenter) ||\n _.isUndefined(vEntry.barycenter) ||\n uEntry.barycenter >= vEntry.barycenter) {\n mergeEntries(vEntry, uEntry);\n }\n };\n }\n\n function handleOut(vEntry) {\n return function(wEntry) {\n wEntry[\"in\"].push(vEntry);\n if (--wEntry.indegree === 0) {\n sourceSet.push(wEntry);\n }\n };\n }\n\n while (sourceSet.length) {\n var entry = sourceSet.pop();\n entries.push(entry);\n _.forEach(entry[\"in\"].reverse(), handleIn(entry));\n _.forEach(entry.out, handleOut(entry));\n }\n\n return _.map(_.filter(entries, function(entry) { return !entry.merged; }),\n function(entry) {\n return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\n });\n\n}\n\nfunction mergeEntries(target, source) {\n var sum = 0;\n var weight = 0;\n\n if (target.weight) {\n sum += target.barycenter * target.weight;\n weight += target.weight;\n }\n\n if (source.weight) {\n sum += source.barycenter * source.weight;\n weight += source.weight;\n }\n\n target.vs = source.vs.concat(target.vs);\n target.barycenter = sum / weight;\n target.weight = weight;\n target.i = Math.min(source.i, target.i);\n source.merged = true;\n}\n","var _ = require(\"../lodash\");\nvar util = require(\"../util\");\n\nmodule.exports = sort;\n\nfunction sort(entries, biasRight) {\n var parts = util.partition(entries, function(entry) {\n return _.has(entry, \"barycenter\");\n });\n var sortable = parts.lhs,\n unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\n vs = [],\n sum = 0,\n weight = 0,\n vsIndex = 0;\n\n sortable.sort(compareWithBias(!!biasRight));\n\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n\n _.forEach(sortable, function (entry) {\n vsIndex += entry.vs.length;\n vs.push(entry.vs);\n sum += entry.barycenter * entry.weight;\n weight += entry.weight;\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n });\n\n var result = { vs: _.flatten(vs, true) };\n if (weight) {\n result.barycenter = sum / weight;\n result.weight = weight;\n }\n return result;\n}\n\nfunction consumeUnsortable(vs, unsortable, index) {\n var last;\n while (unsortable.length && (last = _.last(unsortable)).i <= index) {\n unsortable.pop();\n vs.push(last.vs);\n index++;\n }\n return index;\n}\n\nfunction compareWithBias(bias) {\n return function(entryV, entryW) {\n if (entryV.barycenter < entryW.barycenter) {\n return -1;\n } else if (entryV.barycenter > entryW.barycenter) {\n return 1;\n }\n\n return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\n };\n}\n","var _ = require(\"../lodash\");\nvar Graph = require(\"../graphlib\").Graph;\n\nmodule.exports = buildLayerGraph;\n\n/*\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\n * contain all base and subgraph nodes from the request layer in their original\n * hierarchy and any edges that are incident on these nodes and are of the type\n * requested by the \"relationship\" parameter.\n *\n * Nodes from the requested rank that do not have parents are assigned a root\n * node in the output graph, which is set in the root graph attribute. This\n * makes it easy to walk the hierarchy of movable nodes during ordering.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG\n * 2. Base nodes in the input graph have a rank attribute\n * 3. Subgraph nodes in the input graph has minRank and maxRank attributes\n * 4. Edges have an assigned weight\n *\n * Post-conditions:\n *\n * 1. Output graph has all nodes in the movable rank with preserved\n * hierarchy.\n * 2. Root nodes in the movable layer are made children of the node\n * indicated by the root attribute of the graph.\n * 3. Non-movable nodes incident on movable nodes, selected by the\n * relationship parameter, are included in the graph (without hierarchy).\n * 4. Edges incident on movable nodes, selected by the relationship\n * parameter, are added to the output graph.\n * 5. The weights for copied edges are aggregated as need, since the output\n * graph is not a multi-graph.\n */\nfunction buildLayerGraph(g, rank, relationship) {\n var root = createRootNode(g),\n result = new Graph({ compound: true }).setGraph({ root: root })\n .setDefaultNodeLabel(function(v) { return g.node(v); });\n\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v),\n parent = g.parent(v);\n\n if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\n result.setNode(v);\n result.setParent(v, parent || root);\n\n // This assumes we have only short edges!\n _.forEach(g[relationship](v), function(e) {\n var u = e.v === v ? e.w : e.v,\n edge = result.edge(u, v),\n weight = !_.isUndefined(edge) ? edge.weight : 0;\n result.setEdge(u, v, { weight: g.edge(e).weight + weight });\n });\n\n if (_.has(node, \"minRank\")) {\n result.setNode(v, {\n borderLeft: node.borderLeft[rank],\n borderRight: node.borderRight[rank]\n });\n }\n }\n });\n\n return result;\n}\n\nfunction createRootNode(g) {\n var v;\n while (g.hasNode((v = _.uniqueId(\"_root\"))));\n return v;\n}\n","var _ = require(\"../lodash\");\n\nmodule.exports = addSubgraphConstraints;\n\nfunction addSubgraphConstraints(g, cg, vs) {\n var prev = {},\n rootPrev;\n\n _.forEach(vs, function(v) {\n var child = g.parent(v),\n parent,\n prevChild;\n while (child) {\n parent = g.parent(child);\n if (parent) {\n prevChild = prev[parent];\n prev[parent] = child;\n } else {\n prevChild = rootPrev;\n rootPrev = child;\n }\n if (prevChild && prevChild !== child) {\n cg.setEdge(prevChild, child);\n return;\n }\n child = parent;\n }\n });\n\n /*\n function dfs(v) {\n var children = v ? g.children(v) : g.children();\n if (children.length) {\n var min = Number.POSITIVE_INFINITY,\n subgraphs = [];\n _.each(children, function(child) {\n var childMin = dfs(child);\n if (g.children(child).length) {\n subgraphs.push({ v: child, order: childMin });\n }\n min = Math.min(min, childMin);\n });\n _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\n cg.setEdge(prev.v, curr.v);\n return curr;\n });\n return min;\n }\n return g.node(v).order;\n }\n dfs(undefined);\n */\n}\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\nvar util = require(\"../util\");\nvar positionX = require(\"./bk\").positionX;\n\nmodule.exports = position;\n\nfunction position(g) {\n g = util.asNonCompoundGraph(g);\n\n positionY(g);\n _.forEach(positionX(g), function(x, v) {\n g.node(v).x = x;\n });\n}\n\nfunction positionY(g) {\n var layering = util.buildLayerMatrix(g);\n var rankSep = g.graph().ranksep;\n var prevY = 0;\n _.forEach(layering, function(layer) {\n var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\n _.forEach(layer, function(v) {\n g.node(v).y = prevY + maxHeight / 2;\n });\n prevY += maxHeight + rankSep;\n });\n}\n\n","\"use strict\";\n\nvar _ = require(\"../lodash\");\nvar Graph = require(\"../graphlib\").Graph;\nvar util = require(\"../util\");\n\n/*\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\n * and Simple Horizontal Coordinate Assignment.\"\n */\n\nmodule.exports = {\n positionX: positionX,\n findType1Conflicts: findType1Conflicts,\n findType2Conflicts: findType2Conflicts,\n addConflict: addConflict,\n hasConflict: hasConflict,\n verticalAlignment: verticalAlignment,\n horizontalCompaction: horizontalCompaction,\n alignCoordinates: alignCoordinates,\n findSmallestWidthAlignment: findSmallestWidthAlignment,\n balance: balance\n};\n\n/*\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\n * property. A type-1 conflict is one where a non-inner segment crosses an\n * inner segment. An inner segment is an edge with both incident nodes marked\n * with the \"dummy\" property.\n *\n * This algorithm scans layer by layer, starting with the second, for type-1\n * conflicts between the current layer and the previous layer. For each layer\n * it scans the nodes from left to right until it reaches one that is incident\n * on an inner segment. It then scans predecessors to determine if they have\n * edges that cross that inner segment. At the end a final scan is done for all\n * nodes on the current rank to see if they cross the last visited inner\n * segment.\n *\n * This algorithm (safely) assumes that a dummy node will only be incident on a\n * single node in the layers being scanned.\n */\nfunction findType1Conflicts(g, layering) {\n var conflicts = {};\n\n function visitLayer(prevLayer, layer) {\n var\n // last visited node in the previous layer that is incident on an inner\n // segment.\n k0 = 0,\n // Tracks the last node in this layer scanned for crossings with a type-1\n // segment.\n scanPos = 0,\n prevLayerLength = prevLayer.length,\n lastNode = _.last(layer);\n\n _.forEach(layer, function(v, i) {\n var w = findOtherInnerSegmentNode(g, v),\n k1 = w ? g.node(w).order : prevLayerLength;\n\n if (w || v === lastNode) {\n _.forEach(layer.slice(scanPos, i +1), function(scanNode) {\n _.forEach(g.predecessors(scanNode), function(u) {\n var uLabel = g.node(u),\n uPos = uLabel.order;\n if ((uPos < k0 || k1 < uPos) &&\n !(uLabel.dummy && g.node(scanNode).dummy)) {\n addConflict(conflicts, u, scanNode);\n }\n });\n });\n scanPos = i + 1;\n k0 = k1;\n }\n });\n\n return layer;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findType2Conflicts(g, layering) {\n var conflicts = {};\n\n function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\n var v;\n _.forEach(_.range(southPos, southEnd), function(i) {\n v = south[i];\n if (g.node(v).dummy) {\n _.forEach(g.predecessors(v), function(u) {\n var uNode = g.node(u);\n if (uNode.dummy &&\n (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\n addConflict(conflicts, u, v);\n }\n });\n }\n });\n }\n\n\n function visitLayer(north, south) {\n var prevNorthPos = -1,\n nextNorthPos,\n southPos = 0;\n\n _.forEach(south, function(v, southLookahead) {\n if (g.node(v).dummy === \"border\") {\n var predecessors = g.predecessors(v);\n if (predecessors.length) {\n nextNorthPos = g.node(predecessors[0]).order;\n scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\n southPos = southLookahead;\n prevNorthPos = nextNorthPos;\n }\n }\n scan(south, southPos, south.length, nextNorthPos, north.length);\n });\n\n return south;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findOtherInnerSegmentNode(g, v) {\n if (g.node(v).dummy) {\n return _.find(g.predecessors(v), function(u) {\n return g.node(u).dummy;\n });\n }\n}\n\nfunction addConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n\n var conflictsV = conflicts[v];\n if (!conflictsV) {\n conflicts[v] = conflictsV = {};\n }\n conflictsV[w] = true;\n}\n\nfunction hasConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return _.has(conflicts[v], w);\n}\n\n/*\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\n * attempts to align a node with one of its median neighbors. If the edge\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\n * If a previous node has already formed a block with a node after the node\n * we're trying to form a block with, we also ignore that possibility - our\n * blocks would be split in that scenario.\n */\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\n var root = {},\n align = {},\n pos = {};\n\n // We cache the position here based on the layering because the graph and\n // layering may be out of sync. The layering matrix is manipulated to\n // generate different extreme alignments.\n _.forEach(layering, function(layer) {\n _.forEach(layer, function(v, order) {\n root[v] = v;\n align[v] = v;\n pos[v] = order;\n });\n });\n\n _.forEach(layering, function(layer) {\n var prevIdx = -1;\n _.forEach(layer, function(v) {\n var ws = neighborFn(v);\n if (ws.length) {\n ws = _.sortBy(ws, function(w) { return pos[w]; });\n var mp = (ws.length - 1) / 2;\n for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\n var w = ws[i];\n if (align[v] === v &&\n prevIdx < pos[w] &&\n !hasConflict(conflicts, v, w)) {\n align[w] = v;\n align[v] = root[v] = root[w];\n prevIdx = pos[w];\n }\n }\n }\n });\n });\n\n return { root: root, align: align };\n}\n\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\n // This portion of the algorithm differs from BK due to a number of problems.\n // Instead of their algorithm we construct a new block graph and do two\n // sweeps. The first sweep places blocks with the smallest possible\n // coordinates. The second sweep removes unused space by moving blocks to the\n // greatest coordinates without violating separation.\n var xs = {},\n blockG = buildBlockGraph(g, layering, root, reverseSep),\n borderType = reverseSep ? \"borderLeft\" : \"borderRight\";\n\n function iterate(setXsFunc, nextNodesFunc) {\n var stack = blockG.nodes();\n var elem = stack.pop();\n var visited = {};\n while (elem) {\n if (visited[elem]) {\n setXsFunc(elem);\n } else {\n visited[elem] = true;\n stack.push(elem);\n stack = stack.concat(nextNodesFunc(elem));\n }\n\n elem = stack.pop();\n }\n }\n\n // First pass, assign smallest coordinates\n function pass1(elem) {\n xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) {\n return Math.max(acc, xs[e.v] + blockG.edge(e));\n }, 0);\n }\n\n // Second pass, assign greatest coordinates\n function pass2(elem) {\n var min = blockG.outEdges(elem).reduce(function(acc, e) {\n return Math.min(acc, xs[e.w] - blockG.edge(e));\n }, Number.POSITIVE_INFINITY);\n\n var node = g.node(elem);\n if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {\n xs[elem] = Math.max(xs[elem], min);\n }\n }\n\n iterate(pass1, blockG.predecessors.bind(blockG));\n iterate(pass2, blockG.successors.bind(blockG));\n\n // Assign x coordinates to all nodes\n _.forEach(align, function(v) {\n xs[v] = xs[root[v]];\n });\n\n return xs;\n}\n\n\nfunction buildBlockGraph(g, layering, root, reverseSep) {\n var blockGraph = new Graph(),\n graphLabel = g.graph(),\n sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\n\n _.forEach(layering, function(layer) {\n var u;\n _.forEach(layer, function(v) {\n var vRoot = root[v];\n blockGraph.setNode(vRoot);\n if (u) {\n var uRoot = root[u],\n prevMax = blockGraph.edge(uRoot, vRoot);\n blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\n }\n u = v;\n });\n });\n\n return blockGraph;\n}\n\n/*\n * Returns the alignment that has the smallest width of the given alignments.\n */\nfunction findSmallestWidthAlignment(g, xss) {\n return _.minBy(_.values(xss), function (xs) {\n var max = Number.NEGATIVE_INFINITY;\n var min = Number.POSITIVE_INFINITY;\n\n _.forIn(xs, function (x, v) {\n var halfWidth = width(g, v) / 2;\n\n max = Math.max(x + halfWidth, max);\n min = Math.min(x - halfWidth, min);\n });\n\n return max - min;\n });\n}\n\n/*\n * Align the coordinates of each of the layout alignments such that\n * left-biased alignments have their minimum coordinate at the same point as\n * the minimum coordinate of the smallest width alignment and right-biased\n * alignments have their maximum coordinate at the same point as the maximum\n * coordinate of the smallest width alignment.\n */\nfunction alignCoordinates(xss, alignTo) {\n var alignToVals = _.values(alignTo),\n alignToMin = _.min(alignToVals),\n alignToMax = _.max(alignToVals);\n\n _.forEach([\"u\", \"d\"], function(vert) {\n _.forEach([\"l\", \"r\"], function(horiz) {\n var alignment = vert + horiz,\n xs = xss[alignment],\n delta;\n if (xs === alignTo) return;\n\n var xsVals = _.values(xs);\n delta = horiz === \"l\" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);\n\n if (delta) {\n xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\n }\n });\n });\n}\n\nfunction balance(xss, align) {\n return _.mapValues(xss.ul, function(ignore, v) {\n if (align) {\n return xss[align.toLowerCase()][v];\n } else {\n var xs = _.sortBy(_.map(xss, v));\n return (xs[1] + xs[2]) / 2;\n }\n });\n}\n\nfunction positionX(g) {\n var layering = util.buildLayerMatrix(g);\n var conflicts = _.merge(\n findType1Conflicts(g, layering),\n findType2Conflicts(g, layering));\n\n var xss = {};\n var adjustedLayering;\n _.forEach([\"u\", \"d\"], function(vert) {\n adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\n _.forEach([\"l\", \"r\"], function(horiz) {\n if (horiz === \"r\") {\n adjustedLayering = _.map(adjustedLayering, function(inner) {\n return _.values(inner).reverse();\n });\n }\n\n var neighborFn = (vert === \"u\" ? g.predecessors : g.successors).bind(g);\n var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\n var xs = horizontalCompaction(g, adjustedLayering,\n align.root, align.align, horiz === \"r\");\n if (horiz === \"r\") {\n xs = _.mapValues(xs, function(x) { return -x; });\n }\n xss[vert + horiz] = xs;\n });\n });\n\n var smallestWidth = findSmallestWidthAlignment(g, xss);\n alignCoordinates(xss, smallestWidth);\n return balance(xss, g.graph().align);\n}\n\nfunction sep(nodeSep, edgeSep, reverseSep) {\n return function(g, v, w) {\n var vLabel = g.node(v);\n var wLabel = g.node(w);\n var sum = 0;\n var delta;\n\n sum += vLabel.width / 2;\n if (_.has(vLabel, \"labelpos\")) {\n switch (vLabel.labelpos.toLowerCase()) {\n case \"l\": delta = -vLabel.width / 2; break;\n case \"r\": delta = vLabel.width / 2; break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\n sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\n\n sum += wLabel.width / 2;\n if (_.has(wLabel, \"labelpos\")) {\n switch (wLabel.labelpos.toLowerCase()) {\n case \"l\": delta = wLabel.width / 2; break;\n case \"r\": delta = -wLabel.width / 2; break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n return sum;\n };\n}\n\nfunction width(g, v) {\n return g.node(v).width;\n}\n","var _ = require(\"./lodash\");\nvar util = require(\"./util\");\nvar Graph = require(\"./graphlib\").Graph;\n\nmodule.exports = {\n debugOrdering: debugOrdering\n};\n\n/* istanbul ignore next */\nfunction debugOrdering(g) {\n var layerMatrix = util.buildLayerMatrix(g);\n\n var h = new Graph({ compound: true, multigraph: true }).setGraph({});\n\n _.forEach(g.nodes(), function(v) {\n h.setNode(v, { label: v });\n h.setParent(v, \"layer\" + g.node(v).rank);\n });\n\n _.forEach(g.edges(), function(e) {\n h.setEdge(e.v, e.w, {}, e.name);\n });\n\n _.forEach(layerMatrix, function(layer, i) {\n var layerV = \"layer\" + i;\n h.setNode(layerV, { rank: \"same\" });\n _.reduce(layer, function(u, v) {\n h.setEdge(u, v, { style: \"invis\" });\n return v;\n });\n });\n\n return h;\n}\n","module.exports = \"0.8.5\";\n","module.exports = {\n node: require(\"./intersect-node\"),\n circle: require(\"./intersect-circle\"),\n ellipse: require(\"./intersect-ellipse\"),\n polygon: require(\"./intersect-polygon\"),\n rect: require(\"./intersect-rect\")\n};\n","module.exports = intersectLine;\n\n/*\n * Returns the point at which two lines, p and q, intersect or returns\n * undefined if they do not intersect.\n */\nfunction intersectLine(p1, p2, q1, q2) {\n // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,\n // p7 and p473.\n\n var a1, a2, b1, b2, c1, c2;\n var r1, r2 , r3, r4;\n var denom, offset, num;\n var x, y;\n\n // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +\n // b1 y + c1 = 0.\n a1 = p2.y - p1.y;\n b1 = p1.x - p2.x;\n c1 = (p2.x * p1.y) - (p1.x * p2.y);\n\n // Compute r3 and r4.\n r3 = ((a1 * q1.x) + (b1 * q1.y) + c1);\n r4 = ((a1 * q2.x) + (b1 * q2.y) + c1);\n\n // Check signs of r3 and r4. If both point 3 and point 4 lie on\n // same side of line 1, the line segments do not intersect.\n if ((r3 !== 0) && (r4 !== 0) && sameSign(r3, r4)) {\n return /*DONT_INTERSECT*/;\n }\n\n // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0\n a2 = q2.y - q1.y;\n b2 = q1.x - q2.x;\n c2 = (q2.x * q1.y) - (q1.x * q2.y);\n\n // Compute r1 and r2\n r1 = (a2 * p1.x) + (b2 * p1.y) + c2;\n r2 = (a2 * p2.x) + (b2 * p2.y) + c2;\n\n // Check signs of r1 and r2. If both point 1 and point 2 lie\n // on same side of second line segment, the line segments do\n // not intersect.\n if ((r1 !== 0) && (r2 !== 0) && (sameSign(r1, r2))) {\n return /*DONT_INTERSECT*/;\n }\n\n // Line segments intersect: compute intersection point.\n denom = (a1 * b2) - (a2 * b1);\n if (denom === 0) {\n return /*COLLINEAR*/;\n }\n\n offset = Math.abs(denom / 2);\n\n // The denom/2 is to get rounding instead of truncating. It\n // is added or subtracted to the numerator, depending upon the\n // sign of the numerator.\n num = (b1 * c2) - (b2 * c1);\n x = (num < 0) ? ((num - offset) / denom) : ((num + offset) / denom);\n\n num = (a2 * c1) - (a1 * c2);\n y = (num < 0) ? ((num - offset) / denom) : ((num + offset) / denom);\n\n return { x: x, y: y };\n}\n\nfunction sameSign(r1, r2) {\n return r1 * r2 > 0;\n}\n","var _ = require(\"./lodash\");\nvar d3 = require(\"./d3\");\nvar layout = require(\"./dagre\").layout;\n\nmodule.exports = render;\n\n// This design is based on http://bost.ocks.org/mike/chart/.\nfunction render() {\n var createNodes = require(\"./create-nodes\");\n var createClusters = require(\"./create-clusters\");\n var createEdgeLabels = require(\"./create-edge-labels\");\n var createEdgePaths = require(\"./create-edge-paths\");\n var positionNodes = require(\"./position-nodes\");\n var positionEdgeLabels = require(\"./position-edge-labels\");\n var positionClusters = require(\"./position-clusters\");\n var shapes = require(\"./shapes\");\n var arrows = require(\"./arrows\");\n\n var fn = function(svg, g) {\n preProcessGraph(g);\n\n var outputGroup = createOrSelectGroup(svg, \"output\");\n var clustersGroup = createOrSelectGroup(outputGroup, \"clusters\");\n var edgePathsGroup = createOrSelectGroup(outputGroup, \"edgePaths\");\n var edgeLabels = createEdgeLabels(createOrSelectGroup(outputGroup, \"edgeLabels\"), g);\n var nodes = createNodes(createOrSelectGroup(outputGroup, \"nodes\"), g, shapes);\n\n layout(g);\n\n positionNodes(nodes, g);\n positionEdgeLabels(edgeLabels, g);\n createEdgePaths(edgePathsGroup, g, arrows);\n\n var clusters = createClusters(clustersGroup, g);\n positionClusters(clusters, g);\n\n postProcessGraph(g);\n };\n\n fn.createNodes = function(value) {\n if (!arguments.length) return createNodes;\n createNodes = value;\n return fn;\n };\n\n fn.createClusters = function(value) {\n if (!arguments.length) return createClusters;\n createClusters = value;\n return fn;\n };\n\n fn.createEdgeLabels = function(value) {\n if (!arguments.length) return createEdgeLabels;\n createEdgeLabels = value;\n return fn;\n };\n\n fn.createEdgePaths = function(value) {\n if (!arguments.length) return createEdgePaths;\n createEdgePaths = value;\n return fn;\n };\n\n fn.shapes = function(value) {\n if (!arguments.length) return shapes;\n shapes = value;\n return fn;\n };\n\n fn.arrows = function(value) {\n if (!arguments.length) return arrows;\n arrows = value;\n return fn;\n };\n\n return fn;\n}\n\nvar NODE_DEFAULT_ATTRS = {\n paddingLeft: 10,\n paddingRight: 10,\n paddingTop: 10,\n paddingBottom: 10,\n rx: 0,\n ry: 0,\n shape: \"rect\"\n};\n\nvar EDGE_DEFAULT_ATTRS = {\n arrowhead: \"normal\",\n curve: d3.curveLinear\n};\n\nfunction preProcessGraph(g) {\n g.nodes().forEach(function(v) {\n var node = g.node(v);\n if (!_.has(node, \"label\") && !g.children(v).length) { node.label = v; }\n\n if (_.has(node, \"paddingX\")) {\n _.defaults(node, {\n paddingLeft: node.paddingX,\n paddingRight: node.paddingX\n });\n }\n\n if (_.has(node, \"paddingY\")) {\n _.defaults(node, {\n paddingTop: node.paddingY,\n paddingBottom: node.paddingY\n });\n }\n\n if (_.has(node, \"padding\")) {\n _.defaults(node, {\n paddingLeft: node.padding,\n paddingRight: node.padding,\n paddingTop: node.padding,\n paddingBottom: node.padding\n });\n }\n\n _.defaults(node, NODE_DEFAULT_ATTRS);\n\n _.each([\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\"], function(k) {\n node[k] = Number(node[k]);\n });\n\n // Save dimensions for restore during post-processing\n if (_.has(node, \"width\")) { node._prevWidth = node.width; }\n if (_.has(node, \"height\")) { node._prevHeight = node.height; }\n });\n\n g.edges().forEach(function(e) {\n var edge = g.edge(e);\n if (!_.has(edge, \"label\")) { edge.label = \"\"; }\n _.defaults(edge, EDGE_DEFAULT_ATTRS);\n });\n}\n\nfunction postProcessGraph(g) {\n _.each(g.nodes(), function(v) {\n var node = g.node(v);\n\n // Restore original dimensions\n if (_.has(node, \"_prevWidth\")) {\n node.width = node._prevWidth;\n } else {\n delete node.width;\n }\n\n if (_.has(node, \"_prevHeight\")) {\n node.height = node._prevHeight;\n } else {\n delete node.height;\n }\n\n delete node._prevWidth;\n delete node._prevHeight;\n });\n}\n\nfunction createOrSelectGroup(root, name) {\n var selection = root.select(\"g.\" + name);\n if (selection.empty()) {\n selection = root.append(\"g\").attr(\"class\", name);\n }\n return selection;\n}\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar addLabel = require(\"./label/add-label\");\nvar util = require(\"./util\");\nvar d3 = require(\"./d3\");\n\nmodule.exports = createNodes;\n\nfunction createNodes(selection, g, shapes) {\n var simpleNodes = g.nodes().filter(function(v) { return !util.isSubgraph(g, v); });\n var svgNodes = selection.selectAll(\"g.node\")\n .data(simpleNodes, function(v) { return v; })\n .classed(\"update\", true);\n\n svgNodes.exit().remove();\n\n svgNodes.enter().append(\"g\")\n .attr(\"class\", \"node\")\n .style(\"opacity\", 0);\n\n svgNodes = selection.selectAll(\"g.node\"); \n\n svgNodes.each(function(v) {\n var node = g.node(v);\n var thisGroup = d3.select(this);\n util.applyClass(thisGroup, node[\"class\"],\n (thisGroup.classed(\"update\") ? \"update \" : \"\") + \"node\");\n\n thisGroup.select(\"g.label\").remove();\n var labelGroup = thisGroup.append(\"g\").attr(\"class\", \"label\");\n var labelDom = addLabel(labelGroup, node);\n var shape = shapes[node.shape];\n var bbox = _.pick(labelDom.node().getBBox(), \"width\", \"height\");\n\n node.elem = this;\n\n if (node.id) { thisGroup.attr(\"id\", node.id); }\n if (node.labelId) { labelGroup.attr(\"id\", node.labelId); }\n\n if (_.has(node, \"width\")) { bbox.width = node.width; }\n if (_.has(node, \"height\")) { bbox.height = node.height; }\n\n bbox.width += node.paddingLeft + node.paddingRight;\n bbox.height += node.paddingTop + node.paddingBottom;\n labelGroup.attr(\"transform\", \"translate(\" +\n ((node.paddingLeft - node.paddingRight) / 2) + \",\" +\n ((node.paddingTop - node.paddingBottom) / 2) + \")\");\n\n var root = d3.select(this);\n root.select(\".label-container\").remove();\n var shapeSvg = shape(root, bbox, node).classed(\"label-container\", true);\n util.applyStyle(shapeSvg, node.style);\n\n var shapeBBox = shapeSvg.node().getBBox();\n node.width = shapeBBox.width;\n node.height = shapeBBox.height;\n });\n\n var exitSelection;\n\n if (svgNodes.exit) {\n exitSelection = svgNodes.exit();\n } else {\n exitSelection = svgNodes.selectAll(null); // empty selection\n }\n\n util.applyTransition(exitSelection, g)\n .style(\"opacity\", 0)\n .remove();\n\n return svgNodes;\n}\n","var util = require(\"../util\");\n\nmodule.exports = addTextLabel;\n\n/*\n * Attaches a text label to the specified root. Handles escape sequences.\n */\nfunction addTextLabel(root, node) {\n var domNode = root.append(\"text\");\n\n var lines = processEscapeSequences(node.label).split(\"\\n\");\n for (var i = 0; i < lines.length; i++) {\n domNode.append(\"tspan\")\n .attr(\"xml:space\", \"preserve\")\n .attr(\"dy\", \"1em\")\n .attr(\"x\", \"1\")\n .text(lines[i]);\n }\n\n util.applyStyle(domNode, node.labelStyle);\n\n return domNode;\n}\n\nfunction processEscapeSequences(text) {\n var newText = \"\";\n var escaped = false;\n var ch;\n for (var i = 0; i < text.length; ++i) {\n ch = text[i];\n if (escaped) {\n switch(ch) {\n case \"n\": newText += \"\\n\"; break;\n default: newText += ch;\n }\n escaped = false;\n } else if (ch === \"\\\\\") {\n escaped = true;\n } else {\n newText += ch;\n }\n }\n return newText;\n}\n","var util = require(\"../util\");\n\nmodule.exports = addSVGLabel;\n\nfunction addSVGLabel(root, node) {\n var domNode = root;\n\n domNode.node().appendChild(node.label);\n\n util.applyStyle(domNode, node.labelStyle);\n\n return domNode;\n}\n","var util = require(\"./util\");\nvar d3 = require(\"./d3\");\nvar addLabel = require(\"./label/add-label\");\n\nmodule.exports = createClusters;\n\nfunction createClusters(selection, g) {\n var clusters = g.nodes().filter(function(v) { return util.isSubgraph(g, v); });\n var svgClusters = selection.selectAll(\"g.cluster\")\n .data(clusters, function(v) { return v; });\n\n svgClusters.selectAll(\"*\").remove();\n svgClusters.enter().append(\"g\")\n .attr(\"class\", \"cluster\")\n .attr(\"id\",function(v){\n var node = g.node(v);\n return node.id;\n })\n .style(\"opacity\", 0);\n \n svgClusters = selection.selectAll(\"g.cluster\");\n\n util.applyTransition(svgClusters, g)\n .style(\"opacity\", 1);\n\n svgClusters.each(function(v) {\n var node = g.node(v);\n var thisGroup = d3.select(this);\n d3.select(this).append(\"rect\");\n var labelGroup = thisGroup.append(\"g\").attr(\"class\", \"label\");\n addLabel(labelGroup, node, node.clusterLabelPos);\n });\n\n svgClusters.selectAll(\"rect\").each(function(c) {\n var node = g.node(c);\n var domCluster = d3.select(this);\n util.applyStyle(domCluster, node.style);\n });\n\n var exitSelection;\n\n if (svgClusters.exit) {\n exitSelection = svgClusters.exit();\n } else {\n exitSelection = svgClusters.selectAll(null); // empty selection\n }\n\n util.applyTransition(exitSelection, g)\n .style(\"opacity\", 0)\n .remove();\n\n return svgClusters;\n}\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar addLabel = require(\"./label/add-label\");\nvar util = require(\"./util\");\nvar d3 = require(\"./d3\");\n\nmodule.exports = createEdgeLabels;\n\nfunction createEdgeLabels(selection, g) {\n var svgEdgeLabels = selection.selectAll(\"g.edgeLabel\")\n .data(g.edges(), function(e) { return util.edgeToId(e); })\n .classed(\"update\", true);\n\n svgEdgeLabels.exit().remove();\n svgEdgeLabels.enter().append(\"g\")\n .classed(\"edgeLabel\", true)\n .style(\"opacity\", 0);\n\n svgEdgeLabels = selection.selectAll(\"g.edgeLabel\");\n\n svgEdgeLabels.each(function(e) {\n var root = d3.select(this);\n root.select(\".label\").remove();\n var edge = g.edge(e);\n var label = addLabel(root, g.edge(e), 0, 0).classed(\"label\", true);\n var bbox = label.node().getBBox();\n\n if (edge.labelId) { label.attr(\"id\", edge.labelId); }\n if (!_.has(edge, \"width\")) { edge.width = bbox.width; }\n if (!_.has(edge, \"height\")) { edge.height = bbox.height; }\n });\n\n var exitSelection;\n\n if (svgEdgeLabels.exit) {\n exitSelection = svgEdgeLabels.exit();\n } else {\n exitSelection = svgEdgeLabels.selectAll(null); // empty selection\n }\n\n util.applyTransition(exitSelection, g)\n .style(\"opacity\", 0)\n .remove();\n\n return svgEdgeLabels;\n}\n","\"use strict\";\n\nvar _ = require(\"./lodash\");\nvar intersectNode = require(\"./intersect/intersect-node\");\nvar util = require(\"./util\");\nvar d3 = require(\"./d3\");\nmodule.exports = createEdgePaths;\n\nfunction createEdgePaths(selection, g, arrows) {\n var previousPaths = selection.selectAll(\"g.edgePath\")\n .data(g.edges(), function(e) { return util.edgeToId(e); })\n .classed(\"update\", true);\n\n var newPaths = enter(previousPaths, g);\n exit(previousPaths, g);\n\n var svgPaths = previousPaths.merge !== undefined ? previousPaths.merge(newPaths) : previousPaths;\n util.applyTransition(svgPaths, g)\n .style(\"opacity\", 1);\n\n // Save DOM element in the path group, and set ID and class\n svgPaths.each(function(e) {\n var domEdge = d3.select(this);\n var edge = g.edge(e);\n edge.elem = this;\n\n if (edge.id) {\n domEdge.attr(\"id\", edge.id);\n }\n\n util.applyClass(domEdge, edge[\"class\"],\n (domEdge.classed(\"update\") ? \"update \" : \"\") + \"edgePath\");\n });\n\n svgPaths.selectAll(\"path.path\")\n .each(function(e) {\n var edge = g.edge(e);\n edge.arrowheadId = _.uniqueId(\"arrowhead\");\n\n var domEdge = d3.select(this)\n .attr(\"marker-end\", function() {\n return \"url(\" + makeFragmentRef(location.href, edge.arrowheadId) + \")\";\n })\n .style(\"fill\", \"none\");\n\n util.applyTransition(domEdge, g)\n .attr(\"d\", function(e) { return calcPoints(g, e); });\n\n util.applyStyle(domEdge, edge.style);\n });\n\n svgPaths.selectAll(\"defs *\").remove();\n svgPaths.selectAll(\"defs\")\n .each(function(e) {\n var edge = g.edge(e);\n var arrowhead = arrows[edge.arrowhead];\n arrowhead(d3.select(this), edge.arrowheadId, edge, \"arrowhead\");\n });\n\n return svgPaths;\n}\n\nfunction makeFragmentRef(url, fragmentId) {\n var baseUrl = url.split(\"#\")[0];\n return baseUrl + \"#\" + fragmentId;\n}\n\nfunction calcPoints(g, e) {\n var edge = g.edge(e);\n var tail = g.node(e.v);\n var head = g.node(e.w);\n var points = edge.points.slice(1, edge.points.length - 1);\n points.unshift(intersectNode(tail, points[0]));\n points.push(intersectNode(head, points[points.length - 1]));\n\n return createLine(edge, points);\n}\n\nfunction createLine(edge, points) {\n var line = (d3.line || d3.svg.line)()\n .x(function(d) { return d.x; })\n .y(function(d) { return d.y; });\n \n (line.curve || line.interpolate)(edge.curve);\n\n return line(points);\n}\n\nfunction getCoords(elem) {\n var bbox = elem.getBBox();\n var matrix = elem.ownerSVGElement.getScreenCTM()\n .inverse()\n .multiply(elem.getScreenCTM())\n .translate(bbox.width / 2, bbox.height / 2);\n return { x: matrix.e, y: matrix.f };\n}\n\nfunction enter(svgPaths, g) {\n var svgPathsEnter = svgPaths.enter().append(\"g\")\n .attr(\"class\", \"edgePath\")\n .style(\"opacity\", 0);\n svgPathsEnter.append(\"path\")\n .attr(\"class\", \"path\")\n .attr(\"d\", function(e) {\n var edge = g.edge(e);\n var sourceElem = g.node(e.v).elem;\n var points = _.range(edge.points.length).map(function() { return getCoords(sourceElem); });\n return createLine(edge, points);\n });\n svgPathsEnter.append(\"defs\");\n return svgPathsEnter;\n}\n\nfunction exit(svgPaths, g) {\n var svgPathExit = svgPaths.exit();\n util.applyTransition(svgPathExit, g)\n .style(\"opacity\", 0)\n .remove();\n}\n","\"use strict\";\n\nvar util = require(\"./util\");\nvar d3 = require(\"./d3\");\n\nmodule.exports = positionNodes;\n\nfunction positionNodes(selection, g) {\n var created = selection.filter(function() { return !d3.select(this).classed(\"update\"); });\n\n function translate(v) {\n var node = g.node(v);\n return \"translate(\" + node.x + \",\" + node.y + \")\";\n }\n\n created.attr(\"transform\", translate);\n\n util.applyTransition(selection, g)\n .style(\"opacity\", 1)\n .attr(\"transform\", translate);\n}\n","\"use strict\";\n\nvar util = require(\"./util\");\nvar d3 = require(\"./d3\");\nvar _ = require(\"./lodash\");\n\nmodule.exports = positionEdgeLabels;\n\nfunction positionEdgeLabels(selection, g) {\n var created = selection.filter(function() { return !d3.select(this).classed(\"update\"); });\n\n function translate(e) {\n var edge = g.edge(e);\n return _.has(edge, \"x\") ? \"translate(\" + edge.x + \",\" + edge.y + \")\" : \"\";\n }\n\n created.attr(\"transform\", translate);\n\n util.applyTransition(selection, g)\n .style(\"opacity\", 1)\n .attr(\"transform\", translate);\n}\n","\"use strict\";\n\nvar util = require(\"./util\");\nvar d3 = require(\"./d3\");\n\nmodule.exports = positionClusters;\n\nfunction positionClusters(selection, g) {\n var created = selection.filter(function() { return !d3.select(this).classed(\"update\"); });\n\n function translate(v) {\n var node = g.node(v);\n return \"translate(\" + node.x + \",\" + node.y + \")\";\n }\n\n created.attr(\"transform\", translate);\n\n util.applyTransition(selection, g)\n .style(\"opacity\", 1)\n .attr(\"transform\", translate);\n\n util.applyTransition(created.selectAll(\"rect\"), g)\n .attr(\"width\", function(v) { return g.node(v).width; })\n .attr(\"height\", function(v) { return g.node(v).height; })\n .attr(\"x\", function(v) {\n var node = g.node(v);\n return -node.width / 2;\n })\n .attr(\"y\", function(v) {\n var node = g.node(v);\n return -node.height / 2;\n });\n}\n","\"use strict\";\n\nvar intersectRect = require(\"./intersect/intersect-rect\");\nvar intersectEllipse = require(\"./intersect/intersect-ellipse\");\nvar intersectCircle = require(\"./intersect/intersect-circle\");\nvar intersectPolygon = require(\"./intersect/intersect-polygon\");\n\nmodule.exports = {\n rect: rect,\n ellipse: ellipse,\n circle: circle,\n diamond: diamond\n};\n\nfunction rect(parent, bbox, node) {\n var shapeSvg = parent.insert(\"rect\", \":first-child\")\n .attr(\"rx\", node.rx)\n .attr(\"ry\", node.ry)\n .attr(\"x\", -bbox.width / 2)\n .attr(\"y\", -bbox.height / 2)\n .attr(\"width\", bbox.width)\n .attr(\"height\", bbox.height);\n\n node.intersect = function(point) {\n return intersectRect(node, point);\n };\n\n return shapeSvg;\n}\n\nfunction ellipse(parent, bbox, node) {\n var rx = bbox.width / 2;\n var ry = bbox.height / 2;\n var shapeSvg = parent.insert(\"ellipse\", \":first-child\")\n .attr(\"x\", -bbox.width / 2)\n .attr(\"y\", -bbox.height / 2)\n .attr(\"rx\", rx)\n .attr(\"ry\", ry);\n\n node.intersect = function(point) {\n return intersectEllipse(node, rx, ry, point);\n };\n\n return shapeSvg;\n}\n\nfunction circle(parent, bbox, node) {\n var r = Math.max(bbox.width, bbox.height) / 2;\n var shapeSvg = parent.insert(\"circle\", \":first-child\")\n .attr(\"x\", -bbox.width / 2)\n .attr(\"y\", -bbox.height / 2)\n .attr(\"r\", r);\n\n node.intersect = function(point) {\n return intersectCircle(node, r, point);\n };\n\n return shapeSvg;\n}\n\n// Circumscribe an ellipse for the bounding box with a diamond shape. I derived\n// the function to calculate the diamond shape from:\n// http://mathforum.org/kb/message.jspa?messageID=3750236\nfunction diamond(parent, bbox, node) {\n var w = (bbox.width * Math.SQRT2) / 2;\n var h = (bbox.height * Math.SQRT2) / 2;\n var points = [\n { x: 0, y: -h },\n { x: -w, y: 0 },\n { x: 0, y: h },\n { x: w, y: 0 }\n ];\n var shapeSvg = parent.insert(\"polygon\", \":first-child\")\n .attr(\"points\", points.map(function(p) { return p.x + \",\" + p.y; }).join(\" \"));\n\n node.intersect = function(p) {\n return intersectPolygon(node, points, p);\n };\n\n return shapeSvg;\n}\n","var util = require(\"./util\");\n\nmodule.exports = {\n \"default\": normal,\n \"normal\": normal,\n \"vee\": vee,\n \"undirected\": undirected\n};\n\nfunction normal(parent, id, edge, type) {\n var marker = parent.append(\"marker\")\n .attr(\"id\", id)\n .attr(\"viewBox\", \"0 0 10 10\")\n .attr(\"refX\", 9)\n .attr(\"refY\", 5)\n .attr(\"markerUnits\", \"strokeWidth\")\n .attr(\"markerWidth\", 8)\n .attr(\"markerHeight\", 6)\n .attr(\"orient\", \"auto\");\n\n var path = marker.append(\"path\")\n .attr(\"d\", \"M 0 0 L 10 5 L 0 10 z\")\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"1,0\");\n util.applyStyle(path, edge[type + \"Style\"]);\n if (edge[type + \"Class\"]) {\n path.attr(\"class\", edge[type + \"Class\"]);\n }\n}\n\nfunction vee(parent, id, edge, type) {\n var marker = parent.append(\"marker\")\n .attr(\"id\", id)\n .attr(\"viewBox\", \"0 0 10 10\")\n .attr(\"refX\", 9)\n .attr(\"refY\", 5)\n .attr(\"markerUnits\", \"strokeWidth\")\n .attr(\"markerWidth\", 8)\n .attr(\"markerHeight\", 6)\n .attr(\"orient\", \"auto\");\n\n var path = marker.append(\"path\")\n .attr(\"d\", \"M 0 0 L 10 5 L 0 10 L 4 5 z\")\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"1,0\");\n util.applyStyle(path, edge[type + \"Style\"]);\n if (edge[type + \"Class\"]) {\n path.attr(\"class\", edge[type + \"Class\"]);\n }\n}\n\nfunction undirected(parent, id, edge, type) {\n var marker = parent.append(\"marker\")\n .attr(\"id\", id)\n .attr(\"viewBox\", \"0 0 10 10\")\n .attr(\"refX\", 9)\n .attr(\"refY\", 5)\n .attr(\"markerUnits\", \"strokeWidth\")\n .attr(\"markerWidth\", 8)\n .attr(\"markerHeight\", 6)\n .attr(\"orient\", \"auto\");\n\n var path = marker.append(\"path\")\n .attr(\"d\", \"M 0 5 L 10 5\")\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"1,0\");\n util.applyStyle(path, edge[type + \"Style\"]);\n if (edge[type + \"Class\"]) {\n path.attr(\"class\", edge[type + \"Class\"]);\n }\n}\n","module.exports = \"0.6.4\";\n","/**\n * @see https://github.com/vuejs/vue/commit/a855dd0564a657a73b7249469490d39817f27cf7#diff-c0a2623ea5896a83e3b630f236b47b52\n * @see https://stackoverflow.com/a/13091266/4936667\n */\n\nvar decoder;\n\nexport default function decode(html) {\n decoder = decoder || document.createElement('div');\n // Escape HTML before decoding for HTML Entities\n html = escape(html).replace(/%26/g,'&').replace(/%23/g,'#').replace(/%3B/g,';');\n // decoding\n decoder.innerHTML = html;\n\n return unescape(decoder.textContent);\n}\n","import moment from 'moment-mini';\n\nexport const LEVELS = {\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5\n};\n\nexport const log = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n fatal: () => {}\n};\n\nexport const setLogLevel = function(level = 'fatal') {\n if (isNaN(level)) {\n level = level.toLowerCase();\n if (LEVELS[level] !== undefined) {\n level = LEVELS[level];\n }\n }\n log.trace = () => {};\n log.debug = () => {};\n log.info = () => {};\n log.warn = () => {};\n log.error = () => {};\n log.fatal = () => {};\n if (level <= LEVELS.fatal) {\n log.fatal = console.error\n ? console.error.bind(console, format('FATAL'), 'color: orange')\n : console.log.bind(console, '\\x1b[35m', format('FATAL'));\n }\n if (level <= LEVELS.error) {\n log.error = console.error\n ? console.error.bind(console, format('ERROR'), 'color: orange')\n : console.log.bind(console, '\\x1b[31m', format('ERROR'));\n }\n if (level <= LEVELS.warn) {\n log.warn = console.warn\n ? console.warn.bind(console, format('WARN'), 'color: orange')\n : console.log.bind(console, `\\x1b[33m`, format('WARN'));\n }\n if (level <= LEVELS.info) {\n log.info = console.info // ? console.info.bind(console, '\\x1b[34m', format('INFO'), 'color: blue')\n ? console.info.bind(console, format('INFO'), 'color: lightblue')\n : console.log.bind(console, '\\x1b[34m', format('INFO'));\n }\n if (level <= LEVELS.debug) {\n log.debug = console.debug\n ? console.debug.bind(console, format('DEBUG'), 'color: lightgreen')\n : console.log.bind(console, '\\x1b[32m', format('DEBUG'));\n }\n};\n\nconst format = level => {\n const time = moment().format('ss.SSS');\n return `%c${time} : ${level} : `;\n};\n","export const getRows = s => {\n if (!s) return 1;\n let str = breakToPlaceholder(s);\n str = str.replace(/\\\\n/g, '#br#');\n return str.split('#br#');\n};\n\nexport const removeScript = txt => {\n var rs = '';\n var idx = 0;\n\n while (idx >= 0) {\n idx = txt.indexOf('= 0) {\n rs += txt.substr(0, idx);\n txt = txt.substr(idx + 1);\n\n idx = txt.indexOf('');\n if (idx >= 0) {\n idx += 9;\n txt = txt.substr(idx);\n }\n } else {\n rs += txt;\n idx = -1;\n break;\n }\n }\n return rs;\n};\n\nexport const sanitizeText = (text, config) => {\n let txt = text;\n let htmlLabels = true;\n if (\n config.flowchart &&\n (config.flowchart.htmlLabels === false || config.flowchart.htmlLabels === 'false')\n ) {\n htmlLabels = false;\n }\n\n if (htmlLabels) {\n const level = config.securityLevel;\n\n if (level === 'antiscript') {\n txt = removeScript(txt);\n } else if (level !== 'loose') {\n // eslint-disable-line\n txt = breakToPlaceholder(txt);\n txt = txt.replace(//g, '>');\n txt = txt.replace(/=/g, '=');\n txt = placeholderToBreak(txt);\n }\n }\n\n return txt;\n};\n\nexport const lineBreakRegex = //gi;\n\nexport const hasBreaks = text => {\n return //gi.test(text);\n};\n\nexport const splitBreaks = text => {\n return text.split(//gi);\n};\n\nconst breakToPlaceholder = s => {\n return s.replace(lineBreakRegex, '#br#');\n};\n\nconst placeholderToBreak = s => {\n return s.replace(/#br#/g, '
        ');\n};\n\nexport default {\n getRows,\n sanitizeText,\n hasBreaks,\n splitBreaks,\n lineBreakRegex,\n removeScript\n};\n","import { sanitizeUrl } from '@braintree/sanitize-url';\nimport {\n curveBasis,\n curveBasisClosed,\n curveBasisOpen,\n curveLinear,\n curveLinearClosed,\n curveMonotoneX,\n curveMonotoneY,\n curveNatural,\n curveStep,\n curveStepAfter,\n curveStepBefore,\n select\n} from 'd3';\nimport common from './diagrams/common/common';\nimport { log } from './logger';\n// import cryptoRandomString from 'crypto-random-string';\n\n// Effectively an enum of the supported curve types, accessible by name\nconst d3CurveTypes = {\n curveBasis: curveBasis,\n curveBasisClosed: curveBasisClosed,\n curveBasisOpen: curveBasisOpen,\n curveLinear: curveLinear,\n curveLinearClosed: curveLinearClosed,\n curveMonotoneX: curveMonotoneX,\n curveMonotoneY: curveMonotoneY,\n curveNatural: curveNatural,\n curveStep: curveStep,\n curveStepAfter: curveStepAfter,\n curveStepBefore: curveStepBefore\n};\nconst directive = /[%]{2}[{]\\s*(?:(?:(\\w+)\\s*:|(\\w+))\\s*(?:(?:(\\w+))|((?:(?![}][%]{2}).|\\r?\\n)*))?\\s*)(?:[}][%]{2})?/gi;\nconst directiveWithoutOpen = /\\s*(?:(?:(\\w+)(?=:):|(\\w+))\\s*(?:(?:(\\w+))|((?:(?![}][%]{2}).|\\r?\\n)*))?\\s*)(?:[}][%]{2})?/gi;\nconst anyComment = /\\s*%%.*\\n/gm;\n\n/**\n * @function detectInit\n * Detects the init config object from the text\n * ```mermaid\n * %%{init: {\"theme\": \"debug\", \"logLevel\": 1 }}%%\n * graph LR\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n * or\n * ```mermaid\n * %%{initialize: {\"theme\": \"dark\", logLevel: \"debug\" }}%%\n * graph LR\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * @param {string} text The text defining the graph\n * @returns {object} the json object representing the init passed to mermaid.initialize()\n */\nexport const detectInit = function(text) {\n let inits = detectDirective(text, /(?:init\\b)|(?:initialize\\b)/);\n let results = {};\n if (Array.isArray(inits)) {\n let args = inits.map(init => init.args);\n results = assignWithDepth(results, [...args]);\n } else {\n results = inits.args;\n }\n if (results) {\n let type = detectType(text);\n ['config'].forEach(prop => {\n if (typeof results[prop] !== 'undefined') {\n if (type === 'flowchart-v2') {\n type = 'flowchart';\n }\n results[type] = results[prop];\n delete results[prop];\n }\n });\n }\n return results;\n};\n\n/**\n * @function detectDirective\n * Detects the directive from the text. Text can be single line or multiline. If type is null or omitted\n * the first directive encountered in text will be returned\n * ```mermaid\n * graph LR\n * %%{somedirective}%%\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * @param {string} text The text defining the graph\n * @param {string|RegExp} type The directive to return (default: null)\n * @returns {object | Array} An object or Array representing the directive(s): { type: string, args: object|null } matched by the input type\n * if a single directive was found, that directive object will be returned.\n */\nexport const detectDirective = function(text, type = null) {\n try {\n const commentWithoutDirectives = new RegExp(\n `[%]{2}(?![{]${directiveWithoutOpen.source})(?=[}][%]{2}).*\\n`,\n 'ig'\n );\n text = text\n .trim()\n .replace(commentWithoutDirectives, '')\n .replace(/'/gm, '\"');\n log.debug(\n `Detecting diagram directive${type !== null ? ' type:' + type : ''} based on the text:${text}`\n );\n let match,\n result = [];\n while ((match = directive.exec(text)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (match.index === directive.lastIndex) {\n directive.lastIndex++;\n }\n if (\n (match && !type) ||\n (type && match[1] && match[1].match(type)) ||\n (type && match[2] && match[2].match(type))\n ) {\n let type = match[1] ? match[1] : match[2];\n let args = match[3] ? match[3].trim() : match[4] ? JSON.parse(match[4].trim()) : null;\n result.push({ type, args });\n }\n }\n if (result.length === 0) {\n result.push({ type: text, args: null });\n }\n\n return result.length === 1 ? result[0] : result;\n } catch (error) {\n log.error(\n `ERROR: ${error.message} - Unable to parse directive${\n type !== null ? ' type:' + type : ''\n } based on the text:${text}`\n );\n return { type: null, args: null };\n }\n};\n\n/**\n * @function detectType\n * Detects the type of the graph text. Takes into consideration the possible existence of an %%init\n * directive\n * ```mermaid\n * %%{initialize: {\"startOnLoad\": true, logLevel: \"fatal\" }}%%\n * graph LR\n * a-->b\n * b-->c\n * c-->d\n * d-->e\n * e-->f\n * f-->g\n * g-->h\n * ```\n *\n * @param {string} text The text defining the graph\n * @returns {string} A graph definition key\n */\nexport const detectType = function(text) {\n text = text.replace(directive, '').replace(anyComment, '\\n');\n log.debug('Detecting diagram type based on the text ' + text);\n if (text.match(/^\\s*sequenceDiagram/)) {\n return 'sequence';\n }\n\n if (text.match(/^\\s*gantt/)) {\n return 'gantt';\n }\n if (text.match(/^\\s*classDiagram-v2/)) {\n return 'classDiagram';\n }\n if (text.match(/^\\s*classDiagram/)) {\n return 'class';\n }\n\n if (text.match(/^\\s*stateDiagram-v2/)) {\n return 'stateDiagram';\n }\n\n if (text.match(/^\\s*stateDiagram/)) {\n return 'state';\n }\n\n if (text.match(/^\\s*gitGraph/)) {\n return 'git';\n }\n if (text.match(/^\\s*flowchart/)) {\n return 'flowchart-v2';\n }\n\n if (text.match(/^\\s*info/)) {\n return 'info';\n }\n if (text.match(/^\\s*pie/)) {\n return 'pie';\n }\n\n if (text.match(/^\\s*erDiagram/)) {\n return 'er';\n }\n\n if (text.match(/^\\s*journey/)) {\n return 'journey';\n }\n\n return 'flowchart';\n};\n\nconst memoize = (fn, resolver) => {\n let cache = {};\n return (...args) => {\n let n = resolver ? resolver.apply(this, args) : args[0];\n if (n in cache) {\n return cache[n];\n } else {\n let result = fn(...args);\n cache[n] = result;\n return result;\n }\n };\n};\n\n/**\n * @function isSubstringInArray\n * Detects whether a substring in present in a given array\n * @param {string} str The substring to detect\n * @param {array} arr The array to search\n * @returns {number} the array index containing the substring or -1 if not present\n **/\nexport const isSubstringInArray = function(str, arr) {\n for (let i = 0; i < arr.length; i++) {\n if (arr[i].match(str)) return i;\n }\n return -1;\n};\n\nexport const interpolateToCurve = (interpolate, defaultCurve) => {\n if (!interpolate) {\n return defaultCurve;\n }\n const curveName = `curve${interpolate.charAt(0).toUpperCase() + interpolate.slice(1)}`;\n return d3CurveTypes[curveName] || defaultCurve;\n};\n\nexport const formatUrl = (linkStr, config) => {\n let url = linkStr.trim();\n\n if (url) {\n if (config.securityLevel !== 'loose') {\n return sanitizeUrl(url);\n }\n\n return url;\n }\n};\n\nexport const runFunc = (functionName, ...params) => {\n const arrPaths = functionName.split('.');\n\n const len = arrPaths.length - 1;\n const fnName = arrPaths[len];\n\n let obj = window;\n for (let i = 0; i < len; i++) {\n obj = obj[arrPaths[i]];\n if (!obj) return;\n }\n\n obj[fnName](...params);\n};\n\nconst distance = (p1, p2) =>\n p1 && p2 ? Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)) : 0;\n\nconst traverseEdge = points => {\n let prevPoint;\n let totalDistance = 0;\n\n points.forEach(point => {\n totalDistance += distance(point, prevPoint);\n prevPoint = point;\n });\n\n // Traverse half of total distance along points\n let remainingDistance = totalDistance / 2;\n let center = undefined;\n prevPoint = undefined;\n points.forEach(point => {\n if (prevPoint && !center) {\n const vectorDistance = distance(point, prevPoint);\n if (vectorDistance < remainingDistance) {\n remainingDistance -= vectorDistance;\n } else {\n // The point is remainingDistance from prevPoint in the vector between prevPoint and point\n // Calculate the coordinates\n const distanceRatio = remainingDistance / vectorDistance;\n if (distanceRatio <= 0) center = prevPoint;\n if (distanceRatio >= 1) center = { x: point.x, y: point.y };\n if (distanceRatio > 0 && distanceRatio < 1) {\n center = {\n x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,\n y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y\n };\n }\n }\n }\n prevPoint = point;\n });\n return center;\n};\n\nconst calcLabelPosition = points => {\n return traverseEdge(points);\n};\n\nconst calcCardinalityPosition = (isRelationTypePresent, points, initialPosition) => {\n let prevPoint;\n let totalDistance = 0; // eslint-disable-line\n log.info('our points', points);\n if (points[0] !== initialPosition) {\n points = points.reverse();\n }\n points.forEach(point => {\n totalDistance += distance(point, prevPoint);\n prevPoint = point;\n });\n\n // Traverse only 25 total distance along points to find cardinality point\n const distanceToCardinalityPoint = 25;\n\n let remainingDistance = distanceToCardinalityPoint;\n let center;\n prevPoint = undefined;\n points.forEach(point => {\n if (prevPoint && !center) {\n const vectorDistance = distance(point, prevPoint);\n if (vectorDistance < remainingDistance) {\n remainingDistance -= vectorDistance;\n } else {\n // The point is remainingDistance from prevPoint in the vector between prevPoint and point\n // Calculate the coordinates\n const distanceRatio = remainingDistance / vectorDistance;\n if (distanceRatio <= 0) center = prevPoint;\n if (distanceRatio >= 1) center = { x: point.x, y: point.y };\n if (distanceRatio > 0 && distanceRatio < 1) {\n center = {\n x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,\n y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y\n };\n }\n }\n }\n prevPoint = point;\n });\n // if relation is present (Arrows will be added), change cardinality point off-set distance (d)\n let d = isRelationTypePresent ? 10 : 5;\n //Calculate Angle for x and y axis\n let angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);\n let cardinalityPosition = { x: 0, y: 0 };\n //Calculation cardinality position using angle, center point on the line/curve but pendicular and with offset-distance\n cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;\n cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;\n return cardinalityPosition;\n};\n\n/**\n * position ['start_left', 'start_right', 'end_left', 'end_right']\n */\nconst calcTerminalLabelPosition = (terminalMarkerSize, position, _points) => {\n // Todo looking to faster cloning method\n let points = JSON.parse(JSON.stringify(_points));\n let prevPoint;\n let totalDistance = 0; // eslint-disable-line\n log.info('our points', points);\n if (position !== 'start_left' && position !== 'start_right') {\n points = points.reverse();\n }\n\n points.forEach(point => {\n totalDistance += distance(point, prevPoint);\n prevPoint = point;\n });\n\n // Traverse only 25 total distance along points to find cardinality point\n const distanceToCardinalityPoint = 25;\n\n let remainingDistance = distanceToCardinalityPoint;\n let center;\n prevPoint = undefined;\n points.forEach(point => {\n if (prevPoint && !center) {\n const vectorDistance = distance(point, prevPoint);\n if (vectorDistance < remainingDistance) {\n remainingDistance -= vectorDistance;\n } else {\n // The point is remainingDistance from prevPoint in the vector between prevPoint and point\n // Calculate the coordinates\n const distanceRatio = remainingDistance / vectorDistance;\n if (distanceRatio <= 0) center = prevPoint;\n if (distanceRatio >= 1) center = { x: point.x, y: point.y };\n if (distanceRatio > 0 && distanceRatio < 1) {\n center = {\n x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,\n y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y\n };\n }\n }\n }\n prevPoint = point;\n });\n // if relation is present (Arrows will be added), change cardinality point off-set distance (d)\n let d = 10;\n //Calculate Angle for x and y axis\n let angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);\n\n let cardinalityPosition = { x: 0, y: 0 };\n\n //Calculation cardinality position using angle, center point on the line/curve but pendicular and with offset-distance\n\n cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;\n cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;\n if (position === 'start_left') {\n cardinalityPosition.x = Math.sin(angle + Math.PI) * d + (points[0].x + center.x) / 2;\n cardinalityPosition.y = -Math.cos(angle + Math.PI) * d + (points[0].y + center.y) / 2;\n }\n if (position === 'end_right') {\n cardinalityPosition.x = Math.sin(angle - Math.PI) * d + (points[0].x + center.x) / 2 - 5;\n cardinalityPosition.y = -Math.cos(angle - Math.PI) * d + (points[0].y + center.y) / 2 - 5;\n }\n if (position === 'end_left') {\n cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2 - 5;\n cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2 - 5;\n }\n return cardinalityPosition;\n};\n\nexport const getStylesFromArray = arr => {\n let style = '';\n let labelStyle = '';\n\n for (let i = 0; i < arr.length; i++) {\n if (typeof arr[i] !== 'undefined') {\n // add text properties to label style definition\n if (arr[i].startsWith('color:') || arr[i].startsWith('text-align:')) {\n labelStyle = labelStyle + arr[i] + ';';\n } else {\n style = style + arr[i] + ';';\n }\n }\n }\n\n return { style: style, labelStyle: labelStyle };\n};\n\nlet cnt = 0;\nexport const generateId = () => {\n cnt++;\n return (\n 'id-' +\n Math.random()\n .toString(36)\n .substr(2, 12) +\n '-' +\n cnt\n );\n};\n\nfunction makeid(length) {\n var result = '';\n var characters = '0123456789abcdef';\n var charactersLength = characters.length;\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\nexport const random = options => {\n return makeid(options.length);\n};\n\n/**\n * @function assignWithDepth\n * Extends the functionality of {@link ObjectConstructor.assign} with the ability to merge arbitrary-depth objects\n * For each key in src with path `k` (recursively) performs an Object.assign(dst[`k`], src[`k`]) with\n * a slight change from the typical handling of undefined for dst[`k`]: instead of raising an error,\n * dst[`k`] is auto-initialized to {} and effectively merged with src[`k`]\n *

        \n * Additionally, dissimilar types will not clobber unless the config.clobber parameter === true. Example:\n * ```\n * let config_0 = { foo: { bar: 'bar' }, bar: 'foo' };\n * let config_1 = { foo: 'foo', bar: 'bar' };\n * let result = assignWithDepth(config_0, config_1);\n * console.log(result);\n * //-> result: { foo: { bar: 'bar' }, bar: 'bar' }\n * ```\n *

        \n * Traditional Object.assign would have clobbered foo in config_0 with foo in config_1.\n *

        \n * If src is a destructured array of objects and dst is not an array, assignWithDepth will apply each element of src to dst\n * in order.\n * @param dst:any - the destination of the merge\n * @param src:any - the source object(s) to merge into destination\n * @param config:{ depth: number, clobber: boolean } - depth: depth to traverse within src and dst for merging -\n * clobber: should dissimilar types clobber (default: { depth: 2, clobber: false })\n * @returns {*}\n */\nexport const assignWithDepth = function(dst, src, config) {\n const { depth, clobber } = Object.assign({ depth: 2, clobber: false }, config);\n if (Array.isArray(src) && !Array.isArray(dst)) {\n src.forEach(s => assignWithDepth(dst, s, config));\n return dst;\n } else if (Array.isArray(src) && Array.isArray(dst)) {\n src.forEach(s => {\n if (dst.indexOf(s) === -1) {\n dst.push(s);\n }\n });\n return dst;\n }\n if (typeof dst === 'undefined' || depth <= 0) {\n if (dst !== undefined && dst !== null && typeof dst === 'object' && typeof src === 'object') {\n return Object.assign(dst, src);\n } else {\n return src;\n }\n }\n if (typeof src !== 'undefined' && typeof dst === 'object' && typeof src === 'object') {\n Object.keys(src).forEach(key => {\n if (\n typeof src[key] === 'object' &&\n (dst[key] === undefined || typeof dst[key] === 'object')\n ) {\n if (dst[key] === undefined) {\n dst[key] = Array.isArray(src[key]) ? [] : {};\n }\n dst[key] = assignWithDepth(dst[key], src[key], { depth: depth - 1, clobber });\n } else if (clobber || (typeof dst[key] !== 'object' && typeof src[key] !== 'object')) {\n dst[key] = src[key];\n }\n });\n }\n return dst;\n};\n\nexport const getTextObj = function() {\n return {\n x: 0,\n y: 0,\n fill: undefined,\n anchor: 'start',\n style: '#666',\n width: 100,\n height: 100,\n textMargin: 0,\n rx: 0,\n ry: 0,\n valign: undefined\n };\n};\n\nexport const drawSimpleText = function(elem, textData) {\n // Remove and ignore br:s\n const nText = textData.text.replace(common.lineBreakRegex, ' ');\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.style('text-anchor', textData.anchor);\n textElem.style('font-family', textData.fontFamily);\n textElem.style('font-size', textData.fontSize);\n textElem.style('font-weight', textData.fontWeight);\n textElem.attr('fill', textData.fill);\n if (typeof textData.class !== 'undefined') {\n textElem.attr('class', textData.class);\n }\n\n const span = textElem.append('tspan');\n span.attr('x', textData.x + textData.textMargin * 2);\n span.attr('fill', textData.fill);\n span.text(nText);\n\n return textElem;\n};\n\nexport const wrapLabel = memoize(\n (label, maxWidth, config) => {\n if (!label) {\n return label;\n }\n config = Object.assign(\n { fontSize: 12, fontWeight: 400, fontFamily: 'Arial', joinWith: '
        ' },\n config\n );\n if (common.lineBreakRegex.test(label)) {\n return label;\n }\n const words = label.split(' ');\n const completedLines = [];\n let nextLine = '';\n words.forEach((word, index) => {\n const wordLength = calculateTextWidth(`${word} `, config);\n const nextLineLength = calculateTextWidth(nextLine, config);\n if (wordLength > maxWidth) {\n const { hyphenatedStrings, remainingWord } = breakString(word, maxWidth, '-', config);\n completedLines.push(nextLine, ...hyphenatedStrings);\n nextLine = remainingWord;\n } else if (nextLineLength + wordLength >= maxWidth) {\n completedLines.push(nextLine);\n nextLine = word;\n } else {\n nextLine = [nextLine, word].filter(Boolean).join(' ');\n }\n const currentWord = index + 1;\n const isLastWord = currentWord === words.length;\n if (isLastWord) {\n completedLines.push(nextLine);\n }\n });\n return completedLines.filter(line => line !== '').join(config.joinWith);\n },\n (label, maxWidth, config) =>\n `${label}-${maxWidth}-${config.fontSize}-${config.fontWeight}-${config.fontFamily}-${config.joinWith}`\n);\n\nconst breakString = memoize(\n (word, maxWidth, hyphenCharacter = '-', config) => {\n config = Object.assign(\n { fontSize: 12, fontWeight: 400, fontFamily: 'Arial', margin: 0 },\n config\n );\n const characters = word.split('');\n const lines = [];\n let currentLine = '';\n characters.forEach((character, index) => {\n const nextLine = `${currentLine}${character}`;\n const lineWidth = calculateTextWidth(nextLine, config);\n if (lineWidth >= maxWidth) {\n const currentCharacter = index + 1;\n const isLastLine = characters.length === currentCharacter;\n const hyphenatedNextLine = `${nextLine}${hyphenCharacter}`;\n lines.push(isLastLine ? nextLine : hyphenatedNextLine);\n currentLine = '';\n } else {\n currentLine = nextLine;\n }\n });\n return { hyphenatedStrings: lines, remainingWord: currentLine };\n },\n (word, maxWidth, hyphenCharacter = '-', config) =>\n `${word}-${maxWidth}-${hyphenCharacter}-${config.fontSize}-${config.fontWeight}-${config.fontFamily}`\n);\n\n/**\n * This calculates the text's height, taking into account the wrap breaks and\n * both the statically configured height, width, and the length of the text (in pixels).\n *\n * If the wrapped text text has greater height, we extend the height, so it's\n * value won't overflow.\n *\n * @return - The height for the given text\n * @param text the text to measure\n * @param config - the config for fontSize, fontFamily, and fontWeight all impacting the resulting size\n */\nexport const calculateTextHeight = function(text, config) {\n config = Object.assign(\n { fontSize: 12, fontWeight: 400, fontFamily: 'Arial', margin: 15 },\n config\n );\n return calculateTextDimensions(text, config).height;\n};\n\n/**\n * This calculates the width of the given text, font size and family.\n *\n * @return - The width for the given text\n * @param text - The text to calculate the width of\n * @param config - the config for fontSize, fontFamily, and fontWeight all impacting the resulting size\n */\nexport const calculateTextWidth = function(text, config) {\n config = Object.assign({ fontSize: 12, fontWeight: 400, fontFamily: 'Arial' }, config);\n return calculateTextDimensions(text, config).width;\n};\n\n/**\n * This calculates the dimensions of the given text, font size, font family, font weight, and margins.\n *\n * @return - The width for the given text\n * @param text - The text to calculate the width of\n * @param config - the config for fontSize, fontFamily, fontWeight, and margin all impacting the resulting size\n */\nexport const calculateTextDimensions = memoize(\n function(text, config) {\n config = Object.assign({ fontSize: 12, fontWeight: 400, fontFamily: 'Arial' }, config);\n const { fontSize, fontFamily, fontWeight } = config;\n if (!text) {\n return { width: 0, height: 0 };\n }\n\n // We can't really know if the user supplied font family will render on the user agent;\n // thus, we'll take the max width between the user supplied font family, and a default\n // of sans-serif.\n const fontFamilies = ['sans-serif', fontFamily];\n const lines = text.split(common.lineBreakRegex);\n let dims = [];\n\n const body = select('body');\n // We don't want to leak DOM elements - if a removal operation isn't available\n // for any reason, do not continue.\n if (!body.remove) {\n return { width: 0, height: 0, lineHeight: 0 };\n }\n\n const g = body.append('svg');\n\n for (let fontFamily of fontFamilies) {\n let cheight = 0;\n let dim = { width: 0, height: 0, lineHeight: 0 };\n for (let line of lines) {\n const textObj = getTextObj();\n textObj.text = line;\n const textElem = drawSimpleText(g, textObj)\n .style('font-size', fontSize)\n .style('font-weight', fontWeight)\n .style('font-family', fontFamily);\n\n let bBox = (textElem._groups || textElem)[0][0].getBBox();\n dim.width = Math.round(Math.max(dim.width, bBox.width));\n cheight = Math.round(bBox.height);\n dim.height += cheight;\n dim.lineHeight = Math.round(Math.max(dim.lineHeight, cheight));\n }\n dims.push(dim);\n }\n\n g.remove();\n\n let index =\n isNaN(dims[1].height) ||\n isNaN(dims[1].width) ||\n isNaN(dims[1].lineHeight) ||\n (dims[0].height > dims[1].height &&\n dims[0].width > dims[1].width &&\n dims[0].lineHeight > dims[1].lineHeight)\n ? 0\n : 1;\n return dims[index];\n },\n (text, config) => `${text}-${config.fontSize}-${config.fontWeight}-${config.fontFamily}`\n);\n\nconst d3Attrs = function(d3Elem, attrs) {\n for (let attr of attrs) {\n d3Elem.attr(attr[0], attr[1]);\n }\n};\n\nexport const calculateSvgSizeAttrs = function(height, width, useMaxWidth) {\n let attrs = new Map();\n attrs.set('height', height);\n if (useMaxWidth) {\n attrs.set('width', '100%');\n attrs.set('style', `max-width: ${width}px;`);\n } else {\n attrs.set('width', width);\n }\n return attrs;\n};\n\nexport const configureSvgSize = function(svgElem, height, width, useMaxWidth) {\n const attrs = calculateSvgSizeAttrs(height, width, useMaxWidth);\n d3Attrs(svgElem, attrs);\n};\n\nexport const initIdGeneratior = function(deterministic, seed) {\n if (!deterministic) return { next: () => Date.now() };\n class iterator {\n constructor() {\n return (this.count = seed ? seed.length : 0);\n }\n next() {\n return this.count++;\n }\n }\n return new iterator();\n};\n\nexport default {\n assignWithDepth,\n wrapLabel,\n calculateTextHeight,\n calculateTextWidth,\n calculateTextDimensions,\n calculateSvgSizeAttrs,\n configureSvgSize,\n detectInit,\n detectDirective,\n detectType,\n isSubstringInArray,\n interpolateToCurve,\n calcLabelPosition,\n calcCardinalityPosition,\n calcTerminalLabelPosition,\n formatUrl,\n getStylesFromArray,\n generateId,\n random,\n memoize,\n runFunc,\n initIdGeneratior\n};\n","import { adjust } from 'khroma';\n\nexport const mkBorder = (col, darkMode) =>\n darkMode ? adjust(col, { s: -40, l: 10 }) : adjust(col, { s: -40, l: -10 });\n","import { darken, lighten, adjust, invert } from 'khroma';\nimport { mkBorder } from './theme-helpers';\nclass Theme {\n constructor() {\n /** # Base variables */\n /** * background - used to know what the background color is of the diagram. This is used for deducing colors for istance line color. Defaulr value is #f4f4f4. */\n this.background = '#f4f4f4';\n this.darkMode = false;\n\n // this.background = '#0c0c0c';\n // this.darkMode = true;\n this.primaryColor = '#fff4dd';\n // this.background = '#0c0c0c';\n // this.primaryColor = '#1f1f00';\n\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = '#333';\n\n // dark\n\n // this.primaryColor = '#034694';\n // this.primaryColor = '#f2ee7e';\n // this.primaryColor = '#9f33be';\n // this.primaryColor = '#f0fff0';\n // this.primaryColor = '#fa255e';\n // this.primaryColor = '#ECECFF';\n\n // this.secondaryColor = '#c39ea0';\n // this.tertiaryColor = '#f8e5e5';\n\n // this.secondaryColor = '#dfdfde';\n // this.tertiaryColor = '#CCCCFF';\n\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n // this.updateColors();\n }\n updateColors() {\n // The || is to make sure that if the variable has been defiend by a user override that value is to be used\n\n /* Main */\n this.primaryTextColor = this.primaryTextColor || (this.darkMode ? '#ddd' : '#333'); // invert(this.primaryColor);\n this.secondaryColor = this.secondaryColor || adjust(this.primaryColor, { h: -120 });\n this.tertiaryColor = this.tertiaryColor || adjust(this.primaryColor, { h: 180, l: 5 });\n\n this.primaryBorderColor = this.primaryBorderColor || mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor =\n this.secondaryBorderColor || mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor =\n this.tertiaryBorderColor || mkBorder(this.tertiaryColor, this.darkMode);\n this.noteBorderColor = this.noteBorderColor || mkBorder(this.noteBkgColor, this.darkMode);\n\n this.secondaryTextColor = this.secondaryTextColor || invert(this.secondaryColor);\n this.tertiaryTextColor = this.tertiaryTextColor || invert(this.tertiaryColor);\n this.lineColor = this.lineColor || invert(this.background);\n this.textColor = this.textColor || this.primaryTextColor;\n\n /* Flowchart variables */\n this.nodeBkg = this.nodeBkg || this.primaryColor;\n this.mainBkg = this.mainBkg || this.primaryColor;\n this.nodeBorder = this.nodeBorder || this.primaryBorderColor;\n this.clusterBkg = this.clusterBkg || this.tertiaryColor;\n this.clusterBorder = this.clusterBorder || this.tertiaryBorderColor;\n this.defaultLinkColor = this.defaultLinkColor || this.lineColor;\n this.titleColor = this.titleColor || this.tertiaryTextColor;\n this.edgeLabelBackground =\n this.edgeLabelBackground ||\n (this.darkMode ? darken(this.secondaryColor, 30) : this.secondaryColor);\n this.nodeTextColor = this.nodeTextColor || this.primaryTextColor;\n /* Sequence Diagram variables */\n\n // this.actorBorder = lighten(this.border1, 0.5);\n this.actorBorder = this.actorBorder || this.primaryBorderColor;\n this.actorBkg = this.actorBkg || this.mainBkg;\n this.actorTextColor = this.actorTextColor || this.primaryTextColor;\n this.actorLineColor = this.actorLineColor || 'grey';\n this.labelBoxBkgColor = this.labelBoxBkgColor || this.actorBkg;\n this.signalColor = this.signalColor || this.textColor;\n this.signalTextColor = this.signalTextColor || this.textColor;\n this.labelBoxBorderColor = this.labelBoxBorderColor || this.actorBorder;\n this.labelTextColor = this.labelTextColor || this.actorTextColor;\n this.loopTextColor = this.loopTextColor || this.actorTextColor;\n this.activationBorderColor = this.activationBorderColor || darken(this.secondaryColor, 10);\n this.activationBkgColor = this.activationBkgColor || this.secondaryColor;\n this.sequenceNumberColor = this.sequenceNumberColor || invert(this.lineColor);\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = this.sectionBkgColor || this.tertiaryColor;\n this.altSectionBkgColor = this.altSectionBkgColor || 'white';\n this.sectionBkgColor = this.sectionBkgColor || this.secondaryColor;\n this.sectionBkgColor2 = this.sectionBkgColor2 || this.primaryColor;\n this.taskBorderColor = this.taskBorderColor || this.primaryBorderColor;\n this.taskBkgColor = this.taskBkgColor || this.primaryColor;\n this.activeTaskBorderColor = this.activeTaskBorderColor || this.primaryColor;\n this.activeTaskBkgColor = this.activeTaskBkgColor || lighten(this.primaryColor, 23);\n this.gridColor = this.gridColor || 'lightgrey';\n this.doneTaskBkgColor = this.doneTaskBkgColor || 'lightgrey';\n this.doneTaskBorderColor = this.doneTaskBorderColor || 'grey';\n this.critBorderColor = this.critBorderColor || '#ff8888';\n this.critBkgColor = this.critBkgColor || 'red';\n this.todayLineColor = this.todayLineColor || 'red';\n this.taskTextColor = this.taskTextColor || this.textColor;\n this.taskTextOutsideColor = this.taskTextOutsideColor || this.textColor;\n this.taskTextLightColor = this.taskTextLightColor || this.textColor;\n this.taskTextColor = this.taskTextColor || this.primaryTextColor;\n this.taskTextDarkColor = this.taskTextDarkColor || this.textColor;\n this.taskTextClickableColor = this.taskTextClickableColor || '#003163';\n\n /* state colors */\n this.labelColor = this.labelColor || this.primaryTextColor;\n this.altBackground = this.altBackground || this.tertiaryColor;\n this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;\n this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;\n\n /* class */\n this.classText = this.classText || this.textColor;\n\n /* user-journey */\n this.fillType0 = this.fillType0 || this.primaryColor;\n this.fillType1 = this.fillType1 || this.secondaryColor;\n this.fillType2 = this.fillType2 || adjust(this.primaryColor, { h: 64 });\n this.fillType3 = this.fillType3 || adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = this.fillType4 || adjust(this.primaryColor, { h: -64 });\n this.fillType5 = this.fillType5 || adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = this.fillType6 || adjust(this.primaryColor, { h: 128 });\n this.fillType7 = this.fillType7 || adjust(this.secondaryColor, { h: 128 });\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = userOverrides => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n","import { invert, lighten, darken, rgba, adjust } from 'khroma';\nimport { mkBorder } from './theme-helpers';\nclass Theme {\n constructor() {\n this.background = '#333';\n this.primaryColor = '#1f2020';\n this.secondaryColor = lighten(this.primaryColor, 16);\n\n this.tertiaryColor = adjust(this.primaryColor, { h: -160 });\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.tertiaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n this.mainBkg = '#1f2020';\n this.secondBkg = 'calculated';\n this.mainContrastColor = 'lightgrey';\n this.darkTextColor = lighten(invert('#323D47'), 10);\n this.lineColor = 'calculated';\n this.border1 = '#81B1DB';\n this.border2 = rgba(255, 255, 255, 0.25);\n this.arrowheadColor = 'calculated';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n this.labelBackground = '#181818';\n this.textColor = '#ccc';\n /* Flowchart variables */\n\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = '#F9FFFE';\n this.edgeLabelBackground = 'calculated';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'calculated';\n this.actorLineColor = 'calculated';\n this.signalColor = 'calculated';\n this.signalTextColor = 'calculated';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = 'calculated';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = 'calculated';\n this.activationBkgColor = 'calculated';\n this.sequenceNumberColor = 'black';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = darken('#EAE8D9', 30);\n this.altSectionBkgColor = 'calculated';\n this.sectionBkgColor2 = '#EAE8D9';\n this.taskBorderColor = rgba(255, 255, 255, 70);\n this.taskBkgColor = 'calculated';\n this.taskTextColor = 'calculated';\n this.taskTextLightColor = 'calculated';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = rgba(255, 255, 255, 50);\n this.activeTaskBkgColor = '#81B1DB';\n this.gridColor = 'calculated';\n this.doneTaskBkgColor = 'calculated';\n this.doneTaskBorderColor = 'grey';\n this.critBorderColor = '#E83737';\n this.critBkgColor = '#E83737';\n this.taskTextDarkColor = 'calculated';\n this.todayLineColor = '#DB5757';\n\n /* state colors */\n this.labelColor = 'calculated';\n\n this.errorBkgColor = '#a44141';\n this.errorTextColor = '#ddd';\n }\n updateColors() {\n this.secondBkg = lighten(this.mainBkg, 16);\n this.lineColor = this.mainContrastColor;\n this.arrowheadColor = this.mainContrastColor;\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1;\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n this.edgeLabelBackground = lighten(this.labelBackground, 25);\n\n /* Sequence Diagram variables */\n\n this.actorBorder = this.border1;\n this.actorBkg = this.mainBkg;\n this.actorTextColor = this.mainContrastColor;\n this.actorLineColor = this.mainContrastColor;\n this.signalColor = this.mainContrastColor;\n this.signalTextColor = this.mainContrastColor;\n this.labelBoxBkgColor = this.actorBkg;\n this.labelBoxBorderColor = this.actorBorder;\n this.labelTextColor = this.mainContrastColor;\n this.loopTextColor = this.mainContrastColor;\n this.noteBorderColor = this.border2;\n this.noteTextColor = this.mainBkg;\n this.activationBorderColor = this.border1;\n this.activationBkgColor = this.secondBkg;\n\n /* Gantt chart variables */\n\n this.altSectionBkgColor = this.background;\n this.taskBkgColor = lighten(this.mainBkg, 23);\n this.taskTextColor = this.darkTextColor;\n this.taskTextLightColor = this.mainContrastColor;\n this.taskTextOutsideColor = this.taskTextLightColor;\n this.gridColor = this.mainContrastColor;\n this.doneTaskBkgColor = this.mainContrastColor;\n this.taskTextDarkColor = this.darkTextColor;\n\n /* state colors */\n this.labelColor = this.textColor;\n this.altBackground = lighten(this.background, 20);\n\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n /* class */\n this.classText = this.primaryTextColor;\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = userOverrides => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n","import { invert, lighten, rgba, adjust } from 'khroma';\nimport { mkBorder } from './theme-helpers';\n\nclass Theme {\n constructor() {\n /* Base variables */\n this.background = '#f4f4f4';\n this.primaryColor = '#ECECFF';\n\n this.secondaryColor = adjust(this.primaryColor, { h: 120 });\n this.secondaryColor = '#ffffde';\n this.tertiaryColor = adjust(this.primaryColor, { h: -160 });\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n // this.noteBorderColor = mkBorder(this.noteBkgColor, this.darkMode);\n\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.tertiaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n this.background = 'white';\n this.mainBkg = '#ECECFF';\n this.secondBkg = '#ffffde';\n this.lineColor = '#333333';\n this.border1 = '#9370DB';\n this.border2 = '#aaaa33';\n this.arrowheadColor = '#333333';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n this.labelBackground = '#e8e8e8';\n this.textColor = '#333';\n\n /* Flowchart variables */\n\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = 'calculated';\n this.edgeLabelBackground = 'calculated';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'black';\n this.actorLineColor = 'grey';\n this.signalColor = 'calculated';\n this.signalTextColor = 'calculated';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = 'calculated';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = '#666';\n this.activationBkgColor = '#f4f4f4';\n this.sequenceNumberColor = 'white';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = 'calculated';\n this.altSectionBkgColor = 'calculated';\n this.sectionBkgColor2 = 'calculated';\n this.taskBorderColor = 'calculated';\n this.taskBkgColor = 'calculated';\n this.taskTextLightColor = 'calculated';\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextDarkColor = 'calculated';\n this.taskTextOutsideColor = this.taskTextDarkColor;\n this.taskTextClickableColor = 'calculated';\n this.activeTaskBorderColor = 'calculated';\n this.activeTaskBkgColor = 'calculated';\n this.gridColor = 'calculated';\n this.doneTaskBkgColor = 'calculated';\n this.doneTaskBorderColor = 'calculated';\n this.critBorderColor = 'calculated';\n this.critBkgColor = 'calculated';\n this.todayLineColor = 'calculated';\n\n this.sectionBkgColor = rgba(102, 102, 255, 0.49);\n this.altSectionBkgColor = 'white';\n this.sectionBkgColor2 = '#fff400';\n this.taskBorderColor = '#534fbc';\n this.taskBkgColor = '#8a90dd';\n this.taskTextLightColor = 'white';\n this.taskTextColor = 'calculated';\n this.taskTextDarkColor = 'black';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = '#534fbc';\n this.activeTaskBkgColor = '#bfc7ff';\n this.gridColor = 'lightgrey';\n this.doneTaskBkgColor = 'lightgrey';\n this.doneTaskBorderColor = 'grey';\n this.critBorderColor = '#ff8888';\n this.critBkgColor = 'red';\n this.todayLineColor = 'red';\n\n /* state colors */\n this.labelColor = 'black';\n this.errorBkgColor = '#552222';\n this.errorTextColor = '#552222';\n this.updateColors();\n }\n updateColors() {\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1; // border 1\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n this.titleColor = this.textColor;\n this.edgeLabelBackground = this.labelBackground;\n\n /* Sequence Diagram variables */\n\n // this.actorBorder = lighten(this.border1, 0.5);\n this.actorBorder = lighten(this.border1, 23);\n this.actorBkg = this.mainBkg;\n this.labelBoxBkgColor = this.actorBkg;\n this.signalColor = this.textColor;\n this.signalTextColor = this.textColor;\n this.labelBoxBorderColor = this.actorBorder;\n this.labelTextColor = this.actorTextColor;\n this.loopTextColor = this.actorTextColor;\n this.noteBorderColor = this.border2;\n this.noteTextColor = this.actorTextColor;\n\n /* Gantt chart variables */\n\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextOutsideColor = this.taskTextDarkColor;\n\n /* state colors */\n /* class */\n this.classText = this.primaryTextColor;\n /* journey */\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = userOverrides => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n","import { darken, lighten, adjust, invert } from 'khroma';\nimport { mkBorder } from './theme-helpers';\nclass Theme {\n constructor() {\n /* Base vales */\n this.background = '#f4f4f4';\n this.primaryColor = '#cde498';\n this.secondaryColor = '#cdffb2';\n this.background = 'white';\n this.mainBkg = '#cde498';\n this.secondBkg = '#cdffb2';\n this.lineColor = 'green';\n this.border1 = '#13540c';\n this.border2 = '#6eaa49';\n this.arrowheadColor = 'green';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n\n this.tertiaryColor = lighten('#cde498', 10);\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.primaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n /* Flowchart variables */\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = '#333';\n this.edgeLabelBackground = '#e8e8e8';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'black';\n this.actorLineColor = 'grey';\n this.signalColor = '#333';\n this.signalTextColor = '#333';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = '#326932';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = '#fff5ad';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = '#666';\n this.activationBkgColor = '#f4f4f4';\n this.sequenceNumberColor = 'white';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = '#6eaa49';\n this.altSectionBkgColor = 'white';\n this.sectionBkgColor2 = '#6eaa49';\n this.taskBorderColor = 'calculated';\n this.taskBkgColor = '#487e3a';\n this.taskTextLightColor = 'white';\n this.taskTextColor = 'calculated';\n this.taskTextDarkColor = 'black';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = 'calculated';\n this.activeTaskBkgColor = 'calculated';\n this.gridColor = 'lightgrey';\n this.doneTaskBkgColor = 'lightgrey';\n this.doneTaskBorderColor = 'grey';\n this.critBorderColor = '#ff8888';\n this.critBkgColor = 'red';\n this.todayLineColor = 'red';\n\n /* state colors */\n this.labelColor = 'black';\n\n this.errorBkgColor = '#552222';\n this.errorTextColor = '#552222';\n }\n updateColors() {\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1;\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n\n /* Sequence Diagram variables */\n\n this.actorBorder = darken(this.mainBkg, 20);\n this.actorBkg = this.mainBkg;\n this.labelBoxBkgColor = this.actorBkg;\n this.labelTextColor = this.actorTextColor;\n this.loopTextColor = this.actorTextColor;\n this.noteBorderColor = this.border2;\n this.noteTextColor = this.actorTextColor;\n\n /* Gantt chart variables */\n\n this.taskBorderColor = this.border1;\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextOutsideColor = this.taskTextDarkColor;\n this.activeTaskBorderColor = this.taskBorderColor;\n this.activeTaskBkgColor = this.mainBkg;\n\n /* state colors */\n /* class */\n this.classText = this.primaryTextColor;\n /* journey */\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = userOverrides => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n","import { invert, darken, lighten, adjust } from 'khroma';\nimport { mkBorder } from './theme-helpers';\n\n// const Color = require ( 'khroma/dist/color' ).default\n// Color.format.hex.stringify(Color.parse('hsl(210, 66.6666666667%, 95%)')); // => \"#EAF2FB\"\n\nclass Theme {\n constructor() {\n this.primaryColor = '#eee';\n this.contrast = '#26a';\n this.secondaryColor = lighten(this.contrast, 55);\n this.background = '#ffffff';\n\n // this.secondaryColor = adjust(this.primaryColor, { h: 120 });\n this.tertiaryColor = adjust(this.primaryColor, { h: -160 });\n this.primaryBorderColor = mkBorder(this.primaryColor, this.darkMode);\n this.secondaryBorderColor = mkBorder(this.secondaryColor, this.darkMode);\n this.tertiaryBorderColor = mkBorder(this.tertiaryColor, this.darkMode);\n // this.noteBorderColor = mkBorder(this.noteBkgColor, this.darkMode);\n\n this.primaryTextColor = invert(this.primaryColor);\n this.secondaryTextColor = invert(this.secondaryColor);\n this.tertiaryTextColor = invert(this.tertiaryColor);\n this.lineColor = invert(this.background);\n this.textColor = invert(this.background);\n\n this.altBackground = lighten(this.contrast, 55);\n this.mainBkg = '#eee';\n this.secondBkg = 'calculated';\n this.lineColor = '#666';\n this.border1 = '#999';\n this.border2 = 'calculated';\n this.note = '#ffa';\n this.text = '#333';\n this.critical = '#d42';\n this.done = '#bbb';\n this.arrowheadColor = '#333333';\n this.fontFamily = '\"trebuchet ms\", verdana, arial, sans-serif';\n this.fontSize = '16px';\n\n /* Flowchart variables */\n\n this.nodeBkg = 'calculated';\n this.nodeBorder = 'calculated';\n this.clusterBkg = 'calculated';\n this.clusterBorder = 'calculated';\n this.defaultLinkColor = 'calculated';\n this.titleColor = 'calculated';\n this.edgeLabelBackground = 'white';\n\n /* Sequence Diagram variables */\n\n this.actorBorder = 'calculated';\n this.actorBkg = 'calculated';\n this.actorTextColor = 'calculated';\n this.actorLineColor = 'calculated';\n this.signalColor = 'calculated';\n this.signalTextColor = 'calculated';\n this.labelBoxBkgColor = 'calculated';\n this.labelBoxBorderColor = 'calculated';\n this.labelTextColor = 'calculated';\n this.loopTextColor = 'calculated';\n this.noteBorderColor = 'calculated';\n this.noteBkgColor = 'calculated';\n this.noteTextColor = 'calculated';\n this.activationBorderColor = '#666';\n this.activationBkgColor = '#f4f4f4';\n this.sequenceNumberColor = 'white';\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = 'calculated';\n this.altSectionBkgColor = 'white';\n this.sectionBkgColor2 = 'calculated';\n this.taskBorderColor = 'calculated';\n this.taskBkgColor = 'calculated';\n this.taskTextLightColor = 'white';\n this.taskTextColor = 'calculated';\n this.taskTextDarkColor = 'calculated';\n this.taskTextOutsideColor = 'calculated';\n this.taskTextClickableColor = '#003163';\n this.activeTaskBorderColor = 'calculated';\n this.activeTaskBkgColor = 'calculated';\n this.gridColor = 'calculated';\n this.doneTaskBkgColor = 'calculated';\n this.doneTaskBorderColor = 'calculated';\n this.critBkgColor = 'calculated';\n this.critBorderColor = 'calculated';\n this.todayLineColor = 'calculated';\n\n /* state colors */\n this.labelColor = 'black';\n\n this.errorBkgColor = '#552222';\n this.errorTextColor = '#552222';\n }\n updateColors() {\n this.secondBkg = lighten(this.contrast, 55);\n this.border2 = this.contrast;\n\n /* Flowchart variables */\n\n this.nodeBkg = this.mainBkg;\n this.nodeBorder = this.border1;\n this.clusterBkg = this.secondBkg;\n this.clusterBorder = this.border2;\n this.defaultLinkColor = this.lineColor;\n this.titleColor = this.text;\n\n /* Sequence Diagram variables */\n\n this.actorBorder = lighten(this.border1, 23);\n this.actorBkg = this.mainBkg;\n this.actorTextColor = this.text;\n this.actorLineColor = this.lineColor;\n this.signalColor = this.text;\n this.signalTextColor = this.text;\n this.labelBoxBkgColor = this.actorBkg;\n this.labelBoxBorderColor = this.actorBorder;\n this.labelTextColor = this.text;\n this.loopTextColor = this.text;\n this.noteBorderColor = darken(this.note, 60);\n this.noteBkgColor = this.note;\n this.noteTextColor = this.actorTextColor;\n\n /* Gantt chart variables */\n\n this.sectionBkgColor = lighten(this.contrast, 30);\n this.sectionBkgColor2 = lighten(this.contrast, 30);\n\n this.taskBorderColor = darken(this.contrast, 10);\n\n this.taskBkgColor = this.contrast;\n this.taskTextColor = this.taskTextLightColor;\n this.taskTextDarkColor = this.text;\n this.taskTextOutsideColor = this.taskTextDarkColor;\n this.activeTaskBorderColor = this.taskBorderColor;\n this.activeTaskBkgColor = this.mainBkg;\n this.gridColor = lighten(this.border1, 30);\n\n this.doneTaskBkgColor = this.done;\n this.doneTaskBorderColor = this.lineColor;\n this.critBkgColor = this.critical;\n this.critBorderColor = darken(this.critBkgColor, 10);\n\n this.todayLineColor = this.critBkgColor;\n\n /* state colors */\n /* class */\n this.classText = this.primaryTextColor;\n /* journey */\n this.fillType0 = this.primaryColor;\n this.fillType1 = this.secondaryColor;\n this.fillType2 = adjust(this.primaryColor, { h: 64 });\n this.fillType3 = adjust(this.secondaryColor, { h: 64 });\n this.fillType4 = adjust(this.primaryColor, { h: -64 });\n this.fillType5 = adjust(this.secondaryColor, { h: -64 });\n this.fillType6 = adjust(this.primaryColor, { h: 128 });\n this.fillType7 = adjust(this.secondaryColor, { h: 128 });\n }\n calculate(overrides) {\n if (typeof overrides !== 'object') {\n // Calculate colors form base colors\n this.updateColors();\n return;\n }\n\n const keys = Object.keys(overrides);\n\n // Copy values from overrides, this is mainly for base colors\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n\n // Calculate colors form base colors\n this.updateColors();\n // Copy values from overrides again in case of an override of derived value\n keys.forEach(k => {\n this[k] = overrides[k];\n });\n }\n}\n\nexport const getThemeVariables = userOverrides => {\n const theme = new Theme();\n theme.calculate(userOverrides);\n return theme;\n};\n","import { getThemeVariables as baseThemeVariables } from './theme-base';\nimport { getThemeVariables as darkThemeVariables } from './theme-dark';\nimport { getThemeVariables as defaultThemeVariables } from './theme-default';\nimport { getThemeVariables as forestThemeVariables } from './theme-forest';\nimport { getThemeVariables as neutralThemeVariables } from './theme-neutral';\n\nexport default {\n base: {\n getThemeVariables: baseThemeVariables\n },\n dark: {\n getThemeVariables: darkThemeVariables\n },\n default: {\n getThemeVariables: defaultThemeVariables\n },\n forest: {\n getThemeVariables: forestThemeVariables\n },\n neutral: {\n getThemeVariables: neutralThemeVariables\n }\n};\n","import theme from './themes';\n/**\n * **Configuration methods in Mermaid version 8.6.0 have been updated, to learn more[[click here](8.6.0_docs.md)].**\n *\n * ## **What follows are config instructions for older versions**\n * These are the default options which can be overridden with the initialization call like so:\n * **Example 1:**\n *

        \n * mermaid.initialize({\n *   flowchart:{\n *     htmlLabels: false\n *   }\n * });\n * 
        \n *\n * **Example 2:**\n *
        \n * <script>\n *   var config = {\n *     startOnLoad:true,\n *     flowchart:{\n *       useMaxWidth:true,\n *       htmlLabels:true,\n *       curve:'cardinal',\n *     },\n *\n *     securityLevel:'loose',\n *   };\n *   mermaid.initialize(config);\n * </script>\n * 
        \n * A summary of all options and their defaults is found [here](#mermaidapi-configuration-defaults). A description of each option follows below.\n *\n * @name Configuration\n */\nconst config = {\n /** theme , the CSS style sheet\n *\n * theme , the CSS style sheet\n *\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| Theme |Built in Themes| String | Optional | Values include, default, forest, dark, neutral, null|\n *\n ***Notes:**To disable any pre-defined mermaid theme, use \"null\".\n *
        \n   *  \"theme\": \"forest\",\n   *  \"themeCSS\": \".node rect { fill: red; }\"\n   * 
        \n */\n theme: 'default',\n themeVariables: theme['default'].getThemeVariables(),\n themeCSS: undefined,\n /* **maxTextSize** - The maximum allowed size of the users text diamgram */\n maxTextSize: 50000,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *|fontFamily | specifies the font to be used in the rendered diagrams| String | Required | Trebuchet MS, Verdana, Arial, Sans-Serif |\n *\n ***notes: Default value is \\\\\"trebuchet ms\\\\\".\n */\n fontFamily: '\"trebuchet ms\", verdana, arial, sans-serif;',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| logLevel |This option decides the amount of logging to be used.| String | Required | 1, 2, 3, 4, 5 |\n *\n *\n ***Notes:**\n *- debug: 1.\n *- info: 2.\n *- warn: 3.\n *- error: 4.\n *- fatal: 5(default).\n */\n logLevel: 5,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| securitylevel | Level of trust for parsed diagram|String | Required | Strict, Loose, antiscript |\n *\n ***Notes:\n *- **strict**: (**default**) tags in text are encoded, click functionality is disabeled\n *- **loose**: tags in text are allowed, click functionality is enabled\n *- **antiscript**: html tags in text are allowed, (only script element is removed), click functionality is enabled\n */\n securityLevel: 'strict',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| startOnLoad| Dictates whether mermaind starts on Page load | Boolean | Required | True, False |\n *\n ***Notes:**\n ***Default value: true**\n */\n startOnLoad: true,\n\n /**\n *| Parameter | Description |Type | Required |Values|\n *| --- | --- | --- | --- | --- |\n *| arrowMarkerAbsolute | Controls whether or arrow markers in html code are absolute paths or anchors | Boolean | Required | True, False |\n *\n *\n *## Notes**: This matters if you are using base tag settings.\n ***Default value: false**.\n */\n arrowMarkerAbsolute: false,\n\n /**\n * This option controls which currentConfig keys are considered _secure_ and can only be changed via\n * call to mermaidAPI.initialize. Calls to mermaidAPI.reinitialize cannot make changes to\n * the `secure` keys in the current currentConfig. This prevents malicious graph directives from\n * overriding a site's default security.\n */\n secure: ['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'],\n\n /**\n * This option controls if the generated ids of nodes in the SVG are generated randomly or based on a seed.\n * If set to false, the IDs are generated based on the current date and thus are not deterministic. This is the default behaviour.\n *\n *## Notes**: This matters if your files are checked into sourcecontrol e.g. git and should not change unless content is changed.\n ***Default value: false**\n */\n deterministicIds: false,\n\n /**\n * This option is the optional seed for deterministic ids. if set to undefined but deterministicIds is true, a simple number iterator is used.\n * You can set this attribute to base the seed on a static string.\n */\n deterministicIDSeed: undefined,\n\n /**\n * The object containing configurations specific for flowcharts\n */\n flowchart: {\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| diagramPadding | amount of padding around the diagram as a whole | Integer | Required | Any Positive Value |\n *\n ***Notes:**The amount of padding around the diagram as a whole so that embedded diagrams have margins, expressed in pixels\n ***Default value: 8**.\n */\n diagramPadding: 8,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| htmlLabels | Flag for setting whether or not a html tag should be used for rendering labels on the edges. | Boolean| Required | True, False|\n *\n ***Notes: Default value: true**.\n */\n htmlLabels: true,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| nodeSpacing | Defines the spacing between nodes on the same level | Integer| Required | Any positive Numbers |\n *\n ***Notes:\n *Pertains to horizontal spacing for TB (top to bottom) or BT (bottom to top) graphs, and the vertical spacing for LR as well as RL graphs.**\n ***Default value 50**.\n */\n nodeSpacing: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| rankSpacing | Defines the spacing between nodes on different levels | Integer | Required| Any Positive Numbers |\n *\n ***Notes: pertains to vertical spacing for TB (top to bottom) or BT (bottom to top), and the horizontal spacing for LR as well as RL graphs.\n ***Default value 50**.\n */\n rankSpacing: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| curve | Defines how mermaid renders curves for flowcharts. | String | Required | Basis, Linear, Cardinal|\n *\n ***Notes:\n *Default Vaue: Linear**\n */\n curve: 'linear',\n // Only used in new experimental rendering\n // represents the padding between the labels and the shape\n padding: 15,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See notes | Boolean | 4 | True, False |\n *\n ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the\n *available space if not the absolute space required is used.\n *\n ***Default value true**.\n */\n useMaxWidth: true\n },\n\n /**\n * The object containing configurations specific for sequence diagrams\n */\n sequence: {\n /**\n * widt of the activation rect\n * **Default value 10**.\n */\n activationWidth: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| diagramMarginX | margin to the right and left of the sequence diagram | Integer | Required | Any Positive Values |\n *\n ***Notes:**\n ***Default value 50**.\n */\n diagramMarginX: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| diagramMarginY | Margin to the over and under the sequence diagram | Integer | Required | Any Positive Values|\n *\n ***Notes:**\n ***Default value 10**.\n */\n diagramMarginY: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| actorMargin | Margin between actors. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 50**.\n */\n actorMargin: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| width | Width of actor boxes | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 150**.\n */\n width: 150,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| height | Height of actor boxes | Integer | Required | Any Positive Value|\n *\n ***Notes:**\n ***Default value 65**..\n */\n height: 65,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n *\n ***Default value 10**.\n */\n boxMargin: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| boxTextMargin| margin around the text in loop/alt/opt boxes | Integer | Required| Any Positive Value|\n *\n ***Notes:**\n *\n ***Default value 5**.\n */\n boxTextMargin: 5,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| noteMargin | margin around notes. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n *\n ***Default value 10**.\n */\n noteMargin: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| messageMargin | Space between messages. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n *\n *Space between messages.\n ***Default value 35**.\n */\n messageMargin: 35,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| messageAlign | Multiline message alignment | Integer | Required | left, center, right |\n *\n ***Notes:**center **default**\n */\n messageAlign: 'center',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| mirrorActors | mirror actors under diagram. | Boolean| Required | True, False |\n *\n ***Notes:**\n *\n ***Default value true**.\n */\n mirrorActors: true,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| bottomMarginAdj | Prolongs the edge of the diagram downwards. | Integer | Required | Any Positive Value |\n *\n ***Notes:**Depending on css styling this might need adjustment.\n ***Default value 1**.\n */\n bottomMarginAdj: 1,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See Notes | Boolean | Required | True, False |\n *\n ***Notes:**\n *when this flag is set to true, the height and width is set to 100% and is then scaling with the\n *available space. If set to false, the absolute space required is used.\n ***Default value: True**.\n */\n useMaxWidth: true,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| rightAngles | display curve arrows as right angles| Boolean | Required | True, False |\n *\n ***Notes:**\n *\n *This will display arrows that start and begin at the same node as right angles, rather than a curve\n ***Default value false**.\n */\n rightAngles: false,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| showSequenceNumbers | This will show the node numbers | Boolean | Required | True, False |\n *\n ***Notes:**\n ***Default value false**.\n */\n showSequenceNumbers: false,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| actorFontSize| This sets the font size of the actor's description | Integer | Require | Any Positive Value |\n *\n ***Notes:**\n ***Default value 14**..\n */\n actorFontSize: 14,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| actorFontFamily |This sets the font family of the actor's description | 3 | 4 | Open-Sans, Sans-Serif |\n *\n ***Notes:**\n ***Default value \"Open-Sans\", \"sans-serif\"**.\n */\n actorFontFamily: '\"Open-Sans\", \"sans-serif\"',\n /**\n * This sets the font weight of the actor's description\n * **Default value 400.\n */\n actorFontWeight: 400,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| noteFontSize |This sets the font size of actor-attached notes. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 14**..\n */\n noteFontSize: 14,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| noteFontFamily| This sets the font family of actor-attached notes. | String | Required | trebuchet ms, verdana, arial, sans-serif |\n *\n ***Notes:**\n ***Default value: trebuchet ms **.\n */\n noteFontFamily: '\"trebuchet ms\", verdana, arial, sans-serif',\n /**\n * This sets the font weight of the note's description\n * **Default value 400.\n */\n noteFontWeight: 400,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| noteAlign | This sets the text alignment of actor-attached notes. | string | required | left, center, right|\n *\n ***Notes:**\n ***Default value center**.\n */\n noteAlign: 'center',\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| messageFontSize | This sets the font size of actor messages. | Integer | Required | Any Positive Number |\n *\n ***Notes:**\n ***Default value 16**.\n */\n messageFontSize: 16,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| messageFontFamily | This sets the font family of actor messages. | String| Required | trebuchet ms\", verdana, arial, sans-serif |\n *\n ***Notes:**\n ***Default value: \"trebuchet ms**.\n */\n messageFontFamily: '\"trebuchet ms\", verdana, arial, sans-serif',\n /**\n * This sets the font weight of the message's description\n * **Default value 400.\n */\n messageFontWeight: 400,\n /**\n * This sets the auto-wrap state for the diagram\n * **Default value false.\n */\n wrap: false,\n /**\n * This sets the auto-wrap padding for the diagram (sides only)\n * **Default value 10.\n */\n wrapPadding: 10,\n /**\n * This sets the width of the loop-box (loop, alt, opt, par)\n * **Default value 50.\n */\n labelBoxWidth: 50,\n /**\n * This sets the height of the loop-box (loop, alt, opt, par)\n * **Default value 20.\n */\n labelBoxHeight: 20,\n messageFont: function() {\n return {\n fontFamily: this.messageFontFamily,\n fontSize: this.messageFontSize,\n fontWeight: this.messageFontWeight\n };\n },\n noteFont: function() {\n return {\n fontFamily: this.noteFontFamily,\n fontSize: this.noteFontSize,\n fontWeight: this.noteFontWeight\n };\n },\n actorFont: function() {\n return {\n fontFamily: this.actorFontFamily,\n fontSize: this.actorFontSize,\n fontWeight: this.actorFontWeight\n };\n }\n },\n\n /**\n * The object containing configurations specific for gantt diagrams*\n */\n gantt: {\n /**\n *### titleTopMargin\n *\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| titleTopMargin | Margin top for the text over the gantt diagram | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 25**.\n */\n titleTopMargin: 25,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| barHeight | The height of the bars in the graph | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 20**.\n */\n barHeight: 20,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| barGap | The margin between the different activities in the gantt diagram. | Integer | Optional |Any Positive Value |\n *\n ***Notes:**\n ***Default value 4**.\n */\n barGap: 4,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| topPadding | Margin between title and gantt diagram and between axis and gantt diagram. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 50**.\n */\n topPadding: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| leftPadding | The space allocated for the section name to the left of the activities. | Integer| Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 75**.\n */\n leftPadding: 75,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| gridLineStartPadding | Vertical starting position of the grid lines. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 35**.\n */\n gridLineStartPadding: 35,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| fontSize | Font size| Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 11**.\n */\n fontSize: 11,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| fontFamily | font Family | string | required |\"Open-Sans\", \"sans-serif\" |\n *\n ***Notes:**\n *\n ***Default value '\"Open-Sans\", \"sans-serif\"'**.\n */\n fontFamily: '\"Open-Sans\", \"sans-serif\"',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| numberSectionStyles | The number of alternating section styles | Integer | 4 | Any Positive Value |\n *\n ***Notes:**\n ***Default value 4**.\n */\n numberSectionStyles: 4,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| axisFormat | Datetime format of the axis. | 3 | Required | Date in yy-mm-dd |\n *\n ***Notes:**\n *\n * This might need adjustment to match your locale and preferences\n ***Default value '%Y-%m-%d'**.\n */\n axisFormat: '%Y-%m-%d',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See notes | Boolean | 4 | True, False |\n *\n ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the\n *available space if not the absolute space required is used.\n *\n ***Default value true**.\n */\n useMaxWidth: true,\n\n useWidth: undefined\n },\n\n /**\n * The object containing configurations specific for journey diagrams\n */\n journey: {\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| diagramMarginX | margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 50**.\n */\n diagramMarginX: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| diagramMarginY | margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value|\n *\n ***Notes:**\n ***Default value 10**..\n */\n diagramMarginY: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| actorMargin | Margin between actors. | Integer | Required | Any Positive Value|\n *\n ***Notes:**\n ***Default value 50**.\n */\n actorMargin: 50,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| width | Width of actor boxes | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 150**.\n */\n width: 150,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| height | Height of actor boxes | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 65**.\n */\n height: 65,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 10**.\n */\n boxMargin: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| boxTextMargin | margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n */\n boxTextMargin: 5,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| noteMargin | margin around notes. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n ***Default value 10**.\n */\n noteMargin: 10,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| messageMargin |Space between messages. | Integer | Required | Any Positive Value |\n *\n ***Notes:**\n *\n *Space between messages.\n ***Default value 35**.\n */\n messageMargin: 35,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| messageAlign |Multiline message alignment | 3 | 4 | left, center, right |\n *\n ***Notes:**default:center**\n */\n messageAlign: 'center',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| bottomMarginAdj | Prolongs the edge of the diagram downwards. | Integer | 4 | Any Positive Value |\n *\n ***Notes:**Depending on css styling this might need adjustment.\n ***Default value 1**.\n */\n bottomMarginAdj: 1,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See notes | Boolean | 4 | True, False |\n *\n ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the\n *available space if not the absolute space required is used.\n *\n ***Default value true**.\n */\n useMaxWidth: true,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| rightAngles | Curved Arrows become Right Angles, | 3 | 4 | True, False |\n *\n ***Notes:**This will display arrows that start and begin at the same node as right angles, rather than a curves\n ***Default value false**.\n */\n rightAngles: false\n },\n class: {\n arrowMarkerAbsolute: false,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See notes | Boolean | 4 | True, False |\n *\n ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the\n *available space if not the absolute space required is used.\n *\n ***Default value true**.\n */\n useMaxWidth: true\n },\n git: {\n arrowMarkerAbsolute: false,\n\n useWidth: undefined,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See notes | Boolean | 4 | True, False |\n *\n ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the\n *available space if not the absolute space required is used.\n *\n ***Default value true**.\n */\n useMaxWidth: true\n },\n state: {\n dividerMargin: 10,\n sizeUnit: 5,\n padding: 8,\n textHeight: 10,\n titleShift: -15,\n noteMargin: 10,\n forkWidth: 70,\n forkHeight: 7,\n // Used\n miniPadding: 2,\n // Font size factor, this is used to guess the width of the edges labels before rendering by dagre\n // layout. This might need updating if/when switching font\n fontSizeFactor: 5.02,\n fontSize: 24,\n labelHeight: 16,\n edgeLengthFactor: '20',\n compositTitleSize: 35,\n radius: 5,\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See notes | Boolean | 4 | True, False |\n *\n ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the\n *available space if not the absolute space required is used.\n *\n ***Default value true**.\n */\n useMaxWidth: true\n },\n\n /**\n * The object containing configurations specific for entity relationship diagrams\n */\n er: {\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| diagramPadding | amount of padding around the diagram as a whole | Integer | Required | Any Positive Value |\n *\n ***Notes:**The amount of padding around the diagram as a whole so that embedded diagrams have margins, expressed in pixels\n ***Default value: 20**.\n */\n diagramPadding: 20,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| layoutDirection | Directional bias for layout of entities. | String | Required | \"TB\", \"BT\",\"LR\",\"RL\" |\n *\n ***Notes:**\n *'TB' for Top-Bottom, 'BT'for Bottom-Top, 'LR' for Left-Right, or 'RL' for Right to Left.\n * T = top, B = bottom, L = left, and R = right.\n ***Default value: TB **.\n */\n layoutDirection: 'TB',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| minEntityWidth | The mimimum width of an entity box, | Integer | Required| Any Positive Value |\n *\n ***Notes:**expressed in pixels\n ***Default value: 100**.\n */\n minEntityWidth: 100,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| minEntityHeight| The minimum height of an entity box, | Integer | 4 | Any Positive Value |\n *\n ***Notes:**expressed in pixels\n ***Default value: 75 **\n */\n minEntityHeight: 75,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| entityPadding|minimum internal padding betweentext in box and box borders| Integer | 4 | Any Positive Value |\n *\n ***Notes:**The minimum internal padding betweentext in an entity box and the enclosing box borders, expressed in pixels.\n ***Default value: 15 **\n */\n entityPadding: 15,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| stroke | Stroke color of box edges and lines | String | 4 | Any recognized color |\n ***Default value: gray **\n */\n stroke: 'gray',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| fill | Fill color of entity boxes | String | 4 | Any recognized color |\n *\n ***Notes:**\n ***Default value:'honeydew'**\n */\n fill: 'honeydew',\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| fontSize| Font Size in pixels| Integer | | Any Positive Value |\n *\n ***Notes:**Font size (expressed as an integer representing a number of pixels)\n ***Default value: 12 **\n */\n fontSize: 12,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See Notes | Boolean | Required | true, false |\n *\n ***Notes:**\n *When this flag is set to true, the diagram width is locked to 100% and\n *scaled based on available space. If set to false, the diagram reserves its\n *absolute width.\n ***Default value: true**.\n */\n useMaxWidth: true\n },\n\n /**\n * The object containing configurations specific for pie diagrams\n */\n pie: {\n useWidth: undefined,\n\n /**\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| useMaxWidth | See Notes | Boolean | Required | true, false |\n *\n ***Notes:**\n *When this flag is set to true, the diagram width is locked to 100% and\n *scaled based on available space. If set to false, the diagram reserves its\n *absolute width.\n ***Default value: true**.\n */\n useMaxWidth: true\n }\n};\n\nconfig.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;\nconfig.git.arrowMarkerAbsolute = config.arrowMarkerAbsolute;\n\nexport default config;\n","import { assignWithDepth } from './utils';\nimport { log } from './logger';\nimport theme from './themes';\nimport config from './defaultConfig';\n\n// debugger;\n\nexport const defaultConfig = Object.freeze(config);\n\nlet siteConfig = assignWithDepth({}, defaultConfig);\nlet configFromInitialize;\nlet directives = [];\nlet currentConfig = assignWithDepth({}, defaultConfig);\n\nexport const updateCurrentConfig = (siteCfg, _directives) => {\n // start with config beeing the siteConfig\n let cfg = assignWithDepth({}, siteCfg);\n // let sCfg = assignWithDepth(defaultConfig, siteConfigDelta);\n\n // Join directives\n let sumOfDirectives = {};\n for (let i = 0; i < _directives.length; i++) {\n const d = _directives[i];\n sanitize(d);\n\n // Apply the data from the directive where the the overrides the themeVaraibles\n sumOfDirectives = assignWithDepth(sumOfDirectives, d);\n }\n\n cfg = assignWithDepth(cfg, sumOfDirectives);\n\n if (sumOfDirectives.theme) {\n const tmpConfigFromInitialize = assignWithDepth({}, configFromInitialize);\n const themeVariables = assignWithDepth(\n tmpConfigFromInitialize.themeVariables || {},\n sumOfDirectives.themeVariables\n );\n cfg.themeVariables = theme[cfg.theme].getThemeVariables(themeVariables);\n }\n\n currentConfig = cfg;\n return cfg;\n};\n/**\n *## setSiteConfig\n *| Function | Description | Type | Values |\n *| --------- | ------------------- | ------- | ------------------ |\n *| setSiteConfig|Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array|\n ***Notes:**\n *Sets the siteConfig. The siteConfig is a protected configuration for repeat use. Calls to reset() will reset\n *the currentConfig to siteConfig. Calls to reset(configApi.defaultConfig) will reset siteConfig and currentConfig\n *to the defaultConfig\n *Note: currentConfig is set in this function\n **Default value: At default, will mirror Global Config**\n * @param conf - the base currentConfig to use as siteConfig\n * @returns {*} - the siteConfig\n */\nexport const setSiteConfig = conf => {\n siteConfig = assignWithDepth({}, defaultConfig);\n siteConfig = assignWithDepth(siteConfig, conf);\n\n if (conf.theme) {\n siteConfig.themeVariables = theme[conf.theme].getThemeVariables(conf.themeVariables);\n }\n\n currentConfig = updateCurrentConfig(siteConfig, directives);\n return siteConfig;\n};\n\nexport const saveConfigFromInitilize = conf => {\n configFromInitialize = assignWithDepth({}, conf);\n};\n\nexport const updateSiteConfig = conf => {\n siteConfig = assignWithDepth(siteConfig, conf);\n updateCurrentConfig(siteConfig, directives);\n\n return siteConfig;\n};\n/**\n *## getSiteConfig\n *| Function | Description | Type | Values |\n *| --------- | ------------------- | ------- | ------------------ |\n *| setSiteConfig|Returns the current siteConfig base configuration | Get Request | Returns Any Values in siteConfig|\n ***Notes**:\n *Returns **any** values in siteConfig.\n * @returns {*}\n */\nexport const getSiteConfig = () => {\n return assignWithDepth({}, siteConfig);\n};\n/**\n *## setConfig\n *| Function | Description | Type | Values |\n *| --------- | ------------------- | ------- | ------------------ |\n *| setSiteConfig|Sets the siteConfig to desired values | Put Request| Any Values, except ones in secure array|\n ***Notes**:\n *Sets the currentConfig. The parameter conf is sanitized based on the siteConfig.secure keys. Any\n *values found in conf with key found in siteConfig.secure will be replaced with the corresponding\n *siteConfig value.\n * @param conf - the potential currentConfig\n * @returns {*} - the currentConfig merged with the sanitized conf\n */\nexport const setConfig = conf => {\n // sanitize(conf);\n // Object.keys(conf).forEach(key => {\n // const manipulator = manipulators[key];\n // conf[key] = manipulator ? manipulator(conf[key]) : conf[key];\n // });\n\n assignWithDepth(currentConfig, conf);\n\n return getConfig();\n};\n\n/**\n * ## getConfig\n *| Function | Description | Type | Return Values |\n *| --------- | ------------------- | ------- | ------------------ |\n *| getConfig |Obtains the currentConfig | Get Request | Any Values from currentConfig|\n ***Notes**:\n *Returns **any** the currentConfig\n * @returns {*} - the currentConfig\n */\nexport const getConfig = () => {\n return assignWithDepth({}, currentConfig);\n};\n/**\n *## sanitize\n *| Function | Description | Type | Values |\n *| --------- | ------------------- | ------- | ------------------ |\n *| sanitize |Sets the siteConfig to desired values. | Put Request |None|\n *Ensures options parameter does not attempt to override siteConfig secure keys\n *Note: modifies options in-place\n * @param options - the potential setConfig parameter\n */\nexport const sanitize = options => {\n Object.keys(siteConfig.secure).forEach(key => {\n if (typeof options[siteConfig.secure[key]] !== 'undefined') {\n // DO NOT attempt to print options[siteConfig.secure[key]] within `${}` as a malicious script\n // can exploit the logger's attempt to stringify the value and execute arbitrary code\n log.debug(\n `Denied attempt to modify a secure key ${siteConfig.secure[key]}`,\n options[siteConfig.secure[key]]\n );\n delete options[siteConfig.secure[key]];\n }\n });\n};\n\nexport const addDirective = directive => {\n if (directive.fontFamily) {\n if (!directive.themeVariables) {\n directive.themeVariables = { fontFamily: directive.fontFamily };\n } else {\n if (!directive.themeVariables.fontFamily) {\n directive.themeVariables = { fontFamily: directive.fontFamily };\n }\n }\n }\n directives.push(directive);\n updateCurrentConfig(siteConfig, directives);\n};\n\n/**\n *## reset\n *| Function | Description | Type | Required | Values |\n *| --------- | ------------------- | ------- | -------- | ------------------ |\n *| reset|Resets currentConfig to conf| Put Request | Required | None|\n *\n *| Parameter | Description |Type | Required | Values|\n *| --- | --- | --- | --- | --- |\n *| conf| base set of values, which currentConfig coul be **reset** to.| Dictionary | Required | Any Values, with respect to the secure Array|\n *\n **Notes :\n (default: current siteConfig ) (optional, default `getSiteConfig()`)\n * @param conf the base currentConfig to reset to (default: current siteConfig ) (optional, default `getSiteConfig()`)\n */\nexport const reset = () => {\n // Replace current config with siteConfig\n directives = [];\n updateCurrentConfig(siteConfig, directives);\n};\n","import { select } from 'd3';\nimport utils from '../../utils';\nimport * as configApi from '../../config';\nimport common from '../common/common';\nimport mermaidAPI from '../../mermaidAPI';\nimport { log } from '../../logger';\n\nconst MERMAID_DOM_ID_PREFIX = 'flowchart-';\nlet vertexCounter = 0;\nlet config = configApi.getConfig();\nlet vertices = {};\nlet edges = [];\nlet classes = [];\nlet subGraphs = [];\nlet subGraphLookup = {};\nlet tooltips = {};\nlet subCount = 0;\nlet firstGraphFlag = true;\nlet direction;\n\nlet version; // As in graph\n\n// Functions to be run after graph rendering\nlet funs = [];\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\n/**\n * Function to lookup domId from id in the graph definition.\n * @param id\n * @public\n */\nexport const lookUpDomId = function(id) {\n const veritceKeys = Object.keys(vertices);\n for (let i = 0; i < veritceKeys.length; i++) {\n if (vertices[veritceKeys[i]].id === id) {\n return vertices[veritceKeys[i]].domId;\n }\n }\n return id;\n};\n\n/**\n * Function called by parser when a node definition has been found\n * @param id\n * @param text\n * @param type\n * @param style\n * @param classes\n */\nexport const addVertex = function(_id, text, type, style, classes) {\n let txt;\n let id = _id;\n if (typeof id === 'undefined') {\n return;\n }\n if (id.trim().length === 0) {\n return;\n }\n\n // if (id[0].match(/\\d/)) id = MERMAID_DOM_ID_PREFIX + id;\n\n if (typeof vertices[id] === 'undefined') {\n vertices[id] = {\n id: id,\n domId: MERMAID_DOM_ID_PREFIX + id + '-' + vertexCounter,\n styles: [],\n classes: []\n };\n }\n vertexCounter++;\n if (typeof text !== 'undefined') {\n config = configApi.getConfig();\n txt = common.sanitizeText(text.trim(), config);\n\n // strip quotes if string starts and ends with a quote\n if (txt[0] === '\"' && txt[txt.length - 1] === '\"') {\n txt = txt.substring(1, txt.length - 1);\n }\n\n vertices[id].text = txt;\n } else {\n if (typeof vertices[id].text === 'undefined') {\n vertices[id].text = _id;\n }\n }\n if (typeof type !== 'undefined') {\n vertices[id].type = type;\n }\n if (typeof style !== 'undefined') {\n if (style !== null) {\n style.forEach(function(s) {\n vertices[id].styles.push(s);\n });\n }\n }\n if (typeof classes !== 'undefined') {\n if (classes !== null) {\n classes.forEach(function(s) {\n vertices[id].classes.push(s);\n });\n }\n }\n};\n\n/**\n * Function called by parser when a link/edge definition has been found\n * @param start\n * @param end\n * @param type\n * @param linktext\n */\nexport const addSingleLink = function(_start, _end, type, linktext) {\n let start = _start;\n let end = _end;\n // if (start[0].match(/\\d/)) start = MERMAID_DOM_ID_PREFIX + start;\n // if (end[0].match(/\\d/)) end = MERMAID_DOM_ID_PREFIX + end;\n // log.info('Got edge...', start, end);\n\n const edge = { start: start, end: end, type: undefined, text: '' };\n linktext = type.text;\n\n if (typeof linktext !== 'undefined') {\n edge.text = common.sanitizeText(linktext.trim(), config);\n\n // strip quotes if string starts and exnds with a quote\n if (edge.text[0] === '\"' && edge.text[edge.text.length - 1] === '\"') {\n edge.text = edge.text.substring(1, edge.text.length - 1);\n }\n }\n\n if (typeof type !== 'undefined') {\n edge.type = type.type;\n edge.stroke = type.stroke;\n edge.length = type.length;\n }\n edges.push(edge);\n};\nexport const addLink = function(_start, _end, type, linktext) {\n let i, j;\n for (i = 0; i < _start.length; i++) {\n for (j = 0; j < _end.length; j++) {\n addSingleLink(_start[i], _end[j], type, linktext);\n }\n }\n};\n\n/**\n * Updates a link's line interpolation algorithm\n * @param pos\n * @param interpolate\n */\nexport const updateLinkInterpolate = function(positions, interp) {\n positions.forEach(function(pos) {\n if (pos === 'default') {\n edges.defaultInterpolate = interp;\n } else {\n edges[pos].interpolate = interp;\n }\n });\n};\n\n/**\n * Updates a link with a style\n * @param pos\n * @param style\n */\nexport const updateLink = function(positions, style) {\n positions.forEach(function(pos) {\n if (pos === 'default') {\n edges.defaultStyle = style;\n } else {\n if (utils.isSubstringInArray('fill', style) === -1) {\n style.push('fill:none');\n }\n edges[pos].style = style;\n }\n });\n};\n\nexport const addClass = function(id, style) {\n if (typeof classes[id] === 'undefined') {\n classes[id] = { id: id, styles: [], textStyles: [] };\n }\n\n if (typeof style !== 'undefined') {\n if (style !== null) {\n style.forEach(function(s) {\n if (s.match('color')) {\n const newStyle1 = s.replace('fill', 'bgFill');\n const newStyle2 = newStyle1.replace('color', 'fill');\n classes[id].textStyles.push(newStyle2);\n }\n classes[id].styles.push(s);\n });\n }\n }\n};\n\n/**\n * Called by parser when a graph definition is found, stores the direction of the chart.\n * @param dir\n */\nexport const setDirection = function(dir) {\n direction = dir;\n if (direction.match(/.*/)) {\n direction = 'LR';\n }\n if (direction.match(/.*v/)) {\n direction = 'TB';\n }\n};\n\n/**\n * Called by parser when a special node is found, e.g. a clickable element.\n * @param ids Comma separated list of ids\n * @param className Class to add\n */\nexport const setClass = function(ids, className) {\n ids.split(',').forEach(function(_id) {\n // let id = version === 'gen-2' ? lookUpDomId(_id) : _id;\n let id = _id;\n // if (_id[0].match(/\\d/)) id = MERMAID_DOM_ID_PREFIX + id;\n if (typeof vertices[id] !== 'undefined') {\n vertices[id].classes.push(className);\n }\n\n if (typeof subGraphLookup[id] !== 'undefined') {\n subGraphLookup[id].classes.push(className);\n }\n });\n};\n\nconst setTooltip = function(ids, tooltip) {\n ids.split(',').forEach(function(id) {\n if (typeof tooltip !== 'undefined') {\n tooltips[version === 'gen-1' ? lookUpDomId(id) : id] = common.sanitizeText(tooltip, config);\n }\n });\n};\n\nconst setClickFun = function(id, functionName, functionArgs) {\n let domId = lookUpDomId(id);\n // if (_id[0].match(/\\d/)) id = MERMAID_DOM_ID_PREFIX + id;\n if (configApi.getConfig().securityLevel !== 'loose') {\n return;\n }\n if (typeof functionName === 'undefined') {\n return;\n }\n let argList = [];\n if (typeof functionArgs === 'string') {\n /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n /* Removes all double quotes at the start and end of an argument */\n /* This preserves all starting and ending whitespace inside */\n if (item.charAt(0) === '\"' && item.charAt(item.length - 1) === '\"') {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n\n /* if no arguments passed into callback, default to passing in id */\n if (argList.length === 0) {\n argList.push(id);\n }\n\n if (typeof vertices[id] !== 'undefined') {\n vertices[id].haveCallback = true;\n funs.push(function() {\n const elem = document.querySelector(`[id=\"${domId}\"]`);\n if (elem !== null) {\n elem.addEventListener(\n 'click',\n function() {\n utils.runFunc(functionName, ...argList);\n },\n false\n );\n }\n });\n }\n};\n\n/**\n * Called by parser when a link is found. Adds the URL to the vertex data.\n * @param ids Comma separated list of ids\n * @param linkStr URL to create a link for\n */\nexport const setLink = function(ids, linkStr, target) {\n ids.split(',').forEach(function(id) {\n if (typeof vertices[id] !== 'undefined') {\n vertices[id].link = utils.formatUrl(linkStr, config);\n vertices[id].linkTarget = target;\n }\n });\n setClass(ids, 'clickable');\n};\nexport const getTooltip = function(id) {\n return tooltips[id];\n};\n\n/**\n * Called by parser when a click definition is found. Registers an event handler.\n * @param ids Comma separated list of ids\n * @param functionName Function to be called on click\n * @param tooltip Tooltip for the clickable element\n */\nexport const setClickEvent = function(ids, functionName, functionArgs) {\n ids.split(',').forEach(function(id) {\n setClickFun(id, functionName, functionArgs);\n });\n setClass(ids, 'clickable');\n};\n\nexport const bindFunctions = function(element) {\n funs.forEach(function(fun) {\n fun(element);\n });\n};\nexport const getDirection = function() {\n return direction.trim();\n};\n/**\n * Retrieval function for fetching the found nodes after parsing has completed.\n * @returns {{}|*|vertices}\n */\nexport const getVertices = function() {\n return vertices;\n};\n\n/**\n * Retrieval function for fetching the found links after parsing has completed.\n * @returns {{}|*|edges}\n */\nexport const getEdges = function() {\n return edges;\n};\n\n/**\n * Retrieval function for fetching the found class definitions after parsing has completed.\n * @returns {{}|*|classes}\n */\nexport const getClasses = function() {\n return classes;\n};\n\nconst setupToolTips = function(element) {\n let tooltipElem = select('.mermaidTooltip');\n if ((tooltipElem._groups || tooltipElem)[0][0] === null) {\n tooltipElem = select('body')\n .append('div')\n .attr('class', 'mermaidTooltip')\n .style('opacity', 0);\n }\n\n const svg = select(element).select('svg');\n\n const nodes = svg.selectAll('g.node');\n nodes\n .on('mouseover', function() {\n const el = select(this);\n const title = el.attr('title');\n\n // Dont try to draw a tooltip if no data is provided\n if (title === null) {\n return;\n }\n const rect = this.getBoundingClientRect();\n\n tooltipElem\n .transition()\n .duration(200)\n .style('opacity', '.9');\n tooltipElem\n .html(el.attr('title'))\n .style('left', window.scrollX + rect.left + (rect.right - rect.left) / 2 + 'px')\n .style('top', window.scrollY + rect.top - 14 + document.body.scrollTop + 'px');\n el.classed('hover', true);\n })\n .on('mouseout', function() {\n tooltipElem\n .transition()\n .duration(500)\n .style('opacity', 0);\n const el = select(this);\n el.classed('hover', false);\n });\n};\nfuns.push(setupToolTips);\n\n/**\n * Clears the internal graph db so that a new graph can be parsed.\n */\nexport const clear = function(ver) {\n vertices = {};\n classes = {};\n edges = [];\n funs = [];\n funs.push(setupToolTips);\n subGraphs = [];\n subGraphLookup = {};\n subCount = 0;\n tooltips = [];\n firstGraphFlag = true;\n version = ver || 'gen-1';\n};\nexport const setGen = ver => {\n version = ver || 'gen-1';\n};\n/**\n *\n * @returns {string}\n */\nexport const defaultStyle = function() {\n return 'fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;';\n};\n\n/**\n * Clears the internal graph db so that a new graph can be parsed.\n */\nexport const addSubGraph = function(_id, list, _title) {\n let id = _id.trim();\n let title = _title;\n if (_id === _title && _title.match(/\\s/)) {\n id = undefined;\n }\n function uniq(a) {\n const prims = { boolean: {}, number: {}, string: {} };\n const objs = [];\n\n return a.filter(function(item) {\n const type = typeof item;\n if (item.trim() === '') {\n return false;\n }\n if (type in prims) {\n return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true); // eslint-disable-line\n } else {\n return objs.indexOf(item) >= 0 ? false : objs.push(item);\n }\n });\n }\n\n let nodeList = [];\n\n nodeList = uniq(nodeList.concat.apply(nodeList, list));\n if (version === 'gen-1') {\n log.warn('LOOKING UP');\n for (let i = 0; i < nodeList.length; i++) {\n nodeList[i] = lookUpDomId(nodeList[i]);\n }\n }\n\n id = id || 'subGraph' + subCount;\n // if (id[0].match(/\\d/)) id = lookUpDomId(id);\n title = title || '';\n title = common.sanitizeText(title, config);\n subCount = subCount + 1;\n const subGraph = { id: id, nodes: nodeList, title: title.trim(), classes: [] };\n\n log.info('Adding', subGraph.id, subGraph.nodes);\n\n /**\n * Deletes an id from all subgraphs\n */\n // const del = _id => {\n // subGraphs.forEach(sg => {\n // const pos = sg.nodes.indexOf(_id);\n // if (pos >= 0) {\n // sg.nodes.splice(pos, 1);\n // }\n // });\n // };\n\n // // Removes the members of this subgraph from any other subgraphs, a node only belong to one subgraph\n // subGraph.nodes.forEach(_id => del(_id));\n\n // Remove the members in the new subgraph if they already belong to another subgraph\n subGraph.nodes = makeUniq(subGraph, subGraphs).nodes;\n subGraphs.push(subGraph);\n subGraphLookup[id] = subGraph;\n return id;\n};\n\nconst getPosForId = function(id) {\n for (let i = 0; i < subGraphs.length; i++) {\n if (subGraphs[i].id === id) {\n return i;\n }\n }\n return -1;\n};\nlet secCount = -1;\nconst posCrossRef = [];\nconst indexNodes2 = function(id, pos) {\n const nodes = subGraphs[pos].nodes;\n secCount = secCount + 1;\n if (secCount > 2000) {\n return;\n }\n posCrossRef[secCount] = pos;\n // Check if match\n if (subGraphs[pos].id === id) {\n return {\n result: true,\n count: 0\n };\n }\n\n let count = 0;\n let posCount = 1;\n while (count < nodes.length) {\n const childPos = getPosForId(nodes[count]);\n // Ignore regular nodes (pos will be -1)\n if (childPos >= 0) {\n const res = indexNodes2(id, childPos);\n if (res.result) {\n return {\n result: true,\n count: posCount + res.count\n };\n } else {\n posCount = posCount + res.count;\n }\n }\n count = count + 1;\n }\n\n return {\n result: false,\n count: posCount\n };\n};\n\nexport const getDepthFirstPos = function(pos) {\n return posCrossRef[pos];\n};\nexport const indexNodes = function() {\n secCount = -1;\n if (subGraphs.length > 0) {\n indexNodes2('none', subGraphs.length - 1, 0);\n }\n};\n\nexport const getSubGraphs = function() {\n return subGraphs;\n};\n\nexport const firstGraph = () => {\n if (firstGraphFlag) {\n firstGraphFlag = false;\n return true;\n }\n return false;\n};\n\nconst destructStartLink = _str => {\n let str = _str.trim();\n let type = 'arrow_open';\n\n switch (str[0]) {\n case '<':\n type = 'arrow_point';\n str = str.slice(1);\n break;\n case 'x':\n type = 'arrow_cross';\n str = str.slice(1);\n break;\n case 'o':\n type = 'arrow_circle';\n str = str.slice(1);\n break;\n }\n\n let stroke = 'normal';\n\n if (str.indexOf('=') !== -1) {\n stroke = 'thick';\n }\n\n if (str.indexOf('.') !== -1) {\n stroke = 'dotted';\n }\n\n return { type, stroke };\n};\n\nconst countChar = (char, str) => {\n const length = str.length;\n let count = 0;\n for (let i = 0; i < length; ++i) {\n if (str[i] === char) {\n ++count;\n }\n }\n return count;\n};\n\nconst destructEndLink = _str => {\n const str = _str.trim();\n let line = str.slice(0, -1);\n let type = 'arrow_open';\n\n switch (str.slice(-1)) {\n case 'x':\n type = 'arrow_cross';\n if (str[0] === 'x') {\n type = 'double_' + type;\n line = line.slice(1);\n }\n break;\n case '>':\n type = 'arrow_point';\n if (str[0] === '<') {\n type = 'double_' + type;\n line = line.slice(1);\n }\n break;\n case 'o':\n type = 'arrow_circle';\n if (str[0] === 'o') {\n type = 'double_' + type;\n line = line.slice(1);\n }\n break;\n }\n\n let stroke = 'normal';\n let length = line.length - 1;\n\n if (line[0] === '=') {\n stroke = 'thick';\n }\n\n let dots = countChar('.', line);\n\n if (dots) {\n stroke = 'dotted';\n length = dots;\n }\n\n return { type, stroke, length };\n};\n\nconst destructLink = (_str, _startStr) => {\n const info = destructEndLink(_str);\n let startInfo;\n if (_startStr) {\n startInfo = destructStartLink(_startStr);\n\n if (startInfo.stroke !== info.stroke) {\n return { type: 'INVALID', stroke: 'INVALID' };\n }\n\n if (startInfo.type === 'arrow_open') {\n // -- xyz --> - take arrow type from ending\n startInfo.type = info.type;\n } else {\n // x-- xyz --> - not supported\n if (startInfo.type !== info.type) return { type: 'INVALID', stroke: 'INVALID' };\n\n startInfo.type = 'double_' + startInfo.type;\n }\n\n if (startInfo.type === 'double_arrow') {\n startInfo.type = 'double_arrow_point';\n }\n\n startInfo.length = info.length;\n return startInfo;\n }\n\n return info;\n};\n\n// Todo optimizer this by caching existing nodes\nconst exists = (allSgs, _id) => {\n let res = false;\n allSgs.forEach(sg => {\n const pos = sg.nodes.indexOf(_id);\n if (pos >= 0) {\n res = true;\n }\n });\n return res;\n};\n/**\n * Deletes an id from all subgraphs\n */\nconst makeUniq = (sg, allSubgraphs) => {\n const res = [];\n sg.nodes.forEach((_id, pos) => {\n if (!exists(allSubgraphs, _id)) {\n res.push(sg.nodes[pos]);\n }\n });\n return { nodes: res };\n};\n\nexport default {\n parseDirective,\n defaultConfig: () => configApi.defaultConfig.flowchart,\n addVertex,\n lookUpDomId,\n addLink,\n updateLinkInterpolate,\n updateLink,\n addClass,\n setDirection,\n setClass,\n setTooltip,\n getTooltip,\n setClickEvent,\n setLink,\n bindFunctions,\n getDirection,\n getVertices,\n getEdges,\n getClasses,\n clear,\n setGen,\n defaultStyle,\n addSubGraph,\n getDepthFirstPos,\n indexNodes,\n getSubGraphs,\n destructLink,\n lex: {\n firstGraph\n },\n exists,\n makeUniq\n};\n","import dagreD3 from 'dagre-d3';\n\nfunction question(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const s = (w + h) * 0.9;\n const points = [\n { x: s / 2, y: 0 },\n { x: s, y: -s / 2 },\n { x: s / 2, y: -s },\n { x: 0, y: -s / 2 }\n ];\n const shapeSvg = insertPolygonShape(parent, s, s, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction hexagon(parent, bbox, node) {\n const f = 4;\n const h = bbox.height;\n const m = h / f;\n const w = bbox.width + 2 * m;\n const points = [\n { x: m, y: 0 },\n { x: w - m, y: 0 },\n { x: w, y: -h / 2 },\n { x: w - m, y: -h },\n { x: m, y: -h },\n { x: 0, y: -h / 2 }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction rect_left_inv_arrow(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: -h / 2, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: -h / 2, y: -h },\n { x: 0, y: -h / 2 }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction lean_right(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: h / 6, y: -h }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction lean_left(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: (2 * h) / 6, y: 0 },\n { x: w + h / 6, y: 0 },\n { x: w - (2 * h) / 6, y: -h },\n { x: -h / 6, y: -h }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction trapezoid(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w + (2 * h) / 6, y: 0 },\n { x: w - h / 6, y: -h },\n { x: h / 6, y: -h }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction inv_trapezoid(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: h / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: (-2 * h) / 6, y: -h }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction rect_right_inv_arrow(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: 0, y: 0 },\n { x: w + h / 2, y: 0 },\n { x: w, y: -h / 2 },\n { x: w + h / 2, y: -h },\n { x: 0, y: -h }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction stadium(parent, bbox, node) {\n const h = bbox.height;\n const w = bbox.width + h / 4;\n\n const shapeSvg = parent\n .insert('rect', ':first-child')\n .attr('rx', h / 2)\n .attr('ry', h / 2)\n .attr('x', -w / 2)\n .attr('y', -h / 2)\n .attr('width', w)\n .attr('height', h);\n\n node.intersect = function(point) {\n return dagreD3.intersect.rect(node, point);\n };\n return shapeSvg;\n}\n\nfunction subroutine(parent, bbox, node) {\n const w = bbox.width;\n const h = bbox.height;\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: 0, y: -h },\n { x: 0, y: 0 },\n { x: -8, y: 0 },\n { x: w + 8, y: 0 },\n { x: w + 8, y: -h },\n { x: -8, y: -h },\n { x: -8, y: 0 }\n ];\n const shapeSvg = insertPolygonShape(parent, w, h, points);\n node.intersect = function(point) {\n return dagreD3.intersect.polygon(node, points, point);\n };\n return shapeSvg;\n}\n\nfunction cylinder(parent, bbox, node) {\n const w = bbox.width;\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n const h = bbox.height + ry;\n\n const shape =\n 'M 0,' +\n ry +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n -w +\n ' 0 l 0,' +\n h +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 l 0,' +\n -h;\n\n const shapeSvg = parent\n .attr('label-offset-y', ry)\n .insert('path', ':first-child')\n .attr('d', shape)\n .attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');\n\n node.intersect = function(point) {\n const pos = dagreD3.intersect.rect(node, point);\n const x = pos.x - node.x;\n\n if (\n rx != 0 &&\n (Math.abs(x) < node.width / 2 ||\n (Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry))\n ) {\n // ellipsis equation: x*x / a*a + y*y / b*b = 1\n // solve for y to get adjustion value for pos.y\n let y = ry * ry * (1 - (x * x) / (rx * rx));\n if (y != 0) y = Math.sqrt(y);\n y = ry - y;\n if (point.y - node.y > 0) y = -y;\n\n pos.y += y;\n }\n\n return pos;\n };\n\n return shapeSvg;\n}\n\nexport function addToRender(render) {\n render.shapes().question = question;\n render.shapes().hexagon = hexagon;\n render.shapes().stadium = stadium;\n render.shapes().subroutine = subroutine;\n render.shapes().cylinder = cylinder;\n\n // Add custom shape for box with inverted arrow on left side\n render.shapes().rect_left_inv_arrow = rect_left_inv_arrow;\n\n // Add custom shape for box with inverted arrow on left side\n render.shapes().lean_right = lean_right;\n\n // Add custom shape for box with inverted arrow on left side\n render.shapes().lean_left = lean_left;\n\n // Add custom shape for box with inverted arrow on left side\n render.shapes().trapezoid = trapezoid;\n\n // Add custom shape for box with inverted arrow on left side\n render.shapes().inv_trapezoid = inv_trapezoid;\n\n // Add custom shape for box with inverted arrow on right side\n render.shapes().rect_right_inv_arrow = rect_right_inv_arrow;\n}\n\nexport function addToRenderV2(addShape) {\n addShape({ question });\n addShape({ hexagon });\n addShape({ stadium });\n addShape({ subroutine });\n addShape({ cylinder });\n\n // Add custom shape for box with inverted arrow on left side\n addShape({ rect_left_inv_arrow });\n\n // Add custom shape for box with inverted arrow on left side\n addShape({ lean_right });\n\n // Add custom shape for box with inverted arrow on left side\n addShape({ lean_left });\n\n // Add custom shape for box with inverted arrow on left side\n addShape({ trapezoid });\n\n // Add custom shape for box with inverted arrow on left side\n addShape({ inv_trapezoid });\n\n // Add custom shape for box with inverted arrow on right side\n addShape({ rect_right_inv_arrow });\n}\n\nfunction insertPolygonShape(parent, w, h, points) {\n return parent\n .insert('polygon', ':first-child')\n .attr(\n 'points',\n points\n .map(function(d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n )\n .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n\nexport default {\n addToRender,\n addToRenderV2\n};\n","import graphlib from 'graphlib';\nimport { select, curveLinear, selectAll } from 'd3';\n\nimport flowDb from './flowDb';\nimport flow from './parser/flow';\nimport { getConfig } from '../../config';\n\nimport dagreD3 from 'dagre-d3';\nimport addHtmlLabel from 'dagre-d3/lib/label/add-html-label.js';\nimport { log } from '../../logger';\nimport common from '../common/common';\nimport { interpolateToCurve, getStylesFromArray, configureSvgSize } from '../../utils';\nimport flowChartShapes from './flowChartShapes';\n\nconst conf = {};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n for (let i = 0; i < keys.length; i++) {\n conf[keys[i]] = cnf[keys[i]];\n }\n};\n\n/**\n * Function that adds the vertices found in the graph definition to the graph to be rendered.\n * @param vert Object containing the vertices.\n * @param g The graph that is to be drawn.\n */\nexport const addVertices = function(vert, g, svgId) {\n const svg = select(`[id=\"${svgId}\"]`);\n const keys = Object.keys(vert);\n\n // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition\n keys.forEach(function(id) {\n const vertex = vert[id];\n\n /**\n * Variable for storing the classes for the vertex\n * @type {string}\n */\n let classStr = 'default';\n if (vertex.classes.length > 0) {\n classStr = vertex.classes.join(' ');\n }\n\n const styles = getStylesFromArray(vertex.styles);\n\n // Use vertex id as text in the box if no text is provided by the graph definition\n let vertexText = vertex.text !== undefined ? vertex.text : vertex.id;\n\n // We create a SVG label, either by delegating to addHtmlLabel or manually\n let vertexNode;\n if (getConfig().flowchart.htmlLabels) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n const node = {\n label: vertexText.replace(\n /fa[lrsb]?:fa-[\\w-]+/g,\n s => ``\n )\n };\n vertexNode = addHtmlLabel(svg, node).node();\n vertexNode.parentNode.removeChild(vertexNode);\n } else {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));\n\n const rows = vertexText.split(common.lineBreakRegex);\n\n for (let j = 0; j < rows.length; j++) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '1');\n tspan.textContent = rows[j];\n svgLabel.appendChild(tspan);\n }\n vertexNode = svgLabel;\n }\n\n let radious = 0;\n let _shape = '';\n // Set the shape based parameters\n switch (vertex.type) {\n case 'round':\n radious = 5;\n _shape = 'rect';\n break;\n case 'square':\n _shape = 'rect';\n break;\n case 'diamond':\n _shape = 'question';\n break;\n case 'hexagon':\n _shape = 'hexagon';\n break;\n case 'odd':\n _shape = 'rect_left_inv_arrow';\n break;\n case 'lean_right':\n _shape = 'lean_right';\n break;\n case 'lean_left':\n _shape = 'lean_left';\n break;\n case 'trapezoid':\n _shape = 'trapezoid';\n break;\n case 'inv_trapezoid':\n _shape = 'inv_trapezoid';\n break;\n case 'odd_right':\n _shape = 'rect_left_inv_arrow';\n break;\n case 'circle':\n _shape = 'circle';\n break;\n case 'ellipse':\n _shape = 'ellipse';\n break;\n case 'stadium':\n _shape = 'stadium';\n break;\n case 'subroutine':\n _shape = 'subroutine';\n break;\n case 'cylinder':\n _shape = 'cylinder';\n break;\n case 'group':\n _shape = 'rect';\n break;\n default:\n _shape = 'rect';\n }\n // Add the node\n log.warn('Adding node', vertex.id, vertex.domId);\n g.setNode(flowDb.lookUpDomId(vertex.id), {\n labelType: 'svg',\n labelStyle: styles.labelStyle,\n shape: _shape,\n label: vertexNode,\n rx: radious,\n ry: radious,\n class: classStr,\n style: styles.style,\n id: flowDb.lookUpDomId(vertex.id)\n });\n });\n};\n\n/**\n * Add edges to graph based on parsed graph defninition\n * @param {Object} edges The edges to add to the graph\n * @param {Object} g The graph object\n */\nexport const addEdges = function(edges, g) {\n let cnt = 0;\n\n let defaultStyle;\n let defaultLabelStyle;\n\n if (typeof edges.defaultStyle !== 'undefined') {\n const defaultStyles = getStylesFromArray(edges.defaultStyle);\n defaultStyle = defaultStyles.style;\n defaultLabelStyle = defaultStyles.labelStyle;\n }\n\n edges.forEach(function(edge) {\n cnt++;\n\n // Identify Link\n var linkId = 'L-' + edge.start + '-' + edge.end;\n var linkNameStart = 'LS-' + edge.start;\n var linkNameEnd = 'LE-' + edge.end;\n\n const edgeData = {};\n\n // Set link type for rendering\n if (edge.type === 'arrow_open') {\n edgeData.arrowhead = 'none';\n } else {\n edgeData.arrowhead = 'normal';\n }\n\n let style = '';\n let labelStyle = '';\n\n if (typeof edge.style !== 'undefined') {\n const styles = getStylesFromArray(edge.style);\n style = styles.style;\n labelStyle = styles.labelStyle;\n } else {\n switch (edge.stroke) {\n case 'normal':\n style = 'fill:none';\n if (typeof defaultStyle !== 'undefined') {\n style = defaultStyle;\n }\n if (typeof defaultLabelStyle !== 'undefined') {\n labelStyle = defaultLabelStyle;\n }\n break;\n case 'dotted':\n style = 'fill:none;stroke-width:2px;stroke-dasharray:3;';\n break;\n case 'thick':\n style = ' stroke-width: 3.5px;fill:none';\n break;\n }\n }\n\n edgeData.style = style;\n edgeData.labelStyle = labelStyle;\n\n if (typeof edge.interpolate !== 'undefined') {\n edgeData.curve = interpolateToCurve(edge.interpolate, curveLinear);\n } else if (typeof edges.defaultInterpolate !== 'undefined') {\n edgeData.curve = interpolateToCurve(edges.defaultInterpolate, curveLinear);\n } else {\n edgeData.curve = interpolateToCurve(conf.curve, curveLinear);\n }\n\n if (typeof edge.text === 'undefined') {\n if (typeof edge.style !== 'undefined') {\n edgeData.arrowheadStyle = 'fill: #333';\n }\n } else {\n edgeData.arrowheadStyle = 'fill: #333';\n edgeData.labelpos = 'c';\n\n if (getConfig().flowchart.htmlLabels) {\n edgeData.labelType = 'html';\n edgeData.label = `${edge.text.replace(\n /fa[lrsb]?:fa-[\\w-]+/g,\n s => ``\n )}`;\n } else {\n edgeData.labelType = 'text';\n edgeData.label = edge.text.replace(common.lineBreakRegex, '\\n');\n\n if (typeof edge.style === 'undefined') {\n edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';\n }\n\n edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');\n }\n }\n\n edgeData.id = linkId;\n edgeData.class = linkNameStart + ' ' + linkNameEnd;\n edgeData.minlen = edge.length || 1;\n\n // Add the edge to the graph\n g.setEdge(flowDb.lookUpDomId(edge.start), flowDb.lookUpDomId(edge.end), edgeData, cnt);\n });\n};\n\n/**\n * Returns the all the styles from classDef statements in the graph definition.\n * @returns {object} classDef styles\n */\nexport const getClasses = function(text) {\n log.info('Extracting classes');\n flowDb.clear();\n try {\n const parser = flow.parser;\n parser.yy = flowDb;\n\n // Parse the graph definition\n parser.parse(text);\n return flowDb.getClasses();\n } catch (e) {\n return;\n }\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = function(text, id) {\n log.info('Drawing flowchart');\n flowDb.clear();\n flowDb.setGen('gen-1');\n const parser = flow.parser;\n parser.yy = flowDb;\n\n // Parse the graph definition\n // try {\n parser.parse(text);\n // } catch (err) {\n // log.debug('Parsing failed');\n // }\n\n // Fetch the default direction, use TD if none was found\n let dir = flowDb.getDirection();\n if (typeof dir === 'undefined') {\n dir = 'TD';\n }\n\n const conf = getConfig().flowchart;\n const nodeSpacing = conf.nodeSpacing || 50;\n const rankSpacing = conf.rankSpacing || 50;\n\n // Create the input mermaid.graph\n const g = new graphlib.Graph({\n multigraph: true,\n compound: true\n })\n .setGraph({\n rankdir: dir,\n nodesep: nodeSpacing,\n ranksep: rankSpacing,\n marginx: 8,\n marginy: 8\n })\n .setDefaultEdgeLabel(function() {\n return {};\n });\n\n let subG;\n const subGraphs = flowDb.getSubGraphs();\n for (let i = subGraphs.length - 1; i >= 0; i--) {\n subG = subGraphs[i];\n flowDb.addVertex(subG.id, subG.title, 'group', undefined, subG.classes);\n }\n\n // Fetch the verices/nodes and edges/links from the parsed graph definition\n const vert = flowDb.getVertices();\n log.warn('Get vertices', vert);\n\n const edges = flowDb.getEdges();\n\n let i = 0;\n for (i = subGraphs.length - 1; i >= 0; i--) {\n subG = subGraphs[i];\n\n selectAll('cluster').append('text');\n\n for (let j = 0; j < subG.nodes.length; j++) {\n log.warn(\n 'Setting subgraph',\n subG.nodes[j],\n flowDb.lookUpDomId(subG.nodes[j]),\n flowDb.lookUpDomId(subG.id)\n );\n g.setParent(flowDb.lookUpDomId(subG.nodes[j]), flowDb.lookUpDomId(subG.id));\n }\n }\n addVertices(vert, g, id);\n addEdges(edges, g);\n\n // Create the renderer\n const Render = dagreD3.render;\n const render = new Render();\n\n // Add custom shapes\n flowChartShapes.addToRender(render);\n\n // Add our custom arrow - an empty arrowhead\n render.arrows().none = function normal(parent, id, edge, type) {\n const marker = parent\n .append('marker')\n .attr('id', id)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerUnits', 'strokeWidth')\n .attr('markerWidth', 8)\n .attr('markerHeight', 6)\n .attr('orient', 'auto');\n\n const path = marker.append('path').attr('d', 'M 0 0 L 0 0 L 0 0 z');\n dagreD3.util.applyStyle(path, edge[type + 'Style']);\n };\n\n // Override normal arrowhead defined in d3. Remove style & add class to allow css styling.\n render.arrows().normal = function normal(parent, id) {\n const marker = parent\n .append('marker')\n .attr('id', id)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerUnits', 'strokeWidth')\n .attr('markerWidth', 8)\n .attr('markerHeight', 6)\n .attr('orient', 'auto');\n\n marker\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('class', 'arrowheadPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n };\n\n // Set up an SVG group so that we can translate the final graph.\n const svg = select(`[id=\"${id}\"]`);\n svg.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n log.warn(g);\n\n // Run the renderer. This is what draws the final graph.\n const element = select('#' + id + ' g');\n render(element, g);\n\n element.selectAll('g.node').attr('title', function() {\n return flowDb.getTooltip(this.id);\n });\n\n const padding = conf.diagramPadding;\n const svgBounds = svg.node().getBBox();\n const width = svgBounds.width + padding * 2;\n const height = svgBounds.height + padding * 2;\n\n configureSvgSize(svg, height, width, conf.useMaxWidth);\n\n // Ensure the viewBox includes the whole svgBounds area with extra space for padding\n const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`;\n log.debug(`viewBox ${vBox}`);\n svg.attr('viewBox', vBox);\n\n // Index nodes\n flowDb.indexNodes('subGraph' + i);\n\n // reposition labels\n for (i = 0; i < subGraphs.length; i++) {\n subG = subGraphs[i];\n if (subG.title !== 'undefined') {\n const clusterRects = document.querySelectorAll(\n '#' + id + ' [id=\"' + flowDb.lookUpDomId(subG.id) + '\"] rect'\n );\n const clusterEl = document.querySelectorAll(\n '#' + id + ' [id=\"' + flowDb.lookUpDomId(subG.id) + '\"]'\n );\n\n const xPos = clusterRects[0].x.baseVal.value;\n const yPos = clusterRects[0].y.baseVal.value;\n const width = clusterRects[0].width.baseVal.value;\n const cluster = select(clusterEl[0]);\n const te = cluster.select('.label');\n te.attr('transform', `translate(${xPos + width / 2}, ${yPos + 14})`);\n te.attr('id', id + 'Text');\n\n for (let j = 0; j < subG.classes.length; j++) {\n clusterEl[0].classList.add(subG.classes[j]);\n }\n }\n }\n\n // Add label rects for non html labels\n if (!conf.htmlLabels || true) { // eslint-disable-line\n const labels = document.querySelectorAll('[id=\"' + id + '\"] .edgeLabel .label');\n for (let k = 0; k < labels.length; k++) {\n const label = labels[k];\n\n // Get dimensions of label\n const dim = label.getBBox();\n\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('rx', 0);\n rect.setAttribute('ry', 0);\n rect.setAttribute('width', dim.width);\n rect.setAttribute('height', dim.height);\n // rect.setAttribute('style', 'fill:#e8e8e8;');\n\n label.insertBefore(rect, label.firstChild);\n }\n }\n\n // If node has a link, wrap it in an anchor SVG object.\n const keys = Object.keys(vert);\n keys.forEach(function(key) {\n const vertex = vert[key];\n\n if (vertex.link) {\n const node = select('#' + id + ' [id=\"' + flowDb.lookUpDomId(key) + '\"]');\n if (node) {\n const link = document.createElementNS('http://www.w3.org/2000/svg', 'a');\n link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));\n link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);\n link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');\n if (vertex.linkTarget) {\n link.setAttributeNS('http://www.w3.org/2000/svg', 'target', vertex.linkTarget);\n }\n\n const linkNode = node.insert(function() {\n return link;\n }, ':first-child');\n\n const shape = node.select('.label-container');\n if (shape) {\n linkNode.append(function() {\n return shape.node();\n });\n }\n\n const label = node.select('.label');\n if (label) {\n linkNode.append(function() {\n return label.node();\n });\n }\n }\n }\n });\n};\n\nexport default {\n setConf,\n addVertices,\n addEdges,\n getClasses,\n draw\n};\n","/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n */\n\nimport { log } from '../logger';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n markerArray.forEach(markerName => {\n markers[markerName](elem, type, id);\n });\n};\n\nconst extension = (elem, type, id) => {\n log.trace('Making markers for ', id);\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-extensionStart')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-extensionEnd')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n};\n\nconst composition = (elem, type) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-compositionStart')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-compositionEnd')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-aggregationStart')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-aggregationEnd')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-dependencyStart')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-dependencyEnd')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst point = (elem, type) => {\n elem\n .append('marker')\n .attr('id', type + '-pointEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', type + '-pointStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 0)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type) => {\n elem\n .append('marker')\n .attr('id', type + '-circleEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 11)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', type + '-circleStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', -1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type) => {\n elem\n .append('marker')\n .attr('id', type + '-crossEnd')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', 12)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', type + '-crossStart')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', -1)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', type + '-barbEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'strokeWidth')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semanitc free\nconst markers = {\n extension,\n composition,\n aggregation,\n dependency,\n point,\n circle,\n cross,\n barb\n};\nexport default insertMarkers;\n","import { select } from 'd3';\nimport { log } from '../logger'; // eslint-disable-line\n// let vertexNode;\n// if (getConfig().flowchart.htmlLabels) {\n// // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n// const node = {\n// label: vertexText.replace(/fa[lrsb]?:fa-[\\w-]+/g, s => ``)\n// };\n// vertexNode = addHtmlLabel(svg, node).node();\n// vertexNode.parentNode.removeChild(vertexNode);\n// } else {\n// const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n// svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));\n\n// const rows = vertexText.split(common.lineBreakRegex);\n\n// for (let j = 0; j < rows.length; j++) {\n// const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n// tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n// tspan.setAttribute('dy', '1em');\n// tspan.setAttribute('x', '1');\n// tspan.textContent = rows[j];\n// svgLabel.appendChild(tspan);\n// }\n// vertexNode = svgLabel;\n// }\nimport { getConfig } from '../config';\n\nfunction applyStyle(dom, styleFn) {\n if (styleFn) {\n dom.attr('style', styleFn);\n }\n}\n\nfunction addHtmlLabel(node) {\n // var fo = root.append('foreignObject').attr('width', '100000');\n\n // var div = fo.append('xhtml:div');\n // div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n\n // var label = node.label;\n // switch (typeof label) {\n // case 'function':\n // div.insert(label);\n // break;\n // case 'object':\n // // Currently we assume this is a DOM object.\n // div.insert(function() {\n // return label;\n // });\n // break;\n // default:\n // div.html(label);\n // }\n\n // applyStyle(div, node.labelStyle);\n // div.style('display', 'inline-block');\n // // Fix for firefox\n // div.style('white-space', 'nowrap');\n\n // var client = div.node().getBoundingClientRect();\n // fo.attr('width', client.width).attr('height', client.height);\n const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));\n const div = fo.append('xhtml:div');\n\n const label = node.label;\n const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';\n div.html(\n '' +\n label +\n ''\n );\n\n applyStyle(div, node.labelStyle);\n div.style('display', 'inline-block');\n // Fix for firefox\n div.style('white-space', 'nowrap');\n div.attr('xmlns', 'http://www.w3.org/1999/xhtml');\n return fo.node();\n}\n\nconst createLabel = (_vertexText, style, isTitle, isNode) => {\n let vertexText = _vertexText || '';\n if (getConfig().flowchart.htmlLabels) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n vertexText = vertexText.replace(/\\\\n|\\n/g, '
        ');\n log.info('vertexText' + vertexText);\n const node = {\n isNode,\n label: vertexText.replace(\n /fa[lrsb]?:fa-[\\w-]+/g,\n s => ``\n ),\n labelStyle: style.replace('fill:', 'color:')\n };\n let vertexNode = addHtmlLabel(node);\n // vertexNode.parentNode.removeChild(vertexNode);\n return vertexNode;\n } else {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('style', style.replace('color:', 'fill:'));\n let rows = [];\n if (typeof vertexText === 'string') {\n rows = vertexText.split(/\\\\n|\\n|/gi);\n } else if (Array.isArray(vertexText)) {\n rows = vertexText;\n } else {\n rows = [];\n }\n\n for (let j = 0; j < rows.length; j++) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '0');\n if (isTitle) {\n tspan.setAttribute('class', 'title-row');\n } else {\n tspan.setAttribute('class', 'row');\n }\n tspan.textContent = rows[j].trim();\n svgLabel.appendChild(tspan);\n }\n return svgLabel;\n }\n};\n\nexport default createLabel;\n","import createLabel from '../createLabel';\nimport { getConfig } from '../../config';\nimport { select } from 'd3';\nexport const labelHelper = (parent, node, _classes, isNode) => {\n let classes;\n if (!_classes) {\n classes = 'node default';\n } else {\n classes = _classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the label and insert it after the rect\n const label = shapeSvg\n .insert('g')\n .attr('class', 'label')\n .attr('style', node.labelStyle);\n\n const text = label\n .node()\n .appendChild(createLabel(node.labelText, node.labelStyle, false, isNode));\n\n // Get the size of the label\n let bbox = text.getBBox();\n\n if (getConfig().flowchart.htmlLabels) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n const halfPadding = node.padding / 2;\n\n // Center the label\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n return { shapeSvg, bbox, halfPadding, label };\n};\n\nexport const updateNodeBounds = (node, element) => {\n const bbox = element.node().getBBox();\n node.width = bbox.width;\n node.height = bbox.height;\n};\n\nexport function insertPolygonShape(parent, w, h, points) {\n return parent\n .insert('polygon', ':first-child')\n .attr(\n 'points',\n points\n .map(function(d) {\n return d.x + ',' + d.y;\n })\n .join(' ')\n )\n .attr('class', 'label-container')\n .attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');\n}\n","/**\n * Decorates with functions required by mermaids dagre-wrapper.\n */\nimport { log } from '../logger';\nimport graphlib from 'graphlib';\n\nexport let clusterDb = {};\nlet decendants = {};\nlet parents = {};\n\nexport const clear = () => {\n decendants = {};\n parents = {};\n clusterDb = {};\n};\n\nconst isDecendant = (id, ancenstorId) => {\n // if (id === ancenstorId) return true;\n\n log.debug(\n 'In isDecendant',\n ancenstorId,\n ' ',\n id,\n ' = ',\n decendants[ancenstorId].indexOf(id) >= 0\n );\n if (decendants[ancenstorId].indexOf(id) >= 0) return true;\n\n return false;\n};\n\nconst edgeInCluster = (edge, clusterId) => {\n log.info('Decendants of ', clusterId, ' is ', decendants[clusterId]);\n log.info('Edge is ', edge);\n // Edges to/from the cluster is not in the cluster, they are in the parent\n if (edge.v === clusterId) return false;\n if (edge.w === clusterId) return false;\n\n if (!decendants[clusterId]) {\n log.debug('Tilt, ', clusterId, ',not in decendants');\n return false;\n }\n log.info('Here ');\n\n if (decendants[clusterId].indexOf(edge.v) >= 0) return true;\n if (isDecendant(edge.v, clusterId)) return true;\n if (isDecendant(edge.w, clusterId)) return true;\n if (decendants[clusterId].indexOf(edge.w) >= 0) return true;\n\n return false;\n};\n\nconst copy = (clusterId, graph, newGraph, rootId) => {\n log.warn(\n 'Copying children of ',\n clusterId,\n 'root',\n rootId,\n 'data',\n graph.node(clusterId),\n rootId\n );\n const nodes = graph.children(clusterId) || [];\n\n // Include cluster node if it is not the root\n if (clusterId !== rootId) {\n nodes.push(clusterId);\n }\n\n log.warn('Copying (nodes) clusterId', clusterId, 'nodes', nodes);\n\n nodes.forEach(node => {\n if (graph.children(node).length > 0) {\n copy(node, graph, newGraph, rootId);\n } else {\n const data = graph.node(node);\n log.info('cp ', node, ' to ', rootId, ' with parent ', clusterId); //,node, data, ' parent is ', clusterId);\n newGraph.setNode(node, data);\n if (rootId !== graph.parent(node)) {\n log.warn('Setting parent', node, graph.parent(node));\n newGraph.setParent(node, graph.parent(node));\n }\n\n if (clusterId !== rootId && node !== clusterId) {\n log.debug('Setting parent', node, clusterId);\n newGraph.setParent(node, clusterId);\n } else {\n log.info('In copy ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);\n log.debug(\n 'Not Setting parent for node=',\n node,\n 'cluster!==rootId',\n clusterId !== rootId,\n 'node!==clusterId',\n node !== clusterId\n );\n }\n const edges = graph.edges(node);\n log.debug('Copying Edges', edges);\n edges.forEach(edge => {\n log.info('Edge', edge);\n const data = graph.edge(edge.v, edge.w, edge.name);\n log.info('Edge data', data, rootId);\n try {\n // Do not copy edges in and out of the root cluster, they belong to the parent graph\n if (edgeInCluster(edge, rootId)) {\n log.info('Copying as ', edge.v, edge.w, data, edge.name);\n newGraph.setEdge(edge.v, edge.w, data, edge.name);\n log.info('newGraph edges ', newGraph.edges(), newGraph.edge(newGraph.edges()[0]));\n } else {\n log.info(\n 'Skipping copy of edge ',\n edge.v,\n '-->',\n edge.w,\n ' rootId: ',\n rootId,\n ' clusterId:',\n clusterId\n );\n }\n } catch (e) {\n log.error(e);\n }\n });\n }\n log.debug('Removing node', node);\n graph.removeNode(node);\n });\n};\nexport const extractDecendants = (id, graph) => {\n // log.debug('Extracting ', id);\n const children = graph.children(id);\n let res = [].concat(children);\n\n for (let i = 0; i < children.length; i++) {\n parents[children[i]] = id;\n res = res.concat(extractDecendants(children[i], graph));\n }\n\n return res;\n};\n\n/**\n * Validates the graph, checking that all parent child relation points to existing nodes and that\n * edges between nodes also ia correct. When not correct the function logs the discrepancies.\n * @param {graphlib graph} g\n */\nexport const validate = graph => {\n const edges = graph.edges();\n log.trace('Edges: ', edges);\n for (let i = 0; i < edges.length; i++) {\n if (graph.children(edges[i].v).length > 0) {\n log.trace('The node ', edges[i].v, ' is part of and edge even though it has children');\n return false;\n }\n if (graph.children(edges[i].w).length > 0) {\n log.trace('The node ', edges[i].w, ' is part of and edge even though it has children');\n return false;\n }\n }\n return true;\n};\n\n/**\n * Finds a child that is not a cluster. When faking a edge between a node and a cluster.\n * @param {Finds a } id\n * @param {*} graph\n */\nexport const findNonClusterChild = (id, graph) => {\n // const node = graph.node(id);\n log.trace('Searching', id);\n // const children = graph.children(id).reverse();\n const children = graph.children(id); //.reverse();\n log.trace('Searching children of id ', id, children);\n if (children.length < 1) {\n log.trace('This is a valid node', id);\n return id;\n }\n for (let i = 0; i < children.length; i++) {\n const _id = findNonClusterChild(children[i], graph);\n if (_id) {\n log.trace('Found replacement for', id, ' => ', _id);\n return _id;\n }\n }\n};\n\nconst getAnchorId = id => {\n if (!clusterDb[id]) {\n return id;\n }\n // If the cluster has no external connections\n if (!clusterDb[id].externalConnections) {\n return id;\n }\n\n // Return the replacement node\n if (clusterDb[id]) {\n return clusterDb[id].id;\n }\n return id;\n};\n\nexport const adjustClustersAndEdges = (graph, depth) => {\n if (!graph || depth > 10) {\n log.debug('Opting out, no graph ');\n return;\n } else {\n log.debug('Opting in, graph ');\n }\n // Go through the nodes and for each cluster found, save a replacment node, this can be used when\n // faking a link to a cluster\n graph.nodes().forEach(function(id) {\n const children = graph.children(id);\n if (children.length > 0) {\n log.warn(\n 'Cluster identified',\n id,\n ' Replacement id in edges: ',\n findNonClusterChild(id, graph)\n );\n decendants[id] = extractDecendants(id, graph);\n clusterDb[id] = { id: findNonClusterChild(id, graph), clusterData: graph.node(id) };\n }\n });\n\n // Check incoming and outgoing edges for each cluster\n graph.nodes().forEach(function(id) {\n const children = graph.children(id);\n const edges = graph.edges();\n if (children.length > 0) {\n log.debug('Cluster identified', id, decendants);\n edges.forEach(edge => {\n // log.debug('Edge, decendants: ', edge, decendants[id]);\n\n // Check if any edge leaves the cluster (not the actual cluster, thats a link from the box)\n if (edge.v !== id && edge.w !== id) {\n // Any edge where either the one of the nodes is decending to the cluster but not the other\n // if (decendants[id].indexOf(edge.v) < 0 && decendants[id].indexOf(edge.w) < 0) {\n\n const d1 = isDecendant(edge.v, id);\n const d2 = isDecendant(edge.w, id);\n\n // d1 xor d2 - if either d1 is true and d2 is false or the other way around\n if (d1 ^ d2) {\n log.warn('Edge: ', edge, ' leaves cluster ', id);\n log.warn('Decendants of XXX ', id, ': ', decendants[id]);\n clusterDb[id].externalConnections = true;\n }\n }\n });\n } else {\n log.debug('Not a cluster ', id, decendants);\n }\n });\n\n // For clusters with incoming and/or outgoing edges translate those edges to a real node\n // in the cluster inorder to fake the edge\n graph.edges().forEach(function(e) {\n const edge = graph.edge(e);\n log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n\n let v = e.v;\n let w = e.w;\n // Check if link is either from or to a cluster\n log.warn(\n 'Fix XXX',\n clusterDb,\n 'ids:',\n e.v,\n e.w,\n 'Translateing: ',\n clusterDb[e.v],\n ' --- ',\n clusterDb[e.w]\n );\n if (clusterDb[e.v] || clusterDb[e.w]) {\n log.warn('Fixing and trixing - removing XXX', e.v, e.w, e.name);\n v = getAnchorId(e.v);\n w = getAnchorId(e.w);\n graph.removeEdge(e.v, e.w, e.name);\n if (v !== e.v) edge.fromCluster = e.v;\n if (w !== e.w) edge.toCluster = e.w;\n log.warn('Fix Replacing with XXX', v, w, e.name);\n graph.setEdge(v, w, edge, e.name);\n }\n });\n log.warn('Adjusted Graph', graphlib.json.write(graph));\n extractor(graph, 0);\n\n log.trace(clusterDb);\n\n // Remove references to extracted cluster\n // graph.edges().forEach(edge => {\n // if (isDecendant(edge.v, clusterId) || isDecendant(edge.w, clusterId)) {\n // graph.removeEdge(edge);\n // }\n // });\n};\n\nexport const extractor = (graph, depth) => {\n log.warn('extractor - ', depth, graphlib.json.write(graph), graph.children('D'));\n if (depth > 10) {\n log.error('Bailing out');\n return;\n }\n // For clusters without incoming and/or outgoing edges, create a new cluster-node\n // containing the nodes and edges in the custer in a new graph\n // for (let i = 0;)\n let nodes = graph.nodes();\n let hasChildren = false;\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const children = graph.children(node);\n hasChildren = hasChildren || children.length > 0;\n }\n\n if (!hasChildren) {\n log.debug('Done, no node has children', graph.nodes());\n return;\n }\n // const clusters = Object.keys(clusterDb);\n // clusters.forEach(clusterId => {\n log.debug('Nodes = ', nodes, depth);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n log.debug(\n 'Extracting node',\n node,\n clusterDb,\n clusterDb[node] && !clusterDb[node].externalConnections,\n !graph.parent(node),\n graph.node(node),\n graph.children('D'),\n ' Depth ',\n depth\n );\n // Note that the node might have been removed after the Object.keys call so better check\n // that it still is in the game\n if (!clusterDb[node]) {\n // Skip if the node is not a cluster\n log.debug('Not a cluster', node, depth);\n // break;\n } else if (\n !clusterDb[node].externalConnections &&\n // !graph.parent(node) &&\n graph.children(node) &&\n graph.children(node).length > 0\n ) {\n log.warn(\n 'Cluster without external connections, without a parent and with children',\n node,\n depth\n );\n\n const graphSettings = graph.graph();\n\n const clusterGraph = new graphlib.Graph({\n multigraph: true,\n compound: true\n })\n .setGraph({\n rankdir: graphSettings.rankdir === 'TB' ? 'LR' : 'TB',\n // Todo: set proper spacing\n nodesep: 50,\n ranksep: 50,\n marginx: 8,\n marginy: 8\n })\n .setDefaultEdgeLabel(function() {\n return {};\n });\n\n log.warn('Old graph before copy', graphlib.json.write(graph));\n copy(node, graph, clusterGraph, node);\n graph.setNode(node, {\n clusterNode: true,\n id: node,\n clusterData: clusterDb[node].clusterData,\n labelText: clusterDb[node].labelText,\n graph: clusterGraph\n });\n log.warn('New graph after copy node: (', node, ')', graphlib.json.write(clusterGraph));\n log.debug('Old graph after copy', graphlib.json.write(graph));\n } else {\n log.warn(\n 'Cluster ** ',\n node,\n ' **not meeting the criteria !externalConnections:',\n !clusterDb[node].externalConnections,\n ' no parent: ',\n !graph.parent(node),\n ' children ',\n graph.children(node) && graph.children(node).length > 0,\n graph.children('D'),\n depth\n );\n log.debug(clusterDb);\n }\n }\n\n nodes = graph.nodes();\n log.warn('New list of nodes', nodes);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const data = graph.node(node);\n log.warn(' Now next level', node, data);\n if (data.clusterNode) {\n extractor(data.graph, depth + 1);\n }\n }\n};\n\nconst sorter = (graph, nodes) => {\n if (nodes.length === 0) return [];\n let result = Object.assign(nodes);\n nodes.forEach(node => {\n const children = graph.children(node);\n const sorted = sorter(graph, children);\n result = result.concat(sorted);\n });\n\n return result;\n};\n\nexport const sortNodesByHierarchy = graph => sorter(graph, graph.children());\n","function intersectEllipse(node, rx, ry, point) {\n // Formulae from: http://mathworld.wolfram.com/Ellipse-LineIntersection.html\n\n var cx = node.x;\n var cy = node.y;\n\n var px = cx - point.x;\n var py = cy - point.y;\n\n var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);\n\n var dx = Math.abs((rx * ry * px) / det);\n if (point.x < cx) {\n dx = -dx;\n }\n var dy = Math.abs((rx * ry * py) / det);\n if (point.y < cy) {\n dy = -dy;\n }\n\n return { x: cx + dx, y: cy + dy };\n}\n\nexport default intersectEllipse;\n","import intersectEllipse from './intersect-ellipse';\n\nfunction intersectCircle(node, rx, point) {\n return intersectEllipse(node, rx, rx, point);\n}\n\nexport default intersectCircle;\n","/*\n * Returns the point at which two lines, p and q, intersect or returns\n * undefined if they do not intersect.\n */\nfunction intersectLine(p1, p2, q1, q2) {\n // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,\n // p7 and p473.\n\n var a1, a2, b1, b2, c1, c2;\n var r1, r2, r3, r4;\n var denom, offset, num;\n var x, y;\n\n // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +\n // b1 y + c1 = 0.\n a1 = p2.y - p1.y;\n b1 = p1.x - p2.x;\n c1 = p2.x * p1.y - p1.x * p2.y;\n\n // Compute r3 and r4.\n r3 = a1 * q1.x + b1 * q1.y + c1;\n r4 = a1 * q2.x + b1 * q2.y + c1;\n\n // Check signs of r3 and r4. If both point 3 and point 4 lie on\n // same side of line 1, the line segments do not intersect.\n if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {\n return /*DONT_INTERSECT*/;\n }\n\n // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0\n a2 = q2.y - q1.y;\n b2 = q1.x - q2.x;\n c2 = q2.x * q1.y - q1.x * q2.y;\n\n // Compute r1 and r2\n r1 = a2 * p1.x + b2 * p1.y + c2;\n r2 = a2 * p2.x + b2 * p2.y + c2;\n\n // Check signs of r1 and r2. If both point 1 and point 2 lie\n // on same side of second line segment, the line segments do\n // not intersect.\n if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {\n return /*DONT_INTERSECT*/;\n }\n\n // Line segments intersect: compute intersection point.\n denom = a1 * b2 - a2 * b1;\n if (denom === 0) {\n return /*COLLINEAR*/;\n }\n\n offset = Math.abs(denom / 2);\n\n // The denom/2 is to get rounding instead of truncating. It\n // is added or subtracted to the numerator, depending upon the\n // sign of the numerator.\n num = b1 * c2 - b2 * c1;\n x = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n num = a2 * c1 - a1 * c2;\n y = num < 0 ? (num - offset) / denom : (num + offset) / denom;\n\n return { x: x, y: y };\n}\n\nfunction sameSign(r1, r2) {\n return r1 * r2 > 0;\n}\n\nexport default intersectLine;\n","/* eslint \"no-console\": off */\n\nimport intersectLine from './intersect-line';\n\nexport default intersectPolygon;\n\n/*\n * Returns the point ({x, y}) at which the point argument intersects with the\n * node argument assuming that it has the shape specified by polygon.\n */\nfunction intersectPolygon(node, polyPoints, point) {\n var x1 = node.x;\n var y1 = node.y;\n\n var intersections = [];\n\n var minX = Number.POSITIVE_INFINITY;\n var minY = Number.POSITIVE_INFINITY;\n if (typeof polyPoints.forEach === 'function') {\n polyPoints.forEach(function(entry) {\n minX = Math.min(minX, entry.x);\n minY = Math.min(minY, entry.y);\n });\n } else {\n minX = Math.min(minX, polyPoints.x);\n minY = Math.min(minY, polyPoints.y);\n }\n\n var left = x1 - node.width / 2 - minX;\n var top = y1 - node.height / 2 - minY;\n\n for (var i = 0; i < polyPoints.length; i++) {\n var p1 = polyPoints[i];\n var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];\n var intersect = intersectLine(\n node,\n point,\n { x: left + p1.x, y: top + p1.y },\n { x: left + p2.x, y: top + p2.y }\n );\n if (intersect) {\n intersections.push(intersect);\n }\n }\n\n if (!intersections.length) {\n // console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node);\n return node;\n }\n\n if (intersections.length > 1) {\n // More intersections, find the one nearest to edge end point\n intersections.sort(function(p, q) {\n var pdx = p.x - point.x;\n var pdy = p.y - point.y;\n var distp = Math.sqrt(pdx * pdx + pdy * pdy);\n\n var qdx = q.x - point.x;\n var qdy = q.y - point.y;\n var distq = Math.sqrt(qdx * qdx + qdy * qdy);\n\n return distp < distq ? -1 : distp === distq ? 0 : 1;\n });\n }\n return intersections[0];\n}\n","const intersectRect = (node, point) => {\n var x = node.x;\n var y = node.y;\n\n // Rectangle intersection algorithm from:\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = node.width / 2;\n var h = node.height / 2;\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = dy === 0 ? 0 : (h * dx) / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = dx === 0 ? 0 : (w * dy) / dx;\n }\n\n return { x: x + sx, y: y + sy };\n};\n\nexport default intersectRect;\n","/*\n * Borrowed with love from from dagrge-d3. Many thanks to cpettitt!\n */\n\nimport node from './intersect-node.js';\nimport circle from './intersect-circle.js';\nimport ellipse from './intersect-ellipse.js';\nimport polygon from './intersect-polygon.js';\nimport rect from './intersect-rect.js';\n\nexport default {\n node,\n circle,\n ellipse,\n polygon,\n rect\n};\n","import { updateNodeBounds, labelHelper } from './util';\nimport { log } from '../../logger'; // eslint-disable-line\nimport intersect from '../intersect/index.js';\n\nconst note = (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes, true);\n\n log.info('Classes = ', node.classes);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function(point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nexport default note;\n","import { select } from 'd3';\nimport { log } from '../../logger';\nimport * as configApi from '../../config';\nimport common from '../common/common';\nimport utils from '../../utils';\nimport mermaidAPI from '../../mermaidAPI';\n\nconst MERMAID_DOM_ID_PREFIX = 'classid-';\n\nlet relations = [];\nlet classes = {};\nlet classCounter = 0;\n\nlet funs = [];\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nconst splitClassNameAndType = function(id) {\n let genericType = '';\n let className = id;\n\n if (id.indexOf('~') > 0) {\n let split = id.split('~');\n className = split[0];\n\n genericType = split[1];\n }\n\n return { className: className, type: genericType };\n};\n\n/**\n * Function called by parser when a node definition has been found.\n * @param id\n * @public\n */\nexport const addClass = function(id) {\n let classId = splitClassNameAndType(id);\n // Only add class if not exists\n if (typeof classes[classId.className] !== 'undefined') return;\n\n classes[classId.className] = {\n id: classId.className,\n type: classId.type,\n cssClasses: [],\n methods: [],\n members: [],\n annotations: [],\n domId: MERMAID_DOM_ID_PREFIX + classId.className + '-' + classCounter\n };\n\n classCounter++;\n};\n\n/**\n * Function to lookup domId from id in the graph definition.\n * @param id\n * @public\n */\nexport const lookUpDomId = function(id) {\n const classKeys = Object.keys(classes);\n for (let i = 0; i < classKeys.length; i++) {\n if (classes[classKeys[i]].id === id) {\n return classes[classKeys[i]].domId;\n }\n }\n};\n\nexport const clear = function() {\n relations = [];\n classes = {};\n funs = [];\n funs.push(setupToolTips);\n};\n\nexport const getClass = function(id) {\n return classes[id];\n};\nexport const getClasses = function() {\n return classes;\n};\n\nexport const getRelations = function() {\n return relations;\n};\n\nexport const addRelation = function(relation) {\n log.debug('Adding relation: ' + JSON.stringify(relation));\n addClass(relation.id1);\n addClass(relation.id2);\n\n relation.id1 = splitClassNameAndType(relation.id1).className;\n relation.id2 = splitClassNameAndType(relation.id2).className;\n\n relations.push(relation);\n};\n\n/**\n * Adds an annotation to the specified class\n * Annotations mark special properties of the given type (like 'interface' or 'service')\n * @param className The class name\n * @param annotation The name of the annotation without any brackets\n * @public\n */\nexport const addAnnotation = function(className, annotation) {\n const validatedClassName = splitClassNameAndType(className).className;\n classes[validatedClassName].annotations.push(annotation);\n};\n\n/**\n * Adds a member to the specified class\n * @param className The class name\n * @param member The full name of the member.\n * If the member is enclosed in <> it is treated as an annotation\n * If the member is ending with a closing bracket ) it is treated as a method\n * Otherwise the member will be treated as a normal property\n * @public\n */\nexport const addMember = function(className, member) {\n const validatedClassName = splitClassNameAndType(className).className;\n const theClass = classes[validatedClassName];\n\n if (typeof member === 'string') {\n // Member can contain white spaces, we trim them out\n const memberString = member.trim();\n\n if (memberString.startsWith('<<') && memberString.endsWith('>>')) {\n // Remove leading and trailing brackets\n theClass.annotations.push(memberString.substring(2, memberString.length - 2));\n } else if (memberString.indexOf(')') > 0) {\n theClass.methods.push(memberString);\n } else if (memberString) {\n theClass.members.push(memberString);\n }\n }\n};\n\nexport const addMembers = function(className, members) {\n if (Array.isArray(members)) {\n members.reverse();\n members.forEach(member => addMember(className, member));\n }\n};\n\nexport const cleanupLabel = function(label) {\n if (label.substring(0, 1) === ':') {\n return label.substr(1).trim();\n } else {\n return label.trim();\n }\n};\n\n/**\n * Called by parser when a special node is found, e.g. a clickable element.\n * @param ids Comma separated list of ids\n * @param className Class to add\n */\nexport const setCssClass = function(ids, className) {\n ids.split(',').forEach(function(_id) {\n let id = _id;\n if (_id[0].match(/\\d/)) id = MERMAID_DOM_ID_PREFIX + id;\n if (typeof classes[id] !== 'undefined') {\n classes[id].cssClasses.push(className);\n }\n });\n};\n\n/**\n * Called by parser when a tooltip is found, e.g. a clickable element.\n * @param ids Comma separated list of ids\n * @param tooltip Tooltip to add\n */\nconst setTooltip = function(ids, tooltip) {\n const config = configApi.getConfig();\n ids.split(',').forEach(function(id) {\n if (typeof tooltip !== 'undefined') {\n classes[id].tooltip = common.sanitizeText(tooltip, config);\n }\n });\n};\n\n/**\n * Called by parser when a link is found. Adds the URL to the vertex data.\n * @param ids Comma separated list of ids\n * @param linkStr URL to create a link for\n * @param target Target of the link, _blank by default as originally defined in the svgDraw.js file\n */\nexport const setLink = function(ids, linkStr, target) {\n const config = configApi.getConfig();\n ids.split(',').forEach(function(_id) {\n let id = _id;\n if (_id[0].match(/\\d/)) id = MERMAID_DOM_ID_PREFIX + id;\n if (typeof classes[id] !== 'undefined') {\n classes[id].link = utils.formatUrl(linkStr, config);\n if (typeof target === 'string') {\n classes[id].linkTarget = target;\n } else {\n classes[id].linkTarget = '_blank';\n }\n }\n });\n setCssClass(ids, 'clickable');\n};\n\n/**\n * Called by parser when a click definition is found. Registers an event handler.\n * @param ids Comma separated list of ids\n * @param functionName Function to be called on click\n * @param functionArgs Function args the function should be called with\n */\nexport const setClickEvent = function(ids, functionName, functionArgs) {\n ids.split(',').forEach(function(id) {\n setClickFunc(id, functionName, functionArgs);\n classes[id].haveCallback = true;\n });\n setCssClass(ids, 'clickable');\n};\n\nconst setClickFunc = function(domId, functionName, functionArgs) {\n const config = configApi.getConfig();\n let id = domId;\n let elemId = lookUpDomId(id);\n\n if (config.securityLevel !== 'loose') {\n return;\n }\n if (typeof functionName === 'undefined') {\n return;\n }\n if (typeof classes[id] !== 'undefined') {\n let argList = [];\n if (typeof functionArgs === 'string') {\n /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n /* Removes all double quotes at the start and end of an argument */\n /* This preserves all starting and ending whitespace inside */\n if (item.charAt(0) === '\"' && item.charAt(item.length - 1) === '\"') {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n\n /* if no arguments passed into callback, default to passing in id */\n if (argList.length === 0) {\n argList.push(elemId);\n }\n\n funs.push(function() {\n const elem = document.querySelector(`[id=\"${elemId}\"]`);\n if (elem !== null) {\n elem.addEventListener(\n 'click',\n function() {\n utils.runFunc(functionName, ...argList);\n },\n false\n );\n }\n });\n }\n};\n\nexport const bindFunctions = function(element) {\n funs.forEach(function(fun) {\n fun(element);\n });\n};\n\nexport const lineType = {\n LINE: 0,\n DOTTED_LINE: 1\n};\n\nexport const relationType = {\n AGGREGATION: 0,\n EXTENSION: 1,\n COMPOSITION: 2,\n DEPENDENCY: 3\n};\n\nconst setupToolTips = function(element) {\n let tooltipElem = select('.mermaidTooltip');\n if ((tooltipElem._groups || tooltipElem)[0][0] === null) {\n tooltipElem = select('body')\n .append('div')\n .attr('class', 'mermaidTooltip')\n .style('opacity', 0);\n }\n\n const svg = select(element).select('svg');\n\n const nodes = svg.selectAll('g.node');\n nodes\n .on('mouseover', function() {\n const el = select(this);\n const title = el.attr('title');\n // Dont try to draw a tooltip if no data is provided\n if (title === null) {\n return;\n }\n const rect = this.getBoundingClientRect();\n\n tooltipElem\n .transition()\n .duration(200)\n .style('opacity', '.9');\n tooltipElem\n .html(el.attr('title'))\n .style('left', window.scrollX + rect.left + (rect.right - rect.left) / 2 + 'px')\n .style('top', window.scrollY + rect.top - 14 + document.body.scrollTop + 'px');\n el.classed('hover', true);\n })\n .on('mouseout', function() {\n tooltipElem\n .transition()\n .duration(500)\n .style('opacity', 0);\n const el = select(this);\n el.classed('hover', false);\n });\n};\nfuns.push(setupToolTips);\n\nexport default {\n parseDirective,\n getConfig: () => configApi.getConfig().class,\n addClass,\n bindFunctions,\n clear,\n getClass,\n getClasses,\n addAnnotation,\n getRelations,\n addRelation,\n addMember,\n addMembers,\n cleanupLabel,\n lineType,\n relationType,\n setClickEvent,\n setCssClass,\n setLink,\n setTooltip,\n lookUpDomId\n};\n","import { line, curveBasis } from 'd3';\nimport { lookUpDomId, relationType } from './classDb';\nimport utils from '../../utils';\nimport { log } from '../../logger';\n\nlet edgeCount = 0;\nexport const drawEdge = function(elem, path, relation, conf) {\n const getRelationType = function(type) {\n switch (type) {\n case relationType.AGGREGATION:\n return 'aggregation';\n case relationType.EXTENSION:\n return 'extension';\n case relationType.COMPOSITION:\n return 'composition';\n case relationType.DEPENDENCY:\n return 'dependency';\n }\n };\n\n path.points = path.points.filter(p => !Number.isNaN(p.y));\n\n // The data for our line\n const lineData = path.points;\n\n // This is the accessor function we talked about above\n const lineFunction = line()\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n })\n .curve(curveBasis);\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', 'edge' + edgeCount)\n .attr('class', 'relation');\n let url = '';\n if (conf.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(');\n url = url.replace(/\\)/g, '\\\\)');\n }\n\n if (relation.relation.lineType == 1) {\n svgPath.attr('class', 'relation dashed-line');\n }\n if (relation.relation.type1 !== 'none') {\n svgPath.attr(\n 'marker-start',\n 'url(' + url + '#' + getRelationType(relation.relation.type1) + 'Start' + ')'\n );\n }\n if (relation.relation.type2 !== 'none') {\n svgPath.attr(\n 'marker-end',\n 'url(' + url + '#' + getRelationType(relation.relation.type2) + 'End' + ')'\n );\n }\n\n let x, y;\n const l = path.points.length;\n // Calculate Label position\n let labelPosition = utils.calcLabelPosition(path.points);\n x = labelPosition.x;\n y = labelPosition.y;\n\n let p1_card_x, p1_card_y;\n let p2_card_x, p2_card_y;\n\n if (l % 2 !== 0 && l > 1) {\n let cardinality_1_point = utils.calcCardinalityPosition(\n relation.relation.type1 !== 'none',\n path.points,\n path.points[0]\n );\n let cardinality_2_point = utils.calcCardinalityPosition(\n relation.relation.type2 !== 'none',\n path.points,\n path.points[l - 1]\n );\n\n log.debug('cardinality_1_point ' + JSON.stringify(cardinality_1_point));\n log.debug('cardinality_2_point ' + JSON.stringify(cardinality_2_point));\n\n p1_card_x = cardinality_1_point.x;\n p1_card_y = cardinality_1_point.y;\n p2_card_x = cardinality_2_point.x;\n p2_card_y = cardinality_2_point.y;\n }\n\n if (typeof relation.title !== 'undefined') {\n const g = elem.append('g').attr('class', 'classLabel');\n const label = g\n .append('text')\n .attr('class', 'label')\n .attr('x', x)\n .attr('y', y)\n .attr('fill', 'red')\n .attr('text-anchor', 'middle')\n .text(relation.title);\n\n window.label = label;\n const bounds = label.node().getBBox();\n\n g.insert('rect', ':first-child')\n .attr('class', 'box')\n .attr('x', bounds.x - conf.padding / 2)\n .attr('y', bounds.y - conf.padding / 2)\n .attr('width', bounds.width + conf.padding)\n .attr('height', bounds.height + conf.padding);\n }\n\n log.info('Rendering relation ' + JSON.stringify(relation));\n if (typeof relation.relationTitle1 !== 'undefined' && relation.relationTitle1 !== 'none') {\n const g = elem.append('g').attr('class', 'cardinality');\n g.append('text')\n .attr('class', 'type1')\n .attr('x', p1_card_x)\n .attr('y', p1_card_y)\n .attr('fill', 'black')\n .attr('font-size', '6')\n .text(relation.relationTitle1);\n }\n if (typeof relation.relationTitle2 !== 'undefined' && relation.relationTitle2 !== 'none') {\n const g = elem.append('g').attr('class', 'cardinality');\n g.append('text')\n .attr('class', 'type2')\n .attr('x', p2_card_x)\n .attr('y', p2_card_y)\n .attr('fill', 'black')\n .attr('font-size', '6')\n .text(relation.relationTitle2);\n }\n\n edgeCount++;\n};\n\nexport const drawClass = function(elem, classDef, conf) {\n log.info('Rendering class ' + classDef);\n\n const id = classDef.id;\n const classInfo = {\n id: id,\n label: classDef.id,\n width: 0,\n height: 0\n };\n\n // add class group\n const g = elem\n .append('g')\n .attr('id', lookUpDomId(id))\n .attr('class', 'classGroup');\n\n // add title\n let title;\n if (classDef.link) {\n title = g\n .append('svg:a')\n .attr('xlink:href', classDef.link)\n .attr('target', classDef.linkTarget)\n .append('text')\n .attr('y', conf.textHeight + conf.padding)\n .attr('x', 0);\n } else {\n title = g\n .append('text')\n .attr('y', conf.textHeight + conf.padding)\n .attr('x', 0);\n }\n\n // add annotations\n let isFirst = true;\n classDef.annotations.forEach(function(member) {\n const titleText2 = title.append('tspan').text('«' + member + '»');\n if (!isFirst) titleText2.attr('dy', conf.textHeight);\n isFirst = false;\n });\n\n let classTitleString = classDef.id;\n\n if (classDef.type !== undefined && classDef.type !== '') {\n classTitleString += '<' + classDef.type + '>';\n }\n\n const classTitle = title\n .append('tspan')\n .text(classTitleString)\n .attr('class', 'title');\n\n // If class has annotations the title needs to have an offset of the text height\n if (!isFirst) classTitle.attr('dy', conf.textHeight);\n\n const titleHeight = title.node().getBBox().height;\n\n const membersLine = g\n .append('line') // text label for the x axis\n .attr('x1', 0)\n .attr('y1', conf.padding + titleHeight + conf.dividerMargin / 2)\n .attr('y2', conf.padding + titleHeight + conf.dividerMargin / 2);\n\n const members = g\n .append('text') // text label for the x axis\n .attr('x', conf.padding)\n .attr('y', titleHeight + conf.dividerMargin + conf.textHeight)\n .attr('fill', 'white')\n .attr('class', 'classText');\n\n isFirst = true;\n classDef.members.forEach(function(member) {\n addTspan(members, member, isFirst, conf);\n isFirst = false;\n });\n\n const membersBox = members.node().getBBox();\n\n const methodsLine = g\n .append('line') // text label for the x axis\n .attr('x1', 0)\n .attr('y1', conf.padding + titleHeight + conf.dividerMargin + membersBox.height)\n .attr('y2', conf.padding + titleHeight + conf.dividerMargin + membersBox.height);\n\n const methods = g\n .append('text') // text label for the x axis\n .attr('x', conf.padding)\n .attr('y', titleHeight + 2 * conf.dividerMargin + membersBox.height + conf.textHeight)\n .attr('fill', 'white')\n .attr('class', 'classText');\n\n isFirst = true;\n\n classDef.methods.forEach(function(method) {\n addTspan(methods, method, isFirst, conf);\n isFirst = false;\n });\n\n const classBox = g.node().getBBox();\n var cssClassStr = ' ';\n\n if (classDef.cssClasses.length > 0) {\n cssClassStr = cssClassStr + classDef.cssClasses.join(' ');\n }\n\n const rect = g\n .insert('rect', ':first-child')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', classBox.width + 2 * conf.padding)\n .attr('height', classBox.height + conf.padding + 0.5 * conf.dividerMargin)\n .attr('class', cssClassStr);\n\n const rectWidth = rect.node().getBBox().width;\n\n // Center title\n // We subtract the width of each text element from the class box width and divide it by 2\n title.node().childNodes.forEach(function(x) {\n x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);\n });\n\n if (classDef.tooltip) {\n title.insert('title').text(classDef.tooltip);\n }\n\n membersLine.attr('x2', rectWidth);\n methodsLine.attr('x2', rectWidth);\n\n classInfo.width = rectWidth;\n classInfo.height = classBox.height + conf.padding + 0.5 * conf.dividerMargin;\n\n return classInfo;\n};\n\nexport const parseMember = function(text) {\n const fieldRegEx = /(\\+|-|~|#)?(\\w+)(~\\w+~|\\[\\])?\\s+(\\w+)/;\n const methodRegEx = /^([+|\\-|~|#])?(\\w+) *\\( *(.*)\\) *(\\*|\\$)? *(\\w*[~|[\\]]*\\s*\\w*~?)$/;\n\n let fieldMatch = text.match(fieldRegEx);\n let methodMatch = text.match(methodRegEx);\n\n if (fieldMatch && !methodMatch) {\n return buildFieldDisplay(fieldMatch);\n } else if (methodMatch) {\n return buildMethodDisplay(methodMatch);\n } else {\n return buildLegacyDisplay(text);\n }\n};\n\nconst buildFieldDisplay = function(parsedText) {\n let displayText = '';\n\n try {\n let visibility = parsedText[1] ? parsedText[1].trim() : '';\n let fieldType = parsedText[2] ? parsedText[2].trim() : '';\n let genericType = parsedText[3] ? parseGenericTypes(parsedText[3].trim()) : '';\n let fieldName = parsedText[4] ? parsedText[4].trim() : '';\n\n displayText = visibility + fieldType + genericType + ' ' + fieldName;\n } catch (err) {\n displayText = parsedText;\n }\n\n return {\n displayText: displayText,\n cssStyle: ''\n };\n};\n\nconst buildMethodDisplay = function(parsedText) {\n let cssStyle = '';\n let displayText = '';\n\n try {\n let visibility = parsedText[1] ? parsedText[1].trim() : '';\n let methodName = parsedText[2] ? parsedText[2].trim() : '';\n let parameters = parsedText[3] ? parseGenericTypes(parsedText[3].trim()) : '';\n let classifier = parsedText[4] ? parsedText[4].trim() : '';\n let returnType = parsedText[5] ? ' : ' + parseGenericTypes(parsedText[5]).trim() : '';\n\n displayText = visibility + methodName + '(' + parameters + ')' + returnType;\n\n cssStyle = parseClassifier(classifier);\n } catch (err) {\n displayText = parsedText;\n }\n\n return {\n displayText: displayText,\n cssStyle: cssStyle\n };\n};\n\nconst buildLegacyDisplay = function(text) {\n // if for some reason we dont have any match, use old format to parse text\n let displayText = '';\n let cssStyle = '';\n let memberText = '';\n let returnType = '';\n let methodStart = text.indexOf('(');\n let methodEnd = text.indexOf(')');\n\n if (methodStart > 1 && methodEnd > methodStart && methodEnd <= text.length) {\n let visibility = '';\n let methodName = '';\n\n let firstChar = text.substring(0, 1);\n if (firstChar.match(/\\w/)) {\n methodName = text.substring(0, methodStart).trim();\n } else {\n if (firstChar.match(/\\+|-|~|#/)) {\n visibility = firstChar;\n }\n\n methodName = text.substring(1, methodStart).trim();\n }\n\n let parameters = text.substring(methodStart + 1, methodEnd);\n let classifier = text.substring(methodEnd + 1, 1);\n cssStyle = parseClassifier(classifier);\n\n displayText = visibility + methodName + '(' + parseGenericTypes(parameters.trim()) + ')';\n\n if (methodEnd < memberText.length) {\n returnType = text.substring(methodEnd + 2).trim();\n if (returnType !== '') {\n returnType = ' : ' + parseGenericTypes(returnType);\n }\n }\n } else {\n // finally - if all else fails, just send the text back as written (other than parsing for generic types)\n displayText = parseGenericTypes(text);\n }\n\n return {\n displayText: displayText,\n cssStyle: cssStyle\n };\n};\n\nconst addTspan = function(textEl, txt, isFirst, conf) {\n let member = parseMember(txt);\n\n const tSpan = textEl\n .append('tspan')\n .attr('x', conf.padding)\n .text(member.displayText);\n\n if (member.cssStyle !== '') {\n tSpan.attr('style', member.cssStyle);\n }\n\n if (!isFirst) {\n tSpan.attr('dy', conf.textHeight);\n }\n};\n\nconst parseGenericTypes = function(text) {\n let cleanedText = text;\n\n if (text.indexOf('~') != -1) {\n cleanedText = cleanedText.replace('~', '<');\n cleanedText = cleanedText.replace('~', '>');\n\n return parseGenericTypes(cleanedText);\n } else {\n return cleanedText;\n }\n};\n\nconst parseClassifier = function(classifier) {\n switch (classifier) {\n case '*':\n return 'font-style:italic;';\n case '$':\n return 'text-decoration:underline;';\n default:\n return '';\n }\n};\n\nexport default {\n drawClass,\n drawEdge,\n parseMember\n};\n","import { select } from 'd3';\nimport { log } from '../logger'; // eslint-disable-line\nimport { labelHelper, updateNodeBounds, insertPolygonShape } from './shapes/util';\nimport { getConfig } from '../config';\nimport intersect from './intersect/index.js';\nimport createLabel from './createLabel';\nimport note from './shapes/note';\nimport { parseMember } from '../diagrams/class/svgDraw';\n\nconst question = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const s = w + h;\n const points = [\n { x: s / 2, y: 0 },\n { x: s, y: -s / 2 },\n { x: s / 2, y: -s },\n { x: 0, y: -s / 2 }\n ];\n\n log.info('Question main (Circle)');\n\n const questionElem = insertPolygonShape(shapeSvg, s, s, points);\n questionElem.attr('style', node.style);\n updateNodeBounds(node, questionElem);\n\n node.intersect = function(point) {\n log.warn('Intersect called');\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst hexagon = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const f = 4;\n const h = bbox.height + node.padding;\n const m = h / f;\n const w = bbox.width + 2 * m + node.padding;\n const points = [\n { x: m, y: 0 },\n { x: w - m, y: 0 },\n { x: w, y: -h / 2 },\n { x: w - m, y: -h },\n { x: m, y: -h },\n { x: 0, y: -h / 2 }\n ];\n\n const hex = insertPolygonShape(shapeSvg, w, h, points);\n hex.attr('style', node.style);\n updateNodeBounds(node, hex);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst rect_left_inv_arrow = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: -h / 2, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: -h / 2, y: -h },\n { x: 0, y: -h / 2 }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n\n node.width = w + h;\n node.height = h;\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst lean_right = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: h / 6, y: -h }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst lean_left = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (2 * h) / 6, y: 0 },\n { x: w + h / 6, y: 0 },\n { x: w - (2 * h) / 6, y: -h },\n { x: -h / 6, y: -h }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst trapezoid = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: (-2 * h) / 6, y: 0 },\n { x: w + (2 * h) / 6, y: 0 },\n { x: w - h / 6, y: -h },\n { x: h / 6, y: -h }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst inv_trapezoid = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: h / 6, y: 0 },\n { x: w - h / 6, y: 0 },\n { x: w + (2 * h) / 6, y: -h },\n { x: (-2 * h) / 6, y: -h }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst rect_right_inv_arrow = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: 0, y: 0 },\n { x: w + h / 2, y: 0 },\n { x: w, y: -h / 2 },\n { x: w + h / 2, y: -h },\n { x: 0, y: -h }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst cylinder = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const rx = w / 2;\n const ry = rx / (2.5 + w / 50);\n const h = bbox.height + ry + node.padding;\n\n const shape =\n 'M 0,' +\n ry +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n -w +\n ' 0 l 0,' +\n h +\n ' a ' +\n rx +\n ',' +\n ry +\n ' 0,0,0 ' +\n w +\n ' 0 l 0,' +\n -h;\n\n const el = shapeSvg\n .attr('label-offset-y', ry)\n .insert('path', ':first-child')\n .attr('style', node.style)\n .attr('d', shape)\n .attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');\n\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n const pos = intersect.rect(node, point);\n const x = pos.x - node.x;\n\n if (\n rx != 0 &&\n (Math.abs(x) < node.width / 2 ||\n (Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry))\n ) {\n // ellipsis equation: x*x / a*a + y*y / b*b = 1\n // solve for y to get adjustion value for pos.y\n let y = ry * ry * (1 - (x * x) / (rx * rx));\n if (y != 0) y = Math.sqrt(y);\n y = ry - y;\n if (point.y - node.y > 0) y = -y;\n\n pos.y += y;\n }\n\n return pos;\n };\n\n return shapeSvg;\n};\n\nconst rect = (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes, true);\n\n log.trace('Classes = ', node.classes);\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n rect\n .attr('class', 'basic label-container')\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function(point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst rectWithTitle = (parent, node) => {\n // const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes);\n\n let classes;\n if (!node.classes) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n // const innerRect = shapeSvg.insert('rect');\n const innerLine = shapeSvg.insert('line');\n\n const label = shapeSvg.insert('g').attr('class', 'label');\n\n const text2 = node.labelText.flat();\n log.info('Label text', text2[0]);\n\n const text = label.node().appendChild(createLabel(text2[0], node.labelStyle, true, true));\n let bbox;\n if (getConfig().flowchart.htmlLabels) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n log.info('Text 2', text2);\n const textRows = text2.slice(1, text2.length);\n let titleBox = text.getBBox();\n const descr = label\n .node()\n .appendChild(createLabel(textRows.join('
        '), node.labelStyle, true, true));\n\n if (getConfig().flowchart.htmlLabels) {\n const div = descr.children[0];\n const dv = select(descr);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n // bbox = label.getBBox();\n // log.info(descr);\n const halfPadding = node.padding / 2;\n select(descr).attr(\n 'transform',\n 'translate( ' +\n // (titleBox.width - bbox.width) / 2 +\n (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +\n ', ' +\n (titleBox.height + halfPadding + 5) +\n ')'\n );\n select(text).attr(\n 'transform',\n 'translate( ' +\n // (titleBox.width - bbox.width) / 2 +\n (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +\n ', ' +\n 0 +\n ')'\n );\n // Get the size of the label\n\n // Bounding box for title and text\n bbox = label.node().getBBox();\n\n // Center the label\n label.attr(\n 'transform',\n 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'\n );\n\n rect\n .attr('class', 'outer title-state')\n .attr('x', -bbox.width / 2 - halfPadding)\n .attr('y', -bbox.height / 2 - halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n innerLine\n .attr('class', 'divider')\n .attr('x1', -bbox.width / 2 - halfPadding)\n .attr('x2', bbox.width / 2 + halfPadding)\n .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)\n .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function(point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst stadium = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const h = bbox.height + node.padding;\n const w = bbox.width + h / 4 + node.padding;\n\n // add the rect\n const rect = shapeSvg\n .insert('rect', ':first-child')\n .attr('style', node.style)\n .attr('rx', h / 2)\n .attr('ry', h / 2)\n .attr('x', -w / 2)\n .attr('y', -h / 2)\n .attr('width', w)\n .attr('height', h);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function(point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst circle = (parent, node) => {\n const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, undefined, true);\n const circle = shapeSvg.insert('circle', ':first-child');\n\n // center the circle around its coordinate\n circle\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('r', bbox.width / 2 + halfPadding)\n .attr('width', bbox.width + node.padding)\n .attr('height', bbox.height + node.padding);\n\n log.info('Circle main');\n\n updateNodeBounds(node, circle);\n\n node.intersect = function(point) {\n log.info('Circle intersect', node, bbox.width / 2 + halfPadding, point);\n return intersect.circle(node, bbox.width / 2 + halfPadding, point);\n };\n\n return shapeSvg;\n};\n\nconst subroutine = (parent, node) => {\n const { shapeSvg, bbox } = labelHelper(parent, node, undefined, true);\n\n const w = bbox.width + node.padding;\n const h = bbox.height + node.padding;\n const points = [\n { x: 0, y: 0 },\n { x: w, y: 0 },\n { x: w, y: -h },\n { x: 0, y: -h },\n { x: 0, y: 0 },\n { x: -8, y: 0 },\n { x: w + 8, y: 0 },\n { x: w + 8, y: -h },\n { x: -8, y: -h },\n { x: -8, y: 0 }\n ];\n\n const el = insertPolygonShape(shapeSvg, w, h, points);\n el.attr('style', node.style);\n updateNodeBounds(node, el);\n\n node.intersect = function(point) {\n return intersect.polygon(node, points, point);\n };\n\n return shapeSvg;\n};\n\nconst start = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n const circle = shapeSvg.insert('circle', ':first-child');\n\n // center the circle around its coordinate\n circle\n .attr('class', 'state-start')\n .attr('r', 7)\n .attr('width', 14)\n .attr('height', 14);\n\n updateNodeBounds(node, circle);\n\n node.intersect = function(point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n};\n\nconst forkJoin = (parent, node, dir) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n\n let width = 70;\n let height = 10;\n\n if (dir === 'LR') {\n width = 10;\n height = 70;\n }\n\n const shape = shapeSvg\n .append('rect')\n .style('stroke', 'black')\n .style('fill', 'black')\n .attr('x', (-1 * width) / 2)\n .attr('y', (-1 * height) / 2)\n .attr('width', width)\n .attr('height', height)\n .attr('class', 'fork-join');\n\n updateNodeBounds(node, shape);\n node.height = node.height + node.padding / 2;\n node.width = node.width + node.padding / 2;\n node.intersect = function(point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst end = (parent, node) => {\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'node default')\n .attr('id', node.domId || node.id);\n const innerCircle = shapeSvg.insert('circle', ':first-child');\n const circle = shapeSvg.insert('circle', ':first-child');\n\n circle\n .attr('class', 'state-start')\n .attr('r', 7)\n .attr('width', 14)\n .attr('height', 14);\n\n innerCircle\n .attr('class', 'state-end')\n .attr('r', 5)\n .attr('width', 10)\n .attr('height', 10);\n\n updateNodeBounds(node, circle);\n\n node.intersect = function(point) {\n return intersect.circle(node, 7, point);\n };\n\n return shapeSvg;\n};\n\nconst class_box = (parent, node) => {\n const halfPadding = node.padding / 2;\n const rowPadding = 4;\n const lineHeight = 8;\n\n let classes;\n if (!node.classes) {\n classes = 'node default';\n } else {\n classes = 'node ' + node.classes;\n }\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', classes)\n .attr('id', node.domId || node.id);\n\n // Create the title label and insert it after the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n const topLine = shapeSvg.insert('line');\n const bottomLine = shapeSvg.insert('line');\n let maxWidth = 0;\n let maxHeight = rowPadding;\n\n const labelContainer = shapeSvg.insert('g').attr('class', 'label');\n let verticalPos = 0;\n const hasInterface = node.classData.annotations && node.classData.annotations[0];\n\n // 1. Create the labels\n const interfaceLabelText = node.classData.annotations[0]\n ? '«' + node.classData.annotations[0] + '»'\n : '';\n const interfaceLabel = labelContainer\n .node()\n .appendChild(createLabel(interfaceLabelText, node.labelStyle, true, true));\n let interfaceBBox = interfaceLabel.getBBox();\n if (getConfig().flowchart.htmlLabels) {\n const div = interfaceLabel.children[0];\n const dv = select(interfaceLabel);\n interfaceBBox = div.getBoundingClientRect();\n dv.attr('width', interfaceBBox.width);\n dv.attr('height', interfaceBBox.height);\n }\n if (node.classData.annotations[0]) {\n maxHeight += interfaceBBox.height + rowPadding;\n maxWidth += interfaceBBox.width;\n }\n\n let classTitleString = node.classData.id;\n\n if (node.classData.type !== undefined && node.classData.type !== '') {\n classTitleString += '<' + node.classData.type + '>';\n }\n const classTitleLabel = labelContainer\n .node()\n .appendChild(createLabel(classTitleString, node.labelStyle, true, true));\n select(classTitleLabel).attr('class', 'classTitle');\n let classTitleBBox = classTitleLabel.getBBox();\n if (getConfig().flowchart.htmlLabels) {\n const div = classTitleLabel.children[0];\n const dv = select(classTitleLabel);\n classTitleBBox = div.getBoundingClientRect();\n dv.attr('width', classTitleBBox.width);\n dv.attr('height', classTitleBBox.height);\n }\n maxHeight += classTitleBBox.height + rowPadding;\n if (classTitleBBox.width > maxWidth) {\n maxWidth = classTitleBBox.width;\n }\n const classAttributes = [];\n node.classData.members.forEach(str => {\n const parsedText = parseMember(str).displayText;\n const lbl = labelContainer\n .node()\n .appendChild(createLabel(parsedText, node.labelStyle, true, true));\n let bbox = lbl.getBBox();\n if (getConfig().flowchart.htmlLabels) {\n const div = lbl.children[0];\n const dv = select(lbl);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n if (bbox.width > maxWidth) {\n maxWidth = bbox.width;\n }\n maxHeight += bbox.height + rowPadding;\n classAttributes.push(lbl);\n });\n\n maxHeight += lineHeight;\n\n const classMethods = [];\n node.classData.methods.forEach(str => {\n const parsedText = parseMember(str).displayText;\n const lbl = labelContainer\n .node()\n .appendChild(createLabel(parsedText, node.labelStyle, true, true));\n let bbox = lbl.getBBox();\n if (getConfig().flowchart.htmlLabels) {\n const div = lbl.children[0];\n const dv = select(lbl);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n if (bbox.width > maxWidth) {\n maxWidth = bbox.width;\n }\n maxHeight += bbox.height + rowPadding;\n\n classMethods.push(lbl);\n });\n\n maxHeight += lineHeight;\n\n // 2. Position the labels\n\n // position the interface label\n if (hasInterface) {\n let diffX = (maxWidth - interfaceBBox.width) / 2;\n select(interfaceLabel).attr(\n 'transform',\n 'translate( ' + ((-1 * maxWidth) / 2 + diffX) + ', ' + (-1 * maxHeight) / 2 + ')'\n );\n verticalPos = interfaceBBox.height + rowPadding;\n }\n // Positin the class title label\n let diffX = (maxWidth - classTitleBBox.width) / 2;\n select(classTitleLabel).attr(\n 'transform',\n 'translate( ' +\n ((-1 * maxWidth) / 2 + diffX) +\n ', ' +\n ((-1 * maxHeight) / 2 + verticalPos) +\n ')'\n );\n verticalPos += classTitleBBox.height + rowPadding;\n\n topLine\n .attr('class', 'divider')\n .attr('x1', -maxWidth / 2 - halfPadding)\n .attr('x2', maxWidth / 2 + halfPadding)\n .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n verticalPos += lineHeight;\n\n classAttributes.forEach(lbl => {\n select(lbl).attr(\n 'transform',\n 'translate( ' +\n -maxWidth / 2 +\n ', ' +\n ((-1 * maxHeight) / 2 + verticalPos + lineHeight / 2) +\n ')'\n );\n verticalPos += classTitleBBox.height + rowPadding;\n });\n\n verticalPos += lineHeight;\n bottomLine\n .attr('class', 'divider')\n .attr('x1', -maxWidth / 2 - halfPadding)\n .attr('x2', maxWidth / 2 + halfPadding)\n .attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos)\n .attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);\n\n verticalPos += lineHeight;\n\n classMethods.forEach(lbl => {\n select(lbl).attr(\n 'transform',\n 'translate( ' + -maxWidth / 2 + ', ' + ((-1 * maxHeight) / 2 + verticalPos) + ')'\n );\n verticalPos += classTitleBBox.height + rowPadding;\n });\n //\n // let bbox;\n // if (getConfig().flowchart.htmlLabels) {\n // const div = interfaceLabel.children[0];\n // const dv = select(interfaceLabel);\n // bbox = div.getBoundingClientRect();\n // dv.attr('width', bbox.width);\n // dv.attr('height', bbox.height);\n // }\n // bbox = labelContainer.getBBox();\n\n // log.info('Text 2', text2);\n // const textRows = text2.slice(1, text2.length);\n // let titleBox = text.getBBox();\n // const descr = label\n // .node()\n // .appendChild(createLabel(textRows.join('
        '), node.labelStyle, true, true));\n\n // if (getConfig().flowchart.htmlLabels) {\n // const div = descr.children[0];\n // const dv = select(descr);\n // bbox = div.getBoundingClientRect();\n // dv.attr('width', bbox.width);\n // dv.attr('height', bbox.height);\n // }\n // // bbox = label.getBBox();\n // // log.info(descr);\n // select(descr).attr(\n // 'transform',\n // 'translate( ' +\n // // (titleBox.width - bbox.width) / 2 +\n // (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +\n // ', ' +\n // (titleBox.height + halfPadding + 5) +\n // ')'\n // );\n // select(text).attr(\n // 'transform',\n // 'translate( ' +\n // // (titleBox.width - bbox.width) / 2 +\n // (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +\n // ', ' +\n // 0 +\n // ')'\n // );\n // // Get the size of the label\n\n // // Bounding box for title and text\n // bbox = label.node().getBBox();\n\n // // Center the label\n // label.attr(\n // 'transform',\n // 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'\n // );\n\n rect\n .attr('class', 'outer title-state')\n .attr('x', -maxWidth / 2 - halfPadding)\n .attr('y', -(maxHeight / 2) - halfPadding)\n .attr('width', maxWidth + node.padding)\n .attr('height', maxHeight + node.padding);\n\n // innerLine\n // .attr('class', 'divider')\n // .attr('x1', -bbox.width / 2 - halfPadding)\n // .attr('x2', bbox.width / 2 + halfPadding)\n // .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)\n // .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);\n\n updateNodeBounds(node, rect);\n\n node.intersect = function(point) {\n return intersect.rect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst shapes = {\n question,\n rect,\n rectWithTitle,\n circle,\n stadium,\n hexagon,\n rect_left_inv_arrow,\n lean_right,\n lean_left,\n trapezoid,\n inv_trapezoid,\n rect_right_inv_arrow,\n cylinder,\n start,\n end,\n note,\n subroutine,\n fork: forkJoin,\n join: forkJoin,\n class_box\n};\n\nlet nodeElems = {};\n\nexport const insertNode = (elem, node, dir) => {\n let newEl;\n let el;\n\n // Add link when appropriate\n if (node.link) {\n newEl = elem\n .insert('svg:a')\n .attr('xlink:href', node.link)\n .attr('target', node.linkTarget || '_blank');\n el = shapes[node.shape](newEl, node, dir);\n } else {\n el = shapes[node.shape](elem, node, dir);\n newEl = el;\n }\n if (node.tooltip) {\n el.attr('title', node.tooltip);\n }\n if (node.class) {\n el.attr('class', 'node default ' + node.class);\n }\n\n nodeElems[node.id] = newEl;\n\n if (node.haveCallback) {\n nodeElems[node.id].attr('class', nodeElems[node.id].attr('class') + ' clickable');\n }\n};\nexport const setNodeElem = (elem, node) => {\n nodeElems[node.id] = elem;\n};\nexport const clear = () => {\n nodeElems = {};\n};\n\nexport const positionNode = node => {\n const el = nodeElems[node.id];\n log.trace(\n 'Transforming node',\n node,\n 'translate(' + (node.x - node.width / 2 - 5) + ', ' + (node.y - node.height / 2 - 5) + ')'\n );\n const padding = 8;\n if (node.clusterNode) {\n el.attr(\n 'transform',\n 'translate(' +\n (node.x - node.width / 2 - padding) +\n ', ' +\n (node.y - node.height / 2 - padding) +\n ')'\n );\n } else {\n el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n }\n};\n","import intersectRect from './intersect/intersect-rect';\nimport { log } from '../logger';\nimport createLabel from './createLabel';\nimport { select } from 'd3';\nimport { getConfig } from '../config';\n\nconst rect = (parent, node) => {\n log.trace('Creating subgraph rect for ', node.id, node);\n\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'cluster' + (node.class ? ' ' + node.class : ''))\n .attr('id', node.id);\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // Create the label and insert it after the rect\n const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n\n const text = label\n .node()\n .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n\n // Get the size of the label\n let bbox = text.getBBox();\n\n if (getConfig().flowchart.htmlLabels) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n\n const padding = 0 * node.padding;\n const halfPadding = padding / 2;\n\n log.trace('Data ', node, JSON.stringify(node));\n // center the rect around its coordinate\n rect\n .attr('style', node.style)\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', node.x - node.width / 2 - halfPadding)\n .attr('y', node.y - node.height / 2 - halfPadding)\n .attr('width', node.width + padding)\n .attr('height', node.height + padding);\n\n // Center the label\n label.attr(\n 'transform',\n 'translate(' +\n (node.x - bbox.width / 2) +\n ', ' +\n (node.y - node.height / 2 + node.padding / 3) +\n ')'\n );\n\n const rectBox = rect.node().getBBox();\n node.width = rectBox.width;\n node.height = rectBox.height;\n\n node.intersect = function(point) {\n return intersectRect(node, point);\n };\n\n return shapeSvg;\n};\n\n/**\n * Non visiable cluster where the note is group with its\n */\nconst noteGroup = (parent, node) => {\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', 'note-cluster')\n .attr('id', node.id);\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n const padding = 0 * node.padding;\n const halfPadding = padding / 2;\n\n // center the rect around its coordinate\n rect\n .attr('rx', node.rx)\n .attr('ry', node.ry)\n .attr('x', node.x - node.width / 2 - halfPadding)\n .attr('y', node.y - node.height / 2 - halfPadding)\n .attr('width', node.width + padding)\n .attr('height', node.height + padding)\n .attr('fill', 'none');\n\n const rectBox = rect.node().getBBox();\n node.width = rectBox.width;\n node.height = rectBox.height;\n\n node.intersect = function(point) {\n return intersectRect(node, point);\n };\n\n return shapeSvg;\n};\nconst roundedWithTitle = (parent, node) => {\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', node.classes)\n .attr('id', node.id);\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n // Create the label and insert it after the rect\n const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n const innerRect = shapeSvg.append('rect');\n\n const text = label\n .node()\n .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n\n // Get the size of the label\n let bbox = text.getBBox();\n if (getConfig().flowchart.htmlLabels) {\n const div = text.children[0];\n const dv = select(text);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n bbox = text.getBBox();\n const padding = 0 * node.padding;\n const halfPadding = padding / 2;\n\n // center the rect around its coordinate\n rect\n .attr('class', 'outer')\n .attr('x', node.x - node.width / 2 - halfPadding)\n .attr('y', node.y - node.height / 2 - halfPadding)\n .attr('width', node.width + padding)\n .attr('height', node.height + padding);\n innerRect\n .attr('class', 'inner')\n .attr('x', node.x - node.width / 2 - halfPadding)\n .attr('y', node.y - node.height / 2 - halfPadding + bbox.height - 1)\n .attr('width', node.width + padding)\n .attr('height', node.height + padding - bbox.height - 3);\n\n // Center the label\n label.attr(\n 'transform',\n 'translate(' +\n (node.x - bbox.width / 2) +\n ', ' +\n (node.y - node.height / 2 - node.padding / 3 + (getConfig().flowchart.htmlLabels ? 5 : 3)) +\n ')'\n );\n\n const rectBox = rect.node().getBBox();\n node.width = rectBox.width;\n node.height = rectBox.height;\n\n node.intersect = function(point) {\n return intersectRect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst divider = (parent, node) => {\n // Add outer g element\n const shapeSvg = parent\n .insert('g')\n .attr('class', node.classes)\n .attr('id', node.id);\n\n // add the rect\n const rect = shapeSvg.insert('rect', ':first-child');\n\n const padding = 0 * node.padding;\n const halfPadding = padding / 2;\n\n // center the rect around its coordinate\n rect\n .attr('class', 'divider')\n .attr('x', node.x - node.width / 2 - halfPadding)\n .attr('y', node.y - node.height / 2)\n .attr('width', node.width + padding)\n .attr('height', node.height + padding);\n\n const rectBox = rect.node().getBBox();\n node.width = rectBox.width;\n node.height = rectBox.height;\n\n node.intersect = function(point) {\n return intersectRect(node, point);\n };\n\n return shapeSvg;\n};\n\nconst shapes = { rect, roundedWithTitle, noteGroup, divider };\n\nlet clusterElems = {};\n\nexport const insertCluster = (elem, node) => {\n log.trace('Inserting cluster');\n const shape = node.shape || 'rect';\n clusterElems[node.id] = shapes[shape](elem, node);\n};\nexport const getClusterTitleWidth = (elem, node) => {\n const label = createLabel(node.labelText, node.labelStyle, undefined, true);\n elem.node().appendChild(label);\n const width = label.getBBox().width;\n elem.node().removeChild(label);\n return width;\n};\n\nexport const clear = () => {\n clusterElems = {};\n};\n\nexport const positionCluster = node => {\n log.info('Position cluster');\n const el = clusterElems[node.id];\n\n el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n};\n","import { log } from '../logger'; // eslint-disable-line\nimport createLabel from './createLabel';\nimport { line, curveBasis, select } from 'd3';\nimport { getConfig } from '../config';\nimport utils from '../utils';\n// import { calcLabelPosition } from '../utils';\n\nlet edgeLabels = {};\nlet terminalLabels = {};\n\nexport const clear = () => {\n edgeLabels = {};\n terminalLabels = {};\n};\n\nexport const insertEdgeLabel = (elem, edge) => {\n // Create the actual text element\n const labelElement = createLabel(edge.label, edge.labelStyle);\n\n // Create outer g, edgeLabel, this will be positioned after graph layout\n const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n // Create inner g, label, this will be positioned now for centering the text\n const label = edgeLabel.insert('g').attr('class', 'label');\n label.node().appendChild(labelElement);\n\n // Center the label\n let bbox = labelElement.getBBox();\n if (getConfig().flowchart.htmlLabels) {\n const div = labelElement.children[0];\n const dv = select(labelElement);\n bbox = div.getBoundingClientRect();\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n }\n label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');\n\n // Make element accessible by id for positioning\n edgeLabels[edge.id] = edgeLabel;\n\n // Update the abstract data of the edge with the new information about its width and height\n edge.width = bbox.width;\n edge.height = bbox.height;\n\n if (edge.startLabelLeft) {\n // Create the actual text element\n const startLabelElement = createLabel(edge.startLabelLeft, edge.labelStyle);\n const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].startLeft = startEdgeLabelLeft;\n }\n if (edge.startLabelRight) {\n // Create the actual text element\n const startLabelElement = createLabel(edge.startLabelRight, edge.labelStyle);\n const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n startEdgeLabelRight.node().appendChild(startLabelElement);\n inner.node().appendChild(startLabelElement);\n const slBox = startLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].startRight = startEdgeLabelRight;\n }\n if (edge.endLabelLeft) {\n // Create the actual text element\n const endLabelElement = createLabel(edge.endLabelLeft, edge.labelStyle);\n const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelLeft.node().appendChild(endLabelElement);\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].endLeft = endEdgeLabelLeft;\n }\n if (edge.endLabelRight) {\n // Create the actual text element\n const endLabelElement = createLabel(edge.endLabelRight, edge.labelStyle);\n const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n\n inner.node().appendChild(endLabelElement);\n const slBox = endLabelElement.getBBox();\n inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');\n\n endEdgeLabelRight.node().appendChild(endLabelElement);\n if (!terminalLabels[edge.id]) {\n terminalLabels[edge.id] = {};\n }\n terminalLabels[edge.id].endRight = endEdgeLabelRight;\n }\n};\n\nexport const positionEdgeLabel = (edge, paths) => {\n log.info('Moving label', edge.id, edge.label, edgeLabels[edge.id]);\n let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n if (edge.label) {\n const el = edgeLabels[edge.id];\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // // debugger;\n const pos = utils.calcLabelPosition(path);\n log.info('Moving label from (', x, ',', y, ') to (', pos.x, ',', pos.y, ')');\n // x = pos.x;\n // y = pos.y;\n }\n el.attr('transform', 'translate(' + x + ', ' + y + ')');\n }\n\n //let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n if (edge.startLabelLeft) {\n const el = terminalLabels[edge.id].startLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.calcTerminalLabelPosition(0, 'start_left', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', 'translate(' + x + ', ' + y + ')');\n }\n if (edge.startLabelRight) {\n const el = terminalLabels[edge.id].startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.calcTerminalLabelPosition(0, 'start_right', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', 'translate(' + x + ', ' + y + ')');\n }\n if (edge.endLabelLeft) {\n const el = terminalLabels[edge.id].endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.calcTerminalLabelPosition(0, 'end_left', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', 'translate(' + x + ', ' + y + ')');\n }\n if (edge.endLabelRight) {\n const el = terminalLabels[edge.id].endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n // debugger;\n const pos = utils.calcTerminalLabelPosition(0, 'end_right', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', 'translate(' + x + ', ' + y + ')');\n }\n};\n\n// const getRelationType = function(type) {\n// switch (type) {\n// case stateDb.relationType.AGGREGATION:\n// return 'aggregation';\n// case stateDb.relationType.EXTENSION:\n// return 'extension';\n// case stateDb.relationType.COMPOSITION:\n// return 'composition';\n// case stateDb.relationType.DEPENDENCY:\n// return 'dependency';\n// }\n// };\n\nconst outsideNode = (node, point) => {\n // log.warn('Checking bounds ', node, point);\n const x = node.x;\n const y = node.y;\n const dx = Math.abs(point.x - x);\n const dy = Math.abs(point.y - y);\n const w = node.width / 2;\n const h = node.height / 2;\n if (dx >= w || dy >= h) {\n return true;\n }\n return false;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n log.warn('intersection calc o:', outsidePoint, ' i:', insidePoint, node);\n const x = node.x;\n const y = node.y;\n\n const dx = Math.abs(x - insidePoint.x);\n const w = node.width / 2;\n let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n const h = node.height / 2;\n\n const edges = {\n x1: x - w,\n x2: x + w,\n y1: y - h,\n y2: y + h\n };\n\n if (\n outsidePoint.x === edges.x1 ||\n outsidePoint.x === edges.x2 ||\n outsidePoint.y === edges.y1 ||\n outsidePoint.y === edges.y2\n ) {\n log.warn('calc equals on edge');\n return outsidePoint;\n }\n\n const Q = Math.abs(outsidePoint.y - insidePoint.y);\n const R = Math.abs(outsidePoint.x - insidePoint.x);\n // log.warn();\n if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) { // eslint-disable-line\n // Intersection is top or bottom of rect.\n // let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n r = (R * q) / Q;\n const res = {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - r,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - q\n };\n log.warn(`topp/bott calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res);\n\n return res;\n } else {\n // Intersection onn sides of rect\n // q = (Q * r) / R;\n // q = 2;\n // r = (R * q) / Q;\n if (insidePoint.x < outsidePoint.x) {\n r = outsidePoint.x - w - x;\n } else {\n // r = outsidePoint.x - w - x;\n r = x - w - outsidePoint.x;\n }\n let q = (q = (Q * r) / R);\n log.warn(`sides calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q\n });\n\n return {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q\n };\n }\n};\n\n//(edgePaths, e, edge, clusterDb, diagramtype, graph)\nexport const insertEdge = function(elem, e, edge, clusterDb, diagramType, graph) {\n let points = edge.points;\n let pointsHasChanged = false;\n const tail = graph.node(e.v);\n var head = graph.node(e.w);\n\n if (head.intersect && tail.intersect) {\n points = points.slice(1, edge.points.length - 1);\n points.unshift(tail.intersect(points[0]));\n log.info(\n 'Last point',\n points[points.length - 1],\n head,\n head.intersect(points[points.length - 1])\n );\n points.push(head.intersect(points[points.length - 1]));\n }\n if (edge.toCluster) {\n log.trace('edge', edge);\n log.trace('to cluster', clusterDb[edge.toCluster]);\n points = [];\n let lastPointOutside;\n let isInside = false;\n edge.points.forEach(point => {\n const node = clusterDb[edge.toCluster].node;\n\n if (!outsideNode(node, point) && !isInside) {\n log.trace('inside', edge.toCluster, point, lastPointOutside);\n\n // First point inside the rect\n const inter = intersection(node, lastPointOutside, point);\n\n let pointPresent = false;\n points.forEach(p => {\n pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n });\n // if (!pointPresent) {\n if (!points.find(e => e.x === inter.x && e.y === inter.y)) {\n points.push(inter);\n } else {\n log.warn('no intersect', inter, points);\n }\n isInside = true;\n } else {\n if (!isInside) points.push(point);\n }\n lastPointOutside = point;\n });\n pointsHasChanged = true;\n }\n\n if (edge.fromCluster) {\n log.trace('edge', edge);\n log.warn('from cluster', clusterDb[edge.fromCluster]);\n const updatedPoints = [];\n let lastPointOutside;\n let isInside = false;\n for (let i = points.length - 1; i >= 0; i--) {\n const point = points[i];\n const node = clusterDb[edge.fromCluster].node;\n\n if (!outsideNode(node, point) && !isInside) {\n log.warn('inside', edge.fromCluster, point, node);\n\n // First point inside the rect\n const insterection = intersection(node, lastPointOutside, point);\n // log.trace('intersect', intersection(node, lastPointOutside, point));\n updatedPoints.unshift(insterection);\n // points.push(insterection);\n isInside = true;\n } else {\n // at the outside\n log.trace('Outside point', point);\n if (!isInside) updatedPoints.unshift(point);\n }\n lastPointOutside = point;\n }\n points = updatedPoints;\n pointsHasChanged = true;\n }\n\n // The data for our line\n const lineData = points.filter(p => !Number.isNaN(p.y));\n\n // This is the accessor function we talked about above\n const lineFunction = line()\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n })\n .curve(curveBasis);\n\n // Contruct stroke classes based on properties\n let strokeClasses;\n switch (edge.thickness) {\n case 'normal':\n strokeClasses = 'edge-thickness-normal';\n break;\n case 'thick':\n strokeClasses = 'edge-thickness-thick';\n break;\n default:\n strokeClasses = '';\n }\n switch (edge.pattern) {\n case 'solid':\n strokeClasses += ' edge-pattern-solid';\n break;\n case 'dotted':\n strokeClasses += ' edge-pattern-dotted';\n break;\n case 'dashed':\n strokeClasses += ' edge-pattern-dashed';\n break;\n }\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', edge.id)\n .attr('class', ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : ''))\n .attr('style', edge.style);\n\n // DEBUG code, adds a red circle at each edge coordinate\n // edge.points.forEach(point => {\n // elem\n // .append('circle')\n // .style('stroke', 'red')\n // .style('fill', 'red')\n // .attr('r', 1)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n\n let url = '';\n if (getConfig().state.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(');\n url = url.replace(/\\)/g, '\\\\)');\n }\n log.info('arrowTypeStart', edge.arrowTypeStart);\n log.info('arrowTypeEnd', edge.arrowTypeEnd);\n\n switch (edge.arrowTypeStart) {\n case 'arrow_cross':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-crossStart' + ')');\n break;\n case 'arrow_point':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-pointStart' + ')');\n break;\n case 'arrow_barb':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-barbStart' + ')');\n break;\n case 'arrow_circle':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-circleStart' + ')');\n break;\n case 'aggregation':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-aggregationStart' + ')');\n break;\n case 'extension':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-extensionStart' + ')');\n break;\n case 'composition':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-compositionStart' + ')');\n break;\n case 'dependency':\n svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-dependencyStart' + ')');\n break;\n default:\n }\n switch (edge.arrowTypeEnd) {\n case 'arrow_cross':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-crossEnd' + ')');\n break;\n case 'arrow_point':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-pointEnd' + ')');\n break;\n case 'arrow_barb':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-barbEnd' + ')');\n break;\n case 'arrow_circle':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-circleEnd' + ')');\n break;\n case 'aggregation':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-aggregationEnd' + ')');\n break;\n case 'extension':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-extensionEnd' + ')');\n break;\n case 'composition':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-compositionEnd' + ')');\n break;\n case 'dependency':\n svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-dependencyEnd' + ')');\n break;\n default:\n }\n let paths = {};\n if (pointsHasChanged) {\n paths.updatedPath = points;\n }\n paths.originalPath = edge.points;\n return paths;\n};\n","import dagre from 'dagre';\nimport graphlib from 'graphlib';\nimport insertMarkers from './markers';\nimport { updateNodeBounds } from './shapes/util';\nimport {\n clear as clearGraphlib,\n clusterDb,\n adjustClustersAndEdges,\n findNonClusterChild,\n sortNodesByHierarchy\n} from './mermaid-graphlib';\nimport { insertNode, positionNode, clear as clearNodes, setNodeElem } from './nodes';\nimport { insertCluster, clear as clearClusters } from './clusters';\nimport { insertEdgeLabel, positionEdgeLabel, insertEdge, clear as clearEdges } from './edges';\nimport { log } from '../logger';\n\nconst recursiveRender = (_elem, graph, diagramtype, parentCluster) => {\n log.info('Graph in recursive render: XXX', graphlib.json.write(graph), parentCluster);\n const dir = graph.graph().rankdir;\n log.warn('Dir in recursive render - dir:', dir);\n\n const elem = _elem.insert('g').attr('class', 'root'); // eslint-disable-line\n if (!graph.nodes()) {\n log.info('No nodes found for', graph);\n } else {\n log.info('Recursive render XXX', graph.nodes());\n }\n if (graph.edges().length > 0) {\n log.info('Recursive edges', graph.edge(graph.edges()[0]));\n }\n const clusters = elem.insert('g').attr('class', 'clusters'); // eslint-disable-line\n const edgePaths = elem.insert('g').attr('class', 'edgePaths');\n const edgeLabels = elem.insert('g').attr('class', 'edgeLabels');\n const nodes = elem.insert('g').attr('class', 'nodes');\n\n // Insert nodes, this will insert them into the dom and each node will get a size. The size is updated\n // to the abstract node and is later used by dagre for the layout\n graph.nodes().forEach(function(v) {\n const node = graph.node(v);\n if (typeof parentCluster !== 'undefined') {\n const data = JSON.parse(JSON.stringify(parentCluster.clusterData));\n // data.clusterPositioning = true;\n log.info('Setting data for cluster XXX (', v, ') ', data, parentCluster);\n graph.setNode(parentCluster.id, data);\n if (!graph.parent(v)) {\n log.warn('Setting parent', v, parentCluster.id);\n graph.setParent(v, parentCluster.id, data);\n }\n }\n log.info('(Insert) Node XXX' + v + ': ' + JSON.stringify(graph.node(v)));\n if (node && node.clusterNode) {\n // const children = graph.children(v);\n log.info('Cluster identified', v, node, graph.node(v));\n const newEl = recursiveRender(nodes, node.graph, diagramtype, graph.node(v));\n updateNodeBounds(node, newEl);\n setNodeElem(newEl, node);\n\n log.warn('Recursive render complete', newEl, node);\n } else {\n if (graph.children(v).length > 0) {\n // This is a cluster but not to be rendered recusively\n // Render as before\n log.info('Cluster - the non recursive path XXX', v, node.id, node, graph);\n log.info(findNonClusterChild(node.id, graph));\n clusterDb[node.id] = { id: findNonClusterChild(node.id, graph), node };\n // insertCluster(clusters, graph.node(v));\n } else {\n log.info('Node - the non recursive path', v, node.id, node);\n insertNode(nodes, graph.node(v), dir);\n }\n }\n });\n\n // Insert labels, this will insert them into the dom so that the width can be calculated\n // Also figure out which edges point to/from clusters and adjust them accordingly\n // Edges from/to clusters really points to the first child in the cluster.\n // TODO: pick optimal child in the cluster to us as link anchor\n graph.edges().forEach(function(e) {\n const edge = graph.edge(e.v, e.w, e.name);\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ', e, ' ', JSON.stringify(graph.edge(e)));\n\n // Check if link is either from or to a cluster\n log.info('Fix', clusterDb, 'ids:', e.v, e.w, 'Translateing: ', clusterDb[e.v], clusterDb[e.w]);\n insertEdgeLabel(edgeLabels, edge);\n });\n\n graph.edges().forEach(function(e) {\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n });\n log.info('#############################################');\n log.info('### Layout ###');\n log.info('#############################################');\n log.info(graph);\n dagre.layout(graph);\n log.info('Graph after layout:', graphlib.json.write(graph));\n // Move the nodes to the correct place\n sortNodesByHierarchy(graph).forEach(function(v) {\n const node = graph.node(v);\n log.info('Position ' + v + ': ' + JSON.stringify(graph.node(v)));\n log.info(\n 'Position ' + v + ': (' + node.x,\n ',' + node.y,\n ') width: ',\n node.width,\n ' height: ',\n node.height\n );\n if (node && node.clusterNode) {\n // clusterDb[node.id].node = node;\n\n positionNode(node);\n } else {\n // Non cluster node\n if (graph.children(v).length > 0) {\n // A cluster in the non-recurive way\n // positionCluster(node);\n insertCluster(clusters, node);\n clusterDb[node.id].node = node;\n } else {\n positionNode(node);\n }\n }\n });\n\n // Move the edge labels to the correct place after layout\n graph.edges().forEach(function(e) {\n const edge = graph.edge(e);\n log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(edge), edge);\n\n const paths = insertEdge(edgePaths, e, edge, clusterDb, diagramtype, graph);\n positionEdgeLabel(edge, paths);\n });\n\n return elem;\n};\n\nexport const render = (elem, graph, markers, diagramtype, id) => {\n insertMarkers(elem, markers, diagramtype, id);\n clearNodes();\n clearEdges();\n clearClusters();\n clearGraphlib();\n\n log.warn('Graph at first:', graphlib.json.write(graph));\n adjustClustersAndEdges(graph);\n log.warn('Graph after:', graphlib.json.write(graph));\n // log.warn('Graph ever after:', graphlib.json.write(graph.node('A').graph));\n recursiveRender(elem, graph, diagramtype);\n};\n\n// const shapeDefinitions = {};\n// export const addShape = ({ shapeType: fun }) => {\n// shapeDefinitions[shapeType] = fun;\n// };\n\n// const arrowDefinitions = {};\n// export const addArrow = ({ arrowType: fun }) => {\n// arrowDefinitions[arrowType] = fun;\n// };\n","import graphlib from 'graphlib';\nimport { select, curveLinear, selectAll } from 'd3';\n\nimport flowDb from './flowDb';\nimport flow from './parser/flow';\nimport { getConfig } from '../../config';\n\nimport { render } from '../../dagre-wrapper/index.js';\nimport addHtmlLabel from 'dagre-d3/lib/label/add-html-label.js';\nimport { log } from '../../logger';\nimport common from '../common/common';\nimport { interpolateToCurve, getStylesFromArray, configureSvgSize } from '../../utils';\n\nconst conf = {};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n for (let i = 0; i < keys.length; i++) {\n conf[keys[i]] = cnf[keys[i]];\n }\n};\n\n/**\n * Function that adds the vertices found during parsing to the graph to be rendered.\n * @param vert Object containing the vertices.\n * @param g The graph that is to be drawn.\n */\nexport const addVertices = function(vert, g, svgId) {\n const svg = select(`[id=\"${svgId}\"]`);\n const keys = Object.keys(vert);\n\n // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition\n keys.forEach(function(id) {\n const vertex = vert[id];\n\n /**\n * Variable for storing the classes for the vertex\n * @type {string}\n */\n let classStr = 'default';\n if (vertex.classes.length > 0) {\n classStr = vertex.classes.join(' ');\n }\n\n const styles = getStylesFromArray(vertex.styles);\n\n // Use vertex id as text in the box if no text is provided by the graph definition\n let vertexText = vertex.text !== undefined ? vertex.text : vertex.id;\n\n // We create a SVG label, either by delegating to addHtmlLabel or manually\n let vertexNode;\n if (getConfig().flowchart.htmlLabels) {\n // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?\n const node = {\n label: vertexText.replace(\n /fa[lrsb]?:fa-[\\w-]+/g,\n s => ``\n )\n };\n vertexNode = addHtmlLabel(svg, node).node();\n vertexNode.parentNode.removeChild(vertexNode);\n } else {\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));\n\n const rows = vertexText.split(common.lineBreakRegex);\n\n for (let j = 0; j < rows.length; j++) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n tspan.setAttribute('dy', '1em');\n tspan.setAttribute('x', '1');\n tspan.textContent = rows[j];\n svgLabel.appendChild(tspan);\n }\n vertexNode = svgLabel;\n }\n\n let radious = 0;\n let _shape = '';\n // Set the shape based parameters\n switch (vertex.type) {\n case 'round':\n radious = 5;\n _shape = 'rect';\n break;\n case 'square':\n _shape = 'rect';\n break;\n case 'diamond':\n _shape = 'question';\n break;\n case 'hexagon':\n _shape = 'hexagon';\n break;\n case 'odd':\n _shape = 'rect_left_inv_arrow';\n break;\n case 'lean_right':\n _shape = 'lean_right';\n break;\n case 'lean_left':\n _shape = 'lean_left';\n break;\n case 'trapezoid':\n _shape = 'trapezoid';\n break;\n case 'inv_trapezoid':\n _shape = 'inv_trapezoid';\n break;\n case 'odd_right':\n _shape = 'rect_left_inv_arrow';\n break;\n case 'circle':\n _shape = 'circle';\n break;\n case 'ellipse':\n _shape = 'ellipse';\n break;\n case 'stadium':\n _shape = 'stadium';\n break;\n case 'subroutine':\n _shape = 'subroutine';\n break;\n case 'cylinder':\n _shape = 'cylinder';\n break;\n case 'group':\n _shape = 'rect';\n break;\n default:\n _shape = 'rect';\n }\n // Add the node\n g.setNode(vertex.id, {\n labelStyle: styles.labelStyle,\n shape: _shape,\n labelText: vertexText,\n rx: radious,\n ry: radious,\n class: classStr,\n style: styles.style,\n id: vertex.id,\n link: vertex.link,\n linkTarget: vertex.linkTarget,\n tooltip: flowDb.getTooltip(vertex.id) || '',\n domId: flowDb.lookUpDomId(vertex.id),\n haveCallback: vertex.haveCallback,\n width: vertex.type === 'group' ? 500 : undefined,\n type: vertex.type,\n padding: getConfig().flowchart.padding\n });\n\n log.info('setNode', {\n labelStyle: styles.labelStyle,\n shape: _shape,\n labelText: vertexText,\n rx: radious,\n ry: radious,\n class: classStr,\n style: styles.style,\n id: vertex.id,\n domId: flowDb.lookUpDomId(vertex.id),\n width: vertex.type === 'group' ? 500 : undefined,\n type: vertex.type,\n padding: getConfig().flowchart.padding\n });\n });\n};\n\n/**\n * Add edges to graph based on parsed graph defninition\n * @param {Object} edges The edges to add to the graph\n * @param {Object} g The graph object\n */\nexport const addEdges = function(edges, g) {\n let cnt = 0;\n\n let defaultStyle;\n let defaultLabelStyle;\n\n if (typeof edges.defaultStyle !== 'undefined') {\n const defaultStyles = getStylesFromArray(edges.defaultStyle);\n defaultStyle = defaultStyles.style;\n defaultLabelStyle = defaultStyles.labelStyle;\n }\n\n edges.forEach(function(edge) {\n cnt++;\n\n // Identify Link\n var linkId = 'L-' + edge.start + '-' + edge.end;\n var linkNameStart = 'LS-' + edge.start;\n var linkNameEnd = 'LE-' + edge.end;\n\n const edgeData = { style: '', labelStyle: '' };\n edgeData.minlen = edge.length || 1;\n //edgeData.id = 'id' + cnt;\n\n // Set link type for rendering\n if (edge.type === 'arrow_open') {\n edgeData.arrowhead = 'none';\n } else {\n edgeData.arrowhead = 'normal';\n }\n\n // Check of arrow types, placed here in order not to break old rendering\n edgeData.arrowTypeStart = 'arrow_open';\n edgeData.arrowTypeEnd = 'arrow_open';\n\n /* eslint-disable no-fallthrough */\n switch (edge.type) {\n case 'double_arrow_cross':\n edgeData.arrowTypeStart = 'arrow_cross';\n case 'arrow_cross':\n edgeData.arrowTypeEnd = 'arrow_cross';\n break;\n case 'double_arrow_point':\n edgeData.arrowTypeStart = 'arrow_point';\n case 'arrow_point':\n edgeData.arrowTypeEnd = 'arrow_point';\n break;\n case 'double_arrow_circle':\n edgeData.arrowTypeStart = 'arrow_circle';\n case 'arrow_circle':\n edgeData.arrowTypeEnd = 'arrow_circle';\n break;\n }\n\n let style = '';\n let labelStyle = '';\n\n switch (edge.stroke) {\n case 'normal':\n style = 'fill:none;';\n if (typeof defaultStyle !== 'undefined') {\n style = defaultStyle;\n }\n if (typeof defaultLabelStyle !== 'undefined') {\n labelStyle = defaultLabelStyle;\n }\n edgeData.thickness = 'normal';\n edgeData.pattern = 'solid';\n break;\n case 'dotted':\n edgeData.thickness = 'normal';\n edgeData.pattern = 'dotted';\n edgeData.style = 'fill:none;stroke-width:2px;stroke-dasharray:3;';\n break;\n case 'thick':\n edgeData.thickness = 'thick';\n edgeData.pattern = 'solid';\n edgeData.style = 'stroke-width: 3.5px;fill:none;';\n break;\n }\n if (typeof edge.style !== 'undefined') {\n const styles = getStylesFromArray(edge.style);\n style = styles.style;\n labelStyle = styles.labelStyle;\n }\n\n edgeData.style = edgeData.style += style;\n edgeData.labelStyle = edgeData.labelStyle += labelStyle;\n\n if (typeof edge.interpolate !== 'undefined') {\n edgeData.curve = interpolateToCurve(edge.interpolate, curveLinear);\n } else if (typeof edges.defaultInterpolate !== 'undefined') {\n edgeData.curve = interpolateToCurve(edges.defaultInterpolate, curveLinear);\n } else {\n edgeData.curve = interpolateToCurve(conf.curve, curveLinear);\n }\n\n if (typeof edge.text === 'undefined') {\n if (typeof edge.style !== 'undefined') {\n edgeData.arrowheadStyle = 'fill: #333';\n }\n } else {\n edgeData.arrowheadStyle = 'fill: #333';\n edgeData.labelpos = 'c';\n }\n // if (getConfig().flowchart.htmlLabels && false) {\n // // eslint-disable-line\n // edgeData.labelType = 'html';\n // edgeData.label = `${edge.text}`;\n // } else {\n edgeData.labelType = 'text';\n edgeData.label = edge.text.replace(common.lineBreakRegex, '\\n');\n\n if (typeof edge.style === 'undefined') {\n edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none;';\n }\n\n edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');\n // }\n\n edgeData.id = linkId;\n edgeData.classes = 'flowchart-link ' + linkNameStart + ' ' + linkNameEnd;\n\n // Add the edge to the graph\n g.setEdge(edge.start, edge.end, edgeData, cnt);\n });\n};\n\n/**\n * Returns the all the styles from classDef statements in the graph definition.\n * @returns {object} classDef styles\n */\nexport const getClasses = function(text) {\n log.info('Extracting classes');\n flowDb.clear();\n const parser = flow.parser;\n parser.yy = flowDb;\n\n try {\n // Parse the graph definition\n parser.parse(text);\n } catch (e) {\n return;\n }\n\n return flowDb.getClasses();\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\n\nexport const draw = function(text, id) {\n log.info('Drawing flowchart');\n flowDb.clear();\n flowDb.setGen('gen-2');\n const parser = flow.parser;\n parser.yy = flowDb;\n\n // Parse the graph definition\n // try {\n parser.parse(text);\n // } catch (err) {\n // log.debug('Parsing failed');\n // }\n\n // Fetch the default direction, use TD if none was found\n let dir = flowDb.getDirection();\n if (typeof dir === 'undefined') {\n dir = 'TD';\n }\n\n const conf = getConfig().flowchart;\n const nodeSpacing = conf.nodeSpacing || 50;\n const rankSpacing = conf.rankSpacing || 50;\n\n // Create the input mermaid.graph\n const g = new graphlib.Graph({\n multigraph: true,\n compound: true\n })\n .setGraph({\n rankdir: dir,\n nodesep: nodeSpacing,\n ranksep: rankSpacing,\n marginx: 8,\n marginy: 8\n })\n .setDefaultEdgeLabel(function() {\n return {};\n });\n\n let subG;\n const subGraphs = flowDb.getSubGraphs();\n log.info('Subgraphs - ', subGraphs);\n for (let i = subGraphs.length - 1; i >= 0; i--) {\n subG = subGraphs[i];\n log.info('Subgraph - ', subG);\n flowDb.addVertex(subG.id, subG.title, 'group', undefined, subG.classes);\n }\n\n // Fetch the verices/nodes and edges/links from the parsed graph definition\n const vert = flowDb.getVertices();\n\n const edges = flowDb.getEdges();\n\n log.info(edges);\n let i = 0;\n for (i = subGraphs.length - 1; i >= 0; i--) {\n // for (let i = 0; i < subGraphs.length; i++) {\n subG = subGraphs[i];\n\n selectAll('cluster').append('text');\n\n for (let j = 0; j < subG.nodes.length; j++) {\n log.info('Setting up subgraphs', subG.nodes[j], subG.id);\n g.setParent(subG.nodes[j], subG.id);\n }\n }\n addVertices(vert, g, id);\n addEdges(edges, g);\n\n // Add custom shapes\n // flowChartShapes.addToRenderV2(addShape);\n\n // Set up an SVG group so that we can translate the final graph.\n const svg = select(`[id=\"${id}\"]`);\n svg.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n // Run the renderer. This is what draws the final graph.\n const element = select('#' + id + ' g');\n render(element, g, ['point', 'circle', 'cross'], 'flowchart', id);\n\n const padding = conf.diagramPadding;\n const svgBounds = svg.node().getBBox();\n const width = svgBounds.width + padding * 2;\n const height = svgBounds.height + padding * 2;\n log.debug(\n `new ViewBox 0 0 ${width} ${height}`,\n `translate(${padding - g._label.marginx}, ${padding - g._label.marginy})`\n );\n\n configureSvgSize(svg, height, width, conf.useMaxWidth);\n\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n svg\n .select('g')\n .attr('transform', `translate(${padding - g._label.marginx}, ${padding - svgBounds.y})`);\n\n // Index nodes\n flowDb.indexNodes('subGraph' + i);\n\n // Add label rects for non html labels\n if (!conf.htmlLabels) {\n const labels = document.querySelectorAll('[id=\"' + id + '\"] .edgeLabel .label');\n for (let k = 0; k < labels.length; k++) {\n const label = labels[k];\n\n // Get dimensions of label\n const dim = label.getBBox();\n\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('rx', 0);\n rect.setAttribute('ry', 0);\n rect.setAttribute('width', dim.width);\n rect.setAttribute('height', dim.height);\n // rect.setAttribute('style', 'fill:#e8e8e8;');\n\n label.insertBefore(rect, label.firstChild);\n }\n }\n\n // If node has a link, wrap it in an anchor SVG object.\n const keys = Object.keys(vert);\n keys.forEach(function(key) {\n const vertex = vert[key];\n\n if (vertex.link) {\n const node = select('#' + id + ' [id=\"' + key + '\"]');\n if (node) {\n const link = document.createElementNS('http://www.w3.org/2000/svg', 'a');\n link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));\n link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);\n link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');\n if (vertex.linkTarget) {\n link.setAttributeNS('http://www.w3.org/2000/svg', 'target', vertex.linkTarget);\n }\n\n const linkNode = node.insert(function() {\n return link;\n }, ':first-child');\n\n const shape = node.select('.label-container');\n if (shape) {\n linkNode.append(function() {\n return shape.node();\n });\n }\n\n const label = node.select('.label');\n if (label) {\n linkNode.append(function() {\n return label.node();\n });\n }\n }\n }\n });\n};\n\nexport default {\n setConf,\n addVertices,\n addEdges,\n getClasses,\n draw\n};\n","import common from '../common/common';\n\nexport const drawRect = function(elem, rectData) {\n const rectElem = elem.append('rect');\n rectElem.attr('x', rectData.x);\n rectElem.attr('y', rectData.y);\n rectElem.attr('fill', rectData.fill);\n rectElem.attr('stroke', rectData.stroke);\n rectElem.attr('width', rectData.width);\n rectElem.attr('height', rectData.height);\n rectElem.attr('rx', rectData.rx);\n rectElem.attr('ry', rectData.ry);\n\n if (typeof rectData.class !== 'undefined') {\n rectElem.attr('class', rectData.class);\n }\n\n return rectElem;\n};\n\nexport const drawText = function(elem, textData) {\n let prevTextHeight = 0,\n textHeight = 0;\n const lines = textData.text.split(common.lineBreakRegex);\n\n let textElems = [];\n let dy = 0;\n let yfunc = () => textData.y;\n if (\n typeof textData.valign !== 'undefined' &&\n typeof textData.textMargin !== 'undefined' &&\n textData.textMargin > 0\n ) {\n switch (textData.valign) {\n case 'top':\n case 'start':\n yfunc = () => Math.round(textData.y + textData.textMargin);\n break;\n case 'middle':\n case 'center':\n yfunc = () =>\n Math.round(textData.y + (prevTextHeight + textHeight + textData.textMargin) / 2);\n break;\n case 'bottom':\n case 'end':\n yfunc = () =>\n Math.round(\n textData.y +\n (prevTextHeight + textHeight + 2 * textData.textMargin) -\n textData.textMargin\n );\n break;\n }\n }\n if (\n typeof textData.anchor !== 'undefined' &&\n typeof textData.textMargin !== 'undefined' &&\n typeof textData.width !== 'undefined'\n ) {\n switch (textData.anchor) {\n case 'left':\n case 'start':\n textData.x = Math.round(textData.x + textData.textMargin);\n textData.anchor = 'start';\n textData.dominantBaseline = 'text-after-edge';\n textData.alignmentBaseline = 'middle';\n break;\n case 'middle':\n case 'center':\n textData.x = Math.round(textData.x + textData.width / 2);\n textData.anchor = 'middle';\n textData.dominantBaseline = 'middle';\n textData.alignmentBaseline = 'middle';\n break;\n case 'right':\n case 'end':\n textData.x = Math.round(textData.x + textData.width - textData.textMargin);\n textData.anchor = 'end';\n textData.dominantBaseline = 'text-before-edge';\n textData.alignmentBaseline = 'middle';\n break;\n }\n }\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n if (\n typeof textData.textMargin !== 'undefined' &&\n textData.textMargin === 0 &&\n typeof textData.fontSize !== 'undefined'\n ) {\n dy = i * textData.fontSize;\n }\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', yfunc());\n if (typeof textData.anchor !== 'undefined') {\n textElem\n .attr('text-anchor', textData.anchor)\n .attr('dominant-baseline', textData.dominantBaseline)\n .attr('alignment-baseline', textData.alignmentBaseline);\n }\n if (typeof textData.fontFamily !== 'undefined') {\n textElem.style('font-family', textData.fontFamily);\n }\n if (typeof textData.fontSize !== 'undefined') {\n textElem.style('font-size', textData.fontSize);\n }\n if (typeof textData.fontWeight !== 'undefined') {\n textElem.style('font-weight', textData.fontWeight);\n }\n if (typeof textData.fill !== 'undefined') {\n textElem.attr('fill', textData.fill);\n }\n if (typeof textData.class !== 'undefined') {\n textElem.attr('class', textData.class);\n }\n if (typeof textData.dy !== 'undefined') {\n textElem.attr('dy', textData.dy);\n } else if (dy !== 0) {\n textElem.attr('dy', dy);\n }\n\n if (textData.tspan) {\n const span = textElem.append('tspan');\n span.attr('x', textData.x);\n if (typeof textData.fill !== 'undefined') {\n span.attr('fill', textData.fill);\n }\n span.text(line);\n } else {\n textElem.text(line);\n }\n if (\n typeof textData.valign !== 'undefined' &&\n typeof textData.textMargin !== 'undefined' &&\n textData.textMargin > 0\n ) {\n textHeight += (textElem._groups || textElem)[0][0].getBBox().height;\n prevTextHeight = textHeight;\n }\n\n textElems.push(textElem);\n }\n\n return textElems;\n};\n\nexport const drawLabel = function(elem, txtObject) {\n function genPoints(x, y, width, height, cut) {\n return (\n x +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n (y + height - cut) +\n ' ' +\n (x + width - cut * 1.2) +\n ',' +\n (y + height) +\n ' ' +\n x +\n ',' +\n (y + height)\n );\n }\n const polygon = elem.append('polygon');\n polygon.attr('points', genPoints(txtObject.x, txtObject.y, txtObject.width, txtObject.height, 7));\n polygon.attr('class', 'labelBox');\n\n txtObject.y = txtObject.y + txtObject.height / 2;\n\n drawText(elem, txtObject);\n return polygon;\n};\n\nlet actorCnt = -1;\n/**\n * Draws an actor in the diagram with the attached line\n * @param elem - The diagram we'll draw to.\n * @param actor - The actor to draw.\n * @param conf - drawText implementation discriminator object\n */\nexport const drawActor = function(elem, actor, conf) {\n const center = actor.x + actor.width / 2;\n\n const g = elem.append('g');\n if (actor.y === 0) {\n actorCnt++;\n g.append('line')\n .attr('id', 'actor' + actorCnt)\n .attr('x1', center)\n .attr('y1', 5)\n .attr('x2', center)\n .attr('y2', 2000)\n .attr('class', 'actor-line')\n .attr('stroke-width', '0.5px')\n .attr('stroke', '#999');\n }\n\n const rect = getNoteRect();\n rect.x = actor.x;\n rect.y = actor.y;\n rect.fill = '#eaeaea';\n rect.width = actor.width;\n rect.height = actor.height;\n rect.class = 'actor';\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n _drawTextCandidateFunc(conf)(\n actor.description,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'actor' },\n conf\n );\n};\n\nexport const anchorElement = function(elem) {\n return elem.append('g');\n};\n/**\n * Draws an activation in the diagram\n * @param elem - element to append activation rect.\n * @param bounds - activation box bounds.\n * @param verticalPos - precise y cooridnate of bottom activation box edge.\n * @param conf - sequence diagram config object.\n * @param actorActivations - number of activations on the actor.\n */\nexport const drawActivation = function(elem, bounds, verticalPos, conf, actorActivations) {\n const rect = getNoteRect();\n const g = bounds.anchored;\n rect.x = bounds.startx;\n rect.y = bounds.starty;\n rect.class = 'activation' + (actorActivations % 3); // Will evaluate to 0, 1 or 2\n rect.width = bounds.stopx - bounds.startx;\n rect.height = verticalPos - bounds.starty;\n drawRect(g, rect);\n};\n\n/**\n * Draws a loop in the diagram\n * @param elem - elemenet to append the loop to.\n * @param loopModel - loopModel of the given loop.\n * @param labelText - Text within the loop.\n * @param conf - diagrom configuration\n */\nexport const drawLoop = function(elem, loopModel, labelText, conf) {\n const {\n boxMargin,\n boxTextMargin,\n labelBoxHeight,\n labelBoxWidth,\n messageFontFamily: fontFamily,\n messageFontSize: fontSize,\n messageFontWeight: fontWeight\n } = conf;\n const g = elem.append('g');\n const drawLoopLine = function(startx, starty, stopx, stopy) {\n return g\n .append('line')\n .attr('x1', startx)\n .attr('y1', starty)\n .attr('x2', stopx)\n .attr('y2', stopy)\n .attr('class', 'loopLine');\n };\n drawLoopLine(loopModel.startx, loopModel.starty, loopModel.stopx, loopModel.starty);\n drawLoopLine(loopModel.stopx, loopModel.starty, loopModel.stopx, loopModel.stopy);\n drawLoopLine(loopModel.startx, loopModel.stopy, loopModel.stopx, loopModel.stopy);\n drawLoopLine(loopModel.startx, loopModel.starty, loopModel.startx, loopModel.stopy);\n if (typeof loopModel.sections !== 'undefined') {\n loopModel.sections.forEach(function(item) {\n drawLoopLine(loopModel.startx, item.y, loopModel.stopx, item.y).style(\n 'stroke-dasharray',\n '3, 3'\n );\n });\n }\n\n let txt = getTextObj();\n txt.text = labelText;\n txt.x = loopModel.startx;\n txt.y = loopModel.starty;\n txt.fontFamily = fontFamily;\n txt.fontSize = fontSize;\n txt.fontWeight = fontWeight;\n txt.anchor = 'middle';\n txt.valign = 'middle';\n txt.tspan = false;\n txt.width = labelBoxWidth || 50;\n txt.height = labelBoxHeight || 20;\n txt.textMargin = boxTextMargin;\n txt.class = 'labelText';\n\n drawLabel(g, txt);\n txt = getTextObj();\n txt.text = loopModel.title;\n txt.x = loopModel.startx + labelBoxWidth / 2 + (loopModel.stopx - loopModel.startx) / 2;\n txt.y = loopModel.starty + boxMargin + boxTextMargin;\n txt.anchor = 'middle';\n txt.valign = 'middle';\n txt.textMargin = boxTextMargin;\n txt.class = 'loopText';\n txt.fontFamily = fontFamily;\n txt.fontSize = fontSize;\n txt.fontWeight = fontWeight;\n txt.wrap = true;\n\n let textElem = drawText(g, txt);\n\n if (typeof loopModel.sectionTitles !== 'undefined') {\n loopModel.sectionTitles.forEach(function(item, idx) {\n if (item.message) {\n txt.text = item.message;\n txt.x = loopModel.startx + (loopModel.stopx - loopModel.startx) / 2;\n txt.y = loopModel.sections[idx].y + boxMargin + boxTextMargin;\n txt.class = 'loopText';\n txt.anchor = 'middle';\n txt.valign = 'middle';\n txt.tspan = false;\n txt.fontFamily = fontFamily;\n txt.fontSize = fontSize;\n txt.fontWeight = fontWeight;\n txt.wrap = loopModel.wrap;\n textElem = drawText(g, txt);\n let sectionHeight = Math.round(\n textElem\n .map(te => (te._groups || te)[0][0].getBBox().height)\n .reduce((acc, curr) => acc + curr)\n );\n loopModel.sections[idx].height += sectionHeight - (boxMargin + boxTextMargin);\n }\n });\n }\n\n loopModel.height = Math.round(loopModel.stopy - loopModel.starty);\n return g;\n};\n\n/**\n * Draws a background rectangle\n * @param elem diagram (reference for bounds)\n * @param bounds shape of the rectangle\n */\nexport const drawBackgroundRect = function(elem, bounds) {\n const rectElem = drawRect(elem, {\n x: bounds.startx,\n y: bounds.starty,\n width: bounds.stopx - bounds.startx,\n height: bounds.stopy - bounds.starty,\n fill: bounds.fill,\n class: 'rect'\n });\n rectElem.lower();\n};\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n */\nexport const insertArrowHead = function(elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 9)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z'); // this is actual shape for arrowhead\n};\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n */\nexport const insertArrowFilledHead = function(elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'filled-head')\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\n/**\n * Setup node number. The result is appended to the svg.\n */\nexport const insertSequenceNumber = function(elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'sequencenumber')\n .attr('refX', 15)\n .attr('refY', 15)\n .attr('markerWidth', 60)\n .attr('markerHeight', 40)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', 15)\n .attr('cy', 15)\n .attr('r', 6);\n // .style(\"fill\", '#f00');\n};\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n */\nexport const insertArrowCrossHead = function(elem) {\n const defs = elem.append('defs');\n const marker = defs\n .append('marker')\n .attr('id', 'crosshead')\n .attr('markerWidth', 15)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .attr('refX', 16)\n .attr('refY', 4);\n\n // The arrow\n marker\n .append('path')\n .attr('fill', 'black')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1px')\n .attr('d', 'M 9,2 V 6 L16,4 Z');\n\n // The cross\n marker\n .append('path')\n .attr('fill', 'none')\n .attr('stroke', '#000000')\n .style('stroke-dasharray', '0, 0')\n .attr('stroke-width', '1px')\n .attr('d', 'M 0,1 L 6,7 M 6,1 L 0,7');\n // this is actual shape for arrowhead\n};\n\nexport const getTextObj = function() {\n return {\n x: 0,\n y: 0,\n fill: undefined,\n anchor: undefined,\n style: '#666',\n width: undefined,\n height: undefined,\n textMargin: 0,\n rx: 0,\n ry: 0,\n tspan: true,\n valign: undefined\n };\n};\n\nexport const getNoteRect = function() {\n return {\n x: 0,\n y: 0,\n fill: '#EDF2AE',\n stroke: '#666',\n width: 100,\n anchor: 'start',\n height: 100,\n rx: 0,\n ry: 0\n };\n};\n\nconst _drawTextCandidateFunc = (function() {\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n function byTspan(content, g, x, y, width, height, textAttrs, conf) {\n const { actorFontSize, actorFontFamily, actorFontWeight } = conf;\n\n const lines = content.split(common.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * actorFontSize - (actorFontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .style('text-anchor', 'middle')\n .style('font-size', actorFontSize)\n .style('font-weight', actorFontWeight)\n .style('font-family', actorFontFamily);\n text\n .append('tspan')\n .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i]);\n\n text\n .attr('y', y + height / 2.0)\n .attr('dominant-baseline', 'central')\n .attr('alignment-baseline', 'central');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const s = g.append('switch');\n const f = s\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height);\n\n const text = f\n .append('div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n .text(content);\n\n byTspan(content, s, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (fromTextAttrsDict.hasOwnProperty(key)) { // eslint-disable-line\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function(conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nexport default {\n drawRect,\n drawText,\n drawLabel,\n drawActor,\n anchorElement,\n drawActivation,\n drawLoop,\n drawBackgroundRect,\n insertArrowHead,\n insertArrowFilledHead,\n insertSequenceNumber,\n insertArrowCrossHead,\n getTextObj,\n getNoteRect\n};\n","import mermaidAPI from '../../mermaidAPI';\nimport * as configApi from '../../config';\nimport { log } from '../../logger';\n\nlet prevActor = undefined;\nlet actors = {};\nlet messages = [];\nconst notes = [];\nlet title = '';\nlet titleWrapped = false;\nlet sequenceNumbersEnabled = false;\nlet wrapEnabled = false;\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nexport const addActor = function(id, name, description) {\n // Don't allow description nulling\n const old = actors[id];\n if (old && name === old.name && description == null) return;\n\n // Don't allow null descriptions, either\n if (description == null || description.text == null) {\n description = { text: name, wrap: null };\n }\n\n actors[id] = {\n name: name,\n description: description.text,\n wrap: (description.wrap === undefined && autoWrap()) || !!description.wrap,\n prevActor: prevActor\n };\n if (prevActor && actors[prevActor]) {\n actors[prevActor].nextActor = id;\n }\n\n prevActor = id;\n};\n\nconst activationCount = part => {\n let i;\n let count = 0;\n for (i = 0; i < messages.length; i++) {\n if (messages[i].type === LINETYPE.ACTIVE_START) {\n if (messages[i].from.actor === part) {\n count++;\n }\n }\n if (messages[i].type === LINETYPE.ACTIVE_END) {\n if (messages[i].from.actor === part) {\n count--;\n }\n }\n }\n return count;\n};\n\nexport const addMessage = function(idFrom, idTo, message, answer) {\n messages.push({\n from: idFrom,\n to: idTo,\n message: message.text,\n wrap: (message.wrap === undefined && autoWrap()) || !!message.wrap,\n answer: answer\n });\n};\n\nexport const addSignal = function(\n idFrom,\n idTo,\n message = { text: undefined, wrap: undefined },\n messageType\n) {\n if (messageType === LINETYPE.ACTIVE_END) {\n const cnt = activationCount(idFrom.actor);\n if (cnt < 1) {\n // Bail out as there is an activation signal from an inactive participant\n let error = new Error('Trying to inactivate an inactive participant (' + idFrom.actor + ')');\n error.hash = {\n text: '->>-',\n token: '->>-',\n line: '1',\n loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 },\n expected: [\"'ACTIVE_PARTICIPANT'\"]\n };\n throw error;\n }\n }\n messages.push({\n from: idFrom,\n to: idTo,\n message: message.text,\n wrap: (message.wrap === undefined && autoWrap()) || !!message.wrap,\n type: messageType\n });\n return true;\n};\n\nexport const getMessages = function() {\n return messages;\n};\n\nexport const getActors = function() {\n return actors;\n};\nexport const getActor = function(id) {\n return actors[id];\n};\nexport const getActorKeys = function() {\n return Object.keys(actors);\n};\nexport const getTitle = function() {\n return title;\n};\nexport const getTitleWrapped = function() {\n return titleWrapped;\n};\nexport const enableSequenceNumbers = function() {\n sequenceNumbersEnabled = true;\n};\nexport const showSequenceNumbers = () => sequenceNumbersEnabled;\n\nexport const setWrap = function(wrapSetting) {\n wrapEnabled = wrapSetting;\n};\n\nexport const autoWrap = () => wrapEnabled;\n\nexport const clear = function() {\n actors = {};\n messages = [];\n};\n\nexport const parseMessage = function(str) {\n const _str = str.trim();\n const message = {\n text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),\n wrap:\n _str.match(/^[:]?wrap:/) !== null\n ? true\n : _str.match(/^[:]?nowrap:/) !== null\n ? false\n : undefined\n };\n log.debug('parseMessage:', message);\n return message;\n};\n\nexport const LINETYPE = {\n SOLID: 0,\n DOTTED: 1,\n NOTE: 2,\n SOLID_CROSS: 3,\n DOTTED_CROSS: 4,\n SOLID_OPEN: 5,\n DOTTED_OPEN: 6,\n LOOP_START: 10,\n LOOP_END: 11,\n ALT_START: 12,\n ALT_ELSE: 13,\n ALT_END: 14,\n OPT_START: 15,\n OPT_END: 16,\n ACTIVE_START: 17,\n ACTIVE_END: 18,\n PAR_START: 19,\n PAR_AND: 20,\n PAR_END: 21,\n RECT_START: 22,\n RECT_END: 23,\n SOLID_POINT: 24,\n DOTTED_POINT: 25\n};\n\nexport const ARROWTYPE = {\n FILLED: 0,\n OPEN: 1\n};\n\nexport const PLACEMENT = {\n LEFTOF: 0,\n RIGHTOF: 1,\n OVER: 2\n};\n\nexport const addNote = function(actor, placement, message) {\n const note = {\n actor: actor,\n placement: placement,\n message: message.text,\n wrap: (message.wrap === undefined && autoWrap()) || !!message.wrap\n };\n\n // Coerce actor into a [to, from, ...] array\n const actors = [].concat(actor, actor);\n\n notes.push(note);\n messages.push({\n from: actors[0],\n to: actors[1],\n message: message.text,\n wrap: (message.wrap === undefined && autoWrap()) || !!message.wrap,\n type: LINETYPE.NOTE,\n placement: placement\n });\n};\n\nexport const setTitle = function(titleWrap) {\n title = titleWrap.text;\n titleWrapped = (titleWrap.wrap === undefined && autoWrap()) || !!titleWrap.wrap;\n};\n\nexport const apply = function(param) {\n if (param instanceof Array) {\n param.forEach(function(item) {\n apply(item);\n });\n } else {\n switch (param.type) {\n case 'addActor':\n addActor(param.actor, param.actor, param.description);\n break;\n case 'activeStart':\n addSignal(param.actor, undefined, undefined, param.signalType);\n break;\n case 'activeEnd':\n addSignal(param.actor, undefined, undefined, param.signalType);\n break;\n case 'addNote':\n addNote(param.actor, param.placement, param.text);\n break;\n case 'addMessage':\n addSignal(param.from, param.to, param.msg, param.signalType);\n break;\n case 'loopStart':\n addSignal(undefined, undefined, param.loopText, param.signalType);\n break;\n case 'loopEnd':\n addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'rectStart':\n addSignal(undefined, undefined, param.color, param.signalType);\n break;\n case 'rectEnd':\n addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'optStart':\n addSignal(undefined, undefined, param.optText, param.signalType);\n break;\n case 'optEnd':\n addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'altStart':\n addSignal(undefined, undefined, param.altText, param.signalType);\n break;\n case 'else':\n addSignal(undefined, undefined, param.altText, param.signalType);\n break;\n case 'altEnd':\n addSignal(undefined, undefined, undefined, param.signalType);\n break;\n case 'setTitle':\n setTitle(param.text);\n break;\n case 'parStart':\n addSignal(undefined, undefined, param.parText, param.signalType);\n break;\n case 'and':\n addSignal(undefined, undefined, param.parText, param.signalType);\n break;\n case 'parEnd':\n addSignal(undefined, undefined, undefined, param.signalType);\n break;\n }\n }\n};\n\nexport default {\n addActor,\n addMessage,\n addSignal,\n autoWrap,\n setWrap,\n enableSequenceNumbers,\n showSequenceNumbers,\n getMessages,\n getActors,\n getActor,\n getActorKeys,\n getTitle,\n parseDirective,\n getConfig: () => configApi.getConfig().sequence,\n getTitleWrapped,\n clear,\n parseMessage,\n LINETYPE,\n ARROWTYPE,\n PLACEMENT,\n addNote,\n setTitle,\n apply\n};\n","import { select, selectAll } from 'd3';\nimport svgDraw, { drawText } from './svgDraw';\nimport { log } from '../../logger';\nimport { parser } from './parser/sequenceDiagram';\nimport common from '../common/common';\nimport sequenceDb from './sequenceDb';\nimport * as configApi from '../../config';\nimport utils, { assignWithDepth, configureSvgSize } from '../../utils';\n\nparser.yy = sequenceDb;\n\nlet conf = {};\n\nexport const bounds = {\n data: {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined\n },\n verticalPos: 0,\n sequenceItems: [],\n activations: [],\n models: {\n getHeight: function() {\n return (\n Math.max.apply(\n null,\n this.actors.length === 0 ? [0] : this.actors.map(actor => actor.height || 0)\n ) +\n (this.loops.length === 0\n ? 0\n : this.loops.map(it => it.height || 0).reduce((acc, h) => acc + h)) +\n (this.messages.length === 0\n ? 0\n : this.messages.map(it => it.height || 0).reduce((acc, h) => acc + h)) +\n (this.notes.length === 0\n ? 0\n : this.notes.map(it => it.height || 0).reduce((acc, h) => acc + h))\n );\n },\n clear: function() {\n this.actors = [];\n this.loops = [];\n this.messages = [];\n this.notes = [];\n },\n addActor: function(actorModel) {\n this.actors.push(actorModel);\n },\n addLoop: function(loopModel) {\n this.loops.push(loopModel);\n },\n addMessage: function(msgModel) {\n this.messages.push(msgModel);\n },\n addNote: function(noteModel) {\n this.notes.push(noteModel);\n },\n lastActor: function() {\n return this.actors[this.actors.length - 1];\n },\n lastLoop: function() {\n return this.loops[this.loops.length - 1];\n },\n lastMessage: function() {\n return this.messages[this.messages.length - 1];\n },\n lastNote: function() {\n return this.notes[this.notes.length - 1];\n },\n actors: [],\n loops: [],\n messages: [],\n notes: []\n },\n init: function() {\n this.sequenceItems = [];\n this.activations = [];\n this.models.clear();\n this.data = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined\n };\n this.verticalPos = 0;\n setConf(parser.yy.getConfig());\n },\n updateVal: function(obj, key, val, fun) {\n if (typeof obj[key] === 'undefined') {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n },\n updateBounds: function(startx, starty, stopx, stopy) {\n const _self = this;\n let cnt = 0;\n function updateFn(type) {\n return function updateItemBounds(item) {\n cnt++;\n // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems\n const n = _self.sequenceItems.length - cnt + 1;\n\n _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n if (!(type === 'activation')) {\n _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);\n }\n };\n }\n\n this.sequenceItems.forEach(updateFn());\n this.activations.forEach(updateFn('activation'));\n },\n insert: function(startx, starty, stopx, stopy) {\n const _startx = Math.min(startx, stopx);\n const _stopx = Math.max(startx, stopx);\n const _starty = Math.min(starty, stopy);\n const _stopy = Math.max(starty, stopy);\n\n this.updateVal(bounds.data, 'startx', _startx, Math.min);\n this.updateVal(bounds.data, 'starty', _starty, Math.min);\n this.updateVal(bounds.data, 'stopx', _stopx, Math.max);\n this.updateVal(bounds.data, 'stopy', _stopy, Math.max);\n\n this.updateBounds(_startx, _starty, _stopx, _stopy);\n },\n newActivation: function(message, diagram, actors) {\n const actorRect = actors[message.from.actor];\n const stackedSize = actorActivations(message.from.actor).length || 0;\n const x = actorRect.x + actorRect.width / 2 + ((stackedSize - 1) * conf.activationWidth) / 2;\n this.activations.push({\n startx: x,\n starty: this.verticalPos + 2,\n stopx: x + conf.activationWidth,\n stopy: undefined,\n actor: message.from.actor,\n anchored: svgDraw.anchorElement(diagram)\n });\n },\n endActivation: function(message) {\n // find most recent activation for given actor\n const lastActorActivationIdx = this.activations\n .map(function(activation) {\n return activation.actor;\n })\n .lastIndexOf(message.from.actor);\n return this.activations.splice(lastActorActivationIdx, 1)[0];\n },\n createLoop: function(title = { message: undefined, wrap: false, width: undefined }, fill) {\n return {\n startx: undefined,\n starty: this.verticalPos,\n stopx: undefined,\n stopy: undefined,\n title: title.message,\n wrap: title.wrap,\n width: title.width,\n height: 0,\n fill: fill\n };\n },\n newLoop: function(title = { message: undefined, wrap: false, width: undefined }, fill) {\n this.sequenceItems.push(this.createLoop(title, fill));\n },\n endLoop: function() {\n return this.sequenceItems.pop();\n },\n addSectionToLoop: function(message) {\n const loop = this.sequenceItems.pop();\n loop.sections = loop.sections || [];\n loop.sectionTitles = loop.sectionTitles || [];\n loop.sections.push({ y: bounds.getVerticalPos(), height: 0 });\n loop.sectionTitles.push(message);\n this.sequenceItems.push(loop);\n },\n bumpVerticalPos: function(bump) {\n this.verticalPos = this.verticalPos + bump;\n this.data.stopy = this.verticalPos;\n },\n getVerticalPos: function() {\n return this.verticalPos;\n },\n getBounds: function() {\n return { bounds: this.data, models: this.models };\n }\n};\n\n/**\n * Draws an note in the diagram with the attached line\n * @param elem - The diagram to draw to.\n * @param noteModel:{x: number, y: number, message: string, width: number} - startx: x axis start position, verticalPos: y axis position, messsage: the message to be shown, width: Set this with a custom width to override the default configured width.\n */\nconst drawNote = function(elem, noteModel) {\n bounds.bumpVerticalPos(conf.boxMargin);\n noteModel.height = conf.boxMargin;\n noteModel.starty = bounds.getVerticalPos();\n const rect = svgDraw.getNoteRect();\n rect.x = noteModel.startx;\n rect.y = noteModel.starty;\n rect.width = noteModel.width || conf.width;\n rect.class = 'note';\n\n let g = elem.append('g');\n const rectElem = svgDraw.drawRect(g, rect);\n const textObj = svgDraw.getTextObj();\n textObj.x = noteModel.startx;\n textObj.y = noteModel.starty;\n textObj.width = rect.width;\n textObj.dy = '1em';\n textObj.text = noteModel.message;\n textObj.class = 'noteText';\n textObj.fontFamily = conf.noteFontFamily;\n textObj.fontSize = conf.noteFontSize;\n textObj.fontWeight = conf.noteFontWeight;\n textObj.anchor = conf.noteAlign;\n textObj.textMargin = conf.noteMargin;\n textObj.valign = conf.noteAlign;\n\n let textElem = drawText(g, textObj);\n\n let textHeight = Math.round(\n textElem.map(te => (te._groups || te)[0][0].getBBox().height).reduce((acc, curr) => acc + curr)\n );\n\n rectElem.attr('height', textHeight + 2 * conf.noteMargin);\n noteModel.height += textHeight + 2 * conf.noteMargin;\n bounds.bumpVerticalPos(textHeight + 2 * conf.noteMargin);\n noteModel.stopy = noteModel.starty + textHeight + 2 * conf.noteMargin;\n noteModel.stopx = noteModel.startx + rect.width;\n bounds.insert(noteModel.startx, noteModel.starty, noteModel.stopx, noteModel.stopy);\n bounds.models.addNote(noteModel);\n};\n\nconst messageFont = cnf => {\n return {\n fontFamily: cnf.messageFontFamily,\n fontSize: cnf.messageFontSize,\n fontWeight: cnf.messageFontWeight\n };\n};\nconst noteFont = cnf => {\n return {\n fontFamily: cnf.noteFontFamily,\n fontSize: cnf.noteFontSize,\n fontWeight: cnf.noteFontWeight\n };\n};\nconst actorFont = cnf => {\n return {\n fontFamily: cnf.actorFontFamily,\n fontSize: cnf.actorFontSize,\n fontWeight: cnf.actorFontWeight\n };\n};\n\n/**\n * Draws a message\n * @param g - the parent of the message element\n * @param msgModel - the model containing fields describing a message\n */\nconst drawMessage = function(g, msgModel) {\n bounds.bumpVerticalPos(10);\n const { startx, stopx, starty, message, type, sequenceIndex } = msgModel;\n const lines = common.splitBreaks(message).length;\n let textDims = utils.calculateTextDimensions(message, messageFont(conf));\n const lineHeight = textDims.height / lines;\n msgModel.height += lineHeight;\n\n bounds.bumpVerticalPos(lineHeight);\n const textObj = svgDraw.getTextObj();\n textObj.x = startx;\n textObj.y = starty + 10;\n textObj.width = stopx - startx;\n textObj.class = 'messageText';\n textObj.dy = '1em';\n textObj.text = message;\n textObj.fontFamily = conf.messageFontFamily;\n textObj.fontSize = conf.messageFontSize;\n textObj.fontWeight = conf.messageFontWeight;\n textObj.anchor = conf.messageAlign;\n textObj.valign = conf.messageAlign;\n textObj.textMargin = conf.wrapPadding;\n textObj.tspan = false;\n\n drawText(g, textObj);\n\n let totalOffset = textDims.height - 10;\n\n let textWidth = textDims.width;\n\n let line, lineStarty;\n if (startx === stopx) {\n lineStarty = bounds.getVerticalPos() + totalOffset;\n if (conf.rightAngles) {\n line = g\n .append('path')\n .attr(\n 'd',\n `M ${startx},${lineStarty} H ${startx +\n Math.max(conf.width / 2, textWidth / 2)} V ${lineStarty + 25} H ${startx}`\n );\n } else {\n totalOffset += conf.boxMargin;\n\n lineStarty = bounds.getVerticalPos() + totalOffset;\n line = g\n .append('path')\n .attr(\n 'd',\n 'M ' +\n startx +\n ',' +\n lineStarty +\n ' C ' +\n (startx + 60) +\n ',' +\n (lineStarty - 10) +\n ' ' +\n (startx + 60) +\n ',' +\n (lineStarty + 30) +\n ' ' +\n startx +\n ',' +\n (lineStarty + 20)\n );\n }\n\n totalOffset += 30;\n const dx = Math.max(textWidth / 2, conf.width / 2);\n bounds.insert(\n startx - dx,\n bounds.getVerticalPos() - 10 + totalOffset,\n stopx + dx,\n bounds.getVerticalPos() + 30 + totalOffset\n );\n } else {\n totalOffset += conf.boxMargin;\n lineStarty = bounds.getVerticalPos() + totalOffset;\n line = g.append('line');\n line.attr('x1', startx);\n line.attr('y1', lineStarty);\n line.attr('x2', stopx);\n line.attr('y2', lineStarty);\n bounds.insert(startx, lineStarty - 10, stopx, lineStarty);\n }\n // Make an SVG Container\n // Draw the line\n if (\n type === parser.yy.LINETYPE.DOTTED ||\n type === parser.yy.LINETYPE.DOTTED_CROSS ||\n type === parser.yy.LINETYPE.DOTTED_POINT ||\n type === parser.yy.LINETYPE.DOTTED_OPEN\n ) {\n line.style('stroke-dasharray', '3, 3');\n line.attr('class', 'messageLine1');\n } else {\n line.attr('class', 'messageLine0');\n }\n\n let url = '';\n if (conf.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(');\n url = url.replace(/\\)/g, '\\\\)');\n }\n\n line.attr('stroke-width', 2);\n line.attr('stroke', 'none'); // handled by theme/css anyway\n line.style('fill', 'none'); // remove any fill colour\n if (type === parser.yy.LINETYPE.SOLID || type === parser.yy.LINETYPE.DOTTED) {\n line.attr('marker-end', 'url(' + url + '#arrowhead)');\n }\n if (type === parser.yy.LINETYPE.SOLID_POINT || type === parser.yy.LINETYPE.DOTTED_POINT) {\n line.attr('marker-end', 'url(' + url + '#filled-head)');\n }\n\n if (type === parser.yy.LINETYPE.SOLID_CROSS || type === parser.yy.LINETYPE.DOTTED_CROSS) {\n line.attr('marker-end', 'url(' + url + '#crosshead)');\n }\n\n // add node number\n if (sequenceDb.showSequenceNumbers() || conf.showSequenceNumbers) {\n line.attr('marker-start', 'url(' + url + '#sequencenumber)');\n g.append('text')\n .attr('x', startx)\n .attr('y', lineStarty + 4)\n .attr('font-family', 'sans-serif')\n .attr('font-size', '12px')\n .attr('text-anchor', 'middle')\n .attr('textLength', '16px')\n .attr('class', 'sequenceNumber')\n .text(sequenceIndex);\n }\n bounds.bumpVerticalPos(totalOffset);\n msgModel.height += totalOffset;\n msgModel.stopy = msgModel.starty + msgModel.height;\n bounds.insert(msgModel.fromBounds, msgModel.starty, msgModel.toBounds, msgModel.stopy);\n};\n\nexport const drawActors = function(diagram, actors, actorKeys, verticalPos) {\n // Draw the actors\n let prevWidth = 0;\n let prevMargin = 0;\n\n for (let i = 0; i < actorKeys.length; i++) {\n const actor = actors[actorKeys[i]];\n\n // Add some rendering data to the object\n actor.width = actor.width || conf.width;\n actor.height = Math.max(actor.height || conf.height, conf.height);\n actor.margin = actor.margin || conf.actorMargin;\n\n actor.x = prevWidth + prevMargin;\n actor.y = verticalPos;\n\n // Draw the box with the attached line\n svgDraw.drawActor(diagram, actor, conf);\n bounds.insert(actor.x, verticalPos, actor.x + actor.width, actor.height);\n\n prevWidth += actor.width;\n prevMargin += actor.margin;\n bounds.models.addActor(actor);\n }\n\n // Add a margin between the actor boxes and the first arrow\n bounds.bumpVerticalPos(conf.height);\n};\n\nexport const setConf = function(cnf) {\n assignWithDepth(conf, cnf);\n\n if (cnf.fontFamily) {\n conf.actorFontFamily = conf.noteFontFamily = conf.messageFontFamily = cnf.fontFamily;\n }\n if (cnf.fontSize) {\n conf.actorFontSize = conf.noteFontSize = conf.messageFontSize = cnf.fontSize;\n }\n if (cnf.fontWeight) {\n conf.actorFontWeight = conf.noteFontWeight = conf.messageFontWeight = cnf.fontWeight;\n }\n};\n\nconst actorActivations = function(actor) {\n return bounds.activations.filter(function(activation) {\n return activation.actor === actor;\n });\n};\n\nconst activationBounds = function(actor, actors) {\n // handle multiple stacked activations for same actor\n const actorObj = actors[actor];\n const activations = actorActivations(actor);\n\n const left = activations.reduce(function(acc, activation) {\n return Math.min(acc, activation.startx);\n }, actorObj.x + actorObj.width / 2);\n const right = activations.reduce(function(acc, activation) {\n return Math.max(acc, activation.stopx);\n }, actorObj.x + actorObj.width / 2);\n return [left, right];\n};\n\nfunction adjustLoopHeightForWrap(loopWidths, msg, preMargin, postMargin, addLoopFn) {\n bounds.bumpVerticalPos(preMargin);\n let heightAdjust = postMargin;\n if (msg.id && msg.message && loopWidths[msg.id]) {\n let loopWidth = loopWidths[msg.id].width;\n let textConf = messageFont(conf);\n msg.message = utils.wrapLabel(`[${msg.message}]`, loopWidth - 2 * conf.wrapPadding, textConf);\n msg.width = loopWidth;\n msg.wrap = true;\n\n // const lines = common.splitBreaks(msg.message).length;\n const textDims = utils.calculateTextDimensions(msg.message, textConf);\n const totalOffset = Math.max(textDims.height, conf.labelBoxHeight);\n heightAdjust = postMargin + totalOffset;\n log.debug(`${totalOffset} - ${msg.message}`);\n }\n addLoopFn(msg);\n bounds.bumpVerticalPos(heightAdjust);\n}\n\n/**\n * Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = function(text, id) {\n conf = configApi.getConfig().sequence;\n parser.yy.clear();\n parser.yy.setWrap(conf.wrap);\n parser.parse(text + '\\n');\n bounds.init();\n log.debug(`C:${JSON.stringify(conf, null, 2)}`);\n\n const diagram = select(`[id=\"${id}\"]`);\n\n // Fetch data from the parsing\n const actors = parser.yy.getActors();\n const actorKeys = parser.yy.getActorKeys();\n const messages = parser.yy.getMessages();\n const title = parser.yy.getTitle();\n\n const maxMessageWidthPerActor = getMaxMessageWidthPerActor(actors, messages);\n conf.height = calculateActorMargins(actors, maxMessageWidthPerActor);\n\n drawActors(diagram, actors, actorKeys, 0);\n const loopWidths = calculateLoopBounds(messages, actors, maxMessageWidthPerActor);\n\n // The arrow head definition is attached to the svg once\n svgDraw.insertArrowHead(diagram);\n svgDraw.insertArrowCrossHead(diagram);\n svgDraw.insertArrowFilledHead(diagram);\n svgDraw.insertSequenceNumber(diagram);\n\n function activeEnd(msg, verticalPos) {\n const activationData = bounds.endActivation(msg);\n if (activationData.starty + 18 > verticalPos) {\n activationData.starty = verticalPos - 6;\n verticalPos += 12;\n }\n svgDraw.drawActivation(\n diagram,\n activationData,\n verticalPos,\n conf,\n actorActivations(msg.from.actor).length\n );\n\n bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);\n }\n\n // Draw the messages/signals\n let sequenceIndex = 1;\n messages.forEach(function(msg) {\n let loopModel, noteModel, msgModel;\n\n switch (msg.type) {\n case parser.yy.LINETYPE.NOTE:\n noteModel = msg.noteModel;\n drawNote(diagram, noteModel);\n break;\n case parser.yy.LINETYPE.ACTIVE_START:\n bounds.newActivation(msg, diagram, actors);\n break;\n case parser.yy.LINETYPE.ACTIVE_END:\n activeEnd(msg, bounds.getVerticalPos());\n break;\n case parser.yy.LINETYPE.LOOP_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n message => bounds.newLoop(message)\n );\n break;\n case parser.yy.LINETYPE.LOOP_END:\n loopModel = bounds.endLoop();\n svgDraw.drawLoop(diagram, loopModel, 'loop', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case parser.yy.LINETYPE.RECT_START:\n adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin, message =>\n bounds.newLoop(undefined, message.message)\n );\n break;\n case parser.yy.LINETYPE.RECT_END:\n loopModel = bounds.endLoop();\n svgDraw.drawBackgroundRect(diagram, loopModel);\n bounds.models.addLoop(loopModel);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n break;\n case parser.yy.LINETYPE.OPT_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n message => bounds.newLoop(message)\n );\n break;\n case parser.yy.LINETYPE.OPT_END:\n loopModel = bounds.endLoop();\n svgDraw.drawLoop(diagram, loopModel, 'opt', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case parser.yy.LINETYPE.ALT_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n message => bounds.newLoop(message)\n );\n break;\n case parser.yy.LINETYPE.ALT_ELSE:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin + conf.boxTextMargin,\n conf.boxMargin,\n message => bounds.addSectionToLoop(message)\n );\n break;\n case parser.yy.LINETYPE.ALT_END:\n loopModel = bounds.endLoop();\n svgDraw.drawLoop(diagram, loopModel, 'alt', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n case parser.yy.LINETYPE.PAR_START:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin + conf.boxTextMargin,\n message => bounds.newLoop(message)\n );\n break;\n case parser.yy.LINETYPE.PAR_AND:\n adjustLoopHeightForWrap(\n loopWidths,\n msg,\n conf.boxMargin + conf.boxTextMargin,\n conf.boxMargin,\n message => bounds.addSectionToLoop(message)\n );\n break;\n case parser.yy.LINETYPE.PAR_END:\n loopModel = bounds.endLoop();\n svgDraw.drawLoop(diagram, loopModel, 'par', conf);\n bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());\n bounds.models.addLoop(loopModel);\n break;\n default:\n try {\n // lastMsg = msg\n msgModel = msg.msgModel;\n msgModel.starty = bounds.getVerticalPos();\n msgModel.sequenceIndex = sequenceIndex;\n drawMessage(diagram, msgModel);\n bounds.models.addMessage(msgModel);\n } catch (e) {\n log.error('error while drawing message', e);\n }\n }\n // Increment sequence counter if msg.type is a line (and not another event like activation or note, etc)\n if (\n [\n parser.yy.LINETYPE.SOLID_OPEN,\n parser.yy.LINETYPE.DOTTED_OPEN,\n parser.yy.LINETYPE.SOLID,\n parser.yy.LINETYPE.DOTTED,\n parser.yy.LINETYPE.SOLID_CROSS,\n parser.yy.LINETYPE.DOTTED_CROSS,\n parser.yy.LINETYPE.SOLID_POINT,\n parser.yy.LINETYPE.DOTTED_POINT\n ].includes(msg.type)\n ) {\n sequenceIndex++;\n }\n });\n\n if (conf.mirrorActors) {\n // Draw actors below diagram\n bounds.bumpVerticalPos(conf.boxMargin * 2);\n drawActors(diagram, actors, actorKeys, bounds.getVerticalPos());\n }\n\n const { bounds: box } = bounds.getBounds();\n\n // Adjust line height of actor lines now that the height of the diagram is known\n log.debug('For line height fix Querying: #' + id + ' .actor-line');\n const actorLines = selectAll('#' + id + ' .actor-line');\n actorLines.attr('y2', box.stopy);\n\n let height = box.stopy - box.starty + 2 * conf.diagramMarginY;\n if (conf.mirrorActors) {\n height = height - conf.boxMargin + conf.bottomMarginAdj;\n }\n\n const width = box.stopx - box.startx + 2 * conf.diagramMarginX;\n\n if (title) {\n diagram\n .append('text')\n .text(title)\n .attr('x', (box.stopx - box.startx) / 2 - 2 * conf.diagramMarginX)\n .attr('y', -25);\n }\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n const extraVertForTitle = title ? 40 : 0;\n diagram.attr(\n 'viewBox',\n box.startx -\n conf.diagramMarginX +\n ' -' +\n (conf.diagramMarginY + extraVertForTitle) +\n ' ' +\n width +\n ' ' +\n (height + extraVertForTitle)\n );\n log.debug(`models:`, bounds.models);\n};\n\n/**\n * Retrieves the max message width of each actor, supports signals (messages, loops)\n * and notes.\n *\n * It will enumerate each given message, and will determine its text width, in relation\n * to the actor it originates from, and destined to.\n *\n * @param actors - The actors map\n * @param messages - A list of message objects to iterate\n */\nconst getMaxMessageWidthPerActor = function(actors, messages) {\n const maxMessageWidthPerActor = {};\n\n messages.forEach(function(msg) {\n if (actors[msg.to] && actors[msg.from]) {\n const actor = actors[msg.to];\n\n // If this is the first actor, and the message is left of it, no need to calculate the margin\n if (msg.placement === parser.yy.PLACEMENT.LEFTOF && !actor.prevActor) {\n return;\n }\n\n // If this is the last actor, and the message is right of it, no need to calculate the margin\n if (msg.placement === parser.yy.PLACEMENT.RIGHTOF && !actor.nextActor) {\n return;\n }\n\n const isNote = msg.placement !== undefined;\n const isMessage = !isNote;\n\n const textFont = isNote ? noteFont(conf) : messageFont(conf);\n let wrappedMessage = msg.wrap\n ? utils.wrapLabel(msg.message, conf.width - 2 * conf.wrapPadding, textFont)\n : msg.message;\n const messageDimensions = utils.calculateTextDimensions(wrappedMessage, textFont);\n const messageWidth = messageDimensions.width + 2 * conf.wrapPadding;\n\n /*\n * The following scenarios should be supported:\n *\n * - There's a message (non-note) between fromActor and toActor\n * - If fromActor is on the right and toActor is on the left, we should\n * define the toActor's margin\n * - If fromActor is on the left and toActor is on the right, we should\n * define the fromActor's margin\n * - There's a note, in which case fromActor == toActor\n * - If the note is to the left of the actor, we should define the previous actor\n * margin\n * - If the note is on the actor, we should define both the previous and next actor\n * margins, each being the half of the note size\n * - If the note is on the right of the actor, we should define the current actor\n * margin\n */\n if (isMessage && msg.from === actor.nextActor) {\n maxMessageWidthPerActor[msg.to] = Math.max(\n maxMessageWidthPerActor[msg.to] || 0,\n messageWidth\n );\n } else if (isMessage && msg.from === actor.prevActor) {\n maxMessageWidthPerActor[msg.from] = Math.max(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth\n );\n } else if (isMessage && msg.from === msg.to) {\n maxMessageWidthPerActor[msg.from] = Math.max(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth / 2\n );\n\n maxMessageWidthPerActor[msg.to] = Math.max(\n maxMessageWidthPerActor[msg.to] || 0,\n messageWidth / 2\n );\n } else if (msg.placement === parser.yy.PLACEMENT.RIGHTOF) {\n maxMessageWidthPerActor[msg.from] = Math.max(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth\n );\n } else if (msg.placement === parser.yy.PLACEMENT.LEFTOF) {\n maxMessageWidthPerActor[actor.prevActor] = Math.max(\n maxMessageWidthPerActor[actor.prevActor] || 0,\n messageWidth\n );\n } else if (msg.placement === parser.yy.PLACEMENT.OVER) {\n if (actor.prevActor) {\n maxMessageWidthPerActor[actor.prevActor] = Math.max(\n maxMessageWidthPerActor[actor.prevActor] || 0,\n messageWidth / 2\n );\n }\n\n if (actor.nextActor) {\n maxMessageWidthPerActor[msg.from] = Math.max(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth / 2\n );\n }\n }\n }\n });\n\n log.debug('maxMessageWidthPerActor:', maxMessageWidthPerActor);\n return maxMessageWidthPerActor;\n};\n\n/**\n * This will calculate the optimal margin for each given actor, for a given\n * actor->messageWidth map.\n *\n * An actor's margin is determined by the width of the actor, the width of the\n * largest message that originates from it, and the configured conf.actorMargin.\n *\n * @param actors - The actors map to calculate margins for\n * @param actorToMessageWidth - A map of actor key -> max message width it holds\n */\nconst calculateActorMargins = function(actors, actorToMessageWidth) {\n let maxHeight = 0;\n Object.keys(actors).forEach(prop => {\n const actor = actors[prop];\n if (actor.wrap) {\n actor.description = utils.wrapLabel(\n actor.description,\n conf.width - 2 * conf.wrapPadding,\n actorFont(conf)\n );\n }\n const actDims = utils.calculateTextDimensions(actor.description, actorFont(conf));\n actor.width = actor.wrap\n ? conf.width\n : Math.max(conf.width, actDims.width + 2 * conf.wrapPadding);\n\n actor.height = actor.wrap ? Math.max(actDims.height, conf.height) : conf.height;\n maxHeight = Math.max(maxHeight, actor.height);\n });\n\n for (let actorKey in actorToMessageWidth) {\n const actor = actors[actorKey];\n\n if (!actor) {\n continue;\n }\n\n const nextActor = actors[actor.nextActor];\n\n // No need to space out an actor that doesn't have a next link\n if (!nextActor) {\n continue;\n }\n\n const messageWidth = actorToMessageWidth[actorKey];\n const actorWidth = messageWidth + conf.actorMargin - actor.width / 2 - nextActor.width / 2;\n\n actor.margin = Math.max(actorWidth, conf.actorMargin);\n }\n\n return Math.max(maxHeight, conf.height);\n};\n\nconst buildNoteModel = function(msg, actors) {\n let startx = actors[msg.from].x;\n let stopx = actors[msg.to].x;\n let shouldWrap = msg.wrap && msg.message;\n\n let textDimensions = utils.calculateTextDimensions(\n shouldWrap ? utils.wrapLabel(msg.message, conf.width, noteFont(conf)) : msg.message,\n noteFont(conf)\n );\n let noteModel = {\n width: shouldWrap\n ? conf.width\n : Math.max(conf.width, textDimensions.width + 2 * conf.noteMargin),\n height: 0,\n startx: actors[msg.from].x,\n stopx: 0,\n starty: 0,\n stopy: 0,\n message: msg.message\n };\n if (msg.placement === parser.yy.PLACEMENT.RIGHTOF) {\n noteModel.width = shouldWrap\n ? Math.max(conf.width, textDimensions.width)\n : Math.max(\n actors[msg.from].width / 2 + actors[msg.to].width / 2,\n textDimensions.width + 2 * conf.noteMargin\n );\n noteModel.startx = startx + (actors[msg.from].width + conf.actorMargin) / 2;\n } else if (msg.placement === parser.yy.PLACEMENT.LEFTOF) {\n noteModel.width = shouldWrap\n ? Math.max(conf.width, textDimensions.width + 2 * conf.noteMargin)\n : Math.max(\n actors[msg.from].width / 2 + actors[msg.to].width / 2,\n textDimensions.width + 2 * conf.noteMargin\n );\n noteModel.startx = startx - noteModel.width + (actors[msg.from].width - conf.actorMargin) / 2;\n } else if (msg.to === msg.from) {\n textDimensions = utils.calculateTextDimensions(\n shouldWrap\n ? utils.wrapLabel(msg.message, Math.max(conf.width, actors[msg.from].width), noteFont(conf))\n : msg.message,\n noteFont(conf)\n );\n noteModel.width = shouldWrap\n ? Math.max(conf.width, actors[msg.from].width)\n : Math.max(actors[msg.from].width, conf.width, textDimensions.width + 2 * conf.noteMargin);\n noteModel.startx = startx + (actors[msg.from].width - noteModel.width) / 2;\n } else {\n noteModel.width =\n Math.abs(startx + actors[msg.from].width / 2 - (stopx + actors[msg.to].width / 2)) +\n conf.actorMargin;\n noteModel.startx =\n startx < stopx\n ? startx + actors[msg.from].width / 2 - conf.actorMargin / 2\n : stopx + actors[msg.to].width / 2 - conf.actorMargin / 2;\n }\n if (shouldWrap) {\n noteModel.message = utils.wrapLabel(\n msg.message,\n noteModel.width - 2 * conf.wrapPadding,\n noteFont(conf)\n );\n }\n log.debug(\n `NM:[${noteModel.startx},${noteModel.stopx},${noteModel.starty},${noteModel.stopy}:${noteModel.width},${noteModel.height}=${msg.message}]`\n );\n return noteModel;\n};\n\nconst buildMessageModel = function(msg, actors) {\n let process = false;\n if (\n [\n parser.yy.LINETYPE.SOLID_OPEN,\n parser.yy.LINETYPE.DOTTED_OPEN,\n parser.yy.LINETYPE.SOLID,\n parser.yy.LINETYPE.DOTTED,\n parser.yy.LINETYPE.SOLID_CROSS,\n parser.yy.LINETYPE.DOTTED_CROSS,\n parser.yy.LINETYPE.SOLID_POINT,\n parser.yy.LINETYPE.DOTTED_POINT\n ].includes(msg.type)\n ) {\n process = true;\n }\n if (!process) {\n return {};\n }\n const fromBounds = activationBounds(msg.from, actors);\n const toBounds = activationBounds(msg.to, actors);\n const fromIdx = fromBounds[0] <= toBounds[0] ? 1 : 0;\n const toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;\n const allBounds = fromBounds.concat(toBounds);\n const boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);\n if (msg.wrap && msg.message) {\n msg.message = utils.wrapLabel(\n msg.message,\n Math.max(boundedWidth + 2 * conf.wrapPadding, conf.width),\n messageFont(conf)\n );\n }\n const msgDims = utils.calculateTextDimensions(msg.message, messageFont(conf));\n\n return {\n width: Math.max(\n msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding,\n boundedWidth + 2 * conf.wrapPadding,\n conf.width\n ),\n height: 0,\n startx: fromBounds[fromIdx],\n stopx: toBounds[toIdx],\n starty: 0,\n stopy: 0,\n message: msg.message,\n type: msg.type,\n wrap: msg.wrap,\n fromBounds: Math.min.apply(null, allBounds),\n toBounds: Math.max.apply(null, allBounds)\n };\n};\n\nconst calculateLoopBounds = function(messages, actors) {\n const loops = {};\n const stack = [];\n let current, noteModel, msgModel;\n\n messages.forEach(function(msg) {\n msg.id = utils.random({ length: 10 });\n switch (msg.type) {\n case parser.yy.LINETYPE.LOOP_START:\n case parser.yy.LINETYPE.ALT_START:\n case parser.yy.LINETYPE.OPT_START:\n case parser.yy.LINETYPE.PAR_START:\n stack.push({\n id: msg.id,\n msg: msg.message,\n from: Number.MAX_SAFE_INTEGER,\n to: Number.MIN_SAFE_INTEGER,\n width: 0\n });\n break;\n case parser.yy.LINETYPE.ALT_ELSE:\n case parser.yy.LINETYPE.PAR_AND:\n if (msg.message) {\n current = stack.pop();\n loops[current.id] = current;\n loops[msg.id] = current;\n stack.push(current);\n }\n break;\n case parser.yy.LINETYPE.LOOP_END:\n case parser.yy.LINETYPE.ALT_END:\n case parser.yy.LINETYPE.OPT_END:\n case parser.yy.LINETYPE.PAR_END:\n current = stack.pop();\n loops[current.id] = current;\n break;\n case parser.yy.LINETYPE.ACTIVE_START:\n {\n const actorRect = actors[msg.from ? msg.from.actor : msg.to.actor];\n const stackedSize = actorActivations(msg.from ? msg.from.actor : msg.to.actor).length;\n const x =\n actorRect.x + actorRect.width / 2 + ((stackedSize - 1) * conf.activationWidth) / 2;\n const toAdd = {\n startx: x,\n stopx: x + conf.activationWidth,\n actor: msg.from.actor,\n enabled: true\n };\n bounds.activations.push(toAdd);\n }\n break;\n case parser.yy.LINETYPE.ACTIVE_END:\n {\n const lastActorActivationIdx = bounds.activations\n .map(a => a.actor)\n .lastIndexOf(msg.from.actor);\n delete bounds.activations.splice(lastActorActivationIdx, 1)[0];\n }\n break;\n }\n const isNote = msg.placement !== undefined;\n if (isNote) {\n noteModel = buildNoteModel(msg, actors);\n msg.noteModel = noteModel;\n stack.forEach(stk => {\n current = stk;\n current.from = Math.min(current.from, noteModel.startx);\n current.to = Math.max(current.to, noteModel.startx + noteModel.width);\n current.width =\n Math.max(current.width, Math.abs(current.from - current.to)) - conf.labelBoxWidth;\n });\n } else {\n msgModel = buildMessageModel(msg, actors);\n msg.msgModel = msgModel;\n if (msgModel.startx && msgModel.stopx && stack.length > 0) {\n stack.forEach(stk => {\n current = stk;\n if (msgModel.startx === msgModel.stopx) {\n let from = actors[msg.from];\n let to = actors[msg.to];\n current.from = Math.min(\n from.x - msgModel.width / 2,\n from.x - from.width / 2,\n current.from\n );\n current.to = Math.max(to.x + msgModel.width / 2, to.x + from.width / 2, current.to);\n current.width =\n Math.max(current.width, Math.abs(current.to - current.from)) - conf.labelBoxWidth;\n } else {\n current.from = Math.min(msgModel.startx, current.from);\n current.to = Math.max(msgModel.stopx, current.to);\n current.width = Math.max(current.width, msgModel.width) - conf.labelBoxWidth;\n }\n });\n }\n }\n });\n bounds.activations = [];\n log.debug('Loop type widths:', loops);\n return loops;\n};\n\nexport default {\n bounds,\n drawActors,\n setConf,\n draw\n};\n","import moment from 'moment-mini';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\nimport { log } from '../../logger';\nimport * as configApi from '../../config';\nimport utils from '../../utils';\nimport mermaidAPI from '../../mermaidAPI';\n\nlet dateFormat = '';\nlet axisFormat = '';\nlet todayMarker = '';\nlet excludes = [];\nlet title = '';\nlet sections = [];\nlet tasks = [];\nlet currentSection = '';\nconst tags = ['active', 'done', 'crit', 'milestone'];\nlet funs = [];\nlet inclusiveEndDates = false;\n\n// The serial order of the task in the script\nlet lastOrder = 0;\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nexport const clear = function() {\n sections = [];\n tasks = [];\n currentSection = '';\n funs = [];\n title = '';\n taskCnt = 0;\n lastTask = undefined;\n lastTaskID = undefined;\n rawTasks = [];\n dateFormat = '';\n axisFormat = '';\n todayMarker = '';\n excludes = [];\n inclusiveEndDates = false;\n lastOrder = 0;\n};\n\nexport const setAxisFormat = function(txt) {\n axisFormat = txt;\n};\n\nexport const getAxisFormat = function() {\n return axisFormat;\n};\n\nexport const setTodayMarker = function(txt) {\n todayMarker = txt;\n};\n\nexport const getTodayMarker = function() {\n return todayMarker;\n};\n\nexport const setDateFormat = function(txt) {\n dateFormat = txt;\n};\n\nexport const enableInclusiveEndDates = function() {\n inclusiveEndDates = true;\n};\n\nexport const endDatesAreInclusive = function() {\n return inclusiveEndDates;\n};\n\nexport const getDateFormat = function() {\n return dateFormat;\n};\n\nexport const setExcludes = function(txt) {\n excludes = txt.toLowerCase().split(/[\\s,]+/);\n};\n\nexport const getExcludes = function() {\n return excludes;\n};\n\nexport const setTitle = function(txt) {\n title = txt;\n};\n\nexport const getTitle = function() {\n return title;\n};\n\nexport const addSection = function(txt) {\n currentSection = txt;\n sections.push(txt);\n};\n\nexport const getSections = function() {\n return sections;\n};\n\nexport const getTasks = function() {\n let allItemsPricessed = compileTasks();\n const maxDepth = 10;\n let iterationCount = 0;\n while (!allItemsPricessed && iterationCount < maxDepth) {\n allItemsPricessed = compileTasks();\n iterationCount++;\n }\n\n tasks = rawTasks;\n\n return tasks;\n};\n\nconst isInvalidDate = function(date, dateFormat, excludes) {\n if (date.isoWeekday() >= 6 && excludes.indexOf('weekends') >= 0) {\n return true;\n }\n if (excludes.indexOf(date.format('dddd').toLowerCase()) >= 0) {\n return true;\n }\n return excludes.indexOf(date.format(dateFormat.trim())) >= 0;\n};\n\nconst checkTaskDates = function(task, dateFormat, excludes) {\n if (!excludes.length || task.manualEndTime) return;\n let startTime = moment(task.startTime, dateFormat, true);\n startTime.add(1, 'd');\n let endTime = moment(task.endTime, dateFormat, true);\n let renderEndTime = fixTaskDates(startTime, endTime, dateFormat, excludes);\n task.endTime = endTime.toDate();\n task.renderEndTime = renderEndTime;\n};\n\nconst fixTaskDates = function(startTime, endTime, dateFormat, excludes) {\n let invalid = false;\n let renderEndTime = null;\n while (startTime <= endTime) {\n if (!invalid) {\n renderEndTime = endTime.toDate();\n }\n invalid = isInvalidDate(startTime, dateFormat, excludes);\n if (invalid) {\n endTime.add(1, 'd');\n }\n startTime.add(1, 'd');\n }\n return renderEndTime;\n};\n\nconst getStartDate = function(prevTime, dateFormat, str) {\n str = str.trim();\n\n // Test for after\n const re = /^after\\s+([\\d\\w- ]+)/;\n const afterStatement = re.exec(str.trim());\n\n if (afterStatement !== null) {\n // check all after ids and take the latest\n let latestEndingTask = null;\n afterStatement[1].split(' ').forEach(function(id) {\n let task = findTaskById(id);\n if (typeof task !== 'undefined') {\n if (!latestEndingTask) {\n latestEndingTask = task;\n } else {\n if (task.endTime > latestEndingTask.endTime) {\n latestEndingTask = task;\n }\n }\n }\n });\n\n if (!latestEndingTask) {\n const dt = new Date();\n dt.setHours(0, 0, 0, 0);\n return dt;\n } else {\n return latestEndingTask.endTime;\n }\n }\n\n // Check for actual date set\n let mDate = moment(str, dateFormat.trim(), true);\n if (mDate.isValid()) {\n return mDate.toDate();\n } else {\n log.debug('Invalid date:' + str);\n log.debug('With date format:' + dateFormat.trim());\n }\n\n // Default date - now\n return new Date();\n};\n\nconst durationToDate = function(durationStatement, relativeTime) {\n if (durationStatement !== null) {\n switch (durationStatement[2]) {\n case 's':\n relativeTime.add(durationStatement[1], 'seconds');\n break;\n case 'm':\n relativeTime.add(durationStatement[1], 'minutes');\n break;\n case 'h':\n relativeTime.add(durationStatement[1], 'hours');\n break;\n case 'd':\n relativeTime.add(durationStatement[1], 'days');\n break;\n case 'w':\n relativeTime.add(durationStatement[1], 'weeks');\n break;\n }\n }\n // Default date - now\n return relativeTime.toDate();\n};\n\nconst getEndDate = function(prevTime, dateFormat, str, inclusive) {\n inclusive = inclusive || false;\n str = str.trim();\n\n // Check for actual date\n let mDate = moment(str, dateFormat.trim(), true);\n if (mDate.isValid()) {\n if (inclusive) {\n mDate.add(1, 'd');\n }\n return mDate.toDate();\n }\n\n return durationToDate(/^([\\d]+)([wdhms])/.exec(str.trim()), moment(prevTime));\n};\n\nlet taskCnt = 0;\nconst parseId = function(idStr) {\n if (typeof idStr === 'undefined') {\n taskCnt = taskCnt + 1;\n return 'task' + taskCnt;\n }\n return idStr;\n};\n// id, startDate, endDate\n// id, startDate, length\n// id, after x, endDate\n// id, after x, length\n// startDate, endDate\n// startDate, length\n// after x, endDate\n// after x, length\n// endDate\n// length\n\nconst compileData = function(prevTask, dataStr) {\n let ds;\n\n if (dataStr.substr(0, 1) === ':') {\n ds = dataStr.substr(1, dataStr.length);\n } else {\n ds = dataStr;\n }\n\n const data = ds.split(',');\n\n const task = {};\n\n // Get tags like active, done, crit and milestone\n getTaskTags(data, task, tags);\n\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i].trim();\n }\n\n let endTimeData = '';\n switch (data.length) {\n case 1:\n task.id = parseId();\n task.startTime = prevTask.endTime;\n endTimeData = data[0];\n break;\n case 2:\n task.id = parseId();\n task.startTime = getStartDate(undefined, dateFormat, data[0]);\n endTimeData = data[1];\n break;\n case 3:\n task.id = parseId(data[0]);\n task.startTime = getStartDate(undefined, dateFormat, data[1]);\n endTimeData = data[2];\n break;\n default:\n }\n\n if (endTimeData) {\n task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates);\n task.manualEndTime = moment(endTimeData, 'YYYY-MM-DD', true).isValid();\n checkTaskDates(task, dateFormat, excludes);\n }\n\n return task;\n};\n\nconst parseData = function(prevTaskId, dataStr) {\n let ds;\n if (dataStr.substr(0, 1) === ':') {\n ds = dataStr.substr(1, dataStr.length);\n } else {\n ds = dataStr;\n }\n\n const data = ds.split(',');\n\n const task = {};\n\n // Get tags like active, done, crit and milestone\n getTaskTags(data, task, tags);\n\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i].trim();\n }\n\n switch (data.length) {\n case 1:\n task.id = parseId();\n task.startTime = {\n type: 'prevTaskEnd',\n id: prevTaskId\n };\n task.endTime = {\n data: data[0]\n };\n break;\n case 2:\n task.id = parseId();\n task.startTime = {\n type: 'getStartDate',\n startData: data[0]\n };\n task.endTime = {\n data: data[1]\n };\n break;\n case 3:\n task.id = parseId(data[0]);\n task.startTime = {\n type: 'getStartDate',\n startData: data[1]\n };\n task.endTime = {\n data: data[2]\n };\n break;\n default:\n }\n\n return task;\n};\n\nlet lastTask;\nlet lastTaskID;\nlet rawTasks = [];\nconst taskDb = {};\nexport const addTask = function(descr, data) {\n const rawTask = {\n section: currentSection,\n type: currentSection,\n processed: false,\n manualEndTime: false,\n renderEndTime: null,\n raw: { data: data },\n task: descr,\n classes: []\n };\n const taskInfo = parseData(lastTaskID, data);\n rawTask.raw.startTime = taskInfo.startTime;\n rawTask.raw.endTime = taskInfo.endTime;\n rawTask.id = taskInfo.id;\n rawTask.prevTaskId = lastTaskID;\n rawTask.active = taskInfo.active;\n rawTask.done = taskInfo.done;\n rawTask.crit = taskInfo.crit;\n rawTask.milestone = taskInfo.milestone;\n rawTask.order = lastOrder;\n\n lastOrder++;\n\n const pos = rawTasks.push(rawTask);\n\n lastTaskID = rawTask.id;\n // Store cross ref\n taskDb[rawTask.id] = pos - 1;\n};\n\nexport const findTaskById = function(id) {\n const pos = taskDb[id];\n return rawTasks[pos];\n};\n\nexport const addTaskOrg = function(descr, data) {\n const newTask = {\n section: currentSection,\n type: currentSection,\n description: descr,\n task: descr,\n classes: []\n };\n const taskInfo = compileData(lastTask, data);\n newTask.startTime = taskInfo.startTime;\n newTask.endTime = taskInfo.endTime;\n newTask.id = taskInfo.id;\n newTask.active = taskInfo.active;\n newTask.done = taskInfo.done;\n newTask.crit = taskInfo.crit;\n newTask.milestone = taskInfo.milestone;\n lastTask = newTask;\n tasks.push(newTask);\n};\n\nconst compileTasks = function() {\n const compileTask = function(pos) {\n const task = rawTasks[pos];\n let startTime = '';\n switch (rawTasks[pos].raw.startTime.type) {\n case 'prevTaskEnd': {\n const prevTask = findTaskById(task.prevTaskId);\n task.startTime = prevTask.endTime;\n break;\n }\n case 'getStartDate':\n startTime = getStartDate(undefined, dateFormat, rawTasks[pos].raw.startTime.startData);\n if (startTime) {\n rawTasks[pos].startTime = startTime;\n }\n break;\n }\n\n if (rawTasks[pos].startTime) {\n rawTasks[pos].endTime = getEndDate(\n rawTasks[pos].startTime,\n dateFormat,\n rawTasks[pos].raw.endTime.data,\n inclusiveEndDates\n );\n if (rawTasks[pos].endTime) {\n rawTasks[pos].processed = true;\n rawTasks[pos].manualEndTime = moment(\n rawTasks[pos].raw.endTime.data,\n 'YYYY-MM-DD',\n true\n ).isValid();\n checkTaskDates(rawTasks[pos], dateFormat, excludes);\n }\n }\n\n return rawTasks[pos].processed;\n };\n\n let allProcessed = true;\n for (let i = 0; i < rawTasks.length; i++) {\n compileTask(i);\n\n allProcessed = allProcessed && rawTasks[i].processed;\n }\n return allProcessed;\n};\n\n/**\n * Called by parser when a link is found. Adds the URL to the vertex data.\n * @param ids Comma separated list of ids\n * @param linkStr URL to create a link for\n */\nexport const setLink = function(ids, _linkStr) {\n let linkStr = _linkStr;\n if (configApi.getConfig().securityLevel !== 'loose') {\n linkStr = sanitizeUrl(_linkStr);\n }\n ids.split(',').forEach(function(id) {\n let rawTask = findTaskById(id);\n if (typeof rawTask !== 'undefined') {\n pushFun(id, () => {\n window.open(linkStr, '_self');\n });\n }\n });\n setClass(ids, 'clickable');\n};\n\n/**\n * Called by parser when a special node is found, e.g. a clickable element.\n * @param ids Comma separated list of ids\n * @param className Class to add\n */\nexport const setClass = function(ids, className) {\n ids.split(',').forEach(function(id) {\n let rawTask = findTaskById(id);\n if (typeof rawTask !== 'undefined') {\n rawTask.classes.push(className);\n }\n });\n};\n\nconst setClickFun = function(id, functionName, functionArgs) {\n if (configApi.getConfig().securityLevel !== 'loose') {\n return;\n }\n if (typeof functionName === 'undefined') {\n return;\n }\n\n let argList = [];\n if (typeof functionArgs === 'string') {\n /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n /* Removes all double quotes at the start and end of an argument */\n /* This preserves all starting and ending whitespace inside */\n if (item.charAt(0) === '\"' && item.charAt(item.length - 1) === '\"') {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n\n /* if no arguments passed into callback, default to passing in id */\n if (argList.length === 0) {\n argList.push(id);\n }\n\n let rawTask = findTaskById(id);\n if (typeof rawTask !== 'undefined') {\n pushFun(id, () => {\n utils.runFunc(functionName, ...argList);\n });\n }\n};\n\n/**\n * The callbackFunction is executed in a click event bound to the task with the specified id or the task's assigned text\n * @param id The task's id\n * @param callbackFunction A function to be executed when clicked on the task or the task's text\n */\nconst pushFun = function(id, callbackFunction) {\n funs.push(function() {\n // const elem = d3.select(element).select(`[id=\"${id}\"]`)\n const elem = document.querySelector(`[id=\"${id}\"]`);\n if (elem !== null) {\n elem.addEventListener('click', function() {\n callbackFunction();\n });\n }\n });\n funs.push(function() {\n // const elem = d3.select(element).select(`[id=\"${id}-text\"]`)\n const elem = document.querySelector(`[id=\"${id}-text\"]`);\n if (elem !== null) {\n elem.addEventListener('click', function() {\n callbackFunction();\n });\n }\n });\n};\n\n/**\n * Called by parser when a click definition is found. Registers an event handler.\n * @param ids Comma separated list of ids\n * @param functionName Function to be called on click\n * @param functionArgs Function args the function should be called with\n */\nexport const setClickEvent = function(ids, functionName, functionArgs) {\n ids.split(',').forEach(function(id) {\n setClickFun(id, functionName, functionArgs);\n });\n setClass(ids, 'clickable');\n};\n\n/**\n * Binds all functions previously added to fun (specified through click) to the element\n * @param element\n */\nexport const bindFunctions = function(element) {\n funs.forEach(function(fun) {\n fun(element);\n });\n};\n\nexport default {\n parseDirective,\n getConfig: () => configApi.getConfig().gantt,\n clear,\n setDateFormat,\n getDateFormat,\n enableInclusiveEndDates,\n endDatesAreInclusive,\n setAxisFormat,\n getAxisFormat,\n setTodayMarker,\n getTodayMarker,\n setTitle,\n getTitle,\n addSection,\n getSections,\n getTasks,\n addTask,\n findTaskById,\n addTaskOrg,\n setExcludes,\n getExcludes,\n setClickEvent,\n setLink,\n bindFunctions,\n durationToDate\n};\n\nfunction getTaskTags(data, task, tags) {\n let matchFound = true;\n while (matchFound) {\n matchFound = false;\n tags.forEach(function(t) {\n const pattern = '^\\\\s*' + t + '\\\\s*$';\n const regex = new RegExp(pattern);\n if (data[0].match(regex)) {\n task[t] = true;\n data.shift(1);\n matchFound = true;\n }\n });\n }\n}\n","import {\n select,\n scaleTime,\n min,\n max,\n scaleLinear,\n interpolateHcl,\n axisBottom,\n timeFormat\n} from 'd3';\nimport { parser } from './parser/gantt';\nimport common from '../common/common';\nimport ganttDb from './ganttDb';\nimport { configureSvgSize } from '../../utils';\n\nparser.yy = ganttDb;\n\nconst conf = {\n titleTopMargin: 25,\n barHeight: 20,\n barGap: 4,\n topPadding: 50,\n rightPadding: 75,\n leftPadding: 75,\n gridLineStartPadding: 35,\n fontSize: 11,\n fontFamily: '\"Open-Sans\", \"sans-serif\"'\n};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\nlet w;\nexport const draw = function(text, id) {\n parser.yy.clear();\n parser.parse(text);\n\n const elem = document.getElementById(id);\n w = elem.parentElement.offsetWidth;\n\n if (typeof w === 'undefined') {\n w = 1200;\n }\n\n if (typeof conf.useWidth !== 'undefined') {\n w = conf.useWidth;\n }\n\n const taskArray = parser.yy.getTasks();\n\n // Set height based on number of tasks\n const h = taskArray.length * (conf.barHeight + conf.barGap) + 2 * conf.topPadding;\n\n // Set viewBox\n elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h);\n const svg = select(`[id=\"${id}\"]`);\n\n // Set timescale\n const timeScale = scaleTime()\n .domain([\n min(taskArray, function(d) {\n return d.startTime;\n }),\n max(taskArray, function(d) {\n return d.endTime;\n })\n ])\n .rangeRound([0, w - conf.leftPadding - conf.rightPadding]);\n\n let categories = [];\n\n for (let i = 0; i < taskArray.length; i++) {\n categories.push(taskArray[i].type);\n }\n\n const catsUnfiltered = categories; // for vert labels\n\n categories = checkUnique(categories);\n\n function taskCompare(a, b) {\n const taskA = a.startTime;\n const taskB = b.startTime;\n let result = 0;\n if (taskA > taskB) {\n result = 1;\n } else if (taskA < taskB) {\n result = -1;\n }\n return result;\n }\n\n // Sort the task array using the above taskCompare() so that\n // tasks are created based on their order of startTime\n taskArray.sort(taskCompare);\n\n makeGant(taskArray, w, h);\n\n configureSvgSize(svg, h, w, conf.useMaxWidth);\n\n svg\n .append('text')\n .text(parser.yy.getTitle())\n .attr('x', w / 2)\n .attr('y', conf.titleTopMargin)\n .attr('class', 'titleText');\n\n function makeGant(tasks, pageWidth, pageHeight) {\n const barHeight = conf.barHeight;\n const gap = barHeight + conf.barGap;\n const topPadding = conf.topPadding;\n const leftPadding = conf.leftPadding;\n\n const colorScale = scaleLinear()\n .domain([0, categories.length])\n .range(['#00B9FA', '#F95002'])\n .interpolate(interpolateHcl);\n\n makeGrid(leftPadding, topPadding, pageWidth, pageHeight);\n drawRects(tasks, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight);\n vertLabels(gap, topPadding, leftPadding, barHeight, colorScale);\n drawToday(leftPadding, topPadding, pageWidth, pageHeight);\n }\n\n function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w) {\n // Draw background rects covering the entire width of the graph, these form the section rows.\n svg\n .append('g')\n .selectAll('rect')\n .data(theArray)\n .enter()\n .append('rect')\n .attr('x', 0)\n .attr('y', function(d, i) {\n // Ignore the incoming i value and use our order instead\n i = d.order;\n return i * theGap + theTopPad - 2;\n })\n .attr('width', function() {\n return w - conf.rightPadding / 2;\n })\n .attr('height', theGap)\n .attr('class', function(d) {\n for (let i = 0; i < categories.length; i++) {\n if (d.type === categories[i]) {\n return 'section section' + (i % conf.numberSectionStyles);\n }\n }\n return 'section section0';\n });\n\n // Draw the rects representing the tasks\n const rectangles = svg\n .append('g')\n .selectAll('rect')\n .data(theArray)\n .enter();\n\n rectangles\n .append('rect')\n .attr('id', function(d) {\n return d.id;\n })\n .attr('rx', 3)\n .attr('ry', 3)\n .attr('x', function(d) {\n if (d.milestone) {\n return (\n timeScale(d.startTime) +\n theSidePad +\n 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) -\n 0.5 * theBarHeight\n );\n }\n return timeScale(d.startTime) + theSidePad;\n })\n .attr('y', function(d, i) {\n // Ignore the incoming i value and use our order instead\n i = d.order;\n return i * theGap + theTopPad;\n })\n .attr('width', function(d) {\n if (d.milestone) {\n return theBarHeight;\n }\n return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime);\n })\n .attr('height', theBarHeight)\n .attr('transform-origin', function(d, i) {\n return (\n (\n timeScale(d.startTime) +\n theSidePad +\n 0.5 * (timeScale(d.endTime) - timeScale(d.startTime))\n ).toString() +\n 'px ' +\n (i * theGap + theTopPad + 0.5 * theBarHeight).toString() +\n 'px'\n );\n })\n .attr('class', function(d) {\n const res = 'task';\n\n let classStr = '';\n if (d.classes.length > 0) {\n classStr = d.classes.join(' ');\n }\n\n let secNum = 0;\n for (let i = 0; i < categories.length; i++) {\n if (d.type === categories[i]) {\n secNum = i % conf.numberSectionStyles;\n }\n }\n\n let taskClass = '';\n if (d.active) {\n if (d.crit) {\n taskClass += ' activeCrit';\n } else {\n taskClass = ' active';\n }\n } else if (d.done) {\n if (d.crit) {\n taskClass = ' doneCrit';\n } else {\n taskClass = ' done';\n }\n } else {\n if (d.crit) {\n taskClass += ' crit';\n }\n }\n\n if (taskClass.length === 0) {\n taskClass = ' task';\n }\n\n if (d.milestone) {\n taskClass = ' milestone ' + taskClass;\n }\n\n taskClass += secNum;\n\n taskClass += ' ' + classStr;\n\n return res + taskClass;\n });\n\n // Append task labels\n rectangles\n .append('text')\n .attr('id', function(d) {\n return d.id + '-text';\n })\n .text(function(d) {\n return d.task;\n })\n .attr('font-size', conf.fontSize)\n .attr('x', function(d) {\n let startX = timeScale(d.startTime);\n let endX = timeScale(d.renderEndTime || d.endTime);\n if (d.milestone) {\n startX += 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;\n }\n if (d.milestone) {\n endX = startX + theBarHeight;\n }\n const textWidth = this.getBBox().width;\n\n // Check id text width > width of rectangle\n if (textWidth > endX - startX) {\n if (endX + textWidth + 1.5 * conf.leftPadding > w) {\n return startX + theSidePad - 5;\n } else {\n return endX + theSidePad + 5;\n }\n } else {\n return (endX - startX) / 2 + startX + theSidePad;\n }\n })\n .attr('y', function(d, i) {\n // Ignore the incoming i value and use our order instead\n i = d.order;\n return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad;\n })\n .attr('text-height', theBarHeight)\n .attr('class', function(d) {\n const startX = timeScale(d.startTime);\n let endX = timeScale(d.endTime);\n if (d.milestone) {\n endX = startX + theBarHeight;\n }\n const textWidth = this.getBBox().width;\n\n let classStr = '';\n if (d.classes.length > 0) {\n classStr = d.classes.join(' ');\n }\n\n let secNum = 0;\n for (let i = 0; i < categories.length; i++) {\n if (d.type === categories[i]) {\n secNum = i % conf.numberSectionStyles;\n }\n }\n\n let taskType = '';\n if (d.active) {\n if (d.crit) {\n taskType = 'activeCritText' + secNum;\n } else {\n taskType = 'activeText' + secNum;\n }\n }\n\n if (d.done) {\n if (d.crit) {\n taskType = taskType + ' doneCritText' + secNum;\n } else {\n taskType = taskType + ' doneText' + secNum;\n }\n } else {\n if (d.crit) {\n taskType = taskType + ' critText' + secNum;\n }\n }\n\n if (d.milestone) {\n taskType += ' milestoneText';\n }\n\n // Check id text width > width of rectangle\n if (textWidth > endX - startX) {\n if (endX + textWidth + 1.5 * conf.leftPadding > w) {\n return classStr + ' taskTextOutsideLeft taskTextOutside' + secNum + ' ' + taskType;\n } else {\n return (\n classStr +\n ' taskTextOutsideRight taskTextOutside' +\n secNum +\n ' ' +\n taskType +\n ' width-' +\n textWidth\n );\n }\n } else {\n return classStr + ' taskText taskText' + secNum + ' ' + taskType + ' width-' + textWidth;\n }\n });\n }\n\n function makeGrid(theSidePad, theTopPad, w, h) {\n let xAxis = axisBottom(timeScale)\n .tickSize(-h + theTopPad + conf.gridLineStartPadding)\n .tickFormat(timeFormat(parser.yy.getAxisFormat() || conf.axisFormat || '%Y-%m-%d'));\n\n svg\n .append('g')\n .attr('class', 'grid')\n .attr('transform', 'translate(' + theSidePad + ', ' + (h - 50) + ')')\n .call(xAxis)\n .selectAll('text')\n .style('text-anchor', 'middle')\n .attr('fill', '#000')\n .attr('stroke', 'none')\n .attr('font-size', 10)\n .attr('dy', '1em');\n }\n\n function vertLabels(theGap, theTopPad) {\n const numOccurances = [];\n let prevGap = 0;\n\n for (let i = 0; i < categories.length; i++) {\n numOccurances[i] = [categories[i], getCount(categories[i], catsUnfiltered)];\n }\n\n svg\n .append('g') // without doing this, impossible to put grid lines behind text\n .selectAll('text')\n .data(numOccurances)\n .enter()\n .append(function(d) {\n const rows = d[0].split(common.lineBreakRegex);\n const dy = -(rows.length - 1) / 2;\n\n const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n svgLabel.setAttribute('dy', dy + 'em');\n\n for (let j = 0; j < rows.length; j++) {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n tspan.setAttribute('alignment-baseline', 'central');\n tspan.setAttribute('x', '10');\n if (j > 0) tspan.setAttribute('dy', '1em');\n tspan.textContent = rows[j];\n svgLabel.appendChild(tspan);\n }\n return svgLabel;\n })\n .attr('x', 10)\n .attr('y', function(d, i) {\n if (i > 0) {\n for (let j = 0; j < i; j++) {\n prevGap += numOccurances[i - 1][1];\n return (d[1] * theGap) / 2 + prevGap * theGap + theTopPad;\n }\n } else {\n return (d[1] * theGap) / 2 + theTopPad;\n }\n })\n .attr('class', function(d) {\n for (let i = 0; i < categories.length; i++) {\n if (d[0] === categories[i]) {\n return 'sectionTitle sectionTitle' + (i % conf.numberSectionStyles);\n }\n }\n return 'sectionTitle';\n });\n }\n\n function drawToday(theSidePad, theTopPad, w, h) {\n const todayMarker = ganttDb.getTodayMarker();\n if (todayMarker === 'off') {\n return;\n }\n\n const todayG = svg.append('g').attr('class', 'today');\n const today = new Date();\n const todayLine = todayG.append('line');\n\n todayLine\n .attr('x1', timeScale(today) + theSidePad)\n .attr('x2', timeScale(today) + theSidePad)\n .attr('y1', conf.titleTopMargin)\n .attr('y2', h - conf.titleTopMargin)\n .attr('class', 'today');\n\n if (todayMarker !== '') {\n todayLine.attr('style', todayMarker.replace(/,/g, ';'));\n }\n }\n\n // from this stackexchange question: http://stackoverflow.com/questions/1890203/unique-for-arrays-in-javascript\n function checkUnique(arr) {\n const hash = {};\n const result = [];\n for (let i = 0, l = arr.length; i < l; ++i) {\n if (!hash.hasOwnProperty(arr[i])) { // eslint-disable-line\n // it works with objects! in FF, at least\n hash[arr[i]] = true;\n result.push(arr[i]);\n }\n }\n return result;\n }\n\n // from this stackexchange question: http://stackoverflow.com/questions/14227981/count-how-many-strings-in-an-array-have-duplicates-in-the-same-array\n function getCounts(arr) {\n let i = arr.length; // const to loop over\n const obj = {}; // obj to store results\n while (i) {\n obj[arr[--i]] = (obj[arr[i]] || 0) + 1; // count occurrences\n }\n return obj;\n }\n\n // get specific from everything\n function getCount(word, arr) {\n return getCounts(arr)[word] || 0;\n }\n};\n\nexport default {\n setConf,\n draw\n};\n","import { select } from 'd3';\nimport dagre from 'dagre';\nimport graphlib from 'graphlib';\nimport { log } from '../../logger';\nimport classDb, { lookUpDomId } from './classDb';\nimport { parser } from './parser/classDiagram';\nimport svgDraw from './svgDraw';\nimport { configureSvgSize } from '../../utils';\n\nparser.yy = classDb;\n\nlet idCache = {};\nconst padding = 20;\n\nconst conf = {\n dividerMargin: 10,\n padding: 5,\n textHeight: 10\n};\n\n// Todo optimize\nconst getGraphId = function(label) {\n const keys = Object.keys(idCache);\n\n for (let i = 0; i < keys.length; i++) {\n if (idCache[keys[i]].label === label) {\n return keys[i];\n }\n }\n\n return undefined;\n};\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n */\nconst insertMarkers = function(elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'extensionStart')\n .attr('class', 'extension')\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'extensionEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'compositionStart')\n .attr('class', 'extension')\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'compositionEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'aggregationStart')\n .attr('class', 'extension')\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'aggregationEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'dependencyStart')\n .attr('class', 'extension')\n .attr('refX', 0)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'dependencyEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\n\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = function(text, id) {\n idCache = {};\n parser.yy.clear();\n parser.parse(text);\n\n log.info('Rendering diagram ' + text);\n\n // Fetch the default direction, use TD if none was found\n const diagram = select(`[id='${id}']`);\n diagram.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n insertMarkers(diagram);\n\n // Layout graph, Create a new directed graph\n const g = new graphlib.Graph({\n multigraph: true\n });\n\n // Set an object for the graph label\n g.setGraph({\n isMultiGraph: true\n });\n\n // Default to assigning a new object as a label for each new edge.\n g.setDefaultEdgeLabel(function() {\n return {};\n });\n\n const classes = classDb.getClasses();\n const keys = Object.keys(classes);\n\n for (let i = 0; i < keys.length; i++) {\n const classDef = classes[keys[i]];\n const node = svgDraw.drawClass(diagram, classDef, conf);\n idCache[node.id] = node;\n\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n g.setNode(node.id, node);\n\n log.info('Org height: ' + node.height);\n }\n\n const relations = classDb.getRelations();\n relations.forEach(function(relation) {\n log.info(\n 'tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation)\n );\n g.setEdge(\n getGraphId(relation.id1),\n getGraphId(relation.id2),\n {\n relation: relation\n },\n relation.title || 'DEFAULT'\n );\n });\n\n dagre.layout(g);\n g.nodes().forEach(function(v) {\n if (typeof v !== 'undefined' && typeof g.node(v) !== 'undefined') {\n log.debug('Node ' + v + ': ' + JSON.stringify(g.node(v)));\n select('#' + lookUpDomId(v)).attr(\n 'transform',\n 'translate(' +\n (g.node(v).x - g.node(v).width / 2) +\n ',' +\n (g.node(v).y - g.node(v).height / 2) +\n ' )'\n );\n }\n });\n\n g.edges().forEach(function(e) {\n if (typeof e !== 'undefined' && typeof g.edge(e) !== 'undefined') {\n log.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));\n svgDraw.drawEdge(diagram, g.edge(e), g.edge(e).relation, conf);\n }\n });\n\n const svgBounds = diagram.node().getBBox();\n const width = svgBounds.width + padding * 2;\n const height = svgBounds.height + padding * 2;\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n // Ensure the viewBox includes the whole svgBounds area with extra space for padding\n const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`;\n log.debug(`viewBox ${vBox}`);\n diagram.attr('viewBox', vBox);\n};\n\nexport default {\n setConf,\n draw\n};\n","import { select } from 'd3';\nimport dagre from 'dagre';\nimport graphlib from 'graphlib';\nimport { log } from '../../logger';\nimport classDb, { lookUpDomId } from './classDb';\nimport { parser } from './parser/classDiagram';\nimport svgDraw from './svgDraw';\nimport { getConfig } from '../../config';\nimport { render } from '../../dagre-wrapper/index.js';\n// import addHtmlLabel from 'dagre-d3/lib/label/add-html-label.js';\nimport { curveLinear } from 'd3';\nimport { interpolateToCurve, getStylesFromArray, configureSvgSize } from '../../utils';\nimport common from '../common/common';\n\nparser.yy = classDb;\n\nlet idCache = {};\nconst padding = 20;\n\nconst conf = {\n dividerMargin: 10,\n padding: 5,\n textHeight: 10\n};\n\n/**\n * Function that adds the vertices found during parsing to the graph to be rendered.\n * @param vert Object containing the vertices.\n * @param g The graph that is to be drawn.\n */\nexport const addClasses = function(classes, g) {\n // const svg = select(`[id=\"${svgId}\"]`);\n const keys = Object.keys(classes);\n log.info('keys:', keys);\n log.info(classes);\n\n // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition\n keys.forEach(function(id) {\n const vertex = classes[id];\n\n /**\n * Variable for storing the classes for the vertex\n * @type {string}\n */\n let cssClassStr = '';\n if (vertex.cssClasses.length > 0) {\n cssClassStr = cssClassStr + ' ' + vertex.cssClasses.join(' ');\n }\n // if (vertex.classes.length > 0) {\n // classStr = vertex.classes.join(' ');\n // }\n\n const styles = { labelStyle: '' }; //getStylesFromArray(vertex.styles);\n\n // Use vertex id as text in the box if no text is provided by the graph definition\n let vertexText = vertex.text !== undefined ? vertex.text : vertex.id;\n\n // We create a SVG label, either by delegating to addHtmlLabel or manually\n // let vertexNode;\n // if (getConfig().flowchart.htmlLabels) {\n // const node = {\n // label: vertexText.replace(\n // /fa[lrsb]?:fa-[\\w-]+/g,\n // s => ``\n // )\n // };\n // vertexNode = addHtmlLabel(svg, node).node();\n // vertexNode.parentNode.removeChild(vertexNode);\n // } else {\n // const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n // svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));\n\n // const rows = vertexText.split(common.lineBreakRegex);\n\n // for (let j = 0; j < rows.length; j++) {\n // const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');\n // tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n // tspan.setAttribute('dy', '1em');\n // tspan.setAttribute('x', '1');\n // tspan.textContent = rows[j];\n // svgLabel.appendChild(tspan);\n // }\n // vertexNode = svgLabel;\n // }\n\n let radious = 0;\n let _shape = '';\n // Set the shape based parameters\n switch (vertex.type) {\n case 'class':\n _shape = 'class_box';\n break;\n default:\n _shape = 'class_box';\n }\n // Add the node\n g.setNode(vertex.id, {\n labelStyle: styles.labelStyle,\n shape: _shape,\n labelText: vertexText,\n classData: vertex,\n rx: radious,\n ry: radious,\n class: cssClassStr,\n style: styles.style,\n id: vertex.id,\n domId: vertex.domId,\n haveCallback: vertex.haveCallback,\n link: vertex.link,\n width: vertex.type === 'group' ? 500 : undefined,\n type: vertex.type,\n padding: getConfig().flowchart.padding\n });\n\n log.info('setNode', {\n labelStyle: styles.labelStyle,\n shape: _shape,\n labelText: vertexText,\n rx: radious,\n ry: radious,\n class: cssClassStr,\n style: styles.style,\n id: vertex.id,\n width: vertex.type === 'group' ? 500 : undefined,\n type: vertex.type,\n padding: getConfig().flowchart.padding\n });\n });\n};\n\n/**\n * Add edges to graph based on parsed graph defninition\n * @param {Object} edges The edges to add to the graph\n * @param {Object} g The graph object\n */\nexport const addRelations = function(relations, g) {\n let cnt = 0;\n\n let defaultStyle;\n let defaultLabelStyle;\n\n // if (typeof relations.defaultStyle !== 'undefined') {\n // const defaultStyles = getStylesFromArray(relations.defaultStyle);\n // defaultStyle = defaultStyles.style;\n // defaultLabelStyle = defaultStyles.labelStyle;\n // }\n\n relations.forEach(function(edge) {\n cnt++;\n const edgeData = {};\n //Set relationship style and line type\n edgeData.classes = 'relation';\n edgeData.pattern = edge.relation.lineType == 1 ? 'dashed' : 'solid';\n\n edgeData.id = 'id' + cnt;\n // Set link type for rendering\n if (edge.type === 'arrow_open') {\n edgeData.arrowhead = 'none';\n } else {\n edgeData.arrowhead = 'normal';\n }\n\n log.info(edgeData, edge);\n //Set edge extra labels\n //edgeData.startLabelLeft = edge.relationTitle1;\n edgeData.startLabelRight = edge.relationTitle1 === 'none' ? '' : edge.relationTitle1;\n edgeData.endLabelLeft = edge.relationTitle2 === 'none' ? '' : edge.relationTitle2;\n //edgeData.endLabelRight = edge.relationTitle2;\n\n //Set relation arrow types\n edgeData.arrowTypeStart = getArrowMarker(edge.relation.type1);\n edgeData.arrowTypeEnd = getArrowMarker(edge.relation.type2);\n let style = '';\n let labelStyle = '';\n\n if (typeof edge.style !== 'undefined') {\n const styles = getStylesFromArray(edge.style);\n style = styles.style;\n labelStyle = styles.labelStyle;\n } else {\n style = 'fill:none';\n if (typeof defaultStyle !== 'undefined') {\n style = defaultStyle;\n }\n if (typeof defaultLabelStyle !== 'undefined') {\n labelStyle = defaultLabelStyle;\n }\n }\n\n edgeData.style = style;\n edgeData.labelStyle = labelStyle;\n\n if (typeof edge.interpolate !== 'undefined') {\n edgeData.curve = interpolateToCurve(edge.interpolate, curveLinear);\n } else if (typeof relations.defaultInterpolate !== 'undefined') {\n edgeData.curve = interpolateToCurve(relations.defaultInterpolate, curveLinear);\n } else {\n edgeData.curve = interpolateToCurve(conf.curve, curveLinear);\n }\n\n edge.text = edge.title;\n if (typeof edge.text === 'undefined') {\n if (typeof edge.style !== 'undefined') {\n edgeData.arrowheadStyle = 'fill: #333';\n }\n } else {\n edgeData.arrowheadStyle = 'fill: #333';\n edgeData.labelpos = 'c';\n\n if (getConfig().flowchart.htmlLabels && false) { // eslint-disable-line\n edgeData.labelType = 'html';\n edgeData.label = '' + edge.text + '';\n } else {\n edgeData.labelType = 'text';\n edgeData.label = edge.text.replace(common.lineBreakRegex, '\\n');\n\n if (typeof edge.style === 'undefined') {\n edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';\n }\n\n edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');\n }\n }\n // Add the edge to the graph\n g.setEdge(edge.id1, edge.id2, edgeData, cnt);\n });\n};\n\n// Todo optimize\nconst getGraphId = function(label) {\n const keys = Object.keys(idCache);\n\n for (let i = 0; i < keys.length; i++) {\n if (idCache[keys[i]].label === label) {\n return keys[i];\n }\n }\n\n return undefined;\n};\n\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const drawOld = function(text, id) {\n idCache = {};\n parser.yy.clear();\n parser.parse(text);\n\n log.info('Rendering diagram ' + text);\n\n // Fetch the default direction, use TD if none was found\n const diagram = select(`[id='${id}']`);\n // insertMarkers(diagram);\n\n // Layout graph, Create a new directed graph\n const g = new graphlib.Graph({\n multigraph: true\n });\n\n // Set an object for the graph label\n g.setGraph({\n isMultiGraph: true\n });\n\n // Default to assigning a new object as a label for each new edge.\n g.setDefaultEdgeLabel(function() {\n return {};\n });\n\n const classes = classDb.getClasses();\n log.info('classes:');\n log.info(classes);\n const keys = Object.keys(classes);\n for (let i = 0; i < keys.length; i++) {\n const classDef = classes[keys[i]];\n const node = svgDraw.drawClass(diagram, classDef, conf);\n idCache[node.id] = node;\n\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n g.setNode(node.id, node);\n\n log.info('Org height: ' + node.height);\n }\n\n const relations = classDb.getRelations();\n log.info('relations:', relations);\n relations.forEach(function(relation) {\n log.info(\n 'tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation)\n );\n g.setEdge(\n getGraphId(relation.id1),\n getGraphId(relation.id2),\n {\n relation: relation\n },\n relation.title || 'DEFAULT'\n );\n });\n\n dagre.layout(g);\n g.nodes().forEach(function(v) {\n if (typeof v !== 'undefined' && typeof g.node(v) !== 'undefined') {\n log.debug('Node ' + v + ': ' + JSON.stringify(g.node(v)));\n select('#' + lookUpDomId(v)).attr(\n 'transform',\n 'translate(' +\n (g.node(v).x - g.node(v).width / 2) +\n ',' +\n (g.node(v).y - g.node(v).height / 2) +\n ' )'\n );\n }\n });\n\n g.edges().forEach(function(e) {\n if (typeof e !== 'undefined' && typeof g.edge(e) !== 'undefined') {\n log.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));\n svgDraw.drawEdge(diagram, g.edge(e), g.edge(e).relation, conf);\n }\n });\n\n const svgBounds = diagram.node().getBBox();\n const width = svgBounds.width + padding * 2;\n const height = svgBounds.height + padding * 2;\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n // Ensure the viewBox includes the whole svgBounds area with extra space for padding\n const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`;\n log.debug(`viewBox ${vBox}`);\n diagram.attr('viewBox', vBox);\n};\n\nexport const draw = function(text, id) {\n log.info('Drawing class');\n classDb.clear();\n // const parser = classDb.parser;\n // parser.yy = classDb;\n\n // Parse the graph definition\n // try {\n parser.parse(text);\n // } catch (err) {\n // log.debug('Parsing failed');\n // }\n\n // Fetch the default direction, use TD if none was found\n let dir = 'TD';\n\n const conf = getConfig().flowchart;\n log.info('config:', conf);\n const nodeSpacing = conf.nodeSpacing || 50;\n const rankSpacing = conf.rankSpacing || 50;\n\n // Create the input mermaid.graph\n const g = new graphlib.Graph({\n multigraph: true,\n compound: true\n })\n .setGraph({\n rankdir: dir,\n nodesep: nodeSpacing,\n ranksep: rankSpacing,\n marginx: 8,\n marginy: 8\n })\n .setDefaultEdgeLabel(function() {\n return {};\n });\n\n // let subG;\n // const subGraphs = flowDb.getSubGraphs();\n // log.info('Subgraphs - ', subGraphs);\n // for (let i = subGraphs.length - 1; i >= 0; i--) {\n // subG = subGraphs[i];\n // log.info('Subgraph - ', subG);\n // flowDb.addVertex(subG.id, subG.title, 'group', undefined, subG.classes);\n // }\n\n // Fetch the verices/nodes and edges/links from the parsed graph definition\n const classes = classDb.getClasses();\n const relations = classDb.getRelations();\n\n log.info(relations);\n // let i = 0;\n // for (i = subGraphs.length - 1; i >= 0; i--) {\n // subG = subGraphs[i];\n\n // selectAll('cluster').append('text');\n\n // for (let j = 0; j < subG.nodes.length; j++) {\n // g.setParent(subG.nodes[j], subG.id);\n // }\n // }\n addClasses(classes, g, id);\n addRelations(relations, g);\n\n // Add custom shapes\n // flowChartShapes.addToRenderV2(addShape);\n\n // Set up an SVG group so that we can translate the final graph.\n const svg = select(`[id=\"${id}\"]`);\n svg.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n // Run the renderer. This is what draws the final graph.\n const element = select('#' + id + ' g');\n render(element, g, ['aggregation', 'extension', 'composition', 'dependency'], 'classDiagram', id);\n\n // element.selectAll('g.node').attr('title', function() {\n // return flowDb.getTooltip(this.id);\n // });\n\n const padding = 8;\n const svgBounds = svg.node().getBBox();\n const width = svgBounds.width + padding * 2;\n const height = svgBounds.height + padding * 2;\n log.debug(\n `new ViewBox 0 0 ${width} ${height}`,\n `translate(${padding - g._label.marginx}, ${padding - g._label.marginy})`\n );\n\n configureSvgSize(svg, height, width, conf.useMaxWidth);\n\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n svg\n .select('g')\n .attr('transform', `translate(${padding - g._label.marginx}, ${padding - svgBounds.y})`);\n\n // Index nodes\n // flowDb.indexNodes('subGraph' + i);\n\n // Add label rects for non html labels\n if (!conf.htmlLabels) {\n const labels = document.querySelectorAll('[id=\"' + id + '\"] .edgeLabel .label');\n for (let k = 0; k < labels.length; k++) {\n const label = labels[k];\n\n // Get dimensions of label\n const dim = label.getBBox();\n\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('rx', 0);\n rect.setAttribute('ry', 0);\n rect.setAttribute('width', dim.width);\n rect.setAttribute('height', dim.height);\n rect.setAttribute('style', 'fill:#e8e8e8;');\n\n label.insertBefore(rect, label.firstChild);\n }\n }\n\n // If node has a link, wrap it in an anchor SVG object.\n // const keys = Object.keys(classes);\n // keys.forEach(function(key) {\n // const vertex = classes[key];\n\n // if (vertex.link) {\n // const node = select('#' + id + ' [id=\"' + key + '\"]');\n // if (node) {\n // const link = document.createElementNS('http://www.w3.org/2000/svg', 'a');\n // link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));\n // link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);\n // link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');\n\n // const linkNode = node.insert(function() {\n // return link;\n // }, ':first-child');\n\n // const shape = node.select('.label-container');\n // if (shape) {\n // linkNode.append(function() {\n // return shape.node();\n // });\n // }\n\n // const label = node.select('.label');\n // if (label) {\n // linkNode.append(function() {\n // return label.node();\n // });\n // }\n // }\n // }\n // });\n};\n\nexport default {\n setConf,\n draw\n};\nfunction getArrowMarker(type) {\n let marker;\n switch (type) {\n case 0:\n marker = 'aggregation';\n break;\n case 1:\n marker = 'extension';\n break;\n case 2:\n marker = 'composition';\n break;\n case 3:\n marker = 'dependency';\n break;\n default:\n marker = 'none';\n }\n return marker;\n}\n","import { log } from '../../logger';\nimport { generateId } from '../../utils';\nimport mermaidAPI from '../../mermaidAPI';\nimport * as configApi from '../../config';\n\nconst clone = o => JSON.parse(JSON.stringify(o));\n\nlet rootDoc = [];\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nconst setRootDoc = o => {\n log.info('Setting root doc', o);\n // rootDoc = { id: 'root', doc: o };\n rootDoc = o;\n};\n\nconst getRootDoc = () => rootDoc;\n\nconst docTranslator = (parent, node, first) => {\n if (node.stmt === 'relation') {\n docTranslator(parent, node.state1, true);\n docTranslator(parent, node.state2, false);\n } else {\n if (node.stmt === 'state') {\n if (node.id === '[*]') {\n node.id = first ? parent.id + '_start' : parent.id + '_end';\n node.start = first;\n }\n }\n\n if (node.doc) {\n const doc = [];\n // Check for concurrency\n let i = 0;\n let currentDoc = [];\n for (i = 0; i < node.doc.length; i++) {\n if (node.doc[i].type === 'divider') {\n // debugger;\n const newNode = clone(node.doc[i]);\n newNode.doc = clone(currentDoc);\n doc.push(newNode);\n currentDoc = [];\n } else {\n currentDoc.push(node.doc[i]);\n }\n }\n\n // If any divider was encountered\n if (doc.length > 0 && currentDoc.length > 0) {\n const newNode = {\n stmt: 'state',\n id: generateId(),\n type: 'divider',\n doc: clone(currentDoc)\n };\n doc.push(clone(newNode));\n node.doc = doc;\n }\n\n node.doc.forEach(docNode => docTranslator(node, docNode, true));\n }\n }\n};\nconst getRootDocV2 = () => {\n docTranslator({ id: 'root' }, { id: 'root', doc: rootDoc }, true);\n return { id: 'root', doc: rootDoc };\n};\n\nconst extract = _doc => {\n // const res = { states: [], relations: [] };\n let doc;\n if (_doc.doc) {\n doc = _doc.doc;\n } else {\n doc = _doc;\n }\n // let doc = root.doc;\n // if (!doc) {\n // doc = root;\n // }\n log.info(doc);\n clear();\n\n log.info('Extract', doc);\n\n doc.forEach(item => {\n if (item.stmt === 'state') {\n addState(item.id, item.type, item.doc, item.description, item.note);\n }\n if (item.stmt === 'relation') {\n addRelation(item.state1.id, item.state2.id, item.description);\n }\n });\n};\n\nconst newDoc = () => {\n return {\n relations: [],\n states: {},\n documents: {}\n };\n};\n\nlet documents = {\n root: newDoc()\n};\n\nlet currentDocument = documents.root;\n\nlet startCnt = 0;\nlet endCnt = 0; // eslint-disable-line\n// let stateCnt = 0;\n\n/**\n * Function called by parser when a node definition has been found.\n * @param id\n * @param text\n * @param type\n * @param style\n */\nexport const addState = function(id, type, doc, descr, note) {\n if (typeof currentDocument.states[id] === 'undefined') {\n currentDocument.states[id] = {\n id: id,\n descriptions: [],\n type,\n doc,\n note\n };\n } else {\n if (!currentDocument.states[id].doc) {\n currentDocument.states[id].doc = doc;\n }\n if (!currentDocument.states[id].type) {\n currentDocument.states[id].type = type;\n }\n }\n if (descr) {\n log.info('Adding state ', id, descr);\n if (typeof descr === 'string') addDescription(id, descr.trim());\n\n if (typeof descr === 'object') {\n descr.forEach(des => addDescription(id, des.trim()));\n }\n }\n\n if (note) currentDocument.states[id].note = note;\n};\n\nexport const clear = function() {\n documents = {\n root: newDoc()\n };\n currentDocument = documents.root;\n\n currentDocument = documents.root;\n\n startCnt = 0;\n endCnt = 0; // eslint-disable-line\n classes = [];\n};\n\nexport const getState = function(id) {\n return currentDocument.states[id];\n};\n\nexport const getStates = function() {\n return currentDocument.states;\n};\nexport const logDocuments = function() {\n log.info('Documents = ', documents);\n};\nexport const getRelations = function() {\n return currentDocument.relations;\n};\n\nexport const addRelation = function(_id1, _id2, title) {\n let id1 = _id1;\n let id2 = _id2;\n let type1 = 'default';\n let type2 = 'default';\n if (_id1 === '[*]') {\n startCnt++;\n id1 = 'start' + startCnt;\n type1 = 'start';\n }\n if (_id2 === '[*]') {\n endCnt++;\n id2 = 'end' + startCnt;\n type2 = 'end';\n }\n addState(id1, type1);\n addState(id2, type2);\n currentDocument.relations.push({ id1, id2, title });\n};\n\nconst addDescription = function(id, _descr) {\n const theState = currentDocument.states[id];\n let descr = _descr;\n if (descr[0] === ':') {\n descr = descr.substr(1).trim();\n }\n\n theState.descriptions.push(descr);\n};\n\nexport const cleanupLabel = function(label) {\n if (label.substring(0, 1) === ':') {\n return label.substr(2).trim();\n } else {\n return label.trim();\n }\n};\n\nexport const lineType = {\n LINE: 0,\n DOTTED_LINE: 1\n};\n\nlet dividerCnt = 0;\nconst getDividerId = () => {\n dividerCnt++;\n return 'divider-id-' + dividerCnt;\n};\n\nlet classes = [];\n\nconst getClasses = () => classes;\n\nconst getDirection = () => 'TB';\n\nexport const relationType = {\n AGGREGATION: 0,\n EXTENSION: 1,\n COMPOSITION: 2,\n DEPENDENCY: 3\n};\n\nconst trimColon = str => (str && str[0] === ':' ? str.substr(1).trim() : str.trim());\n\nexport default {\n parseDirective,\n getConfig: () => configApi.getConfig().state,\n addState,\n clear,\n getState,\n getStates,\n getRelations,\n getClasses,\n getDirection,\n addRelation,\n getDividerId,\n // addDescription,\n cleanupLabel,\n lineType,\n relationType,\n logDocuments,\n getRootDoc,\n setRootDoc,\n getRootDocV2,\n extract,\n trimColon\n};\n","import { select } from 'd3';\nimport dagre from 'dagre';\nimport graphlib from 'graphlib';\nimport { log } from '../../logger';\nimport stateDb from './stateDb';\nimport common from '../common/common';\nimport { parser } from './parser/stateDiagram';\n// import idCache from './id-cache';\nimport { drawState, addTitleAndBox, drawEdge } from './shapes';\nimport { getConfig } from '../../config';\nimport { configureSvgSize } from '../../utils';\n\nparser.yy = stateDb;\n\n// TODO Move conf object to main conf in mermaidAPI\nlet conf;\n\nconst transformationLog = {};\n\nexport const setConf = function() {};\n\n// Todo optimize\n\n/**\n * Setup arrow head and define the marker. The result is appended to the svg.\n */\nconst insertMarkers = function(elem) {\n elem\n .append('defs')\n .append('marker')\n .attr('id', 'dependencyEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = function(text, id) {\n conf = getConfig().state;\n parser.yy.clear();\n parser.parse(text);\n log.debug('Rendering diagram ' + text);\n\n // Fetch the default direction, use TD if none was found\n const diagram = select(`[id='${id}']`);\n insertMarkers(diagram);\n\n // Layout graph, Create a new directed graph\n const graph = new graphlib.Graph({\n multigraph: true,\n compound: true,\n // acyclicer: 'greedy',\n rankdir: 'RL'\n // ranksep: '20'\n });\n\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function() {\n return {};\n });\n\n const rootDoc = stateDb.getRootDoc();\n renderDoc(rootDoc, diagram, undefined, false);\n\n const padding = conf.padding;\n const bounds = diagram.node().getBBox();\n\n const width = bounds.width + padding * 2;\n const height = bounds.height + padding * 2;\n\n // zoom in a bit\n const svgWidth = width * 1.75;\n configureSvgSize(diagram, height, svgWidth, conf.useMaxWidth);\n\n diagram.attr(\n 'viewBox',\n `${bounds.x - conf.padding} ${bounds.y - conf.padding} ` + width + ' ' + height\n );\n};\nconst getLabelWidth = text => {\n return text ? text.length * conf.fontSizeFactor : 1;\n};\n\nconst renderDoc = (doc, diagram, parentId, altBkg) => {\n // // Layout graph, Create a new directed graph\n const graph = new graphlib.Graph({\n compound: true,\n multigraph: true\n });\n\n let i;\n let edgeFreeDoc = true;\n for (i = 0; i < doc.length; i++) {\n if (doc[i].stmt === 'relation') {\n edgeFreeDoc = false;\n break;\n }\n }\n\n // Set an object for the graph label\n if (parentId)\n graph.setGraph({\n rankdir: 'LR',\n multigraph: true,\n compound: true,\n // acyclicer: 'greedy',\n ranker: 'tight-tree',\n ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,\n nodeSep: edgeFreeDoc ? 1 : 50,\n isMultiGraph: true\n // ranksep: 5,\n // nodesep: 1\n });\n else {\n graph.setGraph({\n rankdir: 'TB',\n multigraph: true,\n compound: true,\n // isCompound: true,\n // acyclicer: 'greedy',\n // ranker: 'longest-path'\n ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,\n nodeSep: edgeFreeDoc ? 1 : 50,\n ranker: 'tight-tree',\n // ranker: 'network-simplex'\n isMultiGraph: true\n });\n }\n\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function() {\n return {};\n });\n\n stateDb.extract(doc);\n const states = stateDb.getStates();\n const relations = stateDb.getRelations();\n\n const keys = Object.keys(states);\n\n let first = true;\n\n for (let i = 0; i < keys.length; i++) {\n const stateDef = states[keys[i]];\n\n if (parentId) {\n stateDef.parentId = parentId;\n }\n\n let node;\n if (stateDef.doc) {\n let sub = diagram\n .append('g')\n .attr('id', stateDef.id)\n .attr('class', 'stateGroup');\n node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg);\n\n if (first) {\n // first = false;\n sub = addTitleAndBox(sub, stateDef, altBkg);\n let boxBounds = sub.node().getBBox();\n node.width = boxBounds.width;\n node.height = boxBounds.height + conf.padding / 2;\n transformationLog[stateDef.id] = { y: conf.compositTitleSize };\n } else {\n // sub = addIdAndBox(sub, stateDef);\n let boxBounds = sub.node().getBBox();\n node.width = boxBounds.width;\n node.height = boxBounds.height;\n // transformationLog[stateDef.id] = { y: conf.compositTitleSize };\n }\n } else {\n node = drawState(diagram, stateDef, graph);\n }\n\n if (stateDef.note) {\n // Draw note note\n const noteDef = {\n descriptions: [],\n id: stateDef.id + '-note',\n note: stateDef.note,\n type: 'note'\n };\n const note = drawState(diagram, noteDef, graph);\n\n // graph.setNode(node.id, node);\n if (stateDef.note.position === 'left of') {\n graph.setNode(node.id + '-note', note);\n graph.setNode(node.id, node);\n } else {\n graph.setNode(node.id, node);\n graph.setNode(node.id + '-note', note);\n }\n // graph.setNode(node.id);\n graph.setParent(node.id, node.id + '-group');\n graph.setParent(node.id + '-note', node.id + '-group');\n } else {\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n graph.setNode(node.id, node);\n }\n }\n\n log.debug('Count=', graph.nodeCount(), graph);\n let cnt = 0;\n relations.forEach(function(relation) {\n cnt++;\n log.debug('Setting edge', relation);\n graph.setEdge(\n relation.id1,\n relation.id2,\n {\n relation: relation,\n width: getLabelWidth(relation.title),\n height: conf.labelHeight * common.getRows(relation.title).length,\n labelpos: 'c'\n },\n 'id' + cnt\n );\n });\n\n dagre.layout(graph);\n\n log.debug('Graph after layout', graph.nodes());\n const svgElem = diagram.node();\n\n graph.nodes().forEach(function(v) {\n if (typeof v !== 'undefined' && typeof graph.node(v) !== 'undefined') {\n log.warn('Node ' + v + ': ' + JSON.stringify(graph.node(v)));\n select('#' + svgElem.id + ' #' + v).attr(\n 'transform',\n 'translate(' +\n (graph.node(v).x - graph.node(v).width / 2) +\n ',' +\n (graph.node(v).y +\n (transformationLog[v] ? transformationLog[v].y : 0) -\n graph.node(v).height / 2) +\n ' )'\n );\n select('#' + svgElem.id + ' #' + v).attr(\n 'data-x-shift',\n graph.node(v).x - graph.node(v).width / 2\n );\n const dividers = document.querySelectorAll('#' + svgElem.id + ' #' + v + ' .divider');\n dividers.forEach(divider => {\n const parent = divider.parentElement;\n let pWidth = 0;\n let pShift = 0;\n if (parent) {\n if (parent.parentElement) pWidth = parent.parentElement.getBBox().width;\n pShift = parseInt(parent.getAttribute('data-x-shift'), 10);\n if (Number.isNaN(pShift)) {\n pShift = 0;\n }\n }\n divider.setAttribute('x1', 0 - pShift + 8);\n divider.setAttribute('x2', pWidth - pShift - 8);\n });\n } else {\n log.debug('No Node ' + v + ': ' + JSON.stringify(graph.node(v)));\n }\n });\n\n let stateBox = svgElem.getBBox();\n\n graph.edges().forEach(function(e) {\n if (typeof e !== 'undefined' && typeof graph.edge(e) !== 'undefined') {\n log.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n drawEdge(diagram, graph.edge(e), graph.edge(e).relation);\n }\n });\n\n stateBox = svgElem.getBBox();\n\n const stateInfo = {\n id: parentId ? parentId : 'root',\n label: parentId ? parentId : 'root',\n width: 0,\n height: 0\n };\n\n stateInfo.width = stateBox.width + 2 * conf.padding;\n stateInfo.height = stateBox.height + 2 * conf.padding;\n\n log.debug('Doc rendered', stateInfo, graph);\n return stateInfo;\n};\n\nexport default {\n setConf,\n draw\n};\n","const idCache = {};\n\nexport const set = (key, val) => {\n idCache[key] = val;\n};\n\nexport const get = k => idCache[k];\nexport const keys = () => Object.keys(idCache);\nexport const size = () => keys().length;\n\nexport default {\n get,\n set,\n keys,\n size\n};\n","import { line, curveBasis } from 'd3';\nimport idCache from './id-cache.js';\nimport stateDb from './stateDb';\nimport utils from '../../utils';\nimport common from '../common/common';\nimport { getConfig } from '../../config';\nimport { log } from '../../logger';\n\n// let conf;\n\n/**\n * Draws a start state as a black circle\n */\nexport const drawStartState = g =>\n g\n .append('circle')\n // .style('stroke', 'black')\n // .style('fill', 'black')\n .attr('class', 'start-state')\n .attr('r', getConfig().state.sizeUnit)\n .attr('cx', getConfig().state.padding + getConfig().state.sizeUnit)\n .attr('cy', getConfig().state.padding + getConfig().state.sizeUnit);\n\n/**\n * Draws a start state as a black circle\n */\nexport const drawDivider = g =>\n g\n .append('line')\n .style('stroke', 'grey')\n .style('stroke-dasharray', '3')\n .attr('x1', getConfig().state.textHeight)\n .attr('class', 'divider')\n .attr('x2', getConfig().state.textHeight * 2)\n .attr('y1', 0)\n .attr('y2', 0);\n\n/**\n * Draws a an end state as a black circle\n */\nexport const drawSimpleState = (g, stateDef) => {\n const state = g\n .append('text')\n .attr('x', 2 * getConfig().state.padding)\n .attr('y', getConfig().state.textHeight + 2 * getConfig().state.padding)\n .attr('font-size', getConfig().state.fontSize)\n .attr('class', 'state-title')\n .text(stateDef.id);\n\n const classBox = state.node().getBBox();\n g.insert('rect', ':first-child')\n .attr('x', getConfig().state.padding)\n .attr('y', getConfig().state.padding)\n .attr('width', classBox.width + 2 * getConfig().state.padding)\n .attr('height', classBox.height + 2 * getConfig().state.padding)\n .attr('rx', getConfig().state.radius);\n\n return state;\n};\n\n/**\n * Draws a state with descriptions\n * @param {*} g\n * @param {*} stateDef\n */\nexport const drawDescrState = (g, stateDef) => {\n const addTspan = function(textEl, txt, isFirst) {\n const tSpan = textEl\n .append('tspan')\n .attr('x', 2 * getConfig().state.padding)\n .text(txt);\n if (!isFirst) {\n tSpan.attr('dy', getConfig().state.textHeight);\n }\n };\n const title = g\n .append('text')\n .attr('x', 2 * getConfig().state.padding)\n .attr('y', getConfig().state.textHeight + 1.3 * getConfig().state.padding)\n .attr('font-size', getConfig().state.fontSize)\n .attr('class', 'state-title')\n .text(stateDef.descriptions[0]);\n\n const titleBox = title.node().getBBox();\n const titleHeight = titleBox.height;\n\n const description = g\n .append('text') // text label for the x axis\n .attr('x', getConfig().state.padding)\n .attr(\n 'y',\n titleHeight +\n getConfig().state.padding * 0.4 +\n getConfig().state.dividerMargin +\n getConfig().state.textHeight\n )\n .attr('class', 'state-description');\n\n let isFirst = true;\n let isSecond = true;\n stateDef.descriptions.forEach(function(descr) {\n if (!isFirst) {\n addTspan(description, descr, isSecond);\n isSecond = false;\n }\n isFirst = false;\n });\n\n const descrLine = g\n .append('line') // text label for the x axis\n .attr('x1', getConfig().state.padding)\n .attr('y1', getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2)\n .attr('y2', getConfig().state.padding + titleHeight + getConfig().state.dividerMargin / 2)\n .attr('class', 'descr-divider');\n const descrBox = description.node().getBBox();\n const width = Math.max(descrBox.width, titleBox.width);\n\n descrLine.attr('x2', width + 3 * getConfig().state.padding);\n // const classBox = title.node().getBBox();\n\n g.insert('rect', ':first-child')\n .attr('x', getConfig().state.padding)\n .attr('y', getConfig().state.padding)\n .attr('width', width + 2 * getConfig().state.padding)\n .attr('height', descrBox.height + titleHeight + 2 * getConfig().state.padding)\n .attr('rx', getConfig().state.radius);\n\n return g;\n};\n\n/**\n * Adds the creates a box around the existing content and adds a\n * panel for the id on top of the content.\n */\n/**\n * Function that creates an title row and a frame around a substate for a composit state diagram.\n * The function returns a new d3 svg object with updated width and height properties;\n * @param {*} g The d3 svg object for the substate to framed\n * @param {*} stateDef The info about the\n */\nexport const addTitleAndBox = (g, stateDef, altBkg) => {\n const pad = getConfig().state.padding;\n const dblPad = 2 * getConfig().state.padding;\n const orgBox = g.node().getBBox();\n const orgWidth = orgBox.width;\n const orgX = orgBox.x;\n\n const title = g\n .append('text')\n .attr('x', 0)\n .attr('y', getConfig().state.titleShift)\n .attr('font-size', getConfig().state.fontSize)\n .attr('class', 'state-title')\n .text(stateDef.id);\n\n const titleBox = title.node().getBBox();\n const titleWidth = titleBox.width + dblPad;\n let width = Math.max(titleWidth, orgWidth); // + dblPad;\n if (width === orgWidth) {\n width = width + dblPad;\n }\n let startX;\n // const lineY = 1 - getConfig().state.textHeight;\n // const descrLine = g\n // .append('line') // text label for the x axis\n // .attr('x1', 0)\n // .attr('y1', lineY)\n // .attr('y2', lineY)\n // .attr('class', 'descr-divider');\n\n const graphBox = g.node().getBBox();\n // descrLine.attr('x2', graphBox.width + getConfig().state.padding);\n\n if (stateDef.doc) {\n // cnsole.warn(\n // stateDef.id,\n // 'orgX: ',\n // orgX,\n // 'width: ',\n // width,\n // 'titleWidth: ',\n // titleWidth,\n // 'orgWidth: ',\n // orgWidth,\n // 'width',\n // width\n // );\n }\n\n startX = orgX - pad;\n if (titleWidth > orgWidth) {\n startX = (orgWidth - width) / 2 + pad;\n }\n if (Math.abs(orgX - graphBox.x) < pad) {\n if (titleWidth > orgWidth) {\n startX = orgX - (titleWidth - orgWidth) / 2;\n }\n }\n\n const lineY = 1 - getConfig().state.textHeight;\n // White color\n g.insert('rect', ':first-child')\n .attr('x', startX)\n .attr('y', lineY)\n .attr('class', altBkg ? 'alt-composit' : 'composit')\n .attr('width', width)\n .attr(\n 'height',\n graphBox.height + getConfig().state.textHeight + getConfig().state.titleShift + 1\n )\n .attr('rx', '0');\n\n title.attr('x', startX + pad);\n if (titleWidth <= orgWidth) title.attr('x', orgX + (width - dblPad) / 2 - titleWidth / 2 + pad);\n\n // Title background\n g.insert('rect', ':first-child')\n .attr('x', startX)\n .attr(\n 'y',\n getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n )\n .attr('width', width)\n // Just needs to be higher then the descr line, will be clipped by the white color box\n .attr('height', getConfig().state.textHeight * 3)\n .attr('rx', getConfig().state.radius);\n\n // Full background\n g.insert('rect', ':first-child')\n .attr('x', startX)\n .attr(\n 'y',\n getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n )\n .attr('width', width)\n .attr('height', graphBox.height + 3 + 2 * getConfig().state.textHeight)\n .attr('rx', getConfig().state.radius);\n\n return g;\n};\n\nconst drawEndState = g => {\n g.append('circle')\n // .style('stroke', 'black')\n // .style('fill', 'white')\n .attr('class', 'end-state-outer')\n .attr('r', getConfig().state.sizeUnit + getConfig().state.miniPadding)\n .attr(\n 'cx',\n getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n )\n .attr(\n 'cy',\n getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n );\n\n return (\n g\n .append('circle')\n // .style('stroke', 'black')\n // .style('fill', 'black')\n .attr('class', 'end-state-inner')\n .attr('r', getConfig().state.sizeUnit)\n .attr('cx', getConfig().state.padding + getConfig().state.sizeUnit + 2)\n .attr('cy', getConfig().state.padding + getConfig().state.sizeUnit + 2)\n );\n};\nconst drawForkJoinState = (g, stateDef) => {\n let width = getConfig().state.forkWidth;\n let height = getConfig().state.forkHeight;\n\n if (stateDef.parentId) {\n let tmp = width;\n width = height;\n height = tmp;\n }\n return g\n .append('rect')\n .style('stroke', 'black')\n .style('fill', 'black')\n .attr('width', width)\n .attr('height', height)\n .attr('x', getConfig().state.padding)\n .attr('y', getConfig().state.padding);\n};\n\nexport const drawText = function(elem, textData) {\n // Remove and ignore br:s\n const nText = textData.text.replace(common.lineBreakRegex, ' ');\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.style('text-anchor', textData.anchor);\n textElem.attr('fill', textData.fill);\n if (typeof textData.class !== 'undefined') {\n textElem.attr('class', textData.class);\n }\n\n const span = textElem.append('tspan');\n span.attr('x', textData.x + textData.textMargin * 2);\n span.attr('fill', textData.fill);\n span.text(nText);\n\n return textElem;\n};\n\nconst _drawLongText = (_text, x, y, g) => {\n let textHeight = 0;\n\n const textElem = g.append('text');\n textElem.style('text-anchor', 'start');\n textElem.attr('class', 'noteText');\n\n let text = _text.replace(/\\r\\n/g, '
        ');\n text = text.replace(/\\n/g, '
        ');\n const lines = text.split(common.lineBreakRegex);\n\n let tHeight = 1.25 * getConfig().state.noteMargin;\n for (const line of lines) {\n const txt = line.trim();\n\n if (txt.length > 0) {\n const span = textElem.append('tspan');\n span.text(txt);\n if (tHeight === 0) {\n const textBounds = span.node().getBBox();\n tHeight += textBounds.height;\n }\n textHeight += tHeight;\n span.attr('x', x + getConfig().state.noteMargin);\n span.attr('y', y + textHeight + 1.25 * getConfig().state.noteMargin);\n }\n }\n return { textWidth: textElem.node().getBBox().width, textHeight };\n};\n\n/**\n * Draws a note to the diagram\n * @param text - The text of the given note.\n * @param g - The element the note is attached to.\n */\n\nexport const drawNote = (text, g) => {\n g.attr('class', 'state-note');\n const note = g\n .append('rect')\n .attr('x', 0)\n .attr('y', getConfig().state.padding);\n const rectElem = g.append('g');\n\n const { textWidth, textHeight } = _drawLongText(text, 0, 0, rectElem);\n note.attr('height', textHeight + 2 * getConfig().state.noteMargin);\n note.attr('width', textWidth + getConfig().state.noteMargin * 2);\n\n return note;\n};\n\n/**\n * Starting point for drawing a state. The function finds out the specifics\n * about the state and renders with approprtiate function.\n * @param {*} elem\n * @param {*} stateDef\n */\n\nexport const drawState = function(elem, stateDef) {\n const id = stateDef.id;\n const stateInfo = {\n id: id,\n label: stateDef.id,\n width: 0,\n height: 0\n };\n\n const g = elem\n .append('g')\n .attr('id', id)\n .attr('class', 'stateGroup');\n\n if (stateDef.type === 'start') drawStartState(g);\n if (stateDef.type === 'end') drawEndState(g);\n if (stateDef.type === 'fork' || stateDef.type === 'join') drawForkJoinState(g, stateDef);\n if (stateDef.type === 'note') drawNote(stateDef.note.text, g);\n if (stateDef.type === 'divider') drawDivider(g);\n if (stateDef.type === 'default' && stateDef.descriptions.length === 0)\n drawSimpleState(g, stateDef);\n if (stateDef.type === 'default' && stateDef.descriptions.length > 0) drawDescrState(g, stateDef);\n\n const stateBox = g.node().getBBox();\n stateInfo.width = stateBox.width + 2 * getConfig().state.padding;\n stateInfo.height = stateBox.height + 2 * getConfig().state.padding;\n\n idCache.set(id, stateInfo);\n // stateCnt++;\n return stateInfo;\n};\n\nlet edgeCount = 0;\nexport const drawEdge = function(elem, path, relation) {\n const getRelationType = function(type) {\n switch (type) {\n case stateDb.relationType.AGGREGATION:\n return 'aggregation';\n case stateDb.relationType.EXTENSION:\n return 'extension';\n case stateDb.relationType.COMPOSITION:\n return 'composition';\n case stateDb.relationType.DEPENDENCY:\n return 'dependency';\n }\n };\n\n path.points = path.points.filter(p => !Number.isNaN(p.y));\n\n // The data for our line\n const lineData = path.points;\n\n // This is the accessor function we talked about above\n const lineFunction = line()\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n })\n .curve(curveBasis);\n\n const svgPath = elem\n .append('path')\n .attr('d', lineFunction(lineData))\n .attr('id', 'edge' + edgeCount)\n .attr('class', 'transition');\n let url = '';\n if (getConfig().state.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(');\n url = url.replace(/\\)/g, '\\\\)');\n }\n\n svgPath.attr(\n 'marker-end',\n 'url(' + url + '#' + getRelationType(stateDb.relationType.DEPENDENCY) + 'End' + ')'\n );\n\n if (typeof relation.title !== 'undefined') {\n const label = elem.append('g').attr('class', 'stateLabel');\n\n const { x, y } = utils.calcLabelPosition(path.points);\n\n const rows = common.getRows(relation.title);\n\n let titleHeight = 0;\n const titleRows = [];\n let maxWidth = 0;\n let minX = 0;\n\n for (let i = 0; i <= rows.length; i++) {\n const title = label\n .append('text')\n .attr('text-anchor', 'middle')\n .text(rows[i])\n .attr('x', x)\n .attr('y', y + titleHeight);\n\n const boundstmp = title.node().getBBox();\n maxWidth = Math.max(maxWidth, boundstmp.width);\n minX = Math.min(minX, boundstmp.x);\n\n log.info(boundstmp.x, x, y + titleHeight);\n\n if (titleHeight === 0) {\n const titleBox = title.node().getBBox();\n titleHeight = titleBox.height;\n log.info('Title height', titleHeight, y);\n }\n titleRows.push(title);\n }\n\n let boxHeight = titleHeight * rows.length;\n if (rows.length > 1) {\n const heightAdj = (rows.length - 1) * titleHeight * 0.5;\n\n titleRows.forEach((title, i) => title.attr('y', y + i * titleHeight - heightAdj));\n boxHeight = titleHeight * rows.length;\n }\n\n const bounds = label.node().getBBox();\n\n label\n .insert('rect', ':first-child')\n .attr('class', 'box')\n .attr('x', x - maxWidth / 2 - getConfig().state.padding / 2)\n .attr('y', y - boxHeight / 2 - getConfig().state.padding / 2 - 3.5)\n .attr('width', maxWidth + getConfig().state.padding)\n .attr('height', boxHeight + getConfig().state.padding);\n\n log.info(bounds);\n\n //label.attr('transform', '0 -' + (bounds.y / 2));\n\n // Debug points\n // path.points.forEach(point => {\n // g.append('circle')\n // .style('stroke', 'red')\n // .style('fill', 'red')\n // .attr('r', 1)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n // g.append('circle')\n // .style('stroke', 'blue')\n // .style('fill', 'blue')\n // .attr('r', 1)\n // .attr('cx', x)\n // .attr('cy', y);\n }\n\n edgeCount++;\n};\n","import graphlib from 'graphlib';\nimport { select } from 'd3';\nimport stateDb from './stateDb';\nimport state from './parser/stateDiagram';\nimport { getConfig } from '../../config';\n\nimport { render } from '../../dagre-wrapper/index.js';\nimport { log } from '../../logger';\nimport { configureSvgSize } from '../../utils';\n\nconst conf = {};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n for (let i = 0; i < keys.length; i++) {\n conf[keys[i]] = cnf[keys[i]];\n }\n};\n\nlet nodeDb = {};\n\n/**\n * Returns the all the styles from classDef statements in the graph definition.\n * @returns {object} classDef styles\n */\nexport const getClasses = function(text) {\n log.trace('Extracting classes');\n stateDb.clear();\n const parser = state.parser;\n parser.yy = stateDb;\n\n // Parse the graph definition\n parser.parse(text);\n return stateDb.getClasses();\n};\n\nconst setupNode = (g, parent, node, altFlag) => {\n // Add the node\n if (node.id !== 'root') {\n let shape = 'rect';\n if (node.start === true) {\n shape = 'start';\n }\n if (node.start === false) {\n shape = 'end';\n }\n if (node.type !== 'default') {\n shape = node.type;\n }\n\n if (!nodeDb[node.id]) {\n nodeDb[node.id] = {\n id: node.id,\n shape,\n description: node.id,\n classes: 'statediagram-state'\n };\n }\n\n // Build of the array of description strings accordinging\n if (node.description) {\n if (Array.isArray(nodeDb[node.id].description)) {\n // There already is an array of strings,add to it\n nodeDb[node.id].shape = 'rectWithTitle';\n nodeDb[node.id].description.push(node.description);\n } else {\n if (nodeDb[node.id].description.length > 0) {\n // if there is a description already transformit to an array\n nodeDb[node.id].shape = 'rectWithTitle';\n if (nodeDb[node.id].description === node.id) {\n // If the previous description was the is, remove it\n nodeDb[node.id].description = [node.description];\n } else {\n nodeDb[node.id].description = [nodeDb[node.id].description, node.description];\n }\n } else {\n nodeDb[node.id].shape = 'rect';\n nodeDb[node.id].description = node.description;\n }\n }\n }\n\n // Save data for description and group so that for instance a statement without description overwrites\n // one with description\n\n // group\n if (!nodeDb[node.id].type && node.doc) {\n log.info('Setting cluser for ', node.id);\n nodeDb[node.id].type = 'group';\n nodeDb[node.id].shape = node.type === 'divider' ? 'divider' : 'roundedWithTitle';\n nodeDb[node.id].classes =\n nodeDb[node.id].classes +\n ' ' +\n (altFlag ? 'statediagram-cluster statediagram-cluster-alt' : 'statediagram-cluster');\n }\n\n const nodeData = {\n labelStyle: '',\n shape: nodeDb[node.id].shape,\n labelText: nodeDb[node.id].description,\n classes: nodeDb[node.id].classes, //classStr,\n style: '', //styles.style,\n id: node.id,\n domId: 'state-' + node.id + '-' + cnt,\n type: nodeDb[node.id].type,\n padding: 15 //getConfig().flowchart.padding\n };\n\n if (node.note) {\n // Todo: set random id\n const noteData = {\n labelStyle: '',\n shape: 'note',\n labelText: node.note.text,\n classes: 'statediagram-note', //classStr,\n style: '', //styles.style,\n id: node.id + '----note',\n domId: 'state-' + node.id + '----note-' + cnt,\n type: nodeDb[node.id].type,\n padding: 15 //getConfig().flowchart.padding\n };\n const groupData = {\n labelStyle: '',\n shape: 'noteGroup',\n labelText: node.note.text,\n classes: nodeDb[node.id].classes, //classStr,\n style: '', //styles.style,\n id: node.id + '----parent',\n domId: 'state-' + node.id + '----parent-' + cnt,\n type: 'group',\n padding: 0 //getConfig().flowchart.padding\n };\n cnt++;\n\n g.setNode(node.id + '----parent', groupData);\n\n g.setNode(noteData.id, noteData);\n g.setNode(node.id, nodeData);\n\n g.setParent(node.id, node.id + '----parent');\n g.setParent(noteData.id, node.id + '----parent');\n\n let from = node.id;\n let to = noteData.id;\n\n if (node.note.position === 'left of') {\n from = noteData.id;\n to = node.id;\n }\n g.setEdge(from, to, {\n arrowhead: 'none',\n arrowType: '',\n style: 'fill:none',\n labelStyle: '',\n classes: 'transition note-edge',\n arrowheadStyle: 'fill: #333',\n labelpos: 'c',\n labelType: 'text',\n thickness: 'normal'\n });\n } else {\n g.setNode(node.id, nodeData);\n }\n }\n\n if (parent) {\n if (parent.id !== 'root') {\n log.info('Setting node ', node.id, ' to be child of its parent ', parent.id);\n g.setParent(node.id, parent.id);\n }\n }\n if (node.doc) {\n log.info('Adding nodes children ');\n setupDoc(g, node, node.doc, !altFlag);\n }\n};\nlet cnt = 0;\nconst setupDoc = (g, parent, doc, altFlag) => {\n cnt = 0;\n log.trace('items', doc);\n doc.forEach(item => {\n if (item.stmt === 'state' || item.stmt === 'default') {\n setupNode(g, parent, item, altFlag);\n } else if (item.stmt === 'relation') {\n setupNode(g, parent, item.state1, altFlag);\n setupNode(g, parent, item.state2, altFlag);\n const edgeData = {\n id: 'edge' + cnt,\n arrowhead: 'normal',\n arrowTypeEnd: 'arrow_barb',\n style: 'fill:none',\n labelStyle: '',\n label: item.description,\n arrowheadStyle: 'fill: #333',\n labelpos: 'c',\n labelType: 'text',\n thickness: 'normal',\n classes: 'transition'\n };\n let startId = item.state1.id;\n let endId = item.state2.id;\n\n g.setEdge(startId, endId, edgeData, cnt);\n cnt++;\n }\n });\n};\n\n/**\n * Draws a flowchart in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = function(text, id) {\n log.info('Drawing state diagram (v2)', id);\n stateDb.clear();\n nodeDb = {};\n const parser = state.parser;\n parser.yy = stateDb;\n\n // Parse the graph definition\n parser.parse(text);\n\n // Fetch the default direction, use TD if none was found\n let dir = stateDb.getDirection();\n if (typeof dir === 'undefined') {\n dir = 'LR';\n }\n\n const conf = getConfig().state;\n const nodeSpacing = conf.nodeSpacing || 50;\n const rankSpacing = conf.rankSpacing || 50;\n\n // Create the input mermaid.graph\n const g = new graphlib.Graph({\n multigraph: true,\n compound: true\n })\n .setGraph({\n rankdir: 'TB',\n nodesep: nodeSpacing,\n ranksep: rankSpacing,\n marginx: 8,\n marginy: 8\n })\n .setDefaultEdgeLabel(function() {\n return {};\n });\n\n log.info(stateDb.getRootDocV2());\n stateDb.extract(stateDb.getRootDocV2());\n log.info(stateDb.getRootDocV2());\n setupNode(g, undefined, stateDb.getRootDocV2(), true);\n\n // Set up an SVG group so that we can translate the final graph.\n const svg = select(`[id=\"${id}\"]`);\n\n // Run the renderer. This is what draws the final graph.\n const element = select('#' + id + ' g');\n render(element, g, ['barb'], 'statediagram', id);\n\n const padding = 8;\n\n const bounds = svg.node().getBBox();\n\n const width = bounds.width + padding * 2;\n const height = bounds.height + padding * 2;\n\n // Zoom in a bit\n svg.attr('class', 'statediagram');\n\n const svgBounds = svg.node().getBBox();\n\n configureSvgSize(svg, height, width * 1.75, conf.useMaxWidth);\n\n // Ensure the viewBox includes the whole svgBounds area with extra space for padding\n const vBox = `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`;\n log.debug(`viewBox ${vBox}`);\n svg.attr('viewBox', vBox);\n\n // Add label rects for non html labels\n if (!conf.htmlLabels) {\n const labels = document.querySelectorAll('[id=\"' + id + '\"] .edgeLabel .label');\n for (let k = 0; k < labels.length; k++) {\n const label = labels[k];\n\n // Get dimensions of label\n const dim = label.getBBox();\n\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('rx', 0);\n rect.setAttribute('ry', 0);\n rect.setAttribute('width', dim.width);\n rect.setAttribute('height', dim.height);\n\n label.insertBefore(rect, label.firstChild);\n }\n }\n};\n\nexport default {\n setConf,\n getClasses,\n draw\n};\n","import { log } from '../../logger';\nimport { random } from '../../utils';\nlet commits = {};\nlet head = null;\nlet branches = { master: head };\nlet curBranch = 'master';\nlet direction = 'LR';\nlet seq = 0;\n\nfunction getId() {\n return random({ length: 7 });\n}\n\nfunction isfastforwardable(currentCommit, otherCommit) {\n log.debug('Entering isfastforwardable:', currentCommit.id, otherCommit.id);\n while (currentCommit.seq <= otherCommit.seq && currentCommit !== otherCommit) {\n // only if other branch has more commits\n if (otherCommit.parent == null) break;\n if (Array.isArray(otherCommit.parent)) {\n log.debug('In merge commit:', otherCommit.parent);\n return (\n isfastforwardable(currentCommit, commits[otherCommit.parent[0]]) ||\n isfastforwardable(currentCommit, commits[otherCommit.parent[1]])\n );\n } else {\n otherCommit = commits[otherCommit.parent];\n }\n }\n log.debug(currentCommit.id, otherCommit.id);\n return currentCommit.id === otherCommit.id;\n}\n\nfunction isReachableFrom(currentCommit, otherCommit) {\n const currentSeq = currentCommit.seq;\n const otherSeq = otherCommit.seq;\n if (currentSeq > otherSeq) return isfastforwardable(otherCommit, currentCommit);\n return false;\n}\n\nfunction uniqBy(list, fn) {\n const recordMap = Object.create(null);\n return list.reduce((out, item) => {\n const key = fn(item);\n if (!recordMap[key]) {\n recordMap[key] = true;\n out.push(item);\n }\n return out;\n }, []);\n}\n\nexport const setDirection = function(dir) {\n direction = dir;\n};\nlet options = {};\nexport const setOptions = function(rawOptString) {\n log.debug('options str', rawOptString);\n rawOptString = rawOptString && rawOptString.trim();\n rawOptString = rawOptString || '{}';\n try {\n options = JSON.parse(rawOptString);\n } catch (e) {\n log.error('error while parsing gitGraph options', e.message);\n }\n};\n\nexport const getOptions = function() {\n return options;\n};\n\nexport const commit = function(msg) {\n const commit = {\n id: getId(),\n message: msg,\n seq: seq++,\n parent: head == null ? null : head.id\n };\n head = commit;\n commits[commit.id] = commit;\n branches[curBranch] = commit.id;\n log.debug('in pushCommit ' + commit.id);\n};\n\nexport const branch = function(name) {\n branches[name] = head != null ? head.id : null;\n log.debug('in createBranch');\n};\n\nexport const merge = function(otherBranch) {\n const currentCommit = commits[branches[curBranch]];\n const otherCommit = commits[branches[otherBranch]];\n if (isReachableFrom(currentCommit, otherCommit)) {\n log.debug('Already merged');\n return;\n }\n if (isfastforwardable(currentCommit, otherCommit)) {\n branches[curBranch] = branches[otherBranch];\n head = commits[branches[curBranch]];\n } else {\n // create merge commit\n const commit = {\n id: getId(),\n message: 'merged branch ' + otherBranch + ' into ' + curBranch,\n seq: seq++,\n parent: [head == null ? null : head.id, branches[otherBranch]]\n };\n head = commit;\n commits[commit.id] = commit;\n branches[curBranch] = commit.id;\n }\n log.debug(branches);\n log.debug('in mergeBranch');\n};\n\nexport const checkout = function(branch) {\n log.debug('in checkout');\n curBranch = branch;\n const id = branches[curBranch];\n head = commits[id];\n};\n\nexport const reset = function(commitRef) {\n log.debug('in reset', commitRef);\n const ref = commitRef.split(':')[0];\n let parentCount = parseInt(commitRef.split(':')[1]);\n let commit = ref === 'HEAD' ? head : commits[branches[ref]];\n log.debug(commit, parentCount);\n while (parentCount > 0) {\n commit = commits[commit.parent];\n parentCount--;\n if (!commit) {\n const err = 'Critical error - unique parent commit not found during reset';\n log.error(err);\n throw err;\n }\n }\n head = commit;\n branches[curBranch] = commit.id;\n};\n\nfunction upsert(arr, key, newval) {\n const index = arr.indexOf(key);\n if (index === -1) {\n arr.push(newval);\n } else {\n arr.splice(index, 1, newval);\n }\n}\n\nfunction prettyPrintCommitHistory(commitArr) {\n const commit = commitArr.reduce((out, commit) => {\n if (out.seq > commit.seq) return out;\n return commit;\n }, commitArr[0]);\n let line = '';\n commitArr.forEach(function(c) {\n if (c === commit) {\n line += '\\t*';\n } else {\n line += '\\t|';\n }\n });\n const label = [line, commit.id, commit.seq];\n for (let branch in branches) {\n if (branches[branch] === commit.id) label.push(branch);\n }\n log.debug(label.join(' '));\n if (Array.isArray(commit.parent)) {\n const newCommit = commits[commit.parent[0]];\n upsert(commitArr, commit, newCommit);\n commitArr.push(commits[commit.parent[1]]);\n } else if (commit.parent == null) {\n return;\n } else {\n const nextCommit = commits[commit.parent];\n upsert(commitArr, commit, nextCommit);\n }\n commitArr = uniqBy(commitArr, c => c.id);\n prettyPrintCommitHistory(commitArr);\n}\n\nexport const prettyPrint = function() {\n log.debug(commits);\n const node = getCommitsArray()[0];\n prettyPrintCommitHistory([node]);\n};\n\nexport const clear = function() {\n commits = {};\n head = null;\n branches = { master: head };\n curBranch = 'master';\n seq = 0;\n};\n\nexport const getBranchesAsObjArray = function() {\n const branchArr = [];\n for (let branch in branches) {\n branchArr.push({ name: branch, commit: commits[branches[branch]] });\n }\n return branchArr;\n};\n\nexport const getBranches = function() {\n return branches;\n};\nexport const getCommits = function() {\n return commits;\n};\nexport const getCommitsArray = function() {\n const commitArr = Object.keys(commits).map(function(key) {\n return commits[key];\n });\n commitArr.forEach(function(o) {\n log.debug(o.id);\n });\n commitArr.sort((a, b) => b.seq - a.seq);\n return commitArr;\n};\nexport const getCurrentBranch = function() {\n return curBranch;\n};\nexport const getDirection = function() {\n return direction;\n};\nexport const getHead = function() {\n return head;\n};\n\nexport default {\n setDirection,\n setOptions,\n getOptions,\n commit,\n branch,\n merge,\n checkout,\n reset,\n prettyPrint,\n clear,\n getBranchesAsObjArray,\n getBranches,\n getCommits,\n getCommitsArray,\n getCurrentBranch,\n getDirection,\n getHead\n};\n","import { curveBasis, line, select } from 'd3';\n\nimport db from './gitGraphAst';\nimport gitGraphParser from './parser/gitGraph';\nimport { log } from '../../logger';\nimport { interpolateToCurve } from '../../utils';\n\nlet allCommitsDict = {};\nlet branchNum;\nlet config = {\n nodeSpacing: 150,\n nodeFillColor: 'yellow',\n nodeStrokeWidth: 2,\n nodeStrokeColor: 'grey',\n lineStrokeWidth: 4,\n branchOffset: 50,\n lineColor: 'grey',\n leftMargin: 50,\n branchColors: ['#442f74', '#983351', '#609732', '#AA9A39'],\n nodeRadius: 10,\n nodeLabel: {\n width: 75,\n height: 100,\n x: -25,\n y: 0\n }\n};\nlet apiConfig = {};\nexport const setConf = function(c) {\n apiConfig = c;\n};\n\nfunction svgCreateDefs(svg) {\n svg\n .append('defs')\n .append('g')\n .attr('id', 'def-commit')\n .append('circle')\n .attr('r', config.nodeRadius)\n .attr('cx', 0)\n .attr('cy', 0);\n svg\n .select('#def-commit')\n .append('foreignObject')\n .attr('width', config.nodeLabel.width)\n .attr('height', config.nodeLabel.height)\n .attr('x', config.nodeLabel.x)\n .attr('y', config.nodeLabel.y)\n .attr('class', 'node-label')\n .attr('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility')\n .append('p')\n .html('');\n}\n\nfunction svgDrawLine(svg, points, colorIdx, interpolate) {\n const curve = interpolateToCurve(interpolate, curveBasis);\n const color = config.branchColors[colorIdx % config.branchColors.length];\n const lineGen = line()\n .x(function(d) {\n return Math.round(d.x);\n })\n .y(function(d) {\n return Math.round(d.y);\n })\n .curve(curve);\n\n svg\n .append('svg:path')\n .attr('d', lineGen(points))\n .style('stroke', color)\n .style('stroke-width', config.lineStrokeWidth)\n .style('fill', 'none');\n}\n\n// Pass in the element and its pre-transform coords\nfunction getElementCoords(element, coords) {\n coords = coords || element.node().getBBox();\n const ctm = element.node().getCTM();\n const xn = ctm.e + coords.x * ctm.a;\n const yn = ctm.f + coords.y * ctm.d;\n return {\n left: xn,\n top: yn,\n width: coords.width,\n height: coords.height\n };\n}\n\nfunction svgDrawLineForCommits(svg, fromId, toId, direction, color) {\n log.debug('svgDrawLineForCommits: ', fromId, toId);\n const fromBbox = getElementCoords(svg.select('#node-' + fromId + ' circle'));\n const toBbox = getElementCoords(svg.select('#node-' + toId + ' circle'));\n switch (direction) {\n case 'LR':\n // (toBbox)\n // +--------\n // + (fromBbox)\n if (fromBbox.left - toBbox.left > config.nodeSpacing) {\n const lineStart = {\n x: fromBbox.left - config.nodeSpacing,\n y: toBbox.top + toBbox.height / 2\n };\n const lineEnd = { x: toBbox.left + toBbox.width, y: toBbox.top + toBbox.height / 2 };\n svgDrawLine(svg, [lineStart, lineEnd], color, 'linear');\n svgDrawLine(\n svg,\n [\n { x: fromBbox.left, y: fromBbox.top + fromBbox.height / 2 },\n { x: fromBbox.left - config.nodeSpacing / 2, y: fromBbox.top + fromBbox.height / 2 },\n { x: fromBbox.left - config.nodeSpacing / 2, y: lineStart.y },\n lineStart\n ],\n color\n );\n } else {\n svgDrawLine(\n svg,\n [\n {\n x: fromBbox.left,\n y: fromBbox.top + fromBbox.height / 2\n },\n {\n x: fromBbox.left - config.nodeSpacing / 2,\n y: fromBbox.top + fromBbox.height / 2\n },\n {\n x: fromBbox.left - config.nodeSpacing / 2,\n y: toBbox.top + toBbox.height / 2\n },\n {\n x: toBbox.left + toBbox.width,\n y: toBbox.top + toBbox.height / 2\n }\n ],\n color\n );\n }\n break;\n case 'BT':\n // + (fromBbox)\n // |\n // |\n // + (toBbox)\n if (toBbox.top - fromBbox.top > config.nodeSpacing) {\n const lineStart = {\n x: toBbox.left + toBbox.width / 2,\n y: fromBbox.top + fromBbox.height + config.nodeSpacing\n };\n const lineEnd = { x: toBbox.left + toBbox.width / 2, y: toBbox.top };\n svgDrawLine(svg, [lineStart, lineEnd], color, 'linear');\n svgDrawLine(\n svg,\n [\n { x: fromBbox.left + fromBbox.width / 2, y: fromBbox.top + fromBbox.height },\n {\n x: fromBbox.left + fromBbox.width / 2,\n y: fromBbox.top + fromBbox.height + config.nodeSpacing / 2\n },\n { x: toBbox.left + toBbox.width / 2, y: lineStart.y - config.nodeSpacing / 2 },\n lineStart\n ],\n color\n );\n } else {\n svgDrawLine(\n svg,\n [\n {\n x: fromBbox.left + fromBbox.width / 2,\n y: fromBbox.top + fromBbox.height\n },\n {\n x: fromBbox.left + fromBbox.width / 2,\n y: fromBbox.top + config.nodeSpacing / 2\n },\n {\n x: toBbox.left + toBbox.width / 2,\n y: toBbox.top - config.nodeSpacing / 2\n },\n {\n x: toBbox.left + toBbox.width / 2,\n y: toBbox.top\n }\n ],\n color\n );\n }\n break;\n }\n}\n\nfunction cloneNode(svg, selector) {\n return svg\n .select(selector)\n .node()\n .cloneNode(true);\n}\n\nfunction renderCommitHistory(svg, commitid, branches, direction) {\n let commit;\n const numCommits = Object.keys(allCommitsDict).length;\n if (typeof commitid === 'string') {\n do {\n commit = allCommitsDict[commitid];\n log.debug('in renderCommitHistory', commit.id, commit.seq);\n if (svg.select('#node-' + commitid).size() > 0) {\n return;\n }\n svg\n .append(function() {\n return cloneNode(svg, '#def-commit');\n })\n .attr('class', 'commit')\n .attr('id', function() {\n return 'node-' + commit.id;\n })\n .attr('transform', function() {\n switch (direction) {\n case 'LR':\n return (\n 'translate(' +\n (commit.seq * config.nodeSpacing + config.leftMargin) +\n ', ' +\n branchNum * config.branchOffset +\n ')'\n );\n case 'BT':\n return (\n 'translate(' +\n (branchNum * config.branchOffset + config.leftMargin) +\n ', ' +\n (numCommits - commit.seq) * config.nodeSpacing +\n ')'\n );\n }\n })\n .attr('fill', config.nodeFillColor)\n .attr('stroke', config.nodeStrokeColor)\n .attr('stroke-width', config.nodeStrokeWidth);\n\n let branch;\n for (let branchName in branches) {\n if (branches[branchName].commit === commit) {\n branch = branches[branchName];\n break;\n }\n }\n if (branch) {\n log.debug('found branch ', branch.name);\n svg\n .select('#node-' + commit.id + ' p')\n .append('xhtml:span')\n .attr('class', 'branch-label')\n .text(branch.name + ', ');\n }\n svg\n .select('#node-' + commit.id + ' p')\n .append('xhtml:span')\n .attr('class', 'commit-id')\n .text(commit.id);\n if (commit.message !== '' && direction === 'BT') {\n svg\n .select('#node-' + commit.id + ' p')\n .append('xhtml:span')\n .attr('class', 'commit-msg')\n .text(', ' + commit.message);\n }\n commitid = commit.parent;\n } while (commitid && allCommitsDict[commitid]);\n }\n\n if (Array.isArray(commitid)) {\n log.debug('found merge commmit', commitid);\n renderCommitHistory(svg, commitid[0], branches, direction);\n branchNum++;\n renderCommitHistory(svg, commitid[1], branches, direction);\n branchNum--;\n }\n}\n\nfunction renderLines(svg, commit, direction, branchColor) {\n branchColor = branchColor || 0;\n while (commit.seq > 0 && !commit.lineDrawn) {\n if (typeof commit.parent === 'string') {\n svgDrawLineForCommits(svg, commit.id, commit.parent, direction, branchColor);\n commit.lineDrawn = true;\n commit = allCommitsDict[commit.parent];\n } else if (Array.isArray(commit.parent)) {\n svgDrawLineForCommits(svg, commit.id, commit.parent[0], direction, branchColor);\n svgDrawLineForCommits(svg, commit.id, commit.parent[1], direction, branchColor + 1);\n renderLines(svg, allCommitsDict[commit.parent[1]], direction, branchColor + 1);\n commit.lineDrawn = true;\n commit = allCommitsDict[commit.parent[0]];\n }\n }\n}\n\nexport const draw = function(txt, id, ver) {\n try {\n const parser = gitGraphParser.parser;\n parser.yy = db;\n parser.yy.clear();\n\n log.debug('in gitgraph renderer', txt + '\\n', 'id:', id, ver);\n // Parse the graph definition\n parser.parse(txt + '\\n');\n\n config = Object.assign(config, apiConfig, db.getOptions());\n log.debug('effective options', config);\n const direction = db.getDirection();\n allCommitsDict = db.getCommits();\n const branches = db.getBranchesAsObjArray();\n if (direction === 'BT') {\n config.nodeLabel.x = branches.length * config.branchOffset;\n config.nodeLabel.width = '100%';\n config.nodeLabel.y = -1 * 2 * config.nodeRadius;\n }\n const svg = select(`[id=\"${id}\"]`);\n svgCreateDefs(svg);\n branchNum = 1;\n for (let branch in branches) {\n const v = branches[branch];\n renderCommitHistory(svg, v.commit.id, branches, direction);\n renderLines(svg, v.commit, direction);\n branchNum++;\n }\n svg.attr('height', function() {\n if (direction === 'BT') return Object.keys(allCommitsDict).length * config.nodeSpacing;\n return (branches.length + 1) * config.branchOffset;\n });\n } catch (e) {\n log.error('Error while rendering gitgraph');\n log.error(e.message);\n }\n};\n\nexport default {\n setConf,\n draw\n};\n","/**\n * Created by AshishJ on 11-09-2019.\n */\nimport { select, scaleOrdinal, schemeSet2, pie as d3pie, entries, arc } from 'd3';\nimport pieData from './pieDb';\nimport pieParser from './parser/pie';\nimport { log } from '../../logger';\nimport { configureSvgSize } from '../../utils';\n\nconst conf = {};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\n\n/**\n * Draws a Pie Chart with the data given in text.\n * @param text\n * @param id\n */\nlet width;\nconst height = 450;\nexport const draw = (txt, id) => {\n try {\n const parser = pieParser.parser;\n parser.yy = pieData;\n log.debug('Rendering info diagram\\n' + txt);\n // Parse the Pie Chart definition\n parser.yy.clear();\n parser.parse(txt);\n log.debug('Parsed info diagram');\n const elem = document.getElementById(id);\n width = elem.parentElement.offsetWidth;\n\n if (typeof width === 'undefined') {\n width = 1200;\n }\n\n if (typeof conf.useWidth !== 'undefined') {\n width = conf.useWidth;\n }\n\n const diagram = select('#' + id);\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n // Set viewBox\n elem.setAttribute('viewBox', '0 0 ' + width + ' ' + height);\n\n // Fetch the default direction, use TD if none was found\n var margin = 40;\n var legendRectSize = 18;\n var legendSpacing = 4;\n\n var radius = Math.min(width, height) / 2 - margin;\n\n var svg = diagram\n .append('g')\n .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');\n\n var data = pieData.getSections();\n var sum = 0;\n Object.keys(data).forEach(function(key) {\n sum += data[key];\n });\n\n // Set the color scale\n var color = scaleOrdinal()\n .domain(data)\n .range(schemeSet2);\n\n // Compute the position of each group on the pie:\n var pie = d3pie().value(function(d) {\n return d.value;\n });\n var dataReady = pie(entries(data));\n\n // Shape helper to build arcs:\n var arcGenerator = arc()\n .innerRadius(0)\n .outerRadius(radius);\n\n // Build the pie chart: each part of the pie is a path that we build using the arc function.\n svg\n .selectAll('mySlices')\n .data(dataReady)\n .enter()\n .append('path')\n .attr('d', arcGenerator)\n .attr('fill', function(d) {\n return color(d.data.key);\n })\n .attr('stroke', 'black')\n .style('stroke-width', '2px')\n .style('opacity', 0.7);\n\n // Now add the percentage.\n // Use the centroid method to get the best coordinates.\n svg\n .selectAll('mySlices')\n .data(dataReady.filter(value => value.data.value !== 0))\n .enter()\n .append('text')\n .text(function(d) {\n return ((d.data.value / sum) * 100).toFixed(0) + '%';\n })\n .attr('transform', function(d) {\n return 'translate(' + arcGenerator.centroid(d) + ')';\n })\n .style('text-anchor', 'middle')\n .attr('class', 'slice')\n .style('font-size', 17);\n\n svg\n .append('text')\n .text(parser.yy.getTitle())\n .attr('x', 0)\n .attr('y', -(height - 50) / 2)\n .attr('class', 'pieTitleText');\n\n // Add the legends/annotations for each section\n var legend = svg\n .selectAll('.legend')\n .data(color.domain())\n .enter()\n .append('g')\n .attr('class', 'legend')\n .attr('transform', function(d, i) {\n var height = legendRectSize + legendSpacing;\n var offset = (height * color.domain().length) / 2;\n var horz = 12 * legendRectSize;\n var vert = i * height - offset;\n return 'translate(' + horz + ',' + vert + ')';\n });\n\n legend\n .append('rect')\n .attr('width', legendRectSize)\n .attr('height', legendRectSize)\n .style('fill', color)\n .style('stroke', color);\n\n legend\n .append('text')\n .attr('x', legendRectSize + legendSpacing)\n .attr('y', legendRectSize - legendSpacing)\n .text(function(d) {\n return d;\n });\n } catch (e) {\n log.error('Error while rendering info diagram');\n log.error(e);\n }\n};\n\nexport default {\n setConf,\n draw\n};\n","/**\n * Created by knut on 15-01-14.\n */\nimport { log } from '../../logger';\n\nvar message = '';\nvar info = false;\n\nexport const setMessage = txt => {\n log.debug('Setting message to: ' + txt);\n message = txt;\n};\n\nexport const getMessage = () => {\n return message;\n};\n\nexport const setInfo = inf => {\n info = inf;\n};\n\nexport const getInfo = () => {\n return info;\n};\n\n// export const parseError = (err, hash) => {\n// global.mermaidAPI.parseError(err, hash)\n// }\n\nexport default {\n setMessage,\n getMessage,\n setInfo,\n getInfo\n // parseError\n};\n","/**\n * Created by knut on 14-12-11.\n */\nimport { select } from 'd3';\nimport db from './infoDb';\nimport infoParser from './parser/info';\nimport { log } from '../../logger';\n\nconst conf = {};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\n\n/**\n * Draws a an info picture in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = (txt, id, ver) => {\n try {\n const parser = infoParser.parser;\n parser.yy = db;\n log.debug('Renering info diagram\\n' + txt);\n // Parse the graph definition\n parser.parse(txt);\n log.debug('Parsed info diagram');\n // Fetch the default direction, use TD if none was found\n const svg = select('#' + id);\n\n const g = svg.append('g');\n\n g.append('text') // text label for the x axis\n .attr('x', 100)\n .attr('y', 40)\n .attr('class', 'version')\n .attr('font-size', '32px')\n .style('text-anchor', 'middle')\n .text('v ' + ver);\n\n svg.attr('height', 100);\n svg.attr('width', 400);\n // svg.attr('viewBox', '0 0 300 150');\n } catch (e) {\n log.error('Error while rendering info diagram');\n log.error(e.message);\n }\n};\n\nexport default {\n setConf,\n draw\n};\n","/**\n * Created by knut on 14-12-11.\n */\nimport { select } from 'd3';\nimport { log } from './logger';\n\nconst conf = {};\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\n\n/**\n * Draws a an info picture in the tag with id: id based on the graph definition in text.\n * @param text\n * @param id\n */\nexport const draw = (id, ver) => {\n try {\n log.debug('Renering svg for syntax error\\n');\n\n const svg = select('#' + id);\n\n const g = svg.append('g');\n\n g.append('path')\n .attr('class', 'error-icon')\n .attr(\n 'd',\n 'm411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z'\n );\n\n g.append('path')\n .attr('class', 'error-icon')\n .attr(\n 'd',\n 'm459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z'\n );\n\n g.append('path')\n .attr('class', 'error-icon')\n .attr(\n 'd',\n 'm340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z'\n );\n\n g.append('path')\n .attr('class', 'error-icon')\n .attr(\n 'd',\n 'm400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z'\n );\n\n g.append('path')\n .attr('class', 'error-icon')\n .attr(\n 'd',\n 'm496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z'\n );\n\n g.append('path')\n .attr('class', 'error-icon')\n .attr(\n 'd',\n 'm436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z'\n );\n\n g.append('text') // text label for the x axis\n .attr('class', 'error-text')\n .attr('x', 1240)\n .attr('y', 250)\n .attr('font-size', '150px')\n .style('text-anchor', 'middle')\n .text('Syntax error in graph');\n g.append('text') // text label for the x axis\n .attr('class', 'error-text')\n .attr('x', 1050)\n .attr('y', 400)\n .attr('font-size', '100px')\n .style('text-anchor', 'middle')\n .text('mermaid version ' + ver);\n\n svg.attr('height', 100);\n svg.attr('width', 400);\n svg.attr('viewBox', '768 0 512 512');\n } catch (e) {\n log.error('Error while rendering info diagram');\n log.error(e.message);\n }\n};\n\nexport default {\n setConf,\n draw\n};\n","/**\n *\n */\nimport { log } from '../../logger';\nimport mermaidAPI from '../../mermaidAPI';\nimport * as configApi from '../../config';\n\nlet sections = {};\nlet title = '';\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nconst addSection = function(id, value) {\n if (typeof sections[id] === 'undefined') {\n sections[id] = value;\n log.debug('Added new section :', id);\n }\n};\nconst getSections = () => sections;\n\nconst setTitle = function(txt) {\n title = txt;\n};\n\nconst getTitle = function() {\n return title;\n};\nconst cleanupValue = function(value) {\n if (value.substring(0, 1) === ':') {\n value = value.substring(1).trim();\n return Number(value.trim());\n } else {\n return Number(value.trim());\n }\n};\n\nconst clear = function() {\n sections = {};\n title = '';\n};\n// export const parseError = (err, hash) => {\n// global.mermaidAPI.parseError(err, hash)\n// }\n\nexport default {\n parseDirective,\n getConfig: () => configApi.getConfig().pie,\n addSection,\n getSections,\n cleanupValue,\n clear,\n setTitle,\n getTitle\n // parseError\n};\n","/**\n *\n */\nimport { log } from '../../logger';\nimport mermaidAPI from '../../mermaidAPI';\nimport * as configApi from '../../config';\n\nlet entities = {};\nlet relationships = [];\nlet title = '';\n\nconst Cardinality = {\n ZERO_OR_ONE: 'ZERO_OR_ONE',\n ZERO_OR_MORE: 'ZERO_OR_MORE',\n ONE_OR_MORE: 'ONE_OR_MORE',\n ONLY_ONE: 'ONLY_ONE'\n};\n\nconst Identification = {\n NON_IDENTIFYING: 'NON_IDENTIFYING',\n IDENTIFYING: 'IDENTIFYING'\n};\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nconst addEntity = function(name) {\n if (typeof entities[name] === 'undefined') {\n entities[name] = { attributes: [] };\n log.info('Added new entity :', name);\n }\n\n return entities[name];\n};\n\nconst getEntities = () => entities;\n\nconst addAttributes = function(entityName, attribs) {\n let entity = addEntity(entityName); // May do nothing (if entity has already been added)\n\n // Process attribs in reverse order due to effect of recursive construction (last attribute is first)\n let i;\n for (i = attribs.length - 1; i >= 0; i--) {\n entity.attributes.push(attribs[i]);\n log.debug('Added attribute ', attribs[i].attributeName);\n }\n};\n\n/**\n * Add a relationship\n * @param entA The first entity in the relationship\n * @param rolA The role played by the first entity in relation to the second\n * @param entB The second entity in the relationship\n * @param rSpec The details of the relationship between the two entities\n */\nconst addRelationship = function(entA, rolA, entB, rSpec) {\n let rel = {\n entityA: entA,\n roleA: rolA,\n entityB: entB,\n relSpec: rSpec\n };\n\n relationships.push(rel);\n log.debug('Added new relationship :', rel);\n};\n\nconst getRelationships = () => relationships;\n\n// Keep this - TODO: revisit...allow the diagram to have a title\nconst setTitle = function(txt) {\n title = txt;\n};\n\nconst getTitle = function() {\n return title;\n};\n\nconst clear = function() {\n entities = {};\n relationships = [];\n title = '';\n};\n\nexport default {\n Cardinality,\n Identification,\n parseDirective,\n getConfig: () => configApi.getConfig().er,\n addEntity,\n addAttributes,\n getEntities,\n addRelationship,\n getRelationships,\n clear,\n setTitle,\n getTitle\n};\n","const ERMarkers = {\n ONLY_ONE_START: 'ONLY_ONE_START',\n ONLY_ONE_END: 'ONLY_ONE_END',\n ZERO_OR_ONE_START: 'ZERO_OR_ONE_START',\n ZERO_OR_ONE_END: 'ZERO_OR_ONE_END',\n ONE_OR_MORE_START: 'ONE_OR_MORE_START',\n ONE_OR_MORE_END: 'ONE_OR_MORE_END',\n ZERO_OR_MORE_START: 'ZERO_OR_MORE_START',\n ZERO_OR_MORE_END: 'ZERO_OR_MORE_END'\n};\n\n/**\n * Put the markers into the svg DOM for later use with edge paths\n */\nconst insertMarkers = function(elem, conf) {\n let marker;\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ONLY_ONE_START)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M9,0 L9,18 M15,0 L15,18');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ONLY_ONE_END)\n .attr('refX', 18)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M3,0 L3,18 M9,0 L9,18');\n\n marker = elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ZERO_OR_ONE_START)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto');\n marker\n .append('circle')\n .attr('stroke', conf.stroke)\n .attr('fill', 'white')\n .attr('cx', 21)\n .attr('cy', 9)\n .attr('r', 6);\n marker\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M9,0 L9,18');\n\n marker = elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ZERO_OR_ONE_END)\n .attr('refX', 30)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto');\n marker\n .append('circle')\n .attr('stroke', conf.stroke)\n .attr('fill', 'white')\n .attr('cx', 9)\n .attr('cy', 9)\n .attr('r', 6);\n marker\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M21,0 L21,18');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ONE_OR_MORE_START)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ONE_OR_MORE_END)\n .attr('refX', 27)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18');\n\n marker = elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ZERO_OR_MORE_START)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto');\n marker\n .append('circle')\n .attr('stroke', conf.stroke)\n .attr('fill', 'white')\n .attr('cx', 48)\n .attr('cy', 18)\n .attr('r', 6);\n marker\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18');\n\n marker = elem\n .append('defs')\n .append('marker')\n .attr('id', ERMarkers.ZERO_OR_MORE_END)\n .attr('refX', 39)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto');\n marker\n .append('circle')\n .attr('stroke', conf.stroke)\n .attr('fill', 'white')\n .attr('cx', 9)\n .attr('cy', 18)\n .attr('r', 6);\n marker\n .append('path')\n .attr('stroke', conf.stroke)\n .attr('fill', 'none')\n .attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18');\n\n return;\n};\n\nexport default {\n ERMarkers,\n insertMarkers\n};\n","import graphlib from 'graphlib';\nimport { line, curveBasis, select } from 'd3';\nimport erDb from './erDb';\nimport erParser from './parser/erDiagram';\nimport dagre from 'dagre';\nimport { getConfig } from '../../config';\nimport { log } from '../../logger';\nimport erMarkers from './erMarkers';\nimport { configureSvgSize } from '../../utils';\n\nconst conf = {};\n\n/**\n * Allows the top-level API module to inject config specific to this renderer,\n * storing it in the local conf object. Note that generic config still needs to be\n * retrieved using getConfig() imported from the config module\n */\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n for (let i = 0; i < keys.length; i++) {\n conf[keys[i]] = cnf[keys[i]];\n }\n};\n\n/**\n * Draw attributes for an entity\n * @param groupNode the svg group node for the entity\n * @param entityTextNode the svg node for the entity label text\n * @param attributes an array of attributes defined for the entity (each attribute has a type and a name)\n * @return the bounding box of the entity, after attributes have been added\n */\nconst drawAttributes = (groupNode, entityTextNode, attributes) => {\n const heightPadding = conf.entityPadding / 3; // Padding internal to attribute boxes\n const widthPadding = conf.entityPadding / 3; // Ditto\n const attrFontSize = conf.fontSize * 0.85;\n const labelBBox = entityTextNode.node().getBBox();\n const attributeNodes = []; // Intermediate storage for attribute nodes created so that we can do a second pass\n let maxTypeWidth = 0;\n let maxNameWidth = 0;\n let cumulativeHeight = labelBBox.height + heightPadding * 2;\n let attrNum = 1;\n\n attributes.forEach(item => {\n const attrPrefix = `${entityTextNode.node().id}-attr-${attrNum}`;\n\n // Add a text node for the attribute type\n const typeNode = groupNode\n .append('text')\n .attr('class', 'er entityLabel')\n .attr('id', `${attrPrefix}-type`)\n .attr('x', 0)\n .attr('y', 0)\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'left')\n .attr(\n 'style',\n 'font-family: ' + getConfig().fontFamily + '; font-size: ' + attrFontSize + 'px'\n )\n .text(item.attributeType);\n\n // Add a text node for the attribute name\n const nameNode = groupNode\n .append('text')\n .attr('class', 'er entityLabel')\n .attr('id', `${attrPrefix}-name`)\n .attr('x', 0)\n .attr('y', 0)\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'left')\n .attr(\n 'style',\n 'font-family: ' + getConfig().fontFamily + '; font-size: ' + attrFontSize + 'px'\n )\n .text(item.attributeName);\n\n // Keep a reference to the nodes so that we can iterate through them later\n attributeNodes.push({ tn: typeNode, nn: nameNode });\n\n const typeBBox = typeNode.node().getBBox();\n const nameBBox = nameNode.node().getBBox();\n\n maxTypeWidth = Math.max(maxTypeWidth, typeBBox.width);\n maxNameWidth = Math.max(maxNameWidth, nameBBox.width);\n\n cumulativeHeight += Math.max(typeBBox.height, nameBBox.height) + heightPadding * 2;\n attrNum += 1;\n });\n\n // Calculate the new bounding box of the overall entity, now that attributes have been added\n const bBox = {\n width: Math.max(\n conf.minEntityWidth,\n Math.max(\n labelBBox.width + conf.entityPadding * 2,\n maxTypeWidth + maxNameWidth + widthPadding * 4\n )\n ),\n height:\n attributes.length > 0\n ? cumulativeHeight\n : Math.max(conf.minEntityHeight, labelBBox.height + conf.entityPadding * 2)\n };\n\n // There might be some spare width for padding out attributes if the entity name is very long\n const spareWidth = Math.max(0, bBox.width - (maxTypeWidth + maxNameWidth) - widthPadding * 4);\n\n if (attributes.length > 0) {\n // Position the entity label near the top of the entity bounding box\n entityTextNode.attr(\n 'transform',\n 'translate(' + bBox.width / 2 + ',' + (heightPadding + labelBBox.height / 2) + ')'\n );\n\n // Add rectangular boxes for the attribute types/names\n let heightOffset = labelBBox.height + heightPadding * 2; // Start at the bottom of the entity label\n let attribStyle = 'attributeBoxOdd'; // We will flip the style on alternate rows to achieve a banded effect\n\n attributeNodes.forEach(nodePair => {\n // Calculate the alignment y co-ordinate for the type/name of the attribute\n const alignY =\n heightOffset +\n heightPadding +\n Math.max(nodePair.tn.node().getBBox().height, nodePair.nn.node().getBBox().height) / 2;\n\n // Position the type of the attribute\n nodePair.tn.attr('transform', 'translate(' + widthPadding + ',' + alignY + ')');\n\n // Insert a rectangle for the type\n const typeRect = groupNode\n .insert('rect', '#' + nodePair.tn.node().id)\n .attr('class', `er ${attribStyle}`)\n .attr('fill', conf.fill)\n .attr('fill-opacity', '100%')\n .attr('stroke', conf.stroke)\n .attr('x', 0)\n .attr('y', heightOffset)\n .attr('width', maxTypeWidth + widthPadding * 2 + spareWidth / 2)\n .attr('height', nodePair.tn.node().getBBox().height + heightPadding * 2);\n\n // Position the name of the attribute\n nodePair.nn.attr(\n 'transform',\n 'translate(' + (parseFloat(typeRect.attr('width')) + widthPadding) + ',' + alignY + ')'\n );\n\n // Insert a rectangle for the name\n groupNode\n .insert('rect', '#' + nodePair.nn.node().id)\n .attr('class', `er ${attribStyle}`)\n .attr('fill', conf.fill)\n .attr('fill-opacity', '100%')\n .attr('stroke', conf.stroke)\n .attr('x', `${typeRect.attr('x') + typeRect.attr('width')}`)\n //.attr('x', maxTypeWidth + (widthPadding * 2))\n .attr('y', heightOffset)\n .attr('width', maxNameWidth + widthPadding * 2 + spareWidth / 2)\n .attr('height', nodePair.nn.node().getBBox().height + heightPadding * 2);\n\n // Increment the height offset to move to the next row\n heightOffset +=\n Math.max(nodePair.tn.node().getBBox().height, nodePair.nn.node().getBBox().height) +\n heightPadding * 2;\n\n // Flip the attribute style for row banding\n attribStyle = attribStyle == 'attributeBoxOdd' ? 'attributeBoxEven' : 'attributeBoxOdd';\n });\n } else {\n // Ensure the entity box is a decent size without any attributes\n bBox.height = Math.max(conf.minEntityHeight, cumulativeHeight);\n\n // Position the entity label in the middle of the box\n entityTextNode.attr('transform', 'translate(' + bBox.width / 2 + ',' + bBox.height / 2 + ')');\n }\n\n return bBox;\n};\n\n/**\n * Use D3 to construct the svg elements for the entities\n * @param svgNode the svg node that contains the diagram\n * @param entities The entities to be drawn\n * @param graph The graph that contains the vertex and edge definitions post-layout\n * @return The first entity that was inserted\n */\nconst drawEntities = function(svgNode, entities, graph) {\n const keys = Object.keys(entities);\n let firstOne;\n\n keys.forEach(function(id) {\n // Create a group for each entity\n const groupNode = svgNode.append('g').attr('id', id);\n\n firstOne = firstOne === undefined ? id : firstOne;\n\n // Label the entity - this is done first so that we can get the bounding box\n // which then determines the size of the rectangle\n const textId = 'entity-' + id;\n const textNode = groupNode\n .append('text')\n .attr('class', 'er entityLabel')\n .attr('id', textId)\n .attr('x', 0)\n .attr('y', 0)\n .attr('dominant-baseline', 'middle')\n .attr('text-anchor', 'middle')\n .attr(\n 'style',\n 'font-family: ' + getConfig().fontFamily + '; font-size: ' + conf.fontSize + 'px'\n )\n .text(id);\n\n const { width: entityWidth, height: entityHeight } = drawAttributes(\n groupNode,\n textNode,\n entities[id].attributes\n );\n\n // Draw the rectangle - insert it before the text so that the text is not obscured\n const rectNode = groupNode\n .insert('rect', '#' + textId)\n .attr('class', 'er entityBox')\n .attr('fill', conf.fill)\n .attr('fill-opacity', '100%')\n .attr('stroke', conf.stroke)\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', entityWidth)\n .attr('height', entityHeight);\n\n const rectBBox = rectNode.node().getBBox();\n\n // Add the entity to the graph\n graph.setNode(id, {\n width: rectBBox.width,\n height: rectBBox.height,\n shape: 'rect',\n id: id\n });\n });\n return firstOne;\n}; // drawEntities\n\nconst adjustEntities = function(svgNode, graph) {\n graph.nodes().forEach(function(v) {\n if (typeof v !== 'undefined' && typeof graph.node(v) !== 'undefined') {\n svgNode\n .select('#' + v)\n .attr(\n 'transform',\n 'translate(' +\n (graph.node(v).x - graph.node(v).width / 2) +\n ',' +\n (graph.node(v).y - graph.node(v).height / 2) +\n ' )'\n );\n }\n });\n return;\n};\n\nconst getEdgeName = function(rel) {\n return (rel.entityA + rel.roleA + rel.entityB).replace(/\\s/g, '');\n};\n\n/**\n * Add each relationship to the graph\n * @param relationships the relationships to be added\n * @param g the graph\n * @return {Array} The array of relationships\n */\nconst addRelationships = function(relationships, g) {\n relationships.forEach(function(r) {\n g.setEdge(r.entityA, r.entityB, { relationship: r }, getEdgeName(r));\n });\n return relationships;\n}; // addRelationships\n\nlet relCnt = 0;\n/**\n * Draw a relationship using edge information from the graph\n * @param svg the svg node\n * @param rel the relationship to draw in the svg\n * @param g the graph containing the edge information\n * @param insert the insertion point in the svg DOM (because relationships have markers that need to sit 'behind' opaque entity boxes)\n */\nconst drawRelationshipFromLayout = function(svg, rel, g, insert) {\n relCnt++;\n\n // Find the edge relating to this relationship\n const edge = g.edge(rel.entityA, rel.entityB, getEdgeName(rel));\n\n // Get a function that will generate the line path\n const lineFunction = line()\n .x(function(d) {\n return d.x;\n })\n .y(function(d) {\n return d.y;\n })\n .curve(curveBasis);\n\n // Insert the line at the right place\n const svgPath = svg\n .insert('path', '#' + insert)\n .attr('class', 'er relationshipLine')\n .attr('d', lineFunction(edge.points))\n .attr('stroke', conf.stroke)\n .attr('fill', 'none');\n\n // ...and with dashes if necessary\n if (rel.relSpec.relType === erDb.Identification.NON_IDENTIFYING) {\n svgPath.attr('stroke-dasharray', '8,8');\n }\n\n // TODO: Understand this better\n let url = '';\n if (conf.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(');\n url = url.replace(/\\)/g, '\\\\)');\n }\n\n // Decide which start and end markers it needs. It may be possible to be more concise here\n // by reversing a start marker to make an end marker...but this will do for now\n\n // Note that the 'A' entity's marker is at the end of the relationship and the 'B' entity's marker is at the start\n switch (rel.relSpec.cardA) {\n case erDb.Cardinality.ZERO_OR_ONE:\n svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.ZERO_OR_ONE_END + ')');\n break;\n case erDb.Cardinality.ZERO_OR_MORE:\n svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.ZERO_OR_MORE_END + ')');\n break;\n case erDb.Cardinality.ONE_OR_MORE:\n svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.ONE_OR_MORE_END + ')');\n break;\n case erDb.Cardinality.ONLY_ONE:\n svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.ONLY_ONE_END + ')');\n break;\n }\n\n switch (rel.relSpec.cardB) {\n case erDb.Cardinality.ZERO_OR_ONE:\n svgPath.attr(\n 'marker-start',\n 'url(' + url + '#' + erMarkers.ERMarkers.ZERO_OR_ONE_START + ')'\n );\n break;\n case erDb.Cardinality.ZERO_OR_MORE:\n svgPath.attr(\n 'marker-start',\n 'url(' + url + '#' + erMarkers.ERMarkers.ZERO_OR_MORE_START + ')'\n );\n break;\n case erDb.Cardinality.ONE_OR_MORE:\n svgPath.attr(\n 'marker-start',\n 'url(' + url + '#' + erMarkers.ERMarkers.ONE_OR_MORE_START + ')'\n );\n break;\n case erDb.Cardinality.ONLY_ONE:\n svgPath.attr('marker-start', 'url(' + url + '#' + erMarkers.ERMarkers.ONLY_ONE_START + ')');\n break;\n }\n\n // Now label the relationship\n\n // Find the half-way point\n const len = svgPath.node().getTotalLength();\n const labelPoint = svgPath.node().getPointAtLength(len * 0.5);\n\n // Append a text node containing the label\n const labelId = 'rel' + relCnt;\n\n const labelNode = svg\n .append('text')\n .attr('class', 'er relationshipLabel')\n .attr('id', labelId)\n .attr('x', labelPoint.x)\n .attr('y', labelPoint.y)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr(\n 'style',\n 'font-family: ' + getConfig().fontFamily + '; font-size: ' + conf.fontSize + 'px'\n )\n .text(rel.roleA);\n\n // Figure out how big the opaque 'container' rectangle needs to be\n const labelBBox = labelNode.node().getBBox();\n\n // Insert the opaque rectangle before the text label\n svg\n .insert('rect', '#' + labelId)\n .attr('class', 'er relationshipLabelBox')\n .attr('x', labelPoint.x - labelBBox.width / 2)\n .attr('y', labelPoint.y - labelBBox.height / 2)\n .attr('width', labelBBox.width)\n .attr('height', labelBBox.height)\n .attr('fill', 'white')\n .attr('fill-opacity', '85%');\n\n return;\n};\n\n/**\n * Draw en E-R diagram in the tag with id: id based on the text definition of the diagram\n * @param text the text of the diagram\n * @param id the unique id of the DOM node that contains the diagram\n */\nexport const draw = function(text, id) {\n log.info('Drawing ER diagram');\n erDb.clear();\n const parser = erParser.parser;\n parser.yy = erDb;\n\n // Parse the text to populate erDb\n try {\n parser.parse(text);\n } catch (err) {\n log.debug('Parsing failed');\n }\n\n // Get a reference to the svg node that contains the text\n const svg = select(`[id='${id}']`);\n\n // Add cardinality marker definitions to the svg\n erMarkers.insertMarkers(svg, conf);\n\n // Now we have to construct the diagram in a specific way:\n // ---\n // 1. Create all the entities in the svg node at 0,0, but with the correct dimensions (allowing for text content)\n // 2. Make sure they are all added to the graph\n // 3. Add all the edges (relationships) to the graph aswell\n // 4. Let dagre do its magic to layout the graph. This assigns:\n // - the centre co-ordinates for each node, bearing in mind the dimensions and edge relationships\n // - the path co-ordinates for each edge\n // But it has no impact on the svg child nodes - the diagram remains with every entity rooted at 0,0\n // 5. Now assign a transform to each entity in the svg node so that it gets drawn in the correct place, as determined by\n // its centre point, which is obtained from the graph, and it's width and height\n // 6. And finally, create all the edges in the svg node using information from the graph\n // ---\n\n // Create the graph\n let g;\n\n // TODO: Explore directed vs undirected graphs, and how the layout is affected\n // An E-R diagram could be said to be undirected, but there is merit in setting\n // the direction from parent to child in a one-to-many as this influences graphlib to\n // put the parent above the child (does it?), which is intuitive. Most relationships\n // in ER diagrams are one-to-many.\n g = new graphlib.Graph({\n multigraph: true,\n directed: true,\n compound: false\n })\n .setGraph({\n rankdir: conf.layoutDirection,\n marginx: 20,\n marginy: 20,\n nodesep: 100,\n edgesep: 100,\n ranksep: 100\n })\n .setDefaultEdgeLabel(function() {\n return {};\n });\n\n // Draw the entities (at 0,0), returning the first svg node that got\n // inserted - this represents the insertion point for relationship paths\n const firstEntity = drawEntities(svg, erDb.getEntities(), g);\n\n // TODO: externalise the addition of entities to the graph - it's a bit 'buried' in the above\n\n // Add all the relationships to the graph\n const relationships = addRelationships(erDb.getRelationships(), g);\n\n dagre.layout(g); // Node and edge positions will be updated\n\n // Adjust the positions of the entities so that they adhere to the layout\n adjustEntities(svg, g);\n\n // Draw the relationships\n relationships.forEach(function(rel) {\n drawRelationshipFromLayout(svg, rel, g, firstEntity);\n });\n\n const padding = conf.diagramPadding;\n\n const svgBounds = svg.node().getBBox();\n const width = svgBounds.width + padding * 2;\n const height = svgBounds.height + padding * 2;\n\n configureSvgSize(svg, height, width, conf.useMaxWidth);\n\n svg.attr('viewBox', `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`);\n}; // draw\n\nexport default {\n setConf,\n draw\n};\n","import mermaidAPI from '../../mermaidAPI';\nimport * as configApi from '../../config';\n\nlet title = '';\nlet currentSection = '';\n\nconst sections = [];\nconst tasks = [];\nconst rawTasks = [];\n\nexport const parseDirective = function(statement, context, type) {\n mermaidAPI.parseDirective(this, statement, context, type);\n};\n\nexport const clear = function() {\n sections.length = 0;\n tasks.length = 0;\n currentSection = '';\n title = '';\n rawTasks.length = 0;\n};\n\nexport const setTitle = function(txt) {\n title = txt;\n};\n\nexport const getTitle = function() {\n return title;\n};\n\nexport const addSection = function(txt) {\n currentSection = txt;\n sections.push(txt);\n};\n\nexport const getSections = function() {\n return sections;\n};\n\nexport const getTasks = function() {\n let allItemsProcessed = compileTasks();\n const maxDepth = 100;\n let iterationCount = 0;\n while (!allItemsProcessed && iterationCount < maxDepth) {\n allItemsProcessed = compileTasks();\n iterationCount++;\n }\n\n tasks.push(...rawTasks);\n\n return tasks;\n};\n\nconst updateActors = function() {\n const tempActors = [];\n tasks.forEach(task => {\n if (task.people) {\n tempActors.push(...task.people);\n }\n });\n\n const unique = new Set(tempActors);\n return [...unique].sort();\n};\n\nexport const addTask = function(descr, taskData) {\n const pieces = taskData.substr(1).split(':');\n\n let score = 0;\n let peeps = [];\n if (pieces.length === 1) {\n score = Number(pieces[0]);\n peeps = [];\n } else {\n score = Number(pieces[0]);\n peeps = pieces[1].split(',');\n }\n const peopleList = peeps.map(s => s.trim());\n\n const rawTask = {\n section: currentSection,\n type: currentSection,\n people: peopleList,\n task: descr,\n score\n };\n\n rawTasks.push(rawTask);\n};\n\nexport const addTaskOrg = function(descr) {\n const newTask = {\n section: currentSection,\n type: currentSection,\n description: descr,\n task: descr,\n classes: []\n };\n tasks.push(newTask);\n};\n\nconst compileTasks = function() {\n const compileTask = function(pos) {\n return rawTasks[pos].processed;\n };\n\n let allProcessed = true;\n for (let i = 0; i < rawTasks.length; i++) {\n compileTask(i);\n\n allProcessed = allProcessed && rawTasks[i].processed;\n }\n return allProcessed;\n};\n\nconst getActors = function() {\n return updateActors();\n};\n\nexport default {\n parseDirective,\n getConfig: () => configApi.getConfig().journey,\n clear,\n setTitle,\n getTitle,\n addSection,\n getSections,\n getTasks,\n addTask,\n addTaskOrg,\n getActors\n};\n","import { arc as d3arc } from 'd3';\n\nexport const drawRect = function(elem, rectData) {\n const rectElem = elem.append('rect');\n rectElem.attr('x', rectData.x);\n rectElem.attr('y', rectData.y);\n rectElem.attr('fill', rectData.fill);\n rectElem.attr('stroke', rectData.stroke);\n rectElem.attr('width', rectData.width);\n rectElem.attr('height', rectData.height);\n rectElem.attr('rx', rectData.rx);\n rectElem.attr('ry', rectData.ry);\n\n if (typeof rectData.class !== 'undefined') {\n rectElem.attr('class', rectData.class);\n }\n\n return rectElem;\n};\n\nexport const drawFace = function(element, faceData) {\n const radius = 15;\n const circleElement = element\n .append('circle')\n .attr('cx', faceData.cx)\n .attr('cy', faceData.cy)\n .attr('class', 'face')\n .attr('r', radius)\n .attr('stroke-width', 2)\n .attr('overflow', 'visible');\n\n const face = element.append('g');\n\n //left eye\n face\n .append('circle')\n .attr('cx', faceData.cx - radius / 3)\n .attr('cy', faceData.cy - radius / 3)\n .attr('r', 1.5)\n .attr('stroke-width', 2)\n .attr('fill', '#666')\n .attr('stroke', '#666');\n\n //right eye\n face\n .append('circle')\n .attr('cx', faceData.cx + radius / 3)\n .attr('cy', faceData.cy - radius / 3)\n .attr('r', 1.5)\n .attr('stroke-width', 2)\n .attr('fill', '#666')\n .attr('stroke', '#666');\n\n function smile(face) {\n const arc = d3arc()\n .startAngle(Math.PI / 2)\n .endAngle(3 * (Math.PI / 2))\n .innerRadius(radius / 2)\n .outerRadius(radius / 2.2);\n //mouth\n face\n .append('path')\n .attr('class', 'mouth')\n .attr('d', arc)\n .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 2) + ')');\n }\n\n function sad(face) {\n const arc = d3arc()\n .startAngle((3 * Math.PI) / 2)\n .endAngle(5 * (Math.PI / 2))\n .innerRadius(radius / 2)\n .outerRadius(radius / 2.2);\n //mouth\n face\n .append('path')\n .attr('class', 'mouth')\n .attr('d', arc)\n .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 7) + ')');\n }\n\n function ambivalent(face) {\n face\n .append('line')\n .attr('class', 'mouth')\n .attr('stroke', 2)\n .attr('x1', faceData.cx - 5)\n .attr('y1', faceData.cy + 7)\n .attr('x2', faceData.cx + 5)\n .attr('y2', faceData.cy + 7)\n .attr('class', 'mouth')\n .attr('stroke-width', '1px')\n .attr('stroke', '#666');\n }\n\n if (faceData.score > 3) {\n smile(face);\n } else if (faceData.score < 3) {\n sad(face);\n } else {\n ambivalent(face);\n }\n\n return circleElement;\n};\n\nexport const drawCircle = function(element, circleData) {\n const circleElement = element.append('circle');\n circleElement.attr('cx', circleData.cx);\n circleElement.attr('cy', circleData.cy);\n circleElement.attr('fill', circleData.fill);\n circleElement.attr('stroke', circleData.stroke);\n circleElement.attr('r', circleData.r);\n\n if (typeof circleElement.class !== 'undefined') {\n circleElement.attr('class', circleElement.class);\n }\n\n if (typeof circleData.title !== 'undefined') {\n circleElement.append('title').text(circleData.title);\n }\n\n return circleElement;\n};\n\nexport const drawText = function(elem, textData) {\n // Remove and ignore br:s\n const nText = textData.text.replace(//gi, ' ');\n\n const textElem = elem.append('text');\n textElem.attr('x', textData.x);\n textElem.attr('y', textData.y);\n textElem.attr('class', 'legend');\n\n textElem.style('text-anchor', textData.anchor);\n\n if (typeof textData.class !== 'undefined') {\n textElem.attr('class', textData.class);\n }\n\n const span = textElem.append('tspan');\n span.attr('x', textData.x + textData.textMargin * 2);\n span.text(nText);\n\n return textElem;\n};\n\nexport const drawLabel = function(elem, txtObject) {\n function genPoints(x, y, width, height, cut) {\n return (\n x +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n y +\n ' ' +\n (x + width) +\n ',' +\n (y + height - cut) +\n ' ' +\n (x + width - cut * 1.2) +\n ',' +\n (y + height) +\n ' ' +\n x +\n ',' +\n (y + height)\n );\n }\n const polygon = elem.append('polygon');\n polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7));\n polygon.attr('class', 'labelBox');\n\n txtObject.y = txtObject.y + txtObject.labelMargin;\n txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;\n drawText(elem, txtObject);\n};\n\nexport const drawSection = function(elem, section, conf) {\n const g = elem.append('g');\n\n const rect = getNoteRect();\n rect.x = section.x;\n rect.y = section.y;\n rect.fill = section.fill;\n rect.width = conf.width;\n rect.height = conf.height;\n rect.class = 'journey-section section-type-' + section.num;\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n _drawTextCandidateFunc(conf)(\n section.text,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'journey-section section-type-' + section.num },\n conf,\n section.colour\n );\n};\n\nlet taskCount = -1;\n/**\n * Draws an actor in the diagram with the attaced line\n * @param elem The HTML element\n * @param task The task to render\n * @param conf The global configuration\n */\nexport const drawTask = function(elem, task, conf) {\n const center = task.x + conf.width / 2;\n const g = elem.append('g');\n taskCount++;\n const maxHeight = 300 + 5 * 30;\n g.append('line')\n .attr('id', 'task' + taskCount)\n .attr('x1', center)\n .attr('y1', task.y)\n .attr('x2', center)\n .attr('y2', maxHeight)\n .attr('class', 'task-line')\n .attr('stroke-width', '1px')\n .attr('stroke-dasharray', '4 2')\n .attr('stroke', '#666');\n\n drawFace(g, {\n cx: center,\n cy: 300 + (5 - task.score) * 30,\n score: task.score\n });\n\n const rect = getNoteRect();\n rect.x = task.x;\n rect.y = task.y;\n rect.fill = task.fill;\n rect.width = conf.width;\n rect.height = conf.height;\n rect.class = 'task task-type-' + task.num;\n rect.rx = 3;\n rect.ry = 3;\n drawRect(g, rect);\n\n let xPos = task.x + 14;\n task.people.forEach(person => {\n const colour = task.actors[person];\n\n const circle = {\n cx: xPos,\n cy: task.y,\n r: 7,\n fill: colour,\n stroke: '#000',\n title: person\n };\n\n drawCircle(g, circle);\n xPos += 10;\n });\n\n _drawTextCandidateFunc(conf)(\n task.task,\n g,\n rect.x,\n rect.y,\n rect.width,\n rect.height,\n { class: 'task' },\n conf,\n task.colour\n );\n};\n\n/**\n * Draws a background rectangle\n * @param elem The html element\n * @param bounds The bounds of the drawing\n */\nexport const drawBackgroundRect = function(elem, bounds) {\n const rectElem = drawRect(elem, {\n x: bounds.startx,\n y: bounds.starty,\n width: bounds.stopx - bounds.startx,\n height: bounds.stopy - bounds.starty,\n fill: bounds.fill,\n class: 'rect'\n });\n rectElem.lower();\n};\n\nexport const getTextObj = function() {\n return {\n x: 0,\n y: 0,\n fill: undefined,\n 'text-anchor': 'start',\n width: 100,\n height: 100,\n textMargin: 0,\n rx: 0,\n ry: 0\n };\n};\n\nexport const getNoteRect = function() {\n return {\n x: 0,\n y: 0,\n width: 100,\n anchor: 'start',\n height: 100,\n rx: 0,\n ry: 0\n };\n};\n\nconst _drawTextCandidateFunc = (function() {\n function byText(content, g, x, y, width, height, textAttrs, colour) {\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y + height / 2 + 5)\n .style('font-color', colour)\n .style('text-anchor', 'middle')\n .text(content);\n _setTextAttrs(text, textAttrs);\n }\n\n function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) {\n const { taskFontSize, taskFontFamily } = conf;\n\n const lines = content.split(//gi);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * taskFontSize - (taskFontSize * (lines.length - 1)) / 2;\n const text = g\n .append('text')\n .attr('x', x + width / 2)\n .attr('y', y)\n .attr('fill', colour)\n .style('text-anchor', 'middle')\n .style('font-size', taskFontSize)\n .style('font-family', taskFontFamily);\n text\n .append('tspan')\n .attr('x', x + width / 2)\n .attr('dy', dy)\n .text(lines[i]);\n\n text\n .attr('y', y + height / 2.0)\n .attr('dominant-baseline', 'central')\n .attr('alignment-baseline', 'central');\n\n _setTextAttrs(text, textAttrs);\n }\n }\n\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const body = g.append('switch');\n const f = body\n .append('foreignObject')\n .attr('x', x)\n .attr('y', y)\n .attr('width', width)\n .attr('height', height)\n .attr('position', 'fixed');\n\n const text = f\n .append('div')\n .style('display', 'table')\n .style('height', '100%')\n .style('width', '100%');\n\n text\n .append('div')\n .attr('class', 'label')\n .style('display', 'table-cell')\n .style('text-align', 'center')\n .style('vertical-align', 'middle')\n // .style('color', colour)\n .text(content);\n\n byTspan(content, body, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (key in fromTextAttrsDict) {\n // eslint-disable-line\n // noinspection JSUnfilteredForInLoop\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n\n return function(conf) {\n return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;\n };\n})();\n\nconst initGraphics = function(graphics) {\n graphics\n .append('defs')\n .append('marker')\n .attr('id', 'arrowhead')\n .attr('refX', 5)\n .attr('refY', 2)\n .attr('markerWidth', 6)\n .attr('markerHeight', 4)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead\n};\n\nexport default {\n drawRect,\n drawCircle,\n drawSection,\n drawText,\n drawLabel,\n drawTask,\n drawBackgroundRect,\n getTextObj,\n getNoteRect,\n initGraphics\n};\n","import { select } from 'd3';\nimport { parser } from './parser/journey';\nimport journeyDb from './journeyDb';\nimport svgDraw from './svgDraw';\nimport { configureSvgSize } from '../../utils';\n\nparser.yy = journeyDb;\n\nconst conf = {\n leftMargin: 150,\n diagramMarginX: 50,\n diagramMarginY: 20,\n // Margin between tasks\n taskMargin: 50,\n // Width of task boxes\n width: 150,\n // Height of task boxes\n height: 50,\n taskFontSize: 14,\n taskFontFamily: '\"Open-Sans\", \"sans-serif\"',\n // Margin around loop boxes\n boxMargin: 10,\n boxTextMargin: 5,\n noteMargin: 10,\n // Space between messages\n messageMargin: 35,\n // Multiline message alignment\n messageAlign: 'center',\n // Depending on css styling this might need adjustment\n // Projects the edge of the diagram downwards\n bottomMarginAdj: 1,\n\n // width of activation box\n activationWidth: 10,\n\n // text placement as: tspan | fo | old only text as before\n textPlacement: 'fo',\n\n actorColours: ['#8FBC8F', '#7CFC00', '#00FFFF', '#20B2AA', '#B0E0E6', '#FFFFE0'],\n\n sectionFills: ['#191970', '#8B008B', '#4B0082', '#2F4F4F', '#800000', '#8B4513', '#00008B'],\n sectionColours: ['#fff']\n};\n\nexport const setConf = function(cnf) {\n const keys = Object.keys(cnf);\n\n keys.forEach(function(key) {\n conf[key] = cnf[key];\n });\n};\n\nconst actors = {};\n\nfunction drawActorLegend(diagram) {\n // Draw the actors\n let yPos = 60;\n Object.keys(actors).forEach(person => {\n const colour = actors[person];\n\n const circleData = {\n cx: 20,\n cy: yPos,\n r: 7,\n fill: colour,\n stroke: '#000'\n };\n svgDraw.drawCircle(diagram, circleData);\n\n const labelData = {\n x: 40,\n y: yPos + 7,\n fill: '#666',\n text: person,\n textMargin: conf.boxTextMargin | 5\n };\n svgDraw.drawText(diagram, labelData);\n\n yPos += 20;\n });\n}\n\nconst LEFT_MARGIN = conf.leftMargin;\nexport const draw = function(text, id) {\n parser.yy.clear();\n parser.parse(text + '\\n');\n\n bounds.init();\n const diagram = select('#' + id);\n diagram.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n svgDraw.initGraphics(diagram);\n\n const tasks = parser.yy.getTasks();\n const title = parser.yy.getTitle();\n\n const actorNames = parser.yy.getActors();\n for (let member in actors) delete actors[member];\n let actorPos = 0;\n actorNames.forEach(actorName => {\n actors[actorName] = conf.actorColours[actorPos % conf.actorColours.length];\n actorPos++;\n });\n\n drawActorLegend(diagram);\n bounds.insert(0, 0, LEFT_MARGIN, Object.keys(actors).length * 50);\n\n drawTasks(diagram, tasks, 0);\n\n const box = bounds.getBounds();\n if (title) {\n diagram\n .append('text')\n .text(title)\n .attr('x', LEFT_MARGIN)\n .attr('font-size', '4ex')\n .attr('font-weight', 'bold')\n .attr('y', 25);\n }\n const height = box.stopy - box.starty + 2 * conf.diagramMarginY;\n const width = LEFT_MARGIN + box.stopx + 2 * conf.diagramMarginX;\n\n configureSvgSize(diagram, height, width, conf.useMaxWidth);\n\n // Draw activity line\n diagram\n .append('line')\n .attr('x1', LEFT_MARGIN)\n .attr('y1', conf.height * 4) // One section head + one task + margins\n .attr('x2', width - LEFT_MARGIN - 4) // Subtract stroke width so arrow point is retained\n .attr('y2', conf.height * 4)\n .attr('stroke-width', 4)\n .attr('stroke', 'black')\n .attr('marker-end', 'url(#arrowhead)');\n\n const extraVertForTitle = title ? 70 : 0;\n diagram.attr('viewBox', `${box.startx} -25 ${width} ${height + extraVertForTitle}`);\n diagram.attr('preserveAspectRatio', 'xMinYMin meet');\n};\n\nexport const bounds = {\n data: {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined\n },\n verticalPos: 0,\n\n sequenceItems: [],\n init: function() {\n this.sequenceItems = [];\n this.data = {\n startx: undefined,\n stopx: undefined,\n starty: undefined,\n stopy: undefined\n };\n this.verticalPos = 0;\n },\n updateVal: function(obj, key, val, fun) {\n if (typeof obj[key] === 'undefined') {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n },\n updateBounds: function(startx, starty, stopx, stopy) {\n const _self = this;\n let cnt = 0;\n function updateFn(type) {\n return function updateItemBounds(item) {\n cnt++;\n // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems\n const n = _self.sequenceItems.length - cnt + 1;\n\n _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n if (!(type === 'activation')) {\n _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);\n _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);\n\n _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);\n }\n };\n }\n\n this.sequenceItems.forEach(updateFn());\n },\n insert: function(startx, starty, stopx, stopy) {\n const _startx = Math.min(startx, stopx);\n const _stopx = Math.max(startx, stopx);\n const _starty = Math.min(starty, stopy);\n const _stopy = Math.max(starty, stopy);\n\n this.updateVal(bounds.data, 'startx', _startx, Math.min);\n this.updateVal(bounds.data, 'starty', _starty, Math.min);\n this.updateVal(bounds.data, 'stopx', _stopx, Math.max);\n this.updateVal(bounds.data, 'stopy', _stopy, Math.max);\n\n this.updateBounds(_startx, _starty, _stopx, _stopy);\n },\n bumpVerticalPos: function(bump) {\n this.verticalPos = this.verticalPos + bump;\n this.data.stopy = this.verticalPos;\n },\n getVerticalPos: function() {\n return this.verticalPos;\n },\n getBounds: function() {\n return this.data;\n }\n};\n\nconst fills = conf.sectionFills;\nconst textColours = conf.sectionColours;\n\nexport const drawTasks = function(diagram, tasks, verticalPos) {\n let lastSection = '';\n const sectionVHeight = conf.height * 2 + conf.diagramMarginY;\n const taskPos = verticalPos + sectionVHeight;\n\n let sectionNumber = 0;\n let fill = '#CCC';\n let colour = 'black';\n let num = 0;\n\n // Draw the tasks\n for (let i = 0; i < tasks.length; i++) {\n let task = tasks[i];\n if (lastSection !== task.section) {\n fill = fills[sectionNumber % fills.length];\n num = sectionNumber % fills.length;\n colour = textColours[sectionNumber % textColours.length];\n\n const section = {\n x: i * conf.taskMargin + i * conf.width + LEFT_MARGIN,\n y: 50,\n text: task.section,\n fill,\n num,\n colour\n };\n\n svgDraw.drawSection(diagram, section, conf);\n lastSection = task.section;\n sectionNumber++;\n }\n\n // Collect the actors involved in the task\n const taskActors = task.people.reduce((acc, actorName) => {\n if (actors[actorName]) {\n acc[actorName] = actors[actorName];\n }\n\n return acc;\n }, {});\n\n // Add some rendering data to the object\n task.x = i * conf.taskMargin + i * conf.width + LEFT_MARGIN;\n task.y = taskPos;\n task.width = conf.diagramMarginX;\n task.height = conf.diagramMarginY;\n task.colour = colour;\n task.fill = fill;\n task.num = num;\n task.actors = taskActors;\n\n // Draw the box with the attached line\n svgDraw.drawTask(diagram, task, conf);\n bounds.insert(task.x, task.y, task.x + task.width + conf.taskMargin, 300 + 5 * 30); // stopy is the length of the descenders.\n }\n};\n\nexport default {\n setConf,\n draw\n};\n","const getStyles = options =>\n `g.classGroup text {\n fill: ${options.nodeBorder};\n fill: ${options.classText};\n stroke: none;\n font-family: ${options.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${options.nodeBorder};\n stroke: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${options.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${options.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${options.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${options.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n#compositionStart, .composition {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: ${options.lineColor} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: ${options.mainBkg} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: ${options.mainBkg} !important;\n stroke: ${options.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n}\n\n`;\n\nexport default getStyles;\n","const getStyles = options =>\n `.label {\n font-family: ${options.fontFamily};\n color: ${options.nodeTextColor || options.textColor};\n }\n .cluster-label text {\n fill: ${options.titleColor};\n }\n .cluster-label span {\n color: ${options.titleColor};\n }\n\n .label text,span {\n fill: ${options.nodeTextColor || options.textColor};\n color: ${options.nodeTextColor || options.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${options.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${options.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${options.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${options.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${options.edgeLabelBackground};\n fill: ${options.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${options.clusterBkg};\n stroke: ${options.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${options.titleColor};\n }\n\n .cluster span {\n color: ${options.titleColor};\n }\n // .cluster div {\n // color: ${options.titleColor};\n // }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${options.fontFamily};\n font-size: 12px;\n background: ${options.tertiaryColor};\n border: 1px solid ${options.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n`;\n\nexport default getStyles;\n","const getStyles = options =>\n `g.stateGroup text {\n fill: ${options.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${options.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${options.labelColor};\n}\n\ng.stateGroup rect {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${options.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${options.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${options.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${options.noteBorderColor};\n fill: ${options.noteBkgColor};\n\n text {\n fill: black;\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${options.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${options.tertiaryColor};\n opacity: 0.5;\n}\n.edgeLabel .label text {\n fill: ${options.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${options.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${options.labelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${options.lineColor};\n stroke: black;\n}\n.node circle.state-end {\n fill: ${options.primaryBorderColor};\n stroke: ${options.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${options.background};\n // stroke: ${options.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${options.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${options.textColor};\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${options.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${options.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: #e0e0e0;\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${options.altBackground ? options.altBackground : '#efefef'};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${options.noteBkgColor};\n stroke: ${options.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${options.noteBkgColor};\n stroke: ${options.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${options.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${options.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${options.lineColor};\n stroke: ${options.lineColor};\n stroke-width: 1;\n}\n`;\n\nexport default getStyles;\n","import classDiagram from './diagrams/class/styles';\nimport er from './diagrams/er/styles';\nimport flowchart from './diagrams/flowchart/styles';\nimport gantt from './diagrams/gantt/styles';\nimport git from './diagrams/git/styles';\nimport info from './diagrams/info/styles';\nimport pie from './diagrams/pie/styles';\nimport sequence from './diagrams/sequence/styles';\nimport stateDiagram from './diagrams/state/styles';\nimport journey from './diagrams/user-journey/styles';\n\nconst themes = {\n flowchart,\n 'flowchart-v2': flowchart,\n sequence,\n gantt,\n classDiagram,\n 'classDiagram-v2': classDiagram,\n class: classDiagram,\n stateDiagram,\n state: stateDiagram,\n git,\n info,\n pie,\n er,\n journey\n};\n\nexport const calcThemeVariables = (theme, userOverRides) => theme.calcColors(userOverRides);\n\nconst getStyles = (type, userStyles, options) => {\n //console.warn('options in styles: ', options);\n return ` {\n font-family: ${options.fontFamily};\n font-size: ${options.fontSize};\n fill: ${options.textColor}\n }\n\n /* Classes common for multiple diagrams */\n\n .error-icon {\n fill: ${options.errorBkgColor};\n }\n .error-text {\n fill: ${options.errorTextColor};\n stroke: ${options.errorTextColor};\n }\n\n .edge-thickness-normal {\n stroke-width: 2px;\n }\n .edge-thickness-thick {\n stroke-width: 3.5px\n }\n .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n\n .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n .marker {\n fill: ${options.lineColor};\n stroke: ${options.lineColor};\n }\n .marker.cross {\n stroke: ${options.lineColor};\n }\n\n svg {\n font-family: ${options.fontFamily};\n font-size: ${options.fontSize};\n }\n\n ${themes[type](options)}\n\n ${userStyles}\n\n ${type} { fill: apa;}\n`;\n};\n\nexport default getStyles;\n","const getStyles = options =>\n `.actor {\n stroke: ${options.actorBorder};\n fill: ${options.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${options.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${options.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${options.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${options.signalColor};\n }\n\n #arrowhead path {\n fill: ${options.signalColor};\n stroke: ${options.signalColor};\n }\n\n .sequenceNumber {\n fill: ${options.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${options.signalColor};\n }\n\n #crosshead path {\n fill: ${options.signalColor};\n stroke: ${options.signalColor};\n }\n\n .messageText {\n fill: ${options.signalTextColor};\n stroke: ${options.signalTextColor};\n }\n\n .labelBox {\n stroke: ${options.labelBoxBorderColor};\n fill: ${options.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${options.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${options.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${options.labelBoxBorderColor};\n fill: ${options.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${options.noteBorderColor};\n fill: ${options.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${options.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${options.activationBkgColor};\n stroke: ${options.activationBorderColor};\n }\n\n .activation1 {\n fill: ${options.activationBkgColor};\n stroke: ${options.activationBorderColor};\n }\n\n .activation2 {\n fill: ${options.activationBkgColor};\n stroke: ${options.activationBorderColor};\n }\n`;\n\nexport default getStyles;\n","const getStyles = options =>\n `\n .mermaid-main-font {\n font-family: \"trebuchet ms\", verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${options.sectionBkgColor};\n }\n\n .section2 {\n fill: ${options.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${options.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${options.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n font-size: 11px;\n text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${options.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n text {\n font-family: ${options.fontFamily};\n fill: ${options.textColor};\n }\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${options.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n .taskText:not([font-size]) {\n font-size: 11px;\n }\n\n .taskTextOutsideRight {\n fill: ${options.taskTextDarkColor};\n text-anchor: start;\n font-size: 11px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n .taskTextOutsideLeft {\n fill: ${options.taskTextDarkColor};\n text-anchor: end;\n font-size: 11px;\n }\n\n /* Special case clickable */\n .task.clickable {\n cursor: pointer;\n }\n .taskText.clickable {\n cursor: pointer;\n fill: ${options.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${options.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${options.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${options.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${options.taskBkgColor};\n stroke: ${options.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${options.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${options.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${options.activeTaskBkgColor};\n stroke: ${options.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${options.doneTaskBorderColor};\n fill: ${options.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${options.critBorderColor};\n fill: ${options.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${options.critBorderColor};\n fill: ${options.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${options.critBorderColor};\n fill: ${options.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${options.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${options.textColor} ;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n`;\n\nexport default getStyles;\n","const getStyles = () =>\n `\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n`;\n\nexport default getStyles;\n","const getStyles = () => ``;\n\nexport default getStyles;\n","const getStyles = options =>\n `.pieTitleText {\n text-anchor: middle;\n font-size: 25px;\n fill: ${options.taskTextDarkColor};\n font-family: ${options.fontFamily};\n }\n .slice {\n font-family: ${options.fontFamily};\n fill: ${options.textColor};\n // fill: white;\n }\n .legend text {\n fill: ${options.taskTextDarkColor};\n font-family: ${options.fontFamily};\n font-size: 17px;\n }\n`;\n\nexport default getStyles;\n","const getStyles = options =>\n `\n .entityBox {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n }\n\n .attributeBoxOdd {\n fill: #ffffff;\n stroke: ${options.nodeBorder};\n }\n\n .attributeBoxEven {\n fill: #f2f2f2;\n stroke: ${options.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${options.tertiaryColor};\n opacity: 0.7;\n background-color: ${options.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .relationshipLine {\n stroke: ${options.lineColor};\n }\n`;\n\nexport default getStyles;\n","const getStyles = options =>\n `.label {\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n color: ${options.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${options.textColor}\n }\n\n .legend {\n fill: ${options.textColor};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${options.textColor}\n }\n\n .face {\n fill: #FFF8DC;\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${options.mainBkg};\n stroke: ${options.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${options.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${options.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${options.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${options.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${options.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: ${options.tertiaryColor};\n border: 1px solid ${options.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${options.fillType0 ? `fill: ${options.fillType0}` : ''};\n }\n .task-type-1, .section-type-1 {\n ${options.fillType0 ? `fill: ${options.fillType1}` : ''};\n }\n .task-type-2, .section-type-2 {\n ${options.fillType0 ? `fill: ${options.fillType2}` : ''};\n }\n .task-type-3, .section-type-3 {\n ${options.fillType0 ? `fill: ${options.fillType3}` : ''};\n }\n .task-type-4, .section-type-4 {\n ${options.fillType0 ? `fill: ${options.fillType4}` : ''};\n }\n .task-type-5, .section-type-5 {\n ${options.fillType0 ? `fill: ${options.fillType5}` : ''};\n }\n .task-type-6, .section-type-6 {\n ${options.fillType0 ? `fill: ${options.fillType6}` : ''};\n }\n .task-type-7, .section-type-7 {\n ${options.fillType0 ? `fill: ${options.fillType7}` : ''};\n }\n`;\n\nexport default getStyles;\n","/**\n *Edit this Page[![N|Solid](img/GitHub-Mark-32px.png)](https://github.com/mermaid-js/mermaid/blob/develop/src/mermaidAPI.js)\n *\n *This is the API to be used when optionally handling the integration with the web page, instead of using the default integration provided by mermaid.js.\n *\n *\n * The core of this api is the [**render**](Setup.md?id=render) function which, given a graph\n * definition as text, renders the graph/diagram and returns an svg element for the graph.\n *\n * It is is then up to the user of the API to make use of the svg, either insert it somewhere in the page or do something completely different.\n *\n * In addition to the render function, a number of behavioral configuration options are available.\n *\n * @name mermaidAPI\n */\nimport Stylis from 'stylis';\nimport { select } from 'd3';\nimport pkg from '../package.json';\n// import * as configApi from './config';\n// // , {\n// // setConfig,\n// // configApi.getConfig,\n// // configApi.updateSiteConfig,\n// // configApi.setSiteConfig,\n// // configApi.getSiteConfig,\n// // configApi.defaultConfig\n// // }\nimport { log, setLogLevel } from './logger';\nimport utils, { assignWithDepth } from './utils';\nimport flowRenderer from './diagrams/flowchart/flowRenderer';\nimport flowRendererV2 from './diagrams/flowchart/flowRenderer-v2';\nimport flowParser from './diagrams/flowchart/parser/flow';\nimport flowDb from './diagrams/flowchart/flowDb';\nimport sequenceRenderer from './diagrams/sequence/sequenceRenderer';\nimport sequenceParser from './diagrams/sequence/parser/sequenceDiagram';\nimport sequenceDb from './diagrams/sequence/sequenceDb';\nimport ganttRenderer from './diagrams/gantt/ganttRenderer';\nimport ganttParser from './diagrams/gantt/parser/gantt';\nimport ganttDb from './diagrams/gantt/ganttDb';\nimport classRenderer from './diagrams/class/classRenderer';\nimport classRendererV2 from './diagrams/class/classRenderer-v2';\nimport classParser from './diagrams/class/parser/classDiagram';\nimport classDb from './diagrams/class/classDb';\nimport stateRenderer from './diagrams/state/stateRenderer';\nimport stateRendererV2 from './diagrams/state/stateRenderer-v2';\nimport stateParser from './diagrams/state/parser/stateDiagram';\nimport stateDb from './diagrams/state/stateDb';\nimport gitGraphRenderer from './diagrams/git/gitGraphRenderer';\nimport gitGraphParser from './diagrams/git/parser/gitGraph';\nimport gitGraphAst from './diagrams/git/gitGraphAst';\nimport infoRenderer from './diagrams/info/infoRenderer';\nimport errorRenderer from './errorRenderer';\nimport infoParser from './diagrams/info/parser/info';\nimport infoDb from './diagrams/info/infoDb';\nimport pieRenderer from './diagrams/pie/pieRenderer';\nimport pieParser from './diagrams/pie/parser/pie';\nimport pieDb from './diagrams/pie/pieDb';\nimport erDb from './diagrams/er/erDb';\nimport erParser from './diagrams/er/parser/erDiagram';\nimport erRenderer from './diagrams/er/erRenderer';\nimport journeyParser from './diagrams/user-journey/parser/journey';\nimport journeyDb from './diagrams/user-journey/journeyDb';\nimport journeyRenderer from './diagrams/user-journey/journeyRenderer';\nimport * as configApi from './config';\nimport getStyles from './styles';\nimport theme from './themes';\n\nfunction parse(text) {\n const graphInit = utils.detectInit(text);\n if (graphInit) {\n reinitialize(graphInit);\n log.debug('reinit ', graphInit);\n }\n const graphType = utils.detectType(text);\n let parser;\n\n log.debug('Type ' + graphType);\n switch (graphType) {\n case 'git':\n parser = gitGraphParser;\n parser.parser.yy = gitGraphAst;\n break;\n case 'flowchart':\n flowDb.clear();\n parser = flowParser;\n parser.parser.yy = flowDb;\n break;\n case 'flowchart-v2':\n flowDb.clear();\n parser = flowParser;\n parser.parser.yy = flowDb;\n break;\n case 'sequence':\n parser = sequenceParser;\n parser.parser.yy = sequenceDb;\n break;\n case 'gantt':\n parser = ganttParser;\n parser.parser.yy = ganttDb;\n break;\n case 'class':\n parser = classParser;\n parser.parser.yy = classDb;\n break;\n case 'classDiagram':\n parser = classParser;\n parser.parser.yy = classDb;\n break;\n case 'state':\n parser = stateParser;\n parser.parser.yy = stateDb;\n break;\n case 'stateDiagram':\n parser = stateParser;\n parser.parser.yy = stateDb;\n break;\n case 'info':\n log.debug('info info info');\n parser = infoParser;\n parser.parser.yy = infoDb;\n break;\n case 'pie':\n log.debug('pie');\n parser = pieParser;\n parser.parser.yy = pieDb;\n break;\n case 'er':\n log.debug('er');\n parser = erParser;\n parser.parser.yy = erDb;\n break;\n case 'journey':\n log.debug('Journey');\n parser = journeyParser;\n parser.parser.yy = journeyDb;\n break;\n }\n parser.parser.yy.graphType = graphType;\n parser.parser.yy.parseError = (str, hash) => {\n const error = { str, hash };\n throw error;\n };\n\n parser.parse(text);\n return parser;\n}\n\nexport const encodeEntities = function(text) {\n let txt = text;\n\n txt = txt.replace(/style.*:\\S*#.*;/g, function(s) {\n const innerTxt = s.substring(0, s.length - 1);\n return innerTxt;\n });\n txt = txt.replace(/classDef.*:\\S*#.*;/g, function(s) {\n const innerTxt = s.substring(0, s.length - 1);\n return innerTxt;\n });\n\n txt = txt.replace(/#\\w+;/g, function(s) {\n const innerTxt = s.substring(1, s.length - 1);\n\n const isInt = /^\\+?\\d+$/.test(innerTxt);\n if (isInt) {\n return 'fl°°' + innerTxt + '¶ß';\n } else {\n return 'fl°' + innerTxt + '¶ß';\n }\n });\n\n return txt;\n};\n\nexport const decodeEntities = function(text) {\n let txt = text;\n\n txt = txt.replace(/fl°°/g, function() {\n return '&#';\n });\n txt = txt.replace(/fl°/g, function() {\n return '&';\n });\n txt = txt.replace(/¶ß/g, function() {\n return ';';\n });\n\n return txt;\n};\n/**\n * Function that renders an svg with a graph from a chart definition. Usage example below.\n *\n * ```js\n * mermaidAPI.initialize({\n * startOnLoad:true\n * });\n * $(function(){\n * const graphDefinition = 'graph TB\\na-->b';\n * const cb = function(svgGraph){\n * console.log(svgGraph);\n * };\n * mermaidAPI.render('id1',graphDefinition,cb);\n * });\n *```\n * @param id the id of the element to be rendered\n * @param _txt the graph definition\n * @param cb callback which is called after rendering is finished with the svg code as inparam.\n * @param container selector to element in which a div with the graph temporarily will be inserted. In one is\n * provided a hidden div will be inserted in the body of the page instead. The element will be removed when rendering is\n * completed.\n */\nconst render = function(id, _txt, cb, container) {\n configApi.reset();\n let txt = _txt;\n const graphInit = utils.detectInit(txt);\n if (graphInit) {\n configApi.addDirective(graphInit);\n }\n // else {\n // configApi.reset();\n // const siteConfig = configApi.getSiteConfig();\n // configApi.addDirective(siteConfig);\n // }\n // console.warn('Render fetching config');\n\n const cnf = configApi.getConfig();\n // Check the maximum allowed text size\n if (_txt.length > cnf.maxTextSize) {\n txt = 'graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa';\n }\n\n if (typeof container !== 'undefined') {\n container.innerHTML = '';\n\n select(container)\n .append('div')\n .attr('id', 'd' + id)\n .attr('style', 'font-family: ' + cnf.fontFamily)\n .append('svg')\n .attr('id', id)\n .attr('width', '100%')\n .attr('xmlns', 'http://www.w3.org/2000/svg')\n .append('g');\n } else {\n const existingSvg = document.getElementById(id);\n if (existingSvg) {\n existingSvg.remove();\n }\n const element = document.querySelector('#' + 'd' + id);\n if (element) {\n element.remove();\n }\n\n select('body')\n .append('div')\n .attr('id', 'd' + id)\n .append('svg')\n .attr('id', id)\n .attr('width', '100%')\n .attr('xmlns', 'http://www.w3.org/2000/svg')\n .append('g');\n }\n\n window.txt = txt;\n txt = encodeEntities(txt);\n\n const element = select('#d' + id).node();\n const graphType = utils.detectType(txt);\n\n // insert inline style into svg\n const svg = element.firstChild;\n const firstChild = svg.firstChild;\n\n let userStyles = '';\n // user provided theme CSS\n if (cnf.themeCSS !== undefined) {\n userStyles += `\\n${cnf.themeCSS}`;\n }\n // user provided theme CSS\n if (cnf.fontFamily !== undefined) {\n userStyles += `\\n:root { --mermaid-font-family: ${cnf.fontFamily}}`;\n }\n // user provided theme CSS\n if (cnf.altFontFamily !== undefined) {\n userStyles += `\\n:root { --mermaid-alt-font-family: ${cnf.altFontFamily}}`;\n }\n\n // classDef\n if (graphType === 'flowchart' || graphType === 'flowchart-v2' || graphType === 'graph') {\n const classes = flowRenderer.getClasses(txt);\n for (const className in classes) {\n userStyles += `\\n.${className} > * { ${classes[className].styles.join(\n ' !important; '\n )} !important; }`;\n if (classes[className].textStyles) {\n userStyles += `\\n.${className} tspan { ${classes[className].textStyles.join(\n ' !important; '\n )} !important; }`;\n }\n }\n }\n\n // log.warn(cnf.themeVariables);\n\n const stylis = new Stylis();\n const rules = stylis(`#${id}`, getStyles(graphType, userStyles, cnf.themeVariables));\n\n const style1 = document.createElement('style');\n style1.innerHTML = rules;\n svg.insertBefore(style1, firstChild);\n\n // Verify that the generated svgs are ok before removing this\n\n // const style2 = document.createElement('style');\n // const cs = window.getComputedStyle(svg);\n // style2.innerHTML = `#d${id} * {\n // color: ${cs.color};\n // // font: ${cs.font};\n // // font-family: Arial;\n // // font-size: 24px;\n // }`;\n // svg.insertBefore(style2, firstChild);\n\n try {\n switch (graphType) {\n case 'git':\n cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n gitGraphRenderer.setConf(cnf.git);\n gitGraphRenderer.draw(txt, id, false);\n break;\n case 'flowchart':\n cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n flowRenderer.setConf(cnf.flowchart);\n flowRenderer.draw(txt, id, false);\n break;\n case 'flowchart-v2':\n cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n flowRendererV2.setConf(cnf.flowchart);\n flowRendererV2.draw(txt, id, false);\n break;\n case 'sequence':\n cnf.sequence.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n if (cnf.sequenceDiagram) {\n // backwards compatibility\n sequenceRenderer.setConf(Object.assign(cnf.sequence, cnf.sequenceDiagram));\n console.error(\n '`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.'\n );\n } else {\n sequenceRenderer.setConf(cnf.sequence);\n }\n sequenceRenderer.draw(txt, id);\n break;\n case 'gantt':\n cnf.gantt.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n ganttRenderer.setConf(cnf.gantt);\n ganttRenderer.draw(txt, id);\n break;\n case 'class':\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n classRenderer.setConf(cnf.class);\n classRenderer.draw(txt, id);\n break;\n case 'classDiagram':\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n classRendererV2.setConf(cnf.class);\n classRendererV2.draw(txt, id);\n break;\n case 'state':\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n stateRenderer.setConf(cnf.state);\n stateRenderer.draw(txt, id);\n break;\n case 'stateDiagram':\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n stateRendererV2.setConf(cnf.state);\n stateRendererV2.draw(txt, id);\n break;\n case 'info':\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n infoRenderer.setConf(cnf.class);\n infoRenderer.draw(txt, id, pkg.version);\n break;\n case 'pie':\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n pieRenderer.setConf(cnf.pie);\n pieRenderer.draw(txt, id, pkg.version);\n break;\n case 'er':\n erRenderer.setConf(cnf.er);\n erRenderer.draw(txt, id, pkg.version);\n break;\n case 'journey':\n journeyRenderer.setConf(cnf.journey);\n journeyRenderer.draw(txt, id, pkg.version);\n break;\n }\n } catch (e) {\n // errorRenderer.setConf(cnf.class);\n errorRenderer.draw(id, pkg.version);\n throw e;\n }\n\n select(`[id=\"${id}\"]`)\n .selectAll('foreignobject > *')\n .attr('xmlns', 'http://www.w3.org/1999/xhtml');\n\n // if (cnf.arrowMarkerAbsolute) {\n // url =\n // window.location.protocol +\n // '//' +\n // window.location.host +\n // window.location.pathname +\n // window.location.search;\n // url = url.replace(/\\(/g, '\\\\(');\n // url = url.replace(/\\)/g, '\\\\)');\n // }\n\n // Fix for when the base tag is used\n let svgCode = select('#d' + id).node().innerHTML;\n log.debug('cnf.arrowMarkerAbsolute', cnf.arrowMarkerAbsolute);\n if (!cnf.arrowMarkerAbsolute || cnf.arrowMarkerAbsolute === 'false') {\n svgCode = svgCode.replace(/marker-end=\"url\\(.*?#/g, 'marker-end=\"url(#', 'g');\n }\n\n svgCode = decodeEntities(svgCode);\n\n // Fix for when the br tag is used\n svgCode = svgCode.replace(/
        /g, '
        ');\n\n if (typeof cb !== 'undefined') {\n switch (graphType) {\n case 'flowchart':\n case 'flowchart-v2':\n cb(svgCode, flowDb.bindFunctions);\n break;\n case 'gantt':\n cb(svgCode, ganttDb.bindFunctions);\n break;\n case 'class':\n case 'classDiagram':\n cb(svgCode, classDb.bindFunctions);\n break;\n default:\n cb(svgCode);\n }\n } else {\n log.debug('CB = undefined!');\n }\n\n const node = select('#d' + id).node();\n if (node !== null && typeof node.remove === 'function') {\n select('#d' + id)\n .node()\n .remove();\n }\n\n return svgCode;\n};\n\nlet currentDirective = {};\n\nconst parseDirective = function(p, statement, context, type) {\n try {\n if (statement !== undefined) {\n statement = statement.trim();\n switch (context) {\n case 'open_directive':\n currentDirective = {};\n break;\n case 'type_directive':\n currentDirective.type = statement.toLowerCase();\n break;\n case 'arg_directive':\n currentDirective.args = JSON.parse(statement);\n break;\n case 'close_directive':\n handleDirective(p, currentDirective, type);\n currentDirective = null;\n break;\n }\n }\n } catch (error) {\n log.error(\n `Error while rendering sequenceDiagram directive: ${statement} jison context: ${context}`\n );\n log.error(error.message);\n }\n};\n\nconst handleDirective = function(p, directive, type) {\n log.debug(`Directive type=${directive.type} with args:`, directive.args);\n switch (directive.type) {\n case 'init':\n case 'initialize': {\n ['config'].forEach(prop => {\n if (typeof directive.args[prop] !== 'undefined') {\n if (type === 'flowchart-v2') {\n type = 'flowchart';\n }\n directive.args[type] = directive.args[prop];\n delete directive.args[prop];\n }\n });\n\n reinitialize(directive.args);\n configApi.addDirective(directive.args);\n break;\n }\n case 'wrap':\n case 'nowrap':\n if (p && p['setWrap']) {\n p.setWrap(directive.type === 'wrap');\n }\n break;\n default:\n log.warn(\n `Unhandled directive: source: '%%{${directive.type}: ${JSON.stringify(\n directive.args ? directive.args : {}\n )}}%%`,\n directive\n );\n break;\n }\n};\n\nfunction updateRendererConfigs(conf) {\n gitGraphRenderer.setConf(conf.git);\n flowRenderer.setConf(conf.flowchart);\n flowRendererV2.setConf(conf.flowchart);\n if (typeof conf['sequenceDiagram'] !== 'undefined') {\n sequenceRenderer.setConf(assignWithDepth(conf.sequence, conf['sequenceDiagram']));\n }\n sequenceRenderer.setConf(conf.sequence);\n ganttRenderer.setConf(conf.gantt);\n classRenderer.setConf(conf.class);\n stateRenderer.setConf(conf.state);\n stateRendererV2.setConf(conf.state);\n infoRenderer.setConf(conf.class);\n pieRenderer.setConf(conf.class);\n erRenderer.setConf(conf.er);\n journeyRenderer.setConf(conf.journey);\n errorRenderer.setConf(conf.class);\n}\n\nfunction reinitialize() {\n // `mermaidAPI.reinitialize: v${pkg.version}`,\n // JSON.stringify(options),\n // options.themeVariables.primaryColor;\n // // if (options.theme && theme[options.theme]) {\n // // options.themeVariables = theme[options.theme].getThemeVariables(options.themeVariables);\n // // }\n // // Set default options\n // const config =\n // typeof options === 'object' ? configApi.setConfig(options) : configApi.getSiteConfig();\n // updateRendererConfigs(config);\n // setLogLevel(config.logLevel);\n // log.debug('mermaidAPI.reinitialize: ', config);\n}\n\nfunction initialize(options) {\n // console.warn(`mermaidAPI.initialize: v${pkg.version} `, options);\n\n // Handle legacy location of font-family configuration\n if (options && options.fontFamily) {\n if (!options.themeVariables) {\n options.themeVariables = { fontFamily: options.fontFamily };\n } else {\n if (!options.themeVariables.fontFamily) {\n options.themeVariables = { fontFamily: options.fontFamily };\n }\n }\n }\n // Set default options\n configApi.saveConfigFromInitilize(options);\n\n if (options && options.theme && theme[options.theme]) {\n // Todo merge with user options\n options.themeVariables = theme[options.theme].getThemeVariables(options.themeVariables);\n } else {\n if (options) options.themeVariables = theme.default.getThemeVariables(options.themeVariables);\n }\n\n const config =\n typeof options === 'object' ? configApi.setSiteConfig(options) : configApi.getSiteConfig();\n\n updateRendererConfigs(config);\n setLogLevel(config.logLevel);\n // log.debug('mermaidAPI.initialize: ', config);\n}\n\nconst mermaidAPI = Object.freeze({\n render,\n parse,\n parseDirective,\n initialize,\n reinitialize,\n getConfig: configApi.getConfig,\n setConfig: configApi.setConfig,\n getSiteConfig: configApi.getSiteConfig,\n updateSiteConfig: configApi.updateSiteConfig,\n reset: () => {\n // console.warn('reset');\n configApi.reset();\n // const siteConfig = configApi.getSiteConfig();\n // updateRendererConfigs(siteConfig);\n },\n globalReset: () => {\n configApi.reset(configApi.defaultConfig);\n updateRendererConfigs(configApi.getConfig());\n },\n defaultConfig: configApi.defaultConfig\n});\n\nsetLogLevel(configApi.getConfig().logLevel);\nconfigApi.reset(configApi.getConfig());\n\nexport default mermaidAPI;\n/**\n * ## mermaidAPI configuration defaults\n *\n * ```html\n * \n * ```\n */\n","/**\n * Web page integration module for the mermaid framework. It uses the mermaidAPI for mermaid functionality and to render\n * the diagrams to svg code.\n */\n// import { decode } from 'he';\nimport decode from 'entity-decode/browser';\nimport { log } from './logger';\nimport mermaidAPI from './mermaidAPI';\nimport utils from './utils';\n\n/**\n * ## init\n * Function that goes through the document to find the chart definitions in there and render them.\n *\n * The function tags the processed attributes with the attribute data-processed and ignores found elements with the\n * attribute already set. This way the init function can be triggered several times.\n *\n * Optionally, `init` can accept in the second argument one of the following:\n * - a DOM Node\n * - an array of DOM nodes (as would come from a jQuery selector)\n * - a W3C selector, a la `.mermaid`\n *\n * ```mermaid\n * graph LR;\n * a(Find elements)-->b{Processed}\n * b-->|Yes|c(Leave element)\n * b-->|No |d(Transform)\n * ```\n * Renders the mermaid diagrams\n * @param nodes a css selector or an array of nodes\n */\nconst init = function() {\n const conf = mermaidAPI.getConfig();\n // console.log('Starting rendering diagrams (init) - mermaid.init', conf);\n let nodes;\n if (arguments.length >= 2) {\n /*! sequence config was passed as #1 */\n if (typeof arguments[0] !== 'undefined') {\n mermaid.sequenceConfig = arguments[0];\n }\n\n nodes = arguments[1];\n } else {\n nodes = arguments[0];\n }\n\n // if last argument is a function this is the callback function\n let callback;\n if (typeof arguments[arguments.length - 1] === 'function') {\n callback = arguments[arguments.length - 1];\n log.debug('Callback function found');\n } else {\n if (typeof conf.mermaid !== 'undefined') {\n if (typeof conf.mermaid.callback === 'function') {\n callback = conf.mermaid.callback;\n log.debug('Callback function found');\n } else {\n log.debug('No Callback function found');\n }\n }\n }\n nodes =\n nodes === undefined\n ? document.querySelectorAll('.mermaid')\n : typeof nodes === 'string'\n ? document.querySelectorAll(nodes)\n : nodes instanceof window.Node\n ? [nodes]\n : nodes; // Last case - sequence config was passed pick next\n\n log.debug('Start On Load before: ' + mermaid.startOnLoad);\n if (typeof mermaid.startOnLoad !== 'undefined') {\n log.debug('Start On Load inner: ' + mermaid.startOnLoad);\n mermaidAPI.updateSiteConfig({ startOnLoad: mermaid.startOnLoad });\n }\n\n if (typeof mermaid.ganttConfig !== 'undefined') {\n mermaidAPI.updateSiteConfig({ gantt: mermaid.ganttConfig });\n }\n\n const nextId = utils.initIdGeneratior(conf.deterministicIds, conf.deterministicIDSeed).next;\n\n let txt;\n\n for (let i = 0; i < nodes.length; i++) {\n const element = nodes[i];\n\n /*! Check if previously processed */\n if (!element.getAttribute('data-processed')) {\n element.setAttribute('data-processed', true);\n } else {\n continue;\n }\n\n const id = `mermaid-${nextId()}`;\n\n // Fetch the graph definition including tags\n txt = element.innerHTML;\n\n // transforms the html to pure text\n txt = decode(txt)\n .trim()\n .replace(//gi, '
        ');\n\n const init = utils.detectInit(txt);\n if (init) {\n log.debug('Detected early reinit: ', init);\n }\n\n try {\n mermaidAPI.render(\n id,\n txt,\n (svgCode, bindFunctions) => {\n element.innerHTML = svgCode;\n if (typeof callback !== 'undefined') {\n callback(id);\n }\n if (bindFunctions) bindFunctions(element);\n },\n element\n );\n } catch (e) {\n log.warn('Syntax Error rendering');\n log.warn(e);\n if (this.parseError) {\n this.parseError(e);\n }\n }\n }\n};\n\nconst initialize = function(config) {\n // mermaidAPI.reset();\n if (typeof config.mermaid !== 'undefined') {\n if (typeof config.mermaid.startOnLoad !== 'undefined') {\n mermaid.startOnLoad = config.mermaid.startOnLoad;\n }\n if (typeof config.mermaid.htmlLabels !== 'undefined') {\n mermaid.htmlLabels = config.mermaid.htmlLabels;\n }\n }\n mermaidAPI.initialize(config);\n // mermaidAPI.reset();\n};\n\n/**\n * ##contentLoaded\n * Callback function that is called when page is loaded. This functions fetches configuration for mermaid rendering and\n * calls init for rendering the mermaid diagrams on the page.\n */\nconst contentLoaded = function() {\n let config;\n\n if (mermaid.startOnLoad) {\n // No config found, do check API config\n config = mermaidAPI.getConfig();\n if (config.startOnLoad) {\n mermaid.init();\n }\n } else {\n if (typeof mermaid.startOnLoad === 'undefined') {\n log.debug('In start, no config');\n config = mermaidAPI.getConfig();\n if (config.startOnLoad) {\n mermaid.init();\n }\n }\n }\n};\n\nif (typeof document !== 'undefined') {\n /*!\n * Wait for document loaded before starting the execution\n */\n window.addEventListener(\n 'load',\n function() {\n contentLoaded();\n },\n false\n );\n}\n\nconst mermaid = {\n startOnLoad: true,\n htmlLabels: true,\n\n mermaidAPI,\n parse: mermaidAPI.parse,\n render: mermaidAPI.render,\n\n init,\n initialize,\n\n contentLoaded\n};\n\nexport default mermaid;\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://mermaid/webpack/universalModuleDefinition","webpack://mermaid/webpack/bootstrap","webpack://mermaid/./node_modules/moment/moment.js","webpack://mermaid/./node_modules/d3/dist/package.js","webpack://mermaid/./node_modules/d3-array/src/ascending.js","webpack://mermaid/./node_modules/d3-array/src/bisector.js","webpack://mermaid/./node_modules/d3-array/src/bisect.js","webpack://mermaid/./node_modules/d3-array/src/pairs.js","webpack://mermaid/./node_modules/d3-array/src/cross.js","webpack://mermaid/./node_modules/d3-array/src/descending.js","webpack://mermaid/./node_modules/d3-array/src/number.js","webpack://mermaid/./node_modules/d3-array/src/variance.js","webpack://mermaid/./node_modules/d3-array/src/deviation.js","webpack://mermaid/./node_modules/d3-array/src/extent.js","webpack://mermaid/./node_modules/d3-array/src/array.js","webpack://mermaid/./node_modules/d3-array/src/constant.js","webpack://mermaid/./node_modules/d3-array/src/identity.js","webpack://mermaid/./node_modules/d3-array/src/range.js","webpack://mermaid/./node_modules/d3-array/src/ticks.js","webpack://mermaid/./node_modules/d3-array/src/threshold/sturges.js","webpack://mermaid/./node_modules/d3-array/src/histogram.js","webpack://mermaid/./node_modules/d3-array/src/quantile.js","webpack://mermaid/./node_modules/d3-array/src/threshold/freedmanDiaconis.js","webpack://mermaid/./node_modules/d3-array/src/threshold/scott.js","webpack://mermaid/./node_modules/d3-array/src/max.js","webpack://mermaid/./node_modules/d3-array/src/mean.js","webpack://mermaid/./node_modules/d3-array/src/median.js","webpack://mermaid/./node_modules/d3-array/src/merge.js","webpack://mermaid/./node_modules/d3-array/src/min.js","webpack://mermaid/./node_modules/d3-array/src/permute.js","webpack://mermaid/./node_modules/d3-array/src/scan.js","webpack://mermaid/./node_modules/d3-array/src/shuffle.js","webpack://mermaid/./node_modules/d3-array/src/sum.js","webpack://mermaid/./node_modules/d3-array/src/transpose.js","webpack://mermaid/./node_modules/d3-array/src/zip.js","webpack://mermaid/./node_modules/d3-axis/src/array.js","webpack://mermaid/./node_modules/d3-axis/src/identity.js","webpack://mermaid/./node_modules/d3-axis/src/axis.js","webpack://mermaid/./node_modules/d3-dispatch/src/dispatch.js","webpack://mermaid/./node_modules/d3-selection/src/namespaces.js","webpack://mermaid/./node_modules/d3-selection/src/namespace.js","webpack://mermaid/./node_modules/d3-selection/src/creator.js","webpack://mermaid/./node_modules/d3-selection/src/selector.js","webpack://mermaid/./node_modules/d3-selection/src/selectorAll.js","webpack://mermaid/./node_modules/d3-selection/src/matcher.js","webpack://mermaid/./node_modules/d3-selection/src/selection/sparse.js","webpack://mermaid/./node_modules/d3-selection/src/selection/enter.js","webpack://mermaid/./node_modules/d3-selection/src/constant.js","webpack://mermaid/./node_modules/d3-selection/src/selection/data.js","webpack://mermaid/./node_modules/d3-selection/src/selection/sort.js","webpack://mermaid/./node_modules/d3-selection/src/selection/attr.js","webpack://mermaid/./node_modules/d3-selection/src/window.js","webpack://mermaid/./node_modules/d3-selection/src/selection/style.js","webpack://mermaid/./node_modules/d3-selection/src/selection/classed.js","webpack://mermaid/./node_modules/d3-selection/src/selection/text.js","webpack://mermaid/./node_modules/d3-selection/src/selection/html.js","webpack://mermaid/./node_modules/d3-selection/src/selection/raise.js","webpack://mermaid/./node_modules/d3-selection/src/selection/lower.js","webpack://mermaid/./node_modules/d3-selection/src/selection/insert.js","webpack://mermaid/./node_modules/d3-selection/src/selection/remove.js","webpack://mermaid/./node_modules/d3-selection/src/selection/clone.js","webpack://mermaid/./node_modules/d3-selection/src/selection/on.js","webpack://mermaid/./node_modules/d3-selection/src/selection/dispatch.js","webpack://mermaid/./node_modules/d3-selection/src/selection/index.js","webpack://mermaid/./node_modules/d3-selection/src/selection/select.js","webpack://mermaid/./node_modules/d3-selection/src/selection/selectAll.js","webpack://mermaid/./node_modules/d3-selection/src/selection/filter.js","webpack://mermaid/./node_modules/d3-selection/src/selection/exit.js","webpack://mermaid/./node_modules/d3-selection/src/selection/merge.js","webpack://mermaid/./node_modules/d3-selection/src/selection/order.js","webpack://mermaid/./node_modules/d3-selection/src/selection/call.js","webpack://mermaid/./node_modules/d3-selection/src/selection/nodes.js","webpack://mermaid/./node_modules/d3-selection/src/selection/node.js","webpack://mermaid/./node_modules/d3-selection/src/selection/size.js","webpack://mermaid/./node_modules/d3-selection/src/selection/empty.js","webpack://mermaid/./node_modules/d3-selection/src/selection/each.js","webpack://mermaid/./node_modules/d3-selection/src/selection/property.js","webpack://mermaid/./node_modules/d3-selection/src/selection/append.js","webpack://mermaid/./node_modules/d3-selection/src/selection/datum.js","webpack://mermaid/./node_modules/d3-selection/src/select.js","webpack://mermaid/./node_modules/d3-selection/src/create.js","webpack://mermaid/./node_modules/d3-selection/src/local.js","webpack://mermaid/./node_modules/d3-selection/src/sourceEvent.js","webpack://mermaid/./node_modules/d3-selection/src/point.js","webpack://mermaid/./node_modules/d3-selection/src/mouse.js","webpack://mermaid/./node_modules/d3-selection/src/selectAll.js","webpack://mermaid/./node_modules/d3-selection/src/touch.js","webpack://mermaid/./node_modules/d3-selection/src/touches.js","webpack://mermaid/./node_modules/d3-drag/src/noevent.js","webpack://mermaid/./node_modules/d3-drag/src/nodrag.js","webpack://mermaid/./node_modules/d3-drag/src/constant.js","webpack://mermaid/./node_modules/d3-drag/src/event.js","webpack://mermaid/./node_modules/d3-drag/src/drag.js","webpack://mermaid/./node_modules/d3-color/src/define.js","webpack://mermaid/./node_modules/d3-color/src/color.js","webpack://mermaid/./node_modules/d3-color/src/math.js","webpack://mermaid/./node_modules/d3-color/src/lab.js","webpack://mermaid/./node_modules/d3-color/src/cubehelix.js","webpack://mermaid/./node_modules/d3-interpolate/src/basis.js","webpack://mermaid/./node_modules/d3-interpolate/src/basisClosed.js","webpack://mermaid/./node_modules/d3-interpolate/src/constant.js","webpack://mermaid/./node_modules/d3-interpolate/src/color.js","webpack://mermaid/./node_modules/d3-interpolate/src/rgb.js","webpack://mermaid/./node_modules/d3-interpolate/src/array.js","webpack://mermaid/./node_modules/d3-interpolate/src/date.js","webpack://mermaid/./node_modules/d3-interpolate/src/number.js","webpack://mermaid/./node_modules/d3-interpolate/src/object.js","webpack://mermaid/./node_modules/d3-interpolate/src/string.js","webpack://mermaid/./node_modules/d3-interpolate/src/transform/parse.js","webpack://mermaid/./node_modules/d3-interpolate/src/value.js","webpack://mermaid/./node_modules/d3-interpolate/src/discrete.js","webpack://mermaid/./node_modules/d3-interpolate/src/hue.js","webpack://mermaid/./node_modules/d3-interpolate/src/round.js","webpack://mermaid/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://mermaid/./node_modules/d3-interpolate/src/transform/index.js","webpack://mermaid/./node_modules/d3-interpolate/src/zoom.js","webpack://mermaid/./node_modules/d3-interpolate/src/hsl.js","webpack://mermaid/./node_modules/d3-interpolate/src/lab.js","webpack://mermaid/./node_modules/d3-interpolate/src/hcl.js","webpack://mermaid/./node_modules/d3-interpolate/src/cubehelix.js","webpack://mermaid/./node_modules/d3-interpolate/src/piecewise.js","webpack://mermaid/./node_modules/d3-interpolate/src/quantize.js","webpack://mermaid/./node_modules/d3-timer/src/timer.js","webpack://mermaid/./node_modules/d3-timer/src/timeout.js","webpack://mermaid/./node_modules/d3-timer/src/interval.js","webpack://mermaid/./node_modules/d3-transition/src/transition/schedule.js","webpack://mermaid/./node_modules/d3-transition/src/interrupt.js","webpack://mermaid/./node_modules/d3-transition/src/transition/tween.js","webpack://mermaid/./node_modules/d3-transition/src/transition/interpolate.js","webpack://mermaid/./node_modules/d3-transition/src/transition/remove.js","webpack://mermaid/./node_modules/d3-transition/src/transition/selection.js","webpack://mermaid/./node_modules/d3-transition/src/transition/text.js","webpack://mermaid/./node_modules/d3-transition/src/transition/index.js","webpack://mermaid/./node_modules/d3-ease/src/linear.js","webpack://mermaid/./node_modules/d3-ease/src/quad.js","webpack://mermaid/./node_modules/d3-ease/src/cubic.js","webpack://mermaid/./node_modules/d3-transition/src/transition/select.js","webpack://mermaid/./node_modules/d3-transition/src/transition/selectAll.js","webpack://mermaid/./node_modules/d3-transition/src/transition/filter.js","webpack://mermaid/./node_modules/d3-transition/src/transition/merge.js","webpack://mermaid/./node_modules/d3-transition/src/transition/transition.js","webpack://mermaid/./node_modules/d3-transition/src/transition/on.js","webpack://mermaid/./node_modules/d3-transition/src/transition/attr.js","webpack://mermaid/./node_modules/d3-transition/src/transition/attrTween.js","webpack://mermaid/./node_modules/d3-transition/src/transition/style.js","webpack://mermaid/./node_modules/d3-transition/src/transition/styleTween.js","webpack://mermaid/./node_modules/d3-transition/src/transition/delay.js","webpack://mermaid/./node_modules/d3-transition/src/transition/duration.js","webpack://mermaid/./node_modules/d3-transition/src/transition/ease.js","webpack://mermaid/./node_modules/d3-ease/src/poly.js","webpack://mermaid/./node_modules/d3-ease/src/sin.js","webpack://mermaid/./node_modules/d3-ease/src/exp.js","webpack://mermaid/./node_modules/d3-ease/src/circle.js","webpack://mermaid/./node_modules/d3-ease/src/bounce.js","webpack://mermaid/./node_modules/d3-ease/src/back.js","webpack://mermaid/./node_modules/d3-ease/src/elastic.js","webpack://mermaid/./node_modules/d3-transition/src/selection/transition.js","webpack://mermaid/./node_modules/d3-transition/src/selection/index.js","webpack://mermaid/./node_modules/d3-transition/src/selection/interrupt.js","webpack://mermaid/./node_modules/d3-transition/src/active.js","webpack://mermaid/./node_modules/d3-brush/src/constant.js","webpack://mermaid/./node_modules/d3-brush/src/event.js","webpack://mermaid/./node_modules/d3-brush/src/noevent.js","webpack://mermaid/./node_modules/d3-brush/src/brush.js","webpack://mermaid/./node_modules/d3-chord/src/math.js","webpack://mermaid/./node_modules/d3-chord/src/chord.js","webpack://mermaid/./node_modules/d3-chord/src/array.js","webpack://mermaid/./node_modules/d3-chord/src/constant.js","webpack://mermaid/./node_modules/d3-path/src/path.js","webpack://mermaid/./node_modules/d3-chord/src/ribbon.js","webpack://mermaid/./node_modules/d3-collection/src/map.js","webpack://mermaid/./node_modules/d3-collection/src/nest.js","webpack://mermaid/./node_modules/d3-collection/src/set.js","webpack://mermaid/./node_modules/d3-collection/src/keys.js","webpack://mermaid/./node_modules/d3-collection/src/values.js","webpack://mermaid/./node_modules/d3-collection/src/entries.js","webpack://mermaid/./node_modules/d3-contour/src/array.js","webpack://mermaid/./node_modules/d3-contour/src/ascending.js","webpack://mermaid/./node_modules/d3-contour/src/area.js","webpack://mermaid/./node_modules/d3-contour/src/constant.js","webpack://mermaid/./node_modules/d3-contour/src/contains.js","webpack://mermaid/./node_modules/d3-contour/src/noop.js","webpack://mermaid/./node_modules/d3-contour/src/contours.js","webpack://mermaid/./node_modules/d3-contour/src/blur.js","webpack://mermaid/./node_modules/d3-contour/src/density.js","webpack://mermaid/./node_modules/d3-dsv/src/dsv.js","webpack://mermaid/./node_modules/d3-dsv/src/csv.js","webpack://mermaid/./node_modules/d3-dsv/src/tsv.js","webpack://mermaid/./node_modules/d3-fetch/src/blob.js","webpack://mermaid/./node_modules/d3-fetch/src/buffer.js","webpack://mermaid/./node_modules/d3-fetch/src/text.js","webpack://mermaid/./node_modules/d3-fetch/src/dsv.js","webpack://mermaid/./node_modules/d3-fetch/src/image.js","webpack://mermaid/./node_modules/d3-fetch/src/json.js","webpack://mermaid/./node_modules/d3-fetch/src/xml.js","webpack://mermaid/./node_modules/d3-force/src/center.js","webpack://mermaid/./node_modules/d3-force/src/constant.js","webpack://mermaid/./node_modules/d3-force/src/jiggle.js","webpack://mermaid/./node_modules/d3-quadtree/src/add.js","webpack://mermaid/./node_modules/d3-quadtree/src/cover.js","webpack://mermaid/./node_modules/d3-quadtree/src/quad.js","webpack://mermaid/./node_modules/d3-quadtree/src/x.js","webpack://mermaid/./node_modules/d3-quadtree/src/y.js","webpack://mermaid/./node_modules/d3-quadtree/src/quadtree.js","webpack://mermaid/./node_modules/d3-force/src/collide.js","webpack://mermaid/./node_modules/d3-quadtree/src/data.js","webpack://mermaid/./node_modules/d3-quadtree/src/extent.js","webpack://mermaid/./node_modules/d3-quadtree/src/find.js","webpack://mermaid/./node_modules/d3-quadtree/src/remove.js","webpack://mermaid/./node_modules/d3-quadtree/src/root.js","webpack://mermaid/./node_modules/d3-quadtree/src/size.js","webpack://mermaid/./node_modules/d3-quadtree/src/visit.js","webpack://mermaid/./node_modules/d3-quadtree/src/visitAfter.js","webpack://mermaid/./node_modules/d3-force/src/link.js","webpack://mermaid/./node_modules/d3-force/src/simulation.js","webpack://mermaid/./node_modules/d3-force/src/manyBody.js","webpack://mermaid/./node_modules/d3-force/src/radial.js","webpack://mermaid/./node_modules/d3-force/src/x.js","webpack://mermaid/./node_modules/d3-force/src/y.js","webpack://mermaid/./node_modules/d3-format/src/formatDecimal.js","webpack://mermaid/./node_modules/d3-format/src/exponent.js","webpack://mermaid/./node_modules/d3-format/src/formatSpecifier.js","webpack://mermaid/./node_modules/d3-format/src/formatTrim.js","webpack://mermaid/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://mermaid/./node_modules/d3-format/src/defaultLocale.js","webpack://mermaid/./node_modules/d3-format/src/formatRounded.js","webpack://mermaid/./node_modules/d3-format/src/formatTypes.js","webpack://mermaid/./node_modules/d3-format/src/identity.js","webpack://mermaid/./node_modules/d3-format/src/locale.js","webpack://mermaid/./node_modules/d3-format/src/formatGroup.js","webpack://mermaid/./node_modules/d3-format/src/formatNumerals.js","webpack://mermaid/./node_modules/d3-format/src/precisionFixed.js","webpack://mermaid/./node_modules/d3-format/src/precisionPrefix.js","webpack://mermaid/./node_modules/d3-format/src/precisionRound.js","webpack://mermaid/./node_modules/d3-geo/src/adder.js","webpack://mermaid/./node_modules/d3-geo/src/math.js","webpack://mermaid/./node_modules/d3-geo/src/noop.js","webpack://mermaid/./node_modules/d3-geo/src/stream.js","webpack://mermaid/./node_modules/d3-geo/src/area.js","webpack://mermaid/./node_modules/d3-geo/src/cartesian.js","webpack://mermaid/./node_modules/d3-geo/src/bounds.js","webpack://mermaid/./node_modules/d3-geo/src/centroid.js","webpack://mermaid/./node_modules/d3-geo/src/constant.js","webpack://mermaid/./node_modules/d3-geo/src/compose.js","webpack://mermaid/./node_modules/d3-geo/src/rotation.js","webpack://mermaid/./node_modules/d3-geo/src/circle.js","webpack://mermaid/./node_modules/d3-geo/src/clip/buffer.js","webpack://mermaid/./node_modules/d3-geo/src/pointEqual.js","webpack://mermaid/./node_modules/d3-geo/src/clip/rejoin.js","webpack://mermaid/./node_modules/d3-geo/src/polygonContains.js","webpack://mermaid/./node_modules/d3-geo/src/clip/index.js","webpack://mermaid/./node_modules/d3-geo/src/clip/antimeridian.js","webpack://mermaid/./node_modules/d3-geo/src/clip/circle.js","webpack://mermaid/./node_modules/d3-geo/src/clip/line.js","webpack://mermaid/./node_modules/d3-geo/src/clip/rectangle.js","webpack://mermaid/./node_modules/d3-geo/src/clip/extent.js","webpack://mermaid/./node_modules/d3-geo/src/length.js","webpack://mermaid/./node_modules/d3-geo/src/distance.js","webpack://mermaid/./node_modules/d3-geo/src/contains.js","webpack://mermaid/./node_modules/d3-geo/src/graticule.js","webpack://mermaid/./node_modules/d3-geo/src/interpolate.js","webpack://mermaid/./node_modules/d3-geo/src/path/area.js","webpack://mermaid/./node_modules/d3-geo/src/identity.js","webpack://mermaid/./node_modules/d3-geo/src/path/bounds.js","webpack://mermaid/./node_modules/d3-geo/src/path/centroid.js","webpack://mermaid/./node_modules/d3-geo/src/path/context.js","webpack://mermaid/./node_modules/d3-geo/src/path/measure.js","webpack://mermaid/./node_modules/d3-geo/src/path/string.js","webpack://mermaid/./node_modules/d3-geo/src/path/index.js","webpack://mermaid/./node_modules/d3-geo/src/transform.js","webpack://mermaid/./node_modules/d3-geo/src/projection/fit.js","webpack://mermaid/./node_modules/d3-geo/src/projection/resample.js","webpack://mermaid/./node_modules/d3-geo/src/projection/index.js","webpack://mermaid/./node_modules/d3-geo/src/projection/conic.js","webpack://mermaid/./node_modules/d3-geo/src/projection/conicEqualArea.js","webpack://mermaid/./node_modules/d3-geo/src/projection/cylindricalEqualArea.js","webpack://mermaid/./node_modules/d3-geo/src/projection/albers.js","webpack://mermaid/./node_modules/d3-geo/src/projection/albersUsa.js","webpack://mermaid/./node_modules/d3-geo/src/projection/azimuthal.js","webpack://mermaid/./node_modules/d3-geo/src/projection/azimuthalEqualArea.js","webpack://mermaid/./node_modules/d3-geo/src/projection/azimuthalEquidistant.js","webpack://mermaid/./node_modules/d3-geo/src/projection/mercator.js","webpack://mermaid/./node_modules/d3-geo/src/projection/conicConformal.js","webpack://mermaid/./node_modules/d3-geo/src/projection/equirectangular.js","webpack://mermaid/./node_modules/d3-geo/src/projection/conicEquidistant.js","webpack://mermaid/./node_modules/d3-geo/src/projection/equalEarth.js","webpack://mermaid/./node_modules/d3-geo/src/projection/gnomonic.js","webpack://mermaid/./node_modules/d3-geo/src/projection/identity.js","webpack://mermaid/./node_modules/d3-geo/src/projection/naturalEarth1.js","webpack://mermaid/./node_modules/d3-geo/src/projection/orthographic.js","webpack://mermaid/./node_modules/d3-geo/src/projection/stereographic.js","webpack://mermaid/./node_modules/d3-geo/src/projection/transverseMercator.js","webpack://mermaid/./node_modules/d3-hierarchy/src/cluster.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/count.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/index.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/each.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/sum.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/sort.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/path.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/ancestors.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/descendants.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/leaves.js","webpack://mermaid/./node_modules/d3-hierarchy/src/hierarchy/links.js","webpack://mermaid/./node_modules/d3-hierarchy/src/array.js","webpack://mermaid/./node_modules/d3-hierarchy/src/pack/enclose.js","webpack://mermaid/./node_modules/d3-hierarchy/src/pack/siblings.js","webpack://mermaid/./node_modules/d3-hierarchy/src/accessors.js","webpack://mermaid/./node_modules/d3-hierarchy/src/constant.js","webpack://mermaid/./node_modules/d3-hierarchy/src/pack/index.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/round.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/dice.js","webpack://mermaid/./node_modules/d3-hierarchy/src/partition.js","webpack://mermaid/./node_modules/d3-hierarchy/src/stratify.js","webpack://mermaid/./node_modules/d3-hierarchy/src/tree.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/slice.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/squarify.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/index.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/binary.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/sliceDice.js","webpack://mermaid/./node_modules/d3-hierarchy/src/treemap/resquarify.js","webpack://mermaid/./node_modules/d3-polygon/src/area.js","webpack://mermaid/./node_modules/d3-polygon/src/centroid.js","webpack://mermaid/./node_modules/d3-polygon/src/cross.js","webpack://mermaid/./node_modules/d3-polygon/src/hull.js","webpack://mermaid/./node_modules/d3-polygon/src/contains.js","webpack://mermaid/./node_modules/d3-polygon/src/length.js","webpack://mermaid/./node_modules/d3-random/src/defaultSource.js","webpack://mermaid/./node_modules/d3-random/src/uniform.js","webpack://mermaid/./node_modules/d3-random/src/normal.js","webpack://mermaid/./node_modules/d3-random/src/logNormal.js","webpack://mermaid/./node_modules/d3-random/src/irwinHall.js","webpack://mermaid/./node_modules/d3-random/src/bates.js","webpack://mermaid/./node_modules/d3-random/src/exponential.js","webpack://mermaid/./node_modules/d3-scale/src/array.js","webpack://mermaid/./node_modules/d3-scale/src/ordinal.js","webpack://mermaid/./node_modules/d3-scale/src/band.js","webpack://mermaid/./node_modules/d3-scale/src/constant.js","webpack://mermaid/./node_modules/d3-scale/src/number.js","webpack://mermaid/./node_modules/d3-scale/src/continuous.js","webpack://mermaid/./node_modules/d3-scale/src/tickFormat.js","webpack://mermaid/./node_modules/d3-scale/src/linear.js","webpack://mermaid/./node_modules/d3-scale/src/identity.js","webpack://mermaid/./node_modules/d3-scale/src/nice.js","webpack://mermaid/./node_modules/d3-scale/src/log.js","webpack://mermaid/./node_modules/d3-scale/src/pow.js","webpack://mermaid/./node_modules/d3-scale/src/quantile.js","webpack://mermaid/./node_modules/d3-scale/src/quantize.js","webpack://mermaid/./node_modules/d3-scale/src/threshold.js","webpack://mermaid/./node_modules/d3-time/src/interval.js","webpack://mermaid/./node_modules/d3-time/src/millisecond.js","webpack://mermaid/./node_modules/d3-time/src/duration.js","webpack://mermaid/./node_modules/d3-time/src/second.js","webpack://mermaid/./node_modules/d3-time/src/minute.js","webpack://mermaid/./node_modules/d3-time/src/hour.js","webpack://mermaid/./node_modules/d3-time/src/day.js","webpack://mermaid/./node_modules/d3-time/src/week.js","webpack://mermaid/./node_modules/d3-time/src/month.js","webpack://mermaid/./node_modules/d3-time/src/year.js","webpack://mermaid/./node_modules/d3-time/src/utcMinute.js","webpack://mermaid/./node_modules/d3-time/src/utcHour.js","webpack://mermaid/./node_modules/d3-time/src/utcDay.js","webpack://mermaid/./node_modules/d3-time/src/utcWeek.js","webpack://mermaid/./node_modules/d3-time/src/utcMonth.js","webpack://mermaid/./node_modules/d3-time/src/utcYear.js","webpack://mermaid/./node_modules/d3-time-format/src/locale.js","webpack://mermaid/./node_modules/d3-time-format/src/defaultLocale.js","webpack://mermaid/./node_modules/d3-time-format/src/isoFormat.js","webpack://mermaid/./node_modules/d3-time-format/src/isoParse.js","webpack://mermaid/./node_modules/d3-scale/src/time.js","webpack://mermaid/./node_modules/d3-scale/src/utcTime.js","webpack://mermaid/./node_modules/d3-scale/src/sequential.js","webpack://mermaid/./node_modules/d3-scale/src/diverging.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/colors.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/category10.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Accent.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Dark2.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Paired.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Set1.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Set2.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/categorical/Set3.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/ramp.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/BrBG.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/PRGn.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/PiYG.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/PuOr.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/RdBu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/RdGy.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/diverging/Spectral.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js","webpack://mermaid/./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js","webpack://mermaid/./node_modules/d3-shape/src/constant.js","webpack://mermaid/./node_modules/d3-shape/src/math.js","webpack://mermaid/./node_modules/d3-shape/src/arc.js","webpack://mermaid/./node_modules/d3-shape/src/curve/linear.js","webpack://mermaid/./node_modules/d3-shape/src/point.js","webpack://mermaid/./node_modules/d3-shape/src/line.js","webpack://mermaid/./node_modules/d3-shape/src/area.js","webpack://mermaid/./node_modules/d3-shape/src/descending.js","webpack://mermaid/./node_modules/d3-shape/src/identity.js","webpack://mermaid/./node_modules/d3-shape/src/pie.js","webpack://mermaid/./node_modules/d3-shape/src/curve/radial.js","webpack://mermaid/./node_modules/d3-shape/src/lineRadial.js","webpack://mermaid/./node_modules/d3-shape/src/areaRadial.js","webpack://mermaid/./node_modules/d3-shape/src/pointRadial.js","webpack://mermaid/./node_modules/d3-shape/src/array.js","webpack://mermaid/./node_modules/d3-shape/src/link/index.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/circle.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/cross.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/diamond.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/star.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/square.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/triangle.js","webpack://mermaid/./node_modules/d3-shape/src/symbol/wye.js","webpack://mermaid/./node_modules/d3-shape/src/symbol.js","webpack://mermaid/./node_modules/d3-shape/src/noop.js","webpack://mermaid/./node_modules/d3-shape/src/curve/basis.js","webpack://mermaid/./node_modules/d3-shape/src/curve/basisClosed.js","webpack://mermaid/./node_modules/d3-shape/src/curve/basisOpen.js","webpack://mermaid/./node_modules/d3-shape/src/curve/bundle.js","webpack://mermaid/./node_modules/d3-shape/src/curve/cardinal.js","webpack://mermaid/./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack://mermaid/./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack://mermaid/./node_modules/d3-shape/src/curve/catmullRom.js","webpack://mermaid/./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack://mermaid/./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack://mermaid/./node_modules/d3-shape/src/curve/linearClosed.js","webpack://mermaid/./node_modules/d3-shape/src/curve/monotone.js","webpack://mermaid/./node_modules/d3-shape/src/curve/natural.js","webpack://mermaid/./node_modules/d3-shape/src/curve/step.js","webpack://mermaid/./node_modules/d3-shape/src/offset/none.js","webpack://mermaid/./node_modules/d3-shape/src/order/none.js","webpack://mermaid/./node_modules/d3-shape/src/stack.js","webpack://mermaid/./node_modules/d3-shape/src/offset/expand.js","webpack://mermaid/./node_modules/d3-shape/src/offset/diverging.js","webpack://mermaid/./node_modules/d3-shape/src/offset/silhouette.js","webpack://mermaid/./node_modules/d3-shape/src/offset/wiggle.js","webpack://mermaid/./node_modules/d3-shape/src/order/ascending.js","webpack://mermaid/./node_modules/d3-shape/src/order/descending.js","webpack://mermaid/./node_modules/d3-shape/src/order/insideOut.js","webpack://mermaid/./node_modules/d3-shape/src/order/reverse.js","webpack://mermaid/./node_modules/d3-voronoi/src/constant.js","webpack://mermaid/./node_modules/d3-voronoi/src/point.js","webpack://mermaid/./node_modules/d3-voronoi/src/RedBlackTree.js","webpack://mermaid/./node_modules/d3-voronoi/src/Edge.js","webpack://mermaid/./node_modules/d3-voronoi/src/Cell.js","webpack://mermaid/./node_modules/d3-voronoi/src/Circle.js","webpack://mermaid/./node_modules/d3-voronoi/src/Beach.js","webpack://mermaid/./node_modules/d3-voronoi/src/Diagram.js","webpack://mermaid/./node_modules/d3-voronoi/src/voronoi.js","webpack://mermaid/./node_modules/d3-zoom/src/constant.js","webpack://mermaid/./node_modules/d3-zoom/src/event.js","webpack://mermaid/./node_modules/d3-zoom/src/transform.js","webpack://mermaid/./node_modules/d3-zoom/src/noevent.js","webpack://mermaid/./node_modules/d3-zoom/src/zoom.js","webpack://mermaid/./node_modules/d3/index.js","webpack://mermaid/./src/diagrams/sequence/parser/sequenceDiagram.js","webpack://mermaid/./node_modules/lodash/lodash.js","webpack://mermaid/./node_modules/graphlibrary/lib/lodash.js","webpack://mermaid/(webpack)/buildin/module.js","webpack://mermaid/./src/diagrams/gantt/parser/gantt.js","webpack://mermaid/./node_modules/process/browser.js","webpack://mermaid/./src/diagrams/class/parser/classDiagram.js","webpack://mermaid/./node_modules/dagre-d3-renderer/dist/dagre-d3.core.js","webpack://mermaid/(webpack)/buildin/global.js","webpack://mermaid/./node_modules/path-browserify/index.js","webpack://mermaid/./node_modules/graphlibrary/index.js","webpack://mermaid/./src/diagrams/flowchart/parser/flow.js","webpack://mermaid/./node_modules/css-loader/dist/runtime/api.js","webpack://mermaid/./src/diagrams/git/parser/gitGraph.js","webpack://mermaid/./node_modules/graphlibrary/lib/graph.js","webpack://mermaid/./node_modules/dagre-layout/dist/dagre-layout.core.js","webpack://mermaid/./node_modules/moment/locale/af.js","webpack://mermaid/./node_modules/moment/locale/ar.js","webpack://mermaid/./node_modules/moment/locale/ar-dz.js","webpack://mermaid/./node_modules/moment/locale/ar-kw.js","webpack://mermaid/./node_modules/moment/locale/ar-ly.js","webpack://mermaid/./node_modules/moment/locale/ar-ma.js","webpack://mermaid/./node_modules/moment/locale/ar-sa.js","webpack://mermaid/./node_modules/moment/locale/ar-tn.js","webpack://mermaid/./node_modules/moment/locale/az.js","webpack://mermaid/./node_modules/moment/locale/be.js","webpack://mermaid/./node_modules/moment/locale/bg.js","webpack://mermaid/./node_modules/moment/locale/bm.js","webpack://mermaid/./node_modules/moment/locale/bn.js","webpack://mermaid/./node_modules/moment/locale/bo.js","webpack://mermaid/./node_modules/moment/locale/br.js","webpack://mermaid/./node_modules/moment/locale/bs.js","webpack://mermaid/./node_modules/moment/locale/ca.js","webpack://mermaid/./node_modules/moment/locale/cs.js","webpack://mermaid/./node_modules/moment/locale/cv.js","webpack://mermaid/./node_modules/moment/locale/cy.js","webpack://mermaid/./node_modules/moment/locale/da.js","webpack://mermaid/./node_modules/moment/locale/de.js","webpack://mermaid/./node_modules/moment/locale/de-at.js","webpack://mermaid/./node_modules/moment/locale/de-ch.js","webpack://mermaid/./node_modules/moment/locale/dv.js","webpack://mermaid/./node_modules/moment/locale/el.js","webpack://mermaid/./node_modules/moment/locale/en-au.js","webpack://mermaid/./node_modules/moment/locale/en-ca.js","webpack://mermaid/./node_modules/moment/locale/en-gb.js","webpack://mermaid/./node_modules/moment/locale/en-ie.js","webpack://mermaid/./node_modules/moment/locale/en-il.js","webpack://mermaid/./node_modules/moment/locale/en-nz.js","webpack://mermaid/./node_modules/moment/locale/eo.js","webpack://mermaid/./node_modules/moment/locale/es.js","webpack://mermaid/./node_modules/moment/locale/es-do.js","webpack://mermaid/./node_modules/moment/locale/es-us.js","webpack://mermaid/./node_modules/moment/locale/et.js","webpack://mermaid/./node_modules/moment/locale/eu.js","webpack://mermaid/./node_modules/moment/locale/fa.js","webpack://mermaid/./node_modules/moment/locale/fi.js","webpack://mermaid/./node_modules/moment/locale/fo.js","webpack://mermaid/./node_modules/moment/locale/fr.js","webpack://mermaid/./node_modules/moment/locale/fr-ca.js","webpack://mermaid/./node_modules/moment/locale/fr-ch.js","webpack://mermaid/./node_modules/moment/locale/fy.js","webpack://mermaid/./node_modules/moment/locale/gd.js","webpack://mermaid/./node_modules/moment/locale/gl.js","webpack://mermaid/./node_modules/moment/locale/gom-latn.js","webpack://mermaid/./node_modules/moment/locale/gu.js","webpack://mermaid/./node_modules/moment/locale/he.js","webpack://mermaid/./node_modules/moment/locale/hi.js","webpack://mermaid/./node_modules/moment/locale/hr.js","webpack://mermaid/./node_modules/moment/locale/hu.js","webpack://mermaid/./node_modules/moment/locale/hy-am.js","webpack://mermaid/./node_modules/moment/locale/id.js","webpack://mermaid/./node_modules/moment/locale/is.js","webpack://mermaid/./node_modules/moment/locale/it.js","webpack://mermaid/./node_modules/moment/locale/ja.js","webpack://mermaid/./node_modules/moment/locale/jv.js","webpack://mermaid/./node_modules/moment/locale/ka.js","webpack://mermaid/./node_modules/moment/locale/kk.js","webpack://mermaid/./node_modules/moment/locale/km.js","webpack://mermaid/./node_modules/moment/locale/kn.js","webpack://mermaid/./node_modules/moment/locale/ko.js","webpack://mermaid/./node_modules/moment/locale/ku.js","webpack://mermaid/./node_modules/moment/locale/ky.js","webpack://mermaid/./node_modules/moment/locale/lb.js","webpack://mermaid/./node_modules/moment/locale/lo.js","webpack://mermaid/./node_modules/moment/locale/lt.js","webpack://mermaid/./node_modules/moment/locale/lv.js","webpack://mermaid/./node_modules/moment/locale/me.js","webpack://mermaid/./node_modules/moment/locale/mi.js","webpack://mermaid/./node_modules/moment/locale/mk.js","webpack://mermaid/./node_modules/moment/locale/ml.js","webpack://mermaid/./node_modules/moment/locale/mn.js","webpack://mermaid/./node_modules/moment/locale/mr.js","webpack://mermaid/./node_modules/moment/locale/ms.js","webpack://mermaid/./node_modules/moment/locale/ms-my.js","webpack://mermaid/./node_modules/moment/locale/mt.js","webpack://mermaid/./node_modules/moment/locale/my.js","webpack://mermaid/./node_modules/moment/locale/nb.js","webpack://mermaid/./node_modules/moment/locale/ne.js","webpack://mermaid/./node_modules/moment/locale/nl.js","webpack://mermaid/./node_modules/moment/locale/nl-be.js","webpack://mermaid/./node_modules/moment/locale/nn.js","webpack://mermaid/./node_modules/moment/locale/pa-in.js","webpack://mermaid/./node_modules/moment/locale/pl.js","webpack://mermaid/./node_modules/moment/locale/pt.js","webpack://mermaid/./node_modules/moment/locale/pt-br.js","webpack://mermaid/./node_modules/moment/locale/ro.js","webpack://mermaid/./node_modules/moment/locale/ru.js","webpack://mermaid/./node_modules/moment/locale/sd.js","webpack://mermaid/./node_modules/moment/locale/se.js","webpack://mermaid/./node_modules/moment/locale/si.js","webpack://mermaid/./node_modules/moment/locale/sk.js","webpack://mermaid/./node_modules/moment/locale/sl.js","webpack://mermaid/./node_modules/moment/locale/sq.js","webpack://mermaid/./node_modules/moment/locale/sr.js","webpack://mermaid/./node_modules/moment/locale/sr-cyrl.js","webpack://mermaid/./node_modules/moment/locale/ss.js","webpack://mermaid/./node_modules/moment/locale/sv.js","webpack://mermaid/./node_modules/moment/locale/sw.js","webpack://mermaid/./node_modules/moment/locale/ta.js","webpack://mermaid/./node_modules/moment/locale/te.js","webpack://mermaid/./node_modules/moment/locale/tet.js","webpack://mermaid/./node_modules/moment/locale/tg.js","webpack://mermaid/./node_modules/moment/locale/th.js","webpack://mermaid/./node_modules/moment/locale/tl-ph.js","webpack://mermaid/./node_modules/moment/locale/tlh.js","webpack://mermaid/./node_modules/moment/locale/tr.js","webpack://mermaid/./node_modules/moment/locale/tzl.js","webpack://mermaid/./node_modules/moment/locale/tzm.js","webpack://mermaid/./node_modules/moment/locale/tzm-latn.js","webpack://mermaid/./node_modules/moment/locale/ug-cn.js","webpack://mermaid/./node_modules/moment/locale/uk.js","webpack://mermaid/./node_modules/moment/locale/ur.js","webpack://mermaid/./node_modules/moment/locale/uz.js","webpack://mermaid/./node_modules/moment/locale/uz-latn.js","webpack://mermaid/./node_modules/moment/locale/vi.js","webpack://mermaid/./node_modules/moment/locale/x-pseudo.js","webpack://mermaid/./node_modules/moment/locale/yo.js","webpack://mermaid/./node_modules/moment/locale/zh-cn.js","webpack://mermaid/./node_modules/moment/locale/zh-hk.js","webpack://mermaid/./node_modules/moment/locale/zh-tw.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/dijkstra.js","webpack://mermaid/./node_modules/graphlibrary/lib/data/priority-queue.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/tarjan.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/topsort.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/dfs.js","webpack://mermaid/./node_modules/he/he.js","webpack://mermaid/./node_modules/scope-css/index.js","webpack://mermaid/./node_modules/slugify/index.js","webpack://mermaid/./node_modules/escaper/dist/escaper.js","webpack://mermaid/./node_modules/strip-css-comments/index.js","webpack://mermaid/./node_modules/is-regexp/index.js","webpack://mermaid/./node_modules/moment/locale sync ^\\.\\/.*$","webpack://mermaid/./node_modules/graphlibrary/node_modules/lodash/lodash.js","webpack://mermaid/./node_modules/graphlibrary/lib/json.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/index.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/components.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/dijkstra-all.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/find-cycles.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/floyd-warshall.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/is-acyclic.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/postorder.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/preorder.js","webpack://mermaid/./node_modules/graphlibrary/lib/alg/prim.js","webpack://mermaid/./node_modules/dagre-d3-renderer/node_modules/lodash/lodash.js","webpack://mermaid/./node_modules/dagre-layout/node_modules/lodash/lodash.js","webpack://mermaid/./src/themes sync ^\\.\\/.*\\/index\\.scss$","webpack://mermaid/./src/themes/dark/index.scss?3bd3","webpack://mermaid/./src/themes/dark/index.scss","webpack://mermaid/./src/themes/default/index.scss?54ca","webpack://mermaid/./src/themes/default/index.scss","webpack://mermaid/./src/themes/forest/index.scss?3c73","webpack://mermaid/./src/themes/forest/index.scss","webpack://mermaid/./src/themes/neutral/index.scss?dee9","webpack://mermaid/./src/themes/neutral/index.scss","webpack://mermaid/./src/logger.js","webpack://mermaid/./src/utils.js","webpack://mermaid/./src/diagrams/flowchart/flowDb.js","webpack://mermaid/./src/diagrams/flowchart/flowRenderer.js","webpack://mermaid/./src/diagrams/sequence/svgDraw.js","webpack://mermaid/./src/diagrams/sequence/sequenceDb.js","webpack://mermaid/./src/diagrams/sequence/sequenceRenderer.js","webpack://mermaid/./src/diagrams/gantt/ganttDb.js","webpack://mermaid/./src/diagrams/gantt/ganttRenderer.js","webpack://mermaid/./src/diagrams/class/classDb.js","webpack://mermaid/./src/diagrams/class/classRenderer.js","webpack://mermaid/./src/diagrams/git/gitGraphAst.js","webpack://mermaid/./src/diagrams/git/gitGraphRenderer.js","webpack://mermaid/./src/mermaidAPI.js","webpack://mermaid/./src/mermaid.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","hookCallback","some","hooks","apply","arguments","isArray","input","Array","toString","isObject","isUndefined","isNumber","isDate","Date","map","arr","fn","res","length","push","hasOwnProp","a","b","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","getParsingFlags","_pf","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","isValid","_isValid","flags","parsedParts","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","undefined","bigHour","isFrozen","createInvalid","NaN","fun","this","len","momentProperties","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","updateInProgress","Moment","config","updateOffset","isMoment","obj","absFloor","number","Math","ceil","floor","toInt","argumentForCoercion","coercedNumber","isFinite","compareArrays","array1","array2","dontConvert","min","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","arg","args","slice","join","Error","stack","keys","deprecations","deprecateSimple","isFunction","Function","mergeConfigs","parentConfig","childConfig","Locale","set","aliases","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","addUnitPriority","priority","zeroFill","targetLength","forceSign","absNumber","zerosToFill","sign","pow","max","substr","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","token","padded","ordinal","callback","func","localeData","formatMoment","expandFormat","array","match","replace","mom","output","makeFormatFunction","invalidDate","replaceLongDateFormatTokens","longDateFormat","lastIndex","test","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","regexes","addRegexToken","regex","strictRegex","isStrict","getParseRegexForToken","RegExp","regexEscape","matched","p1","p2","p3","p4","tokens","addParseToken","addWeekParseToken","_w","addTimeToArrayFromToken","_a","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","daysInYear","year","isLeapYear","y","parseTwoDigitYear","parseInt","indexOf","getSetYear","makeGetSet","keepTime","set$1","month","date","daysInMonth","x","modMonth","monthsShort","months","monthsShortRegex","monthsRegex","monthsParse","MONTHS_IN_FORMAT","defaultLocaleMonths","split","defaultLocaleMonthsShort","setMonth","dayOfMonth","getSetMonth","defaultMonthsShortRegex","defaultMonthsRegex","computeMonthsParse","cmpLenRev","shortPieces","longPieces","mixedPieces","sort","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","fwdlw","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","computeWeekdaysParse","minp","shortp","longp","minPieces","day","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","hours","lowercase","minutes","matchMeridiem","_meridiemParse","seconds","kInput","_isPm","isPM","_meridiem","pos","pos1","pos2","globalLocale","getSetHour","baseConfig","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","LTS","LT","L","LL","LLL","LLLL","dayOfMonthOrdinalParse","relativeTime","future","past","ss","mm","h","hh","dd","M","MM","yy","meridiemParse","locales","localeFamilies","normalizeLocale","loadLocale","oldLocale","_abbr","getSetGlobalLocale","e","values","data","getLocale","defineLocale","abbr","_config","parentLocale","forEach","names","j","next","chooseLocale","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","defaults","configFromArray","currentDate","expectedWeekday","yearToUse","nowValue","now","_useUTC","getUTCMonth","getUTCDate","getFullYear","getMonth","getDate","currentDateArray","w","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","_week","curWeek","gg","_dayOfYear","dayOfYearFromWeekInfo","_nextDay","ms","setFullYear","getDay","setUTCMinutes","getUTCMinutes","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","string","exec","configFromStringAndFormat","untruncateYear","yearStr","obsOffsets","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","configFromRFC2822","monthStr","dayStr","hourStr","minuteStr","secondStr","result","parsedArray","weekdayStr","parsedInput","weekdayProvided","weekdayActual","checkWeekday","obsOffset","militaryOffset","numOffset","hm","calculateOffset","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","hour","meridiemHour","isPm","prepareConfig","preparse","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromStringAndArray","createFromInputFallback","configFromString","minute","second","millisecond","configFromObject","configFromInput","isUTC","getOwnPropertyNames","k","isObjectEmpty","add","prototypeMin","other","prototypeMax","pickBy","moments","ordering","Duration","duration","years","quarters","quarter","weeks","isoWeek","days","milliseconds","unitHasDecimal","parseFloat","isDurationValid","_milliseconds","_days","_months","_data","_bubble","isDuration","absRound","round","offset","separator","utcOffset","offsetFromString","chunkOffset","matcher","matches","chunk","parts","cloneWithOffset","model","diff","clone","setTime","local","getDateOffset","getTimezoneOffset","isUtc","aspNetRegex","isoRegex","createDuration","ret","diffRes","base","parseIso","isBefore","positiveMomentsDifference","inp","isAfter","createAdder","direction","period","tmp","addSubtract","isAdding","invalid","subtract","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","newLocaleData","defaultFormat","defaultFormatUtc","lang","addWeekYearFormatToken","getSetWeekYearHelper","weeksTarget","dayOfYearData","isoWeekYear","_dayOfMonthOrdinalParse","_ordinalParse","_dayOfMonthOrdinalParseLenient","getSetDayOfMonth","getSetMinute","getSetSecond","parseMs","getSetMillisecond","proto","preParsePostFormat","time","formats","sod","startOf","calendarFormat","asFloat","that","zoneDelta","endOf","inputString","postformat","withoutSuffix","humanize","fromNow","toNow","invalidAt","localInput","isBetween","inclusivity","localFrom","localTo","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","unitsObj","u","getPrioritizedUnits","isoWeekday","toArray","toObject","toDate","toISOString","keepOffset","inspect","zone","isLocal","prefix","suffix","toJSON","unix","creationData","isoWeeks","weekInfo","isoWeeksInYear","parseWeekday","parseIsoWeekday","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","zoneName","dates","isDSTShifted","_isDSTShifted","proto$1","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","_calendar","_longDateFormat","formatUpper","toUpperCase","_invalidDate","_ordinal","isFuture","_relativeTime","pastFuture","source","isFormat","_monthsShort","monthName","_monthsParseExact","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","firstDayOfYear","firstDayOfWeek","_weekdays","_weekdaysMin","_weekdaysShort","weekdayName","_weekdaysParseExact","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","_fullWeekdaysParse","charAt","isLower","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","alias","as","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","makeGetter","thresholds","abs$1","toISOString$1","Y","D","toFixed","total","totalSign","ymSign","daysSign","hmsSign","proto$2","monthsFromDays","withSuffix","posNegDuration","relativeTime$1","toIsoString","version","updateLocale","tmpLocale","relativeTimeRounding","roundingFunction","relativeTimeThreshold","threshold","limit","myMoment","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","ascending","bisector","compare","f","left","lo","hi","mid","right","ascendingBisect","bisectRight","bisectLeft","bisect","pairs","pair","cross","values0","values1","reduce","i0","i1","value0","n0","n1","descending","variance","valueof","delta","mean","sum","deviation","v","sqrt","src_extent","array_array","constant","identity","src_range","start","stop","step","range","e10","e5","e2","ticks","count","reverse","tickIncrement","power","log","LN10","error","tickStep","step0","step1","sturges","LN2","src_histogram","domain","histogram","xz","x0","x1","tz","pop","bin","bins","_","quantile","freedmanDiaconis","scott","src_max","src_mean","median","numbers","src_merge","arrays","merged","src_min","permute","indexes","permutes","scan","xi","xj","shuffle","random","src_sum","src_transpose","matrix","transpose_length","transpose","row","zip","array_slice","src_identity","axis_top","axis_right","axis_bottom","axis_left","epsilon","translateX","translateY","entering","__axis","axis_axis","orient","scale","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","transform","axis","context","spacing","range0","range1","position","bandwidth","copy","selection","path","selectAll","tick","order","tickExit","exit","tickEnter","enter","append","attr","line","select","text","merge","insert","transition","getAttribute","parentNode","remove","filter","each","tickSize","axisTop","axisRight","axisBottom","axisLeft","noop","dispatch","Dispatch","type","concat","constructor","on","typename","types","T","trim","src_dispatch","xhtml","namespaces","svg","xlink","xml","xmlns","namespace","space","creator","fullname","ownerDocument","createElementNS","document","uri","namespaceURI","documentElement","createElement","none","src_selector","selector","querySelector","selectorAll_empty","selectorAll","querySelectorAll","matcher_element","vendorMatches","webkitMatchesSelector","msMatchesSelector","mozMatchesSelector","oMatchesSelector","src_matcher","sparse","update","EnterNode","parent","datum","_next","_parent","__data__","appendChild","child","insertBefore","keyPrefix","bindIndex","group","node","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","keyValues","sort_ascending","src_window","defaultView","styleValue","style","getPropertyValue","getComputedStyle","classArray","classList","ClassList","_node","_names","classedAdd","list","classedRemove","setAttribute","splice","contains","textRemove","textContent","htmlRemove","innerHTML","raise","nextSibling","lower","previousSibling","firstChild","constantNull","removeChild","selection_cloneShallow","cloneNode","selection_cloneDeep","filterEvents","on_event","mouseenter","mouseleave","filterContextListener","listener","contextListener","event","related","relatedTarget","compareDocumentPosition","event1","event0","onRemove","__on","removeEventListener","capture","onAdd","wrap","addEventListener","customEvent","sourceEvent","dispatchEvent","params","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","selection_root","Selection","groups","parents","_groups","_parents","selection_selection","subgroups","subnode","subgroup","size","enterGroup","updateGroup","previous","_enter","_exit","groups0","groups1","m0","m1","merges","group0","group1","compareNode","sortgroups","sortgroup","nodes","getAttributeNS","removeAttributeNS","removeAttribute","setAttributeNS","removeProperty","setProperty","classed","html","before","deep","typenames","on_parseTypenames","src_selection","src_select","src_create","nextId","Local","id","current","src_point","ownerSVGElement","createSVGPoint","point","clientX","clientY","matrixTransform","getScreenCTM","inverse","rect","getBoundingClientRect","clientLeft","top","clientTop","mouse","changedTouches","src_selectAll","src_touch","touches","identifier","touch","src_touches","points","nopropagation","stopImmediatePropagation","noevent","preventDefault","nodrag","view","__noselect","MozUserSelect","yesdrag","noclick","setTimeout","d3_drag_src_constant","DragEvent","target","subject","active","dx","dy","defaultFilter","button","defaultContainer","defaultSubject","defaultTouchable","src_drag","mousedownx","mousedowny","mousemoving","touchending","container","touchable","gestures","listeners","clickDistance2","drag","mousedowned","touchstarted","touchmoved","touchended","gesture","beforestart","mousemoved","mouseupped","clearTimeout","sublisteners","p0","clickDistance","definition","Color","reI","reN","reP","reHex3","reHex6","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_color","Rgb","rgbn","rgba","hsla","g","rgbConvert","rgb","opacity","color_rgb","hex","Hsl","hsl","hslConvert","hsl2rgb","m2","displayable","brighter","darker","deg2rad","PI","rad2deg","Xn","Yn","Zn","lab_t0","lab_t1","lab_t2","t3","labConvert","Lab","Hcl","cos","sin","z","rgb2lrgb","xyz2lab","lab","lab2xyz","lrgb2rgb","hclConvert","atan2","lch","hcl","C","cubehelix_D","cubehelix_E","ED","EB","BC_DA","cubehelix_cubehelix","Cubehelix","bl","cubehelixConvert","basis","t1","v0","v1","v2","v3","t2","cosh","sinh","src_basis","basisClosed","d3_interpolate_src_constant","linear","color_hue","gamma","nogamma","exponential","src_rgb","rgbGamma","color","end","rgbSpline","spline","colors","rgbBasis","rgbBasisClosed","src_array","nb","na","src_value","src_date","src_number","src_object","reA","reB","cssNode","cssRoot","cssView","svgNode","src_string","am","bm","bs","bi","q","one","string_zero","discrete","src_hue","src_round","degrees","decompose_identity","rotate","skewX","scaleX","scaleY","decompose","atan","interpolateTransform","parse","pxComma","pxParen","degParen","xa","ya","xb","yb","translate","interpolateTransformCss","interpolateTransformSvg","baseVal","consolidate","rho","SQRT2","zoom_cosh","exp","src_zoom","S","ux0","uy0","w0","ux1","uy1","w1","d2","d1","b0","b1","r0","r1","coshr0","zoom_sinh","hsl_hsl","hue","src_hsl","hslLong","lab_lab","hcl_hcl","src_hcl","hclLong","src_cubehelix_cubehelix","cubehelixGamma","cubehelix","src_cubehelix","cubehelixLong","piecewise_piecewise","interpolate","I","taskHead","taskTail","quantize","interpolator","samples","timer_frame","timeout","timer_interval","pokeDelay","clockLast","clockNow","clockSkew","clock","performance","setFrame","requestAnimationFrame","clearNow","Timer","_call","_time","timer","delay","restart","timerFlush","wake","t0","Infinity","sleep","nap","poke","clearInterval","setInterval","TypeError","src_timeout","elapsed","src_interval","emptyOn","emptyTween","CREATED","SCHEDULED","STARTING","STARTED","RUNNING","ENDING","ENDED","transition_schedule","timing","schedules","__transition","self","tween","state","ease","schedule_create","schedule_init","schedule","schedule_get","schedule_set","interrupt","tweenValue","_id","transition_interpolate","selection_Selection","transition_id","Transition","_name","src_transition_transition","newId","selection_prototype","linear_linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","children","inherit","id0","id1","on0","on1","sit","every","on_start","onFunction","attrTween","value00","value10","interpolate0","value1","_value","styleTween","style_styleRemove","styleRemoveEnd","style_styleFunction","style_styleConstant","text_textFunction","text_textConstant","tween0","tween1","easeConstant","polyIn","custom","exponent","polyOut","polyInOut","pi","halfPi","sinIn","sinOut","sinInOut","expIn","expOut","expInOut","circleIn","circleOut","circleInOut","bounce_b1","b2","b3","b4","b5","b6","b7","b8","b9","bounce_b0","bounceIn","bounceOut","bounceInOut","backIn","overshoot","backOut","backInOut","tau","elasticIn","asin","amplitude","elasticOut","elasticInOut","defaultTiming","transition_inherit","active_root","src_active","d3_brush_src_constant","src_event","noevent_nopropagation","src_noevent","MODE_DRAG","MODE_SPACE","MODE_HANDLE","MODE_CENTER","brush_X","handles","brush_type","xy","brush_Y","XY","cursors","overlay","nw","ne","se","sw","flipX","flipY","signsX","signsY","brush_defaultFilter","defaultExtent","width","height","brush_local","__brush","brush_empty","extent","brushSelection","dim","brushX","brush_brush","brushY","src_brush","brush","handleSize","initialize","handle","redraw","started","emitter","Emitter","e0","e1","s0","s1","moving","lockX","lockY","metaKey","altKey","signX","signY","N","shifting","shiftKey","point0","emit","moved","ended","keyCode","move","point1","selection0","selection1","starting","math_pi","math_halfPi","math_tau","math_max","src_chord","padAngle","sortGroups","sortSubgroups","sortChords","chord","groupSums","groupIndex","subgroupIndex","chords","di","dj","a0","a1","subindex","startAngle","endAngle","src_array_slice","d3_chord_src_constant","path_pi","path_tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","path_path","moveTo","closePath","lineTo","quadraticCurveTo","y1","bezierCurveTo","x2","y2","arcTo","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","acos","t01","t21","arc","ccw","cw","da","src_path","defaultSource","defaultTarget","defaultRadius","radius","defaultStartAngle","defaultEndAngle","src_ribbon","ribbon","buffer","argv","sr","sa0","sa1","sx0","sy0","tr","ta0","ta1","Map","map_map","has","clear","entries","src_map","src_nest","sortValues","rollup","nest","sortKeys","depth","createResult","setResult","valuesByKey","createObject","setObject","createMap","setMap","sortKey","Set","set_set","src_set","src_keys","src_values","src_entries","d3_contour_src_array_slice","src_ascending","src_area","ring","area","d3_contour_src_constant","hole","ringContains","yi","pj","yj","segmentContains","collinear","src_noop","cases","src_contours","smooth","smoothLinear","contours","contour","polygons","holes","fragmentByStart","fragmentByEnd","stitch","startIndex","endIndex","unshift","isorings","polygon","coordinates","xt","yt","_0","_1","blurX","blurY","defaultX","defaultY","defaultWeight","src_density","weight","density","Float32Array","wi","geometry","transformPolygon","transformRing","transformPoint","resize","cellSize","EOL","EOF","QUOTE","NEWLINE","RETURN","objectConverter","columns","JSON","stringify","dsv","delimiter","reFormat","DELIMITER","charCodeAt","parseRows","rows","eof","eol","formatRow","formatValue","convert","customConverter","columnSet","column","inferColumns","formatRows","csv","csvParse","csvParseRows","csvFormat","csvFormatRows","tsv","tsvParse","tsvParseRows","tsvFormat","tsvFormatRows","responseBlob","response","ok","status","statusText","blob","init","fetch","then","responseArrayBuffer","arrayBuffer","src_buffer","responseText","src_text","dsvParse","dsv_dsv","dsv_csv","dsv_tsv","src_image","Promise","resolve","reject","image","Image","onerror","onload","src","responseJson","json","parser","DOMParser","parseFromString","xml_html","src_center","force","sx","sy","d3_force_src_constant","jiggle","add_add","tree","xm","ym","xp","yp","bottom","_root","leaf","_x","_y","src_quad","x_defaultX","y_defaultY","quadtree","Quadtree","addAll","leaf_copy","treeProto","collide_x","vx","collide_y","vy","cover","yz","visit","find","x3","y3","quads","retainer","removeAll","visitAfter","collide","radii","strength","iterations","ri","ri2","prepare","quad","rj","link_index","link_find","nodeById","nodeId","src_link","links","strengths","distances","bias","link","distance","alpha","initializeStrength","initializeDistance","simulation_x","simulation_y","initialRadius","initialAngle","src_simulation","simulation","alphaMin","alphaDecay","alphaTarget","velocityDecay","forces","stepper","fx","fy","initializeNodes","angle","initializeForce","closest","manyBody","distanceMin2","distanceMax2","theta2","accumulate","distanceMin","distanceMax","theta","radial","radiuses","d3_force_src_x","d3_force_src_y","formatDecimal","toExponential","coefficient","src_exponent","re","formatSpecifier","specifier","FormatSpecifier","fill","align","symbol","zero","comma","precision","prefixExponent","defaultLocale_locale","defaultLocale_format","defaultLocale_formatPrefix","formatTrim","formatRounded","formatTypes","%","toPrecision","X","d3_format_src_identity","prefixes","src_locale","grouping","thousands","substring","currency","decimal","numerals","formatNumerals","percent","newFormat","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","padding","formatPrefix","defaultLocale","precisionFixed","precisionPrefix","precisionRound","adder","Adder","reset","adder_add","bv","av","math_epsilon","src_math_pi","src_math_halfPi","quarterPi","src_math_tau","math_degrees","radians","math_cos","math_sin","math_sign","haversin","noop_noop","streamGeometry","stream","streamGeometryType","streamObjectType","Feature","FeatureCollection","features","Sphere","sphere","Point","MultiPoint","LineString","streamLine","MultiLineString","Polygon","streamPolygon","MultiPolygon","GeometryCollection","geometries","closed","coordinate","lineStart","lineEnd","polygonStart","polygonEnd","area_lambda00","phi00","area_lambda0","area_cosPhi0","area_sinPhi0","src_stream","areaRingSum","areaSum","areaStream","areaRingStart","areaRingEnd","areaRing","areaPointFirst","areaPoint","lambda","phi","dLambda","sdLambda","adLambda","cosPhi","sinPhi","d3_geo_src_area","cartesian_spherical","cartesian","cartesian_cartesian","spherical","cartesianDot","cartesianCross","cartesianAddInPlace","cartesianScale","vector","cartesianNormalizeInPlace","bounds_lambda0","bounds_phi0","bounds_lambda1","bounds_phi1","bounds_lambda2","bounds_lambda00","bounds_phi00","bounds_p0","ranges","bounds_range","deltaSum","boundsStream","boundsPoint","boundsLineStart","boundsLineEnd","boundsRingPoint","boundsRingStart","boundsRingEnd","bounds_linePoint","normal","inflection","phii","lambdai","antimeridian","bounds_angle","lambda0","lambda1","rangeCompare","rangeContains","W0","W1","centroid_X0","centroid_Y0","Z0","centroid_X1","centroid_Y1","Z1","X2","Y2","Z2","centroid_lambda00","centroid_phi00","centroid_x0","centroid_y0","z0","bounds","feature","deltaMax","centroidStream","centroidPoint","centroidLineStart","centroidLineEnd","centroidRingStart","centroidRingEnd","centroidPointCartesian","centroidLinePointFirst","centroidLinePoint","centroidRingPointFirst","centroidRingPoint","cx","cy","cz","src_centroid","d3_geo_src_constant","compose","invert","rotationIdentity","rotateRadians","deltaLambda","deltaPhi","deltaGamma","rotationLambda","rotationPhiGamma","forwardRotationLambda","rotation","cosDeltaPhi","sinDeltaPhi","cosDeltaGamma","sinDeltaGamma","src_rotation","forward","circleStream","cosRadius","sinRadius","circleRadius","src_circle","center","circle","clip_buffer","lines","rejoin","pointEqual","Intersection","entry","segments","compareIntersection","startInside","clip","segment","rejoin_link","isSubject","polygonContains_sum","polygonContains","winding","phi0","sinPhi0","cosPhi0","sinPhi1","cosPhi1","phi1","absDelta","intersection","phiArc","src_clip","pointVisible","clipLine","sink","ringBuffer","ringSink","polygonStarted","pointRing","ringStart","ringEnd","clip_compareIntersection","pointLine","clean","ringSegments","validSegment","clip_antimeridian","sign0","sign1","sinLambda0Lambda1","clipAntimeridianIntersect","clip_circle","cr","smallRadius","notHemisphere","visible","intersect","two","n2","n2n2","n1n2","determinant","c1","c2","n1xn2","A","uu","polar","q1","code","c0","v00","point2","clip_line","ax","ay","clipMax","clipMin","clipRectangle","corner","comparePoint","ca","cb","x__","y__","v__","x_","y_","v_","first","activeStream","bufferStream","clipStream","linePoint","polygonInside","cleanInside","length_lambda0","length_sinPhi0","length_cosPhi0","clip_extent","cache","cacheStream","lengthSum","lengthStream","lengthPointFirst","lengthLineEnd","lengthPoint","cosDelta","src_length","distance_coordinates","distance_object","src_distance","containsObjectType","containsGeometry","containsGeometryType","containsPoint","containsLine","containsPolygon","ab","ringRadians","pointRadians","src_contains","graticuleX","graticuleY","graticule_graticule","X1","X0","Y1","Y0","DX","DY","graticule","outline","extentMajor","extentMinor","stepMajor","stepMinor","graticule10","area_x00","area_y00","area_x0","area_y0","src_interpolate","cy0","cy1","sy1","kx0","ky0","kx1","ky1","B","d3_geo_src_identity","area_areaSum","area_areaRingSum","area_areaStream","area_areaRingStart","area_areaRingEnd","area_areaPointFirst","area_areaPoint","path_area","bounds_x0","bounds_y0","bounds_x1","bounds_y1","centroid_x00","centroid_y00","path_centroid_x0","path_centroid_y0","path_bounds","path_centroid_X0","path_centroid_Y0","centroid_Z0","path_centroid_X1","path_centroid_Y1","centroid_Z1","centroid_X2","centroid_Y2","centroid_Z2","centroid_centroidStream","centroid_centroidPoint","centroid_centroidLineStart","centroid_centroidLineEnd","centroid_centroidRingStart","centroid_centroidRingEnd","centroid","centroidPointFirstLine","centroidPointLine","centroidPointFirstRing","centroidPointRing","path_centroid","PathContext","_context","_radius","pointRadius","_line","_point","lengthRing","measure_x00","measure_y00","measure_x0","measure_y0","measure_lengthSum","measure_lengthStream","measure_lengthPointFirst","measure_lengthPoint","measure","PathString","_string","string_circle","_circle","d3_geo_src_path","projection","projectionStream","contextStream","src_transform","methods","transformer","TransformStream","fit","fitBounds","clipExtent","fitExtent","fitSize","fitWidth","fitHeight","maxDepth","cosMinDistance","resample","project","delta2","resampleLineTo","phi2","lambda2","dx2","dy2","dz","lambda00","x00","y00","a00","b00","c00","resampleStream","ringPoint","resample_resample","resampleNone","transformRadians","scaleTranslateRotate","cosAlpha","sinAlpha","ai","ci","fi","projection_projection","projectionMutator","projectAt","projectResample","projectTransform","projectRotateTransform","preclip","postclip","recenter","transformRotate","clipAngle","conicProjection","parallels","conicEqualAreaRaw","cylindricalEqualAreaRaw","r0y","conicEqualArea","albers","projection_albersUsa","lower48Point","alaskaPoint","hawaiiPoint","lower48","alaska","hawaii","pointStream","albersUsa","streams","azimuthalRaw","azimuthalInvert","sc","cc","azimuthalEqualAreaRaw","cxcy","azimuthalEqualArea","azimuthalEquidistantRaw","azimuthalEquidistant","mercatorRaw","mercator","mercatorProjection","reclip","tany","conicConformalRaw","conicConformal","equirectangularRaw","equirectangular","conicEquidistantRaw","gy","nx","conicEquidistant","A1","A2","A3","A4","equalEarthRaw","l2","l6","equalEarth","gnomonicRaw","gnomonic","identity_scaleTranslate","kx","ky","tx","ty","projection_identity","reflectX","reflectY","naturalEarth1Raw","phi4","naturalEarth1","orthographicRaw","orthographic","stereographicRaw","stereographic","transverseMercatorRaw","transverseMercator","defaultSeparation","meanXReduce","maxYReduce","cluster","separation","nodeSize","previousNode","eachAfter","meanX","maxY","leafLeft","leafRight","count_count","hierarchy","childs","Node","valued","defaultChildren","eachBefore","computeHeight","copyData","ancestor","aNodes","ancestors","bNodes","leastCommonAncestor","descendants","leaves","d3_hierarchy_src_array_slice","enclose","circles","array_shuffle","enclosesWeak","encloseBasis","extendBasis","enclosesWeakAll","enclosesNot","encloseBasis2","encloseBasis3","dr","r2","r21","r3","a2","a3","c3","d3","place","intersects","siblings_Node","packEnclose","aa","sj","sk","pack","siblings","required","constantZero","d3_hierarchy_src_constant","pack_defaultRadius","src_pack","radiusLeaf","packChildren","translateChild","treemap_round","dice","src_partition","partition","positionNode","stratify_keyPrefix","preroot","ambiguous","defaultId","defaultParentId","parentId","src_stratify","stratify","nodeKey","nodeByKey","tree_defaultSeparation","nextLeft","nextRight","moveSubtree","wm","wp","change","nextAncestor","vim","TreeNode","src_tree","treeRoot","firstWalk","secondWalk","sizeNode","executeShifts","midpoint","vip","vop","vom","sip","sop","sim","som","apportion","treemap_slice","squarify_phi","squarifyRatio","ratio","nodeValue","sumValue","minValue","maxValue","newRatio","minRatio","beta","squarify","src_treemap","tile","paddingStack","paddingInner","paddingTop","paddingRight","paddingBottom","paddingLeft","treemap","paddingOuter","binary","sums","valueOffset","valueTarget","valueLeft","valueRight","xk","yk","sliceDice","treemap_resquarify","resquarify","_squarify","d3_polygon_src_area","d3_polygon_src_centroid","src_cross","lexicographicOrder","computeUpperHullIndexes","hull","sortedPoints","flippedPoints","upperIndexes","lowerIndexes","skipLeft","skipRight","d3_polygon_src_contains","inside","d3_polygon_src_length","perimeter","src_defaultSource","uniform","sourceRandomUniform","randomUniform","src_normal","sourceRandomNormal","randomNormal","mu","sigma","logNormal","sourceRandomLogNormal","randomLogNormal","irwinHall","sourceRandomIrwinHall","randomIrwinHall","bates","sourceRandomBates","randomBates","src_exponential","sourceRandomExponential","randomExponential","d3_scale_src_array_array","array_map","d3_scale_src_array_slice","implicit","unknown","band","ordinalRange","rescale","rangeRound","band_point","pointish","d3_scale_src_constant","d3_scale_src_number","deinterpolateLinear","bimap","deinterpolate","reinterpolate","d0","polymap","clamp","continuous","piecewise","deinterpolateClamp","reinterpolateClamp","src_tickFormat","linearish","nice","src_linear_linear","identity_identity","interval","log_deinterpolate","log_reinterpolate","pow10","powp","logp","log10","log2","reflect","log_log","logs","pows","pow_raise","pow_pow","pow_sqrt","quantile_quantile","invertExtent","quantiles","quantize_quantize","threshold_threshold","interval_t0","interval_t1","newInterval","floori","offseti","millisecond_millisecond","src_millisecond","durationMinute","durationWeek","second_second","getUTCSeconds","src_second","minute_minute","getMinutes","src_minute","hour_hour","getHours","src_hour","day_day","setHours","setDate","src_day","sunday","monday","tuesday","wednesday","thursday","friday","saturday","sundays","mondays","tuesdays","wednesdays","thursdays","fridays","saturdays","month_month","src_month","year_year","src_year","utcMinute","setUTCSeconds","src_utcMinute","utcMinutes","utcHour","getUTCHours","src_utcHour","utcHours","utcDay","setUTCHours","setUTCDate","src_utcDay","utcDays","utcWeekday","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcSundays","utcMondays","utcTuesdays","utcWednesdays","utcThursdays","utcFridays","utcSaturdays","utcMonth","setUTCMonth","src_utcMonth","utcMonths","utcYear","src_utcYear","utcYears","localDate","H","utcDate","newYear","formatLocale","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","locale_shortWeekdays","shortDays","locale_months","locale_shortMonths","shortMonths","periodRe","formatRe","periodLookup","formatLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formatDayOfMonth","formatMicroseconds","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","formatMonthNumber","formatMinutes","Q","formatUnixTimestamp","formatUnixTimestampSeconds","formatSeconds","formatWeekdayNumberMonday","U","formatWeekNumberSunday","V","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","locale_formatYear","formatFullYear","Z","formatZone","formatLiteralPercent","utcFormats","formatUTCDayOfMonth","formatUTCMicroseconds","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","formatUTCWeekNumberSunday","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","parses","parseSpecifier","parseDayOfMonth","parseMicroseconds","parseHour24","parseDayOfYear","parseMilliseconds","parseMonthNumber","parseMinutes","parseUnixTimestamp","parseUnixTimestampSeconds","parseSeconds","parseWeekdayNumberMonday","parseWeekNumberSunday","parseWeekNumberISO","parseWeekdayNumberSunday","parseWeekNumberMonday","parseYear","parseFullYear","parseLiteralPercent","pad","pads","newParse","newDate","utcFormat","utcParse","src_defaultLocale_locale","timeParse","-","0","numberRe","percentRe","requoteRe","requote","getMilliseconds","getSeconds","getUTCMilliseconds","defaultLocale_defaultLocale","isoFormat","isoParse","time_durationSecond","time_durationMinute","time_durationHour","time_durationDay","time_durationWeek","durationMonth","durationYear","time_date","time_number","formatMillisecond","formatSecond","formatMinute","formatHour","formatDay","formatWeek","formatMonth","formatYear","tickIntervals","tickInterval","src_time","utcTime","sequential","k10","diverging","k21","src_colors","category10","Accent","Dark2","Paired","Pastel1","Pastel2","Set1","Set2","Set3","ramp","scheme","BrBG_scheme","BrBG","PRGn_scheme","PRGn","PiYG_scheme","PiYG","PuOr_scheme","PuOr","RdBu_scheme","RdBu","RdGy_scheme","RdGy","RdYlBu_scheme","RdYlBu","RdYlGn_scheme","RdYlGn","Spectral_scheme","Spectral","BuGn_scheme","BuGn","BuPu_scheme","BuPu","GnBu_scheme","GnBu","OrRd_scheme","OrRd","PuBuGn_scheme","PuBuGn","PuBu_scheme","PuBu","PuRd_scheme","PuRd","RdPu_scheme","RdPu","YlGnBu_scheme","YlGnBu","YlGn_scheme","YlGn","YlOrBr_scheme","YlOrBr","YlOrRd_scheme","YlOrRd","Blues_scheme","Blues","Greens_scheme","Greens","Greys_scheme","Greys","Purples_scheme","Purples","Reds_scheme","Reds","Oranges_scheme","Oranges","sequential_multi_cubehelix","warm","cool","rainbow_c","rainbow","ts","sinebow_c","pi_1_3","pi_2_3","sinebow","viridis_ramp","viridis","magma","inferno","plasma","d3_shape_src_constant","math_abs","math_atan2","src_math_cos","src_math_max","math_min","src_math_sin","math_sqrt","src_math_epsilon","d3_shape_src_math_pi","d3_shape_src_math_halfPi","d3_shape_src_math_tau","math_asin","arcInnerRadius","innerRadius","arcOuterRadius","outerRadius","arcStartAngle","arcEndAngle","arcPadAngle","cornerTangents","rc","ox","oy","x11","y11","x10","y10","cx0","cx1","dx0","dy0","dx1","dy1","src_arc","cornerRadius","padRadius","a01","a11","a10","da0","da1","ap","rp","rc0","rc1","oc","x32","y32","arc_intersect","bx","by","kc","lc","Linear","areaStart","areaEnd","curve_linear","point_x","point_y","src_line","defined","curve","defined0","d3_shape_src_area","x0z","y0z","arealine","lineX0","lineY0","lineY1","lineX1","src_descending","d3_shape_src_identity","src_pie","pie","arcs","pa","curveRadialLinear","curveRadial","Radial","_curve","lineRadial","src_lineRadial","areaRadial","lineStartAngle","lineEndAngle","lineInnerRadius","lineOuterRadius","pointRadial","d3_shape_src_array_slice","linkSource","linkTarget","link_link","curveHorizontal","curveVertical","link_curveRadial","linkHorizontal","linkVertical","linkRadial","symbol_circle","draw","symbol_cross","tan30","tan30_2","diamond","kr","star_kx","star_ky","star","square","sqrt3","triangle","wye_s","wye_k","wye_a","wye","symbols","src_symbol","d3_shape_src_noop","basis_point","Basis","curve_basis","BasisClosed","_x2","_x3","_x4","_y2","_y3","_y4","curve_basisClosed","BasisOpen","basisOpen","Bundle","_basis","_beta","curve_bundle","bundle","cardinal_point","_k","Cardinal","tension","cardinal","CardinalClosed","_x5","_y5","cardinalClosed","CardinalOpen","cardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","_l23_2a","CatmullRom","_alpha","x23","y23","curve_catmullRom","catmullRom","CatmullRomClosed","catmullRomClosed","CatmullRomOpen","catmullRomOpen","LinearClosed","linearClosed","monotone_sign","slope3","h0","h1","slope2","monotone_point","MonotoneX","MonotoneY","ReflectContext","monotoneX","monotoneY","Natural","controlPoints","_t0","px","py","natural","Step","_t","curve_step","stepBefore","stepAfter","offset_none","series","order_none","stackValue","src_stack","oz","kz","sz","sij","ki","si","expand","offset_diverging","yn","silhouette","wiggle","s2","sij0","s3","order_ascending","ascending_sum","order_descending","insideOut","tops","bottoms","order_reverse","d3_voronoi_src_constant","src_point_x","src_point_y","RedBlackTree","RedBlackNode","R","P","RedBlackRotateLeft","RedBlackRotateRight","RedBlackFirst","after","grandpa","uncle","sibling","src_RedBlackTree","createEdge","edge","Diagram_edges","setEdgeEnd","cells","halfedges","createBorderEdge","vertex","clipEdge","connectEdge","fm","fb","lx","ly","rx","ry","cellHalfedgeAngle","cell","site","va","vb","cellHalfedgeStart","cellHalfedgeEnd","firstCircle","circlePool","Circle","attachCircle","lArc","rArc","lSite","cSite","rSite","Diagram_epsilon2","ha","hc","Diagram_circles","detachCircle","beachPool","Beach","createBeach","beach","detachBeach","beaches","removeBeach","disappearing","Diagram_epsilon","iArc","nArcs","addBeach","dxl","dxr","directrix","leftBreakPoint","rightBreakPoint","createCell","newArc","hb","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","lexicographic","Diagram","sites","sortCellHalfedges","clipEdges","iCell","iHalfedge","nHalfedges","startX","startY","endX","endY","nCells","dc","v01","v11","v10","clipCells","edges","triangles","_found","src_voronoi","voronoi","d3_zoom_src_constant","ZoomEvent","Transform","applyX","applyY","location","invertX","invertY","rescaleX","rescaleY","transform_identity","transform_transform","__zoom","src_noevent_nopropagation","d3_zoom_src_noevent","zoom_defaultFilter","zoom_defaultExtent","SVGElement","clientWidth","clientHeight","defaultTransform","defaultWheelDelta","deltaY","deltaMode","zoom_defaultTouchable","defaultConstrain","translateExtent","d3_zoom_src_zoom","touchstarting","constrain","wheelDelta","scaleExtent","touchDelay","wheelDelay","zoom","wheeled","dblclicked","Gesture","wheel","k1","touch0","touch1","l0","l1","dp","dl","collection","scaleBy","scaleTo","translateBy","translateTo","__webpack_exports__","process","$V0","$V1","$V2","$V3","$V4","$V5","$V6","$V7","$V8","$V9","$Va","$Vb","$Vc","$Vd","$Ve","$Vf","$Vg","$Vh","$Vi","$Vj","$Vk","$Vl","trace","symbols_","SPACE","NL","SD","statement","participant","actor","AS","restOfLine","signal","activate","deactivate","note_statement","title","text2","loop","opt","alt","else_sections","par","par_sections","and","else","note","placement","over","actor_pair","spaceList",",","left_of","right_of","signaltype","+","ACTOR","SOLID_OPEN_ARROW","DOTTED_OPEN_ARROW","SOLID_ARROW","DOTTED_ARROW","SOLID_CROSS","DOTTED_CROSS","TXT","$accept","$end","terminals_","2","4","5","6","10","12","13","15","16","18","20","21","22","23","25","27","28","29","31","34","35","36","38","39","40","41","42","43","44","45","46","47","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","description","signalType","LINETYPE","ACTIVE_START","ACTIVE_END","loopText","LOOP_START","LOOP_END","optText","OPT_START","OPT_END","altText","ALT_START","ALT_END","parText","PAR_START","PAR_END","PAR_AND","ALT_ELSE","PLACEMENT","OVER","LEFTOF","RIGHTOF","SOLID_OPEN","DOTTED_OPEN","SOLID","DOTTED","table","3","1","7","8","9","11","14","17","19","37","30","24","26","32","defaultActions","74","75","76","81","82","83","84","85","parseError","str","hash","recoverable","tstack","vstack","lstack","recovering","lexer","sharedState","setInput","yylloc","yyloc","options","getPrototypeOf","preErrorSymbol","action","newState","expected","yyval","lex","errStr","showPosition","loc","first_line","last_line","first_column","last_column","_input","_more","_backtrack","done","conditionStack","ch","unput","oldLines","more","backtrack_lexer","less","pastInput","upcomingInput","pre","test_match","indexed_rule","backup","tempMatch","rules","_currentRules","flex","begin","condition","popState","conditions","topState","pushState","stateStackSize","case-insensitive","yy_","$avoiding_name_collisions","YY_START","LINE","inclusive","ALIAS","ID","INITIAL","Parser","main","require","readFileSync","normalize","global","LARGE_ARRAY_SIZE","CORE_ERROR_TEXT","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","PLACEHOLDER","CLONE_DEEP_FLAG","CLONE_FLAT_FLAG","CLONE_SYMBOLS_FLAG","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","WRAP_BIND_FLAG","WRAP_BIND_KEY_FLAG","WRAP_CURRY_BOUND_FLAG","WRAP_CURRY_FLAG","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","WRAP_FLIP_FLAG","DEFAULT_TRUNC_LENGTH","DEFAULT_TRUNC_OMISSION","HOT_COUNT","HOT_SPAN","LAZY_FILTER_FLAG","LAZY_MAP_FLAG","INFINITY","MAX_SAFE_INTEGER","MAX_INTEGER","NAN","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","HALF_MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","asyncTag","boolTag","dateTag","domExcTag","errorTag","funcTag","genTag","mapTag","numberTag","nullTag","objectTag","proxyTag","regexpTag","setTag","stringTag","symbolTag","undefinedTag","weakMapTag","weakSetTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrim","reTrimStart","reTrimEnd","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsBreakRange","rsMathOpRange","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","reOptMod","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","\\","'","\n","\r","
","
","freeParseFloat","freeParseInt","freeGlobal","freeSelf","freeExports","nodeType","freeModule","moduleExports","freeProcess","nodeUtil","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","thisArg","arrayAggregator","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","baseTimes","baseUnary","baseValues","props","cacheHas","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","deburrLetter","À","Á","Â","Ã","Ä","Å","à","á","â","ã","ä","å","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","Ö","Ø","ò","ó","ô","õ","ö","ø","Ù","Ú","Û","Ü","ù","ú","û","ü","Ý","ý","ÿ","Æ","æ","Þ","þ","ß","Ā","Ă","Ą","ā","ă","ą","Ć","Ĉ","Ċ","Č","ć","ĉ","ċ","č","Ď","Đ","ď","đ","Ē","Ĕ","Ė","Ę","Ě","ē","ĕ","ė","ę","ě","Ĝ","Ğ","Ġ","Ģ","ĝ","ğ","ġ","ģ","Ĥ","Ħ","ĥ","ħ","Ĩ","Ī","Ĭ","Į","İ","ĩ","ī","ĭ","į","ı","Ĵ","ĵ","Ķ","ķ","ĸ","Ĺ","Ļ","Ľ","Ŀ","Ł","ĺ","ļ","ľ","ŀ","ł","Ń","Ņ","Ň","Ŋ","ń","ņ","ň","ŋ","Ō","Ŏ","Ő","ō","ŏ","ő","Ŕ","Ŗ","Ř","ŕ","ŗ","ř","Ś","Ŝ","Ş","Š","ś","ŝ","ş","š","Ţ","Ť","Ŧ","ţ","ť","ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","ũ","ū","ŭ","ů","ű","ų","Ŵ","ŵ","Ŷ","ŷ","Ÿ","Ź","Ż","Ž","ź","ż","ž","IJ","ij","Œ","œ","ʼn","ſ","escapeHtmlChar","&","<",">","\"","escapeStringChar","chr","hasUnicode","mapToArray","overArg","replaceHolders","placeholder","setToArray","setToPairs","stringSize","unicodeSize","stringToArray","unicodeToArray","asciiToArray","unescapeHtmlChar","&","<",">",""","'","runInContext","uid","pick","String","arrayProto","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Uint8Array","allocUnsafe","getPrototype","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","getNative","ctxClearTimeout","ctxNow","ctxSetTimeout","nativeCeil","nativeFloor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","nativeNow","nativeParseInt","nativeRandom","nativeReverse","DataView","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","ListCache","MapCache","SetCache","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","configurable","writable","baseAt","paths","skip","upper","baseClone","bitmask","customizer","isDeep","isFlat","isFull","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","regexp","Ctor","cloneArrayBuffer","dataView","byteOffset","byteLength","cloneDataView","cloneTypedArray","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","includes","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","escape","evaluate","variable","imports","getMapData","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","baseGet","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","baseHas","baseHasIn","baseIntersection","othLength","othIndex","caches","maxLength","seen","baseInvoke","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","baseIsNative","baseIteratee","baseMatchesProperty","baseMatches","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","comparer","baseSortBy","criteria","objCriteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","basePullAt","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","methodName","trailing","createCompounder","words","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","countHolders","newHolders","createRecurry","arrLength","oldArray","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","toInteger","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrValue","flatten","otherFunc","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","ctorString","isMaskable","stubFalse","otherArgs","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","quote","subString","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","mapped","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","unzipWith","without","xor","xorBy","xorWith","zipWith","chain","interceptor","wrapperAt","countBy","findLast","forEachRight","groupBy","invokeMap","keyBy","sortBy","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","defer","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isString","lt","lte","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invertBy","invoke","omit","basePick","toPairs","toPairsIn","camelCase","word","capitalize","upperFirst","kebabCase","lowerFirst","snakeCase","startCase","upperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","method","methodOf","mixin","overEvery","overSome","basePropertyDeep","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","minuend","subtrahend","castArray","compact","cond","conforms","baseConforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","rest","sampleSize","setWith","sortedUniq","sortedUniqBy","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","updateWith","valuesIn","zipObject","zipObjectDeep","entriesIn","extendWith","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","escapeRegExp","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNative","isNil","isNull","isSafeInteger","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","strLength","padEnd","padStart","radix","floating","reduceRight","repeat","sample","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sumBy","template","settings","isEscaping","isEvaluating","importsKeys","importsValues","reDelimiters","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","times","toLower","toSafeInteger","toUpper","trimEnd","trimStart","truncate","omission","search","newEnd","unescape","uniqueId","eachRight","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","getView","iterLength","takeCount","iterIndex","commit","wrapped","webpackPolyfill","gantt","axisFormat","section","taskTxt","taskData","setDateFormat","setAxisFormat","setTitle","addSection","addTask","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","nextTick","browser","env","versions","addListener","off","removeListener","removeAllListeners","prependListener","prependOnceListener","cwd","chdir","umask","mermaidDoc","graphConfig","CLASS_DIAGRAM","statements","className","alphaNumToken","relationStatement","LABEL","classStatement","methodStatement","CLASS","STRUCT_START","members","STRUCT_STOP","MEMBER","SEPARATOR","relation","STR","relationType","lineType","AGGREGATION","EXTENSION","COMPOSITION","DEPENDENCY","DOTTED_LINE","commentToken","textToken","graphCodeTokens","textNoTagsToken","TAGSTART","TAGEND","==","--","PCT","DEFAULT","MINUS","keywords","UNICODE_TEXT","NUM","ALPHA","addRelation","cleanupLabel","addMembers","id2","relationTitle1","relationTitle2","type1","type2","49","struct","default","isSubgraph","edgeToId","applyStyle","applyClass","applyTransition","graph","label","labelType","getBBox","Number","POSITIVE_INFINITY","vee","undirected","ellipse","elem","getTotalLength","class","arrowheadId","arrowhead","labelId","clusterLabelPos","labelStyle","shape","curveLinear","paddingX","paddingY","_prevWidth","_prevHeight","layout","O","minX","minY","maxX","createNodes","createClusters","createEdgeLabels","createEdgePaths","shapes","arrows","render","util","normalizeArray","allowAboveRoot","up","splitPathRe","splitPath","filename","xs","resolvedPath","resolvedAbsolute","isAbsolute","trailingSlash","relative","fromParts","toParts","samePartsLength","outputParts","sep","dirname","basename","ext","extname","Graph","alg","$Vm","$Vn","$Vo","$Vp","$Vq","$Vr","$Vs","$Vt","$Vu","$Vv","$Vw","$Vx","$Vy","$Vz","$VA","$VB","$VC","$VD","$VE","$VF","$VG","$VH","$VI","$VJ","$VK","$VL","$VM","$VN","$VO","$VP","$VQ","$VR","$VS","$VT","$VU","$VV","$VW","$VX","$VY","$VZ","$V_","$V$","$V01","$V11","$V21","$V31","$V41","$V51","$V61","$V71","$V81","$V91","$Va1","$Vb1","$Vc1","$Vd1","SEMI","GRAPH","DIR","FirstStmtSeperator","UP","DOWN","ending","endToken","spaceListNewline","verticeStatement","styleStatement","linkStyleStatement","classDefStatement","clickStatement","subgraph","alphaNum","SQS","SQE","PS","PE","(-","-)","DIAMOND_START","DIAMOND_STOP","alphaNumStatement","linkStatement","arrowText","TESTSTR","ARROW_POINT","ARROW_CIRCLE","ARROW_CROSS","ARROW_OPEN","-.","DOTTED_ARROW_POINT","DOTTED_ARROW_CIRCLE","DOTTED_ARROW_CROSS","DOTTED_ARROW_OPEN","THICK_ARROW_POINT","THICK_ARROW_CIRCLE","THICK_ARROW_CROSS","THICK_ARROW_OPEN","PIPE","commentText","STYLE","LINKSTYLE","CLASSDEF","CLICK","textNoTags","stylesOpt","HEX","INTERPOLATE","commentStatement","COMMA","styleComponent","COLON","UNIT","BRKT","DOT","PUNCTUATION","PLUS","EQUALS","MULT","TAG_START","TAG_END","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","67","71","72","73","78","80","86","88","89","90","91","92","94","95","96","97","98","99","100","101","setDirection","addSubGraph","addLink","addVertex","stroke","addClass","setClass","setClickEvent","setLink","updateLink","updateLinkInterpolate","33","66","70","77","48","79","87","useSourceMap","item","content","cssMapping","btoa","sourceMapping","sourceMap","encodeURIComponent","sourceURLs","sourceRoot","cssWithMappingToString","mediaQuery","alreadyImportedModules",":","body","OPT","COMMIT","commit_arg","BRANCH","CHECKOUT","MERGE","RESET","reset_arg","HEAD","reset_parents","CARET","setOptions","branch","checkout","DEFAULT_EDGE_NAME","GRAPH_NODE","EDGE_KEY_DELIM","opts","_isDirected","directed","_isMultigraph","multigraph","_isCompound","compound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","w_","edgeObjToId","edgeObj","_nodeCount","_edgeCount","isMultigraph","isCompound","setGraph","setDefaultNodeLabel","newDefault","nodeCount","sinks","setNodes","vs","setNode","hasNode","removeNode","removeEdge","_removeFromParentsChildList","setParent","predecessors","predsV","successors","sucsV","neighbors","preds","isLeaf","filterNodes","setEdge","findParent","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","arg0","edgeArgsToObj","freeze","hasEdge","inEdges","inV","outEdges","outV","nodeEdges","addDummyNode","simplify","asNonCompoundGraph","successorWeights","predecessorWeights","intersectRect","buildLayerMatrix","normalizeRanks","removeEmptyRanks","addBorderNode","maxRank","notime","dummy","minlen","rank","nodeRankFactor","lhs","rhs","longestPath","slack","positionX","labelpos","nodesep","edgesep","borderType","ul","findType1Conflicts","findType2Conflicts","addConflict","hasConflict","verticalAlignment","horizontalCompaction","alignCoordinates","findSmallestWidthAlignment","balance","ranksep","minRank","borderLeft","borderRight","barycenter","indegree","in","rankdir","undo","nestingRoot","borderTop","borderBottom","nestingEdge","cleanup","lim","dummyChains","lca","preorder","postorder","cutvalue","initLowLimValues","initCutValues","calcCutValue","leaveEdge","enterEdge","exchangeEdges","ranker","labelRank","edgeLabel","_prev","_sentinel","dequeue","enqueue","buckets","zeroIdx","acyclicer","forwardName","reversed","labeloffset","debugTiming","selfEdges","marginx","marginy","moment","symbolMap","numberMap","١","٢","٣","٤","٥","٦","٧","٨","٩","٠","pluralForm","plurals","pluralize","weekdaysParseExact","suffixes","relativeTimeWithPlural","num","forms","standalone","lastDigit","last2Digits","১","২","৩","৪","৫","৬","৭","৮","৯","০","༡","༢","༣","༤","༥","༦","༧","༨","༩","༠","relativeTimeWithMutation","mutationTable","softMutation","mutation","lastNumber","monthsParseExact","ll","lll","llll","plural","shortMonthsParse","longMonthsParse","affix","processRelativeTime","monthsNominativeEl","monthsGenitiveEl","momentToFormat","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","_calendarEl","monthsShortDot","monthsStrictRegex","monthsShortStrictRegex","۱","۲","۳","۴","۵","۶","۷","۸","۹","۰","numbersPast","numbersFuture","verbalNumber","monthsShortWithDots","monthsShortWithoutDots","૧","૨","૩","૪","૫","૬","૭","૮","૯","૦","१","२","३","४","५","६","७","८","९","०","weekEndings","១","២","៣","៤","៥","៦","៧","៨","៩","០","೧","೨","೩","೪","೫","೬","೭","೮","೯","೦","isUpper","eifelerRegelAppliesToNumber","firstDigit","translateSingular","special","relativeTimeWithSingular","translator","correctGrammaticalCase","wordKey","relativeTimeMr","၁","၂","၃","၄","၅","၆","၇","၈","၉","၀","੧","੨","੩","੪","੫","੬","੭","੮","੯","੦","monthsNominative","monthsSubjective","௧","௨","௩","௪","௫","௬","௭","௮","௯","௦","numbersNouns","numberNoun","hundred","ten","numberAsNoun","processHoursFunction","nominative","accusative","genitive","nounCase","PriorityQueue","weightFn","edgeFn","results","pq","vEntry","updateNeighbors","wEntry","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","visited","dfs","onStack","lowlink","cmpt","topsort","CycleException","navigation","acc","doDfs","regexAstralSymbols","regexAsciiWhitelist","regexBmpWhitelist","regexEncodeNonAscii","encodeMap","­","‌","‍","‎","⁣","⁢","⁡","‏","​","⁠","̑","⃛","⃜","\t"," "," "," "," "," "," "," "," "," "," ","  ","‾","‐","–","—","―",";","⁏","⩴","!","¡","?","¿",".","‥","…","·","‘","’","‚","‹","›","“","”","„","«","»","(",")","[","]","{","}","⌈","⌉","⌊","⌋","⦅","⦆","⦋","⦌","⦍","⦎","⦏","⦐","⦑","⦒","⦓","⦔","⦕","⦖","⟦","⟧","⟨","⟩","⟪","⟫","⟬","⟭","❲","❳","‖","§","¶","@","*","/","#","‰","‱","†","‡","•","⁃","′","″","‴","⁗","‵","⁁","`","´","˜","^","¯","˘","˙","¨","˚","˝","¸","˛","ˆ","ˇ","°","©","®","℗","℘","℞","℧","℩","←","↚","→","↛","↑","↓","↔","↮","↕","↖","↗","↘","↙","↝","↝̸","↞","↟","↠","↡","↢","↣","↤","↥","↦","↧","↩","↪","↫","↬","↭","↰","↱","↲","↳","↵","↶","↷","↺","↻","↼","↽","↾","↿","⇀","⇁","⇂","⇃","⇄","⇅","⇆","⇇","⇈","⇉","⇊","⇋","⇌","⇐","⇍","⇑","⇒","⇏","⇓","⇔","⇎","⇕","⇖","⇗","⇘","⇙","⇚","⇛","⇝","⇤","⇥","⇵","⇽","⇾","⇿","∀","∁","∂","∂̸","∃","∄","∅","∇","∈","∉","∋","∌","϶","∏","∐","∑","±","÷","×","≮","<⃒","=","≠","=⃥","⩵","≯",">⃒","¬","|","¦","−","∓","∔","⁄","∖","∗","∘","√","∝","∞","∟","∠","∠⃒","∡","∢","∣","∤","∥","∦","∧","∨","∩","∩︀","∪","∪︀","∫","∬","∭","⨌","∮","∯","∰","∱","∲","∳","∴","∵","∶","∷","∸","∺","∻","∼","≁","∼⃒","∽","∽̱","∾","∾̳","∿","≀","≂","≂̸","≃","≄","≅","≇","≆","≈","≉","≊","≋","≋̸","≌","≍","≭","≍⃒","≎","≎̸","≏","≏̸","≐","≐̸","≑","≒","≓","≔","≕","≖","≗","≙","≚","≜","≟","≡","≢","≡⃥","≤","≰","≤⃒","≥","≱","≥⃒","≦","≦̸","≧","≧̸","≨︀","≨","≩","≩︀","≪","≪̸","≪⃒","≫","≫̸","≫⃒","≬","≲","≴","≳","≵","≶","≸","≷","≹","≺","⊀","≻","⊁","≼","⋠","≽","⋡","≾","≿","≿̸","⊂","⊄","⊂⃒","⊃","⊅","⊃⃒","⊆","⊈","⊇","⊉","⊊︀","⊊","⊋︀","⊋","⊍","⊎","⊏","⊏̸","⊐","⊐̸","⊑","⋢","⊒","⋣","⊓","⊓︀","⊔","⊔︀","⊕","⊖","⊗","⊘","⊙","⊚","⊛","⊝","⊞","⊟","⊠","⊡","⊢","⊬","⊣","⊤","⊥","⊧","⊨","⊭","⊩","⊮","⊪","⊫","⊯","⊰","⊲","⋪","⊳","⋫","⊴","⋬","⊴⃒","⊵","⋭","⊵⃒","⊶","⊷","⊸","⊹","⊺","⊻","⊽","⊾","⊿","⋀","⋁","⋂","⋃","⋄","⋅","⋆","⋇","⋈","⋉","⋊","⋋","⋌","⋍","⋎","⋏","⋐","⋑","⋒","⋓","⋔","⋕","⋖","⋗","⋘","⋘̸","⋙","⋙̸","⋚︀","⋚","⋛","⋛︀","⋞","⋟","⋦","⋧","⋨","⋩","⋮","⋯","⋰","⋱","⋲","⋳","⋴","⋵","⋵̸","⋶","⋷","⋹","⋹̸","⋺","⋻","⋼","⋽","⋾","⌅","⌆","⌌","⌍","⌎","⌏","⌐","⌒","⌓","⌕","⌖","⌜","⌝","⌞","⌟","⌢","⌣","⌭","⌮","⌶","⌽","⌿","⍼","⎰","⎱","⎴","⎵","⎶","⏜","⏝","⏞","⏟","⏢","⏧","␣","─","│","┌","┐","└","┘","├","┤","┬","┴","┼","═","║","╒","╓","╔","╕","╖","╗","╘","╙","╚","╛","╜","╝","╞","╟","╠","╡","╢","╣","╤","╥","╦","╧","╨","╩","╪","╫","╬","▀","▄","█","░","▒","▓","□","▪","▫","▭","▮","▱","△","▴","▵","▸","▹","▽","▾","▿","◂","◃","◊","○","◬","◯","◸","◹","◺","◻","◼","★","☆","☎","♀","♂","♠","♣","♥","♦","♪","✓","✗","✠","✶","❘","⟈","⟉","⟵","⟶","⟷","⟸","⟹","⟺","⟼","⟿","⤂","⤃","⤄","⤅","⤌","⤍","⤎","⤏","⤐","⤑","⤒","⤓","⤖","⤙","⤚","⤛","⤜","⤝","⤞","⤟","⤠","⤣","⤤","⤥","⤦","⤧","⤨","⤩","⤪","⤳","⤳̸","⤵","⤶","⤷","⤸","⤹","⤼","⤽","⥅","⥈","⥉","⥊","⥋","⥎","⥏","⥐","⥑","⥒","⥓","⥔","⥕","⥖","⥗","⥘","⥙","⥚","⥛","⥜","⥝","⥞","⥟","⥠","⥡","⥢","⥣","⥤","⥥","⥦","⥧","⥨","⥩","⥪","⥫","⥬","⥭","⥮","⥯","⥰","⥱","⥲","⥳","⥴","⥵","⥶","⥸","⥹","⥻","⥼","⥽","⥾","⥿","⦚","⦜","⦝","⦤","⦥","⦦","⦧","⦨","⦩","⦪","⦫","⦬","⦭","⦮","⦯","⦰","⦱","⦲","⦳","⦴","⦵","⦶","⦷","⦹","⦻","⦼","⦾","⦿","⧀","⧁","⧂","⧃","⧄","⧅","⧉","⧍","⧎","⧏","⧏̸","⧐","⧐̸","⧜","⧝","⧞","⧣","⧤","⧥","⧫","⧴","⧶","⨀","⨁","⨂","⨄","⨆","⨍","⨐","⨑","⨒","⨓","⨔","⨕","⨖","⨗","⨢","⨣","⨤","⨥","⨦","⨧","⨩","⨪","⨭","⨮","⨯","⨰","⨱","⨳","⨴","⨵","⨶","⨷","⨸","⨹","⨺","⨻","⨼","⨿","⩀","⩂","⩃","⩄","⩅","⩆","⩇","⩈","⩉","⩊","⩋","⩌","⩍","⩐","⩓","⩔","⩕","⩖","⩗","⩘","⩚","⩛","⩜","⩝","⩟","⩦","⩪","⩭","⩭̸","⩮","⩯","⩰","⩰̸","⩱","⩲","⩳","⩷","⩸","⩹","⩺","⩻","⩼","⩽","⩽̸","⩾","⩾̸","⩿","⪀","⪁","⪂","⪃","⪄","⪅","⪆","⪇","⪈","⪉","⪊","⪋","⪌","⪍","⪎","⪏","⪐","⪑","⪒","⪓","⪔","⪕","⪖","⪗","⪘","⪙","⪚","⪝","⪞","⪟","⪠","⪡","⪡̸","⪢","⪢̸","⪤","⪥","⪦","⪧","⪨","⪩","⪪","⪫","⪬","⪬︀","⪭","⪭︀","⪮","⪯","⪯̸","⪰","⪰̸","⪳","⪴","⪵","⪶","⪷","⪸","⪹","⪺","⪻","⪼","⪽","⪾","⪿","⫀","⫁","⫂","⫃","⫄","⫅","⫅̸","⫆","⫆̸","⫇","⫈","⫋︀","⫋","⫌︀","⫌","⫏","⫐","⫑","⫒","⫓","⫔","⫕","⫖","⫗","⫘","⫙","⫚","⫛","⫤","⫦","⫧","⫨","⫩","⫫","⫬","⫭","⫮","⫯","⫰","⫱","⫲","⫳","⫽","⫽⃥","♭","♮","♯","¤","¢","£","¥","€","¹","½","⅓","¼","⅕","⅙","⅛","²","⅔","⅖","³","¾","⅗","⅜","⅘","⅚","⅝","⅞","𝒶","𝕒","𝔞","𝔸","𝔄","𝒜","ª","𝒷","𝕓","𝔟","𝔹","ℬ","𝔅","𝔠","𝒸","𝕔","ℭ","𝒞","ℂ","℅","𝔡","ⅆ","𝕕","𝒹","𝒟","𝔇","ⅅ","𝔻","ⅇ","ℯ","𝔢","𝕖","ℰ","𝔈","𝔼","𝔣","𝕗","𝒻","𝔉","𝔽","ℱ","ff","ffi","ffl","fi","fj","fl","ƒ","ℊ","𝕘","𝔤","𝒢","𝔾","𝔊","ǵ","𝔥","ℎ","𝒽","𝕙","ℋ","ℌ","ℍ","ℏ","𝕚","𝔦","𝒾","ⅈ","𝕀","ℐ","ℑ","𝒿","𝕛","𝔧","𝒥","𝔍","𝕁","ȷ","𝕜","𝓀","𝔨","𝒦","𝕂","𝔎","𝔩","𝓁","ℓ","𝕝","ℒ","𝔏","𝕃","𝔪","𝕞","𝓂","𝔐","𝕄","ℳ","𝔫","𝕟","𝓃","ℕ","𝒩","𝔑","№","𝕠","𝔬","ℴ","𝒪","𝔒","𝕆","º","𝔭","𝓅","𝕡","ℙ","𝔓","𝒫","𝕢","𝔮","𝓆","𝒬","𝔔","ℚ","𝔯","𝕣","𝓇","ℛ","ℜ","ℝ","𝕤","𝓈","𝔰","𝕊","𝔖","𝒮","Ⓢ","𝔱","𝓉","𝕥","𝒯","𝔗","𝕋","™","𝓊","𝕦","𝔲","𝕌","𝔘","𝒰","𝔳","𝕧","𝓋","𝔙","𝕍","𝒱","𝕨","𝓌","𝔴","𝒲","𝕎","𝔚","𝔵","𝓍","𝕩","𝕏","𝔛","𝒳","𝔶","𝓎","𝕪","𝒴","𝔜","𝕐","𝓏","𝔷","𝕫","ℨ","ℤ","𝒵","Ƶ","α","Α","β","Β","γ","Γ","δ","Δ","ε","ϵ","Ε","ϝ","Ϝ","ζ","Ζ","η","Η","θ","ϑ","Θ","ι","Ι","κ","ϰ","Κ","λ","Λ","μ","µ","Μ","ν","Ν","ξ","Ξ","ο","Ο","π","ϖ","Π","ρ","ϱ","Ρ","σ","Σ","ς","τ","Τ","υ","Υ","ϒ","φ","ϕ","Φ","χ","Χ","ψ","Ψ","ω","Ω","а","А","б","Б","в","В","г","Г","ѓ","Ѓ","д","Д","ђ","Ђ","е","Е","ё","Ё","є","Є","ж","Ж","з","З","ѕ","Ѕ","и","И","і","І","ї","Ї","й","Й","ј","Ј","к","К","ќ","Ќ","л","Л","љ","Љ","м","М","н","Н","њ","Њ","о","О","п","П","р","Р","с","С","т","Т","ћ","Ћ","у","У","ў","Ў","ф","Ф","х","Х","ц","Ц","ч","Ч","џ","Џ","ш","Ш","щ","Щ","ъ","Ъ","ы","Ы","ь","Ь","э","Э","ю","Ю","я","Я","ℵ","ℶ","ℷ","ℸ","escapeMap","regexInvalidEntity","regexInvalidRawCodePoint","regexDecode","decodeMap","aacute","Aacute","abreve","Abreve","ac","acd","acE","acirc","Acirc","acute","acy","Acy","aelig","AElig","af","afr","Afr","agrave","Agrave","alefsym","aleph","Alpha","amacr","Amacr","amalg","amp","AMP","And","andand","andd","andslope","andv","ang","ange","angmsd","angmsdaa","angmsdab","angmsdac","angmsdad","angmsdae","angmsdaf","angmsdag","angmsdah","angrt","angrtvb","angrtvbd","angsph","angst","angzarr","aogon","Aogon","aopf","Aopf","apacir","ape","apE","apid","apos","ApplyFunction","approx","approxeq","aring","Aring","ascr","Ascr","Assign","ast","asymp","asympeq","atilde","Atilde","auml","Auml","awconint","awint","backcong","backepsilon","backprime","backsim","backsimeq","Backslash","Barv","barvee","barwed","Barwed","barwedge","bbrk","bbrktbrk","bcong","bcy","Bcy","bdquo","becaus","because","Because","bemptyv","bepsi","bernou","Bernoullis","Beta","beth","between","bfr","Bfr","bigcap","bigcirc","bigcup","bigodot","bigoplus","bigotimes","bigsqcup","bigstar","bigtriangledown","bigtriangleup","biguplus","bigvee","bigwedge","bkarow","blacklozenge","blacksquare","blacktriangle","blacktriangledown","blacktriangleleft","blacktriangleright","blank","blk12","blk14","blk34","block","bne","bnequiv","bnot","bNot","bopf","Bopf","bot","bowtie","boxbox","boxdl","boxdL","boxDl","boxDL","boxdr","boxdR","boxDr","boxDR","boxh","boxH","boxhd","boxhD","boxHd","boxHD","boxhu","boxhU","boxHu","boxHU","boxminus","boxplus","boxtimes","boxul","boxuL","boxUl","boxUL","boxur","boxuR","boxUr","boxUR","boxv","boxV","boxvh","boxvH","boxVh","boxVH","boxvl","boxvL","boxVl","boxVL","boxvr","boxvR","boxVr","boxVR","bprime","breve","Breve","brvbar","bscr","Bscr","bsemi","bsim","bsime","bsol","bsolb","bsolhsub","bull","bullet","bump","bumpe","bumpE","bumpeq","Bumpeq","cacute","Cacute","cap","Cap","capand","capbrcup","capcap","capcup","capdot","CapitalDifferentialD","caps","caret","caron","Cayleys","ccaps","ccaron","Ccaron","ccedil","Ccedil","ccirc","Ccirc","Cconint","ccups","ccupssm","cdot","Cdot","cedil","Cedilla","cemptyv","cent","centerdot","CenterDot","cfr","Cfr","chcy","CHcy","check","checkmark","chi","Chi","cir","circ","circeq","circlearrowleft","circlearrowright","circledast","circledcirc","circleddash","CircleDot","circledR","circledS","CircleMinus","CirclePlus","CircleTimes","cire","cirE","cirfnint","cirmid","cirscir","ClockwiseContourIntegral","CloseCurlyDoubleQuote","CloseCurlyQuote","clubs","clubsuit","colon","Colon","colone","Colone","coloneq","commat","comp","compfn","complement","complexes","cong","congdot","Congruent","conint","Conint","ContourIntegral","copf","Copf","coprod","Coproduct","COPY","copysr","CounterClockwiseContourIntegral","crarr","Cross","cscr","Cscr","csub","csube","csup","csupe","ctdot","cudarrl","cudarrr","cuepr","cuesc","cularr","cularrp","cup","Cup","cupbrcap","cupcap","CupCap","cupcup","cupdot","cupor","cups","curarr","curarrm","curlyeqprec","curlyeqsucc","curlyvee","curlywedge","curren","curvearrowleft","curvearrowright","cuvee","cuwed","cwconint","cwint","cylcty","dagger","Dagger","daleth","darr","dArr","Darr","dash","dashv","Dashv","dbkarow","dblac","dcaron","Dcaron","dcy","Dcy","DD","ddagger","ddarr","DDotrahd","ddotseq","deg","Del","Delta","demptyv","dfisht","dfr","Dfr","dHar","dharl","dharr","DiacriticalAcute","DiacriticalDot","DiacriticalDoubleAcute","DiacriticalGrave","DiacriticalTilde","diam","Diamond","diamondsuit","diams","die","DifferentialD","digamma","disin","div","divideontimes","divonx","djcy","DJcy","dlcorn","dlcrop","dollar","dopf","Dopf","dot","Dot","DotDot","doteq","doteqdot","DotEqual","dotminus","dotplus","dotsquare","doublebarwedge","DoubleContourIntegral","DoubleDot","DoubleDownArrow","DoubleLeftArrow","DoubleLeftRightArrow","DoubleLeftTee","DoubleLongLeftArrow","DoubleLongLeftRightArrow","DoubleLongRightArrow","DoubleRightArrow","DoubleRightTee","DoubleUpArrow","DoubleUpDownArrow","DoubleVerticalBar","downarrow","Downarrow","DownArrow","DownArrowBar","DownArrowUpArrow","DownBreve","downdownarrows","downharpoonleft","downharpoonright","DownLeftRightVector","DownLeftTeeVector","DownLeftVector","DownLeftVectorBar","DownRightTeeVector","DownRightVector","DownRightVectorBar","DownTee","DownTeeArrow","drbkarow","drcorn","drcrop","dscr","Dscr","dscy","DScy","dsol","dstrok","Dstrok","dtdot","dtri","dtrif","duarr","duhar","dwangle","dzcy","DZcy","dzigrarr","eacute","Eacute","easter","ecaron","Ecaron","ecir","ecirc","Ecirc","ecolon","ecy","Ecy","eDDot","edot","eDot","Edot","ee","efDot","efr","Efr","eg","egrave","Egrave","egs","egsdot","el","Element","elinters","ell","els","elsdot","emacr","Emacr","emptyset","EmptySmallSquare","emptyv","EmptyVerySmallSquare","emsp","emsp13","emsp14","eng","ENG","ensp","eogon","Eogon","eopf","Eopf","epar","eparsl","eplus","epsi","Epsilon","epsiv","eqcirc","eqcolon","eqsim","eqslantgtr","eqslantless","Equal","equals","EqualTilde","equest","Equilibrium","equiv","equivDD","eqvparsl","erarr","erDot","escr","Escr","esdot","esim","Esim","eta","Eta","eth","ETH","euml","Euml","euro","excl","exist","Exists","expectation","exponentiale","ExponentialE","fallingdotseq","fcy","Fcy","female","ffilig","fflig","ffllig","ffr","Ffr","filig","FilledSmallSquare","FilledVerySmallSquare","fjlig","flat","fllig","fltns","fnof","fopf","Fopf","forall","ForAll","fork","forkv","Fouriertrf","fpartint","frac12","frac13","frac14","frac15","frac16","frac18","frac23","frac25","frac34","frac35","frac38","frac45","frac56","frac58","frac78","frasl","frown","fscr","Fscr","gacute","Gamma","gammad","Gammad","gap","gbreve","Gbreve","Gcedil","gcirc","Gcirc","gcy","Gcy","gdot","Gdot","ge","gE","gel","gEl","geq","geqq","geqslant","ges","gescc","gesdot","gesdoto","gesdotol","gesl","gesles","gfr","Gfr","Gg","ggg","gimel","gjcy","GJcy","gl","gla","glE","glj","gnap","gnapprox","gne","gnE","gneq","gneqq","gnsim","gopf","Gopf","grave","GreaterEqual","GreaterEqualLess","GreaterFullEqual","GreaterGreater","GreaterLess","GreaterSlantEqual","GreaterTilde","gscr","Gscr","gsim","gsime","gsiml","Gt","GT","gtcc","gtcir","gtdot","gtlPar","gtquest","gtrapprox","gtrarr","gtrdot","gtreqless","gtreqqless","gtrless","gtrsim","gvertneqq","gvnE","Hacek","hairsp","half","hamilt","hardcy","HARDcy","harr","hArr","harrcir","harrw","Hat","hbar","hcirc","Hcirc","hearts","heartsuit","hellip","hercon","hfr","Hfr","HilbertSpace","hksearow","hkswarow","hoarr","homtht","hookleftarrow","hookrightarrow","hopf","Hopf","horbar","HorizontalLine","hscr","Hscr","hslash","hstrok","Hstrok","HumpDownHump","HumpEqual","hybull","hyphen","iacute","Iacute","ic","icirc","Icirc","icy","Icy","Idot","iecy","IEcy","iexcl","iff","ifr","Ifr","igrave","Igrave","iiiint","iiint","iinfin","iiota","ijlig","IJlig","Im","imacr","Imacr","ImaginaryI","imagline","imagpart","imath","imof","imped","Implies","incare","infin","infintie","inodot","int","Int","intcal","integers","Integral","intercal","intlarhk","intprod","InvisibleComma","InvisibleTimes","iocy","IOcy","iogon","Iogon","iopf","Iopf","iota","Iota","iprod","iquest","iscr","Iscr","isin","isindot","isinE","isins","isinsv","isinv","it","itilde","Itilde","iukcy","Iukcy","iuml","Iuml","jcirc","Jcirc","jcy","Jcy","jfr","Jfr","jmath","jopf","Jopf","jscr","Jscr","jsercy","Jsercy","jukcy","Jukcy","kappa","Kappa","kappav","kcedil","Kcedil","kcy","Kcy","kfr","Kfr","kgreen","khcy","KHcy","kjcy","KJcy","kopf","Kopf","kscr","Kscr","lAarr","lacute","Lacute","laemptyv","lagran","Lambda","Lang","langd","langle","lap","Laplacetrf","laquo","larr","lArr","Larr","larrb","larrbfs","larrfs","larrhk","larrlp","larrpl","larrsim","larrtl","lat","latail","lAtail","late","lates","lbarr","lBarr","lbbrk","lbrace","lbrack","lbrke","lbrksld","lbrkslu","lcaron","Lcaron","lcedil","Lcedil","lceil","lcub","lcy","Lcy","ldca","ldquo","ldquor","ldrdhar","ldrushar","ldsh","le","lE","LeftAngleBracket","leftarrow","Leftarrow","LeftArrow","LeftArrowBar","LeftArrowRightArrow","leftarrowtail","LeftCeiling","LeftDoubleBracket","LeftDownTeeVector","LeftDownVector","LeftDownVectorBar","LeftFloor","leftharpoondown","leftharpoonup","leftleftarrows","leftrightarrow","Leftrightarrow","LeftRightArrow","leftrightarrows","leftrightharpoons","leftrightsquigarrow","LeftRightVector","LeftTee","LeftTeeArrow","LeftTeeVector","leftthreetimes","LeftTriangle","LeftTriangleBar","LeftTriangleEqual","LeftUpDownVector","LeftUpTeeVector","LeftUpVector","LeftUpVectorBar","LeftVector","LeftVectorBar","leg","lEg","leq","leqq","leqslant","les","lescc","lesdot","lesdoto","lesdotor","lesg","lesges","lessapprox","lessdot","lesseqgtr","lesseqqgtr","LessEqualGreater","LessFullEqual","LessGreater","lessgtr","LessLess","lesssim","LessSlantEqual","LessTilde","lfisht","lfloor","lfr","Lfr","lg","lgE","lHar","lhard","lharu","lharul","lhblk","ljcy","LJcy","Ll","llarr","llcorner","Lleftarrow","llhard","lltri","lmidot","Lmidot","lmoust","lmoustache","lnap","lnapprox","lne","lnE","lneq","lneqq","lnsim","loang","loarr","lobrk","longleftarrow","Longleftarrow","LongLeftArrow","longleftrightarrow","Longleftrightarrow","LongLeftRightArrow","longmapsto","longrightarrow","Longrightarrow","LongRightArrow","looparrowleft","looparrowright","lopar","lopf","Lopf","loplus","lotimes","lowast","lowbar","LowerLeftArrow","LowerRightArrow","loz","lozenge","lozf","lpar","lparlt","lrarr","lrcorner","lrhar","lrhard","lrm","lrtri","lsaquo","lscr","Lscr","lsh","Lsh","lsim","lsime","lsimg","lsqb","lsquo","lsquor","lstrok","Lstrok","Lt","ltcc","ltcir","ltdot","lthree","ltimes","ltlarr","ltquest","ltri","ltrie","ltrif","ltrPar","lurdshar","luruhar","lvertneqq","lvnE","macr","male","malt","maltese","mapsto","mapstodown","mapstoleft","mapstoup","mcomma","mcy","Mcy","mdash","mDDot","measuredangle","MediumSpace","Mellintrf","mfr","Mfr","mho","micro","midast","midcir","middot","minus","minusb","minusd","minusdu","MinusPlus","mlcp","mldr","mnplus","models","mopf","Mopf","mp","mscr","Mscr","mstpos","Mu","multimap","mumap","nabla","nacute","Nacute","nang","napE","napid","napos","napprox","natur","naturals","nbsp","nbump","nbumpe","ncap","ncaron","Ncaron","ncedil","Ncedil","ncong","ncongdot","ncup","ncy","Ncy","ndash","nearhk","nearr","neArr","nearrow","nedot","NegativeMediumSpace","NegativeThickSpace","NegativeThinSpace","NegativeVeryThinSpace","nequiv","nesear","nesim","NestedGreaterGreater","NestedLessLess","NewLine","nexist","nexists","nfr","Nfr","nge","ngE","ngeq","ngeqq","ngeqslant","nges","nGg","ngsim","ngt","nGt","ngtr","nGtv","nharr","nhArr","nhpar","ni","nis","nisd","niv","njcy","NJcy","nlarr","nlArr","nldr","nle","nlE","nleftarrow","nLeftarrow","nleftrightarrow","nLeftrightarrow","nleq","nleqq","nleqslant","nles","nless","nLl","nlsim","nlt","nLt","nltri","nltrie","nLtv","nmid","NoBreak","NonBreakingSpace","nopf","Nopf","not","Not","NotCongruent","NotCupCap","NotDoubleVerticalBar","NotElement","NotEqual","NotEqualTilde","NotExists","NotGreater","NotGreaterEqual","NotGreaterFullEqual","NotGreaterGreater","NotGreaterLess","NotGreaterSlantEqual","NotGreaterTilde","NotHumpDownHump","NotHumpEqual","notin","notindot","notinE","notinva","notinvb","notinvc","NotLeftTriangle","NotLeftTriangleBar","NotLeftTriangleEqual","NotLess","NotLessEqual","NotLessGreater","NotLessLess","NotLessSlantEqual","NotLessTilde","NotNestedGreaterGreater","NotNestedLessLess","notni","notniva","notnivb","notnivc","NotPrecedes","NotPrecedesEqual","NotPrecedesSlantEqual","NotReverseElement","NotRightTriangle","NotRightTriangleBar","NotRightTriangleEqual","NotSquareSubset","NotSquareSubsetEqual","NotSquareSuperset","NotSquareSupersetEqual","NotSubset","NotSubsetEqual","NotSucceeds","NotSucceedsEqual","NotSucceedsSlantEqual","NotSucceedsTilde","NotSuperset","NotSupersetEqual","NotTilde","NotTildeEqual","NotTildeFullEqual","NotTildeTilde","NotVerticalBar","npar","nparallel","nparsl","npart","npolint","npr","nprcue","npre","nprec","npreceq","nrarr","nrArr","nrarrc","nrarrw","nrightarrow","nRightarrow","nrtri","nrtrie","nsc","nsccue","nsce","nscr","Nscr","nshortmid","nshortparallel","nsim","nsime","nsimeq","nsmid","nspar","nsqsube","nsqsupe","nsub","nsube","nsubE","nsubset","nsubseteq","nsubseteqq","nsucc","nsucceq","nsup","nsupe","nsupE","nsupset","nsupseteq","nsupseteqq","ntgl","ntilde","Ntilde","ntlg","ntriangleleft","ntrianglelefteq","ntriangleright","ntrianglerighteq","nu","Nu","numero","numsp","nvap","nvdash","nvDash","nVdash","nVDash","nvge","nvgt","nvHarr","nvinfin","nvlArr","nvle","nvlt","nvltrie","nvrArr","nvrtrie","nvsim","nwarhk","nwarr","nwArr","nwarrow","nwnear","oacute","Oacute","oast","ocir","ocirc","Ocirc","ocy","Ocy","odash","odblac","Odblac","odiv","odot","odsold","oelig","OElig","ofcir","ofr","Ofr","ogon","ograve","Ograve","ogt","ohbar","ohm","oint","olarr","olcir","olcross","oline","olt","omacr","Omacr","omega","Omega","omicron","Omicron","omid","ominus","oopf","Oopf","opar","OpenCurlyDoubleQuote","OpenCurlyQuote","operp","oplus","or","Or","orarr","ord","orderof","ordf","ordm","origof","oror","orslope","orv","oS","oscr","Oscr","oslash","Oslash","osol","otilde","Otilde","otimes","Otimes","otimesas","ouml","Ouml","ovbar","OverBar","OverBrace","OverBracket","OverParenthesis","para","parallel","parsim","parsl","part","PartialD","pcy","Pcy","percnt","permil","perp","pertenk","pfr","Pfr","Phi","phiv","phmmat","phone","Pi","pitchfork","piv","planck","planckh","plankv","plus","plusacir","plusb","pluscir","plusdo","plusdu","pluse","PlusMinus","plusmn","plussim","plustwo","pm","Poincareplane","pointint","popf","Popf","pound","pr","Pr","prap","prcue","prE","prec","precapprox","preccurlyeq","Precedes","PrecedesEqual","PrecedesSlantEqual","PrecedesTilde","preceq","precnapprox","precneqq","precnsim","precsim","prime","Prime","primes","prnap","prnE","prnsim","prod","Product","profalar","profline","profsurf","Proportion","Proportional","propto","prsim","prurel","pscr","Pscr","psi","Psi","puncsp","qfr","Qfr","qint","qopf","Qopf","qprime","qscr","Qscr","quaternions","quatint","quest","questeq","quot","QUOT","rAarr","race","racute","Racute","radic","raemptyv","rang","Rang","rangd","rangle","raquo","rarr","rArr","Rarr","rarrap","rarrb","rarrbfs","rarrc","rarrfs","rarrhk","rarrlp","rarrpl","rarrsim","rarrtl","Rarrtl","rarrw","ratail","rAtail","rationals","rbarr","rBarr","RBarr","rbbrk","rbrace","rbrack","rbrke","rbrksld","rbrkslu","rcaron","Rcaron","rcedil","Rcedil","rceil","rcub","rcy","Rcy","rdca","rdldhar","rdquo","rdquor","rdsh","Re","real","realine","realpart","reals","reg","REG","ReverseElement","ReverseEquilibrium","ReverseUpEquilibrium","rfisht","rfloor","rfr","Rfr","rHar","rhard","rharu","rharul","Rho","rhov","RightAngleBracket","rightarrow","Rightarrow","RightArrow","RightArrowBar","RightArrowLeftArrow","rightarrowtail","RightCeiling","RightDoubleBracket","RightDownTeeVector","RightDownVector","RightDownVectorBar","RightFloor","rightharpoondown","rightharpoonup","rightleftarrows","rightleftharpoons","rightrightarrows","rightsquigarrow","RightTee","RightTeeArrow","RightTeeVector","rightthreetimes","RightTriangle","RightTriangleBar","RightTriangleEqual","RightUpDownVector","RightUpTeeVector","RightUpVector","RightUpVectorBar","RightVector","RightVectorBar","risingdotseq","rlarr","rlhar","rlm","rmoust","rmoustache","rnmid","roang","roarr","robrk","ropar","ropf","Ropf","roplus","rotimes","RoundImplies","rpar","rpargt","rppolint","rrarr","Rrightarrow","rsaquo","rscr","Rscr","rsh","Rsh","rsqb","rsquo","rsquor","rthree","rtimes","rtri","rtrie","rtrif","rtriltri","RuleDelayed","ruluhar","sacute","Sacute","sbquo","Sc","scap","scaron","Scaron","sccue","sce","scE","scedil","Scedil","scirc","Scirc","scnap","scnE","scnsim","scpolint","scsim","scy","Scy","sdot","sdotb","sdote","searhk","searr","seArr","searrow","sect","semi","seswar","setminus","setmn","sext","sfr","Sfr","sfrown","sharp","shchcy","SHCHcy","shcy","SHcy","ShortDownArrow","ShortLeftArrow","shortmid","shortparallel","ShortRightArrow","ShortUpArrow","shy","Sigma","sigmaf","sigmav","simdot","sime","simeq","simg","simgE","siml","simlE","simne","simplus","simrarr","slarr","SmallCircle","smallsetminus","smashp","smeparsl","smid","smile","smt","smte","smtes","softcy","SOFTcy","sol","solb","solbar","sopf","Sopf","spades","spadesuit","spar","sqcap","sqcaps","sqcup","sqcups","Sqrt","sqsub","sqsube","sqsubset","sqsubseteq","sqsup","sqsupe","sqsupset","sqsupseteq","squ","Square","SquareIntersection","SquareSubset","SquareSubsetEqual","SquareSuperset","SquareSupersetEqual","SquareUnion","squarf","squf","srarr","sscr","Sscr","ssetmn","ssmile","sstarf","Star","starf","straightepsilon","straightphi","strns","sub","Sub","subdot","sube","subE","subedot","submult","subne","subnE","subplus","subrarr","subset","Subset","subseteq","subseteqq","SubsetEqual","subsetneq","subsetneqq","subsim","subsub","subsup","succ","succapprox","succcurlyeq","Succeeds","SucceedsEqual","SucceedsSlantEqual","SucceedsTilde","succeq","succnapprox","succneqq","succnsim","succsim","SuchThat","Sum","sung","sup","Sup","sup1","sup2","sup3","supdot","supdsub","supe","supE","supedot","Superset","SupersetEqual","suphsol","suphsub","suplarr","supmult","supne","supnE","supplus","supset","Supset","supseteq","supseteqq","supsetneq","supsetneqq","supsim","supsub","supsup","swarhk","swarr","swArr","swarrow","swnwar","szlig","Tab","Tau","tbrk","tcaron","Tcaron","tcedil","Tcedil","tcy","Tcy","tdot","telrec","tfr","Tfr","there4","therefore","Therefore","Theta","thetasym","thetav","thickapprox","thicksim","ThickSpace","thinsp","ThinSpace","thkap","thksim","thorn","THORN","tilde","Tilde","TildeEqual","TildeFullEqual","TildeTilde","timesb","timesbar","timesd","tint","toea","topbot","topcir","topf","Topf","topfork","tosa","tprime","trade","TRADE","triangledown","triangleleft","trianglelefteq","triangleq","triangleright","trianglerighteq","tridot","trie","triminus","TripleDot","triplus","trisb","tritime","trpezium","tscr","Tscr","tscy","TScy","tshcy","TSHcy","tstrok","Tstrok","twixt","twoheadleftarrow","twoheadrightarrow","uacute","Uacute","uarr","uArr","Uarr","Uarrocir","ubrcy","Ubrcy","ubreve","Ubreve","ucirc","Ucirc","ucy","Ucy","udarr","udblac","Udblac","udhar","ufisht","ufr","Ufr","ugrave","Ugrave","uHar","uharl","uharr","uhblk","ulcorn","ulcorner","ulcrop","ultri","umacr","Umacr","uml","UnderBar","UnderBrace","UnderBracket","UnderParenthesis","Union","UnionPlus","uogon","Uogon","uopf","Uopf","uparrow","Uparrow","UpArrow","UpArrowBar","UpArrowDownArrow","updownarrow","Updownarrow","UpDownArrow","UpEquilibrium","upharpoonleft","upharpoonright","uplus","UpperLeftArrow","UpperRightArrow","upsi","Upsi","upsih","upsilon","Upsilon","UpTee","UpTeeArrow","upuparrows","urcorn","urcorner","urcrop","uring","Uring","urtri","uscr","Uscr","utdot","utilde","Utilde","utri","utrif","uuarr","uuml","Uuml","uwangle","vangrt","varepsilon","varkappa","varnothing","varphi","varpi","varpropto","varr","vArr","varrho","varsigma","varsubsetneq","varsubsetneqq","varsupsetneq","varsupsetneqq","vartheta","vartriangleleft","vartriangleright","vBar","Vbar","vBarv","vcy","Vcy","vdash","vDash","Vdash","VDash","Vdashl","Vee","veebar","veeeq","vellip","verbar","Verbar","vert","Vert","VerticalBar","VerticalLine","VerticalSeparator","VerticalTilde","VeryThinSpace","vfr","Vfr","vltri","vnsub","vnsup","vopf","Vopf","vprop","vrtri","vscr","Vscr","vsubne","vsubnE","vsupne","vsupnE","Vvdash","vzigzag","wcirc","Wcirc","wedbar","wedge","Wedge","wedgeq","weierp","wfr","Wfr","wopf","Wopf","wr","wreath","wscr","Wscr","xcap","xcirc","xcup","xdtri","xfr","Xfr","xharr","xhArr","Xi","xlarr","xlArr","xmap","xnis","xodot","xopf","Xopf","xoplus","xotime","xrarr","xrArr","xscr","Xscr","xsqcup","xuplus","xutri","xvee","xwedge","yacute","Yacute","yacy","YAcy","ycirc","Ycirc","ycy","Ycy","yen","yfr","Yfr","yicy","YIcy","yopf","Yopf","yscr","Yscr","yucy","YUcy","yuml","Yuml","zacute","Zacute","zcaron","Zcaron","zcy","Zcy","zdot","Zdot","zeetrf","ZeroWidthSpace","zeta","Zeta","zfr","Zfr","zhcy","ZHcy","zigrarr","zopf","Zopf","zscr","Zscr","zwj","zwnj","decodeMapLegacy","decodeMapNumeric","128","130","131","132","133","134","135","136","137","138","139","140","142","145","146","147","148","149","150","151","152","153","154","155","156","158","159","invalidReferenceCodePoints","stringFromCharCode","fromCharCode","propertyName","codePointToSymbol","codePoint","hexEscape","decEscape","encode","encodeEverything","useNamedReferences","allowUnsafeSymbols","escapeCodePoint","escapeBmpSymbol","decode","$1","$2","$3","$4","$5","$6","$7","$8","semicolon","decDigits","hexDigits","isAttributeValue","he","slugify","escaper","stripComments","scope","css","keyframes","parentRe","animations","animationNameRe","slug","newName","replacer","paste","charMap","replacement","customMap","_typeof","Escaper","snakeskinRgxp","stringLiterals","literals","singleComments","//","//*","//!","//#","//@","//$","multComments","/*","/**","/*!","/*#","/*@","/*$","keyArr","finalMap","_key","_key2","_key3","rgxpFlags","rgxpFlagsMap","_key4","escapeEndMap","~","escapeEndWordMap","return","yield","await","typeof","void","instanceof","delete","new","of","mix","_key5","uSRgxp","wRgxp","sRgxp","nRgxp","posRgxp","objMap","function","opt_withCommentsOrParams","opt_content","opt_snakeskin","_Escaper","isObj","Boolean","mark","withComments","cacheKey","initStr","comment","selectionStart","templateVar","filterStart","cut","rPart","_el","extWord","pasteRgxp","opt_rgxp","preserveFilter","currentChar","insideString","preserveImportant","preserve","all","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","writeNodes","writeEdges","edgeValue","write","read","components","dijkstra","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","tarjan","cmpts","weightFunc","edgeFunc","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","pri","edgeWeight","./dark/index.scss","./default/index.scss","./forest/index.scss","./neutral/index.scss","styles","LEVELS","logger","debug","info","fatal","setLogLevel","level","interpolateToCurve","defaultCurve","curveName","utils","detectType","isSubstringInArray","vertices","classes","subGraphs","tooltips","subCount","funs","ids","setTooltip","tooltip","setupToolTips","element","tooltipElem","scrollTop","getPosForId","secCount","posCrossRef","flowDb","txt","linktext","interp","defaultInterpolate","defaultStyle","getTooltip","functionName","setClickFun","linkStr","bindFunctions","getDirection","getVertices","getEdges","getClasses","prims","objs","nodeList","boolean","subGraph","getDepthFirstPos","indexNodes","indexNodes2","posCount","childPos","getSubGraphs","conf","addVertices","verticeText","vertice","classStr","styleStr","styleFromStyleArr","labelTypeStr","htmlLabels","svgLabel","tspan","radious","_shape","addEdges","cnt","edgeData","arrowheadStyle","flowRenderer","cnf","err","subG","graphlib","Render","dagreD3","question","bbox","shapeSvg","rect_left_inv_arrow","rect_right_inv_arrow","clusterRects","clusterEl","xPos","yPos","te","labels","drawRect","rectData","rectElem","drawText","textData","nText","textElem","span","textMargin","drawLabel","txtObject","labelMargin","actorCnt","getTextObj","text-anchor","getNoteRect","_drawTextCandidateFunc","byText","textAttrs","_setTextAttrs","byTspan","actorFontSize","actorFontFamily","byFo","toText","fromTextAttrsDict","textPlacement","svgDraw","drawActor","verticalPos","anchorElement","drawActivation","actorActivations","anchored","startx","starty","stopx","drawLoop","labelText","drawLoopLine","stopy","sections","boxMargin","sectionTitles","idx","insertArrowHead","insertArrowCrossHead","actors","messages","notes","addActor","old","addSignal","idFrom","idTo","messageType","NOTE","addNote","titleText","sequenceDb","addMessage","answer","getMessages","getActors","getActor","getActorKeys","getTitle","ARROWTYPE","FILLED","OPEN","param","lastTask","lastTaskID","diagramMarginX","diagramMarginY","actorMargin","boxTextMargin","noteMargin","messageMargin","mirrorActors","bottomMarginAdj","activationWidth","sequenceItems","activations","updateVal","updateBounds","_self","updateFn","_startx","_stopx","_starty","_stopy","newActivation","diagram","actorRect","stackedSize","endActivation","lastActorActivationIdx","activation","newLoop","endLoop","addSectionToLoop","getVerticalPos","bumpVerticalPos","getBounds","drawNote","forceWidth","textHeight","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","textObj","_drawLongText","drawActors","actorKeys","actorFlowVerticaBounds","sequenceRenderer","loopData","activationData","activeEnd","fromBounds","toBounds","fromIdx","toIdx","txtCenter","textWidth","rightAngles","url","arrowMarkerAbsolute","protocol","host","pathname","drawMessage","allBounds","box","useMaxWidth","extraVertForTitle","tasks","currentSection","getStartDate","prevTime","afterStatement","task","findTaskById","dt","endTime","getEndDate","durationStatement","taskCnt","parseId","idStr","rawTasks","taskDb","compileTasks","compileTask","startTime","raw","prevTask","prevTaskId","startData","processed","allProcessed","ganttDb","getAxisFormat","getTasks","allItemsPricessed","iterationCount","descr","rawTask","taskInfo","dataStr","matchFound","crit","parseData","addTaskOrg","newTask","compileData","titleTopMargin","barHeight","barGap","topPadding","rightPadding","leftPadding","gridLineStartPadding","fontSize","fontFamily","ganttRenderer","getElementById","parentElement","offsetWidth","useWidth","taskArray","timeScale","categories","catsUnfiltered","getCounts","checkUnique","pageWidth","pageHeight","theSidePad","theTopPad","xAxis","theArray","theGap","theBarHeight","theColorScale","numberSectionStyles","rectangles","secNum","taskType","drawRects","colorScale","numOccurances","prevGap","vertLabels","todayG","today","drawToday","makeGant","relations","classDb","getClass","getRelations","MembersArr","theClass","idCache","classCnt","dividerMargin","getGraphId","drawClass","classDef","addTspan","textEl","isFirst","tSpan","classInfo","titleHeight","membersLine","member","membersBox","methodsLine","classBox","classRenderer","isMultiGraph","dagre","getRelationType","lineData","lineFunction","svgPath","drawEdge","commits","branches","master","curBranch","seq","getId","isfastforwardable","currentCommit","otherCommit","upsert","newval","branchNum","getCommitsArray","commitArr","gitGraphAst","rawOptString","getOptions","otherBranch","isReachableFrom","commitRef","ref","parentCount","prettyPrint","prettyPrintCommitHistory","newCommit","nextCommit","getBranchesAsObjArray","getBranches","getCommits","getCurrentBranch","getHead","allCommitsDict","nodeSpacing","nodeFillColor","nodeStrokeWidth","nodeStrokeColor","lineStrokeWidth","branchOffset","lineColor","leftMargin","branchColors","nodeRadius","nodeLabel","apiConfig","svgDrawLine","colorIdx","lineGen","getElementCoords","coords","ctm","getCTM","svgDrawLineForCommits","fromId","toId","fromBbox","toBbox","gitGraphRenderer","ver","gitGraphParser","db","svgCreateDefs","renderCommitHistory","commitid","numCommits","renderLines","branchColor","lineDrawn","themes","mermaidAPI_i","themeName","theme","themeCSS","logLevel","startOnLoad","flowchart","sequence","git","setConf","lvl1Keys","mermaidAPI_typeof","lvl2Keys","mermaidAPI","innerTxt","encodeEntities","graphType","style1","style2","cs","font","sequenceDiagram","svgCode","decodeEntities","flowParser","sequenceParser","ganttParser","classParser","getConfig","contentLoaded","mermaid","sequenceConfig","ganttConfig","_loop"],"mappings":"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A,6CACA,mDACA,yDACA,+DACA,sEACA91B,IAAM42F,IAES2B,GAAAjB,GAAKgB,ICZTE,GAAM,IAAA/4F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA91B,IAAM42F,IAES6B,GAAAnB,GAAKkB,ICZTE,GAAM,IAAAj5F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAES+B,GAAArB,GAAKoB,ICVTE,GAAM,IAAAn5F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAESiC,GAAAvB,GAAKsB,ICVTE,GAAM,IAAAr5F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAESmC,GAAAzB,GAAKwB,ICVTE,GAAM,IAAAv5F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAESqC,GAAA3B,GAAK0B,ICVTE,GAAM,IAAAz5F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAESuC,GAAA7B,GAAK4B,ICVTE,GAAM,IAAA35F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAESyC,GAAA/B,GAAK8B,ICVTE,GAAM,IAAA75F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAES2C,GAAAjC,GAAKgC,ICVTE,GAAM,IAAA/5F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAES6C,GAAAnC,GAAKkC,ICVTE,GAAM,IAAAj6F,MAAA,GAAAq2B,OACjB,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA91B,IAAM42F,IAES+C,GAAArC,GAAKoC,ICVT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E,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,GAAI,CAAC,EAAE,EAAE,IAAIC,GAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,EAAE,KAAKC,GAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,EAAE,KAAKC,GAAI,CAAC,EAAE,KAAKC,GAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,KAAKC,GAAK,CAAC,EAAE,EAAE,GAAG,IAAIC,GAAK,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IACpsDziG,GAAS,CAACogD,MAAO,aACrB5/F,GAAI,GACJ6/F,SAAU,CAACjlF,MAAQ,EAAE28H,WAAa,EAAEC,YAAc,EAAEj1H,SAAW,EAAExC,KAAO,EAAEkgF,UAAY,EAAEiiD,KAAO,EAAExmG,QAAU,EAAEokD,MAAQ,GAAGtkD,IAAM,GAAG2mG,MAAQ,GAAGC,IAAM,GAAGC,mBAAqB,GAAGhJ,OAAS,GAAGD,SAAW,GAAGkJ,GAAK,GAAGC,KAAO,GAAGC,OAAS,GAAGC,SAAW,GAAGjhD,UAAY,GAAGkhD,iBAAmB,GAAGC,iBAAmB,GAAG54I,UAAY,GAAG64I,eAAiB,GAAGC,mBAAqB,GAAGC,kBAAoB,GAAG/K,eAAiB,GAAGgL,eAAiB,GAAGC,SAAW,GAAG/iI,KAAO,GAAG2e,IAAM,GAAGo3D,OAAS,GAAG3yC,KAAO,GAAG4/F,SAAW,GAAGC,IAAM,GAAGC,IAAM,GAAGC,GAAK,GAAGC,GAAK,GAAGC,KAAK,GAAGC,KAAK,GAAGC,cAAgB,GAAGC,aAAe,GAAGC,kBAAoB,GAAG9L,cAAgB,GAAG8B,MAAQ,GAAGiK,cAAgB,GAAGC,UAAY,GAAGC,QAAU,GAAGtK,KAAK,GAAGuK,YAAc,GAAGC,aAAe,GAAGC,YAAc,GAAGC,WAAa,GAAGC,KAAK,GAAGC,mBAAqB,GAAGC,oBAAsB,GAAGC,mBAAqB,GAAGC,kBAAoB,GAAGhL,KAAK,GAAGiL,kBAAoB,GAAGC,mBAAqB,GAAGC,kBAAoB,GAAGC,iBAAmB,GAAGC,KAAO,GAAG1L,UAAY,GAAGT,IAAM,GAAGoM,YAAc,GAAG5L,aAAe,GAAGW,SAAW,GAAGkL,MAAQ,GAAGC,UAAY,GAAGC,SAAW,GAAG9M,MAAQ,GAAG+M,MAAQ,GAAGC,WAAa,GAAG9L,gBAAkB,GAAGM,QAAU,GAAGyL,UAAY,GAAGC,IAAM,GAAGtL,IAAM,GAAGuL,YAAc,GAAGC,iBAAmB,GAAG7L,IAAM,GAAGr0H,MAAQ,GAAGmgI,MAAQ,GAAGC,eAAiB,GAAGzL,MAAQ,GAAG0L,MAAQ,GAAGC,KAAO,GAAGC,KAAO,GAAGC,IAAM,GAAGzM,gBAAkB,GAAG0M,YAAc,GAAGhM,aAAe,GAAGiM,KAAO,GAAGC,OAAS,GAAGC,KAAO,GAAGC,UAAY,GAAGC,QAAU,IAAIxqG,MAAQ,IAAI6mD,QAAU,EAAEC,KAAO,GACr8CC,WAAY,CAACC,EAAE,QAAQyE,EAAE,OAAOC,EAAE,UAAUtE,GAAG,QAAQuE,GAAG,MAAMtE,GAAG,QAAQC,GAAG,MAAMC,GAAG,SAASC,GAAG,WAAWqE,GAAG,KAAKpE,GAAG,OAAOuE,GAAG,WAAWG,GAAG,MAAM9D,GAAG,MAAM0D,GAAG,MAAMzD,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,gBAAgBC,GAAG,eAAeG,GAAG,QAAQg2C,GAAG,UAAU2L,GAAG,KAAKC,GAAG,cAAcC,GAAG,eAAeC,GAAG,cAAcC,GAAG,aAAaC,GAAG,KAAKC,GAAG,qBAAqBC,GAAG,sBAAsBC,GAAG,qBAAqBC,GAAG,oBAAoBC,GAAG,KAAKC,GAAG,oBAAoBC,GAAG,qBAAqBC,GAAG,oBAAoBC,GAAG,mBAAmBC,GAAG,OAAOC,GAAG,MAAMC,GAAG,QAAQC,GAAG,YAAYC,GAAG,WAAWv/C,GAAG,QAAQC,GAAG,QAAQu/C,GAAG,UAAUC,GAAG,MAAMt/C,GAAG,MAAMC,GAAG,cAAcE,GAAG,MAAMo/C,GAAG,QAAQC,GAAG,QAAQC,GAAG,QAAQC,GAAG,OAAOC,GAAG,OAAOC,GAAG,MAAMC,GAAG,cAAcC,GAAG,eAAeC,GAAG,OAAOC,GAAG,SAASC,GAAG,OAAOC,GAAG,YAAYC,IAAI,UAAUC,IAAI,SAC10B5jD,aAAc,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG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AAA,SAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,SAAAC,KAAA,UAAAC,IAAA,QAAAC,IAAA,SAAAC,KAAA,UAAAC,IAAA,SAAAC,IAAA,OAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,UAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,KAAAC,KAAA,MAAAC,IAAA,KAAAC,KAAA,MAAAC,KAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,KAAA,OAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,UAAAC,KAAA,WAAAC,IAAA,UAAAC,IAAA,UAAAC,IAAA,QAAAC,KAAA,SAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,UAAAC,IAAA,UAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,OAAAC,IAAA,WAAAC,IAAA,WAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,QAAAC,IA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,OAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,KAAAC,IAAA,QAAAC,IAAA,KAAAC,IAAA,KAAAC,IAAA,KAAAC,IAAA,KAAAC,IAAA,KAAAC,IAAA,UAAAC,IAAA,UAAAC,IAAA,KAAAC,IAAA,MAAAC,IAAA,KAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,SAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,UAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,QAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,SAAAC,IAAA,SAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,QAAAC,IAAA,QAAAC,IAAA,MAAAC,IAAA,MAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,OAAAC,IAAA,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GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,aAAA,GACAC,gBAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,UAAA,GACAC,aAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,UAAA,IACAC,aAAA,IACAC,OAAA,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A,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,KAAAC,IAAA,KACAC,IAAA,KAAAC,IAAA,KACAC,IAAA,KAEAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA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IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,KAAAC,IAAA,KACAC,IAAA,KAAAC,IAAA,KACAC,IAAA,KAEAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,I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,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,KAAAC,IAAA,KACAC,IAAA,KAAAC,IAAA,KACAC,IAAA,KAEAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,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","file":"mermaid.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mermaid\"] = factory();\n\telse\n\t\troot[\"mermaid\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 177);\n","//! moment.js\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return (Object.getOwnPropertyNames(obj).length === 0);\n } else {\n var k;\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.weekdayMismatch &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // ALIASES\n\n addUnitAlias('year', 'y');\n\n // PRIORITIES\n\n addUnitPriority('year', 1);\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid() && !isNaN(value)) {\n if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n }\n\n // MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function mod(n, x) {\n return ((n % x) + x) % x;\n }\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // ALIASES\n\n addUnitAlias('month', 'M');\n\n // PRIORITY\n\n addUnitPriority('month', 8);\n\n // PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n // PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n // PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 6th is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n // PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // ALIASES\n\n addUnitAlias('hour', 'h');\n\n // PRIORITY\n addUnitPriority('hour', 13);\n\n // PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n // MOMENTS\n\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n // internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n else {\n if ((typeof console !== 'undefined') && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from beginning of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to beginning of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n // iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n // date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n var result = [\n untruncateYear(yearStr),\n defaultLocaleMonthsShort.indexOf(monthStr),\n parseInt(dayStr, 10),\n parseInt(hourStr, 10),\n parseInt(minuteStr, 10)\n ];\n\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n\n return result;\n }\n\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n\n var obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60\n };\n\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10);\n var m = hm % 100, h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i));\n if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n var isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n var localFrom = isMoment(from) ? from : createLocal(from),\n localTo = isMoment(to) ? to : createLocal(to);\n if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n return false;\n }\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input, units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input, units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n switch (units) {\n case 'year': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true;\n var m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n // PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n // PRIORITY\n\n addUnitPriority('quarter', 7);\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // ALIASES\n\n addUnitAlias('date', 'D');\n\n // PRIORITY\n addUnitPriority('date', 9);\n\n // PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n // PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // ALIASES\n\n addUnitAlias('minute', 'm');\n\n // PRIORITY\n\n addUnitPriority('minute', 14);\n\n // PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // ALIASES\n\n addUnitAlias('second', 's');\n\n // PRIORITY\n\n addUnitPriority('second', 15);\n\n // PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n // ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n // PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n // MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n // TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function clone$1 () {\n return createDuration(this);\n }\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n }\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // Side effect imports\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n // Side effect imports\n\n\n hooks.version = '2.23.0';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // \n DATE: 'YYYY-MM-DD', // \n TIME: 'HH:mm', // \n TIME_SECONDS: 'HH:mm:ss', // \n TIME_MS: 'HH:mm:ss.SSS', // \n WEEK: 'GGGG-[W]WW', // \n MONTH: 'YYYY-MM' // \n };\n\n return hooks;\n\n})));\n","export var name = \"d3\";\nexport var version = \"5.7.0\";\nexport var description = \"Data-Driven Documents\";\nexport var keywords = [\"dom\",\"visualization\",\"svg\",\"animation\",\"canvas\"];\nexport var homepage = \"https://d3js.org\";\nexport var license = \"BSD-3-Clause\";\nexport var author = {\"name\":\"Mike Bostock\",\"url\":\"https://bost.ocks.org/mike\"};\nexport var main = \"dist/d3.node.js\";\nexport var unpkg = \"dist/d3.min.js\";\nexport var jsdelivr = \"dist/d3.min.js\";\nexport var module = \"index.js\";\nexport var repository = {\"type\":\"git\",\"url\":\"https://github.com/d3/d3.git\"};\nexport var scripts = {\"pretest\":\"rimraf dist && mkdir dist && json2module package.json > dist/package.js && node rollup.node\",\"test\":\"tape 'test/**/*-test.js'\",\"prepublishOnly\":\"yarn test && rollup -c\",\"postpublish\":\"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \\\"d3 ${npm_package_version}\\\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \\\"${npm_package_version}\\\" && git tag -am \\\"${npm_package_version}\\\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js\"};\nexport var devDependencies = {\"json2module\":\"0.0\",\"rimraf\":\"2\",\"rollup\":\"0.64\",\"rollup-plugin-ascii\":\"0.0\",\"rollup-plugin-node-resolve\":\"3\",\"rollup-plugin-terser\":\"1\",\"tape\":\"4\"};\nexport var dependencies = {\"d3-array\":\"1\",\"d3-axis\":\"1\",\"d3-brush\":\"1\",\"d3-chord\":\"1\",\"d3-collection\":\"1\",\"d3-color\":\"1\",\"d3-contour\":\"1\",\"d3-dispatch\":\"1\",\"d3-drag\":\"1\",\"d3-dsv\":\"1\",\"d3-ease\":\"1\",\"d3-fetch\":\"1\",\"d3-force\":\"1\",\"d3-format\":\"1\",\"d3-geo\":\"1\",\"d3-hierarchy\":\"1\",\"d3-interpolate\":\"1\",\"d3-path\":\"1\",\"d3-polygon\":\"1\",\"d3-quadtree\":\"1\",\"d3-random\":\"1\",\"d3-scale\":\"2\",\"d3-scale-chromatic\":\"1\",\"d3-selection\":\"1\",\"d3-shape\":\"1\",\"d3-time\":\"1\",\"d3-time-format\":\"2\",\"d3-timer\":\"1\",\"d3-transition\":\"1\",\"d3-voronoi\":\"1\",\"d3-zoom\":\"1\"};\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","export default function(array, f) {\n if (f == null) f = pair;\n var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = f(p, p = array[++i]);\n return pairs;\n}\n\nexport function pair(a, b) {\n return [a, b];\n}\n","import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(x) {\n return x === null ? NaN : +x;\n}\n","import number from \"./number\";\n\nexport default function(values, valueof) {\n var n = values.length,\n m = 0,\n i = -1,\n mean = 0,\n value,\n delta,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) {\n delta = value - mean;\n mean += delta / ++m;\n sum += delta * (value - mean);\n }\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\n delta = value - mean;\n mean += delta / ++m;\n sum += delta * (value - mean);\n }\n }\n }\n\n if (m > 1) return sum / (m - 1);\n}\n","import variance from \"./variance\";\n\nexport default function(array, f) {\n var v = variance(array, f);\n return v ? Math.sqrt(v) : v;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n return [min, max];\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return x;\n}\n","export default function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n","import {slice} from \"./array\";\nimport bisect from \"./bisect\";\nimport constant from \"./constant\";\nimport extent from \"./extent\";\nimport identity from \"./identity\";\nimport range from \"./range\";\nimport {tickStep} from \"./ticks\";\nimport sturges from \"./threshold/sturges\";\n\nexport default function() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n var i,\n n = data.length,\n x,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n tz = tickStep(x0, x1, tz);\n tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n }\n\n // Remove any thresholds outside the domain.\n var m = tz.length;\n while (tz[0] <= x0) tz.shift(), --m;\n while (tz[m - 1] > x1) tz.pop(), --m;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n for (i = 0; i < n; ++i) {\n x = values[i];\n if (x0 <= x && x <= x1) {\n bins[bisect(tz, x, 0, m)].push(data[i]);\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n };\n\n return histogram;\n}\n","import number from \"./number\";\n\nexport default function(values, p, valueof) {\n if (valueof == null) valueof = number;\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n","import {map} from \"../array\";\nimport ascending from \"../ascending\";\nimport number from \"../number\";\nimport quantile from \"../quantile\";\n\nexport default function(values, min, max) {\n values = map.call(values, number).sort(ascending);\n return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n}\n","import deviation from \"../deviation\";\n\nexport default function(values, min, max) {\n return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n return max;\n}\n","import number from \"./number\";\n\nexport default function(values, valueof) {\n var n = values.length,\n m = n,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) sum += value;\n else --m;\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;\n else --m;\n }\n }\n\n if (m) return sum / m;\n}\n","import ascending from \"./ascending\";\nimport number from \"./number\";\nimport quantile from \"./quantile\";\n\nexport default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n numbers = [];\n\n if (valueof == null) {\n while (++i < n) {\n if (!isNaN(value = number(values[i]))) {\n numbers.push(value);\n }\n }\n }\n\n else {\n while (++i < n) {\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\n numbers.push(value);\n }\n }\n }\n\n return quantile(numbers.sort(ascending), 0.5);\n}\n","export default function(arrays) {\n var n = arrays.length,\n m,\n i = -1,\n j = 0,\n merged,\n array;\n\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n\n return merged;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n return min;\n}\n","export default function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n}\n","import ascending from \"./ascending\";\n\nexport default function(values, compare) {\n if (!(n = values.length)) return;\n var n,\n i = 0,\n j = 0,\n xi,\n xj = values[j];\n\n if (compare == null) compare = ascending;\n\n while (++i < n) {\n if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {\n xj = xi, j = i;\n }\n }\n\n if (compare(xj, xj) === 0) return j;\n}\n","export default function(array, i0, i1) {\n var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0];\n array[m + i0] = array[i + i0];\n array[i + i0] = t;\n }\n\n return array;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n }\n }\n\n else {\n while (++i < n) {\n if (value = +valueof(values[i], i, values)) sum += value;\n }\n }\n\n return sum;\n}\n","import min from \"./min\";\n\nexport default function(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n}\n\nfunction length(d) {\n return d.length;\n}\n","import transpose from \"./transpose\";\n\nexport default function() {\n return transpose(arguments);\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return x;\n}\n","import {slice} from \"./array\";\nimport identity from \"./identity\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + (x + 0.5) + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + (y + 0.5) + \")\";\n}\n\nfunction number(scale) {\n return function(d) {\n return +scale(d);\n };\n}\n\nfunction center(scale) {\n var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n if (scale.round()) offset = Math.round(offset);\n return function(d) {\n return +scale(d) + offset;\n };\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + 0.5,\n range1 = +range[range.length - 1] + 0.5,\n position = (scale.bandwidth ? center : number)(scale.copy()),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient == right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d)); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = slice.call(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","var noop = {value: function() {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n}\n","import namespace from \"./namespace\";\nimport {xhtml} from \"./namespaces\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","var matcher = function(selector) {\n return function() {\n return this.matches(selector);\n };\n};\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!element.matches) {\n var vendorMatches = element.webkitMatchesSelector\n || element.msMatchesSelector\n || element.mozMatchesSelector\n || element.oMatchesSelector;\n matcher = function(selector) {\n return function() {\n return vendorMatches.call(this, selector);\n };\n };\n }\n}\n\nexport default matcher;\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index\";\nimport {EnterNode} from \"./enter\";\nimport constant from \"../constant\";\n\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = {},\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n if (keyValue in nodeByKeyValue) {\n exit[i] = node;\n } else {\n nodeByKeyValue[keyValue] = node;\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = keyPrefix + key.call(parent, data[i], i, data);\n if (node = nodeByKeyValue[keyValue]) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue[keyValue] = null;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n exit[i] = node;\n }\n }\n}\n\nexport default function(value, key) {\n if (!value) {\n data = new Array(this.size()), j = -1;\n this.each(function(d) { data[++j] = d; });\n return data;\n }\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = value.call(parent, parent && parent.__data__, j, parents),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import namespace from \"../namespace\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator\";\nimport selector from \"../selector\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);\n}\n\nfunction selection_cloneDeep() {\n return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","var filterEvents = {};\n\nexport var event = null;\n\nif (typeof document !== \"undefined\") {\n var element = document.documentElement;\n if (!(\"onmouseenter\" in element)) {\n filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n }\n}\n\nfunction filterContextListener(listener, index, group) {\n listener = contextListener(listener, index, group);\n return function(event) {\n var related = event.relatedTarget;\n if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n listener.call(this, event);\n }\n };\n}\n\nfunction contextListener(listener, index, group) {\n return function(event1) {\n var event0 = event; // Events can be reentrant (e.g., focus).\n event = event1;\n try {\n listener.call(this, this.__data__, index, group);\n } finally {\n event = event0;\n }\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, capture) {\n var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n return function(d, i, group) {\n var on = this.__on, o, listener = wrap(value, i, group);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.capture);\n this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, capture);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, capture) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n if (capture == null) capture = false;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n return this;\n}\n\nexport function customEvent(event1, listener, that, args) {\n var event0 = event;\n event1.sourceEvent = event;\n event = event1;\n try {\n return listener.apply(that, args);\n } finally {\n event = event0;\n }\n}\n","import defaultView from \"../window\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select\";\nimport selection_selectAll from \"./selectAll\";\nimport selection_filter from \"./filter\";\nimport selection_data from \"./data\";\nimport selection_enter from \"./enter\";\nimport selection_exit from \"./exit\";\nimport selection_merge from \"./merge\";\nimport selection_order from \"./order\";\nimport selection_sort from \"./sort\";\nimport selection_call from \"./call\";\nimport selection_nodes from \"./nodes\";\nimport selection_node from \"./node\";\nimport selection_size from \"./size\";\nimport selection_empty from \"./empty\";\nimport selection_each from \"./each\";\nimport selection_attr from \"./attr\";\nimport selection_style from \"./style\";\nimport selection_property from \"./property\";\nimport selection_classed from \"./classed\";\nimport selection_text from \"./text\";\nimport selection_html from \"./html\";\nimport selection_raise from \"./raise\";\nimport selection_lower from \"./lower\";\nimport selection_append from \"./append\";\nimport selection_insert from \"./insert\";\nimport selection_remove from \"./remove\";\nimport selection_clone from \"./clone\";\nimport selection_datum from \"./datum\";\nimport selection_on from \"./on\";\nimport selection_dispatch from \"./dispatch\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n merge: selection_merge,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch\n};\n\nexport default selection;\n","import {Selection} from \"./index\";\nimport selector from \"../selector\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index\";\nimport selectorAll from \"../selectorAll\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index\";\nimport matcher from \"../matcher\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","import {Selection} from \"./index\";\n\nexport default function(selection) {\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n var nodes = new Array(this.size()), i = -1;\n this.each(function() { nodes[++i] = this; });\n return nodes;\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n var size = 0;\n this.each(function() { ++size; });\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","import creator from \"../creator\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","import creator from \"./creator\";\nimport select from \"./select\";\n\nexport default function(name) {\n return select(creator(name).call(document.documentElement));\n}\n","var nextId = 0;\n\nexport default function local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n","import {event} from \"./selection/on\";\n\nexport default function() {\n var current = event, source;\n while (source = current.sourceEvent) current = source;\n return current;\n}\n","export default function(node, event) {\n var svg = node.ownerSVGElement || node;\n\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node) {\n var event = sourceEvent();\n if (event.changedTouches) event = event.changedTouches[0];\n return point(node, event);\n}\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([selector == null ? [] : selector], root);\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\n\n for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return point(node, touch);\n }\n }\n\n return null;\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node, touches) {\n if (touches == null) touches = sourceEvent().touches;\n\n for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {\n points[i] = point(node, touches[i]);\n }\n\n return points;\n}\n","import {event} from \"d3-selection\";\n\nexport function nopropagation() {\n event.stopImmediatePropagation();\n}\n\nexport default function() {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent from \"./noevent\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, true);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, true);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, true);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {\n this.target = target;\n this.type = type;\n this.subject = subject;\n this.identifier = id;\n this.active = active;\n this.x = x;\n this.y = y;\n this.dx = dx;\n this.dy = dy;\n this._ = dispatch;\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n","import {dispatch} from \"d3-dispatch\";\nimport {event, customEvent, select, mouse, touch} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag\";\nimport noevent, {nopropagation} from \"./noevent\";\nimport constant from \"./constant\";\nimport DragEvent from \"./event\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return \"ontouchstart\" in this;\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var gesture = beforestart(\"mouse\", container.apply(this, arguments), mouse, this, arguments);\n if (!gesture) return;\n select(event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\n nodrag(event.view);\n nopropagation();\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\");\n }\n\n function mousemoved() {\n noevent();\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\");\n }\n\n function mouseupped() {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent();\n gestures.mouse(\"end\");\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var touches = event.changedTouches,\n c = container.apply(this, arguments),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {\n nopropagation();\n gesture(\"start\");\n }\n }\n }\n\n function touchmoved() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent();\n gesture(\"drag\");\n }\n }\n }\n\n function touchended() {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation();\n gesture(\"end\");\n }\n }\n }\n\n function beforestart(id, container, point, that, args) {\n var p = point(container, id), s, dx, dy,\n sublisteners = listeners.copy();\n\n if (!customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\n if ((event.subject = s = subject.apply(that, args)) == null) return false;\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n return true;\n })) return;\n\n return function gesture(type) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[id] = gesture, n = active++; break;\n case \"end\": delete gestures[id], --active; // nobreak\n case \"drag\": p = point(container, id), n = active; break;\n }\n customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex3 = /^#([0-9a-f]{3})$/,\n reHex6 = /^#([0-9a-f]{6})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: function() {\n return this.rgb().hex();\n },\n toString: function() {\n return this.rgb() + \"\";\n }\n});\n\nexport default function color(format) {\n var m;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format])\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (0 <= this.r && this.r <= 255)\n && (0 <= this.g && this.g <= 255)\n && (0 <= this.b && this.b <= 255)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: function() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n },\n toString: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export var deg2rad = Math.PI / 180;\nexport var rad2deg = 180 / Math.PI;\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\n// https://beta.observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n }\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return labConvert(this).rgb();\n }\n}));\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import {basis} from \"./basis\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import constant from \"./constant\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis\";\nimport basisClosed from \"./basisClosed\";\nimport nogamma, {gamma} from \"./color\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import value from \"./value\";\n\nexport default function(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b -= a, function(t) {\n return d.setTime(a + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return a + b * t;\n };\n}\n","import value from \"./value\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import decompose, {identity} from \"./decompose\";\n\nvar cssNode,\n cssRoot,\n cssView,\n svgNode;\n\nexport function parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb\";\nimport array from \"./array\";\nimport date from \"./date\";\nimport number from \"./number\";\nimport object from \"./object\";\nimport string from \"./string\";\nimport constant from \"./constant\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : Array.isArray(b) ? array\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n","import {hue} from \"./color\";\n\nexport default function(a, b) {\n var i = hue(+a, +b);\n return function(t) {\n var x = i(t);\n return x - 360 * Math.floor(x / 360);\n };\n}\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return Math.round(a + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import number from \"../number\";\nimport {parseCss, parseSvg} from \"./parse\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var rho = Math.SQRT2,\n rho2 = 2,\n rho4 = 4,\n epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000;\n\n return i;\n}\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {lab as colorLab} from \"d3-color\";\nimport color from \"./color\";\n\nexport default function lab(start, end) {\n var l = color((start = colorLab(start)).l, (end = colorLab(end)).l),\n a = color(start.a, end.a),\n b = color(start.b, end.b),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.l = l(t);\n start.a = a(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n}\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function piecewise(interpolate, values) {\n var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);\n while (i < n) I[i] = interpolate(v, v = values[++i]);\n return function(t) {\n var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n return I[i](t - i);\n };\n}\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(function(elapsed) {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {Timer, now} from \"./timer\";\n\nexport default function(callback, delay, time) {\n var t = new Timer, total = delay;\n if (delay == null) return t.restart(callback, delay, time), t;\n delay = +delay, time = time == null ? now() : +time;\n t.restart(function tick(elapsed) {\n elapsed += total;\n t.restart(tick, total += delay, time);\n callback(elapsed);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTING) throw new Error(\"too late; already started\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n // Dispatch the interrupt event.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions. No interrupt event is dispatched\n // because the cancelled transitions never started. Note that this also\n // removes this transition from the pending list!\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(null, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n if (active) schedule.on.call(\"interrupt\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import {get, set} from \"./schedule\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {tweenValue} from \"./tween\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr\";\nimport transition_attrTween from \"./attrTween\";\nimport transition_delay from \"./delay\";\nimport transition_duration from \"./duration\";\nimport transition_ease from \"./ease\";\nimport transition_filter from \"./filter\";\nimport transition_merge from \"./merge\";\nimport transition_on from \"./on\";\nimport transition_remove from \"./remove\";\nimport transition_select from \"./select\";\nimport transition_selectAll from \"./selectAll\";\nimport transition_selection from \"./selection\";\nimport transition_style from \"./style\";\nimport transition_styleTween from \"./styleTween\";\nimport transition_text from \"./text\";\nimport transition_transition from \"./transition\";\nimport transition_tween from \"./tween\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease\n};\n","export function linear(t) {\n return +t;\n}\n","export function quadIn(t) {\n return t * t;\n}\n\nexport function quadOut(t) {\n return t * (2 - t);\n}\n\nexport function quadInOut(t) {\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index\";\nimport schedule, {get} from \"./schedule\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {get, set, init} from \"./schedule\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween\";\nimport interpolate from \"./interpolate\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttribute(name);\n value0 = this.getAttribute(name);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0, value1 = value(this);\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n value0 = this.getAttributeNS(fullname.space, fullname.local);\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + \"\"));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrTweenNS(fullname, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttributeNS(fullname.space, fullname.local, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.setAttribute(name, i(t));\n };\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {tweenValue} from \"./tween\";\nimport interpolate from \"./interpolate\";\n\nfunction styleRemove(name, interpolate) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = style(this, name),\n value1 = (this.style.removeProperty(name), style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nfunction styleRemoveEnd(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var value00,\n interpolate0;\n return function() {\n var value0 = style(this, name);\n return value0 === value1 ? null\n : value0 === value00 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var value00,\n value10,\n interpolate0;\n return function() {\n var value0 = style(this, name),\n value1 = value(this);\n if (value1 == null) value1 = (this.style.removeProperty(name), style(this, name));\n return value0 === value1 ? null\n : value0 === value00 && value1 === value10 ? interpolate0\n : interpolate0 = interpolate(value00 = value0, value10 = value1);\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleRemove(name, i))\n .on(\"end.style.\" + name, styleRemoveEnd(name))\n : this.styleTween(name, typeof value === \"function\"\n ? styleFunction(name, i, tweenValue(this, \"style.\" + name, value))\n : styleConstant(name, i, value + \"\"), priority);\n}\n","function styleTween(name, value, priority) {\n function tween() {\n var node = this, i = value.apply(node, arguments);\n return i && function(t) {\n node.style.setProperty(name, i(t), priority);\n };\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {get, init} from \"./schedule\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","var exponent = 3;\n\nexport var polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nexport var polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nexport var polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n","var pi = Math.PI,\n halfPi = pi / 2;\n\nexport function sinIn(t) {\n return 1 - Math.cos(t * halfPi);\n}\n\nexport function sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nexport function sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n","export function expIn(t) {\n return Math.pow(2, 10 * t - 10);\n}\n\nexport function expOut(t) {\n return 1 - Math.pow(2, -10 * t);\n}\n\nexport function expInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n}\n","export function circleIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n}\n\nexport function circleOut(t) {\n return Math.sqrt(1 - --t * t);\n}\n\nexport function circleInOut(t) {\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n","var b1 = 4 / 11,\n b2 = 6 / 11,\n b3 = 8 / 11,\n b4 = 3 / 4,\n b5 = 9 / 11,\n b6 = 10 / 11,\n b7 = 15 / 16,\n b8 = 21 / 22,\n b9 = 63 / 64,\n b0 = 1 / b1 / b1;\n\nexport function bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nexport function bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nexport function bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n","var overshoot = 1.70158;\n\nexport var backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return t * t * ((s + 1) * t - s);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nexport var backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((s + 1) * t + s) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nexport var backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n","var tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\n : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n","import {Transition, newId} from \"../transition/index\";\nimport schedule from \"../transition/schedule\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n return defaultTiming.time = now(), defaultTiming;\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt\";\nimport selection_transition from \"./transition\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {Transition} from \"./transition/index\";\nimport {SCHEDULED} from \"./transition/schedule\";\n\nvar root = [null];\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n i;\n\n if (schedules) {\n name = name == null ? null : name + \"\";\n for (i in schedules) {\n if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {\n return new Transition([[node]], root, name, +i);\n }\n }\n }\n\n return null;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(target, type, selection) {\n this.target = target;\n this.type = type;\n this.selection = selection;\n}\n","import {event} from \"d3-selection\";\n\nexport function nopropagation() {\n event.stopImmediatePropagation();\n}\n\nexport default function() {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {customEvent, event, mouse, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant\";\nimport BrushEvent from \"./event\";\nimport noevent, {nopropagation} from \"./noevent\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nvar X = {\n name: \"x\",\n handles: [\"e\", \"w\"].map(type),\n input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\"].map(type),\n input: function(xy) { return xy; },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n listeners = dispatch(brush, \"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\")\n .on(\"mousedown.brush touchstart.brush\", started);\n }\n\n brush.move = function(group, selection) {\n if (group.selection) {\n group\n .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && empty(selection1) ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 && selection1 ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 == null || empty(selection1) ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args) {\n return that.__brush.emitter || new Emitter(that, args);\n }\n\n function Emitter(that, args) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function() {\n if (this.starting) this.starting = false, this.emit(\"start\");\n return this;\n },\n brush: function() {\n this.emit(\"brush\");\n return this;\n },\n end: function() {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n return this;\n },\n emit: function(type) {\n customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function started() {\n if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent(); }\n else if (touchending) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx,\n dy,\n moving,\n shifting = signX && signY && event.shiftKey,\n lockX,\n lockY,\n point0 = mouse(that),\n point = point0,\n emit = emitter(that, arguments).beforestart();\n\n if (type === \"overlay\") {\n state.selection = selection = [\n [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n ];\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n group\n .on(\"touchmove.brush\", moved, true)\n .on(\"touchend.brush touchcancel.brush\", ended, true);\n } else {\n var view = select(event.view)\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n\n dragDisable(event.view);\n }\n\n nopropagation();\n interrupt(that);\n redraw.call(that);\n emit.start();\n\n function moved() {\n var point1 = mouse(that);\n if (shifting && !lockX && !lockY) {\n if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n else lockX = true;\n }\n point = point1;\n moving = true;\n noevent();\n move();\n }\n\n function move() {\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush();\n }\n }\n\n function ended() {\n nopropagation();\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n group.on(\"touchmove.brush touchend.brush touchcancel.brush\", null);\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end();\n }\n\n function keydowned() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n\n function keyupped() {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent();\n }\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = extent.apply(this, arguments);\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export var cos = Math.cos;\nexport var sin = Math.sin;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = pi * 2;\nexport var max = Math.max;\n","import {range} from \"d3-array\";\nimport {max, tau} from \"./math\";\n\nfunction compareValue(compare) {\n return function(a, b) {\n return compare(\n a.source.value + a.target.value,\n b.source.value + b.target.value\n );\n };\n}\n\nexport default function() {\n var padAngle = 0,\n sortGroups = null,\n sortSubgroups = null,\n sortChords = null;\n\n function chord(matrix) {\n var n = matrix.length,\n groupSums = [],\n groupIndex = range(n),\n subgroupIndex = [],\n chords = [],\n groups = chords.groups = new Array(n),\n subgroups = new Array(n * n),\n k,\n x,\n x0,\n dx,\n i,\n j;\n\n // Compute the sum.\n k = 0, i = -1; while (++i < n) {\n x = 0, j = -1; while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(range(n));\n k += x;\n }\n\n // Sort groups…\n if (sortGroups) groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n\n // Sort subgroups…\n if (sortSubgroups) subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n\n // Convert the sum to scaling factor for [0, 2pi].\n // TODO Allow start and end angle to be specified?\n // TODO Allow padding to be specified as percentage?\n k = max(0, tau - padAngle * n) / k;\n dx = k ? padAngle : tau / n;\n\n // Compute the start and end angle for each group and subgroup.\n // Note: Opera has a bug reordering object literal properties!\n x = 0, i = -1; while (++i < n) {\n x0 = x, j = -1; while (++j < n) {\n var di = groupIndex[i],\n dj = subgroupIndex[di][j],\n v = matrix[di][dj],\n a0 = x,\n a1 = x += v * k;\n subgroups[dj * n + di] = {\n index: di,\n subindex: dj,\n startAngle: a0,\n endAngle: a1,\n value: v\n };\n }\n groups[di] = {\n index: di,\n startAngle: x0,\n endAngle: x,\n value: groupSums[di]\n };\n x += dx;\n }\n\n // Generate chords for each (non-empty) subgroup-subgroup link.\n i = -1; while (++i < n) {\n j = i - 1; while (++j < n) {\n var source = subgroups[j * n + i],\n target = subgroups[i * n + j];\n if (source.value || target.value) {\n chords.push(source.value < target.value\n ? {source: target, target: source}\n : {source: source, target: target});\n }\n }\n }\n\n return sortChords ? chords.sort(sortChords) : chords;\n }\n\n chord.padAngle = function(_) {\n return arguments.length ? (padAngle = max(0, _), chord) : padAngle;\n };\n\n chord.sortGroups = function(_) {\n return arguments.length ? (sortGroups = _, chord) : sortGroups;\n };\n\n chord.sortSubgroups = function(_) {\n return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;\n };\n\n chord.sortChords = function(_) {\n return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;\n };\n\n return chord;\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport {cos, halfPi, sin} from \"./math\";\nimport {path} from \"d3-path\";\n\nfunction defaultSource(d) {\n return d.source;\n}\n\nfunction defaultTarget(d) {\n return d.target;\n}\n\nfunction defaultRadius(d) {\n return d.radius;\n}\n\nfunction defaultStartAngle(d) {\n return d.startAngle;\n}\n\nfunction defaultEndAngle(d) {\n return d.endAngle;\n}\n\nexport default function() {\n var source = defaultSource,\n target = defaultTarget,\n radius = defaultRadius,\n startAngle = defaultStartAngle,\n endAngle = defaultEndAngle,\n context = null;\n\n function ribbon() {\n var buffer,\n argv = slice.call(arguments),\n s = source.apply(this, argv),\n t = target.apply(this, argv),\n sr = +radius.apply(this, (argv[0] = s, argv)),\n sa0 = startAngle.apply(this, argv) - halfPi,\n sa1 = endAngle.apply(this, argv) - halfPi,\n sx0 = sr * cos(sa0),\n sy0 = sr * sin(sa0),\n tr = +radius.apply(this, (argv[0] = t, argv)),\n ta0 = startAngle.apply(this, argv) - halfPi,\n ta1 = endAngle.apply(this, argv) - halfPi;\n\n if (!context) context = buffer = path();\n\n context.moveTo(sx0, sy0);\n context.arc(0, 0, sr, sa0, sa1);\n if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?\n context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));\n context.arc(0, 0, tr, ta0, ta1);\n }\n context.quadraticCurveTo(0, 0, sx0, sy0);\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n ribbon.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), ribbon) : radius;\n };\n\n ribbon.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : startAngle;\n };\n\n ribbon.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : endAngle;\n };\n\n ribbon.source = function(_) {\n return arguments.length ? (source = _, ribbon) : source;\n };\n\n ribbon.target = function(_) {\n return arguments.length ? (target = _, ribbon) : target;\n };\n\n ribbon.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;\n };\n\n return ribbon;\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n","import map from \"./map\";\n\nexport default function() {\n var keys = [],\n sortKeys = [],\n sortValues,\n rollup,\n nest;\n\n function apply(array, depth, createResult, setResult) {\n if (depth >= keys.length) {\n if (sortValues != null) array.sort(sortValues);\n return rollup != null ? rollup(array) : array;\n }\n\n var i = -1,\n n = array.length,\n key = keys[depth++],\n keyValue,\n value,\n valuesByKey = map(),\n values,\n result = createResult();\n\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n values.push(value);\n } else {\n valuesByKey.set(keyValue, [value]);\n }\n }\n\n valuesByKey.each(function(values, key) {\n setResult(result, key, apply(values, depth, createResult, setResult));\n });\n\n return result;\n }\n\n function entries(map, depth) {\n if (++depth > keys.length) return map;\n var array, sortKey = sortKeys[depth - 1];\n if (rollup != null && depth >= keys.length) array = map.entries();\n else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n }\n\n return nest = {\n object: function(array) { return apply(array, 0, createObject, setObject); },\n map: function(array) { return apply(array, 0, createMap, setMap); },\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n key: function(d) { keys.push(d); return nest; },\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n sortValues: function(order) { sortValues = order; return nest; },\n rollup: function(f) { rollup = f; return nest; }\n };\n}\n\nfunction createObject() {\n return {};\n}\n\nfunction setObject(object, key, value) {\n object[key] = value;\n}\n\nfunction createMap() {\n return map();\n}\n\nfunction setMap(map, key, value) {\n map.set(key, value);\n}\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n","export default function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n}\n","export default function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n}\n","export default function(map) {\n var entries = [];\n for (var key in map) entries.push({key: key, value: map[key]});\n return entries;\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\n","export default function(a, b) {\n return a - b;\n}\n","export default function(ring) {\n var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n return area;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(ring, hole) {\n var i = -1, n = hole.length, c;\n while (++i < n) if (c = ringContains(ring, hole[i])) return c;\n return 0;\n}\n\nfunction ringContains(ring, point) {\n var x = point[0], y = point[1], contains = -1;\n for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];\n if (segmentContains(pi, pj, point)) return 0;\n if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;\n }\n return contains;\n}\n\nfunction segmentContains(a, b, c) {\n var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\n}\n\nfunction collinear(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nfunction within(p, q, r) {\n return p <= q && q <= r || r <= q && q <= p;\n}\n","export default function() {}\n","import {extent, thresholdSturges, tickStep, range} from \"d3-array\";\nimport {slice} from \"./array\";\nimport ascending from \"./ascending\";\nimport area from \"./area\";\nimport constant from \"./constant\";\nimport contains from \"./contains\";\nimport noop from \"./noop\";\n\nvar cases = [\n [],\n [[[1.0, 1.5], [0.5, 1.0]]],\n [[[1.5, 1.0], [1.0, 1.5]]],\n [[[1.5, 1.0], [0.5, 1.0]]],\n [[[1.0, 0.5], [1.5, 1.0]]],\n [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],\n [[[1.0, 0.5], [1.0, 1.5]]],\n [[[1.0, 0.5], [0.5, 1.0]]],\n [[[0.5, 1.0], [1.0, 0.5]]],\n [[[1.0, 1.5], [1.0, 0.5]]],\n [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],\n [[[1.5, 1.0], [1.0, 0.5]]],\n [[[0.5, 1.0], [1.5, 1.0]]],\n [[[1.0, 1.5], [1.5, 1.0]]],\n [[[0.5, 1.0], [1.0, 1.5]]],\n []\n];\n\nexport default function() {\n var dx = 1,\n dy = 1,\n threshold = thresholdSturges,\n smooth = smoothLinear;\n\n function contours(values) {\n var tz = threshold(values);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var domain = extent(values), start = domain[0], stop = domain[1];\n tz = tickStep(start, stop, tz);\n tz = range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);\n } else {\n tz = tz.slice().sort(ascending);\n }\n\n return tz.map(function(value) {\n return contour(values, value);\n });\n }\n\n // Accumulate, smooth contour rings, assign holes to exterior rings.\n // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\n function contour(values, value) {\n var polygons = [],\n holes = [];\n\n isorings(values, value, function(ring) {\n smooth(ring, values, value);\n if (area(ring) > 0) polygons.push([ring]);\n else holes.push(ring);\n });\n\n holes.forEach(function(hole) {\n for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n if (contains((polygon = polygons[i])[0], hole) !== -1) {\n polygon.push(hole);\n return;\n }\n }\n });\n\n return {\n type: \"MultiPolygon\",\n value: value,\n coordinates: polygons\n };\n }\n\n // Marching squares with isolines stitched into rings.\n // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\n function isorings(values, value, callback) {\n var fragmentByStart = new Array,\n fragmentByEnd = new Array,\n x, y, t0, t1, t2, t3;\n\n // Special case for the first row (y = -1, t2 = t3 = 0).\n x = y = -1;\n t1 = values[0] >= value;\n cases[t1 << 1].forEach(stitch);\n while (++x < dx - 1) {\n t0 = t1, t1 = values[x + 1] >= value;\n cases[t0 | t1 << 1].forEach(stitch);\n }\n cases[t1 << 0].forEach(stitch);\n\n // General case for the intermediate rows.\n while (++y < dy - 1) {\n x = -1;\n t1 = values[y * dx + dx] >= value;\n t2 = values[y * dx] >= value;\n cases[t1 << 1 | t2 << 2].forEach(stitch);\n while (++x < dx - 1) {\n t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\n cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\n }\n cases[t1 | t2 << 3].forEach(stitch);\n }\n\n // Special case for the last row (y = dy - 1, t0 = t1 = 0).\n x = -1;\n t2 = values[y * dx] >= value;\n cases[t2 << 2].forEach(stitch);\n while (++x < dx - 1) {\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\n cases[t2 << 2 | t3 << 3].forEach(stitch);\n }\n cases[t2 << 3].forEach(stitch);\n\n function stitch(line) {\n var start = [line[0][0] + x, line[0][1] + y],\n end = [line[1][0] + x, line[1][1] + y],\n startIndex = index(start),\n endIndex = index(end),\n f, g;\n if (f = fragmentByEnd[startIndex]) {\n if (g = fragmentByStart[endIndex]) {\n delete fragmentByEnd[f.end];\n delete fragmentByStart[g.start];\n if (f === g) {\n f.ring.push(end);\n callback(f.ring);\n } else {\n fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};\n }\n } else {\n delete fragmentByEnd[f.end];\n f.ring.push(end);\n fragmentByEnd[f.end = endIndex] = f;\n }\n } else if (f = fragmentByStart[endIndex]) {\n if (g = fragmentByEnd[startIndex]) {\n delete fragmentByStart[f.start];\n delete fragmentByEnd[g.end];\n if (f === g) {\n f.ring.push(end);\n callback(f.ring);\n } else {\n fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};\n }\n } else {\n delete fragmentByStart[f.start];\n f.ring.unshift(start);\n fragmentByStart[f.start = startIndex] = f;\n }\n } else {\n fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};\n }\n }\n }\n\n function index(point) {\n return point[0] * 2 + point[1] * (dx + 1) * 4;\n }\n\n function smoothLinear(ring, values, value) {\n ring.forEach(function(point) {\n var x = point[0],\n y = point[1],\n xt = x | 0,\n yt = y | 0,\n v0,\n v1 = values[yt * dx + xt];\n if (x > 0 && x < dx && xt === x) {\n v0 = values[yt * dx + xt - 1];\n point[0] = x + (value - v0) / (v1 - v0) - 0.5;\n }\n if (y > 0 && y < dy && yt === y) {\n v0 = values[(yt - 1) * dx + xt];\n point[1] = y + (value - v0) / (v1 - v0) - 0.5;\n }\n });\n }\n\n contours.contour = contour;\n\n contours.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 > 0) || !(_1 > 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, contours;\n };\n\n contours.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold;\n };\n\n contours.smooth = function(_) {\n return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear;\n };\n\n return contours;\n}\n","// TODO Optimize edge cases.\n// TODO Optimize index calculation.\n// TODO Optimize arguments.\nexport function blurX(source, target, r) {\n var n = source.width,\n m = source.height,\n w = (r << 1) + 1;\n for (var j = 0; j < m; ++j) {\n for (var i = 0, sr = 0; i < n + r; ++i) {\n if (i < n) {\n sr += source.data[i + j * n];\n }\n if (i >= r) {\n if (i >= w) {\n sr -= source.data[i - w + j * n];\n }\n target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);\n }\n }\n }\n}\n\n// TODO Optimize edge cases.\n// TODO Optimize index calculation.\n// TODO Optimize arguments.\nexport function blurY(source, target, r) {\n var n = source.width,\n m = source.height,\n w = (r << 1) + 1;\n for (var i = 0; i < n; ++i) {\n for (var j = 0, sr = 0; j < m + r; ++j) {\n if (j < m) {\n sr += source.data[i + j * n];\n }\n if (j >= r) {\n if (j >= w) {\n sr -= source.data[i + (j - w) * n];\n }\n target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);\n }\n }\n }\n}\n","import {max, range, tickStep} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {blurX, blurY} from \"./blur\";\nimport constant from \"./constant\";\nimport contours from \"./contours\";\n\nfunction defaultX(d) {\n return d[0];\n}\n\nfunction defaultY(d) {\n return d[1];\n}\n\nfunction defaultWeight() {\n return 1;\n}\n\nexport default function() {\n var x = defaultX,\n y = defaultY,\n weight = defaultWeight,\n dx = 960,\n dy = 500,\n r = 20, // blur radius\n k = 2, // log2(grid cell size)\n o = r * 3, // grid offset, to pad for blur\n n = (dx + o * 2) >> k, // grid width\n m = (dy + o * 2) >> k, // grid height\n threshold = constant(20);\n\n function density(data) {\n var values0 = new Float32Array(n * m),\n values1 = new Float32Array(n * m);\n\n data.forEach(function(d, i, data) {\n var xi = (+x(d, i, data) + o) >> k,\n yi = (+y(d, i, data) + o) >> k,\n wi = +weight(d, i, data);\n if (xi >= 0 && xi < n && yi >= 0 && yi < m) {\n values0[xi + yi * n] += wi;\n }\n });\n\n // TODO Optimize.\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\n\n var tz = threshold(values0);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var stop = max(values0);\n tz = tickStep(0, stop, tz);\n tz = range(0, Math.floor(stop / tz) * tz, tz);\n tz.shift();\n }\n\n return contours()\n .thresholds(tz)\n .size([n, m])\n (values0)\n .map(transform);\n }\n\n function transform(geometry) {\n geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.\n geometry.coordinates.forEach(transformPolygon);\n return geometry;\n }\n\n function transformPolygon(coordinates) {\n coordinates.forEach(transformRing);\n }\n\n function transformRing(coordinates) {\n coordinates.forEach(transformPoint);\n }\n\n // TODO Optimize.\n function transformPoint(coordinates) {\n coordinates[0] = coordinates[0] * Math.pow(2, k) - o;\n coordinates[1] = coordinates[1] * Math.pow(2, k) - o;\n }\n\n function resize() {\n o = r * 3;\n n = (dx + o * 2) >> k;\n m = (dy + o * 2) >> k;\n return density;\n }\n\n density.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), density) : x;\n };\n\n density.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), density) : y;\n };\n\n density.weight = function(_) {\n return arguments.length ? (weight = typeof _ === \"function\" ? _ : constant(+_), density) : weight;\n };\n\n density.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 >= 0) && !(_0 >= 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, resize();\n };\n\n density.cellSize = function(_) {\n if (!arguments.length) return 1 << k;\n if (!((_ = +_) >= 1)) throw new Error(\"invalid cell size\");\n return k = Math.floor(Math.log(_) / Math.LN2), resize();\n };\n\n density.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold;\n };\n\n density.bandwidth = function(_) {\n if (!arguments.length) return Math.sqrt(r * (r + 1));\n if (!((_ = +_) >= 0)) throw new Error(\"invalid bandwidth\");\n return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();\n };\n\n return density;\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n })).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(text) {\n return text == null ? \"\"\n : reFormat.test(text += \"\") ? \"\\\"\" + text.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : text;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatRows: formatRows\n };\n}\n","import dsv from \"./dsv\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatRows = csv.formatRows;\n","import dsv from \"./dsv\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatRows = tsv.formatRows;\n","function responseBlob(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.blob();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseBlob);\n}\n","function responseArrayBuffer(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseArrayBuffer);\n}\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","export default function(input, init) {\n return new Promise(function(resolve, reject) {\n var image = new Image;\n for (var key in init) image[key] = init[key];\n image.onerror = reject;\n image.onload = function() { resolve(image); };\n image.src = input;\n });\n}\n","function responseJson(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.json();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseJson);\n}\n","import text from \"./text\";\n\nfunction parser(type) {\n return function(input, init) {\n return text(input, init).then(function(text) {\n return (new DOMParser).parseFromString(text, type);\n });\n };\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","export default function(x, y) {\n var nodes;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x, sy += node.y;\n }\n\n for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {\n node = nodes[i], node.x -= sx, node.y -= sy;\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n return force;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function() {\n return (Math.random() - 0.5) * 1e-6;\n}\n","export default function(d) {\n var x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, inherit the existing extent.\n if (x1 < x0) x0 = this._x0, x1 = this._x1;\n if (y1 < y0) y0 = this._y0, y1 = this._y1;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else if (x0 > x || x > x1 || y0 > y || y > y1) {\n var z = x1 - x0,\n node = this._root,\n parent,\n i;\n\n switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {\n case 0: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);\n break;\n }\n case 1: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);\n break;\n }\n case 2: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);\n break;\n }\n case 3: {\n do parent = new Array(4), parent[i] = node, node = parent;\n while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);\n break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n // If the quadtree covers the point already, just return.\n else return this;\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add\";\nimport tree_cover from \"./cover\";\nimport tree_data from \"./data\";\nimport tree_extent from \"./extent\";\nimport tree_find from \"./find\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove\";\nimport tree_root from \"./root\";\nimport tree_size from \"./size\";\nimport tree_visit from \"./visit\";\nimport tree_visitAfter from \"./visitAfter\";\nimport tree_x, {defaultX} from \"./x\";\nimport tree_y, {defaultY} from \"./y\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","import constant from \"./constant\";\nimport jiggle from \"./jiggle\";\nimport {quadtree} from \"d3-quadtree\";\n\nfunction x(d) {\n return d.x + d.vx;\n}\n\nfunction y(d) {\n return d.y + d.vy;\n}\n\nexport default function(radius) {\n var nodes,\n radii,\n strength = 1,\n iterations = 1;\n\n if (typeof radius !== \"function\") radius = constant(radius == null ? 1 : +radius);\n\n function force() {\n var i, n = nodes.length,\n tree,\n node,\n xi,\n yi,\n ri,\n ri2;\n\n for (var k = 0; k < iterations; ++k) {\n tree = quadtree(nodes, x, y).visitAfter(prepare);\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n ri = radii[node.index], ri2 = ri * ri;\n xi = node.x + node.vx;\n yi = node.y + node.vy;\n tree.visit(apply);\n }\n }\n\n function apply(quad, x0, y0, x1, y1) {\n var data = quad.data, rj = quad.r, r = ri + rj;\n if (data) {\n if (data.index > node.index) {\n var x = xi - data.x - data.vx,\n y = yi - data.y - data.vy,\n l = x * x + y * y;\n if (l < r * r) {\n if (x === 0) x = jiggle(), l += x * x;\n if (y === 0) y = jiggle(), l += y * y;\n l = (r - (l = Math.sqrt(l))) / l * strength;\n node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));\n node.vy += (y *= l) * r;\n data.vx -= x * (r = 1 - r);\n data.vy -= y * r;\n }\n }\n return;\n }\n return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\n }\n }\n\n function prepare(quad) {\n if (quad.data) return quad.r = radii[quad.data.index];\n for (var i = quad.r = 0; i < 4; ++i) {\n if (quad[i] && quad[i].r > quad.r) {\n quad.r = quad[i].r;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n radii = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : radius;\n };\n\n return force;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","import Quad from \"./quad\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","import constant from \"./constant\";\nimport jiggle from \"./jiggle\";\nimport {map} from \"d3-collection\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"missing: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n count,\n bias,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle();\n y = target.y + target.vy - source.y - source.vy || jiggle();\n l = Math.sqrt(x * x + y * y);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l;\n target.vx -= x * (b = bias[i]);\n target.vy -= y * b;\n source.vx += x * (b = 1 - b);\n source.vy += y * b;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = map(nodes, id),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {map} from \"d3-collection\";\nimport {timer} from \"d3-timer\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\");\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick() {\n var i, n = nodes.length, node;\n\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.each(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","import constant from \"./constant\";\nimport jiggle from \"./jiggle\";\nimport {quadtree} from \"d3-quadtree\";\nimport {x, y} from \"./simulation\";\n\nexport default function() {\n var nodes,\n node,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate);\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(quad) {\n var strength = 0, q, c, weight = 0, x, y, i;\n\n // For internal nodes, accumulate forces from child quadrants.\n if (quad.length) {\n for (x = y = i = 0; i < 4; ++i) {\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n }\n }\n quad.x = x / weight;\n quad.y = y / weight;\n }\n\n // For leaf nodes, accumulate forces from coincident quadrants.\n else {\n q = quad;\n q.x = q.data.x;\n q.y = q.data.y;\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n quad.value = strength;\n }\n\n function apply(quad, x1, _, x2) {\n if (!quad.value) return true;\n\n var x = quad.x - node.x,\n y = quad.y - node.y,\n w = x2 - x1,\n l = x * x + y * y;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(), l += x * x;\n if (y === 0) y = jiggle(), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * quad.value * alpha / l;\n node.vy += y * quad.value * alpha / l;\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (quad.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (quad.data !== node || quad.next) {\n if (x === 0) x = jiggle(), l += x * x;\n if (y === 0) y = jiggle(), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (quad.data !== node) {\n w = strengths[quad.data.index] * alpha / l;\n node.vx += x * w;\n node.vy += y * w;\n } while (quad = quad.next);\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n","import constant from \"./constant\";\n\nexport default function(radius, x, y) {\n var nodes,\n strength = constant(0.1),\n strengths,\n radiuses;\n\n if (typeof radius !== \"function\") radius = constant(+radius);\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force(alpha) {\n for (var i = 0, n = nodes.length; i < n; ++i) {\n var node = nodes[i],\n dx = node.x - x || 1e-6,\n dy = node.y - y || 1e-6,\n r = Math.sqrt(dx * dx + dy * dy),\n k = (radiuses[i] - r) * strengths[i] * alpha / r;\n node.vx += dx * k;\n node.vy += dy * k;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n radiuses = new Array(n);\n for (i = 0; i < n; ++i) {\n radiuses[i] = +radius(nodes[i], i, nodes);\n strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _, initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : radius;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n return force;\n}\n","import constant from \"./constant\";\n\nexport default function(x) {\n var strength = constant(0.1),\n nodes,\n strengths,\n xz;\n\n if (typeof x !== \"function\") x = constant(x == null ? 0 : +x);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n xz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : x;\n };\n\n return force;\n}\n","import constant from \"./constant\";\n\nexport default function(y) {\n var strength = constant(0.1),\n nodes,\n strengths,\n yz;\n\n if (typeof y !== \"function\") y = constant(y == null ? 0 : +y);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n yz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : y;\n };\n\n return force;\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n return new FormatSpecifier(specifier);\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n this.fill = match[1] || \" \";\n this.align = match[2] || \">\";\n this.sign = match[3] || \"-\";\n this.symbol = match[4] || \"\";\n this.zero = !!match[5];\n this.width = match[6] && +match[6];\n this.comma = !!match[7];\n this.precision = match[8] && +match[8].slice(1);\n this.trim = !!match[9];\n this.type = match[10] || \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto\";\nimport formatRounded from \"./formatRounded\";\n\nexport default {\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent\";\nimport formatGroup from \"./formatGroup\";\nimport formatNumerals from \"./formatNumerals\";\nimport formatSpecifier from \"./formatSpecifier\";\nimport formatTrim from \"./formatTrim\";\nimport formatTypes from \"./formatTypes\";\nimport {prefixExponent} from \"./formatPrefixAuto\";\nimport identity from \"./identity\";\n\nvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n currency = locale.currency,\n decimal = locale.decimal,\n numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n percent = locale.percent || \"%\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision == null ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","import exponent from \"./exponent\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\n\nexport default function() {\n return new Adder;\n}\n\nfunction Adder() {\n this.reset();\n}\n\nAdder.prototype = {\n constructor: Adder,\n reset: function() {\n this.s = // rounded value\n this.t = 0; // exact error\n },\n add: function(y) {\n add(temp, y, this.t);\n add(this, temp.s, this.s);\n if (this.s) this.t += temp.t;\n else this.s = temp.t;\n },\n valueOf: function() {\n return this.s;\n }\n};\n\nvar temp = new Adder;\n\nfunction add(adder, a, b) {\n var x = adder.s = a + b,\n bv = x - a,\n av = x - bv;\n adder.t = (a - av) + (b - bv);\n}\n","export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n","export default function noop() {}\n","function streamGeometry(geometry, stream) {\n if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n streamGeometryType[geometry.type](geometry, stream);\n }\n}\n\nvar streamObjectType = {\n Feature: function(object, stream) {\n streamGeometry(object.geometry, stream);\n },\n FeatureCollection: function(object, stream) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) streamGeometry(features[i].geometry, stream);\n }\n};\n\nvar streamGeometryType = {\n Sphere: function(object, stream) {\n stream.sphere();\n },\n Point: function(object, stream) {\n object = object.coordinates;\n stream.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n },\n LineString: function(object, stream) {\n streamLine(object.coordinates, stream, 0);\n },\n MultiLineString: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamLine(coordinates[i], stream, 0);\n },\n Polygon: function(object, stream) {\n streamPolygon(object.coordinates, stream);\n },\n MultiPolygon: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamPolygon(coordinates[i], stream);\n },\n GeometryCollection: function(object, stream) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) streamGeometry(geometries[i], stream);\n }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n stream.lineStart();\n while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n var i = -1, n = coordinates.length;\n stream.polygonStart();\n while (++i < n) streamLine(coordinates[i], stream, 1);\n stream.polygonEnd();\n}\n\nexport default function(object, stream) {\n if (object && streamObjectType.hasOwnProperty(object.type)) {\n streamObjectType[object.type](object, stream);\n } else {\n streamGeometry(object, stream);\n }\n}\n","import adder from \"./adder\";\nimport {atan2, cos, quarterPi, radians, sin, tau} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nexport var areaRingSum = adder();\n\nvar areaSum = adder(),\n lambda00,\n phi00,\n lambda0,\n cosPhi0,\n sinPhi0;\n\nexport var areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaRingSum.reset();\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n var areaRing = +areaRingSum;\n areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);\n this.lineStart = this.lineEnd = this.point = noop;\n },\n sphere: function() {\n areaSum.add(tau);\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n areaStream.point = areaPoint;\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\n\n // Spherical excess E for a spherical triangle with vertices: south pole,\n // previous point, current point. Uses a formula derived from Cagnoli’s\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n var dLambda = lambda - lambda0,\n sdLambda = dLambda >= 0 ? 1 : -1,\n adLambda = sdLambda * dLambda,\n cosPhi = cos(phi),\n sinPhi = sin(phi),\n k = sinPhi0 * sinPhi,\n u = cosPhi0 * cosPhi + k * cos(adLambda),\n v = k * sdLambda * sin(adLambda);\n areaRingSum.add(atan2(v, u));\n\n // Advance the previous points.\n lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nexport default function(object) {\n areaSum.reset();\n stream(object, areaStream);\n return areaSum * 2;\n}\n","import {asin, atan2, cos, sin, sqrt} from \"./math\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n","import adder from \"./adder\";\nimport {areaStream, areaRingSum} from \"./area\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from \"./cartesian\";\nimport {abs, degrees, epsilon, radians} from \"./math\";\nimport stream from \"./stream\";\n\nvar lambda0, phi0, lambda1, phi1, // bounds\n lambda2, // previous lambda-coordinate\n lambda00, phi00, // first point\n p0, // previous 3D point\n deltaSum = adder(),\n ranges,\n range;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: boundsLineStart,\n lineEnd: boundsLineEnd,\n polygonStart: function() {\n boundsStream.point = boundsRingPoint;\n boundsStream.lineStart = boundsRingStart;\n boundsStream.lineEnd = boundsRingEnd;\n deltaSum.reset();\n areaStream.polygonStart();\n },\n polygonEnd: function() {\n areaStream.polygonEnd();\n boundsStream.point = boundsPoint;\n boundsStream.lineStart = boundsLineStart;\n boundsStream.lineEnd = boundsLineEnd;\n if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n else if (deltaSum > epsilon) phi1 = 90;\n else if (deltaSum < -epsilon) phi0 = -90;\n range[0] = lambda0, range[1] = lambda1;\n }\n};\n\nfunction boundsPoint(lambda, phi) {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n var p = cartesian([lambda * radians, phi * radians]);\n if (p0) {\n var normal = cartesianCross(p0, p),\n equatorial = [normal[1], -normal[0], 0],\n inflection = cartesianCross(equatorial, normal);\n cartesianNormalizeInPlace(inflection);\n inflection = spherical(inflection);\n var delta = lambda - lambda2,\n sign = delta > 0 ? 1 : -1,\n lambdai = inflection[0] * degrees * sign,\n phii,\n antimeridian = abs(delta) > 180;\n if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = inflection[1] * degrees;\n if (phii > phi1) phi1 = phii;\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n phii = -inflection[1] * degrees;\n if (phii < phi0) phi0 = phii;\n } else {\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n }\n if (antimeridian) {\n if (lambda < lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n } else {\n if (lambda1 >= lambda0) {\n if (lambda < lambda0) lambda0 = lambda;\n if (lambda > lambda1) lambda1 = lambda;\n } else {\n if (lambda > lambda2) {\n if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n } else {\n if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n }\n }\n }\n } else {\n ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n }\n if (phi < phi0) phi0 = phi;\n if (phi > phi1) phi1 = phi;\n p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n range[0] = lambda0, range[1] = lambda1;\n boundsStream.point = boundsPoint;\n p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n if (p0) {\n var delta = lambda - lambda2;\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n } else {\n lambda00 = lambda, phi00 = phi;\n }\n areaStream.point(lambda, phi);\n linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n boundsRingPoint(lambda00, phi00);\n areaStream.lineEnd();\n if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180);\n range[0] = lambda0, range[1] = lambda1;\n p0 = null;\n}\n\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\nfunction angle(lambda0, lambda1) {\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nexport default function(feature) {\n var i, n, a, b, merged, deltaMax, delta;\n\n phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n ranges = [];\n stream(feature, boundsStream);\n\n // First, sort ranges by their minimum longitudes.\n if (n = ranges.length) {\n ranges.sort(rangeCompare);\n\n // Then, merge any ranges that overlap.\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n b = ranges[i];\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n\n // Finally, find the largest gap between the merged ranges.\n // The final bounding box will be the inverse of this gap.\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n b = merged[i];\n if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n }\n }\n\n ranges = range = null;\n\n return lambda0 === Infinity || phi0 === Infinity\n ? [[NaN, NaN], [NaN, NaN]]\n : [[lambda0, phi0], [lambda1, phi1]];\n}\n","import {asin, atan2, cos, degrees, epsilon, epsilon2, radians, sin, sqrt} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nvar W0, W1,\n X0, Y0, Z0,\n X1, Y1, Z1,\n X2, Y2, Z2,\n lambda00, phi00, // first point\n x0, y0, z0; // previous point\n\nvar centroidStream = {\n sphere: noop,\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n }\n};\n\n// Arithmetic mean of Cartesian vectors.\nfunction centroidPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi);\n centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi));\n}\n\nfunction centroidPointCartesian(x, y, z) {\n ++W0;\n X0 += (x - X0) / W0;\n Y0 += (y - Y0) / W0;\n Z0 += (z - Z0) / W0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidLinePointFirst;\n}\n\nfunction centroidLinePointFirst(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi);\n x0 = cosPhi * cos(lambda);\n y0 = cosPhi * sin(lambda);\n z0 = sin(phi);\n centroidStream.point = centroidLinePoint;\n centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidLinePoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi),\n x = cosPhi * cos(lambda),\n y = cosPhi * sin(lambda),\n z = sin(phi),\n w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n W1 += w;\n X1 += w * (x0 + (x0 = x));\n Y1 += w * (y0 + (y0 = y));\n Z1 += w * (z0 + (z0 = z));\n centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\n// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,\n// J. Applied Mechanics 42, 239 (1975).\nfunction centroidRingStart() {\n centroidStream.point = centroidRingPointFirst;\n}\n\nfunction centroidRingEnd() {\n centroidRingPoint(lambda00, phi00);\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingPointFirst(lambda, phi) {\n lambda00 = lambda, phi00 = phi;\n lambda *= radians, phi *= radians;\n centroidStream.point = centroidRingPoint;\n var cosPhi = cos(phi);\n x0 = cosPhi * cos(lambda);\n y0 = cosPhi * sin(lambda);\n z0 = sin(phi);\n centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidRingPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var cosPhi = cos(phi),\n x = cosPhi * cos(lambda),\n y = cosPhi * sin(lambda),\n z = sin(phi),\n cx = y0 * z - z0 * y,\n cy = z0 * x - x0 * z,\n cz = x0 * y - y0 * x,\n m = sqrt(cx * cx + cy * cy + cz * cz),\n w = asin(m), // line weight = angle\n v = m && -w / m; // area weight multiplier\n X2 += v * cx;\n Y2 += v * cy;\n Z2 += v * cz;\n W1 += w;\n X1 += w * (x0 + (x0 = x));\n Y1 += w * (y0 + (y0 = y));\n Z1 += w * (z0 + (z0 = z));\n centroidPointCartesian(x0, y0, z0);\n}\n\nexport default function(object) {\n W0 = W1 =\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n stream(object, centroidStream);\n\n var x = X2,\n y = Y2,\n z = Z2,\n m = x * x + y * y + z * z;\n\n // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.\n if (m < epsilon2) {\n x = X1, y = Y1, z = Z1;\n // If the feature has zero length, fall back to arithmetic mean of point vectors.\n if (W1 < epsilon) x = X0, y = Y0, z = Z0;\n m = x * x + y * y + z * z;\n // If the feature still has an undefined ccentroid, then return.\n if (m < epsilon2) return [NaN, NaN];\n }\n\n return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees];\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(a, b) {\n\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n\n return compose;\n}\n","import compose from \"./compose\";\nimport {abs, asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math\";\n\nfunction rotationIdentity(lambda, phi) {\n return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n","import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian\";\nimport constant from \"./constant\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math\";\nimport {rotateRadians} from \"./rotation\";\n\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(6),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n","import noop from \"../noop\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y) {\n line.push([x, y]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n","import {abs, epsilon} from \"./math\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n","import pointEqual from \"../pointEqual\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n // If the first and last points of a segment are coincident, then treat as a\n // closed ring. TODO if all rings are closed, then the winding order of the\n // exterior ring should be checked.\n if (pointEqual(p0, p1)) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n","import adder from \"./adder\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian\";\nimport {asin, atan2, cos, epsilon, halfPi, pi, quarterPi, sin, tau} from \"./math\";\n\nvar sum = adder();\n\nexport default function(polygon, point) {\n var lambda = point[0],\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n sum.reset();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = point0[0],\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = point1[0],\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point’s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1);\n}\n","import clipBuffer from \"./buffer\";\nimport clipRejoin from \"./rejoin\";\nimport {epsilon, halfPi} from \"../math\";\nimport polygonContains from \"../polygonContains\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n","import clip from \"./index\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n","import {cartesian, cartesianAddInPlace, cartesianCross, cartesianDot, cartesianScale, spherical} from \"../cartesian\";\nimport {circleStream} from \"../circle\";\nimport {abs, cos, epsilon, pi, radians, sqrt} from \"../math\";\nimport pointEqual from \"../pointEqual\";\nimport clip from \"./index\";\n\nexport default function(radius) {\n var cr = cos(radius),\n delta = 6 * radians,\n smallRadius = cr > 0,\n notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case\n\n function interpolate(from, to, direction, stream) {\n circleStream(stream, radius, delta, direction, from, to);\n }\n\n function visible(lambda, phi) {\n return cos(lambda) * cos(phi) > cr;\n }\n\n // Takes a line and cuts into visible segments. Return values used for polygon\n // clipping: 0 - there were intersections or the line was empty; 1 - no\n // intersections 2 - there were intersections, and the first and last segments\n // should be rejoined.\n function clipLine(stream) {\n var point0, // previous point\n c0, // code for previous point\n v0, // visibility of previous point\n v00, // visibility of first point\n clean; // no intersections\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(lambda, phi) {\n var point1 = [lambda, phi],\n point2,\n v = visible(lambda, phi),\n c = smallRadius\n ? v ? 0 : code(lambda, phi)\n : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;\n if (!point0 && (v00 = v0 = v)) stream.lineStart();\n // Handle degeneracies.\n // TODO ignore if not clipping polygons.\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {\n point1[0] += epsilon;\n point1[1] += epsilon;\n v = visible(point1[0], point1[1]);\n }\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n // outside going in\n stream.lineStart();\n point2 = intersect(point1, point0);\n stream.point(point2[0], point2[1]);\n } else {\n // inside going out\n point2 = intersect(point0, point1);\n stream.point(point2[0], point2[1]);\n stream.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n // If the codes for two points are different, or are both zero,\n // and there this segment intersects with the small circle.\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n } else {\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n }\n }\n }\n if (v && (!point0 || !pointEqual(point0, point1))) {\n stream.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) stream.lineEnd();\n point0 = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return clean | ((v00 && v0) << 1);\n }\n };\n }\n\n // Intersects the great circle between a and b with the clip circle.\n function intersect(a, b, two) {\n var pa = cartesian(a),\n pb = cartesian(b);\n\n // We have two planes, n1.p = d1 and n2.p = d2.\n // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).\n var n1 = [1, 0, 0], // normal\n n2 = cartesianCross(pa, pb),\n n2n2 = cartesianDot(n2, n2),\n n1n2 = n2[0], // cartesianDot(n1, n2),\n determinant = n2n2 - n1n2 * n1n2;\n\n // Two polar points.\n if (!determinant) return !two && a;\n\n var c1 = cr * n2n2 / determinant,\n c2 = -cr * n1n2 / determinant,\n n1xn2 = cartesianCross(n1, n2),\n A = cartesianScale(n1, c1),\n B = cartesianScale(n2, c2);\n cartesianAddInPlace(A, B);\n\n // Solve |p(t)|^2 = 1.\n var u = n1xn2,\n w = cartesianDot(A, u),\n uu = cartesianDot(u, u),\n t2 = w * w - uu * (cartesianDot(A, A) - 1);\n\n if (t2 < 0) return;\n\n var t = sqrt(t2),\n q = cartesianScale(u, (-w - t) / uu);\n cartesianAddInPlace(q, A);\n q = spherical(q);\n\n if (!two) return q;\n\n // Two intersection points.\n var lambda0 = a[0],\n lambda1 = b[0],\n phi0 = a[1],\n phi1 = b[1],\n z;\n\n if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n\n var delta = lambda1 - lambda0,\n polar = abs(delta - pi) < epsilon,\n meridian = polar || delta < epsilon;\n\n if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n\n // Check that the first point is between a and b.\n if (meridian\n ? polar\n ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1)\n : phi0 <= q[1] && q[1] <= phi1\n : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n var q1 = cartesianScale(u, (-w + t) / uu);\n cartesianAddInPlace(q1, A);\n return [q, spherical(q1)];\n }\n }\n\n // Generates a 4-bit vector representing the location of a point relative to\n // the small circle's bounding box.\n function code(lambda, phi) {\n var r = smallRadius ? radius : pi - radius,\n code = 0;\n if (lambda < -r) code |= 1; // left\n else if (lambda > r) code |= 2; // right\n if (phi < -r) code |= 4; // below\n else if (phi > r) code |= 8; // above\n return code;\n }\n\n return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);\n}\n","export default function(a, b, x0, y0, x1, y1) {\n var ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n return true;\n}\n","import {abs, epsilon} from \"../math\";\nimport clipBuffer from \"./buffer\";\nimport clipLine from \"./line\";\nimport clipRejoin from \"./rejoin\";\nimport {merge} from \"d3-array\";\n\nvar clipMax = 1e9, clipMin = -clipMax;\n\n// TODO Use d3-polygon’s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nexport default function clipRectangle(x0, y0, x1, y1) {\n\n function visible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n\n function interpolate(from, to, direction, stream) {\n var a = 0, a1 = 0;\n if (from == null\n || (a = corner(from, direction)) !== (a1 = corner(to, direction))\n || comparePoint(from, to) < 0 ^ direction > 0) {\n do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n stream.point(to[0], to[1]);\n }\n }\n\n function corner(p, direction) {\n return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3\n : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1\n : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0\n : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n }\n\n function compareIntersection(a, b) {\n return comparePoint(a.x, b.x);\n }\n\n function comparePoint(a, b) {\n var ca = corner(a, 1),\n cb = corner(b, 1);\n return ca !== cb ? ca - cb\n : ca === 0 ? b[1] - a[1]\n : ca === 1 ? a[0] - b[0]\n : ca === 2 ? a[1] - b[1]\n : b[0] - a[0];\n }\n\n return function(stream) {\n var activeStream = stream,\n bufferStream = clipBuffer(),\n segments,\n polygon,\n ring,\n x__, y__, v__, // first point\n x_, y_, v_, // previous point\n first,\n clean;\n\n var clipStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: polygonStart,\n polygonEnd: polygonEnd\n };\n\n function point(x, y) {\n if (visible(x, y)) activeStream.point(x, y);\n }\n\n function polygonInside() {\n var winding = 0;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\n else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\n }\n }\n\n return winding;\n }\n\n // Buffer geometry within a polygon and then clip it en masse.\n function polygonStart() {\n activeStream = bufferStream, segments = [], polygon = [], clean = true;\n }\n\n function polygonEnd() {\n var startInside = polygonInside(),\n cleanInside = clean && startInside,\n visible = (segments = merge(segments)).length;\n if (cleanInside || visible) {\n stream.polygonStart();\n if (cleanInside) {\n stream.lineStart();\n interpolate(null, null, 1, stream);\n stream.lineEnd();\n }\n if (visible) {\n clipRejoin(segments, compareIntersection, startInside, interpolate, stream);\n }\n stream.polygonEnd();\n }\n activeStream = stream, segments = polygon = ring = null;\n }\n\n function lineStart() {\n clipStream.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n\n // TODO rather than special-case polygons, simply handle them separately.\n // Ideally, coincident intersection points should be jittered to avoid\n // clipping issues.\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferStream.rejoin();\n segments.push(bufferStream.result());\n }\n clipStream.point = point;\n if (v_) activeStream.lineEnd();\n }\n\n function linePoint(x, y) {\n var v = visible(x, y);\n if (polygon) ring.push([x, y]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n }\n } else {\n if (v && v_) activeStream.point(x, y);\n else {\n var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n if (clipLine(a, b, x0, y0, x1, y1)) {\n if (!v_) {\n activeStream.lineStart();\n activeStream.point(a[0], a[1]);\n }\n activeStream.point(b[0], b[1]);\n if (!v) activeStream.lineEnd();\n clean = false;\n } else if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n\n return clipStream;\n };\n}\n","import clipRectangle from \"./rectangle\";\n\nexport default function() {\n var x0 = 0,\n y0 = 0,\n x1 = 960,\n y1 = 500,\n cache,\n cacheStream,\n clip;\n\n return clip = {\n stream: function(stream) {\n return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);\n },\n extent: function(_) {\n return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];\n }\n };\n}\n","import adder from \"./adder\";\nimport {abs, atan2, cos, radians, sin, sqrt} from \"./math\";\nimport noop from \"./noop\";\nimport stream from \"./stream\";\n\nvar lengthSum = adder(),\n lambda0,\n sinPhi0,\n cosPhi0;\n\nvar lengthStream = {\n sphere: noop,\n point: noop,\n lineStart: lengthLineStart,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop\n};\n\nfunction lengthLineStart() {\n lengthStream.point = lengthPointFirst;\n lengthStream.lineEnd = lengthLineEnd;\n}\n\nfunction lengthLineEnd() {\n lengthStream.point = lengthStream.lineEnd = noop;\n}\n\nfunction lengthPointFirst(lambda, phi) {\n lambda *= radians, phi *= radians;\n lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);\n lengthStream.point = lengthPoint;\n}\n\nfunction lengthPoint(lambda, phi) {\n lambda *= radians, phi *= radians;\n var sinPhi = sin(phi),\n cosPhi = cos(phi),\n delta = abs(lambda - lambda0),\n cosDelta = cos(delta),\n sinDelta = sin(delta),\n x = cosPhi * sinDelta,\n y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,\n z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;\n lengthSum.add(atan2(sqrt(x * x + y * y), z));\n lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;\n}\n\nexport default function(object) {\n lengthSum.reset();\n stream(object, lengthStream);\n return +lengthSum;\n}\n","import length from \"./length\";\n\nvar coordinates = [null, null],\n object = {type: \"LineString\", coordinates: coordinates};\n\nexport default function(a, b) {\n coordinates[0] = a;\n coordinates[1] = b;\n return length(object);\n}\n","import {default as polygonContains} from \"./polygonContains\";\nimport {default as distance} from \"./distance\";\nimport {epsilon, radians} from \"./math\";\n\nvar containsObjectType = {\n Feature: function(object, point) {\n return containsGeometry(object.geometry, point);\n },\n FeatureCollection: function(object, point) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;\n return false;\n }\n};\n\nvar containsGeometryType = {\n Sphere: function() {\n return true;\n },\n Point: function(object, point) {\n return containsPoint(object.coordinates, point);\n },\n MultiPoint: function(object, point) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) if (containsPoint(coordinates[i], point)) return true;\n return false;\n },\n LineString: function(object, point) {\n return containsLine(object.coordinates, point);\n },\n MultiLineString: function(object, point) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) if (containsLine(coordinates[i], point)) return true;\n return false;\n },\n Polygon: function(object, point) {\n return containsPolygon(object.coordinates, point);\n },\n MultiPolygon: function(object, point) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) if (containsPolygon(coordinates[i], point)) return true;\n return false;\n },\n GeometryCollection: function(object, point) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) if (containsGeometry(geometries[i], point)) return true;\n return false;\n }\n};\n\nfunction containsGeometry(geometry, point) {\n return geometry && containsGeometryType.hasOwnProperty(geometry.type)\n ? containsGeometryType[geometry.type](geometry, point)\n : false;\n}\n\nfunction containsPoint(coordinates, point) {\n return distance(coordinates, point) === 0;\n}\n\nfunction containsLine(coordinates, point) {\n var ab = distance(coordinates[0], coordinates[1]),\n ao = distance(coordinates[0], point),\n ob = distance(point, coordinates[1]);\n return ao + ob <= ab + epsilon;\n}\n\nfunction containsPolygon(coordinates, point) {\n return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));\n}\n\nfunction ringRadians(ring) {\n return ring = ring.map(pointRadians), ring.pop(), ring;\n}\n\nfunction pointRadians(point) {\n return [point[0] * radians, point[1] * radians];\n}\n\nexport default function(object, point) {\n return (object && containsObjectType.hasOwnProperty(object.type)\n ? containsObjectType[object.type]\n : containsGeometry)(object, point);\n}\n","import {range} from \"d3-array\";\nimport {abs, ceil, epsilon} from \"./math\";\n\nfunction graticuleX(y0, y1, dy) {\n var y = range(y0, y1 - epsilon, dy).concat(y1);\n return function(x) { return y.map(function(y) { return [x, y]; }); };\n}\n\nfunction graticuleY(x0, x1, dx) {\n var x = range(x0, x1 - epsilon, dx).concat(x1);\n return function(y) { return x.map(function(x) { return [x, y]; }); };\n}\n\nexport default function graticule() {\n var x1, x0, X1, X0,\n y1, y0, Y1, Y0,\n dx = 10, dy = dx, DX = 90, DY = 360,\n x, y, X, Y,\n precision = 2.5;\n\n function graticule() {\n return {type: \"MultiLineString\", coordinates: lines()};\n }\n\n function lines() {\n return range(ceil(X0 / DX) * DX, X1, DX).map(X)\n .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))\n .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x))\n .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y));\n }\n\n graticule.lines = function() {\n return lines().map(function(coordinates) { return {type: \"LineString\", coordinates: coordinates}; });\n };\n\n graticule.outline = function() {\n return {\n type: \"Polygon\",\n coordinates: [\n X(X0).concat(\n Y(Y1).slice(1),\n X(X1).reverse().slice(1),\n Y(Y0).reverse().slice(1))\n ]\n };\n };\n\n graticule.extent = function(_) {\n if (!arguments.length) return graticule.extentMinor();\n return graticule.extentMajor(_).extentMinor(_);\n };\n\n graticule.extentMajor = function(_) {\n if (!arguments.length) return [[X0, Y0], [X1, Y1]];\n X0 = +_[0][0], X1 = +_[1][0];\n Y0 = +_[0][1], Y1 = +_[1][1];\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n return graticule.precision(precision);\n };\n\n graticule.extentMinor = function(_) {\n if (!arguments.length) return [[x0, y0], [x1, y1]];\n x0 = +_[0][0], x1 = +_[1][0];\n y0 = +_[0][1], y1 = +_[1][1];\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n return graticule.precision(precision);\n };\n\n graticule.step = function(_) {\n if (!arguments.length) return graticule.stepMinor();\n return graticule.stepMajor(_).stepMinor(_);\n };\n\n graticule.stepMajor = function(_) {\n if (!arguments.length) return [DX, DY];\n DX = +_[0], DY = +_[1];\n return graticule;\n };\n\n graticule.stepMinor = function(_) {\n if (!arguments.length) return [dx, dy];\n dx = +_[0], dy = +_[1];\n return graticule;\n };\n\n graticule.precision = function(_) {\n if (!arguments.length) return precision;\n precision = +_;\n x = graticuleX(y0, y1, 90);\n y = graticuleY(x0, x1, precision);\n X = graticuleX(Y0, Y1, 90);\n Y = graticuleY(X0, X1, precision);\n return graticule;\n };\n\n return graticule\n .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]])\n .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]);\n}\n\nexport function graticule10() {\n return graticule()();\n}\n","import {asin, atan2, cos, degrees, haversin, radians, sin, sqrt} from \"./math\";\n\nexport default function(a, b) {\n var x0 = a[0] * radians,\n y0 = a[1] * radians,\n x1 = b[0] * radians,\n y1 = b[1] * radians,\n cy0 = cos(y0),\n sy0 = sin(y0),\n cy1 = cos(y1),\n sy1 = sin(y1),\n kx0 = cy0 * cos(x0),\n ky0 = cy0 * sin(x0),\n kx1 = cy1 * cos(x1),\n ky1 = cy1 * sin(x1),\n d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),\n k = sin(d);\n\n var interpolate = d ? function(t) {\n var B = sin(t *= d) / k,\n A = sin(d - t) / k,\n x = A * kx0 + B * kx1,\n y = A * ky0 + B * ky1,\n z = A * sy0 + B * sy1;\n return [\n atan2(y, x) * degrees,\n atan2(z, sqrt(x * x + y * y)) * degrees\n ];\n } : function() {\n return [x0 * degrees, y0 * degrees];\n };\n\n interpolate.distance = d;\n\n return interpolate;\n}\n","import adder from \"../adder\";\nimport {abs} from \"../math\";\nimport noop from \"../noop\";\n\nvar areaSum = adder(),\n areaRingSum = adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum.reset();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum.reset();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","export default function(x) {\n return x;\n}\n","import noop from \"../noop\";\n\nvar x0 = Infinity,\n y0 = x0,\n x1 = -x0,\n y1 = x1;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop,\n result: function() {\n var bounds = [[x0, y0], [x1, y1]];\n x1 = y1 = -(y0 = x0 = Infinity);\n return bounds;\n }\n};\n\nfunction boundsPoint(x, y) {\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n}\n\nexport default boundsStream;\n","import {sqrt} from \"../math\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n Y0 = 0,\n Z0 = 0,\n X1 = 0,\n Y1 = 0,\n Z1 = 0,\n X2 = 0,\n Y2 = 0,\n Z2 = 0,\n x00,\n y00,\n x0,\n y0;\n\nvar centroidStream = {\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.point = centroidPoint;\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n },\n result: function() {\n var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n : Z1 ? [X1 / Z1, Y1 / Z1]\n : Z0 ? [X0 / Z0, Y0 / Z0]\n : [NaN, NaN];\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n return centroid;\n }\n};\n\nfunction centroidPoint(x, y) {\n X0 += x;\n Y0 += y;\n ++Z0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n centroidStream.point = centroidPointLine;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n centroidStream.point = centroidPointRing;\n centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n var dx = x - x0,\n dy = y - y0,\n z = sqrt(dx * dx + dy * dy);\n\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n\n z = y0 * x - x0 * y;\n X2 += z * (x0 + x);\n Y2 += z * (y0 + y);\n Z2 += z * 3;\n centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n","import {tau} from \"../math\";\nimport noop from \"../noop\";\n\nexport default function PathContext(context) {\n this._context = context;\n}\n\nPathContext.prototype = {\n _radius: 4.5,\n pointRadius: function(_) {\n return this._radius = _, this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._context.closePath();\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._context.moveTo(x, y);\n this._point = 1;\n break;\n }\n case 1: {\n this._context.lineTo(x, y);\n break;\n }\n default: {\n this._context.moveTo(x + this._radius, y);\n this._context.arc(x, y, this._radius, 0, tau);\n break;\n }\n }\n },\n result: noop\n};\n","import adder from \"../adder\";\nimport {sqrt} from \"../math\";\nimport noop from \"../noop\";\n\nvar lengthSum = adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum.reset();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","export default function PathString() {\n this._string = [];\n}\n\nPathString.prototype = {\n _radius: 4.5,\n _circle: circle(4.5),\n pointRadius: function(_) {\n if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n return this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._string.push(\"Z\");\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._string.push(\"M\", x, \",\", y);\n this._point = 1;\n break;\n }\n case 1: {\n this._string.push(\"L\", x, \",\", y);\n break;\n }\n default: {\n if (this._circle == null) this._circle = circle(this._radius);\n this._string.push(\"M\", x, \",\", y, this._circle);\n break;\n }\n }\n },\n result: function() {\n if (this._string.length) {\n var result = this._string.join(\"\");\n this._string = [];\n return result;\n } else {\n return null;\n }\n }\n};\n\nfunction circle(radius) {\n return \"m0,\" + radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\n + \"z\";\n}\n","import identity from \"../identity\";\nimport stream from \"../stream\";\nimport pathArea from \"./area\";\nimport pathBounds from \"./bounds\";\nimport pathCentroid from \"./centroid\";\nimport PathContext from \"./context\";\nimport pathMeasure from \"./measure\";\nimport PathString from \"./string\";\n\nexport default function(projection, context) {\n var pointRadius = 4.5,\n projectionStream,\n contextStream;\n\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n stream(object, projectionStream(contextStream));\n }\n return contextStream.result();\n }\n\n path.area = function(object) {\n stream(object, projectionStream(pathArea));\n return pathArea.result();\n };\n\n path.measure = function(object) {\n stream(object, projectionStream(pathMeasure));\n return pathMeasure.result();\n };\n\n path.bounds = function(object) {\n stream(object, projectionStream(pathBounds));\n return pathBounds.result();\n };\n\n path.centroid = function(object) {\n stream(object, projectionStream(pathCentroid));\n return pathCentroid.result();\n };\n\n path.projection = function(_) {\n return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection;\n };\n\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return path;\n };\n\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n\n return path.projection(projection).context(context);\n}\n","export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n","import {default as geoStream} from \"../stream\";\nimport boundsStream from \"../path/bounds\";\n\nfunction fit(projection, fitBounds, object) {\n var clip = projection.clipExtent && projection.clipExtent();\n projection.scale(150).translate([0, 0]);\n if (clip != null) projection.clipExtent(null);\n geoStream(object, projection.stream(boundsStream));\n fitBounds(boundsStream.result());\n if (clip != null) projection.clipExtent(clip);\n return projection;\n}\n\nexport function fitExtent(projection, extent, object) {\n return fit(projection, function(b) {\n var w = extent[1][0] - extent[0][0],\n h = extent[1][1] - extent[0][1],\n k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitSize(projection, size, object) {\n return fitExtent(projection, [[0, 0], size], object);\n}\n\nexport function fitWidth(projection, width, object) {\n return fit(projection, function(b) {\n var w = +width,\n k = w / (b[1][0] - b[0][0]),\n x = (w - k * (b[1][0] + b[0][0])) / 2,\n y = -k * b[0][1];\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitHeight(projection, height, object) {\n return fit(projection, function(b) {\n var h = +height,\n k = h / (b[1][1] - b[0][1]),\n x = -k * b[0][0],\n y = (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n","import {cartesian} from \"../cartesian\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math\";\nimport {transformer} from \"../transform\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n","import clipAntimeridian from \"../clip/antimeridian\";\nimport clipCircle from \"../clip/circle\";\nimport clipRectangle from \"../clip/rectangle\";\nimport compose from \"../compose\";\nimport identity from \"../identity\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math\";\nimport {rotateRadians} from \"../rotation\";\nimport {transformer} from \"../transform\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit\";\nimport resample from \"./resample\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy) {\n function transform(x, y) {\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k, (dy - y) / k];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, alpha) {\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [ai * x - bi * y + ci, fi - bi * x - ai * y];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),\n transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n","import {degrees, pi, radians} from \"../math\";\nimport {projectionMutator} from \"./index\";\n\nexport function conicProjection(projectAt) {\n var phi0 = 0,\n phi1 = pi / 3,\n m = projectionMutator(projectAt),\n p = m(phi0, phi1);\n\n p.parallels = function(_) {\n return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees];\n };\n\n return p;\n}\n","import {abs, asin, atan2, cos, epsilon, sign, sin, sqrt} from \"../math\";\nimport {conicProjection} from \"./conic\";\nimport {cylindricalEqualAreaRaw} from \"./cylindricalEqualArea\";\n\nexport function conicEqualAreaRaw(y0, y1) {\n var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2;\n\n // Are the parallels symmetrical around the Equator?\n if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0);\n\n var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;\n\n function project(x, y) {\n var r = sqrt(c - 2 * n * sin(y)) / n;\n return [r * sin(x *= n), r0 - r * cos(x)];\n }\n\n project.invert = function(x, y) {\n var r0y = r0 - y;\n return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEqualAreaRaw)\n .scale(155.424)\n .center([0, 33.6442]);\n}\n","import {asin, cos, sin} from \"../math\";\n\nexport function cylindricalEqualAreaRaw(phi0) {\n var cosPhi0 = cos(phi0);\n\n function forward(lambda, phi) {\n return [lambda * cosPhi0, sin(phi) / cosPhi0];\n }\n\n forward.invert = function(x, y) {\n return [x / cosPhi0, asin(y * cosPhi0)];\n };\n\n return forward;\n}\n","import conicEqualArea from \"./conicEqualArea\";\n\nexport default function() {\n return conicEqualArea()\n .parallels([29.5, 45.5])\n .scale(1070)\n .translate([480, 250])\n .rotate([96, 0])\n .center([-0.6, 38.7]);\n}\n","import {epsilon} from \"../math\";\nimport albers from \"./albers\";\nimport conicEqualArea from \"./conicEqualArea\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit\";\n\n// The projections must have mutually exclusive clip regions on the sphere,\n// as this will avoid emitting interleaving lines and polygons.\nfunction multiplex(streams) {\n var n = streams.length;\n return {\n point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },\n sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },\n lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },\n lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },\n polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },\n polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }\n };\n}\n\n// A composite projection for the United States, configured by default for\n// 960×500. The projection also works quite well at 960×600 if you change the\n// scale to 1285 and adjust the translate accordingly. The set of standard\n// parallels for each region comes from USGS, which is published here:\n// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers\nexport default function() {\n var cache,\n cacheStream,\n lower48 = albers(), lower48Point,\n alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338\n hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007\n point, pointStream = {point: function(x, y) { point = [x, y]; }};\n\n function albersUsa(coordinates) {\n var x = coordinates[0], y = coordinates[1];\n return point = null,\n (lower48Point.point(x, y), point)\n || (alaskaPoint.point(x, y), point)\n || (hawaiiPoint.point(x, y), point);\n }\n\n albersUsa.invert = function(coordinates) {\n var k = lower48.scale(),\n t = lower48.translate(),\n x = (coordinates[0] - t[0]) / k,\n y = (coordinates[1] - t[1]) / k;\n return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska\n : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii\n : lower48).invert(coordinates);\n };\n\n albersUsa.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);\n };\n\n albersUsa.precision = function(_) {\n if (!arguments.length) return lower48.precision();\n lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n return reset();\n };\n\n albersUsa.scale = function(_) {\n if (!arguments.length) return lower48.scale();\n lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n return albersUsa.translate(lower48.translate());\n };\n\n albersUsa.translate = function(_) {\n if (!arguments.length) return lower48.translate();\n var k = lower48.scale(), x = +_[0], y = +_[1];\n\n lower48Point = lower48\n .translate(_)\n .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])\n .stream(pointStream);\n\n alaskaPoint = alaska\n .translate([x - 0.307 * k, y + 0.201 * k])\n .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]])\n .stream(pointStream);\n\n hawaiiPoint = hawaii\n .translate([x - 0.205 * k, y + 0.212 * k])\n .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]])\n .stream(pointStream);\n\n return reset();\n };\n\n albersUsa.fitExtent = function(extent, object) {\n return fitExtent(albersUsa, extent, object);\n };\n\n albersUsa.fitSize = function(size, object) {\n return fitSize(albersUsa, size, object);\n };\n\n albersUsa.fitWidth = function(width, object) {\n return fitWidth(albersUsa, width, object);\n };\n\n albersUsa.fitHeight = function(height, object) {\n return fitHeight(albersUsa, height, object);\n };\n\n function reset() {\n cache = cacheStream = null;\n return albersUsa;\n }\n\n return albersUsa.scale(1070);\n}\n","import {asin, atan2, cos, sin, sqrt} from \"../math\";\n\nexport function azimuthalRaw(scale) {\n return function(x, y) {\n var cx = cos(x),\n cy = cos(y),\n k = scale(cx * cy);\n return [\n k * cy * sin(x),\n k * sin(y)\n ];\n }\n}\n\nexport function azimuthalInvert(angle) {\n return function(x, y) {\n var z = sqrt(x * x + y * y),\n c = angle(z),\n sc = sin(c),\n cc = cos(c);\n return [\n atan2(x * sc, z * cc),\n asin(z && y * sc / z)\n ];\n }\n}\n","import {asin, sqrt} from \"../math\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n return sqrt(2 / (1 + cxcy));\n});\n\nazimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\n return 2 * asin(z / 2);\n});\n\nexport default function() {\n return projection(azimuthalEqualAreaRaw)\n .scale(124.75)\n .clipAngle(180 - 1e-3);\n}\n","import {acos, sin} from \"../math\";\nimport {azimuthalRaw, azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport var azimuthalEquidistantRaw = azimuthalRaw(function(c) {\n return (c = acos(c)) && c / sin(c);\n});\n\nazimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\n return z;\n});\n\nexport default function() {\n return projection(azimuthalEquidistantRaw)\n .scale(79.4188)\n .clipAngle(180 - 1e-3);\n}\n","import {atan, exp, halfPi, log, pi, tan, tau} from \"../math\";\nimport rotation from \"../rotation\";\nimport projection from \"./index\";\n\nexport function mercatorRaw(lambda, phi) {\n return [lambda, log(tan((halfPi + phi) / 2))];\n}\n\nmercatorRaw.invert = function(x, y) {\n return [x, 2 * atan(exp(y)) - halfPi];\n};\n\nexport default function() {\n return mercatorProjection(mercatorRaw)\n .scale(961 / tau);\n}\n\nexport function mercatorProjection(project) {\n var m = projection(project),\n center = m.center,\n scale = m.scale,\n translate = m.translate,\n clipExtent = m.clipExtent,\n x0 = null, y0, x1, y1; // clip extent\n\n m.scale = function(_) {\n return arguments.length ? (scale(_), reclip()) : scale();\n };\n\n m.translate = function(_) {\n return arguments.length ? (translate(_), reclip()) : translate();\n };\n\n m.center = function(_) {\n return arguments.length ? (center(_), reclip()) : center();\n };\n\n m.clipExtent = function(_) {\n return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n function reclip() {\n var k = pi * scale(),\n t = m(rotation(m.rotate()).invert([0, 0]));\n return clipExtent(x0 == null\n ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw\n ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]\n : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\n }\n\n return reclip();\n}\n","import {abs, atan, atan2, cos, epsilon, halfPi, log, pow, sign, sin, sqrt, tan} from \"../math\";\nimport {conicProjection} from \"./conic\";\nimport {mercatorRaw} from \"./mercator\";\n\nfunction tany(y) {\n return tan((halfPi + y) / 2);\n}\n\nexport function conicConformalRaw(y0, y1) {\n var cy0 = cos(y0),\n n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)),\n f = cy0 * pow(tany(y0), n) / n;\n\n if (!n) return mercatorRaw;\n\n function project(x, y) {\n if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; }\n else { if (y > halfPi - epsilon) y = halfPi - epsilon; }\n var r = f / pow(tany(y), n);\n return [r * sin(n * x), f - r * cos(n * x)];\n }\n\n project.invert = function(x, y) {\n var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);\n return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicConformalRaw)\n .scale(109.5)\n .parallels([30, 30]);\n}\n","import projection from \"./index\";\n\nexport function equirectangularRaw(lambda, phi) {\n return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nexport default function() {\n return projection(equirectangularRaw)\n .scale(152.63);\n}\n","import {abs, atan2, cos, epsilon, sign, sin, sqrt} from \"../math\";\nimport {conicProjection} from \"./conic\";\nimport {equirectangularRaw} from \"./equirectangular\";\n\nexport function conicEquidistantRaw(y0, y1) {\n var cy0 = cos(y0),\n n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0),\n g = cy0 / n + y0;\n\n if (abs(n) < epsilon) return equirectangularRaw;\n\n function project(x, y) {\n var gy = g - y, nx = n * x;\n return [gy * sin(nx), g - gy * cos(nx)];\n }\n\n project.invert = function(x, y) {\n var gy = g - y;\n return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];\n };\n\n return project;\n}\n\nexport default function() {\n return conicProjection(conicEquidistantRaw)\n .scale(131.154)\n .center([0, 13.9389]);\n}\n","import projection from \"./index.js\";\nimport {abs, asin, cos, epsilon2, sin, sqrt} from \"../math.js\";\n\nvar A1 = 1.340264,\n A2 = -0.081106,\n A3 = 0.000893,\n A4 = 0.003796,\n M = sqrt(3) / 2,\n iterations = 12;\n\nexport function equalEarthRaw(lambda, phi) {\n var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2;\n return [\n lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n ];\n}\n\nequalEarthRaw.invert = function(x, y) {\n var l = y, l2 = l * l, l6 = l2 * l2 * l2;\n for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n if (abs(delta) < epsilon2) break;\n }\n return [\n M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l),\n asin(sin(l) / M)\n ];\n};\n\nexport default function() {\n return projection(equalEarthRaw)\n .scale(177.158);\n}\n","import {atan, cos, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function gnomonicRaw(x, y) {\n var cy = cos(y), k = cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\ngnomonicRaw.invert = azimuthalInvert(atan);\n\nexport default function() {\n return projection(gnomonicRaw)\n .scale(144.049)\n .clipAngle(60);\n}\n","import clipRectangle from \"../clip/rectangle\";\nimport identity from \"../identity\";\nimport {transformer} from \"../transform\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit\";\n\nfunction scaleTranslate(kx, ky, tx, ty) {\n return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({\n point: function(x, y) {\n this.stream.point(x * kx + tx, y * ky + ty);\n }\n });\n}\n\nexport default function() {\n var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect\n x0 = null, y0, x1, y1, // clip extent\n postclip = identity,\n cache,\n cacheStream,\n projection;\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return projection = {\n stream: function(stream) {\n return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\n },\n postclip: function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n },\n clipExtent: function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n },\n scale: function(_) {\n return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;\n },\n translate: function(_) {\n return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];\n },\n reflectX: function(_) {\n return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;\n },\n reflectY: function(_) {\n return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;\n },\n fitExtent: function(extent, object) {\n return fitExtent(projection, extent, object);\n },\n fitSize: function(size, object) {\n return fitSize(projection, size, object);\n },\n fitWidth: function(width, object) {\n return fitWidth(projection, width, object);\n },\n fitHeight: function(height, object) {\n return fitHeight(projection, height, object);\n }\n };\n}\n","import projection from \"./index\";\nimport {abs, epsilon} from \"../math\";\n\nexport function naturalEarth1Raw(lambda, phi) {\n var phi2 = phi * phi, phi4 = phi2 * phi2;\n return [\n lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),\n phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))\n ];\n}\n\nnaturalEarth1Raw.invert = function(x, y) {\n var phi = y, i = 25, delta;\n do {\n var phi2 = phi * phi, phi4 = phi2 * phi2;\n phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /\n (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));\n } while (abs(delta) > epsilon && --i > 0);\n return [\n x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),\n phi\n ];\n};\n\nexport default function() {\n return projection(naturalEarth1Raw)\n .scale(175.295);\n}\n","import {asin, cos, epsilon, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function orthographicRaw(x, y) {\n return [cos(y) * sin(x), sin(y)];\n}\n\northographicRaw.invert = azimuthalInvert(asin);\n\nexport default function() {\n return projection(orthographicRaw)\n .scale(249.5)\n .clipAngle(90 + epsilon);\n}\n","import {atan, cos, sin} from \"../math\";\nimport {azimuthalInvert} from \"./azimuthal\";\nimport projection from \"./index\";\n\nexport function stereographicRaw(x, y) {\n var cy = cos(y), k = 1 + cos(x) * cy;\n return [cy * sin(x) / k, sin(y) / k];\n}\n\nstereographicRaw.invert = azimuthalInvert(function(z) {\n return 2 * atan(z);\n});\n\nexport default function() {\n return projection(stereographicRaw)\n .scale(250)\n .clipAngle(142);\n}\n","import {atan, exp, halfPi, log, tan} from \"../math\";\nimport {mercatorProjection} from \"./mercator\";\n\nexport function transverseMercatorRaw(lambda, phi) {\n return [log(tan((halfPi + phi) / 2)), -lambda];\n}\n\ntransverseMercatorRaw.invert = function(x, y) {\n return [-y, 2 * atan(exp(x)) - halfPi];\n};\n\nexport default function() {\n var m = mercatorProjection(transverseMercatorRaw),\n center = m.center,\n rotate = m.rotate;\n\n m.center = function(_) {\n return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n };\n\n m.rotate = function(_) {\n return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);\n };\n\n return rotate([0, 0, 90])\n .scale(159.155);\n}\n","function defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\nfunction meanX(children) {\n return children.reduce(meanXReduce, 0) / children.length;\n}\n\nfunction meanXReduce(x, c) {\n return x + c.x;\n}\n\nfunction maxY(children) {\n return 1 + children.reduce(maxYReduce, 0);\n}\n\nfunction maxYReduce(y, c) {\n return Math.max(y, c.y);\n}\n\nfunction leafLeft(node) {\n var children;\n while (children = node.children) node = children[0];\n return node;\n}\n\nfunction leafRight(node) {\n var children;\n while (children = node.children) node = children[children.length - 1];\n return node;\n}\n\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = false;\n\n function cluster(root) {\n var previousNode,\n x = 0;\n\n // First walk, computing the initial x & y values.\n root.eachAfter(function(node) {\n var children = node.children;\n if (children) {\n node.x = meanX(children);\n node.y = maxY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n\n var left = leafLeft(root),\n right = leafRight(root),\n x0 = left.x - separation(left, right) / 2,\n x1 = right.x + separation(right, left) / 2;\n\n // Second walk, normalizing x & y to the desired size.\n return root.eachAfter(nodeSize ? function(node) {\n node.x = (node.x - root.x) * dx;\n node.y = (root.y - node.y) * dy;\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * dx;\n node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n });\n }\n\n cluster.separation = function(x) {\n return arguments.length ? (separation = x, cluster) : separation;\n };\n\n cluster.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);\n };\n\n cluster.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);\n };\n\n return cluster;\n}\n","function count(node) {\n var sum = 0,\n children = node.children,\n i = children && children.length;\n if (!i) sum = 1;\n else while (--i >= 0) sum += children[i].value;\n node.value = sum;\n}\n\nexport default function() {\n return this.eachAfter(count);\n}\n","import node_count from \"./count\";\nimport node_each from \"./each\";\nimport node_eachBefore from \"./eachBefore\";\nimport node_eachAfter from \"./eachAfter\";\nimport node_sum from \"./sum\";\nimport node_sort from \"./sort\";\nimport node_path from \"./path\";\nimport node_ancestors from \"./ancestors\";\nimport node_descendants from \"./descendants\";\nimport node_leaves from \"./leaves\";\nimport node_links from \"./links\";\n\nexport default function hierarchy(data, children) {\n var root = new Node(data),\n valued = +data.value && (root.value = data.value),\n node,\n nodes = [root],\n child,\n childs,\n i,\n n;\n\n if (children == null) children = defaultChildren;\n\n while (node = nodes.pop()) {\n if (valued) node.value = +node.data.value;\n if ((childs = children(node.data)) && (n = childs.length)) {\n node.children = new Array(n);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new Node(childs[i]));\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n\n return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n return hierarchy(this).eachBefore(copyData);\n}\n\nfunction defaultChildren(d) {\n return d.children;\n}\n\nfunction copyData(node) {\n node.data = node.data.data;\n}\n\nexport function computeHeight(node) {\n var height = 0;\n do node.height = height;\n while ((node = node.parent) && (node.height < ++height));\n}\n\nexport function Node(data) {\n this.data = data;\n this.depth =\n this.height = 0;\n this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n constructor: Node,\n count: node_count,\n each: node_each,\n eachAfter: node_eachAfter,\n eachBefore: node_eachBefore,\n sum: node_sum,\n sort: node_sort,\n path: node_path,\n ancestors: node_ancestors,\n descendants: node_descendants,\n leaves: node_leaves,\n links: node_links,\n copy: node_copy\n};\n","export default function(callback) {\n var node = this, current, next = [node], children, i, n;\n do {\n current = next.reverse(), next = [];\n while (node = current.pop()) {\n callback(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n next.push(children[i]);\n }\n }\n } while (next.length);\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], next = [], children, i, n;\n while (node = nodes.pop()) {\n next.push(node), children = node.children;\n if (children) for (i = 0, n = children.length; i < n; ++i) {\n nodes.push(children[i]);\n }\n }\n while (node = next.pop()) {\n callback(node);\n }\n return this;\n}\n","export default function(callback) {\n var node = this, nodes = [node], children, i;\n while (node = nodes.pop()) {\n callback(node), children = node.children;\n if (children) for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n return this;\n}\n","export default function(value) {\n return this.eachAfter(function(node) {\n var sum = +value(node.data) || 0,\n children = node.children,\n i = children && children.length;\n while (--i >= 0) sum += children[i].value;\n node.value = sum;\n });\n}\n","export default function(compare) {\n return this.eachBefore(function(node) {\n if (node.children) {\n node.children.sort(compare);\n }\n });\n}\n","export default function(end) {\n var start = this,\n ancestor = leastCommonAncestor(start, end),\n nodes = [start];\n while (start !== ancestor) {\n start = start.parent;\n nodes.push(start);\n }\n var k = nodes.length;\n while (end !== ancestor) {\n nodes.splice(k, 0, end);\n end = end.parent;\n }\n return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = a.ancestors(),\n bNodes = b.ancestors(),\n c = null;\n a = aNodes.pop();\n b = bNodes.pop();\n while (a === b) {\n c = a;\n a = aNodes.pop();\n b = bNodes.pop();\n }\n return c;\n}\n","export default function() {\n var node = this, nodes = [node];\n while (node = node.parent) {\n nodes.push(node);\n }\n return nodes;\n}\n","export default function() {\n var nodes = [];\n this.each(function(node) {\n nodes.push(node);\n });\n return nodes;\n}\n","export default function() {\n var leaves = [];\n this.eachBefore(function(node) {\n if (!node.children) {\n leaves.push(node);\n }\n });\n return leaves;\n}\n","export default function() {\n var root = this, links = [];\n root.each(function(node) {\n if (node !== root) { // Don’t include the root’s parent, if any.\n links.push({source: node.parent, target: node});\n }\n });\n return links;\n}\n","export var slice = Array.prototype.slice;\n\nexport function shuffle(array) {\n var m = array.length,\n t,\n i;\n\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m];\n array[m] = array[i];\n array[i] = t;\n }\n\n return array;\n}\n","import {shuffle, slice} from \"../array\";\n\nexport default function(circles) {\n var i = 0, n = (circles = shuffle(slice.call(circles))).length, B = [], p, e;\n\n while (i < n) {\n p = circles[i];\n if (e && enclosesWeak(e, p)) ++i;\n else e = encloseBasis(B = extendBasis(B, p)), i = 0;\n }\n\n return e;\n}\n\nfunction extendBasis(B, p) {\n var i, j;\n\n if (enclosesWeakAll(p, B)) return [p];\n\n // If we get here then B must have at least one element.\n for (i = 0; i < B.length; ++i) {\n if (enclosesNot(p, B[i])\n && enclosesWeakAll(encloseBasis2(B[i], p), B)) {\n return [B[i], p];\n }\n }\n\n // If we get here then B must have at least two elements.\n for (i = 0; i < B.length - 1; ++i) {\n for (j = i + 1; j < B.length; ++j) {\n if (enclosesNot(encloseBasis2(B[i], B[j]), p)\n && enclosesNot(encloseBasis2(B[i], p), B[j])\n && enclosesNot(encloseBasis2(B[j], p), B[i])\n && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {\n return [B[i], B[j], p];\n }\n }\n }\n\n // If we get here then something is very wrong.\n throw new Error;\n}\n\nfunction enclosesNot(a, b) {\n var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;\n return dr < 0 || dr * dr < dx * dx + dy * dy;\n}\n\nfunction enclosesWeak(a, b) {\n var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;\n return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\n\nfunction enclosesWeakAll(a, B) {\n for (var i = 0; i < B.length; ++i) {\n if (!enclosesWeak(a, B[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction encloseBasis(B) {\n switch (B.length) {\n case 1: return encloseBasis1(B[0]);\n case 2: return encloseBasis2(B[0], B[1]);\n case 3: return encloseBasis3(B[0], B[1], B[2]);\n }\n}\n\nfunction encloseBasis1(a) {\n return {\n x: a.x,\n y: a.y,\n r: a.r\n };\n}\n\nfunction encloseBasis2(a, b) {\n var x1 = a.x, y1 = a.y, r1 = a.r,\n x2 = b.x, y2 = b.y, r2 = b.r,\n x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,\n l = Math.sqrt(x21 * x21 + y21 * y21);\n return {\n x: (x1 + x2 + x21 / l * r21) / 2,\n y: (y1 + y2 + y21 / l * r21) / 2,\n r: (l + r1 + r2) / 2\n };\n}\n\nfunction encloseBasis3(a, b, c) {\n var x1 = a.x, y1 = a.y, r1 = a.r,\n x2 = b.x, y2 = b.y, r2 = b.r,\n x3 = c.x, y3 = c.y, r3 = c.r,\n a2 = x1 - x2,\n a3 = x1 - x3,\n b2 = y1 - y2,\n b3 = y1 - y3,\n c2 = r2 - r1,\n c3 = r3 - r1,\n d1 = x1 * x1 + y1 * y1 - r1 * r1,\n d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,\n d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,\n ab = a3 * b2 - a2 * b3,\n xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,\n xb = (b3 * c2 - b2 * c3) / ab,\n ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,\n yb = (a2 * c3 - a3 * c2) / ab,\n A = xb * xb + yb * yb - 1,\n B = 2 * (r1 + xa * xb + ya * yb),\n C = xa * xa + ya * ya - r1 * r1,\n r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);\n return {\n x: x1 + xa + xb * r,\n y: y1 + ya + yb * r,\n r: r\n };\n}\n","import enclose from \"./enclose\";\n\nfunction place(b, a, c) {\n var dx = b.x - a.x, x, a2,\n dy = b.y - a.y, y, b2,\n d2 = dx * dx + dy * dy;\n if (d2) {\n a2 = a.r + c.r, a2 *= a2;\n b2 = b.r + c.r, b2 *= b2;\n if (a2 > b2) {\n x = (d2 + b2 - a2) / (2 * d2);\n y = Math.sqrt(Math.max(0, b2 / d2 - x * x));\n c.x = b.x - x * dx - y * dy;\n c.y = b.y - x * dy + y * dx;\n } else {\n x = (d2 + a2 - b2) / (2 * d2);\n y = Math.sqrt(Math.max(0, a2 / d2 - x * x));\n c.x = a.x + x * dx - y * dy;\n c.y = a.y + x * dy + y * dx;\n }\n } else {\n c.x = a.x + c.r;\n c.y = a.y;\n }\n}\n\nfunction intersects(a, b) {\n var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;\n return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\n\nfunction score(node) {\n var a = node._,\n b = node.next._,\n ab = a.r + b.r,\n dx = (a.x * b.r + b.x * a.r) / ab,\n dy = (a.y * b.r + b.y * a.r) / ab;\n return dx * dx + dy * dy;\n}\n\nfunction Node(circle) {\n this._ = circle;\n this.next = null;\n this.previous = null;\n}\n\nexport function packEnclose(circles) {\n if (!(n = circles.length)) return 0;\n\n var a, b, c, n, aa, ca, i, j, k, sj, sk;\n\n // Place the first circle.\n a = circles[0], a.x = 0, a.y = 0;\n if (!(n > 1)) return a.r;\n\n // Place the second circle.\n b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;\n if (!(n > 2)) return a.r + b.r;\n\n // Place the third circle.\n place(b, a, c = circles[2]);\n\n // Initialize the front-chain using the first three circles a, b and c.\n a = new Node(a), b = new Node(b), c = new Node(c);\n a.next = c.previous = b;\n b.next = a.previous = c;\n c.next = b.previous = a;\n\n // Attempt to place each remaining circle…\n pack: for (i = 3; i < n; ++i) {\n place(a._, b._, c = circles[i]), c = new Node(c);\n\n // Find the closest intersecting circle on the front-chain, if any.\n // “Closeness” is determined by linear distance along the front-chain.\n // “Ahead” or “behind” is likewise determined by linear distance.\n j = b.next, k = a.previous, sj = b._.r, sk = a._.r;\n do {\n if (sj <= sk) {\n if (intersects(j._, c._)) {\n b = j, a.next = b, b.previous = a, --i;\n continue pack;\n }\n sj += j._.r, j = j.next;\n } else {\n if (intersects(k._, c._)) {\n a = k, a.next = b, b.previous = a, --i;\n continue pack;\n }\n sk += k._.r, k = k.previous;\n }\n } while (j !== k.next);\n\n // Success! Insert the new circle c between a and b.\n c.previous = a, c.next = b, a.next = b.previous = b = c;\n\n // Compute the new closest circle pair to the centroid.\n aa = score(a);\n while ((c = c.next) !== b) {\n if ((ca = score(c)) < aa) {\n a = c, aa = ca;\n }\n }\n b = a.next;\n }\n\n // Compute the enclosing circle of the front chain.\n a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);\n\n // Translate the circles to put the enclosing circle around the origin.\n for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;\n\n return c.r;\n}\n\nexport default function(circles) {\n packEnclose(circles);\n return circles;\n}\n","export function optional(f) {\n return f == null ? null : required(f);\n}\n\nexport function required(f) {\n if (typeof f !== \"function\") throw new Error;\n return f;\n}\n","export function constantZero() {\n return 0;\n}\n\nexport default function(x) {\n return function() {\n return x;\n };\n}\n","import {packEnclose} from \"./siblings\";\nimport {optional} from \"../accessors\";\nimport constant, {constantZero} from \"../constant\";\n\nfunction defaultRadius(d) {\n return Math.sqrt(d.value);\n}\n\nexport default function() {\n var radius = null,\n dx = 1,\n dy = 1,\n padding = constantZero;\n\n function pack(root) {\n root.x = dx / 2, root.y = dy / 2;\n if (radius) {\n root.eachBefore(radiusLeaf(radius))\n .eachAfter(packChildren(padding, 0.5))\n .eachBefore(translateChild(1));\n } else {\n root.eachBefore(radiusLeaf(defaultRadius))\n .eachAfter(packChildren(constantZero, 1))\n .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))\n .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n }\n return root;\n }\n\n pack.radius = function(x) {\n return arguments.length ? (radius = optional(x), pack) : radius;\n };\n\n pack.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];\n };\n\n pack.padding = function(x) {\n return arguments.length ? (padding = typeof x === \"function\" ? x : constant(+x), pack) : padding;\n };\n\n return pack;\n}\n\nfunction radiusLeaf(radius) {\n return function(node) {\n if (!node.children) {\n node.r = Math.max(0, +radius(node) || 0);\n }\n };\n}\n\nfunction packChildren(padding, k) {\n return function(node) {\n if (children = node.children) {\n var children,\n i,\n n = children.length,\n r = padding(node) * k || 0,\n e;\n\n if (r) for (i = 0; i < n; ++i) children[i].r += r;\n e = packEnclose(children);\n if (r) for (i = 0; i < n; ++i) children[i].r -= r;\n node.r = e + r;\n }\n };\n}\n\nfunction translateChild(k) {\n return function(node) {\n var parent = node.parent;\n node.r *= k;\n if (parent) {\n node.x = parent.x + k * node.x;\n node.y = parent.y + k * node.y;\n }\n };\n}\n","export default function(node) {\n node.x0 = Math.round(node.x0);\n node.y0 = Math.round(node.y0);\n node.x1 = Math.round(node.x1);\n node.y1 = Math.round(node.y1);\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (x1 - x0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.y0 = y0, node.y1 = y1;\n node.x0 = x0, node.x1 = x0 += node.value * k;\n }\n}\n","import roundNode from \"./treemap/round\";\nimport treemapDice from \"./treemap/dice\";\n\nexport default function() {\n var dx = 1,\n dy = 1,\n padding = 0,\n round = false;\n\n function partition(root) {\n var n = root.height + 1;\n root.x0 =\n root.y0 = padding;\n root.x1 = dx;\n root.y1 = dy / n;\n root.eachBefore(positionNode(dy, n));\n if (round) root.eachBefore(roundNode);\n return root;\n }\n\n function positionNode(dy, n) {\n return function(node) {\n if (node.children) {\n treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);\n }\n var x0 = node.x0,\n y0 = node.y0,\n x1 = node.x1 - padding,\n y1 = node.y1 - padding;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n node.x0 = x0;\n node.y0 = y0;\n node.x1 = x1;\n node.y1 = y1;\n };\n }\n\n partition.round = function(x) {\n return arguments.length ? (round = !!x, partition) : round;\n };\n\n partition.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];\n };\n\n partition.padding = function(x) {\n return arguments.length ? (padding = +x, partition) : padding;\n };\n\n return partition;\n}\n","import {required} from \"./accessors\";\nimport {Node, computeHeight} from \"./hierarchy/index\";\n\nvar keyPrefix = \"$\", // Protect against keys like “__proto__”.\n preroot = {depth: -1},\n ambiguous = {};\n\nfunction defaultId(d) {\n return d.id;\n}\n\nfunction defaultParentId(d) {\n return d.parentId;\n}\n\nexport default function() {\n var id = defaultId,\n parentId = defaultParentId;\n\n function stratify(data) {\n var d,\n i,\n n = data.length,\n root,\n parent,\n node,\n nodes = new Array(n),\n nodeId,\n nodeKey,\n nodeByKey = {};\n\n for (i = 0; i < n; ++i) {\n d = data[i], node = nodes[i] = new Node(d);\n if ((nodeId = id(d, i, data)) != null && (nodeId += \"\")) {\n nodeKey = keyPrefix + (node.id = nodeId);\n nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;\n }\n }\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], nodeId = parentId(data[i], i, data);\n if (nodeId == null || !(nodeId += \"\")) {\n if (root) throw new Error(\"multiple roots\");\n root = node;\n } else {\n parent = nodeByKey[keyPrefix + nodeId];\n if (!parent) throw new Error(\"missing: \" + nodeId);\n if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n if (parent.children) parent.children.push(node);\n else parent.children = [node];\n node.parent = parent;\n }\n }\n\n if (!root) throw new Error(\"no root\");\n root.parent = preroot;\n root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);\n root.parent = null;\n if (n > 0) throw new Error(\"cycle\");\n\n return root;\n }\n\n stratify.id = function(x) {\n return arguments.length ? (id = required(x), stratify) : id;\n };\n\n stratify.parentId = function(x) {\n return arguments.length ? (parentId = required(x), stratify) : parentId;\n };\n\n return stratify;\n}\n","import {Node} from \"./hierarchy/index\";\n\nfunction defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\n// function radialSeparation(a, b) {\n// return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\nfunction nextLeft(v) {\n var children = v.children;\n return children ? children[0] : v.t;\n}\n\n// This function works analogously to nextLeft.\nfunction nextRight(v) {\n var children = v.children;\n return children ? children[children.length - 1] : v.t;\n}\n\n// Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\nfunction moveSubtree(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n}\n\n// All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\nfunction executeShifts(v) {\n var shift = 0,\n change = 0,\n children = v.children,\n i = children.length,\n w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n}\n\n// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\nfunction nextAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n}\n\nfunction TreeNode(node, i) {\n this._ = node;\n this.parent = null;\n this.children = null;\n this.A = null; // default ancestor\n this.a = this; // ancestor\n this.z = 0; // prelim\n this.m = 0; // mod\n this.c = 0; // change\n this.s = 0; // shift\n this.t = null; // thread\n this.i = i; // number\n}\n\nTreeNode.prototype = Object.create(Node.prototype);\n\nfunction treeRoot(root) {\n var tree = new TreeNode(root, 0),\n node,\n nodes = [tree],\n child,\n children,\n i,\n n;\n\n while (node = nodes.pop()) {\n if (children = node._.children) {\n node.children = new Array(n = children.length);\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n child.parent = node;\n }\n }\n }\n\n (tree.parent = new TreeNode(null, 0)).children = [tree];\n return tree;\n}\n\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = null;\n\n function tree(root) {\n var t = treeRoot(root);\n\n // Compute the layout using Buchheim et al.’s algorithm.\n t.eachAfter(firstWalk), t.parent.m = -t.z;\n t.eachBefore(secondWalk);\n\n // If a fixed node size is specified, scale x and y.\n if (nodeSize) root.eachBefore(sizeNode);\n\n // If a fixed tree size is specified, scale x and y based on the extent.\n // Compute the left-most, right-most, and depth-most nodes for extents.\n else {\n var left = root,\n right = root,\n bottom = root;\n root.eachBefore(function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var s = left === right ? 1 : separation(left, right) / 2,\n tx = s - left.x,\n kx = dx / (right.x + s + tx),\n ky = dy / (bottom.depth || 1);\n root.eachBefore(function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n\n return root;\n }\n\n // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n // applied recursively to the children of v, as well as the function\n // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n // node v is placed to the midpoint of its outermost children.\n function firstWalk(v) {\n var children = v.children,\n siblings = v.parent.children,\n w = v.i ? siblings[v.i - 1] : null;\n if (children) {\n executeShifts(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n\n // Computes all real x-coordinates by summing up the modifiers recursively.\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n\n // The core of the algorithm. Here, a new subtree is combined with the\n // previous subtrees. Threads are used to traverse the inside and outside\n // contours of the left and right subtree up to the highest common level. The\n // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n // superscript o means outside and i means inside, the subscript - means left\n // subtree and + means right subtree. For summing up the modifiers along the\n // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n // nodes of the inside contours conflict, we compute the left one of the\n // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n // Finally, we add a new thread (if necessary).\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v,\n vop = v,\n vim = w,\n vom = vip.parent.children[0],\n sip = vip.m,\n sop = vop.m,\n sim = vim.m,\n som = vom.m,\n shift;\n while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n vom = nextLeft(vom);\n vop = nextRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !nextRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !nextLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n\n function sizeNode(node) {\n node.x *= dx;\n node.y = node.depth * dy;\n }\n\n tree.separation = function(x) {\n return arguments.length ? (separation = x, tree) : separation;\n };\n\n tree.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);\n };\n\n tree.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);\n };\n\n return tree;\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n node,\n i = -1,\n n = nodes.length,\n k = parent.value && (y1 - y0) / parent.value;\n\n while (++i < n) {\n node = nodes[i], node.x0 = x0, node.x1 = x1;\n node.y0 = y0, node.y1 = y0 += node.value * k;\n }\n}\n","import treemapDice from \"./dice\";\nimport treemapSlice from \"./slice\";\n\nexport var phi = (1 + Math.sqrt(5)) / 2;\n\nexport function squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n var rows = [],\n nodes = parent.children,\n row,\n nodeValue,\n i0 = 0,\n i1 = 0,\n n = nodes.length,\n dx, dy,\n value = parent.value,\n sumValue,\n minValue,\n maxValue,\n newRatio,\n minRatio,\n alpha,\n beta;\n\n while (i0 < n) {\n dx = x1 - x0, dy = y1 - y0;\n\n // Find the next non-empty node.\n do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\n minValue = maxValue = sumValue;\n alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n beta = sumValue * sumValue * alpha;\n minRatio = Math.max(maxValue / beta, beta / minValue);\n\n // Keep adding nodes while the aspect ratio maintains or improves.\n for (; i1 < n; ++i1) {\n sumValue += nodeValue = nodes[i1].value;\n if (nodeValue < minValue) minValue = nodeValue;\n if (nodeValue > maxValue) maxValue = nodeValue;\n beta = sumValue * sumValue * alpha;\n newRatio = Math.max(maxValue / beta, beta / minValue);\n if (newRatio > minRatio) { sumValue -= nodeValue; break; }\n minRatio = newRatio;\n }\n\n // Position and record the row orientation.\n rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});\n if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n value -= sumValue, i0 = i1;\n }\n\n return rows;\n}\n\nexport default (function custom(ratio) {\n\n function squarify(parent, x0, y0, x1, y1) {\n squarifyRatio(ratio, parent, x0, y0, x1, y1);\n }\n\n squarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return squarify;\n})(phi);\n","import roundNode from \"./round\";\nimport squarify from \"./squarify\";\nimport {required} from \"../accessors\";\nimport constant, {constantZero} from \"../constant\";\n\nexport default function() {\n var tile = squarify,\n round = false,\n dx = 1,\n dy = 1,\n paddingStack = [0],\n paddingInner = constantZero,\n paddingTop = constantZero,\n paddingRight = constantZero,\n paddingBottom = constantZero,\n paddingLeft = constantZero;\n\n function treemap(root) {\n root.x0 =\n root.y0 = 0;\n root.x1 = dx;\n root.y1 = dy;\n root.eachBefore(positionNode);\n paddingStack = [0];\n if (round) root.eachBefore(roundNode);\n return root;\n }\n\n function positionNode(node) {\n var p = paddingStack[node.depth],\n x0 = node.x0 + p,\n y0 = node.y0 + p,\n x1 = node.x1 - p,\n y1 = node.y1 - p;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n node.x0 = x0;\n node.y0 = y0;\n node.x1 = x1;\n node.y1 = y1;\n if (node.children) {\n p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n x0 += paddingLeft(node) - p;\n y0 += paddingTop(node) - p;\n x1 -= paddingRight(node) - p;\n y1 -= paddingBottom(node) - p;\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n tile(node, x0, y0, x1, y1);\n }\n }\n\n treemap.round = function(x) {\n return arguments.length ? (round = !!x, treemap) : round;\n };\n\n treemap.size = function(x) {\n return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];\n };\n\n treemap.tile = function(x) {\n return arguments.length ? (tile = required(x), treemap) : tile;\n };\n\n treemap.padding = function(x) {\n return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\n };\n\n treemap.paddingInner = function(x) {\n return arguments.length ? (paddingInner = typeof x === \"function\" ? x : constant(+x), treemap) : paddingInner;\n };\n\n treemap.paddingOuter = function(x) {\n return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\n };\n\n treemap.paddingTop = function(x) {\n return arguments.length ? (paddingTop = typeof x === \"function\" ? x : constant(+x), treemap) : paddingTop;\n };\n\n treemap.paddingRight = function(x) {\n return arguments.length ? (paddingRight = typeof x === \"function\" ? x : constant(+x), treemap) : paddingRight;\n };\n\n treemap.paddingBottom = function(x) {\n return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : constant(+x), treemap) : paddingBottom;\n };\n\n treemap.paddingLeft = function(x) {\n return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : constant(+x), treemap) : paddingLeft;\n };\n\n return treemap;\n}\n","export default function(parent, x0, y0, x1, y1) {\n var nodes = parent.children,\n i, n = nodes.length,\n sum, sums = new Array(n + 1);\n\n for (sums[0] = sum = i = 0; i < n; ++i) {\n sums[i + 1] = sum += nodes[i].value;\n }\n\n partition(0, n, parent.value, x0, y0, x1, y1);\n\n function partition(i, j, value, x0, y0, x1, y1) {\n if (i >= j - 1) {\n var node = nodes[i];\n node.x0 = x0, node.y0 = y0;\n node.x1 = x1, node.y1 = y1;\n return;\n }\n\n var valueOffset = sums[i],\n valueTarget = (value / 2) + valueOffset,\n k = i + 1,\n hi = j - 1;\n\n while (k < hi) {\n var mid = k + hi >>> 1;\n if (sums[mid] < valueTarget) k = mid + 1;\n else hi = mid;\n }\n\n if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;\n\n var valueLeft = sums[k] - valueOffset,\n valueRight = value - valueLeft;\n\n if ((x1 - x0) > (y1 - y0)) {\n var xk = (x0 * valueRight + x1 * valueLeft) / value;\n partition(i, k, valueLeft, x0, y0, xk, y1);\n partition(k, j, valueRight, xk, y0, x1, y1);\n } else {\n var yk = (y0 * valueRight + y1 * valueLeft) / value;\n partition(i, k, valueLeft, x0, y0, x1, yk);\n partition(k, j, valueRight, x0, yk, x1, y1);\n }\n }\n}\n","import dice from \"./dice\";\nimport slice from \"./slice\";\n\nexport default function(parent, x0, y0, x1, y1) {\n (parent.depth & 1 ? slice : dice)(parent, x0, y0, x1, y1);\n}\n","import treemapDice from \"./dice\";\nimport treemapSlice from \"./slice\";\nimport {phi, squarifyRatio} from \"./squarify\";\n\nexport default (function custom(ratio) {\n\n function resquarify(parent, x0, y0, x1, y1) {\n if ((rows = parent._squarify) && (rows.ratio === ratio)) {\n var rows,\n row,\n nodes,\n i,\n j = -1,\n n,\n m = rows.length,\n value = parent.value;\n\n while (++j < m) {\n row = rows[j], nodes = row.children;\n for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);\n else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);\n value -= row.value;\n }\n } else {\n parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);\n rows.ratio = ratio;\n }\n }\n\n resquarify.ratio = function(x) {\n return custom((x = +x) > 1 ? x : 1);\n };\n\n return resquarify;\n})(phi);\n","export default function(polygon) {\n var i = -1,\n n = polygon.length,\n a,\n b = polygon[n - 1],\n area = 0;\n\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n}\n","export default function(polygon) {\n var i = -1,\n n = polygon.length,\n x = 0,\n y = 0,\n a,\n b = polygon[n - 1],\n c,\n k = 0;\n\n while (++i < n) {\n a = b;\n b = polygon[i];\n k += c = a[0] * b[1] - b[0] * a[1];\n x += (a[0] + b[0]) * c;\n y += (a[1] + b[1]) * c;\n }\n\n return k *= 3, [x / k, y / k];\n}\n","// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of\n// the 3D cross product in a quadrant I Cartesian coordinate system (+x is\n// right, +y is up). Returns a positive value if ABC is counter-clockwise,\n// negative if clockwise, and zero if the points are collinear.\nexport default function(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n","import cross from \"./cross\";\n\nfunction lexicographicOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n}\n\n// Computes the upper convex hull per the monotone chain algorithm.\n// Assumes points.length >= 3, is sorted by x, unique in y.\n// Returns an array of indices into points in left-to-right order.\nfunction computeUpperHullIndexes(points) {\n var n = points.length,\n indexes = [0, 1],\n size = 2;\n\n for (var i = 2; i < n; ++i) {\n while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;\n indexes[size++] = i;\n }\n\n return indexes.slice(0, size); // remove popped points\n}\n\nexport default function(points) {\n if ((n = points.length) < 3) return null;\n\n var i,\n n,\n sortedPoints = new Array(n),\n flippedPoints = new Array(n);\n\n for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];\n sortedPoints.sort(lexicographicOrder);\n for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];\n\n var upperIndexes = computeUpperHullIndexes(sortedPoints),\n lowerIndexes = computeUpperHullIndexes(flippedPoints);\n\n // Construct the hull polygon, removing possible duplicate endpoints.\n var skipLeft = lowerIndexes[0] === upperIndexes[0],\n skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],\n hull = [];\n\n // Add upper hull in right-to-l order.\n // Then add lower hull in left-to-right order.\n for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);\n for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);\n\n return hull;\n}\n","export default function(polygon, point) {\n var n = polygon.length,\n p = polygon[n - 1],\n x = point[0], y = point[1],\n x0 = p[0], y0 = p[1],\n x1, y1,\n inside = false;\n\n for (var i = 0; i < n; ++i) {\n p = polygon[i], x1 = p[0], y1 = p[1];\n if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;\n x0 = x1, y0 = y1;\n }\n\n return inside;\n}\n","export default function(polygon) {\n var i = -1,\n n = polygon.length,\n b = polygon[n - 1],\n xa,\n ya,\n xb = b[0],\n yb = b[1],\n perimeter = 0;\n\n while (++i < n) {\n xa = xb;\n ya = yb;\n b = polygon[i];\n xb = b[0];\n yb = b[1];\n xa -= xb;\n ya -= yb;\n perimeter += Math.sqrt(xa * xa + ya * ya);\n }\n\n return perimeter;\n}\n","export default function() {\n return Math.random();\n}\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomUniform(source) {\n function randomUniform(min, max) {\n min = min == null ? 0 : +min;\n max = max == null ? 1 : +max;\n if (arguments.length === 1) max = min, min = 0;\n else max -= min;\n return function() {\n return source() * max + min;\n };\n }\n\n randomUniform.source = sourceRandomUniform;\n\n return randomUniform;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomNormal(source) {\n function randomNormal(mu, sigma) {\n var x, r;\n mu = mu == null ? 0 : +mu;\n sigma = sigma == null ? 1 : +sigma;\n return function() {\n var y;\n\n // If available, use the second previously-generated uniform random.\n if (x != null) y = x, x = null;\n\n // Otherwise, generate a new x and y.\n else do {\n x = source() * 2 - 1;\n y = source() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n\n return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\n };\n }\n\n randomNormal.source = sourceRandomNormal;\n\n return randomNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport normal from \"./normal\";\n\nexport default (function sourceRandomLogNormal(source) {\n function randomLogNormal() {\n var randomNormal = normal.source(source).apply(this, arguments);\n return function() {\n return Math.exp(randomNormal());\n };\n }\n\n randomLogNormal.source = sourceRandomLogNormal;\n\n return randomLogNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomIrwinHall(source) {\n function randomIrwinHall(n) {\n return function() {\n for (var sum = 0, i = 0; i < n; ++i) sum += source();\n return sum;\n };\n }\n\n randomIrwinHall.source = sourceRandomIrwinHall;\n\n return randomIrwinHall;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport irwinHall from \"./irwinHall\";\n\nexport default (function sourceRandomBates(source) {\n function randomBates(n) {\n var randomIrwinHall = irwinHall.source(source)(n);\n return function() {\n return randomIrwinHall() / n;\n };\n }\n\n randomBates.source = sourceRandomBates;\n\n return randomBates;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomExponential(source) {\n function randomExponential(lambda) {\n return function() {\n return -Math.log(1 - source()) / lambda;\n };\n }\n\n randomExponential.source = sourceRandomExponential;\n\n return randomExponential;\n})(defaultSource);\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal(range) {\n var index = map(),\n domain = [],\n unknown = implicit;\n\n range = range == null ? [] : slice.call(range);\n\n function scale(d) {\n var key = d + \"\", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport ordinal from \"./ordinal\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n range = [0, 1],\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = range[1] < range[0],\n start = range[reverse - 0],\n stop = range[1 - reverse];\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = [+_[0], +_[1]], round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band()\n .domain(domain())\n .range(range)\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return rescale();\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band().paddingInner(1));\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nexport default function continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n return rescale();\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(domain, count, specifier) {\n var start = domain[0],\n stop = domain[domain.length - 1],\n step = tickStep(start, stop, count == null ? 10 : count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n return tickFormat(domain(), count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous(deinterpolate, reinterpolate);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n return linearish(scale);\n}\n","import {map} from \"./array\";\nimport {linearish} from \"./linear\";\nimport number from \"./number\";\n\nexport default function identity() {\n var domain = [0, 1];\n\n function scale(x) {\n return +x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = function(_) {\n return arguments.length ? (domain = map.call(_, number), scale) : domain.slice();\n };\n\n scale.copy = function() {\n return identity().domain(domain);\n };\n\n return linearish(scale);\n}\n","export default function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","import {ticks} from \"d3-array\";\nimport {format} from \"d3-format\";\nimport constant from \"./constant\";\nimport nice from \"./nice\";\nimport {default as continuous, copy} from \"./continuous\";\n\nfunction deinterpolate(a, b) {\n return (b = Math.log(b / a))\n ? function(x) { return Math.log(x / a) / b; }\n : constant(b);\n}\n\nfunction reinterpolate(a, b) {\n return a < 0\n ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }\n : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : function(x) { return Math.pow(base, x); };\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n}\n\nfunction reflect(f) {\n return function(x) {\n return -f(-x);\n };\n}\n\nexport default function log() {\n var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),\n domain = scale.domain,\n base = 10,\n logs = logp(10),\n pows = powp(10);\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = function(count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n\n if (r = v < u) i = u, u = v, v = i;\n\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.round(i) - 1, j = Math.round(j) + 1;\n if (u > 0) for (; i < j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i < j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = function(count, specifier) {\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n if (typeof specifier !== \"function\") specifier = format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function(d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = function() {\n return domain(nice(domain(), {\n floor: function(x) { return pows(Math.floor(logs(x))); },\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\n }));\n };\n\n scale.copy = function() {\n return copy(scale, log().base(base));\n };\n\n return scale;\n}\n","import constant from \"./constant\";\nimport {linearish} from \"./linear\";\nimport {default as continuous, copy} from \"./continuous\";\n\nfunction raise(x, exponent) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n}\n\nexport default function pow() {\n var exponent = 1,\n scale = continuous(deinterpolate, reinterpolate),\n domain = scale.domain;\n\n function deinterpolate(a, b) {\n return (b = raise(b, exponent) - (a = raise(a, exponent)))\n ? function(x) { return (raise(x, exponent) - a) / b; }\n : constant(b);\n }\n\n function reinterpolate(a, b) {\n b = raise(b, exponent) - (a = raise(a, exponent));\n return function(t) { return raise(a + b * t, 1 / exponent); };\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, domain(domain())) : exponent;\n };\n\n scale.copy = function() {\n return copy(scale, pow().exponent(exponent));\n };\n\n return linearish(scale);\n}\n\nexport function sqrt() {\n return pow().exponent(0.5);\n}\n","import {ascending, bisect, quantile as threshold} from \"d3-array\";\nimport {slice} from \"./array\";\n\nexport default function quantile() {\n var domain = [],\n range = [],\n thresholds = [];\n\n function rescale() {\n var i = 0, n = Math.max(1, range.length);\n thresholds = new Array(n - 1);\n while (++i < n) thresholds[i - 1] = threshold(domain, i / n);\n return scale;\n }\n\n function scale(x) {\n if (!isNaN(x = +x)) return range[bisect(thresholds, x)];\n }\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN] : [\n i > 0 ? thresholds[i - 1] : domain[0],\n i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n ];\n };\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n domain.sort(ascending);\n return rescale();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.quantiles = function() {\n return thresholds.slice();\n };\n\n scale.copy = function() {\n return quantile()\n .domain(domain)\n .range(range);\n };\n\n return scale;\n}\n","import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {linearish} from \"./linear\";\n\nexport default function quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range = [0, 1];\n\n function scale(x) {\n if (x <= x) return range[bisect(domain, x, 0, n)];\n }\n\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n return scale;\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n };\n\n scale.range = function(_) {\n return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN]\n : i < 1 ? [x0, domain[0]]\n : i >= n ? [domain[n - 1], x1]\n : [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return quantize()\n .domain([x0, x1])\n .range(range);\n };\n\n return linearish(scale);\n}\n","import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\n\nexport default function threshold() {\n var domain = [0.5],\n range = [0, 1],\n n = 1;\n\n function scale(x) {\n if (x <= x) return range[bisect(domain, x, 0, n)];\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return threshold()\n .domain(domain)\n .range(range);\n };\n\n return scale;\n}\n","var t0 = new Date,\n t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = new Date(+date)), date;\n }\n\n interval.floor = interval;\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n","import interval from \"./interval\";\n\nvar millisecond = interval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval\";\nimport {durationSecond} from \"./duration\";\n\nvar second = interval(function(date) {\n date.setTime(Math.floor(date / durationSecond) * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar minute = interval(function(date) {\n date.setTime(Math.floor(date / durationMinute) * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","import interval from \"./interval\";\nimport {durationHour, durationMinute} from \"./duration\";\n\nvar hour = interval(function(date) {\n var offset = date.getTimezoneOffset() * durationMinute % durationHour;\n if (offset < 0) offset += durationHour;\n date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import interval from \"./interval\";\nimport {durationDay, durationMinute} from \"./duration\";\n\nvar day = interval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval\";\nimport {durationMinute, durationWeek} from \"./duration\";\n\nfunction weekday(i) {\n return interval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import interval from \"./interval\";\n\nvar month = interval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval\";\n\nvar year = interval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar utcMinute = interval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","import interval from \"./interval\";\nimport {durationHour} from \"./duration\";\n\nvar utcHour = interval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import interval from \"./interval\";\nimport {durationDay} from \"./duration\";\n\nvar utcDay = interval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval\";\nimport {durationWeek} from \"./duration\";\n\nfunction utcWeekday(i) {\n return interval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval\";\n\nvar utcMonth = interval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import interval from \"./interval\";\n\nvar utcYear = interval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newYear(y) {\n return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, newDate) {\n return function(string) {\n var d = newYear(1900),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newYear(d.y)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = newDate(newYear(d.y)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return newDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", localDate);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier, utcDate);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {utcFormat} from \"./defaultLocale\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat\";\nimport {utcParse} from \"./defaultLocale\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import {bisector, tickStep} from \"d3-array\";\nimport {interpolateNumber as reinterpolate} from \"d3-interpolate\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport {default as continuous, copy, deinterpolateLinear as deinterpolate} from \"./continuous\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n durationMinute = durationSecond * 60,\n durationHour = durationMinute * 60,\n durationDay = durationHour * 24,\n durationWeek = durationDay * 7,\n durationMonth = durationDay * 30,\n durationYear = durationDay * 365;\n\nfunction date(t) {\n return new Date(t);\n}\n\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n var scale = continuous(deinterpolate, reinterpolate),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n\n var tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === \"number\") {\n var target = Math.abs(stop - start) / interval,\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = Math.max(tickStep(start, stop, interval), 1);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n };\n\n return scale;\n}\n\nexport default function() {\n return calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n}\n","import {calendar} from \"./time\";\nimport {utcFormat} from \"d3-time-format\";\nimport {utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond} from \"d3-time\";\n\nexport default function() {\n return calendar(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);\n}\n","import {linearish} from \"./linear\";\n\nexport default function sequential(interpolator) {\n var x0 = 0,\n x1 = 1,\n k10 = 1,\n clamp = false;\n\n function scale(x) {\n var t = (x - x0) * k10;\n return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], k10 = x0 === x1 ? 0 : 1 / (x1 - x0), scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return sequential(interpolator).domain([x0, x1]).clamp(clamp);\n };\n\n return linearish(scale);\n}\n","import {linearish} from \"./linear\";\n\nexport default function diverging(interpolator) {\n var x0 = 0,\n x1 = 0.5,\n x2 = 1,\n k10 = 1,\n k21 = 1,\n clamp = false;\n\n function scale(x) {\n var t = 0.5 + ((x = +x) - x1) * (x < x1 ? k10 : k21);\n return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], x2 = +_[2], k10 = x0 === x1 ? 0 : 0.5 / (x1 - x0), k21 = x1 === x2 ? 0 : 0.5 / (x2 - x1), scale) : [x0, x1, x2];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return diverging(interpolator).domain([x0, x1, x2]).clamp(clamp);\n };\n\n return linearish(scale);\n}\n","export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n","import colors from \"../colors\";\n\nexport default colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n","import colors from \"../colors\";\n\nexport default colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","import colors from \"../colors\";\n\nexport default colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n","import colors from \"../colors\";\n\nexport default colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n","import colors from \"../colors\";\n\nexport default colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n","import colors from \"../colors\";\n\nexport default colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n","import colors from \"../colors\";\n\nexport default colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n","import {interpolateRgbBasis} from \"d3-interpolate\";\n\nexport default function(scheme) {\n return interpolateRgbBasis(scheme[scheme.length - 1]);\n}\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"d8b365f5f5f55ab4ac\",\n \"a6611adfc27d80cdc1018571\",\n \"a6611adfc27df5f5f580cdc1018571\",\n \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\n \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\n \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\n \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\n \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\n \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"af8dc3f7f7f77fbf7b\",\n \"7b3294c2a5cfa6dba0008837\",\n \"7b3294c2a5cff7f7f7a6dba0008837\",\n \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\n \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\n \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\n \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\n \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\n \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e9a3c9f7f7f7a1d76a\",\n \"d01c8bf1b6dab8e1864dac26\",\n \"d01c8bf1b6daf7f7f7b8e1864dac26\",\n \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\n \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\n \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\n \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\n \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\n \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"998ec3f7f7f7f1a340\",\n \"5e3c99b2abd2fdb863e66101\",\n \"5e3c99b2abd2f7f7f7fdb863e66101\",\n \"542788998ec3d8daebfee0b6f1a340b35806\",\n \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\n \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\n \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\n \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\n \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62f7f7f767a9cf\",\n \"ca0020f4a58292c5de0571b0\",\n \"ca0020f4a582f7f7f792c5de0571b0\",\n \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\n \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\n \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\n \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\n \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62ffffff999999\",\n \"ca0020f4a582bababa404040\",\n \"ca0020f4a582ffffffbababa404040\",\n \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\n \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\n \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\n \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\n \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\n \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91bfdb\",\n \"d7191cfdae61abd9e92c7bb6\",\n \"d7191cfdae61ffffbfabd9e92c7bb6\",\n \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\n \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\n \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\n \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\n \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\n \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91cf60\",\n \"d7191cfdae61a6d96a1a9641\",\n \"d7191cfdae61ffffbfa6d96a1a9641\",\n \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\n \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\n \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\n \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\n \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\n \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf99d594\",\n \"d7191cfdae61abdda42b83ba\",\n \"d7191cfdae61ffffbfabdda42b83ba\",\n \"d53e4ffc8d59fee08be6f59899d5943288bd\",\n \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\n \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\n \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\n \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\n \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5f999d8c92ca25f\",\n \"edf8fbb2e2e266c2a4238b45\",\n \"edf8fbb2e2e266c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0ecf49ebcda8856a7\",\n \"edf8fbb3cde38c96c688419d\",\n \"edf8fbb3cde38c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0f3dba8ddb543a2ca\",\n \"f0f9e8bae4bc7bccc42b8cbe\",\n \"f0f9e8bae4bc7bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee8c8fdbb84e34a33\",\n \"fef0d9fdcc8afc8d59d7301f\",\n \"fef0d9fdcc8afc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece2f0a6bddb1c9099\",\n \"f6eff7bdc9e167a9cf02818a\",\n \"f6eff7bdc9e167a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece7f2a6bddb2b8cbe\",\n \"f1eef6bdc9e174a9cf0570b0\",\n \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e7e1efc994c7dd1c77\",\n \"f1eef6d7b5d8df65b0ce1256\",\n \"f1eef6d7b5d8df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fde0ddfa9fb5c51b8a\",\n \"feebe2fbb4b9f768a1ae017e\",\n \"feebe2fbb4b9f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"edf8b17fcdbb2c7fb8\",\n \"ffffcca1dab441b6c4225ea8\",\n \"ffffcca1dab441b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f7fcb9addd8e31a354\",\n \"ffffccc2e69978c679238443\",\n \"ffffccc2e69978c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fff7bcfec44fd95f0e\",\n \"ffffd4fed98efe9929cc4c02\",\n \"ffffd4fed98efe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ffeda0feb24cf03b20\",\n \"ffffb2fecc5cfd8d3ce31a1c\",\n \"ffffb2fecc5cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"deebf79ecae13182bd\",\n \"eff3ffbdd7e76baed62171b5\",\n \"eff3ffbdd7e76baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5e0a1d99b31a354\",\n \"edf8e9bae4b374c476238b45\",\n \"edf8e9bae4b374c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f0f0f0bdbdbd636363\",\n \"f7f7f7cccccc969696525252\",\n \"f7f7f7cccccc969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"efedf5bcbddc756bb1\",\n \"f2f0f7cbc9e29e9ac86a51a3\",\n \"f2f0f7cbc9e29e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee0d2fc9272de2d26\",\n \"fee5d9fcae91fb6a4acb181d\",\n \"fee5d9fcae91fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee6cefdae6be6550d\",\n \"feeddefdbe85fd8d3cd94701\",\n \"feeddefdbe85fd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\n).map(colors);\n\nexport default ramp(scheme);\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nexport var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nvar c = cubehelix();\n\nexport default function(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n c.h = 360 * t - 100;\n c.s = 1.5 - 1.5 * ts;\n c.l = 0.8 - 0.9 * ts;\n return c + \"\";\n}\n","import {rgb} from \"d3-color\";\n\nvar c = rgb(),\n pi_1_3 = Math.PI / 3,\n pi_2_3 = Math.PI * 2 / 3;\n\nexport default function(t) {\n var x;\n t = (0.5 - t) * Math.PI;\n c.r = 255 * (x = Math.sin(t)) * x;\n c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\n c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\n return c + \"\";\n}\n","import colors from \"../colors\";\n\nfunction ramp(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\nexport default ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nexport var magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nexport var inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nexport var plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00);\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi) {\n var oc = da0 > epsilon ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],\n ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport curveLinear from \"./curve/linear\";\nimport {x as pointX, y as pointY} from \"./point\";\n\nexport default function() {\n var x = pointX,\n y = pointY,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function line(data) {\n var i,\n n = data.length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport curveLinear from \"./curve/linear\";\nimport line from \"./line\";\nimport {x as pointX, y as pointY} from \"./point\";\n\nexport default function() {\n var x0 = pointX,\n x1 = null,\n y0 = constant(0),\n y1 = pointY,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n\n function area(data) {\n var i,\n j,\n k,\n n = data.length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + \"\" || null;\n }\n\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n return d;\n}\n","import constant from \"./constant\";\nimport descending from \"./descending\";\nimport identity from \"./identity\";\nimport {tau} from \"./math\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = data.length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","import curveRadial, {curveRadialLinear} from \"./curve/radial\";\nimport line from \"./line\";\n\nexport function lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\nexport default function() {\n return lineRadial(line().curve(curveRadialLinear));\n}\n","import curveRadial, {curveRadialLinear} from \"./curve/radial\";\nimport area from \"./area\";\nimport {lineRadial} from \"./lineRadial\"\n\nexport default function() {\n var a = area().curve(curveRadialLinear),\n c = a.curve,\n x0 = a.lineX0,\n x1 = a.lineX1,\n y0 = a.lineY0,\n y1 = a.lineY1;\n\n a.angle = a.x, delete a.x;\n a.startAngle = a.x0, delete a.x0;\n a.endAngle = a.x1, delete a.x1;\n a.radius = a.y, delete a.y;\n a.innerRadius = a.y0, delete a.y0;\n a.outerRadius = a.y1, delete a.y1;\n a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\n a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\n a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\n a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\n\n a.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return a;\n}\n","export default function(x, y) {\n return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n}\n","export var slice = Array.prototype.slice;\n","import {path} from \"d3-path\";\nimport {slice} from \"../array\";\nimport constant from \"../constant\";\nimport {x as pointX, y as pointY} from \"../point\";\nimport pointRadial from \"../pointRadial\";\n\nfunction linkSource(d) {\n return d.source;\n}\n\nfunction linkTarget(d) {\n return d.target;\n}\n\nfunction link(curve) {\n var source = linkSource,\n target = linkTarget,\n x = pointX,\n y = pointY,\n context = null;\n\n function link() {\n var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n if (!context) context = buffer = path();\n curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n link.source = function(_) {\n return arguments.length ? (source = _, link) : source;\n };\n\n link.target = function(_) {\n return arguments.length ? (target = _, link) : target;\n };\n\n link.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), link) : x;\n };\n\n link.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), link) : y;\n };\n\n link.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), link) : context;\n };\n\n return link;\n}\n\nfunction curveHorizontal(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n}\n\nfunction curveVertical(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n}\n\nfunction curveRadial(context, x0, y0, x1, y1) {\n var p0 = pointRadial(x0, y0),\n p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n p2 = pointRadial(x1, y0),\n p3 = pointRadial(x1, y1);\n context.moveTo(p0[0], p0[1]);\n context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n}\n\nexport function linkHorizontal() {\n return link(curveHorizontal);\n}\n\nexport function linkVertical() {\n return link(curveVertical);\n}\n\nexport function linkRadial() {\n var l = link(curveRadial);\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n return l;\n}\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","export default {\n draw: function(context, size) {\n var r = Math.sqrt(size / 5) / 2;\n context.moveTo(-3 * r, -r);\n context.lineTo(-r, -r);\n context.lineTo(-r, -3 * r);\n context.lineTo(r, -3 * r);\n context.lineTo(r, -r);\n context.lineTo(3 * r, -r);\n context.lineTo(3 * r, r);\n context.lineTo(r, r);\n context.lineTo(r, 3 * r);\n context.lineTo(-r, 3 * r);\n context.lineTo(-r, r);\n context.lineTo(-3 * r, r);\n context.closePath();\n }\n};\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default {\n draw: function(context, size) {\n var w = Math.sqrt(size),\n x = -w / 2;\n context.rect(x, x, w, w);\n }\n};\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","import {path} from \"d3-path\";\nimport circle from \"./symbol/circle\";\nimport cross from \"./symbol/cross\";\nimport diamond from \"./symbol/diamond\";\nimport star from \"./symbol/star\";\nimport square from \"./symbol/square\";\nimport triangle from \"./symbol/triangle\";\nimport wye from \"./symbol/wye\";\nimport constant from \"./constant\";\n\nexport var symbols = [\n circle,\n cross,\n diamond,\n square,\n star,\n triangle,\n wye\n];\n\nexport default function() {\n var type = constant(circle),\n size = constant(64),\n context = null;\n\n function symbol() {\n var buffer;\n if (!context) context = buffer = path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n symbol.type = function(_) {\n return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n };\n\n symbol.size = function(_) {\n return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n };\n\n symbol.context = function(_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n\n return symbol;\n}\n","export default function() {}\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport offsetNone from \"./offset/none\";\nimport orderNone from \"./order/none\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n }\n none(series, order);\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n for (yp = yn = 0, i = 0; i < n; ++i) {\n if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {\n d[0] = yp, d[1] = yp += dy;\n } else if (dy < 0) {\n d[1] = yn, d[0] = yn += dy;\n } else {\n d[0] = yp;\n }\n }\n }\n}\n","import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n}\n","import none from \"./none\";\n\nexport default function(series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n}\n","import none from \"./none\";\n\nexport default function(series) {\n var sums = series.map(sum);\n return none(series).sort(function(a, b) { return sums[a] - sums[b]; });\n}\n\nexport function sum(series) {\n var s = 0, i = -1, n = series.length, v;\n while (++i < n) if (v = +series[i][1]) s += v;\n return s;\n}\n","import ascending from \"./ascending\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import none from \"./none\";\nimport {sum} from \"./ascending\";\n\nexport default function(series) {\n var n = series.length,\n i,\n j,\n sums = series.map(sum),\n order = none(series).sort(function(a, b) { return sums[b] - sums[a]; }),\n top = 0,\n bottom = 0,\n tops = [],\n bottoms = [];\n\n for (i = 0; i < n; ++i) {\n j = order[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n\n return bottoms.reverse().concat(tops);\n}\n","import none from \"./none\";\n\nexport default function(series) {\n return none(series).reverse();\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export function x(d) {\n return d[0];\n}\n\nexport function y(d) {\n return d[1];\n}\n","function RedBlackTree() {\n this._ = null; // root node\n}\n\nexport function RedBlackNode(node) {\n node.U = // parent node\n node.C = // color - true for red, false for black\n node.L = // left node\n node.R = // right node\n node.P = // previous node\n node.N = null; // next node\n}\n\nRedBlackTree.prototype = {\n constructor: RedBlackTree,\n\n insert: function(after, node) {\n var parent, grandpa, uncle;\n\n if (after) {\n node.P = after;\n node.N = after.N;\n if (after.N) after.N.P = node;\n after.N = node;\n if (after.R) {\n after = after.R;\n while (after.L) after = after.L;\n after.L = node;\n } else {\n after.R = node;\n }\n parent = after;\n } else if (this._) {\n after = RedBlackFirst(this._);\n node.P = null;\n node.N = after;\n after.P = after.L = node;\n parent = after;\n } else {\n node.P = node.N = null;\n this._ = node;\n parent = null;\n }\n node.L = node.R = null;\n node.U = parent;\n node.C = true;\n\n after = node;\n while (parent && parent.C) {\n grandpa = parent.U;\n if (parent === grandpa.L) {\n uncle = grandpa.R;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.R) {\n RedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateRight(this, grandpa);\n }\n } else {\n uncle = grandpa.L;\n if (uncle && uncle.C) {\n parent.C = uncle.C = false;\n grandpa.C = true;\n after = grandpa;\n } else {\n if (after === parent.L) {\n RedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n RedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\n },\n\n remove: function(node) {\n if (node.N) node.N.P = node.P;\n if (node.P) node.P.N = node.N;\n node.N = node.P = null;\n\n var parent = node.U,\n sibling,\n left = node.L,\n right = node.R,\n next,\n red;\n\n if (!left) next = right;\n else if (!right) next = left;\n else next = RedBlackFirst(right);\n\n if (parent) {\n if (parent.L === node) parent.L = next;\n else parent.R = next;\n } else {\n this._ = next;\n }\n\n if (left && right) {\n red = next.C;\n next.C = node.C;\n next.L = left;\n left.U = next;\n if (next !== right) {\n parent = next.U;\n next.U = node.U;\n node = next.R;\n parent.L = node;\n next.R = right;\n right.U = next;\n } else {\n next.U = parent;\n parent = next;\n node = next.R;\n }\n } else {\n red = node.C;\n node = next;\n }\n\n if (node) node.U = parent;\n if (red) return;\n if (node && node.C) { node.C = false; return; }\n\n do {\n if (node === this._) break;\n if (node === parent.L) {\n sibling = parent.R;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n RedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n RedBlackRotateLeft(this, parent);\n node = this._;\n break;\n }\n } else {\n sibling = parent.L;\n if (sibling.C) {\n sibling.C = false;\n parent.C = true;\n RedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if ((sibling.L && sibling.L.C)\n || (sibling.R && sibling.R.C)) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n RedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n RedBlackRotateRight(this, parent);\n node = this._;\n break;\n }\n }\n sibling.C = true;\n node = parent;\n parent = parent.U;\n } while (!node.C);\n\n if (node) node.C = false;\n }\n};\n\nfunction RedBlackRotateLeft(tree, node) {\n var p = node,\n q = node.R,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.R = q.L;\n if (p.R) p.R.U = p;\n q.L = p;\n}\n\nfunction RedBlackRotateRight(tree, node) {\n var p = node,\n q = node.L,\n parent = p.U;\n\n if (parent) {\n if (parent.L === p) parent.L = q;\n else parent.R = q;\n } else {\n tree._ = q;\n }\n\n q.U = parent;\n p.U = q;\n p.L = q.R;\n if (p.L) p.L.U = p;\n q.R = p;\n}\n\nfunction RedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n}\n\nexport default RedBlackTree;\n","import {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createEdge(left, right, v0, v1) {\n var edge = [null, null],\n index = edges.push(edge) - 1;\n edge.left = left;\n edge.right = right;\n if (v0) setEdgeEnd(edge, left, right, v0);\n if (v1) setEdgeEnd(edge, right, left, v1);\n cells[left.index].halfedges.push(index);\n cells[right.index].halfedges.push(index);\n return edge;\n}\n\nexport function createBorderEdge(left, v0, v1) {\n var edge = [v0, v1];\n edge.left = left;\n return edge;\n}\n\nexport function setEdgeEnd(edge, left, right, vertex) {\n if (!edge[0] && !edge[1]) {\n edge[0] = vertex;\n edge.left = left;\n edge.right = right;\n } else if (edge.left === right) {\n edge[1] = vertex;\n } else {\n edge[0] = vertex;\n }\n}\n\n// Liang–Barsky line clipping.\nfunction clipEdge(edge, x0, y0, x1, y1) {\n var a = edge[0],\n b = edge[1],\n ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?\n\n if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];\n if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];\n return true;\n}\n\nfunction connectEdge(edge, x0, y0, x1, y1) {\n var v1 = edge[1];\n if (v1) return true;\n\n var v0 = edge[0],\n left = edge.left,\n right = edge.right,\n lx = left[0],\n ly = left[1],\n rx = right[0],\n ry = right[1],\n fx = (lx + rx) / 2,\n fy = (ly + ry) / 2,\n fm,\n fb;\n\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!v0) v0 = [fx, y0];\n else if (v0[1] >= y1) return;\n v1 = [fx, y1];\n } else {\n if (!v0) v0 = [fx, y1];\n else if (v0[1] < y0) return;\n v1 = [fx, y0];\n }\n } else {\n fm = (lx - rx) / (ry - ly);\n fb = fy - fm * fx;\n if (fm < -1 || fm > 1) {\n if (lx > rx) {\n if (!v0) v0 = [(y0 - fb) / fm, y0];\n else if (v0[1] >= y1) return;\n v1 = [(y1 - fb) / fm, y1];\n } else {\n if (!v0) v0 = [(y1 - fb) / fm, y1];\n else if (v0[1] < y0) return;\n v1 = [(y0 - fb) / fm, y0];\n }\n } else {\n if (ly < ry) {\n if (!v0) v0 = [x0, fm * x0 + fb];\n else if (v0[0] >= x1) return;\n v1 = [x1, fm * x1 + fb];\n } else {\n if (!v0) v0 = [x1, fm * x1 + fb];\n else if (v0[0] < x0) return;\n v1 = [x0, fm * x0 + fb];\n }\n }\n }\n\n edge[0] = v0;\n edge[1] = v1;\n return true;\n}\n\nexport function clipEdges(x0, y0, x1, y1) {\n var i = edges.length,\n edge;\n\n while (i--) {\n if (!connectEdge(edge = edges[i], x0, y0, x1, y1)\n || !clipEdge(edge, x0, y0, x1, y1)\n || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon\n || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) {\n delete edges[i];\n }\n }\n}\n","import {createBorderEdge} from \"./Edge\";\nimport {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createCell(site) {\n return cells[site.index] = {\n site: site,\n halfedges: []\n };\n}\n\nfunction cellHalfedgeAngle(cell, edge) {\n var site = cell.site,\n va = edge.left,\n vb = edge.right;\n if (site === vb) vb = va, va = site;\n if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);\n if (site === va) va = edge[1], vb = edge[0];\n else va = edge[0], vb = edge[1];\n return Math.atan2(va[0] - vb[0], vb[1] - va[1]);\n}\n\nexport function cellHalfedgeStart(cell, edge) {\n return edge[+(edge.left !== cell.site)];\n}\n\nexport function cellHalfedgeEnd(cell, edge) {\n return edge[+(edge.left === cell.site)];\n}\n\nexport function sortCellHalfedges() {\n for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {\n if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {\n var index = new Array(m),\n array = new Array(m);\n for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);\n index.sort(function(i, j) { return array[j] - array[i]; });\n for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];\n for (j = 0; j < m; ++j) halfedges[j] = array[j];\n }\n }\n}\n\nexport function clipCells(x0, y0, x1, y1) {\n var nCells = cells.length,\n iCell,\n cell,\n site,\n iHalfedge,\n halfedges,\n nHalfedges,\n start,\n startX,\n startY,\n end,\n endX,\n endY,\n cover = true;\n\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n halfedges = cell.halfedges;\n iHalfedge = halfedges.length;\n\n // Remove any dangling clipped edges.\n while (iHalfedge--) {\n if (!edges[halfedges[iHalfedge]]) {\n halfedges.splice(iHalfedge, 1);\n }\n }\n\n // Insert any border edges as necessary.\n iHalfedge = 0, nHalfedges = halfedges.length;\n while (iHalfedge < nHalfedges) {\n end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];\n start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];\n if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) {\n halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,\n Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1]\n : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1]\n : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0]\n : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0]\n : null)) - 1);\n ++nHalfedges;\n }\n }\n\n if (nHalfedges) cover = false;\n }\n }\n\n // If there weren’t any edges, have the closest site cover the extent.\n // It doesn’t matter which corner of the extent we measure!\n if (cover) {\n var dx, dy, d2, dc = Infinity;\n\n for (iCell = 0, cover = null; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n site = cell.site;\n dx = site[0] - x0;\n dy = site[1] - y0;\n d2 = dx * dx + dy * dy;\n if (d2 < dc) dc = d2, cover = cell;\n }\n }\n\n if (cover) {\n var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];\n cover.halfedges.push(\n edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,\n edges.push(createBorderEdge(site, v01, v11)) - 1,\n edges.push(createBorderEdge(site, v11, v10)) - 1,\n edges.push(createBorderEdge(site, v10, v00)) - 1\n );\n }\n }\n\n // Lastly delete any cells with no edges; these were entirely clipped.\n for (iCell = 0; iCell < nCells; ++iCell) {\n if (cell = cells[iCell]) {\n if (!cell.halfedges.length) {\n delete cells[iCell];\n }\n }\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {circles, epsilon2} from \"./Diagram\";\n\nvar circlePool = [];\n\nexport var firstCircle;\n\nfunction Circle() {\n RedBlackNode(this);\n this.x =\n this.y =\n this.arc =\n this.site =\n this.cy = null;\n}\n\nexport function attachCircle(arc) {\n var lArc = arc.P,\n rArc = arc.N;\n\n if (!lArc || !rArc) return;\n\n var lSite = lArc.site,\n cSite = arc.site,\n rSite = rArc.site;\n\n if (lSite === rSite) return;\n\n var bx = cSite[0],\n by = cSite[1],\n ax = lSite[0] - bx,\n ay = lSite[1] - by,\n cx = rSite[0] - bx,\n cy = rSite[1] - by;\n\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -epsilon2) return;\n\n var ha = ax * ax + ay * ay,\n hc = cx * cx + cy * cy,\n x = (cy * ha - ay * hc) / d,\n y = (ax * hc - cx * ha) / d;\n\n var circle = circlePool.pop() || new Circle;\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom\n\n arc.circle = circle;\n\n var before = null,\n node = circles._;\n\n while (node) {\n if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {\n if (node.L) node = node.L;\n else { before = node.P; break; }\n } else {\n if (node.R) node = node.R;\n else { before = node; break; }\n }\n }\n\n circles.insert(before, circle);\n if (!before) firstCircle = circle;\n}\n\nexport function detachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) firstCircle = circle.N;\n circles.remove(circle);\n circlePool.push(circle);\n RedBlackNode(circle);\n arc.circle = null;\n }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {createCell} from \"./Cell\";\nimport {attachCircle, detachCircle} from \"./Circle\";\nimport {createEdge, setEdgeEnd} from \"./Edge\";\nimport {beaches, epsilon} from \"./Diagram\";\n\nvar beachPool = [];\n\nfunction Beach() {\n RedBlackNode(this);\n this.edge =\n this.site =\n this.circle = null;\n}\n\nfunction createBeach(site) {\n var beach = beachPool.pop() || new Beach;\n beach.site = site;\n return beach;\n}\n\nfunction detachBeach(beach) {\n detachCircle(beach);\n beaches.remove(beach);\n beachPool.push(beach);\n RedBlackNode(beach);\n}\n\nexport function removeBeach(beach) {\n var circle = beach.circle,\n x = circle.x,\n y = circle.cy,\n vertex = [x, y],\n previous = beach.P,\n next = beach.N,\n disappearing = [beach];\n\n detachBeach(beach);\n\n var lArc = previous;\n while (lArc.circle\n && Math.abs(x - lArc.circle.x) < epsilon\n && Math.abs(y - lArc.circle.cy) < epsilon) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n detachBeach(lArc);\n lArc = previous;\n }\n\n disappearing.unshift(lArc);\n detachCircle(lArc);\n\n var rArc = next;\n while (rArc.circle\n && Math.abs(x - rArc.circle.x) < epsilon\n && Math.abs(y - rArc.circle.cy) < epsilon) {\n next = rArc.N;\n disappearing.push(rArc);\n detachBeach(rArc);\n rArc = next;\n }\n\n disappearing.push(rArc);\n detachCircle(rArc);\n\n var nArcs = disappearing.length,\n iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);\n\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nexport function addBeach(site) {\n var x = site[0],\n directrix = site[1],\n lArc,\n rArc,\n dxl,\n dxr,\n node = beaches._;\n\n while (node) {\n dxl = leftBreakPoint(node, directrix) - x;\n if (dxl > epsilon) node = node.L; else {\n dxr = x - rightBreakPoint(node, directrix);\n if (dxr > epsilon) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -epsilon) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -epsilon) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n\n createCell(site);\n var newArc = createBeach(site);\n beaches.insert(lArc, newArc);\n\n if (!lArc && !rArc) return;\n\n if (lArc === rArc) {\n detachCircle(lArc);\n rArc = createBeach(lArc.site);\n beaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);\n attachCircle(lArc);\n attachCircle(rArc);\n return;\n }\n\n if (!rArc) { // && lArc\n newArc.edge = createEdge(lArc.site, newArc.site);\n return;\n }\n\n // else lArc !== rArc\n detachCircle(lArc);\n detachCircle(rArc);\n\n var lSite = lArc.site,\n ax = lSite[0],\n ay = lSite[1],\n bx = site[0] - ax,\n by = site[1] - ay,\n rSite = rArc.site,\n cx = rSite[0] - ax,\n cy = rSite[1] - ay,\n d = 2 * (bx * cy - by * cx),\n hb = bx * bx + by * by,\n hc = cx * cx + cy * cy,\n vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];\n\n setEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = createEdge(lSite, site, null, vertex);\n rArc.edge = createEdge(site, rSite, null, vertex);\n attachCircle(lArc);\n attachCircle(rArc);\n}\n\nfunction leftBreakPoint(arc, directrix) {\n var site = arc.site,\n rfocx = site[0],\n rfocy = site[1],\n pby2 = rfocy - directrix;\n\n if (!pby2) return rfocx;\n\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n\n site = lArc.site;\n var lfocx = site[0],\n lfocy = site[1],\n plby2 = lfocy - directrix;\n\n if (!plby2) return lfocx;\n\n var hl = lfocx - rfocx,\n aby2 = 1 / pby2 - 1 / plby2,\n b = hl / plby2;\n\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n\n return (rfocx + lfocx) / 2;\n}\n\nfunction rightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return leftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site[1] === directrix ? site[0] : Infinity;\n}\n","import {addBeach, removeBeach} from \"./Beach\";\nimport {sortCellHalfedges, cellHalfedgeStart, clipCells} from \"./Cell\";\nimport {firstCircle} from \"./Circle\";\nimport {clipEdges} from \"./Edge\";\nimport RedBlackTree from \"./RedBlackTree\";\n\nexport var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var beaches;\nexport var cells;\nexport var circles;\nexport var edges;\n\nfunction triangleArea(a, b, c) {\n return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);\n}\n\nfunction lexicographic(a, b) {\n return b[1] - a[1]\n || b[0] - a[0];\n}\n\nexport default function Diagram(sites, extent) {\n var site = sites.sort(lexicographic).pop(),\n x,\n y,\n circle;\n\n edges = [];\n cells = new Array(sites.length);\n beaches = new RedBlackTree;\n circles = new RedBlackTree;\n\n while (true) {\n circle = firstCircle;\n if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {\n if (site[0] !== x || site[1] !== y) {\n addBeach(site);\n x = site[0], y = site[1];\n }\n site = sites.pop();\n } else if (circle) {\n removeBeach(circle.arc);\n } else {\n break;\n }\n }\n\n sortCellHalfedges();\n\n if (extent) {\n var x0 = +extent[0][0],\n y0 = +extent[0][1],\n x1 = +extent[1][0],\n y1 = +extent[1][1];\n clipEdges(x0, y0, x1, y1);\n clipCells(x0, y0, x1, y1);\n }\n\n this.edges = edges;\n this.cells = cells;\n\n beaches =\n circles =\n edges =\n cells = null;\n}\n\nDiagram.prototype = {\n constructor: Diagram,\n\n polygons: function() {\n var edges = this.edges;\n\n return this.cells.map(function(cell) {\n var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });\n polygon.data = cell.site.data;\n return polygon;\n });\n },\n\n triangles: function() {\n var triangles = [],\n edges = this.edges;\n\n this.cells.forEach(function(cell, i) {\n if (!(m = (halfedges = cell.halfedges).length)) return;\n var site = cell.site,\n halfedges,\n j = -1,\n m,\n s0,\n e1 = edges[halfedges[m - 1]],\n s1 = e1.left === site ? e1.right : e1.left;\n\n while (++j < m) {\n s0 = s1;\n e1 = edges[halfedges[j]];\n s1 = e1.left === site ? e1.right : e1.left;\n if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {\n triangles.push([site.data, s0.data, s1.data]);\n }\n }\n });\n\n return triangles;\n },\n\n links: function() {\n return this.edges.filter(function(edge) {\n return edge.right;\n }).map(function(edge) {\n return {\n source: edge.left.data,\n target: edge.right.data\n };\n });\n },\n\n find: function(x, y, radius) {\n var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;\n\n // Use the previously-found cell, or start with an arbitrary one.\n while (!(cell = that.cells[i1])) if (++i1 >= n) return null;\n var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;\n\n // Traverse the half-edges to find a closer cell, if any.\n do {\n cell = that.cells[i0 = i1], i1 = null;\n cell.halfedges.forEach(function(e) {\n var edge = that.edges[e], v = edge.left;\n if ((v === cell.site || !v) && !(v = edge.right)) return;\n var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;\n if (v2 < d2) d2 = v2, i1 = v.index;\n });\n } while (i1 !== null);\n\n that._found = i0;\n\n return radius == null || d2 <= radius * radius ? cell.site : null;\n }\n}\n","import constant from \"./constant\";\nimport {x as pointX, y as pointY} from \"./point\";\nimport Diagram, {epsilon} from \"./Diagram\";\n\nexport default function() {\n var x = pointX,\n y = pointY,\n extent = null;\n\n function voronoi(data) {\n return new Diagram(data.map(function(d, i) {\n var s = [Math.round(x(d, i, data) / epsilon) * epsilon, Math.round(y(d, i, data) / epsilon) * epsilon];\n s.index = i;\n s.data = d;\n return s;\n }), extent);\n }\n\n voronoi.polygons = function(data) {\n return voronoi(data).polygons();\n };\n\n voronoi.links = function(data) {\n return voronoi(data).links();\n };\n\n voronoi.triangles = function(data) {\n return voronoi(data).triangles();\n };\n\n voronoi.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), voronoi) : x;\n };\n\n voronoi.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), voronoi) : y;\n };\n\n voronoi.extent = function(_) {\n return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];\n };\n\n voronoi.size = function(_) {\n return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];\n };\n\n return voronoi;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function ZoomEvent(target, type, transform) {\n this.target = target;\n this.type = type;\n this.transform = transform;\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n return node.__zoom || identity;\n}\n","import {event} from \"d3-selection\";\n\nexport function nopropagation() {\n event.stopImmediatePropagation();\n}\n\nexport default function() {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {event, customEvent, select, mouse, touch} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant\";\nimport ZoomEvent from \"./event\";\nimport {Transform, identity} from \"./transform\";\nimport noevent, {nopropagation} from \"./noevent\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n return !event.button;\n}\n\nfunction defaultExtent() {\n var e = this, w, h;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n w = e.width.baseVal.value;\n h = e.height.baseVal.value;\n } else {\n w = e.clientWidth;\n h = e.clientHeight;\n }\n return [[0, 0], [w, h]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta() {\n return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;\n}\n\nfunction defaultTouchable() {\n return \"ontouchstart\" in this;\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n gestures = [],\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled)\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n });\n };\n\n zoom.scaleTo = function(selection, k) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = centroid(e),\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n });\n };\n\n zoom.translateBy = function(selection, x, y) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n });\n };\n\n zoom.translateTo = function(selection, x, y) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p = centroid(e);\n return constrain(identity.translate(p[0], p[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n });\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, center) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args),\n e = extent.apply(that, args),\n p = center || centroid(e),\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args) {\n for (var i = 0, n = gestures.length, g; i < n; ++i) {\n if ((g = gestures[i]).that === that) {\n return g;\n }\n }\n return new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.index = -1;\n this.active = 0;\n this.extent = extent.apply(that, args);\n }\n\n Gesture.prototype = {\n start: function() {\n if (++this.active === 1) {\n this.index = gestures.push(this) - 1;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n gestures.splice(this.index, 1);\n this.index = -1;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);\n }\n };\n\n function wheeled() {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, arguments),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = mouse(this);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent();\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned() {\n if (touchending || !filter.apply(this, arguments)) return;\n var g = gesture(this, arguments),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = mouse(this),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation();\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved() {\n noevent();\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped() {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent();\n g.end();\n }\n }\n\n function dblclicked() {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = mouse(this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);\n\n noevent();\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);\n else select(this).call(zoom.transform, t1);\n }\n\n function touchstarted() {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, arguments),\n touches = event.changedTouches,\n started,\n n = touches.length, i, t, p;\n\n nopropagation();\n for (i = 0; i < n; ++i) {\n t = touches[i], p = touch(this, touches, t.identifier);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true;\n else if (!g.touch1) g.touch1 = p;\n }\n\n // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (touchstarting) {\n touchstarting = clearTimeout(touchstarting);\n if (!g.touch1) {\n g.end();\n p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n return;\n }\n }\n\n if (started) {\n touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved() {\n var g = gesture(this, arguments),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent();\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = touch(this, touches, t.identifier);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended() {\n var g = gesture(this, arguments),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation();\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else g.end();\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n return zoom;\n}\n","export {version} from \"./dist/package\";\nexport * from \"d3-array\";\nexport * from \"d3-axis\";\nexport * from \"d3-brush\";\nexport * from \"d3-chord\";\nexport * from \"d3-collection\";\nexport * from \"d3-color\";\nexport * from \"d3-contour\";\nexport * from \"d3-dispatch\";\nexport * from \"d3-drag\";\nexport * from \"d3-dsv\";\nexport * from \"d3-ease\";\nexport * from \"d3-fetch\";\nexport * from \"d3-force\";\nexport * from \"d3-format\";\nexport * from \"d3-geo\";\nexport * from \"d3-hierarchy\";\nexport * from \"d3-interpolate\";\nexport * from \"d3-path\";\nexport * from \"d3-polygon\";\nexport * from \"d3-quadtree\";\nexport * from \"d3-random\";\nexport * from \"d3-scale\";\nexport * from \"d3-scale-chromatic\";\nexport * from \"d3-selection\";\nexport * from \"d3-shape\";\nexport * from \"d3-time\";\nexport * from \"d3-time-format\";\nexport * from \"d3-timer\";\nexport * from \"d3-transition\";\nexport * from \"d3-voronoi\";\nexport * from \"d3-zoom\";\n","/* parser generated by jison 0.4.18 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,12],$V7=[1,14],$V8=[1,15],$V9=[1,17],$Va=[1,18],$Vb=[1,19],$Vc=[1,20],$Vd=[1,21],$Ve=[1,23],$Vf=[1,24],$Vg=[1,4,5,10,15,16,18,20,21,22,23,25,27,28,29,40],$Vh=[1,32],$Vi=[4,5,10,15,16,18,20,21,22,23,25,29,40],$Vj=[4,5,10,15,16,18,20,21,22,23,25,28,29,40],$Vk=[4,5,10,15,16,18,20,21,22,23,25,27,29,40],$Vl=[38,39,40];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"start\":3,\"SPACE\":4,\"NL\":5,\"SD\":6,\"document\":7,\"line\":8,\"statement\":9,\"participant\":10,\"actor\":11,\"AS\":12,\"restOfLine\":13,\"signal\":14,\"activate\":15,\"deactivate\":16,\"note_statement\":17,\"title\":18,\"text2\":19,\"loop\":20,\"end\":21,\"opt\":22,\"alt\":23,\"else_sections\":24,\"par\":25,\"par_sections\":26,\"and\":27,\"else\":28,\"note\":29,\"placement\":30,\"over\":31,\"actor_pair\":32,\"spaceList\":33,\",\":34,\"left_of\":35,\"right_of\":36,\"signaltype\":37,\"+\":38,\"-\":39,\"ACTOR\":40,\"SOLID_OPEN_ARROW\":41,\"DOTTED_OPEN_ARROW\":42,\"SOLID_ARROW\":43,\"DOTTED_ARROW\":44,\"SOLID_CROSS\":45,\"DOTTED_CROSS\":46,\"TXT\":47,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"SPACE\",5:\"NL\",6:\"SD\",10:\"participant\",12:\"AS\",13:\"restOfLine\",15:\"activate\",16:\"deactivate\",18:\"title\",20:\"loop\",21:\"end\",22:\"opt\",23:\"alt\",25:\"par\",27:\"and\",28:\"else\",29:\"note\",31:\"over\",34:\",\",35:\"left_of\",36:\"right_of\",38:\"+\",39:\"-\",40:\"ACTOR\",41:\"SOLID_OPEN_ARROW\",42:\"DOTTED_OPEN_ARROW\",43:\"SOLID_ARROW\",44:\"DOTTED_ARROW\",45:\"SOLID_CROSS\",46:\"DOTTED_CROSS\",47:\"TXT\"},\nproductions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,5],[9,3],[9,2],[9,3],[9,3],[9,2],[9,3],[9,4],[9,4],[9,4],[9,4],[26,1],[26,4],[24,1],[24,4],[17,4],[17,4],[33,2],[33,1],[32,3],[32,1],[30,1],[30,1],[14,5],[14,5],[14,4],[11,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[19,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 3:\n yy.apply($$[$0]);return $$[$0]; \nbreak;\ncase 4:\n this.$ = [] \nbreak;\ncase 5:\n$$[$0-1].push($$[$0]);this.$ = $$[$0-1]\nbreak;\ncase 6: case 7:\n this.$ = $$[$0] \nbreak;\ncase 8:\n this.$=[];\nbreak;\ncase 9:\n$$[$0-3].description=$$[$0-1]; this.$=$$[$0-3];\nbreak;\ncase 10:\nthis.$=$$[$0-1];\nbreak;\ncase 12:\nthis.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]};\nbreak;\ncase 13:\nthis.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1]};\nbreak;\ncase 15:\nthis.$=[{type:'setTitle', text:$$[$0-1]}]\nbreak;\ncase 16:\n\n\t\t$$[$0-1].unshift({type: 'loopStart', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_START});\n\t\t$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 17:\n\n\t\t$$[$0-1].unshift({type: 'optStart', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_START});\n\t\t$$[$0-1].push({type: 'optEnd', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 18:\n\n\t\t// Alt start\n\t\t$$[$0-1].unshift({type: 'altStart', altText:$$[$0-2], signalType: yy.LINETYPE.ALT_START});\n\t\t// Content in alt is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 19:\n\n\t\t// Parallel start\n\t\t$$[$0-1].unshift({type: 'parStart', parText:$$[$0-2], signalType: yy.LINETYPE.PAR_START});\n\t\t// Content in par is already in $$[$0-1]\n\t\t// End\n\t\t$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});\n\t\tthis.$=$$[$0-1];\nbreak;\ncase 21:\n this.$ = $$[$0-3].concat([{type: 'and', parText:$$[$0-1], signalType: yy.LINETYPE.PAR_AND}, $$[$0]]); \nbreak;\ncase 23:\n this.$ = $$[$0-3].concat([{type: 'else', altText:$$[$0-1], signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]); \nbreak;\ncase 24:\n\n\t\tthis.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];\nbreak;\ncase 25:\n\n\t\t// Coerce actor_pair into a [to, from, ...] array\n\t\t$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);\n\t\t$$[$0-2][0] = $$[$0-2][0].actor;\n\t\t$$[$0-2][1] = $$[$0-2][1].actor;\n\t\tthis.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];\nbreak;\ncase 28:\n this.$ = [$$[$0-2], $$[$0]]; \nbreak;\ncase 29:\n this.$ = $$[$0]; \nbreak;\ncase 30:\n this.$ = yy.PLACEMENT.LEFTOF; \nbreak;\ncase 31:\n this.$ = yy.PLACEMENT.RIGHTOF; \nbreak;\ncase 32:\n this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},\n\t {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]}\n\t ]\nbreak;\ncase 33:\n this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},\n\t {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4]}\n\t ]\nbreak;\ncase 34:\n this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]\nbreak;\ncase 35:\nthis.$={type: 'addActor', actor:$$[$0]}\nbreak;\ncase 36:\n this.$ = yy.LINETYPE.SOLID_OPEN; \nbreak;\ncase 37:\n this.$ = yy.LINETYPE.DOTTED_OPEN; \nbreak;\ncase 38:\n this.$ = yy.LINETYPE.SOLID; \nbreak;\ncase 39:\n this.$ = yy.LINETYPE.DOTTED; \nbreak;\ncase 40:\n this.$ = yy.LINETYPE.SOLID_CROSS; \nbreak;\ncase 41:\n this.$ = yy.LINETYPE.DOTTED_CROSS; \nbreak;\ncase 42:\nthis.$ = $$[$0].substring(1).trim().replace(/\\\\n/gm, \"\\n\");\nbreak;\n}\n},\ntable: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,10,15,16,18,20,22,23,25,29,40],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},o($Vg,[2,5]),{9:25,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},o($Vg,[2,7]),o($Vg,[2,8]),{11:26,40:$Vf},{5:[1,27]},{11:28,40:$Vf},{11:29,40:$Vf},{5:[1,30]},{19:31,47:$Vh},{13:[1,33]},{13:[1,34]},{13:[1,35]},{13:[1,36]},{37:37,41:[1,38],42:[1,39],43:[1,40],44:[1,41],45:[1,42],46:[1,43]},{30:44,31:[1,45],35:[1,46],36:[1,47]},o([5,12,34,41,42,43,44,45,46,47],[2,35]),o($Vg,[2,6]),{5:[1,49],12:[1,48]},o($Vg,[2,11]),{5:[1,50]},{5:[1,51]},o($Vg,[2,14]),{5:[1,52]},{5:[2,42]},o($Vi,$V3,{7:53}),o($Vi,$V3,{7:54}),o($Vj,$V3,{24:55,7:56}),o($Vk,$V3,{26:57,7:58}),{11:61,38:[1,59],39:[1,60],40:$Vf},o($Vl,[2,36]),o($Vl,[2,37]),o($Vl,[2,38]),o($Vl,[2,39]),o($Vl,[2,40]),o($Vl,[2,41]),{11:62,40:$Vf},{11:64,32:63,40:$Vf},{40:[2,30]},{40:[2,31]},{13:[1,65]},o($Vg,[2,10]),o($Vg,[2,12]),o($Vg,[2,13]),o($Vg,[2,15]),{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,66],22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,67],22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},{21:[1,68]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[2,22],22:$Vb,23:$Vc,25:$Vd,28:[1,69],29:$Ve,40:$Vf},{21:[1,70]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[2,20],22:$Vb,23:$Vc,25:$Vd,27:[1,71],29:$Ve,40:$Vf},{11:72,40:$Vf},{11:73,40:$Vf},{19:74,47:$Vh},{19:75,47:$Vh},{19:76,47:$Vh},{34:[1,77],47:[2,29]},{5:[1,78]},o($Vg,[2,16]),o($Vg,[2,17]),o($Vg,[2,18]),{13:[1,79]},o($Vg,[2,19]),{13:[1,80]},{19:81,47:$Vh},{19:82,47:$Vh},{5:[2,34]},{5:[2,24]},{5:[2,25]},{11:83,40:$Vf},o($Vg,[2,9]),o($Vj,$V3,{7:56,24:84}),o($Vk,$V3,{7:58,26:85}),{5:[2,32]},{5:[2,33]},{47:[2,28]},{21:[2,23]},{21:[2,21]}],\ndefaultActions: {5:[2,1],6:[2,2],32:[2,42],46:[2,30],47:[2,31],74:[2,34],75:[2,24],76:[2,25],81:[2,32],82:[2,33],83:[2,28],84:[2,23],85:[2,21]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n var error = new Error(str);\n error.hash = hash;\n throw error;\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = tstack.pop() || lexer.lex() || EOF;\n if (typeof token !== 'number') {\n if (token instanceof Array) {\n tstack = token;\n token = tstack.pop();\n }\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"case-insensitive\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 5;\nbreak;\ncase 1:/* skip all whitespace */\nbreak;\ncase 2:/* skip same-line whitespace */\nbreak;\ncase 3:/* skip comments */\nbreak;\ncase 4:/* skip comments */\nbreak;\ncase 5: this.begin('ID'); return 10; \nbreak;\ncase 6: this.begin('ALIAS'); return 40; \nbreak;\ncase 7: this.popState(); this.popState(); this.begin('LINE'); return 12; \nbreak;\ncase 8: this.popState(); this.popState(); return 5; \nbreak;\ncase 9: this.begin('LINE'); return 20; \nbreak;\ncase 10: this.begin('LINE'); return 22; \nbreak;\ncase 11: this.begin('LINE'); return 23; \nbreak;\ncase 12: this.begin('LINE'); return 28; \nbreak;\ncase 13: this.begin('LINE'); return 25; \nbreak;\ncase 14: this.begin('LINE'); return 27; \nbreak;\ncase 15: this.popState(); return 13; \nbreak;\ncase 16:return 21;\nbreak;\ncase 17:return 35;\nbreak;\ncase 18:return 36;\nbreak;\ncase 19:return 31;\nbreak;\ncase 20:return 29;\nbreak;\ncase 21: this.begin('ID'); return 15; \nbreak;\ncase 22: this.begin('ID'); return 16; \nbreak;\ncase 23:return 18;\nbreak;\ncase 24:return 6;\nbreak;\ncase 25:return 34;\nbreak;\ncase 26:return 5;\nbreak;\ncase 27: yy_.yytext = yy_.yytext.trim(); return 40; \nbreak;\ncase 28:return 43;\nbreak;\ncase 29:return 44;\nbreak;\ncase 30:return 41;\nbreak;\ncase 31:return 42;\nbreak;\ncase 32:return 45;\nbreak;\ncase 33:return 46;\nbreak;\ncase 34:return 47;\nbreak;\ncase 35:return 38;\nbreak;\ncase 36:return 39;\nbreak;\ncase 37:return 5;\nbreak;\ncase 38:return 'INVALID';\nbreak;\n}\n},\nrules: [/^(?:[\\n]+)/i,/^(?:\\s+)/i,/^(?:((?!\\n)\\s)+)/i,/^(?:#[^\\n]*)/i,/^(?:%[^\\n]*)/i,/^(?:participant\\b)/i,/^(?:[^\\->:\\n,;]+?(?=((?!\\n)\\s)+as(?!\\n)\\s|[#\\n;]|$))/i,/^(?:as\\b)/i,/^(?:(?:))/i,/^(?:loop\\b)/i,/^(?:opt\\b)/i,/^(?:alt\\b)/i,/^(?:else\\b)/i,/^(?:par\\b)/i,/^(?:and\\b)/i,/^(?:[^#\\n;]*)/i,/^(?:end\\b)/i,/^(?:left of\\b)/i,/^(?:right of\\b)/i,/^(?:over\\b)/i,/^(?:note\\b)/i,/^(?:activate\\b)/i,/^(?:deactivate\\b)/i,/^(?:title\\b)/i,/^(?:sequenceDiagram\\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\\+\\->:\\n,;]+)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?::[^#\\n;]+)/i,/^(?:\\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],\nconditions: {\"LINE\":{\"rules\":[2,3,15],\"inclusive\":false},\"ALIAS\":{\"rules\":[2,3,7,8],\"inclusive\":false},\"ID\":{\"rules\":[2,3,6],\"inclusive\":false},\"INITIAL\":{\"rules\":[0,1,3,4,5,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain (args) {\n if (!args[1]) {\n console.log('Usage: '+args[0]+' FILE');\n process.exit(1);\n }\n var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n exports.main(process.argv.slice(1));\n}\n}","/**\n * @license\n * Lodash \n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.11';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading and trailing whitespace. */\n var reTrim = /^\\s+|\\s+$/g,\n reTrimStart = /^\\s+/,\n reTrimEnd = /\\s+$/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n\n return result;\n }\n\n if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n\n return result;\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n if (isObject(srcValue)) {\n stack || (stack = new Stack);\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array == null ? 0 : array.length,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Gets the value at `key`, unless `key` is \"__proto__\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function safeGet(object, key) {\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

        ' + func(text) + '

        ';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

        fred, barney, & pebbles

        '\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': ' -<% end %> +<% end %> \ No newline at end of file diff --git a/plugins/redmine_private_wiki/app/views/wiki/date_index.html.erb b/plugins/redmine_private_wiki/app/views/wiki/date_index.html.erb index dc8e470..8b9ff96 100755 --- a/plugins/redmine_private_wiki/app/views/wiki/date_index.html.erb +++ b/plugins/redmine_private_wiki/app/views/wiki/date_index.html.erb @@ -27,7 +27,7 @@ <% if !page.private? %>
      • <%= link_to page.pretty_title, :action => 'show', :id => page.title, :project_id => page.project %>
      • <% elsif User.current.allowed_to?(:view_privates_wiki, @project) %> -
      • <%= link_to page.pretty_title, :action => 'show', :id => page.title, :project_id => page.project %>    <%= l(:private_flag) %>
      • +
      • <%= link_to page.pretty_title, :action => 'show', :id => page.title, :project_id => page.project %> <%= l(:private_flag) %>
      • <% end %> <% end %>
      @@ -35,7 +35,7 @@

      <%= format_date(date) %>

        <% @pages_by_date[date].each do |page| %> -
      • <%= link_to page.pretty_title, :action => 'show', :id => page.title, :project_id => page.project %>    <%= l(:private_flag) %>
      • +
      • <%= link_to page.pretty_title, :action => 'show', :id => page.title, :project_id => page.project %> <%= l(:private_flag) %>
      • <% end %>
      <% end %> diff --git a/plugins/redmine_private_wiki/assets/stylesheets/private_wiki.css b/plugins/redmine_private_wiki/assets/stylesheets/private_wiki.css index ce9d833..494438c 100755 --- a/plugins/redmine_private_wiki/assets/stylesheets/private_wiki.css +++ b/plugins/redmine_private_wiki/assets/stylesheets/private_wiki.css @@ -1,14 +1,21 @@ +.private_page_flag, .private_wiki_flag { - background: #D22; + background: #d22; color: white; - padding: 2px 2px 2px 2px; + padding: 1px 2px; border-radius: 2px; + cursor: default; +} +.private_wiki_flag { + margin-left: .44em; + background: rgb(255, 50, 0, 0.5); + line-height: 1em; } .icon-setprivate{ - background-image: url(../images/hide.png); + background-image: url(../images/hide.png); } .icon-setpublic{ - background-image: url(../images/reveal.png); + background-image: url(../images/reveal.png); } diff --git a/plugins/redmine_private_wiki/config/locales/en.yml b/plugins/redmine_private_wiki/config/locales/en.yml index 2d560d3..a325637 100755 --- a/plugins/redmine_private_wiki/config/locales/en.yml +++ b/plugins/redmine_private_wiki/config/locales/en.yml @@ -1,5 +1,6 @@ # English strings go here for Rails i18n en: - button_setprivate_wiki: Priv. - button_setpublic_wiki: Pub. + button_setprivate_wiki: Set Private + button_setpublic_wiki: Set Public private_flag: P! + private_title: Private page diff --git a/plugins/redmine_private_wiki/config/locales/es.yml b/plugins/redmine_private_wiki/config/locales/es.yml old mode 100644 new mode 100755 index 2d560d3..cbe8f85 --- a/plugins/redmine_private_wiki/config/locales/es.yml +++ b/plugins/redmine_private_wiki/config/locales/es.yml @@ -1,5 +1,6 @@ -# English strings go here for Rails i18n -en: +# Spanish strings go here for Rails i18n +es: button_setprivate_wiki: Priv. button_setpublic_wiki: Pub. private_flag: P! + private_title: Página privada diff --git a/plugins/redmine_private_wiki/config/locales/fr.yml b/plugins/redmine_private_wiki/config/locales/fr.yml index 2031ab4..1d1149e 100755 --- a/plugins/redmine_private_wiki/config/locales/fr.yml +++ b/plugins/redmine_private_wiki/config/locales/fr.yml @@ -1,5 +1,6 @@ # French strings go here for Rails i18n fr: - button_setprivate_wiki: Priv. - button_setpublic_wiki: Pub. + button_setprivate_wiki: Rendre Privé + button_setpublic_wiki: Rendre Public private_flag: P! + private_title: Privé diff --git a/plugins/redmine_private_wiki/db/migrate/001_add_private_wiki_attribute.rb b/plugins/redmine_private_wiki/db/migrate/001_add_private_wiki_attribute.rb index 8e86781..5069e6f 100755 --- a/plugins/redmine_private_wiki/db/migrate/001_add_private_wiki_attribute.rb +++ b/plugins/redmine_private_wiki/db/migrate/001_add_private_wiki_attribute.rb @@ -1,4 +1,4 @@ -class AddPrivateWikiAttribute < ActiveRecord::Migration[4.2] +class AddPrivateWikiAttribute < ActiveRecord::Migration def change #Add a "Private" attribute used to identify visibility of wikis add_column(:wiki_pages, "private", :boolean, :default => false) diff --git a/plugins/redmine_private_wiki/lib/wiki_patches/application_helper_patch.rb b/plugins/redmine_private_wiki/lib/wiki_patches/application_helper_patch.rb index bb12c63..e8166b4 100755 --- a/plugins/redmine_private_wiki/lib/wiki_patches/application_helper_patch.rb +++ b/plugins/redmine_private_wiki/lib/wiki_patches/application_helper_patch.rb @@ -3,35 +3,36 @@ module WikiPatches module ApplicationHelperPatch def self.included(base) base.class_eval do + #Override application's method to not display hidden wikis or to display it with the PRIVATE flag - def render_page_hierarchy(pages, node=nil, options={}) - content = +'' - if pages[node] - content << "
        \n" - pages[node].each do |page| - if page.private and !User.current.allowed_to?(:view_privates_wiki, @project) then - next - end - content << "
      • " - if controller.controller_name == 'wiki' && controller.action_name == 'export' - href = "##{page.title}" - else - href = {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title, :version => nil} - end - content << link_to(h(page.pretty_title), href, - :title => (options[:timestamp] && page.updated_on ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil)) - if page.private then - content << "    " + l(:private_flag) + "" - end - content << "\n" + render_page_hierarchy(pages, page.id, options) if pages[page.id] - content << "
      • \n" - end - content << "
      \n" - end - content.html_safe - end + def render_page_hierarchy_with_wiki_hidding(pages, node=nil, options={}) + content = '' + if pages[node] + content << "
        \n" + pages[node].each do |page| + if !page.private? then + content << "
      • " + content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title, :version => nil}, + :title => (options[:timestamp] && page.updated_on ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil)) + content << "\n" + render_page_hierarchy(pages, page.id, options) if pages[page.id] + content << "
      • \n" + elsif User.current.allowed_to?(:view_privates_wiki, @project) then + content << "
      • " + content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title, :version => nil}, + :title => (options[:timestamp] && page.updated_on ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil)) + content << ' ' + l(:private_flag) + '' + content << "\n" + render_page_hierarchy(pages, page.id, options) if pages[page.id] + content << "
      • \n" + end + end + content << "
      \n" + end + content.html_safe + end + + alias_method_chain :render_page_hierarchy, :wiki_hidding + end end end -end - +end \ No newline at end of file diff --git a/plugins/redmine_private_wiki/lib/wiki_patches/wiki_controller_patch.rb b/plugins/redmine_private_wiki/lib/wiki_patches/wiki_controller_patch.rb index 22b8575..45a3372 100755 --- a/plugins/redmine_private_wiki/lib/wiki_patches/wiki_controller_patch.rb +++ b/plugins/redmine_private_wiki/lib/wiki_patches/wiki_controller_patch.rb @@ -5,7 +5,7 @@ module WikiPatches base.class_eval do unloadable #Test :valide before :show action on wiki_controller - before_action :validate, :only => [:show,:edit,:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy] + before_filter :validate, :only => [:show,:edit,:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy] end end @@ -25,4 +25,4 @@ module WikiPatches end end end -end +end \ No newline at end of file diff --git a/plugins/redmine_questions/.drone.jsonnet b/plugins/redmine_questions/.drone.jsonnet deleted file mode 100644 index 55d8ab7..0000000 --- a/plugins/redmine_questions/.drone.jsonnet +++ /dev/null @@ -1,34 +0,0 @@ -local Pipeline(rubyVer, db, license, redmine, dependents) = { - kind: "pipeline", - name: rubyVer + "-" + db + "-" + redmine + "-" + license + "-" + dependents, - steps: [ - { - name: "tests", - image: "redmineup/redmineup_ci", - commands: [ - "service postgresql start && service mysql start && sleep 5", - "export PATH=~/.rbenv/shims:$PATH", - "export CODEPATH=`pwd`", - "/root/run_for.sh redmine_questions+" + license + " ruby-" + rubyVer + " " + db + " redmine-" + redmine + " " + dependents - ] - } - ] -}; - -[ - Pipeline("2.4.1", "mysql", "pro", "trunk", ""), - Pipeline("2.4.1", "mysql", "light", "trunk", ""), - Pipeline("2.4.1", "pg", "pro", "trunk", ""), - Pipeline("2.4.1", "mysql", "pro", "4.1", ""), - Pipeline("2.4.1", "mysql", "light", "4.1", ""), - Pipeline("2.4.1", "pg", "pro", "4.1", ""), - Pipeline("2.4.1", "mysql", "pro", "4.0", ""), - Pipeline("2.4.1", "mysql", "light", "4.0", ""), - Pipeline("2.4.1", "pg", "pro", "4.0", ""), - Pipeline("2.4.1", "pg", "light", "4.0", ""), - Pipeline("2.2.6", "mysql", "pro", "3.4", ""), - Pipeline("2.2.6", "pg", "pro", "3.4", ""), - Pipeline("2.2.6", "mysql", "pro", "3.0", ""), - Pipeline("2.2.6", "mysql", "light", "3.0", ""), - Pipeline("1.9.3", "pg", "pro", "2.6", ""), -] diff --git a/plugins/redmine_questions/app/controllers/questions_answers_controller.rb b/plugins/redmine_questions/app/controllers/questions_answers_controller.rb index f28d247..7ebf11d 100644 --- a/plugins/redmine_questions/app/controllers/questions_answers_controller.rb +++ b/plugins/redmine_questions/app/controllers/questions_answers_controller.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -34,11 +34,9 @@ class QuestionsAnswersController < ApplicationController end def edit - (render_403; return false) unless @answer.editable_by?(User.current) end def update - (render_403; return false) unless @answer.editable_by?(User.current) || User.current.allowed_to?(:accept_answers, @project) @answer.safe_attributes = params[:answer] @answer.save_attachments(params[:attachments]) if @answer.save @@ -89,7 +87,7 @@ class QuestionsAnswersController < ApplicationController private def redirect_to_question - redirect_to question_path(@answer.question, :anchor => "questions_answer_#{@answer.id}") + redirect_to question_path(@answer.question, :anchor => "question_item_#{@answer.id}") end def find_answer diff --git a/plugins/redmine_questions/app/controllers/questions_comments_controller.rb b/plugins/redmine_questions/app/controllers/questions_comments_controller.rb index 0887b64..7c4512e 100644 --- a/plugins/redmine_questions/app/controllers/questions_comments_controller.rb +++ b/plugins/redmine_questions/app/controllers/questions_comments_controller.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/app/controllers/questions_controller.rb b/plugins/redmine_questions/app/controllers/questions_controller.rb index bc67eac..224844c 100644 --- a/plugins/redmine_questions/app/controllers/questions_controller.rb +++ b/plugins/redmine_questions/app/controllers/questions_controller.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -54,7 +54,6 @@ class QuestionsController < ApplicationController end def update - (render_403; return false) unless @question_item.editable_by?(User.current) @question_item.safe_attributes = params[:question] @question_item.save_attachments(params[:attachments]) if @question_item.save @@ -134,7 +133,6 @@ class QuestionsController < ApplicationController @text = (params[:question] ? params[:question][:content] : nil) render :partial => 'common/preview' end - private def find_questions @@ -144,10 +142,10 @@ class QuestionsController < ApplicationController scope = Question.visible scope = scope.where(:section_id => @section) if @section - columns = ['subject', 'content'] - tokens = seach.to_s.scan(%r{((\s|^)"[\s\w]+"(\s|$)|\S+)}).collect { |m| m.first.gsub(%r{(^\s*"\s*|\s*"\s*$)}, '') }.uniq.select { |w| w.length > 1 } + columns = ["subject", "content"] + tokens = seach.to_s.scan(%r{((\s|^)"[\s\w]+"(\s|$)|\S+)}).collect{|m| m.first.gsub(%r{(^\s*"\s*|\s*"\s*$)}, '')}.uniq.select {|w| w.length > 1 } tokens = [] << tokens unless tokens.is_a?(Array) - token_clauses = columns.collect { |column| "(LOWER(#{column}) LIKE ?)" } + token_clauses = columns.collect {|column| "(LOWER(#{column}) LIKE ?)"} sql = (['(' + token_clauses.join(' OR ') + ')'] * tokens.size).join(' AND ') find_options = [sql, * (tokens.collect {|w| "%#{w.downcase}%"} * token_clauses.size).sort] @@ -168,9 +166,9 @@ class QuestionsController < ApplicationController end @limit = per_page_option - @offset = params[:page].to_i * @limit + @offset = params[:page].to_i*@limit scope = scope.limit(@limit).offset(@offset) - scope = scope.tagged_with(params[:tag]) if params[:tag].present? + scope = scope.tagged_with(params[:tag]) unless params[:tag].blank? @topic_count = scope.count @topic_pages = Paginator.new @topic_count, @limit, params[:page] @@ -180,7 +178,7 @@ class QuestionsController < ApplicationController def find_section @section = QuestionsSection.find_by_id(params[:section_id] || (params[:question] && params[:question][:section_id])) - @section ||= @project.questions_sections.first if @project + @section ||= @project.questions_sections.first rescue ActiveRecord::RecordNotFound render_404 end diff --git a/plugins/redmine_questions/app/controllers/questions_sections_controller.rb b/plugins/redmine_questions/app/controllers/questions_sections_controller.rb index a9bb37b..b33376d 100644 --- a/plugins/redmine_questions/app/controllers/questions_sections_controller.rb +++ b/plugins/redmine_questions/app/controllers/questions_sections_controller.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -58,7 +58,6 @@ class QuestionsSectionsController < ApplicationController def update @section.safe_attributes = params[:questions_section] - @section.insert_at(@section.position) if @section.position_changed? if @section.save respond_to do |format| format.html do diff --git a/plugins/redmine_questions/app/controllers/questions_statuses_controller.rb b/plugins/redmine_questions/app/controllers/questions_statuses_controller.rb index 1acbc7c..35db2e2 100644 --- a/plugins/redmine_questions/app/controllers/questions_statuses_controller.rb +++ b/plugins/redmine_questions/app/controllers/questions_statuses_controller.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -39,13 +39,12 @@ class QuestionsStatusesController < ApplicationController end def create - @questions_status = QuestionsStatus.new - @questions_status.safe_attributes = params[:questions_status] + @questions_status = QuestionsStatus.new(params[:questions_status]) if request.post? && @questions_status.save flash[:notice] = l(:notice_successful_create) - redirect_to action: 'plugin', id: 'redmine_questions', controller: 'settings', tab: 'questions_statuses' + redirect_to :action => "plugin", :id => "redmine_questions", :controller => "settings", :tab => 'questions_statuses' else - render action: 'new' + render :action => 'new' end end @@ -55,18 +54,17 @@ class QuestionsStatusesController < ApplicationController def update @questions_status = QuestionsStatus.find(params[:id]) - @questions_status.safe_attributes = params[:questions_status] - if @questions_status.save + if @questions_status.update_attributes(params[:questions_status]) respond_to do |format| format.html { flash[:notice] = l(:notice_successful_update) - redirect_to action: 'plugin', id: 'redmine_questions', controller: 'settings', tab: 'questions_statuses' + redirect_to :action => 'plugin', :id => 'redmine_questions', :controller => 'settings', :tab => 'questions_statuses' } format.js { head 200 } end else respond_to do |format| - format.html { render action: 'edit' } + format.html { render :action => 'edit' } format.js { head 422 } end end @@ -74,9 +72,11 @@ class QuestionsStatusesController < ApplicationController def destroy QuestionsStatus.find(params[:id]).destroy - redirect_to action: 'plugin', id: 'redmine_questions', controller: 'settings', tab: 'questions_statuses' + redirect_to :action =>"plugin", :id => "redmine_questions", :controller => "settings", :tab => 'questions_statuses' rescue flash[:error] = l(:error_products_unable_delete_questions_status) - redirect_to action: 'plugin', id: 'redmine_questions', controller: 'settings', tab: 'questions_statuses' + redirect_to :action =>"plugin", :id => "redmine_questions", :controller => "settings", :tab => 'questions_statuses' end + + end diff --git a/plugins/redmine_questions/app/helpers/questions_helper.rb b/plugins/redmine_questions/app/helpers/questions_helper.rb index c16eb61..a9e353c 100644 --- a/plugins/redmine_questions/app/helpers/questions_helper.rb +++ b/plugins/redmine_questions/app/helpers/questions_helper.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/app/models/question.rb b/plugins/redmine_questions/app/models/question.rb index c21af9b..99efbcd 100644 --- a/plugins/redmine_questions/app/models/question.rb +++ b/plugins/redmine_questions/app/models/question.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -54,22 +54,22 @@ class Question < ActiveRecord::Base :author_key => :author_id, :timestamp => "#{table_name}.created_on", :scope => joins({:section => :project}, :author) - acts_as_searchable :columns => ["#{table_name}.subject", - "#{table_name}.content", + acts_as_searchable :columns => ["#{table_name}.subject", + "#{table_name}.content", "#{QuestionsAnswer.table_name}.content"], - :scope => joins({:section => :project}, :answers), - :project_key => "#{QuestionsSection.table_name}.project_id" + :scope => joins({:section => :project}, :answers), + :project_key => "#{QuestionsSection.table_name}.project_id" else acts_as_activity_provider :type => 'questions', :permission => :view_questions, :author_key => :author_id, :timestamp => "#{table_name}.created_on", :find_options => { :include => [{:section => :project}, :author] } - acts_as_searchable :columns => ["#{table_name}.subject", - "#{table_name}.content", + acts_as_searchable :columns => ["#{table_name}.subject", + "#{table_name}.content", "#{QuestionsAnswer.table_name}.content"], :include => [{:section => :project}, :answers], - :project_key => "#{QuestionsSection.table_name}.project_id" + :project_key => "#{QuestionsSection.table_name}.project_id" end scope :solutions, lambda { joins(:section).where(:questions_sections => {:section_type => QuestionsSection::SECTION_TYPE_SOLUTIONS}) } @@ -114,7 +114,7 @@ class Question < ActiveRecord::Base allowed_to_view_condition += projects_allowed_to_view_questions.empty? ? ' OR (0=1) ' : " OR (#{table_name}.project_id IN (#{projects_allowed_to_view_questions.join(',')}))" user.admin? ? '(1=1)' : allowed_to_view_condition - end + end def self.related(question, limit) tokens = question.subject.strip.scan(%r{((\s|^)"[\s\w]+"(\s|$)|\S+)}). @@ -127,7 +127,7 @@ class Question < ActiveRecord::Base end def commentable?(user = User.current) - return false if locked? + return false if locked? user.allowed_to?(:comment_question, project) end @@ -285,6 +285,6 @@ class Question < ActiveRecord::Base end def send_notification - Mailer.question_question_added(User.current, self).deliver if Setting.notified_events.include?('question_added') + Mailer.question_question_added(self).deliver if Setting.notified_events.include?('question_added') end end diff --git a/plugins/redmine_questions/app/models/questions_answer.rb b/plugins/redmine_questions/app/models/questions_answer.rb index 39c46a7..b1e9f0f 100644 --- a/plugins/redmine_questions/app/models/questions_answer.rb +++ b/plugins/redmine_questions/app/models/questions_answer.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -97,7 +97,6 @@ class QuestionsAnswer < ActiveRecord::Base end def editable_by?(user) - (author == user && user.allowed_to?(:edit_own_answers, project)) || user.allowed_to?(:edit_questions, project) end @@ -108,7 +107,7 @@ class QuestionsAnswer < ActiveRecord::Base def votable_by?(user) user.allowed_to?(:vote_questions, project) end - + private def check_accepted question.answers.update_all(:accepted => false) if question && @@ -122,6 +121,6 @@ class QuestionsAnswer < ActiveRecord::Base end def send_notification - Mailer.question_answer_added(User.current, self).deliver if Setting.notified_events.include?('question_answer_added') + Mailer.question_answer_added(self).deliver if Setting.notified_events.include?('question_answer_added') end end diff --git a/plugins/redmine_questions/app/models/questions_section.rb b/plugins/redmine_questions/app/models/questions_section.rb index 44418c4..1263bbf 100644 --- a/plugins/redmine_questions/app/models/questions_section.rb +++ b/plugins/redmine_questions/app/models/questions_section.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -27,12 +27,7 @@ class QuestionsSection < ActiveRecord::Base attr_protected :id if ActiveRecord::VERSION::MAJOR <= 4 safe_attributes 'name', 'project', 'position', 'description', 'section_type' - scope :with_questions_count, lambda { - select("#{QuestionsSection.table_name}.*, count(#{QuestionsSection.table_name}.id) as questions_count"). - joins(:questions). - order("project_id ASC"). - group(QuestionsSection.column_names.map { |column| "#{QuestionsSection.table_name}.#{column}" }.join(', ')) - } + scope :with_questions_count, lambda { select("#{QuestionsSection.table_name}.*, count(#{QuestionsSection.table_name}.id) as questions_count").joins(:questions).order("project_id ASC").group("#{QuestionsSection.table_name}.id, #{QuestionsSection.table_name}.name, #{QuestionsSection.table_name}.project_id, #{QuestionsSection.table_name}.section_type") } scope :for_project, lambda { |project| where(:project_id => project) unless project.blank? } scope :visible, lambda {|*args| joins(:project). diff --git a/plugins/redmine_questions/app/models/questions_settings.rb b/plugins/redmine_questions/app/models/questions_settings.rb index 04168f6..bd81f48 100644 --- a/plugins/redmine_questions/app/models/questions_settings.rb +++ b/plugins/redmine_questions/app/models/questions_settings.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/app/models/questions_status.rb b/plugins/redmine_questions/app/models/questions_status.rb index 4400653..1014152 100644 --- a/plugins/redmine_questions/app/models/questions_status.rb +++ b/plugins/redmine_questions/app/models/questions_status.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -26,7 +26,7 @@ class QuestionsStatus < ActiveRecord::Base attr_protected :id if ActiveRecord::VERSION::MAJOR <= 4 safe_attributes 'name', 'is_closed', 'position', 'color' - validates :name, presence: true, uniqueness: true + validates :name, :presence => true, :uniqueness => true scope :sorted, lambda { order(:position) } diff --git a/plugins/redmine_questions/app/views/projects/_questions_settings.html.erb b/plugins/redmine_questions/app/views/projects/_questions_settings.html.erb index 83b372e..9e38735 100644 --- a/plugins/redmine_questions/app/views/projects/_questions_settings.html.erb +++ b/plugins/redmine_questions/app/views/projects/_questions_settings.html.erb @@ -1,41 +1,36 @@ -<% @project_sections = QuestionsSection.for_project(@project).sorted %>

      <%= l(:label_questions_sections_plural) %>

      -<% if @project_sections.any? %> - - - - - - +
      <%= l(:field_name) %><%=l(:field_type)%>
      + + + + + + + + + <% QuestionsSection.for_project(@project).sorted.each do |section| %> + + + + - - - <% @project_sections.each do |section| %> - - - - - - <% end %> - -
      <%= l(:field_name) %><%=l(:field_type)%>
      + <%= h(section.name) %> + + <%= section.l_type %> + + <% if User.current.allowed_to?(:manage_sections, @project) %> + <%= reorder_handle(section, :url => project_questions_section_path(@project, section), :param => 'questions_section') if respond_to?(:reorder_handle) %> + <%= link_to l(:button_edit), {:controller => 'questions_sections', :action => 'edit', :project_id => @project, :id => section}, :class => 'icon icon-edit' %> + <%= delete_link :controller => 'questions_sections', :action => 'destroy', :project_id => @project, :id => section %> + <% end %> +
      - <%= h(section.name) %> - - <%= section.l_type %> - - <% if User.current.allowed_to?(:manage_sections, @project) %> - <%= reorder_handle(section, url: project_questions_section_path(@project, section), param: 'questions_section') if respond_to?(:reorder_handle) %> - <%= link_to l(:button_edit), edit_questions_section_path(section, project_id: @project), class: 'icon icon-edit' %> - <%= delete_link questions_section_path(section, project_id: @project) %> - <% end %> -
      -<% else %> -

      <%= l(:label_no_data) %>

      -<% end %> + <% end %> + + <% if User.current.allowed_to?(:manage_sections, @project) %> - <%= link_to image_tag('add.png', style: 'vertical-align: middle;') + l(:label_questions_section_new), new_questions_section_path(project_id: @project) %> + <%= link_to image_tag('add.png', :style => 'vertical-align: middle;')+l(:label_questions_section_new), :controller => 'questions_sections', :action => 'new', :project_id => @project %> <% end %> <%= javascript_tag do %> diff --git a/plugins/redmine_questions/app/views/questions/_form.html.erb b/plugins/redmine_questions/app/views/questions/_form.html.erb index 25c5411..2f22e64 100644 --- a/plugins/redmine_questions/app/views/questions/_form.html.erb +++ b/plugins/redmine_questions/app/views/questions/_form.html.erb @@ -6,7 +6,7 @@ <%= f.text_field :subject, :id => "question_subject", :size => 120%>


      - <%= f.select :section_id, options_from_collection_for_select(QuestionsSection.where(:project_id => @project).sorted, :id, :name, f.object.section_id), :style => "width: 80%;", :required => true %> + <%= f.select :section_id, options_from_collection_for_select(QuestionsSection.where(:project_id => @project),:id, :name, f.object.section_id), :style => "width: 80%;", :required => true %> <%= javascript_tag do %> $('#question_section_id').change(function() { $.ajax({ diff --git a/plugins/redmine_questions/app/views/questions/_question_item.html.erb b/plugins/redmine_questions/app/views/questions/_question_item.html.erb index 986641e..738298b 100644 --- a/plugins/redmine_questions/app/views/questions/_question_item.html.erb +++ b/plugins/redmine_questions/app/views/questions/_question_item.html.erb @@ -1,6 +1,6 @@

      div-table" id="question_<%= question_item.id %>"> - <% if question_item.allow_voting? %> + <% if question_item.allow_voting? && User.current.allowed_to?(:vote_questions, @project) %>
      <%= render :partial => 'questions_votes/question_item_vote', :locals => {:question_item => question_item} %>
      diff --git a/plugins/redmine_questions/app/views/questions/edit.html.erb b/plugins/redmine_questions/app/views/questions/edit.html.erb index c3eab94..055f9a7 100644 --- a/plugins/redmine_questions/app/views/questions/edit.html.erb +++ b/plugins/redmine_questions/app/views/questions/edit.html.erb @@ -8,8 +8,7 @@ <%= render :partial => 'form', :locals => {:f => f} %>
      <%= submit_tag l(:button_save) %> - <%= preview_link({:controller => 'questions', :action => 'preview', :question_id => @question_item}, 'question_form') if Redmine::VERSION.to_s <= '3.4.5' %> - | <%= link_to l(:button_cancel), question_path(@question_item) %> + <%= preview_link({:controller => 'questions', :action => 'preview', :question_id => @question_item}, 'question_form') %> <% end %>
      diff --git a/plugins/redmine_questions/app/views/questions/index.html.erb b/plugins/redmine_questions/app/views/questions/index.html.erb index 00d33bf..a364d69 100644 --- a/plugins/redmine_questions/app/views/questions/index.html.erb +++ b/plugins/redmine_questions/app/views/questions/index.html.erb @@ -19,7 +19,7 @@
      <%= form_tag({:controller => "questions", :action => "index"}, :method => :get, :id => "query_form") do %> <%= text_field_tag(:topic_search, params[:topic_search], :autocomplete => "off", :class => "questions-search", :placeholder => l(:label_questions_search) ) %> - <%= javascript_tag "observeSearchfield('topic_search', 'topics_list', '#{ escape_javascript(autocomplete_for_subject_questions_path(:project_id => @project, :section_id => @section, :sort_order => @sort_order)) }')" %> + <%= javascript_tag "observeSearchfield('topic_search', 'topics_list', '#{ escape_javascript(autocomplete_for_subject_questions_path(:project_id => @project, :section_id => @section)) }')" %> <% end %>
      diff --git a/plugins/redmine_questions/app/views/questions/new.html.erb b/plugins/redmine_questions/app/views/questions/new.html.erb index 6dd25ca..48eae58 100644 --- a/plugins/redmine_questions/app/views/questions/new.html.erb +++ b/plugins/redmine_questions/app/views/questions/new.html.erb @@ -1,12 +1,12 @@

      <%= l(:label_message_new) %>

      -<%= form_for @question_item, { :url => project_questions_path(@project, {}), :html => {:multipart => true, +<%= form_for @question_item, { :url => questions_path, :html => {:multipart => true, :id => 'question_form'}} do |f| %>
      - <%= render partial: 'form', locals: { f: f } %> + <%= render :partial => 'form', :locals => {:f => f} %>
      <%= submit_tag l(:button_create) %> - <% preview_link({ controller: 'questions', action: 'preview', id: @question_item }, 'question_form') if Redmine::VERSION.to_s <= '3.4.5' %> + <% preview_link({:controller => 'questions', :action => 'preview', :id => @question_item}, 'question_form') %> <% end %>
      diff --git a/plugins/redmine_questions/app/views/questions_answers/_actions.html.erb b/plugins/redmine_questions/app/views/questions_answers/_actions.html.erb index afecfa7..bb3d84a 100644 --- a/plugins/redmine_questions/app/views/questions_answers/_actions.html.erb +++ b/plugins/redmine_questions/app/views/questions_answers/_actions.html.erb @@ -1,11 +1,5 @@
      - <% if question_item.editable_by?(User.current) %> - <%= link_to(l(:button_edit), edit_questions_answer_path(question_item), :class => 'icon icon-edit') %> - <% elsif User.current.allowed_to?(:accept_answers, @project) && !question_item.accepted? %> - <%= link_to(l(:label_questions_accept), questions_answer_path(question_item, answer: {accepted: true}), method: :put, :class => 'icon icon-accept') %> - <% elsif User.current.allowed_to?(:accept_answers, @project) && question_item.accepted? %> - <%= link_to(l(:label_questions_discard), questions_answer_path(question_item, answer: {accepted: false}), method: :put, :class => 'icon icon-discard') %> - <% end %> - <%= link_to(l(:button_delete), questions_answer_path(question_item), :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') if question_item.destroyable_by?(User.current) + <%= link_to(l(:button_edit), edit_questions_answer_path(question_item), :class => 'icon icon-edit') if question_item.editable_by?(User.current) %> + <%= link_to(l(:button_delete), questions_answer_path(question_item), :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') if question_item.destroyable_by?(User.current) %>
      diff --git a/plugins/redmine_questions/app/views/questions_answers/_answer_item.html.erb b/plugins/redmine_questions/app/views/questions_answers/_answer_item.html.erb index c7e8a1b..01a39ca 100644 --- a/plugins/redmine_questions/app/views/questions_answers/_answer_item.html.erb +++ b/plugins/redmine_questions/app/views/questions_answers/_answer_item.html.erb @@ -1,6 +1,6 @@
      - <% if question_item.allow_voting? %> + <% if question_item.allow_voting? && User.current.allowed_to?(:vote_questions, @project) %>
      <%= render :partial => 'questions_votes/question_item_vote', :locals => {:question_item => question_item } %>
      diff --git a/plugins/redmine_questions/app/views/questions_answers/edit.html.erb b/plugins/redmine_questions/app/views/questions_answers/edit.html.erb index bb93a46..ea448b8 100644 --- a/plugins/redmine_questions/app/views/questions_answers/edit.html.erb +++ b/plugins/redmine_questions/app/views/questions_answers/edit.html.erb @@ -5,8 +5,8 @@ <%= back_url_hidden_field_tag %> <%= render :partial => 'form', :locals => {:f => f} %> <%= submit_tag l(:button_save) %> - <%= preview_link(preview_questions_answers_path(@answer), 'answer-form') if Redmine::VERSION.to_s <= '3.4.5' %> - | <%= link_to l(:button_cancel), question_path(@answer.question, :anchor => "question_item_#{@answer.id}") %> + <%= preview_link(preview_questions_answers_path(@answer), 'answer-form') %> + <% end %>
      diff --git a/plugins/redmine_questions/app/views/questions_sections/_tiles.html.erb b/plugins/redmine_questions/app/views/questions_sections/_tiles.html.erb index c94109f..44420f3 100644 --- a/plugins/redmine_questions/app/views/questions_sections/_tiles.html.erb +++ b/plugins/redmine_questions/app/views/questions_sections/_tiles.html.erb @@ -1,25 +1,29 @@ -<% @sections.group_by(&:project).each do |project, sections| %> - <% if @project.blank? %> -
      -

      - <%= project.name %> - <%= link_to " \xc2\xbb", project_questions_sections_path(project_id: project.identifier) %> -

      +<% previous_group = false %> +
      +<% @sections.each do |section| %> + <% if @project.blank? && (group = section.project) != previous_group %> + <% reset_cycle %>
      - <% end %> - -
      - <% sections.each do |section| %> - "> -

      - <%= section.name %> - <%= "(#{section.questions_count})" %> -

      -
      - <%= section.description %> -
      -
      + <% if group %> +
      +

      + <%= group.name %> + <%= link_to " \xc2\xbb", project_questions_sections_path(:project_id => group.identifier) %> +

      +
      <% end %> -
      +
    diff --git a/plugins/redmine_questions/app/views/questions_sections/index.html.erb b/plugins/redmine_questions/app/views/questions_sections/index.html.erb index 43ff5b8..d8aec00 100644 --- a/plugins/redmine_questions/app/views/questions_sections/index.html.erb +++ b/plugins/redmine_questions/app/views/questions_sections/index.html.erb @@ -26,3 +26,4 @@ <% content_for :header_tags do %> <%= javascript_include_tag :questions, :plugin => 'redmine_questions' %> <% end %> + diff --git a/plugins/redmine_questions/assets/images/accept.png b/plugins/redmine_questions/assets/images/accept.png deleted file mode 100644 index 89c8129..0000000 Binary files a/plugins/redmine_questions/assets/images/accept.png and /dev/null differ diff --git a/plugins/redmine_questions/assets/images/discard.png b/plugins/redmine_questions/assets/images/discard.png deleted file mode 100644 index d793b74..0000000 Binary files a/plugins/redmine_questions/assets/images/discard.png and /dev/null differ diff --git a/plugins/redmine_questions/assets/stylesheets/redmine_questions.css b/plugins/redmine_questions/assets/stylesheets/redmine_questions.css index 203ed45..7843900 100644 --- a/plugins/redmine_questions/assets/stylesheets/redmine_questions.css +++ b/plugins/redmine_questions/assets/stylesheets/redmine_questions.css @@ -400,5 +400,3 @@ div.question.votable .question-container .contextual {margin-top: 0px;} .icon-tag { background-image: url(../images/tag_blue.png); } .icon-question { background-image: url(../../../images/help.png); } .icon-solution { background-image: url(../images/book_open.png); } -.icon-accept { background-image: url(../images/accept.png); } -.icon-discard { background-image: url(../images/discard.png); } \ No newline at end of file diff --git a/plugins/redmine_questions/config/locales/en.yml b/plugins/redmine_questions/config/locales/en.yml index 467868c..1c06d6c 100644 --- a/plugins/redmine_questions/config/locales/en.yml +++ b/plugins/redmine_questions/config/locales/en.yml @@ -169,6 +169,4 @@ en: permission_vote_questions: Vote questions permission_accept_answers: Accept answers permission_manage_sections: Manage sections - permission_create_tags: Create new tags - label_questions_discard: Discard - permission_edit_own_answers: Edit own answers \ No newline at end of file + permission_create_tags: Create new tags \ No newline at end of file diff --git a/plugins/redmine_questions/config/locales/ru.yml b/plugins/redmine_questions/config/locales/ru.yml index bacd237..a8c198d 100644 --- a/plugins/redmine_questions/config/locales/ru.yml +++ b/plugins/redmine_questions/config/locales/ru.yml @@ -94,6 +94,4 @@ ru: permission_vote_questions: Голосовать за вопросы permission_accept_answers: Принимать ответы permission_manage_sections: Управлять секциями - permission_create_tags: Создавать новые тэги - label_questions_discard: Не принимать - permission_edit_own_answers: Редактировать свои ответы + permission_create_tags: Создавать новые тэги \ No newline at end of file diff --git a/plugins/redmine_questions/config/routes.rb b/plugins/redmine_questions/config/routes.rb index 37d1162..9135b49 100644 --- a/plugins/redmine_questions/config/routes.rb +++ b/plugins/redmine_questions/config/routes.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/001_acts_as_votable_migration.rb b/plugins/redmine_questions/db/migrate/001_acts_as_votable_migration.rb index a172ce2..7f4787d 100644 --- a/plugins/redmine_questions/db/migrate/001_acts_as_votable_migration.rb +++ b/plugins/redmine_questions/db/migrate/001_acts_as_votable_migration.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/002_add_viewing_migration.rb b/plugins/redmine_questions/db/migrate/002_add_viewing_migration.rb index 71557c1..63f04c0 100644 --- a/plugins/redmine_questions/db/migrate/002_add_viewing_migration.rb +++ b/plugins/redmine_questions/db/migrate/002_add_viewing_migration.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/003_add_tagging_migration.rb b/plugins/redmine_questions/db/migrate/003_add_tagging_migration.rb index e8b1fcc..a54614e 100644 --- a/plugins/redmine_questions/db/migrate/003_add_tagging_migration.rb +++ b/plugins/redmine_questions/db/migrate/003_add_tagging_migration.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/004_create_questions.rb b/plugins/redmine_questions/db/migrate/004_create_questions.rb index ed0665b..8165cf0 100644 --- a/plugins/redmine_questions/db/migrate/004_create_questions.rb +++ b/plugins/redmine_questions/db/migrate/004_create_questions.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/005_create_questions_sections.rb b/plugins/redmine_questions/db/migrate/005_create_questions_sections.rb index d3db0a5..f53d117 100644 --- a/plugins/redmine_questions/db/migrate/005_create_questions_sections.rb +++ b/plugins/redmine_questions/db/migrate/005_create_questions_sections.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/006_create_questions_answers.rb b/plugins/redmine_questions/db/migrate/006_create_questions_answers.rb index 8a14b85..2c984b2 100644 --- a/plugins/redmine_questions/db/migrate/006_create_questions_answers.rb +++ b/plugins/redmine_questions/db/migrate/006_create_questions_answers.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/db/migrate/007_create_questions_statuses.rb b/plugins/redmine_questions/db/migrate/007_create_questions_statuses.rb index a892ced..9fb72d0 100644 --- a/plugins/redmine_questions/db/migrate/007_create_questions_statuses.rb +++ b/plugins/redmine_questions/db/migrate/007_create_questions_statuses.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/doc/CHANGELOG b/plugins/redmine_questions/doc/CHANGELOG index f371240..aee16f7 100755 --- a/plugins/redmine_questions/doc/CHANGELOG +++ b/plugins/redmine_questions/doc/CHANGELOG @@ -1,27 +1,9 @@ == Redmine Q&A plugin changelog Redmine Q&A plugin -Copyright (C) 2011-2020 RedmineUP +Copyright (C) 2011-2018 RedmineUP https://www.redmineup.com/ -== 2020-03-03 v1.0.2 - -* Redmine 4.1 support -* Fixed section position bug -* Fixed MSSQL group by bug -* Fixed "Help & Support" page layout - -== 2019-08-23 v1.0.1 - -* Accept answer links -* Edit own answers permission -* Redmine 4 support -* Fixed sorting by unanswered question not working -* Fixed project variable dismissed -* Fixed status creating bug -* Fixed preview link, empty project bug -* Fixed boards migration bug - == 2018-08-31 v1.0.0 * Separate models for questions, answers and comments diff --git a/plugins/redmine_questions/init.rb b/plugins/redmine_questions/init.rb index caf83d0..0e373b3 100644 --- a/plugins/redmine_questions/init.rb +++ b/plugins/redmine_questions/init.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -17,11 +17,11 @@ # You should have received a copy of the GNU General Public License # along with redmine_questions. If not, see . -requires_redmine_crm version_or_higher: '0.0.41' +requires_redmine_crm version_or_higher: '0.0.38' require 'redmine_questions' -QA_VERSION_NUMBER = '1.0.2' +QA_VERSION_NUMBER = '1.0.0' QA_VERSION_TYPE = "Light version" Redmine::Plugin.register :redmine_questions do @@ -47,7 +47,6 @@ Redmine::Plugin.register :redmine_questions do permission :add_questions, { questions: [:create, :new, :preview, :update_form] } permission :edit_questions, { questions: [:edit, :update, :preview, :update_form], questions_answers: [:edit, :update, :preview] }, require: :loggedin permission :edit_own_questions, {questions: [:edit, :update, :preview, :update_form]}, require: :loggedin - permission :edit_own_answers, {questions_answers: [:edit, :update, :preview]}, require: :loggedin permission :add_answers, { questions_answers: [:create, :show, :new, :edit, :update, :preview] } permission :view_questions, { questions: [:index, :show, :autocomplete_for_subject], questions_sections: [:index] }, read: true permission :delete_questions, { questions: [:destroy] }, require: :loggedin diff --git a/plugins/redmine_questions/lib/acts_as_attachable_questions/init.rb b/plugins/redmine_questions/lib/acts_as_attachable_questions/init.rb index 810d2d9..92731f3 100755 --- a/plugins/redmine_questions/lib/acts_as_attachable_questions/init.rb +++ b/plugins/redmine_questions/lib/acts_as_attachable_questions/init.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/acts_as_attachable_questions/lib/acts_as_attachable_questions.rb b/plugins/redmine_questions/lib/acts_as_attachable_questions/lib/acts_as_attachable_questions.rb index 6c80c7f..61edb90 100755 --- a/plugins/redmine_questions/lib/acts_as_attachable_questions/lib/acts_as_attachable_questions.rb +++ b/plugins/redmine_questions/lib/acts_as_attachable_questions/lib/acts_as_attachable_questions.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -70,7 +70,6 @@ module Redmine end def save_attachments(attachments, author = User.current) - attachments = attachments.to_unsafe_hash if attachments.respond_to?(:to_unsafe_hash) attachments = attachments.values if attachments.is_a?(Hash) if attachments.is_a?(Array) attachments.each do |attachment| diff --git a/plugins/redmine_questions/lib/redmine_questions.rb b/plugins/redmine_questions/lib/redmine_questions.rb index 36bd531..f74816b 100644 --- a/plugins/redmine_questions/lib/redmine_questions.rb +++ b/plugins/redmine_questions/lib/redmine_questions.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -28,3 +28,5 @@ require_dependency 'redmine_questions/patches/auto_completes_controller_patch' require_dependency 'redmine_questions/patches/comment_patch' require_dependency 'acts_as_attachable_questions/init' + +require 'redmine_questions/patches/compatibility/application_controller_patch' if Rails::VERSION::MAJOR < 4 diff --git a/plugins/redmine_questions/lib/redmine_questions/hooks/views_layouts_hook.rb b/plugins/redmine_questions/lib/redmine_questions/hooks/views_layouts_hook.rb index dc81601..2405ae1 100644 --- a/plugins/redmine_questions/lib/redmine_questions/hooks/views_layouts_hook.rb +++ b/plugins/redmine_questions/lib/redmine_questions/hooks/views_layouts_hook.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/auto_completes_controller_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/auto_completes_controller_patch.rb index 9b9e451..7449d84 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/auto_completes_controller_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/auto_completes_controller_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/comment_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/comment_patch.rb index 8396721..94146b7 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/comment_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/comment_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/compatibility/application_controller_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/compatibility/application_controller_patch.rb new file mode 100644 index 0000000..723eb8c --- /dev/null +++ b/plugins/redmine_questions/lib/redmine_questions/patches/compatibility/application_controller_patch.rb @@ -0,0 +1,37 @@ +# This file is a part of Redmine Q&A (redmine_questions) plugin, +# Q&A plugin for Redmine +# +# Copyright (C) 2011-2018 RedmineUP +# http://www.redmineup.com/ +# +# redmine_questions is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# redmine_questions is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with redmine_questions. If not, see . + +module RedmineQuestions + module Patches + module ApplicationControllerPatch + def self.included(base) # :nodoc: + base.class_eval do + unloadable # Send unloadable so it will not be unloaded in development + class << self + alias_method :before_action, :before_filter + end + end + end + end + end +end + +unless ApplicationController.included_modules.include?(RedmineQuestions::Patches::ApplicationControllerPatch) + ApplicationController.send(:include, RedmineQuestions::Patches::ApplicationControllerPatch) +end diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/mailer_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/mailer_patch.rb index f895146..b0022af 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/mailer_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/mailer_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -20,15 +20,8 @@ module RedmineQuestions module Patches module MailerPatch - - module ClassMethods - def deliver_question_comment_added(comment) - question_comment_added(User.current, comment).deliver_later - end - end - module InstanceMethods - def question_comment_added(_user = User.current, comment) + def question_comment_added(comment) question = comment.commented.is_a?(Question) ? comment.commented : comment.commented.question @question_url = url_for(:controller => 'questions', :action => 'show', :id => question.id) project_identifier = question.project.try(:identifier) @@ -43,7 +36,7 @@ module RedmineQuestions :subject => "[#{project_prefix}] RE: #{question.subject}" end - def question_question_added(_user = Current.user, question) + def question_question_added(question) @question_url = url_for(:controller => 'questions', :action => 'show', :id => question.id) project_identifier = question.project.try(:identifier) redmine_headers 'Project' => project_identifier, 'Question-Id' => question.id @@ -58,9 +51,9 @@ module RedmineQuestions :subject => "[#{project_prefix}] #{question.subject}" end - def question_answer_added(_user = Current.user, answer) + def question_answer_added(answer) question = answer.question - @question_url = url_for(controller: 'questions', action: 'show', id: question.id) + @question_url = url_for(:controller => 'questions', :action => 'show', :id => question.id) project_identifier = question.project.try(:identifier) redmine_headers 'Project' => project_identifier, 'Question-Id' => question.id message_id question @@ -73,14 +66,13 @@ module RedmineQuestions @answer = answer @question = question project_prefix = [project_identifier, question.section_name, "q&a#{question.id}"].compact.join(' - ') - mail to: recipients, - cc: cc, - subject: "[#{project_prefix}] - answ##{answer.id} - RE: #{question.subject}" + mail :to => recipients, + :cc => cc, + :subject => "[#{project_prefix}] - answ##{answer.id} - RE: #{question.subject}" end end def self.included(receiver) - receiver.send :extend, ClassMethods receiver.send :include, InstanceMethods receiver.class_eval do unloadable diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/notifiable_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/notifiable_patch.rb index 87c79ca..578d435 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/notifiable_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/notifiable_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/project_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/project_patch.rb index 8390cc0..cb9ef94 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/project_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/project_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/projects_helper_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/projects_helper_patch.rb index 2482f0d..96ba21a 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/projects_helper_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/projects_helper_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/redmine_questions/patches/user_patch.rb b/plugins/redmine_questions/lib/redmine_questions/patches/user_patch.rb index b18d28d..e2467ad 100644 --- a/plugins/redmine_questions/lib/redmine_questions/patches/user_patch.rb +++ b/plugins/redmine_questions/lib/redmine_questions/patches/user_patch.rb @@ -1,7 +1,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/lib/tasks/migrate_from_boards.rake b/plugins/redmine_questions/lib/tasks/migrate_from_boards.rake index 9e2245e..c13175b 100644 --- a/plugins/redmine_questions/lib/tasks/migrate_from_boards.rake +++ b/plugins/redmine_questions/lib/tasks/migrate_from_boards.rake @@ -38,13 +38,13 @@ END_DESC next end - question_attrs = topic.attributes.slice('subject', 'content', 'author_id', 'locked') + question_attrs = topic.attributes.slice('subject', 'content', 'author_id', 'locked').merge('project_id' => project.try(:id)) migrated_question = section.questions.create(question_attrs) migrated_question.attachments = topic.attachments.map { |attachment| attachment.copy } topic.children.each do |reply| if section.section_type == 'questions' - answer_attrs = reply.slice('subject', 'content', 'author_id', 'locked') + answer_attrs = reply.slice('subject', 'content', 'author_id', 'locked').merge('project_id' => project.try(:id)) migrated_answer = migrated_question.answers.create(answer_attrs) migrated_answer.attachments = reply.attachments.map { |attachment| attachment.copy } else diff --git a/plugins/redmine_questions/test/fixtures/questions_answers.yml b/plugins/redmine_questions/test/fixtures/questions_answers.yml index ec45b66..1b9ff76 100644 --- a/plugins/redmine_questions/test/fixtures/questions_answers.yml +++ b/plugins/redmine_questions/test/fixtures/questions_answers.yml @@ -9,10 +9,4 @@ answer_002: content: This is answer for question_002 question_id: 2 author_id: 1 - accepted: false -answer_003: - id: 3 - content: This is a second answer for question_001 - question_id: 1 - author_id: 3 - accepted: false \ No newline at end of file + accepted: false \ No newline at end of file diff --git a/plugins/redmine_questions/test/fixtures/questions_statuses.yml b/plugins/redmine_questions/test/fixtures/questions_statuses.yml deleted file mode 100644 index 96f89bb..0000000 --- a/plugins/redmine_questions/test/fixtures/questions_statuses.yml +++ /dev/null @@ -1,10 +0,0 @@ -section_001: - id: 1 - name: Open - color: green - is_closed: false -section_002: - id: 2 - name: Closed - color: red - is_closed: true diff --git a/plugins/redmine_questions/test/functional/questions_answers_controller_test.rb b/plugins/redmine_questions/test/functional/questions_answers_controller_test.rb index 41452ae..db5c126 100644 --- a/plugins/redmine_questions/test/functional/questions_answers_controller_test.rb +++ b/plugins/redmine_questions/test/functional/questions_answers_controller_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -79,7 +79,7 @@ class QuestionsAnswersControllerTest < ActionController::TestCase assert_redirected_to :controller => 'questions', :action => 'show', :id => question, - :anchor => "questions_answer_#{QuestionsAnswer.order(:id).last.id}" + :anchor => "question_item_#{QuestionsAnswer.order(:id).last.id}" assert_equal old_answer_count + 1, question.answers.count assert_equal 'Answer for the first question', question.answers.last.content end @@ -92,7 +92,11 @@ class QuestionsAnswersControllerTest < ActionController::TestCase :content => "Previewed answer", } assert_response :success - assert_select 'p', :text => 'Previewed answer' + assert_select 'fieldset' do + assert_select 'legend', :text => 'Preview' + assert_select 'p', :text => 'Previewed answer' + end + end def test_preview_edited_answer @@ -103,7 +107,11 @@ class QuestionsAnswersControllerTest < ActionController::TestCase :content => "Previewed answer 1", } assert_response :success - assert_select 'p', :text => 'Previewed answer 1' + assert_select 'fieldset' do + assert_select 'legend', :text => 'Preview' + assert_select 'p', :text => 'Previewed answer 1' + end + end def test_destroy @@ -113,7 +121,7 @@ class QuestionsAnswersControllerTest < ActionController::TestCase assert_difference 'QuestionsAnswer.count', -1 do compatible_request :post, :destroy, :id => answer.id end - assert_redirected_to question_path(answer.question, :anchor => "questions_answer_#{answer.id}") + assert_redirected_to question_path(answer.question, :anchor => "question_item_#{answer.id}") assert_nil QuestionsAnswer.find_by_id(answer.id) end @@ -136,6 +144,6 @@ class QuestionsAnswersControllerTest < ActionController::TestCase } # assert_response :success answer.reload - assert !answer.accepted, "Mark as official answer did set for answer after update for user without permission" + assert !answer.accepted, "Mark as officail answer did set for answer after update for user without permission" end end diff --git a/plugins/redmine_questions/test/functional/questions_comments_controller_test.rb b/plugins/redmine_questions/test/functional/questions_comments_controller_test.rb index 637495b..5b54656 100644 --- a/plugins/redmine_questions/test/functional/questions_comments_controller_test.rb +++ b/plugins/redmine_questions/test/functional/questions_comments_controller_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -22,8 +22,8 @@ require File.expand_path('../../test_helper', __FILE__) class QuestionsCommentsControllerTest < ActionController::TestCase - fixtures :users, - :projects, + fixtures :users, + :projects, :roles, :members, :member_roles, @@ -38,7 +38,7 @@ class QuestionsCommentsControllerTest < ActionController::TestCase :issue_categories, :enabled_modules, :workflows, - :questions, + :questions, :questions_answers, :questions_sections diff --git a/plugins/redmine_questions/test/functional/questions_controller_test.rb b/plugins/redmine_questions/test/functional/questions_controller_test.rb index c5a5d94..955fea7 100644 --- a/plugins/redmine_questions/test/functional/questions_controller_test.rb +++ b/plugins/redmine_questions/test/functional/questions_controller_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -22,8 +22,8 @@ require File.expand_path('../../test_helper', __FILE__) class QuestionsControllerTest < ActionController::TestCase - fixtures :users, - :projects, + fixtures :users, + :projects, :roles, :members, :member_roles, @@ -40,13 +40,14 @@ class QuestionsControllerTest < ActionController::TestCase :attachments, :workflows, :time_entries, - :questions, - :questions_answers, + :questions, + :questions_answers, :questions_sections fixtures :email_addresses if ActiveRecord::VERSION::MAJOR >= 4 - RedmineQuestions::TestCase.create_fixtures(Redmine::Plugin.find(:redmine_questions).directory + '/test/fixtures/', [:tags, :taggings, :comments]) + RedmineQuestions::TestCase.create_fixtures(Redmine::Plugin.find(:redmine_questions).directory + '/test/fixtures/', + [:tags, :taggings, :comments]) def setup RedmineQuestions::TestCase.prepare @@ -76,34 +77,6 @@ class QuestionsControllerTest < ActionController::TestCase assert_select 'p.breadcrumb' end - def test_get_new - @request.session[:user_id] = 1 - compatible_request :get, :new, project_id: @project - - assert_select 'input#question_subject' - assert_select 'select#question_section_id' - assert_select 'input[type=?]', 'submit' - end - - def test_get_edit - @request.session[:user_id] = 1 - compatible_request :get, :edit, id: 1 - - assert_select 'input#question_subject' - assert_select 'select#question_section_id' - assert_select 'input[type=?]', 'submit' - end - - def test_post_create_failed - @request.session[:user_id] = 1 - compatible_request :post, :create, :project_id => @project, - :question => { - - :content => "Body of text" - } - assert_response :success - end - def test_post_create @request.session[:user_id] = 1 ActionMailer::Base.deliveries.clear @@ -145,7 +118,7 @@ class QuestionsControllerTest < ActionController::TestCase assert_select 'div#reply' assert_select 'a.icon-del' assert_select 'a.add-comment-link' - assert_select 'span.items', {:text => "(1-2/2)"} + assert_select 'span.items', {:text => "(1-1/1)"} @dev_role.permissions << :add_answers @dev_role.save @request.session[:user_id] = 3 @@ -191,17 +164,20 @@ class QuestionsControllerTest < ActionController::TestCase end assert_redirected_to questions_path(:section_id => question.section) assert_nil Question.find_by_id(question.id) - end + end def test_preview_new_question @request.session[:user_id] = 1 question = questions(:question_001) - compatible_xhr_request :post, :preview, + compatible_xhr_request :post, :preview, :question => { :content => "Previewed question", } assert_response :success - assert_select 'p', :text => 'Previewed question' + assert_select 'fieldset' do + assert_select 'legend', :text => 'Preview' + assert_select 'p', :text => 'Previewed question' + end end def test_update_question diff --git a/plugins/redmine_questions/test/functional/questions_sections_controller_test.rb b/plugins/redmine_questions/test/functional/questions_sections_controller_test.rb index ca72b0a..09cfca7 100644 --- a/plugins/redmine_questions/test/functional/questions_sections_controller_test.rb +++ b/plugins/redmine_questions/test/functional/questions_sections_controller_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/test/functional/questions_statuses_controller_test.rb b/plugins/redmine_questions/test/functional/questions_statuses_controller_test.rb deleted file mode 100644 index d1bb7cc..0000000 --- a/plugins/redmine_questions/test/functional/questions_statuses_controller_test.rb +++ /dev/null @@ -1,93 +0,0 @@ -# encoding: utf-8 -# -# This file is a part of Redmine Q&A (redmine_questions) plugin, -# Q&A plugin for Redmine -# -# Copyright (C) 2011-2020 RedmineUP -# http://www.redmineup.com/ -# -# redmine_questions is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# redmine_questions is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with redmine_questions. If not, see . - -require File.expand_path('../../test_helper', __FILE__) - -class QuestionsStatusesControllerTest < ActionController::TestCase - fixtures :users, - :projects, - :roles, - :members, - :member_roles, - :trackers, - :enumerations, - :projects_trackers, - :issues, - :issue_statuses, - :versions, - :trackers, - :projects_trackers, - :issue_categories, - :enabled_modules, - :workflows, - :questions, - :questions_answers, - :questions_sections - - fixtures :email_addresses if ActiveRecord::VERSION::MAJOR >= 4 - - RedmineQuestions::TestCase.create_fixtures(Redmine::Plugin.find(:redmine_questions).directory + '/test/fixtures/', [:questions, - :questions_answers, - :questions_sections, - :questions_statuses]) - - def setup - RedmineQuestions::TestCase.prepare - @project = Project.find(1) - User.current = nil - end - - def test_new - @request.session[:user_id] = 1 - compatible_request :get, :new - assert_response :success - - assert_select 'input#questions_status_name' - assert_select 'input[type=?]', 'submit' - end - - def test_create - @request.session[:user_id] = 1 - assert_difference 'QuestionsStatus.count' do - compatible_request :post, :create, questions_status: { name: 'Test status', color: 'green', is_closed: '0' } - end - assert_equal 'Test status', QuestionsStatus.last.name - end - - def test_delete - @request.session[:user_id] = 1 - - status = QuestionsStatus.find(1) - assert_difference 'QuestionsStatus.count', -1 do - compatible_request :delete, :destroy, id: status - end - assert_nil QuestionsStatus.where(id: status.id).first - end - - def test_update - @request.session[:user_id] = 1 - - status = QuestionsStatus.find(1) - compatible_request :put, :update, id: status, questions_status: { name: 'New name', color: 'green', is_closed: '0' } - status.reload - assert_equal status.name, 'New name' - end -end diff --git a/plugins/redmine_questions/test/integration/common_views_test.rb b/plugins/redmine_questions/test/integration/common_views_test.rb index 0d89b47..4c32eef 100644 --- a/plugins/redmine_questions/test/integration/common_views_test.rb +++ b/plugins/redmine_questions/test/integration/common_views_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/test/test_helper.rb b/plugins/redmine_questions/test/test_helper.rb index 4080085..e082a08 100644 --- a/plugins/redmine_questions/test/test_helper.rb +++ b/plugins/redmine_questions/test/test_helper.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify @@ -74,7 +74,7 @@ class RedmineQuestions::TestCase end def self.prepare - Role.where(:id => 1).each do |r| + Role.where(:id => [1, 3]).each do |r| # user_2 r.permissions << :view_questions r.permissions << :global_view_questions @@ -103,6 +103,11 @@ class RedmineQuestions::TestCase r.save end + Role.where(:id => 1).each do |r| + r.permissions << :accept_answers + r.save + end + Project.where(:id => [1, 2, 3, 4, 5]).each do |project| EnabledModule.create(:project => project, :name => 'questions') end diff --git a/plugins/redmine_questions/test/unit/question_test.rb b/plugins/redmine_questions/test/unit/question_test.rb index 0d1355a..c0ea0ef 100644 --- a/plugins/redmine_questions/test/unit/question_test.rb +++ b/plugins/redmine_questions/test/unit/question_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/test/unit/questions_section_test.rb b/plugins/redmine_questions/test/unit/questions_section_test.rb index 2331c75..fed2eb9 100644 --- a/plugins/redmine_questions/test/unit/questions_section_test.rb +++ b/plugins/redmine_questions/test/unit/questions_section_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_questions/test/unit/user_test.rb b/plugins/redmine_questions/test/unit/user_test.rb index 9f1dfd3..e93fc74 100644 --- a/plugins/redmine_questions/test/unit/user_test.rb +++ b/plugins/redmine_questions/test/unit/user_test.rb @@ -3,7 +3,7 @@ # This file is a part of Redmine Q&A (redmine_questions) plugin, # Q&A plugin for Redmine # -# Copyright (C) 2011-2020 RedmineUP +# Copyright (C) 2011-2018 RedmineUP # http://www.redmineup.com/ # # redmine_questions is free software: you can redistribute it and/or modify diff --git a/plugins/redmine_wiki_lists/lib/redmine_wiki_lists/ref_issues.rb b/plugins/redmine_wiki_lists/lib/redmine_wiki_lists/ref_issues.rb index a31f2fe..e8853d4 100755 --- a/plugins/redmine_wiki_lists/lib/redmine_wiki_lists/ref_issues.rb +++ b/plugins/redmine_wiki_lists/lib/redmine_wiki_lists/ref_issues.rb @@ -202,10 +202,11 @@ TEXT disp = render(partial: 'issues/list.html', locals: {issues: @issues, query: @query}) else if method(:context_menu).parameters.size > 0 - disp = context_menu(issues_context_menu_path) + render(partial: 'issues/embedded_list', locals: {issues: @issues, query: @query}) # < redmine 3.3.x + disp = context_menu(issues_context_menu_path) # < redmine 3.3.x else - disp = context_menu.to_s + render(partial: 'issues/embedded_list', locals: {issues: @issues, query: @query}) # >= redmine 3.4.0 + disp = context_menu.to_s # >= redmine 3.4.0 end + disp << render(partial: 'issues/embedded_list', locals: {issues: @issues, query: @query}) end end diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..a1d7e97 --- /dev/null +++ b/public/404.html @@ -0,0 +1,17 @@ + + + + + Redmine 404 error + + + +

    Page not found

    +

    The page you were trying to access doesn't exist or has been removed.

    +

    Back

    + + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000..254e20d --- /dev/null +++ b/public/500.html @@ -0,0 +1,19 @@ + + + + + Redmine 500 error + + + +

    Internal error

    +

    An error occurred on the page you were trying to access.
    + If you continue to experience problems please contact your Redmine administrator for assistance.

    +

    If you are the Redmine administrator, check your log files for details about the error.

    +

    Back

    + + diff --git a/public/dispatch.fcgi.example b/public/dispatch.fcgi.example new file mode 100755 index 0000000..85184c4 --- /dev/null +++ b/public/dispatch.fcgi.example @@ -0,0 +1,20 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../config/boot' +require File.dirname(__FILE__) + '/../config/environment' + +class Rack::PathInfoRewriter + def initialize(app) + @app = app + end + + def call(env) + env.delete('SCRIPT_NAME') + parts = env['REQUEST_URI'].split('?') + env['PATH_INFO'] = parts[0] + env['QUERY_STRING'] = parts[1].to_s + @app.call(env) + end +end + +Rack::Handler::FastCGI.run Rack::PathInfoRewriter.new(RedmineApp::Application) diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..9d48fcf Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/help/ar/wiki_syntax_detailed_markdown.html b/public/help/ar/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/ar/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ar/wiki_syntax_detailed_textile.html b/public/help/ar/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/ar/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ar/wiki_syntax_markdown.html b/public/help/ar/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/ar/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/ar/wiki_syntax_textile.html b/public/help/ar/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/ar/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/az/wiki_syntax_detailed_markdown.html b/public/help/az/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/az/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/az/wiki_syntax_detailed_textile.html b/public/help/az/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/az/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/az/wiki_syntax_markdown.html b/public/help/az/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/az/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/az/wiki_syntax_textile.html b/public/help/az/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/az/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/bg/wiki_syntax_detailed_markdown.html b/public/help/bg/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/bg/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/bg/wiki_syntax_detailed_textile.html b/public/help/bg/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/bg/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/bg/wiki_syntax_markdown.html b/public/help/bg/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/bg/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/bg/wiki_syntax_textile.html b/public/help/bg/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/bg/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/bs/wiki_syntax_detailed_markdown.html b/public/help/bs/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/bs/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/bs/wiki_syntax_detailed_textile.html b/public/help/bs/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/bs/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/bs/wiki_syntax_markdown.html b/public/help/bs/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/bs/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/bs/wiki_syntax_textile.html b/public/help/bs/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/bs/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/ca/wiki_syntax_detailed_markdown.html b/public/help/ca/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/ca/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ca/wiki_syntax_detailed_textile.html b/public/help/ca/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/ca/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ca/wiki_syntax_markdown.html b/public/help/ca/wiki_syntax_markdown.html new file mode 100644 index 0000000..3cad889 --- /dev/null +++ b/public/help/ca/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Format de la Wiki + + + + +

    Guia rapida de la Sintaxis de la Wiki (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Negreta**Negreta**Negreta
    Cursiva*Cursiva*Cursiva
    Eliminat~~Eliminat~~Eliminat
    Codi en línia`Codi en línia`Codi en línia
    Linies de codi~~~
     linies
     de codi
    ~~~
    +
    + linies
    + de codi
    +
    +
    Llistes
    Llista desordenada* Article 1
      * Sub
    * Article 2
    • Article 1
      • Sub
    • Article 2
    Llista Ordenada1. Article 1
       1. Sub
    2. Article 2
    1. Article 1
      1. Sub
    2. Article 2
    Capçaleres
    Encapçament 1# Títol 1

    Títol 1

    Encapçament 2## Títol 2

    Títol 2

    Encapçament 3### Títol 3

    Títol 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link a la pagina Wiki[[Pagina Wiki]]Pagina Wiki
    Assumpte #12Assumpte #12
    Revisió r43Revisió r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Imatges
    Imatge![](imatge_url)
    ![](imatge_adjunta)
    Taules
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    Més informació

    + + + diff --git a/public/help/ca/wiki_syntax_textile.html b/public/help/ca/wiki_syntax_textile.html new file mode 100644 index 0000000..b76739a --- /dev/null +++ b/public/help/ca/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Format de la Wiki + + + + +

    Guia rapida de la Sintaxis de la Wiki

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Estil de font
    Negreta*Negreta*Negreta
    Cursiva_Cursiva_Cursiva
    Subratllat+Subratllat+Subratllat
    Eliminat-Eliminat-Eliminat
    ??Cita??Cita
    Codi en línia@Codi en línia@Codi en línia
    Linies de codi<pre>
     linies
     de codi
    </pre>
    +
    + linies
    + de codi
    +
    +
    Llistes
    Llista desordenada* Article 1
    ** Sub
    * Article 2
    • Article 1
      • Sub
    • Article 2
    Llista ordenada# Article 1
    ## Sub
    # Article 2
    1. Article 1
      1. Sub
    2. Article 2
    Capçaleres
    Encapçament 1h1. Títol 1

    Títol 1

    Encapçament 2h2. Títol 2

    Títol 2

    Encapçament 3h3. Títol 3

    Títol 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Links del Redmine
    Link a la pagina Wiki[[Pagina Wiki]]Pagina Wiki
    Assumpte #12Assumpte #12
    Revisió r43Revisió r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Imatges
    Imatge!imatge_url!
    !imatge_adjunta!
    Taules
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Més informació

    + + + diff --git a/public/help/cs/wiki_syntax_detailed_markdown.html b/public/help/cs/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..ea55456 --- /dev/null +++ b/public/help/cs/wiki_syntax_detailed_markdown.html @@ -0,0 +1,307 @@ + + + +Formátování Wiki v Redminu + + + + + +

    Formátování Wiki (Markdown)

    + +

    Odkazy

    + +

    Odkazy Redmine

    + +

    Redmine umožňuje hypertextové odkazy mezi jednotlivými zdroji (úkoly, revize, wiki stránky...) kdekoli, kde je použito Wiki formátování.

    +
      +
    • Odkaz na úkol: #124 (zobrazí #124, odkaz je přeškrtnutý, jestliže je úkol uzavřen)
    • +
    • Odkaz na poznámku k úkolu: #124-6 nebo #124#note-6
    • +
    + +

    Odkazy Wiki:

    + +
      +
    • [[Příručka]] zobrazí odkaz na stránku nazvanou "Příručka": Příručka.
    • +
    • [[Příručka#čtěte-více]] Vás přenese ke kotvě "čtěte-více". Nadpisy mají automaticky přiřazené kotvy, na které se můžete odkazovat: Příručka.
    • +
    • [[Příručka|Uživatelský manuál]] zobrazí odkaz na tu samou stránku, ale s jiným textem: Uživatelský manuál.
    • +
    + +

    Můžete se také odkazovat na Wiki stránky jiného projektu:

    + +
      +
    • [[projekt_test:Nějaká stránka]] zobrazí odkaz na stránku s názvem "Nějaká stránka" na Wiki projektu projekt_test.
    • +
    • [[projekt_test:]] zobrazí odkaz na hlavní Wiki stránku projektu projekt_test.
    • +
    + +

    Odkazy na Wiki stránky jsou zobrazeny červeně v případě, že odkazovaná stránka dosud neexistuje, např.: Neexistující stránka.

    + +

    Odkazy na další zdroje:

    + +
      +
    • Dokumenty: +
        +
      • document#17 (odkaz na dokument s ID 17)
      • +
      • document:Úvod (odkaz na dokument s názvem "Úvod")
      • +
      • document:"Nějaký dokument" (Uvozovky se mohou použít v případě, že název obsahuje mezery.)
      • +
      • projekt_test:document:"Nějaký dokument" (odkaz na dokument s názvem "Nějaký dokument" v jiném projektu "projekt_test")
      • +
      +
    • +
    + +
      +
    • Verze: +
        +
      • version#3 (odkaz na verzi s ID 3)
      • +
      • version:1.0.0 odkaz na verzi s názvem "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • projekt_test:version:1.0.0 (odkaz na verzi "1.0.0" jiného projektu "projekt_test")
      • +
      +
    • +
    + +
      +
    • Přílohy: +
        +
      • attachment:soubor.zip (odkaz na přílohu aktuálního objektu s názvem soubor.zip)
      • +
      • Aktuálně mohou být odkazovány pouze přílohy aktuálního objektu (u úkolu mohou být odkazy pouze na přílohy danného úkolu).
      • +
      +
    • +
    + +
      +
    • Revize: +
        +
      • r758 (odkaz na revizi)
      • +
      • commit:c6f4d0fd (odkaz na revizi s nečíselným označním revize)
      • +
      • svn1|r758 (odkaz na revizi určitého repozitáře, pro projekty s více repozitáři)
      • +
      • commit:hg|c6f4d0fd (odkaz na revizi s nečíselným označním revize určitého repozitáře, pro projekty s více repozitáři)
      • +
      • projekt_test:r758 (odkaz na revizi jiného projektu)
      • +
      • projekt_test:commit:c6f4d0fd (odkaz na revizi s nečíselným označním revize jiného projektu)
      • +
      +
    • +
    + +
      +
    • Soubory repositáře: +
        +
      • source:some/file (odkaz na soubor umístěný v /some/file respozitáře projektu)
      • +
      • source:some/file@52 (odkaz na revizi souboru č. 52)
      • +
      • source:some/file#L120 (odkaz na 120. řádek souboru)
      • +
      • source:some/file@52#L120 (odkaz na 120. řádek revize souboru č. 52)
      • +
      • source:"some file@52#L120" (použijte uvozovky, když URL obsahuje mezery)
      • +
      • export:some/file (vynutit stažení souboru)
      • +
      • source:svn1|some/file (odkaz na soubor určitého repozitáře, pro projekty s více repositáři)
      • +
      • projekt_test:source:some/file (odkaz na soubor umístěný v /some/file repositáře projektu "projekt_test")
      • +
      • projekt_test:export:some/file (vynutit stažení souboru umístěného v /some/file repositáře projektu "projekt_test")
      • +
      +
    • +
    + +
      +
    • Diskuzní fóra: +
        +
      • forum#1 (odkaz na fórum s id 1
      • +
      • forum:Support (odkaz na fórum pojmenované Support)
      • +
      • forum:"Technical Support" (Použij dvojté uvozovkym jestliže název fóra obsahuje mezery.)
      • +
      +
    • +
    + +
      +
    • Příspěvky diskuzního fóra: +
        +
      • message#1218 (odkaz na příspěvek s ID 1218)
      • +
      +
    • +
    + +
      +
    • Projekty: +
        +
      • project#3 (odkaz na projekt s ID 3)
      • +
      • project:projekt_test (odkaz na projekt pojmenovaný "projekt_test")
      • +
      • project:"projekt test" (odkaz na projekt pojmenovaný "projekt test")
      • +
      +
    • +
    + +
      +
    • Novinky: +
        +
      • news#2 (odkaz na novinku id 2)
      • +
      • news:Greetings (odkaz na novinku "Greetings")
      • +
      • news:"First Release" (použij dvojté uvozovky, jestliže název novinky obsahuje mezery)
      • +
      +
    • +
    + +
      +
    • Uživatelé: +
        +
      • user#2 (odkaz na uživatele s id 2)
      • +
      • user:jsmith (odkaz na uživatele s loginem jsmith)
      • +
      • @jsmith (odkaz na uživatele s loginem jsmith)
      • +
      +
    • +
    + +

    Escape sekvence:

    + +
      +
    • Zabránit parsování Redmine odkazů lze vložením vykřičníku před odkaz: !
    • +
    + +

    Externí odkazy

    + +

    URL (začínající: www, http, https, ftp, ftps, sftp a sftps) a e-mailové adresy jsou automaticky převedeny na klikací odkazy:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    zobrazí: http://www.redmine.org,

    + +

    Jestliže chcete zobrazit určitý text místo URL, můžete použít standardní syntaxi Textile:

    + +
    +"Webová stránka Redmine":http://www.redmine.org
    +
    + +

    zobrazí: Webová stránka Redmine

    + + +

    Formátování textu

    + + +

    Pro nadpisy, tučný text, tabulky a seznamy, Redmine podporuje syntaxi Markdown. Podívejte se na http://daringfireball.net/projects/markdown/syntax pro informace o využití těchto vlastností. Několik příkladů je uvedeno níže, ale Markdown toho dokáže mnohem víc.

    + +

    Styly písma

    + +
    +* **tučný**
    +* *kurzíva*
    +* ***tučná kurzíva***
    +* ~~přeškrtnutý~~
    +
    + +

    Zobrazí:

    + +
      +
    • tučný
    • +
    • kurzíva
    • +
    • tučná kurzíva
    • +
    • přeškrtnutý
    • +
    + +

    Vložené obrázky

    + +
      +
    • ![](image_url) zobrazí obrázek z odkazu (syntaxe Markdown)
    • +
    • Jestliže máte obrázek přiložený k Wiki stránce, může být zobrazen jako vložený obrázek pomocí jeho jména: ![](attached_image)
    • +
    + +

    Nadpisy

    + +
    +# Nadpis 1. úrovně
    +## Nadpis 2. úrovně
    +### Nadpis 3. úrovně
    +
    + +

    Redmine přiřadí kotvu ke každému nadpisu, takže se na ně lze odkazovat pomocí "#Nadpis", "#Podnadpis" atd.

    + + +

    Odstavce

    + +

    Začněte odstavec s >

    + +
    +> Rails je framework pro vývoj webových aplikací podle modelu Model-View-Control.
    +Vše, co je potřeba, je databázový a webový server.
    +
    + +

    Zobrazí:

    + +
    +

    Rails je framework pro vývoj webových aplikací podle modelu Model-View-Control.
    Vše, co je potřeba, je databázový a webový server.

    +
    + + +

    Obsah

    + +
    +{{toc}} => obsah zarovnaný doleva
    +{{>toc}} => obsah zarovnaný doprava
    +
    + +

    Vodorovná čára

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine obsahuje následující vestavěná makra:

    + +

    +

    +
    hello_world
    +

    Jednoduché makro.

    + +
    macro_list
    +

    Zobrazí seznam všech dostupných maker, včetně jejich popisu, existuje-li.

    + +
    child_pages
    +

    Zobrazí seznam dětských stránek. Bez parametrů zobrazí dětské stránky aktuální wiki stránky. Např.:

    +
    {{child_pages}} -- lze použít pouze z wiki stránky
    +{{child_pages(depth=2)}} -- zobrazí dětské stránky pouze do 2. úrovně
    + +
    include
    +

    Vloží Wiki stránku. Např.:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Vloží sbalený blok textu. Např.:

    +
    {{collapse(Zobrazit detaily...)
    +Toto je blok textu, který je sbalený.
    +Pro rozbalení klikněte na odkaz.
    +}}
    + +
    thumbnail
    +

    Zobrazí klikací náhled obrázku. Např.:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Zvýrazňování kódu

    + +

    Výchozí zvýrazňování kódu zavisí na CodeRay, což je rychlá zvýrazňovací knihovna napsaná v Ruby. Aktuálně podporuje: c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml a yaml (yml) jazyky, jejichž jména jsou v závorkách jsou aliasy.

    + +

    Kód můžete na stránce zvýraznit pomocí následující syntaxe (záleží na velikosti písma jazyku nebo aliasu):

    + +
    +~~~ ruby
    +  Váš kód vložte zde.
    +~~~
    +
    + +

    Např:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/cs/wiki_syntax_detailed_textile.html b/public/help/cs/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..1cca1f4 --- /dev/null +++ b/public/help/cs/wiki_syntax_detailed_textile.html @@ -0,0 +1,322 @@ + + + +Formátování Wiki v Redminu + + + + + +

    Formátování Wiki

    + +

    Odkazy

    + +

    Odkazy Redmine

    + +

    Redmine umožňuje hypertextové odkazy mezi jednotlivými zdroji (úkoly, revize, wiki stránky...) kdekoli, kde je použito Wiki formátování.

    +
      +
    • Odkaz na úkol: #124 (zobrazí #124, odkaz je přeškrtnutý, jestliže je úkol uzavřen)
    • +
    • Odkaz na poznámku k úkolu: #124-6, nebo #124#note-6
    • +
    + +

    Odkazy Wiki:

    + +
      +
    • [[Příručka]] zobrazí odkaz na stránku nazvanou "Příručka": Příručka.
    • +
    • [[Příručka#čtěte-více]] Vás přenese ke kotvě "čtěte-více". Nadpisy mají automaticky přiřazené kotvy, na které se můžete odkazovat: Příručka.
    • +
    • [[Příručka|Uživatelský manuál]] zobrazí odkaz na tu samou stránku, ale s jiným textem: Uživatelský manuál.
    • +
    + +

    Můžete se také odkazovat na Wiki stránky jiného projektu:

    + +
      +
    • [[projekt_test:Nějaká stránka]] zobrazí odkaz na stránku s názvem "Nějaká stránka" na Wiki projektu projekt_test.
    • +
    • [[projekt_test:]] zobrazí odkaz na hlavní Wiki stránku projektu projekt_test.
    • +
    + +

    Odkazy na Wiki stránky jsou zobrazeny červeně v případě, že odkazovaná stránka dosud neexistuje, např.: Neexistující stránka.

    + +

    Odkazy na další zdroje:

    + +
      +
    • Dokumenty: +
        +
      • document#17 (odkaz na dokument s ID 17)
      • +
      • document:Úvod (odkaz na dokument s názvem "Úvod")
      • +
      • document:"Nějaký dokument" (Uvozovky se mohou použít v případě, že název obsahuje mezery.)
      • +
      • projekt_test:document:"Nějaký dokument" (odkaz na dokument s názvem "Nějaký dokument" v jiném projektu "projekt_test")
      • +
      +
    • +
    + +
      +
    • Verze: +
        +
      • version#3 (odkaz na verzi s ID 3)
      • +
      • version:1.0.0 odkaz na verzi s názvem "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • projekt_test:version:1.0.0 (odkaz na verzi "1.0.0" jiného projektu "projekt_test")
      • +
      +
    • +
    + +
      +
    • Přílohy: +
        +
      • attachment:soubor.zip (odkaz na přílohu aktuálního objektu s názvem soubor.zip)
      • +
      • Aktuálně mohou být odkazovány pouze přílohy aktuálního objektu (u úkolu mohou být odkazy pouze na přílohy danného úkolu).
      • +
      +
    • +
    + +
      +
    • Revize: +
        +
      • r758 (odkaz na revizi)
      • +
      • commit:c6f4d0fd (odkaz na revizi s nečíselným označním revize)
      • +
      • svn1|r758 (odkaz na revizi určitého repozitáře, pro projekty s více repozitáři)
      • +
      • commit:hg|c6f4d0fd (odkaz na revizi s nečíselným označním revize určitého repozitáře, pro projekty s více repozitáři)
      • +
      • projekt_test:r758 (odkaz na revizi jiného projektu)
      • +
      • projekt_test:commit:c6f4d0fd (odkaz na revizi s nečíselným označním revize jiného projektu)
      • +
      +
    • +
    + +
      +
    • Soubory repositáře: +
        +
      • source:some/file (odkaz na soubor umístěný v /some/file respozitáře projektu)
      • +
      • source:some/file@52 (odkaz na revizi souboru č. 52)
      • +
      • source:some/file#L120 (odkaz na 120. řádek souboru)
      • +
      • source:some/file@52#L120 (odkaz na 120. řádek revize souboru č. 52)
      • +
      • source:"some file@52#L120" (použijte uvozovky, když URL obsahuje mezery)
      • +
      • export:some/file (vynutit stažení souboru)
      • +
      • source:svn1|some/file (odkaz na soubor určitého repozitáře, pro projekty s více repositáři)
      • +
      • projekt_test:source:some/file (odkaz na soubor umístěný v /some/file repositáře projektu "projekt_test")
      • +
      • projekt_test:export:some/file (vynutit stažení souboru umístěného v /some/file repositáře projektu "projekt_test")
      • +
      +
    • +
    + +
      +
    • Diskuzní fóra: +
        +
      • forum#1 (odkaz na fórum s id 1
      • +
      • forum:Support (odkaz na fórum pojmenované Support)
      • +
      • forum:"Technical Support" (Použij dvojté uvozovkym jestliže název fóra obsahuje mezery.)
      • +
      +
    • +
    + +
      +
    • Příspěvky diskuzního fóra: +
        +
      • message#1218 (odkaz na příspěvek s ID 1218)
      • +
      +
    • +
    + +
      +
    • Projekty: +
        +
      • project#3 (odkaz na projekt s ID 3)
      • +
      • project:projekt_test (odkaz na projekt pojmenovaný "projekt_test")
      • +
      • project:"projekt test" (odkaz na projekt pojmenovaný "projekt test")
      • +
      +
    • +
    + +
      +
    • Novinky: +
        +
      • news#2 (odkaz na novinku id 2)
      • +
      • news:Greetings (odkaz na novinku "Greetings")
      • +
      • news:"First Release" (použij dvojté uvozovky, jestliže název novinky obsahuje mezery)
      • +
      +
    • +
    + +
      +
    • Uživatelé: +
        +
      • user#2 (odkaz na uživatele s id 2)
      • +
      • user:jsmith (odkaz na uživatele s loginem jsmith)
      • +
      • @jsmith (odkaz na uživatele s loginem jsmith)
      • +
      +
    • +
    + +

    Escape sekvence:

    + +
      +
    • Zabránit parsování Redmine odkazů, lze vložením vykřičníku před odkaz: !
    • +
    + + +

    Externí odkazy

    + +

    URL (začínající: www, http, https, ftp, ftps, sftp a sftps) a e-mailové adresy jsou automaticky převedeny na klikací odkazy:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    zobrazí: http://www.redmine.org,

    + +

    Jestliže chcete zobrazit určitý text místo URL, můžete použít standardní syntaxi textile:

    + +
    +"Webová stránka Redmine":http://www.redmine.org
    +
    + +

    zobrazí: Webová stránka Redmine

    + + +

    Formátování textu

    + + +

    Pro nadpisy, tučný text, tabulky a seznamy, Redmine podporuje syntaxi Textile. Podívejte se na http://en.wikipedia.org/wiki/Textile_(markup_language) pro informace o využití těchto vlastností. Několik příkladů je uvedeno níže, ale Textile toho dokáže mnohem víc.

    + +

    Styly písma

    + +
    +* *tučný*
    +* _kurzíva_
    +* _*tučná kurzíva*_
    +* +podtržený+
    +* -přeškrtnutý-
    +
    + +

    Zobrazí:

    + +
      +
    • tučný
    • +
    • kurzíva
    • +
    • tučná kurzíva
    • +
    • podtržený
    • +
    • přeškrtnutý
    • +
    + +

    Vložené obrázky

    + +
      +
    • !image_url! zobrazí obrázek z odkazu (syntaxe textile)
    • +
    • !>image_url! obrázek zarovnaný napravo
    • +
    • Jestliže máte obrázek přiložený k Wiki stránce, může být zobrazen jako vložený obrázek pomocí jeho jména: !prilozeny_obrazek.png!
    • +
    + +

    Nadpisy

    + +
    +h1. Nadpis 1. úrovně
    +
    +h2. Nadpis 2. úrovně
    +
    +h3. Nadpis 3. úrovně
    +
    + +

    Redmine přiřadí kotvu ke každému nadpisu, takže se na ně lze odkazovat pomocí "#Nadpis", "#Podnadpis" atd.

    + + +

    Odstavce

    + +
    +p>. zarovnaný doprava
    +p=. zarovnaný na střed
    +
    + +

    Toto je odstavec zarovnaný na střed.

    + +

    Citace

    + +

    Začněte odstavec s bq.

    + +
    +bq. Rails je framework pro vývoj webových aplikací podle modelu Model-View-Control.
    +Vše, co je potřeba, je databázový a webový server.
    +
    + +

    Zobrazí:

    + +
    +

    Rails je framework pro vývoj webových aplikací podle modelu Model-View-Control.
    Vše, co je potřeba, je databázový a webový server.

    +
    + + +

    Obsah

    + +
    +{{toc}} => obsah zarovnaný doleva
    +{{>toc}} => obsah zarovnaný doprava
    +
    + +

    Vodorovná čára

    + +
    +---
    +
    + +

    Makra

    + +

    Redmine obsahuje následující vestavěná makra:

    + +

    +

    +
    hello_world
    +

    Jednoduché makro.

    + +
    macro_list
    +

    Zobrazí seznam všech dostupných maker, včetně jejich popisu, existuje-li.

    + +
    child_pages
    +

    Zobrazí seznam dětských stránek. Bez parametrů zobrazí dětské stránky aktuální wiki stránky. Např.:

    +
    {{child_pages}} -- lze použít pouze z wiki stránky
    +{{child_pages(depth=2)}} -- zobrazí dětské stránky pouze do 2. úrovně
    + +
    include
    +

    Vloží Wiki stránku. Např.:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Vloží sbalený blok textu. Např.:

    +
    {{collapse(Zobrazit detaily...)
    +Toto je blok textu, který je sbalený.
    +Pro rozbalení klikněte na odkaz.
    +}}
    + +
    thumbnail
    +

    Zobrazí klikací náhled obrázku. Např.:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Zvýrazňování kódu

    + +

    Výchozí zvýrazňování kódu zavisí na CodeRay, což je rychlá zvýrazňovací knihovna napsaná v Ruby. Aktuálně podporuje: c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml a yaml (yml) jazyky, jejichž jména jsou v závorkách jsou aliasy.

    + +

    Kód můžete na stránce zvýraznit pomocí následující syntaxe (záleží na velikosti písma jazyku nebo aliasu):

    + +
    +<pre><code class="ruby">
    +  Váš kód vložte zde.
    +</code></pre>
    +
    + +

    Např.:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/cs/wiki_syntax_markdown.html b/public/help/cs/wiki_syntax_markdown.html new file mode 100644 index 0000000..57131af --- /dev/null +++ b/public/help/cs/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formátování + + + + +

    Syntaxe Wiki - rychlý náhled

    (Markdown) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Styly písma
    Strong**Tučně**Tučně
    Italic*Kurzívou*Kurzívou
    Deleted~~Smazaný~~Smazaný
    Inline Code`Vnořený kód`Vnořený kód
    Preformatted text~~~
     řádky
     kódu
    ~~~
    +
    + řádky
    + kódu
    +
    +
    Seznamy
    Unordered list* Položka 1
      * Pod
    * Položka 2
    • Položka 1
      • Pod
    • Položka 2
    Ordered list1. Položka 1
       1. Pod
    2. Položka 2
    1. Položka 1
      1. Pod
    2. Položka 2
    Nadpisy
    Heading 1# Nadpis 1

    Nadpis 1

    Heading 2## Nadpis 2

    Nadpis 2

    Heading 3### Nadpis 3

    Nadpis 3

    Odkazy
    http://foo.barhttp://foo.bar
    [Odkaz](http://foo.bar)Foo
    Redmine odkazy
    Link to a Wiki page[[Wiki stránka]]Wiki stránka
    Úkol #12Úkol #12
    Revize r43Revize r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Vnořené obrázky
    Image![](url_obrázku)
    ![](vnořený_obrázek)
    Tabulky
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    Více informací

    + + + diff --git a/public/help/cs/wiki_syntax_textile.html b/public/help/cs/wiki_syntax_textile.html new file mode 100644 index 0000000..12cf640 --- /dev/null +++ b/public/help/cs/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formátování + + + + +

    Syntaxe Wiki - rychlý náhled

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Styly písma
    Tučný*Tučně*Tučně
    Kurzívou_Kurzívou_Kurzívou
    Podtržený+Podtržený+Podtržený
    Smazaný-Smazaný-Smazaný
    ??Citace??Citace
    Vnořený kód@Vnořený kód@Vnořený kód
    Předformátovaný text<pre>
     řádky
     kódu
    </pre>
    +
    + řádky
    + kódu
    +
    +
    Seznamy
    Nesetříděný seznam* Položka 1
    ** Pod
    * Položka 2
    • Položka 1
      • Pod
    • Položka 2
    Setříděný seznam# Položka 1
    ## Pod
    # Položka 2
    1. Položka 1
      1. Pod
    2. Položka 2
    Nadpisy
    Nadpis 1h1. Nadpis 1

    Nadpis 1

    Nadpis 2h2. Nadpis 2

    Nadpis 2

    Nadpis 3h3. Nadpis 3

    Nadpis 3

    Odkazy
    http://foo.barhttp://foo.bar
    "Odkaz":http://foo.barOdkaz
    Redmine odkazy
    Odkaz na Wiki stránku[[Wiki stránka]]Wiki stránka
    Úkol #12Úkol #12
    Revize r43Revize r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Vnořené obrázky
    Obrázek!url_obrázku!
    !vnořený_obrázek!
    Tabulky
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Více informací

    + + + diff --git a/public/help/da/wiki_syntax_detailed_markdown.html b/public/help/da/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/da/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/da/wiki_syntax_detailed_textile.html b/public/help/da/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/da/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/da/wiki_syntax_markdown.html b/public/help/da/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/da/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/da/wiki_syntax_textile.html b/public/help/da/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/da/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/de/wiki_syntax_detailed_markdown.html b/public/help/de/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/de/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/de/wiki_syntax_detailed_textile.html b/public/help/de/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/de/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/de/wiki_syntax_markdown.html b/public/help/de/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/de/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/de/wiki_syntax_textile.html b/public/help/de/wiki_syntax_textile.html new file mode 100644 index 0000000..a3a3365 --- /dev/null +++ b/public/help/de/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wikiformatierung + + + + +

    Wiki Syntax Schnellreferenz

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Schriftarten
    Fett*Fett*Fett
    Kursiv_Kursiv_Kursiv
    Unterstrichen+Unterstrichen+Unterstrichen
    Durchgestrichen-Durchgestrichen-Durchgestrichen
    ??Zitat??Zitat
    Inline-Code@Inline-Code@Inline-Code
    Vorformatierter Text<pre>
     vorformatierte
     Codezeilen
    </pre>
    +
    + vorformartierte
    + Codezeilen
    +
    +
    Listen
    Unsortierte Liste* Element 1
    ** Sub
    * Element 2
    • Element 1
      • Sub
    • Element 2
    Sortierte Liste# Element 1
    ## Sub
    # Element 2
    1. Element 1
      1. Sub
    2. Element 2
    Überschriften
    Überschrift 1h1. Überschrift 1

    Überschrift 1

    Überschrift 2h2. Überschrift 2

    Überschrift 2

    Überschrift 3h3. Überschrift 3

    Überschrift 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine Links
    Link zu einer Wiki Seite[[Wiki Seite]]Wiki Seite
    Ticket #12Ticket #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    eingebettete Bilder
    Bild!URL_zu_dem_Bild!
    !angehängtes_Bild!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    weitere Informationen

    + + + diff --git a/public/help/el/wiki_syntax_detailed_markdown.html b/public/help/el/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/el/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/el/wiki_syntax_detailed_textile.html b/public/help/el/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/el/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/el/wiki_syntax_markdown.html b/public/help/el/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/el/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/el/wiki_syntax_textile.html b/public/help/el/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/el/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/en-gb/wiki_syntax_detailed_markdown.html b/public/help/en-gb/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/en-gb/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/en-gb/wiki_syntax_detailed_textile.html b/public/help/en-gb/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/en-gb/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/en-gb/wiki_syntax_markdown.html b/public/help/en-gb/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/en-gb/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/en-gb/wiki_syntax_textile.html b/public/help/en-gb/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/en-gb/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/en/wiki_syntax_detailed_markdown.html b/public/help/en/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/en/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/en/wiki_syntax_detailed_textile.html b/public/help/en/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/en/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/en/wiki_syntax_markdown.html b/public/help/en/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/en/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/en/wiki_syntax_textile.html b/public/help/en/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/en/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/es-pa/wiki_syntax_detailed_markdown.html b/public/help/es-pa/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/es-pa/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/es-pa/wiki_syntax_detailed_textile.html b/public/help/es-pa/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/es-pa/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/es-pa/wiki_syntax_markdown.html b/public/help/es-pa/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/es-pa/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/es-pa/wiki_syntax_textile.html b/public/help/es-pa/wiki_syntax_textile.html new file mode 100644 index 0000000..d859c8e --- /dev/null +++ b/public/help/es-pa/wiki_syntax_textile.html @@ -0,0 +1,73 @@ + + + + +Formato de la Wiki + + + + +

    Guia Rápida de Sintaxis de la Wiki

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Estilo de fuentes
    Negrita*Negrita*Negrita
    Cursiva_Cursiva_Cursiva
    Subrayado+Subrayado+Subrayado
    Tachado-Tachado-Tachado
    ??Cita??Cita
    Código en linea@Código en linea@Código en linea
    Có preformateado<pre>
     Líneas
     de có
    </pre>
    +
    + líneas
    + de código
    +
    +
    Listas
    Lista no ordenada* artículo 1
    ** Sub
    * artículo 2
    • artículo 1
      • Sub
    • artículo
    Lista ordenada# artículo 1
    ## Sub
    # artículo 2
    1. artículo 1
      1. Sub
    2. artículo 2
    Cabeceras
    Cabecera 1h1. Título 1

    Título 1

    Cabecera 2h2. Título 2

    Título 2

    Cabecera 3h3. Título 3

    Título 3

    Enlaces
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Enlaces de Redmine
    Enlace a una página de la Wiki[[pagina Wiki]]Pagina Wiki
    Enlace a una página de la Wiki con nombre descripciptivo[[pagina Wiki|Nombre descriptivo]]Nombre descriptivo
    Petición #12Petición #12
    Revisión r43Revisión r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Imágenes en línea
    Imagen!imagen_url!
    !imagen_adjunta!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Más información

    + + + diff --git a/public/help/es/wiki_syntax_detailed_markdown.html b/public/help/es/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/es/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/es/wiki_syntax_detailed_textile.html b/public/help/es/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/es/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/es/wiki_syntax_markdown.html b/public/help/es/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/es/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/es/wiki_syntax_textile.html b/public/help/es/wiki_syntax_textile.html new file mode 100644 index 0000000..d859c8e --- /dev/null +++ b/public/help/es/wiki_syntax_textile.html @@ -0,0 +1,73 @@ + + + + +Formato de la Wiki + + + + +

    Guia Rápida de Sintaxis de la Wiki

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Estilo de fuentes
    Negrita*Negrita*Negrita
    Cursiva_Cursiva_Cursiva
    Subrayado+Subrayado+Subrayado
    Tachado-Tachado-Tachado
    ??Cita??Cita
    Código en linea@Código en linea@Código en linea
    Có preformateado<pre>
     Líneas
     de có
    </pre>
    +
    + líneas
    + de código
    +
    +
    Listas
    Lista no ordenada* artículo 1
    ** Sub
    * artículo 2
    • artículo 1
      • Sub
    • artículo
    Lista ordenada# artículo 1
    ## Sub
    # artículo 2
    1. artículo 1
      1. Sub
    2. artículo 2
    Cabeceras
    Cabecera 1h1. Título 1

    Título 1

    Cabecera 2h2. Título 2

    Título 2

    Cabecera 3h3. Título 3

    Título 3

    Enlaces
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Enlaces de Redmine
    Enlace a una página de la Wiki[[pagina Wiki]]Pagina Wiki
    Enlace a una página de la Wiki con nombre descripciptivo[[pagina Wiki|Nombre descriptivo]]Nombre descriptivo
    Petición #12Petición #12
    Revisión r43Revisión r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Imágenes en línea
    Imagen!imagen_url!
    !imagen_adjunta!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Más información

    + + + diff --git a/public/help/et/wiki_syntax_detailed_markdown.html b/public/help/et/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/et/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/et/wiki_syntax_detailed_textile.html b/public/help/et/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/et/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/et/wiki_syntax_markdown.html b/public/help/et/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/et/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/et/wiki_syntax_textile.html b/public/help/et/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/et/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/eu/wiki_syntax_detailed_markdown.html b/public/help/eu/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/eu/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/eu/wiki_syntax_detailed_textile.html b/public/help/eu/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/eu/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/eu/wiki_syntax_markdown.html b/public/help/eu/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/eu/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/eu/wiki_syntax_textile.html b/public/help/eu/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/eu/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/fa/wiki_syntax_detailed_markdown.html b/public/help/fa/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/fa/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/fa/wiki_syntax_detailed_textile.html b/public/help/fa/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/fa/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/fa/wiki_syntax_markdown.html b/public/help/fa/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/fa/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/fa/wiki_syntax_textile.html b/public/help/fa/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/fa/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/fi/wiki_syntax_detailed_markdown.html b/public/help/fi/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/fi/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/fi/wiki_syntax_detailed_textile.html b/public/help/fi/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/fi/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/fi/wiki_syntax_markdown.html b/public/help/fi/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/fi/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/fi/wiki_syntax_textile.html b/public/help/fi/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/fi/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/fr/wiki_syntax_detailed_markdown.html b/public/help/fr/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/fr/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/fr/wiki_syntax_detailed_textile.html b/public/help/fr/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..9bafe46 --- /dev/null +++ b/public/help/fr/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Mise en page Wiki

    + +

    Liens

    + +

    Liens Redmine

    + +

    Redmine autorise les hyperliens entre différentes ressources (Demandes, révisions, pages wiki...) n'importe où la mise en page Wiki est utilisée.

    +
      +
    • Lien vers une demande: #124 (affiche #124, le lien est barré si la demande est fermée)
    • +
    • Lien vers une note d'une demande: #124-6, ou #124#note-6
    • +
    + +

    Liens entre Wiki:

    + +
      +
    • [[Guide]] affiche un lien vers la page nommé 'Guide': Guide
    • +
    • [[Guide#balise-avancée]] vous emmène à la balise "balise-avancée". Les titres ont automatiquement une balise assignée afin de pouvoir s'y référer: Guide
    • +
    • [[Guide|Manuel Utilisateur]] affiche un lien vers la même page mais avec un texte différent: Manuel Utilisateur
    • +
    + +

    Vous pouvez aussi faire des liens vers des pages du Wiki d'un autre projet:

    + +
      +
    • [[sandbox:une page]] affiche un lien vers une page nommée 'Une page' du Wiki du projet Sandbox
    • +
    • [[sandbox:]] affiche un lien vers la page principal du Wiki du projet Sandbox
    • +
    + +

    Les liens Wiki sont affichés en rouge si la page n'existe pas encore, ie: Page inexistante.

    + +

    Liens vers d'autres ressources:

    + +
      +
    • Documents: +
        +
      • document#17 (lien vers le document dont l'id est 17)
      • +
      • document:Salutations (lien vers le document dont le titre est "Salutations")
      • +
      • document:"Un document" (Les guillements peuvent être utilisé quand le titre du document comporte des espaces)
      • +
      • sandbox:document:"Un document" (Lien vers le document dont le titre est "Un document" dans le projet différent "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (lien vers la version dont l'id est 3)
      • +
      • version:1.0.0 (lien vers la version nommée "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (lien vers la version nommée "1.0.0" dans le projet "sandbox")
      • +
    • +
    + +
      +
    • Pièces jointes: +
        +
      • attachment:file.zip (lien vers la pièce jointe de l'objet nommée file.zip)
      • +
      • Pour le moment, seules les pièces jointes de l'objet peuvent être référencées (si vous êtes sur une demande, il est possibe de faire référence aux pièces jointes de cette demande uniquement)
      • +
    • +
    + +
      +
    • Révisions: +
        +
      • r758 (lien vers une révision)
      • +
      • commit:c6f4d0fd (lien vers une révision sans référence numérique)
      • +
      • svn1|r758 (lien vers un dépôt spécifique, pour les projets ayant plusieurs dépôts)
      • +
      • commit:hg|c6f4d0fd (lien vers une révision sans référence numérique d'un dépôt spécifique)
      • +
      • sandbox:r758 (Lien vers une révision d'un projet différent)
      • +
      • sandbox:commit:c6f4d0fd (lien vers une révision sans référence numérique d'un autre projet)
      • +
    • +
    + +
      +
    • Fichier de dépôt: +
        +
      • source:un/fichier (Lien vers le fichier situé dans /un/fichier dans le dépôt du projet)
      • +
      • source:un/fichier@52 (Lien vers le fichier de la révison 52)
      • +
      • source:un/fichier#L120 (Lien vers la ligne 120 du fichier fichier)
      • +
      • source:un/fichier@52#L120 (Lien vers la ligne 120 du fichier de la révison 52)
      • +
      • source:"un fichier@52#L120" (Utilisez des guillemets quand l'url contient des espaces)
      • +
      • export:un/fichier (Force le téléchargement du fichier)
      • +
      • source:svn1|un/fichier (Lien vers le fichier dans un dépôt spécifique, pour les projets contenant plusieurs dépôts)
      • +
      • sandbox:source:un/fichier (Lien vers le fichier situé dans /un/fichier dans le dépôt du projet "sandbox")
      • +
      • sandbox:export:un/fichier (Force le téléchargement du fichier dans le dépôt du projet "sandbox")
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Messages du forum: +
        +
      • message#1218 (Lien vers le message dont l'id est 1218)
      • +
    • +
    + +
      +
    • Projet: +
        +
      • project#3 (Lien vers le projet dont l'id est 3)
      • +
      • project:unprojet (Lien vers le projet nommé "unprojet")
      • +
      • project:"un projet" (use double quotes if project name contains spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Eviter ces lien:

    + +
      +
    • Vous pouvez empêcher les liens Redmine de se faire en les précédant d'un point d'exclamaion : !
    • +
    + + +

    Liens externes

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    affiche: http://www.redmine.org,

    + +

    Si vous voulez afficher un texte spécifique à la place de l'URL, vous pouvez utilisez la syntaxe standard textile:

    + +
    +"Site Web Redmine":http://www.redmine.org
    +
    + +

    affiche: Site Web Redmine

    + + +

    Formatage du texte

    + + +

    Pour les éléments tel que, gras, tableau, listes, Redmine utilise la syntaxe Textile. Voir http://fr.wikipedia.org/wiki/Textile_(langage) pour les informations sur l'utilisation de ces fonctionnalités. Quelques exemples sont inclus ci-dessous, mais le moteur est capable de beaucoup plus.

    + +

    Police d'écriture

    + +
    +* *gras*
    +* _italique_
    +* _*gras _italique_*_
    +* +sous-ligné+
    +* -barré-
    +
    + +

    Affiche:

    + +
      +
    • gras
    • +
    • _italique_
    • +
    • gras italique
    • +
    • sous-ligné
    • +
    • barré
    • +
    + +

    Afficher une image

    + +
      +
    • !url_de_l_image! affiche une image situé à l'adresse displays an image located at url_de_l_image (syntaxe Textile)
    • +
    • !>url_de_l_image! Image affichée à droite
    • +
    • Si vous avez une image en pièce jointe de votre page Wiki, elle peut être affiché en utilisant simplement sont nom: !image_en_piece_jointe.png!
    • +
    + +

    Titre

    + +
    +h1. Titre
    +
    +h2. Sous-titre
    +
    +h3. Sous-sous-titre
    +
    + +

    Redmine assigne une balise à chacun de ses titres, vous pouvez donc les lier avec "#Titre", "#Sous-titre" et ainsi de suite.

    + + +

    Paragraphes

    + +
    +p>. aligné à droite
    +p=. centré
    +
    + +

    Ceci est un paragraphe centré.

    + + +

    Blockquotes

    + +

    Commencer le paragraphe par bq.

    + +
    +bq. Ruby on Rails, également appelé RoR ou Rails est un framework web libre écrit en Ruby. Il suit le motif de conception Modèle-Vue-Contrôleur aussi nommé MVC.
    +Pour commencer à l'utiliser, il ne vous faut qu'un serveur web et une base de données.
    +
    + +

    Affiche

    + +
    +

    Ruby on Rails, également appelé RoR ou Rails est un framework web libre écrit en Ruby. Il suit le motif de conception Modèle-Vue-Contrôleur aussi nommé MVC.
    Pour commencer à l'utiliser, il ne vous faut qu'un serveur web et une base de données.

    +
    + + +

    Table des matières

    + +
    +{{toc}} =>  table des matières centrées à gauche
    +{{>toc}} => table des matières centrées à droite
    +
    + +

    Règle horizontale

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine possède les macros suivantes:

    + +

    +

    +
    hello_world
    +

    Macro d'exemple.

    + +
    macro_list
    +

    Affiche une liste de toutes les macros disponibles, les descriptions sont incluses si celles-ci sont disponibles.

    + +
    child_pages
    +

    Affiche une liste des sous-pages. Sans argument, cela affiche les sous-pages de la page courante. Exemples :

    +
    {{child_pages}} -- peut être utilisé depuis une page wiki uniquement
    +{{child_pages(depth=2)}} -- affiche deux niveaux d'arborescence seulement
    + +
    include
    +

    Inclut une page Wiki. Exemple :

    +
    {{include(Foo)}}
    +

    ou pour inclure une page d'un wiki de projet spécifique :

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Insère un bloc de texte enroulé. Exemple :

    +
    {{collapse(Voir les détails...)
    +Ceci est un bloc de texte qui est caché par défaut.
    +Il peut être déroulé en cliquant sur le lien.
    +}}
    + +
    thumbnail
    +

    Affiche une miniature cliquable d'une image jointe. Exemples :

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Miniature)}}
    +
    +

    + +

    Coloration syntaxique

    + +

    La coloration syntaxique par défaut repose sur CodeRay, une librairie rapide de coloration syntaxique complètement codée en Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Placez votre code ici.
    +</code></pre>
    +
    + +

    Exemple:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/fr/wiki_syntax_markdown.html b/public/help/fr/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/fr/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/fr/wiki_syntax_textile.html b/public/help/fr/wiki_syntax_textile.html new file mode 100644 index 0000000..d74b91a --- /dev/null +++ b/public/help/fr/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Syntaxe rapide des Wikis

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Gras*Gras
    Italic_Italique_Italique
    Underline+Sous-ligné+Sous-ligné
    Deleted-Barré-Barré
    ??Citation??Citation
    Inline Code@Code en ligne@Code en ligne
    Preformatted text<pre>
     lignes
     de code
    </pre>
    +
    + lignes
    + de code
    +
    +
    Listes
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Titres
    Heading 1h1. Titre 1

    Titre 1

    Heading 2h2. Titre 2

    Titre 2

    Heading 3h3. Titre 3

    Titre 3

    Liens
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Liens Redmine
    Link to a Wiki page[[Wiki page]]Wiki page
    Demande #12Demande #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Images en ligne
    Image!url_de_l_image!
    !image_en_pièce_jointe!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Plus d'informations

    + + + diff --git a/public/help/gl/wiki_syntax_detailed_markdown.html b/public/help/gl/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/gl/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/gl/wiki_syntax_detailed_textile.html b/public/help/gl/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/gl/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/gl/wiki_syntax_markdown.html b/public/help/gl/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/gl/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/gl/wiki_syntax_textile.html b/public/help/gl/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/gl/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/he/wiki_syntax_detailed_markdown.html b/public/help/he/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/he/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/he/wiki_syntax_detailed_textile.html b/public/help/he/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/he/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/he/wiki_syntax_markdown.html b/public/help/he/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/he/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/he/wiki_syntax_textile.html b/public/help/he/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/he/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/hr/wiki_syntax_detailed_markdown.html b/public/help/hr/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/hr/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/hr/wiki_syntax_detailed_textile.html b/public/help/hr/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/hr/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/hr/wiki_syntax_markdown.html b/public/help/hr/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/hr/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/hr/wiki_syntax_textile.html b/public/help/hr/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/hr/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/hu/wiki_syntax_detailed_markdown.html b/public/help/hu/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/hu/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/hu/wiki_syntax_detailed_textile.html b/public/help/hu/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/hu/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/hu/wiki_syntax_markdown.html b/public/help/hu/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/hu/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/hu/wiki_syntax_textile.html b/public/help/hu/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/hu/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/id/wiki_syntax_detailed_markdown.html b/public/help/id/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/id/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/id/wiki_syntax_detailed_textile.html b/public/help/id/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/id/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/id/wiki_syntax_markdown.html b/public/help/id/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/id/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/id/wiki_syntax_textile.html b/public/help/id/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/id/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/it/wiki_syntax_detailed_markdown.html b/public/help/it/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/it/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/it/wiki_syntax_detailed_textile.html b/public/help/it/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/it/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/it/wiki_syntax_markdown.html b/public/help/it/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/it/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/it/wiki_syntax_textile.html b/public/help/it/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/it/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/ja/wiki_syntax_detailed_markdown.html b/public/help/ja/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..1078ab3 --- /dev/null +++ b/public/help/ja/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki記法 (Markdown)

    + +

    Links

    + +

    Redmine内のリンク

    + +

    RedmineはWiki記法が使える箇所のどこからでも、チケット・チェンジセット・Wikiページなどのリソースへのリンクができます。

    +
      +
    • チケットへのリンク: #124 (終了したチケットは #124 のように取り消し線付きで表示されます)
    • +
    • チケットの注記へのリンク: #124-6 または #124#note-6
    • +
    + +

    Wikiへのリンク:

    + +
      +
    • [[Guide]] "Guide"という名称のページへのリンク: Guide
    • +
    • [[Guide#further-reading]] "Guide"というページ内の"further-reading"というアンカーに飛びます。見出しには自動的にアンカーが設定されるのでこのようにリンク先とすることができます: Guide
    • +
    • [[Guide|User manual]] "Guide"というページへのリンクを異なるテキストで表示: User manual
    • +
    + +

    別のプロジェクトのwikiへのリンクも可能です:

    + +
      +
    • [[sandbox:some page]] sandboxというプロジェクトのwikiの"some page"という名称のページへのリンク
    • +
    • [[sandbox:]] sanbdoxというプロジェクトのwikiのメインページへのリンク
    • +
    + +

    存在しないwikiページへのリンクは赤で表示されます。 例: Nonexistent page.

    + +

    そのほかのリソースへのリンク:

    + +
      +
    • 文書: +
        +
      • document#17 (id 17の文書へのリンク)
      • +
      • document:Greetings ("Greetings" というタイトルの文書へのリンク)
      • +
      • document:"Some document" (文書のタイトルに空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
      • sandbox:document:"Some document" ("sandbox" というプロジェクトの "Some document" というタイトルの文書へのリンク)
      • +
      +
    • +
    + +
      +
    • バージョン: +
        +
      • version#3 (id 3のバージョンへのリンク)
      • +
      • version:1.0.0 ("1.0.0"という名称のバージョンへのリンク)
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 ("sandbox"というプロジェクトの "1.0.0" という名称のバージョンへのリンク)
      • +
      +
    • +
    + +
      +
    • 添付ファイル: +
        +
      • attachment:file.zip (現在のオブジェクトに添付された file.zip というファイルへのリンク)
      • +
      • 現在のオブジェクト上の添付ファイルのみリンク先として指定できます (例えばあるチケットからは、そのチケットに添付されたファイルのみリンク先にできます)
      • +
      +
    • +
    + +
      +
    • チェンジセット: +
        +
      • r758 (チェンジセットへのリンク)
      • +
      • commit:c6f4d0fd (ハッシュ値によるチェンジセットへのリンク)
      • +
      • svn1|r758 (複数のリポジトリが設定されたプロジェクトで、特定のリポジトリのチェンジセットへのリンク)
      • +
      • commit:hg|c6f4d0fd (ハッシュ値による、特定のリポジトリのチェンジセットへのリンク)
      • +
      • sandbox:r758 (他のプロジェクトのチェンジセットへのリンク)
      • +
      • sandbox:commit:c6f4d0fd (ハッシュ値による、他のプロジェクトのチェンジセットへのリンク)
      • +
      +
    • +
    + +
      +
    • リポジトリ内のファイル: +
        +
      • source:some/file (プロジェクトのリポジトリ内の /some/file というファイルへのリンク)
      • +
      • source:some/file@52 (ファイルのリビジョン52へのリンク)
      • +
      • source:some/file#L120 (ファイルの120行目へのリンク)
      • +
      • source:some/file@52#L120 (リビジョン52のファイルの120行目へのリンク)
      • +
      • source:"some file@52#L120" (URLにスペースが含まれる場合はダブルクォーテーションで囲んでください)
      • +
      • export:some/file (ファイルのダウンロードを強制)
      • +
      • source:svn1|some/file (複数のリポジトリが設定されたプロジェクトで、特定のリポジトリのファイルへのリンク)
      • +
      • sandbox:source:some/file ("sandbox" というプロジェクトのリポジトリ上の /some/file というファイルへのリンク)
      • +
      • sandbox:export:some/file (ファイルのダウンロードを強制)
      • +
      +
    • +
    + +
      +
    • フォーラム: +
        +
      • forum#1 (id 1のフォーラムへのリンク)
      • +
      • forum:Support ("Support"という名称のフォーラムへのリンク)
      • +
      • forum:"Technical Support" (フォーラム名に空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
      +
    • +
    + +
      +
    • フォーラムのメッセージ: +
        +
      • message#1218 (id 1218のメッセージへのリンク)
      • +
      +
    • +
    + +
      +
    • プロジェクト: +
        +
      • project#3 (id 3のプロジェクトへのリンク)
      • +
      • project:someproject ("someproject"という名称のプロジェクトへのリンク)
      • +
      • project:"some project" (プロジェクト名に空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
      +
    • +
    + +
      +
    • ニュース: +
        +
      • news#2 (id 2のニュースへのリンク)
      • +
      • news:Greetings ("Greetings"というタイトルのニュースへのリンク)
      • +
      • news:"First Release" (タイトルに空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
      +
    • +
    + +
      +
    • ユーザー: +
        +
      • user#2 (id 2のユーザーへのリンク)
      • +
      • user:jsmith (jsmith というログインIDのユーザーへのリンク)
      • +
      • @jsmith (jsmith というログインIDのユーザーへのリンク)
      • +
      +
    • +
    + +

    エスケープ:

    + +
      +
    • テキストをRedmineのリンクとして解釈させたくない場合は感嘆符 ! を前につけてください。
    • +
    + + +

    外部リンク

    + +

    URL(starting with: www, http, https, ftp, ftps, sftp and sftps)とメールアドレスは自動的にリンクになります:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    上記記述の表示例です: http://www.redmine.org,

    + +

    URLのかわりに別のテキストを表示させたい場合は、通常のMarkdown記法が利用できます:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    上記記述の表示例です: Redmine web site

    + + +

    テキストの書式

    + + +

    見出し、太字、テーブル、リスト等は、RedmineはMarkdownでの記述に対応しています。Markdownの詳細は http://daringfireball.net/projects/markdown/syntax を参照してください。Markdownの一例を以下に示しますが、実際にはここで取り上げた以外の記法にも対応しています。

    + +

    文字の書式

    + +
    +* **太字**
    +* *斜体*
    +* ***太字で斜体***
    +* ~~取り消し線~~
    +
    + +

    表示例:

    + +
      +
    • 太字
    • +
    • 斜体
    • +
    • 太字で斜体
    • +
    • 取り消し線
    • +
    + +

    画像

    + +
      +
    • ![](image_url) image_urlで指定されたURLの画像を表示 (Markdownの記法)
    • +
    • Wikiページに添付された画像があれば、ファイル名を指定して画像を表示させることができます: ![](attached_image)
    • +
    + +

    見出し

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmineは見出しにアンカーを設定するので、"#Heading", "#Subheading"のように記述して見出しへのリンクが行えます。

    + + +

    引用

    + +

    段落を > で開始してください。

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    表示例:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目次

    + +
    +{{toc}} => 目次(左寄せ)
    +{{>toc}} => 目次(右寄せ)
    +
    + +

    区切り線

    + +
    +---
    +
    + +

    マクロ

    + +

    Redmineには以下の組み込みマクロが用意されています:

    + +

    +

    +
    hello_world
    +

    サンプルのマクロです。

    + +
    macro_list
    +

    利用可能なマクロの一覧を表示します。マクロの説明があればそれも表示します。

    + +
    child_pages
    +

    子ページの一覧を表示します。引数の指定が無ければ現在のwikiページの子ページを表示します。以下は使用例です:

    +
    {{child_pages}} -- wikiページでのみ使用可能です
    +{{child_pages(depth=2)}} -- 2階層分のみ表示します
    + +
    include
    +

    別のWikiページの内容を挿入します。 以下は使用例です:

    +
    {{include(Foo)}}
    +

    別プロジェクトのWikiページを挿入することもできます:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    折り畳まれた状態のテキストを挿入します。以下は使用例です:

    +
    {{collapse(詳細を表示...)
    +この部分はデフォルトでは折り畳まれた状態で表示されます。
    +リンクをクリックすると展開されます。
    +}}
    + +
    thumbnail
    +

    添付ファイルのクリック可能なサムネイル画像を表示します。以下は使用例です:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    コードハイライト

    + +

    Redmineのコードハイライトは CodeRay という、Rubyで記述された高速なライブラリを使用しています。現時点では c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml, yaml (yml) に対応しています。括弧内の名前はコードハイライトの指定時に利用できる別名です。

    + +

    Wiki記法に対応している箇所であればどこでも以下の記述によりコードハイライトが利用できます (言語名・別名では大文字・小文字は区別されません):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    表示例:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ja/wiki_syntax_detailed_textile.html b/public/help/ja/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..3648270 --- /dev/null +++ b/public/help/ja/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki記法

    + +

    リンク

    + +

    Redmine内のリンク

    + +

    RedmineはWiki記法が使える箇所のどこからでも、チケット・チェンジセット・Wikiページなどのリソースへのリンクができます。

    +
      +
    • チケットへのリンク: #124 (終了したチケットは #124 のように取り消し線付きで表示されます)
    • +
    • チケットの注記へのリンク: #124-6 または #124#note-6
    • +
    + +

    Wikiへのリンク:

    + +
      +
    • [[Guide]] "Guide"という名称のページへのリンク: Guide
    • +
    • [[Guide#further-reading]] "Guide"というページ内の"further-reading"というアンカーに飛びます。見出しには自動的にアンカーが設定されるのでこのようにリンク先とすることができます: Guide
    • +
    • [[Guide|User manual]] "Guide"というページへのリンクを異なるテキストで表示: User manual
    • +
    + +

    別のプロジェクトのwikiへのリンクも可能です:

    + +
      +
    • [[sandbox:some page]] sandboxというプロジェクトのwikiの"some page"という名称のページへのリンク
    • +
    • [[sandbox:]] sanbdoxというプロジェクトのwikiのメインページへのリンク
    • +
    + +

    存在しないwikiページへのリンクは赤で表示されます。 例: Nonexistent page.

    + +

    そのほかのリソースへのリンク:

    + +
      +
    • 文書: +
        +
      • document#17 (id 17の文書へのリンク)
      • +
      • document:Greetings ("Greetings" というタイトルの文書へのリンク)
      • +
      • document:"Some document" (文書のタイトルに空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
      • sandbox:document:"Some document" ("sandbox" というプロジェクトの "Some document" というタイトルの文書へのリンク)
      • +
    • +
    + +
      +
    • バージョン: +
        +
      • version#3 (id 3のバージョンへのリンク)
      • +
      • version:1.0.0 ("1.0.0"という名称のバージョンへのリンク)
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 ("sandbox"というプロジェクトの "1.0.0" という名称のバージョンへのリンク)
      • +
    • +
    + +
      +
    • 添付ファイル: +
        +
      • attachment:file.zip (現在のオブジェクトに添付された file.zip というファイルへのリンク)
      • +
      • 現在のオブジェクト上の添付ファイルのみリンク先として指定できます (例えばあるチケットからは、そのチケットに添付されたファイルのみリンク先にできます)
      • +
    • +
    + +
      +
    • チェンジセット: +
        +
      • r758 (チェンジセットへのリンク)
      • +
      • commit:c6f4d0fd (ハッシュ値によるチェンジセットへのリンク)
      • +
      • svn1|r758 (複数のリポジトリが設定されたプロジェクトで、特定のリポジトリのチェンジセットへのリンク)
      • +
      • commit:hg|c6f4d0fd (ハッシュ値による、特定のリポジトリのチェンジセットへのリンク)
      • +
      • sandbox:r758 (他のプロジェクトのチェンジセットへのリンク)
      • +
      • sandbox:commit:c6f4d0fd (ハッシュ値による、他のプロジェクトのチェンジセットへのリンク)
      • +
    • +
    + +
      +
    • リポジトリ内のファイル: +
        +
      • source:some/file (プロジェクトのリポジトリ内の /some/file というファイルへのリンク)
      • +
      • source:some/file@52 (ファイルのリビジョン52へのリンク)
      • +
      • source:some/file#L120 (ファイルの120行目へのリンク)
      • +
      • source:some/file@52#L120 (リビジョン52のファイルの120行目へのリンク)
      • +
      • source:"some file@52#L120" (URLにスペースが含まれる場合はダブルクォーテーションで囲んでください)
      • +
      • export:some/file (ファイルのダウンロードを強制)
      • +
      • source:svn1|some/file (複数のリポジトリが設定されたプロジェクトで、特定のリポジトリのファイルへのリンク)
      • +
      • sandbox:source:some/file ("sandbox" というプロジェクトのリポジトリ上の /some/file というファイルへのリンク)
      • +
      • sandbox:export:some/file (ファイルのダウンロードを強制)
      • +
    • +
    + +
      +
    • フォーラム: +
        +
      • forum#1 (id 1のフォーラムへのリンク)
      • +
      • forum:Support ("Support"という名称のフォーラムへのリンク)
      • +
      • forum:"Technical Support" (フォーラム名に空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
    • +
    + +
      +
    • フォーラムのメッセージ: +
        +
      • message#1218 (id 1218のメッセージへのリンク)
      • +
    • +
    + +
      +
    • プロジェクト: +
        +
      • project#3 (id 3のプロジェクトへのリンク)
      • +
      • project:someproject ("someproject"という名称のプロジェクトへのリンク)
      • +
      • project:"some project" (プロジェクト名に空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
    • +
    + +
      +
    • ニュース: +
        +
      • news#2 (id 2のニュースへのリンク)
      • +
      • news:Greetings ("Greetings"というタイトルのニュースへのリンク)
      • +
      • news:"First Release" (タイトルに空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
    • +
    + +
      +
    • ユーザー: +
        +
      • user#2 (id 2のユーザーへのリンク)
      • +
      • user:jsmith (jsmith というログインIDのユーザーへのリンク)
      • +
      • @jsmith (jsmith というログインIDのユーザーへのリンク)
      • +
      +
    • +
    + +

    エスケープ:

    + +
      +
    • テキストをRedmineのリンクとして解釈させたくない場合は感嘆符 ! を前につけてください。
    • +
    + + +

    外部リンク

    + +

    URL(starting with: www, http, https, ftp, ftps, sftp and sftps)とメールアドレスは自動的にリンクになります:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    上記記述の表示例です: http://www.redmine.org,

    + +

    URLのかわりに別のテキストを表示させたい場合は、標準的なtextile記法が利用できます:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    上記記述の表示例です: Redmine web site

    + + +

    テキストの書式

    + + +

    見出し、太字、テーブル、リスト等は、RedmineはTextile記法での記述に対応しています。Textile記法の詳細は http://en.wikipedia.org/wiki/Textile_(markup_language) を参照してください。Textileの一例を以下に示しますが、実際にはここで取り上げた以外の記法にも対応しています。

    + +

    文字の書式

    + +
    +* *太字*
    +* _斜体_
    +* _*太字で斜体*_
    +* +下線+
    +* -取り消し線-
    +
    + +

    表示例:

    + +
      +
    • 太字
    • +
    • 斜体
    • +
    • 太字で斜体
    • +
    • 下線
    • +
    • 取り消し線
    • +
    + +

    画像

    + +
      +
    • !image_url! image_urlで指定されたURLの画像を表示 (Textile記法)
    • +
    • !>image_url! 画像を右寄せ・テキスト回り込みありで表示
    • +
    • Wikiページに添付された画像があれば、ファイル名を指定して画像を表示させることができます: !attached_image.png!
    • +
    + +

    見出し

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmineは見出しにアンカーを設定するので、"#Heading", "#Subheading"のように記述して見出しへのリンクが行えます。

    + + +

    段落

    + +
    +p>. 右寄せ
    +p=. センタリング
    +
    + +

    センタリングされた段落

    + + +

    引用

    + +

    段落を bq. で開始してください。

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    表示例:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目次

    + +
    +{{toc}} => 目次(左寄せ)
    +{{>toc}} => 目次(右寄せ)
    +
    + +

    区切り線

    + +
    +---
    +
    + +

    マクロ

    + +

    Redmineには以下の組み込みマクロが用意されています:

    + +

    +

    +
    hello_world
    +

    サンプルのマクロです。

    + +
    macro_list
    +

    利用可能なマクロの一覧を表示します。マクロの説明があればそれも表示します。

    + +
    child_pages
    +

    子ページの一覧を表示します。引数の指定が無ければ現在のwikiページの子ページを表示します。以下は使用例です:

    +
    {{child_pages}} -- wikiページでのみ使用可能です
    +{{child_pages(depth=2)}} -- 2階層分のみ表示します
    + +
    include
    +

    別のWikiページの内容を挿入します。 以下は使用例です:

    +
    {{include(Foo)}}
    +

    別プロジェクトのWikiページを挿入することもできます:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    折り畳まれた状態のテキストを挿入します。以下は使用例です:

    +
    {{collapse(詳細を表示...)
    +この部分はデフォルトでは折り畳まれた状態で表示されます。
    +リンクをクリックすると展開されます。
    +}}
    + +
    thumbnail
    +

    添付ファイルのクリック可能なサムネイル画像を表示します。以下は使用例です:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    コードハイライト

    + +

    Redmineのコードハイライトは CodeRay という、Rubyで記述された高速なライブラリを使用しています。現時点では c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml, yaml (yml) に対応しています。括弧内の名前はコードハイライトの指定時に利用できる別名です。

    + +

    Wiki記法に対応している箇所であればどこでも以下の記述によりコードハイライトが利用できます (言語名・別名では大文字・小文字は区別されません):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    表示例:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ja/wiki_syntax_markdown.html b/public/help/ja/wiki_syntax_markdown.html new file mode 100644 index 0000000..e5f6b86 --- /dev/null +++ b/public/help/ja/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki記法 クイックリファレンス (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    太字**太字**太字
    斜体*斜体*斜体
    取り消し線~~取り消し線~~取り消し線
    コード`コード`コード
    整形済みテキスト~~~
     複数行の
     コード
    ~~~
    +
    + 複数行の
    + コード
    +
    +
    リスト
    リスト* 項目1
      * 下位階層の項目
    * 項目2
    • 項目1
      • 下位階層の項目
    • 項目2
    順序付きリスト1. 項目1
       1. 下位階層の項目
    2. 項目2
    1. 項目1
      1. 下位階層の項目
    2. 項目2
    見出し
    Heading 1# タイトル1

    タイトル1

    Heading 2## タイトル2

    タイトル2

    Heading 3### タイトル3

    タイトル3

    リンク
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine内のリンク
    Wikiページへのリンク[[Wiki page]]Wiki page
    チケット #12チケット #12
    リビジョン r43リビジョン r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    画像
    Image![](画像URL)
    ![](添付ファイル名)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    より詳細なリファレンス

    + + + diff --git a/public/help/ja/wiki_syntax_textile.html b/public/help/ja/wiki_syntax_textile.html new file mode 100644 index 0000000..acb9d85 --- /dev/null +++ b/public/help/ja/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki記法 クイックリファレンス

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    フォントスタイル
    太字*太字*太字
    斜体_斜体_斜体
    下線+下線+下線
    取り消し線-取り消し線-取り消し線
    ??引用??引用
    コード@コード@コード
    整形済みテキスト<pre>
     複数行の
     コード
    </pre>
    +
    +複数行の
    +コード
    +
    +
    リスト
    リスト* 項目1
    ** 下位階層の項目
    * 項目2
    • 項目1
      • 下位階層の項目
    • 項目2
    順序付きリスト# 項目1
    ## 下位階層の項目
    # 項目2
    1. 項目1
      1. 下位階層の項目
    2. 項目2
    見出し
    見出し1h1. タイトル1

    タイトル1

    見出し2h2. タイトル2

    タイトル2

    見出し3h3. タイトル3

    タイトル3

    リンク
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine内のリンク
    Wikiページへのリンク[[Wiki page]]Wiki page
    チケット #12チケット #12
    リビジョン r43リビジョン r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    画像
    Image!画像URL!
    !添付ファイル名!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    より詳細なリファレンス

    + + + diff --git a/public/help/ko/wiki_syntax_detailed_markdown.html b/public/help/ko/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/ko/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ko/wiki_syntax_detailed_textile.html b/public/help/ko/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/ko/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ko/wiki_syntax_markdown.html b/public/help/ko/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/ko/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/ko/wiki_syntax_textile.html b/public/help/ko/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/ko/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/lt/wiki_syntax_detailed_markdown.html b/public/help/lt/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/lt/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/lt/wiki_syntax_detailed_textile.html b/public/help/lt/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/lt/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/lt/wiki_syntax_markdown.html b/public/help/lt/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/lt/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/lt/wiki_syntax_textile.html b/public/help/lt/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/lt/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/lv/wiki_syntax_detailed_markdown.html b/public/help/lv/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/lv/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/lv/wiki_syntax_detailed_textile.html b/public/help/lv/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/lv/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/lv/wiki_syntax_markdown.html b/public/help/lv/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/lv/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/lv/wiki_syntax_textile.html b/public/help/lv/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/lv/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/mk/wiki_syntax_detailed_markdown.html b/public/help/mk/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/mk/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/mk/wiki_syntax_detailed_textile.html b/public/help/mk/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/mk/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/mk/wiki_syntax_markdown.html b/public/help/mk/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/mk/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/mk/wiki_syntax_textile.html b/public/help/mk/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/mk/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/mn/wiki_syntax_detailed_markdown.html b/public/help/mn/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/mn/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/mn/wiki_syntax_detailed_textile.html b/public/help/mn/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/mn/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/mn/wiki_syntax_markdown.html b/public/help/mn/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/mn/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/mn/wiki_syntax_textile.html b/public/help/mn/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/mn/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/nl/wiki_syntax_detailed_markdown.html b/public/help/nl/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/nl/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/nl/wiki_syntax_detailed_textile.html b/public/help/nl/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/nl/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/nl/wiki_syntax_markdown.html b/public/help/nl/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/nl/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/nl/wiki_syntax_textile.html b/public/help/nl/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/nl/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/no/wiki_syntax_detailed_markdown.html b/public/help/no/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/no/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/no/wiki_syntax_detailed_textile.html b/public/help/no/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/no/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/no/wiki_syntax_markdown.html b/public/help/no/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/no/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/no/wiki_syntax_textile.html b/public/help/no/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/no/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/pl/wiki_syntax_detailed_markdown.html b/public/help/pl/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/pl/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/pl/wiki_syntax_detailed_textile.html b/public/help/pl/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/pl/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/pl/wiki_syntax_markdown.html b/public/help/pl/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/pl/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/pl/wiki_syntax_textile.html b/public/help/pl/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/pl/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/pt-br/wiki_syntax_detailed_markdown.html b/public/help/pt-br/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/pt-br/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/pt-br/wiki_syntax_detailed_textile.html b/public/help/pt-br/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/pt-br/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/pt-br/wiki_syntax_markdown.html b/public/help/pt-br/wiki_syntax_markdown.html new file mode 100644 index 0000000..dc2b418 --- /dev/null +++ b/public/help/pt-br/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Formatação Wiki + + + + +

    Sintaxe Wiki - Referência Rápida (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Estilos de Fonte
    Strong**Negrito**Negrito
    Italic*Itálico*Itálico
    Deleted~~Tachado~~Tachado
    Inline Code`Código Inline`Código Inline
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + linhas
    + de código
    +
    +
    Listas
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Cabeçalhos
    Heading 1# Título 1

    Título 1

    Heading 2## Título 2

    Título 2

    Heading 3### Título 3

    Título 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Links do Redmine
    Link to a Wiki page[[Página Wiki]]Página Wiki
    Tarefa #12Tarefa #12
    Revisão r43Revisão r43
    commit:f30e13e43f30e13e4
    source:algum/arquivosource:algum/arquivo
    Imagens inline
    Image![](url_da_imagem)
    ![](imagem_anexada)
    Tabelas
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    Mais Informações

    + + + diff --git a/public/help/pt-br/wiki_syntax_textile.html b/public/help/pt-br/wiki_syntax_textile.html new file mode 100644 index 0000000..71732a0 --- /dev/null +++ b/public/help/pt-br/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Formatação Wiki + + + + +

    Sintaxe Wiki - Referência Rápida

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Estilos de Fonte
    Strong*Negrito*Negrito
    Italic_Itálico_Itálico
    Underline+Sublinhado+Sublinhado
    Deleted-Tachado-Tachado
    ??Citação??Citação
    Inline Code@Código Inline@Código Inline
    Preformatted text<pre>
     linhas
     de código
    </pre>
    +
    + linhas
    + de código
    +
    +
    Listas
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Cabeçalhos
    Heading 1h1. Título 1

    Título 1

    Heading 2h2. Título 2

    Título 2

    Heading 3h3. Título 3

    Título 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Links do Redmine
    Link to a Wiki page[[Página Wiki]]Página Wiki
    Tarefa #12Tarefa #12
    Revisão r43Revisão r43
    commit:f30e13e43f30e13e4
    source:algum/arquivosource:algum/arquivo
    Imagens inline
    Image!url_da_imagem!
    !imagem_anexada!
    Tabelas
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Mais Informações

    + + + diff --git a/public/help/pt/wiki_syntax_detailed_markdown.html b/public/help/pt/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/pt/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/pt/wiki_syntax_detailed_textile.html b/public/help/pt/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/pt/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/pt/wiki_syntax_markdown.html b/public/help/pt/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/pt/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/pt/wiki_syntax_textile.html b/public/help/pt/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/pt/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/ro/wiki_syntax_detailed_markdown.html b/public/help/ro/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/ro/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ro/wiki_syntax_detailed_textile.html b/public/help/ro/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/ro/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ro/wiki_syntax_markdown.html b/public/help/ro/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/ro/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/ro/wiki_syntax_textile.html b/public/help/ro/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/ro/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/ru/wiki_syntax_detailed_markdown.html b/public/help/ru/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/ru/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ru/wiki_syntax_detailed_textile.html b/public/help/ru/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..f706ddf --- /dev/null +++ b/public/help/ru/wiki_syntax_detailed_textile.html @@ -0,0 +1,346 @@ + + + +Форматирование Wiki Redmine + + + + + +

    Форматирование Wiki

    + +

    Ссылки

    + +

    Ссылки Redmine

    + +

    Redmine допускает гиперссылки между ресурсами (задачи, версии, wiki-страницы) отовсюду в wiki-формате.

    +
      +
    • Ссылка на задачу: #124 + ( + #124 + - ссылка зачёркнута, если задача закрыта) +
    • +
    • Ссылка на задачу: #124-6, или #124#note-6
    • +
    + +

    Wiki ссылки:

    + +
      +
    • [[Руководство]] выводит ссылку на страницу с названием 'Руководство': Руководство +
    • +
    • [[Руководство#дальнейшее-чтение]] направляет на метку "дальнейшее-чтение". Заголовкам + автоматически + метки, таким образом, вы можете на них ссылаться: Руководство
    • +
    • [[Руководство|Руководство пользователя]] выводит ссылку на саму страницу, но с другим текстом: + Руководство пользователя +
    • +
    + +

    Также вы можете ссылаться на wiki:

    + +
      +
    • [[sandbox:Некоторая страница]] выводит ссылку на страницу с названием 'Некоторая страница' wiki + проекта Sandbox +
    • +
    • [[sandbox:]] выводит ссылку на главную страницу wiki проекта Sandbox
    • +
    + +

    Ссылки на wiki окрашены в красный, если страница ещё не создана, пример: Несуществующая + страница.

    + +

    ССылки на другие ресурсы:

    + +
      +
    • Документы: +
        +
      • document#17 (ссылка на документ с id 17)
      • +
      • document:Приветствие (ссылка на документ с названием "Приветствие")
      • +
      • document:"Некоторый документ" (двойные кавычки использоются в случае, когда название + документа содержит пробелы) +
      • +
      • sandbox:document:"Приветствие" (ссылка на документ с названием "Приветствие" в проекте + "sandbox") +
      • +
    • +
    + +
      +
    • Этапы: +
        +
      • version#3 (ссылка на этап с id 3)
      • +
      • version:1.0.0 (ссылка на этап с названием "1.0.0")
      • +
      • version:"1.0 beta 2" (двойные кавычки использоются в случае, когда название + этапа содержит пробелы) +
      • +
      • sandbox:version:1.0.0 (ссылка на этап "1.0.0" проекта "sandbox")
      • +
    • +
    + +
      +
    • Вложения: +
        +
      • attachment:file.zip (ссылка на вложение текущего объекта с именем file.zip)
      • +
      • Сейчас можно ссылаться только на вложения текущего объекта (если вы просматриваете задачу, то возможно + ссылаться только на вложения этой задачи) +
      • +
    • +
    + +
      +
    • Версии: +
        +
      • r758 (ссылка на версию)
      • +
      • commit:c6f4d0fd (ссылка неа версию с нецифровым хешем)
      • +
      • svn1|r758 (ссылка на версию специфичного хранилища, для проектов лежащих в нескольких хранилищах)
      • +
      • commit:hg|c6f4d0fd (ссылка на версию с нецифровым хешем в специфичном хранилище)
      • +
      • sandbox:r758 (ссылка на версию в другом проекте)
      • +
      • sandbox:commit:c6f4d0fd (ссылка на версию с нецифровым хешем в другом проекте)
      • +
    • +
    + +
      +
    • Файлы хранилища: +
        +
      • source:some/file (ссылка на файл /some/file, расположенный в хранилище проекта) +
      • +
      • source:some/file@52 (ссылка на 52 ревизию файла)
      • +
      • source:some/file#L120 (ссылка на 120 строку файла)
      • +
      • source:some/file@52#L120 (ссылка на 120 строку в 52 ревизии файла)
      • +
      • source:"some file@52#L120" (используйте кавычки, если в ссылке есть пробелы)
      • +
      • export:some/file (ссылка на загрузку файла)
      • +
      • source:svn1|some/file (ссылка на версию специфичного хранилища, для проектов лежащих в нескольких хранилищах)
      • +
      • sandbox:source:some/file (ссылка на файл /some/file, расположенный в хранилище проекта + "sandbox") +
      • +
      • sandbox:export:some/file (ссылка на загрузку файла)
      • +
    • +
    + +
      +
    • Форумы: +
        +
      • forum#1 (ссылка на форум с id 1)
      • +
      • forum:Support (ссылка на форум "Support")
      • +
      • forum:"Technical Support" (используйте кавычки, если в названии есть пробелы)
      • +
    • +
    + +
      +
    • Сообщения форума: +
        +
      • message#1218 (ссылка на сообщение с id 1218)
      • +
    • +
    + +
      +
    • Проекты: +
        +
      • project#3 (ссылка на проект с id 3)
      • +
      • project:someproject (ссылка на проект "someproject")
      • +
      • project:"Some Project" (используйте кавычки, если в названии есть пробелы)
      • +
    • +
    + +
      +
    • Новости: +
        +
      • news#2 (ссылка на новость с id 2)
      • +
      • news:Greetings (ссылка на новость "Greetings")
      • +
      • news:"First Release" (используйте кавычки, если в названии есть пробелы)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Исключения:

    + +
      +
    • Вы можете отменить обработку ссылок с помощью восклицательного знака перед ссылкой: !http://foo.bar
    • +
    + +

    Внешние ссылки

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    выводится: http://www.redmine.org,

    + +

    Если же вы хотите, чтобы отобразился текст вместо адреса URL, вы можете испольовать стандартный синтаксис + форматирования текста:

    + +
    +"Сайт Redmine":http://www.redmine.org
    +
    + +

    выводится: Сайт Redmine

    + + +

    Форматирование текста

    + +

    Для таких вещей, как заголовки, выделение, таблицы и списки, Redmine поддерживает синтакс Textile. Обратитесь за + руководством к странице http://en.wikipedia.org/wiki/Textile_(markup_language) + . Несколько примеров приведены ниже, Но сам текстовый процессор способен на гораздо большее.

    + +

    Стиль шрифта

    + +
    +* *выделенный*
    +* _наклонный_
    +* _*выделенный наклонный*_
    +* +подчёркнутый+
    +* -зачёркнутый-
    +
    + +

    Выводится:

    + +
      +
    • выделенный
    • +
    • наклонный
    • +
    • выделенный наклонный
    • +
    • подчёркнутый
    • +
    • зачёркнутый
    • +
    + +

    Вставка изображений

    + +
      +
    • !url_изображения! выводит изображение, расположенное по адресу url_изображения (синтакс textile)
    • +
    • !>url_изображения! выводит изображение, выровненное по правому краю
    • +
    • Прикреплённое к wiki-странице изображение можно отобразить в тексте, используя имя файла: + !вложенное_изображение.png! +
    • +
    + +

    Заголовки

    + +
    +h1. Заголовок
    +
    +h2. Подзаголовок
    +
    +h3. Подзаголовок подзаголовка
    +
    + +

    Redmine присваивает якорь каждому заголовку, поэтому вы можете легко сослаться на любой, указав в тексте "#Заголовок", + "#Подзаголовок" и т.д.

    + + +

    Параграфы

    + +
    +p>. выровненный по правому краю
    +p=. выровненный по центру
    +
    + +

    Это - выровненный по центру параграф.

    + + +

    Цитаты

    + +

    Начните параграф с bq.

    + +
    +bq. Rails - это полноценный, многоуровневый фреймворк для построения веб-приложений, использующих базы данных,
    +    который основан на архитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC).
    +
    + +

    Выводится:

    + +
    +

    Rails - это полноценный, многоуровневый фреймворк для построения веб-приложений, использующих базы данных, + который основан на архитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC).

    +
    + + +

    Содержание

    + +
    +{{Содержание}} => содержание, выровненное по левому краю
    +{{>Содержание}} => содержание, выровненное по правому краю
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Макросы

    + +

    В Redmine существуют следующие встроенные макросы:

    + +

    +

    +
    hello_world
    +

    Некоторый макрос.

    + +
    macro_list
    +

    Выводит список доступных макросов с описаниями, если они имеются.

    + +
    child_pages
    +

    Вывод списка дочерних страниц. Без аргументов выводится список дочерних страниц для текущей wiki-страницы. Пример:

    +
    {{child_pages}} -- можно использователь только на wiki-странице
    +{{child_pages(depth=2)}} -- вывести только 2 уровня вложенности
    + +
    include
    +

    Вставить wiki-страницу. Пример:

    +
    {{include(Foo)}}
    +

    или вставить сраницу wiki конкретного проекта:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Вставить скрываемый текст. Пример:

    +
    {{collapse(Читать дальше...)
    +Этот блок текста по умолчанию скрыт.
    +Он расскроется, если нажать на ссылку.
    +}}
    + +
    thumbnail
    +

    Отображет кликабельный эскиз приложенной картинки. Пример:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Эскиз)}}
    +
    +

    + +

    Подсветка кода

    + +

    По умолчанию за подсветку код отвечает CodeRay, и для лучшей производительности библиотеки написаны на Ruby. Сейчас поддерживаются c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) языки.

    + +

    Вы можете подсветить код в любом месте, где поддерживается wiki-форматирование (название языка не зависит от регистра):

    + +
    +<pre><code class="ruby">
    +  Поместите свой код сюда.
    +</code></pre>
    +
    + +

    Пример:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/ru/wiki_syntax_markdown.html b/public/help/ru/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/ru/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/ru/wiki_syntax_textile.html b/public/help/ru/wiki_syntax_textile.html new file mode 100644 index 0000000..aa980d8 --- /dev/null +++ b/public/help/ru/wiki_syntax_textile.html @@ -0,0 +1,157 @@ + + + + +Форматирование Wiki + + + + +

    Синтаксис Wiki Краткая Справка

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Стили Шрифтов
    Выделенный*Выделенный*Выделенный
    Наклонный_Наклонный_Наклонный
    Подчёркнутый+Подчёркнутый+ + Подчёркнутый +
    Зачёркнутый-Зачёркнутый- + Зачёркнутый +
    ??Цитата??Цитата
    Вставка Кода@Вставка Кода@Вставка Кода
    Отформатированный текст<pre>
     строки
     кода
    </pre>
    +
    + строки
    + кода
    +            
    +
    Списки
    Несортированный список* Элемент 1
    ** Подэлемент
    * Элемент 2
    • Элемент 1
      • Подэлемент
    • Элемент 2
    Сортированный список# Элемент 1
    ## Подэлемент
    # Элемент 2
    1. Элемент 1
      1. Подэлемент
    2. Элемент 2
    Заголовки
    Заголовок 1h1. Название 1

    Название 1

    Заголовок 2h2. Название 2

    Название 2

    Заголовок 3h3. Название 3

    Название 3

    Ссылки
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Ссылки Redmine
    Ссылка на Wiki страницу[[Wiki страница]]Wiki страница
    Задача #12Задача #12
    Фиксация r43Фиксация r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Вставка изображений
    Изображение!url_картинки!
    !вложенный_файл!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    Больше информации

    + + + diff --git a/public/help/sk/wiki_syntax_detailed_markdown.html b/public/help/sk/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/sk/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sk/wiki_syntax_detailed_textile.html b/public/help/sk/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/sk/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sk/wiki_syntax_markdown.html b/public/help/sk/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/sk/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/sk/wiki_syntax_textile.html b/public/help/sk/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/sk/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/sl/wiki_syntax_detailed_markdown.html b/public/help/sl/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/sl/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sl/wiki_syntax_detailed_textile.html b/public/help/sl/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/sl/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sl/wiki_syntax_markdown.html b/public/help/sl/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/sl/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/sl/wiki_syntax_textile.html b/public/help/sl/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/sl/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/sq/wiki_syntax_detailed_markdown.html b/public/help/sq/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/sq/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sq/wiki_syntax_detailed_textile.html b/public/help/sq/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/sq/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sq/wiki_syntax_markdown.html b/public/help/sq/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/sq/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/sq/wiki_syntax_textile.html b/public/help/sq/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/sq/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/sr-yu/wiki_syntax_detailed_markdown.html b/public/help/sr-yu/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/sr-yu/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sr-yu/wiki_syntax_detailed_textile.html b/public/help/sr-yu/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/sr-yu/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sr-yu/wiki_syntax_markdown.html b/public/help/sr-yu/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/sr-yu/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/sr-yu/wiki_syntax_textile.html b/public/help/sr-yu/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/sr-yu/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/sr/wiki_syntax_detailed_markdown.html b/public/help/sr/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/sr/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sr/wiki_syntax_detailed_textile.html b/public/help/sr/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/sr/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sr/wiki_syntax_markdown.html b/public/help/sr/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/sr/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/sr/wiki_syntax_textile.html b/public/help/sr/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/sr/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/sv/wiki_syntax_detailed_markdown.html b/public/help/sv/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/sv/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sv/wiki_syntax_detailed_textile.html b/public/help/sv/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/sv/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/sv/wiki_syntax_markdown.html b/public/help/sv/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/sv/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/sv/wiki_syntax_textile.html b/public/help/sv/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/sv/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/th/wiki_syntax_detailed_markdown.html b/public/help/th/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/th/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/th/wiki_syntax_detailed_textile.html b/public/help/th/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/th/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/th/wiki_syntax_markdown.html b/public/help/th/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/th/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/th/wiki_syntax_textile.html b/public/help/th/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/th/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/tr/wiki_syntax_detailed_markdown.html b/public/help/tr/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/tr/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/tr/wiki_syntax_detailed_textile.html b/public/help/tr/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/tr/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/tr/wiki_syntax_markdown.html b/public/help/tr/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/tr/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/tr/wiki_syntax_textile.html b/public/help/tr/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/tr/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/uk/wiki_syntax_detailed_markdown.html b/public/help/uk/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..ea01bdb --- /dev/null +++ b/public/help/uk/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +Redmine - форматування вікі сторінок (Markdown) + + + + + +

    Форматування вікі сторінок (Markdown)

    + +

    Лінки(посилання)

    + +

    Redmine лінки(посилання)

    + +

    Redmine дозволяє гіперпосилання між ресурсами (завданнями, змінами, вікі-сторінками ...) з будь-якого місця, де використовується вікі-форматування.

    +
      +
    • Посилання на завдання: #124 (Відображає #124, посилання закресленим, якщо завдання закрите)
    • +
    • Посилання на примітку до завдання: #124-6, or #124#note-6
    • +
    + +

    Вікі посилання:

    + +
      +
    • [[Керівництво користувача]] відображає посилання на сторінку під назвою 'Керівництво користувача': Керівництво користувача
    • +
    • [[Guide#further-reading]] приведе вас до якоря "further-reading". Заголовкам автоматично призначаються якоря так, що Ви можете звернутися до них: Guide
    • +
    • [[Guide|User manual]] відображає посилання на ту ж саму сторінку, але з іншим текстом: User manual
    • +
    + +

    Ви також можете посилатися на сторінки з вікі іншого проекту:

    + +
      +
    • [[sandbox:some page]] відображає посилання на сторінку з назвою 'Some page' з вікі Sandbox
    • +
    • [[sandbox:]] відображає посилання на головну сторінку вікі Sandbox
    • +
    + +

    Вікі посилання відображаються червоним кольором, якщо сторінка ще не існує: Неіснуюча сторінка.

    + +

    Посилання на інші ресурси:

    + +
      +
    • Документи: +
        +
      • document#17 (посилання на документ з id 17)
      • +
      • document:Привітання (посилання на документ з заголовком "Привітання")
      • +
      • document:"Деякий документ" (подвійні лапки можна використовувати, якщо заголовок документа містить пропуски)
      • +
      • sandbox:document:"Деякий документ" (посилання на документ з заголовком "Деякий документ" з іншого проекту "sandbox")
      • +
      +
    • +
    + +
      +
    • Версії: +
        +
      • version#3 (посилання на версію з id 3)
      • +
      • version:1.0.0 (посилання на версію з назвою "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (посилання на версію "1.0.0" з проекту "sandbox")
      • +
      +
    • +
    + +
      +
    • Вкладенні файли: +
        +
      • attachment:file.zip (посилання на вкладенний файл з ім'ям file.zip)
      • +
      • На даний момент можливо посилатись тільки на вкладення з поточного об'єкту (якщо ви працюєте з завданням, ви можете посилатись тільки на вкладення поточного завдання)
      • +
      +
    • +
    + +
      +
    • Зміни: +
        +
      • r758 (посилання на зміни)
      • +
      • commit:c6f4d0fd (посилання на зміни з нечисловим хешем)
      • +
      • svn1|r758 (посилання на зміни вказаного сховища(репозиторія), для проектів з декількома сховищами(репозиторіями))
      • +
      • commit:hg|c6f4d0fd (посилання на зміни з нечисловим хешем вказаного репозиторія)
      • +
      • sandbox:r758 (посилання на зміни іншого проекту)
      • +
      • sandbox:commit:c6f4d0fd (посилання на зміни з нечисловим іншого проекту)
      • +
      +
    • +
    + +
      +
    • Файли у сховищах(репозиторіях): +
        +
      • source:some/file (посилання на файл за шляхом /some/file у сховищі проекту)
      • +
      • source:some/file@52 (посилання на file з ревізії 52)
      • +
      • source:some/file#L120 (посилання на рядок 120 з file)
      • +
      • source:some/file@52#L120 (посилання на рядок 120 з file ревізії 52)
      • +
      • source:"some file@52#L120" (використовуте подвійні лапки у випадках, коли URL містить пропуски
      • +
      • export:some/file (примусове завантаження файлу file)
      • +
      • source:svn1|some/file (посилання на file вказаного сховища, для проектів в яких використовується декілька сховищь)
      • +
      • sandbox:source:some/file (посилання на файл за шляхом /some/file з сховища проекту "sandbox")
      • +
      • sandbox:export:some/file (примусове завантаження файлу file)
      • +
      +
    • +
    + +
      +
    • Форуми: +
        +
      • forum#1 (посилання на форум з id 1
      • +
      • forum:Support (посилання на форум з назвою Support)
      • +
      • forum:"Технічна підтримка" (використовуте подвійні лапки у випадках, коли назва форуму містить пропуски)
      • +
      +
    • +
    + +
      +
    • Повідомленя на форумах: +
        +
      • message#1218 (посилання на повідомлення з id 1218)
      • +
      +
    • +
    + +
      +
    • Проекти: +
        +
      • project#3 (посилання на проект з id 3)
      • +
      • project:some-project (посилання на проект з назвою або ідентифікатором "some-project")
      • +
      • project:"Some Project" (використовуте подвійні лапки у випадках, коли назва проекту містить пропуски))
      • +
      +
    • +
    + +
      +
    • Новини: +
        +
      • news#2 (посилання на новину з id 2)
      • +
      • news:Greetings (посилання на новину з заголовком "Greetings")
      • +
      • news:"First Release" (використовуте подвійні лапки у випадках, коли назва новини містить пропуски)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Запобігання перетворенню(escaping):

    + +
      +
    • Ви можете запобігти, щоб Redmine перетворював посилання, поставивши перед посиланням знак оклику: !
    • +
    + + +

    Зовнішні посилання

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    відображаються як: http://www.redmine.org,

    + +

    Якщо ви хочете, відобразити текст замість URL, ви можете використовувати стандартний markdown синтаксис:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    відображається як: Redmine web site

    + + +

    Форматування тексту

    + + +

    Для таких речей як: заголовки, жирний текст, таблиці, списки, Redmine підтримує Markdown синтаксис. Перегляньте http://daringfireball.net/projects/markdown/syntax для отримання інформації як цим користуватись. Нижче наводиться декілька прикладів, але можливості Markdown набагато більщі ніж у наведених прикладах.

    + +

    Стиль шрифту

    + +
    +* **Жирний**
    +* *Курсив*
    +* ***Жирний курсив***
    +* ~~Закреслений~~
    +
    + +

    Відображення:

    + +
      +
    • Жирний
    • +
    • Курсив
    • +
    • Жирний курсив
    • +
    • Закреслений
    • +
    + +

    Вбудовані(inline) зображення

    + +
      +
    • ![](image_url) виводить зображення, розташоване за адресою image_url (markdown синтаксис)
    • +
    • ![](attached_image) зображення яке додане до вашої сторінки вікі, може бути відображено, з використанням ім'я файлу
    • +
    + +

    Заголовоки

    + +
    +# Заголовок
    +## Підзаголовок
    +### Підзаголовок
    +
    + +

    Redmine призначає якір кожному з цих заголовків, таким чином, ви можете посилатись на них з "#Заголовок", "#Підзаголовок" і так далі.

    + + +

    Цитати

    + +

    Почніть параграф з >

    + +
    +> Redmine — серверний веб-додаток з відкритим кодом для управління проектами та відстежування помилок. До системи входить календар-планувальник та діаграми Ганта
    +для візуального представлення ходу робіт за проектом та строків виконання.
    +
    + +

    Відображається:

    + +
    +

    Redmine — серверний веб-додаток з відкритим кодом для управління проектами та відстежування помилок. До системи входить календар-планувальник та діаграми Ганта
    для візуального представлення ходу робіт за проектом та строків виконання.

    +
    + + +

    Таблиці змісту сторінки

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Горизонтальна лінія

    + +
    +---
    +
    + +

    Макроси

    + +

    Redmine має наступні вбудовані макроси:

    + +

    +

    +
    hello_world
    +

    Приклад макросу.

    + +
    macro_list
    +

    Відображає список всіх доступних макросів, в тому числі опис, якщо такий є.

    + +
    child_pages
    +

    Відображає список дочірніх сторінок. Без аргументів, він відображає дочірні сторінки поточної сторінки вікі. Приклад:

    +
    {{child_pages}} -- може бути використаний тільки на вікі-сторінці
    +{{child_pages(depth=2)}} -- відображає тільки 2 рівня вкладень
    + +
    include
    +

    Вставити вікі-сторінку. Приклад:

    +
    {{include(Foo)}}
    +

    або вставити сторінку з конкретного проекту вікі:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Втавте блок тексту, який має з'являтись при натисканні на "Детальніше...". Приклад:

    +
    {{collapse(Детальніше...)
    +Це блок тексту прихований по замовчуванню.
    +Його можливо показати натиснувши на посилання
    +}}
    + +
    thumbnail
    +

    Відображає інтерактивні мініатюри вкладеного зображення. Приклади:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Підсвітка синтаксису коду

    + +

    За замовчуванням підсвічування коду використовує CodeRay, швидка бібліотека для підсвітки синтаксису цілком розроблена на Ruby. На даний час вона підтримує синтаксис: c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) мови, де імена в дужках є псевдонімами.

    + +

    Ви можете виділити підсвіткою код в будь-якому місці, яке підтримує вікі-форматування, використовуючи наступний синтаксис (зверніть увагу, що назва мови або псевдонім не чутливі до регістру):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Приклад:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/uk/wiki_syntax_detailed_textile.html b/public/help/uk/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..9756d6f --- /dev/null +++ b/public/help/uk/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +Redmine - форматування вікі сторінок + + + + + +

    Форматування вікі сторінок

    + +

    Лінки(посилання)

    + +

    Redmine лінки(посилання)

    + +

    Redmine дозволяє гіперпосилання між ресурсами (завданнями, змінами, вікі-сторінками ...) з будь-якого місця, де використовується вікі-форматування.

    +
      +
    • Посилання на завдання: #124 (відображає #124, посилання закресленим, якщо завдання закрите)
    • +
    • Посилання на примітку до завдання: #124-6, or #124#note-6
    • +
    + +

    Вікі посилання:

    + +
      +
    • [[Керівництво користувача]] відображає посилання на сторінку під назвою 'Керівництво користувача': Керівництво користувача
    • +
    • [[Guide#further-reading]] приведе вас до якоря "further-reading". Заголовкам автоматично призначаються якоря так, що Ви можете звернутися до них: Guide
    • +
    • [[Guide|User manual]] відображає посилання на ту ж саму сторінку, але з іншим текстом: User manual
    • +
    + +

    Ви також можете посилатися на сторінки з вікі іншого проекту:

    + +
      +
    • [[sandbox:some page]] відображає посилання на сторінку з назвою 'Some page' з вікі Sandbox
    • +
    • [[sandbox:]] відображає посилання на головну сторінку вікі Sandbox
    • +
    + +

    Вікі посилання відображаються червоним кольором, якщо сторінка ще не існує: Неіснуюча сторінка.

    + +

    Посилання на інші ресурси:

    + +
      +
    • Документи: +
        +
      • document#17 (посилання на документ з id 17)
      • +
      • document:Привітання (посилання на документ з заголовком "Привітання")
      • +
      • document:"Деякий документ" (подвійні лапки можна використовувати, якщо заголовок документа містить пропуски)
      • +
      • sandbox:document:"Деякий документ" (посилання на документ з заголовком "Деякий документ" з іншого проекту "sandbox")
      • +
    • +
    + +
      +
    • Версії: +
        +
      • version#3 (посилання на версію з id 3)
      • +
      • version:1.0.0 (посилання на версію з назвою "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (посилання на версію "1.0.0" з проекту "sandbox")
      • +
    • +
    + +
      +
    • Вкладенні файли: +
        +
      • attachment:file.zip (посилання на вкладенний файл з ім'ям file.zip)
      • +
      • На даний момент можливо посилатись тільки на вкладення з поточного об'єкту (якщо ви працюєте з завданням, ви можете посилатись тільки на вкладення поточного завдання)
      • +
    • +
    + +
      +
    • Зміни: +
        +
      • r758 (посилання на зміни)
      • +
      • commit:c6f4d0fd (посилання на зміни з нечисловим хешем)
      • +
      • svn1|r758 (посилання на зміни вказаного сховища(репозиторія), для проектів з декількома сховищами(репозиторіями))
      • +
      • commit:hg|c6f4d0fd (посилання на зміни з нечисловим хешем вказаного репозиторія)
      • +
      • sandbox:r758 (посилання на зміни іншого проекту)
      • +
      • sandbox:commit:c6f4d0fd (посилання на зміни з нечисловим іншого проекту)
      • +
    • +
    + +
      +
    • Файли у сховищах(репозиторіях): +
        +
      • source:some/file (посилання на файл за шляхом /some/file у сховищі проекту)
      • +
      • source:some/file@52 (посилання на file з ревізії 52)
      • +
      • source:some/file#L120 (посилання на рядок 120 з file)
      • +
      • source:some/file@52#L120 (посилання на рядок 120 з file ревізії 52)
      • +
      • source:"some file@52#L120" (використовуте подвійні лапки у випадках, коли URL містить пропуски
      • +
      • export:some/file (примусове завантаження файлу file)
      • +
      • source:svn1|some/file (посилання на file вказаного сховища, для проектів в яких використовується декілька сховищь)
      • +
      • sandbox:source:some/file (посилання на файл за шляхом /some/file з сховища проекту "sandbox")
      • +
      • sandbox:export:some/file (примусове завантаження файлу file)
      • +
    • +
    + +
      +
    • Форуми: +
        +
      • forum#1 (посилання на форум з id 1
      • +
      • forum:Support (посилання на форум з назвою Support)
      • +
      • forum:"Технічна підтримка" (використовуте подвійні лапки у випадках, коли назва форуму містить пропуски)
      • +
    • +
    + +
      +
    • Повідомленя на форумах: +
        +
      • message#1218 (посилання на повідомлення з id 1218)
      • +
    • +
    + +
      +
    • Проекти: +
        +
      • project#3 (посилання на проект з id 3)
      • +
      • project:some-project (посилання на проект з назвою або ідентифікатором "some-project")
      • +
      • project:"Some Project" (використовуте подвійні лапки у випадках, коли назва проекту містить пропуски))
      • +
    • +
    + +
      +
    • Новини: +
        +
      • news#2 (посилання на новину з id 2)
      • +
      • news:Greetings (посилання на новину з заголовком "Greetings")
      • +
      • news:"First Release" (використовуте подвійні лапки у випадках, коли назва новини містить пропуски)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Запобігання перетворенню(escaping):

    + +
      +
    • Ви можете запобігти, щоб Redmine перетворював посилання, поставивши перед посиланням знак оклику: !
    • +
    + + +

    Зовнішні посилання

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    відображається як: http://www.redmine.org,

    + +

    Якщо ви хочете, відобразити текст замість URL, ви можете використовувати дужки:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    відображається як: Redmine web site

    + + +

    Форматування тексту

    + + +

    Для таких речей як: заголовки, жирний текст, таблиці, списки, Redmine підтримує Textile синтаксис. Перегляньте https://uk.wikipedia.org/wiki/Textile для отримання інформації як цим користуватись. Нижче наводиться декілька прикладів, але можливості Textile набагато більщі ніж у наведених прикладах.

    + +

    Стиль шрифту

    + +
    +* *Жирний*
    +* _Курсив_
    +* _*Жирний курсив*_
    +* +Підкреслений+
    +* -Закреслений-
    +
    + +

    Відображення:

    + +
      +
    • Жирний
    • +
    • Курсив
    • +
    • Жирний курсив
    • +
    • Підкреслений
    • +
    • Закреслений
    • +
    + +

    Вбудовані(inline) зображення

    + +
      +
    • !image_url! виводить зображення, розташоване за адресою image_url (textile syntax)
    • +
    • !>image_url! зображення відображається з права(right floating)
    • +
    • !attached_image.png! зображення яке додане до вашої сторінки вікі, може бути відображено, з використанням ім'я файлу
    • +
    + +

    Заголовки

    + +
    +h1. Заголовок
    +
    +h2. Підзаголовок
    +
    +h3. Підзаголовок
    +
    + +

    Redmine призначає якір кожному з цих заголовків, таким чином, ви можете посилатись на них з "#Заголовок", "#Підзаголовок" і так далі.

    + + +

    Параграфи

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    Це центрований абзац.

    + + +

    Цитати

    + +

    Почніть параграф з bq.

    + +
    +bq. Redmine — серверний веб-додаток з відкритим кодом для управління проектами та відстежування помилок. До системи входить календар-планувальник та діаграми Ганта
    +для візуального представлення ходу робіт за проектом та строків виконання.
    +
    + +

    Відображається:

    + +
    +

    Redmine — серверний веб-додаток з відкритим кодом для управління проектами та відстежування помилок. До системи входить календар-планувальник та діаграми Ганта
    для візуального представлення ходу робіт за проектом та строків виконання.

    +
    + + +

    Таблиці змісту сторінки

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Горизонтальна лінія

    + +
    +---
    +
    + +

    Макроси

    + +

    Redmine має наступні вбудовані макроси:

    + +

    +

    +
    hello_world
    +

    Приклад макросу.

    + +
    macro_list
    +

    Відображає список всіх доступних макросів, в тому числі опис, якщо такий є.

    + +
    child_pages
    +

    Відображає список дочірніх сторінок. Без аргументів, він відображає дочірні сторінки поточної сторінки вікі. Приклад:

    +
    {{child_pages}} -- може бути використаний тільки на вікі-сторінці
    +{{child_pages(depth=2)}} -- відображає тільки 2 рівня вкладень
    + +
    include
    +

    Вставити вікі-сторінку. Приклад:

    +
    {{include(Foo)}}
    +

    або вставити сторінку з конкретного проекту вікі:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Втавте блок тексту, який має з'являтись при натисканні на "Детальніше...". Приклад:

    +
    {{collapse(Детальніше...)
    +Це блок тексту прихований по замовчуванню.
    +Його можливо показати натиснувши на посилання
    +}}
    + +
    thumbnail
    +

    Відображає інтерактивні мініатюри вкладеного зображення. Приклади:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Підсвітка синтаксису коду

    + +

    За замовчуванням підсвічування коду використовує CodeRay, швидка бібліотека для підсвітки синтаксису цілком розроблена на Ruby. На даний час вона підтримує синтаксис: c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) мови, де імена в дужках є псевдонімами.

    + +

    Ви можете виділити підсвіткою код в будь-якому місці, яке підтримує вікі-форматування, використовуючи наступний синтаксис (зверніть увагу, що назва мови або псевдонім не чутливі до регістру):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Приклад:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/uk/wiki_syntax_markdown.html b/public/help/uk/wiki_syntax_markdown.html new file mode 100644 index 0000000..af138db --- /dev/null +++ b/public/help/uk/wiki_syntax_markdown.html @@ -0,0 +1,70 @@ + + + + +Вікі синтаксис (Markdown) + + + + +

    Вікі синтаксис швидка підказка (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cтилі шрифтів
    Жирний**Жирний**Жирний
    Курсив*Курсив*Курсив
    Закреслений~~Закреслений~~Закреслений
    Інлайн код`Інлайн код`Інлайн код
    Попередньо відформатований текст~~~
     Попередньо
     відформатований
     текст
    ~~~
    +
    + Попередньо
    + відформатований
    + текст
    +
    +
    Списки
    Ненумерованний список* Пункт
      * Підпункт
    * Пункт
    • Пункт
      • Підпункт
    • Пункт
    Нумерований список1. Пункт
       1. Підпункт
    2. Пункт
    1. Пункт
      1. Підпункт
    2. Пункт
    Заголовоки
    Заголовок 1# Заголовок 1

    Заголовок 1

    Заголовок 2## Заголовок 2

    Заголовок 2

    Заголовок 3### Заголовок 3

    Заголовок 3

    Лінки(посилання)
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine посилання
    Посилання на вікі сторінку[[Вікі сторінка]]Вікі сторінка
    Завдання #12Завдання #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Вбудовані(inline) зображення
    Image![](image_url)
    ![](attached_image)
    Таблиці
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    Детальніша інформація

    + + + diff --git a/public/help/uk/wiki_syntax_textile.html b/public/help/uk/wiki_syntax_textile.html new file mode 100644 index 0000000..a746624 --- /dev/null +++ b/public/help/uk/wiki_syntax_textile.html @@ -0,0 +1,73 @@ + + + + +Вікі синтаксис + + + + +

    Вікі синтаксис швидка підказка

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cтилі шрифтів
    Жирний*Жирний*Жирний
    Курсив_Курсив_Курсив
    Підкреслений+Підкреслений+Підкреслений
    Закреслений-Закреслений-Закреслений
    ??Цитування??Цитування
    Інлайн код@Інлайн код@Інлайн код
    Попередньо відформатований текст<pre>
     Попередньо
     відформатований
     текст
    </pre>
    +
    + Попередньо
    + відформатований
    + текст
    +
    +
    Списки
    Ненумерованний список* Пункт
    ** Підпункт
    * Пункт
    • Пункт
      • Підпункт
    • Пункт
    Нумерований список# Пункт
    ## Підпункт
    # Пункт
    1. Пункт
      1. Підпункт
    2. Пункт
    Заголовоки
    Заголовок 1h1. Заголовок 1

    Заголовок 1

    Заголовок 2h2. Заголовок 2

    Заголовок 2

    Заголовок 3h3. Заголовок 3

    Заголовок 3

    Лінки(посилання)
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine посилання
    Посилання на вікі сторінку[[Вікі сторінка]]Вікі сторінка
    Завдання #12Завдання #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Вбудоване(inline) зображення
    Зображення!image_url!
    !attached_image!
    Таблиці
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. об. рядки | B | C |
    |\2. об. колонки |
    + + + + + + + +
    ABC
    ABC
    об'єднані рядкиBC
    об'єднані колонки
    +
    + +

    Детальніша інформація

    + + + diff --git a/public/help/vi/wiki_syntax_detailed_markdown.html b/public/help/vi/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/vi/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/vi/wiki_syntax_detailed_textile.html b/public/help/vi/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..28e86db --- /dev/null +++ b/public/help/vi/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +
    +h2. Subheading
    +
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  Place your code here.
    +</code></pre>
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/vi/wiki_syntax_markdown.html b/public/help/vi/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/vi/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/vi/wiki_syntax_textile.html b/public/help/vi/wiki_syntax_textile.html new file mode 100644 index 0000000..6f544d2 --- /dev/null +++ b/public/help/vi/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    ** Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list# Item 1
    ## Sub
    # Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    Tables
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    row spanBC
    col span
    +
    + +

    More Information

    + + + diff --git a/public/help/wiki_syntax.css b/public/help/wiki_syntax.css new file mode 100644 index 0000000..8821f4b --- /dev/null +++ b/public/help/wiki_syntax.css @@ -0,0 +1,12 @@ +h1 { font-family: Verdana, sans-serif; font-size: 14px; text-align: center; color: #444; } +body { font-family: Verdana, sans-serif; font-size: 12px; color: #444; } +pre, code {font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace; } +table th { padding-top: 1em; } +table td { vertical-align: top; background-color: #f5f5f5; height: 2em; vertical-align: middle;} +table td code { font-size: 1.2em; } +table td h1 { font-size: 1.8em; text-align: left; } +table td h2 { font-size: 1.4em; text-align: left; } +table td h3 { font-size: 1.2em; text-align: left; } + +table.sample { border-collapse: collapse; border-spacing: 0; margin: 4px; } +table.sample th, table.sample td { border: solid 1px #bbb; padding: 4px; height: 1em; } \ No newline at end of file diff --git a/public/help/wiki_syntax_detailed.css b/public/help/wiki_syntax_detailed.css new file mode 100644 index 0000000..5ec1dc3 --- /dev/null +++ b/public/help/wiki_syntax_detailed.css @@ -0,0 +1,25 @@ +body { font:80% Verdana,Tahoma,Arial,sans-serif; } +h1, h2, h3, h4 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; } +pre, code { font-size:120%; font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace; } +pre code { font-size:100%; } +pre { + margin: 1em 1em 1em 1.6em; + padding: 2px; + background-color: #fafafa; + border: 1px solid #e2e2e2; + width: auto; + overflow-x: auto; + overflow-y: hidden; +} +a.new { color: #b73535; } + +.syntaxhl .class { color:#258; font-weight:bold } +.syntaxhl .comment { color:#385; } +.syntaxhl .delimiter { color:black } +.syntaxhl .function { color:#06B; font-weight:bold } +.syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black } +.syntaxhl .inline-delimiter { font-weight: bold; color: #666 } +.syntaxhl .instance-variable { color:#33B } +.syntaxhl .keyword { color:#939; font-weight:bold } +.syntaxhl .string .content { color: #46a } +.syntaxhl .string .delimiter { color:#46a } \ No newline at end of file diff --git a/public/help/zh-tw/wiki_syntax_detailed_markdown.html b/public/help/zh-tw/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..c716afc --- /dev/null +++ b/public/help/zh-tw/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki 格式設定 (Markdown)

    + +

    連結

    + +

    Redmine 連結

    + +

    在任何可以使用 Wiki 格式設定的地方, Redmine 都允許在資源 (議題、變更集、 Wiki 頁面...) 間建立超連結。

    +
      +
    • 連結至一個議題: #124 (若該議題已經結束,則使用刪除線顯示連結: #124)
    • +
    • 連結至一個議題的筆記: #124-6, 或 #124#note-6
    • +
    + +

    Wiki 連結:

    + +
      +
    • [[Guide]] 顯示一個頁面名稱為 'Guide' 的連結: Guide
    • +
    • [[Guide#further-reading]] 會顯示連結至一個 "further-reading" 的 HTML 錨定 (anchor) 。每個標題文字都會被自動指定一個 HTML 錨定,以便您可以用來連結它們: Guide
    • +
    • [[Guide|User manual]] 使用不同的文字來顯示一個頁面名稱為 'Guide' 的連結: User manual
    • +
    + +

    您也可以連結至其他專案的 Wiki 頁面:

    + +
      +
    • [[sandbox:some page]] 顯示一個 Sanbox wiki 中頁面名稱為 'Some page' 的連結
    • +
    • [[sandbox:]] 顯示 Sandbox wiki 首頁頁面的連結
    • +
    + +

    當頁面不存在的時候, Wiki 連結會以紅色的方式顯示,例如: Nonexistent page.

    + +

    連結至其他資源:

    + +
      +
    • 文件: +
        +
      • document#17 (連結到編號為 17 的文件)
      • +
      • document:Greetings (連結至文件標題為 "Greetings" 的文件)
      • +
      • document:"Some document" (文件標題包含空白字元時可以使用雙引號來標示)
      • +
      • sandbox:document:"Some document" (連結至另外一個 "sandbox" 專案中,文件標題為 "Some document" 的文件)
      • +
      +
    • +
    + +
      +
    • 版本: +
        +
      • version#3 (連結至編號為 3 的版本)
      • +
      • version:1.0.0 連結至名稱為 "1.0.0" 的版本
      • +
      • version:"1.0 beta 2" (版本名稱包含空白字元時可以使用雙引號來標示)
      • +
      • sandbox:version:1.0.0 (連結至 "sandbox" 專案中,名稱為 "1.0.0" 的版本)
      • +
      +
    • +
    + +
      +
    • 附加檔案: +
        +
      • attachment:file.zip (連結至目前物件中,名稱為 file.zip 的附加檔案)
      • +
      • 目前僅提供參考到目前物件中的附加檔案 (若您正位於一個議題中,僅可參考位於此議題中之附加檔案)
      • +
      +
    • +
    + +
      +
    • 變更集: +
        +
      • r758 (連結至一個變更集)
      • +
      • commit:c6f4d0fd (使用雜湊碼連結至一個變更集)
      • +
      • svn1|r758 (連結至指定儲存機制中之變更集,用於專案使用多個儲存機制時之情況)
      • +
      • commit:hg|c6f4d0fd (使用某特定儲存機制中的雜湊碼連結至一個變更集)
      • +
      • sandbox:r758 (連結至其他專案的變更集)
      • +
      • sandbox:commit:c6f4d0fd (使用其他專案的雜湊碼連結至一個變更集)
      • +
      +
    • +
    + +
      +
    • 儲存機制中之檔案: +
        +
      • source:some/file (連結至專案儲存機制中,位於 /some/file 的檔案)
      • +
      • source:some/file@52 (連結至該檔案的 52 版次)
      • +
      • source:some/file#L120 (連結至該檔案的第 120 行)
      • +
      • source:some/file@52#L120 (連結至該檔案的 52 版次中之第 120 行)
      • +
      • source:"some file@52#L120" (當 URL 中包含空白字元時,使用雙引號來標示)
      • +
      • export:some/file (強制下載該檔案)
      • +
      • source:svn1|some/file (連結至指定儲存機制中的該檔案,用於專案使用多個儲存機制時之情況)
      • +
      • sandbox:source:some/file (連結至 "sandbox" 專案的儲存機制中,位於 /some/file 的檔案)
      • +
      • sandbox:export:some/file (強制下載該檔案)
      • +
      +
    • +
    + +
      +
    • 論壇: +
        +
      • forum#1 (連結至編號為 1 的論壇)
      • +
      • forum:Support (連結至名稱為 Support 的論壇)
      • +
      • forum:"Technical Support" (當論壇名稱中包含空白字元時,使用雙引號來標示)
      • +
      +
    • +
    + +
      +
    • 論壇訊息: +
        +
      • message#1218 (連結至編號為 1218 的訊息)
      • +
      +
    • +
    + +
      +
    • 專案: +
        +
      • project#3 (連結至編號為 3 的專案)
      • +
      • project:some-project (連結至名稱為 "someproject" 的專案)
      • +
      • project:"Some Project" (當專案名稱中包含空白字元時,使用雙引號來標示)
      • +
      +
    • +
    + +
      +
    • 新聞: +
        +
      • news#2 (連結至編號為 2 的新聞項目)
      • +
      • news:Greetings (連結至名稱為 "Greetings" 的新聞項目)
      • +
      • news:"First Release" (當新聞項目名稱中包含空白字元時,使用雙引號來標示)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    逸出字元:

    + +
      +
    • 您可以在文字的前面加上驚嘆號 (!) 來避免該文字被剖析成 Redmine 連結
    • +
    + + +

    外部連結

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    會顯示成: http://www.redmine.org,

    + +

    若您想要顯示指定的文字而非該 URL ,您可以使用下列標準的 markdown 語法:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    會顯示成: Redmine web site

    + + +

    文字格式設定

    + + +

    對於諸如標題、粗體、表格、清單等項目, Redmine 支援使用 Markdown 語法。 可參考 http://daringfireball.net/projects/markdown/syntax 中關於使用這些格式化功能的說明資訊。 下面包含了一些使用範例,但格式化引擎的處理能力遠多於這些簡單的使用範例。

    + +

    字型樣式

    + +
    +* **粗體**
    +* *斜體*
    +* ***粗斜體***
    +* ~~刪除線~~
    +
    + +

    會顯示成:

    + +
      +
    • 粗體
    • +
    • 斜體
    • +
    • 粗斜體
    • +
    • 刪除線
    • +
    + +

    內嵌圖像

    + +
      +
    • ![](image_url) 顯示一個位於 image_url 位址的圖像 (markdown 語法)
    • +
    • 若您附加了一個圖像到 Wiki 頁面中,可以使用他的檔案名稱來顯示成內嵌圖像: ![](attached_image)
    • +
    + +

    標題

    + +
    +# 標題
    +## 次標題
    +### 次次標題
    +
    + +

    Redmine 為每一種標題指定一個 HTML 錨定 (anchor) ,因此您可使用 "#標題" 、 "#次標題" 等方式連結至這些標題。

    + + +

    區塊引述

    + +

    使用 > 啟動一個區塊引述的段落。

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目錄

    + +
    +{{toc}} => 靠左對齊目錄
    +{{>toc}} => 靠右對齊目錄
    +
    + +

    水平線

    + +
    +---
    +
    + +

    巨集

    + +

    Redmine 內建下列巨集:

    + +

    +

    +
    hello_world
    +

    範例巨集

    + +
    macro_list
    +

    顯示所有可用巨集的清單,若巨集有提供說明也會一併顯示。

    + +
    child_pages
    +

    顯示子頁面的清單。 若未指定參數,它將會顯示目前 Wiki 頁面的子頁面清單。 範例:

    +
    {{child_pages}} -- 僅可於某 Wiki 頁面中被使用
    +{{child_pages(depth=2)}} -- 僅顯示兩層巢狀層次
    + +
    include
    +

    引入一個 wiki 頁面。範例:

    +
    {{include(Foo)}}
    +

    或用以引入某特定專案的 Wiki 頁面:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    插入一個摺疊的文字區塊。範例:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    顯示可被點擊的附加圖像之縮圖。範例:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    程式碼醒目提示

    + +

    預設使用 CodeRay作為程式碼醒目提示的機制,它是一個使用 Ruby 撰寫的語法醒目提示函式庫。 目前支援 c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) 等語言,括弧中的名稱是該語言的別名。

    + +

    您可載任何支援 Wiki 格式設定的地方,使用這個語法來醒目提示程式碼 (注意語言與其別名的名稱不須區分大小寫):

    + +
    +~~~ ruby
    +  將程式碼放在這裡。
    +~~~
    +
    + +

    範例:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/zh-tw/wiki_syntax_detailed_textile.html b/public/help/zh-tw/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..6afed51 --- /dev/null +++ b/public/help/zh-tw/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki 格式設定

    + +

    連結

    + +

    Redmine 連結

    + +

    在任何可以使用 Wiki 格式設定的地方, Redmine 都允許在資源 (議題、變更集、 Wiki 頁面...) 間建立超連結。

    +
      +
    • 連結至一個議題: #124 (若該議題已經結束,則使用刪除線顯示連結: #124)
    • +
    • 連結至一個議題的筆記: #124-6, 或 #124#note-6
    • +
    + +

    Wiki 連結:

    + +
      +
    • [[Guide]] 顯示一個頁面名稱為 'Guide' 的連結: Guide
    • +
    • [[Guide#further-reading]] 會顯示連結至一個 "further-reading" 的 HTML 錨定 (anchor) 。每個標題文字都會被自動指定一個 HTML 錨定,以便您可以用來連結它們: Guide
    • +
    • [[Guide|User manual]] 使用不同的文字來顯示一個頁面名稱為 'Guide' 的連結: User manual
    • +
    + +

    您也可以連結至其他專案的 Wiki 頁面:

    + +
      +
    • [[sandbox:some page]] 顯示一個 Sanbox wiki 中頁面名稱為 'Some page' 的連結
    • +
    • [[sandbox:]] 顯示 Sandbox wiki 首頁頁面的連結
    • +
    + +

    當頁面不存在的時候, Wiki 連結會以紅色的方式顯示,例如: Nonexistent page.

    + +

    連結至其他資源:

    + +
      +
    • 文件: +
        +
      • document#17 (連結到編號為 17 的文件)
      • +
      • document:Greetings (連結至文件標題為 "Greetings" 的文件)
      • +
      • document:"Some document" (文件標題包含空白字元時可以使用雙引號來標示)
      • +
      • sandbox:document:"Some document" (連結至另外一個 "sandbox" 專案中,文件標題為 "Some document" 的文件)
      • +
    • +
    + +
      +
    • 版本: +
        +
      • version#3 (連結至編號為 3 的版本)
      • +
      • version:1.0.0 (連結至名稱為 "1.0.0" 的版本)
      • +
      • version:"1.0 beta 2" (版本名稱包含空白字元時可以使用雙引號來標示)
      • +
      • sandbox:version:1.0.0 (連結至 "sandbox" 專案中,名稱為 "1.0.0" 的版本)
      • +
    • +
    + +
      +
    • 附加檔案: +
        +
      • attachment:file.zip (連結至目前物件中,名稱為 file.zip 的附加檔案)
      • +
      • 目前僅提供參考到目前物件中的附加檔案 (若您正位於一個議題中,僅可參考位於此議題中之附加檔案)
      • +
    • +
    + +
      +
    • 變更集: +
        +
      • r758 (連結至一個變更集)
      • +
      • commit:c6f4d0fd (使用雜湊碼連結至一個變更集)
      • +
      • svn1|r758 (連結至指定儲存機制中之變更集,用於專案使用多個儲存機制時之情況)
      • +
      • commit:hg|c6f4d0fd (使用某特定儲存機制中的雜湊碼連結至一個變更集)
      • +
      • sandbox:r758 (連結至其他專案的變更集)
      • +
      • sandbox:commit:c6f4d0fd (使用其他專案的雜湊碼連結至一個變更集)
      • +
    • +
    + +
      +
    • 儲存機制中之檔案: +
        +
      • source:some/file (連結至專案儲存機制中,位於 /some/file 的檔案)
      • +
      • source:some/file@52 (連結至該檔案的 52 版次)
      • +
      • source:some/file#L120 (連結至該檔案的第 120 行)
      • +
      • source:some/file@52#L120 (連結至該檔案的 52 版次中之第 120 行)
      • +
      • source:"some file@52#L120" (當 URL 中包含空白字元時,使用雙引號來標示)
      • +
      • export:some/file (強制下載該檔案)
      • +
      • source:svn1|some/file (連結至指定儲存機制中的該檔案,用於專案使用多個儲存機制時之情況)
      • +
      • sandbox:source:some/file (連結至 "sandbox" 專案的儲存機制中,位於 /some/file 的檔案)
      • +
      • sandbox:export:some/file (強迫下載該檔案)
      • +
    • +
    + +
      +
    • 論壇: +
        +
      • forum#1 (連結至編號為 1 的論壇)
      • +
      • forum:Support (連結至名稱為 Support 的論壇)
      • +
      • forum:"Technical Support" (當論壇名稱中包含空白字元時,使用雙引號來標示)
      • +
    • +
    + +
      +
    • 論壇訊息: +
        +
      • message#1218 (連結至編號為 1218 的訊息)
      • +
    • +
    + +
      +
    • 專案: +
        +
      • project#3 (連結至編號為 3 的專案)
      • +
      • project:someproject (連結至名稱為 "someproject" 的專案)
      • +
      • project:"some project" (當專案名稱中包含空白字元時,使用雙引號來標示)
      • +
    • +
    + +
      +
    • 新聞: +
        +
      • news#2 (連結至編號為 2 的新聞項目)
      • +
      • news:Greetings (連結至名稱為 "Greetings" 的新聞項目)
      • +
      • news:"First Release" (當新聞項目名稱中包含空白字元時,使用雙引號來標示)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    逸出字元:

    + +
      +
    • 您可以在文字的前面加上驚嘆號 (!) 來避免該文字被剖析成 Redmine 連結
    • +
    + + +

    外部連結

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    會顯示成: http://www.redmine.org,

    + +

    若您想要顯示指定的文字而非該 URL ,您可以使用下列標準的 textile 語法:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    會顯示成: Redmine web site

    + + +

    文字格式設定

    + + +

    對於諸如標題、粗體、表格、清單等項目, Redmine 支援使用 Textile 語法。可參考 http://en.wikipedia.org/wiki/Textile_(markup_language) 中關於使用這些格式化功能的說明資訊。 下面包含了一些使用範例,但格式化引擎的處理能力遠多於這些簡單的使用範例。

    + +

    字型樣式

    + +
    +* *粗體*
    +* _斜體_
    +* _*粗斜體*_
    +* +底線+
    +* -刪除線-
    +
    + +

    會顯示成:

    + +
      +
    • 粗體
    • +
    • 斜體
    • +
    • 粗斜體
    • +
    • 底線
    • +
    • 刪除線
    • +
    + +

    內嵌圖像

    + +
      +
    • !image_url! 顯示一個位於 image_url 位址的圖像 (textile 語法)
    • +
    • !>image_url! 右側浮動圖像
    • +
    • 若您附加了一個圖像到 Wiki 頁面中,可以使用他的檔案名稱來顯示成內嵌圖像: !attached_image.png!
    • +
    + +

    標題

    + +
    +h1. 標題
    +
    +h2. 次標題
    +
    +h3. 次次標題
    +
    + +

    Redmine 為每一種標題指定一個 HTML 錨定 (anchor) ,因此您可使用 "#標題" 、 "#次標題" 等方式連結至這些標題。

    + + +

    段落

    + +
    +p>. 靠右對齊
    +p=. 置中對齊
    +
    + +

    這是一個置中對齊的段落。

    + + +

    區塊引述

    + +

    使用 bq. 啟動一個區塊引述的段落。

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    顯示為:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目錄

    + +
    +{{toc}} => 靠左對齊目錄
    +{{>toc}} => 靠右對齊目錄
    +
    + +

    水平線

    + +
    +---
    +
    + +

    巨集

    + +

    Redmine 內建下列巨集:

    + +

    +

    +
    hello_world
    +

    範例巨集。

    + +
    macro_list
    +

    顯示所有可用巨集的清單,若巨集有提供說明也會一併顯示。

    + +
    child_pages
    +

    顯示子頁面的清單。若未指定參數,它將會顯示目前 Wiki 頁面的子頁面清單。範例:

    +
    {{child_pages}} -- 僅可於某 Wiki 頁面中被使用
    +{{child_pages(depth=2)}} -- 僅顯示兩層巢狀層次
    + +
    include
    +

    引入一個 wiki 頁面。範例:

    +
    {{include(Foo)}}
    +

    或用以引入某特定專案的 Wiki 頁面:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    插入一個摺疊的文字區塊。範例:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    顯示可被點擊的附加圖像之縮圖。範例:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    程式碼醒目提示

    + +

    預設使用 CodeRay 作為程式碼醒目提示的機制,它是一個使用 Ruby 撰寫的語法醒目提示函式庫。目前支援 c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) 等語言,括弧中的名稱是該語言的別名。

    + +

    您可載任何支援 Wiki 格式設定的地方,使用這個語法來醒目提示程式碼 (注意語言與其別名的名稱不須區分大小寫):

    + +
    +<pre><code class="ruby">
    +  將程式碼放在這裡。
    +</code></pre>
    +
    + +

    範例:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/zh-tw/wiki_syntax_markdown.html b/public/help/zh-tw/wiki_syntax_markdown.html new file mode 100644 index 0000000..e62c720 --- /dev/null +++ b/public/help/zh-tw/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki 格式設定 + + + + +

    Wiki 語法快速對照表 (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    字型樣式
    強調粗體**強調粗體**強調粗體
    斜體*斜體*斜體
    刪除線~~刪除線~~刪除線
    內嵌程式碼`內嵌程式碼`內嵌程式碼
    預先格式化的段落文字~~~
     格式化
     的段落文字
    ~~~
    +
    + 格式化
    + 的段落文字
    +
    +
    清單
    不排序清單* 清單項目 1
      * 子清單項目
    * 清單項目 2
    • 清單項目 1
      • 子清單項目
    • 清單項目 2
    排序清單1. 清單項目 1
       1. 子清單項目
    2. 清單項目 2
    1. 清單項目 1
      1. 子清單項目
    2. 清單項目 2
    標題
    標題 1# 標題 1

    標題 1

    標題 2## 標題 2

    標題 2

    標題 3### 標題 3

    標題 3

    連結
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine 連結
    連結至一個 Wiki 頁面[[Wiki 頁面]]Wiki 頁面
    議題 #12議題 #12
    版次 r43版次 r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    內嵌圖像
    圖像![](圖像_url)
    ![](附加_圖像)
    表格
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    更多資訊

    + + + diff --git a/public/help/zh-tw/wiki_syntax_textile.html b/public/help/zh-tw/wiki_syntax_textile.html new file mode 100644 index 0000000..361c27f --- /dev/null +++ b/public/help/zh-tw/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki 格式設定 + + + + +

    Wiki 語法快速對照表

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    字型樣式
    強調粗體*強調粗體*強調粗體
    斜體_斜體_斜體
    底線+底線+底線
    刪除線-刪除線-刪除線
    ??引文??引文
    內嵌程式碼@內嵌程式碼@內嵌程式碼 (inline code)
    預先格式化的段落文字<pre>
     格式化
     的段落文字
    </pre>
    +
    + 格式化
    + 的段落文字
    +
    +
    清單
    不排序清單* 清單項目 1
    ** 子清單項目
    * 清單項目 2
    • 清單項目 1
      • 子清單項目
    • 清單項目 2
    排序清單# 清單項目 1
    ## Sub
    # 清單項目 2
    1. 清單項目 1
      1. Sub
    2. 清單項目 2
    標題
    標題 1h1. 標題 1

    標題 1

    標題 2h2. 標題 2

    標題 2

    標題 3h3. 標題 3

    標題 3

    連結
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine 連結
    連結至一個 Wiki 頁面[[Wiki 頁面]]Wiki 頁面
    議題 #12議題 #12
    版次 r43版次 r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    內嵌圖像
    圖像!圖像_url!
    !附加_圖像!
    表格
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. 資料列範圍 | B | C |
    |\2. 資料行範圍 |
    + + + + + + + +
    ABC
    ABC
    資料列範圍BC
    資料行範圍
    +
    + +

    更多資訊

    + + + diff --git a/public/help/zh/wiki_syntax_detailed_markdown.html b/public/help/zh/wiki_syntax_detailed_markdown.html new file mode 100644 index 0000000..cc4eb70 --- /dev/null +++ b/public/help/zh/wiki_syntax_detailed_markdown.html @@ -0,0 +1,308 @@ + + + +RedmineWikiFormatting (Markdown) + + + + + +

    Wiki formatting (Markdown)

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
      +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
      +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
      +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
      +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
      +
    • +
    + +
      +
    • Forums: +
        +
      • forum#1 (link to forum with id 1
      • +
      • forum:Support (link to forum named Support)
      • +
      • forum:"Technical Support" (use double quotes if forum name contains spaces)
      • +
      +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
      +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:some-project (link to project with name or slug of "some-project")
      • +
      • project:"Some Project" (use double quotes for project name containing spaces)
      • +
      +
    • +
    + +
      +
    • News: +
        +
      • news#2 (link to news item with id 2)
      • +
      • news:Greetings (link to news item named "Greetings")
      • +
      • news:"First Release" (use double quotes if news item name contains spaces)
      • +
      +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard markdown syntax:

    + +
    +[Redmine web site](http://www.redmine.org)
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Markdown syntax. See http://daringfireball.net/projects/markdown/syntax for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* **bold**
    +* *Italic*
    +* ***bold italic***
    +* ~~strike-through~~
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • ![](image_url) displays an image located at image_url (markdown syntax)
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: ![](attached_image)
    • +
    + +

    Headings

    + +
    +# Heading
    +## Subheading
    +### Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Blockquotes

    + +

    Start the paragraph with >

    + +
    +> Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    +

    +
    hello_world
    +

    Sample macro.

    + +
    macro_list
    +

    Displays a list of all available macros, including description if available.

    + +
    child_pages
    +

    Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

    +
    {{child_pages}} -- can be used from a wiki page only
    +{{child_pages(depth=2)}} -- display 2 levels nesting only
    + +
    include
    +

    Include a wiki page. Example:

    +
    {{include(Foo)}}
    +

    or to include a page of a specific project wiki:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    Inserts of collapsed block of text. Example:

    +
    {{collapse(View details...)
    +This is a block of text that is collapsed by default.
    +It can be expanded by clicking a link.
    +}}
    + +
    thumbnail
    +

    Displays a clickable thumbnail of an attached image. Examples:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +~~~ ruby
    +  Place your code here.
    +~~~
    +
    + +

    Example:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/zh/wiki_syntax_detailed_textile.html b/public/help/zh/wiki_syntax_detailed_textile.html new file mode 100644 index 0000000..1d502b1 --- /dev/null +++ b/public/help/zh/wiki_syntax_detailed_textile.html @@ -0,0 +1,314 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki 文本格式

    + +

    链接

    + +

    Redmine 链接

    + +

    在任何使用文本格式的地方,Redmine都允许在资源(问题、变更、wiki页面...)间建立超链接。

    +
      +
    • 链接至一个问题: #124 (显示 #124,若该问题已结束则会用删除线来表示)
    • +
    • 链接至一个问题的说明: #124-6, 或者 #124#note-6
    • +
    + +

    Wiki链接

    + +
      +
    • [[Guide]] 显示一个页面名为'Guide'的链接: Guide
    • +
    • [[Guide#further-reading]] 链接到页面内的"further-reading"标签. 每个标题都会自动绑定一个标签,方便您进行链接: Guide
    • +
    • [[Guide|User manual]] 使用不同的文字来显示一个页面名称为'Guide'的链接: User manual
    • +
    + +

    您也可以链接到其他项目的Wiki页面(使用项目标识):

    + +
      +
    • [[sandbox:some page]] 显示Sandbox项目wiki页面的一个名为'Some page'的链接
    • +
    • [[sandbox:]] 显示Sandbox项目wiki首页的链接
    • +
    + +

    当页面不存在的时候,Wiki链接会以红色来显示,例如: Nonexistent page.

    + +

    链接至其他资源:

    + +
      +
    • 文档: +
        +
      • document#17 (链接到id为17的文档)
      • +
      • document:Greetings (链接到标题为“Greeting”的文档)
      • +
      • document:"Some document" (文档标题包含空格时使用双引号来表示)
      • +
      • sandbox:document:"Some document" (链接至sandbox项目中标题为“Some document”的文档)
      • +
    • +
    + +
      +
    • 版本: +
        +
      • version#3 (链接至id为3的版本)
      • +
      • version:1.0.0 (链接到名称为“1.0.0”的版本)
      • +
      • version:"1.0 beta 2"(版本名称包含空格时使用双引号来表示)
      • +
      • sandbox:version:1.0.0 (连接至sandbox项目中的“1.0.0”版本)
      • +
    • +
    + +
      +
    • 附件: +
        +
      • attachment:file.zip (链接至当前页面下名为file.zip的附件)
      • +
      • 目前,只有当前页面下的附件能够被引用(如果您在一个问题中,则仅可以引用此问题下的附件)
      • +
    • +
    + +
      +
    • 变更集: +
        +
      • r758 (链接至一个变更集)
      • +
      • commit:c6f4d0fd (链接至一个非数字哈希的变更集)
      • +
      • svn1|r758 (链接至指定版本库中的变更集,用于使用多个版本库的项目)
      • +
      • commit:hg|c6f4d0fd (链接至指定版本库中,使用非数字哈希的变更集,此例子中是"hg"版本库下的哈希变更集)
      • +
      • sandbox:r758 (链接至其他项目的变更集)
      • +
      • sandbox:commit:c6f4d0fd (链接至其他项目中,使用非数字哈希的变更集)
      • +
    • +
    + +
      +
    • 版本库文件: +
        +
      • source:some/file (链接至项目版本库中位于/some/file的文件)
      • +
      • source:some/file@52 (链接至此文件的第52版)
      • +
      • source:some/file#L120 (链接至此文件的第120行)
      • +
      • source:some/file@52#L120 (链接至此文件的第52版的第120行)
      • +
      • source:"some file@52#L120" (当URL中包含空格时使用双引号来表示)
      • +
      • export:some/file (强制下载此文件,而不是在页面上查看)
      • +
      • source:svn1|some/file (链接至指定版本库中的文件, 用于使用多个版本库的项目)
      • +
      • sandbox:source:some/file (链接至"sandbox"项目的版本库中位于/some/file的文件)
      • +
      • sandbox:export:some/file (强制下载"sandbox"项目的版本库中位于/some/file的文件,而不是在页面上查看)
      • +
    • +
    + +
      +
    • 论坛: +
        +
      • forum#1 (链接至id为2的论坛)
      • +
      • forum:Support (链接至名称为"Support"的论坛)
      • +
      • forum:"Technical Support" (论坛名称包含空格时使用双引号表示)
      • +
    • +
    + +
      +
    • 论坛消息: +
        +
      • message#1218 (链接至id为1218的论坛消息)
      • +
    • +
    + +
      +
    • 项目: +
        +
      • project#3 (链接至id为3的项目)
      • +
      • project:someproject (链接至名称为"someproject"的项目)
      • +
      • project:"Some Project" (项目名称包含空格时,使用双引号来表示)
      • +
    • +
    + +
      +
    • 新闻: +
        +
      • news#2 (链接至id为1的新闻)
      • +
      • news:Greetings (链接至名称为"Greetings"的新闻)
      • +
      • news:"First Release" (新闻名称包含空格时,使用双引号来表示)
      • +
    • +
    + +
      +
    • Users: +
        +
      • user#2 (link to user with id 2)
      • +
      • user:jsmith (Link to user with login jsmith)
      • +
      • @jsmith (Link to user with login jsmith)
      • +
      +
    • +
    + +

    转义字符:

    + +
      +
    • 您可以在文本的前面加上感叹号(!)来避免该文本被解析成Redmine链接
    • +
    + + +

    外部链接

    + +

    URLs (starting with: www, http, https, ftp, ftps, sftp and sftps) and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    显示为: http://www.redmine.org,

    + +

    如果您想要显示指定的文本而不是链接,您可以通过下列标准的 textile 语法:

    + +
    +"Redmine 官网":http://www.redmine.org
    +
    + +

    显示为: Redmine 官网

    + + +

    字体格式

    + + +

    对于像是标题、粗体、表格、列表等文字格式, Redmine 支持使用 http://en.wikipedia.org/wiki/Textile_(markup_language) 查找关于使用这些特性的信息。下面将展示其中的一些常用的语法。

    + +

    字体风格

    + +
    +* *粗体*
    +* _斜体_
    +* _*粗体 斜体*_
    +* +下划线+
    +* -中划线-
    +
    + +

    显示为:

    + +
      +
    • 粗体
    • +
    • 斜体
    • +
    • 粗体 斜体
    • +
    • 下划线
    • +
    • 中划线
    • +
    + +

    内嵌图片

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • 你可以上传图片附件到 wiki 页面,然后使用它的文件名作为路径: !已上传的图片.png!
    • +
    + +

    标题

    + +
    +h1. 一级标题
    +
    +h2. 二级标题
    +
    +h3. 三级标题
    +
    + +

    你可以使用“#一级标题”、“#二级标题”等等来链接到这些标题

    + + +

    段落

    + +
    +p>. 向右对齐
    +p=. 居中
    +
    + +

    这是一个居中对齐的段落

    + + +

    引用文字

    + +

    在段落前加上 bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    显示为:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目录

    + +
    +{{toc}} => 靠左对齐目录
    +{{>toc}} => 靠右对齐目录
    +
    + +

    水平线

    + +
    +---
    +
    + +

    + +

    Redmine内建了以下宏:

    + +

    +

    +
    hello_world
    +

    宏示例.

    + +
    macro_list
    +

    显示所有可用的宏列表,如果该宏有提供说明也会一并显示。

    + +
    child_pages
    +

    显示一个子页面列表。默认显示当前Wiki页面的所有子页面。 示例:

    +
    {{child_pages}} -- 只能在Wiki页面调用
    +{{child_pages(depth=2)}} -- 显示两级子页面
    + +
    include
    +

    引用一个Wiki页面。示例:

    +
    {{include(Foo)}}
    +

    或者引用一个指定项目的Wiki页面:

    +
    {{include(projectname:Foo)}}
    + +
    collapse
    +

    插入一个折叠文本块。示例:

    +
    {{collapse(View details...)
    +这是一个默认折叠的文本块。
    +点击链接后将会展开此文本块.
    +}}
    + +
    thumbnail
    +

    显示一个图像附件的可点击缩略图。示例:

    +
    {{thumbnail(image.png)}}
    +{{thumbnail(image.png, size=300, title=Thumbnail)}}
    +
    +

    + +

    代码高亮

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, clojure, cpp (c++, cplusplus), css, delphi (pascal), diff (patch), erb (eruby, rhtml), go, groovy, haml, html (xhtml), java, javascript (ecmascript, ecma_script, java_script, js), json, lua, php, python, ruby (irb), sass, sql, taskpaper, text (plain, plaintext), xml and yaml (yml) languages, where the names inside parentheses are aliases.

    + +

    You can highlight code at any place that supports wiki formatting using this syntax (note that the language name or alias is case-insensitive):

    + +
    +<pre><code class="ruby">
    +  这里写 Ruby 代码
    +</code></pre>
    +
    + +

    示例:

    + +
    # The Greeter class
    +class Greeter
    +  def initialize(name)
    +    @name = name.capitalize
    +  end
    +
    +  def salute
    +    puts "Hello #{@name}!"
    +  end
    +end
    +
    + + diff --git a/public/help/zh/wiki_syntax_markdown.html b/public/help/zh/wiki_syntax_markdown.html new file mode 100644 index 0000000..39f8a3c --- /dev/null +++ b/public/help/zh/wiki_syntax_markdown.html @@ -0,0 +1,69 @@ + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference (Markdown)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong**Strong**Strong
    Italic*Italic*Italic
    Deleted~~Deleted~~Deleted
    Inline Code`Inline Code`Inline Code
    Preformatted text~~~
     lines
     of code
    ~~~
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
      * Sub
    * Item 2
    • Item 1
      • Sub
    • Item 2
    Ordered list1. Item 1
       1. Sub
    2. Item 2
    1. Item 1
      1. Sub
    2. Item 2
    Headings
    Heading 1# Title 1

    Title 1

    Heading 2## Title 2

    Title 2

    Heading 3### Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    [Foo](http://foo.bar)Foo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image![](image_url)
    ![](attached_image)
    Tables
    | A | B | C |
    |---|---|---|
    | A | B | C |
    | D | E | F |
    + + + + + + +
    ABC
    ABC
    DEF
    +
    + +

    More Information

    + + + diff --git a/public/help/zh/wiki_syntax_textile.html b/public/help/zh/wiki_syntax_textile.html new file mode 100644 index 0000000..595a9f7 --- /dev/null +++ b/public/help/zh/wiki_syntax_textile.html @@ -0,0 +1,72 @@ + + + + +Wiki formatting + + + + +

    Wiki 语法快速参考

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    字体风格
    粗体*粗体*粗体
    斜体_Italic_斜体
    下划线+下划线+下划线
    删除线-删除线-删除线
    ??引用??引用
    内嵌程序代码@内嵌程序代码@内嵌程序代码
    预先格式化的段落<pre>
     格式化
     的段落
    </pre>
    +
    + 格式化
    + 的段落
    +
    +
    列表
    不排序列表* 列表项 1
    ** Sub
    * 列表项 2
    • 列表项 1
      • 子项
    • 列表项 2
    排序列表# 列表项 1
    ## Sub
    # 列表项 2
    1. 列表项 1
      1. 子项
    2. 列表项 2
    标题
    标题 1h1. 标题 1

    标题 1

    标题 2h2. 标题 2

    标题 2

    标题 3h3. 标题 3

    标题 3

    链接
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine 链接
    链接到一个Wiki 页面[[Wiki 页面]]Wiki 页面
    问题 #12问题 #12
    修订 r43修订 r43
    commit:f30e13e43提交: f30e13e4
    source:some/file代码:source:some/file
    内嵌图片
    Image!image_url!
    !attached_image!
    表格
    |_. A |_. B |_. C |
    | A | B | C |
    |/2. row span | B | C |
    |\2. col span |
    + + + + + + + +
    ABC
    ABC
    行合并BC
    列合并
    +
    + +

    更多帮助信息

    + + + diff --git a/public/htaccess.fcgi.example b/public/htaccess.fcgi.example new file mode 100644 index 0000000..91d029f --- /dev/null +++ b/public/htaccess.fcgi.example @@ -0,0 +1,49 @@ +# General Apache options + + AddHandler fastcgi-script .fcgi + + + AddHandler fcgid-script .fcgi + +Options +FollowSymLinks +ExecCGI + +# If you don't want Rails to look in certain directories, +# use the following rewrite rules so that Apache won't rewrite certain requests +# +# Example: +# RewriteCond %{REQUEST_URI} ^/notrails.* +# RewriteRule .* - [L] + +# Redirect all requests not available on the filesystem to Rails +# By default the cgi dispatcher is used which is very slow +# +# For better performance replace the dispatcher with the fastcgi one +# +# Example: +# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] +RewriteEngine On + +# If your Rails application is accessed via an Alias directive, +# then you MUST also set the RewriteBase in this htaccess file. +# +# Example: +# Alias /myrailsapp /path/to/myrailsapp/public +# RewriteBase /myrailsapp + +RewriteRule ^$ index.html [QSA] +RewriteRule ^([^.]+)$ $1.html [QSA] +RewriteCond %{REQUEST_FILENAME} !-f + + RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] + + + RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] + + +# In case Rails experiences terminal errors +# Instead of displaying this message you can supply a file here which will be rendered instead +# +# Example: +# ErrorDocument 500 /500.html + +ErrorDocument 500 "

    Application error

    Rails application failed to start properly" diff --git a/public/images/1downarrow.png b/public/images/1downarrow.png new file mode 100644 index 0000000..a6d07e9 Binary files /dev/null and b/public/images/1downarrow.png differ diff --git a/public/images/1uparrow.png b/public/images/1uparrow.png new file mode 100644 index 0000000..6c0eae4 Binary files /dev/null and b/public/images/1uparrow.png differ diff --git a/public/images/2downarrow.png b/public/images/2downarrow.png new file mode 100644 index 0000000..1796516 Binary files /dev/null and b/public/images/2downarrow.png differ diff --git a/public/images/2uparrow.png b/public/images/2uparrow.png new file mode 100644 index 0000000..352cc2b Binary files /dev/null and b/public/images/2uparrow.png differ diff --git a/public/images/add.png b/public/images/add.png new file mode 100644 index 0000000..d6d26db Binary files /dev/null and b/public/images/add.png differ diff --git a/public/images/anonymous.png b/public/images/anonymous.png new file mode 100644 index 0000000..5f00a83 Binary files /dev/null and b/public/images/anonymous.png differ diff --git a/public/images/arrow_collapsed.png b/public/images/arrow_collapsed.png new file mode 100644 index 0000000..cbcc70d Binary files /dev/null and b/public/images/arrow_collapsed.png differ diff --git a/public/images/arrow_down.png b/public/images/arrow_down.png new file mode 100644 index 0000000..7a2a1a3 Binary files /dev/null and b/public/images/arrow_down.png differ diff --git a/public/images/arrow_expanded.png b/public/images/arrow_expanded.png new file mode 100644 index 0000000..7b1c563 Binary files /dev/null and b/public/images/arrow_expanded.png differ diff --git a/public/images/attachment.png b/public/images/attachment.png new file mode 100644 index 0000000..3762eaf Binary files /dev/null and b/public/images/attachment.png differ diff --git a/public/images/bullet_add.png b/public/images/bullet_add.png new file mode 100644 index 0000000..a3f850d Binary files /dev/null and b/public/images/bullet_add.png differ diff --git a/public/images/bullet_arrow_left.png b/public/images/bullet_arrow_left.png new file mode 100644 index 0000000..cabc1d7 Binary files /dev/null and b/public/images/bullet_arrow_left.png differ diff --git a/public/images/bullet_arrow_right.png b/public/images/bullet_arrow_right.png new file mode 100644 index 0000000..cbcc70d Binary files /dev/null and b/public/images/bullet_arrow_right.png differ diff --git a/public/images/bullet_black.png b/public/images/bullet_black.png new file mode 100644 index 0000000..6d87f99 Binary files /dev/null and b/public/images/bullet_black.png differ diff --git a/public/images/bullet_blue.png b/public/images/bullet_blue.png new file mode 100644 index 0000000..79d978c Binary files /dev/null and b/public/images/bullet_blue.png differ diff --git a/public/images/bullet_delete.png b/public/images/bullet_delete.png new file mode 100644 index 0000000..3459293 Binary files /dev/null and b/public/images/bullet_delete.png differ diff --git a/public/images/bullet_diamond.png b/public/images/bullet_diamond.png new file mode 100644 index 0000000..f68cb79 Binary files /dev/null and b/public/images/bullet_diamond.png differ diff --git a/public/images/bullet_end.png b/public/images/bullet_end.png new file mode 100644 index 0000000..0ff0332 Binary files /dev/null and b/public/images/bullet_end.png differ diff --git a/public/images/bullet_go.png b/public/images/bullet_go.png new file mode 100644 index 0000000..c724754 Binary files /dev/null and b/public/images/bullet_go.png differ diff --git a/public/images/bullet_orange.png b/public/images/bullet_orange.png new file mode 100644 index 0000000..d4b3cd0 Binary files /dev/null and b/public/images/bullet_orange.png differ diff --git a/public/images/bullet_purple.png b/public/images/bullet_purple.png new file mode 100644 index 0000000..58bc636 Binary files /dev/null and b/public/images/bullet_purple.png differ diff --git a/public/images/bullet_toggle_minus.png b/public/images/bullet_toggle_minus.png new file mode 100644 index 0000000..656fc9c Binary files /dev/null and b/public/images/bullet_toggle_minus.png differ diff --git a/public/images/bullet_toggle_plus.png b/public/images/bullet_toggle_plus.png new file mode 100644 index 0000000..bbd81a9 Binary files /dev/null and b/public/images/bullet_toggle_plus.png differ diff --git a/public/images/calendar.png b/public/images/calendar.png new file mode 100644 index 0000000..62df31c Binary files /dev/null and b/public/images/calendar.png differ diff --git a/public/images/cancel.png b/public/images/cancel.png new file mode 100644 index 0000000..a98e537 Binary files /dev/null and b/public/images/cancel.png differ diff --git a/public/images/changeset.png b/public/images/changeset.png new file mode 100644 index 0000000..8bf76fb Binary files /dev/null and b/public/images/changeset.png differ diff --git a/public/images/close.png b/public/images/close.png new file mode 100644 index 0000000..3dd76e6 Binary files /dev/null and b/public/images/close.png differ diff --git a/public/images/close_hl.png b/public/images/close_hl.png new file mode 100644 index 0000000..b7667aa Binary files /dev/null and b/public/images/close_hl.png differ diff --git a/public/images/comment.png b/public/images/comment.png new file mode 100644 index 0000000..0e848cc Binary files /dev/null and b/public/images/comment.png differ diff --git a/public/images/comments.png b/public/images/comments.png new file mode 100644 index 0000000..ef57fdd Binary files /dev/null and b/public/images/comments.png differ diff --git a/public/images/copy.png b/public/images/copy.png new file mode 100644 index 0000000..689f251 Binary files /dev/null and b/public/images/copy.png differ diff --git a/public/images/database_key.png b/public/images/database_key.png new file mode 100644 index 0000000..107e34e Binary files /dev/null and b/public/images/database_key.png differ diff --git a/public/images/delete.png b/public/images/delete.png new file mode 100644 index 0000000..ba6256d Binary files /dev/null and b/public/images/delete.png differ diff --git a/public/images/document.png b/public/images/document.png new file mode 100644 index 0000000..883f640 Binary files /dev/null and b/public/images/document.png differ diff --git a/public/images/download.png b/public/images/download.png new file mode 100644 index 0000000..080a26e Binary files /dev/null and b/public/images/download.png differ diff --git a/public/images/draft.png b/public/images/draft.png new file mode 100644 index 0000000..b51b07b Binary files /dev/null and b/public/images/draft.png differ diff --git a/public/images/duplicate.png b/public/images/duplicate.png new file mode 100644 index 0000000..f7d159e Binary files /dev/null and b/public/images/duplicate.png differ diff --git a/public/images/edit.png b/public/images/edit.png new file mode 100644 index 0000000..8335716 Binary files /dev/null and b/public/images/edit.png differ diff --git a/public/images/email.png b/public/images/email.png new file mode 100644 index 0000000..7348aed Binary files /dev/null and b/public/images/email.png differ diff --git a/public/images/email_add.png b/public/images/email_add.png new file mode 100644 index 0000000..6c93368 Binary files /dev/null and b/public/images/email_add.png differ diff --git a/public/images/email_disabled.png b/public/images/email_disabled.png new file mode 100644 index 0000000..7aa93e8 Binary files /dev/null and b/public/images/email_disabled.png differ diff --git a/public/images/exclamation.png b/public/images/exclamation.png new file mode 100644 index 0000000..7bd84f7 Binary files /dev/null and b/public/images/exclamation.png differ diff --git a/public/images/external.png b/public/images/external.png new file mode 100644 index 0000000..77c2028 Binary files /dev/null and b/public/images/external.png differ diff --git a/public/images/false.png b/public/images/false.png new file mode 100644 index 0000000..ec01ecd Binary files /dev/null and b/public/images/false.png differ diff --git a/public/images/fav.png b/public/images/fav.png new file mode 100644 index 0000000..eb43df9 Binary files /dev/null and b/public/images/fav.png differ diff --git a/public/images/fav_off.png b/public/images/fav_off.png new file mode 100644 index 0000000..51372e3 Binary files /dev/null and b/public/images/fav_off.png differ diff --git a/public/images/feed.png b/public/images/feed.png new file mode 100644 index 0000000..23160c3 Binary files /dev/null and b/public/images/feed.png differ diff --git a/public/images/files/c.png b/public/images/files/c.png new file mode 100644 index 0000000..0dff8cf Binary files /dev/null and b/public/images/files/c.png differ diff --git a/public/images/files/csharp.png b/public/images/files/csharp.png new file mode 100644 index 0000000..093b1c5 Binary files /dev/null and b/public/images/files/csharp.png differ diff --git a/public/images/files/css.png b/public/images/files/css.png new file mode 100644 index 0000000..06a17cd Binary files /dev/null and b/public/images/files/css.png differ diff --git a/public/images/files/default.png b/public/images/files/default.png new file mode 100644 index 0000000..22996cd Binary files /dev/null and b/public/images/files/default.png differ diff --git a/public/images/files/html.png b/public/images/files/html.png new file mode 100644 index 0000000..6ed2490 Binary files /dev/null and b/public/images/files/html.png differ diff --git a/public/images/files/image.png b/public/images/files/image.png new file mode 100644 index 0000000..8954d2a Binary files /dev/null and b/public/images/files/image.png differ diff --git a/public/images/files/java.png b/public/images/files/java.png new file mode 100644 index 0000000..0a7d6f4 Binary files /dev/null and b/public/images/files/java.png differ diff --git a/public/images/files/js.png b/public/images/files/js.png new file mode 100644 index 0000000..0125edf Binary files /dev/null and b/public/images/files/js.png differ diff --git a/public/images/files/pdf.png b/public/images/files/pdf.png new file mode 100644 index 0000000..544e0d8 Binary files /dev/null and b/public/images/files/pdf.png differ diff --git a/public/images/files/php.png b/public/images/files/php.png new file mode 100644 index 0000000..26f2e4d Binary files /dev/null and b/public/images/files/php.png differ diff --git a/public/images/files/ruby.png b/public/images/files/ruby.png new file mode 100644 index 0000000..95fb3af Binary files /dev/null and b/public/images/files/ruby.png differ diff --git a/public/images/files/text.png b/public/images/files/text.png new file mode 100644 index 0000000..b880900 Binary files /dev/null and b/public/images/files/text.png differ diff --git a/public/images/files/xml.png b/public/images/files/xml.png new file mode 100644 index 0000000..b1b61b5 Binary files /dev/null and b/public/images/files/xml.png differ diff --git a/public/images/files/zip.png b/public/images/files/zip.png new file mode 100644 index 0000000..914fcc4 Binary files /dev/null and b/public/images/files/zip.png differ diff --git a/public/images/folder.png b/public/images/folder.png new file mode 100644 index 0000000..e20d682 Binary files /dev/null and b/public/images/folder.png differ diff --git a/public/images/folder_open.png b/public/images/folder_open.png new file mode 100644 index 0000000..9d1e90d Binary files /dev/null and b/public/images/folder_open.png differ diff --git a/public/images/folder_open_add.png b/public/images/folder_open_add.png new file mode 100644 index 0000000..6fe9e03 Binary files /dev/null and b/public/images/folder_open_add.png differ diff --git a/public/images/folder_open_orange.png b/public/images/folder_open_orange.png new file mode 100644 index 0000000..ee6504a Binary files /dev/null and b/public/images/folder_open_orange.png differ diff --git a/public/images/group.png b/public/images/group.png new file mode 100644 index 0000000..d80eb26 Binary files /dev/null and b/public/images/group.png differ diff --git a/public/images/help.png b/public/images/help.png new file mode 100644 index 0000000..d533abd Binary files /dev/null and b/public/images/help.png differ diff --git a/public/images/history.png b/public/images/history.png new file mode 100644 index 0000000..4f2c128 Binary files /dev/null and b/public/images/history.png differ diff --git a/public/images/hourglass.png b/public/images/hourglass.png new file mode 100644 index 0000000..57b03ce Binary files /dev/null and b/public/images/hourglass.png differ diff --git a/public/images/jstoolbar/bt_bq.png b/public/images/jstoolbar/bt_bq.png new file mode 100644 index 0000000..d561795 Binary files /dev/null and b/public/images/jstoolbar/bt_bq.png differ diff --git a/public/images/jstoolbar/bt_bq_remove.png b/public/images/jstoolbar/bt_bq_remove.png new file mode 100644 index 0000000..467957f Binary files /dev/null and b/public/images/jstoolbar/bt_bq_remove.png differ diff --git a/public/images/jstoolbar/bt_code.png b/public/images/jstoolbar/bt_code.png new file mode 100644 index 0000000..0a6e116 Binary files /dev/null and b/public/images/jstoolbar/bt_code.png differ diff --git a/public/images/jstoolbar/bt_del.png b/public/images/jstoolbar/bt_del.png new file mode 100644 index 0000000..16bf5fa Binary files /dev/null and b/public/images/jstoolbar/bt_del.png differ diff --git a/public/images/jstoolbar/bt_em.png b/public/images/jstoolbar/bt_em.png new file mode 100644 index 0000000..741c3bf Binary files /dev/null and b/public/images/jstoolbar/bt_em.png differ diff --git a/public/images/jstoolbar/bt_h1.png b/public/images/jstoolbar/bt_h1.png new file mode 100644 index 0000000..05a1dfd Binary files /dev/null and b/public/images/jstoolbar/bt_h1.png differ diff --git a/public/images/jstoolbar/bt_h2.png b/public/images/jstoolbar/bt_h2.png new file mode 100644 index 0000000..d747a5a Binary files /dev/null and b/public/images/jstoolbar/bt_h2.png differ diff --git a/public/images/jstoolbar/bt_h3.png b/public/images/jstoolbar/bt_h3.png new file mode 100644 index 0000000..b37d437 Binary files /dev/null and b/public/images/jstoolbar/bt_h3.png differ diff --git a/public/images/jstoolbar/bt_img.png b/public/images/jstoolbar/bt_img.png new file mode 100644 index 0000000..3691d1f Binary files /dev/null and b/public/images/jstoolbar/bt_img.png differ diff --git a/public/images/jstoolbar/bt_ins.png b/public/images/jstoolbar/bt_ins.png new file mode 100644 index 0000000..1a6683a Binary files /dev/null and b/public/images/jstoolbar/bt_ins.png differ diff --git a/public/images/jstoolbar/bt_link.png b/public/images/jstoolbar/bt_link.png new file mode 100644 index 0000000..74c9e0c Binary files /dev/null and b/public/images/jstoolbar/bt_link.png differ diff --git a/public/images/jstoolbar/bt_ol.png b/public/images/jstoolbar/bt_ol.png new file mode 100644 index 0000000..f895ec6 Binary files /dev/null and b/public/images/jstoolbar/bt_ol.png differ diff --git a/public/images/jstoolbar/bt_pre.png b/public/images/jstoolbar/bt_pre.png new file mode 100644 index 0000000..8056ddd Binary files /dev/null and b/public/images/jstoolbar/bt_pre.png differ diff --git a/public/images/jstoolbar/bt_precode.png b/public/images/jstoolbar/bt_precode.png new file mode 100644 index 0000000..e093032 Binary files /dev/null and b/public/images/jstoolbar/bt_precode.png differ diff --git a/public/images/jstoolbar/bt_strong.png b/public/images/jstoolbar/bt_strong.png new file mode 100644 index 0000000..ff33881 Binary files /dev/null and b/public/images/jstoolbar/bt_strong.png differ diff --git a/public/images/jstoolbar/bt_ul.png b/public/images/jstoolbar/bt_ul.png new file mode 100644 index 0000000..65c39f0 Binary files /dev/null and b/public/images/jstoolbar/bt_ul.png differ diff --git a/public/images/lightning.png b/public/images/lightning.png new file mode 100644 index 0000000..81a544f Binary files /dev/null and b/public/images/lightning.png differ diff --git a/public/images/link.png b/public/images/link.png new file mode 100644 index 0000000..5392756 Binary files /dev/null and b/public/images/link.png differ diff --git a/public/images/link_break.png b/public/images/link_break.png new file mode 100644 index 0000000..5235753 Binary files /dev/null and b/public/images/link_break.png differ diff --git a/public/images/loading.gif b/public/images/loading.gif new file mode 100644 index 0000000..085ccae Binary files /dev/null and b/public/images/loading.gif differ diff --git a/public/images/locked.png b/public/images/locked.png new file mode 100644 index 0000000..5c46f15 Binary files /dev/null and b/public/images/locked.png differ diff --git a/public/images/magnifier.png b/public/images/magnifier.png new file mode 100644 index 0000000..cf3d97f Binary files /dev/null and b/public/images/magnifier.png differ diff --git a/public/images/message.png b/public/images/message.png new file mode 100644 index 0000000..bed5f72 Binary files /dev/null and b/public/images/message.png differ diff --git a/public/images/milestone_done.png b/public/images/milestone_done.png new file mode 100644 index 0000000..5fdcb41 Binary files /dev/null and b/public/images/milestone_done.png differ diff --git a/public/images/milestone_late.png b/public/images/milestone_late.png new file mode 100644 index 0000000..cf922e9 Binary files /dev/null and b/public/images/milestone_late.png differ diff --git a/public/images/milestone_todo.png b/public/images/milestone_todo.png new file mode 100644 index 0000000..4c051c8 Binary files /dev/null and b/public/images/milestone_todo.png differ diff --git a/public/images/move.png b/public/images/move.png new file mode 100644 index 0000000..7f269c3 Binary files /dev/null and b/public/images/move.png differ diff --git a/public/images/news.png b/public/images/news.png new file mode 100644 index 0000000..aa857e7 Binary files /dev/null and b/public/images/news.png differ diff --git a/public/images/openid-bg.gif b/public/images/openid-bg.gif new file mode 100644 index 0000000..e2d8377 Binary files /dev/null and b/public/images/openid-bg.gif differ diff --git a/public/images/package.png b/public/images/package.png new file mode 100644 index 0000000..c35e832 Binary files /dev/null and b/public/images/package.png differ diff --git a/public/images/plugin.png b/public/images/plugin.png new file mode 100644 index 0000000..5a49f57 Binary files /dev/null and b/public/images/plugin.png differ diff --git a/public/images/project_marker.png b/public/images/project_marker.png new file mode 100644 index 0000000..4124787 Binary files /dev/null and b/public/images/project_marker.png differ diff --git a/public/images/projects.png b/public/images/projects.png new file mode 100644 index 0000000..018b8b9 Binary files /dev/null and b/public/images/projects.png differ diff --git a/public/images/reload.png b/public/images/reload.png new file mode 100644 index 0000000..384147d Binary files /dev/null and b/public/images/reload.png differ diff --git a/public/images/reorder.png b/public/images/reorder.png new file mode 100644 index 0000000..5774b68 Binary files /dev/null and b/public/images/reorder.png differ diff --git a/public/images/report.png b/public/images/report.png new file mode 100644 index 0000000..4c0f857 Binary files /dev/null and b/public/images/report.png differ diff --git a/public/images/save.png b/public/images/save.png new file mode 100644 index 0000000..7535814 Binary files /dev/null and b/public/images/save.png differ diff --git a/public/images/server_key.png b/public/images/server_key.png new file mode 100644 index 0000000..ecd5174 Binary files /dev/null and b/public/images/server_key.png differ diff --git a/public/images/sort_asc.png b/public/images/sort_asc.png new file mode 100644 index 0000000..fbfbcdf Binary files /dev/null and b/public/images/sort_asc.png differ diff --git a/public/images/sort_desc.png b/public/images/sort_desc.png new file mode 100644 index 0000000..28e977f Binary files /dev/null and b/public/images/sort_desc.png differ diff --git a/public/images/stats.png b/public/images/stats.png new file mode 100644 index 0000000..0b120a4 Binary files /dev/null and b/public/images/stats.png differ diff --git a/public/images/table_multiple.png b/public/images/table_multiple.png new file mode 100644 index 0000000..057f4a5 Binary files /dev/null and b/public/images/table_multiple.png differ diff --git a/public/images/task_done.png b/public/images/task_done.png new file mode 100644 index 0000000..5fdcb41 Binary files /dev/null and b/public/images/task_done.png differ diff --git a/public/images/task_late.png b/public/images/task_late.png new file mode 100644 index 0000000..71fd2d7 Binary files /dev/null and b/public/images/task_late.png differ diff --git a/public/images/task_parent_end.png b/public/images/task_parent_end.png new file mode 100644 index 0000000..9442b86 Binary files /dev/null and b/public/images/task_parent_end.png differ diff --git a/public/images/task_todo.png b/public/images/task_todo.png new file mode 100644 index 0000000..632406e Binary files /dev/null and b/public/images/task_todo.png differ diff --git a/public/images/text_list_bullets.png b/public/images/text_list_bullets.png new file mode 100644 index 0000000..0088207 Binary files /dev/null and b/public/images/text_list_bullets.png differ diff --git a/public/images/textfield.png b/public/images/textfield.png new file mode 100644 index 0000000..408c6b0 Binary files /dev/null and b/public/images/textfield.png differ diff --git a/public/images/textfield_key.png b/public/images/textfield_key.png new file mode 100644 index 0000000..a9d5e4f Binary files /dev/null and b/public/images/textfield_key.png differ diff --git a/public/images/ticket.png b/public/images/ticket.png new file mode 100644 index 0000000..73756ed Binary files /dev/null and b/public/images/ticket.png differ diff --git a/public/images/ticket_checked.png b/public/images/ticket_checked.png new file mode 100644 index 0000000..fc25958 Binary files /dev/null and b/public/images/ticket_checked.png differ diff --git a/public/images/ticket_edit.png b/public/images/ticket_edit.png new file mode 100644 index 0000000..89df6cb Binary files /dev/null and b/public/images/ticket_edit.png differ diff --git a/public/images/ticket_go.png b/public/images/ticket_go.png new file mode 100644 index 0000000..2aaec38 Binary files /dev/null and b/public/images/ticket_go.png differ diff --git a/public/images/ticket_note.png b/public/images/ticket_note.png new file mode 100644 index 0000000..c8de165 Binary files /dev/null and b/public/images/ticket_note.png differ diff --git a/public/images/time.png b/public/images/time.png new file mode 100644 index 0000000..fa1bf5f Binary files /dev/null and b/public/images/time.png differ diff --git a/public/images/time_add.png b/public/images/time_add.png new file mode 100644 index 0000000..70119f7 Binary files /dev/null and b/public/images/time_add.png differ diff --git a/public/images/toggle_check.png b/public/images/toggle_check.png new file mode 100644 index 0000000..da85f26 Binary files /dev/null and b/public/images/toggle_check.png differ diff --git a/public/images/true.png b/public/images/true.png new file mode 100644 index 0000000..a2ed1a3 Binary files /dev/null and b/public/images/true.png differ diff --git a/public/images/unlock.png b/public/images/unlock.png new file mode 100644 index 0000000..0c284d9 Binary files /dev/null and b/public/images/unlock.png differ diff --git a/public/images/user.png b/public/images/user.png new file mode 100644 index 0000000..264381e Binary files /dev/null and b/public/images/user.png differ diff --git a/public/images/version_marker.png b/public/images/version_marker.png new file mode 100644 index 0000000..0368ca2 Binary files /dev/null and b/public/images/version_marker.png differ diff --git a/public/images/warning.png b/public/images/warning.png new file mode 100644 index 0000000..c5e482f Binary files /dev/null and b/public/images/warning.png differ diff --git a/public/images/wiki_edit.png b/public/images/wiki_edit.png new file mode 100644 index 0000000..a071e17 Binary files /dev/null and b/public/images/wiki_edit.png differ diff --git a/public/images/zoom_in.png b/public/images/zoom_in.png new file mode 100644 index 0000000..af4fe07 Binary files /dev/null and b/public/images/zoom_in.png differ diff --git a/public/images/zoom_out.png b/public/images/zoom_out.png new file mode 100644 index 0000000..81f2819 Binary files /dev/null and b/public/images/zoom_out.png differ diff --git a/public/javascripts/application.js b/public/javascripts/application.js new file mode 100644 index 0000000..4e1b40a --- /dev/null +++ b/public/javascripts/application.js @@ -0,0 +1,864 @@ +/* Redmine - project management software + Copyright (C) 2006-2017 Jean-Philippe Lang */ + +/* Fix for CVE-2015-9251, to be removed with JQuery >= 3.0 */ +$.ajaxPrefilter(function (s) { + if (s.crossDomain) { + s.contents.script = false; + } +}); + +function checkAll(id, checked) { + $('#'+id).find('input[type=checkbox]:enabled').prop('checked', checked); +} + +function toggleCheckboxesBySelector(selector) { + var all_checked = true; + $(selector).each(function(index) { + if (!$(this).is(':checked')) { all_checked = false; } + }); + $(selector).prop('checked', !all_checked); +} + +function showAndScrollTo(id, focus) { + $('#'+id).show(); + if (focus !== null) { + $('#'+focus).focus(); + } + $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100); +} + +function toggleRowGroup(el) { + var tr = $(el).parents('tr').first(); + var n = tr.next(); + tr.toggleClass('open'); + while (n.length && !n.hasClass('group')) { + n.toggle(); + n = n.next('tr'); + } +} + +function collapseAllRowGroups(el) { + var tbody = $(el).parents('tbody').first(); + tbody.children('tr').each(function(index) { + if ($(this).hasClass('group')) { + $(this).removeClass('open'); + } else { + $(this).hide(); + } + }); +} + +function expandAllRowGroups(el) { + var tbody = $(el).parents('tbody').first(); + tbody.children('tr').each(function(index) { + if ($(this).hasClass('group')) { + $(this).addClass('open'); + } else { + $(this).show(); + } + }); +} + +function toggleAllRowGroups(el) { + var tr = $(el).parents('tr').first(); + if (tr.hasClass('open')) { + collapseAllRowGroups(el); + } else { + expandAllRowGroups(el); + } +} + +function toggleFieldset(el) { + var fieldset = $(el).parents('fieldset').first(); + fieldset.toggleClass('collapsed'); + fieldset.children('div').toggle(); +} + +function hideFieldset(el) { + var fieldset = $(el).parents('fieldset').first(); + fieldset.toggleClass('collapsed'); + fieldset.children('div').hide(); +} + +// columns selection +function moveOptions(theSelFrom, theSelTo) { + $(theSelFrom).find('option:selected').detach().prop("selected", false).appendTo($(theSelTo)); +} + +function moveOptionUp(theSel) { + $(theSel).find('option:selected').each(function(){ + $(this).prev(':not(:selected)').detach().insertAfter($(this)); + }); +} + +function moveOptionTop(theSel) { + $(theSel).find('option:selected').detach().prependTo($(theSel)); +} + +function moveOptionDown(theSel) { + $($(theSel).find('option:selected').get().reverse()).each(function(){ + $(this).next(':not(:selected)').detach().insertBefore($(this)); + }); +} + +function moveOptionBottom(theSel) { + $(theSel).find('option:selected').detach().appendTo($(theSel)); +} + +function initFilters() { + $('#add_filter_select').change(function() { + addFilter($(this).val(), '', []); + }); + $('#filters-table td.field input[type=checkbox]').each(function() { + toggleFilter($(this).val()); + }); + $('#filters-table').on('click', 'td.field input[type=checkbox]', function() { + toggleFilter($(this).val()); + }); + $('#filters-table').on('click', '.toggle-multiselect', function() { + toggleMultiSelect($(this).siblings('select')); + }); + $('#filters-table').on('keypress', 'input[type=text]', function(e) { + if (e.keyCode == 13) $(this).closest('form').submit(); + }); +} + +function addFilter(field, operator, values) { + var fieldId = field.replace('.', '_'); + var tr = $('#tr_'+fieldId); + + var filterOptions = availableFilters[field]; + if (!filterOptions) return; + + if (filterOptions['remote'] && filterOptions['values'] == null) { + $.getJSON(filtersUrl, {'name': field}).done(function(data) { + filterOptions['values'] = data; + addFilter(field, operator, values) ; + }); + return; + } + + if (tr.length > 0) { + tr.show(); + } else { + buildFilterRow(field, operator, values); + } + $('#cb_'+fieldId).prop('checked', true); + toggleFilter(field); + $('#add_filter_select').val('').find('option').each(function() { + if ($(this).attr('value') == field) { + $(this).attr('disabled', true); + } + }); +} + +function buildFilterRow(field, operator, values) { + var fieldId = field.replace('.', '_'); + var filterTable = $("#filters-table"); + var filterOptions = availableFilters[field]; + if (!filterOptions) return; + var operators = operatorByType[filterOptions['type']]; + var filterValues = filterOptions['values']; + var i, select; + + var tr = $('').attr('id', 'tr_'+fieldId).html( + '' + + '' + + '  ' + ); + select = tr.find('td.values select'); + if (values.length > 1) { select.attr('multiple', true); } + for (i = 0; i < filterValues.length; i++) { + var filterValue = filterValues[i]; + var option = $('').attr('label', filterValue[2]);} + option = optgroup.append(option); + } + } else { + option.val(filterValue).text(filterValue); + if ($.inArray(filterValue, values) > -1) {option.attr('selected', true);} + } + select.append(option); + } + break; + case "date": + case "date_past": + tr.find('td.values').append( + '' + + ' ' + + ' '+labelDayPlural+'' + ); + $('#values_'+fieldId+'_1').val(values[0]).datepickerFallback(datepickerOptions); + $('#values_'+fieldId+'_2').val(values[1]).datepickerFallback(datepickerOptions); + $('#values_'+fieldId).val(values[0]); + break; + case "string": + case "text": + tr.find('td.values').append( + '' + ); + $('#values_'+fieldId).val(values[0]); + break; + case "relation": + tr.find('td.values').append( + '' + + '' + ); + $('#values_'+fieldId).val(values[0]); + select = tr.find('td.values select'); + for (i = 0; i < filterValues.length; i++) { + var filterValue = filterValues[i]; + var option = $('